prreviewbuddy 0.92.0 → 0.93.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/dist/main.js +2 -2
- package/dist/{mcp_tools-BKPpd9dN.js → mcp_tools-DbFR9Z90.js} +163 -19
- package/dist/server.js +171 -43
- package/package.json +1 -1
- package/static/{chunk-DMxtqzNj.js → chunk-Cg4cN8Vk.js} +1 -1
- package/static/reviews.js +1 -1
- package/static/runs.js +1 -1
- package/static/workspace.js +64 -64
package/dist/server.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $a as
|
|
1
|
+
import { $a as versionFrom, $i as isExplanationAction, $n as hasAuthorContent, $r as latestKissRun, $t as waitingHistory, A as settleQueue, Aa as isCommitReview, Ai as deleteCollection, An as markRead, Ar as endedAt, At as askCheckout, B as humanizeModelId, Ba as clearAgentPreference, Bi as readQueue, Bn as unreadCount$1, Br as progressSteps, Bt as runJob, C as parsePullRequestLink, Ca as describeAuthorship, Ci as lifecyclePillLabel, Cn as categoryOf, Cr as reviewedShaOf, Ct as RefreshUnavailableError, D as activateQueued, Da as originRemote, Di as collectionsStamp, Dn as eventName, Dr as RUN_RECORD_RETENTION_MS, E as relativeTime$1, Ea as resolveTarget, Ei as sectionOf$1, En as createPrUpdate, Er as fillFileUrlTemplate, Et as mergeUpdateInto, Fa as git, Fi as updateCollections, Fn as readStateOf, Fr as saveJob, Ft as failureOf$1, G as reviewTag, Ga as AGENT_IDS, Gi as questionsOutstanding, Gn as saveRefresh, H as findingRef, Ha as writeAgentPreference, Hi as isIssueOutstanding, Hn as existingPaths, Ia as refExists, Ii as queueAdd, In as removeNotification, It as observeReview, Ja as agentIdentityOf, Ji as verdictClosure, Jn as agentEnvOf, Jr as groupByLineage, Jt as telemetryUploadConsent, K as reviewTagsIn, Ka as agentById, Ki as resolvedByConversation, Kn as storedConversation, Kr as decideKissRecommendation, L as modelProvenanceOf, La as resolveAgent, Li as queueAddMany, Ln as retireNotification, Lr as isLiveJob, Lt as prepareReview, Ma as AmbiguousRefError, Mi as readCollections, Mn as moveIds, Mr as isTerminal, Mt as UpdateAlreadyRunningError, N as cliEntry, Na as shortNameOf, Ni as renameCollection, Nn as pruneNotifications, Nr as loadJob, Nt as liveUpdateFor, O as compactQueue, Oa as DetachedHeadError, Oi as createCollection, On as listNotifications, Or as allJobs, Ot as recheckConversation, Pa as shorthandOf, Pi as setMembership, Pn as readNotification, Pr as pruneJobResidue, Pt as runningJobs, Q as markAskRunning, Qa as runnableAgents, Qi as explanationOf, Qn as authorPreview, Qr as kissDecisionsOf, Qt as feedbackUrl, R as provenanceDetailLines, Ra as resolveModel, Ri as queueRemove, Rn as toneOf, Rr as isTerminalJobPhase, Rt as settleReview, S as extractPullRequestLinks, Sa as objectWithAnyOf, Si as lifecyclePillAction, Sn as subjectOf, Sr as followedBranch, St as FETCH_TIMEOUT_MS, T as runBatch, Ta as kissOutcome, Ti as parseLifecycle, Tn as createPrState, Tr as forgeResolver, Tt as cancellableHere, U as findingRefs, Ui as isQuestionOutstanding, Un as ASK_REREAD_CEILING_MS, Ut as readEvents, V as findingAtRef, Va as readAgentPreference, Vi as doneVerb, Vn as withUsageRecorded, Vr as purposeOf, W as refOf, Wa as STORE_ROOT, Wi as issuesOutstanding, Wn as prepareConversationWithin, Wr as isClaimed, Wt as record, X as isRequestId, Xa as isAgentId, Xi as recommendationsOf, Xn as chatConversationSection, Xr as indexReviewGroups, Xt as BUILD_VERSION, Ya as detectAgents, Yi as processDiscussion, Yn as EXPLAIN_SIMPLY_PROMPT, Yr as indexKeptIds, Za as parkedReason, Zi as explanationActionOf, Zn as UNESTABLISHED_MOTIVATION, Zr as kissDecisionRefusal, _ as endRun, _a as wasReassessed, _i as activityLabel, _n as ancestorsOf, _t as parseWorkspacePort, a as lineageIds, aa as closesFinding, an as ARCHITECTURE_DIR, ar as renderInlineText, b as stopRun, ba as asString, bi as lifecycleItemLabel, bn as announceJob, br as checkCodeFreshness, bt as writePortPreference, c as discardJob, ca as findingIn, ci as recentWorkspaces, cn as partFiles, cr as isBusy, ct as serverEntryExists, d as startKissJob, da as isGradeFor, di as summarise, dn as storeArchitecture, dr as createWorktree, ea as withExplanation, ei as lineageKey, en as mapRuntimes, er as GITHUB_MARKDOWN, f as isDriving, fa as isOffered, fi as touchWorkspace, fn as storedScopes, fr as holdWorktree, g as completeRun, ga as statusLookup, gi as activityAttributes, gn as REPOSITORY_SCOPE, gr as requestJobStop, gt as MIN_WORKSPACE_PORT, h as beginRun, ha as sourcePhrase, hi as LIFECYCLES, hn as QUOTE_LIMITS, hr as removeWorktree, ht as MAX_WORKSPACE_PORT, i as deleteReview, ia as assessmentLookup, ii as mutateWorkspace, in as formatDuration, ir as escapeHtml$1, ja as resolveBase, ji as nameProblemText, jn as markReadForReview, jr as fail$1, jt as findingsChanged, ki as createWithMembers, kn as markAllRead, kr as attemptIdOf, kt as updateReview, l as kissAgentId, la as findingStatus, li as reviewedCommit, ln as readArchitecture, lr as withReviewLock, lt as spawnServer, m as RUN_KINDS, ma as reassessIn, mi as workspaceStamps, mn as ownersOf, mr as readMarker, mt as DEFAULT_WORKSPACE_PORT, n as MCP_TOOL_NAMES, na as NO_STATUS, ni as loadWorkspace, nn as RUNTIME_WORDS, no as AgentUnavailableError, nr as CODE_BLOCK_CLASS, o as liveJobsFor, oa as currentGradeIn, oi as presentedKissRunOf, on as checkArchitecture, ot as readServerRecord, p as track, pa as promptGrade, pi as workspaceRevision, pn as trackedFiles, pr as isWorktreeHeld, pt as writeServerRecord, q as endAskRequest, qa as agentFor$1, qi as reviewerDispositions, qn as isUnchanged, qr as followedRefName, qt as recordTelemetryUploadConsent, r as deleteLineage, ra as analysisRefOf, rn as describeRuntimes, rr as CODE_COPY_CLASS, rt as clearServerRecordOwnedBy, s as wasBlocked, sa as findingAssessment, si as previousKissResult, sn as loadArchitecture, sr as ReviewBeingDeletedError, ta as ANALYSIS_ONLY, ti as lineagePosition, tn as recordRuntimeBestEffort, to as AgentCancelledError, tr as renderMarkdown, tt as readIndexToken, ua as gradeScale, un as repositoryKey, ur as MANAGED_ROOT, ut as stopChild, v as heldRuns, va as followUpFindingId, vi as isLifecycle, vn as isArchitectureId, vt as resolveWorkspacePort, w as unsupportedReason, wa as WITHHELD_REASON, wi as offersLifecycle, wn as createArchitectureNotification, wr as fetchHead, wt as cancelUpdate, x as batchIdentity, xa as extractJsonText, xi as lifecycleName$1, xn as branchOf, xr as checkReview, y as reportRun, ya as SEVERITIES, yi as lifecycleChip, yn as writeJsonAtomically, yr as findExistingReview, yt as statedWorkspacePort, z as agentDisplayName, za as agentIdOf, zi as queueStamp, zn as unreadAround, zr as phasesFor, zt as reanalyseReview } from "./mcp_tools-DbFR9Z90.js";
|
|
2
2
|
import { basename, delimiter, isAbsolute, join, relative, resolve } from "node:path";
|
|
3
3
|
import { execFile, spawn } from "node:child_process";
|
|
4
4
|
import { accessSync, constants, existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
@@ -5015,13 +5015,12 @@ ${renderDecisions(processed)}
|
|
|
5015
5015
|
${processed.all.length === 0 ? "<p class=\"prb-pr-empty\">This pull request has no comments yet.</p>" : buckets}`;
|
|
5016
5016
|
}
|
|
5017
5017
|
/**
|
|
5018
|
-
* Re-
|
|
5018
|
+
* Re-checking the discussion, and what the last re-read found.
|
|
5019
5019
|
*
|
|
5020
|
-
*
|
|
5021
|
-
*
|
|
5022
|
-
*
|
|
5023
|
-
*
|
|
5024
|
-
* re-review would be worse off than one who never saw the button.
|
|
5020
|
+
* Two things, said in the order they happen: the threads are fetched and every "already raised"
|
|
5021
|
+
* note corrected, then the findings are reassessed against whatever in the discussion is new to
|
|
5022
|
+
* them. The copy keeps it narrow in the one way that still matters: the code is the commit the
|
|
5023
|
+
* review read, so this is not a re-review and a comment claiming a fix cannot settle it here.
|
|
5025
5024
|
*/
|
|
5026
5025
|
function renderRefresh(refresh) {
|
|
5027
5026
|
if (!refresh?.enabled) return "";
|
|
@@ -5029,10 +5028,12 @@ function renderRefresh(refresh) {
|
|
|
5029
5028
|
return `<div class="prb-pr-refresh">
|
|
5030
5029
|
<button type="button" data-pr-recheck>Re-check the conversation</button>
|
|
5031
5030
|
<span class="prb-pr-refresh-note">
|
|
5032
|
-
Fetches
|
|
5033
|
-
|
|
5034
|
-
|
|
5035
|
-
|
|
5031
|
+
Fetches the description and every thread again, corrects the "Already raised" notes, then
|
|
5032
|
+
reassesses the issues and questions against anything new. A reply can answer a question,
|
|
5033
|
+
resolve or reopen an issue, or suggest a different severity, and a concern it raises becomes a
|
|
5034
|
+
new issue only once it is confirmed in the reviewed code. A comment saying something is fixed
|
|
5035
|
+
is not taken on trust: the issue stays open until an update sees the fix in the code. Newer
|
|
5036
|
+
commits are left for Update review.
|
|
5036
5037
|
</span>
|
|
5037
5038
|
${last ? `<p class="prb-pr-refresh-last" data-ok="${last.ok}">
|
|
5038
5039
|
Last re-checked ${escapeHtml$1(relativeTime$1(last.at))}. ${escapeHtml$1(last.message)}
|
|
@@ -6050,6 +6051,7 @@ function renderFreshAlternative(command) {
|
|
|
6050
6051
|
*/
|
|
6051
6052
|
function renderUpdateOutcome(outcome) {
|
|
6052
6053
|
if (!outcome) return "";
|
|
6054
|
+
if (outcome.scope === "conversation") return renderRecheckOutcome(outcome);
|
|
6053
6055
|
const state = outcome.ok ? "done" : outcome.stop === "refused" ? "refused" : outcome.stop === "cancelled" ? "cancelled" : "stopped";
|
|
6054
6056
|
const title = outcome.ok ? "Review updated" : outcome.stop === "refused" ? "There was nothing to update against" : outcome.stop === "cancelled" ? "Update cancelled" : "The review was not updated";
|
|
6055
6057
|
const facts = outcome.ok ? updateFacts(outcome) : null;
|
|
@@ -6062,6 +6064,72 @@ function renderUpdateOutcome(outcome) {
|
|
|
6062
6064
|
</div>`;
|
|
6063
6065
|
}
|
|
6064
6066
|
/**
|
|
6067
|
+
* What a Re-check of the PR discussion did, in the same notice an update reports through.
|
|
6068
|
+
*
|
|
6069
|
+
* Five outcomes, each with its own headline, because the one the reviewer most needs to tell apart
|
|
6070
|
+
* is the partial: the discussion came in, so the "already raised" lines are current, but the
|
|
6071
|
+
* findings were not judged against it. That one says why and, when trying again could help, offers it.
|
|
6072
|
+
*/
|
|
6073
|
+
function renderRecheckOutcome(outcome) {
|
|
6074
|
+
const retry = outcome.stop === "analysis-failed" && outcome.conversationOk === true;
|
|
6075
|
+
const { state, title, body } = recheckWords(outcome);
|
|
6076
|
+
const facts = outcome.ok && outcome.stop === null ? recheckFacts(outcome) : null;
|
|
6077
|
+
return `<div class="prb-update-result" data-state="${state}" data-update-result data-recheck-result role="status">
|
|
6078
|
+
<div class="prb-update-result-body">
|
|
6079
|
+
${facts ? `<p class="prb-update-facts"><strong>${escapeHtml$1(title)}</strong>${facts.map((fact) => `<span class="prb-update-fact">${escapeHtml$1(fact)}</span>`).join("")}</p>` : `<p><strong>${escapeHtml$1(title)}</strong> ${escapeHtml$1(body)}</p>`}
|
|
6080
|
+
${retry ? "<p class=\"prb-update-footnote\"><button type=\"button\" class=\"prb-fresh-quiet\" data-pr-recheck>Try again</button></p>" : ""}
|
|
6081
|
+
</div>
|
|
6082
|
+
<button type="button" class="prb-fresh-dismiss" data-update-close>Close</button>
|
|
6083
|
+
</div>`;
|
|
6084
|
+
}
|
|
6085
|
+
function recheckWords(outcome) {
|
|
6086
|
+
if (outcome.stop === "cancelled") return {
|
|
6087
|
+
state: "cancelled",
|
|
6088
|
+
title: "Re-check cancelled",
|
|
6089
|
+
body: "The findings and the discussion shown are exactly as they were."
|
|
6090
|
+
};
|
|
6091
|
+
if (outcome.conversationOk !== true) return {
|
|
6092
|
+
state: "refused",
|
|
6093
|
+
title: "The PR discussion was not re-checked",
|
|
6094
|
+
body: outcome.message
|
|
6095
|
+
};
|
|
6096
|
+
if (outcome.stop === "already-current") return {
|
|
6097
|
+
state: "done",
|
|
6098
|
+
title: "No findings changed",
|
|
6099
|
+
body: outcome.message
|
|
6100
|
+
};
|
|
6101
|
+
if (outcome.stop !== null) return {
|
|
6102
|
+
state: "stopped",
|
|
6103
|
+
title: "Discussion refreshed, findings not reassessed",
|
|
6104
|
+
body: `The latest comments are in, and the notes about who raised what are current. ${outcome.message}`
|
|
6105
|
+
};
|
|
6106
|
+
if (outcome.counts && !findingsChanged(outcome.counts)) return {
|
|
6107
|
+
state: "done",
|
|
6108
|
+
title: "No findings changed",
|
|
6109
|
+
body: "The new comments were read against every open issue and question, and each one stands as it was."
|
|
6110
|
+
};
|
|
6111
|
+
return {
|
|
6112
|
+
state: "done",
|
|
6113
|
+
title: "Findings reassessed against the PR discussion",
|
|
6114
|
+
body: outcome.message
|
|
6115
|
+
};
|
|
6116
|
+
}
|
|
6117
|
+
/** What a Re-check changed, largest news first, in the words an update uses. No commit: none moved. */
|
|
6118
|
+
function recheckFacts(outcome) {
|
|
6119
|
+
const counts = outcome.counts;
|
|
6120
|
+
if (!counts || !findingsChanged(counts)) return null;
|
|
6121
|
+
const plural = (n, one, many) => `${n} ${n === 1 ? one : many}`;
|
|
6122
|
+
return [
|
|
6123
|
+
counts.questionsAnswered ? `${plural(counts.questionsAnswered, "question", "questions")} answered` : "",
|
|
6124
|
+
counts.resolved ? `${plural(counts.resolved, "issue", "issues")} resolved by the discussion` : "",
|
|
6125
|
+
counts.reopened ? `${plural(counts.reopened, "issue", "issues")} reopened` : "",
|
|
6126
|
+
counts.affected ? `${counts.affected} to look at again` : "",
|
|
6127
|
+
counts.newIssues ? plural(counts.newIssues, "new issue", "new issues") : "",
|
|
6128
|
+
counts.gradeChanges ? `${plural(counts.gradeChanges, "grade change", "grade changes")} suggested` : "",
|
|
6129
|
+
counts.decisionsChallenged ? `${plural(counts.decisionsChallenged, "accepted answer", "accepted answers")} put back to you` : ""
|
|
6130
|
+
].filter(Boolean);
|
|
6131
|
+
}
|
|
6132
|
+
/**
|
|
6065
6133
|
* A successful update as a row of facts: the commit it reached, then what changed, largest news first.
|
|
6066
6134
|
*
|
|
6067
6135
|
* Read at a glance rather than parsed. The sentence it replaces ("Updated to 7bc233f: 2 fixed,
|
|
@@ -6446,14 +6514,14 @@ function comparisonNote(code, hasPullRequest) {
|
|
|
6446
6514
|
* button is the subject of the sentence now, so there is one name for one thing and the reviewer
|
|
6447
6515
|
* presses the words they just read.
|
|
6448
6516
|
*
|
|
6449
|
-
*
|
|
6450
|
-
*
|
|
6517
|
+
* It reads no new code: the findings are reassessed against the discussion at the reviewed commit,
|
|
6518
|
+
* and newer commits stay the Update button's.
|
|
6451
6519
|
*/
|
|
6452
6520
|
function conversationNote(report, actions) {
|
|
6453
6521
|
if (!report.conversation.attached) return "";
|
|
6454
6522
|
const when = escapeHtml$1(relativeTime$1(report.conversation.importedAt));
|
|
6455
6523
|
if (!actions) return `The PR conversation was last checked ${when}.`;
|
|
6456
|
-
return `<button type="button" class="prb-fresh-quiet" data-pr-recheck>Re-check the conversation</button> to
|
|
6524
|
+
return `<button type="button" class="prb-fresh-quiet" data-pr-recheck>Re-check the conversation</button> to fetch new comments and reassess issues and questions against them, at the reviewed commit. Last checked ${when}.`;
|
|
6457
6525
|
}
|
|
6458
6526
|
//#endregion
|
|
6459
6527
|
//#region ../../packages/review-harness/src/workspace/progress_view.ts
|
|
@@ -6551,7 +6619,7 @@ function renderProgressView(job, fileCount, cancellable = false, history) {
|
|
|
6551
6619
|
* and can be carried on; an update has the previous review, which is why the two are worded apart.
|
|
6552
6620
|
*/
|
|
6553
6621
|
function renderElapsed(job, cancel, history) {
|
|
6554
|
-
const button = !cancel ? "" : cancel === "Cancel review" ? `<button type="button" class="prb-progress-cancel" data-review-cancel="${escapeHtml$1(job.id)}">Cancel review</button>` : `<button type="button" class="prb-progress-cancel" data-update-cancel="${escapeHtml$1(job.id)}"
|
|
6622
|
+
const button = !cancel ? "" : cancel === "Cancel review" ? `<button type="button" class="prb-progress-cancel" data-review-cancel="${escapeHtml$1(job.id)}">Cancel review</button>` : `<button type="button" class="prb-progress-cancel" data-update-cancel="${escapeHtml$1(job.id)}">${cancel}</button>`;
|
|
6555
6623
|
return `<div class="prb-progress-foot">
|
|
6556
6624
|
<div class="prb-progress-runtime">
|
|
6557
6625
|
<p class="prb-progress-elapsed" data-started-at="${job.startedAt}">${escapeHtml$1(runningFor(job.startedAt))}</p>${renderHistory$1(history)}
|
|
@@ -6599,11 +6667,14 @@ function renderHistory$1(history) {
|
|
|
6599
6667
|
*/
|
|
6600
6668
|
function renderUpdateProgress(job, cancellable = false, history) {
|
|
6601
6669
|
if (!isLiveJob(job)) return "";
|
|
6602
|
-
|
|
6603
|
-
|
|
6604
|
-
|
|
6670
|
+
const recheck = job.scope === "conversation";
|
|
6671
|
+
const title = recheck ? "Re-checking the PR discussion" : "Updating this review";
|
|
6672
|
+
const lead = recheck ? "Issues and questions will be updated from the discussion when reassessment finishes." : "The previous review will be replaced when reassessment finishes.";
|
|
6673
|
+
return `<div class="prb-update-progress" data-update-phase="${escapeHtml$1(job.phase)}"${recheck ? " data-update-scope=\"conversation\"" : ""} role="status" aria-live="polite">
|
|
6674
|
+
<h3 class="prb-doc-title"><span class="prb-spinner" aria-hidden="true"></span>${title}</h3>
|
|
6675
|
+
<p class="prb-progress-lead">${lead}</p>
|
|
6605
6676
|
${renderSteps(job)}
|
|
6606
|
-
${renderElapsed(job, cancellable ? "Cancel update" : null, history)}
|
|
6677
|
+
${renderElapsed(job, cancellable ? recheck ? "Cancel re-check" : "Cancel update" : null, history)}
|
|
6607
6678
|
</div>`;
|
|
6608
6679
|
}
|
|
6609
6680
|
//#endregion
|
|
@@ -7009,7 +7080,7 @@ function renderAttributionAge(view) {
|
|
|
7009
7080
|
return `<div class="prb-discussion-age">
|
|
7010
7081
|
<details class="prb-discussion-age-detail">
|
|
7011
7082
|
<summary class="prb-discussion-age-summary">PR discussion checked ${escapeHtml$1(imported)}</summary>
|
|
7012
|
-
<p class="prb-discussion-age-body">
|
|
7083
|
+
<p class="prb-discussion-age-body">The issues and questions below, their “already raised” notes and whether each thread was still open describe the pull request as it stood when its discussion was fetched. A reply or a resolved thread since then is not reflected here until the conversation is re-checked, which also reassesses the issues and questions against it.</p>
|
|
7013
7084
|
</details>
|
|
7014
7085
|
<span class="prb-discussion-age-sep" aria-hidden="true">·</span>
|
|
7015
7086
|
<button type="button" class="prb-doc-note-link" data-view-nav="prcontext">Re-check in PR context</button>
|
|
@@ -12746,8 +12817,15 @@ feature: E</pre>
|
|
|
12746
12817
|
matters and what is needed, with the original question and its files under <b>Technical
|
|
12747
12818
|
context</b>. Any answer so far stays on the card.</p>
|
|
12748
12819
|
<p>When the review came with a pull request discussion, the line above the issues says when it
|
|
12749
|
-
was last checked.
|
|
12750
|
-
in PR context</b> takes you to bring it up to date.</p>
|
|
12820
|
+
was last checked. The issues, the questions and their “already raised” notes describe the
|
|
12821
|
+
discussion as it was then; <b>Re-check in PR context</b> takes you to bring it up to date.</p>
|
|
12822
|
+
<p>Re-checking fetches the latest comments and reassesses every issue and question against
|
|
12823
|
+
anything new in them. A reply can answer a question, resolve or reopen an issue, or suggest a
|
|
12824
|
+
different severity or importance, and a concern raised in a comment becomes a new issue once it
|
|
12825
|
+
is confirmed in the reviewed code. A thread marked resolved, or a comment saying something is
|
|
12826
|
+
fixed, does not resolve an issue on its own: it stays open until an Update sees the fix in the
|
|
12827
|
+
code. Re-checking reads no new commits; Update review does. When the comments only change how
|
|
12828
|
+
much one finding matters, <b>Reassess</b> on its card asks about that one alone.</p>
|
|
12751
12829
|
<p>Resolved and dismissed issues are in the closed list at the bottom. One the new commits fixed
|
|
12752
12830
|
leads with what the code now does, when the update could see it.</p>`
|
|
12753
12831
|
},
|
|
@@ -12760,7 +12838,7 @@ feature: E</pre>
|
|
|
12760
12838
|
<li><b>Update</b> brings the review up to date with commits added since it was made. Its
|
|
12761
12839
|
findings are checked against the new commits rather than thrown away, and each says whether
|
|
12762
12840
|
the new commits affected it. In the workspace, Update review appears on a review whose
|
|
12763
|
-
branch has moved on.</li>
|
|
12841
|
+
branch has moved on. It also reads the pull request discussion, as Re-check does.</li>
|
|
12764
12842
|
<li><b>Reanalyse</b> analyses the same commit again, for a fresh judgement of the same change,
|
|
12765
12843
|
for example with a different model.</li>
|
|
12766
12844
|
<li><b>Fresh review</b> reviews the target again as a new review, and keeps the existing one
|
|
@@ -18336,10 +18414,15 @@ async function sendWorkspacePage(res, workspace) {
|
|
|
18336
18414
|
const updateJob = liveUpdateFor(workspace.id);
|
|
18337
18415
|
const reviewJob = workspace.jobId ? loadJob(workspace.jobId) : void 0;
|
|
18338
18416
|
const kissJob = kissRun ? loadJob(kissRun.jobId) : void 0;
|
|
18339
|
-
const
|
|
18340
|
-
|
|
18341
|
-
|
|
18342
|
-
|
|
18417
|
+
const unseen = [workspace.lastUpdate, workspace.lastRecheck].filter((outcome) => outcome !== void 0 && !outcome.acknowledged);
|
|
18418
|
+
const notice = unseen.sort((a, b) => b.at - a.at)[0];
|
|
18419
|
+
if (notice) {
|
|
18420
|
+
const read = new Set(unseen.map((outcome) => outcome.at));
|
|
18421
|
+
mutateWorkspace(workspace.id, (current) => {
|
|
18422
|
+
if (current.lastUpdate && read.has(current.lastUpdate.at)) current.lastUpdate.acknowledged = true;
|
|
18423
|
+
if (current.lastRecheck && read.has(current.lastRecheck.at)) current.lastRecheck.acknowledged = true;
|
|
18424
|
+
});
|
|
18425
|
+
}
|
|
18343
18426
|
const everyReview = recentWorkspaces(Number.MAX_SAFE_INTEGER);
|
|
18344
18427
|
const html = renderWorkspace({
|
|
18345
18428
|
session: workspace.session,
|
|
@@ -18568,33 +18651,78 @@ async function kissFreshnessOrNull(workspace) {
|
|
|
18568
18651
|
}
|
|
18569
18652
|
}
|
|
18570
18653
|
/**
|
|
18571
|
-
* Re-
|
|
18654
|
+
* Re-check the pull request discussion, at the reviewer's request: re-read it, then reconcile the
|
|
18655
|
+
* findings with whatever in it is new to them, at the commit the review read.
|
|
18656
|
+
*
|
|
18657
|
+
* Answers 200 with `ok: false` rather than an error status when it does not work, for the reason the
|
|
18658
|
+
* update route does: a failure is an outcome the page has to explain in a sentence. 409 when an update
|
|
18659
|
+
* or another Re-check holds the review, which the reloaded page then shows running.
|
|
18572
18660
|
*
|
|
18573
|
-
*
|
|
18574
|
-
*
|
|
18575
|
-
* the conversation
|
|
18576
|
-
*
|
|
18661
|
+
* Saved in two ways, because two different things can come of it. A reassessment that was applied
|
|
18662
|
+
* goes on the way an update does, onto the review as it is on disk. Anything short of that changed
|
|
18663
|
+
* only the conversation and the "already raised" lines, and goes on the way a re-read always has,
|
|
18664
|
+
* through `saveRefresh`, which will not put an older conversation over a newer one.
|
|
18577
18665
|
*/
|
|
18578
18666
|
async function handleRefreshPr(res, workspace) {
|
|
18579
18667
|
const reattributing = JSON.stringify(workspace.session.result);
|
|
18580
|
-
|
|
18581
|
-
const startedAt = Date.now();
|
|
18668
|
+
const begun = Date.now();
|
|
18582
18669
|
let outcome;
|
|
18583
18670
|
try {
|
|
18584
|
-
outcome = await
|
|
18585
|
-
} catch {
|
|
18586
|
-
|
|
18671
|
+
outcome = await track(recheckConversation(workspace, { source: "workspace" }));
|
|
18672
|
+
} catch (error) {
|
|
18673
|
+
if (error instanceof UpdateAlreadyRunningError) return send(res, 409, { error: error.message });
|
|
18674
|
+
outcome = {
|
|
18675
|
+
at: Date.now(),
|
|
18676
|
+
ok: false,
|
|
18677
|
+
message: error instanceof RefreshUnavailableError || error instanceof ReviewBeingDeletedError ? error.message : "The findings could not be reassessed. Nothing about them has changed.",
|
|
18678
|
+
stop: "analysis-failed",
|
|
18679
|
+
fetchFailed: false,
|
|
18680
|
+
moved: false,
|
|
18681
|
+
...rereadSince(workspace, begun) ? { conversationOk: workspace.lastPrRefresh.ok } : {},
|
|
18682
|
+
fromSha: null,
|
|
18683
|
+
toSha: null,
|
|
18684
|
+
scope: "conversation"
|
|
18685
|
+
};
|
|
18587
18686
|
}
|
|
18588
|
-
|
|
18687
|
+
const applied = outcome.ok && outcome.stop === null;
|
|
18688
|
+
const cancelled = outcome.stop === "cancelled";
|
|
18689
|
+
workspace.lastRecheck = outcome;
|
|
18690
|
+
const reread = !applied && !cancelled ? rereadSince(workspace, begun) : void 0;
|
|
18691
|
+
if (reread) saveRefresh(workspace, reread, reattributing);
|
|
18692
|
+
const saved = mutateWorkspace(workspace.id, (fresh) => applied ? {
|
|
18693
|
+
...mergeUpdateInto(fresh, workspace),
|
|
18694
|
+
lastRecheck: outcome
|
|
18695
|
+
} : {
|
|
18696
|
+
...fresh,
|
|
18697
|
+
lastRecheck: outcome
|
|
18698
|
+
});
|
|
18699
|
+
const refresh = reread ?? (applied ? workspace.lastPrRefresh : void 0);
|
|
18589
18700
|
record({
|
|
18590
18701
|
event: "pr_conversation_rechecked",
|
|
18591
18702
|
reviewId: workspace.id,
|
|
18592
|
-
ok: outcome.
|
|
18593
|
-
changed:
|
|
18594
|
-
attributionsRestated:
|
|
18595
|
-
attributionsWithdrawn:
|
|
18703
|
+
ok: outcome.conversationOk === true,
|
|
18704
|
+
changed: refresh?.changes ? !isUnchanged(refresh.changes) : false,
|
|
18705
|
+
attributionsRestated: refresh?.attributionsRestated ?? 0,
|
|
18706
|
+
attributionsWithdrawn: refresh?.attributionsWithdrawn ?? 0,
|
|
18707
|
+
reassessment: reassessmentOf(outcome),
|
|
18708
|
+
resolved: outcome.counts?.resolved ?? 0,
|
|
18709
|
+
questionsAnswered: outcome.counts?.questionsAnswered ?? 0,
|
|
18710
|
+
newIssues: outcome.counts?.newIssues ?? 0
|
|
18596
18711
|
});
|
|
18597
|
-
send(res, 200, outcome);
|
|
18712
|
+
send(res, 200, saved?.lastRecheck ?? outcome);
|
|
18713
|
+
}
|
|
18714
|
+
/** The re-read this request made, if it made one: the copy's record, begun no earlier than the request. */
|
|
18715
|
+
function rereadSince(workspace, begun) {
|
|
18716
|
+
const refresh = workspace.lastPrRefresh;
|
|
18717
|
+
return refresh && (refresh.startedAt ?? refresh.at) >= begun ? refresh : void 0;
|
|
18718
|
+
}
|
|
18719
|
+
/** What a Re-check did to the findings, as the closed set the log records. */
|
|
18720
|
+
function reassessmentOf(outcome) {
|
|
18721
|
+
if (outcome.stop === "cancelled") return "cancelled";
|
|
18722
|
+
if (outcome.stop === "already-current") return "not-needed";
|
|
18723
|
+
if (outcome.stop === "analysis-failed") return "failed";
|
|
18724
|
+
if (outcome.stop !== null) return "skipped";
|
|
18725
|
+
return outcome.counts && findingsChanged(outcome.counts) ? "changed" : "unchanged";
|
|
18598
18726
|
}
|
|
18599
18727
|
/**
|
|
18600
18728
|
* Bring the whole review up to date with the checkout, at the reviewer's request.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prreviewbuddy",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.93.0",
|
|
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",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{bt as e}from"./chunk-DRtin0n-.js";var t=`button:not([disabled])`;function n(e){return e.querySelector(`[data-menu-panel]`)}function r(e){return e.querySelector(`[data-menu-trigger]`)}function i(e){let t=n(e);return t?[...t.querySelectorAll(`input:not([disabled]), textarea:not([disabled]), button:not([disabled])`)].filter(e=>!e.closest(`[hidden]`)):[]}function a(e){let r=n(e);return r?[...r.querySelectorAll(t)].filter(e=>!e.closest(`[hidden]`)):[]}var o=`data-menu-placement`,s=`data-menu-align`;function c(e){let t=e.ownerDocument.defaultView,n=0,r=t?.innerHeight??1/0,i=0,a=t?.innerWidth??1/0,o=e=>e!==`visible`&&e!==``;for(let s=e.parentElement;s&&t;s=s.parentElement){let e=t.getComputedStyle(s);if(!o(e.overflowY)&&!o(e.overflowX))continue;let c=s.getBoundingClientRect();o(e.overflowY)&&(n=Math.max(n,c.top),r=Math.min(r,c.bottom)),o(e.overflowX)&&(i=Math.max(i,c.left),a=Math.min(a,c.right))}return{top:n,bottom:r,left:i,right:a}}var l=8,u=120;function d(e){let t=n(e),i=r(e);if(!t||!i)return;t.removeAttribute(o),t.removeAttribute(s),t.style.removeProperty(`max-height`),t.style.removeProperty(`overflow-y`),t.style.removeProperty(`box-sizing`),t.scrollTop=0;let a=t.getBoundingClientRect(),d=i.getBoundingClientRect(),f=c(e);a.right>f.right-l&&d.right-a.width>=f.left+l&&t.setAttribute(s,`end`);let p=Math.max(0,a.top-d.bottom),m=f.bottom-d.bottom-p-l,h=d.top-f.top-p-l,g=a.height,_=g<=m?`below`:g<=h||h>m?`above`:`below`;_===`above`&&t.setAttribute(o,`above`);let v=_===`above`?h:m;g<=v||(t.style.boxSizing=`border-box`,t.style.maxHeight=`${Math.max(Math.floor(v),u)}px`,t.style.overflowY=`auto`)}function f(e){return!e.metaKey&&!e.ctrlKey&&!e.altKey&&!e.shiftKey?e.key===`j`?`ArrowDown`:e.key===`k`?`ArrowUp`:e.key:e.key}function p(t,o={}){let s=null,c=null,l=o.within?`${o.within} [data-menu]`:`[data-menu]`,u=e=>e&&(!o.within||e.closest(o.within))?e:null,p=(e,t={})=>{let i=n(e);if(!i||i.hidden)return;i.hidden=!0;let a=r(e);a?.setAttribute(`aria-expanded`,`false`);let l=s===e?c:null;s===e&&(s=null,c=null),o.onClose?.(e),t.returnFocus&&(l??(()=>a?.focus()))()},m=()=>{for(let e of t.querySelectorAll(l))p(e)},h=(e,t,i=null)=>{let l=n(e);l&&(m(),c=i,o.onOpen?.(e),l.hidden=!1,d(e),r(e)?.setAttribute(`aria-expanded`,`true`),s=e,t&&a(e)[0]?.focus())};return t.addEventListener(`click`,e=>{let t=e.target,r=u(t?.closest?.(`[data-menu]`)??null);if(!r){m();return}if(t?.closest(`[data-menu-trigger]`)){let t=e.detail===0;n(r)?.hidden?h(r,t):p(r);return}s&&s!==r&&p(s)}),t.addEventListener(`keydown`,t=>{if(s&&!s.isConnected&&(s=null),!s)return;let n=s;if(t.key===`Escape`){t.preventDefault(),p(n,{returnFocus:!0});return}if(!n.contains(t.target))return;if(t.key===`Tab`){if(n.hasAttribute(`data-menu-form`)){let e=i(n),r=e.indexOf(t.target);if(e.length>0){t.preventDefault(),e[(r+(t.shiftKey?-1:1)+e.length)%e.length].focus();return}}p(n);return}if(e(t.target))return;let r=a(n);if(r.length===0)return;let o=r.indexOf(t.target),c=f(t),l=c===`ArrowDown`?r[(o+1)%r.length]:c===`ArrowUp`?r[(o-1+r.length)%r.length]:c===`Home`?r[0]:c===`End`?r[r.length-1]:null;l&&(t.preventDefault(),l.focus(),l.scrollIntoView({block:`nearest`}))}),{open:(e,t={})=>h(e,t.focusFirst===!0,t.returnFocus??null),close:p,closeAll:m}}function m(e){return e<3e4?1e3:e<12e4?3e3:e<6e5?8e3:15e3}export{p as
|
|
1
|
+
import{bt as e}from"./chunk-DRtin0n-.js";var t=`button:not([disabled])`;function n(e){return e.querySelector(`[data-menu-panel]`)}function r(e){return e.querySelector(`[data-menu-trigger]`)}function i(e){let t=n(e);return t?[...t.querySelectorAll(`input:not([disabled]), textarea:not([disabled]), button:not([disabled])`)].filter(e=>!e.closest(`[hidden]`)):[]}function a(e){let r=n(e);return r?[...r.querySelectorAll(t)].filter(e=>!e.closest(`[hidden]`)):[]}var o=`data-menu-placement`,s=`data-menu-align`;function c(e){let t=e.ownerDocument.defaultView,n=0,r=t?.innerHeight??1/0,i=0,a=t?.innerWidth??1/0,o=e=>e!==`visible`&&e!==``;for(let s=e.parentElement;s&&t;s=s.parentElement){let e=t.getComputedStyle(s);if(!o(e.overflowY)&&!o(e.overflowX))continue;let c=s.getBoundingClientRect();o(e.overflowY)&&(n=Math.max(n,c.top),r=Math.min(r,c.bottom)),o(e.overflowX)&&(i=Math.max(i,c.left),a=Math.min(a,c.right))}return{top:n,bottom:r,left:i,right:a}}var l=8,u=120;function d(e){let t=n(e),i=r(e);if(!t||!i)return;t.removeAttribute(o),t.removeAttribute(s),t.style.removeProperty(`max-height`),t.style.removeProperty(`overflow-y`),t.style.removeProperty(`box-sizing`),t.scrollTop=0;let a=t.getBoundingClientRect(),d=i.getBoundingClientRect(),f=c(e);a.right>f.right-l&&d.right-a.width>=f.left+l&&t.setAttribute(s,`end`);let p=Math.max(0,a.top-d.bottom),m=f.bottom-d.bottom-p-l,h=d.top-f.top-p-l,g=a.height,_=g<=m?`below`:g<=h||h>m?`above`:`below`;_===`above`&&t.setAttribute(o,`above`);let v=_===`above`?h:m;g<=v||(t.style.boxSizing=`border-box`,t.style.maxHeight=`${Math.max(Math.floor(v),u)}px`,t.style.overflowY=`auto`)}function f(e){return!e.metaKey&&!e.ctrlKey&&!e.altKey&&!e.shiftKey?e.key===`j`?`ArrowDown`:e.key===`k`?`ArrowUp`:e.key:e.key}function p(t,o={}){let s=null,c=null,l=o.within?`${o.within} [data-menu]`:`[data-menu]`,u=e=>e&&(!o.within||e.closest(o.within))?e:null,p=(e,t={})=>{let i=n(e);if(!i||i.hidden)return;i.hidden=!0;let a=r(e);a?.setAttribute(`aria-expanded`,`false`);let l=s===e?c:null;s===e&&(s=null,c=null),o.onClose?.(e),t.returnFocus&&(l??(()=>a?.focus()))()},m=()=>{for(let e of t.querySelectorAll(l))p(e)},h=(e,t,i=null)=>{let l=n(e);l&&(m(),c=i,o.onOpen?.(e),l.hidden=!1,d(e),r(e)?.setAttribute(`aria-expanded`,`true`),s=e,t&&a(e)[0]?.focus())};return t.addEventListener(`click`,e=>{let t=e.target,r=u(t?.closest?.(`[data-menu]`)??null);if(!r){m();return}if(t?.closest(`[data-menu-trigger]`)){let t=e.detail===0;n(r)?.hidden?h(r,t):p(r);return}s&&s!==r&&p(s)}),t.addEventListener(`keydown`,t=>{if(s&&!s.isConnected&&(s=null),!s)return;let n=s;if(t.key===`Escape`){t.preventDefault(),p(n,{returnFocus:!0});return}if(!n.contains(t.target))return;if(t.key===`Tab`){if(n.hasAttribute(`data-menu-form`)){let e=i(n),r=e.indexOf(t.target);if(e.length>0){t.preventDefault(),e[(r+(t.shiftKey?-1:1)+e.length)%e.length].focus();return}}p(n);return}if(e(t.target))return;let r=a(n);if(r.length===0)return;let o=r.indexOf(t.target),c=f(t),l=c===`ArrowDown`?r[(o+1)%r.length]:c===`ArrowUp`?r[(o-1+r.length)%r.length]:c===`Home`?r[0]:c===`End`?r[r.length-1]:null;l&&(t.preventDefault(),l.focus(),l.scrollIntoView({block:`nearest`}))}),{open:(e,t={})=>h(e,t.focusFirst===!0,t.returnFocus??null),close:p,closeAll:m}}function m(e){return e===`done`||e===`failed`}function h(e,t){let n=e=>e.toLowerCase().replace(/\bthe\b/g,``).replace(/[^a-z]/g,``);return n(e)===n(t)}function g(e){return e<3e4?1e3:e<12e4?3e3:e<6e5?8e3:15e3}export{p as i,m as n,h as r,g as t};
|
package/static/reviews.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$ as e,A as t,B as n,C as r,D as i,E as a,F as o,G as s,H as c,I as l,J as ee,L as te,M as ne,N as re,O as ie,P as ae,Q as oe,R as u,S as d,T as se,U as ce,V as le,W as ue,X as de,Y as fe,Z as pe,_t as me,a as he,ct as ge,ft as _e,g as ve,gt as ye,h as be,i as xe,it as Se,j as Ce,k as we,m as Te,n as Ee,nt as De,o as Oe,pt as ke,q as Ae,r as je,rt as Me,s as Ne,t as Pe,u as Fe,ut as Ie,w as Le,x as Re,xt as ze,yt as Be,z as Ve}from"./chunk-DRtin0n-.js";import{T as He,a as Ue,c as We,f as Ge,i as Ke,l as qe,m as Je,n as Ye,r as Xe,s as Ze,t as Qe,u as $e}from"./chunk-CIJm20ER.js";import{n as et,t as tt}from"./chunk-DMxtqzNj.js";import{t as nt}from"./chunk-C8kkSv38.js";import{n as rt,r as it}from"./chunk-Ahis0VaG.js";function at(e,t){t.forEach((t,n)=>{e.children[n]!==t&&e.insertBefore(t,e.children[n]??null)})}async function ot(e,t,n){if(e.disabled)return;let r=e.getAttribute(`aria-pressed`)!==`true`;st(e,r),e.disabled=!0;let i=await t(r).catch(()=>!1);if(e.disabled=!1,!i)return st(e,!r);n(r)}function st(e,t){e.setAttribute(`aria-pressed`,String(t)),e.innerHTML=t?`★`:`☆`,e.setAttribute(`aria-label`,`${t?`Unpin`:`Pin`} this review`)}function ct(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 lt(e){return(e.dataset.collections??``).split(` `).filter(Boolean)}async function ut(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 dt=`prb-reviews-selection`;function ft(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 pt(e,t){return t===``||e.name.toLowerCase().includes(t.trim().toLowerCase())}function mt(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 ht(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},o=t.filter(e=>pt(e,r)).map(e=>a(e.id,e.name));pt({id:`none`,name:`Uncollected`},r)&&o.unshift(a(Le,`Uncollected`)),e.replaceChildren(...o)}function gt(e,t,n,r){let i=e.ownerDocument,a=t.filter(e=>pt(e,r)).map(e=>{let t=ce(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 _t(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 vt(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=We(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=Ze(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 yt(e){let t=e.dataset.id??``,n=e.dataset.placement;return n===void 0||n===`home`?t:`${t}|${n}`}function bt(e,t){let n=e.parentElement?.querySelector(`[data-history-list]`);n&&(n.hidden=!t,e.setAttribute(`aria-expanded`,String(t)))}function xt(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(yt),main:r?.scrollTop??0,...ke(e)}}function St(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 Ct(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`)&&Ve(e)&&typeof r==`number`&&Number.isInteger(r)&&r>15&&n.set(e,r);return n}function wt(e,t,n){if(!t)return;n.reveal(St(t,n.limits),Ct(t));let r=new Set(Be(t,`expanded`));for(let e of n.cards){let t=e.querySelector(`[data-history-toggle]`);t&&r.has(yt(e))&&bt(t,!0)}let i=ye(t,`main`);n.pane&&i!==null&&(n.pane.scrollTop=i),me(e,t.focus,t.focusVisible)}var Tt=_e({ownsRestore:!0});Pe(`/restart`);var f=[...document.querySelectorAll(`[data-card][data-placement="home"]`)].sort((e,t)=>Number(e.dataset.rank)-Number(t.dataset.rank)),p=new Map;function Et(){p=new Map;for(let e of document.querySelectorAll(`[data-card]`)){let t=e.dataset.id??``;p.set(t,[...p.get(t)??[],e])}}Et();function Dt(e,t){for(let n of p.get(e)??[])t(n)}function m(){return[...p.values()].flat()}var h=ct(document),Ot=[...document.querySelectorAll(`[data-operation]`)],kt=document.querySelector(`[data-section="in-progress"]`),At=e=>e.dataset.inProgressOnly!==void 0,jt=Object.fromEntries(d.map(e=>[e,document.querySelector(`[data-cards="${e}"]`)])),Mt=document.querySelector(`.prb-index`);function Nt(e){return{id:e.dataset.id??``,collections:lt(e),queue:e.dataset.queue===void 0?void 0:Number(e.dataset.queue),status:e.dataset.status??`new`,prState:e.dataset.prState}}var g=document.querySelector(`[data-search]`),_=document.querySelector(`[data-status-filter]`),v=document.querySelector(`[data-author-filter]`),y=document.querySelector(`[data-pr-filter]`),Pt=document.querySelector(`[data-no-matches]`),b=document.querySelector(`[data-count]`),Ft=document.querySelector(`[data-clear-filters]`),x=document.querySelector(`[data-collections-filter]`),It=document.querySelector(`[data-collections-filter-search]`);function Lt(){if(!x)return;x.hidden=h.length===0;let e=x.querySelector(`[data-collections-filter-label]`);e&&(e.textContent=ie(D.collections,h)),D.collections.length===0?delete x.dataset.active:x.dataset.active=``;let t=x.querySelector(`[data-collections-filter-options]`);t&&ht(t,h,D.collections,It?.value??``)}var S=te();function Rt(e){return{stored:Ie({state:e.dataset.lifecycle,at:Number(e.dataset.lifecycleAt)}),activity:De(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 l(zt(e),t,n,lt(e).length>0,D.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 C=new Map,w=document.querySelector(`[data-bulk]`),Ut=document.querySelector(`[data-bulk-count]`),Wt=document.querySelector(`[data-bulk-detail]`),Gt=document.querySelector(`[data-bulk-delete]`),Kt=document.querySelector(`[data-bulk-delete-label]`),qt=document.querySelector(`[data-bulk-exit]`),Jt=document.querySelector(`[data-bulk-more]`),Yt=document.querySelector(`[data-bulk-question]`),T=document.querySelector(`[data-bulk-confirm]`),Xt=document.querySelector(`[data-bulk-actions]`),E=document.querySelector(`[data-bulk-error]`),Zt=document.querySelector(`[data-bulk-select-all]`),D=s(window.location.hash),O=new Set,k=!1,A=document.querySelector(`[data-bulk-fetch]`),Qt={},j=[],$t=!1;function M(){let e=D.query.trim().toLowerCase();D.author!==``&&![...v?.options??[]].some(e=>e.value===D.author)&&(D.author=``),D.collections=D.collections.filter(e=>e===`none`||h.some(t=>t.id===e)),h.length===0&&(D.collections=[]);let t=Ht(ae(f.map(e=>({...Nt(e),searchText:e.dataset.searchText??``,author:e.dataset.author,card:e})),{...D,query:e}).map(e=>e.card)),n=t.filter(e=>!At(e));j=n;let r=new Set(ae(Ot.map(e=>({...Nt(e),searchText:e.dataset.searchText??``,author:e.dataset.author,entry:e})),{...D,query:e}).map(e=>e.entry));for(let e of Ot)e.hidden=!r.has(e);if(kt){kt.hidden=r.size===0;let e=kt.querySelector(`[data-section-count]`);e&&(e.textContent=String(r.size))}let i=n.filter(e=>Bt(e)!==void 0),a=de(i,e=>Bt(e),S),o=new Set(d.flatMap(e=>a[e].shown));for(let e of d){let t=jt[e];t&&at(t,a[e].shown);let n=document.querySelector(`[data-load-more="${e}"]`);n&&(n.hidden=a[e].total<=a[e].shown.length);let r=document.querySelector(`[data-section="${e}"]`);r&&(r.hidden=a[e].total===0);let i=r?.querySelector(`[data-section-count]`);i&&(i.textContent=String(a[e].total))}for(let e of en(n))o.add(e);for(let e of m())e.hidden=!o.has(e);if(g&&g.value!==D.query&&(g.value=D.query),v&&(v.value=D.author,D.author===``?delete v.dataset.active:v.dataset.active=``),y||(D.pr=`any`),y&&(y.value=D.pr,D.pr===`any`?delete y.dataset.active:y.dataset.active=``),_&&(_.value=D.filter,D.filter===`all`?delete _.dataset.active:_.dataset.active=``),Lt(),Ft&&(Ft.hidden=!u(D)),b){let e=e=>e.reduce((e,t)=>e+Number(t.dataset.reviews??1),0);b.textContent=Ce(e(t),t.length,u(D)?e(f):void 0)}Pt&&(Pt.hidden=t.length>0||r.size>0||f.length===0),xn(n)}function en(e){let r=document.querySelector(`[data-collections-area]`);if(!r)return[];let o=ue(D.filter),s=u(D),c=e.flatMap(e=>lt(e).map(t=>({card:e,collection:t}))),l=e=>{let{stored:t,activity:n}=Rt(e);return i(zt(e),t,n,D.filter)},ee=n(c,({card:e,collection:t})=>{let n=l(e);return n===void 0?void 0:`${n===`completed`?`collection-done`:`collection`}:${t}`},e=>C.get(e)??15),te=(e,t)=>(p.get(e)??[]).find(e=>e.dataset.placement===`collection:${t}`),ne=[],re=!1;for(let e of r.querySelectorAll(`[data-collection]`)){let n=e.dataset.collection??``,r=ee.get(`collection:${n}`)??{shown:[],total:0},i=ee.get(`collection-done:${n}`)??{shown:[],total:0},l=c.filter(e=>e.collection===n),ie=l.filter(e=>zt(e.card)).length,ae=D.collections.length>0&&!D.collections.includes(n),oe=!o&&!ae&&(!s||l.length>0);if(e.hidden=!oe,!oe)continue;re=!0;for(let[t,a]of[[`collection:${n}`,r],[`collection-done:${n}`,i]]){let r=a.shown.map(e=>te(e.card.dataset.id??``,n)).filter(e=>e!==void 0),i=e.querySelector(`[data-cards="${t}"]`);i&&at(i,r),ne.push(...r);let o=e.querySelector(`[data-load-more="${t}"]`);o&&(o.hidden=a.total<=a.shown.length)}let u=e.querySelector(`[data-section="collection:${n}"] > summary [data-section-count]`);u&&(u.textContent=se(r.total,ie));let d=e.querySelector(`[data-collection-empty]`),ce=a({active:r.total,completed:i.total,pinned:ie,members:l.length},s);d&&(d.hidden=ce===void 0,d.textContent=ce??``);let le=e.querySelector(`[data-section="collection-done:${n}"]`);le&&(le.hidden=i.total===0);let ue=e.querySelector(`[data-completed-label]`);ue&&(ue.textContent=t(i.total))}return r.hidden=o||!re,ne}var tn=300,N=null;function P(){N!==null&&window.clearTimeout(N),N=null,Tt.replace(o(D),{})}function F(e,t){if(D={...D,...e},S=te(),C=new Map,M(),t===`now`)return P();N!==null&&window.clearTimeout(N),N=window.setTimeout(P,tn)}window.addEventListener(`pagehide`,()=>{N!==null&&P()}),document.addEventListener(`click`,e=>{N!==null&&e.target?.closest?.(`a[href]`)&&P()},!0),g?.addEventListener(`input`,()=>F({query:g.value},`settled`)),g?.addEventListener(`keydown`,e=>{e.key===`Escape`&&g.value!==``&&(e.preventDefault(),F({query:``},`now`))}),_?.addEventListener(`change`,()=>{F({filter:_.value},`now`)}),v?.addEventListener(`change`,()=>{F({author:v.value},`now`)}),y?.addEventListener(`change`,()=>{F({pr:y.value},`now`)}),Ft?.addEventListener(`click`,()=>{F({query:Re.query,filter:Re.filter,author:Re.author,pr:Re.pr,collections:Re.collections},`now`),g?.focus()}),it(),document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-load-more]`)?.dataset.loadMore;if(t&&t.startsWith(`collection`)&&Ve(t))return C.set(t,(C.get(t)??15)+15),M();!t||!d.includes(t)||(S={...S,[t]:S[t]+15},M())});for(let e of[`popstate`,`hashchange`])window.addEventListener(e,()=>{D=s(window.location.hash),S=te(),C=new Map,M(),ln()});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;ot(t,e=>fetch(`/pin`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:n,pinned:e})}).then(e=>e.ok),e=>{Dt(n,n=>{n.dataset.pinned=String(e);let r=n.querySelector(`[data-pin]`);r&&r!==t&&st(r,e),Kn(n)}),M()})});async function nn(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 I(await on(r));n=(await r.json()).queue}catch{return I(an)}sn(n),M()}var rn=`That could not be saved. The workspace server refused it.`,an=`The workspace server did not answer. It may have stopped.`;function I(e){he(Ne(),{kind:`failed`,text:e})}async function on(e){let t=await e.json().catch(()=>null);return typeof t?.error==`string`?t.error:rn}function sn(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,Kn(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=Ae(n)}let n=document.querySelector(`[data-queue-option]`);n&&(n.textContent=ee(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&&bt(t,n.hidden!==!1)});var cn=document.querySelector(`.prb-shell > main`);function ln(){wt(document,Tt.current().ui,{cards:m(),pane:cn,limits:S,reveal:(e,t)=>{S=e,C=t,M()}})}Tt.setCapturer(()=>xt(document,m(),S,cn,C)),M(),ln();var L=et(document,{onOpen:vn,onClose:e=>{vn(e),window.setTimeout($,0)}});function un(){return document.querySelector(`[data-menu-trigger][aria-expanded="true"]`)!==null}var dn=0;async function fn(e){dn+=1;try{await e()}finally{--dn,$()}}var R=new Set,pn=`A change to this review is still being saved.`,mn=`A change to one of these reviews is still being saved. Try again once it is.`;async function hn(e,t){if(e.some(e=>R.has(e)))return!1;for(let t of e)R.add(t);gn(e);try{await t()}finally{for(let t of e)R.delete(t);gn(e)}return!0}function gn(e){let t=new Set(e);for(let e of m()){let n=e.dataset.id??``;if(!t.has(n))continue;let r=R.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 _n(e,t){await hn([e],()=>fn(t))||I(pn)}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,X(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 Wn(e,t,n);let r=t.closest(`[data-collections-for]`);if(r?.dataset.collectionsFor){e.preventDefault(),e.stopPropagation(),L.closeAll();let t=r.closest(`[data-card]`)?.querySelector(`[data-select]`)?.getAttribute(`aria-label`)?.replace(/^Select /,``);dr([r.dataset.collectionsFor],{card:t??`this review`});return}let i=t.closest(`[data-copy-id]`);if(i?.dataset.copyId){e.preventDefault(),e.stopPropagation(),He(i,i.dataset.copyId);return}let a=t.closest(`[data-fetch-review]`);if(a?.dataset.fetchReview){e.preventDefault(),e.stopPropagation(),L.closeAll();let t=a.closest(`[data-card]`);t&&xr([t]);return}let o=t.closest(`[data-mark-status]`);if(o?.dataset.markId){e.preventDefault(),e.stopPropagation(),L.closeAll();let t=o.dataset.markId;_n(t,()=>Rn(t,o.dataset.markStatus===`complete`));return}let s=t.closest(`[data-lifecycle-set]`);if(s?.dataset.lifecycleId){e.preventDefault(),e.stopPropagation(),L.closeAll();let t=s.dataset.lifecycleId;_n(t,Un(t,s.dataset.lifecycleSet));return}let c=t.closest(`[data-queue-action]`);if(c?.dataset.queueId){e.preventDefault(),e.stopPropagation(),L.closeAll();let t=c.dataset.queueId;_n(t,()=>nn(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(),yn(n);return}e.preventDefault(),e.stopPropagation()});async function yn(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)return void window.location.reload();bn(e,(await r.json().catch(()=>null))?.error??`That could not be deleted.`)}catch{bn(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 bn(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 z(e){k=e,e||O.clear(),Mt&&(e?Mt.dataset.selecting=``:delete Mt.dataset.selecting),document.querySelector(`[data-select-mode]`)?.setAttribute(`aria-pressed`,String(e)),!e&&Jt&&L.close(Jt);for(let t of document.querySelectorAll(`.prb-card-link`))e?t.setAttribute(`aria-disabled`,`true`):t.removeAttribute(`aria-disabled`);B(),M()}function B(){T&&(T.hidden=!0),Xt&&(Xt.hidden=!1),E&&(E.hidden=!0,E.textContent=``)}function xn(t){for(let e of m()){let t=O.has(e.dataset.id??``),n=e.querySelector(`[data-select]`);n&&(n.checked=t),t?e.dataset.selected=``:delete e.dataset.selected}if(!w||(w.hidden=!k,!k))return;let n=new Set(m().filter(Sn).map(e=>e.dataset.id)),r=[...O].filter(e=>!n.has(e)).length,i=new Set(t.map(e=>e.dataset.id)),a=[...O].every(e=>i.has(e))?i.size:null;O.size===0?w.dataset.empty=``:delete w.dataset.empty,Ut&&(Ut.textContent=e(O.size)),Wt&&(Wt.textContent=oe(O.size,a,r)),Zt&&(Zt.textContent=pe(t.length,O.size>0&&a!==null),Zt.disabled=t.every(e=>O.has(e.dataset.id??``))),Kt&&(Kt.textContent=ne(Fn()));for(let e of w.querySelectorAll(`[data-bulk-mark], [data-bulk-lifecycle], [data-bulk-queue], [data-bulk-collections], [data-bulk-delete]`))e.disabled=O.size===0;A&&(A.hidden=!Ye(Qt,_r(U())))}function Sn(e){return!e.hidden&&e.closest(`details:not([open]), [hidden]`)===null}function Cn(e){let t=[...e.querySelectorAll(`details[data-section]`)];for(let e of t)e.addEventListener(`toggle`,()=>xn(j));rt(t,(e,t)=>fetch(`/sections`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({section:e,collapsed:t})}))}Cn(document),document.querySelector(`[data-select-mode]`)?.addEventListener(`click`,()=>{z(!k)}),Zt?.addEventListener(`click`,()=>{for(let e of j)e.dataset.id&&O.add(e.dataset.id);B(),M()});function wn(e){O.has(e)?O.delete(e):O.add(e),B(),M()}document.addEventListener(`change`,e=>{let t=e.target.closest(`[data-select]`);t?.dataset.select&&wn(t.dataset.select)}),document.addEventListener(`click`,e=>{if(!k)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(),wn(n.dataset.id)))}),document.addEventListener(`keydown`,e=>{if(!k||e.key!==`Enter`)return;let t=e.target.closest(`.prb-card-link`)?.closest(`[data-card]`);t?.dataset.id&&(e.preventDefault(),wn(t.dataset.id))});var V=nt({doc:document,item:`[data-card]`,link:`.prb-card-link`,walk:()=>[...document.querySelectorAll(`[data-card]`)].filter(Sn),enterAllowed:()=>!k,background:()=>cn,leadIn:e=>[...e.closest(`[data-cards]`)?.querySelectorAll(`[data-card]:not([hidden])`)??[]][0]===e?e.closest(`details[data-section]`)?.querySelector(`summary`)??null:null});function Tn(){return V.holdsKeys()?V.current()?.querySelector(zn)??null:null}var En=8;function Dn(e){let t=e.querySelector(`.prb-card-link`);t&&(t.focus({preventScroll:!0}),document.activeElement!==t&&document.activeElement?.blur(),N!==null&&P(),Tt.leaving(),On=!0,window.location.assign(t.href))}var On=!1,kn={title:`Search reviews`,mount(e,t){let n=document.createElement(`input`);n.type=`search`,n.className=`prb-palette-input`,n.placeholder=g?.placeholder??``,n.setAttribute(`aria-label`,`Search reviews`),n.spellcheck=!1,n.value=g?.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=j.slice(0,En);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=j.length===0?`No reviews match.`:j.length>e.length?`The first ${e.length} of ${b?.textContent??j.length}`:b?.textContent??``},o=()=>[...i.querySelectorAll(`.prb-palette-result`)],s=e=>{let n=f.find(t=>t.dataset.id===e?.dataset.resultId);n&&(t(),Dn(n))};n.addEventListener(`input`,()=>{g&&(g.value=n.value,g.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()}},An={title:`Filters`,mount(e){let t=document.createElement(`p`);t.className=`prb-palette-summary`,t.setAttribute(`aria-live`,`polite`);let n=()=>{t.textContent=b?.textContent??``},r=[_,v,y].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 jn(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 Mn=Object.fromEntries(r.map(e=>[`reviews.section.${e}`,jn(e)]));function Nn(){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 H=document.querySelector(`[data-collection-new]`),Pn=Te(`reviews`,{...Mn,"reviews.search":{available:()=>g!==null,panel:kn},"reviews.filters":{available:()=>_!==null,panel:An},"reviews.collection.new":{available:()=>H!==null&&!H.disabled,run:()=>H?.click()},"reviews.collection.fold":{available:()=>Nn().length>0,panel:vt({collections:Nn,toggle:e=>{let t=document.querySelector(`[data-collection="${CSS.escape(e)}"] > details[data-section]`);t&&(t.open=!t.open)}})},"reviews.next":{run:()=>V.move(1)},"reviews.previous":{run:()=>V.move(-1)},"reviews.open":{available:()=>V.enterOpens(),run:()=>V.open()},"reviews.openInNewTab":{available:()=>V.enterOpens(),run:()=>V.openInNewTab()},"reviews.selection.exit":{available:Qn,run:()=>T&&!T.hidden?Xn(w?.contains(document.activeElement)??!1):Zn()},"reviews.menu":{available:()=>Tn()!==null,run:()=>{let e=Tn();e&&L.open(e,{focusFirst:!0,returnFocus:()=>V.refocus()})}}},{onOpen:()=>L.closeAll(),onSettle:()=>$()});function U(){return Ht(f.filter(e=>O.has(e.dataset.id??``)))}function Fn(){return U().reduce((e,t)=>e+Number(t.dataset.reviews??1),0)}function W(e){E&&(E.textContent=e,E.hidden=!1)}function G(e){for(let t of w?.querySelectorAll(`button`)??[])t.disabled=e}async function In(e){let t=[...O];if(t.length===0)return;G(!0);let n=null,r=await hn(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 G(!1),W(r?n??``:mn);Ln(U(),e),G(!1),z(!1)}function Ln(e,t){let n=t?`complete`:`in-progress`,r=t?`in-progress`:`complete`;for(let t of e.flatMap(e=>p.get(e.dataset.id??``)??[e])){t.dataset.status=n;for(let e of t.querySelectorAll(`.prb-card-status`))$e(e,n);let e=t.querySelector(`[data-mark-status]`);e&&(e.dataset.markStatus=r,e.textContent=le(r))}}async function Rn(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 I(await on(n))}catch{return I(an)}Ln(f.filter(t=>t.dataset.id===e),t),M()}var zn=`:scope > .prb-card-controls > [data-menu]:not([data-lifecycle-control])`;async function Bn(e,t){let n=e.closest(`[data-card]`),r=n?.dataset.id;if(!n||!r||R.has(r))return;let i=document.activeElement===e,a=Vn(n);Ge(e,!0);try{await _n(r,t)}finally{Ge(e,!1)}i&&Hn(e,a)}function Vn(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 Hn(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 Un(e,t){return async()=>{await Gn([e],t)||I(`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(),Bn(t,()=>Rn(n,t.dataset.status!==`complete`)))});function Wn(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(),L.close(n,{returnFocus:!0}),Bn(r,Un(i,a.dataset.lifecycleSet));return}let o=r.dataset.lifecyclePress;!t.closest(`[data-lifecycle-pill]`)||!o||o===`menu`||(e.preventDefault(),Bn(r,Un(i,o)))}async function Gn(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),Kn(e));return sn(n.queue),M(),!0}function Kn(e){let{stored:t,activity:n}=Rt(e),r=e.querySelector(`[data-lifecycle-pill]`);r&&qe(r,t,n);let i=e.querySelector(`[data-lifecycle-chip]`);if(i){let e=Me(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=!ge(e,t,n),r.textContent=Se(e,t,n)}}async function qn(e){let t=[...O];if(t.length===0)return;G(!0);let n=!1,r=await hn(t,async()=>{n=await Gn(t,e)});if(G(!1),!r)return W(mn);if(!n)return W(`That could not be saved. The workspace server refused it or did not answer.`);z(!1)}async function Jn(){let e=[...O];if(e.length===0)return;G(!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 G(!1),B(),W(`Nothing was deleted. The workspace server refused it.`)}catch{return G(!1),B(),W(`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 U()){let t=e.dataset.id??``;r.has(t)||Dt(t,e=>e.remove())}f=f.filter(e=>e.isConnected),Et(),O.clear();for(let e of r)O.add(e);if(G(!1),B(),n.length===0)return z(!1);M(),W([...new Set(n.map(e=>e.error))].join(` `))}async function Yn(){let e=U().map(e=>e.dataset.id??``).filter(Boolean);if(e.length===0)return;G(!0);let t=null,n=!1,r=await hn(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 G(!1),B(),W(r?`The workspace server did not answer. It may have stopped.`:mn);if(!t?.queue)return G(!1),B(),W(`Nothing was added. The workspace server refused it.`);sn(t.queue);let i=t.refused??[];O.clear();for(let e of i)O.add(e.id);if(G(!1),B(),i.length===0)return z(!1);M(),W([...new Set(i.map(e=>e.error))].join(` `))}w?.addEventListener(`click`,e=>{let t=e.target;if(Jt&&t.closest(`[data-bulk-more] [data-menu-panel] button`)&&L.close(Jt),t.closest(`[data-bulk-queue]`))return void Yn();if(t.closest(`[data-bulk-collections]`))return dr(U().map(e=>e.dataset.id??``).filter(Boolean),{selection:!0});let n=t.closest(`[data-bulk-mark]`);if(n)return void In(n.dataset.bulkMark===`complete`);let r=t.closest(`[data-bulk-lifecycle]`);if(r)return void qn(r.dataset.bulkLifecycle);if(t.closest(`[data-bulk-delete]`)){Yt&&(Yt.textContent=re(Fn())),Xt&&(Xt.hidden=!0),T&&(T.hidden=!1),e.detail===0&&w.querySelector(`[data-bulk-cancel-delete]`)?.focus();return}if(t.closest(`[data-bulk-confirm-delete]`))return void Jn();if(t.closest(`[data-bulk-cancel-delete]`))return Xn(e.detail===0);if(t.closest(`[data-bulk-exit]`))return Zn()});function Xn(e){B(),e&&Gt?.focus()}function Zn(){let e=w?.contains(document.activeElement)??!1;z(!1),e&&document.querySelector(`[data-select-mode]`)?.focus()}function Qn(e){return!k||qt?.disabled?!1:e===void 0||Je(e,document,!0)}var K=document.querySelector(`[data-collections-dialog]`),$n=document.querySelector(`[data-collections-dialog-list]`),q=document.querySelector(`[data-collections-dialog-search]`),J=document.querySelector(`[data-collections-dialog-create]`),er=document.querySelector(`[data-collections-dialog-error]`),tr=document.querySelector(`[data-collections-dialog-for]`),Y=[],nr=!1,rr=!1,ir=document.body.dataset.cardsSnapshot??``;function ar(e,t){return ut(e,t,ir)}function or(e){if(e.stale||e.area===void 0){try{let e={ids:[...O],selecting:k};window.sessionStorage.setItem(dt,JSON.stringify(e))}catch{}K?.close(),window.location.reload();return}let t=e.area,n=document.querySelector(`[data-collections-area]`);if(n){let e=n.contains(document.activeElement)?ke(document):null,r=document.createElement(`template`);r.innerHTML=t.trim();let i=r.content.firstElementChild;if(i){if(n.replaceWith(i),Cn(i),k)for(let e of i.querySelectorAll(`.prb-card-link`))e.setAttribute(`aria-disabled`,`true`);e&&me(document,e.focus,e.focusVisible)}}h=e.collections;for(let t of f){let n=e.memberOf[t.dataset.id??``]??[];t.dataset.collections=n.join(` `);let r=t.querySelector(`[data-collections-line]`),i=we(n,h);r&&(r.textContent=i??``,r.hidden=i===void 0)}for(let t of Ot){let n=e.operations?.[t.dataset.key??``];n&&(t.dataset.collections=n.join(` `))}Et(),yr(),M()}function X(e,t){let n=e.querySelector(`[data-collection-error]`);n&&(n.textContent=t??``,n.hidden=t===void 0)}It?.addEventListener(`input`,()=>Lt()),x?.addEventListener(`change`,e=>{let t=e.target.closest(`[data-collections-filter-option]`);if(!t)return;let n=t.checked?[...D.collections,t.value]:D.collections.filter(e=>e!==t.value);F({collections:[...new Set(n)]},`now`),x.querySelector(`[data-collections-filter-option][value="${CSS.escape(t.value)}"]`)?.focus()});var Z=document.querySelector(`[data-collection-new-dialog]`),Q=Z?.querySelector(`[data-collection-name-input]`)??null,sr=Z?.querySelector(`[data-collection-create]`)??null,cr=!1;function lr(){H&&(H.disabled=cr),Q&&(Q.readOnly=cr),sr&&(sr.disabled=cr||(Q?.value.trim()??``)===``)}H?.addEventListener(`click`,()=>{Z&&(L.closeAll(),Q&&(Q.value=``),lr(),X(Z,void 0),Z.showModal(),Q?.focus())}),Q?.addEventListener(`input`,()=>{lr(),Z&&X(Z,void 0)}),Z?.querySelector(`[data-collection-cancel]`)?.addEventListener(`click`,()=>Z.close()),Z?.addEventListener(`close`,()=>$()),document.addEventListener(`submit`,e=>{let t=e.target;if(t.matches(`[data-collection-new-form]`)){e.preventDefault();let n=Q?.value??``;if(n.trim()===``)return;cr=!0,lr(),ar(`/collections`,{action:`create`,name:n}).then(e=>{cr=!1,lr();let n=Z?.open===!0;if(!e.ok)return X(t,e.error);Z?.close(),or(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??``;ar(`/collections`,{action:`rename`,id:r,name:t}).then(e=>{if(!e.ok)return X(n,e.error);L.closeAll(),or(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;ar(`/collections`,{action:`delete`,id:t}).then(e=>{if(o.disabled=!1,!e.ok)return bn(n,e.error);L.closeAll(),or(e.answer),D.collections.includes(t)&&P(),document.querySelector(`[data-collection-new]`)?.focus()})}}function dr(e,t){!K||e.length===0||(L.closeAll(),Y=[...e],nr=!1,rr=`selection`in t,tr&&(tr.textContent=_t(e.length,`card`in t?t.card:void 0)),q&&(q.value=``),mr(void 0),pr(),K.showModal(),q?.focus())}function fr(){return Y.map(e=>lt(f.find(t=>t.dataset.id===e)??document.createElement(`div`)))}function pr(){let e=q?.value??``;$n&>($n,h,fr(),e);let t=mt(e,h);J&&(J.hidden=t===void 0,J.textContent=t===void 0?``:`Create “${t}” and add ${Y.length===1?`this review`:`these ${Y.length}`}`)}function mr(e){er&&(er.textContent=e??``,er.hidden=e===void 0)}async function hr(e){mr(void 0);let t=await ar(`/collections/members`,{ids:Y,...e});if(!t.ok)return mr(t.error),pr();nr=!0,or(t.answer);let n=t.answer.refused??[];n.length>0&&(Y=Y.filter(e=>!n.some(t=>t.id===e)),mr([...new Set(n.map(e=>e.error))].join(` `))),pr()}q?.addEventListener(`input`,()=>pr()),q?.addEventListener(`keydown`,e=>{e.key===`Enter`&&(e.preventDefault(),J&&!J.hidden&&J.click())}),J?.addEventListener(`click`,()=>{let e=mt(q?.value??``,h);e!==void 0&&hr({action:`add`,create:e}).then(()=>{q&&(q.value=``),pr(),q?.focus()})}),$n?.addEventListener(`change`,e=>{let t=e.target.closest(`[data-collections-dialog-option]`);if(!t)return;let n=c(t.dataset.membership??`none`),r=t.value;hr({action:n,collection:r}).then(()=>{$n.querySelector(`[data-collections-dialog-option][value="${CSS.escape(r)}"]`)?.focus()})}),document.querySelector(`[data-collections-dialog-close]`)?.addEventListener(`click`,()=>K?.close());try{let e=window.sessionStorage.getItem(dt);if(e){window.sessionStorage.removeItem(dt);let t=JSON.parse(e),n=Array.isArray(t.ids)?t.ids.filter(e=>typeof e==`string`):[];if(t.selecting===!0||n.length>0){z(!0);for(let e of ft(n,f))O.add(e);M()}}}catch{}K?.addEventListener(`close`,()=>{nr&&k&&rr&&z(!1),Y=[],$()}),ze(window,()=>window.location.reload());var gr=`prb-fetch-summary`;function _r(e){return e.map(e=>({lineage:(e.dataset.lineage??e.dataset.id??``).split(` `).filter(Boolean)}))}function vr(e){return Xe(_r(e),Qt)}function yr(){for(let e of m()){let t=e.querySelector(`[data-fetch-review]`);t&&(t.hidden=!Ye(Qt,_r([e])))}}async function br(){try{let e=await fetch(`/fetch-updates`);if(!e.ok)return;Qt=(await e.json()).targets??{}}catch{return}yr(),M()}async function xr(e,t){let n=vr(e);if($t||n.repositories===0)return;$t=!0;let r=[A,...document.querySelectorAll(`[data-fetch-review]`)];for(let e of r)e&&(e.disabled=!0);t&&(t.textContent=Ue(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{}$t=!1;for(let e of r)e&&(e.disabled=!1);t&&(t.textContent=Qe),M();let a=i??{repositories:n.repositories,fetched:0,failed:[],moved:0},o={kind:a.fetched<a.repositories?`failed`:`ready`,text:Ke(a)};if(a.moved>0||wr){try{window.sessionStorage.setItem(gr,JSON.stringify(o))}catch{}if(!Tr())return void window.location.reload();wr=!0}he(Ne(),o)}try{let e=window.sessionStorage.getItem(gr);if(e){window.sessionStorage.removeItem(gr);let t=JSON.parse(e);typeof t.kind==`string`&&typeof t.text==`string`&&he(Ne(),{kind:t.kind,text:t.text})}}catch{}A?.addEventListener(`click`,()=>void xr(U(),A)),xe(),br();var Sr=document.body.dataset.indexRevision??``,Cr=document.body.dataset.live===`true`?Date.now():0,wr=!1;function Tr(){let e=K?.open===!0||Z?.open===!0||document.activeElement?.closest(`[data-collections-area], [data-collections-filter]`)!=null;return O.size>0||document.activeElement===g||$t||Pn.isOpen()||On||e||un()||dn>0}function $(){wr&&!Tr()&&je()}async function Er(){try{let e=await fetch(`/revision`);if(e.ok){Fe(document,!0);let t=await e.json();Ee(document,t),t.live&&Cr===0&&(Cr=Date.now()),t.live||(Cr=0);let n=fe(Sr,t.revision??``,Tr());if(n===`reload`)return je(),null;n===`hold`&&(wr=!0)}}catch{Fe(document,!1)}return tt(Cr===0?2**53-1:Date.now()-Cr)}var Dr=ve(window,Er);be(document,()=>Dr.now()),g?.addEventListener(`blur`,$),document.addEventListener(`click`,()=>window.setTimeout($,0)),Oe();
|
|
1
|
+
import{$ as e,A as t,B as n,C as r,D as i,E as a,F as o,G as s,H as c,I as l,J as ee,L as te,M as ne,N as re,O as ie,P as ae,Q as oe,R as u,S as d,T as se,U as ce,V as le,W as ue,X as de,Y as fe,Z as pe,_t as me,a as he,ct as ge,ft as _e,g as ve,gt as ye,h as be,i as xe,it as Se,j as Ce,k as we,m as Te,n as Ee,nt as De,o as Oe,pt as ke,q as Ae,r as je,rt as Me,s as Ne,t as Pe,u as Fe,ut as Ie,w as Le,x as Re,xt as ze,yt as Be,z as Ve}from"./chunk-DRtin0n-.js";import{T as He,a as Ue,c as We,f as Ge,i as Ke,l as qe,m as Je,n as Ye,r as Xe,s as Ze,t as Qe,u as $e}from"./chunk-CIJm20ER.js";import{i as et,t as tt}from"./chunk-Cg4cN8Vk.js";import{t as nt}from"./chunk-C8kkSv38.js";import{n as rt,r as it}from"./chunk-Ahis0VaG.js";function at(e,t){t.forEach((t,n)=>{e.children[n]!==t&&e.insertBefore(t,e.children[n]??null)})}async function ot(e,t,n){if(e.disabled)return;let r=e.getAttribute(`aria-pressed`)!==`true`;st(e,r),e.disabled=!0;let i=await t(r).catch(()=>!1);if(e.disabled=!1,!i)return st(e,!r);n(r)}function st(e,t){e.setAttribute(`aria-pressed`,String(t)),e.innerHTML=t?`★`:`☆`,e.setAttribute(`aria-label`,`${t?`Unpin`:`Pin`} this review`)}function ct(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 lt(e){return(e.dataset.collections??``).split(` `).filter(Boolean)}async function ut(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 dt=`prb-reviews-selection`;function ft(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 pt(e,t){return t===``||e.name.toLowerCase().includes(t.trim().toLowerCase())}function mt(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 ht(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},o=t.filter(e=>pt(e,r)).map(e=>a(e.id,e.name));pt({id:`none`,name:`Uncollected`},r)&&o.unshift(a(Le,`Uncollected`)),e.replaceChildren(...o)}function gt(e,t,n,r){let i=e.ownerDocument,a=t.filter(e=>pt(e,r)).map(e=>{let t=ce(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 _t(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 vt(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=We(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=Ze(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 yt(e){let t=e.dataset.id??``,n=e.dataset.placement;return n===void 0||n===`home`?t:`${t}|${n}`}function bt(e,t){let n=e.parentElement?.querySelector(`[data-history-list]`);n&&(n.hidden=!t,e.setAttribute(`aria-expanded`,String(t)))}function xt(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(yt),main:r?.scrollTop??0,...ke(e)}}function St(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 Ct(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`)&&Ve(e)&&typeof r==`number`&&Number.isInteger(r)&&r>15&&n.set(e,r);return n}function wt(e,t,n){if(!t)return;n.reveal(St(t,n.limits),Ct(t));let r=new Set(Be(t,`expanded`));for(let e of n.cards){let t=e.querySelector(`[data-history-toggle]`);t&&r.has(yt(e))&&bt(t,!0)}let i=ye(t,`main`);n.pane&&i!==null&&(n.pane.scrollTop=i),me(e,t.focus,t.focusVisible)}var Tt=_e({ownsRestore:!0});Pe(`/restart`);var f=[...document.querySelectorAll(`[data-card][data-placement="home"]`)].sort((e,t)=>Number(e.dataset.rank)-Number(t.dataset.rank)),p=new Map;function Et(){p=new Map;for(let e of document.querySelectorAll(`[data-card]`)){let t=e.dataset.id??``;p.set(t,[...p.get(t)??[],e])}}Et();function Dt(e,t){for(let n of p.get(e)??[])t(n)}function m(){return[...p.values()].flat()}var h=ct(document),Ot=[...document.querySelectorAll(`[data-operation]`)],kt=document.querySelector(`[data-section="in-progress"]`),At=e=>e.dataset.inProgressOnly!==void 0,jt=Object.fromEntries(d.map(e=>[e,document.querySelector(`[data-cards="${e}"]`)])),Mt=document.querySelector(`.prb-index`);function Nt(e){return{id:e.dataset.id??``,collections:lt(e),queue:e.dataset.queue===void 0?void 0:Number(e.dataset.queue),status:e.dataset.status??`new`,prState:e.dataset.prState}}var g=document.querySelector(`[data-search]`),_=document.querySelector(`[data-status-filter]`),v=document.querySelector(`[data-author-filter]`),y=document.querySelector(`[data-pr-filter]`),Pt=document.querySelector(`[data-no-matches]`),b=document.querySelector(`[data-count]`),Ft=document.querySelector(`[data-clear-filters]`),x=document.querySelector(`[data-collections-filter]`),It=document.querySelector(`[data-collections-filter-search]`);function Lt(){if(!x)return;x.hidden=h.length===0;let e=x.querySelector(`[data-collections-filter-label]`);e&&(e.textContent=ie(D.collections,h)),D.collections.length===0?delete x.dataset.active:x.dataset.active=``;let t=x.querySelector(`[data-collections-filter-options]`);t&&ht(t,h,D.collections,It?.value??``)}var S=te();function Rt(e){return{stored:Ie({state:e.dataset.lifecycle,at:Number(e.dataset.lifecycleAt)}),activity:De(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 l(zt(e),t,n,lt(e).length>0,D.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 C=new Map,w=document.querySelector(`[data-bulk]`),Ut=document.querySelector(`[data-bulk-count]`),Wt=document.querySelector(`[data-bulk-detail]`),Gt=document.querySelector(`[data-bulk-delete]`),Kt=document.querySelector(`[data-bulk-delete-label]`),qt=document.querySelector(`[data-bulk-exit]`),Jt=document.querySelector(`[data-bulk-more]`),Yt=document.querySelector(`[data-bulk-question]`),T=document.querySelector(`[data-bulk-confirm]`),Xt=document.querySelector(`[data-bulk-actions]`),E=document.querySelector(`[data-bulk-error]`),Zt=document.querySelector(`[data-bulk-select-all]`),D=s(window.location.hash),O=new Set,k=!1,A=document.querySelector(`[data-bulk-fetch]`),Qt={},j=[],$t=!1;function M(){let e=D.query.trim().toLowerCase();D.author!==``&&![...v?.options??[]].some(e=>e.value===D.author)&&(D.author=``),D.collections=D.collections.filter(e=>e===`none`||h.some(t=>t.id===e)),h.length===0&&(D.collections=[]);let t=Ht(ae(f.map(e=>({...Nt(e),searchText:e.dataset.searchText??``,author:e.dataset.author,card:e})),{...D,query:e}).map(e=>e.card)),n=t.filter(e=>!At(e));j=n;let r=new Set(ae(Ot.map(e=>({...Nt(e),searchText:e.dataset.searchText??``,author:e.dataset.author,entry:e})),{...D,query:e}).map(e=>e.entry));for(let e of Ot)e.hidden=!r.has(e);if(kt){kt.hidden=r.size===0;let e=kt.querySelector(`[data-section-count]`);e&&(e.textContent=String(r.size))}let i=n.filter(e=>Bt(e)!==void 0),a=de(i,e=>Bt(e),S),o=new Set(d.flatMap(e=>a[e].shown));for(let e of d){let t=jt[e];t&&at(t,a[e].shown);let n=document.querySelector(`[data-load-more="${e}"]`);n&&(n.hidden=a[e].total<=a[e].shown.length);let r=document.querySelector(`[data-section="${e}"]`);r&&(r.hidden=a[e].total===0);let i=r?.querySelector(`[data-section-count]`);i&&(i.textContent=String(a[e].total))}for(let e of en(n))o.add(e);for(let e of m())e.hidden=!o.has(e);if(g&&g.value!==D.query&&(g.value=D.query),v&&(v.value=D.author,D.author===``?delete v.dataset.active:v.dataset.active=``),y||(D.pr=`any`),y&&(y.value=D.pr,D.pr===`any`?delete y.dataset.active:y.dataset.active=``),_&&(_.value=D.filter,D.filter===`all`?delete _.dataset.active:_.dataset.active=``),Lt(),Ft&&(Ft.hidden=!u(D)),b){let e=e=>e.reduce((e,t)=>e+Number(t.dataset.reviews??1),0);b.textContent=Ce(e(t),t.length,u(D)?e(f):void 0)}Pt&&(Pt.hidden=t.length>0||r.size>0||f.length===0),xn(n)}function en(e){let r=document.querySelector(`[data-collections-area]`);if(!r)return[];let o=ue(D.filter),s=u(D),c=e.flatMap(e=>lt(e).map(t=>({card:e,collection:t}))),l=e=>{let{stored:t,activity:n}=Rt(e);return i(zt(e),t,n,D.filter)},ee=n(c,({card:e,collection:t})=>{let n=l(e);return n===void 0?void 0:`${n===`completed`?`collection-done`:`collection`}:${t}`},e=>C.get(e)??15),te=(e,t)=>(p.get(e)??[]).find(e=>e.dataset.placement===`collection:${t}`),ne=[],re=!1;for(let e of r.querySelectorAll(`[data-collection]`)){let n=e.dataset.collection??``,r=ee.get(`collection:${n}`)??{shown:[],total:0},i=ee.get(`collection-done:${n}`)??{shown:[],total:0},l=c.filter(e=>e.collection===n),ie=l.filter(e=>zt(e.card)).length,ae=D.collections.length>0&&!D.collections.includes(n),oe=!o&&!ae&&(!s||l.length>0);if(e.hidden=!oe,!oe)continue;re=!0;for(let[t,a]of[[`collection:${n}`,r],[`collection-done:${n}`,i]]){let r=a.shown.map(e=>te(e.card.dataset.id??``,n)).filter(e=>e!==void 0),i=e.querySelector(`[data-cards="${t}"]`);i&&at(i,r),ne.push(...r);let o=e.querySelector(`[data-load-more="${t}"]`);o&&(o.hidden=a.total<=a.shown.length)}let u=e.querySelector(`[data-section="collection:${n}"] > summary [data-section-count]`);u&&(u.textContent=se(r.total,ie));let d=e.querySelector(`[data-collection-empty]`),ce=a({active:r.total,completed:i.total,pinned:ie,members:l.length},s);d&&(d.hidden=ce===void 0,d.textContent=ce??``);let le=e.querySelector(`[data-section="collection-done:${n}"]`);le&&(le.hidden=i.total===0);let ue=e.querySelector(`[data-completed-label]`);ue&&(ue.textContent=t(i.total))}return r.hidden=o||!re,ne}var tn=300,N=null;function P(){N!==null&&window.clearTimeout(N),N=null,Tt.replace(o(D),{})}function F(e,t){if(D={...D,...e},S=te(),C=new Map,M(),t===`now`)return P();N!==null&&window.clearTimeout(N),N=window.setTimeout(P,tn)}window.addEventListener(`pagehide`,()=>{N!==null&&P()}),document.addEventListener(`click`,e=>{N!==null&&e.target?.closest?.(`a[href]`)&&P()},!0),g?.addEventListener(`input`,()=>F({query:g.value},`settled`)),g?.addEventListener(`keydown`,e=>{e.key===`Escape`&&g.value!==``&&(e.preventDefault(),F({query:``},`now`))}),_?.addEventListener(`change`,()=>{F({filter:_.value},`now`)}),v?.addEventListener(`change`,()=>{F({author:v.value},`now`)}),y?.addEventListener(`change`,()=>{F({pr:y.value},`now`)}),Ft?.addEventListener(`click`,()=>{F({query:Re.query,filter:Re.filter,author:Re.author,pr:Re.pr,collections:Re.collections},`now`),g?.focus()}),it(),document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-load-more]`)?.dataset.loadMore;if(t&&t.startsWith(`collection`)&&Ve(t))return C.set(t,(C.get(t)??15)+15),M();!t||!d.includes(t)||(S={...S,[t]:S[t]+15},M())});for(let e of[`popstate`,`hashchange`])window.addEventListener(e,()=>{D=s(window.location.hash),S=te(),C=new Map,M(),ln()});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;ot(t,e=>fetch(`/pin`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:n,pinned:e})}).then(e=>e.ok),e=>{Dt(n,n=>{n.dataset.pinned=String(e);let r=n.querySelector(`[data-pin]`);r&&r!==t&&st(r,e),Kn(n)}),M()})});async function nn(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 I(await on(r));n=(await r.json()).queue}catch{return I(an)}sn(n),M()}var rn=`That could not be saved. The workspace server refused it.`,an=`The workspace server did not answer. It may have stopped.`;function I(e){he(Ne(),{kind:`failed`,text:e})}async function on(e){let t=await e.json().catch(()=>null);return typeof t?.error==`string`?t.error:rn}function sn(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,Kn(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=Ae(n)}let n=document.querySelector(`[data-queue-option]`);n&&(n.textContent=ee(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&&bt(t,n.hidden!==!1)});var cn=document.querySelector(`.prb-shell > main`);function ln(){wt(document,Tt.current().ui,{cards:m(),pane:cn,limits:S,reveal:(e,t)=>{S=e,C=t,M()}})}Tt.setCapturer(()=>xt(document,m(),S,cn,C)),M(),ln();var L=et(document,{onOpen:vn,onClose:e=>{vn(e),window.setTimeout($,0)}});function un(){return document.querySelector(`[data-menu-trigger][aria-expanded="true"]`)!==null}var dn=0;async function fn(e){dn+=1;try{await e()}finally{--dn,$()}}var R=new Set,pn=`A change to this review is still being saved.`,mn=`A change to one of these reviews is still being saved. Try again once it is.`;async function hn(e,t){if(e.some(e=>R.has(e)))return!1;for(let t of e)R.add(t);gn(e);try{await t()}finally{for(let t of e)R.delete(t);gn(e)}return!0}function gn(e){let t=new Set(e);for(let e of m()){let n=e.dataset.id??``;if(!t.has(n))continue;let r=R.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 _n(e,t){await hn([e],()=>fn(t))||I(pn)}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,X(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 Wn(e,t,n);let r=t.closest(`[data-collections-for]`);if(r?.dataset.collectionsFor){e.preventDefault(),e.stopPropagation(),L.closeAll();let t=r.closest(`[data-card]`)?.querySelector(`[data-select]`)?.getAttribute(`aria-label`)?.replace(/^Select /,``);dr([r.dataset.collectionsFor],{card:t??`this review`});return}let i=t.closest(`[data-copy-id]`);if(i?.dataset.copyId){e.preventDefault(),e.stopPropagation(),He(i,i.dataset.copyId);return}let a=t.closest(`[data-fetch-review]`);if(a?.dataset.fetchReview){e.preventDefault(),e.stopPropagation(),L.closeAll();let t=a.closest(`[data-card]`);t&&xr([t]);return}let o=t.closest(`[data-mark-status]`);if(o?.dataset.markId){e.preventDefault(),e.stopPropagation(),L.closeAll();let t=o.dataset.markId;_n(t,()=>Rn(t,o.dataset.markStatus===`complete`));return}let s=t.closest(`[data-lifecycle-set]`);if(s?.dataset.lifecycleId){e.preventDefault(),e.stopPropagation(),L.closeAll();let t=s.dataset.lifecycleId;_n(t,Un(t,s.dataset.lifecycleSet));return}let c=t.closest(`[data-queue-action]`);if(c?.dataset.queueId){e.preventDefault(),e.stopPropagation(),L.closeAll();let t=c.dataset.queueId;_n(t,()=>nn(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(),yn(n);return}e.preventDefault(),e.stopPropagation()});async function yn(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)return void window.location.reload();bn(e,(await r.json().catch(()=>null))?.error??`That could not be deleted.`)}catch{bn(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 bn(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 z(e){k=e,e||O.clear(),Mt&&(e?Mt.dataset.selecting=``:delete Mt.dataset.selecting),document.querySelector(`[data-select-mode]`)?.setAttribute(`aria-pressed`,String(e)),!e&&Jt&&L.close(Jt);for(let t of document.querySelectorAll(`.prb-card-link`))e?t.setAttribute(`aria-disabled`,`true`):t.removeAttribute(`aria-disabled`);B(),M()}function B(){T&&(T.hidden=!0),Xt&&(Xt.hidden=!1),E&&(E.hidden=!0,E.textContent=``)}function xn(t){for(let e of m()){let t=O.has(e.dataset.id??``),n=e.querySelector(`[data-select]`);n&&(n.checked=t),t?e.dataset.selected=``:delete e.dataset.selected}if(!w||(w.hidden=!k,!k))return;let n=new Set(m().filter(Sn).map(e=>e.dataset.id)),r=[...O].filter(e=>!n.has(e)).length,i=new Set(t.map(e=>e.dataset.id)),a=[...O].every(e=>i.has(e))?i.size:null;O.size===0?w.dataset.empty=``:delete w.dataset.empty,Ut&&(Ut.textContent=e(O.size)),Wt&&(Wt.textContent=oe(O.size,a,r)),Zt&&(Zt.textContent=pe(t.length,O.size>0&&a!==null),Zt.disabled=t.every(e=>O.has(e.dataset.id??``))),Kt&&(Kt.textContent=ne(Fn()));for(let e of w.querySelectorAll(`[data-bulk-mark], [data-bulk-lifecycle], [data-bulk-queue], [data-bulk-collections], [data-bulk-delete]`))e.disabled=O.size===0;A&&(A.hidden=!Ye(Qt,_r(U())))}function Sn(e){return!e.hidden&&e.closest(`details:not([open]), [hidden]`)===null}function Cn(e){let t=[...e.querySelectorAll(`details[data-section]`)];for(let e of t)e.addEventListener(`toggle`,()=>xn(j));rt(t,(e,t)=>fetch(`/sections`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({section:e,collapsed:t})}))}Cn(document),document.querySelector(`[data-select-mode]`)?.addEventListener(`click`,()=>{z(!k)}),Zt?.addEventListener(`click`,()=>{for(let e of j)e.dataset.id&&O.add(e.dataset.id);B(),M()});function wn(e){O.has(e)?O.delete(e):O.add(e),B(),M()}document.addEventListener(`change`,e=>{let t=e.target.closest(`[data-select]`);t?.dataset.select&&wn(t.dataset.select)}),document.addEventListener(`click`,e=>{if(!k)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(),wn(n.dataset.id)))}),document.addEventListener(`keydown`,e=>{if(!k||e.key!==`Enter`)return;let t=e.target.closest(`.prb-card-link`)?.closest(`[data-card]`);t?.dataset.id&&(e.preventDefault(),wn(t.dataset.id))});var V=nt({doc:document,item:`[data-card]`,link:`.prb-card-link`,walk:()=>[...document.querySelectorAll(`[data-card]`)].filter(Sn),enterAllowed:()=>!k,background:()=>cn,leadIn:e=>[...e.closest(`[data-cards]`)?.querySelectorAll(`[data-card]:not([hidden])`)??[]][0]===e?e.closest(`details[data-section]`)?.querySelector(`summary`)??null:null});function Tn(){return V.holdsKeys()?V.current()?.querySelector(zn)??null:null}var En=8;function Dn(e){let t=e.querySelector(`.prb-card-link`);t&&(t.focus({preventScroll:!0}),document.activeElement!==t&&document.activeElement?.blur(),N!==null&&P(),Tt.leaving(),On=!0,window.location.assign(t.href))}var On=!1,kn={title:`Search reviews`,mount(e,t){let n=document.createElement(`input`);n.type=`search`,n.className=`prb-palette-input`,n.placeholder=g?.placeholder??``,n.setAttribute(`aria-label`,`Search reviews`),n.spellcheck=!1,n.value=g?.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=j.slice(0,En);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=j.length===0?`No reviews match.`:j.length>e.length?`The first ${e.length} of ${b?.textContent??j.length}`:b?.textContent??``},o=()=>[...i.querySelectorAll(`.prb-palette-result`)],s=e=>{let n=f.find(t=>t.dataset.id===e?.dataset.resultId);n&&(t(),Dn(n))};n.addEventListener(`input`,()=>{g&&(g.value=n.value,g.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()}},An={title:`Filters`,mount(e){let t=document.createElement(`p`);t.className=`prb-palette-summary`,t.setAttribute(`aria-live`,`polite`);let n=()=>{t.textContent=b?.textContent??``},r=[_,v,y].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 jn(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 Mn=Object.fromEntries(r.map(e=>[`reviews.section.${e}`,jn(e)]));function Nn(){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 H=document.querySelector(`[data-collection-new]`),Pn=Te(`reviews`,{...Mn,"reviews.search":{available:()=>g!==null,panel:kn},"reviews.filters":{available:()=>_!==null,panel:An},"reviews.collection.new":{available:()=>H!==null&&!H.disabled,run:()=>H?.click()},"reviews.collection.fold":{available:()=>Nn().length>0,panel:vt({collections:Nn,toggle:e=>{let t=document.querySelector(`[data-collection="${CSS.escape(e)}"] > details[data-section]`);t&&(t.open=!t.open)}})},"reviews.next":{run:()=>V.move(1)},"reviews.previous":{run:()=>V.move(-1)},"reviews.open":{available:()=>V.enterOpens(),run:()=>V.open()},"reviews.openInNewTab":{available:()=>V.enterOpens(),run:()=>V.openInNewTab()},"reviews.selection.exit":{available:Qn,run:()=>T&&!T.hidden?Xn(w?.contains(document.activeElement)??!1):Zn()},"reviews.menu":{available:()=>Tn()!==null,run:()=>{let e=Tn();e&&L.open(e,{focusFirst:!0,returnFocus:()=>V.refocus()})}}},{onOpen:()=>L.closeAll(),onSettle:()=>$()});function U(){return Ht(f.filter(e=>O.has(e.dataset.id??``)))}function Fn(){return U().reduce((e,t)=>e+Number(t.dataset.reviews??1),0)}function W(e){E&&(E.textContent=e,E.hidden=!1)}function G(e){for(let t of w?.querySelectorAll(`button`)??[])t.disabled=e}async function In(e){let t=[...O];if(t.length===0)return;G(!0);let n=null,r=await hn(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 G(!1),W(r?n??``:mn);Ln(U(),e),G(!1),z(!1)}function Ln(e,t){let n=t?`complete`:`in-progress`,r=t?`in-progress`:`complete`;for(let t of e.flatMap(e=>p.get(e.dataset.id??``)??[e])){t.dataset.status=n;for(let e of t.querySelectorAll(`.prb-card-status`))$e(e,n);let e=t.querySelector(`[data-mark-status]`);e&&(e.dataset.markStatus=r,e.textContent=le(r))}}async function Rn(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 I(await on(n))}catch{return I(an)}Ln(f.filter(t=>t.dataset.id===e),t),M()}var zn=`:scope > .prb-card-controls > [data-menu]:not([data-lifecycle-control])`;async function Bn(e,t){let n=e.closest(`[data-card]`),r=n?.dataset.id;if(!n||!r||R.has(r))return;let i=document.activeElement===e,a=Vn(n);Ge(e,!0);try{await _n(r,t)}finally{Ge(e,!1)}i&&Hn(e,a)}function Vn(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 Hn(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 Un(e,t){return async()=>{await Gn([e],t)||I(`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(),Bn(t,()=>Rn(n,t.dataset.status!==`complete`)))});function Wn(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(),L.close(n,{returnFocus:!0}),Bn(r,Un(i,a.dataset.lifecycleSet));return}let o=r.dataset.lifecyclePress;!t.closest(`[data-lifecycle-pill]`)||!o||o===`menu`||(e.preventDefault(),Bn(r,Un(i,o)))}async function Gn(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),Kn(e));return sn(n.queue),M(),!0}function Kn(e){let{stored:t,activity:n}=Rt(e),r=e.querySelector(`[data-lifecycle-pill]`);r&&qe(r,t,n);let i=e.querySelector(`[data-lifecycle-chip]`);if(i){let e=Me(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=!ge(e,t,n),r.textContent=Se(e,t,n)}}async function qn(e){let t=[...O];if(t.length===0)return;G(!0);let n=!1,r=await hn(t,async()=>{n=await Gn(t,e)});if(G(!1),!r)return W(mn);if(!n)return W(`That could not be saved. The workspace server refused it or did not answer.`);z(!1)}async function Jn(){let e=[...O];if(e.length===0)return;G(!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 G(!1),B(),W(`Nothing was deleted. The workspace server refused it.`)}catch{return G(!1),B(),W(`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 U()){let t=e.dataset.id??``;r.has(t)||Dt(t,e=>e.remove())}f=f.filter(e=>e.isConnected),Et(),O.clear();for(let e of r)O.add(e);if(G(!1),B(),n.length===0)return z(!1);M(),W([...new Set(n.map(e=>e.error))].join(` `))}async function Yn(){let e=U().map(e=>e.dataset.id??``).filter(Boolean);if(e.length===0)return;G(!0);let t=null,n=!1,r=await hn(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 G(!1),B(),W(r?`The workspace server did not answer. It may have stopped.`:mn);if(!t?.queue)return G(!1),B(),W(`Nothing was added. The workspace server refused it.`);sn(t.queue);let i=t.refused??[];O.clear();for(let e of i)O.add(e.id);if(G(!1),B(),i.length===0)return z(!1);M(),W([...new Set(i.map(e=>e.error))].join(` `))}w?.addEventListener(`click`,e=>{let t=e.target;if(Jt&&t.closest(`[data-bulk-more] [data-menu-panel] button`)&&L.close(Jt),t.closest(`[data-bulk-queue]`))return void Yn();if(t.closest(`[data-bulk-collections]`))return dr(U().map(e=>e.dataset.id??``).filter(Boolean),{selection:!0});let n=t.closest(`[data-bulk-mark]`);if(n)return void In(n.dataset.bulkMark===`complete`);let r=t.closest(`[data-bulk-lifecycle]`);if(r)return void qn(r.dataset.bulkLifecycle);if(t.closest(`[data-bulk-delete]`)){Yt&&(Yt.textContent=re(Fn())),Xt&&(Xt.hidden=!0),T&&(T.hidden=!1),e.detail===0&&w.querySelector(`[data-bulk-cancel-delete]`)?.focus();return}if(t.closest(`[data-bulk-confirm-delete]`))return void Jn();if(t.closest(`[data-bulk-cancel-delete]`))return Xn(e.detail===0);if(t.closest(`[data-bulk-exit]`))return Zn()});function Xn(e){B(),e&&Gt?.focus()}function Zn(){let e=w?.contains(document.activeElement)??!1;z(!1),e&&document.querySelector(`[data-select-mode]`)?.focus()}function Qn(e){return!k||qt?.disabled?!1:e===void 0||Je(e,document,!0)}var K=document.querySelector(`[data-collections-dialog]`),$n=document.querySelector(`[data-collections-dialog-list]`),q=document.querySelector(`[data-collections-dialog-search]`),J=document.querySelector(`[data-collections-dialog-create]`),er=document.querySelector(`[data-collections-dialog-error]`),tr=document.querySelector(`[data-collections-dialog-for]`),Y=[],nr=!1,rr=!1,ir=document.body.dataset.cardsSnapshot??``;function ar(e,t){return ut(e,t,ir)}function or(e){if(e.stale||e.area===void 0){try{let e={ids:[...O],selecting:k};window.sessionStorage.setItem(dt,JSON.stringify(e))}catch{}K?.close(),window.location.reload();return}let t=e.area,n=document.querySelector(`[data-collections-area]`);if(n){let e=n.contains(document.activeElement)?ke(document):null,r=document.createElement(`template`);r.innerHTML=t.trim();let i=r.content.firstElementChild;if(i){if(n.replaceWith(i),Cn(i),k)for(let e of i.querySelectorAll(`.prb-card-link`))e.setAttribute(`aria-disabled`,`true`);e&&me(document,e.focus,e.focusVisible)}}h=e.collections;for(let t of f){let n=e.memberOf[t.dataset.id??``]??[];t.dataset.collections=n.join(` `);let r=t.querySelector(`[data-collections-line]`),i=we(n,h);r&&(r.textContent=i??``,r.hidden=i===void 0)}for(let t of Ot){let n=e.operations?.[t.dataset.key??``];n&&(t.dataset.collections=n.join(` `))}Et(),yr(),M()}function X(e,t){let n=e.querySelector(`[data-collection-error]`);n&&(n.textContent=t??``,n.hidden=t===void 0)}It?.addEventListener(`input`,()=>Lt()),x?.addEventListener(`change`,e=>{let t=e.target.closest(`[data-collections-filter-option]`);if(!t)return;let n=t.checked?[...D.collections,t.value]:D.collections.filter(e=>e!==t.value);F({collections:[...new Set(n)]},`now`),x.querySelector(`[data-collections-filter-option][value="${CSS.escape(t.value)}"]`)?.focus()});var Z=document.querySelector(`[data-collection-new-dialog]`),Q=Z?.querySelector(`[data-collection-name-input]`)??null,sr=Z?.querySelector(`[data-collection-create]`)??null,cr=!1;function lr(){H&&(H.disabled=cr),Q&&(Q.readOnly=cr),sr&&(sr.disabled=cr||(Q?.value.trim()??``)===``)}H?.addEventListener(`click`,()=>{Z&&(L.closeAll(),Q&&(Q.value=``),lr(),X(Z,void 0),Z.showModal(),Q?.focus())}),Q?.addEventListener(`input`,()=>{lr(),Z&&X(Z,void 0)}),Z?.querySelector(`[data-collection-cancel]`)?.addEventListener(`click`,()=>Z.close()),Z?.addEventListener(`close`,()=>$()),document.addEventListener(`submit`,e=>{let t=e.target;if(t.matches(`[data-collection-new-form]`)){e.preventDefault();let n=Q?.value??``;if(n.trim()===``)return;cr=!0,lr(),ar(`/collections`,{action:`create`,name:n}).then(e=>{cr=!1,lr();let n=Z?.open===!0;if(!e.ok)return X(t,e.error);Z?.close(),or(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??``;ar(`/collections`,{action:`rename`,id:r,name:t}).then(e=>{if(!e.ok)return X(n,e.error);L.closeAll(),or(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;ar(`/collections`,{action:`delete`,id:t}).then(e=>{if(o.disabled=!1,!e.ok)return bn(n,e.error);L.closeAll(),or(e.answer),D.collections.includes(t)&&P(),document.querySelector(`[data-collection-new]`)?.focus()})}}function dr(e,t){!K||e.length===0||(L.closeAll(),Y=[...e],nr=!1,rr=`selection`in t,tr&&(tr.textContent=_t(e.length,`card`in t?t.card:void 0)),q&&(q.value=``),mr(void 0),pr(),K.showModal(),q?.focus())}function fr(){return Y.map(e=>lt(f.find(t=>t.dataset.id===e)??document.createElement(`div`)))}function pr(){let e=q?.value??``;$n&>($n,h,fr(),e);let t=mt(e,h);J&&(J.hidden=t===void 0,J.textContent=t===void 0?``:`Create “${t}” and add ${Y.length===1?`this review`:`these ${Y.length}`}`)}function mr(e){er&&(er.textContent=e??``,er.hidden=e===void 0)}async function hr(e){mr(void 0);let t=await ar(`/collections/members`,{ids:Y,...e});if(!t.ok)return mr(t.error),pr();nr=!0,or(t.answer);let n=t.answer.refused??[];n.length>0&&(Y=Y.filter(e=>!n.some(t=>t.id===e)),mr([...new Set(n.map(e=>e.error))].join(` `))),pr()}q?.addEventListener(`input`,()=>pr()),q?.addEventListener(`keydown`,e=>{e.key===`Enter`&&(e.preventDefault(),J&&!J.hidden&&J.click())}),J?.addEventListener(`click`,()=>{let e=mt(q?.value??``,h);e!==void 0&&hr({action:`add`,create:e}).then(()=>{q&&(q.value=``),pr(),q?.focus()})}),$n?.addEventListener(`change`,e=>{let t=e.target.closest(`[data-collections-dialog-option]`);if(!t)return;let n=c(t.dataset.membership??`none`),r=t.value;hr({action:n,collection:r}).then(()=>{$n.querySelector(`[data-collections-dialog-option][value="${CSS.escape(r)}"]`)?.focus()})}),document.querySelector(`[data-collections-dialog-close]`)?.addEventListener(`click`,()=>K?.close());try{let e=window.sessionStorage.getItem(dt);if(e){window.sessionStorage.removeItem(dt);let t=JSON.parse(e),n=Array.isArray(t.ids)?t.ids.filter(e=>typeof e==`string`):[];if(t.selecting===!0||n.length>0){z(!0);for(let e of ft(n,f))O.add(e);M()}}}catch{}K?.addEventListener(`close`,()=>{nr&&k&&rr&&z(!1),Y=[],$()}),ze(window,()=>window.location.reload());var gr=`prb-fetch-summary`;function _r(e){return e.map(e=>({lineage:(e.dataset.lineage??e.dataset.id??``).split(` `).filter(Boolean)}))}function vr(e){return Xe(_r(e),Qt)}function yr(){for(let e of m()){let t=e.querySelector(`[data-fetch-review]`);t&&(t.hidden=!Ye(Qt,_r([e])))}}async function br(){try{let e=await fetch(`/fetch-updates`);if(!e.ok)return;Qt=(await e.json()).targets??{}}catch{return}yr(),M()}async function xr(e,t){let n=vr(e);if($t||n.repositories===0)return;$t=!0;let r=[A,...document.querySelectorAll(`[data-fetch-review]`)];for(let e of r)e&&(e.disabled=!0);t&&(t.textContent=Ue(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{}$t=!1;for(let e of r)e&&(e.disabled=!1);t&&(t.textContent=Qe),M();let a=i??{repositories:n.repositories,fetched:0,failed:[],moved:0},o={kind:a.fetched<a.repositories?`failed`:`ready`,text:Ke(a)};if(a.moved>0||wr){try{window.sessionStorage.setItem(gr,JSON.stringify(o))}catch{}if(!Tr())return void window.location.reload();wr=!0}he(Ne(),o)}try{let e=window.sessionStorage.getItem(gr);if(e){window.sessionStorage.removeItem(gr);let t=JSON.parse(e);typeof t.kind==`string`&&typeof t.text==`string`&&he(Ne(),{kind:t.kind,text:t.text})}}catch{}A?.addEventListener(`click`,()=>void xr(U(),A)),xe(),br();var Sr=document.body.dataset.indexRevision??``,Cr=document.body.dataset.live===`true`?Date.now():0,wr=!1;function Tr(){let e=K?.open===!0||Z?.open===!0||document.activeElement?.closest(`[data-collections-area], [data-collections-filter]`)!=null;return O.size>0||document.activeElement===g||$t||Pn.isOpen()||On||e||un()||dn>0}function $(){wr&&!Tr()&&je()}async function Er(){try{let e=await fetch(`/revision`);if(e.ok){Fe(document,!0);let t=await e.json();Ee(document,t),t.live&&Cr===0&&(Cr=Date.now()),t.live||(Cr=0);let n=fe(Sr,t.revision??``,Tr());if(n===`reload`)return je(),null;n===`hold`&&(wr=!0)}}catch{Fe(document,!1)}return tt(Cr===0?2**53-1:Date.now()-Cr)}var Dr=ve(window,Er);be(document,()=>Dr.now()),g?.addEventListener(`blur`,$),document.addEventListener(`click`,()=>window.setTimeout($,0)),Oe();
|