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/dist/server.js CHANGED
@@ -1,4 +1,4 @@
1
- import { $a as runnableAgents, $i as explanationOf, $n as authorPreview, $r as kissDecisionsOf, $t as recordRuntimeBestEffort, A as settleQueue, Ai as createWithMembers, An as moveIds, Ar as attemptIdOf, At as UpdateAlreadyRunningError, B as humanizeModelId, Ba as agentIdOf, Bi as queueStamp, Bn as existingPaths, Br as phasesFor, C as parsePullRequestLink, Ca as objectWithAnyOf, Ci as lifecyclePillAction, Cn as createPrState, Cr as followedBranch, Ct as RefreshUnavailableError, D as activateQueued, Da as resolveTarget, Di as sectionOf$1, Dn as markAllRead, Dr as fillFileUrlTemplate, E as relativeTime$1, Ea as kissOutcome, Ei as parseLifecycle, En as listNotifications, Er as forgeResolver, Et as mergeUpdateInto, Fa as shorthandOf, Fi as setMembership, Fn as retireNotification, Fr as pruneJobResidue, Ft as prepareReview, G as reviewTag, Ga as STORE_ROOT, Gi as issuesOutstanding, Gn as storedConversation, Gr as isClaimed, Gt as recordTelemetryUploadConsent, H as findingRef, Ha as readAgentPreference, Hi as doneVerb, Hn as adoptLegacyBaseline, Hr as purposeOf, Ht as record, Ia as git, Ii as updateCollections, In as toneOf, Ir as saveJob, It as settleReview, Ja as agentFor$1, Ji as reviewerDispositions, Jn as isUnchanged, Jr as followedRefName, Jt as BUILD_VERSION, K as reviewTagsIn, Ka as AGENT_IDS, Ki as questionsOutstanding, Kn as unforeseenFailure, Kt as telemetryUploadConsent, L as modelProvenanceOf, La as refExists, Li as queueAdd, Ln as unreadAround, Lt as reanalyseReview, Ma as resolveBase, Mi as nameProblemText, Mn as readNotification, Mr as fail$1, Mt as runningJobs, N as cliEntry, Na as AmbiguousRefError, Ni as readCollections, Nn as readStateOf, Nr as isTerminal, Nt as failureOf$1, O as compactQueue, Oa as originRemote, Oi as collectionsStamp, On as markRead, Or as RUN_RECORD_RETENTION_MS, Ot as updateReview, Pa as shortNameOf, Pi as renameCollection, Pn as removeNotification, Pr as loadJob, Pt as observeReview, Q as markAskRunning, Qa as parkedReason, Qi as explanationActionOf, Qn as UNESTABLISHED_MOTIVATION, Qr as kissDecisionRefusal, Qt as mapRuntimes, R as provenanceDetailLines, Ra as resolveAgent, Ri as queueAddMany, Rn as unreadCount$1, Rr as isLiveJob, Rt as runJob, S as extractPullRequestLinks, Sa as extractJsonText, Si as lifecycleName$1, Sn as createArchitectureNotification, Sr as checkReview, St as FETCH_TIMEOUT_MS, T as runBatch, Ta as WITHHELD_REASON, Ti as offersLifecycle, Tn as eventName, Tr as fetchHead, Tt as cancellableHere, U as findingRefs, Ua as writeAgentPreference, Ui as isIssueOutstanding, Un as prepareConversationWithin, V as findingAtRef, Va as clearAgentPreference, Vi as readQueue, Vn as ASK_REREAD_CEILING_MS, Vr as progressSteps, Vt as readEvents, W as refOf, Wi as isQuestionOutstanding, Wn as saveRefresh, X as isRequestId, Xa as detectAgents, Xi as processDiscussion, Xn as EXPLAIN_SIMPLY_PROMPT, Xr as indexKeptIds, Xt as feedbackUrl, Ya as agentIdentityOf, Yi as verdictClosure, Yn as agentEnvOf, Yr as groupByLineage, Za as isAgentId, Zi as recommendationsOf, Zn as chatConversationSection, Zr as indexReviewGroups, Zt as waitingHistory, _ as endRun, _a as statusLookup, _i as activityAttributes, _n as writeJsonAtomically, _r as requestJobStop, _t as parseWorkspacePort, a as lineageIds, aa as assessmentLookup, ai as mutateWorkspace, an as loadArchitecture, ar as escapeHtml$1, b as stopRun, ba as SEVERITIES, bi as lifecycleChip, bn as subjectOf, br as findExistingReview, bt as writePortPreference, c as discardJob, ca as findingAssessment, ci as previousKissResult, cn as repositoryKey, cr as ReviewBeingDeletedError, ct as serverEntryExists, d as startKissJob, da as gradeScale, dn as trackedFiles, dr as MANAGED_ROOT, ea as isExplanationAction, ei as latestKissRun, en as RUNTIME_WORDS, eo as versionFrom, er as hasAuthorContent, f as isDriving, fa as isGradeFor, fi as summarise, fn as ownersOf, fr as createWorktree, g as completeRun, ga as sourcePhrase, gi as LIFECYCLES, gn as isArchitectureId, gr as removeWorktree, gt as MIN_WORKSPACE_PORT, h as beginRun, ha as reassessIn, hi as workspaceStamps, hn as ancestorsOf, hr as readMarker, ht as MAX_WORKSPACE_PORT, i as deleteReview, ia as analysisRefOf, in as checkArchitecture, ir as CODE_COPY_CLASS, ja as isCommitReview, ji as deleteCollection, jn as pruneNotifications, jr as endedAt, jt as liveUpdateFor, ka as DetachedHeadError, ki as createCollection, kn as markReadForReview, kr as allJobs, kt as askCheckout, l as kissAgentId, la as findingIn, li as recentWorkspaces, ln as storeArchitecture, lr as isBusy, lt as spawnServer, m as RUN_KINDS, ma as promptGrade, mi as workspaceRevision, mn as REPOSITORY_SCOPE, mr as isWorktreeHeld, mt as DEFAULT_WORKSPACE_PORT, n as MCP_TOOL_NAMES, na as ANALYSIS_ONLY, ni as lineagePosition, nn as formatDuration, no as AgentCancelledError, nr as renderMarkdown, o as liveJobsFor, oa as closesFinding, on as partFiles, or as renderInlineText, ot as readServerRecord, p as track, pa as isOffered, pi as touchWorkspace, pn as QUOTE_LIMITS, pr as holdWorktree, pt as writeServerRecord, q as endAskRequest, qa as agentById, qi as resolvedByConversation, qn as refreshPrContext, qr as decideKissRecommendation, r as deleteLineage, ra as NO_STATUS, ri as loadWorkspace, rn as ARCHITECTURE_DIR, ro as AgentUnavailableError, rr as CODE_BLOCK_CLASS, rt as clearServerRecordOwnedBy, s as wasBlocked, sa as currentGradeIn, si as presentedKissRunOf, sn as readArchitecture, ta as withExplanation, ti as lineageKey, tn as describeRuntimes, tr as GITHUB_MARKDOWN, tt as readIndexToken, ua as findingStatus, ui as reviewedCommit, un as storedScopes, ur as withReviewLock, ut as stopChild, v as heldRuns, va as wasReassessed, vi as activityLabel, vn as announceJob, vt as resolveWorkspacePort, w as unsupportedReason, wa as describeAuthorship, wi as lifecyclePillLabel, wn as createPrUpdate, wr as reviewedShaOf, wt as cancelUpdate, x as batchIdentity, xa as asString, xi as lifecycleItemLabel, xn as categoryOf, xr as checkCodeFreshness, y as reportRun, ya as followUpFindingId, yi as isLifecycle, yn as branchOf, yt as statedWorkspacePort, z as agentDisplayName, za as resolveModel, zi as queueRemove, zn as withUsageRecorded, zr as isTerminalJobPhase } from "./mcp_tools-BKPpd9dN.js";
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-reading the threads, and what the last re-read found.
5018
+ * Re-checking the discussion, and what the last re-read found.
5019
5019
  *
5020
- * The narrowest useful action in the product, and the copy has to keep it narrow. This corrects
5021
- * what the review already claims about other people's threads — who raised one, whether it is
5022
- * still open — and it cannot produce a finding, because deciding whether a new comment changes
5023
- * anything is judgement and judgement is a fresh review. A reviewer who pressed this expecting a
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 every thread again and updates what this review says about them. If someone has
5033
- replied or resolved a thread since the review ran, the "Already raised" notes on the Issues
5034
- view will be corrected to match, and any note pointing at a thread that has been deleted will
5035
- be removed. Your code is not looked at again, so no findings are added, changed or removed.
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
- * Safe to run from here for the reason it always was: re-reading threads can only correct the
6450
- * state of claims that already exist, never produce a finding.
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 refresh comments and resolved threads without re-running the code review. Last checked ${when}.`;
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)}">Cancel update</button>`;
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
- return `<div class="prb-update-progress" data-update-phase="${escapeHtml$1(job.phase)}" role="status" aria-live="polite">
6603
- <h3 class="prb-doc-title"><span class="prb-spinner" aria-hidden="true"></span>Updating this review</h3>
6604
- <p class="prb-progress-lead">The previous review will be replaced when reassessment finishes.</p>
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">Any &ldquo;already raised&rdquo; note below, and whether each thread was still open, describes 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.</p>
7083
+ <p class="prb-discussion-age-body">The issues and questions below, their &ldquo;already raised&rdquo; 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">&middot;</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. Its “already raised” notes describe the discussion as it was then; <b>Re-check
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 notice = workspace.lastUpdate?.acknowledged ? void 0 : workspace.lastUpdate;
18340
- if (notice) mutateWorkspace(workspace.id, (current) => {
18341
- if (current.lastUpdate?.at === notice.at) current.lastUpdate.acknowledged = true;
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-read the pull request conversation, at the reviewer's request.
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
- * Answers 200 with `ok: false` rather than an error status when it does not work. The page's job
18574
- * here is to tell the reviewer what happened in a sentence, and a failed re-read is an outcome —
18575
- * the conversation on disk is untouched and the review is exactly as usable as it was a moment
18576
- * ago. An HTTP error would make the page choose between a stack trace and silence.
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
- adoptLegacyBaseline(workspace);
18581
- const startedAt = Date.now();
18668
+ const begun = Date.now();
18582
18669
  let outcome;
18583
18670
  try {
18584
- outcome = await refreshPrContext(workspace);
18585
- } catch {
18586
- outcome = unforeseenFailure(startedAt);
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
- saveRefresh(workspace, outcome, reattributing);
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.ok,
18593
- changed: outcome.changes ? !isUnchanged(outcome.changes) : false,
18594
- attributionsRestated: outcome.attributionsRestated ?? 0,
18595
- attributionsWithdrawn: outcome.attributionsWithdrawn ?? 0
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.92.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 n,m as t};
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?`&#9733;`:`&#9734;`,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&&gt($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?`&#9733;`:`&#9734;`,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&&gt($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();