prreviewbuddy 0.86.1 → 0.86.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,72 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.86.7
4
+
5
+ **Nothing jumps as the compact sidebar slides out.** The compact sidebar keeps room for the Review
6
+ path heading it does not draw, and gives KISS the same room as the full sidebar, tight before KISS
7
+ has run and wider once Recommendations sits under it. The rows are laid out at the full width from
8
+ the start of the slide, so labels no longer wrap to two lines part-way. Sliding out now only adds
9
+ the labels beside the icons; with the review path folded, no row moves up or down.
10
+
11
+ ## 0.86.6
12
+
13
+ **Ticks and dismissals are saved in the order you click them.** Marking questions answered and
14
+ dismissing issues in quick succession now saves them one after another, so a slow save can no
15
+ longer undo a newer one: dismiss one issue and then another, and both are kept. If saving fails,
16
+ the page shows what the workspace actually holds, including an earlier dismissal's "Changed since
17
+ you dismissed this" line, and says why.
18
+
19
+ **A refusal stays readable through a refresh.** When the Reviews or Runs page refreshes to show a
20
+ change made elsewhere, a notice saying why your change was not saved now stays on screen.
21
+
22
+ ## 0.86.5
23
+
24
+ **Unticking a question you answered earlier is saved again.** After marking one question answered
25
+ and then the one below it, unticking the first left it unsaved, with nothing on screen to say so.
26
+ It now goes back to its place in the list and is saved.
27
+
28
+ **A tick that could not be saved is put back from what the workspace holds.** When marking a
29
+ question answered fails, every question's tick is redrawn from the saved state, so no unsaved tick
30
+ stays on screen and a tick that was saved is kept.
31
+
32
+ **Saving a prompt that fails keeps the editor open.** The name and the prompt stay as you typed
33
+ them, with the reason in the editor, so Save can be pressed again.
34
+
35
+ ## 0.86.4
36
+
37
+ **Retry shows the run it started.** On a review whose analysis had stopped, Retry started the run
38
+ but left the page on "Retrying…" for good. The page now opens onto the run as soon as the workspace
39
+ has started it, and a Retry the workspace refuses says why beside the button.
40
+
41
+ **A change that was not saved says so.** Mark reviewed, Waiting, Done and the queue from a card's
42
+ menu on the Reviews page, Remove on the Runs page, Mark all read on Activity and saving a prompt now
43
+ show a notice when the workspace refuses the change or does not answer, instead of looking as if the
44
+ click missed. Marking a question answered or dismissing an issue is taken back on the card when it
45
+ was not saved, with the reason in a notice.
46
+
47
+ **The Reviews page no longer refreshes under an open menu.** A change found elsewhere waits while
48
+ a card's menu, its Delete question or a change chosen from it is open, and the page refreshes once
49
+ it closes.
50
+
51
+ ## 0.86.3
52
+
53
+ **A review you start appears in In progress at once.** The Reviews and Runs pages learned about new
54
+ work only on their next check, which on an idle page is up to fifteen seconds away, so a review
55
+ started from New review could sit unlisted for that long. Once the workspace accepts a start, a
56
+ queued one or a Retry included, the page checks immediately and lists it when you close the panel,
57
+ even if you closed it before the workspace answered.
58
+ A start that is refused or gets no answer changes nothing.
59
+
60
+ ## 0.86.2
61
+
62
+ **A clearer selection bar on the Reviews page.** The bar now says how many reviews are selected and
63
+ out of how many, with Select all beside it and an X to leave selection, which Escape also does. With
64
+ nothing ticked it asks for a selection instead of showing a row of disabled buttons. Add to queue is
65
+ the one filled action, Collections and Mark done sit beside it, and Mark reviewed, Mark not
66
+ reviewed, Move to active and Mark waiting are under More. Delete stays last, set apart, and still asks
67
+ first. Escape closes an open menu, the delete question, a dialog or a search before it leaves
68
+ selection.
69
+
3
70
  ## 0.86.1
4
71
 
5
72
  **Reconcile reads a reply against the right review.** A feedback draft now ends with the review its
@@ -16879,7 +16879,7 @@ async function runJob(workspaceId, runners = {}, reviewType = "standard", option
16879
16879
  outer?.addEventListener("abort", () => controller.abort(), { once: true });
16880
16880
  const unwatch = watchForStop(started.jobId, controller);
16881
16881
  try {
16882
- return await drive(started.jobId, workspaceId, runners, started.claim.claim.holder, controller.signal, options.source);
16882
+ return await drive(started.jobId, workspaceId, runners, started.claim.claim.holder, controller.signal, options.source, options.onStarted);
16883
16883
  } finally {
16884
16884
  unwatch();
16885
16885
  clearJobEnding(started.jobId);
@@ -16934,7 +16934,7 @@ function runOfJob(workspace, jobId) {
16934
16934
  if (!run) throw new Error("This KISS job has no run to write its answer to.");
16935
16935
  return run;
16936
16936
  }
16937
- async function drive(jobId, workspaceId, runners, driver, signal, source) {
16937
+ async function drive(jobId, workspaceId, runners, driver, signal, source, onStarted) {
16938
16938
  let job = loadJob(jobId);
16939
16939
  if (!job) throw new Error("No such job.");
16940
16940
  const now = runners.now ?? Date.now;
@@ -16946,6 +16946,7 @@ async function drive(jobId, workspaceId, runners, driver, signal, source) {
16946
16946
  ...source ? { source } : {}
16947
16947
  });
16948
16948
  saveJob(job);
16949
+ onStarted?.();
16949
16950
  try {
16950
16951
  signal?.throwIfAborted();
16951
16952
  const parked = parkedReason(job.env.agentId);
package/dist/main.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { $ as MIN_WORKSPACE_PORT, A as batchIdentity, Ar as positionInLineage, B as bootstrapUrl, Bn as readMarker, Dr as loadWorkspace, Fr as reviewedRepositories, Gn as findExistingReview, H as ensureServer, In as MANAGED_ROOT, Ir as summarise, J as stopServer, Ji as resolveTarget, Ki as WITHHELD_REASON, L as queueForReview, Mn as modelHelpLines, Nr as recentWorkspaces, Or as matchingWorkspaceIds, P as runBatch, Q as MAX_WORKSPACE_PORT, Un as describeMovement, Vn as removeWorktree, W as reviewsUrl, Wn as describeSubject, Y as workspaceUrl, Z as DEFAULT_WORKSPACE_PORT, Zn as forgeResolver, _ as runningJobs, _t as telemetryUploadConsent, a as wasBlocked, aa as resolveModel, ar as loadJob, bt as PACKAGE_NAME, ca as readAgentPreference, cr as PHASES, ct as reanalyseReview, d as mergeUpdateInto, da as STORE_ROOT, dt as append, er as allJobs, et as parseWorkspacePort, f as parkedUpdateRefusal, fa as AGENT_IDS, fr as progressSteps, g as liveUpdateFor, ga as detectAgents, gt as recordTelemetryUploadConsent, h as UpdateAlreadyRunningError, ht as deliver, i as liveJobsFor, ia as resolveAgent, k as relativeTime, kr as mutateWorkspace, la as writeAgentPreference, mr as clearClaim, mt as stamp, n as deleteReview$1, na as git, nt as statedWorkspacePort, ot as prepareReview, p as updateReview, pa as agentById, pr as purposeOf, pt as record$1, qi as kissOutcome, rt as writePortPreference, st as settleReview, ua as CONFIG_PATH, ut as startJob, va as parkedReason, vr as followedRefName, vt as telemetryUploadEnabled, y as recordKissRun, ya as runnableAgents, yt as BUILD_VERSION, z as readIndexToken } from "./delete_review-rwn_-SnJ.js";
2
+ import { $ as MIN_WORKSPACE_PORT, A as batchIdentity, Ar as positionInLineage, B as bootstrapUrl, Bn as readMarker, Dr as loadWorkspace, Fr as reviewedRepositories, Gn as findExistingReview, H as ensureServer, In as MANAGED_ROOT, Ir as summarise, J as stopServer, Ji as resolveTarget, Ki as WITHHELD_REASON, L as queueForReview, Mn as modelHelpLines, Nr as recentWorkspaces, Or as matchingWorkspaceIds, P as runBatch, Q as MAX_WORKSPACE_PORT, Un as describeMovement, Vn as removeWorktree, W as reviewsUrl, Wn as describeSubject, Y as workspaceUrl, Z as DEFAULT_WORKSPACE_PORT, Zn as forgeResolver, _ as runningJobs, _t as telemetryUploadConsent, a as wasBlocked, aa as resolveModel, ar as loadJob, bt as PACKAGE_NAME, ca as readAgentPreference, cr as PHASES, ct as reanalyseReview, d as mergeUpdateInto, da as STORE_ROOT, dt as append, er as allJobs, et as parseWorkspacePort, f as parkedUpdateRefusal, fa as AGENT_IDS, fr as progressSteps, g as liveUpdateFor, ga as detectAgents, gt as recordTelemetryUploadConsent, h as UpdateAlreadyRunningError, ht as deliver, i as liveJobsFor, ia as resolveAgent, k as relativeTime, kr as mutateWorkspace, la as writeAgentPreference, mr as clearClaim, mt as stamp, n as deleteReview$1, na as git, nt as statedWorkspacePort, ot as prepareReview, p as updateReview, pa as agentById, pr as purposeOf, pt as record$1, qi as kissOutcome, rt as writePortPreference, st as settleReview, ua as CONFIG_PATH, ut as startJob, va as parkedReason, vr as followedRefName, vt as telemetryUploadEnabled, y as recordKissRun, ya as runnableAgents, yt as BUILD_VERSION, z as readIndexToken } from "./delete_review-CwKZQlMg.js";
3
3
  import { basename, dirname, join, resolve } from "node:path";
4
4
  import { spawn } from "node:child_process";
5
5
  import { existsSync, mkdirSync, readdirSync, realpathSync, rmSync, statSync, writeFileSync } from "node:fs";
package/dist/server.js CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as MIN_WORKSPACE_PORT, $i as AmbiguousRefError, $n as RUN_RECORD_RETENTION_MS, $r as deleteCollection, $t as markRead, A as batchIdentity, Ai as findingAssessment, An as escapeHtml$1, At as loadArchitecture, Bi as wasReassessed, Bn as readMarker, Br as LIFECYCLES, Bt as ancestorsOf, C as RUN_KINDS, Ci as withExplanation, Cn as UNESTABLISHED_MOTIVATION, Cr as kissDecisionsOf, Ct as mapRuntimes, D as reportRun, Di as assessmentLookup, Dn as renderMarkdown, Dr as loadWorkspace, Dt as formatDuration, E as endRun, Ei as analysisRefOf, En as GITHUB_MARKDOWN, Er as lineagePosition, Et as describeRuntimes, F as activateQueued, Fi as isOffered, Fn as withReviewLock, Ft as storedScopes, G as serverEntryExists, Gi as describeAuthorship, Gn as findExistingReview, Gr as lifecycleItemLabel, Gt as subjectOf, Hi as asString, Hn as requestJobStop, Hr as activityLabel, Ht as writeJsonAtomically, I as compactQueue, Ii as promptGrade, In as MANAGED_ROOT, Ir as summarise, It as trackedFiles, Ji as resolveTarget, Jn as followedBranch, Jr as parseLifecycle, Jt as createPrState, K as spawnServer, Ki as WITHHELD_REASON, Kn as checkCodeFreshness, Kr as lifecyclePill, Kt as categoryOf, Li as reassessIn, Ln as createWorktree, Lr as touchWorkspace, Lt as ownersOf, M as parsePullRequestLink, Mi as findingStatus, Mr as previousKissResult, Mt as readArchitecture, N as unsupportedReason, Ni as gradeScale, Nn as ReviewBeingDeletedError, Nr as recentWorkspaces, Nt as repositoryKey, O as stopRun, Oi as closesFinding, On as CODE_BLOCK_CLASS, Ot as ARCHITECTURE_DIR, P as runBatch, Pi as isGradeFor, Pn as isBusy, Pr as reviewedCommit, Pt as storeArchitecture, Q as MAX_WORKSPACE_PORT, Qi as resolveBase, Qn as fillFileUrlTemplate, Qr as createWithMembers, Qt as markAllRead, R as settleQueue, Ri as sourcePhrase, Rn as holdWorktree, Rr as workspaceRevision, Rt as QUOTE_LIMITS, S as track, Si as isExplanationAction, Sn as chatConversationSection, Sr as kissDecisionRefusal, St as waitingHistory, T as completeRun, Ti as NO_STATUS, Tn as hasAuthorContent, Tr as lineageKey, Tt as RUNTIME_WORDS, U as readServerRecord, Ui as extractJsonText, Ur as isLifecycle, Ut as announceJob, V as clearServerRecordOwnedBy, Vi as followUpFindingId, Vn as removeWorktree, Vr as activityAttributes, Vt as isArchitectureId, Wi as objectWithAnyOf, Wr as lifecycleChip, Wt as branchOf, X as writeServerRecord, Xi as DetachedHeadError, Xn as fetchHead, Xr as collectionsStamp, Xt as eventName, Yi as originRemote, Yn as reviewedShaOf, Yr as sectionOf, Yt as createPrUpdate, Z as DEFAULT_WORKSPACE_PORT, Zi as isCommitReview, Zn as forgeResolver, Zr as createCollection, Zt as listNotifications, _ as runningJobs, _a as isAgentId, _i as verdictClosure, _n as unforeseenFailure, _r as decideKissRecommendation, _t as telemetryUploadConsent, a as wasBlocked, aa as resolveModel, ai as queueAdd, an as removeNotification, ar as loadJob, at as observeReview, b as startKissJob, ba as AgentCancelledError, bi as explanationActionOf, bn as agentEnvOf, br as indexKeptIds, c as RefreshUnavailableError, ca as readAgentPreference, ci as queueStamp, cn as unreadAround, ct as reanalyseReview, d as mergeUpdateInto, da as STORE_ROOT, di as isIssueOutstanding, dn as existingPaths, dr as phasesFor, ea as shortNameOf, ei as nameProblemText, en as markReadForReview, er as allJobs, et as parseWorkspacePort, fa as AGENT_IDS, fi as isQuestionOutstanding, fn as ASK_REREAD_CEILING_MS, fr as progressSteps, ft as readEvents, g as liveUpdateFor, ga as detectAgents, gi as reviewerDispositions, gn as storedConversation, gt as recordTelemetryUploadConsent, h as UpdateAlreadyRunningError, ha as agentIdentityOf, hi as resolvedByConversation, hn as saveRefresh, hr as isClaimed, i as liveJobsFor, ia as resolveAgent, ii as updateCollections, in as readStateOf, ir as isTerminal, it as failureOf$1, j as extractPullRequestLinks, ji as findingIn, jn as renderInlineText, jr as presentedKissRunOf, jt as partFiles, k as relativeTime$1, ki as currentGradeIn, kn as CODE_COPY_CLASS, kr as mutateWorkspace, kt as checkArchitecture, l as cancelUpdate, la as writeAgentPreference, li as readQueue, ln as unreadCount$1, lr as isLiveJob, lt as runJob, m as askCheckout, ma as agentFor$1, mi as questionsOutstanding, mn as prepareConversationWithin, n as deleteReview, na as git, ni as renameCollection, nn as pruneNotifications, nr as endedAt, nt as statedWorkspacePort, o as discardJob, oa as agentIdOf, oi as queueAddMany, on as retireNotification, or as pruneJobResidue, ot as prepareReview, p as updateReview, pa as agentById, pi as issuesOutstanding, pn as adoptLegacyBaseline, pr as purposeOf, pt as record, q as stopChild, qi as kissOutcome, qn as checkReview, qr as offersLifecycle, qt as createArchitectureNotification, r as lineageIds, ra as refExists, ri as setMembership, rn as readNotification, rr as fail$1, rt as writePortPreference, s as FETCH_TIMEOUT_MS, sa as clearAgentPreference, si as queueRemove, sn as toneOf, sr as saveJob, st as settleReview, t as deleteLineage, ta as shorthandOf, ti as readCollections, tn as moveIds, tr as attemptIdOf, tt as resolveWorkspacePort, u as cancellableHere, ui as doneVerb, un as withUsageRecorded, ur as isTerminalJobPhase, v as kissAgentId, va as parkedReason, vi as processDiscussion, vn as refreshPrContext, vr as followedRefName, w as beginRun, wi as ANALYSIS_ONLY, wn as authorPreview, wr as latestKissRun, wt as recordRuntimeBestEffort, x as isDriving, xa as AgentUnavailableError, xi as explanationOf, xn as EXPLAIN_SIMPLY_PROMPT, xr as indexReviewGroups, xt as feedbackUrl, ya as runnableAgents, yi as recommendationsOf, yn as isUnchanged, yr as groupByLineage, yt as BUILD_VERSION, z as readIndexToken, zi as statusLookup, zn as isWorktreeHeld, zr as workspaceStamps, zt as REPOSITORY_SCOPE } from "./delete_review-rwn_-SnJ.js";
1
+ import { $ as MIN_WORKSPACE_PORT, $i as AmbiguousRefError, $n as RUN_RECORD_RETENTION_MS, $r as deleteCollection, $t as markRead, A as batchIdentity, Ai as findingAssessment, An as escapeHtml$1, At as loadArchitecture, Bi as wasReassessed, Bn as readMarker, Br as LIFECYCLES, Bt as ancestorsOf, C as RUN_KINDS, Ci as withExplanation, Cn as UNESTABLISHED_MOTIVATION, Cr as kissDecisionsOf, Ct as mapRuntimes, D as reportRun, Di as assessmentLookup, Dn as renderMarkdown, Dr as loadWorkspace, Dt as formatDuration, E as endRun, Ei as analysisRefOf, En as GITHUB_MARKDOWN, Er as lineagePosition, Et as describeRuntimes, F as activateQueued, Fi as isOffered, Fn as withReviewLock, Ft as storedScopes, G as serverEntryExists, Gi as describeAuthorship, Gn as findExistingReview, Gr as lifecycleItemLabel, Gt as subjectOf, Hi as asString, Hn as requestJobStop, Hr as activityLabel, Ht as writeJsonAtomically, I as compactQueue, Ii as promptGrade, In as MANAGED_ROOT, Ir as summarise, It as trackedFiles, Ji as resolveTarget, Jn as followedBranch, Jr as parseLifecycle, Jt as createPrState, K as spawnServer, Ki as WITHHELD_REASON, Kn as checkCodeFreshness, Kr as lifecyclePill, Kt as categoryOf, Li as reassessIn, Ln as createWorktree, Lr as touchWorkspace, Lt as ownersOf, M as parsePullRequestLink, Mi as findingStatus, Mr as previousKissResult, Mt as readArchitecture, N as unsupportedReason, Ni as gradeScale, Nn as ReviewBeingDeletedError, Nr as recentWorkspaces, Nt as repositoryKey, O as stopRun, Oi as closesFinding, On as CODE_BLOCK_CLASS, Ot as ARCHITECTURE_DIR, P as runBatch, Pi as isGradeFor, Pn as isBusy, Pr as reviewedCommit, Pt as storeArchitecture, Q as MAX_WORKSPACE_PORT, Qi as resolveBase, Qn as fillFileUrlTemplate, Qr as createWithMembers, Qt as markAllRead, R as settleQueue, Ri as sourcePhrase, Rn as holdWorktree, Rr as workspaceRevision, Rt as QUOTE_LIMITS, S as track, Si as isExplanationAction, Sn as chatConversationSection, Sr as kissDecisionRefusal, St as waitingHistory, T as completeRun, Ti as NO_STATUS, Tn as hasAuthorContent, Tr as lineageKey, Tt as RUNTIME_WORDS, U as readServerRecord, Ui as extractJsonText, Ur as isLifecycle, Ut as announceJob, V as clearServerRecordOwnedBy, Vi as followUpFindingId, Vn as removeWorktree, Vr as activityAttributes, Vt as isArchitectureId, Wi as objectWithAnyOf, Wr as lifecycleChip, Wt as branchOf, X as writeServerRecord, Xi as DetachedHeadError, Xn as fetchHead, Xr as collectionsStamp, Xt as eventName, Yi as originRemote, Yn as reviewedShaOf, Yr as sectionOf, Yt as createPrUpdate, Z as DEFAULT_WORKSPACE_PORT, Zi as isCommitReview, Zn as forgeResolver, Zr as createCollection, Zt as listNotifications, _ as runningJobs, _a as isAgentId, _i as verdictClosure, _n as unforeseenFailure, _r as decideKissRecommendation, _t as telemetryUploadConsent, a as wasBlocked, aa as resolveModel, ai as queueAdd, an as removeNotification, ar as loadJob, at as observeReview, b as startKissJob, ba as AgentCancelledError, bi as explanationActionOf, bn as agentEnvOf, br as indexKeptIds, c as RefreshUnavailableError, ca as readAgentPreference, ci as queueStamp, cn as unreadAround, ct as reanalyseReview, d as mergeUpdateInto, da as STORE_ROOT, di as isIssueOutstanding, dn as existingPaths, dr as phasesFor, ea as shortNameOf, ei as nameProblemText, en as markReadForReview, er as allJobs, et as parseWorkspacePort, fa as AGENT_IDS, fi as isQuestionOutstanding, fn as ASK_REREAD_CEILING_MS, fr as progressSteps, ft as readEvents, g as liveUpdateFor, ga as detectAgents, gi as reviewerDispositions, gn as storedConversation, gt as recordTelemetryUploadConsent, h as UpdateAlreadyRunningError, ha as agentIdentityOf, hi as resolvedByConversation, hn as saveRefresh, hr as isClaimed, i as liveJobsFor, ia as resolveAgent, ii as updateCollections, in as readStateOf, ir as isTerminal, it as failureOf$1, j as extractPullRequestLinks, ji as findingIn, jn as renderInlineText, jr as presentedKissRunOf, jt as partFiles, k as relativeTime$1, ki as currentGradeIn, kn as CODE_COPY_CLASS, kr as mutateWorkspace, kt as checkArchitecture, l as cancelUpdate, la as writeAgentPreference, li as readQueue, ln as unreadCount$1, lr as isLiveJob, lt as runJob, m as askCheckout, ma as agentFor$1, mi as questionsOutstanding, mn as prepareConversationWithin, n as deleteReview, na as git, ni as renameCollection, nn as pruneNotifications, nr as endedAt, nt as statedWorkspacePort, o as discardJob, oa as agentIdOf, oi as queueAddMany, on as retireNotification, or as pruneJobResidue, ot as prepareReview, p as updateReview, pa as agentById, pi as issuesOutstanding, pn as adoptLegacyBaseline, pr as purposeOf, pt as record, q as stopChild, qi as kissOutcome, qn as checkReview, qr as offersLifecycle, qt as createArchitectureNotification, r as lineageIds, ra as refExists, ri as setMembership, rn as readNotification, rr as fail$1, rt as writePortPreference, s as FETCH_TIMEOUT_MS, sa as clearAgentPreference, si as queueRemove, sn as toneOf, sr as saveJob, st as settleReview, t as deleteLineage, ta as shorthandOf, ti as readCollections, tn as moveIds, tr as attemptIdOf, tt as resolveWorkspacePort, u as cancellableHere, ui as doneVerb, un as withUsageRecorded, ur as isTerminalJobPhase, v as kissAgentId, va as parkedReason, vi as processDiscussion, vn as refreshPrContext, vr as followedRefName, w as beginRun, wi as ANALYSIS_ONLY, wn as authorPreview, wr as latestKissRun, wt as recordRuntimeBestEffort, x as isDriving, xa as AgentUnavailableError, xi as explanationOf, xn as EXPLAIN_SIMPLY_PROMPT, xr as indexReviewGroups, xt as feedbackUrl, ya as runnableAgents, yi as recommendationsOf, yn as isUnchanged, yr as groupByLineage, yt as BUILD_VERSION, z as readIndexToken, zi as statusLookup, zn as isWorktreeHeld, zr as workspaceStamps, zt as REPOSITORY_SCOPE } from "./delete_review-CwKZQlMg.js";
2
2
  import { basename, isAbsolute, join, relative, resolve } from "node:path";
3
3
  import { execFile } from "node:child_process";
4
4
  import { existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, rmSync, statSync, writeFileSync } from "node:fs";
@@ -497,13 +497,14 @@ function statusLabel(status) {
497
497
  return status === "in-progress" ? "Not reviewed" : "New";
498
498
  }
499
499
  /**
500
- * The bulk bar's way to tick everything the filters show, across pages: "Select all 7".
500
+ * The bulk bar's way to tick everything the filters show, across pages.
501
501
  *
502
- * Counts the cards in view, because that is what it ticks. With PR set to Merged this is how a
503
- * reviewer clears the merged reviews in one go, by way of the existing Mark reviewed.
502
+ * Counted ("Select all 7") only while the headline is not already saying "of 7", so the number is
503
+ * on the bar once. With PR set to Merged this is how a reviewer clears the merged reviews in one go,
504
+ * by way of the existing Mark reviewed.
504
505
  */
505
- function selectAllLabel(inView) {
506
- return inView === 0 ? "Select all" : `Select all ${inView}`;
506
+ function selectAllLabel(inView, scopeShown = false) {
507
+ return inView === 0 || scopeShown ? "Select all" : `Select all ${inView}`;
507
508
  }
508
509
  /** The PR filter's options, in order, as the select shows them. */
509
510
  var PR_FILTER_OPTIONS = [
@@ -807,6 +808,12 @@ var PATHS = {
807
808
  warning: "<path d=\"M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z\"/><path d=\"M12 9v4M12 17h.01\"/>",
808
809
  forward: "<path d=\"M5 12h14\"/><path d=\"m12 5 7 7-7 7\"/>",
809
810
  plus: "<path d=\"M12 5v14M5 12h14\"/>",
811
+ "queue-add": "<path d=\"M3 6h12M3 12h9M3 18h9\"/><path d=\"M18 12v6M15 15h6\"/>",
812
+ folder: "<path d=\"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"/>",
813
+ "check-double": "<path d=\"m2 12 5 5L18 6\"/><path d=\"m13 15 2 2 7-11\"/>",
814
+ more: "<circle cx=\"5\" cy=\"12\" r=\"1\"/><circle cx=\"12\" cy=\"12\" r=\"1\"/><circle cx=\"19\" cy=\"12\" r=\"1\"/>",
815
+ trash: "<path d=\"M3 6h18\"/><path d=\"M8 6V4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2\"/><path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\"/><path d=\"M10 11v6M14 11v6\"/>",
816
+ close: "<path d=\"M18 6 6 18M6 6l12 12\"/>",
810
817
  "sidebar-collapse": "<rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\"/><path d=\"M9 4v16\"/><path d=\"m16 9-3 3 3 3\"/>",
811
818
  "sidebar-expand": "<rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\"/><path d=\"M9 4v16\"/><path d=\"m13 9 3 3-3 3\"/>"
812
819
  };
@@ -7494,6 +7501,7 @@ function renderPromptDialog() {
7494
7501
  <textarea data-prompt-text rows="5" maxlength="2000" placeholder="Check this change for N+1 database queries."></textarea>
7495
7502
  </label>
7496
7503
  <p class="prb-dialog-reassure">Saved prompts are yours and stay on this machine. They are offered in every review, and on any text you select.</p>
7504
+ <p class="prb-prompt-error" data-prompt-error role="alert" hidden></p>
7497
7505
  <div class="prb-dialog-actions">
7498
7506
  <button type="button" class="prb-dialog-danger" data-prompt-delete hidden>Delete</button>
7499
7507
  <span class="prb-dialog-spacer"></span>
@@ -10389,34 +10397,52 @@ function renderOperation(operation, review, positions, prStates, now, collection
10389
10397
  * The bulk bar, with its counts left out.
10390
10398
  *
10391
10399
  * Same division as the pager: every word is written here, where the house style tests read it, and
10392
- * the two labels that carry a number are filled in by the browser because only the browser knows
10393
- * what is ticked. It ships hidden and complete rather than being built on demand, so the sentence
10400
+ * the labels that carry a number are filled in by the browser because only the browser knows what
10401
+ * is ticked. It ships hidden and complete rather than being built on demand, so the sentence
10394
10402
  * somebody is asked to agree to before deleting a dozen reviews is not assembled in a client bundle.
10395
10403
  *
10396
- * Marking comes before deleting, and the two are separated: this bar is mostly a workflow control
10397
- * and occasionally a destructive one, and the destructive button should never be the one a hand
10398
- * lands on by default.
10404
+ * Two rows. The head says what is selected and holds the ways to change that: Select all, and the
10405
+ * way out (the X, which the command layer gives its Esc). The actions sit under it, and only once
10406
+ * something is ticked (`data-empty`, written by the client), so an empty bar is a sentence and two
10407
+ * controls rather than a row of disabled buttons.
10408
+ *
10409
+ * In the actions, one filled button for the move most selections are made for, the two other
10410
+ * common ones beside it, and the rest under More, which is the shared menu (`menu.ts`). Mark done
10411
+ * is one of the two and Mark reviewed is under More: reviewed is mostly marked on the review
10412
+ * itself, and finishing several at once is what this list is for. Delete is
10413
+ * last and set apart: this bar is mostly a workflow control and occasionally a destructive one, and
10414
+ * the destructive button should never be the one a hand lands on by default.
10399
10415
  *
10400
10416
  * The confirmation is a second state of the same bar, which is how the card menus already ask.
10401
10417
  */
10402
10418
  function renderBulkBar() {
10403
- return `<div class="prb-bulk" data-bulk hidden role="region" aria-label="Selected reviews">
10404
- <p class="prb-bulk-count" data-bulk-count aria-live="polite"></p>
10405
- <div class="prb-bulk-actions" data-bulk-actions>
10419
+ const DONE = LIFECYCLES.find((lifecycle) => lifecycle.id === "done");
10420
+ const icon = (name) => `<span class="prb-bulk-icon" aria-hidden="true">${iconSvg(name)}</span>`;
10421
+ return `<div class="prb-bulk" data-bulk data-empty hidden role="region" aria-label="Selected reviews">
10422
+ <div class="prb-bulk-head">
10423
+ <p class="prb-bulk-status" aria-live="polite"><span class="prb-bulk-count" data-bulk-count></span> <span class="prb-bulk-detail" data-bulk-detail></span></p>
10406
10424
  <button type="button" class="prb-bulk-button" data-bulk-select-all>${escapeHtml$1(selectAllLabel(0))}</button>
10425
+ <button type="button" class="prb-bulk-exit" data-bulk-exit aria-label="Exit selection">${icon("close")}</button>
10426
+ </div>
10427
+ <div class="prb-bulk-actions" data-bulk-actions>
10428
+ <button type="button" class="prb-bulk-button prb-bulk-primary" data-bulk-queue disabled>${icon("queue-add")}Add to queue</button>
10429
+ <button type="button" class="prb-bulk-button" data-bulk-collections disabled>${icon("folder")}Collections</button>
10430
+ <button type="button" class="prb-bulk-button" data-bulk-lifecycle="${DONE.id}">${icon("check-double")}${escapeHtml$1(DONE.action)}</button>
10407
10431
  <button type="button" class="prb-bulk-button" data-bulk-fetch hidden>${escapeHtml$1(FETCH_SELECTED_LABEL)}</button>
10408
- <button type="button" class="prb-bulk-button" data-bulk-queue disabled>Add to review queue</button>
10409
- <button type="button" class="prb-bulk-button" data-bulk-collections disabled>Manage collections</button>
10410
- <button type="button" class="prb-bulk-button" data-bulk-mark="complete">${markItemLabel("complete")}</button>
10411
- <button type="button" class="prb-bulk-button" data-bulk-mark="in-progress">${markItemLabel("in-progress")}</button>
10412
- ${LIFECYCLES.map((lifecycle) => `<button type="button" class="prb-bulk-button" data-bulk-lifecycle="${lifecycle.id}">${escapeHtml$1(lifecycle.action)}</button>`).join("\n ")}
10413
- <button type="button" class="prb-bulk-button prb-bulk-button-danger" data-bulk-delete></button>
10414
- <button type="button" class="prb-bulk-button prb-bulk-cancel" data-bulk-cancel>Cancel</button>
10432
+ <div class="prb-menu prb-bulk-more" data-menu data-bulk-more>
10433
+ <button type="button" class="prb-bulk-button" data-menu-trigger aria-expanded="false" aria-haspopup="true">${icon("more")}More</button>
10434
+ <div class="prb-menu-panel" data-menu-panel hidden>
10435
+ <button type="button" class="prb-menu-item" data-bulk-mark="complete">${markItemLabel("complete")}</button>
10436
+ <button type="button" class="prb-menu-item" data-bulk-mark="in-progress">${markItemLabel("in-progress")}</button>
10437
+ ${LIFECYCLES.filter((lifecycle) => lifecycle !== DONE).map((lifecycle) => `<button type="button" class="prb-menu-item" data-bulk-lifecycle="${lifecycle.id}">${escapeHtml$1(lifecycle.action)}</button>`).join("\n ")}
10438
+ </div>
10439
+ </div>
10440
+ <button type="button" class="prb-bulk-button prb-bulk-button-danger" data-bulk-delete>${icon("trash")}<span data-bulk-delete-label></span></button>
10415
10441
  </div>
10416
10442
  <div class="prb-bulk-confirm" data-bulk-confirm hidden>
10417
10443
  <p class="prb-bulk-question" data-bulk-question></p>
10418
10444
  <p class="prb-bulk-note">This cannot be undone. Your branches and their commits are untouched.</p>
10419
- <div class="prb-bulk-actions">
10445
+ <div class="prb-bulk-confirm-actions">
10420
10446
  <button type="button" class="prb-bulk-button prb-bulk-button-danger" data-bulk-confirm-delete>Delete</button>
10421
10447
  <button type="button" class="prb-bulk-button" data-bulk-cancel-delete>Cancel</button>
10422
10448
  </div>
@@ -11893,8 +11919,9 @@ feature: E</pre>
11893
11919
  id: "collections",
11894
11920
  title: "Collections",
11895
11921
  body: `<p>Collections help you organise related reviews, such as a refactor, release or feature.</p>
11896
- <p>Create a collection from the Reviews page, then add reviews individually or select several and
11897
- use <b>Manage collections</b>. A review can belong to multiple collections.</p>
11922
+ <p>Create a collection from the Reviews page, then add reviews individually with <b>Manage
11923
+ collections</b> in a review's menu, or select several and use <b>Collections</b> in the selection
11924
+ bar. A review can belong to multiple collections.</p>
11898
11925
  <p>Collections show reviews that still need attention. When you mark a review <b>Done</b>, it moves
11899
11926
  under <b>Show completed</b> within its collection, without losing its membership.</p>
11900
11927
  <p>You can collapse collections to stay focused, and expand them when you're ready to continue.
@@ -17522,10 +17549,10 @@ async function handleUpdate(req, res, workspace) {
17522
17549
  /**
17523
17550
  * Resume a job that stopped, rather than start one over.
17524
17551
  *
17525
- * Fires and returns at once, exactly as starting a job does: `runJob` can take minutes, and this
17526
- * route answers a button click, not a session that is waiting for the review. `runJob` records
17527
- * every outcome, success or failure, on the job itself before it resolves or rejects, so there is
17528
- * nothing left worth doing with a rejection here except not letting it become an unhandled one.
17552
+ * Answers as soon as the new attempt is recorded, not when it ends: `runJob` can take minutes, and
17553
+ * this route answers a button click, not a session that is waiting for the review. `runJob` records
17554
+ * every later outcome, success or failure, on the job itself, so a rejection after the answer has
17555
+ * nothing left worth doing except not becoming an unhandled one.
17529
17556
  *
17530
17557
  * Refused up front when the job is not terminal, rather than left to `runJob`'s own guard: a job
17531
17558
  * that is still running has nothing here worth retrying, and saying so is cheaper and clearer than
@@ -17542,8 +17569,19 @@ async function handleRetry(res, workspace) {
17542
17569
  if (!workspace.jobId) return send(res, 404, { error: "No job for this review." });
17543
17570
  const job = loadJob(workspace.jobId);
17544
17571
  if (!job || !isTerminal(job) || isClaimed(job.id)) return send(res, 409, { error: "This review is still being made. Wait for it to finish before retrying." });
17545
- track(runJob(workspace.id, {}, "standard", { source: "workspace" })).catch(() => {});
17546
- send(res, 200, { ok: true });
17572
+ await new Promise((resolve) => {
17573
+ const run = runJob(workspace.id, {}, "standard", {
17574
+ source: "workspace",
17575
+ onStarted: () => {
17576
+ send(res, 200, { ok: true });
17577
+ resolve();
17578
+ }
17579
+ });
17580
+ track(run).catch((error) => {
17581
+ if (!res.headersSent) send(res, 409, { error: error instanceof Error ? error.message : String(error) });
17582
+ resolve();
17583
+ });
17584
+ });
17547
17585
  }
17548
17586
  /**
17549
17587
  * Analyse this review again, at the commit it describes, with the agent that made it.
@@ -18108,7 +18146,9 @@ async function handleState(req, res, workspace) {
18108
18146
  ok: true,
18109
18147
  completedAt: saved.completedAt ?? null,
18110
18148
  pinned: saved.pinned === true,
18111
- queued: readQueue().includes(saved.id)
18149
+ queued: readQueue().includes(saved.id),
18150
+ answeredQuestionIds: saved.session.answeredQuestionIds ?? [],
18151
+ dismissedIssues: saved.session.dismissedIssues ?? []
18112
18152
  });
18113
18153
  }
18114
18154
  var KISS_DECISION_VALUES = [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prreviewbuddy",
3
- "version": "0.86.1",
3
+ "version": "0.86.7",
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",
@@ -0,0 +1 @@
1
+ import{gt as e}from"./chunk-D9x9bcKf.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};
@@ -0,0 +1 @@
1
+ function e(e,t){e.addEventListener(`pageshow`,e=>{e.persisted&&t()})}var t=[`checkbox`,`radio`,`button`,`submit`,`reset`].map(e=>`:not([type="${e}"])`).join(``);function n(e){if(!e||typeof e.closest!=`function`)return!1;let n=e;return n.isContentEditable?!0:n.closest(`input${t}, textarea, select, [contenteditable=""], [contenteditable="true"]`)!==null}var r=`prbNav`,i=`prb-workspace`,a=`prb-nav-session`,o=`prb-nav-head`,s=`prb-nav-handoff`,c=`prb-nav-places`,l=200,u=15e3,d=`unstored`;function f(e){if(!e||typeof e!=`object`)return null;let t=e[r];if(!t||typeof t!=`object`)return null;let{v:n,owner:i,session:a,idx:o,id:s,ui:c}=t;if(n!==1||i!==`prb-workspace`||typeof a!=`string`||a===``||typeof o!=`number`||!Number.isInteger(o)||o<0)return null;let l=c&&typeof c==`object`&&!Array.isArray(c)?c:null;return{v:n,owner:i,session:a,idx:o,...typeof s==`string`&&s!==``?{id:s}:{},ui:l}}function p(e){if(!e||typeof e!=`object`)return{};let{[r]:t,...n}=e;return n}function m(e,t){if(!e||typeof e!=`object`)return!1;let n=e;return n.owner===`prb-workspace`&&n.session===t}function h(e,t){try{return e?.getItem(t)??null}catch{return null}}function g(e,t,n){try{n===null?e?.removeItem(t):e?.setItem(t,n)}catch{}}function _(e){let{history:t,storage:n,location:_}=e,v=e.navigation??null,y=[],b=null,x=null,S=null,C=t=>{S!==null&&e.clearTimeout(S),S=t?t():null,e.capturePending(S!==null)},w=null,T=(()=>{if(!n)return d;let t=h(n,a);if(t)return t;let r=e.uuid();return g(n,a,r),h(n,a)===r?r:d})(),E=()=>`${_.pathname}${_.search}`,D=e=>`${E()}${e}`,O=()=>{try{v?.updateCurrentEntry({state:{owner:i,session:T}})}catch{}},k=()=>{for(let e of y)e()},A=(e,n)=>{n===void 0?t.replaceState(e,``):t.replaceState(e,``,n),O()},j=()=>Number(h(n,o)??0)||0,M=()=>{try{let e=JSON.parse(h(n,c)??`{}`);return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}catch{return{}}},ee=(e,t)=>{if(!e||!n)return;let r=M();delete r[e],r[e]=t;let i=Object.keys(r);for(let e of i.slice(0,Math.max(0,i.length-l)))delete r[e];g(n,c,JSON.stringify(r))},te=e=>{if(!e)return null;let t=e.id?M()[e.id]:void 0;return t&&typeof t==`object`&&!Array.isArray(t)?t:e.ui},ne=()=>{if(!b)return null;try{return b()}catch{return null}},re=()=>{let a=f(t.state);if(a&&a.session===T&&a.id){w=a.id,O();return}let c=a?.idx??0;if(!a){let t=h(n,s);g(n,s,null),c=0;try{let n=t?JSON.parse(t):null,r=e.referrer!==``&&new URL(e.referrer).origin===_.origin;n&&r&&n.session===T&&typeof n.idx==`number`&&typeof n.at==`number`&&e.now()-n.at<u&&(c=n.idx+1)}catch{c=0}g(n,o,String(c))}let l=a?.id??e.uuid();w=l;let d={v:1,owner:i,session:T,idx:c,id:l,ui:a?.ui??null};A({...p(t.state),[r]:d})},N=()=>f(t.state)??{v:1,owner:`prb-workspace`,session:T,idx:0,ui:null},P=()=>{S!==null&&C(null);let e=ne();if(!e||!w)return;let n=JSON.stringify(e),i=f(t.state);if(!i||i.id!==w){ee(w,e);return}(n!==x||JSON.stringify(i.ui)!==n)&&(x=n,ee(w,e),A({...p(t.state),[r]:{...i,ui:e}}))},F=e=>{if(v){let t=v.currentEntry?.index;if(typeof t!=`number`||t<0)return!1;let n=v.entries()[t+e];if(!n)return!1;try{return m(n.getState(),T)}catch{return!1}}let n=f(t.state);return!n||n.session!==T||t.length<2?!1:e===-1?n.idx>0:n.idx<j()};re();try{t.scrollRestoration=`manual`}catch{}return{session:T,current(){return{route:p(t.state),ui:te(f(t.state))}},push(a,s){if(a!==``&&!a.startsWith(`#`))throw Error(`Workspace history pushes within this document only; "${a}" is not a fragment.`);if(D(a)===`${E()}${_.hash}`)return!1;P();let c=N().idx+1;g(n,o,String(c));let l=e.uuid(),u={v:1,owner:i,session:T,idx:c,id:l,ui:null};return w=l,t.pushState({...p(s),[r]:u},``,D(a)),x=null,O(),k(),!0},replace(e,t){if(e!==``&&!e.startsWith(`#`))throw Error(`Workspace history replaces within this document only; "${e}" is not a fragment.`);A({...p(t),[r]:N()},D(e))},setCapturer(e){b=e},captureNow:P,scheduleCapture(){C(()=>e.setTimeout(P,250))},leaving(){P(),g(n,s,JSON.stringify({session:T,idx:N().idx,at:e.now()}))},canGoBack:()=>F(-1),canGoForward:()=>F(1),back(){return F(-1)?(P(),t.back(),!0):!1},forward(){return F(1)?(P(),t.forward(),!0):!1},moved(){S!==null&&C(null);let e=ne();e&&ee(w,e),x=null,w=f(t.state)?.id??null;let n=f(t.state);!n||!n.id||n.session!==T?re():O(),k()},onAvailability(e){y.push(e)}}}function v(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}function y(e){let t=e?.userAgentData?.platform??e?.platform??``;return/mac|iphone|ipad/i.test(t)}function b(e,t,r){if(e.defaultPrevented||e.isComposing)return null;let i=t?e.metaKey:e.ctrlKey,a=t?e.ctrlKey:e.metaKey;if(!i||a||e.altKey||e.shiftKey)return null;let o=e.key===`[`||e.key!==`]`&&e.code===`BracketLeft`?`back`:e.key===`]`||e.code===`BracketRight`?`forward`:null;return!o||n(e.target)||r.querySelector(`dialog[open], [data-menu-panel]:not([hidden])`)?null:o}var x=[`data-id`,`data-finding-card`,`data-goto-section`,`data-view-nav`,`data-file`,`data-line`,`data-history`,`data-history-toggle`,`data-load-more`,`data-select`,`data-pin`,`data-focus-toggle`,`data-ask-toggle`,`data-rail-toggle`,`data-search`,`data-status-filter`,`data-author-filter`,`data-pr-filter`,`data-card`,`data-placement`,`data-collection`,`data-notification-id`,`data-guide-section`,`data-guide-detail`,`data-view`];function S(e){if(e.id)return{attrs:[[`id`,e.id]]};let t=x.filter(t=>e.hasAttribute(t)).map(t=>[t,e.getAttribute(t)??``]);return t.length>0?{attrs:t}:null}function C(e,t){if(!e||e===t||!t.contains(e))return null;let n=[],r=e;for(;r&&r!==t&&n.length<3;){let t=S(r);t?n.unshift(t):r===e&&n.unshift({tag:r.tagName.toLowerCase(),...r.classList[0]?{cls:r.classList[0]}:{}}),r=r.parentElement}return n.length>0?n:null}function w(e){if(!e||typeof e!=`object`)return!1;let{attrs:t,tag:n,cls:r}=e;return t===void 0?typeof n==`string`&&/^[a-z][a-z0-9-]*$/.test(n)&&(r===void 0||typeof r==`string`):Array.isArray(t)&&t.length>0&&t.every(e=>Array.isArray(e)&&e.length===2&&x.concat(`id`).includes(e[0])&&typeof e[1]==`string`)}function T(e,t){return t.attrs?t.attrs.every(([t,n])=>e.getAttribute(t)===n):e.tagName.toLowerCase()===t.tag&&(t.cls===void 0||e.classList.contains(t.cls))}function E(e,t){let n=t.attrs?`[${t.attrs[0][0]}]`:t.tag;for(let r of e.querySelectorAll(n))if(T(r,t))return r;return null}function D(e,t){if(!Array.isArray(t)||t.length===0||!t.every(w))return null;let n=null,r=e;for(let e of t){let t=E(r,e);if(!t)return n;n=t,r=t}return n}function O(e){let t=e.activeElement;return{focus:C(t,e.body),focusVisible:t!==null&&t!==e.body&&t.matches(`:focus-visible`)}}function k(e,t,n){let r=D(e,t);if(!r)return;let i={preventScroll:!0,focusVisible:n===!0};if(r.tabIndex<0&&!r.matches(`a[href], button, input, select, textarea, summary`)){r.querySelector(`a[href], button:not([disabled]), input, select, textarea, [tabindex="0"]`)?.focus(i);return}r.focus(i)}function A(e,t){let n=e?.[t];return typeof n==`number`&&Number.isFinite(n)&&n>=0?n:null}function j(e,t){let n=e?.[t];return Array.isArray(n)?n.filter(e=>typeof e==`string`):[]}function M(e){try{return e.sessionStorage}catch{return null}}function ee(e,t){let n=e===`back`?`[`:`]`;return`${e===`back`?`Back`:`Forward`} (${t?`⌘${n}`:`Ctrl+${n}`})`}function te(e,t){if(e.target&&e.target!==`_self`||e.hasAttribute(`download`))return!1;let n;try{n=new URL(e.getAttribute(`href`)??``,t.href)}catch{return!1}return n.origin===t.origin?n.pathname!==t.pathname||n.search!==t.search:!1}function ne(e,t){let n=e.querySelector(`[data-nav-announce]`);!n||!t||(n.textContent=``,e.defaultView?.setTimeout(()=>{n.textContent=t},50))}function re(e={},t=window,n=document){let r=t.navigation??null,i=_({history:t.history,navigation:r,storage:M(t),location:t.location,referrer:n.referrer,now:()=>Date.now(),uuid:()=>t.crypto?.randomUUID?.()??`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`,setTimeout:(e,n)=>t.setTimeout(e,n),clearTimeout:e=>t.clearTimeout(e),capturePending:e=>n.documentElement.toggleAttribute(`data-nav-capture-pending`,e)}),a=y(t.navigator),o=[...n.querySelectorAll(`[data-history]`)],s=()=>{for(let e of o)e.disabled=!((e.dataset.history===`forward`?`forward`:`back`)==`back`?i.canGoBack():i.canGoForward())};for(let e of o){let t=e.dataset.history===`forward`?`forward`:`back`;e.dataset.tip=ee(t,a),e.addEventListener(`click`,()=>{t===`back`?i.back():i.forward()})}s(),i.onAvailability(s),r?.addEventListener?.(`currententrychange`,s),t.addEventListener(`keydown`,e=>{let t=b(e,a,n);t&&(e.preventDefault(),t===`back`?i.back():i.forward())}),t.addEventListener(`popstate`,()=>i.moved()),t.addEventListener(`pagehide`,()=>i.captureNow()),n.addEventListener(`visibilitychange`,()=>{n.visibilityState===`hidden`&&i.captureNow()}),n.addEventListener(`click`,e=>{let n=e.target?.closest?.(`a[href]`);!n||!v(e)||e.defaultPrevented||te(n,t.location)&&i.leaving()},!0),n.addEventListener(`pointerdown`,e=>{(e.button===3||e.button===4)&&i.captureNow()},!0);let c=()=>i.scheduleCapture();for(let e of[`scroll`,`click`,`input`,`toggle`,`focusin`])n.addEventListener(e,c,{capture:!0,passive:!0});if(!e.ownsRestore){let e=n.querySelector(`.prb-shell > main`);i.setCapturer(()=>({main:e?.scrollTop??0,...O(n)}));let{ui:t}=i.current(),r=A(t,`main`);e&&r!==null&&(e.scrollTop=r),t&&k(n,t.focus,t.focusVisible)}return i}var N=[{id:`active`,name:`Active`,action:`Move to active`},{id:`waiting`,name:`Waiting`,action:`Mark waiting`},{id:`done`,name:`Done`,action:`Mark done`}];function P(e){if(typeof e!=`object`||!e)return;let{state:t,at:n}=e;if(!(t!==`waiting`&&t!==`done`||typeof n!=`number`||!Number.isFinite(n)))return{state:t,at:n}}function F(e){return N.find(t=>t.id===e).action}function ie(e,t){if(!e)return;let n=I(e,t);return n===void 0?{text:N.find(t=>t.id===e.state).name,changed:!1}:{text:n,changed:!0}}var ae=[`created`,`updated`,`merged`,`closed`,`reopened`];function oe(e){return se({at:Number(e.activityAt),kind:e.activityKind,...e.activityMovedAt===void 0?{}:{movedAt:Number(e.activityMovedAt)}})}function se(e){if(typeof e!=`object`||!e)return;let{at:t,kind:n,movedAt:r}=e;if(!(typeof t!=`number`||!Number.isFinite(t)||!ae.includes(n)))return{at:t,kind:n,...typeof r==`number`&&Number.isFinite(r)?{movedAt:r}:{}}}function ce(e,t){return!e||e.state===`waiting`&&le(e,t)?`active`:e.state}function I(e,t){if(!e||!t)return;if(e.state===`waiting`)return le(e,t)?`Changed while waiting`:void 0;if(t.kind===`reopened`&&t.at>e.at)return`Reopened since done`;let n=t.movedAt??(t.kind===`updated`?t.at:void 0);return n!==void 0&&n>e.at?`Changed since done`:void 0}function le(e,t){return t!==void 0&&t.kind!==`created`&&t.at>e.at}function ue(e,t,n){return I(t,n)!==void 0||e!==(t?.state??`active`)}function de(e,t,n){return e===`done`&&t?.state===`done`&&I(t,n)!==void 0?`Keep done`:F(e)}var fe=[`pinned`,`active`,`waiting`,`done`],pe=[`in-progress`,...fe],me=e=>N.find(t=>t.id===e).name,he={"in-progress":{title:`In progress`,key:`i`},pinned:{title:`Pinned`,key:`p`},active:{title:me(`active`),key:`a`},waiting:{title:me(`waiting`),key:`w`},done:{title:me(`done`),key:`d`}};function ge(e){return typeof e==`string`&&pe.includes(e)}function _e(e){if(ge(e))return!0;if(typeof e!=`string`)return!1;let t=/^collection(?:-done)?:(.*)$/.exec(e);return t!==null&&ye(t[1])}var ve=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;function ye(e){return typeof e==`string`&&ve.test(e)}function be(e,t,n,r){return e&&!L(r)?`pinned`:ce(t,n)}function xe(e,t,n,r,i){if(!(r&&!e&&!L(i)))return be(e,t,n,i)}function Se(e,t,n,r){if(!(e||L(r)))return ce(t,n)===`done`?`completed`:`active`}function Ce(e,t){let n=`${e} active`;return t===0?n:`${n} · ${t} pinned`}function we(e,t,n){let r=t.filter(t=>t.id!==n&&e.includes(t.id)).map(e=>e.name);if(r.length!==0)return`${n===void 0?`In`:`Also in`} ${r.join(`, `)}`}function Te(e,t){if(!(e.active>0))return t?`Nothing in this collection matches the filters.`:e.members===0?`Nothing here yet. Add reviews from a card’s menu, or select several and choose Manage collections.`:e.pinned>0&&e.completed===0?`Its reviews are pinned, so they are listed under Pinned.`:`No active reviews`}function Ee(e){return`Show completed (${e})`}function De(e,t,n){let r=new Map;for(let i of e){let e=t(i);if(e===void 0)continue;let a=r.get(e)??{shown:[],total:0};a.total<n(e)&&a.shown.push(i),a.total+=1,r.set(e,a)}return r}function Oe(e,t){let n=e.filter(e=>e.includes(t)).length;return n===0?`none`:n===e.length?`all`:`some`}function ke(e){return e===`all`?`remove`:`add`}var Ae=`none`;function je(e,t){if(t.length===0)return!0;let n=e??[];return n.length===0?t.includes(Ae):n.some(e=>t.includes(e))}function Me(e,t){return e.length===0?`All`:e.length>1?`${e.length} chosen`:e[0]===`none`?`Uncollected`:t.find(t=>t.id===e[0])?.name??`All`}function L(e){return e===`queue`}function Ne(e,t,n){return e?ie(t,n)?.text:I(t,n)}var Pe=[`all`,`queue`,`in-progress`,`complete`],Fe=[`any`,`open`,`merged`,`closed`],Ie=[`q`,`f`,`by`,`pr`,`col`,`page`],R={query:``,filter:`all`,author:``,pr:`any`,collections:[]};function Le(e){return e.query.trim()!==``||e.filter!==R.filter||e.author!==R.author||e.pr!==R.pr||e.collections.length>0}function Re(e,t,n){let r=n===void 0?`${e} review${e===1?``:`s`}`:`${e} of ${n} review${n===1?``:`s`}`;return e===t?r:`${r} · ${t} branch${t===1?``:`es`}`}function ze(e,t,n){let r={pinned:{shown:[],total:0},active:{shown:[],total:0},waiting:{shown:[],total:0},done:{shown:[],total:0}};for(let i of e){let e=t(i),a=r[e];a.total<n[e]&&a.shown.push(i),a.total+=1}return r}function Be(){return{pinned:15,active:15,waiting:15,done:15}}function Ve(e){let t=new URLSearchParams(e.replace(/^#/,``)),n=t.get(`f`)??``,r=t.get(`pr`)??``,i=new URLSearchParams;for(let[e,n]of t)!Ie.includes(e)&&/^[a-z][a-z0-9_-]*$/i.test(e)&&n!==``&&i.append(e,n);let a=i.toString();return{query:t.get(`q`)??``,filter:Pe.includes(n)?n:`all`,author:t.get(`by`)??``,pr:Fe.includes(r)?r:`any`,collections:[...new Set((t.get(`col`)??``).split(`,`).filter(e=>e===`none`||ye(e)))],...a===``?{}:{extra:a}}}function He(e){let t=new URLSearchParams;e.query!==``&&t.set(`q`,e.query),e.filter!==`all`&&t.set(`f`,e.filter),e.author!==``&&t.set(`by`,e.author),e.pr!==`any`&&t.set(`pr`,e.pr),e.collections.length>0&&t.set(`col`,e.collections.join(`,`));for(let[n,r]of new URLSearchParams(e.extra??``))Ie.includes(n)||t.append(n,r);let n=t.toString();return n===``?``:`#${n}`}function Ue(e,t){return t===`all`||t===`queue`?!0:t===`in-progress`?e.status!==`complete`:e.status===t}function We(e,t){return t===`any`||e.prState===t}function Ge(e,t){return t===``||e===t}function Ke(e){return e===`complete`?`Mark reviewed`:`Mark not reviewed`}function qe(e){return e?`Unpin review`:`Pin review`}function Je(e){return e?`Remove from review queue`:`Add to review queue`}function Ye(e,t){let n=t.query.trim().toLowerCase();return Xe(e.filter(e=>(!n||e.searchText.includes(n))&&Ue(e,t.filter)&&Ge(e.author,t.author)&&We(e,t.pr)&&je(e.collections,t.collections??[])),t.filter)}function Xe(e,t){return L(t)?e.filter(e=>e.queue!==void 0).sort((e,t)=>(e.queue??0)-(t.queue??0)):e}function Ze(e){return e===0?`Queue`:`Queue (${e})`}function Qe(e){return e===`complete`?`Reviewed`:e===`in-progress`?`Not reviewed`:`New`}function $e(e){return e===0?`Select reviews to take action`:`${e} review${e===1?``:`s`} selected`}var et=`Use the checkboxes or choose Select all.`;function tt(e,t,n){return e===0?et:[t===null?``:`of ${t}`,n>0?`${n} not shown`:``].filter(Boolean).join(` · `)}function nt(e,t=!1){return e===0||t?`Select all`:`Select all ${e}`}function rt(e){return e===0?`Delete`:`Delete ${e} review${e===1?``:`s`}`}function it(e){return`${rt(e)}?`}function at(e,t,n){return e===``||t===``||t===e?`wait`:n?`hold`:`reload`}var ot=[`in-progress`,`recent`],st={"in-progress":{title:`In progress`,key:`i`},recent:{title:`Recent runs and issues`,key:`r`}};function ct(e){return typeof e==`string`&&ot.includes(e)}var lt=[{id:`global`,label:`Global`},{id:`reviews`,label:`Reviews list`},{id:`runs`,label:`Runs list`},{id:`notifications`,label:`Activity list`},{id:`findings`,label:`Issues and Questions`},{id:`sections`,label:`Review sections`},{id:`buddy`,label:`Buddy AI`},{id:`actions`,label:`Review actions`},{id:`workspace`,label:`Workspace and focus`}],z=(...e)=>({kind:`chord`,keys:e}),B=(e,t)=>({kind:`key`,key:e,...t?{shift:t}:{}}),ut=e=>({kind:`key`,key:e,primary:!0}),dt=pe.map(e=>({id:`reviews.section.${e}`,label:`${he[e].title} section`,group:`reviews`,page:`reviews`,binding:z(`l`,he[e].key)})),ft=ot.map(e=>({id:`runs.section.${e}`,label:`${st[e].title} section`,group:`runs`,page:`runs`,binding:z(`l`,st[e].key)})),V=[{id:`palette.open`,label:`Command palette`,group:`global`,page:`global`,binding:{kind:`combo`,key:`k`}},{id:`add.open`,label:`New review`,group:`global`,page:`global`,binding:{kind:`combo`,key:`p`}},{id:`add.pullRequest`,label:`Review pull requests`,group:`global`,page:`global`,binding:z(`p`,`p`)},{id:`add.branch`,label:`Review branch`,group:`global`,page:`global`,binding:z(`p`,`b`)},{id:`navigate.reviews`,label:`Go to Reviews`,group:`global`,page:`global`,binding:z(`r`)},{id:`navigate.runs`,label:`Go to Runs`,group:`global`,page:`global`,binding:z(`e`)},{id:`navigate.notifications`,label:`Go to Activity`,group:`global`,page:`global`,binding:z(`n`)},{id:`sidebar.hide`,label:`Hide or show the sidebar`,group:`global`,page:`global`,binding:z(`h`)},{id:`help.shortcuts`,label:`Keyboard shortcuts`,group:`global`,page:`global`,binding:z(`?`)},{id:`reviews.search`,label:`Search reviews`,group:`reviews`,page:`reviews`,binding:z(`s`)},{id:`reviews.filters`,label:`Filters`,group:`reviews`,page:`reviews`,binding:z(`f`)},...dt,{id:`reviews.collection.new`,label:`New collection`,group:`reviews`,page:`reviews`,binding:z(`l`,`n`)},{id:`reviews.collection.fold`,label:`Expand or collapse a collection`,group:`reviews`,page:`reviews`,binding:z(`l`,`c`)},{id:`reviews.next`,label:`Next review`,group:`reviews`,page:`reviews`,binding:B(`j`)},{id:`reviews.previous`,label:`Previous review`,group:`reviews`,page:`reviews`,binding:B(`k`)},{id:`reviews.open`,label:`Open review`,group:`reviews`,page:`reviews`,binding:B(`Enter`)},{id:`reviews.openInNewTab`,label:`Open review in new tab`,group:`reviews`,page:`reviews`,binding:B(`Enter`,!0)},{id:`reviews.menu`,label:`Open review menu`,group:`reviews`,page:`reviews`,binding:B(` `)},{id:`reviews.selection.exit`,label:`Exit selection`,group:`reviews`,page:`reviews`,binding:B(`Escape`),hint:`[data-bulk-exit]`,showHint:!0},{id:`runs.search`,label:`Search runs`,group:`runs`,page:`runs`,binding:z(`s`)},{id:`runs.next`,label:`Next run`,group:`runs`,page:`runs`,binding:B(`j`)},{id:`runs.previous`,label:`Previous run`,group:`runs`,page:`runs`,binding:B(`k`)},{id:`runs.open`,label:`Open run’s review`,group:`runs`,page:`runs`,binding:B(`Enter`)},{id:`runs.openInNewTab`,label:`Open run’s review in new tab`,group:`runs`,page:`runs`,binding:B(`Enter`,!0)},{id:`runs.menu`,label:`Open run menu`,group:`runs`,page:`runs`,binding:B(` `)},...ft,{id:`notifications.next`,label:`Next activity`,group:`notifications`,page:`notifications`,binding:B(`j`)},{id:`notifications.previous`,label:`Previous activity`,group:`notifications`,page:`notifications`,binding:B(`k`)},{id:`notifications.open`,label:`Open activity`,group:`notifications`,page:`notifications`,binding:B(`Enter`)},{id:`notifications.openInNewTab`,label:`Open activity in new tab`,group:`notifications`,page:`notifications`,binding:B(`Enter`,!0)},{id:`review.findings.next`,label:`Next card`,group:`findings`,page:`review`,binding:B(`j`)},{id:`review.findings.previous`,label:`Previous card`,group:`findings`,page:`review`,binding:B(`k`)},{id:`review.findings.askBuddy`,label:`Ask Buddy about the card`,group:`findings`,page:`review`,binding:B(` `)},{id:`review.findings.copy`,label:`Copy the card`,group:`findings`,page:`review`,binding:ut(`c`)},{id:`review.findings.choose`,label:`Include in feedback, or leave out`,group:`findings`,page:`review`,binding:B(`Enter`)},{id:`review.feedback.prepare`,label:`Prepare feedback from the chosen cards`,group:`findings`,page:`review`,binding:ut(`Enter`),hint:`[data-feedback-prepare]`,showHint:!0},{id:`review.feedback.copyDraft`,label:`Copy the feedback draft`,group:`findings`,page:`review`,binding:ut(`c`),within:`[data-feedback-dialog]`,hint:`[data-feedback-copy]`,showHint:!0},{id:`review.section.review`,label:`Review overview`,group:`sections`,page:`review`,binding:z(`s`,`r`)},{id:`review.section.kiss`,label:`KISS`,group:`sections`,page:`review`,binding:z(`s`,`k`)},{id:`review.section.issues`,label:`Issues`,group:`sections`,page:`review`,binding:z(`s`,`i`)},{id:`review.section.diagrams`,label:`Diagrams`,group:`sections`,page:`review`,binding:z(`s`,`g`)},{id:`review.section.questions`,label:`Questions`,group:`sections`,page:`review`,binding:z(`s`,`q`)},{id:`review.section.files`,label:`Files`,group:`sections`,page:`review`,binding:z(`s`,`f`)},{id:`review.buddy.open`,label:`Open Buddy AI`,group:`buddy`,page:`review`,binding:z(`b`,`o`)},{id:`review.buddy.prompt`,label:`Choose a prompt`,group:`buddy`,page:`review`,binding:z(`b`,`p`)},{id:`review.mark.reviewed`,label:`Mark reviewed`,group:`actions`,page:`review`,binding:z(`m`,`r`),hint:`[data-review-menu] [data-mark-status]`},{id:`review.mark.waiting`,label:`Mark waiting`,group:`actions`,page:`review`,binding:z(`m`,`w`),hint:`[data-review-menu] [data-lifecycle-set="waiting"]`},{id:`review.mark.done`,label:`Mark done`,group:`actions`,page:`review`,binding:z(`m`,`d`),hint:`[data-review-menu] [data-lifecycle-set="done"]`},{id:`review.checkUpdates`,label:`Check for updates`,group:`actions`,page:`review`,binding:z(`a`,`c`),hint:`[data-review-menu] [data-fresh-check]`},{id:`review.update`,label:`Update review`,group:`actions`,page:`review`,binding:z(`a`,`u`)},{id:`review.queue.toggle`,label:`Queue`,group:`actions`,page:`review`,binding:z(`a`,`q`),hint:`[data-review-menu] [data-queue-action]`},{id:`review.feedback.toggle`,label:`Start or exit Prepare feedback`,group:`actions`,page:`review`,binding:z(`a`,`p`)},{id:`review.delete`,label:`Delete`,group:`actions`,page:`review`,binding:z(`a`,`d`),hint:`[data-review-menu] [data-delete]`},{id:`review.focus.toggle`,label:`Expand or collapse this section`,group:`workspace`,page:`review`,binding:B(`\\`),hint:`[data-focus-toggle]`},{id:`review.leave`,label:`Leave the Buddy AI field, Prepare feedback, or focus mode`,group:`workspace`,page:`review`,binding:B(`Escape`)}],pt=[{page:`global`,keys:[`p`],label:`New review`,combo:`p`},{page:`review`,keys:[`s`],label:`Sections`},{page:`review`,keys:[`m`],label:`Mark`},{page:`review`,keys:[`a`],label:`Actions`},{page:`review`,keys:[`b`],label:`Buddy AI`},{page:`reviews`,keys:[`l`],label:`List sections`},{page:`runs`,keys:[`l`],label:`List sections`}];function mt(e,t=V){return t.filter(t=>t.page===`global`||t.page===e)}function ht(e,t=V){let n={kind:`node`,key:``,label:`Commands`,children:[]},r=(t,r)=>{let i=n;for(let[n,a]of t.entries()){let o=i.children.find(e=>e.key===a);if(o?.kind===`leaf`)throw Error(`Chord ${t.slice(0,n+1).join(` `)} is a command and a namespace on ${e}`);if(o){i=o;continue}let s={kind:`node`,key:a,label:pt.find(r=>(r.page===e||r.page===`global`)&&r.keys.join(` `)===t.slice(0,n+1).join(` `))?.label??r??a.toUpperCase(),children:[]};i.children.push(s),i=s}return i};for(let n of mt(e,t)){if(n.binding.kind!==`chord`)continue;let t=n.binding.keys,i=r(t.slice(0,-1)),a=t[t.length-1];if(i.children.some(e=>e.key===a))throw Error(`Chord ${t.join(` `)} is bound twice on ${e}`);i.children.push({kind:`leaf`,key:a,command:n})}return n}function gt(e){return mt(e).filter(e=>e.binding.kind===`key`)}var _t=new Set([`Shift`,`Control`,`Alt`,`Meta`,`CapsLock`,`Fn`,`AltGraph`,`OS`]);function vt(e){return _t.has(e.key)}function yt(e){let t=e.key;if(t.length===1){if(/^[a-z]$/i.test(t))return t.toLowerCase();let n=/^Key([A-Z])$/.exec(e.code??``);return n&&/\p{L}/u.test(t)?n[1].toLowerCase():t}return null}var bt=new Set(V.flatMap(e=>e.binding.kind===`combo`?[e.binding.key]:[]));function xt(e,t){let n=t?e.metaKey:e.ctrlKey,r=t?e.ctrlKey:e.metaKey;if(!n||r||e.altKey||e.shiftKey||e.isComposing)return null;let i=yt(e);return i!==null&&bt.has(i)?i:null}function St(e){return V.find(t=>t.binding.kind===`combo`&&t.binding.key===e)}function Ct(e,t,n=!1){if(e.kind!==`key`||t.altKey||t.isComposing)return!1;let r=n?t.metaKey:t.ctrlKey;return(n?t.ctrlKey:t.metaKey)||r!==(e.primary===!0)||t.shiftKey!==(e.shift===!0)?!1:e.key===`\\`?t.key===`\\`||t.code===`Backslash`:e.key.length===1?yt(t)===e.key:t.key===e.key}function wt(e){let t=null,n=[];return{get at(){return t},get path(){return n},start(r=[]){let i=e,a=[];for(let e of r){let t=i.children.find(t=>t.key===e);if(t?.kind!==`node`)break;i=t,a.push(e)}t=i,n=a},press(e){let r=t?.children.find(t=>t.key===e);return r?r.kind===`leaf`?(t=null,n=[],{kind:`run`,command:r.command}):(t=r,n=[...n,e],{kind:`descend`,node:r}):(t=null,n=[],{kind:`cancel`})},reset(){t=null,n=[]}}}var Tt={Escape:`Esc`,Enter:`Enter`,"\\":`\\`," ":`Space`};function H(e){return Tt[e]??(e.length===1?e.toUpperCase():e)}function U(e,t=`k`){let n=t.toUpperCase();return e?`⌘${n}`:`Ctrl+${n}`}function W(e,t){let n=pt.find(t=>t.combo!==void 0&&t.keys.every((t,n)=>e[n]===t));return n?[U(t,n.combo),...e.slice(n.keys.length).map(H)]:[U(t),...e.map(H)]}function G(e,t){return e.kind===`combo`?t?`⌘${H(e.key)}`:`Ctrl+${H(e.key)}`:e.kind===`chord`?W(e.keys,t).join(` `):e.primary?t?`⌘${H(e.key)}`:`Ctrl+${H(e.key)}`:e.shift?`Shift+${H(e.key)}`:H(e.key)}function Et(e,t){return e.kind===`chord`?W(e.keys,t):[G(e,t)]}function Dt(e,t){if(e.kind===`chord`)return null;if(e.kind===`combo`)return`${t?`Meta`:`Control`}+${e.key.toUpperCase()}`;let n=e.key===` `?`Space`:e.key.length===1?e.key.toUpperCase():e.key;return e.primary?`${t?`Meta`:`Control`}+${n}`:e.shift?`Shift+${n}`:n}function Ot(e){return lt.map(t=>({group:t.id,label:t.label,rows:V.filter(e=>e.group===t.id).map(t=>({id:t.id,keys:Et(t.binding,e),label:t.label}))})).filter(e=>e.rows.length>0)}function K(e,t,n,r){let i=e.createElement(t);return n&&(i.className=n),r!==void 0&&(i.textContent=r),i}function kt(e,t){return K(e,`kbd`,`prb-kbd`,t)}function At(e,t,n){let r=K(e,`dialog`,`prb-palette`);r.setAttribute(`data-command-palette`,``),r.setAttribute(`aria-labelledby`,`prb-palette-title`);let i=K(e,`div`,`prb-palette-panel`);i.tabIndex=-1,r.append(i),e.body.append(r),r.addEventListener(`click`,e=>{if(e.stopPropagation(),e.target===r)return n();let i=e.target?.closest?.(`[data-palette-key]`);i?.dataset.paletteKey!==void 0&&i.getAttribute(`aria-disabled`)!==`true`&&t(i.dataset.paletteKey)}),r.addEventListener(`cancel`,e=>{e.preventDefault(),n()});let a=(t,n)=>{let r=K(e,`div`,`prb-palette-head`),i=K(e,`span`,`prb-palette-trail`);for(let[n,r]of t.entries())n>0&&i.append(K(e,`span`,`prb-palette-sep`,`›`)),i.append(kt(e,r));let a=K(e,`h2`,`prb-palette-title`,n);return a.id=`prb-palette-title`,r.append(i,a),r};return{dialog:r,show:t=>{i.replaceChildren(a(t.trail,t.title));let n=K(e,`div`,`prb-palette-list`);n.setAttribute(`role`,`group`),n.setAttribute(`aria-labelledby`,`prb-palette-title`);let o=null;for(let r of t.rows){t.groupLabels&&r.group!==o&&(n.append(K(e,`p`,`prb-palette-group`,t.groupLabels[r.group]??r.group)),o=r.group);let i=K(e,`button`,`prb-palette-row`);i.type=`button`,i.dataset.paletteKey=r.key,r.available||i.setAttribute(`aria-disabled`,`true`),r.namespace&&i.setAttribute(`aria-haspopup`,`true`),i.append(kt(e,r.keyLabel),K(e,`span`,`prb-palette-label`,r.namespace?`${r.label}…`:r.label)),r.state&&i.append(K(e,`span`,`prb-palette-state`,r.state)),n.append(i)}if(t.rows.length===0&&n.append(K(e,`p`,`prb-palette-empty`,`Nothing here on this page.`)),i.append(n),t.footer.length>0){let n=K(e,`div`,`prb-palette-footer`);n.append(K(e,`p`,`prb-palette-group`,`Keys on this page`));let r=K(e,`ul`,`prb-palette-keys`);for(let n of t.footer){let t=K(e,`li`);t.append(kt(e,n.keys),K(e,`span`,void 0,n.label)),r.append(t)}n.append(r),i.append(n)}r.open||r.showModal(),i.focus()},showPanel:(t,n,o)=>{i.replaceChildren(a(t,n.title));let s=K(e,`div`,`prb-palette-body`);i.append(s),r.open||r.showModal(),i.dataset.mode=n.title;let c=n.mount(s,o);return()=>{delete i.dataset.mode,c?.()}},close:()=>{r.open&&r.close()},isOpen:()=>r.open}}function jt(e,t,n){let r=[...e.querySelectorAll(`[data-palette-key]`)];if(r.length===0)return!1;let i=r.indexOf(n),a=t===`ArrowDown`?r[i<0?0:(i+1)%r.length]:t===`ArrowUp`?r[i<0?r.length-1:(i-1+r.length)%r.length]:t===`Home`?r[0]:t===`End`?r[r.length-1]:null;return a?(a.focus(),!0):!1}function Mt(e,t){let n=K(e,`div`,`prb-shortcuts-table`);for(let r of t){let t=K(e,`section`,`prb-shortcuts-group`);t.append(K(e,`h3`,`prb-shortcuts-heading`,r.label));let i=K(e,`dl`,`prb-shortcuts-list`);for(let t of r.rows){let n=K(e,`dt`,`prb-shortcuts-keys`);n.dataset.commandId=t.id;for(let r of t.keys)n.append(kt(e,r));i.append(n,K(e,`dd`,`prb-shortcuts-label`,t.label))}t.append(i),n.append(t)}return n}function Nt(e,t,n,r){let i=K(e,`dialog`,`prb-dialog prb-shortcuts`);i.setAttribute(`data-shortcuts-dialog`,``),i.setAttribute(`aria-labelledby`,`prb-shortcuts-title`);let a=K(e,`div`,`prb-shortcuts-head`),o=K(e,`h2`,void 0,`Keyboard shortcuts`);o.id=`prb-shortcuts-title`;let s=K(e,`button`,`prb-shortcuts-close`,`Close`);s.type=`button`,s.setAttribute(`data-shortcuts-close`,``),a.append(o,s),i.append(a,K(e,`p`,`prb-shortcuts-hint`,n),Mt(e,t)),e.body.append(i);let c=null;return s.addEventListener(`click`,()=>i.close()),i.addEventListener(`click`,e=>{e.target===i&&i.close()}),i.addEventListener(`close`,()=>{c?.isConnected&&c.focus(),c=null,r?.()}),{dialog:i,open:()=>{if(i.open)return;let t=e.activeElement;c=t instanceof HTMLElement&&t!==e.body?t:null,i.showModal(),s.focus()},isOpen:()=>i.open}}var Pt=/https?:\/\/[^\s<>()"'`]+/gi,Ft=/^https?:\/\/(?:www\.)?github\.com\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/pull\/(\d+)(?:[/?#]|$)/i,It=/^https?:\/\/([^/]+)\/((?:[^/?#]+\/)+?)(?:-\/)?merge_requests\/(\d+)(?:[/?#]|$)/i,Lt=/^https?:\/\/(?:www\.)?bitbucket\.org\/([^/?#]+)\/([^/?#]+)\/pull-requests\/(\d+)(?:[/?#]|$)/i;function Rt(e){let t=e.replace(/[.,;:!?)\]]+$/,``),n=Ft.exec(t);if(n){let[,e,t,r]=n,i=t.replace(/\.git$/i,``),a=Number(r);return{kind:`github`,owner:e,repo:i,number:a,url:`https://github.com/${e}/${i}/pull/${a}`,key:`${e}/${i}#${a}`.toLowerCase()}}let r=Lt.exec(t);if(r){let[,e,n,i]=r;return{kind:`unsupported`,provider:`Bitbucket`,label:`${e}/${n} #${i}`,url:t,key:`bitbucket:${e}/${n}#${i}`.toLowerCase()}}let i=It.exec(t);if(i){let[,e,n,r]=i,a=n.replace(/\/$/,``);return{kind:`unsupported`,provider:`GitLab`,label:`${a} !${r}`,url:t,key:`gitlab:${e}/${a}!${r}`.toLowerCase()}}return null}function zt(e){let t=[],n=new Set;for(let r of e.matchAll(Pt)){let e=Rt(r[0]);!e||n.has(e.key)||(n.add(e.key),t.push(e))}return t}function Bt(e){return`${e} isn't supported yet`}var Vt=`prb:review-started`;function Ht(e){e.dispatchEvent(new(e.defaultView??window).Event(Vt))}function Ut(e,t){e.addEventListener(Vt,t)}function Wt(e,t){let n=null,r=!1,i=!1,a=!1,o=async()=>{n=null,r=!0;let s=await t();if(r=!1,s===null){a=!0;return}let c=i?0:s;i=!1,n=e.setTimeout(()=>void o(),c)};return o(),{now:()=>{if(!a){if(r){i=!0;return}n!==null&&e.clearTimeout(n),o()}}}}function Gt(e){return e.model?`Keeps its original agent and model: ${e.agent}, ${e.model}`:`Keeps its original agent: ${e.agent}`}var Kt={waiting:`Queued`,reviewing:`Analysing`,"already-reviewed":`Already reviewed`,ready:`Ready`,failed:`Failed`},qt={waiting:`○`,reviewing:`◐`,"already-reviewed":`✓`,ready:`✓`,failed:`!`},Jt=250,Yt=1500,Xt=6e4;async function q(e,t,n){try{let r=await e.fetch(t,n===void 0?{}:{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n)}),i=await r.json().catch(()=>({}));if(!r.ok){let e=i;return{...e,ok:!1,status:r.status,error:typeof e.error==`string`?e.error:`Something went wrong. Try again.`}}return{ok:!0,value:i}}catch{return{ok:!1,status:0,error:`The workspace server did not answer. Check it is still running.`}}}function Zt(e,t,n){let r=null,i=!1,a=o=>{r=e.setTimeout(async()=>{let r=await q(e,`/add-review/batches/${t}`);i||(r.ok?(n.rows(r.value.rows,r.value.finished),a(r.value.finished?Xt:Yt)):r.status===404?n.lost(r.error):a(Yt))},o)};return a(Yt),()=>{i=!0,r!==null&&e.clearTimeout(r)}}function J(e,t,n,r){let i=e.createElement(t);return n&&(i.className=n),r!==void 0&&(i.textContent=r),i}function Qt(e,t,n){let r=J(e,`option`,void 0,t);return r.value=n,r}function Y(e,t,n){let r=J(e,`a`,`prb-addreview-link`,n);return r.href=`/open?id=${encodeURIComponent(t)}`,r}function $t(e,t){let n=J(e,`details`,`prb-addreview-technical`);return n.append(J(e,`summary`,void 0,`Technical details`),J(e,`pre`,void 0,t)),n}function en(e){let t=J(e,`div`,`prb-addreview-problemblock`);t.setAttribute(`role`,`alert`);let n=J(e,`p`,`prb-addreview-error`);return n.hidden=!0,t.append(n),{element:t,show(r){n.textContent=r.error,n.hidden=!1,t.querySelector(`.prb-addreview-technical`)?.remove(),r.detail&&t.append($t(e,r.detail))},hide(){n.hidden=!0,t.querySelector(`.prb-addreview-technical`)?.remove()}}}function tn(e,t,n=`prb-addreview-path`){let r=J(e,`span`,n),i=t.replace(/\/+$/,``).lastIndexOf(`/`);return i<=0?r.textContent=t:r.append(J(e,`span`,`prb-addreview-path-parent`,t.slice(0,i+1)),J(e,`span`,`prb-addreview-path-name`,t.slice(i+1))),r}function X(e,t){return J(e,`code`,void 0,t)}var Z=e=>`${e} commit${e===1?``:`s`}`;function nn(e,t){let n=t.options.find(e=>e.where===`remote`)?.display??`origin/${t.name}`,r=J(e,`p`,`prb-addreview-choice-text`),i=t.divergence,a=i&&i.ahead>0&&i.behind>0?[`Your local `,X(e,t.name),` and `,X(e,n),` have diverged: ${Z(i.ahead)} on the local side, ${Z(i.behind)} on the remote.`]:i&&i.ahead>0?[`Your local `,X(e,t.name),` is ${Z(i.ahead)} ahead of `,X(e,n),`.`]:i&&i.behind>0?[`Your local `,X(e,t.name),` is ${Z(i.behind)} behind `,X(e,n),`.`]:[`Your local `,X(e,t.name),` and `,X(e,n),` are different commits.`];return r.append(...a),r}function rn(e,t,n){let r=t.baseChoice,i=J(e,`div`,`prb-addreview-choice`);i.setAttribute(`data-addreview-base-choice`,``);let a=J(e,`p`,`prb-addreview-choice-title`,`Choose a base branch`);a.id=`prb-addreview-choice-title`;let o=J(e,`div`,`prb-addreview-choice-options`);o.setAttribute(`role`,`radiogroup`),o.setAttribute(`aria-labelledby`,a.id);for(let t of r.options){let i=J(e,`label`,`prb-addreview-choice-option`),a=J(e,`input`);a.type=`radio`,a.name=`prb-addreview-base-choice`,a.value=t.base,a.addEventListener(`change`,()=>{a.checked&&n(t.base)});let s=`${t.where===`remote`?`Remote`:`Local`} ${r.name}`,c=t.commits===void 0?``:t.commits===0?` (no new changes)`:` (${Z(t.commits)} to review)`;i.append(a,X(e,t.display),J(e,`span`,`prb-addreview-choice-what`,` ${s}${c}`)),o.append(i)}return i.append(a,nn(e,r),J(e,`p`,`prb-addreview-choice-text`,`Select which branch to compare against:`),o),t.detail&&i.append($t(e,t.detail)),i}function an(e,t){return t&&e.status===`waiting`?`Not started`:t&&e.status===`reviewing`?`Started`:Kt[e.status]}function on(e,t){let n=e.filter(e=>e.status===`ready`||e.status===`already-reviewed`).length,r=[`reviewing`,`waiting`,`failed`].map(n=>[an({status:n},t).toLowerCase(),e.filter(e=>e.status===n).length]).filter(([,e])=>e>0);return[`${n} of ${e.length} ${e.length===1?`review`:`reviews`} ready`,...r.map(([e,t])=>`${t} ${e}`)].join(` · `)}function sn(e,t,n,r,i){let a=J(e,`div`,`prb-addreview-progress`);a.setAttribute(`data-addreview-progress`,``);let o=J(e,`p`,`prb-addreview-summary`);o.setAttribute(`aria-live`,`polite`);let s=J(e,`ul`,`prb-addreview-rows`);s.setAttribute(`aria-label`,`Started reviews`);let c=J(e,`p`,`prb-palette-summary`),l=en(e),u=J(e,`div`,`prb-addreview-footer`),d=J(e,`button`,`prb-addreview-start`,`Close`);d.type=`button`,d.setAttribute(`data-addreview-close`,``),d.addEventListener(`click`,i),u.append(d),a.append(o,s,c,l.element,u);let f=r,p=null,m=!1,h=!1,g=new Map,_=(t,n)=>{let r=n.contains(e.activeElement),i=n.querySelector(`.prb-addreview-technical`)?.open??!1;n.replaceChildren(),n.dataset.status=h&&t.status===`waiting`?`not-started`:t.status,n.dataset.state=t.status===`failed`?`problem`:`ok`;let a=J(e,`div`,`prb-addreview-row-head`),o=J(e,`span`,`prb-addreview-mark`,qt[t.status]);if(o.setAttribute(`aria-hidden`,`true`),a.append(o,t.reviewId?Y(e,t.reviewId,t.label):J(e,`span`,`prb-addreview-row-label`,t.label)),a.append(J(e,`span`,`prb-addreview-badge`,an(t,h))),n.append(a),t.reason&&n.append(J(e,`span`,`prb-addreview-status prb-addreview-${t.status===`failed`?`problem`:`muted`}`,t.reason)),t.kept&&n.append(J(e,`span`,`prb-addreview-status prb-addreview-muted`,Gt(t.kept))),t.detail){let r=$t(e,t.detail);r.open=i,n.append(r)}if(t.status===`failed`&&!h){let r=t.stale===!0,i=J(e,`button`,`prb-addreview-retry`,r?`Start fresh review`:`Retry`);i.type=`button`,i.setAttribute(r?`data-addreview-fresh`:`data-addreview-retry`,``),i.setAttribute(`aria-label`,`${r?`Start a fresh review of`:`Retry`} ${t.label}`),i.addEventListener(`click`,()=>void b(t.key,i,r)),n.append(i)}r&&n.focus()},v=()=>{let t=f.map(t=>{let n=JSON.stringify([t,h]),r=g.get(t.key);if(!r){let n=J(e,`li`,`prb-addreview-row`);n.dataset.rowKey=t.key,n.tabIndex=-1,r={item:n,json:``},g.set(t.key,r)}return r.json!==n&&(_(t,r.item),r.json=n),r.item});(t.some((e,t)=>s.children[t]!==e)||s.children.length!==t.length)&&s.replaceChildren(...t),o.textContent=on(f,h),c.textContent=!h&&f.some(e=>e.status===`waiting`)?`Queued reviews start as running ones finish. Reviews carry on in the background, so you can close this; they appear in your reviews list.`:`Reviews carry on in the background, so you can close this; they appear in your reviews list.`},y=()=>{p?.(),p=Zt(t,n,{rows:e=>{f=e,v()},lost:e=>{l.show({error:e}),h=!0,v()}})},b=async(r,i,a)=>{i.disabled=!0;let o=await q(t,`/add-review/batches/${n}/retry`,{key:r,...a?{fresh:!0}:{}});if(o.ok&&Ht(e),!m){if(!o.ok){i.disabled=!1,l.show(o),o.status===404&&(h=!0,p?.(),v());return}l.hide(),f=o.value.rows,v(),y()}};return v(),y(),{element:a,focus:()=>d.focus(),stop:()=>{m=!0,p?.()}}}function cn(e,t,n){let r=J(e,`details`,`prb-addreview-options`);r.append(J(e,`summary`,void 0,`Review options`));let i=J(e,`div`,`prb-addreview-grid`);r.append(i);let a=(t,n)=>{let r=J(e,`label`,`prb-addreview-key`,t),a=`prb-addreview-${t.toLowerCase()}`;n.id=a,r.htmlFor=a,i.append(r,n)},o=J(e,`select`,`prb-addreview-control`);o.setAttribute(`data-addreview-agent`,``);let s=J(e,`input`,`prb-addreview-control`);s.type=`text`,s.placeholder=`Default`,s.spellcheck=!1,s.autocomplete=`off`,s.setAttribute(`data-addreview-model`,``);let c=J(e,`input`,`prb-addreview-control`);c.type=`text`,c.placeholder=`Auto`,c.spellcheck=!1,c.autocomplete=`off`,c.setAttribute(`data-addreview-base`,``),a(`Agent`,o),a(`Model`,s);let l=J(e,`div`,`prb-addreview-modelhelp`),u=J(e,`button`,`prb-addreview-helplink`,`How do I find model names?`);u.type=`button`,u.setAttribute(`aria-expanded`,`false`),u.setAttribute(`data-addreview-model-help`,``);let d=J(e,`p`,`prb-addreview-help`);d.id=`prb-addreview-model-help`,d.hidden=!0,u.setAttribute(`aria-controls`,d.id),l.append(u,d),i.append(l),n&&a(`Base`,c);let f=en(e);r.append(f.element);let p=[],m=()=>{let t=p.find(e=>e.id===o.value);if(!t){d.replaceChildren(`Choose an agent to see how to find its model names.`);return}let n=t.displayName,r=t.modelHelp;d.replaceChildren(...r?.command?[`To see the models ${n} offers, run `,X(e,r.command),` in a terminal.`]:r?.note?[`To see the models ${n} offers, ${r.note}.`]:[`${n} does not say how to list its models. Use a name from its own documentation.`],` Leave Model empty to use ${n}'s default.`)};u.addEventListener(`click`,()=>{d.hidden=!d.hidden,u.setAttribute(`aria-expanded`,String(!d.hidden)),d.hidden?s.removeAttribute(`aria-describedby`):s.setAttribute(`aria-describedby`,d.id),m()}),o.addEventListener(`change`,m);let h=null,g=!1;return{element:r,base:c,loaded:q(t,`/add-review/options`).then(t=>{if(g=!0,!t.ok)return f.show(t),r.open=!0,null;p=t.value.agents;let{agent:n}=t.value,i=p.filter(e=>e.installed);n.kind!==`resolved`&&o.append(Qt(e,`Choose an agent`,``));for(let t of i)o.append(Qt(e,t.displayName,t.id));return n.kind===`resolved`?(h=n.id,i.some(e=>e.id===n.id)||o.append(Qt(e,n.displayName,n.id)),o.value=n.id):(o.value=``,r.open=!0,n.kind===`refused`&&f.show({error:n.error})),m(),t.value}),complete:()=>g&&o.value!==``,values:()=>({...o.value&&o.value!==h?{agent:o.value}:{},...s.value.trim()?{model:s.value.trim()}:{},...n&&c.value.trim()?{base:c.value.trim()}:{}}),setBasePlaceholder:e=>{c.placeholder=e?`Auto (${e})`:`Auto`},showProblem:e=>{r.open=!0,f.show(e),(e.field===`model`?s:o).focus()},hideProblem:()=>f.hide()}}function ln(e){let t=J(e,`button`,`prb-addreview-start`);return t.type=`button`,t.setAttribute(`data-addreview-start`,``),t}function un(e){return{title:`New review`,escape:`close`,mount(t,n){let r=e.defaultView,i=J(e,`div`,`prb-addreview`);i.setAttribute(`data-addreview`,`pull-requests`);let a=J(e,`div`,`prb-addreview-config`),o=J(e,`label`,`prb-addreview-label`,`Paste PR links`),s=J(e,`textarea`,`prb-palette-input prb-addreview-paste`);s.id=`prb-addreview-paste`,o.htmlFor=s.id,s.rows=3,s.spellcheck=!1,s.autocomplete=`off`,s.placeholder=`https://github.com/owner/repo/pull/123`;let c=J(e,`p`,`prb-palette-summary`);c.setAttribute(`aria-live`,`polite`);let l=J(e,`ul`,`prb-addreview-rows`),u=cn(e,r,!1),d=en(e),f=J(e,`p`,`prb-addreview-error`);f.setAttribute(`data-addreview-limit`,``),f.hidden=!0;let p=J(e,`div`,`prb-addreview-footer`),m=ln(e);p.append(m),a.append(o,s,c,f,l,u.element,d.element,p),i.append(J(e,`p`,`prb-addreview-mode`,`Pull request`),a),t.append(i);let h=[],g=new Map,_=!1,v=0,y=null,b=null,x=!1,S=!1,C=()=>h.filter(e=>(e.ok||e.needsFolder)&&!!g.get(e.key)),w=0,T=()=>{let e=C().length;m.textContent=e>1?`Review ${e} PRs`:`Review PR`,m.disabled=b!==null||x||_||w>0||e===0||!u.complete()},E=()=>{f.hidden=w===0,f.textContent=`At most 20 pull requests can be reviewed at once. Remove ${w} to continue.`},D=(t,n)=>J(e,`span`,`prb-addreview-status prb-addreview-${n}`,t),O=()=>{l.replaceChildren(...h.map(t=>{let n=J(e,`li`,`prb-addreview-row`);n.dataset.rowKey=t.key;let r=t.ok||!!g.get(t.key);n.dataset.state=r?`ok`:`problem`;let i=J(e,`div`,`prb-addreview-row-head`),a=J(e,`span`,`prb-addreview-mark`,r?`✓`:`!`);if(a.setAttribute(`aria-hidden`,`true`),i.append(a,J(e,`span`,`prb-addreview-row-label`,t.label)),n.append(i),t.reviewed?.kept){let r=D(``,`muted`);r.append(Y(e,t.reviewed.reviewId,`Resumes where it stopped`)),n.append(r,D(Gt(t.reviewed.kept),`muted`))}else if(t.reviewed){let r=D(``,`muted`);r.append(Y(e,t.reviewed.reviewId,`Already reviewed`)),n.append(r)}else t.ok?n.append(D(`Ready to start`,`muted`)):t.reason&&n.append(D(t.reason,`problem`));if(t.folders.length>1){let r=J(e,`select`,`prb-addreview-control prb-addreview-folder`);r.setAttribute(`aria-label`,`Local folder for ${t.label}`);for(let n of t.folders)r.append(Qt(e,n.branch?`${n.display} (${n.branch})`:n.display,n.path));r.value=g.get(t.key)??t.folder??``,r.addEventListener(`change`,()=>g.set(t.key,r.value)),n.append(r)}else if(t.folders.length===1)n.append(tn(e,t.folders[0].display));else if(t.needsFolder){let r=J(e,`input`,`prb-addreview-control prb-addreview-folder`);r.type=`text`,r.placeholder=`Local folder for this repository, e.g. ~/code/repo`,r.setAttribute(`aria-label`,`Local folder for ${t.label}`),r.spellcheck=!1,r.autocomplete=`off`,r.value=g.get(t.key)??``,r.addEventListener(`input`,()=>{r.value.trim()?g.set(t.key,r.value.trim()):g.delete(t.key),n.dataset.state=r.value.trim()?`ok`:`problem`,T()}),n.append(r)}return n}))},k=()=>{let e=zt(s.value),t=e.filter(e=>e.kind===`github`).length;c.textContent=e.length===0?s.value.trim()?`No pull request links found.`:``:t===1?`1 pull request recognised`:`${t} pull requests recognised`,h=e.map(e=>e.kind===`github`?h.find(t=>t.key===e.key)??{key:e.key,label:`${e.owner}/${e.repo} #${e.number}`,url:e.url,ok:!1,folders:[]}:{key:e.key,label:`${e.provider} ${e.provider===`GitLab`?`merge request`:`pull request`}`,url:e.url,ok:!1,reason:Bt(e.provider),folders:[]}),_=e.some(e=>e.kind===`github`),w=Math.max(0,t-20);let n=++v;O(),E(),T(),y!==null&&r.clearTimeout(y),_&&(y=r.setTimeout(async()=>{y=null;let e=await q(r,`/add-review/pull-requests/preview`,{text:s.value});if(!(S||n!==v)){if(_=!1,!e.ok)d.show(e);else{d.hide(),h=e.value.rows;for(let e of h)e.folder&&!g.has(e.key)&&g.set(e.key,e.folder)}O(),T()}},Jt))},A=async()=>{if(T(),m.disabled)return;x=!0,T();let t=C().map(e=>({url:e.url,folder:g.get(e.key)})),i=await q(r,`/add-review/pull-requests`,{items:t,...u.values()});if(x=!1,i.ok&&Ht(e),!S){if(!i.ok){i.field?(d.hide(),u.showProblem(i)):(u.hideProblem(),d.show(i)),T();return}b=sn(e,r,i.value.batchId,i.value.rows,n),a.replaceWith(b.element),b.focus()}};return s.addEventListener(`input`,k),m.addEventListener(`click`,()=>void A()),i.addEventListener(`change`,()=>T()),i.addEventListener(`keydown`,e=>{if(b||e.key!==`Enter`||e.shiftKey||e.isComposing)return;let t=e.target;t.tagName!==`SELECT`&&t.tagName!==`BUTTON`&&t.tagName!==`A`&&t.tagName!==`SUMMARY`&&(e.preventDefault(),A())}),u.loaded.then(()=>T()),T(),s.focus(),()=>{S=!0,y!==null&&r.clearTimeout(y),b?.stop()}}}}function dn(e){return{title:`New review`,escape:`close`,mount(t,n){let r=e.defaultView,i=J(e,`div`,`prb-addreview`);i.setAttribute(`data-addreview`,`branch`);let a=J(e,`div`,`prb-addreview-config`),o=J(e,`label`,`prb-addreview-label`,`Working folder`),s=J(e,`div`,`prb-addreview-pathrow`),c=J(e,`input`,`prb-palette-input`);c.id=`prb-addreview-folder`,o.htmlFor=c.id,c.type=`text`,c.spellcheck=!1,c.autocomplete=`off`,c.placeholder=`~/code/project`;let l=J(e,`button`,`prb-addreview-browse`,`Browse…`);l.type=`button`,l.hidden=!0,s.append(c,l);let u=J(e,`div`,`prb-addreview-detected`);u.setAttribute(`aria-live`,`polite`);let d=J(e,`p`,`prb-palette-group`,`Recent`),f=J(e,`div`,`prb-palette-results prb-addreview-recent`);f.setAttribute(`role`,`group`),f.setAttribute(`aria-label`,`Recent folders`),d.hidden=!0;let p=cn(e,r,!0),m=en(e),h=J(e,`div`,`prb-addreview-footer`),g=ln(e);g.textContent=`Review branch`,h.append(g),a.append(o,s,u,d,f,p.element,m.element,h),i.append(J(e,`p`,`prb-addreview-mode`,`Branch`),a),t.append(i);let _=null,v=null,y=!1,b=null,x=!1,S=null,C=(e,t)=>`${e}\n${t.trim()}`,w=()=>C(c.value,p.base.value),T=()=>{g.disabled=y||b!==null||!_?.result.ok||_.key!==w()||!p.complete()},E=e=>{S={base:e,path:c.value},p.base.value=e,v!==null&&r.clearTimeout(v),T(),O().then(e=>{!x&&e.ok&&g.focus()})},D=t=>{if(u.replaceChildren(),!t)return;if(!t.ok){if(t.baseChoice){u.append(rn(e,{error:t.error??``,...t.detail?{detail:t.detail}:{},baseChoice:t.baseChoice},E));return}u.append(J(e,`p`,`prb-addreview-error`,t.error??`This folder cannot be reviewed.`)),t.detail&&u.append($t(e,t.detail));return}let n=J(e,`dl`,`prb-addreview-grid prb-addreview-facts`),r=(t,r)=>{let i=J(e,`dd`);i.append(r),n.append(J(e,`dt`,`prb-addreview-key`,t),i)};if(r(`Repository`,t.repo??``),r(`Branch`,t.branch??``),r(`Base`,t.base??`Not found`),t.reviewed?.kept){let n=Y(e,t.reviewed.reviewId,`Resumes where it stopped`),i=J(e,`span`,`prb-addreview-kept`,Gt(t.reviewed.kept)),a=J(e,`span`);a.append(n,J(e,`br`),i),r(`Review`,a)}else t.reviewed&&r(`Review`,Y(e,t.reviewed.reviewId,t.reviewed.inProgress?`Being reviewed now`:`Already reviewed`));u.append(n),p.setBasePlaceholder(t.base??null)},O=()=>{let e=c.value,t=p.base.value.trim(),n=C(e,t);return _?.key===n?Promise.resolve(_.result):e.trim()?q(r,`/add-review/folder/inspect`,{path:e,...t?{base:t}:{}}).then(e=>{let t=e.ok?e.value:{ok:!1,error:e.error,...e.detail?{detail:e.detail}:{}};return!x&&w()===n&&(_={key:n,result:t},D(t),T()),t}):(_=null,D(null),T(),Promise.resolve({ok:!1}))},k=e=>{c.value=e,A(),v!==null&&r.clearTimeout(v),T(),O(),c.focus()},A=()=>{!S||S.path===c.value||(p.base.value===S.base&&(p.base.value=``),S=null)},j=async()=>{if(y||b)return;y=!0;let t=w(),i=c.value,o=p.values();T(),v!==null&&(r.clearTimeout(v),v=null);let s=await O();if(x)return;if(!s.ok||!p.complete()||w()!==t)return y=!1,T();let l=await q(r,`/add-review/branch`,{path:i,...o});if(y=!1,l.ok&&Ht(e),!x){if(!l.ok){l.baseChoice?(_={key:t,result:{...l,ok:!1}},D(_.result),m.hide()):l.field?p.showProblem(l):m.show(l),T();return}b=sn(e,r,l.value.batchId,l.value.rows,n),a.replaceWith(b.element),b.focus()}},M=()=>{T(),v!==null&&r.clearTimeout(v),v=r.setTimeout(()=>{v=null,O()},Jt)};return c.addEventListener(`input`,()=>{A(),M()}),p.base.addEventListener(`input`,M),l.addEventListener(`click`,async()=>{let e=await q(r,`/add-review/folder/choose`,{});if(!x){if(!e.ok){m.show(e);return}e.value.path?k(e.value.path):c.focus()}}),f.addEventListener(`click`,e=>{let t=e.target.closest(`[data-folder-path]`);t?.dataset.folderPath&&k(t.dataset.folderDisplay??t.dataset.folderPath)}),g.addEventListener(`click`,()=>void j()),i.addEventListener(`keydown`,e=>{if(b||e.isComposing)return;let t=[...f.querySelectorAll(`[data-folder-path]`)],n=t.indexOf(e.target);if(e.key===`ArrowDown`||e.key===`ArrowUp`){let r=e.key===`ArrowDown`?e.target===c?t[0]:n>=0?t[n+1]:null:n===0?c:n>0?t[n-1]:null;if(!r)return;e.preventDefault(),r.focus();return}if(e.key!==`Enter`||e.shiftKey||n>=0)return;let r=e.target;r.tagName!==`SELECT`&&r.tagName!==`BUTTON`&&r.tagName!==`A`&&r.tagName!==`SUMMARY`&&(e.preventDefault(),j())}),i.addEventListener(`change`,()=>T()),p.loaded.then(e=>{x||(l.hidden=!e?.canChooseFolder,T())}),q(r,`/add-review/folders`).then(t=>{x||!t.ok||(f.replaceChildren(...t.value.folders.map(t=>{let n=J(e,`button`,`prb-palette-result`);return n.type=`button`,n.dataset.folderPath=t.path,n.dataset.folderDisplay=t.display,n.append(J(e,`span`,`prb-palette-result-title`,t.branch?`${t.repo} · ${t.branch}`:t.repo),tn(e,t.display,`prb-palette-result-where`)),n})),d.hidden=t.value.folders.length===0)}),T(),c.focus(),()=>{x=!0,b?.stop(),v!==null&&r.clearTimeout(v)}}}}function fn(e){return e?.compact?`Expand sidebar`:`Collapse sidebar`}function pn(e,t){let n=e.documentElement,r=()=>({compact:n.hasAttribute(`data-sidebar-compact`),hidden:n.hasAttribute(`data-sidebar-hidden`)}),i=()=>{let t=r();for(let n of e.querySelectorAll(`[data-sidebar-toggle="rail"]`)){let e=n.querySelector(`.prb-rail-title`);e&&(e.textContent=fn(t)),n.setAttribute(`aria-expanded`,String(!t.compact))}},a=n=>{let r=e.body,i=r?.dataset.token,a=i?`${r.dataset.apiBase??``}/prefs?t=${encodeURIComponent(i)}`:`/sidebar`;t.fetch(a,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({sidebar:n})}).catch(()=>{})},o=e.querySelector(`.prb-rail`),s,c=!1,l=()=>{let e=r();return e.compact===!0&&!e.hidden},u=e=>{t.clearTimeout(s),s=void 0,n.toggleAttribute(`data-sidebar-peek`,e&&l())},d=e=>{try{return typeof e?.matches==`function`&&e.matches(`:focus-visible`)}catch{return!1}},f=()=>o?.contains(e.activeElement)===!0&&d(e.activeElement);o?.addEventListener(`pointerenter`,()=>{c=!0,l()&&(t.clearTimeout(s),s=t.setTimeout(()=>u(!0),150))}),o?.addEventListener(`pointerleave`,()=>{c=!1,f()||u(!1)}),o?.addEventListener(`focusin`,e=>{d(e.target)&&l()&&u(!0)}),o?.addEventListener(`focusout`,e=>{let t=e.relatedTarget;t&&o.contains(t)||c||u(!1)});let p=e=>{n.toggleAttribute(`data-sidebar-compact`,e),u(!1),i(),a({compact:e})},m=t=>{n.toggleAttribute(`data-sidebar-hidden`,t),u(!1);let r=e.activeElement;t&&r?.closest(`.prb-rail`)&&e.querySelector(`[data-sidebar-toggle="strip"]`)?.focus(),!t&&r?.matches(`[data-sidebar-toggle="strip"]`)&&e.querySelector(`[data-sidebar-toggle="rail"]`)?.focus(),i(),a({hidden:t})};for(let t of e.querySelectorAll(`[data-sidebar-toggle]`))t.addEventListener(`click`,()=>{r().hidden?m(!1):p(!r().compact)});return i(),{hidden:()=>r().hidden===!0,setHidden:m}}function mn(e){return e.querySelector(`dialog[open], [data-menu-panel]:not([hidden])`)!==null}function hn(e){for(let t of e.children)return t.kind===`leaf`?t.command.group:hn(t);return`global`}function gn(e,t,r={}){let i=r.win??window,a=r.doc??document,o=r.isMac??y(i.navigator),s=wt(ht(e)),c=null,l=e=>{let t=a.querySelector(`a[href="${e}"]:not([target])`);t?t.click():i.location.assign(e)},u=Nt(a,Ot(o),`${U(o)} opens the command palette and ${U(o,`p`)} starts a new review, from anywhere in the workspace. Single keys never act while you are typing.`,()=>r.onSettle?.()),d=pn(a,i),f={"palette.open":{run:()=>D()},"add.open":{run:()=>D([`p`])},"add.pullRequest":{panel:un(a)},"add.branch":{panel:dn(a)},"navigate.reviews":{run:()=>l(`/`)},"navigate.runs":{run:()=>l(`/runs`)},"navigate.notifications":{run:()=>l(`/notifications`)},"help.shortcuts":{run:()=>u.open()},"sidebar.hide":{run:()=>d.setHidden(!d.hidden()),label:()=>d.hidden()?`Show sidebar`:`Hide sidebar`}},p=V.find(e=>e.id===`add.open`),m=G(p.binding,o);for(let e of a.querySelectorAll(`[data-new-review]`)){e.setAttribute(`aria-keyshortcuts`,Dt(p.binding,o)??``),e.dataset.tip=`New review (${m})`;let t=e.querySelector(`[data-new-review-key]`);t&&(t.textContent=m),e.addEventListener(`click`,()=>f[`add.open`].run?.())}let h=e=>f[e.id]??t[e.id],g=(e,t)=>{let n=h(e);return!!n&&(n.available?.(t)??!0)},_=null,v=`back`,b=[],x=()=>{_?.(),_=null},S=(e=`dismissed`)=>{x(),s.reset(),C.close();let t=c;c=null,t?.isConnected&&t.focus(),e===`dismissed`&&r.onSettle?.()},C=At(a,e=>O(e),S),w=gt(e).map(e=>({keys:G(e.binding,o),label:e.label})),T=Object.fromEntries(lt.map(e=>[e.id,e.label])),E=()=>{let e=s.at;if(!e)return;let t=e.children.map(e=>e.kind===`leaf`?{key:e.key,keyLabel:e.key.toUpperCase(),label:h(e.command)?.label?.()??e.command.label,namespace:!1,available:g(e.command),group:e.command.group,state:h(e.command)?.state?.()??null}:{key:e.key,keyLabel:e.key.toUpperCase(),label:e.label,namespace:!0,available:!0,group:hn(e)}),n=s.path.length===0?lt.flatMap(e=>t.filter(t=>t.group===e.id)):t;C.show({trail:W(s.path,o),title:e.label,rows:n,groupLabels:s.path.length===0?T:null,footer:w})};function D(e=[]){if(C.isOpen())return S();r.onOpen?.();let t=a.activeElement;c=t instanceof HTMLElement&&t!==a.body?t:null,s.start(e),E()}function O(e){let t=s.press(e);if(t.kind===`descend`)return E();let n=t.kind===`run`&&g(t.command)?h(t.command):null;if(n?.panel&&t.kind===`run`)return k(t.command,n.panel);S(n?`running`:`dismissed`),n?.run?.()}function k(e,t){b=e.binding.kind===`chord`?e.binding.keys.slice(0,-1):[],v=t.escape??`back`;let n=e.binding.kind===`chord`?W(e.binding.keys,o):[U(o)];_=C.showPanel(n,t,()=>S(`running`))}function A(){x(),s.start();for(let e of b)s.press(e);E()}let j=gt(e);return i.addEventListener(`keydown`,e=>{if(C.isOpen()){if(vt(e))return;let t=()=>{e.preventDefault(),e.stopPropagation()};if(_)return e.key===`Escape`&&!e.isComposing?(t(),v===`close`?S():A()):xt(e,o)?(t(),S()):void 0;if(e.key===`Escape`||xt(e,o))return t(),S();if([`ArrowDown`,`ArrowUp`,`Home`,`End`].includes(e.key)){t(),jt(C.dialog,e.key,a.activeElement);return}if(e.target?.closest?.(`[data-palette-key]`)&&(e.key===`Enter`||e.key===` `)||e.key===`Tab`||e.metaKey||e.ctrlKey||e.altKey)return;t(),O(yt(e)??``);return}if(e.defaultPrevented||e.isComposing)return;let t=xt(e,o),r=t?St(t):void 0;if(r){if(a.querySelector(`dialog[open]`))return;e.preventDefault(),e.stopPropagation(),h(r)?.run?.(e);return}for(let t of j){if(!Ct(t.binding,e,o))continue;let r=t.within;if(r){if(!a.querySelector(r)?.matches(`[open]`))continue}else if(t.binding.kind===`key`&&t.binding.key!==`Escape`&&(n(e.target)||mn(a)))continue;if(g(t,e)){e.preventDefault(),h(t).run?.(e);return}}},!0),i.addEventListener(`pagehide`,()=>{C.isOpen()&&S(`unloading`)}),_n(a,e,o),{isOpen:()=>C.isOpen()||u.isOpen(),close:()=>S()}}function _n(e,t,n){for(let r of mt(t)){let t=r.hint;if(t)for(let i of e.querySelectorAll(t))if(r.binding.kind===`chord`)i.dataset.shortcutHint=G(r.binding,n);else{let e=Dt(r.binding,n);if(e&&i.setAttribute(`aria-keyshortcuts`,e),r.showHint&&!i.querySelector(`:scope > .prb-key-hint`)){let e=i.ownerDocument.createElement(`kbd`);e.className=`prb-key-hint`,e.setAttribute(`aria-hidden`,`true`),e.textContent=G(r.binding,n),i.append(e)}}}}function vn(e){return`${e} more`}function yn(e){return e===0?`Nothing unread`:`${e} unread`}function bn(e){return e===`moved-again`?`replaced by a later move`:`replaced when the review caught up`}function xn(e){return e===`restarting`?`Workspace server restarting`:e===`unreachable`?`Workspace server not running`:`Workspace server running`}function Q(e,t){let n=e.querySelector(`[data-server-status]`);if(!n)return;n.dataset.serverStatus=t;let r=n.querySelector(`[data-server-status-label]`);r&&(r.textContent=xn(t))}function Sn(e,t){let n=e.querySelector(`[data-server-status]`);!n||n.dataset.serverStatus===`restarting`||Q(e,t?`running`:`unreachable`)}function Cn(e,t){if(typeof t==`number`)for(let n of e.querySelectorAll(`[data-unread-count]`))n.dataset.unreadStyle===`rail`&&(n.textContent=t===0?``:yn(t)),n.hidden=t===0}var wn=6e3,Tn=5e3;function En(e=document){let t=e.querySelector(`.prb-toasts`);if(t)return t;let n=e.createElement(`div`);return n.className=`prb-toasts`,n.setAttribute(`role`,`status`),n.setAttribute(`aria-live`,`polite`),e.body.append(n),n}function Dn(e,t,n=window){return On(e,{kind:t.kind,text:t.text},n)}function On(e,t,n){let r=e.ownerDocument,i=r.createElement(`div`);i.className=`prb-toast`,i.dataset.kind=t.kind;let a=r.createElement(`span`);a.className=`prb-toast-text`,a.textContent=t.text;let o=r.createElement(`a`);o.className=`prb-toast-open`,t.href!==void 0&&t.link!==void 0&&(o.href=t.href,o.textContent=t.link);let s=r.createElement(`button`);for(s.type=`button`,s.className=`prb-toast-close`,s.setAttribute(`aria-label`,`Dismiss: ${t.text}`),s.textContent=`×`,i.append(a,...t.href===void 0?[]:[o],s),e.append(i);e.children.length>3;)e.firstElementChild?.remove();let c=n.setTimeout(()=>i.remove(),wn),l=()=>n.clearTimeout(c),u=()=>{n.clearTimeout(c),c=n.setTimeout(()=>i.remove(),wn)};return i.addEventListener(`mouseenter`,l),i.addEventListener(`mouseleave`,u),i.addEventListener(`focusin`,l),i.addEventListener(`focusout`,u),s.addEventListener(`click`,()=>{n.clearTimeout(c),i.remove()}),i}var kn=`prb-carried-notices`;function An(e=document,t=window){let n=[...e.querySelectorAll(`.prb-toast[data-kind="failed"] .prb-toast-text`)].map(e=>e.textContent??``).filter(Boolean);try{n.length>0&&t.sessionStorage.setItem(kn,JSON.stringify(n))}catch{}t.location.reload()}function jn(e=document,t=window){let n;try{n=JSON.parse(t.sessionStorage.getItem(kn)??`null`),t.sessionStorage.removeItem(kn)}catch{return}if(Array.isArray(n))for(let r of n)typeof r==`string`&&Dn(En(e),{kind:`failed`,text:r},t)}function Mn(e,t,n=window){return On(e,{kind:t.tone,text:t.headline,href:`/notifications/open?id=${encodeURIComponent(t.id)}`,link:`Open`},n)}function Nn(e,t,n=window){return On(e,{kind:`more`,text:vn(t),href:`/notifications`,link:`View all`},n)}function Pn(e=document,t=window,n={}){let r=Number(e.body.dataset.notificationsSince);if(!Number.isFinite(r)||r<=0)return;let i=En(e),a=async()=>{try{let a=await t.fetch(`/notifications/recent?after=${r}`);if(Sn(e,!0),a.status===403)return;if(a.ok){let o=await a.json();n.paintUnread&&Cn(e,o.unread),typeof o.now==`number`&&(r=o.now);for(let e of[...o.notifications??[]].reverse())Mn(i,e,t);typeof o.more==`number`&&o.more>0&&Nn(i,o.more,t)}}catch{Sn(e,!1)}t.setTimeout(()=>void a(),Tn)};t.setTimeout(()=>void a(),Tn)}function Fn(e,t){Cn(e,t.unread),typeof t.driving==`boolean`&&In(e,t.driving)}function In(e,t){let n=e.querySelector(`[data-restart]`),r=e.querySelector(`[data-restart-note]`);n&&(n.disabled=t),r&&(r.hidden=!t)}var Ln=`prb-server-restarted`;function Rn(e=document,t=window){let n=null;try{n=t.sessionStorage.getItem(Ln),t.sessionStorage.removeItem(Ln)}catch{}n!==null&&Dn(En(e),{kind:`ready`,text:`Server restarted. Workspace is back online.`},t)}var zn=2e4,Bn=300;function Vn(e){Rn();let t=document.querySelector(`[data-restart]`),n=document.querySelector(`[data-restart-note]`);t&&t.addEventListener(`click`,()=>{t.disabled=!0,Hn(e,t,n)})}async function Hn(e,t,n){let r,i=null;try{let a=await fetch(e,{method:`POST`});if(a.status===409){In(document,!0);return}if(!a.ok)return void $(t,n,await Xn(a));let o=await a.json();r=typeof o.startedAt==`number`?o.startedAt:null,i=Jn(window.location.href,o.port)}catch{$(t,n,`The workspace server could not be reached.`);return}if(document.body.dataset.restarting=`true`,Q(document,`restarting`),i!==null){if(await Kn(Number(new URL(i).port)))return void window.location.assign(i)}else if(await Un(r)){try{window.sessionStorage.setItem(Ln,`1`)}catch{}window.location.reload();return}if(delete document.body.dataset.restarting,await Yn()){Q(document,`running`),$(t,n,`The server did not restart, and is still the one that was running.`);return}Q(document,`unreachable`),$(t,n,`Server restart failed. Run prreviewbuddy open to start the workspace again.`)}async function Un(e){let t=Date.now()+zn;for(;Date.now()<t;){await new Promise(e=>setTimeout(e,Bn));try{let t=await fetch(`/health`,{cache:`no-store`});if(!t.ok)continue;let n=await t.json();if(typeof n.startedAt==`number`&&n.startedAt!==e)return!0}catch{}}return!1}var Wn=4,Gn={now:()=>Date.now(),sleep:e=>new Promise(t=>setTimeout(t,e))};async function Kn(e,t=()=>qn(e),n=Gn){let r=n.now()+zn,i=0;for(;n.now()<r;){await n.sleep(Bn);let e=await t();if(e===`moved`||(i=e===`gone`?i+1:0,i>=Wn))return!0}for(let e=0;e<Wn;e+=1){let e=await t();if(e!==`gone`)return e===`moved`;await n.sleep(Bn)}return!0}async function qn(e){try{let t=await fetch(`/health`,{cache:`no-store`});return t.ok&&(await t.json()).movedTo===e?`moved`:`here`}catch{return`gone`}}function Jn(e,t){if(typeof t!=`number`||!Number.isInteger(t))return null;let n=new URL(e);return t===(n.port===``?n.protocol===`https:`?443:80:Number(n.port))?null:(n.port=String(t),n.href)}async function Yn(){try{return(await fetch(`/health`,{cache:`no-store`})).ok}catch{return!1}}async function Xn(e){try{return(await e.json()).error??`The server could not be restarted.`}catch{return`The server could not be restarted.`}}function $(e,t,n){e.disabled=!1,t&&(t.textContent=n,t.hidden=!1)}export{$e as $,Ee as A,De as B,Ae as C,Se as D,Te as E,He as F,Ve as G,ke as H,xe as I,Ze as J,qe as K,Be as L,rt as M,it as N,Me as O,Ye as P,tt as Q,Le as R,pe as S,Ce as T,Oe as U,Ke as V,L as W,ze as X,at as Y,nt as Z,Ot as _,e as _t,Dn as a,se as at,R as b,Cn as c,re as ct,bn as d,v as dt,Qe as et,yn as f,A as ft,Mt as g,n as gt,Wt as h,j as ht,jn as i,ue as it,Re as j,we as k,Sn as l,O as lt,Ut as m,p as mt,Fn as n,de as nt,Pn as o,P as ot,gn as p,k as pt,Je as q,An as r,ie as rt,En as s,ne as st,Vn as t,oe as tt,Q as u,y as ut,ot as v,Ne as w,fe as x,ct as y,_e as z};
@@ -1 +1 @@
1
- import{F as e}from"./chunk-DwdwtB9r.js";function t(e=document){for(let t of e.querySelectorAll(`.prb-index-status`))t.addEventListener(`click`,e=>{let n=t.querySelector(`select`);if(!(!n||e.target instanceof Node&&n.contains(e.target))){e.preventDefault(),n.focus();try{n.showPicker()}catch{}}})}function n(t,n){r(t,t=>e(t.dataset.section)?t.dataset.section:void 0,n)}function r(e,t,n){let r=Promise.resolve();for(let i of e){let e=t(i);if(e===void 0)continue;let a=i.open;i.addEventListener(`toggle`,()=>{if(i.open===a)return;a=i.open;let t=!i.open;r=r.then(()=>n(e,t)).catch(()=>{})})}}export{n,t as r,r as t};
1
+ import{z as e}from"./chunk-D9x9bcKf.js";function t(e=document){for(let t of e.querySelectorAll(`.prb-index-status`))t.addEventListener(`click`,e=>{let n=t.querySelector(`select`);if(!(!n||e.target instanceof Node&&n.contains(e.target))){e.preventDefault(),n.focus();try{n.showPicker()}catch{}}})}function n(t,n){r(t,t=>e(t.dataset.section)?t.dataset.section:void 0,n)}function r(e,t,n){let r=Promise.resolve();for(let i of e){let e=t(i);if(e===void 0)continue;let a=i.open;i.addEventListener(`toggle`,()=>{if(i.open===a)return;a=i.open;let t=!i.open;r=r.then(()=>n(e,t)).catch(()=>{})})}}export{n,t as r,r as t};
@@ -0,0 +1 @@
1
+ import{gt as e}from"./chunk-D9x9bcKf.js";async function t(e,t){try{await navigator.clipboard.writeText(t);let n=e.textContent;e.textContent=`Copied`,window.setTimeout(()=>{e.textContent=n},1200)}catch{let n=document.createElement(`input`);n.type=`text`,n.readOnly=!0,n.value=t,n.className=`prb-menu-id`,n.setAttribute(`data-id-field`,``),e.after(n),n.select()}}var n=[`progress`,`overview`,`guide`,`issues`,`questions`,`files`,`prcontext`,`architecture`,`map`,`diagram`,`kiss`,`kissrecs`],r=`#theme-`,i=[`buddy`,`overview`,`guide`,`architecture`,`map`,`diagram`,`issues`,`questions`,`files`,`prcontext`,`kiss`,`kissrecs`,`progress`],a=`&focus=`;function o(e){return`#${e}`}function s(e){return`${r}${encodeURIComponent(e)}`}function c(e){let t=e.kind===`view`?o(e.view):s(e.sectionId);return e.focus?`${t}${a}${e.focus}`:t}var l=[`architecture`,`map`,`diagram`];function u(e,t){return l.includes(e)&&l.includes(t??``)?e:void 0}function d(e,t){let n=g(e),r=n?.kind===`view`&&n.view===t?n.focus:u(t,n?.focus);return c({kind:`view`,view:t,...r?{focus:r}:{}})}function f(e){let{focus:t,...n}=e;return n}function p(e,t){return e.kind!==`view`||e.view!==`guide`||!t?e:{kind:`section`,sectionId:t,...e.focus?{focus:e.focus}:{}}}function m(e){return i.includes(e)}function h(e){if(!e||typeof e!=`object`)return null;let{kind:t,view:r,sectionId:i,focus:a}=e,o=typeof a==`string`&&m(a)?{focus:a}:{};return t===`view`&&typeof r==`string`&&n.includes(r)?{kind:t,view:r,...o}:t===`section`&&typeof i==`string`&&i!==``?{kind:t,sectionId:i,...o}:null}function g(e){let t=e.indexOf(a);if(t===-1)return _(e);let n=_(e.slice(0,t));if(!n)return null;let r=e.slice(t+7);return m(r)?{...n,focus:r}:n}function _(e){if(e.startsWith(r)){let t=e.slice(7);if(!t)return null;try{return{kind:`section`,sectionId:decodeURIComponent(t)}}catch{return null}}let t=e.replace(/^#/,``);return n.includes(t)?{kind:`view`,view:t}:null}var v=`pushedFocus`;function y(e){let{[v]:t,...n}=e;return n}function b(e,t){return e.kind===`view`&&t.kind===`view`?e.view===t.view:e.kind===`section`&&t.kind===`section`&&e.sectionId===t.sectionId}function x(e,t,n){if(e.focus===t)return;let r={...f(y(e)),focus:t};e.focus&&n.history.state?.[v]?n.history.replaceState({...r,[v]:!0},``,c(r)):n.history.pushState({...r,[v]:!0},``,c(r)),n.apply(r)}function S(e,t){if(!e.focus)return;if(t.history.state?.[v]){t.history.back();return}let n=f(y(e));t.history.replaceState(n,``,c(n)),t.apply(n)}function C(t,n,r){if(!r||t.key!==`Escape`||t.defaultPrevented||n.querySelector(`dialog[open], [data-menu-panel]:not([hidden]), [data-analysis-details][open], [data-range-details][open], .pr-helper-selection-popover`))return!1;let i=t.target;return!(i?.closest?.(`[data-ask-resize]`)||i instanceof HTMLInputElement&&e(i)&&i.value!==``)}function w(e,t,n){e&&(n?e.dataset.focus=n:delete e.dataset.focus);for(let e of t.querySelectorAll(`[data-focus-toggle]`)){let t=e.dataset.focusToggle===n,r=e.dataset.focusName??`this`,i=t?`Exit focus on ${r}`:`Expand ${r}`;e.setAttribute(`aria-pressed`,String(t)),e.setAttribute(`aria-label`,i),e.setAttribute(`title`,t?`${i} (Esc)`:i)}}function T(e,t){let n=t.toLowerCase().split(/\s+/).filter(Boolean);return n.length===0?[...e]:e.filter(e=>{let t=`${e.name}\n${e.prompt}`.toLowerCase();return n.every(e=>t.includes(e))})}function E(e){return e<0||e>=10?null:e===9?`0`:String(e+1)}function D(e){return/^[0-9]$/.test(e)?e===`0`?9:Number(e)-1:null}function O(e){return{title:`Choose a prompt`,mount(t,n){let r=t.ownerDocument,i=e.prompts(),a=r.createElement(`input`);a.type=`search`,a.className=`prb-palette-input`,a.placeholder=`Filter prompts`,a.setAttribute(`aria-label`,`Filter prompts`),a.spellcheck=!1;let o=r.createElement(`p`);o.className=`prb-palette-summary`,o.setAttribute(`aria-live`,`polite`);let s=r.createElement(`div`);s.className=`prb-palette-results`,s.setAttribute(`role`,`group`),s.setAttribute(`aria-label`,`Prompts`);let c=[],l=()=>[...s.querySelectorAll(`[data-prompt-choice]`)],u=()=>{let e=r.activeElement===a;for(let[t,n]of l().entries())n.toggleAttribute(`data-enter-target`,e&&t===0)},d=()=>{c=T(i,a.value),s.replaceChildren(...c.map((e,t)=>{let n=r.createElement(`button`);n.type=`button`,n.className=`prb-palette-result prb-palette-prompt`,n.dataset.promptChoice=e.id;let i=r.createElement(`kbd`);i.className=`prb-kbd prb-palette-num`;let a=E(t);a?i.textContent=a:i.setAttribute(`aria-hidden`,`true`);let o=r.createElement(`span`);o.className=`prb-palette-prompt-text`;let s=r.createElement(`span`);s.className=`prb-palette-result-title`,s.textContent=e.name;let c=r.createElement(`span`);return c.className=`prb-palette-prompt-said`,c.textContent=e.prompt,o.append(s,c),n.append(i,o),n})),o.textContent=i.length===0?`No saved prompts yet. Add one under Your prompts in Buddy AI.`:c.length===0?`No prompts match.`:c.length===i.length?`${i.length} ${i.length===1?`prompt`:`prompts`}`:`${c.length} of ${i.length} prompts`,u()},f=t=>{!t||!c.some(e=>e.id===t)||(n(),e.choose(t))},p=e=>{a.value=e===`Backspace`?a.value.slice(0,-1):a.value+e,a.focus(),a.dispatchEvent(new Event(`input`,{bubbles:!0}))};a.addEventListener(`input`,d),a.addEventListener(`focus`,u),a.addEventListener(`blur`,u),s.addEventListener(`click`,e=>{f(e.target.closest(`[data-prompt-choice]`)?.dataset.promptChoice)}),t.addEventListener(`keydown`,e=>{if(e.isComposing||e.metaKey||e.ctrlKey||e.altKey)return;let t=l(),n=e.target===a,r=t.indexOf(e.target),i=D(e.key);if(i!==null)return e.preventDefault(),f(t[i]?.dataset.promptChoice);if(e.key===`Enter`)return e.preventDefault(),f((n?t[0]:t[r])?.dataset.promptChoice);let o=e.key===`ArrowDown`||!n&&e.key===`j`,s=e.key===`ArrowUp`||!n&&e.key===`k`;if(o||s){let n=o?r<0?t[0]:t[r+1]:r<=0?a:t[r-1];e.preventDefault(),n?.focus();return}!n&&(e.key.length===1||e.key===`Backspace`)&&(e.preventDefault(),p(e.key))}),t.append(a,o,s),d(),a.focus()}}}var k=`Fetch selected`;function A(e){return`${e} ${e===1?`repository`:`repositories`}`}function j(e){return`Fetching ${A(e)}…`}function M(e){return e.fetched===0?`Could not fetch ${A(e.repositories)}`:e.fetched===e.repositories?`Fetched ${A(e.repositories)}`:`Fetched ${e.fetched} of ${A(e.repositories)}`}function N(e,t){let n=new Set,r=new Set;for(let i of e)for(let e of i.lineage){let i=t[e];i!==void 0&&(n.add(e),r.add(i))}return{ids:[...n],repositories:r.size}}function P(e,t){return N(t,e).repositories>0}export{h as _,j as a,d as b,E as c,S as d,w as f,c as g,u as h,M as i,x as l,i as m,P as n,O as o,b as p,N as r,D as s,k as t,C as u,g as v,t as x,p as y};
package/static/help.js CHANGED
@@ -1 +1 @@
1
- import{at as e,d as t,f as n,ft as r,p as i,rt as a,t as o}from"./chunk-DwdwtB9r.js";function s(e,t){if(e.length===0)return-1;if(t)return e.length-1;let n=0;return e.forEach((e,t)=>{e<=120&&(n=t)}),n}var c=new Set([`ArrowDown`,`ArrowUp`,`PageDown`,`PageUp`,`Home`,`End`,` `]);function l(e,t){let n=[...e.querySelectorAll(`.prb-help-contents a[href^="#"]`)],r=n.map(t=>e.getElementById(decodeURIComponent(t.hash.slice(1)))),i=e.defaultView;if(n.length===0||!i)return;let a=r.findIndex(e=>e!==null&&`#${e.id}`===i.location.hash),o=e=>{n.forEach((t,n)=>{n===e?t.setAttribute(`aria-current`,`location`):t.removeAttribute(`aria-current`)})},l=()=>{if(a>=0)return o(a);let n=t.scrollHeight>t.clientHeight?t:e.scrollingElement??e.documentElement,i=Math.max(0,n===t?t.getBoundingClientRect().top:0),c=r.map(e=>e?e.getBoundingClientRect().top-i:1/0),l=n.scrollTop>0&&n.scrollTop+n.clientHeight>=n.scrollHeight-2;o(s(c,l))},u=e=>{let t=r.findIndex(t=>t!==null&&`#${t.id}`===e);t<0||(a=t,o(t))},d=()=>{a<0||(a=-1,l())};e.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[href^="#"]`);t&&u(t.hash)}),i.addEventListener(`hashchange`,()=>u(i.location.hash)),t.addEventListener(`wheel`,d,{passive:!0}),t.addEventListener(`touchmove`,d,{passive:!0}),t.addEventListener(`pointerdown`,d),e.addEventListener(`keydown`,e=>{c.has(e.key)&&d()}),e.addEventListener(`scroll`,l,{capture:!0,passive:!0}),i.addEventListener(`resize`,l),l()}a(),t(`global`,{}),document.querySelector(`[data-shortcut-table]`)?.replaceChildren(n(document,i(e(navigator)))),o(`/restart`);var u=document.querySelector(`main.prb-help`);u&&l(document,u),r(window,()=>window.location.reload());
1
+ import{_ as e,_t as t,ct as n,g as r,p as i,t as a,ut as o}from"./chunk-D9x9bcKf.js";function s(e,t){if(e.length===0)return-1;if(t)return e.length-1;let n=0;return e.forEach((e,t)=>{e<=120&&(n=t)}),n}var c=new Set([`ArrowDown`,`ArrowUp`,`PageDown`,`PageUp`,`Home`,`End`,` `]);function l(e,t){let n=[...e.querySelectorAll(`.prb-help-contents a[href^="#"]`)],r=n.map(t=>e.getElementById(decodeURIComponent(t.hash.slice(1)))),i=e.defaultView;if(n.length===0||!i)return;let a=r.findIndex(e=>e!==null&&`#${e.id}`===i.location.hash),o=e=>{n.forEach((t,n)=>{n===e?t.setAttribute(`aria-current`,`location`):t.removeAttribute(`aria-current`)})},l=()=>{if(a>=0)return o(a);let n=t.scrollHeight>t.clientHeight?t:e.scrollingElement??e.documentElement,i=Math.max(0,n===t?t.getBoundingClientRect().top:0),c=r.map(e=>e?e.getBoundingClientRect().top-i:1/0),l=n.scrollTop>0&&n.scrollTop+n.clientHeight>=n.scrollHeight-2;o(s(c,l))},u=e=>{let t=r.findIndex(t=>t!==null&&`#${t.id}`===e);t<0||(a=t,o(t))},d=()=>{a<0||(a=-1,l())};e.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[href^="#"]`);t&&u(t.hash)}),i.addEventListener(`hashchange`,()=>u(i.location.hash)),t.addEventListener(`wheel`,d,{passive:!0}),t.addEventListener(`touchmove`,d,{passive:!0}),t.addEventListener(`pointerdown`,d),e.addEventListener(`keydown`,e=>{c.has(e.key)&&d()}),e.addEventListener(`scroll`,l,{capture:!0,passive:!0}),i.addEventListener(`resize`,l),l()}n(),i(`global`,{}),document.querySelector(`[data-shortcut-table]`)?.replaceChildren(r(document,e(o(navigator)))),a(`/restart`);var u=document.querySelector(`main.prb-help`);u&&l(document,u),t(window,()=>window.location.reload());
@@ -1 +1 @@
1
- import{d as e,ft as t,l as n,o as r,rt as i,t as a,u as o}from"./chunk-DwdwtB9r.js";import{t as s}from"./chunk-C8kkSv38.js";var c=5e3;function l(e){let t=[],n=[],r=0;for(let i of e){let e=encodeURIComponent(i).length+1;n.length>0&&r+e>4e3&&(t.push(n),n=[],r=0),n.push(i),r+=e}return n.length>0&&t.push(n),t}var u=`Unread. `;function d(e,t){if(e.dataset.rowState===t||t===`unread`)return;e.dataset.rowState=t,e.dataset.read=`true`;let r=e.querySelector(`.prb-notification-open`),i=r?.getAttribute(`aria-label`)??``;if(i.startsWith(u)&&(i=i.slice(8)),t===`moved-again`||t===`caught-up`){let r=n(t);i=`${i}, ${r}`;let a=e.querySelector(`.prb-notification-meta`);if(a&&!a.querySelector(`[data-notification-replaced]`)){let t=e.ownerDocument.createElement(`span`);t.className=`prb-notification-replaced`,t.dataset.notificationReplaced=``,t.textContent=` · ${r}`,a.append(t)}}r?.setAttribute(`aria-label`,i)}function f(e,t){let n=e.querySelector(`[data-notifications-count]`);n&&(n.textContent=o(t));let i=e.querySelector(`[data-notifications-read-all]`);i&&(i.disabled=t===0),r(e,t)}function p(e,t){let n=Number(e.dataset.createdAt),r=Number(t.dataset.createdAt);return n>r||n===r&&(e.dataset.notificationId??``)<(t.dataset.notificationId??``)}function m(e,t){let n=[...e.querySelectorAll(`[data-notification-id]`)].find(e=>p(t,e));n?n.before(t):e.append(t)}function h(e,t){let n=new Set([...e.querySelectorAll(`[data-notification-id]`)].map(e=>e.dataset.notificationId));return Object.keys(t).filter(e=>!n.has(e))}function g(e,t,n=()=>{}){let r=Array.isArray(t.rows)?t.rows.filter(e=>typeof e==`string`):[],i=e.querySelector(`[data-notifications]`);if(r.length>0&&!i)return!1;let a=!1;if(i){for(let t of r){let n=e.createElement(`template`);n.innerHTML=t.trim();let r=n.content.firstElementChild,o=r?.dataset.notificationId;!r||!o||[...i.querySelectorAll(`[data-notification-id]`)].some(e=>e.dataset.notificationId===o)||(m(i,r),a=!0)}a&&n()}let o=t.states&&typeof t.states==`object`?t.states:{};for(let t of e.querySelectorAll(`[data-notification-id]`)){let e=o[t.dataset.notificationId??``];e&&d(t,e)}return typeof t.unread==`number`&&f(e,t.unread),!0}function _(e=document,t=window,n=e=>t.fetch(`/notifications/live${e.length>0?`?ids=${e.map(encodeURIComponent).join(`,`)}`:``}`),r=()=>{}){if(!e.querySelector(`[data-notifications], [data-notifications-empty]`))return;let i,a=!1,o=()=>e.visibilityState===`visible`,s=async e=>{let t=await n(e);return t.ok?await t.json():null},u=async()=>{if(!(a||!o())){a=!0;try{let n=await s([]);if(n){if(!g(e,{...n,rows:[]},r)){t.location.reload();return}let i=n.states?h(e,n.states):[];for(let n of l(i)){let i=null;try{i=await s(n)}catch{continue}if(i&&!g(e,i,r)){t.location.reload();return}}}}catch{}finally{a=!1}t.clearTimeout(i),i=t.setTimeout(()=>void u(),c)}};e.addEventListener(`visibilitychange`,()=>{o()&&(t.clearTimeout(i),u())}),i=t.setTimeout(()=>void u(),c)}function v(e,t,n){let r=[...e.querySelectorAll(`[data-notification-id]`)];r.forEach((e,t)=>{e.hidden=t>=n}),t&&(t.hidden=r.length<=n)}function y(e){let t=e.querySelector(`[data-notifications-more]`),n=15;return v(e,t,n),t?.addEventListener(`click`,()=>{n+=15,v(e,t,n)}),{refresh:()=>v(e,e.querySelector(`[data-notifications-more]`),n)}}i(),a(`/restart`);var b=y(document),x=s({doc:document,item:`[data-notification-id]`,link:`a.prb-notification-open`,walk:()=>[...document.querySelectorAll(`[data-notification-id]:not([hidden])`)].filter(e=>e.querySelector(`a.prb-notification-open`)),background:()=>document.querySelector(`.prb-shell > main`)});e(`notifications`,{"notifications.next":{run:()=>x.move(1)},"notifications.previous":{run:()=>x.move(-1)},"notifications.open":{available:()=>x.enterOpens(),run:()=>x.open()},"notifications.openInNewTab":{available:()=>x.enterOpens(),run:()=>x.openInNewTab()}});var S=document.querySelector(`[data-notifications-read-all]`);async function C(){try{let e=await fetch(`/notifications`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({action:`read-all`})});if(!e.ok)return null;let t=await e.json();return typeof t.unread==`number`?t.unread:null}catch{return null}}S?.addEventListener(`click`,()=>{S.disabled=!0,C().then(e=>{if(e===null){S.disabled=!1;return}document.querySelectorAll(`[data-notification-id][data-row-state="unread"]`).forEach(e=>d(e,`seen`)),f(document,e)})}),_(document,window,void 0,()=>b.refresh()),t(window,()=>window.location.reload());
1
+ import{_t as e,a as t,c as n,ct as r,d as i,f as a,p as o,s,t as c}from"./chunk-D9x9bcKf.js";import{t as l}from"./chunk-C8kkSv38.js";var u=5e3;function d(e){let t=[],n=[],r=0;for(let i of e){let e=encodeURIComponent(i).length+1;n.length>0&&r+e>4e3&&(t.push(n),n=[],r=0),n.push(i),r+=e}return n.length>0&&t.push(n),t}var f=`Unread. `;function p(e,t){if(e.dataset.rowState===t||t===`unread`)return;e.dataset.rowState=t,e.dataset.read=`true`;let n=e.querySelector(`.prb-notification-open`),r=n?.getAttribute(`aria-label`)??``;if(r.startsWith(f)&&(r=r.slice(8)),t===`moved-again`||t===`caught-up`){let n=i(t);r=`${r}, ${n}`;let a=e.querySelector(`.prb-notification-meta`);if(a&&!a.querySelector(`[data-notification-replaced]`)){let t=e.ownerDocument.createElement(`span`);t.className=`prb-notification-replaced`,t.dataset.notificationReplaced=``,t.textContent=` · ${n}`,a.append(t)}}n?.setAttribute(`aria-label`,r)}function m(e,t){let r=e.querySelector(`[data-notifications-count]`);r&&(r.textContent=a(t));let i=e.querySelector(`[data-notifications-read-all]`);i&&(i.disabled=t===0),n(e,t)}function h(e,t){let n=Number(e.dataset.createdAt),r=Number(t.dataset.createdAt);return n>r||n===r&&(e.dataset.notificationId??``)<(t.dataset.notificationId??``)}function g(e,t){let n=[...e.querySelectorAll(`[data-notification-id]`)].find(e=>h(t,e));n?n.before(t):e.append(t)}function _(e,t){let n=new Set([...e.querySelectorAll(`[data-notification-id]`)].map(e=>e.dataset.notificationId));return Object.keys(t).filter(e=>!n.has(e))}function v(e,t,n=()=>{}){let r=Array.isArray(t.rows)?t.rows.filter(e=>typeof e==`string`):[],i=e.querySelector(`[data-notifications]`);if(r.length>0&&!i)return!1;let a=!1;if(i){for(let t of r){let n=e.createElement(`template`);n.innerHTML=t.trim();let r=n.content.firstElementChild,o=r?.dataset.notificationId;!r||!o||[...i.querySelectorAll(`[data-notification-id]`)].some(e=>e.dataset.notificationId===o)||(g(i,r),a=!0)}a&&n()}let o=t.states&&typeof t.states==`object`?t.states:{};for(let t of e.querySelectorAll(`[data-notification-id]`)){let e=o[t.dataset.notificationId??``];e&&p(t,e)}return typeof t.unread==`number`&&m(e,t.unread),!0}function y(e=document,t=window,n=e=>t.fetch(`/notifications/live${e.length>0?`?ids=${e.map(encodeURIComponent).join(`,`)}`:``}`),r=()=>{}){if(!e.querySelector(`[data-notifications], [data-notifications-empty]`))return;let i,a=!1,o=()=>e.visibilityState===`visible`,s=async e=>{let t=await n(e);return t.ok?await t.json():null},c=async()=>{if(!(a||!o())){a=!0;try{let n=await s([]);if(n){if(!v(e,{...n,rows:[]},r)){t.location.reload();return}let i=n.states?_(e,n.states):[];for(let n of d(i)){let i=null;try{i=await s(n)}catch{continue}if(i&&!v(e,i,r)){t.location.reload();return}}}}catch{}finally{a=!1}t.clearTimeout(i),i=t.setTimeout(()=>void c(),u)}};e.addEventListener(`visibilitychange`,()=>{o()&&(t.clearTimeout(i),c())}),i=t.setTimeout(()=>void c(),u)}function b(e,t,n){let r=[...e.querySelectorAll(`[data-notification-id]`)];r.forEach((e,t)=>{e.hidden=t>=n}),t&&(t.hidden=r.length<=n)}function x(e){let t=e.querySelector(`[data-notifications-more]`),n=15;return b(e,t,n),t?.addEventListener(`click`,()=>{n+=15,b(e,t,n)}),{refresh:()=>b(e,e.querySelector(`[data-notifications-more]`),n)}}r(),c(`/restart`);var S=x(document),C=l({doc:document,item:`[data-notification-id]`,link:`a.prb-notification-open`,walk:()=>[...document.querySelectorAll(`[data-notification-id]:not([hidden])`)].filter(e=>e.querySelector(`a.prb-notification-open`)),background:()=>document.querySelector(`.prb-shell > main`)});o(`notifications`,{"notifications.next":{run:()=>C.move(1)},"notifications.previous":{run:()=>C.move(-1)},"notifications.open":{available:()=>C.enterOpens(),run:()=>C.open()},"notifications.openInNewTab":{available:()=>C.enterOpens(),run:()=>C.openInNewTab()}});var w=document.querySelector(`[data-notifications-read-all]`);async function T(){try{let e=await fetch(`/notifications`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({action:`read-all`})}),t=await e.json().catch(()=>null);return e.ok&&typeof t?.unread==`number`?t.unread:typeof t?.error==`string`?t.error:`Nothing was marked read. The workspace server refused it.`}catch{return`Nothing was marked read. The workspace server did not answer. It may have stopped.`}}w?.addEventListener(`click`,()=>{w.disabled=!0,T().then(e=>{if(typeof e==`string`){w.disabled=!1,t(s(),{kind:`failed`,text:e});return}document.querySelectorAll(`[data-notification-id][data-row-state="unread"]`).forEach(e=>p(e,`seen`)),m(document,e)})}),y(document,window,void 0,()=>S.refresh()),e(window,()=>window.location.reload());