prreviewbuddy 0.96.0 → 0.96.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/CHANGELOG.md CHANGED
@@ -1,5 +1,44 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.96.2
4
+
5
+ **Security: a reviewed repository's Claude settings no longer reach the review.** Claude Code runs in
6
+ a worktree of the change under review, and until now it also loaded that repository's committed
7
+ `.claude/settings.json`. A pull request could add hooks there that ran as you, on your machine, as
8
+ soon as you reviewed it, and could widen which tools the review agent was allowed. Claude now loads
9
+ only your own settings (`--setting-sources user`). Your own hooks and settings still apply.
10
+
11
+ The reviewed repository's `CLAUDE.md` is no longer loaded as instructions either, because the pull
12
+ request can change it too. The review agent can still open it like any other file in the change,
13
+ but it no longer picks up the project's conventions automatically. Your own `CLAUDE.md` still
14
+ applies.
15
+
16
+ **Security: Codex reviews no longer reach your connected apps, plugins or the web.** Codex already
17
+ ran in its read-only sandbox with your own MCP servers dropped, but your ChatGPT-connected apps and
18
+ plugins still reached it. Those include GitHub, with tools that can merge a pull request or commit,
19
+ and Google Drive, with a tool that shares files. Their calls run on OpenAI's side, where the sandbox
20
+ does not reach, so a pull request that talked the review agent into using them could have acted on
21
+ your accounts. Codex review runs now start with plugins, connected apps and web search turned off.
22
+ The reviewed repository's `AGENTS.md` is no longer loaded as instructions, for the same reason as
23
+ `CLAUDE.md`. Its `.codex/` settings and hooks never reached a review, and still do not.
24
+
25
+ If your Claude Code is too old to know an option PR Review Buddy passes, the review now says so and
26
+ tells you to update it with `claude update`, instead of showing only Claude Code's own error. A
27
+ Codex too old for the switches above is told the same, with `codex update`.
28
+
29
+ **Codex reviews need Codex 0.122.0 or newer.** Older Codex releases ignore the setting that turns
30
+ web search off instead of refusing it, so PR Review Buddy now checks the version before it starts
31
+ a Codex review. If Codex is older than 0.122.0, or its version cannot be read, nothing is started
32
+ and you are told which version is needed and how to update. On a Mac this changes nothing in
33
+ practice: macOS already refuses to open Codex releases older than 0.132.0.
34
+
35
+ ## 0.96.1
36
+
37
+ **Link a dependency in Quick Review.** The fields now look like the rest of the workspace. The review
38
+ field is a search box: type part of a title or number to narrow the reviews of this repository,
39
+ pick one with the arrow keys and Enter or with a click, and press Enter again to link it. Escape
40
+ closes the list without leaving Quick Review.
41
+
3
42
  ## 0.96.0
4
43
 
5
44
  **Quick Review.** Press Space on a review in the Reviews list, or choose Quick Review from its menu
package/dist/main.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { $r as describeSubject, An as telemetryUploadEnabled, Ao as readAgentPreference, At as interruption, Bi as matchingWorkspaceIds, Bo as runnableAgents, Bt as healthyPort, Ci as clearClaim, Cn as append, Ct as findingRef, Dn as deliver$1, Do as resolveModel, E as relativeTime, En as stamp, Eo as resolveAgent, Et as reviewTag, Ft as recordAskAccepted, Go as cleanName, Gr as MANAGED_ROOT, Ht as reviewsUrl, Ia as reviewerDispositions, Io as agentIdentityOf, It as readIndexToken, Ji as reviewedRepositories, Ki as recentWorkspaces, Kt as stopServer, L as collectionHash, La as verdictClosure, Lo as detectAgents, Lt as bootstrapUrl, Ma as isQuestionOutstanding, Mn as PACKAGE_NAME, Mo as CONFIG_PATH, Mt as isTerminalAsk, No as AGENT_IDS, Oi as followedRefName, On as recordTelemetryUploadConsent, Oo as agentIdOf, Ot as endAskRequest, Po as agentById, Pt as readAskRequest, Qa as findingStatus, Qr as describeMovement, Qt as parseWorkspacePort, Ri as lineagePosition, Ro as isAgentId, Si as purposeOf, Sn as startJob, T as runBatch, Ti as isClaimed, Ui as positionInLineage, Va as explanationOf, Vr as modelHelpLines, Vt as readServerRecord, Xa as findingAssessment, Xr as removeWorktree, Xt as MAX_WORKSPACE_PORT, Yi as summarise, Yr as readMarker, Yt as DEFAULT_WORKSPACE_PORT, Zi as workspaceRevision, Zt as MIN_WORKSPACE_PORT, _i as PHASES, _t as applyUpdate, bn as reanalyseReview, cn as parkedUpdateRefusal, ei as findExistingReview, en as statedWorkspacePort, ft as RUNNER_KINDS, gn as failureOf, gt as spawnRunner, hn as runningJobs, ho as resolveTarget, ht as runDetached, i as deleteReview$1, it as openDestination, ja as isIssueOutstanding, jn as BUILD_VERSION, jo as writeAgentPreference, kn as telemetryUploadConsent, kt as forgetAskRequest, li as allJobs, mi as loadJob, mn as liveUpdateFor, mo as kissOutcome, nn as COMMIT_REVIEW_CANNOT_UPDATE, nt as isDelivered, o as liveJobsFor, oi as forgeResolver, pi as isTerminal$1, pn as UpdateAlreadyRunningError, po as WITHHELD_REASON, qi as reviewedCommit, qt as workspaceUrl, rt as missedDelivery, s as wasBlocked, t as MCP_SERVER_INFO_NAME, tn as writePortPreference, ts as STORE_ROOT, tt as deliver, u as recordKissRun, ui as attemptIdOf, ut as queueForReview, vn as prepareReview, vo as TargetError, vt as modelProvenanceOf, wi as driverGone, wo as git, x as batchIdentity, xi as progressSteps, xo as AmbiguousRefError, yn as settleReview, zi as loadWorkspace, zo as parkedReason, zt as ensureServer } from "./mcp_tools-DEx9NxAc.js";
2
+ import { $r as describeSubject, An as telemetryUploadEnabled, Ao as readAgentPreference, At as interruption, Bi as matchingWorkspaceIds, Bo as runnableAgents, Bt as healthyPort, Ci as clearClaim, Cn as append, Ct as findingRef, Dn as deliver$1, Do as resolveModel, E as relativeTime, En as stamp, Eo as resolveAgent, Et as reviewTag, Ft as recordAskAccepted, Go as cleanName, Gr as MANAGED_ROOT, Ht as reviewsUrl, Ia as reviewerDispositions, Io as agentIdentityOf, It as readIndexToken, Ji as reviewedRepositories, Ki as recentWorkspaces, Kt as stopServer, L as collectionHash, La as verdictClosure, Lo as detectAgents, Lt as bootstrapUrl, Ma as isQuestionOutstanding, Mn as PACKAGE_NAME, Mo as CONFIG_PATH, Mt as isTerminalAsk, No as AGENT_IDS, Oi as followedRefName, On as recordTelemetryUploadConsent, Oo as agentIdOf, Ot as endAskRequest, Po as agentById, Pt as readAskRequest, Qa as findingStatus, Qr as describeMovement, Qt as parseWorkspacePort, Ri as lineagePosition, Ro as isAgentId, Si as purposeOf, Sn as startJob, T as runBatch, Ti as isClaimed, Ui as positionInLineage, Va as explanationOf, Vr as modelHelpLines, Vt as readServerRecord, Xa as findingAssessment, Xr as removeWorktree, Xt as MAX_WORKSPACE_PORT, Yi as summarise, Yr as readMarker, Yt as DEFAULT_WORKSPACE_PORT, Zi as workspaceRevision, Zt as MIN_WORKSPACE_PORT, _i as PHASES, _t as applyUpdate, bn as reanalyseReview, cn as parkedUpdateRefusal, ei as findExistingReview, en as statedWorkspacePort, ft as RUNNER_KINDS, gn as failureOf, gt as spawnRunner, hn as runningJobs, ho as resolveTarget, ht as runDetached, i as deleteReview$1, it as openDestination, ja as isIssueOutstanding, jn as BUILD_VERSION, jo as writeAgentPreference, kn as telemetryUploadConsent, kt as forgetAskRequest, li as allJobs, mi as loadJob, mn as liveUpdateFor, mo as kissOutcome, nn as COMMIT_REVIEW_CANNOT_UPDATE, nt as isDelivered, o as liveJobsFor, oi as forgeResolver, pi as isTerminal$1, pn as UpdateAlreadyRunningError, po as WITHHELD_REASON, qi as reviewedCommit, qt as workspaceUrl, rt as missedDelivery, s as wasBlocked, t as MCP_SERVER_INFO_NAME, tn as writePortPreference, ts as STORE_ROOT, tt as deliver, u as recordKissRun, ui as attemptIdOf, ut as queueForReview, vn as prepareReview, vo as TargetError, vt as modelProvenanceOf, wi as driverGone, wo as git, x as batchIdentity, xi as progressSteps, xo as AmbiguousRefError, yn as settleReview, zi as loadWorkspace, zo as parkedReason, zt as ensureServer } from "./mcp_tools-DmQKsAkC.js";
3
3
  import { createHash, randomUUID } from "node:crypto";
4
4
  import { existsSync, mkdirSync, readdirSync, realpathSync, rmSync, statSync, writeFileSync } from "node:fs";
5
5
  import { basename, dirname, isAbsolute, join, resolve } from "node:path";
@@ -851,6 +851,12 @@ var CLAUDE_AGENT_ID = "claude";
851
851
  * about sign-in to errors that have nothing to do with it, which is worse than staying quiet.
852
852
  */
853
853
  var AUTHENTICATION$2 = /\b(?:auth(?:enticat\w*)?|oauth|credential|session expired|not logged in|log ?in)\b/i;
854
+ /**
855
+ * What Claude Code prints, and exits 1 on, for an argument it does not know: `error: unknown option
856
+ * '--setting-sources'` (seen on 2.1.318 with a made-up flag). Every argument comes from
857
+ * `claudeArgs`, so this means the installed CLI is older than one of them.
858
+ */
859
+ var UNKNOWN_OPTION = /unknown option '--[\w-]+'/i;
854
860
  /** Said to the caller that asked for the stop, and never shown to the reviewer who pressed it. */
855
861
  var STOPPED$2 = "The agent was stopped.";
856
862
  /** How long a stopped agent gets to end on its own terms before it is ended for it. */
@@ -1060,6 +1066,17 @@ var VERSION_TIMEOUT_MS$2 = 1e4;
1060
1066
  * `--strict-mcp-config`, with no `--mcp-config` beside it, is the containment clause of the agent
1061
1067
  * contract as Claude satisfies it. It tells the CLI to load no MCP servers at all, so `prb_review`
1062
1068
  * is not there to be reached no matter which `CLAUDE_CONFIG_DIR` the spawn inherits.
1069
+ *
1070
+ * `--setting-sources user` is the other half. The run stands in a worktree of the change under
1071
+ * review, and by default the CLI also loads that worktree's `.claude/settings.json` and
1072
+ * `settings.local.json`: settings written by the change's author. Their hooks run as the reviewer,
1073
+ * before the model sees anything and outside `--allowedTools`, and their permissions widen the tool
1074
+ * policy. Observed on Claude Code 2.1.318 with a canary `SessionStart` hook: it ran under the
1075
+ * arguments above without this flag and not with it, while the reviewer's own hooks ran both times.
1076
+ * The same flag keeps out the worktree's `CLAUDE.md`, `.claude/agents` and `.claude/skills`, which
1077
+ * reach the model as instructions: a canary of each was absent from the `init` event and unknown to
1078
+ * the model under these arguments (2026-11-08), while the reviewer's own agents and skills remained.
1079
+ * `--bare` would also skip them, but it skips the reviewer's sign-in too.
1063
1080
  */
1064
1081
  function claudeArgs(capability, requestedModel) {
1065
1082
  return [
@@ -1070,6 +1087,8 @@ function claudeArgs(capability, requestedModel) {
1070
1087
  "--allowedTools",
1071
1088
  toolsFor(capability),
1072
1089
  "--strict-mcp-config",
1090
+ "--setting-sources",
1091
+ "user",
1073
1092
  ...requestedModel ? ["--model", requestedModel] : []
1074
1093
  ];
1075
1094
  }
@@ -1109,6 +1128,7 @@ var claudeAgent = {
1109
1128
  * situation nobody is in until they have tried the obvious thing first.
1110
1129
  */
1111
1130
  explainFailure(detail, env = {}) {
1131
+ if (UNKNOWN_OPTION.test(detail)) return "This Claude Code is too old for PR Review Buddy. Update it with `claude update`, then try again.";
1112
1132
  if (!AUTHENTICATION$2.test(detail)) return null;
1113
1133
  return `Claude Code could not sign in. This review was started using ${env.CLAUDE_CONFIG_DIR ? `the Claude profile at \`${env.CLAUDE_CONFIG_DIR}\`` : "your default Claude profile"}, so make sure that one is signed in.`;
1114
1134
  },
@@ -1653,14 +1673,25 @@ var codexMcpRegistration = {
1653
1673
  * `--no-mcp`. Two things were established by running read-only commands rather than by reading
1654
1674
  * documentation, and they are the reason this adapter exists at all:
1655
1675
  *
1656
- * - MCP servers resolve only from `$CODEX_HOME/config.toml`, which `--ignore-user-config` drops
1657
- * while leaving the reviewer's login working. So containment costs no credential.
1676
+ * - Configured MCP servers resolve from `$CODEX_HOME/config.toml`, which `--ignore-user-config`
1677
+ * drops while leaving the reviewer's login working. So containment costs no credential. Plugins
1678
+ * are the exception: a remote plugin's server (Notion, from the plugin cache) still started under
1679
+ * it on codex-cli 0.157.0, and only `--disable plugins` stopped it. Connected apps are the other:
1680
+ * the reviewer's ChatGPT apps arrive as a built-in `codex_apps` server (GitHub with
1681
+ * `merge_pull_request`, Google Drive with `share_file`, a web search) whose calls run on OpenAI's
1682
+ * side, where the read-only sandbox does not reach. `--disable apps` removes all of them.
1658
1683
  * - A repository's own `.codex/config.toml` contributes nothing. This was the open question, and
1659
1684
  * it mattered because a review runs in a worktree cut from the repository under review: a
1660
1685
  * project-level server would have been an untrusted repository injecting a tool into a run that
1661
1686
  * is supposed to have none. A canary server declared in project config does not appear in
1662
1687
  * `codex mcp list` run from that repository.
1663
1688
  *
1689
+ * The reviewed repository's `AGENTS.md` is kept out with `-c project_doc_max_bytes=0`, for the same
1690
+ * reason the Claude adapter keeps out `CLAUDE.md`: the author of the change can edit it in the same
1691
+ * change. `-c web_search="disabled"` removes the web tool, which a read-only review has no use for.
1692
+ * The repository's `.codex/` config and hooks need no flag: with user config ignored the repository
1693
+ * is untrusted, so its project layer is never loaded (verified 2026-11-08 with a canary repository).
1694
+ *
1664
1695
  * `-c mcp_servers={}` is deliberately not used: the override layer is deep-merged, so an empty
1665
1696
  * table iterates zero keys and leaves the configured servers exactly as they were. It looks like
1666
1697
  * containment and is not.
@@ -1682,6 +1713,39 @@ var STOPPED = "The run was stopped.";
1682
1713
  */
1683
1714
  var CARRIED = ["CODEX_HOME", "PATH"];
1684
1715
  var VERSION_TIMEOUT_MS = 1e4;
1716
+ /**
1717
+ * The oldest Codex a review will start on.
1718
+ *
1719
+ * `-c web_search="disabled"` is what keeps a review off the web, and Codex ignores a `-c` key it
1720
+ * does not know (exit 0 on 0.157.0), so on a Codex older than the key the switch would do nothing
1721
+ * and say nothing. This is the oldest release where the switch is known to work: 0.122.0 is also
1722
+ * the first with `--ignore-user-config` and `--ignore-rules` (#18646), so nothing older could run
1723
+ * a review anyway. Established 2026-11-08 from the openai/codex source at each tag:
1724
+ *
1725
+ * - the hosted web tool is built only for `Cached` or `Live` (`create_web_search_tool` returns
1726
+ * `None` for `Disabled` at 0.122.0; `hosted_spec.rs` at 0.134.0), and
1727
+ * - the standalone web search extension, from 0.135.0, is enabled only when the mode is not
1728
+ * `Disabled` (checked at 0.135, 0.140, 0.145, 0.150 and 0.157).
1729
+ *
1730
+ * And on 0.157.0 by the tools the Responses API echoed back: `web.run` and `web__run` without the
1731
+ * switch, neither with it. Older macOS builds could not be run to repeat that: every release before
1732
+ * 0.132.0 is signed with a revoked certificate (0.131.0 is not notarized) and macOS refuses it.
1733
+ */
1734
+ var MINIMUM_CODEX_VERSION = "0.122.0";
1735
+ /**
1736
+ * Why a review will not start on this Codex, or null when it will.
1737
+ *
1738
+ * An unreadable version is refused rather than assumed, and a pre-release of the minimum counts as
1739
+ * older than it: neither is known to have what the release has.
1740
+ */
1741
+ function codexVersionRefusal(version) {
1742
+ const update = "Update it with `codex update`, or with the package manager you installed it from if that command is missing, then try again.";
1743
+ const parsed = version ? /^(\d+)\.(\d+)\.(\d+)(.*)$/.exec(version) : null;
1744
+ if (!parsed) return `PR Review Buddy could not tell which Codex is installed, and needs Codex ${MINIMUM_CODEX_VERSION} or newer. ${update}`;
1745
+ const have = parsed.slice(1, 4).map(Number);
1746
+ const need = MINIMUM_CODEX_VERSION.split(".").map(Number);
1747
+ return (have.map((part, i) => part - need[i]).find((diff) => diff !== 0) ?? (parsed[4].startsWith("-") ? -1 : 0)) < 0 ? `Codex ${version} is too old for PR Review Buddy, which needs Codex ${MINIMUM_CODEX_VERSION} or newer. ${update}` : null;
1748
+ }
1685
1749
  var DEFAULT_TIMEOUT_MS = { "read-code": 12e5 };
1686
1750
  function codexArgs(_capability, requestedModel) {
1687
1751
  return [
@@ -1692,6 +1756,14 @@ function codexArgs(_capability, requestedModel) {
1692
1756
  "read-only",
1693
1757
  "--ignore-user-config",
1694
1758
  "--ignore-rules",
1759
+ "--disable",
1760
+ "plugins",
1761
+ "--disable",
1762
+ "apps",
1763
+ "-c",
1764
+ "project_doc_max_bytes=0",
1765
+ "-c",
1766
+ "web_search=\"disabled\"",
1695
1767
  "--ephemeral",
1696
1768
  ...requestedModel ? ["-m", requestedModel] : []
1697
1769
  ];
@@ -1822,6 +1894,14 @@ var AUTHENTICATION = /not (?:logged|signed) in|unauthori[sz]ed|401|authenticat|c
1822
1894
  * authentication failure, so no Retry is offered.
1823
1895
  */
1824
1896
  var REJECTED_KEY = /incorrect api key|invalid[_ ]api[_ ]key/i;
1897
+ /**
1898
+ * A Codex older than a switch a review passes: an unknown feature name (`Unknown feature flag:
1899
+ * <name>` on 0.157.0) or, older still, an option it has never heard of. Fixed by updating, so it is
1900
+ * said as that. `codex update` exists on 0.157.0, but the Codex reading this is older by definition
1901
+ * and may predate it, so the package manager is named as the fallback. Neither refusal reads as a sign-in failure, so it stays an execution failure and
1902
+ * Retry is there after the update.
1903
+ */
1904
+ var TOO_OLD = /unknown feature flag|unexpected argument '--[\w-]+'/i;
1825
1905
  function isAuthentication(detail) {
1826
1906
  return AUTHENTICATION.test(detail) || REJECTED_KEY.test(detail);
1827
1907
  }
@@ -1845,6 +1925,7 @@ var codexAgent = {
1845
1925
  mcpRegistration: codexMcpRegistration,
1846
1926
  /** Which tool, which profile, and the one command that changes it. See `agent.ts` for the budget. */
1847
1927
  explainFailure(detail, env = {}) {
1928
+ if (TOO_OLD.test(detail)) return "This Codex is too old for PR Review Buddy. Update it with `codex update`, or with the package manager you installed it from if that command is missing, then try again.";
1848
1929
  if (!isAuthentication(detail)) return null;
1849
1930
  const profile = env.CODEX_HOME ? `the Codex profile at \`${env.CODEX_HOME}\`` : "your default Codex profile";
1850
1931
  if (REJECTED_KEY.test(detail)) return `OpenAI refused a request from ${profile} even though Codex reports being signed in, which usually points to Codex's own setup rather than your sign-in. Run \`codex doctor\` to see what it is using, and check \`codex features list\` for an experimental feature to turn off with \`codex features disable <name>\`.`;
@@ -1864,11 +1945,20 @@ var codexAgent = {
1864
1945
  encoding: "utf8",
1865
1946
  env: spawnEnv(env)
1866
1947
  }, (error, stdout) => {
1867
- if (!error) return resolvePromise({
1868
- ok: true,
1869
- version: versionFrom(stdout),
1870
- path: whichOn("codex", spawnEnv(env).PATH)
1871
- });
1948
+ if (!error) {
1949
+ const version = versionFrom(stdout);
1950
+ const refusal = codexVersionRefusal(version);
1951
+ if (refusal) return resolvePromise({
1952
+ ok: false,
1953
+ found: true,
1954
+ reason: refusal
1955
+ });
1956
+ return resolvePromise({
1957
+ ok: true,
1958
+ version,
1959
+ path: whichOn("codex", spawnEnv(env).PATH)
1960
+ });
1961
+ }
1872
1962
  const found = error.code !== "ENOENT";
1873
1963
  resolvePromise({
1874
1964
  ok: false,
@@ -1881,6 +1971,9 @@ var codexAgent = {
1881
1971
  async run(input) {
1882
1972
  guardPrompt(input);
1883
1973
  if (input.signal?.aborted) throw new AgentCancelledError(STOPPED);
1974
+ const installed = await codexAgent.available(input.env);
1975
+ if (!installed.ok) throw new CodexUnavailableError(installed.reason);
1976
+ if (input.signal?.aborted) throw new AgentCancelledError(STOPPED);
1884
1977
  const reader = assemble$2(input.onProgress ?? (() => {}));
1885
1978
  return new Promise((resolvePromise, reject) => {
1886
1979
  const child = spawn("codex", codexArgs(input.capability, input.requestedModel), {
package/dist/server.js CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as statusLabel, $a as gradeScale, $i as workspacesRevision, $n as isArchitectureId, $o as setMembership, $t as resolveWorkspacePort, A as PR_FILTER_OPTIONS, Aa as doneVerb, Ai as indexKeptIds, Ao as readAgentPreference, Ar as EXPLAIN_SIMPLY_PROMPT, B as completedFold, Ba as explanationActionOf, Bn as ARCHITECTURE_DIR, Bo as runnableAgents, Br as renderInlineText, C as parsePullRequestLink, Ca as parseLifecycle, Co as shorthandOf, Cr as existingPaths, Ct as findingRef, D as INDEX_SECTIONS, Da as queueRemove, Di as decideKissRecommendation, Do as resolveModel, Dr as storedConversation, Dt as reviewTagsIn, E as relativeTime$1, Ea as queueAddMany, Eo as resolveAgent, Er as saveRefresh, Et as reviewTag, F as collectionEmptyText, Fa as resolvedByConversation, Fi as lineageKey, Fn as mapRuntimes, Fo as agentFor$1, Fr as GITHUB_MARKDOWN, G as isFoldKey, Ga as NO_STATUS, Gi as previousKissResult, Gn as repositoryKey, Gr as MANAGED_ROOT, Gt as stopChild, H as countLabel, Ha as isExplanationAction, Hi as outcomeInputsOf, Hn as loadArchitecture, Hr as ReviewBeingDeletedError, I as collectionFold, Ia as reviewerDispositions, Ii as lineageKeyFor, In as recordRuntimeBestEffort, Io as agentIdentityOf, Ir as renderMarkdown, It as readIndexToken, J as pinItemLabel, Ja as closesFinding, Jn as trackedFiles, Jo as createWithMembers, Jr as isWorktreeHeld, Jt as writeServerRecord, K as markItemLabel, Ka as analysisRefOf, Ki as recentWorkspaces, Kn as storeArchitecture, Ko as collectionsStamp, Kr as createWorktree, La as verdictClosure, Li as lineageOutcome, Ln as RUNTIME_WORDS, Lo as detectAgents, Lr as CODE_BLOCK_CLASS, M as authorOptionLabel, Ma as isQuestionOutstanding, Mi as kissDecisionRefusal, Mr as UNESTABLISHED_MOTIVATION, N as authorOptions, Na as issuesOutstanding, Ni as kissDecisionsOf, Nn as feedbackUrl, No as AGENT_IDS, Nr as authorPreview, Nt as markAskRunning, O as INDEX_SECTION_NAMES, Oa as queueStamp, Oi as followedRefName, On as recordTelemetryUploadConsent, Oo as agentIdOf, Or as isUnchanged, Ot as endAskRequest, P as collectionCountLabel, Pa as questionsOutstanding, Pi as latestKissRun, Pn as waitingHistory, Po as agentById, Pr as hasAuthorContent, Q as selectAllLabel, Qa as findingStatus, Qi as workspaceStamps, Qn as ancestorsOf, Qo as renameCollection, Qt as parseWorkspacePort, R as collectionPlacement, Ra as processDiscussion, Ri as lineagePosition, Rn as describeRuntimes, Ro as isAgentId, Rr as CODE_COPY_CLASS, Rt as clearServerRecordOwnedBy, S as extractPullRequestLinks, Sa as offersLifecycle, Si as purposeOf, So as shortNameOf, Sr as withUsageRecorded, St as findingAtRef, T as runBatch, Ta as queueAdd, Ti as isClaimed, Tn as record, To as refExists, Tr as prepareConversationWithin, Tt as refOf, U as homeSection, Ua as withExplanation, Un as partFiles, Uo as AgentCancelledError, Ur as isBusy, Ut as serverEntryExists, V as completedLabel, Va as explanationOf, Vi as mutateWorkspace, Vn as checkArchitecture, Vo as versionFrom, Vt as readServerRecord, W as isCollectionId, Wa as ANALYSIS_ONLY, Wi as presentedKissRunOf, Wn as readArchitecture, Wo as AgentUnavailableError, Wr as withReviewLock, Wt as spawnServer, X as queueOptionLabel, Xa as findingAssessment, Xi as touchWorkspace, Xn as QUOTE_LIMITS, Xo as nameProblemText, Xr as removeWorktree, Xt as MAX_WORKSPACE_PORT, Y as queueItemLabel, Ya as currentGradeIn, Yi as summarise, Yn as ownersOf, Yo as deleteCollection, Yr as readMarker, Yt as DEFAULT_WORKSPACE_PORT, Z as sectionOpen, Za as findingIn, Zi as workspaceRevision, Zn as REPOSITORY_SCOPE, Zo as readCollections, Zr as requestJobStop, Zt as MIN_WORKSPACE_PORT, _ as endRun, _a as lifecycleChip, _n as observeReview, _o as DetachedHeadError, _r as removeNotification, a as lineageIds, aa as nextBaseline, ai as fetchHead, an as cancelUpdate, ao as statusLookup, ar as createArchitectureNotification, at as retryableMiss, b as stopRun, ba as lifecyclePillAction, bi as phasesFor, bn as reanalyseReview, bo as resolveBase, br as unreadAround, bt as agentDisplayName, c as discardJob, ca as outcomeStanding, ci as RUN_RECORD_RETENTION_MS, co as SEVERITIES, cr as eventName, ct as activateQueued, d as startKissJob, da as readOutcomes, di as endedAt, dn as askCheckout, do as objectWithAnyOf, dr as markRead, dt as settleQueue, ea as analysedAt, ei as findExistingReview, en as statedWorkspacePort, eo as isGradeFor, er as writeJsonAtomically, es as withWriteLock, et as statusPillLabel, f as isDriving, fa as sameSha, fi as fail$1, fn as findingsChanged, fo as describeAuthorship, fr as markReadForReview, g as completeRun, ga as isLifecycle, gi as saveJob, gn as failureOf$1, go as originRemote, gr as readStateOf, h as beginRun, ha as activityLabel, hi as pruneJobResidue, hn as runningJobs, ho as resolveTarget, hr as readNotification, i as deleteReview, ia as lastBaseline, ii as reviewedShaOf, in as RefreshUnavailableError, io as sourcePhrase, ir as categoryOf, it as openDestination, j as anythingRunning, ja as isIssueOutstanding, ji as indexReviewGroups, jn as BUILD_VERSION, jo as writeAgentPreference, jr as chatConversationSection, jt as isRequestId, k as LIST_SECTIONS, ka as readQueue, ki as groupByLineage, kn as telemetryUploadConsent, ko as clearAgentPreference, kr as agentEnvOf, l as kissAgentId, la as parseOutcomeSnapshot, li as allJobs, ln as recheckConversation, lo as asString, lr as listNotifications, lt as compactQueue, m as RUN_KINDS, ma as activityAttributes, mi as loadJob, mn as liveUpdateFor, mo as kissOutcome, mr as pruneNotifications, mt as cliEntry, n as MCP_TOOL_NAMES, na as REVIEWER_OUTCOMES, ni as checkReview, no as promptGrade, nr as branchOf, o as liveJobsFor, oa as outcomeDefinition, oi as forgeResolver, on as cancellableHere, oo as wasReassessed, or as createPrState, ot as lineageKeysFor, p as track, pa as LIFECYCLES, pi as isTerminal, pn as UpdateAlreadyRunningError, po as WITHHELD_REASON, pr as moveIds, q as omittedText, qa as assessmentLookup, qi as reviewedCommit, qn as storedScopes, qo as createCollection, qr as holdWorktree, r as deleteLineage, ra as appendOutcome, ri as followedBranch, rn as FETCH_TIMEOUT_MS, ro as reassessIn, rr as subjectOf$1, s as wasBlocked, sa as outcomeLabel, si as fillFileUrlTemplate, sn as mergeUpdateInto, so as followUpFindingId, sr as createPrUpdate, st as settleCollections, ta as analysisSnapshot, ti as checkCodeFreshness, tn as writePortPreference, to as isOffered, tr as announceJob, ts as STORE_ROOT, tt as deliver, ua as parseOutcomes, ui as attemptIdOf, un as updateReview, uo as extractJsonText, ur as markAllRead, v as heldRuns, va as lifecycleItemLabel, vi as isLiveJob, vn as prepareReview, vr as retireNotification, vt as modelProvenanceOf, w as unsupportedReason, wa as sectionOf$1, wn as readEvents, wo as git, wr as ASK_REREAD_CEILING_MS, wt as findingRefs, x as batchIdentity, xa as lifecyclePillLabel, xi as progressSteps, xn as runJob, xo as AmbiguousRefError, xr as unreadCount$1, xt as humanizeModelId, y as reportRun, ya as lifecycleName, yi as isTerminalJobPhase, yn as settleReview, yo as isCommitReview, yr as toneOf, yt as provenanceDetailLines, z as collectionsLine, za as recommendationsOf, zi as loadWorkspace, zn as formatDuration, zo as parkedReason, zr as escapeHtml$1 } from "./mcp_tools-DEx9NxAc.js";
1
+ import { $ as statusLabel, $a as gradeScale, $i as workspacesRevision, $n as isArchitectureId, $o as setMembership, $t as resolveWorkspacePort, A as PR_FILTER_OPTIONS, Aa as doneVerb, Ai as indexKeptIds, Ao as readAgentPreference, Ar as EXPLAIN_SIMPLY_PROMPT, B as completedFold, Ba as explanationActionOf, Bn as ARCHITECTURE_DIR, Bo as runnableAgents, Br as renderInlineText, C as parsePullRequestLink, Ca as parseLifecycle, Co as shorthandOf, Cr as existingPaths, Ct as findingRef, D as INDEX_SECTIONS, Da as queueRemove, Di as decideKissRecommendation, Do as resolveModel, Dr as storedConversation, Dt as reviewTagsIn, E as relativeTime$1, Ea as queueAddMany, Eo as resolveAgent, Er as saveRefresh, Et as reviewTag, F as collectionEmptyText, Fa as resolvedByConversation, Fi as lineageKey, Fn as mapRuntimes, Fo as agentFor$1, Fr as GITHUB_MARKDOWN, G as isFoldKey, Ga as NO_STATUS, Gi as previousKissResult, Gn as repositoryKey, Gr as MANAGED_ROOT, Gt as stopChild, H as countLabel, Ha as isExplanationAction, Hi as outcomeInputsOf, Hn as loadArchitecture, Hr as ReviewBeingDeletedError, I as collectionFold, Ia as reviewerDispositions, Ii as lineageKeyFor, In as recordRuntimeBestEffort, Io as agentIdentityOf, Ir as renderMarkdown, It as readIndexToken, J as pinItemLabel, Ja as closesFinding, Jn as trackedFiles, Jo as createWithMembers, Jr as isWorktreeHeld, Jt as writeServerRecord, K as markItemLabel, Ka as analysisRefOf, Ki as recentWorkspaces, Kn as storeArchitecture, Ko as collectionsStamp, Kr as createWorktree, La as verdictClosure, Li as lineageOutcome, Ln as RUNTIME_WORDS, Lo as detectAgents, Lr as CODE_BLOCK_CLASS, M as authorOptionLabel, Ma as isQuestionOutstanding, Mi as kissDecisionRefusal, Mr as UNESTABLISHED_MOTIVATION, N as authorOptions, Na as issuesOutstanding, Ni as kissDecisionsOf, Nn as feedbackUrl, No as AGENT_IDS, Nr as authorPreview, Nt as markAskRunning, O as INDEX_SECTION_NAMES, Oa as queueStamp, Oi as followedRefName, On as recordTelemetryUploadConsent, Oo as agentIdOf, Or as isUnchanged, Ot as endAskRequest, P as collectionCountLabel, Pa as questionsOutstanding, Pi as latestKissRun, Pn as waitingHistory, Po as agentById, Pr as hasAuthorContent, Q as selectAllLabel, Qa as findingStatus, Qi as workspaceStamps, Qn as ancestorsOf, Qo as renameCollection, Qt as parseWorkspacePort, R as collectionPlacement, Ra as processDiscussion, Ri as lineagePosition, Rn as describeRuntimes, Ro as isAgentId, Rr as CODE_COPY_CLASS, Rt as clearServerRecordOwnedBy, S as extractPullRequestLinks, Sa as offersLifecycle, Si as purposeOf, So as shortNameOf, Sr as withUsageRecorded, St as findingAtRef, T as runBatch, Ta as queueAdd, Ti as isClaimed, Tn as record, To as refExists, Tr as prepareConversationWithin, Tt as refOf, U as homeSection, Ua as withExplanation, Un as partFiles, Uo as AgentCancelledError, Ur as isBusy, Ut as serverEntryExists, V as completedLabel, Va as explanationOf, Vi as mutateWorkspace, Vn as checkArchitecture, Vo as versionFrom, Vt as readServerRecord, W as isCollectionId, Wa as ANALYSIS_ONLY, Wi as presentedKissRunOf, Wn as readArchitecture, Wo as AgentUnavailableError, Wr as withReviewLock, Wt as spawnServer, X as queueOptionLabel, Xa as findingAssessment, Xi as touchWorkspace, Xn as QUOTE_LIMITS, Xo as nameProblemText, Xr as removeWorktree, Xt as MAX_WORKSPACE_PORT, Y as queueItemLabel, Ya as currentGradeIn, Yi as summarise, Yn as ownersOf, Yo as deleteCollection, Yr as readMarker, Yt as DEFAULT_WORKSPACE_PORT, Z as sectionOpen, Za as findingIn, Zi as workspaceRevision, Zn as REPOSITORY_SCOPE, Zo as readCollections, Zr as requestJobStop, Zt as MIN_WORKSPACE_PORT, _ as endRun, _a as lifecycleChip, _n as observeReview, _o as DetachedHeadError, _r as removeNotification, a as lineageIds, aa as nextBaseline, ai as fetchHead, an as cancelUpdate, ao as statusLookup, ar as createArchitectureNotification, at as retryableMiss, b as stopRun, ba as lifecyclePillAction, bi as phasesFor, bn as reanalyseReview, bo as resolveBase, br as unreadAround, bt as agentDisplayName, c as discardJob, ca as outcomeStanding, ci as RUN_RECORD_RETENTION_MS, co as SEVERITIES, cr as eventName, ct as activateQueued, d as startKissJob, da as readOutcomes, di as endedAt, dn as askCheckout, do as objectWithAnyOf, dr as markRead, dt as settleQueue, ea as analysedAt, ei as findExistingReview, en as statedWorkspacePort, eo as isGradeFor, er as writeJsonAtomically, es as withWriteLock, et as statusPillLabel, f as isDriving, fa as sameSha, fi as fail$1, fn as findingsChanged, fo as describeAuthorship, fr as markReadForReview, g as completeRun, ga as isLifecycle, gi as saveJob, gn as failureOf$1, go as originRemote, gr as readStateOf, h as beginRun, ha as activityLabel, hi as pruneJobResidue, hn as runningJobs, ho as resolveTarget, hr as readNotification, i as deleteReview, ia as lastBaseline, ii as reviewedShaOf, in as RefreshUnavailableError, io as sourcePhrase, ir as categoryOf, it as openDestination, j as anythingRunning, ja as isIssueOutstanding, ji as indexReviewGroups, jn as BUILD_VERSION, jo as writeAgentPreference, jr as chatConversationSection, jt as isRequestId, k as LIST_SECTIONS, ka as readQueue, ki as groupByLineage, kn as telemetryUploadConsent, ko as clearAgentPreference, kr as agentEnvOf, l as kissAgentId, la as parseOutcomeSnapshot, li as allJobs, ln as recheckConversation, lo as asString, lr as listNotifications, lt as compactQueue, m as RUN_KINDS, ma as activityAttributes, mi as loadJob, mn as liveUpdateFor, mo as kissOutcome, mr as pruneNotifications, mt as cliEntry, n as MCP_TOOL_NAMES, na as REVIEWER_OUTCOMES, ni as checkReview, no as promptGrade, nr as branchOf, o as liveJobsFor, oa as outcomeDefinition, oi as forgeResolver, on as cancellableHere, oo as wasReassessed, or as createPrState, ot as lineageKeysFor, p as track, pa as LIFECYCLES, pi as isTerminal, pn as UpdateAlreadyRunningError, po as WITHHELD_REASON, pr as moveIds, q as omittedText, qa as assessmentLookup, qi as reviewedCommit, qn as storedScopes, qo as createCollection, qr as holdWorktree, r as deleteLineage, ra as appendOutcome, ri as followedBranch, rn as FETCH_TIMEOUT_MS, ro as reassessIn, rr as subjectOf$1, s as wasBlocked, sa as outcomeLabel, si as fillFileUrlTemplate, sn as mergeUpdateInto, so as followUpFindingId, sr as createPrUpdate, st as settleCollections, ta as analysisSnapshot, ti as checkCodeFreshness, tn as writePortPreference, to as isOffered, tr as announceJob, ts as STORE_ROOT, tt as deliver, ua as parseOutcomes, ui as attemptIdOf, un as updateReview, uo as extractJsonText, ur as markAllRead, v as heldRuns, va as lifecycleItemLabel, vi as isLiveJob, vn as prepareReview, vr as retireNotification, vt as modelProvenanceOf, w as unsupportedReason, wa as sectionOf$1, wn as readEvents, wo as git, wr as ASK_REREAD_CEILING_MS, wt as findingRefs, x as batchIdentity, xa as lifecyclePillLabel, xi as progressSteps, xn as runJob, xo as AmbiguousRefError, xr as unreadCount$1, xt as humanizeModelId, y as reportRun, ya as lifecycleName, yi as isTerminalJobPhase, yn as settleReview, yo as isCommitReview, yr as toneOf, yt as provenanceDetailLines, z as collectionsLine, za as recommendationsOf, zi as loadWorkspace, zn as formatDuration, zo as parkedReason, zr as escapeHtml$1 } from "./mcp_tools-DmQKsAkC.js";
2
2
  import { createHash, randomUUID, timingSafeEqual } from "node:crypto";
3
3
  import { accessSync, constants, existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, rmSync, statSync, writeFileSync } from "node:fs";
4
4
  import { basename, delimiter, isAbsolute, join, relative, resolve } from "node:path";
@@ -4906,9 +4906,16 @@ function renderDependencies(input) {
4906
4906
  const marked = suppressed.length ? `<h4 class="prb-qr-subheading">Not a dependency</h4><ul class="prb-qr-deps">${suppressed.map(suppressedRow).join("")}</ul>` : "";
4907
4907
  const picker = input.linkable.length ? `<details class="prb-qr-details prb-qr-link-picker" data-qr-detail="deps-link"><summary>Link a dependency</summary>
4908
4908
  <div class="prb-qr-picker">
4909
- <label class="prb-qr-picker-field">This review <select data-qr-link-direction><option value="depends-on">depends on</option><option value="required-by">is required by</option></select></label>
4910
- <label class="prb-qr-picker-field">Review <select data-qr-link-target>${input.linkable.map((option) => `<option value="${escapeHtml$1(option.reviewId)}">${escapeHtml$1(option.title)}</option>`).join("")}</select></label>
4911
- <button type="button" class="prb-qr-button" data-qr-link>Link</button>
4909
+ <label class="prb-qr-picker-field prb-qr-picker-direction"><span class="prb-qr-picker-label">This review</span><select data-qr-link-direction><option value="depends-on">depends on</option><option value="required-by">is required by</option></select></label>
4910
+ <div class="prb-qr-picker-field prb-qr-picker-review">
4911
+ <label class="prb-qr-picker-label" for="prb-qr-link-input">Review</label>
4912
+ <div class="prb-qr-combo">
4913
+ <input id="prb-qr-link-input" type="text" role="combobox" aria-autocomplete="list" aria-expanded="false" aria-controls="prb-qr-link-list" autocomplete="off" spellcheck="false" placeholder="Type to find a review" data-qr-link-input>
4914
+ <input type="hidden" data-qr-link-target value="">
4915
+ <ul id="prb-qr-link-list" class="prb-qr-combo-list" role="listbox" aria-label="Reviews in this repository" data-qr-link-list hidden>${input.linkable.map((option, i) => `<li id="prb-qr-link-option-${i}" role="option" aria-selected="false" data-qr-option="${escapeHtml$1(option.reviewId)}">${escapeHtml$1(option.title)}</li>`).join("")}<li class="prb-qr-combo-empty" role="presentation" data-qr-link-empty hidden>No review here matches that.</li></ul>
4916
+ </div>
4917
+ </div>
4918
+ <button type="button" class="prb-qr-button prb-qr-picker-submit" data-qr-link disabled>Link</button>
4912
4919
  </div>
4913
4920
  </details>` : "";
4914
4921
  return section("deps", "Dependencies", `${group("Depends on", dependsOn, "depends-on")}${group("Required by", requiredBy, "required-by")}${suggested}${marked}${picker}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prreviewbuddy",
3
- "version": "0.96.0",
3
+ "version": "0.96.2",
4
4
  "description": "Understand code changes before you approve them. Local branch and pull request reviews with Claude Code or Codex.",
5
5
  "license": "UNLICENSED",
6
6
  "homepage": "https://prreviewbuddy.com",
package/static/reviews.js CHANGED
@@ -1 +1 @@
1
- import{$ as e,A as t,B as n,C as r,Ct as i,D as a,E as o,F as s,G as c,H as l,I as u,K as d,L as f,M as p,N as ee,O as te,P as ne,Q as re,R as m,T as h,U as g,V as ie,W as ae,X as oe,Y as _,Z as se,a as ce,at as v,et as le,ft as y,g as b,gt as ue,h as de,ht as fe,i as pe,it as me,j as x,k as S,m as he,mt as C,n as w,o as ge,ot as _e,q as ve,r as T,s as ye,t as be,tt as E,u as xe,ut as Se,v as Ce,vt as we,w as D,xt as Te,y as O,yt as Ee,z as De}from"./chunk-C0JUspm9.js";import{E as Oe,L as ke,S as Ae,_ as je,b as Me,g as Ne,h as Pe,l as Fe,m as Ie,p as Le,w as Re,x as ze,y as Be}from"./chunk-SPHga_7I.js";import{i as Ve,t as He}from"./chunk-DLCpB0qV.js";import{t as Ue}from"./chunk-C8kkSv38.js";import{n as We,r as Ge}from"./chunk-CZ1YsjDz.js";function Ke(e,t){t.forEach((t,n)=>{e.children[n]!==t&&e.insertBefore(t,e.children[n]??null)})}async function qe(e,t,n){if(e.disabled)return;let r=e.getAttribute(`aria-pressed`)!==`true`;Je(e,r),e.disabled=!0;let i=await t(r).catch(()=>!1);if(e.disabled=!1,!i)return Je(e,!r);n(r)}function Je(e,t){e.setAttribute(`aria-pressed`,String(t)),e.innerHTML=t?`&#9733;`:`&#9734;`,e.setAttribute(`aria-label`,`${t?`Unpin`:`Pin`} this review`)}function Ye(e){let t=e.querySelector(`[data-collections-registry]`)?.textContent??`[]`;try{let e=JSON.parse(t);return Array.isArray(e)?e.filter(e=>!!e&&typeof e.id==`string`&&typeof e.name==`string`):[]}catch{return[]}}function Xe(e){return(e.dataset.collections??``).split(` `).filter(Boolean)}async function Ze(e,t,n){try{let r=await fetch(e,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({...t,snapshot:n})}),i=await r.json().catch(()=>null);return r.ok&&i&&(typeof i.area==`string`||i.stale===!0)?{ok:!0,answer:i}:{ok:!1,error:i?.error??`That could not be saved. The workspace server refused it.`}}catch{return{ok:!1,error:`The workspace server did not answer. It may have stopped.`}}}var Qe=`prb-reviews-selection`;function $e(e,t){let n=new Set(e);return t.filter(e=>(e.dataset.lineage??e.dataset.id??``).split(` `).some(e=>n.has(e))).map(e=>e.dataset.id??``).filter(Boolean)}function et(e,t){return t===``||e.name.toLowerCase().includes(t.trim().toLowerCase())}function tt(e,t){let n=e.trim().replace(/\s+/g,` `);if(n!==``)return t.some(e=>e.name.localeCompare(n,void 0,{sensitivity:`base`})===0)?void 0:n}function nt(e,t,n,r){let i=e.ownerDocument,a=(e,t)=>{let r=i.createElement(`label`);r.className=`prb-collections-option`;let a=i.createElement(`input`);return a.type=`checkbox`,a.value=e,a.checked=n.includes(e),a.setAttribute(`data-collections-filter-option`,``),r.append(a,i.createTextNode(` ${t}`)),r},s=t.filter(e=>et(e,r)).map(e=>a(e.id,e.name));et({id:`none`,name:`Uncollected`},r)&&s.unshift(a(o,`Uncollected`)),e.replaceChildren(...s)}function rt(e,t,n,r){let i=e.ownerDocument,a=t.filter(e=>et(e,r)).map(e=>{let t=c(n,e.id),r=i.createElement(`label`);r.className=`prb-collections-option`;let a=i.createElement(`input`);a.type=`checkbox`,a.value=e.id,a.checked=t===`all`,a.indeterminate=t===`some`,a.dataset.membership=t,a.setAttribute(`data-collections-dialog-option`,``);let o=i.createElement(`span`);if(o.textContent=e.name,r.append(a,o),t===`some`){let t=i.createElement(`span`);t.className=`prb-collections-some`,t.textContent=`${n.filter(t=>t.includes(e.id)).length} of ${n.length}`,r.append(t)}return r});if(a.length===0&&t.length===0){let e=i.createElement(`p`);e.className=`prb-collections-none`,e.textContent=`No collections yet. Type a name to make one.`,a.push(e)}e.replaceChildren(...a)}function it(e,t){return t?`For ${t}. Tick a collection to add it, untick to remove it.`:e===1?`For 1 selected review. Tick a collection to add it, untick to remove it.`:`For ${e} selected reviews. A part-filled box adds the rest; it never removes anything.`}function at(e){return{title:`Expand or collapse a collection`,mount(t,n){let r=t.ownerDocument,i=r.createElement(`div`);i.className=`prb-palette-results`,i.setAttribute(`role`,`group`),i.setAttribute(`aria-label`,`Collections`);let a=e.collections().map((e,t)=>{let n=r.createElement(`button`);n.type=`button`,n.className=`prb-palette-result prb-palette-collection`,n.dataset.collectionChoice=e.id;let i=r.createElement(`kbd`);i.className=`prb-kbd prb-palette-num`;let a=Me(t);a?i.textContent=a:i.setAttribute(`aria-hidden`,`true`);let o=r.createElement(`span`);o.className=`prb-palette-result-title`,o.textContent=e.name;let s=r.createElement(`span`);s.className=`prb-palette-collection-count`,s.textContent=e.count;let c=r.createElement(`span`);return c.className=`prb-palette-state`,c.textContent=e.open?`Expanded`:`Collapsed`,n.append(i,o,s,c),n});i.replaceChildren(...a);let o=t=>{t&&(n(),e.toggle(t))};i.addEventListener(`click`,e=>{o(e.target.closest(`[data-collection-choice]`)?.dataset.collectionChoice)}),t.addEventListener(`keydown`,e=>{if(e.isComposing||e.metaKey||e.ctrlKey||e.altKey)return;let t=Be(e.key);if(t!==null)return e.preventDefault(),o(a[t]?.dataset.collectionChoice);let n=a.indexOf(e.target),r=e.key===`ArrowDown`||e.key===`j`?a[Math.min(n+1,a.length-1)]:e.key===`ArrowUp`||e.key===`k`?a[Math.max(n-1,0)]:e.key===`Home`?a[0]:e.key===`End`?a[a.length-1]:void 0;r&&(e.preventDefault(),r.focus())}),t.append(i),a[0]?.focus()}}}function ot(e){let t=e.dataset.id??``,n=e.dataset.placement;return n===void 0||n===`home`?t:`${t}|${n}`}function st(e,t){let n=e.parentElement?.querySelector(`[data-history-list]`);n&&(n.hidden=!t,e.setAttribute(`aria-expanded`,String(t)))}function ct(e,t,n,r,i=new Map){return{limits:n,...i.size===0?{}:{collectionLimits:Object.fromEntries(i)},expanded:t.filter(e=>e.dataset.id&&e.querySelector(`[data-history-list]:not([hidden])`)).map(ot),main:r?.scrollTop??0,...fe(e)}}function lt(e,t){let n=e?.limits;if(!n||typeof n!=`object`)return t;let r={...t};for(let e of D){let t=n[e];typeof t==`number`&&Number.isInteger(t)&&t>r[e]&&(r[e]=t)}return r}function ut(e){let t=e?.collectionLimits,n=new Map;if(!t||typeof t!=`object`||Array.isArray(t))return n;for(let[e,r]of Object.entries(t))e.startsWith(`collection`)&&ie(e)&&typeof r==`number`&&Number.isInteger(r)&&r>15&&n.set(e,r);return n}function dt(e,t,n){if(!t)return;n.reveal(lt(t,n.limits),ut(t));let r=new Set(Te(t,`expanded`));for(let e of n.cards){let t=e.querySelector(`[data-history-toggle]`);t&&r.has(ot(e))&&st(t,!0)}let i=we(t,`main`);n.pane&&i!==null&&(n.pane.scrollTop=i),Ee(e,t.focus,t.focusVisible)}var ft=[{id:`no-concerns`,name:`Reviewed: no concerns`,baseline:!0},{id:`needs-changes`,name:`Needs changes`,baseline:!0},{id:`needs-decision`,name:`Needs a decision / answer`,baseline:!0},{id:`deeper-review`,name:`Needs deeper review`,baseline:!1},{id:`later`,name:`Later`,baseline:!1}],pt=`quick-review:space-moved`;function mt(e,t){for(let n of e.querySelectorAll(`[data-shortcut-for]`)){let e=Ce(n.dataset.shortcutFor??``);n.textContent=e?O(e.binding,t):``}}var ht=`Checking for changes…`,gt=`Not recorded: this review changed since you read it. The brief is refreshed, so choose again if your outcome still stands.`,_t=`The workspace server did not answer. It may have stopped.`;function vt(e){let t=Math.floor(Math.min(16,e.width*.025)),n=Math.floor(Math.min(16,e.height*.025));return{left:e.left+t,top:e.top+n,width:e.width-2*t,height:e.height-2*n}}function yt(e){let t=new Set,n=[];for(let r of e){let e=r.dataset.id;!e||t.has(e)||(t.add(e),n.push({id:e,lineage:r.dataset.lineage??``,card:r}))}return n}function bt(e,t){return!!e&&!!t&&e.sessionId===t.sessionId&&e.commitSha===t.commitSha&&e.analysisRevision===t.analysisRevision}function k(e,t,n,r){let i=e.createElement(t);return n&&(i.className=n),r!==void 0&&(i.textContent=r),i}function xt(e){let{doc:t,win:n}=e,r=e.fetch??((e,t)=>n.fetch(e,t)),i=k(t,`dialog`,`prb-quick-review`);i.setAttribute(`data-quick-review`,``),i.setAttribute(`aria-labelledby`,`prb-qr-title`),i.setAttribute(`aria-describedby`,`prb-qr-position`);let a=k(t,`header`,`prb-qr-head`),o=k(t,`div`,`prb-qr-identity`),s=k(t,`h2`,`prb-qr-title`);s.id=`prb-qr-title`;let c=k(t,`p`,`prb-qr-sub`);o.append(s,c);let l=k(t,`div`,`prb-qr-controls`),u=k(t,`p`,`prb-qr-position`);u.id=`prb-qr-position`;let d=k(t,`button`,`prb-qr-button prb-qr-nav`,`Previous`);d.type=`button`,d.setAttribute(`data-qr-prev`,``);let f=k(t,`button`,`prb-qr-button prb-qr-nav`,`Next`);f.type=`button`,f.setAttribute(`data-qr-next`,``);let p=k(t,`div`,`prb-qr-menu-host`);p.setAttribute(`data-qr-menu`,``);let ee=k(t,`button`,`prb-qr-button prb-qr-close`,`Close`),te=(e,n,r,i)=>{let a=k(t,`kbd`,`prb-qr-key`);a.setAttribute(`aria-hidden`,`true`),n?a.dataset.shortcutFor=n:a.textContent=i??``,e.append(` `,a),e.setAttribute(`aria-keyshortcuts`,r)};te(d,`quick.previous`,`h ArrowLeft`),te(f,`quick.next`,`l ArrowRight`),te(ee,null,`Escape`,`Esc`),ee.type=`button`,ee.setAttribute(`data-qr-close`,``),l.append(u,d,f,p,ee),a.append(o,l);let ne=k(t,`div`,`prb-qr-outcomes`);ne.setAttribute(`role`,`group`),ne.setAttribute(`aria-label`,`Your outcome`),ne.setAttribute(`data-qr-outcomes`,``);let re=k(t,`p`,`prb-qr-standing`);re.setAttribute(`data-qr-standing`,``);let m=k(t,`span`,`prb-qr-deferral`);m.setAttribute(`data-qr-deferral`,``),m.hidden=!0;let h=ft.map(e=>{let n=k(t,`button`,`prb-qr-button prb-qr-outcome`,e.name);return n.type=`button`,n.dataset.outcome=e.id,n}),g=k(t,`p`,`prb-qr-outcome-note`);g.setAttribute(`role`,`status`),g.setAttribute(`data-qr-outcome-note`,``);let ie=k(t,`div`,`prb-qr-outcome-buttons`);ie.append(...h);let ae=k(t,`p`,`prb-qr-scope`,`Recorded here only. Nothing is posted, approved or merged.`);ne.append(re,m,ie,g,ae);let oe=k(t,`p`,`prb-qr-notice`);oe.setAttribute(`role`,`status`),oe.setAttribute(`data-qr-notice`,``),oe.hidden=!0;let _=k(t,`div`,`prb-qr-hint`);_.setAttribute(`role`,`note`),_.setAttribute(`data-qr-hint`,``),_.hidden=!0;let se=k(t,`p`,`prb-qr-hint-text`,`Space now opens Quick Review. Press M for the actions menu.`),ce=k(t,`button`,`prb-qr-button`,`Dismiss`);ce.type=`button`,ce.setAttribute(`data-qr-hint-dismiss`,``),_.append(se,ce);let v=k(t,`div`,`prb-qr-body`);v.setAttribute(`data-qr-body`,``),v.setAttribute(`role`,`document`),v.tabIndex=-1,i.append(a,_,ne,oe,v);let le=ue(n.navigator);mt(i,le),t.body.append(i);let y=[],b=0,de=null,fe=0,pe=0,me=null,x=null,S=!1,he=!1,C=new Map,w=()=>y[b];function ge(){let e=t.querySelector(`[data-quick-review-hint]`);e&&(e.removeAttribute(`data-quick-review-hint`),_.hidden=!1,r(`/notice`,{method:`POST`,headers:{"content-type":`application/json`},credentials:`same-origin`,body:JSON.stringify({dismissNotice:pt})}).catch(()=>{}))}function _e(){let t=e.area();if(!t)return{left:0,top:0,width:n.innerWidth,height:n.innerHeight};let r=[t,...[...t.parentElement?.children??[]].filter(e=>e.classList.contains(`prb-context`))].map(e=>e.getBoundingClientRect()).filter(e=>e.width>0&&e.height>0),i=Math.min(...r.map(e=>e.left)),a=Math.min(...r.map(e=>e.top)),o=Math.max(...r.map(e=>e.right)),s=Math.max(...r.map(e=>e.bottom));return{left:i,top:a,width:o-i,height:s-a}}function ve(){let e=vt(_e());i.style.setProperty(`--qr-left`,`${e.left}px`),i.style.setProperty(`--qr-top`,`${e.top}px`),i.style.setProperty(`--qr-width`,`${e.width}px`),i.style.setProperty(`--qr-height`,`${e.height}px`)}function T(){let e=x?.state===`ready`&&x.snapshot!==null,t=!e||S||he;for(let e of h)e.disabled=t;ne.toggleAttribute(`data-disabled`,t),x?e?S?g.textContent=ht:he?g.textContent=`Recording…`:(g.textContent===ht||g.textContent===`Loading the brief…`||g.textContent===`Recording…`)&&(g.textContent=``):g.textContent=`An outcome needs a finished standard analysis.`:g.textContent=`Loading the brief…`;let n=x?.outcome;re.textContent=n?.current?`Your outcome: ${n.current}`:n?.previous?n.previous:n?.deferral?`No verdict on this analysis yet.`:`No outcome recorded on this analysis.`,m.textContent=n?.deferral?`Next: ${n.deferral}`:``,m.hidden=!n?.deferral,re.toggleAttribute(`data-current`,!!n?.current)}function ye(e,t){let n=e.card.querySelector(`.prb-card-title`)?.textContent?.trim()??`Review`;s.textContent=t?.header.title??n;let r=t?[t.header.repo,t.header.pr?`#${t.header.pr.number}`:``,t.header.branch].filter(Boolean):[];c.textContent=r.join(` · `),u.textContent=`${b+1} of ${y.length}`,d.disabled=b===0,f.disabled=b>=y.length-1}function be(n){p.replaceChildren();let r=e.cardMenu(n.card);if(!r)return null;let i=r.cloneNode(!0),a=new Map;for(let e of i.querySelectorAll(`[id]`)){let t=`qr-${e.id}`;a.set(e.id,t),e.id=t}for(let e of i.querySelectorAll(`[aria-controls], [aria-labelledby]`))for(let t of[`aria-controls`,`aria-labelledby`]){let n=e.getAttribute(t);n&&a.has(n)&&e.setAttribute(t,a.get(n))}i.querySelector(`[data-quick-review-open]`)?.remove(),i.dataset.cardRef=n.id;let o=k(t,`kbd`,`prb-qr-key`);return o.setAttribute(`aria-hidden`,`true`),o.dataset.shortcutFor=`quick.menu`,i.querySelector(`[data-menu-trigger]`)?.setAttribute(`aria-keyshortcuts`,`m`),p.append(i,o),mt(p,le),i}function E(e){oe.textContent=e,oe.hidden=!e}function xe(){return[...v.querySelectorAll(`details[data-qr-detail][open]`)].map(e=>e.dataset.qrDetail??``)}function Se(e,t){x=e,v.innerHTML=e.html;for(let e of t?.open??[]){let t=v.querySelector(`details[data-qr-detail="${CSS.escape(e)}"]`);t&&(t.open=!0)}v.scrollTop=t?.scrollTop??0;let n=w();n&&(ye(n,e),be(n)),T()}function Ce(e){x=null,v.replaceChildren(Object.assign(k(t,`div`,`prb-qr-state`),{role:`status`})),v.firstElementChild.append(k(t,`p`,void 0,e)),T()}function we(){let e=w();e&&x&&x.id===e.id&&C.set(e.id,{brief:x,scrollTop:v.scrollTop,open:xe()})}let D=0,Te=!1;async function O(e=!0){D++;try{await Ee(e)}finally{D--,D===0&&Te&&(Te=!1,i.open&&w()&&O())}}async function Ee(e){let n=w();if(!n)return;let i=++pe;me?.abort();let a=new AbortController;me=a;let o=C.get(n.id);ye(n,o?.brief??(x?.id===n.id?x:null)),o&&x?.id!==n.id&&Se(o.brief,o),!o&&x?.id!==n.id&&(p.replaceChildren(),x=null,v.replaceChildren(Object.assign(k(t,`p`,`prb-qr-loading`,`Loading the brief…`),{role:`status`}))),S=!!(o||x?.id===n.id),T();let s=x?.id===n.id?x:o?.brief,c=new URLSearchParams({id:n.id,...n.lineage?{lineage:n.lineage}:{},...s?{since:s.stamp}:{}}),l;try{l=await r(`/quick-review?${c}`,{signal:a.signal,credentials:`same-origin`})}catch{if(i!==pe)return;if(S=!1,s){E(_t),x=s;for(let e of h)e.disabled=!0;g.textContent=_t}else Ce(_t);return}if(i!==pe||w()?.id!==n.id)return;if(l.status===304&&s){S=!1,T();return}if(l.status===404)return C.delete(n.id),S=!1,Ce(`This review no longer exists. Previous and Next still work.`);if(!l.ok){S=!1;let e=await l.json().catch(()=>null);return i===pe?Ce(e?.error??`The brief could not be loaded.`):void 0}let u=await l.json();if(i!==pe||u.id!==w()?.id)return;S=!1;let d=!!s&&!bt(s.snapshot,u.snapshot);if(s&&x===s&&s.html===u.html){x=u,T(),C.set(n.id,{brief:u,scrollTop:v.scrollTop,open:xe()});return}Se(u,s?{scrollTop:v.scrollTop,open:xe()}:void 0),C.set(n.id,{brief:u,scrollTop:v.scrollTop,open:xe()}),d&&e&&E(`This review changed while you were reading: refreshed.`)}function De(t){t<0||t>=y.length||t===b||(we(),E(``),g.textContent=``,e.menus.closeAll(),b=t,Te=!1,O(),v.focus({preventScroll:!0}))}async function Oe(t){let n=x,i=w();if(!n?.snapshot||!i||n.id!==i.id||S||he)return;he=!0,T();let a=null;try{a=await r(`/outcome`,{method:`POST`,headers:{"content-type":`application/json`},credentials:`same-origin`,body:JSON.stringify({id:n.id,kind:t,expect:n.snapshot,lineage:i.lineage.split(` `).filter(Boolean)})})}catch{a=null}if(he=!1,!a){T(),g.textContent=_t;return}if(a.status===409){C.delete(n.id),w()?.id===n.id&&(await O(!1),g.textContent=gt);return}if(!a.ok){let e=await a.json().catch(()=>null);T(),g.textContent=e?.error??`The outcome could not be recorded.`;return}let o=await a.json();e.onOutcome(n.id,o),C.delete(n.id),w()?.id===n.id&&(await O(!1),g.textContent=`Recorded: ${o.card?.label??`outcome`}.`)}async function ke(e){let t=w();if(t){try{let n=await r(`/dependencies`,{method:`POST`,headers:{"content-type":`application/json`},credentials:`same-origin`,body:JSON.stringify({fromId:t.id,...e})});if(!n.ok)return E((await n.json().catch(()=>null))?.error??`The link could not be changed.`)}catch{return E(_t)}C.clear(),w()?.id===t.id&&O(!1)}}async function Ae(e){let i=e.nextElementSibling;if(!i?.matches(`[data-qr-code]`)||!x)return;if(!i.hidden){i.hidden=!0,e.textContent=`Show code`;return}let a=new URL(x.header.href,n.location.href),o=Number(e.dataset.line??0),s=new URLSearchParams({t:a.searchParams.get(`t`)??``,path:e.dataset.path??``,...o?{line:String(o)}:{}});i.hidden=!1,i.innerHTML=`<p class="prb-code-status">Loading…</p>`,e.textContent=`Hide code`;try{let e=await r(`${a.pathname}/file?${s}`,{credentials:`same-origin`}),n=await e.json();if(!e.ok){i.innerHTML=``,i.append(k(t,`p`,`prb-code-status`,n.error??`The file could not be read.`));return}i.innerHTML=`<div class="prb-code-scroll"><table class="prb-code-table"><tbody>${Fe(n,o)}</tbody></table></div>`}catch{i.innerHTML=``,i.append(k(t,`p`,`prb-code-status`,_t))}}function je(e){let t=y.findIndex(t=>t.id===e);return t<0?!1:(De(t),!0)}v.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-qr-show-code]`);if(n)return void Ae(n);let r=t.closest(`[data-qr-jump-finding]`);if(r){let e=v.querySelector(`[data-ref="${CSS.escape(r.dataset.qrJumpFinding??``)}"]`),t=e?.closest(`details.prb-qr-full`);t&&(t.open=!0),e?.scrollIntoView({block:`start`});return}let i=t.closest(`[data-qr-jump]`);if(i?.dataset.qrJump){je(i.dataset.qrJump)||E(`That review is not in this list as filtered. Open review shows it.`);return}let a=t.closest(`[data-qr-unlink]`);if(a)return void ke({action:`unlink`,toSubject:a.dataset.qrSubject,direction:a.dataset.qrDirection});let o=t.closest(`[data-qr-suppress], [data-qr-unsuppress]`);if(o){ke({action:o.hasAttribute(`data-qr-suppress`)?`suppress`:`unsuppress`,toSubject:o.dataset.qrSubject,direction:o.dataset.qrDirection});return}let s=t.closest(`[data-qr-confirm]`);if(s)return void ke({action:`link`,toId:s.dataset.qrTo});let c=t.closest(`[data-qr-dismiss]`);if(c)return void ke({action:`dismiss`,toSubject:c.dataset.qrSubject});let l=t.closest(`[data-qr-link]`);if(l){let e=l.closest(`.prb-qr-picker`),t=e?.querySelector(`[data-qr-link-direction]`)?.value,n=e?.querySelector(`[data-qr-link-target]`)?.value;n&&ke({action:`link`,toId:n,...t===`required-by`?{direction:t}:{}})}});for(let e of h)e.addEventListener(`click`,()=>void Oe(e.dataset.outcome??``));return d.addEventListener(`click`,()=>De(b-1)),f.addEventListener(`click`,()=>De(b+1)),ee.addEventListener(`click`,()=>i.close()),ce.addEventListener(`click`,()=>{_.hidden=!0,v.focus({preventScroll:!0})}),i.addEventListener(`click`,e=>{e.target===i&&i.close()}),n.addEventListener(`resize`,()=>{i.open&&ve()}),i.addEventListener(`close`,()=>{if(i.open)return;we(),pe++,me?.abort(),e.menus.closeAll(),p.replaceChildren();let t=e.area();t&&(t.scrollTop=fe);let n=w()?.card,r=t?.getBoundingClientRect(),a=(e=>{if(!e?.isConnected||!r)return!1;let t=e.getBoundingClientRect();return t.height>0&&t.bottom>r.top&&t.top<r.bottom})(n)?n:de?.isConnected?de:null;a&&e.focusCard(a),x=null,y=[],Te=!1,e.onClose()}),{open(t){i.open||(y=yt(e.walk()),b=Math.max(0,y.findIndex(e=>e.id===t.dataset.id)),y.length&&(de=t,fe=e.area()?.scrollTop??0,E(``),g.textContent=``,x=null,ve(),i.showModal(),ge(),v.focus({preventScroll:!0}),O()))},isOpen:()=>i.open,close:()=>i.close(),step:e=>De(b+e),scroll(e){v.scrollBy({top:e*v.clientHeight*.4,behavior:`instant`})},openMenu(){let t=w();if(!t)return;let n=be(t);n&&e.menus.open(n,{focusFirst:!0,returnFocus:()=>v.focus({preventScroll:!0})})},revalidate(){!i.open||!w()||(D?Te=!0:O())},removed(t){let n=y.findIndex(e=>e.id===t);if(!i.open||n<0)return;if(C.delete(t),e.menus.closeAll(),y.splice(n,1),!y.length)return void i.close();let r=n===b&&b===y.length;(n<b||r)&&b--,x=null,p.replaceChildren(),g.textContent=``,E(r?`Deleted. Showing the previous review.`:`Deleted. Showing the next review.`),O(!1),v.focus({preventScroll:!0})}}}var St=C({ownsRestore:!0});be(`/restart`);var A=[...document.querySelectorAll(`[data-card][data-placement="home"]`)].sort((e,t)=>Number(e.dataset.rank)-Number(t.dataset.rank)),j=new Map;function Ct(){j=new Map;for(let e of document.querySelectorAll(`[data-card]`)){let t=e.dataset.id??``;j.set(t,[...j.get(t)??[],e])}}Ct();function wt(e){let t=e.closest(`[data-card]`);if(t)return t;let n=e.closest(`[data-card-ref]`)?.dataset.cardRef;return n?j.get(n)?.[0]??null:null}function Tt(e,t){for(let n of j.get(e)??[])t(n)}function M(){return[...j.values()].flat()}var N=Ye(document),Et=[...document.querySelectorAll(`[data-operation]`)],Dt=document.querySelector(`[data-section="in-progress"]`),Ot=e=>e.dataset.inProgressOnly!==void 0,kt=Object.fromEntries(D.map(e=>[e,document.querySelector(`[data-cards="${e}"]`)])),At=document.querySelector(`.prb-index`);function jt(e){return{id:e.dataset.id??``,collections:Xe(e),queue:e.dataset.queue===void 0?void 0:Number(e.dataset.queue),status:e.dataset.status??`new`,prState:e.dataset.prState}}var P=document.querySelector(`[data-search]`),Mt=document.querySelector(`[data-status-filter]`),F=document.querySelector(`[data-author-filter]`),I=document.querySelector(`[data-pr-filter]`),Nt=document.querySelector(`[data-no-matches]`),Pt=document.querySelector(`[data-count]`),Ft=document.querySelector(`[data-clear-filters]`),L=document.querySelector(`[data-collections-filter]`),It=document.querySelector(`[data-collections-filter-search]`);function Lt(){if(!L)return;L.hidden=N.length===0;let e=L.querySelector(`[data-collections-filter-label]`);e&&(e.textContent=t(B.collections,N)),B.collections.length===0?delete L.dataset.active:L.dataset.active=``;let n=L.querySelector(`[data-collections-filter-options]`);n&&nt(n,N,B.collections,It?.value??``)}var R=De();function Rt(e){return{stored:y({state:e.dataset.lifecycle,at:Number(e.dataset.lifecycleAt)}),activity:me(e.dataset)??{at:0,kind:`created`}}}function zt(e){return e.dataset.pinned===`true`}function Bt(e){let{stored:t,activity:n}=Rt(e);return m(zt(e),t,n,Xe(e).length>0,B.filter)}function Vt(e){let t=Bt(e);return t===void 0?.5:D.indexOf(t)}function Ht(e){return[...e].sort((e,t)=>Vt(e)-Vt(t))}var Ut=new Map,z=document.querySelector(`[data-bulk]`),Wt=document.querySelector(`[data-bulk-count]`),Gt=document.querySelector(`[data-bulk-detail]`),Kt=document.querySelector(`[data-bulk-delete]`),qt=document.querySelector(`[data-bulk-delete-label]`),Jt=document.querySelector(`[data-bulk-exit]`),Yt=document.querySelector(`[data-bulk-more]`),Xt=document.querySelector(`[data-bulk-question]`),Zt=document.querySelector(`[data-bulk-confirm]`),Qt=document.querySelector(`[data-bulk-actions]`),$t=document.querySelector(`[data-bulk-error]`),en=document.querySelector(`[data-bulk-select-all]`),B=ve(window.location.hash),V=new Set,H=!1,tn=document.querySelector(`[data-bulk-fetch]`),nn={},rn=[],an=!1;function U(){let e=B.query.trim().toLowerCase();B.author!==``&&![...F?.options??[]].some(e=>e.value===B.author)&&(B.author=``),B.collections=B.collections.filter(e=>e===`none`||N.some(t=>t.id===e)),N.length===0&&(B.collections=[]);let t=Ht(u(A.map(e=>({...jt(e),searchText:e.dataset.searchText??``,author:e.dataset.author,card:e})),{...B,query:e}).map(e=>e.card)),r=t.filter(e=>!Ot(e));rn=r;let i=new Set(u(Et.map(e=>({...jt(e),searchText:e.dataset.searchText??``,author:e.dataset.author,entry:e})),{...B,query:e}).map(e=>e.entry));for(let e of Et)e.hidden=!i.has(e);if(Dt){Dt.hidden=i.size===0;let e=Dt.querySelector(`[data-section-count]`);e&&(e.textContent=String(i.size))}let a=r.filter(e=>Bt(e)!==void 0),o=re(a,e=>Bt(e),R),s=new Set(D.flatMap(e=>o[e].shown));for(let e of D){let t=kt[e];t&&Ke(t,o[e].shown);let n=document.querySelector(`[data-load-more="${e}"]`);n&&(n.hidden=o[e].total<=o[e].shown.length);let r=document.querySelector(`[data-section="${e}"]`);r&&(r.hidden=o[e].total===0);let i=r?.querySelector(`[data-section-count]`);i&&(i.textContent=String(o[e].total))}for(let e of on(r))s.add(e);for(let e of M())e.hidden=!s.has(e);if(P&&P.value!==B.query&&(P.value=B.query),F&&(F.value=B.author,B.author===``?delete F.dataset.active:F.dataset.active=``),I||(B.pr=`any`),I&&(I.value=B.pr,B.pr===`any`?delete I.dataset.active:I.dataset.active=``),Mt&&(Mt.value=B.filter,B.filter===`all`?delete Mt.dataset.active:Mt.dataset.active=``),Lt(),Ft&&(Ft.hidden=!n(B)),Pt){let e=e=>e.reduce((e,t)=>e+Number(t.dataset.reviews??1),0);Pt.textContent=ee(e(t),t.length,n(B)?e(A):void 0)}Nt&&(Nt.hidden=t.length>0||i.size>0||A.length===0),jn(r)}function on(e){let t=document.querySelector(`[data-collections-area]`);if(!t)return[];let r=d(B.filter),i=n(B),o=e.flatMap(e=>Xe(e).map(t=>({card:e,collection:t}))),s=e=>{let{stored:t,activity:n}=Rt(e);return S(zt(e),t,n,B.filter)},c=l(o,({card:e,collection:t})=>{let n=s(e);return n===void 0?void 0:`${n===`completed`?`collection-done`:`collection`}:${t}`},e=>Ut.get(e)??15),u=(e,t)=>(j.get(e)??[]).find(e=>e.dataset.placement===`collection:${t}`),f=[],ee=!1;for(let e of t.querySelectorAll(`[data-collection]`)){let t=e.dataset.collection??``,n=c.get(`collection:${t}`)??{shown:[],total:0},s=c.get(`collection-done:${t}`)??{shown:[],total:0},l=o.filter(e=>e.collection===t),d=l.filter(e=>zt(e.card)).length,ne=B.collections.length>0&&!B.collections.includes(t),re=!r&&!ne&&(!i||l.length>0);if(e.hidden=!re,!re)continue;ee=!0;for(let[r,i]of[[`collection:${t}`,n],[`collection-done:${t}`,s]]){let n=i.shown.map(e=>u(e.card.dataset.id??``,t)).filter(e=>e!==void 0),a=e.querySelector(`[data-cards="${r}"]`);a&&Ke(a,n),f.push(...n);let o=e.querySelector(`[data-load-more="${r}"]`);o&&(o.hidden=i.total<=i.shown.length)}let m=e.querySelector(`[data-section="collection:${t}"] > summary [data-section-count]`);m&&(m.textContent=a(n.total,d));let h=e.querySelector(`[data-collection-empty]`),g=te({active:n.total,completed:s.total,pinned:d,members:l.length},i);h&&(h.hidden=g===void 0,h.textContent=g??``);let ie=e.querySelector(`[data-section="collection-done:${t}"]`);ie&&(ie.hidden=s.total===0);let ae=e.querySelector(`[data-completed-label]`);ae&&(ae.textContent=p(s.total))}return t.hidden=r||!ee,f}var sn=300,W=null;function cn(){W!==null&&window.clearTimeout(W),W=null,St.replace(f(B),{})}function ln(e,t){if(B={...B,...e},R=De(),Ut=new Map,U(),t===`now`)return cn();W!==null&&window.clearTimeout(W),W=window.setTimeout(cn,sn)}window.addEventListener(`pagehide`,()=>{W!==null&&cn()}),document.addEventListener(`click`,e=>{W!==null&&e.target?.closest?.(`a[href]`)&&cn()},!0),P?.addEventListener(`input`,()=>ln({query:P.value},`settled`)),P?.addEventListener(`keydown`,e=>{e.key===`Escape`&&P.value!==``&&(e.preventDefault(),ln({query:``},`now`))}),Mt?.addEventListener(`change`,()=>{ln({filter:Mt.value},`now`)}),F?.addEventListener(`change`,()=>{ln({author:F.value},`now`)}),I?.addEventListener(`change`,()=>{ln({pr:I.value},`now`)}),Ft?.addEventListener(`click`,()=>{ln({query:r.query,filter:r.filter,author:r.author,pr:r.pr,collections:r.collections},`now`),P?.focus()}),Ge(),document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-load-more]`)?.dataset.loadMore;if(t&&t.startsWith(`collection`)&&ie(t))return Ut.set(t,(Ut.get(t)??15)+15),U();!t||!D.includes(t)||(R={...R,[t]:R[t]+15},U())});for(let e of[`popstate`,`hashchange`])window.addEventListener(e,()=>{B=ve(window.location.hash),R=De(),Ut=new Map,U(),_n()});document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-pin]`);if(!t?.dataset.pin)return;e.preventDefault(),e.stopPropagation();let n=t.dataset.pin;qe(t,e=>fetch(`/pin`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:n,pinned:e})}).then(e=>e.ok),e=>{Tt(n,n=>{n.dataset.pinned=String(e);let r=n.querySelector(`[data-pin]`);r&&r!==t&&Je(r,e),sr(n)}),U()})});async function un(e,t){let n;try{let r=await fetch(`/queue`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:e,action:t})});if(!r.ok)return pn(await mn(r));n=(await r.json()).queue}catch{return pn(fn)}hn(n),U()}var dn=`That could not be saved. The workspace server refused it.`,fn=`The workspace server did not answer. It may have stopped.`;function pn(e){ce(ye(),{kind:`failed`,text:e})}async function mn(e){let t=await e.json().catch(()=>null);return typeof t?.error==`string`?t.error:dn}function hn(e){let t=new Map(e.map((e,t)=>[e,t]));for(let e of M()){let n=t.get(e.dataset.id??``);n===void 0?delete e.dataset.queue:e.dataset.queue=String(n),n!==void 0&&e.dataset.lifecycle!==`active`&&(e.dataset.lifecycle=`active`,delete e.dataset.lifecycleAt,sr(e))}for(let e of document.querySelectorAll(`[data-queue-action][data-queue-id]`)){let n=t.has(e.dataset.queueId??``);e.dataset.queueAction=n?`remove`:`add`,e.textContent=_(n)}let n=document.querySelector(`[data-queue-option]`);n&&(n.textContent=oe(e.length))}document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-history-toggle]`);if(!t)return;e.preventDefault(),e.stopPropagation();let n=t.parentElement?.querySelector(`[data-history-list]`);n&&st(t,n.hidden!==!1)});var gn=document.querySelector(`.prb-shell > main`);function _n(){dt(document,St.current().ui,{cards:M(),pane:gn,limits:R,reveal:(e,t)=>{R=e,Ut=t,U()}})}St.setCapturer(()=>ct(document,M(),R,gn,Ut)),U(),_n();var G=Ve(document,{onOpen:Dn,onClose:e=>{Dn(e),window.setTimeout(Kr,0)}});function vn(){return document.querySelector(`[data-menu-trigger][aria-expanded="true"]`)!==null}var yn=0;async function bn(e){yn+=1;try{await e()}finally{--yn,Kr()}}var xn=new Set,Sn=`A change to this review is still being saved.`,Cn=`A change to one of these reviews is still being saved. Try again once it is.`;async function wn(e,t){if(e.some(e=>xn.has(e)))return!1;for(let t of e)xn.add(t);Tn(e);try{await t()}finally{for(let t of e)xn.delete(t);Tn(e)}return!0}function Tn(e){let t=new Set(e);for(let e of M()){let n=e.dataset.id??``;if(!t.has(n))continue;let r=xn.has(n);for(let t of e.querySelectorAll(`.prb-card-controls button.prb-state-pill`))r?t.setAttribute(`aria-disabled`,`true`):t.removeAttribute(`aria-disabled`);for(let t of e.querySelectorAll(`.prb-card-controls :is([data-mark-status], [data-lifecycle-set], [data-queue-action])`))t.disabled=r}}async function En(e,t){await wn([e],()=>bn(t))||pn(Sn)}function Dn(e){let t=e.querySelector(`[data-menu-items]`),n=e.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!1),n&&(n.hidden=!0);let r=e.querySelector(`[data-collection-rename-form]`);r&&(r.hidden=!0,wr(r,void 0)),e.querySelector(`[data-menu-error]`)?.remove(),e.querySelector(`[data-id-field]`)?.remove()}document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-menu]`);if(!n||n.closest(`[data-bulk]`)||n.matches(`[data-collections-filter]`))return;if(n.matches(`.prb-collection-menu`))return kr(e,t,n);if(n.matches(`[data-lifecycle-control]`))return ar(e,t,n);let r=t.closest(`[data-collections-for]`);if(r?.dataset.collectionsFor){e.preventDefault(),e.stopPropagation(),G.closeAll();let t=wt(r)?.querySelector(`[data-select]`)?.getAttribute(`aria-label`)?.replace(/^Select /,``);Ar([r.dataset.collectionsFor],{card:t??`this review`});return}let i=t.closest(`[data-copy-id]`);if(i?.dataset.copyId){e.preventDefault(),e.stopPropagation(),ke(i,i.dataset.copyId);return}let a=t.closest(`[data-fetch-review]`);if(a?.dataset.fetchReview){e.preventDefault(),e.stopPropagation(),G.closeAll();let t=wt(a);t&&Br([t]);return}let o=t.closest(`[data-mark-status]`);if(o?.dataset.markId){e.preventDefault(),e.stopPropagation(),G.closeAll();let t=o.dataset.markId;En(t,()=>$n(t,o.dataset.markStatus===`complete`));return}let s=t.closest(`[data-lifecycle-set]`);if(s?.dataset.lifecycleId){e.preventDefault(),e.stopPropagation(),G.closeAll();let t=s.dataset.lifecycleId;En(t,ir(t,s.dataset.lifecycleSet));return}let c=t.closest(`[data-queue-action]`);if(c?.dataset.queueId){e.preventDefault(),e.stopPropagation(),G.closeAll();let t=c.dataset.queueId;En(t,()=>un(t,c.dataset.queueAction===`remove`?`remove`:`add`));return}if(t.closest(`[data-delete]`)){e.preventDefault(),e.stopPropagation();let t=n.querySelector(`[data-menu-items]`),r=n.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!0),r&&(r.hidden=!1),e.detail===0&&n.querySelector(`[data-cancel-delete]`)?.focus();return}if(t.closest(`[data-cancel-delete]`)){e.preventDefault(),e.stopPropagation(),Dn(n),e.detail===0&&n.querySelector(`[data-delete]`)?.focus();return}if(t.closest(`[data-confirm-delete]`)){e.preventDefault(),e.stopPropagation(),On(n);return}e.preventDefault(),e.stopPropagation()});async function On(e){let t=e.querySelector(`[data-delete]`),n=t?.dataset.delete;if(!n)return;let r=e.querySelector(`[data-menu-confirm]`),i=e.querySelector(`[data-confirm-delete]`);i&&(i.disabled=!0,i.textContent=`Deleting`);try{let r=await fetch(`/delete`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:n,scope:t?.dataset.scope??`review`})});if(r.ok){if(e.closest(`[data-qr-menu]`))return Tt(n,e=>e.remove()),A=A.filter(e=>e.isConnected),Ct(),U(),J.removed(n);window.location.reload();return}kn(e,(await r.json().catch(()=>null))?.error??`That could not be deleted.`)}catch{kn(e,`The workspace server did not answer. It may have stopped.`)}i&&(i.disabled=!1,i.textContent=`Delete`),r&&(r.hidden=!0);let a=e.querySelector(`[data-menu-items]`);a&&(a.hidden=!1)}function kn(e,t){e.querySelector(`[data-menu-error]`)?.remove();let n=document.createElement(`p`);n.className=`prb-menu-error`,n.setAttribute(`data-menu-error`,``),n.textContent=t,e.querySelector(`[data-menu-panel]`)?.append(n)}function An(e){H=e,e||V.clear(),At&&(e?At.dataset.selecting=``:delete At.dataset.selecting),document.querySelector(`[data-select-mode]`)?.setAttribute(`aria-pressed`,String(e)),!e&&Yt&&G.close(Yt);for(let t of document.querySelectorAll(`.prb-card-link`))e?t.setAttribute(`aria-disabled`,`true`):t.removeAttribute(`aria-disabled`);K(),U()}function K(){Zt&&(Zt.hidden=!0),Qt&&(Qt.hidden=!1),$t&&($t.hidden=!0,$t.textContent=``)}function jn(t){for(let e of M()){let t=V.has(e.dataset.id??``),n=e.querySelector(`[data-select]`);n&&(n.checked=t),t?e.dataset.selected=``:delete e.dataset.selected}if(!z||(z.hidden=!H,!H))return;let n=new Set(M().filter(Mn).map(e=>e.dataset.id)),r=[...V].filter(e=>!n.has(e)).length,i=new Set(t.map(e=>e.dataset.id)),a=[...V].every(e=>i.has(e))?i.size:null;V.size===0?z.dataset.empty=``:delete z.dataset.empty,Wt&&(Wt.textContent=E(V.size)),Gt&&(Gt.textContent=le(V.size,a,r)),en&&(en.textContent=e(t.length,V.size>0&&a!==null),en.disabled=t.every(e=>V.has(e.dataset.id??``))),qt&&(qt.textContent=ne(Xn()));for(let e of z.querySelectorAll(`[data-bulk-mark], [data-bulk-lifecycle], [data-bulk-queue], [data-bulk-collections], [data-bulk-delete]`))e.disabled=V.size===0;tn&&(tn.hidden=!Ie(nn,Ir(Yn())))}function Mn(e){return!e.hidden&&e.closest(`details:not([open]), [hidden]`)===null}function Nn(e){let t=[...e.querySelectorAll(`details[data-section]`)];for(let e of t)e.addEventListener(`toggle`,()=>jn(rn));We(t,(e,t)=>fetch(`/sections`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({section:e,collapsed:t})}))}Nn(document),document.querySelector(`[data-select-mode]`)?.addEventListener(`click`,()=>{An(!H)}),en?.addEventListener(`click`,()=>{for(let e of rn)e.dataset.id&&V.add(e.dataset.id);K(),U()});function Pn(e){V.has(e)?V.delete(e):V.add(e),K(),U()}document.addEventListener(`change`,e=>{let t=e.target.closest(`[data-select]`);t?.dataset.select&&Pn(t.dataset.select)}),document.addEventListener(`click`,e=>{if(!H)return;let t=e.target,n=t.closest(`[data-card]`);n?.dataset.id&&(t.closest(`[data-select], .prb-card-controls, [data-menu], [data-history-toggle]`)||(e.preventDefault(),Pn(n.dataset.id)))}),document.addEventListener(`keydown`,e=>{if(!H||e.key!==`Enter`)return;let t=e.target.closest(`.prb-card-link`)?.closest(`[data-card]`);t?.dataset.id&&(e.preventDefault(),Pn(t.dataset.id))});var q=Ue({doc:document,item:`[data-card]`,link:`.prb-card-link`,walk:()=>[...document.querySelectorAll(`[data-card]`)].filter(Mn),enterAllowed:()=>!H,background:()=>gn,leadIn:e=>[...e.closest(`[data-cards]`)?.querySelectorAll(`[data-card]:not([hidden])`)??[]][0]===e?e.closest(`details[data-section]`)?.querySelector(`summary`)??null:null});function Fn(){return q.holdsKeys()?q.current()?.querySelector(er)??null:null}var J=xt({doc:document,win:window,area:()=>gn,walk:()=>[...document.querySelectorAll(`[data-card]`)].filter(Mn),cardMenu:e=>e.querySelector(er),menus:G,focusCard:e=>e.querySelector(`.prb-card-link`)?.focus({preventScroll:!0}),showShortcuts:()=>Jn.showShortcuts(),onOutcome:(e,t)=>Rn(e,t),onClose:()=>Kr()}),In=ue(navigator);mt(document,In);function Ln(){return q.current()??[...document.querySelectorAll(`[data-card]`)].find(Mn)??null}document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`[data-quick-review-open]`);if(!t)return;e.preventDefault(),e.stopPropagation(),G.closeAll();let n=t.dataset.quickReviewOpen?j.get(t.dataset.quickReviewOpen)?.[0]??null:Ln();n&&J.open(t.closest(`[data-card]`)??n)},!0);function Rn(e,t){let n=j.get(e)??[];t.complete&&Qn(n,!0),Tt(e,e=>{e.querySelector(`.prb-card-outcome`)?.remove(),e.querySelector(`.prb-card-deferral`)?.remove();let n=[];if(t.card){let e=document.createElement(`span`);e.className=`prb-card-outcome`,e.dataset.outcome=t.card.kind,e.dataset.standing=t.card.standing,e.textContent=t.card.label,n.push(e)}if(t.deferral){let e=document.createElement(`span`);e.className=`prb-card-deferral`,e.dataset.outcome=t.deferral.kind,e.textContent=`Next: ${t.deferral.label}`,n.push(e)}e.querySelector(`:scope > .prb-card-controls > .prb-card-status`)?.after(...n)})}var zn=8;function Bn(e){let t=e.querySelector(`.prb-card-link`);t&&(t.focus({preventScroll:!0}),document.activeElement!==t&&document.activeElement?.blur(),W!==null&&cn(),St.leaving(),Vn=!0,window.location.assign(t.href))}var Vn=!1,Hn={title:`Search reviews`,mount(e,t){let n=document.createElement(`input`);n.type=`search`,n.className=`prb-palette-input`,n.placeholder=P?.placeholder??``,n.setAttribute(`aria-label`,`Search reviews`),n.spellcheck=!1,n.value=P?.value??``;let r=document.createElement(`p`);r.className=`prb-palette-summary`,r.setAttribute(`aria-live`,`polite`);let i=document.createElement(`div`);i.className=`prb-palette-results`,i.setAttribute(`role`,`group`),i.setAttribute(`aria-label`,`Matching reviews`);let a=()=>{let e=rn.slice(0,zn);i.replaceChildren(...e.map(e=>{let t=document.createElement(`button`);t.type=`button`,t.className=`prb-palette-result`,t.dataset.resultId=e.dataset.id??``;let n=document.createElement(`span`);n.className=`prb-palette-result-title`,n.textContent=e.querySelector(`.prb-card-head h2`)?.textContent??``;let r=document.createElement(`span`);return r.className=`prb-palette-result-where`,r.textContent=[e.querySelector(`.prb-card-repo`)?.textContent,e.querySelector(`.prb-card-branch`)?.textContent].filter(Boolean).join(` · `),t.append(n,r),t})),r.textContent=rn.length===0?`No reviews match.`:rn.length>e.length?`The first ${e.length} of ${Pt?.textContent??rn.length}`:Pt?.textContent??``},o=()=>[...i.querySelectorAll(`.prb-palette-result`)],s=e=>{let n=A.find(t=>t.dataset.id===e?.dataset.resultId);n&&(t(),Bn(n))};n.addEventListener(`input`,()=>{P&&(P.value=n.value,P.dispatchEvent(new Event(`input`,{bubbles:!0})),a())}),i.addEventListener(`click`,e=>s(e.target.closest(`.prb-palette-result`)??void 0)),e.addEventListener(`keydown`,e=>{if(e.isComposing)return;let t=o(),r=t.indexOf(e.target);if(e.key===`Enter`&&e.target===n)return e.preventDefault(),s(t[0]);let i=e.key===`ArrowDown`?r<0?t[0]:t[r+1]:e.key===`ArrowUp`?r<=0?n:t[r-1]:null;i&&(e.preventDefault(),i.focus())}),e.append(n,r,i),a(),n.focus(),n.select()}},Un={title:`Filters`,mount(e){let t=document.createElement(`p`);t.className=`prb-palette-summary`,t.setAttribute(`aria-live`,`polite`);let n=()=>{t.textContent=Pt?.textContent??``},r=[Mt,F,I].flatMap(e=>{if(!e)return[];let t=document.createElement(`label`);t.className=`prb-palette-field`;let r=document.createElement(`span`),i=(e.getAttribute(`aria-label`)??``).replace(/^Filter by /,``);r.textContent=i.charAt(0).toUpperCase()+i.slice(1);let a=document.createElement(`select`);for(let t of e.options)a.append(new Option(t.text,t.value));return a.value=e.value,a.addEventListener(`change`,()=>{e.value=a.value,e.dispatchEvent(new Event(`change`,{bubbles:!0})),n()}),t.append(r,a),[t]});e.append(...r,t),n(),r[0]?.querySelector(`select`)?.focus()}};function Wn(e){let t=()=>document.querySelector(`details[data-section="${e}"]`);return{available:()=>!!(t()&&!t().hidden),state:()=>{let e=t();return e&&!e.hidden?e.open?`Expanded`:`Collapsed`:null},run:()=>{let e=t();e&&(e.open=!e.open)}}}var Gn=Object.fromEntries(h.map(e=>[`reviews.section.${e}`,Wn(e)]));function Kn(){return[...document.querySelectorAll(`[data-collections-area]:not([hidden]) [data-collection]:not([hidden])`)].flatMap(e=>{let t=e.querySelector(`:scope > details[data-section]`);if(!t)return[];let n=t.querySelector(`[data-collection-name]`)?.textContent??``,r=t.querySelector(`:scope > summary [data-section-count]`)?.textContent??``;return[{id:e.dataset.collection??``,name:n,count:r,open:t.open}]})}var qn=document.querySelector(`[data-collection-new]`),Jn=he(`reviews`,{...Gn,"reviews.search":{available:()=>P!==null,panel:Hn},"reviews.filters":{available:()=>Mt!==null,panel:Un},"reviews.collection.new":{available:()=>qn!==null&&!qn.disabled,run:()=>qn?.click()},"reviews.collection.fold":{available:()=>Kn().length>0,panel:at({collections:Kn,toggle:e=>{let t=document.querySelector(`[data-collection="${CSS.escape(e)}"] > details[data-section]`);t&&(t.open=!t.open)}})},"reviews.next":{run:()=>q.move(1)},"reviews.previous":{run:()=>q.move(-1)},"reviews.open":{available:()=>q.enterOpens(),run:()=>q.open()},"reviews.openInNewTab":{available:()=>q.enterOpens(),run:()=>q.openInNewTab()},"reviews.selection.exit":{available:pr,run:()=>Zt&&!Zt.hidden?dr(z?.contains(document.activeElement)??!1):fr()},"reviews.quickReview":{available:()=>q.holdsKeys()&&q.current()!==null,run:()=>{let e=q.current();e&&J.open(e)}},"quick.down":{run:()=>J.scroll(1)},"quick.downArrow":{run:()=>J.scroll(1)},"quick.up":{run:()=>J.scroll(-1)},"quick.upArrow":{run:()=>J.scroll(-1)},"quick.previous":{run:()=>J.step(-1)},"quick.previousArrow":{run:()=>J.step(-1)},"quick.next":{run:()=>J.step(1)},"quick.nextArrow":{run:()=>J.step(1)},"quick.menu":{run:()=>J.openMenu()},"quick.shortcuts":{run:()=>Jn.showShortcuts()},"reviews.menu":{available:()=>Fn()!==null,run:()=>{let e=Fn();e&&G.open(e,{focusFirst:!0,returnFocus:()=>q.refocus()})}}},{onOpen:()=>G.closeAll(),onSettle:()=>Kr()});function Yn(){return Ht(A.filter(e=>V.has(e.dataset.id??``)))}function Xn(){return Yn().reduce((e,t)=>e+Number(t.dataset.reviews??1),0)}function Y(e){$t&&($t.textContent=e,$t.hidden=!1)}function X(e){for(let t of z?.querySelectorAll(`button`)??[])t.disabled=e}async function Zn(e){let t=[...V];if(t.length===0)return;X(!0);let n=null,r=await wn(t,async()=>{try{(await fetch(`/status`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:t,complete:e})})).ok||(n=`That could not be saved. The workspace server refused it.`)}catch{n=`The workspace server did not answer. It may have stopped.`}});if(!r||n!==null)return X(!1),Y(r?n??``:Cn);Qn(Yn(),e),X(!1),An(!1)}function Qn(e,t){let n=t?`complete`:`in-progress`,r=t?`in-progress`:`complete`;for(let t of e.flatMap(e=>j.get(e.dataset.id??``)??[e])){t.dataset.status=n;for(let e of t.querySelectorAll(`.prb-card-status`))Ae(e,n);let e=t.querySelector(`[data-mark-status]`);e&&(e.dataset.markStatus=r,e.textContent=g(r))}}async function $n(e,t){try{let n=await fetch(`/status`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:[e],complete:t})});if(!n.ok)return pn(await mn(n))}catch{return pn(fn)}Qn(A.filter(t=>t.dataset.id===e),t),U()}var er=`:scope > .prb-card-controls > [data-menu]:not([data-lifecycle-control])`;async function tr(e,t){let n=e.closest(`[data-card]`),r=n?.dataset.id;if(!n||!r||xn.has(r))return;let i=document.activeElement===e,a=nr(n);Re(e,!0);try{await En(r,t)}finally{Re(e,!1)}i&&rr(e,a)}function nr(e){let t=e=>e instanceof HTMLElement&&e.matches(`[data-card]`)&&e.checkVisibility();for(let n=e.nextElementSibling;n;n=n.nextElementSibling)if(t(n))return n;for(let n=e.previousElementSibling;n;n=n.previousElementSibling)if(t(n))return n;return null}function rr(e,t){if(document.activeElement===null||document.activeElement===document.body){if(e.isConnected&&e.checkVisibility())return e.focus({preventScroll:!0});t?.querySelector(`.prb-card-link`)?.focus({preventScroll:!0})}}function ir(e,t){return async()=>{await or([e],t)||pn(`That could not be saved. The workspace server refused it or did not answer.`)}}document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-card] button.prb-card-status`),n=t?.closest(`[data-card]`)?.dataset.id;!t||!n||(e.preventDefault(),tr(t,()=>$n(n,t.dataset.status!==`complete`)))});function ar(e,t,n){let r=n.querySelector(`[data-lifecycle-pill]`),i=n.closest(`[data-card]`)?.dataset.id;if(!r||!i)return;let a=t.closest(`[data-lifecycle-set]`);if(a){e.preventDefault(),e.stopPropagation(),G.close(n,{returnFocus:!0}),tr(r,ir(i,a.dataset.lifecycleSet));return}let o=r.dataset.lifecyclePress;!t.closest(`[data-lifecycle-pill]`)||!o||o===`menu`||(e.preventDefault(),tr(r,ir(i,o)))}async function or(e,t){let n;try{let r=await fetch(`/lifecycle`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:e,state:t})});n=r.ok?await r.json().catch(()=>null):null}catch{n=null}if(!n)return!1;let r=new Set(e);for(let e of M())r.has(e.dataset.id??``)&&(e.dataset.lifecycle=t,t===`active`?delete e.dataset.lifecycleAt:e.dataset.lifecycleAt=String(n.at),sr(e));return hn(n.queue),U(),!0}function sr(e){let{stored:t,activity:n}=Rt(e),r=e.querySelector(`[data-lifecycle-pill]`);r&&ze(r,t,n);let i=e.querySelector(`[data-lifecycle-chip]`);if(i){let e=v(t,n);i.textContent=e??``,i.hidden=e===void 0}for(let r of e.querySelectorAll(`[data-menu-items] [data-lifecycle-set]`)){let e=r.dataset.lifecycleSet;r.hidden=!Se(e,t,n),r.textContent=_e(e,t,n)}}async function cr(e){let t=[...V];if(t.length===0)return;X(!0);let n=!1,r=await wn(t,async()=>{n=await or(t,e)});if(X(!1),!r)return Y(Cn);if(!n)return Y(`That could not be saved. The workspace server refused it or did not answer.`);An(!1)}async function lr(){let e=[...V];if(e.length===0)return;X(!0);let t=null;try{let n=await fetch(`/delete`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:e})});if(t=n.ok?await n.json().catch(()=>null):null,!t)return X(!1),K(),Y(`Nothing was deleted. The workspace server refused it.`)}catch{return X(!1),K(),Y(`The workspace server did not answer. It may have stopped.`)}let n=t.blocked??[],r=new Set(n.map(e=>e.id));for(let e of Yn()){let t=e.dataset.id??``;r.has(t)||Tt(t,e=>e.remove())}A=A.filter(e=>e.isConnected),Ct(),V.clear();for(let e of r)V.add(e);if(X(!1),K(),n.length===0)return An(!1);U(),Y([...new Set(n.map(e=>e.error))].join(` `))}async function ur(){let e=Yn().map(e=>e.dataset.id??``).filter(Boolean);if(e.length===0)return;X(!0);let t=null,n=!1,r=await wn(e,async()=>{try{let n=await fetch(`/queue`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:e,action:`add`})});t=n.ok?await n.json().catch(()=>null):null}catch{n=!0}});if(!r||n)return X(!1),K(),Y(r?`The workspace server did not answer. It may have stopped.`:Cn);if(!t?.queue)return X(!1),K(),Y(`Nothing was added. The workspace server refused it.`);hn(t.queue);let i=t.refused??[];V.clear();for(let e of i)V.add(e.id);if(X(!1),K(),i.length===0)return An(!1);U(),Y([...new Set(i.map(e=>e.error))].join(` `))}z?.addEventListener(`click`,e=>{let t=e.target;if(Yt&&t.closest(`[data-bulk-more] [data-menu-panel] button`)&&G.close(Yt),t.closest(`[data-bulk-queue]`))return void ur();if(t.closest(`[data-bulk-collections]`))return Ar(Yn().map(e=>e.dataset.id??``).filter(Boolean),{selection:!0});let n=t.closest(`[data-bulk-mark]`);if(n)return void Zn(n.dataset.bulkMark===`complete`);let r=t.closest(`[data-bulk-lifecycle]`);if(r)return void cr(r.dataset.bulkLifecycle);if(t.closest(`[data-bulk-delete]`)){Xt&&(Xt.textContent=s(Xn())),Qt&&(Qt.hidden=!0),Zt&&(Zt.hidden=!1),e.detail===0&&z.querySelector(`[data-bulk-cancel-delete]`)?.focus();return}if(t.closest(`[data-bulk-confirm-delete]`))return void lr();if(t.closest(`[data-bulk-cancel-delete]`))return dr(e.detail===0);if(t.closest(`[data-bulk-exit]`))return fr()});function dr(e){K(),e&&Kt?.focus()}function fr(){let e=z?.contains(document.activeElement)??!1;An(!1),e&&document.querySelector(`[data-select-mode]`)?.focus()}function pr(e){return!H||Jt?.disabled?!1:e===void 0||Oe(e,document,!0)}var mr=document.querySelector(`[data-collections-dialog]`),hr=document.querySelector(`[data-collections-dialog-list]`),Z=document.querySelector(`[data-collections-dialog-search]`),gr=document.querySelector(`[data-collections-dialog-create]`),_r=document.querySelector(`[data-collections-dialog-error]`),vr=document.querySelector(`[data-collections-dialog-for]`),Q=[],yr=!1,br=!1,xr=document.body.dataset.cardsSnapshot??``;function Sr(e,t){return Ze(e,t,xr)}function Cr(e){if(e.stale||e.area===void 0){try{let e={ids:[...V],selecting:H};window.sessionStorage.setItem(Qe,JSON.stringify(e))}catch{}mr?.close(),window.location.reload();return}let t=e.area,n=document.querySelector(`[data-collections-area]`);if(n){let e=n.contains(document.activeElement)?fe(document):null,r=document.createElement(`template`);r.innerHTML=t.trim();let i=r.content.firstElementChild;if(i){if(n.replaceWith(i),Nn(i),mt(i,In),H)for(let e of i.querySelectorAll(`.prb-card-link`))e.setAttribute(`aria-disabled`,`true`);e&&Ee(document,e.focus,e.focusVisible)}}N=e.collections;for(let t of A){let n=e.memberOf[t.dataset.id??``]??[];t.dataset.collections=n.join(` `);let r=t.querySelector(`[data-collections-line]`),i=x(n,N);r&&(r.textContent=i??``,r.hidden=i===void 0)}for(let t of Et){let n=e.operations?.[t.dataset.key??``];n&&(t.dataset.collections=n.join(` `))}Ct(),Rr(),U()}function wr(e,t){let n=e.querySelector(`[data-collection-error]`);n&&(n.textContent=t??``,n.hidden=t===void 0)}It?.addEventListener(`input`,()=>Lt()),L?.addEventListener(`change`,e=>{let t=e.target.closest(`[data-collections-filter-option]`);if(!t)return;let n=t.checked?[...B.collections,t.value]:B.collections.filter(e=>e!==t.value);ln({collections:[...new Set(n)]},`now`),L.querySelector(`[data-collections-filter-option][value="${CSS.escape(t.value)}"]`)?.focus()});var $=document.querySelector(`[data-collection-new-dialog]`),Tr=$?.querySelector(`[data-collection-name-input]`)??null,Er=$?.querySelector(`[data-collection-create]`)??null,Dr=!1;function Or(){qn&&(qn.disabled=Dr),Tr&&(Tr.readOnly=Dr),Er&&(Er.disabled=Dr||(Tr?.value.trim()??``)===``)}qn?.addEventListener(`click`,()=>{$&&(G.closeAll(),Tr&&(Tr.value=``),Or(),wr($,void 0),$.showModal(),Tr?.focus())}),Tr?.addEventListener(`input`,()=>{Or(),$&&wr($,void 0)}),$?.querySelector(`[data-collection-cancel]`)?.addEventListener(`click`,()=>$.close()),$?.addEventListener(`close`,()=>Kr()),document.addEventListener(`submit`,e=>{let t=e.target;if(t.matches(`[data-collection-new-form]`)){e.preventDefault();let n=Tr?.value??``;if(n.trim()===``)return;Dr=!0,Or(),Sr(`/collections`,{action:`create`,name:n}).then(e=>{Dr=!1,Or();let n=$?.open===!0;if(!e.ok)return wr(t,e.error);$?.close(),Cr(e.answer),n&&document.querySelector(`[data-collection="${CSS.escape(e.answer.id??``)}"] summary`)?.focus({focusVisible:!1})});return}let n=t.closest(`[data-collection-rename-form]`);if(n){e.preventDefault();let t=n.querySelector(`[data-collection-name-input]`)?.value??``,r=n.dataset.collectionRenameForm??``;Sr(`/collections`,{action:`rename`,id:r,name:t}).then(e=>{if(!e.ok)return wr(n,e.error);G.closeAll(),Cr(e.answer),document.querySelector(`[data-collection="${CSS.escape(r)}"] summary`)?.focus({focusVisible:!1})})}});function kr(e,t,n){let r=n.querySelector(`[data-menu-items]`),i=n.querySelector(`[data-collection-rename-form]`),a=n.querySelector(`[data-menu-confirm]`);if(t.closest(`[data-collection-rename]`)&&i){e.preventDefault(),r&&(r.hidden=!0),i.hidden=!1;let t=i.querySelector(`[data-collection-name-input]`);t?.focus(),t?.select();return}if(t.closest(`[data-collection-delete]`)&&a){e.preventDefault(),r&&(r.hidden=!0),a.hidden=!1,e.detail===0&&n.querySelector(`[data-cancel-delete]`)?.focus();return}if(t.closest(`[data-collection-cancel], [data-cancel-delete]`)){e.preventDefault(),Dn(n);return}let o=t.closest(`[data-collection-confirm-delete]`);if(o?.dataset.collectionConfirmDelete){e.preventDefault(),o.disabled=!0;let t=o.dataset.collectionConfirmDelete;Sr(`/collections`,{action:`delete`,id:t}).then(e=>{if(o.disabled=!1,!e.ok)return kn(n,e.error);G.closeAll(),Cr(e.answer),B.collections.includes(t)&&cn(),document.querySelector(`[data-collection-new]`)?.focus()})}}function Ar(e,t){!mr||e.length===0||(G.closeAll(),Q=[...e],yr=!1,br=`selection`in t,vr&&(vr.textContent=it(e.length,`card`in t?t.card:void 0)),Z&&(Z.value=``),Nr(void 0),Mr(),mr.showModal(),Z?.focus())}function jr(){return Q.map(e=>Xe(A.find(t=>t.dataset.id===e)??document.createElement(`div`)))}function Mr(){let e=Z?.value??``;hr&&rt(hr,N,jr(),e);let t=tt(e,N);gr&&(gr.hidden=t===void 0,gr.textContent=t===void 0?``:`Create “${t}” and add ${Q.length===1?`this review`:`these ${Q.length}`}`)}function Nr(e){_r&&(_r.textContent=e??``,_r.hidden=e===void 0)}async function Pr(e){Nr(void 0);let t=await Sr(`/collections/members`,{ids:Q,...e});if(!t.ok)return Nr(t.error),Mr();yr=!0,Cr(t.answer);let n=t.answer.refused??[];n.length>0&&(Q=Q.filter(e=>!n.some(t=>t.id===e)),Nr([...new Set(n.map(e=>e.error))].join(` `))),Mr()}Z?.addEventListener(`input`,()=>Mr()),Z?.addEventListener(`keydown`,e=>{e.key===`Enter`&&(e.preventDefault(),gr&&!gr.hidden&&gr.click())}),gr?.addEventListener(`click`,()=>{let e=tt(Z?.value??``,N);e!==void 0&&Pr({action:`add`,create:e}).then(()=>{Z&&(Z.value=``),Mr(),Z?.focus()})}),hr?.addEventListener(`change`,e=>{let t=e.target.closest(`[data-collections-dialog-option]`);if(!t)return;let n=ae(t.dataset.membership??`none`),r=t.value;Pr({action:n,collection:r}).then(()=>{hr.querySelector(`[data-collections-dialog-option][value="${CSS.escape(r)}"]`)?.focus()})}),document.querySelector(`[data-collections-dialog-close]`)?.addEventListener(`click`,()=>mr?.close());try{let e=window.sessionStorage.getItem(Qe);if(e){window.sessionStorage.removeItem(Qe);let t=JSON.parse(e),n=Array.isArray(t.ids)?t.ids.filter(e=>typeof e==`string`):[];if(t.selecting===!0||n.length>0){An(!0);for(let e of $e(n,A))V.add(e);U()}}}catch{}mr?.addEventListener(`close`,()=>{yr&&H&&br&&An(!1),Q=[],Kr()}),i(window,()=>window.location.reload());var Fr=`prb-fetch-summary`;function Ir(e){return e.map(e=>({lineage:(e.dataset.lineage??e.dataset.id??``).split(` `).filter(Boolean)}))}function Lr(e){return Pe(Ir(e),nn)}function Rr(){for(let e of M()){let t=e.querySelector(`[data-fetch-review]`);t&&(t.hidden=!Ie(nn,Ir([e])))}}async function zr(){try{let e=await fetch(`/fetch-updates`);if(!e.ok)return;nn=(await e.json()).targets??{}}catch{return}Rr(),U()}async function Br(e,t){let n=Lr(e);if(an||n.repositories===0)return;an=!0;let r=[tn,...document.querySelectorAll(`[data-fetch-review]`)];for(let e of r)e&&(e.disabled=!0);t&&(t.textContent=je(n.repositories));let i=null;try{let e=await fetch(`/fetch-updates`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:n.ids})});e.ok&&(i=await e.json())}catch{}an=!1;for(let e of r)e&&(e.disabled=!1);t&&(t.textContent=Le),U();let a=i??{repositories:n.repositories,fetched:0,failed:[],moved:0},o={kind:a.fetched<a.repositories?`failed`:`ready`,text:Ne(a)};if(a.moved>0||Ur){try{window.sessionStorage.setItem(Fr,JSON.stringify(o))}catch{}if(!Gr())return void window.location.reload();Ur=!0}ce(ye(),o)}try{let e=window.sessionStorage.getItem(Fr);if(e){window.sessionStorage.removeItem(Fr);let t=JSON.parse(e);typeof t.kind==`string`&&typeof t.text==`string`&&ce(ye(),{kind:t.kind,text:t.text})}}catch{}tn?.addEventListener(`click`,()=>void Br(Yn(),tn)),pe(),zr();var Vr=document.body.dataset.indexRevision??``,Hr=document.body.dataset.live===`true`?Date.now():0,Ur=!1,Wr=Vr||null;function Gr(){let e=mr?.open===!0||$?.open===!0||document.activeElement?.closest(`[data-collections-area], [data-collections-filter]`)!=null;return V.size>0||document.activeElement===P||an||Jn.isOpen()||J.isOpen()||Vn||e||vn()||yn>0}function Kr(){Ur&&!Gr()&&T()}async function qr(){try{let e=await fetch(`/revision`);if(e.ok){xe(document,!0);let t=await e.json();w(document,t),t.live&&Hr===0&&(Hr=Date.now()),t.live||(Hr=0),t.revision!==void 0&&t.revision!==Wr&&(Wr!==null&&J.revalidate(),Wr=t.revision);let n=se(Vr,t.revision??``,Gr());if(n===`reload`)return T(),null;n===`hold`&&(Ur=!0)}}catch{xe(document,!1)}return He(Hr===0?2**53-1:Date.now()-Hr)}var Jr=b(window,qr);de(document,()=>Jr.now()),P?.addEventListener(`blur`,Kr),document.addEventListener(`click`,()=>window.setTimeout(Kr,0)),ge();
1
+ import{$ as e,A as t,B as n,C as r,Ct as i,D as a,E as o,F as s,G as c,H as l,I as u,K as d,L as f,M as p,N as m,O as ee,P as h,Q as te,R as g,T as ne,U as _,V as re,W as ie,X as ae,Y as oe,Z as se,a as ce,at as v,et as le,ft as y,g as b,gt as ue,h as de,ht as fe,i as pe,it as me,j as x,k as S,m as he,mt as C,n as w,o as ge,ot as _e,q as ve,r as T,s as ye,t as be,tt as E,u as xe,ut as Se,v as Ce,vt as we,w as D,xt as Te,y as O,yt as Ee,z as De}from"./chunk-C0JUspm9.js";import{E as Oe,L as ke,S as Ae,_ as je,b as Me,g as Ne,h as Pe,l as Fe,m as Ie,p as Le,w as Re,x as ze,y as Be}from"./chunk-SPHga_7I.js";import{i as Ve,t as He}from"./chunk-DLCpB0qV.js";import{t as Ue}from"./chunk-C8kkSv38.js";import{n as We,r as Ge}from"./chunk-CZ1YsjDz.js";function Ke(e,t){t.forEach((t,n)=>{e.children[n]!==t&&e.insertBefore(t,e.children[n]??null)})}async function qe(e,t,n){if(e.disabled)return;let r=e.getAttribute(`aria-pressed`)!==`true`;Je(e,r),e.disabled=!0;let i=await t(r).catch(()=>!1);if(e.disabled=!1,!i)return Je(e,!r);n(r)}function Je(e,t){e.setAttribute(`aria-pressed`,String(t)),e.innerHTML=t?`&#9733;`:`&#9734;`,e.setAttribute(`aria-label`,`${t?`Unpin`:`Pin`} this review`)}function Ye(e){let t=e.querySelector(`[data-collections-registry]`)?.textContent??`[]`;try{let e=JSON.parse(t);return Array.isArray(e)?e.filter(e=>!!e&&typeof e.id==`string`&&typeof e.name==`string`):[]}catch{return[]}}function Xe(e){return(e.dataset.collections??``).split(` `).filter(Boolean)}async function Ze(e,t,n){try{let r=await fetch(e,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({...t,snapshot:n})}),i=await r.json().catch(()=>null);return r.ok&&i&&(typeof i.area==`string`||i.stale===!0)?{ok:!0,answer:i}:{ok:!1,error:i?.error??`That could not be saved. The workspace server refused it.`}}catch{return{ok:!1,error:`The workspace server did not answer. It may have stopped.`}}}var Qe=`prb-reviews-selection`;function $e(e,t){let n=new Set(e);return t.filter(e=>(e.dataset.lineage??e.dataset.id??``).split(` `).some(e=>n.has(e))).map(e=>e.dataset.id??``).filter(Boolean)}function et(e,t){return t===``||e.name.toLowerCase().includes(t.trim().toLowerCase())}function tt(e,t){let n=e.trim().replace(/\s+/g,` `);if(n!==``)return t.some(e=>e.name.localeCompare(n,void 0,{sensitivity:`base`})===0)?void 0:n}function nt(e,t,n,r){let i=e.ownerDocument,a=(e,t)=>{let r=i.createElement(`label`);r.className=`prb-collections-option`;let a=i.createElement(`input`);return a.type=`checkbox`,a.value=e,a.checked=n.includes(e),a.setAttribute(`data-collections-filter-option`,``),r.append(a,i.createTextNode(` ${t}`)),r},s=t.filter(e=>et(e,r)).map(e=>a(e.id,e.name));et({id:`none`,name:`Uncollected`},r)&&s.unshift(a(o,`Uncollected`)),e.replaceChildren(...s)}function rt(e,t,n,r){let i=e.ownerDocument,a=t.filter(e=>et(e,r)).map(e=>{let t=c(n,e.id),r=i.createElement(`label`);r.className=`prb-collections-option`;let a=i.createElement(`input`);a.type=`checkbox`,a.value=e.id,a.checked=t===`all`,a.indeterminate=t===`some`,a.dataset.membership=t,a.setAttribute(`data-collections-dialog-option`,``);let o=i.createElement(`span`);if(o.textContent=e.name,r.append(a,o),t===`some`){let t=i.createElement(`span`);t.className=`prb-collections-some`,t.textContent=`${n.filter(t=>t.includes(e.id)).length} of ${n.length}`,r.append(t)}return r});if(a.length===0&&t.length===0){let e=i.createElement(`p`);e.className=`prb-collections-none`,e.textContent=`No collections yet. Type a name to make one.`,a.push(e)}e.replaceChildren(...a)}function it(e,t){return t?`For ${t}. Tick a collection to add it, untick to remove it.`:e===1?`For 1 selected review. Tick a collection to add it, untick to remove it.`:`For ${e} selected reviews. A part-filled box adds the rest; it never removes anything.`}function at(e){return{title:`Expand or collapse a collection`,mount(t,n){let r=t.ownerDocument,i=r.createElement(`div`);i.className=`prb-palette-results`,i.setAttribute(`role`,`group`),i.setAttribute(`aria-label`,`Collections`);let a=e.collections().map((e,t)=>{let n=r.createElement(`button`);n.type=`button`,n.className=`prb-palette-result prb-palette-collection`,n.dataset.collectionChoice=e.id;let i=r.createElement(`kbd`);i.className=`prb-kbd prb-palette-num`;let a=Me(t);a?i.textContent=a:i.setAttribute(`aria-hidden`,`true`);let o=r.createElement(`span`);o.className=`prb-palette-result-title`,o.textContent=e.name;let s=r.createElement(`span`);s.className=`prb-palette-collection-count`,s.textContent=e.count;let c=r.createElement(`span`);return c.className=`prb-palette-state`,c.textContent=e.open?`Expanded`:`Collapsed`,n.append(i,o,s,c),n});i.replaceChildren(...a);let o=t=>{t&&(n(),e.toggle(t))};i.addEventListener(`click`,e=>{o(e.target.closest(`[data-collection-choice]`)?.dataset.collectionChoice)}),t.addEventListener(`keydown`,e=>{if(e.isComposing||e.metaKey||e.ctrlKey||e.altKey)return;let t=Be(e.key);if(t!==null)return e.preventDefault(),o(a[t]?.dataset.collectionChoice);let n=a.indexOf(e.target),r=e.key===`ArrowDown`||e.key===`j`?a[Math.min(n+1,a.length-1)]:e.key===`ArrowUp`||e.key===`k`?a[Math.max(n-1,0)]:e.key===`Home`?a[0]:e.key===`End`?a[a.length-1]:void 0;r&&(e.preventDefault(),r.focus())}),t.append(i),a[0]?.focus()}}}function ot(e){let t=e.dataset.id??``,n=e.dataset.placement;return n===void 0||n===`home`?t:`${t}|${n}`}function st(e,t){let n=e.parentElement?.querySelector(`[data-history-list]`);n&&(n.hidden=!t,e.setAttribute(`aria-expanded`,String(t)))}function ct(e,t,n,r,i=new Map){return{limits:n,...i.size===0?{}:{collectionLimits:Object.fromEntries(i)},expanded:t.filter(e=>e.dataset.id&&e.querySelector(`[data-history-list]:not([hidden])`)).map(ot),main:r?.scrollTop??0,...fe(e)}}function lt(e,t){let n=e?.limits;if(!n||typeof n!=`object`)return t;let r={...t};for(let e of D){let t=n[e];typeof t==`number`&&Number.isInteger(t)&&t>r[e]&&(r[e]=t)}return r}function ut(e){let t=e?.collectionLimits,n=new Map;if(!t||typeof t!=`object`||Array.isArray(t))return n;for(let[e,r]of Object.entries(t))e.startsWith(`collection`)&&re(e)&&typeof r==`number`&&Number.isInteger(r)&&r>15&&n.set(e,r);return n}function dt(e,t,n){if(!t)return;n.reveal(lt(t,n.limits),ut(t));let r=new Set(Te(t,`expanded`));for(let e of n.cards){let t=e.querySelector(`[data-history-toggle]`);t&&r.has(ot(e))&&st(t,!0)}let i=we(t,`main`);n.pane&&i!==null&&(n.pane.scrollTop=i),Ee(e,t.focus,t.focusVisible)}var ft=[{id:`no-concerns`,name:`Reviewed: no concerns`,baseline:!0},{id:`needs-changes`,name:`Needs changes`,baseline:!0},{id:`needs-decision`,name:`Needs a decision / answer`,baseline:!0},{id:`deeper-review`,name:`Needs deeper review`,baseline:!1},{id:`later`,name:`Later`,baseline:!1}],pt=`[data-qr-link-input]`;function mt(e){let t=e.closest(`.prb-qr-picker`),n=t?.querySelector(`[data-qr-link-target]`),r=t?.querySelector(`[data-qr-link-list]`);return!t||!n||!r?null:{input:e,target:n,list:r,empty:r.querySelector(`[data-qr-link-empty]`),submit:t.querySelector(`[data-qr-link]`)}}function ht(e,t){let n=e.toLowerCase();return t.toLowerCase().split(/\s+/).filter(Boolean).every(e=>n.includes(e))}function gt(e){return[...e.list.querySelectorAll(`[data-qr-option]`)]}function _t(e){return gt(e).filter(e=>!e.hidden)}function vt(e,t){for(let n of gt(e))n.toggleAttribute(`data-active`,n===t);t?(e.input.setAttribute(`aria-activedescendant`,t.id),t.scrollIntoView({block:`nearest`})):e.input.removeAttribute(`aria-activedescendant`)}function yt(e){let t=e.input.value,n=0;for(let r of gt(e))r.hidden=!ht(r.textContent??``,t),r.hidden||n++;e.empty&&(e.empty.hidden=n>0)}function bt(e){yt(e),e.list.hidden=!1,e.input.setAttribute(`aria-expanded`,`true`),vt(e,_t(e).find(t=>t.dataset.qrOption===e.target.value)??_t(e)[0]??null)}function xt(e){e.list.hidden=!0,e.input.setAttribute(`aria-expanded`,`false`),vt(e,null)}function St(e){return!e.list.hidden}function Ct(e,t){e.input.value=t.textContent??``,e.target.value=t.dataset.qrOption??``;for(let n of gt(e))n.setAttribute(`aria-selected`,String(n===t));e.submit&&(e.submit.disabled=!e.target.value),xt(e)}function wt(e){e.target.value=``;for(let t of gt(e))t.setAttribute(`aria-selected`,`false`);e.submit&&(e.submit.disabled=!0)}function Tt(e,t){if(!St(e))return bt(e);let n=_t(e);if(!n.length)return;let r=n.findIndex(e=>e.hasAttribute(`data-active`));vt(e,n[r<0?t>0?0:n.length-1:Math.min(n.length-1,Math.max(0,r+t))])}function Et(e){let t=e=>e instanceof HTMLInputElement&&e.matches(pt)?mt(e):null;e.addEventListener(`focusin`,e=>{let n=t(e.target);n&&bt(n)}),e.addEventListener(`focusout`,e=>{let n=t(e.target);n&&xt(n)}),e.addEventListener(`input`,e=>{let n=t(e.target);n&&(wt(n),bt(n))}),e.addEventListener(`keydown`,e=>{let n=t(e.target);if(!n)return;let r=()=>{e.preventDefault(),e.stopPropagation()};if(e.key===`ArrowDown`)return void(r(),Tt(n,1));if(e.key===`ArrowUp`)return void(r(),Tt(n,-1));if(e.key===`Enter`){r();let e=n.list.querySelector(`[data-qr-option][data-active]:not([hidden])`);if(St(n)&&e)return Ct(n,e);n.target.value&&n.submit?.click();return}if(e.key===`Escape`&&St(n))return void(r(),xt(n))}),e.addEventListener(`mousedown`,e=>{e.target.closest?.(`[data-qr-option]`)&&e.preventDefault()}),e.addEventListener(`click`,e=>{let t=e.target.closest?.(`[data-qr-option]`),n=t?.closest(`.prb-qr-picker`)?.querySelector(pt),r=n?mt(n):null;t&&r&&Ct(r,t)})}var Dt=`quick-review:space-moved`;function Ot(e,t){for(let n of e.querySelectorAll(`[data-shortcut-for]`)){let e=Ce(n.dataset.shortcutFor??``);n.textContent=e?O(e.binding,t):``}}var kt=`Checking for changes…`,At=`Not recorded: this review changed since you read it. The brief is refreshed, so choose again if your outcome still stands.`,jt=`The workspace server did not answer. It may have stopped.`;function Mt(e){let t=Math.floor(Math.min(16,e.width*.025)),n=Math.floor(Math.min(16,e.height*.025));return{left:e.left+t,top:e.top+n,width:e.width-2*t,height:e.height-2*n}}function Nt(e){let t=new Set,n=[];for(let r of e){let e=r.dataset.id;!e||t.has(e)||(t.add(e),n.push({id:e,lineage:r.dataset.lineage??``,card:r}))}return n}function Pt(e,t){return!!e&&!!t&&e.sessionId===t.sessionId&&e.commitSha===t.commitSha&&e.analysisRevision===t.analysisRevision}function k(e,t,n,r){let i=e.createElement(t);return n&&(i.className=n),r!==void 0&&(i.textContent=r),i}function Ft(e){let{doc:t,win:n}=e,r=e.fetch??((e,t)=>n.fetch(e,t)),i=k(t,`dialog`,`prb-quick-review`);i.setAttribute(`data-quick-review`,``),i.setAttribute(`aria-labelledby`,`prb-qr-title`),i.setAttribute(`aria-describedby`,`prb-qr-position`);let a=k(t,`header`,`prb-qr-head`),o=k(t,`div`,`prb-qr-identity`),s=k(t,`h2`,`prb-qr-title`);s.id=`prb-qr-title`;let c=k(t,`p`,`prb-qr-sub`);o.append(s,c);let l=k(t,`div`,`prb-qr-controls`),u=k(t,`p`,`prb-qr-position`);u.id=`prb-qr-position`;let d=k(t,`button`,`prb-qr-button prb-qr-nav`,`Previous`);d.type=`button`,d.setAttribute(`data-qr-prev`,``);let f=k(t,`button`,`prb-qr-button prb-qr-nav`,`Next`);f.type=`button`,f.setAttribute(`data-qr-next`,``);let p=k(t,`div`,`prb-qr-menu-host`);p.setAttribute(`data-qr-menu`,``);let m=k(t,`button`,`prb-qr-button prb-qr-close`,`Close`),ee=(e,n,r,i)=>{let a=k(t,`kbd`,`prb-qr-key`);a.setAttribute(`aria-hidden`,`true`),n?a.dataset.shortcutFor=n:a.textContent=i??``,e.append(` `,a),e.setAttribute(`aria-keyshortcuts`,r)};ee(d,`quick.previous`,`h ArrowLeft`),ee(f,`quick.next`,`l ArrowRight`),ee(m,null,`Escape`,`Esc`),m.type=`button`,m.setAttribute(`data-qr-close`,``),l.append(u,d,f,p,m),a.append(o,l);let h=k(t,`div`,`prb-qr-outcomes`);h.setAttribute(`role`,`group`),h.setAttribute(`aria-label`,`Your outcome`),h.setAttribute(`data-qr-outcomes`,``);let te=k(t,`p`,`prb-qr-standing`);te.setAttribute(`data-qr-standing`,``);let g=k(t,`span`,`prb-qr-deferral`);g.setAttribute(`data-qr-deferral`,``),g.hidden=!0;let ne=ft.map(e=>{let n=k(t,`button`,`prb-qr-button prb-qr-outcome`,e.name);return n.type=`button`,n.dataset.outcome=e.id,n}),_=k(t,`p`,`prb-qr-outcome-note`);_.setAttribute(`role`,`status`),_.setAttribute(`data-qr-outcome-note`,``);let re=k(t,`div`,`prb-qr-outcome-buttons`);re.append(...ne);let ie=k(t,`p`,`prb-qr-scope`,`Recorded here only. Nothing is posted, approved or merged.`);h.append(te,g,re,_,ie);let ae=k(t,`p`,`prb-qr-notice`);ae.setAttribute(`role`,`status`),ae.setAttribute(`data-qr-notice`,``),ae.hidden=!0;let oe=k(t,`div`,`prb-qr-hint`);oe.setAttribute(`role`,`note`),oe.setAttribute(`data-qr-hint`,``),oe.hidden=!0;let se=k(t,`p`,`prb-qr-hint-text`,`Space now opens Quick Review. Press M for the actions menu.`),ce=k(t,`button`,`prb-qr-button`,`Dismiss`);ce.type=`button`,ce.setAttribute(`data-qr-hint-dismiss`,``),oe.append(se,ce);let v=k(t,`div`,`prb-qr-body`);v.setAttribute(`data-qr-body`,``),v.setAttribute(`role`,`document`),v.tabIndex=-1,i.append(a,oe,h,ae,v);let le=ue(n.navigator);Ot(i,le),t.body.append(i);let y=[],b=0,de=null,fe=0,pe=0,me=null,x=null,S=!1,he=!1,C=new Map,w=()=>y[b];function ge(){let e=t.querySelector(`[data-quick-review-hint]`);e&&(e.removeAttribute(`data-quick-review-hint`),oe.hidden=!1,r(`/notice`,{method:`POST`,headers:{"content-type":`application/json`},credentials:`same-origin`,body:JSON.stringify({dismissNotice:Dt})}).catch(()=>{}))}function _e(){let t=e.area();if(!t)return{left:0,top:0,width:n.innerWidth,height:n.innerHeight};let r=[t,...[...t.parentElement?.children??[]].filter(e=>e.classList.contains(`prb-context`))].map(e=>e.getBoundingClientRect()).filter(e=>e.width>0&&e.height>0),i=Math.min(...r.map(e=>e.left)),a=Math.min(...r.map(e=>e.top)),o=Math.max(...r.map(e=>e.right)),s=Math.max(...r.map(e=>e.bottom));return{left:i,top:a,width:o-i,height:s-a}}function ve(){let e=Mt(_e());i.style.setProperty(`--qr-left`,`${e.left}px`),i.style.setProperty(`--qr-top`,`${e.top}px`),i.style.setProperty(`--qr-width`,`${e.width}px`),i.style.setProperty(`--qr-height`,`${e.height}px`)}function T(){let e=x?.state===`ready`&&x.snapshot!==null,t=!e||S||he;for(let e of ne)e.disabled=t;h.toggleAttribute(`data-disabled`,t),x?e?S?_.textContent=kt:he?_.textContent=`Recording…`:(_.textContent===kt||_.textContent===`Loading the brief…`||_.textContent===`Recording…`)&&(_.textContent=``):_.textContent=`An outcome needs a finished standard analysis.`:_.textContent=`Loading the brief…`;let n=x?.outcome;te.textContent=n?.current?`Your outcome: ${n.current}`:n?.previous?n.previous:n?.deferral?`No verdict on this analysis yet.`:`No outcome recorded on this analysis.`,g.textContent=n?.deferral?`Next: ${n.deferral}`:``,g.hidden=!n?.deferral,te.toggleAttribute(`data-current`,!!n?.current)}function ye(e,t){let n=e.card.querySelector(`.prb-card-title`)?.textContent?.trim()??`Review`;s.textContent=t?.header.title??n;let r=t?[t.header.repo,t.header.pr?`#${t.header.pr.number}`:``,t.header.branch].filter(Boolean):[];c.textContent=r.join(` · `),u.textContent=`${b+1} of ${y.length}`,d.disabled=b===0,f.disabled=b>=y.length-1}function be(n){p.replaceChildren();let r=e.cardMenu(n.card);if(!r)return null;let i=r.cloneNode(!0),a=new Map;for(let e of i.querySelectorAll(`[id]`)){let t=`qr-${e.id}`;a.set(e.id,t),e.id=t}for(let e of i.querySelectorAll(`[aria-controls], [aria-labelledby]`))for(let t of[`aria-controls`,`aria-labelledby`]){let n=e.getAttribute(t);n&&a.has(n)&&e.setAttribute(t,a.get(n))}i.querySelector(`[data-quick-review-open]`)?.remove(),i.dataset.cardRef=n.id;let o=k(t,`kbd`,`prb-qr-key`);return o.setAttribute(`aria-hidden`,`true`),o.dataset.shortcutFor=`quick.menu`,i.querySelector(`[data-menu-trigger]`)?.setAttribute(`aria-keyshortcuts`,`m`),p.append(i,o),Ot(p,le),i}function E(e){ae.textContent=e,ae.hidden=!e}function xe(){return[...v.querySelectorAll(`details[data-qr-detail][open]`)].map(e=>e.dataset.qrDetail??``)}function Se(e,t){x=e,v.innerHTML=e.html;for(let e of t?.open??[]){let t=v.querySelector(`details[data-qr-detail="${CSS.escape(e)}"]`);t&&(t.open=!0)}v.scrollTop=t?.scrollTop??0;let n=w();n&&(ye(n,e),be(n)),T()}function Ce(e){x=null,v.replaceChildren(Object.assign(k(t,`div`,`prb-qr-state`),{role:`status`})),v.firstElementChild.append(k(t,`p`,void 0,e)),T()}function we(){let e=w();e&&x&&x.id===e.id&&C.set(e.id,{brief:x,scrollTop:v.scrollTop,open:xe()})}let D=0,Te=!1;async function O(e=!0){D++;try{await Ee(e)}finally{D--,D===0&&Te&&(Te=!1,i.open&&w()&&O())}}async function Ee(e){let n=w();if(!n)return;let i=++pe;me?.abort();let a=new AbortController;me=a;let o=C.get(n.id);ye(n,o?.brief??(x?.id===n.id?x:null)),o&&x?.id!==n.id&&Se(o.brief,o),!o&&x?.id!==n.id&&(p.replaceChildren(),x=null,v.replaceChildren(Object.assign(k(t,`p`,`prb-qr-loading`,`Loading the brief…`),{role:`status`}))),S=!!(o||x?.id===n.id),T();let s=x?.id===n.id?x:o?.brief,c=new URLSearchParams({id:n.id,...n.lineage?{lineage:n.lineage}:{},...s?{since:s.stamp}:{}}),l;try{l=await r(`/quick-review?${c}`,{signal:a.signal,credentials:`same-origin`})}catch{if(i!==pe)return;if(S=!1,s){E(jt),x=s;for(let e of ne)e.disabled=!0;_.textContent=jt}else Ce(jt);return}if(i!==pe||w()?.id!==n.id)return;if(l.status===304&&s){S=!1,T();return}if(l.status===404)return C.delete(n.id),S=!1,Ce(`This review no longer exists. Previous and Next still work.`);if(!l.ok){S=!1;let e=await l.json().catch(()=>null);return i===pe?Ce(e?.error??`The brief could not be loaded.`):void 0}let u=await l.json();if(i!==pe||u.id!==w()?.id)return;S=!1;let d=!!s&&!Pt(s.snapshot,u.snapshot);if(s&&x===s&&s.html===u.html){x=u,T(),C.set(n.id,{brief:u,scrollTop:v.scrollTop,open:xe()});return}Se(u,s?{scrollTop:v.scrollTop,open:xe()}:void 0),C.set(n.id,{brief:u,scrollTop:v.scrollTop,open:xe()}),d&&e&&E(`This review changed while you were reading: refreshed.`)}function De(t){t<0||t>=y.length||t===b||(we(),E(``),_.textContent=``,e.menus.closeAll(),b=t,Te=!1,O(),v.focus({preventScroll:!0}))}async function Oe(t){let n=x,i=w();if(!n?.snapshot||!i||n.id!==i.id||S||he)return;he=!0,T();let a=null;try{a=await r(`/outcome`,{method:`POST`,headers:{"content-type":`application/json`},credentials:`same-origin`,body:JSON.stringify({id:n.id,kind:t,expect:n.snapshot,lineage:i.lineage.split(` `).filter(Boolean)})})}catch{a=null}if(he=!1,!a){T(),_.textContent=jt;return}if(a.status===409){C.delete(n.id),w()?.id===n.id&&(await O(!1),_.textContent=At);return}if(!a.ok){let e=await a.json().catch(()=>null);T(),_.textContent=e?.error??`The outcome could not be recorded.`;return}let o=await a.json();e.onOutcome(n.id,o),C.delete(n.id),w()?.id===n.id&&(await O(!1),_.textContent=`Recorded: ${o.card?.label??`outcome`}.`)}async function ke(e){let t=w();if(t){try{let n=await r(`/dependencies`,{method:`POST`,headers:{"content-type":`application/json`},credentials:`same-origin`,body:JSON.stringify({fromId:t.id,...e})});if(!n.ok)return E((await n.json().catch(()=>null))?.error??`The link could not be changed.`)}catch{return E(jt)}C.clear(),w()?.id===t.id&&O(!1)}}async function Ae(e){let i=e.nextElementSibling;if(!i?.matches(`[data-qr-code]`)||!x)return;if(!i.hidden){i.hidden=!0,e.textContent=`Show code`;return}let a=new URL(x.header.href,n.location.href),o=Number(e.dataset.line??0),s=new URLSearchParams({t:a.searchParams.get(`t`)??``,path:e.dataset.path??``,...o?{line:String(o)}:{}});i.hidden=!1,i.innerHTML=`<p class="prb-code-status">Loading…</p>`,e.textContent=`Hide code`;try{let e=await r(`${a.pathname}/file?${s}`,{credentials:`same-origin`}),n=await e.json();if(!e.ok){i.innerHTML=``,i.append(k(t,`p`,`prb-code-status`,n.error??`The file could not be read.`));return}i.innerHTML=`<div class="prb-code-scroll"><table class="prb-code-table"><tbody>${Fe(n,o)}</tbody></table></div>`}catch{i.innerHTML=``,i.append(k(t,`p`,`prb-code-status`,jt))}}function je(e){let t=y.findIndex(t=>t.id===e);return t<0?!1:(De(t),!0)}Et(v),v.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-qr-show-code]`);if(n)return void Ae(n);let r=t.closest(`[data-qr-jump-finding]`);if(r){let e=v.querySelector(`[data-ref="${CSS.escape(r.dataset.qrJumpFinding??``)}"]`),t=e?.closest(`details.prb-qr-full`);t&&(t.open=!0),e?.scrollIntoView({block:`start`});return}let i=t.closest(`[data-qr-jump]`);if(i?.dataset.qrJump){je(i.dataset.qrJump)||E(`That review is not in this list as filtered. Open review shows it.`);return}let a=t.closest(`[data-qr-unlink]`);if(a)return void ke({action:`unlink`,toSubject:a.dataset.qrSubject,direction:a.dataset.qrDirection});let o=t.closest(`[data-qr-suppress], [data-qr-unsuppress]`);if(o){ke({action:o.hasAttribute(`data-qr-suppress`)?`suppress`:`unsuppress`,toSubject:o.dataset.qrSubject,direction:o.dataset.qrDirection});return}let s=t.closest(`[data-qr-confirm]`);if(s)return void ke({action:`link`,toId:s.dataset.qrTo});let c=t.closest(`[data-qr-dismiss]`);if(c)return void ke({action:`dismiss`,toSubject:c.dataset.qrSubject});let l=t.closest(`[data-qr-link]`);if(l){let e=l.closest(`.prb-qr-picker`),t=e?.querySelector(`[data-qr-link-direction]`)?.value,n=e?.querySelector(`[data-qr-link-target]`)?.value;n&&ke({action:`link`,toId:n,...t===`required-by`?{direction:t}:{}})}});for(let e of ne)e.addEventListener(`click`,()=>void Oe(e.dataset.outcome??``));return d.addEventListener(`click`,()=>De(b-1)),f.addEventListener(`click`,()=>De(b+1)),m.addEventListener(`click`,()=>i.close()),ce.addEventListener(`click`,()=>{oe.hidden=!0,v.focus({preventScroll:!0})}),i.addEventListener(`click`,e=>{e.target===i&&i.close()}),n.addEventListener(`resize`,()=>{i.open&&ve()}),i.addEventListener(`close`,()=>{if(i.open)return;we(),pe++,me?.abort(),e.menus.closeAll(),p.replaceChildren();let t=e.area();t&&(t.scrollTop=fe);let n=w()?.card,r=t?.getBoundingClientRect(),a=(e=>{if(!e?.isConnected||!r)return!1;let t=e.getBoundingClientRect();return t.height>0&&t.bottom>r.top&&t.top<r.bottom})(n)?n:de?.isConnected?de:null;a&&e.focusCard(a),x=null,y=[],Te=!1,e.onClose()}),{open(t){i.open||(y=Nt(e.walk()),b=Math.max(0,y.findIndex(e=>e.id===t.dataset.id)),y.length&&(de=t,fe=e.area()?.scrollTop??0,E(``),_.textContent=``,x=null,ve(),i.showModal(),ge(),v.focus({preventScroll:!0}),O()))},isOpen:()=>i.open,close:()=>i.close(),step:e=>De(b+e),scroll(e){v.scrollBy({top:e*v.clientHeight*.4,behavior:`instant`})},openMenu(){let t=w();if(!t)return;let n=be(t);n&&e.menus.open(n,{focusFirst:!0,returnFocus:()=>v.focus({preventScroll:!0})})},revalidate(){!i.open||!w()||(D?Te=!0:O())},removed(t){let n=y.findIndex(e=>e.id===t);if(!i.open||n<0)return;if(C.delete(t),e.menus.closeAll(),y.splice(n,1),!y.length)return void i.close();let r=n===b&&b===y.length;(n<b||r)&&b--,x=null,p.replaceChildren(),_.textContent=``,E(r?`Deleted. Showing the previous review.`:`Deleted. Showing the next review.`),O(!1),v.focus({preventScroll:!0})}}}var It=C({ownsRestore:!0});be(`/restart`);var A=[...document.querySelectorAll(`[data-card][data-placement="home"]`)].sort((e,t)=>Number(e.dataset.rank)-Number(t.dataset.rank)),j=new Map;function Lt(){j=new Map;for(let e of document.querySelectorAll(`[data-card]`)){let t=e.dataset.id??``;j.set(t,[...j.get(t)??[],e])}}Lt();function Rt(e){let t=e.closest(`[data-card]`);if(t)return t;let n=e.closest(`[data-card-ref]`)?.dataset.cardRef;return n?j.get(n)?.[0]??null:null}function zt(e,t){for(let n of j.get(e)??[])t(n)}function M(){return[...j.values()].flat()}var N=Ye(document),Bt=[...document.querySelectorAll(`[data-operation]`)],Vt=document.querySelector(`[data-section="in-progress"]`),Ht=e=>e.dataset.inProgressOnly!==void 0,Ut=Object.fromEntries(D.map(e=>[e,document.querySelector(`[data-cards="${e}"]`)])),Wt=document.querySelector(`.prb-index`);function Gt(e){return{id:e.dataset.id??``,collections:Xe(e),queue:e.dataset.queue===void 0?void 0:Number(e.dataset.queue),status:e.dataset.status??`new`,prState:e.dataset.prState}}var P=document.querySelector(`[data-search]`),F=document.querySelector(`[data-status-filter]`),I=document.querySelector(`[data-author-filter]`),L=document.querySelector(`[data-pr-filter]`),Kt=document.querySelector(`[data-no-matches]`),qt=document.querySelector(`[data-count]`),Jt=document.querySelector(`[data-clear-filters]`),Yt=document.querySelector(`[data-collections-filter]`),Xt=document.querySelector(`[data-collections-filter-search]`);function Zt(){if(!Yt)return;Yt.hidden=N.length===0;let e=Yt.querySelector(`[data-collections-filter-label]`);e&&(e.textContent=t(B.collections,N)),B.collections.length===0?delete Yt.dataset.active:Yt.dataset.active=``;let n=Yt.querySelector(`[data-collections-filter-options]`);n&&nt(n,N,B.collections,Xt?.value??``)}var R=De();function Qt(e){return{stored:y({state:e.dataset.lifecycle,at:Number(e.dataset.lifecycleAt)}),activity:me(e.dataset)??{at:0,kind:`created`}}}function $t(e){return e.dataset.pinned===`true`}function en(e){let{stored:t,activity:n}=Qt(e);return g($t(e),t,n,Xe(e).length>0,B.filter)}function tn(e){let t=en(e);return t===void 0?.5:D.indexOf(t)}function nn(e){return[...e].sort((e,t)=>tn(e)-tn(t))}var rn=new Map,z=document.querySelector(`[data-bulk]`),an=document.querySelector(`[data-bulk-count]`),on=document.querySelector(`[data-bulk-detail]`),sn=document.querySelector(`[data-bulk-delete]`),cn=document.querySelector(`[data-bulk-delete-label]`),ln=document.querySelector(`[data-bulk-exit]`),un=document.querySelector(`[data-bulk-more]`),dn=document.querySelector(`[data-bulk-question]`),fn=document.querySelector(`[data-bulk-confirm]`),pn=document.querySelector(`[data-bulk-actions]`),mn=document.querySelector(`[data-bulk-error]`),hn=document.querySelector(`[data-bulk-select-all]`),B=ve(window.location.hash),V=new Set,H=!1,gn=document.querySelector(`[data-bulk-fetch]`),_n={},vn=[],yn=!1;function U(){let e=B.query.trim().toLowerCase();B.author!==``&&![...I?.options??[]].some(e=>e.value===B.author)&&(B.author=``),B.collections=B.collections.filter(e=>e===`none`||N.some(t=>t.id===e)),N.length===0&&(B.collections=[]);let t=nn(u(A.map(e=>({...Gt(e),searchText:e.dataset.searchText??``,author:e.dataset.author,card:e})),{...B,query:e}).map(e=>e.card)),r=t.filter(e=>!Ht(e));vn=r;let i=new Set(u(Bt.map(e=>({...Gt(e),searchText:e.dataset.searchText??``,author:e.dataset.author,entry:e})),{...B,query:e}).map(e=>e.entry));for(let e of Bt)e.hidden=!i.has(e);if(Vt){Vt.hidden=i.size===0;let e=Vt.querySelector(`[data-section-count]`);e&&(e.textContent=String(i.size))}let a=r.filter(e=>en(e)!==void 0),o=te(a,e=>en(e),R),s=new Set(D.flatMap(e=>o[e].shown));for(let e of D){let t=Ut[e];t&&Ke(t,o[e].shown);let n=document.querySelector(`[data-load-more="${e}"]`);n&&(n.hidden=o[e].total<=o[e].shown.length);let r=document.querySelector(`[data-section="${e}"]`);r&&(r.hidden=o[e].total===0);let i=r?.querySelector(`[data-section-count]`);i&&(i.textContent=String(o[e].total))}for(let e of bn(r))s.add(e);for(let e of M())e.hidden=!s.has(e);if(P&&P.value!==B.query&&(P.value=B.query),I&&(I.value=B.author,B.author===``?delete I.dataset.active:I.dataset.active=``),L||(B.pr=`any`),L&&(L.value=B.pr,B.pr===`any`?delete L.dataset.active:L.dataset.active=``),F&&(F.value=B.filter,B.filter===`all`?delete F.dataset.active:F.dataset.active=``),Zt(),Jt&&(Jt.hidden=!n(B)),qt){let e=e=>e.reduce((e,t)=>e+Number(t.dataset.reviews??1),0);qt.textContent=m(e(t),t.length,n(B)?e(A):void 0)}Kt&&(Kt.hidden=t.length>0||i.size>0||A.length===0),Gn(r)}function bn(e){let t=document.querySelector(`[data-collections-area]`);if(!t)return[];let r=d(B.filter),i=n(B),o=e.flatMap(e=>Xe(e).map(t=>({card:e,collection:t}))),s=e=>{let{stored:t,activity:n}=Qt(e);return S($t(e),t,n,B.filter)},c=l(o,({card:e,collection:t})=>{let n=s(e);return n===void 0?void 0:`${n===`completed`?`collection-done`:`collection`}:${t}`},e=>rn.get(e)??15),u=(e,t)=>(j.get(e)??[]).find(e=>e.dataset.placement===`collection:${t}`),f=[],m=!1;for(let e of t.querySelectorAll(`[data-collection]`)){let t=e.dataset.collection??``,n=c.get(`collection:${t}`)??{shown:[],total:0},s=c.get(`collection-done:${t}`)??{shown:[],total:0},l=o.filter(e=>e.collection===t),d=l.filter(e=>$t(e.card)).length,h=B.collections.length>0&&!B.collections.includes(t),te=!r&&!h&&(!i||l.length>0);if(e.hidden=!te,!te)continue;m=!0;for(let[r,i]of[[`collection:${t}`,n],[`collection-done:${t}`,s]]){let n=i.shown.map(e=>u(e.card.dataset.id??``,t)).filter(e=>e!==void 0),a=e.querySelector(`[data-cards="${r}"]`);a&&Ke(a,n),f.push(...n);let o=e.querySelector(`[data-load-more="${r}"]`);o&&(o.hidden=i.total<=i.shown.length)}let g=e.querySelector(`[data-section="collection:${t}"] > summary [data-section-count]`);g&&(g.textContent=a(n.total,d));let ne=e.querySelector(`[data-collection-empty]`),_=ee({active:n.total,completed:s.total,pinned:d,members:l.length},i);ne&&(ne.hidden=_===void 0,ne.textContent=_??``);let re=e.querySelector(`[data-section="collection-done:${t}"]`);re&&(re.hidden=s.total===0);let ie=e.querySelector(`[data-completed-label]`);ie&&(ie.textContent=p(s.total))}return t.hidden=r||!m,f}var xn=300,W=null;function Sn(){W!==null&&window.clearTimeout(W),W=null,It.replace(f(B),{})}function Cn(e,t){if(B={...B,...e},R=De(),rn=new Map,U(),t===`now`)return Sn();W!==null&&window.clearTimeout(W),W=window.setTimeout(Sn,xn)}window.addEventListener(`pagehide`,()=>{W!==null&&Sn()}),document.addEventListener(`click`,e=>{W!==null&&e.target?.closest?.(`a[href]`)&&Sn()},!0),P?.addEventListener(`input`,()=>Cn({query:P.value},`settled`)),P?.addEventListener(`keydown`,e=>{e.key===`Escape`&&P.value!==``&&(e.preventDefault(),Cn({query:``},`now`))}),F?.addEventListener(`change`,()=>{Cn({filter:F.value},`now`)}),I?.addEventListener(`change`,()=>{Cn({author:I.value},`now`)}),L?.addEventListener(`change`,()=>{Cn({pr:L.value},`now`)}),Jt?.addEventListener(`click`,()=>{Cn({query:r.query,filter:r.filter,author:r.author,pr:r.pr,collections:r.collections},`now`),P?.focus()}),Ge(),document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-load-more]`)?.dataset.loadMore;if(t&&t.startsWith(`collection`)&&re(t))return rn.set(t,(rn.get(t)??15)+15),U();!t||!D.includes(t)||(R={...R,[t]:R[t]+15},U())});for(let e of[`popstate`,`hashchange`])window.addEventListener(e,()=>{B=ve(window.location.hash),R=De(),rn=new Map,U(),jn()});document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-pin]`);if(!t?.dataset.pin)return;e.preventDefault(),e.stopPropagation();let n=t.dataset.pin;qe(t,e=>fetch(`/pin`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:n,pinned:e})}).then(e=>e.ok),e=>{zt(n,n=>{n.dataset.pinned=String(e);let r=n.querySelector(`[data-pin]`);r&&r!==t&&Je(r,e),xr(n)}),U()})});async function wn(e,t){let n;try{let r=await fetch(`/queue`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:e,action:t})});if(!r.ok)return Dn(await On(r));n=(await r.json()).queue}catch{return Dn(En)}kn(n),U()}var Tn=`That could not be saved. The workspace server refused it.`,En=`The workspace server did not answer. It may have stopped.`;function Dn(e){ce(ye(),{kind:`failed`,text:e})}async function On(e){let t=await e.json().catch(()=>null);return typeof t?.error==`string`?t.error:Tn}function kn(e){let t=new Map(e.map((e,t)=>[e,t]));for(let e of M()){let n=t.get(e.dataset.id??``);n===void 0?delete e.dataset.queue:e.dataset.queue=String(n),n!==void 0&&e.dataset.lifecycle!==`active`&&(e.dataset.lifecycle=`active`,delete e.dataset.lifecycleAt,xr(e))}for(let e of document.querySelectorAll(`[data-queue-action][data-queue-id]`)){let n=t.has(e.dataset.queueId??``);e.dataset.queueAction=n?`remove`:`add`,e.textContent=oe(n)}let n=document.querySelector(`[data-queue-option]`);n&&(n.textContent=ae(e.length))}document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-history-toggle]`);if(!t)return;e.preventDefault(),e.stopPropagation();let n=t.parentElement?.querySelector(`[data-history-list]`);n&&st(t,n.hidden!==!1)});var An=document.querySelector(`.prb-shell > main`);function jn(){dt(document,It.current().ui,{cards:M(),pane:An,limits:R,reveal:(e,t)=>{R=e,rn=t,U()}})}It.setCapturer(()=>ct(document,M(),R,An,rn)),U(),jn();var G=Ve(document,{onOpen:Vn,onClose:e=>{Vn(e),window.setTimeout(oi,0)}});function Mn(){return document.querySelector(`[data-menu-trigger][aria-expanded="true"]`)!==null}var Nn=0;async function Pn(e){Nn+=1;try{await e()}finally{--Nn,oi()}}var Fn=new Set,In=`A change to this review is still being saved.`,Ln=`A change to one of these reviews is still being saved. Try again once it is.`;async function Rn(e,t){if(e.some(e=>Fn.has(e)))return!1;for(let t of e)Fn.add(t);zn(e);try{await t()}finally{for(let t of e)Fn.delete(t);zn(e)}return!0}function zn(e){let t=new Set(e);for(let e of M()){let n=e.dataset.id??``;if(!t.has(n))continue;let r=Fn.has(n);for(let t of e.querySelectorAll(`.prb-card-controls button.prb-state-pill`))r?t.setAttribute(`aria-disabled`,`true`):t.removeAttribute(`aria-disabled`);for(let t of e.querySelectorAll(`.prb-card-controls :is([data-mark-status], [data-lifecycle-set], [data-queue-action])`))t.disabled=r}}async function Bn(e,t){await Rn([e],()=>Pn(t))||Dn(In)}function Vn(e){let t=e.querySelector(`[data-menu-items]`),n=e.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!1),n&&(n.hidden=!0);let r=e.querySelector(`[data-collection-rename-form]`);r&&(r.hidden=!0,zr(r,void 0)),e.querySelector(`[data-menu-error]`)?.remove(),e.querySelector(`[data-id-field]`)?.remove()}document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-menu]`);if(!n||n.closest(`[data-bulk]`)||n.matches(`[data-collections-filter]`))return;if(n.matches(`.prb-collection-menu`))return Ur(e,t,n);if(n.matches(`[data-lifecycle-control]`))return yr(e,t,n);let r=t.closest(`[data-collections-for]`);if(r?.dataset.collectionsFor){e.preventDefault(),e.stopPropagation(),G.closeAll();let t=Rt(r)?.querySelector(`[data-select]`)?.getAttribute(`aria-label`)?.replace(/^Select /,``);Wr([r.dataset.collectionsFor],{card:t??`this review`});return}let i=t.closest(`[data-copy-id]`);if(i?.dataset.copyId){e.preventDefault(),e.stopPropagation(),ke(i,i.dataset.copyId);return}let a=t.closest(`[data-fetch-review]`);if(a?.dataset.fetchReview){e.preventDefault(),e.stopPropagation(),G.closeAll();let t=Rt(a);t&&ei([t]);return}let o=t.closest(`[data-mark-status]`);if(o?.dataset.markId){e.preventDefault(),e.stopPropagation(),G.closeAll();let t=o.dataset.markId;Bn(t,()=>pr(t,o.dataset.markStatus===`complete`));return}let s=t.closest(`[data-lifecycle-set]`);if(s?.dataset.lifecycleId){e.preventDefault(),e.stopPropagation(),G.closeAll();let t=s.dataset.lifecycleId;Bn(t,vr(t,s.dataset.lifecycleSet));return}let c=t.closest(`[data-queue-action]`);if(c?.dataset.queueId){e.preventDefault(),e.stopPropagation(),G.closeAll();let t=c.dataset.queueId;Bn(t,()=>wn(t,c.dataset.queueAction===`remove`?`remove`:`add`));return}if(t.closest(`[data-delete]`)){e.preventDefault(),e.stopPropagation();let t=n.querySelector(`[data-menu-items]`),r=n.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!0),r&&(r.hidden=!1),e.detail===0&&n.querySelector(`[data-cancel-delete]`)?.focus();return}if(t.closest(`[data-cancel-delete]`)){e.preventDefault(),e.stopPropagation(),Vn(n),e.detail===0&&n.querySelector(`[data-delete]`)?.focus();return}if(t.closest(`[data-confirm-delete]`)){e.preventDefault(),e.stopPropagation(),Hn(n);return}e.preventDefault(),e.stopPropagation()});async function Hn(e){let t=e.querySelector(`[data-delete]`),n=t?.dataset.delete;if(!n)return;let r=e.querySelector(`[data-menu-confirm]`),i=e.querySelector(`[data-confirm-delete]`);i&&(i.disabled=!0,i.textContent=`Deleting`);try{let r=await fetch(`/delete`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:n,scope:t?.dataset.scope??`review`})});if(r.ok){if(e.closest(`[data-qr-menu]`))return zt(n,e=>e.remove()),A=A.filter(e=>e.isConnected),Lt(),U(),J.removed(n);window.location.reload();return}Un(e,(await r.json().catch(()=>null))?.error??`That could not be deleted.`)}catch{Un(e,`The workspace server did not answer. It may have stopped.`)}i&&(i.disabled=!1,i.textContent=`Delete`),r&&(r.hidden=!0);let a=e.querySelector(`[data-menu-items]`);a&&(a.hidden=!1)}function Un(e,t){e.querySelector(`[data-menu-error]`)?.remove();let n=document.createElement(`p`);n.className=`prb-menu-error`,n.setAttribute(`data-menu-error`,``),n.textContent=t,e.querySelector(`[data-menu-panel]`)?.append(n)}function Wn(e){H=e,e||V.clear(),Wt&&(e?Wt.dataset.selecting=``:delete Wt.dataset.selecting),document.querySelector(`[data-select-mode]`)?.setAttribute(`aria-pressed`,String(e)),!e&&un&&G.close(un);for(let t of document.querySelectorAll(`.prb-card-link`))e?t.setAttribute(`aria-disabled`,`true`):t.removeAttribute(`aria-disabled`);K(),U()}function K(){fn&&(fn.hidden=!0),pn&&(pn.hidden=!1),mn&&(mn.hidden=!0,mn.textContent=``)}function Gn(t){for(let e of M()){let t=V.has(e.dataset.id??``),n=e.querySelector(`[data-select]`);n&&(n.checked=t),t?e.dataset.selected=``:delete e.dataset.selected}if(!z||(z.hidden=!H,!H))return;let n=new Set(M().filter(Kn).map(e=>e.dataset.id)),r=[...V].filter(e=>!n.has(e)).length,i=new Set(t.map(e=>e.dataset.id)),a=[...V].every(e=>i.has(e))?i.size:null;V.size===0?z.dataset.empty=``:delete z.dataset.empty,an&&(an.textContent=E(V.size)),on&&(on.textContent=le(V.size,a,r)),hn&&(hn.textContent=e(t.length,V.size>0&&a!==null),hn.disabled=t.every(e=>V.has(e.dataset.id??``))),cn&&(cn.textContent=h(ur()));for(let e of z.querySelectorAll(`[data-bulk-mark], [data-bulk-lifecycle], [data-bulk-queue], [data-bulk-collections], [data-bulk-delete]`))e.disabled=V.size===0;gn&&(gn.hidden=!Ie(_n,Xr(lr())))}function Kn(e){return!e.hidden&&e.closest(`details:not([open]), [hidden]`)===null}function qn(e){let t=[...e.querySelectorAll(`details[data-section]`)];for(let e of t)e.addEventListener(`toggle`,()=>Gn(vn));We(t,(e,t)=>fetch(`/sections`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({section:e,collapsed:t})}))}qn(document),document.querySelector(`[data-select-mode]`)?.addEventListener(`click`,()=>{Wn(!H)}),hn?.addEventListener(`click`,()=>{for(let e of vn)e.dataset.id&&V.add(e.dataset.id);K(),U()});function Jn(e){V.has(e)?V.delete(e):V.add(e),K(),U()}document.addEventListener(`change`,e=>{let t=e.target.closest(`[data-select]`);t?.dataset.select&&Jn(t.dataset.select)}),document.addEventListener(`click`,e=>{if(!H)return;let t=e.target,n=t.closest(`[data-card]`);n?.dataset.id&&(t.closest(`[data-select], .prb-card-controls, [data-menu], [data-history-toggle]`)||(e.preventDefault(),Jn(n.dataset.id)))}),document.addEventListener(`keydown`,e=>{if(!H||e.key!==`Enter`)return;let t=e.target.closest(`.prb-card-link`)?.closest(`[data-card]`);t?.dataset.id&&(e.preventDefault(),Jn(t.dataset.id))});var q=Ue({doc:document,item:`[data-card]`,link:`.prb-card-link`,walk:()=>[...document.querySelectorAll(`[data-card]`)].filter(Kn),enterAllowed:()=>!H,background:()=>An,leadIn:e=>[...e.closest(`[data-cards]`)?.querySelectorAll(`[data-card]:not([hidden])`)??[]][0]===e?e.closest(`details[data-section]`)?.querySelector(`summary`)??null:null});function Yn(){return q.holdsKeys()?q.current()?.querySelector(mr)??null:null}var J=Ft({doc:document,win:window,area:()=>An,walk:()=>[...document.querySelectorAll(`[data-card]`)].filter(Kn),cardMenu:e=>e.querySelector(mr),menus:G,focusCard:e=>e.querySelector(`.prb-card-link`)?.focus({preventScroll:!0}),showShortcuts:()=>cr.showShortcuts(),onOutcome:(e,t)=>Qn(e,t),onClose:()=>oi()}),Xn=ue(navigator);Ot(document,Xn);function Zn(){return q.current()??[...document.querySelectorAll(`[data-card]`)].find(Kn)??null}document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`[data-quick-review-open]`);if(!t)return;e.preventDefault(),e.stopPropagation(),G.closeAll();let n=t.dataset.quickReviewOpen?j.get(t.dataset.quickReviewOpen)?.[0]??null:Zn();n&&J.open(t.closest(`[data-card]`)??n)},!0);function Qn(e,t){let n=j.get(e)??[];t.complete&&fr(n,!0),zt(e,e=>{e.querySelector(`.prb-card-outcome`)?.remove(),e.querySelector(`.prb-card-deferral`)?.remove();let n=[];if(t.card){let e=document.createElement(`span`);e.className=`prb-card-outcome`,e.dataset.outcome=t.card.kind,e.dataset.standing=t.card.standing,e.textContent=t.card.label,n.push(e)}if(t.deferral){let e=document.createElement(`span`);e.className=`prb-card-deferral`,e.dataset.outcome=t.deferral.kind,e.textContent=`Next: ${t.deferral.label}`,n.push(e)}e.querySelector(`:scope > .prb-card-controls > .prb-card-status`)?.after(...n)})}var $n=8;function er(e){let t=e.querySelector(`.prb-card-link`);t&&(t.focus({preventScroll:!0}),document.activeElement!==t&&document.activeElement?.blur(),W!==null&&Sn(),It.leaving(),tr=!0,window.location.assign(t.href))}var tr=!1,nr={title:`Search reviews`,mount(e,t){let n=document.createElement(`input`);n.type=`search`,n.className=`prb-palette-input`,n.placeholder=P?.placeholder??``,n.setAttribute(`aria-label`,`Search reviews`),n.spellcheck=!1,n.value=P?.value??``;let r=document.createElement(`p`);r.className=`prb-palette-summary`,r.setAttribute(`aria-live`,`polite`);let i=document.createElement(`div`);i.className=`prb-palette-results`,i.setAttribute(`role`,`group`),i.setAttribute(`aria-label`,`Matching reviews`);let a=()=>{let e=vn.slice(0,$n);i.replaceChildren(...e.map(e=>{let t=document.createElement(`button`);t.type=`button`,t.className=`prb-palette-result`,t.dataset.resultId=e.dataset.id??``;let n=document.createElement(`span`);n.className=`prb-palette-result-title`,n.textContent=e.querySelector(`.prb-card-head h2`)?.textContent??``;let r=document.createElement(`span`);return r.className=`prb-palette-result-where`,r.textContent=[e.querySelector(`.prb-card-repo`)?.textContent,e.querySelector(`.prb-card-branch`)?.textContent].filter(Boolean).join(` · `),t.append(n,r),t})),r.textContent=vn.length===0?`No reviews match.`:vn.length>e.length?`The first ${e.length} of ${qt?.textContent??vn.length}`:qt?.textContent??``},o=()=>[...i.querySelectorAll(`.prb-palette-result`)],s=e=>{let n=A.find(t=>t.dataset.id===e?.dataset.resultId);n&&(t(),er(n))};n.addEventListener(`input`,()=>{P&&(P.value=n.value,P.dispatchEvent(new Event(`input`,{bubbles:!0})),a())}),i.addEventListener(`click`,e=>s(e.target.closest(`.prb-palette-result`)??void 0)),e.addEventListener(`keydown`,e=>{if(e.isComposing)return;let t=o(),r=t.indexOf(e.target);if(e.key===`Enter`&&e.target===n)return e.preventDefault(),s(t[0]);let i=e.key===`ArrowDown`?r<0?t[0]:t[r+1]:e.key===`ArrowUp`?r<=0?n:t[r-1]:null;i&&(e.preventDefault(),i.focus())}),e.append(n,r,i),a(),n.focus(),n.select()}},rr={title:`Filters`,mount(e){let t=document.createElement(`p`);t.className=`prb-palette-summary`,t.setAttribute(`aria-live`,`polite`);let n=()=>{t.textContent=qt?.textContent??``},r=[F,I,L].flatMap(e=>{if(!e)return[];let t=document.createElement(`label`);t.className=`prb-palette-field`;let r=document.createElement(`span`),i=(e.getAttribute(`aria-label`)??``).replace(/^Filter by /,``);r.textContent=i.charAt(0).toUpperCase()+i.slice(1);let a=document.createElement(`select`);for(let t of e.options)a.append(new Option(t.text,t.value));return a.value=e.value,a.addEventListener(`change`,()=>{e.value=a.value,e.dispatchEvent(new Event(`change`,{bubbles:!0})),n()}),t.append(r,a),[t]});e.append(...r,t),n(),r[0]?.querySelector(`select`)?.focus()}};function ir(e){let t=()=>document.querySelector(`details[data-section="${e}"]`);return{available:()=>!!(t()&&!t().hidden),state:()=>{let e=t();return e&&!e.hidden?e.open?`Expanded`:`Collapsed`:null},run:()=>{let e=t();e&&(e.open=!e.open)}}}var ar=Object.fromEntries(ne.map(e=>[`reviews.section.${e}`,ir(e)]));function or(){return[...document.querySelectorAll(`[data-collections-area]:not([hidden]) [data-collection]:not([hidden])`)].flatMap(e=>{let t=e.querySelector(`:scope > details[data-section]`);if(!t)return[];let n=t.querySelector(`[data-collection-name]`)?.textContent??``,r=t.querySelector(`:scope > summary [data-section-count]`)?.textContent??``;return[{id:e.dataset.collection??``,name:n,count:r,open:t.open}]})}var sr=document.querySelector(`[data-collection-new]`),cr=he(`reviews`,{...ar,"reviews.search":{available:()=>P!==null,panel:nr},"reviews.filters":{available:()=>F!==null,panel:rr},"reviews.collection.new":{available:()=>sr!==null&&!sr.disabled,run:()=>sr?.click()},"reviews.collection.fold":{available:()=>or().length>0,panel:at({collections:or,toggle:e=>{let t=document.querySelector(`[data-collection="${CSS.escape(e)}"] > details[data-section]`);t&&(t.open=!t.open)}})},"reviews.next":{run:()=>q.move(1)},"reviews.previous":{run:()=>q.move(-1)},"reviews.open":{available:()=>q.enterOpens(),run:()=>q.open()},"reviews.openInNewTab":{available:()=>q.enterOpens(),run:()=>q.openInNewTab()},"reviews.selection.exit":{available:Dr,run:()=>fn&&!fn.hidden?Tr(z?.contains(document.activeElement)??!1):Er()},"reviews.quickReview":{available:()=>q.holdsKeys()&&q.current()!==null,run:()=>{let e=q.current();e&&J.open(e)}},"quick.down":{run:()=>J.scroll(1)},"quick.downArrow":{run:()=>J.scroll(1)},"quick.up":{run:()=>J.scroll(-1)},"quick.upArrow":{run:()=>J.scroll(-1)},"quick.previous":{run:()=>J.step(-1)},"quick.previousArrow":{run:()=>J.step(-1)},"quick.next":{run:()=>J.step(1)},"quick.nextArrow":{run:()=>J.step(1)},"quick.menu":{run:()=>J.openMenu()},"quick.shortcuts":{run:()=>cr.showShortcuts()},"reviews.menu":{available:()=>Yn()!==null,run:()=>{let e=Yn();e&&G.open(e,{focusFirst:!0,returnFocus:()=>q.refocus()})}}},{onOpen:()=>G.closeAll(),onSettle:()=>oi()});function lr(){return nn(A.filter(e=>V.has(e.dataset.id??``)))}function ur(){return lr().reduce((e,t)=>e+Number(t.dataset.reviews??1),0)}function Y(e){mn&&(mn.textContent=e,mn.hidden=!1)}function X(e){for(let t of z?.querySelectorAll(`button`)??[])t.disabled=e}async function dr(e){let t=[...V];if(t.length===0)return;X(!0);let n=null,r=await Rn(t,async()=>{try{(await fetch(`/status`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:t,complete:e})})).ok||(n=`That could not be saved. The workspace server refused it.`)}catch{n=`The workspace server did not answer. It may have stopped.`}});if(!r||n!==null)return X(!1),Y(r?n??``:Ln);fr(lr(),e),X(!1),Wn(!1)}function fr(e,t){let n=t?`complete`:`in-progress`,r=t?`in-progress`:`complete`;for(let t of e.flatMap(e=>j.get(e.dataset.id??``)??[e])){t.dataset.status=n;for(let e of t.querySelectorAll(`.prb-card-status`))Ae(e,n);let e=t.querySelector(`[data-mark-status]`);e&&(e.dataset.markStatus=r,e.textContent=_(r))}}async function pr(e,t){try{let n=await fetch(`/status`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:[e],complete:t})});if(!n.ok)return Dn(await On(n))}catch{return Dn(En)}fr(A.filter(t=>t.dataset.id===e),t),U()}var mr=`:scope > .prb-card-controls > [data-menu]:not([data-lifecycle-control])`;async function hr(e,t){let n=e.closest(`[data-card]`),r=n?.dataset.id;if(!n||!r||Fn.has(r))return;let i=document.activeElement===e,a=gr(n);Re(e,!0);try{await Bn(r,t)}finally{Re(e,!1)}i&&_r(e,a)}function gr(e){let t=e=>e instanceof HTMLElement&&e.matches(`[data-card]`)&&e.checkVisibility();for(let n=e.nextElementSibling;n;n=n.nextElementSibling)if(t(n))return n;for(let n=e.previousElementSibling;n;n=n.previousElementSibling)if(t(n))return n;return null}function _r(e,t){if(document.activeElement===null||document.activeElement===document.body){if(e.isConnected&&e.checkVisibility())return e.focus({preventScroll:!0});t?.querySelector(`.prb-card-link`)?.focus({preventScroll:!0})}}function vr(e,t){return async()=>{await br([e],t)||Dn(`That could not be saved. The workspace server refused it or did not answer.`)}}document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-card] button.prb-card-status`),n=t?.closest(`[data-card]`)?.dataset.id;!t||!n||(e.preventDefault(),hr(t,()=>pr(n,t.dataset.status!==`complete`)))});function yr(e,t,n){let r=n.querySelector(`[data-lifecycle-pill]`),i=n.closest(`[data-card]`)?.dataset.id;if(!r||!i)return;let a=t.closest(`[data-lifecycle-set]`);if(a){e.preventDefault(),e.stopPropagation(),G.close(n,{returnFocus:!0}),hr(r,vr(i,a.dataset.lifecycleSet));return}let o=r.dataset.lifecyclePress;!t.closest(`[data-lifecycle-pill]`)||!o||o===`menu`||(e.preventDefault(),hr(r,vr(i,o)))}async function br(e,t){let n;try{let r=await fetch(`/lifecycle`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:e,state:t})});n=r.ok?await r.json().catch(()=>null):null}catch{n=null}if(!n)return!1;let r=new Set(e);for(let e of M())r.has(e.dataset.id??``)&&(e.dataset.lifecycle=t,t===`active`?delete e.dataset.lifecycleAt:e.dataset.lifecycleAt=String(n.at),xr(e));return kn(n.queue),U(),!0}function xr(e){let{stored:t,activity:n}=Qt(e),r=e.querySelector(`[data-lifecycle-pill]`);r&&ze(r,t,n);let i=e.querySelector(`[data-lifecycle-chip]`);if(i){let e=v(t,n);i.textContent=e??``,i.hidden=e===void 0}for(let r of e.querySelectorAll(`[data-menu-items] [data-lifecycle-set]`)){let e=r.dataset.lifecycleSet;r.hidden=!Se(e,t,n),r.textContent=_e(e,t,n)}}async function Sr(e){let t=[...V];if(t.length===0)return;X(!0);let n=!1,r=await Rn(t,async()=>{n=await br(t,e)});if(X(!1),!r)return Y(Ln);if(!n)return Y(`That could not be saved. The workspace server refused it or did not answer.`);Wn(!1)}async function Cr(){let e=[...V];if(e.length===0)return;X(!0);let t=null;try{let n=await fetch(`/delete`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:e})});if(t=n.ok?await n.json().catch(()=>null):null,!t)return X(!1),K(),Y(`Nothing was deleted. The workspace server refused it.`)}catch{return X(!1),K(),Y(`The workspace server did not answer. It may have stopped.`)}let n=t.blocked??[],r=new Set(n.map(e=>e.id));for(let e of lr()){let t=e.dataset.id??``;r.has(t)||zt(t,e=>e.remove())}A=A.filter(e=>e.isConnected),Lt(),V.clear();for(let e of r)V.add(e);if(X(!1),K(),n.length===0)return Wn(!1);U(),Y([...new Set(n.map(e=>e.error))].join(` `))}async function wr(){let e=lr().map(e=>e.dataset.id??``).filter(Boolean);if(e.length===0)return;X(!0);let t=null,n=!1,r=await Rn(e,async()=>{try{let n=await fetch(`/queue`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:e,action:`add`})});t=n.ok?await n.json().catch(()=>null):null}catch{n=!0}});if(!r||n)return X(!1),K(),Y(r?`The workspace server did not answer. It may have stopped.`:Ln);if(!t?.queue)return X(!1),K(),Y(`Nothing was added. The workspace server refused it.`);kn(t.queue);let i=t.refused??[];V.clear();for(let e of i)V.add(e.id);if(X(!1),K(),i.length===0)return Wn(!1);U(),Y([...new Set(i.map(e=>e.error))].join(` `))}z?.addEventListener(`click`,e=>{let t=e.target;if(un&&t.closest(`[data-bulk-more] [data-menu-panel] button`)&&G.close(un),t.closest(`[data-bulk-queue]`))return void wr();if(t.closest(`[data-bulk-collections]`))return Wr(lr().map(e=>e.dataset.id??``).filter(Boolean),{selection:!0});let n=t.closest(`[data-bulk-mark]`);if(n)return void dr(n.dataset.bulkMark===`complete`);let r=t.closest(`[data-bulk-lifecycle]`);if(r)return void Sr(r.dataset.bulkLifecycle);if(t.closest(`[data-bulk-delete]`)){dn&&(dn.textContent=s(ur())),pn&&(pn.hidden=!0),fn&&(fn.hidden=!1),e.detail===0&&z.querySelector(`[data-bulk-cancel-delete]`)?.focus();return}if(t.closest(`[data-bulk-confirm-delete]`))return void Cr();if(t.closest(`[data-bulk-cancel-delete]`))return Tr(e.detail===0);if(t.closest(`[data-bulk-exit]`))return Er()});function Tr(e){K(),e&&sn?.focus()}function Er(){let e=z?.contains(document.activeElement)??!1;Wn(!1),e&&document.querySelector(`[data-select-mode]`)?.focus()}function Dr(e){return!H||ln?.disabled?!1:e===void 0||Oe(e,document,!0)}var Or=document.querySelector(`[data-collections-dialog]`),kr=document.querySelector(`[data-collections-dialog-list]`),Z=document.querySelector(`[data-collections-dialog-search]`),Ar=document.querySelector(`[data-collections-dialog-create]`),jr=document.querySelector(`[data-collections-dialog-error]`),Mr=document.querySelector(`[data-collections-dialog-for]`),Nr=[],Pr=!1,Fr=!1,Ir=document.body.dataset.cardsSnapshot??``;function Lr(e,t){return Ze(e,t,Ir)}function Rr(e){if(e.stale||e.area===void 0){try{let e={ids:[...V],selecting:H};window.sessionStorage.setItem(Qe,JSON.stringify(e))}catch{}Or?.close(),window.location.reload();return}let t=e.area,n=document.querySelector(`[data-collections-area]`);if(n){let e=n.contains(document.activeElement)?fe(document):null,r=document.createElement(`template`);r.innerHTML=t.trim();let i=r.content.firstElementChild;if(i){if(n.replaceWith(i),qn(i),Ot(i,Xn),H)for(let e of i.querySelectorAll(`.prb-card-link`))e.setAttribute(`aria-disabled`,`true`);e&&Ee(document,e.focus,e.focusVisible)}}N=e.collections;for(let t of A){let n=e.memberOf[t.dataset.id??``]??[];t.dataset.collections=n.join(` `);let r=t.querySelector(`[data-collections-line]`),i=x(n,N);r&&(r.textContent=i??``,r.hidden=i===void 0)}for(let t of Bt){let n=e.operations?.[t.dataset.key??``];n&&(t.dataset.collections=n.join(` `))}Lt(),Qr(),U()}function zr(e,t){let n=e.querySelector(`[data-collection-error]`);n&&(n.textContent=t??``,n.hidden=t===void 0)}Xt?.addEventListener(`input`,()=>Zt()),Yt?.addEventListener(`change`,e=>{let t=e.target.closest(`[data-collections-filter-option]`);if(!t)return;let n=t.checked?[...B.collections,t.value]:B.collections.filter(e=>e!==t.value);Cn({collections:[...new Set(n)]},`now`),Yt.querySelector(`[data-collections-filter-option][value="${CSS.escape(t.value)}"]`)?.focus()});var Q=document.querySelector(`[data-collection-new-dialog]`),$=Q?.querySelector(`[data-collection-name-input]`)??null,Br=Q?.querySelector(`[data-collection-create]`)??null,Vr=!1;function Hr(){sr&&(sr.disabled=Vr),$&&($.readOnly=Vr),Br&&(Br.disabled=Vr||($?.value.trim()??``)===``)}sr?.addEventListener(`click`,()=>{Q&&(G.closeAll(),$&&($.value=``),Hr(),zr(Q,void 0),Q.showModal(),$?.focus())}),$?.addEventListener(`input`,()=>{Hr(),Q&&zr(Q,void 0)}),Q?.querySelector(`[data-collection-cancel]`)?.addEventListener(`click`,()=>Q.close()),Q?.addEventListener(`close`,()=>oi()),document.addEventListener(`submit`,e=>{let t=e.target;if(t.matches(`[data-collection-new-form]`)){e.preventDefault();let n=$?.value??``;if(n.trim()===``)return;Vr=!0,Hr(),Lr(`/collections`,{action:`create`,name:n}).then(e=>{Vr=!1,Hr();let n=Q?.open===!0;if(!e.ok)return zr(t,e.error);Q?.close(),Rr(e.answer),n&&document.querySelector(`[data-collection="${CSS.escape(e.answer.id??``)}"] summary`)?.focus({focusVisible:!1})});return}let n=t.closest(`[data-collection-rename-form]`);if(n){e.preventDefault();let t=n.querySelector(`[data-collection-name-input]`)?.value??``,r=n.dataset.collectionRenameForm??``;Lr(`/collections`,{action:`rename`,id:r,name:t}).then(e=>{if(!e.ok)return zr(n,e.error);G.closeAll(),Rr(e.answer),document.querySelector(`[data-collection="${CSS.escape(r)}"] summary`)?.focus({focusVisible:!1})})}});function Ur(e,t,n){let r=n.querySelector(`[data-menu-items]`),i=n.querySelector(`[data-collection-rename-form]`),a=n.querySelector(`[data-menu-confirm]`);if(t.closest(`[data-collection-rename]`)&&i){e.preventDefault(),r&&(r.hidden=!0),i.hidden=!1;let t=i.querySelector(`[data-collection-name-input]`);t?.focus(),t?.select();return}if(t.closest(`[data-collection-delete]`)&&a){e.preventDefault(),r&&(r.hidden=!0),a.hidden=!1,e.detail===0&&n.querySelector(`[data-cancel-delete]`)?.focus();return}if(t.closest(`[data-collection-cancel], [data-cancel-delete]`)){e.preventDefault(),Vn(n);return}let o=t.closest(`[data-collection-confirm-delete]`);if(o?.dataset.collectionConfirmDelete){e.preventDefault(),o.disabled=!0;let t=o.dataset.collectionConfirmDelete;Lr(`/collections`,{action:`delete`,id:t}).then(e=>{if(o.disabled=!1,!e.ok)return Un(n,e.error);G.closeAll(),Rr(e.answer),B.collections.includes(t)&&Sn(),document.querySelector(`[data-collection-new]`)?.focus()})}}function Wr(e,t){!Or||e.length===0||(G.closeAll(),Nr=[...e],Pr=!1,Fr=`selection`in t,Mr&&(Mr.textContent=it(e.length,`card`in t?t.card:void 0)),Z&&(Z.value=``),qr(void 0),Kr(),Or.showModal(),Z?.focus())}function Gr(){return Nr.map(e=>Xe(A.find(t=>t.dataset.id===e)??document.createElement(`div`)))}function Kr(){let e=Z?.value??``;kr&&rt(kr,N,Gr(),e);let t=tt(e,N);Ar&&(Ar.hidden=t===void 0,Ar.textContent=t===void 0?``:`Create “${t}” and add ${Nr.length===1?`this review`:`these ${Nr.length}`}`)}function qr(e){jr&&(jr.textContent=e??``,jr.hidden=e===void 0)}async function Jr(e){qr(void 0);let t=await Lr(`/collections/members`,{ids:Nr,...e});if(!t.ok)return qr(t.error),Kr();Pr=!0,Rr(t.answer);let n=t.answer.refused??[];n.length>0&&(Nr=Nr.filter(e=>!n.some(t=>t.id===e)),qr([...new Set(n.map(e=>e.error))].join(` `))),Kr()}Z?.addEventListener(`input`,()=>Kr()),Z?.addEventListener(`keydown`,e=>{e.key===`Enter`&&(e.preventDefault(),Ar&&!Ar.hidden&&Ar.click())}),Ar?.addEventListener(`click`,()=>{let e=tt(Z?.value??``,N);e!==void 0&&Jr({action:`add`,create:e}).then(()=>{Z&&(Z.value=``),Kr(),Z?.focus()})}),kr?.addEventListener(`change`,e=>{let t=e.target.closest(`[data-collections-dialog-option]`);if(!t)return;let n=ie(t.dataset.membership??`none`),r=t.value;Jr({action:n,collection:r}).then(()=>{kr.querySelector(`[data-collections-dialog-option][value="${CSS.escape(r)}"]`)?.focus()})}),document.querySelector(`[data-collections-dialog-close]`)?.addEventListener(`click`,()=>Or?.close());try{let e=window.sessionStorage.getItem(Qe);if(e){window.sessionStorage.removeItem(Qe);let t=JSON.parse(e),n=Array.isArray(t.ids)?t.ids.filter(e=>typeof e==`string`):[];if(t.selecting===!0||n.length>0){Wn(!0);for(let e of $e(n,A))V.add(e);U()}}}catch{}Or?.addEventListener(`close`,()=>{Pr&&H&&Fr&&Wn(!1),Nr=[],oi()}),i(window,()=>window.location.reload());var Yr=`prb-fetch-summary`;function Xr(e){return e.map(e=>({lineage:(e.dataset.lineage??e.dataset.id??``).split(` `).filter(Boolean)}))}function Zr(e){return Pe(Xr(e),_n)}function Qr(){for(let e of M()){let t=e.querySelector(`[data-fetch-review]`);t&&(t.hidden=!Ie(_n,Xr([e])))}}async function $r(){try{let e=await fetch(`/fetch-updates`);if(!e.ok)return;_n=(await e.json()).targets??{}}catch{return}Qr(),U()}async function ei(e,t){let n=Zr(e);if(yn||n.repositories===0)return;yn=!0;let r=[gn,...document.querySelectorAll(`[data-fetch-review]`)];for(let e of r)e&&(e.disabled=!0);t&&(t.textContent=je(n.repositories));let i=null;try{let e=await fetch(`/fetch-updates`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:n.ids})});e.ok&&(i=await e.json())}catch{}yn=!1;for(let e of r)e&&(e.disabled=!1);t&&(t.textContent=Le),U();let a=i??{repositories:n.repositories,fetched:0,failed:[],moved:0},o={kind:a.fetched<a.repositories?`failed`:`ready`,text:Ne(a)};if(a.moved>0||ri){try{window.sessionStorage.setItem(Yr,JSON.stringify(o))}catch{}if(!ai())return void window.location.reload();ri=!0}ce(ye(),o)}try{let e=window.sessionStorage.getItem(Yr);if(e){window.sessionStorage.removeItem(Yr);let t=JSON.parse(e);typeof t.kind==`string`&&typeof t.text==`string`&&ce(ye(),{kind:t.kind,text:t.text})}}catch{}gn?.addEventListener(`click`,()=>void ei(lr(),gn)),pe(),$r();var ti=document.body.dataset.indexRevision??``,ni=document.body.dataset.live===`true`?Date.now():0,ri=!1,ii=ti||null;function ai(){let e=Or?.open===!0||Q?.open===!0||document.activeElement?.closest(`[data-collections-area], [data-collections-filter]`)!=null;return V.size>0||document.activeElement===P||yn||cr.isOpen()||J.isOpen()||tr||e||Mn()||Nn>0}function oi(){ri&&!ai()&&T()}async function si(){try{let e=await fetch(`/revision`);if(e.ok){xe(document,!0);let t=await e.json();w(document,t),t.live&&ni===0&&(ni=Date.now()),t.live||(ni=0),t.revision!==void 0&&t.revision!==ii&&(ii!==null&&J.revalidate(),ii=t.revision);let n=se(ti,t.revision??``,ai());if(n===`reload`)return T(),null;n===`hold`&&(ri=!0)}}catch{xe(document,!1)}return He(ni===0?2**53-1:Date.now()-ni)}var ci=b(window,si);de(document,()=>ci.now()),P?.addEventListener(`blur`,oi),document.addEventListener(`click`,()=>window.setTimeout(oi,0)),ge();
package/static/shell.css CHANGED
@@ -5812,6 +5812,7 @@ span.prb-arch-location:hover { text-decoration: none; }
5812
5812
  * control in several sizes, and a caret that differed between them would be a bug nobody could name. */
5813
5813
  .prb-index-status select,
5814
5814
  .prb-settings-field select,
5815
+ .prb-qr-picker select,
5815
5816
  select.prb-addreview-control {
5816
5817
  appearance: none;
5817
5818
  -webkit-appearance: none;
@@ -7440,9 +7441,69 @@ select.prb-addreview-control { padding-right: 32px; }
7440
7441
  .prb-qr-link:hover, .prb-qr-link-button:hover, .prb-qr-ref:hover { opacity: 0.8; text-decoration: none; }
7441
7442
  .prb-qr-ref { font-family: var(--font-mono, ui-monospace, monospace); }
7442
7443
  .prb-qr-links { display: flex; flex-wrap: wrap; gap: 16px; }
7443
- .prb-qr-picker { display: flex; flex-wrap: wrap; align-items: end; gap: 8px 12px; }
7444
- .prb-qr-picker-field { display: flex; flex-direction: column; gap: 2px; font-size: var(--t-meta); color: var(--text-secondary); }
7445
- .prb-qr-picker-field select { max-width: 100%; font: inherit; font-size: var(--t-meta); }
7444
+ /* Link a dependency: the Settings field's box (.prb-settings-field), so a form here reads as the
7445
+ product's own and not the browser's. The review field takes the rest of the row; the direction
7446
+ holds two short values and keeps its own width. */
7447
+ .prb-qr-picker { display: flex; flex-wrap: wrap; align-items: end; gap: 10px 12px; padding: 4px 0 2px; }
7448
+ .prb-qr-picker-field { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
7449
+ .prb-qr-picker-review { flex: 1 1 280px; }
7450
+ .prb-qr-picker-label {
7451
+ font-size: var(--t-micro);
7452
+ letter-spacing: 0.04em;
7453
+ text-transform: uppercase;
7454
+ color: var(--text-tertiary, var(--text-secondary));
7455
+ }
7456
+ .prb-qr-picker select,
7457
+ .prb-qr-combo input {
7458
+ box-sizing: border-box;
7459
+ height: 36px;
7460
+ padding: 0 10px;
7461
+ border: 1px solid var(--border);
7462
+ border-radius: 8px;
7463
+ background-color: var(--surface-2);
7464
+ color: var(--text-primary);
7465
+ font: inherit;
7466
+ font-size: var(--t-body);
7467
+ }
7468
+ .prb-qr-picker select { padding-right: 32px; cursor: pointer; }
7469
+ .prb-qr-combo input::placeholder { color: var(--text-muted); }
7470
+ .prb-qr-picker select:focus,
7471
+ .prb-qr-combo input:focus { outline: none; border-color: var(--brand); }
7472
+ .prb-qr-picker-submit { height: 36px; padding: 0 16px; font-size: var(--t-body); }
7473
+ .prb-qr-combo { position: relative; }
7474
+ .prb-qr-combo input { width: 100%; }
7475
+ /* The open list: the filter menu's panel (.prb-index-status select::picker), hung under the box. */
7476
+ .prb-qr-combo-list {
7477
+ position: absolute;
7478
+ z-index: 3;
7479
+ top: calc(100% + 6px);
7480
+ left: 0;
7481
+ right: 0;
7482
+ max-height: 248px;
7483
+ overflow: auto;
7484
+ margin: 0;
7485
+ padding: 5px;
7486
+ list-style: none;
7487
+ border: 1px solid var(--border);
7488
+ border-radius: 9px;
7489
+ background: var(--surface-raised);
7490
+ box-shadow: 0 10px 28px var(--shadow-float);
7491
+ }
7492
+ .prb-qr-combo-list [role="option"] {
7493
+ padding: 7px 9px;
7494
+ border-radius: 6px;
7495
+ color: var(--text-secondary);
7496
+ font-size: var(--t-meta);
7497
+ white-space: nowrap;
7498
+ overflow: hidden;
7499
+ text-overflow: ellipsis;
7500
+ cursor: pointer;
7501
+ }
7502
+ .prb-qr-combo-list [role="option"]:hover,
7503
+ .prb-qr-combo-list [role="option"][data-active] { background: var(--surface-2); color: var(--text-primary); }
7504
+ .prb-qr-combo-list [role="option"][aria-selected="true"] { background: var(--brand-muted); color: var(--brand-ink); }
7505
+ .prb-qr-combo-empty { padding: 7px 9px; color: var(--text-muted); font-size: var(--t-meta); }
7506
+ .prb-qr-combo-list [hidden] { display: none; }
7446
7507
  .prb-qr-finding {
7447
7508
  margin: 0 0 10px;
7448
7509
  padding: 10px 12px;