prreviewbuddy 0.25.0 → 0.25.6

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,68 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.25.6
4
+
5
+ **A review you open while it is still running now looks like one that is running.** Following the
6
+ link the moment it is printed used to show the finished layout with most of it missing: a two line
7
+ status strip, the KISS card, a screen of white below it, and an empty column down the right where
8
+ the assistant would go. It read as a page that had failed to draw rather than as a review being
9
+ made.
10
+
11
+ There is now a **Review in progress** page, and it is what a running review opens on. It lists the
12
+ steps of the run, ticks them off as they finish, and marks the one going with the note the agent is
13
+ writing as it works:
14
+
15
+ ```
16
+ ✓ Prepared isolated checkout
17
+ ✓ Read what changed
18
+ ✓ Read pull request conversation
19
+ ● Analysing the change
20
+ Reading packages/alerts/src/ede/adapter.ts
21
+ ```
22
+
23
+ Those are the same step names the terminal prints while you wait, so switching between the two
24
+ shows one operation rather than two descriptions of it. The elapsed time counts in seconds while it
25
+ is under a minute, because a number that does not move is no evidence that anything is happening.
26
+
27
+ **The changed files open before the review is finished.** They are known minutes before anything
28
+ has been concluded about them, so once the change has been read the page offers them, and the Files
29
+ tab works exactly as it does on a finished review. You can start reading the code while the model
30
+ is still thinking about it. The findings, questions and assistant stay behind until they exist,
31
+ since an empty Issues tab cannot be told apart from a review that found nothing.
32
+
33
+ Going into Files while it runs keeps you there. The page refreshes itself only when it has
34
+ something new to show you, not on every step.
35
+
36
+ **A run that stopped says which step it stopped on.** The message and **Retry** used to sit in the
37
+ strip, which had room to say a review had paused but not where. The failure now sits under the same
38
+ checklist, with the step that broke marked and the ones after it left unclaimed, so what failed is
39
+ a thing you read rather than a thing you infer.
40
+
41
+ **KISS is no longer where you land by accident.** A change whose standard review had not finished
42
+ opened on the KISS run form, because it was the only page with anything on it. It is a peer review
43
+ type, not the fallback for whichever review is busy, and it is still one click away in the sidebar.
44
+
45
+ **Locations under a KISS recommendation fit the page.** A repository path is one long unbreakable
46
+ word, and the buttons holding them grew wider than the document, cutting off the end of the path,
47
+ which is the half naming the file. They now wrap the way the standard review's file rows always
48
+ have: a quiet directory line above a filename that wraps.
49
+
50
+ The **Main** badge on those rows is gone. It was our word for a flag in the data, worn as a label,
51
+ so it read as a fact about the file and left you to work out what it was for. The rows now sit
52
+ under **Start here** and **Also relevant**, which say what to do instead of what we call it. Both
53
+ headings are dropped where a recommendation cites a single file.
54
+
55
+ **"Show more of this file" shows more of the file.** Under a finding at line 804 it used to jump to
56
+ the top of the file and then do nothing at all when pressed again, because it meant "the first 600
57
+ lines" rather than "more". Each press now widens the window around the line you arrived at, and the
58
+ button is only there while there is more to show.
59
+
60
+ **Your own saved prompts no longer look unavailable.** In the selection menu they appeared greyed
61
+ out, under a dividing rule, from the first one you saved. A rule written when "Ask a question" was
62
+ the last item in the menu was landing on the last saved prompt instead. They now sit under a **Your
63
+ prompts** heading, in the same words the assistant panel uses for the same set, and read as the
64
+ most available thing in the menu rather than the least.
65
+
3
66
  ## 0.25.0
4
67
 
5
68
  **PR Review Buddy no longer guesses which `main` you meant.** A repository usually holds two
package/dist/main.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { B as BUILD_VERSION, Bt as AGENT_IDS, C as statedWorkspacePort, E as updateReview, F as startJob, G as forgeResolver, It as readAgentPreference, J as clearClaim, L as record, Lt as writeAgentPreference, Mt as displayRef, N as reanalyseReview, Nt as git, P as runJob, Pt as agentIdOf, Q as removeWorktree, R as recordTelemetryUploadConsent, Rt as CONFIG_PATH, Ut as detectAgents, V as PACKAGE_NAME, Vt as agentById, X as MANAGED_ROOT, Y as isClaimed, Z as readMarker, _t as recentWorkspaces, a as liveJobsFor, at as loadJob, b as MIN_WORKSPACE_PORT, bt as saveWorkspace, ct as groupByLineage, et as checkFreshness, f as ensureServer, ft as loadWorkspace, g as workspaceUrl, h as stopServer, it as isTerminal, j as recordKissRun, jt as resolveTarget, l as readIndexToken, m as reviewsUrl, mt as positionInLineage, nt as allJobs, o as wasBlocked, pt as matchingWorkspaceIds, r as deleteReview$1, s as runningJobs, st as followedRefName, t as relativeTime, tt as WORK_PHASES, u as bootstrapUrl, ut as lineageKeyFor, v as DEFAULT_WORKSPACE_PORT, w as writePortPreference, x as parseWorkspacePort, xt as summarise, y as MAX_WORKSPACE_PORT, yt as reviewedRepositories, z as telemetryUploadConsent, zt as STORE_ROOT } from "./relative_time-BeAMrdB1.js";
2
+ import { B as BUILD_VERSION, Bt as STORE_ROOT, C as statedWorkspacePort, E as updateReview, F as startJob, Ft as agentIdOf, G as forgeResolver, Ht as agentById, J as clearClaim, L as record, Lt as readAgentPreference, Mt as resolveTarget, N as reanalyseReview, Nt as displayRef, P as runJob, Pt as git, Q as removeWorktree, R as recordTelemetryUploadConsent, Rt as writeAgentPreference, St as summarise, V as PACKAGE_NAME, Vt as AGENT_IDS, Wt as detectAgents, X as MANAGED_ROOT, Y as isClaimed, Z as readMarker, a as liveJobsFor, b as MIN_WORKSPACE_PORT, bt as reviewedRepositories, ct as followedRefName, dt as lineageKeyFor, et as checkFreshness, f as ensureServer, g as workspaceUrl, h as stopServer, ht as positionInLineage, it as loadJob, j as recordKissRun, l as readIndexToken, lt as groupByLineage, m as reviewsUrl, mt as matchingWorkspaceIds, o as wasBlocked, pt as loadWorkspace, r as deleteReview$1, rt as isTerminal, s as runningJobs, st as progressSteps, t as relativeTime, tt as allJobs, u as bootstrapUrl, v as DEFAULT_WORKSPACE_PORT, vt as recentWorkspaces, w as writePortPreference, x as parseWorkspacePort, xt as saveWorkspace, y as MAX_WORKSPACE_PORT, z as telemetryUploadConsent, zt as CONFIG_PATH } from "./relative_time-DJ9iHDDG.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";
@@ -1546,39 +1546,6 @@ function describe(deps, id) {
1546
1546
  */
1547
1547
  var POLL_INTERVAL_MS = 500;
1548
1548
  /**
1549
- * Two forms per phase, because a finished step and a running one are different sentences.
1550
- *
1551
- * The page says these differently again (`job_view.ts`), and deliberately: it is describing a
1552
- * review to someone who arrived after the fact, while this is narrating one to someone watching it
1553
- * happen. Sharing the strings would force one of the two to read wrongly.
1554
- */
1555
- var PHASES = {
1556
- preparing: {
1557
- doing: "Preparing isolated checkout",
1558
- done: "Prepared isolated checkout"
1559
- },
1560
- context: {
1561
- doing: "Reading what changed",
1562
- done: "Read what changed"
1563
- },
1564
- conversation: {
1565
- doing: "Reading pull request conversation",
1566
- done: "Read pull request conversation"
1567
- },
1568
- analysing: {
1569
- doing: "Analysing the change",
1570
- done: "Analysed the change"
1571
- },
1572
- done: {
1573
- doing: "Finishing",
1574
- done: "Finished"
1575
- },
1576
- failed: {
1577
- doing: "Stopped",
1578
- done: "Stopped"
1579
- }
1580
- };
1581
- /**
1582
1549
  * Colour only where it means something, and never where it cannot be seen.
1583
1550
  *
1584
1551
  * `NO_COLOR` is honoured because this writes to stderr, which people redirect into files and CI
@@ -1606,58 +1573,26 @@ function header(target, colour) {
1606
1573
  * Completed phases stay visible because they are the part that says how far along this is. Their
1607
1574
  * detail does not: a note about a file read two phases ago is history, and history is what the
1608
1575
  * transcript was made of.
1576
+ *
1577
+ * Which phases there are, what they are called and what has become of each is `progressSteps`,
1578
+ * shared with the workspace page so the browser and this block never name one phase two things.
1579
+ * What is left here is how a terminal draws that: a mark, a colour, and an indent.
1609
1580
  */
1610
1581
  function phaseLines(job, colour) {
1611
1582
  const lines = [];
1612
- const failedAt = job.phase === "failed" ? job.failure?.phase : void 0;
1613
- for (const phase of WORK_PHASES) {
1614
- if (!applies(job, phase)) continue;
1615
- const complete = job.completed.includes(phase) || job.phase === "done";
1616
- const failed = failedAt === phase;
1617
- const current = !complete && !failed && job.phase === phase;
1618
- const mark = failed ? "✕" : complete ? "✓" : current ? "⟳" : " ";
1619
- const label = complete || failed ? PHASES[phase].done : PHASES[phase].doing;
1620
- const paint = failed ? RED : complete ? GREEN : "";
1621
- if (!complete && !current && !failed) {
1622
- lines.push(colour ? `${DIM} ${mark} ${label}${RESET}` : ` ${mark} ${label}`);
1583
+ for (const step of progressSteps(job)) {
1584
+ const mark = step.state === "failed" ? "✕" : step.state === "complete" ? "✓" : step.state === "active" ? "⟳" : " ";
1585
+ const paint = step.state === "failed" ? RED : step.state === "complete" ? GREEN : "";
1586
+ if (step.state === "pending") {
1587
+ lines.push(colour ? `${DIM} ${mark} ${step.label}${RESET}` : ` ${mark} ${step.label}`);
1623
1588
  continue;
1624
1589
  }
1625
- lines.push(colour && paint ? `${paint}${mark}${RESET} ${label}` : `${mark} ${label}`);
1626
- if (current && job.progress && !restates(job.progress, label)) lines.push(colour ? `${DIM} ${job.progress}${RESET}` : ` ${job.progress}`);
1590
+ lines.push(colour && paint ? `${paint}${mark}${RESET} ${step.label}` : `${mark} ${step.label}`);
1591
+ if (step.note) lines.push(colour ? `${DIM} ${step.note}${RESET}` : ` ${step.note}`);
1627
1592
  }
1628
1593
  return lines;
1629
1594
  }
1630
1595
  /**
1631
- * Whether a phase is part of *this* review, rather than part of the pipeline in general.
1632
- *
1633
- * Only `conversation` is ever optional, and reviewing a branch with no pull request is an ordinary
1634
- * supported thing to do rather than a degraded version of something else. Ticking "Read pull
1635
- * request conversation" on such a review claims a step that did not happen and makes a complete
1636
- * review look like an incomplete one; printing "No pull request found" instead is no better,
1637
- * because a line in a checklist reads as something missing whatever words are in it.
1638
- *
1639
- * So the rule is that an optional stage which did not apply is not rendered at all:
1640
- *
1641
- * - A pull request review always shows it. It is the point of that review, and it is known before
1642
- * the phase runs, so the line never appears late.
1643
- * - A branch review shows it only once a conversation was actually attached, which happens when the
1644
- * branch turns out to have a request on a forge we read. Real work, worth saying.
1645
- * - Everything else — no request, an unsupported host, `gh` missing — shows nothing.
1646
- *
1647
- * The absent cases are still explained, once, at the end: the closing summary says the review was
1648
- * made without the conversation and why. That is the right place for it, because by then it is a
1649
- * fact about the finished review rather than a gap in a list of things still happening.
1650
- */
1651
- function applies(job, phase) {
1652
- if (phase !== "conversation") return true;
1653
- return job.target.pullRequest !== void 0 || job.conversation?.kind === "attached";
1654
- }
1655
- /** Same words as the phase heading, give or take the articles and the trailing full stop. */
1656
- function restates(note, label) {
1657
- const bare = (text) => text.toLowerCase().replace(/\bthe\b/g, "").replace(/[^a-z]/g, "");
1658
- return bare(note) === bare(label);
1659
- }
1660
- /**
1661
1596
  * How many rows this block will actually occupy, which is not how many strings it is.
1662
1597
  *
1663
1598
  * The redraw moves the cursor up by a count and clears from there, so that count has to be in the
@@ -3869,6 +3869,112 @@ function pruneOldWorkspaces() {
3869
3869
  } catch {}
3870
3870
  }
3871
3871
  //#endregion
3872
+ //#region ../../packages/review-harness/src/workspace/job_progress.ts
3873
+ /**
3874
+ * The phases that do work, in the order they run. `done` and `failed` are outcomes, not work.
3875
+ *
3876
+ * Declared here rather than in `job_store.ts`, which is where it used to live, because this module
3877
+ * is imported by the browser bundle and that one opens files. Everything here is a string table
3878
+ * and a fold over a record; the store reads this rather than the other way round, so the client
3879
+ * can share the phase model without dragging `node:fs` in behind it. The type still comes from the
3880
+ * store, which is harmless: types are erased.
3881
+ */
3882
+ var WORK_PHASES = [
3883
+ "preparing",
3884
+ "context",
3885
+ "conversation",
3886
+ "analysing"
3887
+ ];
3888
+ /**
3889
+ * Two forms per phase, because a finished step and a running one are different sentences.
3890
+ *
3891
+ * `done` and `failed` are outcomes rather than work, so they never appear in a checklist; they
3892
+ * are named anyway because `JobPhase` includes them and a partial table would make every lookup
3893
+ * a possible undefined.
3894
+ */
3895
+ var PHASES = {
3896
+ preparing: {
3897
+ doing: "Preparing isolated checkout",
3898
+ done: "Prepared isolated checkout"
3899
+ },
3900
+ context: {
3901
+ doing: "Reading what changed",
3902
+ done: "Read what changed"
3903
+ },
3904
+ conversation: {
3905
+ doing: "Reading pull request conversation",
3906
+ done: "Read pull request conversation"
3907
+ },
3908
+ analysing: {
3909
+ doing: "Analysing the change",
3910
+ done: "Analysed the change"
3911
+ },
3912
+ done: {
3913
+ doing: "Finishing",
3914
+ done: "Finished"
3915
+ },
3916
+ failed: {
3917
+ doing: "Stopped",
3918
+ done: "Stopped"
3919
+ }
3920
+ };
3921
+ /**
3922
+ * Whether a phase is part of *this* review, rather than part of the pipeline in general.
3923
+ *
3924
+ * Only `conversation` is ever optional, and reviewing a branch with no pull request is an ordinary
3925
+ * supported thing to do rather than a degraded version of something else. Ticking "Read pull
3926
+ * request conversation" on such a review claims a step that did not happen and makes a complete
3927
+ * review look like an incomplete one; printing "No pull request found" instead is no better,
3928
+ * because a line in a checklist reads as something missing whatever words are in it.
3929
+ *
3930
+ * So the rule is that an optional stage which did not apply is not rendered at all:
3931
+ *
3932
+ * - A pull request review always shows it. It is the point of that review, and it is known before
3933
+ * the phase runs, so the line never appears late.
3934
+ * - A branch review shows it only once a conversation was actually attached, which happens when the
3935
+ * branch turns out to have a request on a forge we read. Real work, worth saying.
3936
+ * - Everything else — no request, an unsupported host, `gh` missing — shows nothing.
3937
+ *
3938
+ * The absent cases are still explained, once, at the end: the CLI's closing summary and the page's
3939
+ * `conversationNote` both say the review was made without the conversation and why. That is the
3940
+ * right place for it, because by then it is a fact about the finished review rather than a gap in
3941
+ * a list of things still happening.
3942
+ */
3943
+ function appliesTo(job, phase) {
3944
+ if (phase !== "conversation") return true;
3945
+ return job.target.pullRequest !== void 0 || job.conversation?.kind === "attached";
3946
+ }
3947
+ /**
3948
+ * Every step this review runs, in order, with what has become of each.
3949
+ *
3950
+ * Read from `job.completed` rather than inferred from the position of `job.phase` in the list.
3951
+ * The job records a phase as complete when it is *left*, so a run that died inside a phase leaves
3952
+ * it uncompleted — which is the honest shape of that, and the thing a retry resumes from. Working
3953
+ * it out from ordering instead would tick a step the job never finished.
3954
+ */
3955
+ function progressSteps(job) {
3956
+ const failedAt = job.phase === "failed" ? job.failure?.phase : void 0;
3957
+ return WORK_PHASES.filter((phase) => appliesTo(job, phase)).map((phase) => {
3958
+ const complete = job.completed.includes(phase) || job.phase === "done";
3959
+ const failed = failedAt === phase;
3960
+ const active = !complete && !failed && job.phase === phase;
3961
+ const state = failed ? "failed" : complete ? "complete" : active ? "active" : "pending";
3962
+ const label = complete ? PHASES[phase].done : PHASES[phase].doing;
3963
+ const note = active && job.progress && !restates(job.progress, label) ? job.progress : void 0;
3964
+ return {
3965
+ phase,
3966
+ label,
3967
+ state,
3968
+ ...note ? { note } : {}
3969
+ };
3970
+ });
3971
+ }
3972
+ /** Same words as the phase heading, give or take the articles and the trailing full stop. */
3973
+ function restates(note, label) {
3974
+ const bare = (text) => text.toLowerCase().replace(/\bthe\b/g, "").replace(/[^a-z]/g, "");
3975
+ return bare(note) === bare(label);
3976
+ }
3977
+ //#endregion
3872
3978
  //#region ../../packages/review-harness/src/workspace/job_store.ts
3873
3979
  /**
3874
3980
  * What a review is doing right now, kept apart from the review itself.
@@ -3878,14 +3984,14 @@ function pruneOldWorkspaces() {
3878
3984
  * process that rewrites reviews. And a job is finished business within hours while a review is
3879
3985
  * kept for thirty days, so one record with two lifetimes would have to encode both.
3880
3986
  */
3987
+ /**
3988
+ * The phases that do work, in the order they run. `done` and `failed` are outcomes, not work.
3989
+ *
3990
+ * Defined in `job_progress.ts` and re-exported here, where every existing caller already looks for
3991
+ * it. It lives there because the workspace page's client bundle needs the phase model and must not
3992
+ * import this module, which opens files.
3993
+ */
3881
3994
  var JOBS_DIR = join(STORE_ROOT, "jobs");
3882
- /** The phases that do work, in the order they run. `done` and `failed` are outcomes, not work. */
3883
- var WORK_PHASES = [
3884
- "preparing",
3885
- "context",
3886
- "conversation",
3887
- "analysing"
3888
- ];
3889
3995
  /**
3890
3996
  * Whether this job asks the forge for the conversation, or reads what is already on the workspace.
3891
3997
  *
@@ -10629,4 +10735,4 @@ function relativeTime(ms) {
10629
10735
  return `${days} day${days === 1 ? "" : "s"} ago`;
10630
10736
  }
10631
10737
  //#endregion
10632
- export { checkCodeFreshness as $, agentEnvOf as A, describeAuthorship as At, BUILD_VERSION as B, AGENT_IDS as Bt, statedWorkspacePort as C, doneVerb as Ct, refreshPrContext as D, questionsOutstanding as Dt, updateReview as E, issuesOutstanding as Et, startJob as F, clearAgentPreference as Ft, forgeResolver as G, AgentUnavailableError as Gt, feedbackUrl as H, agentFor as Ht, readEvents as I, readAgentPreference as It, clearClaim as J, fillFileUrlTemplate as K, record as L, writeAgentPreference as Lt, startKissJob as M, displayRef as Mt, reanalyseReview as N, git as Nt, isUnchanged as O, reviewerDispositions as Ot, runJob as P, agentIdOf as Pt, removeWorktree as Q, recordTelemetryUploadConsent as R, CONFIG_PATH as Rt, resolveWorkspacePort as S, touchWorkspace as St, RefreshUnavailableError as T, isQuestionOutstanding as Tt, withUsageRecorded as U, detectAgents as Ut, PACKAGE_NAME as V, agentById as Vt, EXPLAIN_SIMPLY_PROMPT as W, AgentCancelledError as Wt, MANAGED_ROOT as X, isClaimed as Y, readMarker as Z, writeServerRecord as _, recentWorkspaces as _t, liveJobsFor as a, loadJob as at, MIN_WORKSPACE_PORT as b, saveWorkspace as bt, discardJob as c, groupByLineage as ct, clearServerRecord as d, lineagePosition as dt, checkFreshness as et, ensureServer as f, loadWorkspace as ft, workspaceUrl as g, recentReviewGroups as gt, stopServer as h, previousKissResult as ht, lineageIds as i, isTerminal as it, recordKissRun as j, resolveTarget as jt, askCheckout as k, processDiscussion as kt, readIndexToken as l, latestKissRun as lt, reviewsUrl as m, positionInLineage as mt, deleteLineage as n, allJobs as nt, wasBlocked as o, saveJob as ot, readServerRecord as p, matchingWorkspaceIds as pt, ReviewBeingDeletedError as q, deleteReview as r, fail as rt, runningJobs as s, followedRefName as st, relativeTime as t, WORK_PHASES as tt, bootstrapUrl as u, lineageKeyFor as ut, DEFAULT_WORKSPACE_PORT as v, reviewedCommit as vt, writePortPreference as w, isIssueOutstanding as wt, parseWorkspacePort as x, summarise as xt, MAX_WORKSPACE_PORT as y, reviewedRepositories as yt, telemetryUploadConsent as z, STORE_ROOT as zt };
10738
+ export { checkCodeFreshness as $, agentEnvOf as A, processDiscussion as At, BUILD_VERSION as B, STORE_ROOT as Bt, statedWorkspacePort as C, touchWorkspace as Ct, refreshPrContext as D, issuesOutstanding as Dt, updateReview as E, isQuestionOutstanding as Et, startJob as F, agentIdOf as Ft, forgeResolver as G, AgentCancelledError as Gt, feedbackUrl as H, agentById as Ht, readEvents as I, clearAgentPreference as It, clearClaim as J, fillFileUrlTemplate as K, AgentUnavailableError as Kt, record as L, readAgentPreference as Lt, startKissJob as M, resolveTarget as Mt, reanalyseReview as N, displayRef as Nt, isUnchanged as O, questionsOutstanding as Ot, runJob as P, git as Pt, removeWorktree as Q, recordTelemetryUploadConsent as R, writeAgentPreference as Rt, resolveWorkspacePort as S, summarise as St, RefreshUnavailableError as T, isIssueOutstanding as Tt, withUsageRecorded as U, agentFor as Ut, PACKAGE_NAME as V, AGENT_IDS as Vt, EXPLAIN_SIMPLY_PROMPT as W, detectAgents as Wt, MANAGED_ROOT as X, isClaimed as Y, readMarker as Z, writeServerRecord as _, recentReviewGroups as _t, liveJobsFor as a, saveJob as at, MIN_WORKSPACE_PORT as b, reviewedRepositories as bt, discardJob as c, followedRefName as ct, clearServerRecord as d, lineageKeyFor as dt, checkFreshness as et, ensureServer as f, lineagePosition as ft, workspaceUrl as g, previousKissResult as gt, stopServer as h, positionInLineage as ht, lineageIds as i, loadJob as it, recordKissRun as j, describeAuthorship as jt, askCheckout as k, reviewerDispositions as kt, readIndexToken as l, groupByLineage as lt, reviewsUrl as m, matchingWorkspaceIds as mt, deleteLineage as n, fail as nt, wasBlocked as o, PHASES as ot, readServerRecord as p, loadWorkspace as pt, ReviewBeingDeletedError as q, deleteReview as r, isTerminal as rt, runningJobs as s, progressSteps as st, relativeTime as t, allJobs as tt, bootstrapUrl as u, latestKissRun as ut, DEFAULT_WORKSPACE_PORT as v, recentWorkspaces as vt, writePortPreference as w, doneVerb as wt, parseWorkspacePort as x, saveWorkspace as xt, MAX_WORKSPACE_PORT as y, reviewedCommit as yt, telemetryUploadConsent as z, CONFIG_PATH as zt };