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 +39 -0
- package/dist/main.js +1 -1
- package/dist/{mcp_tools-DEx9NxAc.js → mcp_tools-DmQKsAkC.js} +100 -7
- package/dist/server.js +11 -4
- package/package.json +1 -1
- package/static/reviews.js +1 -1
- package/static/shell.css +64 -3
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-
|
|
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
|
|
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)
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
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-
|
|
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
|
|
4910
|
-
<
|
|
4911
|
-
|
|
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.
|
|
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?`★`:`☆`,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?`★`:`☆`,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
|
-
|
|
7444
|
-
.
|
|
7445
|
-
|
|
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;
|