@dev.fast/whiteboard 0.3.4-preview.20261019.126 → 0.3.4

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.
Files changed (115) hide show
  1. package/dist/{account-alias-B5-HYi1D.js → account-alias-CprZojXd.js} +8 -13
  2. package/dist/agent-cli-C6SPSII0.js +2 -0
  3. package/dist/{agent-cli-CohHf6Ua.js → agent-cli-CThN7Q59.js} +10 -15
  4. package/dist/{agent-client-Dtc-Kn_w.js → agent-client-BOOi7EUR.js} +3 -13
  5. package/dist/{authoring-tools-B7KU04f7.js → authoring-tools-BNwuMnz6.js} +27 -34
  6. package/dist/{background-server-C03RKxKS.js → background-server-CkvxA-6O.js} +5 -5
  7. package/dist/{background-server-CB9C4uoc.js → background-server-DLSDogkI.js} +1 -1
  8. package/dist/build-info.json +1 -1
  9. package/dist/{cli-CJaEb7zC.js → cli-R4yfa5DT.js} +1 -1
  10. package/dist/{cli-runner-DGDIqh3V.js → cli-runner-Cuc9FSzu.js} +26 -26
  11. package/dist/cli.js +3 -4
  12. package/dist/{client-lKVF_Elo.js → client-BN_FDxFr.js} +47 -253
  13. package/dist/{fuzzy-match-BmVJJm9I.js → fuzzy-match-BO9bK37N.js} +4 -6
  14. package/dist/{headless-host-DRtjf9WA.js → headless-host-CVBOQyRS.js} +1 -1
  15. package/dist/{headless-host-XhL1X4vX.js → headless-host-Cog6SpS9.js} +140 -513
  16. package/dist/{local-data-Cpl4ENbJ.js → local-data-D_9tvdsp.js} +323 -2419
  17. package/dist/{mcp-ovmiUE_x.js → mcp-D1hziANa.js} +9 -5
  18. package/dist/{package-paths-BWxO-UEL.js → package-paths-C--__jEv.js} +1 -1
  19. package/dist/profile-CYPmvBoA.js +2 -0
  20. package/dist/{profile-BadSkCkI.js → profile-DokFw782.js} +8 -20
  21. package/dist/{remote-attach-Dd-YobM6.js → remote-attach-CEJ-kvDY.js} +4 -4
  22. package/dist/{remote-extensions-CNXwqK0D.js → remote-extensions-Blcjr9Ze.js} +3 -3
  23. package/dist/{remote-extensions-VP-kfq0C.js → remote-extensions-GN8Gf_qG.js} +1 -1
  24. package/dist/{remote-language-server-BXk87KCr.js → remote-language-server-BTKBQ7x4.js} +5 -5
  25. package/dist/{remote-uninstall-DuOzsvaD.js → remote-uninstall-DW7Gdryh.js} +6 -6
  26. package/dist/{request-origin-B9qCPiVB.js → request-origin-Zcn_CjX4.js} +12 -45
  27. package/dist/{review-app-launcher-C7el2Uoy.js → review-app-launcher-CkwLclzR.js} +2 -2
  28. package/dist/{review-home-paths-D8AoCdd2.js → review-home-paths-j2BRAaNv.js} +17 -19
  29. package/dist/{review-telemetry-BsoRMC2w.js → review-telemetry-BLNwYnLV.js} +5 -5
  30. package/dist/runtime-CKiWhGrf.js +52 -0
  31. package/dist/runtime.d.ts +1 -1
  32. package/dist/runtime.js +1 -1
  33. package/dist/{s3-CsG2EWED.js → s3-DtJFWC0G.js} +1 -1
  34. package/dist/{s3-config-CjcLyFV5.js → s3-config-BTO12tCC.js} +2 -4
  35. package/dist/{s3-config-zz4GWh2T.js → s3-config-CSy3fx8H.js} +1 -1
  36. package/dist/server/desktop-host.js +76 -29
  37. package/dist/{server-discovery-CKjw3-6h.js → server-discovery-Bey8IqXH.js} +3 -3
  38. package/dist/sharing/index.d.ts +70 -484
  39. package/dist/sharing/index.js +1 -1
  40. package/dist/{src-WPaQn75m.js → src-BMPuxWv4.js} +73 -208
  41. package/dist/{src-BiWNbcF_.js → src-DsM3jO8G.js} +12 -89
  42. package/dist/{stored-document-migration-dFbewRTG.js → stored-document-migration-CChxtFAy.js} +269 -270
  43. package/dist/{thread-state-Do5LX10I.js → thread-state-5pYr6_zM.js} +2 -7
  44. package/dist/{tool-failure-DvI-gys2.js → tool-failure-C9MpbXJJ.js} +3 -10
  45. package/instructions/authoring.md +2 -3
  46. package/instructions/scratchpad.md +23 -0
  47. package/package.json +4 -4
  48. package/src/ask/agents.ts +1 -13
  49. package/src/ask/checkout-files.ts +5 -2
  50. package/src/ask/thread-state.ts +0 -4
  51. package/src/ask/thread.ts +0 -16
  52. package/src/ask/threads.ts +3 -24
  53. package/src/cli-install.ts +2 -13
  54. package/src/cli-runner.ts +1 -4
  55. package/src/cli.ts +1 -4
  56. package/src/diff-selection-migration.ts +34 -48
  57. package/src/lens-selection.ts +2 -38
  58. package/src/review-api/README.md +13 -52
  59. package/src/review-api/activity.ts +4 -1
  60. package/src/review-api/agent-cli.ts +1 -9
  61. package/src/review-api/anchor-quotes.ts +7 -14
  62. package/src/review-api/ask-history.ts +51 -137
  63. package/src/review-api/authoring-tools.ts +30 -45
  64. package/src/review-api/blocks/definition.ts +1 -1
  65. package/src/review-api/blocks/markdown.ts +2 -2
  66. package/src/review-api/document-headings.ts +27 -58
  67. package/src/review-api/document-text.ts +2 -31
  68. package/src/review-api/document.ts +34 -281
  69. package/src/review-api/github-provider.ts +13 -51
  70. package/src/review-api/http.ts +123 -702
  71. package/src/review-api/instructions.ts +19 -0
  72. package/src/review-api/local-data.ts +46 -310
  73. package/src/review-api/mcp.ts +11 -3
  74. package/src/review-api/onboarding.ts +1 -1
  75. package/src/review-api/profile.ts +6 -37
  76. package/src/review-api/public-tools.ts +2 -24
  77. package/src/review-api/pull-request.ts +49 -82
  78. package/src/review-api/request-origin.ts +0 -10
  79. package/src/review-api/review-progress.ts +27 -61
  80. package/src/review-api/store-schema.ts +29 -38
  81. package/src/review-api/store.ts +478 -2142
  82. package/src/review-api/worktree-events.ts +5 -3
  83. package/src/review-api/worktree-source.ts +7 -3
  84. package/src/review-api/worktree-structural.integration.ts +0 -72
  85. package/src/review-preferences.ts +88 -0
  86. package/src/review-stack.ts +23 -15
  87. package/src/runtime.ts +30 -4
  88. package/src/server/desktop-host.ts +1 -6
  89. package/src/server/desktop-server.ts +31 -1
  90. package/src/server/headless-host.ts +2 -0
  91. package/src/server/hono-http.ts +1 -2
  92. package/src/server/legacy-tutorial-cleanup.ts +3 -2
  93. package/src/server/review-gateway-list.ts +5 -3
  94. package/src/server/review-gateway-memory.ts +1 -1
  95. package/src/server/review-lifecycle-telemetry.ts +2 -2
  96. package/src/server/review-server-core.ts +5 -1
  97. package/src/server/structural-comparisons.ts +0 -47
  98. package/src/sharing/export.ts +7 -36
  99. package/src/sharing/host.ts +14 -34
  100. package/src/sharing/import.ts +24 -156
  101. package/src/sharing/repository.ts +20 -128
  102. package/src/startup-trace.ts +3 -3
  103. package/src/stored-document-migration.ts +19 -110
  104. package/src/ui-telemetry-events.ts +11 -33
  105. package/dist/agent-cli-_YyMIMRY.js +0 -2
  106. package/dist/lens-selection-CyJapcsl.js +0 -214
  107. package/dist/profile-DJvkBJNQ.js +0 -2
  108. package/dist/runtime-Bj2tD33R.js +0 -27
  109. package/src/heading-anchors.ts +0 -42
  110. package/src/review-api/board-order.ts +0 -144
  111. package/src/review-api/checkout-groups.ts +0 -560
  112. package/src/review-api/foreign-references.ts +0 -328
  113. package/src/review-api/link-preview.ts +0 -113
  114. package/src/review-api/scratchpad-plan-upgrade.ts +0 -250
  115. package/src/review-api/store-migrations.ts +0 -357
@@ -1,2 +1,2 @@
1
- import { a as sharedReviewId, c as verifyShareRepository, i as SharedReviewStore, l as exportShare, n as ShareClient, o as validateShareBundle } from "../client-lKVF_Elo.js";
1
+ import { a as sharedReviewId, c as verifyShareRepository, i as SharedReviewStore, l as exportShare, n as ShareClient, o as validateShareBundle } from "../client-BN_FDxFr.js";
2
2
  export { ShareClient, SharedReviewStore, exportShare, sharedReviewId, validateShareBundle, verifyShareRepository };
@@ -684,179 +684,22 @@ var import_lib = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMin(((export
684
684
  }
685
685
  module.exports = gitUrlParse;
686
686
  })))(), 1);
687
- /** A quick query: a ref, a config value, a status. */
688
- const QUICK_TIMEOUT_MS = 3e4;
689
- /** A read that grows with the repository or a file in it, or a jj call. */
690
- const LARGE_READ_TIMEOUT_MS = 3e5;
691
- /** Talking to a remote. */
692
- const NETWORK_TIMEOUT_MS = 6e5;
693
- const NETWORK_COMMANDS = /* @__PURE__ */ new Set([
694
- "fetch",
695
- "clone",
696
- "pull",
697
- "push"
698
- ]);
699
- const LARGE_READS = /* @__PURE__ */ new Set([
700
- "archive",
701
- "blame",
702
- "cat-file",
703
- "diff",
704
- "diff-tree",
705
- "format-patch",
706
- "grep",
707
- "log",
708
- "ls-files",
709
- "ls-tree",
710
- "rev-list",
711
- "show"
712
- ]);
713
- /** The subcommand, past git's global options and their values. */
714
- function subcommand(args) {
715
- for (let i = 0; i < args.length; i++) {
716
- const arg = args[i];
717
- if ([
718
- "-C",
719
- "-c",
720
- "--git-dir",
721
- "--work-tree",
722
- "-R"
723
- ].includes(arg)) i++;
724
- else if (!arg.startsWith("-")) return arg;
725
- }
726
- }
727
- /** How long a call may run when its caller doesn't say. */
728
- function defaultVcsTimeout(tool, args) {
729
- const command = subcommand(args);
730
- if (command && NETWORK_COMMANDS.has(command)) return NETWORK_TIMEOUT_MS;
731
- if (tool === "jj" || command && LARGE_READS.has(command)) return LARGE_READ_TIMEOUT_MS;
732
- return QUICK_TIMEOUT_MS;
733
- }
734
- const COMMIT_ID = /^(?:[a-f0-9]{40}|[a-f0-9]{64})$/;
735
- /** Thrown before anything runs when an operand could be misread. */
736
- var VcsOperandError = class extends Error {};
737
- function refused(kind, value) {
738
- throw new VcsOperandError(`Refusing ${kind} ${JSON.stringify(value)}.`);
739
- }
740
- /** Whether a value could be read as an option, or carries a control
741
- * character or a line break. */
742
- const unsafe = (value) => !value || value.startsWith("-") || /[\0-\x1f\x7f]/.test(value);
743
- const unsafeRef = (value) => unsafe(value) || /[\s:~^?*[\\]|\.\.|@\{/.test(value);
744
- function checkRefSide(value) {
745
- if (!COMMIT_ID.test(value) && unsafeRef(value)) refused("ref", value);
746
- }
747
- /** Operands are objects; flags written in the code are strings. */
748
- const isOperand = (arg) => Object(arg) === arg;
749
- /** The arguments as the process gets them: operands checked, so none can
750
- * be read as an option, and paths after `--`. (`--end-of-options` would say
751
- * the same to git, but older gits refuse it in some commands.) */
752
- function renderVcsArgs(args) {
753
- const out = [];
754
- let paths = false;
755
- for (const arg of args) {
756
- if (!isOperand(arg)) {
757
- if (arg === "--") paths = true;
758
- out.push(arg);
759
- continue;
760
- }
761
- if ("path" in arg) {
762
- if (!arg.path || /\0/.test(arg.path)) refused("path", arg.path);
763
- if (!paths) {
764
- out.push("--");
765
- paths = true;
766
- }
767
- out.push(arg.path);
768
- continue;
769
- }
770
- let rendered;
771
- if ("commit" in arg) {
772
- if (!COMMIT_ID.test(arg.commit)) refused("commit", arg.commit);
773
- rendered = arg.commit;
774
- } else if ("rev" in arg) {
775
- if (unsafe(arg.rev)) refused("revision", arg.rev);
776
- rendered = arg.rev;
777
- } else if ("ref" in arg) {
778
- if (unsafeRef(arg.ref)) refused("ref", arg.ref);
779
- rendered = arg.ref;
780
- } else if ("refspec" in arg) {
781
- checkRefSide(arg.refspec.from);
782
- checkRefSide(arg.refspec.to);
783
- rendered = `${arg.refspec.force ? "+" : ""}${arg.refspec.from}:${arg.refspec.to}`;
784
- } else if ("remote" in arg) {
785
- if (unsafe(arg.remote) || /\s/.test(arg.remote)) refused("remote", arg.remote);
786
- rendered = arg.remote;
787
- } else {
788
- if (unsafe(arg.value)) refused("value", arg.value);
789
- rendered = arg.value;
790
- }
791
- out.push(rendered);
792
- }
793
- return out;
794
- }
795
- const LOCAL_GIT_ENV_KEYS = [
796
- "GIT_ALTERNATE_OBJECT_DIRECTORIES",
797
- "GIT_COMMON_DIR",
798
- "GIT_CONFIG",
799
- "GIT_CONFIG_COUNT",
800
- "GIT_CONFIG_PARAMETERS",
801
- "GIT_DIR",
802
- "GIT_GRAFT_FILE",
803
- "GIT_IMPLICIT_WORK_TREE",
804
- "GIT_INDEX_FILE",
805
- "GIT_INTERNAL_SUPER_PREFIX",
806
- "GIT_NO_REPLACE_OBJECTS",
807
- "GIT_OBJECT_DIRECTORY",
808
- "GIT_PREFIX",
809
- "GIT_QUARANTINE_PATH",
810
- "GIT_REPLACE_REF_BASE",
811
- "GIT_SHALLOW_FILE",
812
- "GIT_WORK_TREE"
813
- ];
814
- /** The process environment without the variables that would redirect git
815
- * to another repository's objects, index or work tree. */
816
- function localGitEnvironment() {
817
- const env = { ...process.env };
818
- for (const key of LOCAL_GIT_ENV_KEYS) delete env[key];
819
- return env;
820
- }
821
- /** The environment a version-control process runs with. A git call that
822
- * names its repository (`-C`, `--git-dir`) and brings no environment of its
823
- * own drops the variables that would redirect it to another. */
824
- function vcsEnvironment(tool, args, env) {
825
- const next = { ...env ?? (tool === "git" && (args[0] === "-C" || args[0] === "--git-dir") ? localGitEnvironment() : process.env) };
826
- if (!args.some((arg) => [
827
- "fetch",
828
- "clone",
829
- "pull",
830
- "push"
831
- ].includes(arg))) next.GIT_NO_LAZY_FETCH = "1";
832
- next.GIT_TERMINAL_PROMPT = "0";
833
- next.GH_PROMPT_DISABLED = "1";
834
- return next;
835
- }
836
687
  let observer = null;
837
688
  function setLocalVcsCommandObserver(next) {
838
689
  observer = next;
839
690
  }
840
691
  const execFilePromise = promisify(execFile);
841
- async function runVcs(tool, vcsArgs, { input, ...options } = {}) {
842
- const args = renderVcsArgs(vcsArgs);
692
+ async function execFileAsync(file, args, options = {}) {
843
693
  const finish = observer?.start({
844
- tool,
694
+ file,
845
695
  args,
846
696
  cwd: options.cwd === void 0 ? void 0 : String(options.cwd)
847
697
  });
848
698
  try {
849
- const running = execFilePromise(tool, args, {
699
+ const result = await execFilePromise(file, args, {
850
700
  ...options,
851
- env: vcsEnvironment(tool, args, options.env),
852
- timeout: options.timeout ?? defaultVcsTimeout(tool, args),
853
701
  encoding: options.encoding ?? "utf8"
854
702
  });
855
- if (input !== void 0) {
856
- running.child.stdin?.on("error", () => {});
857
- running.child.stdin?.end(input);
858
- }
859
- const result = await running;
860
703
  finish?.({ ok: true });
861
704
  return {
862
705
  stdout: String(result.stdout),
@@ -867,19 +710,14 @@ async function runVcs(tool, vcsArgs, { input, ...options } = {}) {
867
710
  throw error;
868
711
  }
869
712
  }
870
- function runVcsSync(tool, vcsArgs, options) {
871
- const args = renderVcsArgs(vcsArgs);
713
+ function execFileSyncObserved(file, args, options) {
872
714
  const finish = observer?.start({
873
- tool,
715
+ file,
874
716
  args,
875
717
  cwd: options.cwd === void 0 ? void 0 : String(options.cwd)
876
718
  });
877
719
  try {
878
- const output = execFileSync(tool, args, {
879
- ...options,
880
- env: vcsEnvironment(tool, args, options.env),
881
- timeout: options.timeout ?? defaultVcsTimeout(tool, args)
882
- });
720
+ const output = execFileSync(file, args, options);
883
721
  finish?.({ ok: true });
884
722
  return String(output);
885
723
  } catch (error) {
@@ -888,18 +726,14 @@ function runVcsSync(tool, vcsArgs, options) {
888
726
  }
889
727
  }
890
728
  /** Long-lived child; the observer sees one spawn, completed once the process is up. */
891
- function spawnObserved(tool, vcsArgs, options) {
892
- const args = renderVcsArgs(vcsArgs);
729
+ function spawnObserved(file, args, options) {
893
730
  const finish = observer?.start({
894
- tool,
731
+ file,
895
732
  args,
896
733
  cwd: options.cwd === void 0 ? void 0 : String(options.cwd)
897
734
  });
898
735
  try {
899
- const child = spawn(tool, args, {
900
- ...options,
901
- env: vcsEnvironment(tool, args, options.env)
902
- });
736
+ const child = spawn(file, args, options);
903
737
  let finished = false;
904
738
  const complete = (ok) => {
905
739
  if (finished) return;
@@ -1179,6 +1013,25 @@ function normalizeEntry(entry) {
1179
1013
  }
1180
1014
  //#endregion
1181
1015
  //#region ../local-vcs/src/vcs.ts
1016
+ const LOCAL_GIT_ENV_KEYS = [
1017
+ "GIT_ALTERNATE_OBJECT_DIRECTORIES",
1018
+ "GIT_COMMON_DIR",
1019
+ "GIT_CONFIG",
1020
+ "GIT_CONFIG_COUNT",
1021
+ "GIT_CONFIG_PARAMETERS",
1022
+ "GIT_DIR",
1023
+ "GIT_GRAFT_FILE",
1024
+ "GIT_IMPLICIT_WORK_TREE",
1025
+ "GIT_INDEX_FILE",
1026
+ "GIT_INTERNAL_SUPER_PREFIX",
1027
+ "GIT_NO_REPLACE_OBJECTS",
1028
+ "GIT_OBJECT_DIRECTORY",
1029
+ "GIT_PREFIX",
1030
+ "GIT_QUARANTINE_PATH",
1031
+ "GIT_REPLACE_REF_BASE",
1032
+ "GIT_SHALLOW_FILE",
1033
+ "GIT_WORK_TREE"
1034
+ ];
1182
1035
  /** Neither git nor jj could be started, so no folder can be recognized as a repository. */
1183
1036
  var LocalVcsToolsMissingError = class extends Error {
1184
1037
  constructor() {
@@ -1335,7 +1188,7 @@ async function gitArgs(rootPath, args) {
1335
1188
  /** Run git against the repo's shared git dir, optionally tolerating failure. */
1336
1189
  async function git(rootPath, args, options = {}) {
1337
1190
  try {
1338
- const { stdout, stderr } = await runVcs("git", await gitArgs(rootPath, args), {
1191
+ const { stdout, stderr } = await execFileAsync("git", await gitArgs(rootPath, args), {
1339
1192
  maxBuffer: 67108864,
1340
1193
  signal: options.signal
1341
1194
  });
@@ -1363,7 +1216,7 @@ async function git(rootPath, args, options = {}) {
1363
1216
  */
1364
1217
  async function gitAt(cwd, args, options = {}) {
1365
1218
  try {
1366
- const { stdout, stderr } = await runVcs("git", [
1219
+ const { stdout, stderr } = await execFileAsync("git", [
1367
1220
  "-C",
1368
1221
  cwd,
1369
1222
  ...args
@@ -1449,10 +1302,10 @@ function createLocalVcs(kind, rootPath) {
1449
1302
  async function jjRevisionIsConflicted(rootPath, revision) {
1450
1303
  if ((await detectLocalVcs(rootPath))?.kind !== "jj") return null;
1451
1304
  try {
1452
- const { stdout } = await runVcs("jj", [
1305
+ const { stdout } = await execFileAsync("jj", [
1453
1306
  "log",
1454
1307
  "-r",
1455
- { rev: revision },
1308
+ revision,
1456
1309
  "--no-graph",
1457
1310
  "-T",
1458
1311
  "if(conflict, \"true\", \"false\")",
@@ -1511,7 +1364,7 @@ async function listTrackedFilesAtCommit(input) {
1511
1364
  "list",
1512
1365
  "--ignore-working-copy",
1513
1366
  "-r",
1514
- { rev: input.commit }
1367
+ input.commit
1515
1368
  ], { cwd: input.rootPath }).catch(() => null);
1516
1369
  if (output !== null) return splitLines(output);
1517
1370
  if (!await canUseGitFallback(input.rootPath, input.kind)) return [];
@@ -1523,7 +1376,7 @@ async function listTrackedFilesAtCommit(input) {
1523
1376
  "-r",
1524
1377
  "-z",
1525
1378
  "--name-only",
1526
- { rev: input.commit }
1379
+ input.commit
1527
1380
  ], { cwd: input.rootPath }).catch(() => null);
1528
1381
  return output === null ? [] : output.split("\0").filter(Boolean);
1529
1382
  }
@@ -1548,7 +1401,7 @@ function listTrackedFilesForKind(input) {
1548
1401
  "-r",
1549
1402
  "-z",
1550
1403
  "--name-only",
1551
- { rev: input.ref }
1404
+ input.ref
1552
1405
  ], { cwd: input.rootPath }) : commandOutputSync("git", [
1553
1406
  "-C",
1554
1407
  input.rootPath,
@@ -1589,7 +1442,7 @@ async function readJjFileAtCommit(input) {
1589
1442
  "file",
1590
1443
  "show",
1591
1444
  "-r",
1592
- { rev: input.commit },
1445
+ input.commit,
1593
1446
  "--ignore-working-copy",
1594
1447
  "--",
1595
1448
  toJjRootFilePattern(input.relativePath)
@@ -1665,7 +1518,7 @@ async function withWorkingTreeIndex(input, read) {
1665
1518
  env.GIT_WORK_TREE = input.rootPath;
1666
1519
  }
1667
1520
  await fs.promises.mkdir(path.join(scratch, "objects"));
1668
- const git = (args) => runVcs("git", [
1521
+ const git = (args) => execFileAsync("git", [
1669
1522
  "-c",
1670
1523
  "core.splitIndex=false",
1671
1524
  "-C",
@@ -1677,7 +1530,7 @@ async function withWorkingTreeIndex(input, read) {
1677
1530
  maxBuffer: 33554432
1678
1531
  });
1679
1532
  if (input.kind === "git") {
1680
- const index = (await runVcs("git", [
1533
+ const index = (await execFileAsync("git", [
1681
1534
  "-C",
1682
1535
  input.rootPath,
1683
1536
  "rev-parse",
@@ -1747,7 +1600,7 @@ async function listCommitRange(input) {
1747
1600
  const vcs = await knownOrDetectedVcs(input.rootPath, input.kind);
1748
1601
  if (!vcs) throw new Error(`No Git or jj repository found for ${input.rootPath}.`);
1749
1602
  try {
1750
- const { stdout } = await runVcs("git", [
1603
+ const { stdout } = await execFileAsync("git", [
1751
1604
  "-C",
1752
1605
  vcs.rootPath,
1753
1606
  "log",
@@ -1755,7 +1608,7 @@ async function listCommitRange(input) {
1755
1608
  "--format=%H%x00%P%x00%an%x00%aI%x00%s%x00",
1756
1609
  "--numstat",
1757
1610
  "-z",
1758
- { rev: `${input.baseRef}..${input.headRef}` }
1611
+ `${input.baseRef}..${input.headRef}`
1759
1612
  ], {
1760
1613
  cwd: vcs.rootPath,
1761
1614
  maxBuffer: 26214400
@@ -1815,7 +1668,7 @@ async function readJjCommitRange(rootPath, baseRef, headRef) {
1815
1668
  "log",
1816
1669
  "--no-graph",
1817
1670
  "-r",
1818
- { rev: `::${headRef} ~ ::${baseRef}` },
1671
+ `::${headRef} ~ ::${baseRef}`,
1819
1672
  "-T",
1820
1673
  "commit_id ++ \"\\0\" ++ parents.map(|p| p.commit_id()).join(\" \") ++ \"\\0\" ++ author.name() ++ \"\\0\" ++ author.timestamp().format(\"%+\") ++ \"\\0\" ++ description.first_line() ++ \"\\0\"",
1821
1674
  "--ignore-working-copy"
@@ -1988,7 +1841,7 @@ function toNameStatusEntries(summary) {
1988
1841
  }))].sort((left, right) => left.path.localeCompare(right.path));
1989
1842
  }
1990
1843
  async function readGitDiffNameStatus(input) {
1991
- const refRange = input.mergeBase === false ? [{ rev: input.baseRef }, { rev: input.headRef }] : [{ rev: `${input.baseRef}...${input.headRef}` }];
1844
+ const refRange = input.mergeBase === false ? [input.baseRef, input.headRef] : [`${input.baseRef}...${input.headRef}`];
1992
1845
  return parseGitDiffNameStatus(await commandOutput("git", [
1993
1846
  "-C",
1994
1847
  input.rootPath,
@@ -2009,9 +1862,9 @@ async function readJjDiffNameStatus(input) {
2009
1862
  "diff",
2010
1863
  "--summary",
2011
1864
  "--from",
2012
- { rev: input.baseRef },
1865
+ input.baseRef,
2013
1866
  "--to",
2014
- { rev: input.headRef },
1867
+ input.headRef,
2015
1868
  "--ignore-working-copy"
2016
1869
  ], {
2017
1870
  cwd: input.rootPath,
@@ -2053,7 +1906,7 @@ async function resolveGitRevisionCommit(rootPath, revision) {
2053
1906
  rootPath,
2054
1907
  "rev-parse",
2055
1908
  "--verify",
2056
- { rev: `${revision}^{commit}` }
1909
+ `${revision}^{commit}`
2057
1910
  ]);
2058
1911
  }
2059
1912
  function resolveGitRevisionCommitSync(rootPath, revision) {
@@ -2062,7 +1915,7 @@ function resolveGitRevisionCommitSync(rootPath, revision) {
2062
1915
  rootPath,
2063
1916
  "rev-parse",
2064
1917
  "--verify",
2065
- { rev: `${revision}^{commit}` }
1918
+ `${revision}^{commit}`
2066
1919
  ]);
2067
1920
  }
2068
1921
  async function resolveJjRevisionCommit(rootPath, revision) {
@@ -2072,7 +1925,7 @@ async function resolveJjRevisionCommit(rootPath, revision) {
2072
1925
  "log",
2073
1926
  "--no-graph",
2074
1927
  "-r",
2075
- { rev: revision },
1928
+ revision,
2076
1929
  "-T",
2077
1930
  "commit_id ++ \"\\n\"",
2078
1931
  "--ignore-working-copy"
@@ -2085,7 +1938,7 @@ function resolveJjRevisionCommitSync(rootPath, revision) {
2085
1938
  "log",
2086
1939
  "--no-graph",
2087
1940
  "-r",
2088
- { rev: revision },
1941
+ revision,
2089
1942
  "-T",
2090
1943
  "commit_id ++ \"\\n\"",
2091
1944
  "--ignore-working-copy"
@@ -2102,8 +1955,8 @@ async function resolveGitMergeBase(rootPath, baseRef, headRef) {
2102
1955
  "-C",
2103
1956
  rootPath,
2104
1957
  "merge-base",
2105
- { rev: baseRef },
2106
- { rev: headRef }
1958
+ baseRef,
1959
+ headRef
2107
1960
  ]);
2108
1961
  }
2109
1962
  async function resolveJjMergeBase(rootPath, baseRef, headRef) {
@@ -2113,7 +1966,7 @@ async function resolveJjMergeBase(rootPath, baseRef, headRef) {
2113
1966
  "log",
2114
1967
  "--no-graph",
2115
1968
  "-r",
2116
- { rev: `heads(::${baseRef} & ::${headRef})` },
1969
+ `heads(::${baseRef} & ::${headRef})`,
2117
1970
  "-T",
2118
1971
  "commit_id ++ \"\n\"",
2119
1972
  "--ignore-working-copy"
@@ -2126,7 +1979,7 @@ function readGitFileAtRevisionSync(input) {
2126
1979
  "-C",
2127
1980
  input.rootPath,
2128
1981
  "show",
2129
- { rev: `${commit}:${input.relativePath}` }
1982
+ `${commit}:${input.relativePath}`
2130
1983
  ], {
2131
1984
  maxBuffer: 10485760,
2132
1985
  trim: false
@@ -2145,7 +1998,7 @@ function readJjFileAtRevisionSync(input) {
2145
1998
  "file",
2146
1999
  "show",
2147
2000
  "-r",
2148
- { rev: input.ref },
2001
+ input.ref,
2149
2002
  "--ignore-working-copy",
2150
2003
  "--",
2151
2004
  toJjRootFilePattern(input.relativePath)
@@ -2161,8 +2014,8 @@ function readJjFileAtRevisionSync(input) {
2161
2014
  }
2162
2015
  async function readGitDiff(input) {
2163
2016
  const paths = input.literalPaths ? input.paths ?? [] : normalizeDiffPaths(input.paths);
2164
- const diffRefs = input.headRef ? input.mergeBase === false ? [{ rev: input.baseRef }, { rev: input.headRef }] : [{ rev: `${input.baseRef}...${input.headRef}` }] : [{ rev: input.baseRef }];
2165
- const { stdout } = await runVcs("git", [
2017
+ const diffRefs = input.headRef ? input.mergeBase === false ? [input.baseRef, input.headRef] : [`${input.baseRef}...${input.headRef}`] : [input.baseRef];
2018
+ const { stdout } = await execFileAsync("git", [
2166
2019
  ...input.literalPaths ? ["--literal-pathspecs"] : [],
2167
2020
  "-C",
2168
2021
  input.rootPath,
@@ -2185,8 +2038,8 @@ async function readGitDiff(input) {
2185
2038
  }
2186
2039
  async function readGitDiffFileSummaries(input) {
2187
2040
  const paths = normalizeDiffPaths(input.paths);
2188
- const diffRefs = input.headRef ? input.mergeBase === false ? [{ rev: input.baseRef }, { rev: input.headRef }] : [{ rev: `${input.baseRef}...${input.headRef}` }] : [{ rev: input.baseRef }];
2189
- const { stdout } = await runVcs("git", [
2041
+ const diffRefs = input.headRef ? input.mergeBase === false ? [input.baseRef, input.headRef] : [`${input.baseRef}...${input.headRef}`] : [input.baseRef];
2042
+ const { stdout } = await execFileAsync("git", [
2190
2043
  "-C",
2191
2044
  input.rootPath,
2192
2045
  "diff",
@@ -2209,7 +2062,7 @@ async function readGitDiffFileSummaries(input) {
2209
2062
  }
2210
2063
  async function readJjDiff(input) {
2211
2064
  const paths = input.literalPaths ? input.paths ?? [] : normalizeDiffPaths(input.paths);
2212
- const { stdout } = await runVcs("jj", [
2065
+ const { stdout } = await execFileAsync("jj", [
2213
2066
  "-R",
2214
2067
  input.rootPath,
2215
2068
  "--color",
@@ -2441,16 +2294,18 @@ function commandOutputSync(command, args, options = {}) {
2441
2294
  return runCommandOutputSync(command, args, options);
2442
2295
  }
2443
2296
  function runCommandOutput(command, args, options) {
2444
- return runVcs(command, args, {
2297
+ return execFileAsync(command, args, {
2445
2298
  cwd: options.cwd,
2299
+ env: commandEnvironment(command, args),
2446
2300
  maxBuffer: options.maxBuffer
2447
2301
  }).then(({ stdout }) => options.trim === false ? stdout : stdout.trim());
2448
2302
  }
2449
2303
  function runCommandOutputSync(command, args, options) {
2450
2304
  try {
2451
- const output = runVcsSync(command, args, {
2305
+ const output = execFileSyncObserved(command, args, {
2452
2306
  cwd: options.cwd,
2453
2307
  encoding: "utf8",
2308
+ env: commandEnvironment(command, args),
2454
2309
  maxBuffer: options.maxBuffer,
2455
2310
  stdio: [
2456
2311
  "ignore",
@@ -2463,6 +2318,16 @@ function runCommandOutputSync(command, args, options) {
2463
2318
  return null;
2464
2319
  }
2465
2320
  }
2321
+ function commandEnvironment(command, args) {
2322
+ if (command !== "git" || args[0] !== "-C" && args[0] !== "--git-dir") return;
2323
+ return localGitEnvironment();
2324
+ }
2325
+ /** Drop per-repository git env vars that would redirect an explicit object store. */
2326
+ function localGitEnvironment() {
2327
+ const env = { ...process.env };
2328
+ for (const key of LOCAL_GIT_ENV_KEYS) delete env[key];
2329
+ return env;
2330
+ }
2466
2331
  //#endregion
2467
2332
  //#region ../../node_modules/graceful-fs/polyfills.js
2468
2333
  var require_polyfills = /* @__PURE__ */ __commonJSMin(((exports, module) => {
@@ -3813,4 +3678,4 @@ var require_adapter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
3813
3678
  module.exports.checkSync = checkSync;
3814
3679
  })))();
3815
3680
  //#endregion
3816
- export { __require as A, resolveRevision as C, runVcsSync as D, runVcs as E, setLocalVcsCommandObserver as O, resolveRepoContextSync as S, renderVcsArgs as T, listTrackedFilesAtCommit as _, diff as a, readFileAtCommit as b, diffFileSummariesWorkingTree as c, git as d, gitAt as f, listCommitRange as g, jjRevisionIsConflicted as h, detectLocalVcs as i, __toESM as j, __commonJSMin as k, diffTrees as l, gitCommonDirSync as m, createBlobBatchReader as n, diffFileSummaries as o, gitCommonDir as p, defaultBranch as r, diffFileSummariesTrees as s, LocalVcsToolsMissingError as t, diffWorkingTree as u, parseGitRemote as v, splitGitPatchFiles as w, resolveRepoContext as x, parseGitRemoteSlug as y };
3681
+ export { setLocalVcsCommandObserver as C, __toESM as E, splitGitPatchFiles as S, __require as T, parseGitRemote as _, diff as a, resolveRepoContextSync as b, diffFileSummariesWorkingTree as c, git as d, gitAt as f, listTrackedFilesAtCommit as g, listCommitRange as h, detectLocalVcs as i, diffTrees as l, jjRevisionIsConflicted as m, createBlobBatchReader as n, diffFileSummaries as o, gitCommonDir as p, defaultBranch as r, diffFileSummariesTrees as s, LocalVcsToolsMissingError as t, diffWorkingTree as u, readFileAtCommit as v, __commonJSMin as w, resolveRevision as x, resolveRepoContext as y };
@@ -177,12 +177,6 @@ z.union([StructuralDiffEventSchema, ReviewStructuralDiffErrorSchema]);
177
177
  const REVIEW_CLIENT_HEADER = "x-review-client";
178
178
  const REVIEW_CLIENT_REMOTE = "remote";
179
179
  const REVIEW_HOST_HEADER = "x-review-host";
180
- const PULL_REQUEST_STATES = [
181
- "open",
182
- "draft",
183
- "merged",
184
- "closed"
185
- ];
186
180
  const requiredString$1 = z.string({ error: "must be a string" }).refine((value) => value.trim().length > 0, "must be a string");
187
181
  const stringAllowEmpty = z.string({ error: "must be a string" });
188
182
  const positiveInteger = z.number({ error: "must be a positive integer" }).int("must be a positive integer").positive("must be a positive integer");
@@ -411,38 +405,9 @@ const ReviewStackLayerSchema = z.strictObject({
411
405
  "earlier",
412
406
  "current",
413
407
  "later"
414
- ]),
415
- /** The layer's PR state, as last read from GitHub. */
416
- pullRequestState: z.enum(PULL_REQUEST_STATES).optional()
417
- });
418
- z.strictObject({
419
- /** Bottom first. */
420
- layers: z.array(ReviewStackLayerSchema),
421
- /** The branch the stack sits on, as `main`. */
422
- base: requiredString$1.optional()
423
- });
424
- const ReviewPlaceBoardSchema = z.strictObject({
425
- reviewId: requiredString$1,
426
- title: stringAllowEmpty,
427
- icon: z.enum(["board", "code"])
428
- });
429
- const ReviewPlaceSiblingSchema = ReviewPlaceBoardSchema.extend({
430
- pullRequestNumber: positiveInteger.optional(),
431
- pullRequestState: z.enum(PULL_REQUEST_STATES).optional()
432
- });
433
- z.strictObject({
434
- /** The board's PR state and branches, as last read from GitHub. */
435
- pullRequestState: z.enum(PULL_REQUEST_STATES).optional(),
436
- baseBranch: requiredString$1.optional(),
437
- headBranch: requiredString$1.optional(),
438
- /** The board itself. */
439
- board: ReviewPlaceBoardSchema.optional(),
440
- parent: ReviewPlaceBoardSchema.optional(),
441
- /** Empty for a top-level board. */
442
- siblings: z.array(ReviewPlaceSiblingSchema),
443
- /** A top-level board's children in sibling order; absent for a child. */
444
- children: z.array(ReviewPlaceSiblingSchema).optional()
408
+ ])
445
409
  });
410
+ z.strictObject({ layers: z.array(ReviewStackLayerSchema) });
446
411
  const ReviewCliInstallTargetSchema = z.enum([
447
412
  "claude",
448
413
  "codex",
@@ -708,7 +673,13 @@ const revealArgsSchema = z.strictObject({
708
673
  path: ["endLine"]
709
674
  });
710
675
  });
711
- const apiReviewIdSchema = z.union([z.uuid(), z.string().regex(/^shared-[a-f0-9]{64}$/)]);
676
+ /** The one scratchpad's fixed review id. */
677
+ const SCRATCHPAD_REVIEW_ID = "scratchpad";
678
+ const apiReviewIdSchema = z.union([
679
+ z.uuid(),
680
+ z.string().regex(/^shared-[a-f0-9]{64}$/),
681
+ z.literal(SCRATCHPAD_REVIEW_ID)
682
+ ]);
712
683
  const ReviewVerbRequestSchema = z.discriminatedUnion("name", [
713
684
  z.strictObject({
714
685
  name: z.literal("authoringCapabilities"),
@@ -756,9 +727,7 @@ const ReviewVerbRequestSchema = z.discriminatedUnion("name", [
756
727
  name: z.literal("openReview"),
757
728
  args: z.strictObject({
758
729
  reviewUuid: apiReviewIdSchema,
759
- active: z.boolean(),
760
- /** Block to scroll to after opening. */
761
- blockId: requiredString$1.optional()
730
+ active: z.boolean()
762
731
  })
763
732
  }),
764
733
  z.strictObject({
@@ -828,38 +797,7 @@ z.discriminatedUnion("event", [
828
797
  }),
829
798
  z.strictObject({
830
799
  event: z.literal("showReviewView"),
831
- view: reviewViewSchema,
832
- /** The board to switch, from its sidebar; else the one asking. */
833
- reviewId: requiredString$1.optional()
834
- }),
835
- z.strictObject({
836
- event: z.literal("revealBlock"),
837
- reviewId: requiredString$1,
838
- blockId: requiredString$1
839
- }),
840
- z.strictObject({
841
- event: z.literal("selectLens"),
842
- reviewId: requiredString$1,
843
- lensId: requiredString$1.nullable()
844
- }),
845
- z.strictObject({
846
- event: z.literal("markLens"),
847
- reviewId: requiredString$1,
848
- lensId: requiredString$1
849
- }),
850
- z.strictObject({
851
- event: z.literal("pickCommit"),
852
- reviewId: requiredString$1,
853
- commit: requiredString$1.nullable()
854
- }),
855
- z.strictObject({
856
- event: z.literal("openAskThread"),
857
- reviewId: requiredString$1,
858
- threadId: requiredString$1
859
- }),
860
- z.strictObject({
861
- event: z.literal("toggleAskColumn"),
862
- reviewId: requiredString$1
800
+ view: reviewViewSchema
863
801
  })
864
802
  ]);
865
803
  z.discriminatedUnion("ok", [z.strictObject({
@@ -1067,21 +1005,6 @@ function parseReviewBugReportResponse(value) {
1067
1005
  return ReviewBugReportResponseSchema.parse(value);
1068
1006
  }
1069
1007
  //#endregion
1070
- //#region ../review-protocol/src/board-icons.ts
1071
- /** A board has code attached when its target is commits, a PR or a working
1072
- * tree, even one with nothing to compare. A plan's target is its project. */
1073
- const boardIconKind = (target) => target && target.kind !== "project" ? "code" : "board";
1074
- /** What a board with no title is called wherever its title shows. */
1075
- const UNTITLED_BOARD = "Untitled";
1076
- /**
1077
- * A board's title as every surface shows it. A person's new board keeps an
1078
- * empty title until they name it; it reads "Untitled" everywhere. A title
1079
- * someone typed, "Untitled" included, shows as typed.
1080
- */
1081
- function boardTitle(title) {
1082
- return title?.trim() ? title : UNTITLED_BOARD;
1083
- }
1084
- //#endregion
1085
1008
  //#region ../review-protocol/src/index.ts
1086
1009
  function parseReviewDesktopDiscovery(value) {
1087
1010
  return parseZod(ReviewDesktopDiscoverySchema, value);
@@ -1116,4 +1039,4 @@ function formatIssuePath(path) {
1116
1039
  return output;
1117
1040
  }
1118
1041
  //#endregion
1119
- export { ReviewGatewayHostSchema as A, REVIEW_REMOTE_WRAPPER_MARK as C, ReviewConnectRequestSchema as D, ReviewCliInstallStampSchema as E, structuralChangeCounts as F, ReviewSelectedDiffSchema as M, reviewDiffrSummarizerInputSchema as N, ReviewFeedbackContactSchema as O, decodeStructuralDiffEvent as P, REVIEW_REMOTE_INSTALL_LOCK as S, ReviewApiSelectionSourceSchema as T, REVIEW_DIFF_LAYOUT_SCOPES as _, parseReviewVerbRequest as a, REVIEW_REMOTE_ATTACH_BEGIN as b, boardIconKind as c, ReviewBugReportRequestSchema as d, parseReviewBugReportResponse as f, REVIEW_DIFF_LAYOUTS as g, REVIEW_CLI_INSTALL_TARGET_LABELS as h, parseReviewDesktopVerbResult as i, ReviewOnboardingRunRequestSchema as j, ReviewFeedbackSchema as k, boardTitle as l, REVIEW_CLIENT_REMOTE as m, parseReviewDesktopDiscovery as n, parseReviewVerbResponse as o, REVIEW_CLIENT_HEADER as p, parseReviewDesktopVerbFrame as r, parseZod as s, parseReviewCliInstallApplyRequest as t, ReviewBugReportMetaV2Schema as u, REVIEW_HOST_HEADER as v, REVIEW_THEME_CHOICES as w, REVIEW_REMOTE_ATTACH_END as x, REVIEW_REMOTE_AGENT_IDS as y };
1042
+ export { ReviewSelectedDiffSchema as A, ReviewApiSelectionSourceSchema as C, ReviewFeedbackSchema as D, ReviewFeedbackContactSchema as E, reviewDiffrSummarizerInputSchema as M, decodeStructuralDiffEvent as N, ReviewGatewayHostSchema as O, structuralChangeCounts as P, REVIEW_THEME_CHOICES as S, ReviewConnectRequestSchema as T, REVIEW_REMOTE_AGENT_IDS as _, parseReviewVerbRequest as a, REVIEW_REMOTE_INSTALL_LOCK as b, ReviewBugReportMetaV2Schema as c, REVIEW_CLIENT_HEADER as d, REVIEW_CLIENT_REMOTE as f, REVIEW_HOST_HEADER as g, REVIEW_DIFF_LAYOUT_SCOPES as h, parseReviewDesktopVerbResult as i, SCRATCHPAD_REVIEW_ID as j, ReviewOnboardingRunRequestSchema as k, ReviewBugReportRequestSchema as l, REVIEW_DIFF_LAYOUTS as m, parseReviewDesktopDiscovery as n, parseReviewVerbResponse as o, REVIEW_CLI_INSTALL_TARGET_LABELS as p, parseReviewDesktopVerbFrame as r, parseZod as s, parseReviewCliInstallApplyRequest as t, parseReviewBugReportResponse as u, REVIEW_REMOTE_ATTACH_BEGIN as v, ReviewCliInstallStampSchema as w, REVIEW_REMOTE_WRAPPER_MARK as x, REVIEW_REMOTE_ATTACH_END as y };