@ascribed/astro 0.2.1-next.11 → 0.2.1-next.13

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/shapes.d.ts CHANGED
@@ -93,6 +93,12 @@ export interface DiffReport {
93
93
  working_tree_errors: number;
94
94
  /** What changed, per build, in the order asked for. */
95
95
  builds: BuildDiff[];
96
+ /**
97
+ * Whether every page's `changes` was left empty, as `ascribe diff
98
+ * --pages-only` leaves them: its `counts` still count them. Only there
99
+ * when it's `true`.
100
+ */
101
+ blocks_omitted?: boolean;
96
102
  }
97
103
  /** What changed on one page of a build. */
98
104
  export interface PageDiff {
@@ -125,7 +131,8 @@ export interface PageDiff {
125
131
  counts: Counts;
126
132
  /**
127
133
  * The block-level changes, in the page's order, a removed block where
128
- * it was. Empty for an added or removed page.
134
+ * it was. Empty for an added or removed page, and for every page when
135
+ * the report's `blocks_omitted` is `true`.
129
136
  */
130
137
  changes: Change[];
131
138
  }
@@ -1 +1 @@
1
- {"version":3,"file":"shapes.js","sourceRoot":"","sources":["../src/shapes.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,2EAA2E;AAC3E,6EAA6E;AAC7E,yEAAyE;AACzE,EAAE;AACF,8CAA8C","sourcesContent":["// The JSON Ascribe writes that this package reads, as TypeScript types.\n// Generated from the Rust types that write it, through the JSON Schemas in\n// schemas/, by crates/ascribe-cli/src/shapes.rs. Change the Rust types, then\n// run `ASCRIBE_BLESS=1 cargo test -p ascribe-cli shapes`. Don't edit it.\n//\n// - DiffReport (`ascribe diff --format json`)\n\n/**\n * Where a block's text is written: the README's anchor grammar, the same\n * string the rendered page carries in `data-ascribe-source` and\n * `data-ascribe-via`.\n */\nexport interface Anchor {\n /**\n * `<path>:<first>-<last>`: the file's content path, percent-encoded by\n * segment, and the block's first and last lines, from 1.\n */\n source: string;\n /**\n * The includes the block came through, outermost first, each\n * `<path>:<line>`. Empty for a block written in the page itself.\n */\n via: string[];\n}\n\n/** The base of a comparison, in the report. */\nexport interface BaseInfo {\n /** The revision asked for, or the default branch used. */\n requested: string;\n /** The commit it names. */\n commit: string;\n /**\n * The merge base of that commit and `HEAD`, which the comparison reads;\n * `null` with `--base-exact`, which reads `commit`.\n */\n merge_base: string | null;\n}\n\n/** What changed in one build. */\nexport interface BuildDiff {\n /** The build's name. */\n build: string;\n /** The pages that changed, in path order. */\n pages: PageDiff[];\n}\n\n/** One block's change. */\nexport interface Change {\n /** What happened to it. */\n kind: ChangeKind;\n /**\n * For a removed block, and a moved block's old place: the block of the\n * new version it came after, among its siblings. Absent when it was\n * first.\n */\n after?: Anchor;\n /** Where it's written now: every kind but `removed`. */\n now?: Anchor;\n /**\n * For a removed block, and a moved block's old place: the block of the\n * new version it was inside. Absent at the top of the page.\n */\n parent?: Anchor;\n /**\n * For a removed block, its text, whitespace collapsed, so it can be\n * shown where it was.\n */\n text?: string;\n /** Where it was written: every kind but `added`. */\n was?: Anchor;\n /** For changed prose, the words that differ. */\n words?: Words;\n}\n\n/** The kinds of block change. */\nexport type ChangeKind = \"changed\" | \"added\" | \"removed\" | \"moved\";\n\n/** How many changes of each kind a page has. */\nexport interface Counts {\n /** Blocks whose content changed. */\n changed: number;\n /** Blocks only in the new version. */\n added: number;\n /** Blocks only in the old version. */\n removed: number;\n /** Blocks in both, somewhere else. */\n moved: number;\n}\n\n/** The whole report, as `ascribe diff --format json` writes it. */\nexport interface DiffReport {\n /** `SCHEMA_VERSION`. */\n schema_version: number;\n /** The version of Ascribe that wrote it. */\n ascribe_version: string;\n /** What was compared with. */\n base: BaseInfo;\n /** Where the project is. */\n repository: RepositoryInfo;\n /**\n * How many errors `ascribe check` finds in the working tree, for the\n * builds compared. The comparison runs regardless, but a page with an\n * error may not render as it will once it's fixed, so a reviewer should\n * know. `diff_project` sets it; `Report::new` leaves it zero.\n */\n working_tree_errors: number;\n /** What changed, per build, in the order asked for. */\n builds: BuildDiff[];\n}\n\n/** What changed on one page of a build. */\nexport interface PageDiff {\n /** The page's content path. */\n path: string;\n /** Its route: the new one, or for a removed page the old one. */\n route: string;\n /**\n * Whether the build publishes it only now, only before, or in both\n * with a difference.\n */\n status: PageStatus;\n /** Whether the page's own file changed (or exists on one side only). */\n own_file_changed: boolean;\n /**\n * The other changed files the page's change can come from: fragments it\n * includes and pages its links take a title or a heading from, in path\n * order; then the snippets whose code changed, by address\n * (`code:app.py#main`); and `ascribe.toml` (last) when the content model\n * is a cause.\n */\n because: string[];\n /**\n * What changed about the page itself besides its blocks, in this\n * order: `title`, `frontmatter`, `availability` (the page-level one),\n * and `route`. Empty for an added or removed page.\n */\n page_changed: string[];\n /** How many changes of each kind. */\n counts: Counts;\n /**\n * The block-level changes, in the page's order, a removed block where\n * it was. Empty for an added or removed page.\n */\n changes: Change[];\n}\n\n/** Whether a page is new, gone, or different. */\nexport type PageStatus = \"added\" | \"removed\" | \"changed\";\n\n/** The repository, in the report. */\nexport interface RepositoryInfo {\n /** The repository's top-level directory, as git prints it. */\n root: string;\n /**\n * The project's folder inside it, with a trailing `/`, or empty when\n * the project is at the repository's root.\n */\n project_prefix: string;\n}\n\n/**\n * The words that differ inside a changed block of prose. Ranges are\n * `[start, end)` in characters (Unicode scalar values) of each side's\n * `text`, which is the block's text with whitespace collapsed.\n */\nexport interface Words {\n /** Ranges in `now_text`: words added or replacing others. */\n now: [number, number][];\n /** Ranges in `was_text`: words removed or replaced. */\n was: [number, number][];\n /** The block's text now. */\n now_text: string;\n /** The block's text before. */\n was_text: string;\n}\n"]}
1
+ {"version":3,"file":"shapes.js","sourceRoot":"","sources":["../src/shapes.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,2EAA2E;AAC3E,6EAA6E;AAC7E,yEAAyE;AACzE,EAAE;AACF,8CAA8C","sourcesContent":["// The JSON Ascribe writes that this package reads, as TypeScript types.\n// Generated from the Rust types that write it, through the JSON Schemas in\n// schemas/, by crates/ascribe-cli/src/shapes.rs. Change the Rust types, then\n// run `ASCRIBE_BLESS=1 cargo test -p ascribe-cli shapes`. Don't edit it.\n//\n// - DiffReport (`ascribe diff --format json`)\n\n/**\n * Where a block's text is written: the README's anchor grammar, the same\n * string the rendered page carries in `data-ascribe-source` and\n * `data-ascribe-via`.\n */\nexport interface Anchor {\n /**\n * `<path>:<first>-<last>`: the file's content path, percent-encoded by\n * segment, and the block's first and last lines, from 1.\n */\n source: string;\n /**\n * The includes the block came through, outermost first, each\n * `<path>:<line>`. Empty for a block written in the page itself.\n */\n via: string[];\n}\n\n/** The base of a comparison, in the report. */\nexport interface BaseInfo {\n /** The revision asked for, or the default branch used. */\n requested: string;\n /** The commit it names. */\n commit: string;\n /**\n * The merge base of that commit and `HEAD`, which the comparison reads;\n * `null` with `--base-exact`, which reads `commit`.\n */\n merge_base: string | null;\n}\n\n/** What changed in one build. */\nexport interface BuildDiff {\n /** The build's name. */\n build: string;\n /** The pages that changed, in path order. */\n pages: PageDiff[];\n}\n\n/** One block's change. */\nexport interface Change {\n /** What happened to it. */\n kind: ChangeKind;\n /**\n * For a removed block, and a moved block's old place: the block of the\n * new version it came after, among its siblings. Absent when it was\n * first.\n */\n after?: Anchor;\n /** Where it's written now: every kind but `removed`. */\n now?: Anchor;\n /**\n * For a removed block, and a moved block's old place: the block of the\n * new version it was inside. Absent at the top of the page.\n */\n parent?: Anchor;\n /**\n * For a removed block, its text, whitespace collapsed, so it can be\n * shown where it was.\n */\n text?: string;\n /** Where it was written: every kind but `added`. */\n was?: Anchor;\n /** For changed prose, the words that differ. */\n words?: Words;\n}\n\n/** The kinds of block change. */\nexport type ChangeKind = \"changed\" | \"added\" | \"removed\" | \"moved\";\n\n/** How many changes of each kind a page has. */\nexport interface Counts {\n /** Blocks whose content changed. */\n changed: number;\n /** Blocks only in the new version. */\n added: number;\n /** Blocks only in the old version. */\n removed: number;\n /** Blocks in both, somewhere else. */\n moved: number;\n}\n\n/** The whole report, as `ascribe diff --format json` writes it. */\nexport interface DiffReport {\n /** `SCHEMA_VERSION`. */\n schema_version: number;\n /** The version of Ascribe that wrote it. */\n ascribe_version: string;\n /** What was compared with. */\n base: BaseInfo;\n /** Where the project is. */\n repository: RepositoryInfo;\n /**\n * How many errors `ascribe check` finds in the working tree, for the\n * builds compared. The comparison runs regardless, but a page with an\n * error may not render as it will once it's fixed, so a reviewer should\n * know. `diff_project` sets it; `Report::new` leaves it zero.\n */\n working_tree_errors: number;\n /** What changed, per build, in the order asked for. */\n builds: BuildDiff[];\n /**\n * Whether every page's `changes` was left empty, as `ascribe diff\n * --pages-only` leaves them: its `counts` still count them. Only there\n * when it's `true`.\n */\n blocks_omitted?: boolean;\n}\n\n/** What changed on one page of a build. */\nexport interface PageDiff {\n /** The page's content path. */\n path: string;\n /** Its route: the new one, or for a removed page the old one. */\n route: string;\n /**\n * Whether the build publishes it only now, only before, or in both\n * with a difference.\n */\n status: PageStatus;\n /** Whether the page's own file changed (or exists on one side only). */\n own_file_changed: boolean;\n /**\n * The other changed files the page's change can come from: fragments it\n * includes and pages its links take a title or a heading from, in path\n * order; then the snippets whose code changed, by address\n * (`code:app.py#main`); and `ascribe.toml` (last) when the content model\n * is a cause.\n */\n because: string[];\n /**\n * What changed about the page itself besides its blocks, in this\n * order: `title`, `frontmatter`, `availability` (the page-level one),\n * and `route`. Empty for an added or removed page.\n */\n page_changed: string[];\n /** How many changes of each kind. */\n counts: Counts;\n /**\n * The block-level changes, in the page's order, a removed block where\n * it was. Empty for an added or removed page, and for every page when\n * the report's `blocks_omitted` is `true`.\n */\n changes: Change[];\n}\n\n/** Whether a page is new, gone, or different. */\nexport type PageStatus = \"added\" | \"removed\" | \"changed\";\n\n/** The repository, in the report. */\nexport interface RepositoryInfo {\n /** The repository's top-level directory, as git prints it. */\n root: string;\n /**\n * The project's folder inside it, with a trailing `/`, or empty when\n * the project is at the repository's root.\n */\n project_prefix: string;\n}\n\n/**\n * The words that differ inside a changed block of prose. Ranges are\n * `[start, end)` in characters (Unicode scalar values) of each side's\n * `text`, which is the block's text with whitespace collapsed.\n */\nexport interface Words {\n /** Ranges in `now_text`: words added or replacing others. */\n now: [number, number][];\n /** Ranges in `was_text`: words removed or replaced. */\n was: [number, number][];\n /** The block's text now. */\n now_text: string;\n /** The block's text before. */\n was_text: string;\n}\n"]}
@@ -26,6 +26,8 @@ const TIMEOUT_MS = 120_000;
26
26
  /** This tab's memory: whether the panel is open, and a page to step into. */
27
27
  const OPEN_KEY = "ascribe-review-open";
28
28
  const FIRST_KEY = "ascribe-review-first";
29
+ /** The model file, which a page can change through but isn't a file of content. */
30
+ const MODEL_FILE = "ascribe.toml";
29
31
  const SHOWS = [
30
32
  ["changes", "Changes"],
31
33
  ["will", "As it will be"],
@@ -95,6 +97,8 @@ class ReviewApp {
95
97
  at = -1;
96
98
  atEnd = false;
97
99
  breakdown = false;
100
+ /** Whether the More review actions row is open. */
101
+ more = false;
98
102
  overlay;
99
103
  overlayFor;
100
104
  listeners = [];
@@ -420,6 +424,7 @@ class ReviewApp {
420
424
  resolve: (threadId, resolved) => ask("resolve", { threadId, resolved }),
421
425
  submit: (event, body) => ask("submit", body === undefined ? { event } : { event, body }),
422
426
  discard: () => ask("discard"),
427
+ promptAgent: (request) => this.promptAgent(request),
423
428
  openSource: (anchor) => this.openSource(anchor.source),
424
429
  openThread: (threadId, pagePath) => this.openThread(threadId, pagePath),
425
430
  notify: (message) => this.notify(message),
@@ -428,6 +433,27 @@ class ReviewApp {
428
433
  },
429
434
  };
430
435
  }
436
+ /**
437
+ * Has the dev server build a prompt and puts it on the clipboard: a page
438
+ * can't fill in an agent on the machine. Rejects with what went wrong.
439
+ */
440
+ async promptAgent(request) {
441
+ const path = this.stage.kind === "on" ? this.stage.view.path : null;
442
+ const prompt = await this.channel.request("prompt", { request, path });
443
+ if (prompt === null) {
444
+ throw {
445
+ message: request.kind === "page-changes"
446
+ ? "nothing on this page changed."
447
+ : request.kind === "fragment-reach"
448
+ ? "no page changed through that file."
449
+ : "no review comment is open.",
450
+ };
451
+ }
452
+ if (!(await copyText(this.doc, prompt))) {
453
+ throw { message: "the browser didn't allow copying it." };
454
+ }
455
+ this.notify("Prompt copied. Paste it into your agent.");
456
+ }
431
457
  /** Every anchored block on the page, in its order. */
432
458
  anchors() {
433
459
  return anchoredBlocks(this.doc)
@@ -618,6 +644,9 @@ class ReviewApp {
618
644
  }
619
645
  onPage(view) {
620
646
  const parts = [this.controls(view)];
647
+ const more = this.moreRow(view);
648
+ if (more)
649
+ parts.push(more);
621
650
  if (this.breakdown && view.page) {
622
651
  parts.push(this.el("div", "legend", countsText(view.page.counts) || "No changes"));
623
652
  }
@@ -717,8 +746,45 @@ class ReviewApp {
717
746
  const refresh = this.button("Refresh", "ghost", () => void this.refresh());
718
747
  refresh.setAttribute("aria-label", "Refresh comments and changes");
719
748
  row.append(refresh);
749
+ if (page && page.status !== "removed") {
750
+ const more = this.button("⋯", "ghost square", () => {
751
+ this.more = !this.more;
752
+ this.render();
753
+ });
754
+ more.setAttribute("aria-label", "More review actions");
755
+ more.title = "More review actions";
756
+ more.setAttribute("aria-expanded", String(this.more));
757
+ row.append(more);
758
+ }
720
759
  return row;
721
760
  }
761
+ /** More review actions: Prompt agent about the page, and about each file it changed through. */
762
+ moreRow(view) {
763
+ const page = view.page;
764
+ if (!this.more || !page || page.status === "removed")
765
+ return undefined;
766
+ const menu = this.el("div", "row menu");
767
+ menu.setAttribute("role", "group");
768
+ menu.setAttribute("aria-label", "More review actions");
769
+ const items = [
770
+ ["Prompt agent: review this page", { kind: "page-changes" }],
771
+ ];
772
+ const fragments = page.because.filter((cause) => cause !== MODEL_FILE);
773
+ for (const fragment of fragments) {
774
+ items.push([
775
+ fragments.length === 1
776
+ ? "Prompt agent: check this fragment's pages"
777
+ : `Prompt agent: check the pages that show ${fragment}`,
778
+ { kind: "fragment-reach", fragment },
779
+ ]);
780
+ }
781
+ for (const [label, request] of items) {
782
+ menu.append(this.button(label, "ghost", () => {
783
+ this.promptAgent(request).catch((error) => this.notify(`The prompt couldn't be built: ${error.message}`));
784
+ }));
785
+ }
786
+ return menu;
787
+ }
722
788
  /** Past the last change: the next changed page. */
723
789
  endNotice(view) {
724
790
  const notice = this.notice(this.marks.length === 0
@@ -949,4 +1015,36 @@ function recall(key) {
949
1015
  return null;
950
1016
  }
951
1017
  }
1018
+ /**
1019
+ * Puts `text` on the clipboard, through the old `execCommand` way where the
1020
+ * Clipboard API isn't allowed. Whether it got there.
1021
+ */
1022
+ async function copyText(doc, text) {
1023
+ const clipboard = doc.defaultView?.navigator.clipboard;
1024
+ if (clipboard) {
1025
+ try {
1026
+ await clipboard.writeText(text);
1027
+ return true;
1028
+ }
1029
+ catch {
1030
+ // Not allowed here: the old way below.
1031
+ }
1032
+ }
1033
+ const area = doc.createElement("textarea");
1034
+ area.value = text;
1035
+ area.setAttribute("readonly", "");
1036
+ area.style.position = "fixed";
1037
+ area.style.left = "-9999px";
1038
+ doc.body.append(area);
1039
+ area.select();
1040
+ let copied = false;
1041
+ try {
1042
+ copied = doc.execCommand("copy");
1043
+ }
1044
+ catch {
1045
+ copied = false;
1046
+ }
1047
+ area.remove();
1048
+ return copied;
1049
+ }
952
1050
  //# sourceMappingURL=app.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/toolbar/app.ts"],"names":[],"mappings":"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","sourcesContent":["// The Ascribe review app in Astro's dev toolbar: the site preview's review.\n// It marks the page's changes with @ascribed/review's marks, hosts the\n// overlay for the pull request's threads, and holds the review controls in a\n// panel that opens from its toolbar button. Every request goes to the dev\n// server over the toolbar's channel; the page never sees a token and makes\n// no request to GitHub.\n//\n// Review stays on across pages and reloads (the dev server holds it), and\n// the panel stays as the reviewer left it in this tab.\nimport {\n clearMarks,\n describeSource,\n goTo,\n markChanges,\n setShow,\n showSources,\n type Mark,\n type Show,\n} from \"@ascribed/review/marks\";\nimport marksCss from \"@ascribed/review/marks.css?inline\";\nimport {\n createOverlay,\n renderMarkdown,\n type HostError,\n type LocatedThread,\n type Overlay,\n type OverlayData,\n type OverlayHost,\n} from \"@ascribed/review/overlay\";\nimport { defineToolbarApp } from \"astro/toolbar\";\nimport {\n APP_ID,\n CHANGED_EVENT,\n REQUEST_EVENT,\n RESULT_EVENT,\n type Change,\n type PageView,\n type Result,\n type Status,\n} from \"../review/protocol.js\";\nimport {\n anchorOf,\n anchoredBlocks,\n anchorsArrived,\n contentRoot,\n pageFile,\n pageScheme,\n sourceLocation,\n} from \"./page.js\";\nimport { PANEL_CSS } from \"./style.js\";\nimport {\n againstText,\n buttonLabel,\n countsText,\n errorsNotice,\n nextChangedPage,\n nextPageText,\n pageDetail,\n position,\n THREAD_HASH,\n threadLocation,\n threadsNotice,\n unsentText,\n} from \"./text.js\";\nimport {\n CLASS_LABEL,\n CLASS_LABEL_BEFORE,\n CLASS_MARKS,\n DATA_REVIEW,\n DATA_SCHEME,\n DATA_SHOW,\n DATA_SOURCE,\n DATA_VIA,\n} from \"../names.js\";\n\ntype ServerHelpers = Parameters<NonNullable<Parameters<typeof defineToolbarApp>[0][\"init\"]>>[2];\ntype AppEvents = Parameters<NonNullable<Parameters<typeof defineToolbarApp>[0][\"init\"]>>[1];\n\n/** The width of the page's container from which threads show in a column beside it. */\nconst COLUMN_AT = 720;\n/** The room between the panel and the window's edges, or the column of threads. */\nconst PANEL_MARGIN = 10;\nconst PANEL_WIDTH = 960;\n/** How long a request may take before the app gives up on the dev server. */\nconst TIMEOUT_MS = 120_000;\n/** This tab's memory: whether the panel is open, and a page to step into. */\nconst OPEN_KEY = \"ascribe-review-open\";\nconst FIRST_KEY = \"ascribe-review-first\";\n\nconst SHOWS: [Show, string][] = [\n [\"changes\", \"Changes\"],\n [\"will\", \"As it will be\"],\n [\"was\", \"As it was\"],\n];\n\nexport default defineToolbarApp({\n init(canvas, app, server) {\n void new ReviewApp(canvas, app, server, document).init();\n },\n});\n\n/** Requests to the dev server, each answered by its `id`. */\nclass Channel {\n private seq = 0;\n private readonly waiting = new Map<\n number,\n { resolve: (value: unknown) => void; reject: (error: HostError) => void }\n >();\n readonly tab = Math.random().toString(36).slice(2);\n\n constructor(private readonly server: ServerHelpers) {\n server.on<Result>(RESULT_EVENT, (result) => {\n if (result.tab !== this.tab) return;\n const waiter = this.waiting.get(result.id);\n if (!waiter) return;\n this.waiting.delete(result.id);\n if (result.error) waiter.reject(result.error);\n else waiter.resolve(result.result);\n });\n }\n\n request<T>(method: string, params: Record<string, unknown> = {}): Promise<T> {\n const id = ++this.seq;\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.waiting.delete(id);\n reject({ message: \"The dev server didn't answer. Is `astro dev` still running?\" });\n }, TIMEOUT_MS);\n this.waiting.set(id, {\n resolve: (value) => {\n clearTimeout(timer);\n resolve(value as T);\n },\n reject: (error) => {\n clearTimeout(timer);\n reject(error);\n },\n });\n this.server.send(REQUEST_EVENT, { tab: this.tab, id, method, params });\n });\n }\n}\n\ntype Stage =\n | { kind: \"off\" }\n | { kind: \"starting\" }\n | { kind: \"failed\"; message: string }\n | { kind: \"on\"; view: PageView };\n\nclass ReviewApp {\n private readonly channel: Channel;\n private readonly panel: HTMLElement;\n private readonly live: HTMLElement;\n private stage: Stage = { kind: \"off\" };\n private open = false;\n private root: HTMLElement | undefined;\n /** Whether the page's anchors arrived: else everything is listed in the panel. */\n private arrived = true;\n private marked: string | undefined;\n private marks: Mark[] = [];\n private show: Show = \"changes\";\n private at = -1;\n private atEnd = false;\n private breakdown = false;\n private overlay: Overlay | undefined;\n private overlayFor: number | undefined;\n private listeners: (() => void)[] = [];\n /** The threads, read for a page whose anchors didn't arrive. */\n private listed: OverlayData | undefined;\n private stopSources: (() => void) | undefined;\n private style: HTMLStyleElement | undefined;\n private padding: { scroll: string; body: string } | undefined;\n private message: string | undefined;\n private messageTimer: ReturnType<typeof setTimeout> | undefined;\n /** The scheme the site set for review's colors itself, if it did. */\n private readonly siteScheme: string | null;\n private restyleTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor(\n canvas: ShadowRoot,\n private readonly app: AppEvents,\n server: ServerHelpers,\n private readonly doc: Document,\n ) {\n this.channel = new Channel(server);\n const style = doc.createElement(\"style\");\n style.textContent = PANEL_CSS;\n this.panel = doc.createElement(\"div\");\n this.panel.className = \"panel\";\n this.panel.setAttribute(\"role\", \"region\");\n this.panel.setAttribute(\"aria-label\", \"Ascribe review\");\n this.live = doc.createElement(\"div\");\n this.live.className = \"sr-only\";\n this.live.setAttribute(\"role\", \"status\");\n this.live.setAttribute(\"aria-live\", \"polite\");\n canvas.append(style, this.panel, this.live);\n this.siteScheme = doc.documentElement.getAttribute(DATA_SCHEME);\n const win = doc.defaultView;\n win\n ?.matchMedia?.(\"(prefers-color-scheme: dark)\")\n .addEventListener(\"change\", () => this.render());\n win?.addEventListener(\"resize\", () => this.placePanel());\n // A theme switch on the page (a class or `data-theme` on the root, say) changes its colors.\n const restyle = () => {\n this.applyScheme();\n // Again once a transition between the themes is over.\n clearTimeout(this.restyleTimer);\n this.restyleTimer = setTimeout(() => this.applyScheme(), 400);\n };\n const observer = new MutationObserver((records) => {\n if (records.some((r) => r.attributeName !== DATA_SCHEME)) restyle();\n });\n for (const target of [doc.documentElement, doc.body]) {\n observer.observe(target, { attributes: true });\n }\n this.panel.addEventListener(\"keydown\", (event) => event.stopPropagation());\n server.on<{ from: string | null }>(CHANGED_EVENT, (event) => {\n if (event.from !== this.channel.tab) void this.changedElsewhere();\n });\n app.onToggled(({ state }) => {\n this.open = state;\n remember(OPEN_KEY, state ? \"1\" : \"0\");\n if (state && this.stage.kind === \"off\") void this.start();\n this.render();\n });\n }\n\n async init(): Promise<void> {\n let status: Status;\n try {\n status = await this.channel.request<Status>(\"status\");\n } catch {\n return;\n }\n if (!status.on) return;\n await this.load();\n if (recall(OPEN_KEY) === \"1\") this.app.toggleState({ state: true });\n }\n\n // --- Review on and off ---\n\n private async start(): Promise<void> {\n this.stage = { kind: \"starting\" };\n this.render();\n try {\n await this.channel.request<Status>(\"start\", {});\n } catch (error) {\n this.stage = { kind: \"failed\", message: messageOf(error) };\n this.render();\n return;\n }\n await this.load();\n }\n\n private async stop(): Promise<void> {\n try {\n await this.channel.request(\"stop\");\n } catch (error) {\n this.notify(messageOf(error));\n return;\n }\n this.clearPage();\n this.stage = { kind: \"off\" };\n this.render();\n this.announce(\"Review stopped.\");\n }\n\n /** Another page changed the threads, or stopped review. */\n private async changedElsewhere(): Promise<void> {\n let status: Status;\n try {\n status = await this.channel.request<Status>(\"status\");\n } catch {\n return;\n }\n if (!status.on) {\n this.clearPage();\n this.stage = { kind: \"off\" };\n this.render();\n } else if (this.stage.kind === \"on\") {\n this.didChange();\n }\n }\n\n /** Reads the page's changes and threads from the dev server, and draws them. */\n private async load(): Promise<void> {\n const blocks = anchoredBlocks(this.doc);\n let view: PageView;\n try {\n view = await this.channel.request<PageView>(\"page\", {\n route: this.doc.location.pathname,\n path: pageFile(blocks),\n });\n } catch (error) {\n this.stage = { kind: \"failed\", message: messageOf(error) };\n this.render();\n return;\n }\n this.stage = { kind: \"on\", view };\n this.draw(view, blocks);\n }\n\n private async refresh(): Promise<void> {\n this.notify(\"Refreshing…\");\n try {\n await this.channel.request(\"refresh\");\n } catch (error) {\n this.notify(messageOf(error));\n return;\n }\n await this.load();\n this.didChange();\n this.notify(\"Refreshed.\");\n }\n\n // --- The page ---\n\n private draw(view: PageView, blocks: HTMLElement[]): void {\n if (view.kind === \"not-page\") {\n this.clearPage();\n this.render();\n return;\n }\n const root = contentRoot(blocks);\n const changes = view.page?.changes ?? [];\n this.arrived = root !== undefined && anchorsArrived(root, blocks.length, changes);\n if (!root || !this.arrived) {\n this.clearPage();\n this.render();\n if (view.threads.state === \"on\") void this.listThreads(view);\n return;\n }\n this.listed = undefined;\n if (root !== this.root) this.clearPage();\n this.root = root;\n this.ensureStyle();\n const key = JSON.stringify(changes);\n if (key !== this.marked) {\n this.marked = key;\n this.at = -1;\n this.atEnd = false;\n this.marks = markChanges(root, changes);\n setShow(root, this.show);\n this.linkLabels();\n }\n this.stopSources ??= showSources(root);\n this.drawOverlay(view, root);\n this.render();\n this.goToAsked();\n }\n\n private drawOverlay(view: PageView, root: HTMLElement): void {\n const threads = view.threads;\n if (threads.state !== \"on\") {\n this.disposeOverlay();\n return;\n }\n if (this.overlay && this.overlayFor === threads.pullRequest.number) {\n this.didChange();\n return;\n }\n this.disposeOverlay();\n this.overlayFor = threads.pullRequest.number;\n this.overlay = createOverlay({\n root,\n host: this.host(),\n columnAt: COLUMN_AT,\n unsentBar: false,\n onUpdate: () => this.updated(),\n });\n }\n\n /**\n * The threads of a page whose anchors didn't arrive. The changes' anchors\n * stand in for the page's, so threads on the files it includes are read too.\n */\n private async listThreads(view: PageView): Promise<void> {\n const anchors = (view.page?.changes ?? []).flatMap((change) =>\n change.now\n ? [change.now, ...change.now.via.map((at) => ({ source: lineSource(at), via: [] }))]\n : [],\n );\n try {\n this.listed = await this.channel.request<OverlayData>(\"load\", {\n path: view.path,\n anchors,\n removed: this.removed(),\n });\n } catch (error) {\n this.notify(messageOf(error));\n return;\n }\n this.updated();\n }\n\n /** Goes where the page was opened for: a thread, or its first change. */\n private goToAsked(): void {\n const hash = this.doc.location.hash;\n if (hash.startsWith(THREAD_HASH) && this.overlay) {\n const id = decodeURIComponent(hash.slice(THREAD_HASH.length));\n const { pathname, search } = this.doc.location;\n this.doc.defaultView?.history.replaceState(null, \"\", `${pathname}${search}`);\n this.overlay.goToThread(id);\n } else if (recall(FIRST_KEY) === \"1\") {\n remember(FIRST_KEY, \"0\");\n if (this.marks.length > 0) this.step(1);\n }\n }\n\n /** Each mark's label opens its block's source. */\n private linkLabels(): void {\n for (const mark of this.marks) {\n const source = mark.element.getAttribute(DATA_SOURCE);\n const label = labelOf(mark.element);\n if (source === null || !label) continue;\n label.title = `Open ${describeSource(source, mark.element.getAttribute(DATA_VIA))}`;\n label.tabIndex = 0;\n label.setAttribute(\"role\", \"link\");\n const open = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n this.openSource(source);\n };\n label.addEventListener(\"click\", open);\n label.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Enter\") open(event);\n });\n }\n }\n\n private ensureStyle(): void {\n if (this.style?.isConnected) return;\n this.style = this.doc.createElement(\"style\");\n this.style.setAttribute(DATA_REVIEW, \"\");\n this.style.textContent = marksCss;\n this.doc.head.append(this.style);\n }\n\n private clearPage(): void {\n this.disposeOverlay();\n this.stopSources?.();\n this.stopSources = undefined;\n if (this.root) {\n clearMarks(this.root);\n this.root.classList.remove(CLASS_MARKS);\n this.root.removeAttribute(DATA_SHOW);\n }\n this.root = undefined;\n this.marked = undefined;\n this.marks = [];\n this.listed = undefined;\n this.at = -1;\n this.atEnd = false;\n this.style?.remove();\n this.style = undefined;\n this.updated();\n }\n\n private disposeOverlay(): void {\n this.overlay?.dispose();\n this.overlay = undefined;\n this.overlayFor = undefined;\n this.listeners = [];\n }\n\n private didChange(): void {\n for (const listener of this.listeners) listener();\n }\n\n /** The overlay redrew, or the threads were read: the counts may have changed. */\n private updated(): void {\n const unsent = this.unsent();\n this.app.toggleNotification(unsent > 0 ? { state: true, level: \"info\" } : { state: false });\n labelButton(this.doc, buttonLabel(unsent));\n this.render();\n }\n\n private unsent(): number {\n return this.overlay?.unsentCount() ?? this.listed?.pending.count ?? 0;\n }\n\n // --- The overlay's host ---\n\n private host(): OverlayHost {\n const path = () => (this.stage.kind === \"on\" ? this.stage.view.path : null);\n const ask = <T>(method: string, params: Record<string, unknown> = {}) =>\n this.channel.request<T>(method, { ...params, path: path() });\n return {\n load: () => ask<OverlayData>(\"load\", { anchors: this.anchors(), removed: this.removed() }),\n commentTarget: (anchor) => ask(\"commentTarget\", { anchor }),\n comment: (anchor, body, quote) => ask(\"comment\", { anchor, body, quote }),\n reply: (threadId, body, when) => ask(\"reply\", { threadId, body, when }),\n allThreads: () => ask(\"allThreads\"),\n resolve: (threadId, resolved) => ask(\"resolve\", { threadId, resolved }),\n submit: (event, body) => ask(\"submit\", body === undefined ? { event } : { event, body }),\n discard: () => ask(\"discard\"),\n openSource: (anchor) => this.openSource(anchor.source),\n openThread: (threadId, pagePath) => this.openThread(threadId, pagePath),\n notify: (message) => this.notify(message),\n onDidChange: (listener) => {\n this.listeners.push(listener);\n },\n };\n }\n\n /** Every anchored block on the page, in its order. */\n private anchors(): { source: string; via: string[] }[] {\n return anchoredBlocks(this.doc)\n .filter((element) => this.root?.contains(element))\n .map(anchorOf);\n }\n\n /** Where the page's removed, moved, and changed blocks were, for threads on their old text. */\n private removed(): { source: string; via: string[] }[] {\n if (this.stage.kind !== \"on\") return [];\n return (this.stage.view.page?.changes ?? [])\n .filter((c: Change) => c.kind !== \"added\" && c.was)\n .map((c) => ({ source: c.was?.source ?? \"\", via: c.was?.via ?? [] }));\n }\n\n // --- Going places ---\n\n /** Opens a block's source file at its first line, in the editor Astro opens files in. */\n private openSource(source: string): void {\n if (this.stage.kind !== \"on\") return;\n const where = sourceLocation(source);\n if (!where) return;\n const { contentRoot: root, separator } = this.stage.view;\n const file = [root, ...where.path.split(\"/\")].join(separator);\n void fetch(`/__open-in-editor?file=${encodeURIComponent(`${file}:${where.line}`)}`).catch(() =>\n this.notify(\"Couldn't open the editor.\"),\n );\n }\n\n private openThread(threadId: string, pagePath: string): void {\n const page = this.routeOf(pagePath);\n if (page === undefined) {\n this.notify(\"That page isn't one this site shows.\");\n return;\n }\n this.doc.location.assign(`${page}${THREAD_HASH}${encodeURIComponent(threadId)}`);\n }\n\n private routeOf(pagePath: string): string | undefined {\n if (this.stage.kind !== \"on\") return undefined;\n return this.stage.view.changedPages.find((p) => p.path === pagePath && p.status !== \"removed\")\n ?.route;\n }\n\n private step(by: 1 | -1): void {\n const total = this.marks.length;\n if (by === 1 && this.at + 1 >= total) {\n this.at = total;\n this.atEnd = true;\n this.render();\n return;\n }\n this.atEnd = false;\n this.at = Math.max(0, Math.min(total - 1, this.at + by));\n if (this.show !== \"changes\") this.setShow(\"changes\");\n const mark = this.marks[this.at];\n if (mark) goTo(mark.element);\n this.render();\n }\n\n private setShow(show: Show): void {\n this.show = show;\n if (this.root) setShow(this.root, show);\n this.overlay?.layout();\n }\n\n // --- Telling the reviewer ---\n\n private notify(message: string): void {\n this.message = message;\n if (this.messageTimer) clearTimeout(this.messageTimer);\n this.messageTimer = setTimeout(() => {\n this.message = undefined;\n this.render();\n }, 6000);\n this.announce(message);\n this.render();\n }\n\n private announce(message: string): void {\n this.live.textContent = \"\";\n this.live.textContent = message;\n }\n\n // --- The panel ---\n\n private render(): void {\n this.applyScheme();\n this.panel.hidden = !this.open;\n this.pad();\n if (!this.open) return;\n const focus = this.focused();\n const title = this.el(\"div\", \"ttl\");\n title.append(this.el(\"span\", \"grow\", \"Ascribe review\"));\n if (this.stage.kind === \"on\") {\n title.append(this.button(\"Stop Review\", \"\", () => void this.stop()));\n }\n title.append(this.button(\"Close\", \"\", () => this.app.toggleState({ state: false })));\n const parts: HTMLElement[] = [title, ...this.content()];\n if (this.message !== undefined) parts.push(this.notice(this.message));\n this.panel.replaceChildren(...parts);\n this.refocus(focus);\n this.placePanel();\n this.pad();\n }\n\n /**\n * Review's colors follow the page's, not the reader's system: a light-only\n * site stays light. The marks and the overlay read `data-ascribe-scheme`\n * on the page's root; a site that sets it itself keeps its own.\n */\n private applyScheme(): void {\n const site = this.siteScheme;\n const prefersDark =\n this.doc.defaultView?.matchMedia?.(\"(prefers-color-scheme: dark)\").matches ?? false;\n const scheme =\n site === \"light\" || site === \"dark\"\n ? site\n : pageScheme(this.root ?? this.doc.body, prefersDark);\n if (this.panel.dataset[\"scheme\"] !== scheme) this.panel.dataset[\"scheme\"] = scheme;\n if (site !== null) return;\n const html = this.doc.documentElement;\n if (!this.root) html.removeAttribute(DATA_SCHEME);\n else if (html.getAttribute(DATA_SCHEME) !== scheme) html.setAttribute(DATA_SCHEME, scheme);\n }\n\n /** Keeps the panel clear of the column of threads, over the page beside it. */\n private placePanel(): void {\n const style = this.panel.style;\n const start = this.overlay?.columnStart();\n const viewport = this.doc.documentElement.clientWidth;\n const width = Math.min(PANEL_WIDTH, viewport - 2 * PANEL_MARGIN);\n if (start === undefined || (viewport + width) / 2 <= start - PANEL_MARGIN) {\n style.removeProperty(\"left\");\n style.removeProperty(\"width\");\n style.removeProperty(\"transform\");\n return;\n }\n const room = Math.max(0, start - 2 * PANEL_MARGIN);\n const fits = Math.min(PANEL_WIDTH, room);\n style.left = `${PANEL_MARGIN + (room - fits) / 2}px`;\n style.width = `${fits}px`;\n style.transform = \"none\";\n }\n\n private content(): HTMLElement[] {\n const stage = this.stage;\n switch (stage.kind) {\n case \"off\": {\n const row = this.el(\"div\", \"row\");\n row.append(\n this.el(\"span\", \"grow\", \"Review is off for this project.\"),\n this.button(\"Start Review\", \"primary\", () => void this.start()),\n );\n return [row];\n }\n case \"starting\":\n return [\n this.row(\n \"Starting review: comparing the pages with their base and looking for the pull request…\",\n ),\n ];\n case \"failed\": {\n const notice = this.notice(stage.message);\n notice.append(this.button(\"Try again\", \"primary\", () => void this.start()));\n return [notice];\n }\n case \"on\":\n return stage.view.kind === \"not-page\" ? this.notPage(stage.view) : this.onPage(stage.view);\n }\n }\n\n /** The site's own route: nothing to review, and the pages that changed. */\n private notPage(view: PageView): HTMLElement[] {\n const body = this.el(\"div\", \"body\");\n const { pullRequest } = againstText(view);\n const pages = view.changedPages.filter((p) => p.status !== \"removed\");\n body.append(\n this.el(\n \"span\",\n \"\",\n pages.length === 0\n ? \"Nothing to review here: this page doesn't come from the Ascribe project, and no page changed.\"\n : `Nothing to review here: this page doesn't come from the Ascribe project. Pages ${pullRequest ?? \"this branch\"} changes:`,\n ),\n );\n if (pages.length > 0) {\n const list = this.el(\"ul\", \"\");\n for (const page of pages) {\n const item = this.el(\"li\", \"\");\n const link = this.el(\"a\", \"\", page.route) as HTMLAnchorElement;\n link.href = page.route;\n item.append(link, ` ${pageDetail(page)}`);\n list.append(item);\n }\n body.append(list);\n }\n const parts = [body];\n if (view.problem !== null)\n parts.push(this.notice(`Couldn't compare the pages: ${view.problem}`));\n const errors = errorsNotice(view.errors);\n if (errors !== undefined) parts.push(this.notice(errors));\n return parts;\n }\n\n private onPage(view: PageView): HTMLElement[] {\n const parts: HTMLElement[] = [this.controls(view)];\n if (this.breakdown && view.page) {\n parts.push(this.el(\"div\", \"legend\", countsText(view.page.counts) || \"No changes\"));\n }\n if (view.problem !== null)\n parts.push(this.notice(`Couldn't compare the pages: ${view.problem}`));\n const errors = errorsNotice(view.errors);\n if (errors !== undefined) parts.push(this.notice(errors));\n const threads = threadsNotice(view.threads);\n if (threads !== undefined) parts.push(this.notice(threads));\n if (this.atEnd) parts.push(this.endNotice(view));\n if (!this.arrived) parts.push(this.notArrived(view));\n const unsent = this.unsent();\n if (unsent > 0) {\n const bar = this.el(\"div\", \"unsent\");\n bar.append(\n this.el(\"b\", \"\", unsentText(unsent)),\n this.el(\n \"span\",\n \"hint\",\n `Only you can see ${unsent === 1 ? \"it\" : \"them\"} until you submit.`,\n ),\n this.el(\"span\", \"spacer\"),\n );\n if (this.overlay) {\n bar.append(this.button(\"Submit review…\", \"primary\", () => this.overlay?.submitReview()));\n }\n parts.push(bar);\n }\n return parts;\n }\n\n /** The review controls, in one row. */\n private controls(view: PageView): HTMLElement {\n const row = this.el(\"div\", \"row\");\n const info = this.el(\"span\", \"grow\");\n const { pullRequest, base } = againstText(view);\n if (pullRequest !== null && view.threads.state === \"on\") {\n const link = this.el(\"a\", \"\", pullRequest) as HTMLAnchorElement;\n link.href = view.threads.pullRequest.url;\n link.target = \"_blank\";\n link.rel = \"noopener noreferrer\";\n link.title = `Open pull request ${pullRequest} on GitHub`;\n info.append(link, \" against \");\n } else {\n info.append(\"Against \");\n }\n const baseName = this.el(\"b\", \"\", base ?? \"the base\");\n if (view.base) {\n baseName.title = `Compared with ${(view.base.merge_base ?? view.base.commit).slice(0, 7)}, where this branch left ${view.base.requested}`;\n }\n info.append(baseName);\n const page = view.page;\n if (page?.status === \"added\") info.append(\" · a new page\");\n if (page && !page.own_file_changed && page.status === \"changed\" && page.because.length > 0) {\n info.append(\" · changed only through \");\n page.because.forEach((cause, i) => {\n if (i > 0) info.append(\", \");\n info.append(this.el(\"code\", \"\", cause));\n });\n }\n row.append(info);\n if (this.arrived) {\n const total = this.marks.length;\n const stepping = this.at >= 0 && this.at < total && this.show === \"changes\";\n const count = this.button(position(total, stepping ? this.at : -1), \"link position\", () => {\n this.breakdown = !this.breakdown;\n this.render();\n });\n count.setAttribute(\"aria-expanded\", String(this.breakdown));\n if (page) count.title = countsText(page.counts);\n const shows = this.el(\"div\", \"segmented\");\n shows.setAttribute(\"role\", \"group\");\n shows.setAttribute(\"aria-label\", \"Show\");\n for (const [show, label] of SHOWS) {\n const choice = this.button(label, \"\", () => {\n this.setShow(show);\n this.render();\n });\n choice.setAttribute(\"aria-pressed\", String(this.show === show));\n shows.append(choice);\n }\n const previous = this.button(\"↑\", \"ghost square\", () => this.step(-1));\n previous.setAttribute(\"aria-label\", \"Previous change\");\n previous.title = \"Previous change\";\n previous.disabled = total === 0;\n const next = this.button(\"↓\", \"ghost square\", () => this.step(1));\n next.setAttribute(\"aria-label\", \"Next change\");\n next.title = \"Next change\";\n row.append(count, shows, previous, next);\n }\n if (this.overlay) {\n const n = this.overlay.threadCount();\n const all = this.button(n === undefined ? \"Comments\" : `Comments (${n})`, \"ghost\", () =>\n this.overlay?.showAllComments(),\n );\n all.setAttribute(\"aria-label\", \"All comments on this pull request\");\n all.setAttribute(\"aria-haspopup\", \"dialog\");\n row.append(all);\n }\n const refresh = this.button(\"Refresh\", \"ghost\", () => void this.refresh());\n refresh.setAttribute(\"aria-label\", \"Refresh comments and changes\");\n row.append(refresh);\n return row;\n }\n\n /** Past the last change: the next changed page. */\n private endNotice(view: PageView): HTMLElement {\n const notice = this.notice(\n this.marks.length === 0\n ? \"This page has no changes.\"\n : \"That was the last change on this page.\",\n );\n const next = nextChangedPage(view.changedPages, view.path);\n if (next === null) notice.append(this.el(\"span\", \"\", \"No other page changed.\"));\n else {\n const target = next.page;\n notice.append(\n this.button(nextPageText(next), \"primary\", () => {\n remember(FIRST_KEY, \"1\");\n this.doc.location.assign(target.route);\n }),\n );\n }\n return notice;\n }\n\n /** The page's changes and threads, listed, since nothing could be placed on it. */\n private notArrived(view: PageView): HTMLElement {\n const body = this.el(\"div\", \"body\");\n const changes = view.page?.changes ?? [];\n const threads = listedThreads(this.listed);\n const what = [\n view.threads.state === \"on\" ? plural(threads.length, \"comment\") : undefined,\n plural(changes.length, \"change\"),\n ]\n .filter((x) => x !== undefined)\n .join(\" and \");\n body.append(\n this.el(\n \"b\",\n \"\",\n anchoredBlocks(this.doc).length === 0\n ? `This page has ${what}, but its blocks carry no source anchors.`\n : `This page has ${what}, but most of its changed blocks carry no source anchors.`,\n ),\n this.el(\n \"span\",\n \"\",\n `A layout or component is probably dropping the ${DATA_SOURCE} attributes, so nothing can be placed on the page. Everything is listed here instead.`,\n ),\n );\n if (changes.length > 0) {\n body.append(this.el(\"span\", \"hint\", \"Changes\"));\n const list = this.el(\"ul\", \"\");\n for (const change of changes) {\n const item = this.el(\"li\", \"\", `${change.kind} `);\n const source = change.now?.source;\n if (source !== undefined) {\n item.append(this.button(describeSource(source), \"link\", () => this.openSource(source)));\n } else {\n item.append(this.el(\"span\", \"\", change.text ?? \"text\"));\n }\n list.append(item);\n }\n body.append(list);\n }\n if (threads.length > 0) {\n body.append(this.el(\"span\", \"hint\", \"Comments\"));\n for (const thread of threads) body.append(this.threadCard(thread));\n }\n return body;\n }\n\n /** A thread, read only: open it on GitHub to reply. */\n private threadCard(thread: LocatedThread): HTMLElement {\n const card = this.el(\"div\", \"thread\");\n const where = this.el(\"div\", \"where\");\n const lines = thread.lines;\n const { label, removed } = threadLocation(thread);\n // A thread on removed text is on the base's lines, which the working tree doesn't have.\n if (lines !== undefined && !removed) {\n const source = `${thread.path.split(\"/\").map(encodeURIComponent).join(\"/\")}:${lines.first}-${lines.last}`;\n const link = this.button(label, \"link\", () => this.openSource(source));\n link.title = `Open ${thread.path}, line ${lines.first}`;\n where.append(link);\n } else {\n const name = this.el(\"span\", \"\", label);\n name.title = thread.path;\n where.append(name);\n }\n if (removed) where.append(\" · On removed text\");\n if (thread.resolved) where.append(\" · Resolved\");\n if (thread.outdated) where.append(\" · Outdated\");\n card.append(where);\n for (const comment of thread.comments) {\n const body = this.el(\"div\", \"comment\");\n body.append(\n this.el(\"b\", \"\", comment.author?.login ?? \"ghost\"),\n renderMarkdown(this.doc, comment.body),\n );\n card.append(body);\n }\n const url = thread.comments[0]?.url;\n if (url !== undefined && url !== \"\") {\n const link = this.el(\"a\", \"\", \"Open on GitHub\") as HTMLAnchorElement;\n link.href = url;\n link.target = \"_blank\";\n link.rel = \"noopener noreferrer\";\n card.append(link);\n }\n return card;\n }\n\n /** Room below the page, so the panel never hides what's focused. */\n private pad(): void {\n const html = this.doc.documentElement;\n const body = this.doc.body;\n if (this.open && this.stage.kind === \"on\") {\n this.padding ??= { scroll: html.style.scrollPaddingBottom, body: body.style.paddingBottom };\n const room = `${this.panel.offsetHeight + 90}px`;\n html.style.scrollPaddingBottom = room;\n body.style.paddingBottom = room;\n } else if (this.padding) {\n html.style.scrollPaddingBottom = this.padding.scroll;\n body.style.paddingBottom = this.padding.body;\n this.padding = undefined;\n }\n }\n\n // --- DOM ---\n\n private row(text: string): HTMLElement {\n const row = this.el(\"div\", \"row\");\n row.append(this.el(\"span\", \"grow\", text));\n return row;\n }\n\n private notice(text: string): HTMLElement {\n const notice = this.el(\"div\", \"notice\");\n const words = this.el(\"span\", \"\");\n // A command or a setting is written in backticks: show it as code.\n text.split(\"`\").forEach((part, i) => {\n if (part !== \"\") words.append(i % 2 === 1 ? this.el(\"code\", \"\", part) : part);\n });\n notice.append(words, this.el(\"span\", \"spacer\"));\n return notice;\n }\n\n private el(tag: string, className: string, text?: string): HTMLElement {\n const el = this.doc.createElement(tag);\n if (className) el.className = className;\n if (text !== undefined) el.textContent = text;\n return el;\n }\n\n private button(text: string, className: string, onClick: () => void): HTMLButtonElement {\n const button = this.doc.createElement(\"button\");\n button.type = \"button\";\n if (className) button.className = className;\n button.textContent = text;\n button.addEventListener(\"click\", onClick);\n return button;\n }\n\n /** The focused control's label, to focus it again after a redraw. */\n private focused(): string | undefined {\n const active = (this.panel.getRootNode() as ShadowRoot).activeElement;\n return active instanceof HTMLElement && this.panel.contains(active)\n ? (active.getAttribute(\"aria-label\") ?? active.textContent ?? undefined)\n : undefined;\n }\n\n private refocus(label: string | undefined): void {\n if (label === undefined) return;\n for (const button of Array.from(this.panel.querySelectorAll<HTMLElement>(\"button, a\"))) {\n if ((button.getAttribute(\"aria-label\") ?? button.textContent) === label) {\n button.focus();\n return;\n }\n }\n }\n}\n\n/** The label the marks put on a block: inside it at its start, or just before it. */\nfunction labelOf(element: HTMLElement): HTMLElement | undefined {\n const inside = element.querySelector<HTMLElement>(`:scope > .${CLASS_LABEL}`);\n if (inside) return inside;\n const before = element.previousElementSibling;\n return before instanceof HTMLElement && before.classList.contains(CLASS_LABEL_BEFORE)\n ? before\n : undefined;\n}\n\n/**\n * Puts the unsent count in the toolbar button's tooltip. The toolbar has no\n * API for a button's text, so this reads its markup and does nothing if\n * that changed.\n */\nfunction labelButton(doc: Document, text: string): void {\n const toolbar = doc.querySelector(\"astro-dev-toolbar\")?.shadowRoot;\n const button = toolbar?.querySelector(`button.item[data-app-id=\"${APP_ID}\"]`);\n const tip = button?.querySelector(\".item-tooltip\");\n if (tip) tip.textContent = text;\n button?.setAttribute(\"aria-label\", text);\n}\n\n/**\n * Every thread read for a page whose anchors didn't arrive, once each: on\n * the changes' blocks, on removed text, or on no block.\n */\nfunction listedThreads(data: OverlayData | undefined): LocatedThread[] {\n if (!data) return [];\n const { blocks, removed, detached } = data.threads;\n const seen = new Set<string>();\n return [...blocks, ...removed]\n .flatMap((entry) => entry.threads)\n .concat(detached)\n .filter((thread) => !seen.has(thread.id) && seen.add(thread.id));\n}\n\n/** An include's place (`<path>:<line>`) as a block's source (`<path>:<line>-<line>`). */\nfunction lineSource(at: string): string {\n const colon = at.lastIndexOf(\":\");\n const line = at.slice(colon + 1);\n return colon > 0 && /^\\d+$/.test(line) ? `${at}-${line}` : at;\n}\n\nfunction plural(count: number, noun: string): string {\n return count === 1 ? `1 ${noun}` : `${count} ${noun}s`;\n}\n\nfunction messageOf(error: unknown): string {\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n return String((error as { message: unknown }).message);\n }\n return String(error);\n}\n\nfunction remember(key: string, value: string): void {\n try {\n sessionStorage.setItem(key, value);\n } catch {\n // Storage is off: the panel just starts closed on the next page.\n }\n}\n\nfunction recall(key: string): string | null {\n try {\n return sessionStorage.getItem(key);\n } catch {\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/toolbar/app.ts"],"names":[],"mappings":"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","sourcesContent":["// The Ascribe review app in Astro's dev toolbar: the site preview's review.\n// It marks the page's changes with @ascribed/review's marks, hosts the\n// overlay for the pull request's threads, and holds the review controls in a\n// panel that opens from its toolbar button. Every request goes to the dev\n// server over the toolbar's channel; the page never sees a token and makes\n// no request to GitHub.\n//\n// Review stays on across pages and reloads (the dev server holds it), and\n// the panel stays as the reviewer left it in this tab.\nimport {\n clearMarks,\n describeSource,\n goTo,\n markChanges,\n setShow,\n showSources,\n type Mark,\n type Show,\n} from \"@ascribed/review/marks\";\nimport marksCss from \"@ascribed/review/marks.css?inline\";\nimport {\n createOverlay,\n renderMarkdown,\n type HostError,\n type LocatedThread,\n type Overlay,\n type OverlayData,\n type OverlayHost,\n type PromptRequest,\n} from \"@ascribed/review/overlay\";\nimport { defineToolbarApp } from \"astro/toolbar\";\nimport {\n APP_ID,\n CHANGED_EVENT,\n REQUEST_EVENT,\n RESULT_EVENT,\n type Change,\n type PageView,\n type Result,\n type Status,\n} from \"../review/protocol.js\";\nimport {\n anchorOf,\n anchoredBlocks,\n anchorsArrived,\n contentRoot,\n pageFile,\n pageScheme,\n sourceLocation,\n} from \"./page.js\";\nimport { PANEL_CSS } from \"./style.js\";\nimport {\n againstText,\n buttonLabel,\n countsText,\n errorsNotice,\n nextChangedPage,\n nextPageText,\n pageDetail,\n position,\n THREAD_HASH,\n threadLocation,\n threadsNotice,\n unsentText,\n} from \"./text.js\";\nimport {\n CLASS_LABEL,\n CLASS_LABEL_BEFORE,\n CLASS_MARKS,\n DATA_REVIEW,\n DATA_SCHEME,\n DATA_SHOW,\n DATA_SOURCE,\n DATA_VIA,\n} from \"../names.js\";\n\ntype ServerHelpers = Parameters<NonNullable<Parameters<typeof defineToolbarApp>[0][\"init\"]>>[2];\ntype AppEvents = Parameters<NonNullable<Parameters<typeof defineToolbarApp>[0][\"init\"]>>[1];\n\n/** The width of the page's container from which threads show in a column beside it. */\nconst COLUMN_AT = 720;\n/** The room between the panel and the window's edges, or the column of threads. */\nconst PANEL_MARGIN = 10;\nconst PANEL_WIDTH = 960;\n/** How long a request may take before the app gives up on the dev server. */\nconst TIMEOUT_MS = 120_000;\n/** This tab's memory: whether the panel is open, and a page to step into. */\nconst OPEN_KEY = \"ascribe-review-open\";\nconst FIRST_KEY = \"ascribe-review-first\";\n\n/** The model file, which a page can change through but isn't a file of content. */\nconst MODEL_FILE = \"ascribe.toml\";\n\nconst SHOWS: [Show, string][] = [\n [\"changes\", \"Changes\"],\n [\"will\", \"As it will be\"],\n [\"was\", \"As it was\"],\n];\n\nexport default defineToolbarApp({\n init(canvas, app, server) {\n void new ReviewApp(canvas, app, server, document).init();\n },\n});\n\n/** Requests to the dev server, each answered by its `id`. */\nclass Channel {\n private seq = 0;\n private readonly waiting = new Map<\n number,\n { resolve: (value: unknown) => void; reject: (error: HostError) => void }\n >();\n readonly tab = Math.random().toString(36).slice(2);\n\n constructor(private readonly server: ServerHelpers) {\n server.on<Result>(RESULT_EVENT, (result) => {\n if (result.tab !== this.tab) return;\n const waiter = this.waiting.get(result.id);\n if (!waiter) return;\n this.waiting.delete(result.id);\n if (result.error) waiter.reject(result.error);\n else waiter.resolve(result.result);\n });\n }\n\n request<T>(method: string, params: Record<string, unknown> = {}): Promise<T> {\n const id = ++this.seq;\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.waiting.delete(id);\n reject({ message: \"The dev server didn't answer. Is `astro dev` still running?\" });\n }, TIMEOUT_MS);\n this.waiting.set(id, {\n resolve: (value) => {\n clearTimeout(timer);\n resolve(value as T);\n },\n reject: (error) => {\n clearTimeout(timer);\n reject(error);\n },\n });\n this.server.send(REQUEST_EVENT, { tab: this.tab, id, method, params });\n });\n }\n}\n\ntype Stage =\n | { kind: \"off\" }\n | { kind: \"starting\" }\n | { kind: \"failed\"; message: string }\n | { kind: \"on\"; view: PageView };\n\nclass ReviewApp {\n private readonly channel: Channel;\n private readonly panel: HTMLElement;\n private readonly live: HTMLElement;\n private stage: Stage = { kind: \"off\" };\n private open = false;\n private root: HTMLElement | undefined;\n /** Whether the page's anchors arrived: else everything is listed in the panel. */\n private arrived = true;\n private marked: string | undefined;\n private marks: Mark[] = [];\n private show: Show = \"changes\";\n private at = -1;\n private atEnd = false;\n private breakdown = false;\n /** Whether the More review actions row is open. */\n private more = false;\n private overlay: Overlay | undefined;\n private overlayFor: number | undefined;\n private listeners: (() => void)[] = [];\n /** The threads, read for a page whose anchors didn't arrive. */\n private listed: OverlayData | undefined;\n private stopSources: (() => void) | undefined;\n private style: HTMLStyleElement | undefined;\n private padding: { scroll: string; body: string } | undefined;\n private message: string | undefined;\n private messageTimer: ReturnType<typeof setTimeout> | undefined;\n /** The scheme the site set for review's colors itself, if it did. */\n private readonly siteScheme: string | null;\n private restyleTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor(\n canvas: ShadowRoot,\n private readonly app: AppEvents,\n server: ServerHelpers,\n private readonly doc: Document,\n ) {\n this.channel = new Channel(server);\n const style = doc.createElement(\"style\");\n style.textContent = PANEL_CSS;\n this.panel = doc.createElement(\"div\");\n this.panel.className = \"panel\";\n this.panel.setAttribute(\"role\", \"region\");\n this.panel.setAttribute(\"aria-label\", \"Ascribe review\");\n this.live = doc.createElement(\"div\");\n this.live.className = \"sr-only\";\n this.live.setAttribute(\"role\", \"status\");\n this.live.setAttribute(\"aria-live\", \"polite\");\n canvas.append(style, this.panel, this.live);\n this.siteScheme = doc.documentElement.getAttribute(DATA_SCHEME);\n const win = doc.defaultView;\n win\n ?.matchMedia?.(\"(prefers-color-scheme: dark)\")\n .addEventListener(\"change\", () => this.render());\n win?.addEventListener(\"resize\", () => this.placePanel());\n // A theme switch on the page (a class or `data-theme` on the root, say) changes its colors.\n const restyle = () => {\n this.applyScheme();\n // Again once a transition between the themes is over.\n clearTimeout(this.restyleTimer);\n this.restyleTimer = setTimeout(() => this.applyScheme(), 400);\n };\n const observer = new MutationObserver((records) => {\n if (records.some((r) => r.attributeName !== DATA_SCHEME)) restyle();\n });\n for (const target of [doc.documentElement, doc.body]) {\n observer.observe(target, { attributes: true });\n }\n this.panel.addEventListener(\"keydown\", (event) => event.stopPropagation());\n server.on<{ from: string | null }>(CHANGED_EVENT, (event) => {\n if (event.from !== this.channel.tab) void this.changedElsewhere();\n });\n app.onToggled(({ state }) => {\n this.open = state;\n remember(OPEN_KEY, state ? \"1\" : \"0\");\n if (state && this.stage.kind === \"off\") void this.start();\n this.render();\n });\n }\n\n async init(): Promise<void> {\n let status: Status;\n try {\n status = await this.channel.request<Status>(\"status\");\n } catch {\n return;\n }\n if (!status.on) return;\n await this.load();\n if (recall(OPEN_KEY) === \"1\") this.app.toggleState({ state: true });\n }\n\n // --- Review on and off ---\n\n private async start(): Promise<void> {\n this.stage = { kind: \"starting\" };\n this.render();\n try {\n await this.channel.request<Status>(\"start\", {});\n } catch (error) {\n this.stage = { kind: \"failed\", message: messageOf(error) };\n this.render();\n return;\n }\n await this.load();\n }\n\n private async stop(): Promise<void> {\n try {\n await this.channel.request(\"stop\");\n } catch (error) {\n this.notify(messageOf(error));\n return;\n }\n this.clearPage();\n this.stage = { kind: \"off\" };\n this.render();\n this.announce(\"Review stopped.\");\n }\n\n /** Another page changed the threads, or stopped review. */\n private async changedElsewhere(): Promise<void> {\n let status: Status;\n try {\n status = await this.channel.request<Status>(\"status\");\n } catch {\n return;\n }\n if (!status.on) {\n this.clearPage();\n this.stage = { kind: \"off\" };\n this.render();\n } else if (this.stage.kind === \"on\") {\n this.didChange();\n }\n }\n\n /** Reads the page's changes and threads from the dev server, and draws them. */\n private async load(): Promise<void> {\n const blocks = anchoredBlocks(this.doc);\n let view: PageView;\n try {\n view = await this.channel.request<PageView>(\"page\", {\n route: this.doc.location.pathname,\n path: pageFile(blocks),\n });\n } catch (error) {\n this.stage = { kind: \"failed\", message: messageOf(error) };\n this.render();\n return;\n }\n this.stage = { kind: \"on\", view };\n this.draw(view, blocks);\n }\n\n private async refresh(): Promise<void> {\n this.notify(\"Refreshing…\");\n try {\n await this.channel.request(\"refresh\");\n } catch (error) {\n this.notify(messageOf(error));\n return;\n }\n await this.load();\n this.didChange();\n this.notify(\"Refreshed.\");\n }\n\n // --- The page ---\n\n private draw(view: PageView, blocks: HTMLElement[]): void {\n if (view.kind === \"not-page\") {\n this.clearPage();\n this.render();\n return;\n }\n const root = contentRoot(blocks);\n const changes = view.page?.changes ?? [];\n this.arrived = root !== undefined && anchorsArrived(root, blocks.length, changes);\n if (!root || !this.arrived) {\n this.clearPage();\n this.render();\n if (view.threads.state === \"on\") void this.listThreads(view);\n return;\n }\n this.listed = undefined;\n if (root !== this.root) this.clearPage();\n this.root = root;\n this.ensureStyle();\n const key = JSON.stringify(changes);\n if (key !== this.marked) {\n this.marked = key;\n this.at = -1;\n this.atEnd = false;\n this.marks = markChanges(root, changes);\n setShow(root, this.show);\n this.linkLabels();\n }\n this.stopSources ??= showSources(root);\n this.drawOverlay(view, root);\n this.render();\n this.goToAsked();\n }\n\n private drawOverlay(view: PageView, root: HTMLElement): void {\n const threads = view.threads;\n if (threads.state !== \"on\") {\n this.disposeOverlay();\n return;\n }\n if (this.overlay && this.overlayFor === threads.pullRequest.number) {\n this.didChange();\n return;\n }\n this.disposeOverlay();\n this.overlayFor = threads.pullRequest.number;\n this.overlay = createOverlay({\n root,\n host: this.host(),\n columnAt: COLUMN_AT,\n unsentBar: false,\n onUpdate: () => this.updated(),\n });\n }\n\n /**\n * The threads of a page whose anchors didn't arrive. The changes' anchors\n * stand in for the page's, so threads on the files it includes are read too.\n */\n private async listThreads(view: PageView): Promise<void> {\n const anchors = (view.page?.changes ?? []).flatMap((change) =>\n change.now\n ? [change.now, ...change.now.via.map((at) => ({ source: lineSource(at), via: [] }))]\n : [],\n );\n try {\n this.listed = await this.channel.request<OverlayData>(\"load\", {\n path: view.path,\n anchors,\n removed: this.removed(),\n });\n } catch (error) {\n this.notify(messageOf(error));\n return;\n }\n this.updated();\n }\n\n /** Goes where the page was opened for: a thread, or its first change. */\n private goToAsked(): void {\n const hash = this.doc.location.hash;\n if (hash.startsWith(THREAD_HASH) && this.overlay) {\n const id = decodeURIComponent(hash.slice(THREAD_HASH.length));\n const { pathname, search } = this.doc.location;\n this.doc.defaultView?.history.replaceState(null, \"\", `${pathname}${search}`);\n this.overlay.goToThread(id);\n } else if (recall(FIRST_KEY) === \"1\") {\n remember(FIRST_KEY, \"0\");\n if (this.marks.length > 0) this.step(1);\n }\n }\n\n /** Each mark's label opens its block's source. */\n private linkLabels(): void {\n for (const mark of this.marks) {\n const source = mark.element.getAttribute(DATA_SOURCE);\n const label = labelOf(mark.element);\n if (source === null || !label) continue;\n label.title = `Open ${describeSource(source, mark.element.getAttribute(DATA_VIA))}`;\n label.tabIndex = 0;\n label.setAttribute(\"role\", \"link\");\n const open = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n this.openSource(source);\n };\n label.addEventListener(\"click\", open);\n label.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Enter\") open(event);\n });\n }\n }\n\n private ensureStyle(): void {\n if (this.style?.isConnected) return;\n this.style = this.doc.createElement(\"style\");\n this.style.setAttribute(DATA_REVIEW, \"\");\n this.style.textContent = marksCss;\n this.doc.head.append(this.style);\n }\n\n private clearPage(): void {\n this.disposeOverlay();\n this.stopSources?.();\n this.stopSources = undefined;\n if (this.root) {\n clearMarks(this.root);\n this.root.classList.remove(CLASS_MARKS);\n this.root.removeAttribute(DATA_SHOW);\n }\n this.root = undefined;\n this.marked = undefined;\n this.marks = [];\n this.listed = undefined;\n this.at = -1;\n this.atEnd = false;\n this.style?.remove();\n this.style = undefined;\n this.updated();\n }\n\n private disposeOverlay(): void {\n this.overlay?.dispose();\n this.overlay = undefined;\n this.overlayFor = undefined;\n this.listeners = [];\n }\n\n private didChange(): void {\n for (const listener of this.listeners) listener();\n }\n\n /** The overlay redrew, or the threads were read: the counts may have changed. */\n private updated(): void {\n const unsent = this.unsent();\n this.app.toggleNotification(unsent > 0 ? { state: true, level: \"info\" } : { state: false });\n labelButton(this.doc, buttonLabel(unsent));\n this.render();\n }\n\n private unsent(): number {\n return this.overlay?.unsentCount() ?? this.listed?.pending.count ?? 0;\n }\n\n // --- The overlay's host ---\n\n private host(): OverlayHost {\n const path = () => (this.stage.kind === \"on\" ? this.stage.view.path : null);\n const ask = <T>(method: string, params: Record<string, unknown> = {}) =>\n this.channel.request<T>(method, { ...params, path: path() });\n return {\n load: () => ask<OverlayData>(\"load\", { anchors: this.anchors(), removed: this.removed() }),\n commentTarget: (anchor) => ask(\"commentTarget\", { anchor }),\n comment: (anchor, body, quote) => ask(\"comment\", { anchor, body, quote }),\n reply: (threadId, body, when) => ask(\"reply\", { threadId, body, when }),\n allThreads: () => ask(\"allThreads\"),\n resolve: (threadId, resolved) => ask(\"resolve\", { threadId, resolved }),\n submit: (event, body) => ask(\"submit\", body === undefined ? { event } : { event, body }),\n discard: () => ask(\"discard\"),\n promptAgent: (request) => this.promptAgent(request),\n openSource: (anchor) => this.openSource(anchor.source),\n openThread: (threadId, pagePath) => this.openThread(threadId, pagePath),\n notify: (message) => this.notify(message),\n onDidChange: (listener) => {\n this.listeners.push(listener);\n },\n };\n }\n\n /**\n * Has the dev server build a prompt and puts it on the clipboard: a page\n * can't fill in an agent on the machine. Rejects with what went wrong.\n */\n private async promptAgent(request: PromptRequest): Promise<void> {\n const path = this.stage.kind === \"on\" ? this.stage.view.path : null;\n const prompt = await this.channel.request<string | null>(\"prompt\", { request, path });\n if (prompt === null) {\n throw {\n message:\n request.kind === \"page-changes\"\n ? \"nothing on this page changed.\"\n : request.kind === \"fragment-reach\"\n ? \"no page changed through that file.\"\n : \"no review comment is open.\",\n } satisfies HostError;\n }\n if (!(await copyText(this.doc, prompt))) {\n throw { message: \"the browser didn't allow copying it.\" } satisfies HostError;\n }\n this.notify(\"Prompt copied. Paste it into your agent.\");\n }\n\n /** Every anchored block on the page, in its order. */\n private anchors(): { source: string; via: string[] }[] {\n return anchoredBlocks(this.doc)\n .filter((element) => this.root?.contains(element))\n .map(anchorOf);\n }\n\n /** Where the page's removed, moved, and changed blocks were, for threads on their old text. */\n private removed(): { source: string; via: string[] }[] {\n if (this.stage.kind !== \"on\") return [];\n return (this.stage.view.page?.changes ?? [])\n .filter((c: Change) => c.kind !== \"added\" && c.was)\n .map((c) => ({ source: c.was?.source ?? \"\", via: c.was?.via ?? [] }));\n }\n\n // --- Going places ---\n\n /** Opens a block's source file at its first line, in the editor Astro opens files in. */\n private openSource(source: string): void {\n if (this.stage.kind !== \"on\") return;\n const where = sourceLocation(source);\n if (!where) return;\n const { contentRoot: root, separator } = this.stage.view;\n const file = [root, ...where.path.split(\"/\")].join(separator);\n void fetch(`/__open-in-editor?file=${encodeURIComponent(`${file}:${where.line}`)}`).catch(() =>\n this.notify(\"Couldn't open the editor.\"),\n );\n }\n\n private openThread(threadId: string, pagePath: string): void {\n const page = this.routeOf(pagePath);\n if (page === undefined) {\n this.notify(\"That page isn't one this site shows.\");\n return;\n }\n this.doc.location.assign(`${page}${THREAD_HASH}${encodeURIComponent(threadId)}`);\n }\n\n private routeOf(pagePath: string): string | undefined {\n if (this.stage.kind !== \"on\") return undefined;\n return this.stage.view.changedPages.find((p) => p.path === pagePath && p.status !== \"removed\")\n ?.route;\n }\n\n private step(by: 1 | -1): void {\n const total = this.marks.length;\n if (by === 1 && this.at + 1 >= total) {\n this.at = total;\n this.atEnd = true;\n this.render();\n return;\n }\n this.atEnd = false;\n this.at = Math.max(0, Math.min(total - 1, this.at + by));\n if (this.show !== \"changes\") this.setShow(\"changes\");\n const mark = this.marks[this.at];\n if (mark) goTo(mark.element);\n this.render();\n }\n\n private setShow(show: Show): void {\n this.show = show;\n if (this.root) setShow(this.root, show);\n this.overlay?.layout();\n }\n\n // --- Telling the reviewer ---\n\n private notify(message: string): void {\n this.message = message;\n if (this.messageTimer) clearTimeout(this.messageTimer);\n this.messageTimer = setTimeout(() => {\n this.message = undefined;\n this.render();\n }, 6000);\n this.announce(message);\n this.render();\n }\n\n private announce(message: string): void {\n this.live.textContent = \"\";\n this.live.textContent = message;\n }\n\n // --- The panel ---\n\n private render(): void {\n this.applyScheme();\n this.panel.hidden = !this.open;\n this.pad();\n if (!this.open) return;\n const focus = this.focused();\n const title = this.el(\"div\", \"ttl\");\n title.append(this.el(\"span\", \"grow\", \"Ascribe review\"));\n if (this.stage.kind === \"on\") {\n title.append(this.button(\"Stop Review\", \"\", () => void this.stop()));\n }\n title.append(this.button(\"Close\", \"\", () => this.app.toggleState({ state: false })));\n const parts: HTMLElement[] = [title, ...this.content()];\n if (this.message !== undefined) parts.push(this.notice(this.message));\n this.panel.replaceChildren(...parts);\n this.refocus(focus);\n this.placePanel();\n this.pad();\n }\n\n /**\n * Review's colors follow the page's, not the reader's system: a light-only\n * site stays light. The marks and the overlay read `data-ascribe-scheme`\n * on the page's root; a site that sets it itself keeps its own.\n */\n private applyScheme(): void {\n const site = this.siteScheme;\n const prefersDark =\n this.doc.defaultView?.matchMedia?.(\"(prefers-color-scheme: dark)\").matches ?? false;\n const scheme =\n site === \"light\" || site === \"dark\"\n ? site\n : pageScheme(this.root ?? this.doc.body, prefersDark);\n if (this.panel.dataset[\"scheme\"] !== scheme) this.panel.dataset[\"scheme\"] = scheme;\n if (site !== null) return;\n const html = this.doc.documentElement;\n if (!this.root) html.removeAttribute(DATA_SCHEME);\n else if (html.getAttribute(DATA_SCHEME) !== scheme) html.setAttribute(DATA_SCHEME, scheme);\n }\n\n /** Keeps the panel clear of the column of threads, over the page beside it. */\n private placePanel(): void {\n const style = this.panel.style;\n const start = this.overlay?.columnStart();\n const viewport = this.doc.documentElement.clientWidth;\n const width = Math.min(PANEL_WIDTH, viewport - 2 * PANEL_MARGIN);\n if (start === undefined || (viewport + width) / 2 <= start - PANEL_MARGIN) {\n style.removeProperty(\"left\");\n style.removeProperty(\"width\");\n style.removeProperty(\"transform\");\n return;\n }\n const room = Math.max(0, start - 2 * PANEL_MARGIN);\n const fits = Math.min(PANEL_WIDTH, room);\n style.left = `${PANEL_MARGIN + (room - fits) / 2}px`;\n style.width = `${fits}px`;\n style.transform = \"none\";\n }\n\n private content(): HTMLElement[] {\n const stage = this.stage;\n switch (stage.kind) {\n case \"off\": {\n const row = this.el(\"div\", \"row\");\n row.append(\n this.el(\"span\", \"grow\", \"Review is off for this project.\"),\n this.button(\"Start Review\", \"primary\", () => void this.start()),\n );\n return [row];\n }\n case \"starting\":\n return [\n this.row(\n \"Starting review: comparing the pages with their base and looking for the pull request…\",\n ),\n ];\n case \"failed\": {\n const notice = this.notice(stage.message);\n notice.append(this.button(\"Try again\", \"primary\", () => void this.start()));\n return [notice];\n }\n case \"on\":\n return stage.view.kind === \"not-page\" ? this.notPage(stage.view) : this.onPage(stage.view);\n }\n }\n\n /** The site's own route: nothing to review, and the pages that changed. */\n private notPage(view: PageView): HTMLElement[] {\n const body = this.el(\"div\", \"body\");\n const { pullRequest } = againstText(view);\n const pages = view.changedPages.filter((p) => p.status !== \"removed\");\n body.append(\n this.el(\n \"span\",\n \"\",\n pages.length === 0\n ? \"Nothing to review here: this page doesn't come from the Ascribe project, and no page changed.\"\n : `Nothing to review here: this page doesn't come from the Ascribe project. Pages ${pullRequest ?? \"this branch\"} changes:`,\n ),\n );\n if (pages.length > 0) {\n const list = this.el(\"ul\", \"\");\n for (const page of pages) {\n const item = this.el(\"li\", \"\");\n const link = this.el(\"a\", \"\", page.route) as HTMLAnchorElement;\n link.href = page.route;\n item.append(link, ` ${pageDetail(page)}`);\n list.append(item);\n }\n body.append(list);\n }\n const parts = [body];\n if (view.problem !== null)\n parts.push(this.notice(`Couldn't compare the pages: ${view.problem}`));\n const errors = errorsNotice(view.errors);\n if (errors !== undefined) parts.push(this.notice(errors));\n return parts;\n }\n\n private onPage(view: PageView): HTMLElement[] {\n const parts: HTMLElement[] = [this.controls(view)];\n const more = this.moreRow(view);\n if (more) parts.push(more);\n if (this.breakdown && view.page) {\n parts.push(this.el(\"div\", \"legend\", countsText(view.page.counts) || \"No changes\"));\n }\n if (view.problem !== null)\n parts.push(this.notice(`Couldn't compare the pages: ${view.problem}`));\n const errors = errorsNotice(view.errors);\n if (errors !== undefined) parts.push(this.notice(errors));\n const threads = threadsNotice(view.threads);\n if (threads !== undefined) parts.push(this.notice(threads));\n if (this.atEnd) parts.push(this.endNotice(view));\n if (!this.arrived) parts.push(this.notArrived(view));\n const unsent = this.unsent();\n if (unsent > 0) {\n const bar = this.el(\"div\", \"unsent\");\n bar.append(\n this.el(\"b\", \"\", unsentText(unsent)),\n this.el(\n \"span\",\n \"hint\",\n `Only you can see ${unsent === 1 ? \"it\" : \"them\"} until you submit.`,\n ),\n this.el(\"span\", \"spacer\"),\n );\n if (this.overlay) {\n bar.append(this.button(\"Submit review…\", \"primary\", () => this.overlay?.submitReview()));\n }\n parts.push(bar);\n }\n return parts;\n }\n\n /** The review controls, in one row. */\n private controls(view: PageView): HTMLElement {\n const row = this.el(\"div\", \"row\");\n const info = this.el(\"span\", \"grow\");\n const { pullRequest, base } = againstText(view);\n if (pullRequest !== null && view.threads.state === \"on\") {\n const link = this.el(\"a\", \"\", pullRequest) as HTMLAnchorElement;\n link.href = view.threads.pullRequest.url;\n link.target = \"_blank\";\n link.rel = \"noopener noreferrer\";\n link.title = `Open pull request ${pullRequest} on GitHub`;\n info.append(link, \" against \");\n } else {\n info.append(\"Against \");\n }\n const baseName = this.el(\"b\", \"\", base ?? \"the base\");\n if (view.base) {\n baseName.title = `Compared with ${(view.base.merge_base ?? view.base.commit).slice(0, 7)}, where this branch left ${view.base.requested}`;\n }\n info.append(baseName);\n const page = view.page;\n if (page?.status === \"added\") info.append(\" · a new page\");\n if (page && !page.own_file_changed && page.status === \"changed\" && page.because.length > 0) {\n info.append(\" · changed only through \");\n page.because.forEach((cause, i) => {\n if (i > 0) info.append(\", \");\n info.append(this.el(\"code\", \"\", cause));\n });\n }\n row.append(info);\n if (this.arrived) {\n const total = this.marks.length;\n const stepping = this.at >= 0 && this.at < total && this.show === \"changes\";\n const count = this.button(position(total, stepping ? this.at : -1), \"link position\", () => {\n this.breakdown = !this.breakdown;\n this.render();\n });\n count.setAttribute(\"aria-expanded\", String(this.breakdown));\n if (page) count.title = countsText(page.counts);\n const shows = this.el(\"div\", \"segmented\");\n shows.setAttribute(\"role\", \"group\");\n shows.setAttribute(\"aria-label\", \"Show\");\n for (const [show, label] of SHOWS) {\n const choice = this.button(label, \"\", () => {\n this.setShow(show);\n this.render();\n });\n choice.setAttribute(\"aria-pressed\", String(this.show === show));\n shows.append(choice);\n }\n const previous = this.button(\"↑\", \"ghost square\", () => this.step(-1));\n previous.setAttribute(\"aria-label\", \"Previous change\");\n previous.title = \"Previous change\";\n previous.disabled = total === 0;\n const next = this.button(\"↓\", \"ghost square\", () => this.step(1));\n next.setAttribute(\"aria-label\", \"Next change\");\n next.title = \"Next change\";\n row.append(count, shows, previous, next);\n }\n if (this.overlay) {\n const n = this.overlay.threadCount();\n const all = this.button(n === undefined ? \"Comments\" : `Comments (${n})`, \"ghost\", () =>\n this.overlay?.showAllComments(),\n );\n all.setAttribute(\"aria-label\", \"All comments on this pull request\");\n all.setAttribute(\"aria-haspopup\", \"dialog\");\n row.append(all);\n }\n const refresh = this.button(\"Refresh\", \"ghost\", () => void this.refresh());\n refresh.setAttribute(\"aria-label\", \"Refresh comments and changes\");\n row.append(refresh);\n if (page && page.status !== \"removed\") {\n const more = this.button(\"⋯\", \"ghost square\", () => {\n this.more = !this.more;\n this.render();\n });\n more.setAttribute(\"aria-label\", \"More review actions\");\n more.title = \"More review actions\";\n more.setAttribute(\"aria-expanded\", String(this.more));\n row.append(more);\n }\n return row;\n }\n\n /** More review actions: Prompt agent about the page, and about each file it changed through. */\n private moreRow(view: PageView): HTMLElement | undefined {\n const page = view.page;\n if (!this.more || !page || page.status === \"removed\") return undefined;\n const menu = this.el(\"div\", \"row menu\");\n menu.setAttribute(\"role\", \"group\");\n menu.setAttribute(\"aria-label\", \"More review actions\");\n const items: [string, PromptRequest][] = [\n [\"Prompt agent: review this page\", { kind: \"page-changes\" }],\n ];\n const fragments = page.because.filter((cause) => cause !== MODEL_FILE);\n for (const fragment of fragments) {\n items.push([\n fragments.length === 1\n ? \"Prompt agent: check this fragment's pages\"\n : `Prompt agent: check the pages that show ${fragment}`,\n { kind: \"fragment-reach\", fragment },\n ]);\n }\n for (const [label, request] of items) {\n menu.append(\n this.button(label, \"ghost\", () => {\n this.promptAgent(request).catch((error: HostError) =>\n this.notify(`The prompt couldn't be built: ${error.message}`),\n );\n }),\n );\n }\n return menu;\n }\n\n /** Past the last change: the next changed page. */\n private endNotice(view: PageView): HTMLElement {\n const notice = this.notice(\n this.marks.length === 0\n ? \"This page has no changes.\"\n : \"That was the last change on this page.\",\n );\n const next = nextChangedPage(view.changedPages, view.path);\n if (next === null) notice.append(this.el(\"span\", \"\", \"No other page changed.\"));\n else {\n const target = next.page;\n notice.append(\n this.button(nextPageText(next), \"primary\", () => {\n remember(FIRST_KEY, \"1\");\n this.doc.location.assign(target.route);\n }),\n );\n }\n return notice;\n }\n\n /** The page's changes and threads, listed, since nothing could be placed on it. */\n private notArrived(view: PageView): HTMLElement {\n const body = this.el(\"div\", \"body\");\n const changes = view.page?.changes ?? [];\n const threads = listedThreads(this.listed);\n const what = [\n view.threads.state === \"on\" ? plural(threads.length, \"comment\") : undefined,\n plural(changes.length, \"change\"),\n ]\n .filter((x) => x !== undefined)\n .join(\" and \");\n body.append(\n this.el(\n \"b\",\n \"\",\n anchoredBlocks(this.doc).length === 0\n ? `This page has ${what}, but its blocks carry no source anchors.`\n : `This page has ${what}, but most of its changed blocks carry no source anchors.`,\n ),\n this.el(\n \"span\",\n \"\",\n `A layout or component is probably dropping the ${DATA_SOURCE} attributes, so nothing can be placed on the page. Everything is listed here instead.`,\n ),\n );\n if (changes.length > 0) {\n body.append(this.el(\"span\", \"hint\", \"Changes\"));\n const list = this.el(\"ul\", \"\");\n for (const change of changes) {\n const item = this.el(\"li\", \"\", `${change.kind} `);\n const source = change.now?.source;\n if (source !== undefined) {\n item.append(this.button(describeSource(source), \"link\", () => this.openSource(source)));\n } else {\n item.append(this.el(\"span\", \"\", change.text ?? \"text\"));\n }\n list.append(item);\n }\n body.append(list);\n }\n if (threads.length > 0) {\n body.append(this.el(\"span\", \"hint\", \"Comments\"));\n for (const thread of threads) body.append(this.threadCard(thread));\n }\n return body;\n }\n\n /** A thread, read only: open it on GitHub to reply. */\n private threadCard(thread: LocatedThread): HTMLElement {\n const card = this.el(\"div\", \"thread\");\n const where = this.el(\"div\", \"where\");\n const lines = thread.lines;\n const { label, removed } = threadLocation(thread);\n // A thread on removed text is on the base's lines, which the working tree doesn't have.\n if (lines !== undefined && !removed) {\n const source = `${thread.path.split(\"/\").map(encodeURIComponent).join(\"/\")}:${lines.first}-${lines.last}`;\n const link = this.button(label, \"link\", () => this.openSource(source));\n link.title = `Open ${thread.path}, line ${lines.first}`;\n where.append(link);\n } else {\n const name = this.el(\"span\", \"\", label);\n name.title = thread.path;\n where.append(name);\n }\n if (removed) where.append(\" · On removed text\");\n if (thread.resolved) where.append(\" · Resolved\");\n if (thread.outdated) where.append(\" · Outdated\");\n card.append(where);\n for (const comment of thread.comments) {\n const body = this.el(\"div\", \"comment\");\n body.append(\n this.el(\"b\", \"\", comment.author?.login ?? \"ghost\"),\n renderMarkdown(this.doc, comment.body),\n );\n card.append(body);\n }\n const url = thread.comments[0]?.url;\n if (url !== undefined && url !== \"\") {\n const link = this.el(\"a\", \"\", \"Open on GitHub\") as HTMLAnchorElement;\n link.href = url;\n link.target = \"_blank\";\n link.rel = \"noopener noreferrer\";\n card.append(link);\n }\n return card;\n }\n\n /** Room below the page, so the panel never hides what's focused. */\n private pad(): void {\n const html = this.doc.documentElement;\n const body = this.doc.body;\n if (this.open && this.stage.kind === \"on\") {\n this.padding ??= { scroll: html.style.scrollPaddingBottom, body: body.style.paddingBottom };\n const room = `${this.panel.offsetHeight + 90}px`;\n html.style.scrollPaddingBottom = room;\n body.style.paddingBottom = room;\n } else if (this.padding) {\n html.style.scrollPaddingBottom = this.padding.scroll;\n body.style.paddingBottom = this.padding.body;\n this.padding = undefined;\n }\n }\n\n // --- DOM ---\n\n private row(text: string): HTMLElement {\n const row = this.el(\"div\", \"row\");\n row.append(this.el(\"span\", \"grow\", text));\n return row;\n }\n\n private notice(text: string): HTMLElement {\n const notice = this.el(\"div\", \"notice\");\n const words = this.el(\"span\", \"\");\n // A command or a setting is written in backticks: show it as code.\n text.split(\"`\").forEach((part, i) => {\n if (part !== \"\") words.append(i % 2 === 1 ? this.el(\"code\", \"\", part) : part);\n });\n notice.append(words, this.el(\"span\", \"spacer\"));\n return notice;\n }\n\n private el(tag: string, className: string, text?: string): HTMLElement {\n const el = this.doc.createElement(tag);\n if (className) el.className = className;\n if (text !== undefined) el.textContent = text;\n return el;\n }\n\n private button(text: string, className: string, onClick: () => void): HTMLButtonElement {\n const button = this.doc.createElement(\"button\");\n button.type = \"button\";\n if (className) button.className = className;\n button.textContent = text;\n button.addEventListener(\"click\", onClick);\n return button;\n }\n\n /** The focused control's label, to focus it again after a redraw. */\n private focused(): string | undefined {\n const active = (this.panel.getRootNode() as ShadowRoot).activeElement;\n return active instanceof HTMLElement && this.panel.contains(active)\n ? (active.getAttribute(\"aria-label\") ?? active.textContent ?? undefined)\n : undefined;\n }\n\n private refocus(label: string | undefined): void {\n if (label === undefined) return;\n for (const button of Array.from(this.panel.querySelectorAll<HTMLElement>(\"button, a\"))) {\n if ((button.getAttribute(\"aria-label\") ?? button.textContent) === label) {\n button.focus();\n return;\n }\n }\n }\n}\n\n/** The label the marks put on a block: inside it at its start, or just before it. */\nfunction labelOf(element: HTMLElement): HTMLElement | undefined {\n const inside = element.querySelector<HTMLElement>(`:scope > .${CLASS_LABEL}`);\n if (inside) return inside;\n const before = element.previousElementSibling;\n return before instanceof HTMLElement && before.classList.contains(CLASS_LABEL_BEFORE)\n ? before\n : undefined;\n}\n\n/**\n * Puts the unsent count in the toolbar button's tooltip. The toolbar has no\n * API for a button's text, so this reads its markup and does nothing if\n * that changed.\n */\nfunction labelButton(doc: Document, text: string): void {\n const toolbar = doc.querySelector(\"astro-dev-toolbar\")?.shadowRoot;\n const button = toolbar?.querySelector(`button.item[data-app-id=\"${APP_ID}\"]`);\n const tip = button?.querySelector(\".item-tooltip\");\n if (tip) tip.textContent = text;\n button?.setAttribute(\"aria-label\", text);\n}\n\n/**\n * Every thread read for a page whose anchors didn't arrive, once each: on\n * the changes' blocks, on removed text, or on no block.\n */\nfunction listedThreads(data: OverlayData | undefined): LocatedThread[] {\n if (!data) return [];\n const { blocks, removed, detached } = data.threads;\n const seen = new Set<string>();\n return [...blocks, ...removed]\n .flatMap((entry) => entry.threads)\n .concat(detached)\n .filter((thread) => !seen.has(thread.id) && seen.add(thread.id));\n}\n\n/** An include's place (`<path>:<line>`) as a block's source (`<path>:<line>-<line>`). */\nfunction lineSource(at: string): string {\n const colon = at.lastIndexOf(\":\");\n const line = at.slice(colon + 1);\n return colon > 0 && /^\\d+$/.test(line) ? `${at}-${line}` : at;\n}\n\nfunction plural(count: number, noun: string): string {\n return count === 1 ? `1 ${noun}` : `${count} ${noun}s`;\n}\n\nfunction messageOf(error: unknown): string {\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n return String((error as { message: unknown }).message);\n }\n return String(error);\n}\n\nfunction remember(key: string, value: string): void {\n try {\n sessionStorage.setItem(key, value);\n } catch {\n // Storage is off: the panel just starts closed on the next page.\n }\n}\n\nfunction recall(key: string): string | null {\n try {\n return sessionStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\n/**\n * Puts `text` on the clipboard, through the old `execCommand` way where the\n * Clipboard API isn't allowed. Whether it got there.\n */\nasync function copyText(doc: Document, text: string): Promise<boolean> {\n const clipboard = doc.defaultView?.navigator.clipboard;\n if (clipboard) {\n try {\n await clipboard.writeText(text);\n return true;\n } catch {\n // Not allowed here: the old way below.\n }\n }\n const area = doc.createElement(\"textarea\");\n area.value = text;\n area.setAttribute(\"readonly\", \"\");\n area.style.position = \"fixed\";\n area.style.left = \"-9999px\";\n doc.body.append(area);\n area.select();\n let copied = false;\n try {\n copied = doc.execCommand(\"copy\");\n } catch {\n copied = false;\n }\n area.remove();\n return copied;\n}\n"]}