@dev.fast/whiteboard 0.4.0 → 0.4.1-preview.20261026.137

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 (58) hide show
  1. package/dist/{account-alias-2yTAxoBx.js → account-alias-BpH8VvTR.js} +2 -2
  2. package/dist/agent-cli-DFWrNoGJ.js +2 -0
  3. package/dist/{agent-cli-CHNDd4Ga.js → agent-cli-DckMzOU_.js} +6 -6
  4. package/dist/{agent-client-Dc0vHFJt.js → agent-client-D4FSEDX4.js} +3 -3
  5. package/dist/{authoring-tools-D8EkIDjm.js → authoring-tools-DmIJZq0b.js} +21 -8
  6. package/dist/{background-server-DHWHzpo5.js → background-server-B1uwDQTr.js} +2 -2
  7. package/dist/{background-server-DyWnPJyZ.js → background-server-BPZ3GQan.js} +1 -1
  8. package/dist/build-info.json +1 -1
  9. package/dist/{cli-runner-DFBaVGij.js → cli-runner-DVEDbjXo.js} +17 -17
  10. package/dist/{cli-qZomwJmK.js → cli-tWBQpq27.js} +1 -1
  11. package/dist/cli.js +2 -2
  12. package/dist/{client-p9WB8Sj0.js → client-C8vT0mhW.js} +3 -3
  13. package/dist/{fuzzy-match-CfSxqzBF.js → fuzzy-match-BNLXmpbv.js} +2 -2
  14. package/dist/{headless-host-dwlqhqMY.js → headless-host-B63e2z2j.js} +1 -1
  15. package/dist/{headless-host-DJhcab6r.js → headless-host-Dl9g9Fvd.js} +37 -17
  16. package/dist/{lens-selection-9byzEgvU.js → lens-selection-EuZdag4Q.js} +1 -1
  17. package/dist/{local-data-DHedfhxw.js → local-data-C0OJttzT.js} +92 -63
  18. package/dist/{mcp-Br-r_wwR.js → mcp-D74cFQNM.js} +17 -8
  19. package/dist/profile-CAn8Qdeh.js +2 -0
  20. package/dist/{profile-D9wdlPgw.js → profile-DS1F6PBF.js} +1 -1
  21. package/dist/{remote-attach-DSGpTOJ4.js → remote-attach-DTByuwBs.js} +3 -3
  22. package/dist/{remote-language-server-Dx13Mg2m.js → remote-language-server-DQfg07BB.js} +1 -1
  23. package/dist/{remote-uninstall-Dp2o3qz0.js → remote-uninstall-aXApHJPy.js} +3 -3
  24. package/dist/{request-origin-CNSLVn7x.js → request-origin-BIBW432J.js} +12 -3
  25. package/dist/{review-app-launcher-BZAnR8Vp.js → review-app-launcher-Brn60fPu.js} +2 -2
  26. package/dist/{review-telemetry-BM-_KdLi.js → review-telemetry-ChlsTRPN.js} +2 -2
  27. package/dist/server/desktop-host.js +44 -10
  28. package/dist/{server-discovery-DKLIOgg3.js → server-discovery-BchUrwFW.js} +1 -1
  29. package/dist/sharing/index.d.ts +53 -3
  30. package/dist/sharing/index.js +1 -1
  31. package/dist/{src-DYHVzX3b.js → src-DEOc8bvC.js} +63 -2
  32. package/dist/{stored-document-migration-DEt8iwem.js → stored-document-migration-BCFx07Bq.js} +52 -11
  33. package/dist/{thread-state-CO97FUqK.js → thread-state-CbLB0jUA.js} +1 -1
  34. package/dist/{tool-failure-C1L1vJyz.js → tool-failure-DlU9hn7_.js} +2 -2
  35. package/instructions/animation.md +345 -0
  36. package/instructions/authoring.md +2 -2
  37. package/package.json +7 -7
  38. package/src/fixtures/blocks/animation.json +19 -0
  39. package/src/review-api/authoring-tools.ts +17 -6
  40. package/src/review-api/blocks/animation.ts +98 -0
  41. package/src/review-api/blocks/index.ts +3 -0
  42. package/src/review-api/blocks/sequence.ts +3 -1
  43. package/src/review-api/comparison-coverage.ts +120 -89
  44. package/src/review-api/component-reference.ts +16 -0
  45. package/src/review-api/document-text.ts +11 -0
  46. package/src/review-api/document.ts +26 -5
  47. package/src/review-api/http.ts +31 -2
  48. package/src/review-api/instructions.ts +11 -2
  49. package/src/review-api/local-data.ts +21 -4
  50. package/src/review-api/mcp.ts +22 -14
  51. package/src/review-preferences.ts +43 -0
  52. package/src/server/desktop-server.ts +24 -0
  53. package/src/server/review-server-core.ts +2 -0
  54. package/src/server/structural-comparisons.ts +5 -11
  55. package/src/server/structural-diff.ts +8 -2
  56. package/src/ui-telemetry-events.ts +9 -0
  57. package/dist/agent-cli-Cn4-16XA.js +0 -2
  58. package/dist/profile-BopGMZUh.js +0 -2
@@ -1,15 +1,15 @@
1
1
  import { T as runVcsSync, _ as listTrackedFilesAtCommit, a as diff, b as resolveRepoContext, c as diffFileSummariesWorkingTree, d as git, f as gitAt, g as listCommitRange, h as jjRevisionIsConflicted, i as detectLocalVcs, l as diffTrees, m as gitCommonDirSync, n as createBlobBatchReader, p as gitCommonDir, s as diffFileSummariesTrees, t as LocalVcsToolsMissingError, u as diffWorkingTree, v as parseGitRemote, w as runVcs, x as resolveRevision, y as readFileAtCommit } from "./src-X9ZebeOD.js";
2
2
  import { c as jsonString, m as isStringValue, n as isJsonObject, o as jsonObject, u as parseJsonText } from "./src-X9phtB2j.js";
3
- import { F as structuralChangeCounts, P as decodeStructuralDiffEvent, c as boardIconKind, l as boardTitle } from "./src-DYHVzX3b.js";
3
+ import { F as decodeStructuralDiffEvent, I as structuralChangeCounts, P as applyStructuralUpdate, c as boardIconKind, l as boardTitle } from "./src-DEOc8bvC.js";
4
4
  import "./src-Z1x4-Qmb.js";
5
- import { b as updateCoverage, c as parseAnchor, f as sourceAnchors, g as intersectIntervals, h as emptyCoverage, p as coverageSchema, v as subtractIntervals, y as unionIntervals } from "./lens-selection-9byzEgvU.js";
6
- import { $ as lensEditSchema, A as editSchema, B as resourceReferences, C as applyEdit, D as boardRepositoryId, E as boardLinks, F as pinnedRepositoryIds, H as respellDocumentLinks, I as pinsSchema, J as checkReferences, K as sourceReferences, M as explicitPins, O as commitLinkCommits, P as pinDocumentReferences, Q as applyLensEdit, S as anchorPins, T as assignMissingIds, U as respellEditLinks, V as respellCommitLinks, W as reviewTargetSchema, Y as documentAdvice, _ as fetchPullRequest, a as SoftwareModelValidationError, at as requireVisibleSource, b as textIncludesQuote, c as traceSchema, ct as markdownText, d as setPullRequest, f as sourceBranchName, g as defaultPullRequestDeps, h as GitHubRefusedRead, i as readStoredDocument, it as fileLineRangeSchema, j as elements, k as documentSchema, l as pullRequestKey, lt as parseMarkdown, m as resolvePullRequest, n as migrateStoredDocument, nt as SourceRangeError, o as defineSoftwareMap, ot as sliceSourceRange, q as summarizeEdit, r as migrateStoredLenses, rt as checkSourcePath, st as markdownNodes, tt as lensSelections, u as pullRequestUrl, v as remoteUrls, w as assignFreshIds, x as adoptFlowUnits, y as azureRepositoryOf, z as resourceReference } from "./stored-document-migration-DEt8iwem.js";
5
+ import { b as updateCoverage, c as parseAnchor, f as sourceAnchors, g as intersectIntervals, h as emptyCoverage, p as coverageSchema, v as subtractIntervals, y as unionIntervals } from "./lens-selection-EuZdag4Q.js";
6
+ import { $ as lensEditSchema, A as editSchema, B as resourceReferences, C as applyEdit, D as boardRepositoryId, E as boardLinks, F as pinnedRepositoryIds, H as respellDocumentLinks, I as pinsSchema, J as checkReferences, K as sourceReferences, M as explicitPins, O as commitLinkCommits, P as pinDocumentReferences, Q as applyLensEdit, S as anchorPins, T as assignMissingIds, U as respellEditLinks, V as respellCommitLinks, W as reviewTargetSchema, Y as documentAdvice, _ as fetchPullRequest, a as SoftwareModelValidationError, at as requireVisibleSource, b as textIncludesQuote, c as traceSchema, ct as markdownText, d as setPullRequest, f as sourceBranchName, g as defaultPullRequestDeps, h as GitHubRefusedRead, i as readStoredDocument, it as fileLineRangeSchema, j as elements, k as documentSchema, l as pullRequestKey, lt as parseMarkdown, m as resolvePullRequest, n as migrateStoredDocument, nt as SourceRangeError, o as defineSoftwareMap, ot as sliceSourceRange, q as summarizeEdit, r as migrateStoredLenses, rt as checkSourcePath, st as markdownNodes, tt as lensSelections, u as pullRequestUrl, v as remoteUrls, w as assignFreshIds, x as adoptFlowUnits, y as azureRepositoryOf, z as resourceReference } from "./stored-document-migration-BCFx07Bq.js";
7
7
  import { t as ReviewInputError } from "./input-error-OLgB_h31.js";
8
8
  import { A as processStartIdentity, L as writePrivateJsonAtomic, O as pidReused, j as withFileLock, k as processIsAlive } from "./s3-config-CjcLyFV5.js";
9
9
  import { t as errorMessage } from "./error-message-OtiDonty.js";
10
10
  import { s as safeStorageSegment } from "./review-home-paths-CG-sb9Cw.js";
11
11
  import { r as isMissingFileError } from "./fs-utils-BMPLt0cr.js";
12
- import { a as askHistoryEntrySchema, i as askEntrySchema, o as askOfferSchema, s as askPermissionsSchema } from "./thread-state-CO97FUqK.js";
12
+ import { a as askHistoryEntrySchema, i as askEntrySchema, o as askOfferSchema, s as askPermissionsSchema } from "./thread-state-CbLB0jUA.js";
13
13
  import { createRequire } from "node:module";
14
14
  import crypto, { createHash, randomUUID } from "node:crypto";
15
15
  import { z } from "zod";
@@ -819,7 +819,7 @@ async function* structuralDiff(input) {
819
819
  break;
820
820
  case "merge-base": args.push(`${comparison.base}...${comparison.head}`);
821
821
  }
822
- args.push("--", ...input.paths ?? []);
822
+ args.push("--defer", "--", ...input.paths ?? []);
823
823
  const startupAbort = new AbortController();
824
824
  const startup = setTimeout(() => startupAbort.abort(), 12e4);
825
825
  const signal = AbortSignal.any([startupAbort.signal, input.signal]);
@@ -850,6 +850,7 @@ async function* structuralDiff(input) {
850
850
  let completed = false;
851
851
  let aborted;
852
852
  let failed = 0;
853
+ const sent = /* @__PURE__ */ new Set();
853
854
  const lines = createInterface({
854
855
  input: child.stdout,
855
856
  crlfDelay: Infinity
@@ -868,7 +869,8 @@ async function* structuralDiff(input) {
868
869
  completed = true;
869
870
  failed = event.failed;
870
871
  aborted = event.aborted;
871
- } else if (event.type !== "file") throw new Error(`Unexpected diffr event: ${event.type}`);
872
+ } else if (event.type === "file") sent.add((event.file.rhs ?? event.file.lhs).path);
873
+ else if (event.type !== "update" || !sent.has((event.file.rhs ?? event.file.lhs).path)) throw new Error(`Unexpected diffr event: ${event.type}`);
872
874
  yield event;
873
875
  }
874
876
  if (!completed) {
@@ -908,11 +910,11 @@ var StructuralComparisons = class {
908
910
  yield* entry.read(input.signal);
909
911
  } finally {
910
912
  entry.readers--;
911
- if (!entry.done && !entry.initialReady && !entry.readers || entry.error || entry.failed) {
913
+ if (!entry.done && !entry.readers || entry.error || entry.failed) {
912
914
  entry.abort.abort();
913
915
  this.entries.delete(key);
914
916
  }
915
- const idle = [...this.entries].filter(([, value]) => (value.done || value.initialReady) && !value.readers);
917
+ const idle = [...this.entries].filter(([, value]) => value.done && !value.readers);
916
918
  for (const [oldKey, old] of idle.slice(0, -10)) {
917
919
  old.abort.abort();
918
920
  this.entries.delete(oldKey);
@@ -959,7 +961,6 @@ var Comparison = class {
959
961
  done = false;
960
962
  error;
961
963
  failed = false;
962
- initialReady = false;
963
964
  remaining;
964
965
  listeners = /* @__PURE__ */ new Set();
965
966
  constructor(input) {
@@ -971,13 +972,10 @@ var Comparison = class {
971
972
  ...input,
972
973
  signal: this.abort.signal
973
974
  })) {
974
- if (event.type === "start") {
975
- this.remaining = new Set(event.files.map((entry) => (entry.file.rhs ?? entry.file.lhs).path));
976
- this.initialReady = this.remaining.size === 0;
977
- } else if (event.type === "file") {
975
+ if (event.type === "start") this.remaining = new Set(event.files.map((entry) => (entry.file.rhs ?? entry.file.lhs).path));
976
+ else if (event.type === "file") {
978
977
  const path = (event.file.rhs ?? event.file.lhs).path;
979
978
  if (!this.remaining?.delete(path)) throw new Error(`Unexpected structural result: ${path}`);
980
- this.initialReady = this.remaining.size === 0;
981
979
  }
982
980
  if (event.type === "complete") this.failed = event.failed > 0 || !!event.aborted;
983
981
  this.events.push(event);
@@ -1436,53 +1434,73 @@ async function comparisonCoverage(data, reviewId, pins, signal, publish) {
1436
1434
  publish?.(current());
1437
1435
  const baseFiles = new Map(coverage.files.map((file, index) => [file.previousPath ?? file.path, index]));
1438
1436
  const headFiles = new Map(coverage.files.map((file, index) => [file.path, index]));
1439
- const remaining = /* @__PURE__ */ new Set();
1440
- for await (const event of data.structuralChanges({
1441
- reviewId,
1442
- pins,
1443
- signal
1444
- })) {
1445
- if (event.type === "start") {
1446
- for (const entry of event.files) remaining.add((entry.file.rhs ?? entry.file.lhs).path);
1447
- if (!remaining.size) break;
1448
- continue;
1449
- }
1450
- if (event.type === "complete" && (event.failed || event.aborted)) throw new Error(event.aborted?.message ?? "Structural coverage is incomplete.");
1451
- if (event.type !== "file") continue;
1452
- const path = (event.file.rhs ?? event.file.lhs).path;
1453
- if (!remaining.delete(path)) throw new Error(`Unexpected structural result: ${path}`);
1454
- const baseIndex = event.file.lhs && baseFiles.get(event.file.lhs.path);
1455
- const headIndex = event.file.rhs && headFiles.get(event.file.rhs.path);
1456
- if (event.error) {
1457
- if (event.error.code !== "unsupported_file_type" && event.error.code !== "not_utf8") throw new Error(`Cannot count ${path}: ${event.error.message}`);
1458
- for (const index of [baseIndex, headIndex]) if (index !== void 0) unsupported.add(coverage.files[index].path);
1459
- } else if (event.diff.type === "text") {
1460
- const diff = event.diff;
1461
- const folded = foldedChanges(diff);
1462
- for (const side of ["base", "head"]) {
1463
- const source = side === "base" ? event.file.lhs : event.file.rhs;
1464
- const index = source && (side === "base" ? baseFiles : headFiles).get(source.path);
1465
- if (index === void 0) continue;
1466
- const file = coverage.files[index];
1467
- const visible = subtractIntervals(diff.structural_changes[side], folded[side]);
1468
- coverage.files[index] = {
1469
- ...file,
1470
- folded: {
1471
- ...file.folded ?? emptyCoverage(),
1472
- [side]: subtractIntervals(file.changed[side], visible)
1437
+ return new Promise((resolve, reject) => {
1438
+ let resolved = false;
1439
+ const counted = () => {
1440
+ resolved = true;
1441
+ resolve(current());
1442
+ };
1443
+ (async () => {
1444
+ const remaining = /* @__PURE__ */ new Set();
1445
+ const diffs = /* @__PURE__ */ new Map();
1446
+ for await (const event of data.structuralChanges({
1447
+ reviewId,
1448
+ pins,
1449
+ signal
1450
+ })) {
1451
+ if (event.type === "start") {
1452
+ for (const entry of event.files) remaining.add((entry.file.rhs ?? entry.file.lhs).path);
1453
+ if (!remaining.size) break;
1454
+ continue;
1455
+ }
1456
+ if (event.type === "complete" && event.aborted) throw new Error(event.aborted.message);
1457
+ if (event.type !== "file" && event.type !== "update") continue;
1458
+ const path = (event.file.rhs ?? event.file.lhs).path;
1459
+ const baseIndex = event.file.lhs && baseFiles.get(event.file.lhs.path);
1460
+ const headIndex = event.file.rhs && headFiles.get(event.file.rhs.path);
1461
+ let diff;
1462
+ if (event.type === "update") {
1463
+ const previous = diffs.get(path);
1464
+ if (!previous) throw new Error(`Unexpected structural result: ${path}`);
1465
+ if (event.error) continue;
1466
+ diff = applyStructuralUpdate(previous, event);
1467
+ } else if (!remaining.delete(path)) throw new Error(`Unexpected structural result: ${path}`);
1468
+ else if (event.error) {
1469
+ if (event.error.code !== "unsupported_file_type" && event.error.code !== "not_utf8") throw new Error(`Cannot count ${path}: ${event.error.message}`);
1470
+ for (const index of [baseIndex, headIndex]) if (index !== void 0) unsupported.add(coverage.files[index].path);
1471
+ } else diff = event.diff;
1472
+ if (diff?.type === "text") {
1473
+ diffs.set(path, diff);
1474
+ const folded = foldedChanges(diff);
1475
+ for (const side of ["base", "head"]) {
1476
+ const source = side === "base" ? event.file.lhs : event.file.rhs;
1477
+ const index = source && (side === "base" ? baseFiles : headFiles).get(source.path);
1478
+ if (index === void 0) continue;
1479
+ const file = coverage.files[index];
1480
+ const visible = subtractIntervals(diff.structural_changes[side], folded[side]);
1481
+ coverage.files[index] = {
1482
+ ...file,
1483
+ folded: {
1484
+ ...file.folded ?? emptyCoverage(),
1485
+ [side]: subtractIntervals(file.changed[side], visible)
1486
+ }
1487
+ };
1473
1488
  }
1474
- };
1475
- }
1476
- const index = headIndex ?? baseIndex;
1477
- if (index !== void 0) {
1478
- if ((coverage.fileSources.get(coverage.files[index].path) ?? []).every((source) => source.file === (source.side === "base" ? event.file.lhs : event.file.rhs)?.path)) coverage.alignments = new Map(coverage.alignments).set(coverage.files[index].path, structuralRows(diff));
1489
+ const index = headIndex ?? baseIndex;
1490
+ if (event.type === "file" && index !== void 0) {
1491
+ if ((coverage.fileSources.get(coverage.files[index].path) ?? []).every((source) => source.file === (source.side === "base" ? event.file.lhs : event.file.rhs)?.path)) coverage.alignments = new Map(coverage.alignments).set(coverage.files[index].path, structuralRows(diff));
1492
+ }
1493
+ }
1494
+ publish?.(current());
1495
+ if (!remaining.size && !resolved) counted();
1479
1496
  }
1480
- }
1481
- publish?.(current());
1482
- if (!remaining.size) break;
1483
- }
1484
- if (remaining.size) throw new Error("Structural coverage is incomplete.");
1485
- return current();
1497
+ if (remaining.size) throw new Error("Structural coverage is incomplete.");
1498
+ if (!resolved) counted();
1499
+ })().catch((error) => {
1500
+ if (resolved) console.warn("Could not refine folded coverage:", error);
1501
+ else reject(error);
1502
+ });
1503
+ });
1486
1504
  }
1487
1505
  /**
1488
1506
  * The changed lines diffr folds by default. A file it hides (lockfiles,
@@ -6125,14 +6143,25 @@ var LocalReviewData = class {
6125
6143
  const key = JSON.stringify(pins);
6126
6144
  let entry = this.coverageCache.get(key);
6127
6145
  if (!entry || entry.state === "error") {
6128
- const promise = comparisonCoverage(this, reviewId, pins, this.coverageAbort.signal, (partial) => {
6146
+ const worktree = pins.worktreeRevision ? JSON.stringify({
6147
+ ...pins,
6148
+ worktreeRevision: void 0
6149
+ }) : void 0;
6150
+ for (const [cachedKey, cached] of this.coverageCache) if (worktree && cached.worktree === worktree) {
6151
+ cached.abort.abort();
6152
+ this.coverageCache.delete(cachedKey);
6153
+ }
6154
+ const abort = new AbortController();
6155
+ const promise = comparisonCoverage(this, reviewId, pins, AbortSignal.any([this.coverageAbort.signal, abort.signal]), (partial) => {
6129
6156
  const current = this.coverageCache.get(key);
6130
6157
  if (current) current.partial = partial;
6131
6158
  this.notifyCoverage();
6132
6159
  });
6133
6160
  entry = {
6134
6161
  promise,
6135
- state: "pending"
6162
+ state: "pending",
6163
+ abort,
6164
+ worktree
6136
6165
  };
6137
6166
  this.coverageCache.set(key, entry);
6138
6167
  const current = entry;
@@ -6146,7 +6175,7 @@ var LocalReviewData = class {
6146
6175
  }
6147
6176
  };
6148
6177
  promise.then((value) => {
6149
- current.partial = value;
6178
+ current.partial ??= value;
6150
6179
  if (!this.closed) this.store.setDiffStats(pins, {
6151
6180
  fileCount: value.files.length,
6152
6181
  additions: value.files.reduce((sum, file) => sum + structuralChangeCounts(file.changed).added, 0),
@@ -6155,7 +6184,7 @@ var LocalReviewData = class {
6155
6184
  settled("ready");
6156
6185
  }, (error) => settled("error", error));
6157
6186
  }
6158
- return entry.promise;
6187
+ return entry.state === "ready" && entry.partial ? Promise.resolve(entry.partial) : entry.promise;
6159
6188
  }
6160
6189
  async changes(pins, file, previousPath) {
6161
6190
  if (file === void 0) return this.summaries(pins);
@@ -1,7 +1,8 @@
1
- import { a as toolResultText, s as ReviewApiError } from "./agent-client-Dc0vHFJt.js";
1
+ import { n as isJsonObject } from "./src-X9phtB2j.js";
2
+ import { a as toolResultText, s as ReviewApiError, t as ToolText } from "./agent-client-D4FSEDX4.js";
2
3
  import { t as ReviewInputError } from "./input-error-OLgB_h31.js";
3
- import { n as REVIEW_STATUS_TOOL, t as authoringTools } from "./authoring-tools-D8EkIDjm.js";
4
- import { i as publicTool, n as RECOVERY, r as callPublicTool, t as toolFailure } from "./tool-failure-C1L1vJyz.js";
4
+ import { n as REVIEW_STATUS_TOOL, t as authoringTools } from "./authoring-tools-DmIJZq0b.js";
5
+ import { i as publicTool, n as RECOVERY, r as callPublicTool, t as toolFailure } from "./tool-failure-DlU9hn7_.js";
5
6
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
6
7
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
8
  import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
@@ -32,6 +33,7 @@ function mcpAuthoringGuidance(context) {
32
33
  return [
33
34
  "Whiteboard explains code in documents the user reads in Whiteboard Desktop. Call session_get_instructions before creating or editing a Whiteboard and follow it. Read session_capabilities before authoring; session_create opens the new review in Desktop when it is available, so call session_open only for an existing review, and generate software maps only when softwareMapEnabled is true. When the user asks for a Whiteboard or to use Whiteboard (for example to plan work, review a branch or PR stack, or explain a system in Whiteboard), author a Whiteboard with the default topic.",
34
35
  ...context.traceEnabled ? ["For why code exists, what an agent was thinking, or whether an agent solved something before, call session_get_instructions({topic:\"trace-archaeology\"})."] : [],
36
+ "For programmatic MCP calls, use structuredContent when present; otherwise parse JSON from the text content when the result is JSON. An insert through session_edit uses edit.content for the actual document component, never the MCP transport wrapper containing content or structuredContent.",
35
37
  "Never read or write Whiteboard files or SQL."
36
38
  ].join(" ");
37
39
  }
@@ -103,10 +105,15 @@ async function serveReviewMcp(connect, stdin, stdout, stderr = process.stderr, t
103
105
  type: "text",
104
106
  text: RECOVERY
105
107
  }] };
106
- if (request.params.name === REVIEW_STATUS_TOOL.name && offlineStatus) return { content: [{
107
- type: "text",
108
- text: JSON.stringify(await offlineStatus(error instanceof Error ? error.message : String(error)))
109
- }] };
108
+ if (request.params.name === REVIEW_STATUS_TOOL.name && offlineStatus) {
109
+ const result = await offlineStatus(error instanceof Error ? error.message : String(error));
110
+ const response = { content: [{
111
+ type: "text",
112
+ text: JSON.stringify(result)
113
+ }] };
114
+ if (isJsonObject(result)) response.structuredContent = result;
115
+ return response;
116
+ }
110
117
  throw error;
111
118
  }
112
119
  phase = "call";
@@ -115,10 +122,12 @@ async function serveReviewMcp(connect, stdin, stdout, stderr = process.stderr, t
115
122
  const result = await callPublicTool(client, tool, request.params.arguments ?? {}, extra.signal);
116
123
  const text = toolResultText(tool, result);
117
124
  report();
118
- return { content: [{
125
+ const response = { content: [{
119
126
  type: "text",
120
127
  text: listedWhileDown && tool.name === instructionsTool.name ? `${RELOAD_TOOLS}\n\n${text}` : text
121
128
  }] };
129
+ if (!(result instanceof ToolText) && isJsonObject(result)) response.structuredContent = result;
130
+ return response;
122
131
  } catch (error) {
123
132
  report(toolFailure(error, phase));
124
133
  return {
@@ -0,0 +1,2 @@
1
+ import { t as openReviewProfile } from "./profile-DS1F6PBF.js";
2
+ export { openReviewProfile };
@@ -1,4 +1,4 @@
1
- import { a as projectOfCheckout, g as CheckoutGroups, o as groupCheckoutsAhead, s as initializeReviewStoreSchema, t as openLocalReviewStore } from "./local-data-DHedfhxw.js";
1
+ import { a as projectOfCheckout, g as CheckoutGroups, o as groupCheckoutsAhead, s as initializeReviewStoreSchema, t as openLocalReviewStore } from "./local-data-C0OJttzT.js";
2
2
  import "./src-Z1x4-Qmb.js";
3
3
  import { j as withFileLock } from "./s3-config-CjcLyFV5.js";
4
4
  import { access, mkdir } from "node:fs/promises";
@@ -1,7 +1,7 @@
1
1
  import { i as readReviewPackageVersion } from "./package-paths-BeYHYjeR.js";
2
- import { a as readReviewServerHealth, l as serverNotReady } from "./server-discovery-DKLIOgg3.js";
3
- import { c as stopBackgroundServer, o as recordedBackgroundServer, r as ensureBackgroundServer } from "./background-server-DHWHzpo5.js";
4
- import { t as ensureRemoteLanguageServer } from "./remote-language-server-Dx13Mg2m.js";
2
+ import { a as readReviewServerHealth, l as serverNotReady } from "./server-discovery-BchUrwFW.js";
3
+ import { c as stopBackgroundServer, o as recordedBackgroundServer, r as ensureBackgroundServer } from "./background-server-B1uwDQTr.js";
4
+ import { t as ensureRemoteLanguageServer } from "./remote-language-server-DQfg07BB.js";
5
5
  import path from "node:path";
6
6
  import { spawn } from "node:child_process";
7
7
  import { gt, valid } from "semver";
@@ -1,7 +1,7 @@
1
1
  import "./src-Z1x4-Qmb.js";
2
2
  import { A as processStartIdentity, j as withFileLock } from "./s3-config-CjcLyFV5.js";
3
3
  import { t as findReviewPackageRoot } from "./package-paths-BeYHYjeR.js";
4
- import { n as cliSpawn, s as spawnDetached } from "./background-server-DHWHzpo5.js";
4
+ import { n as cliSpawn, s as spawnDetached } from "./background-server-B1uwDQTr.js";
5
5
  import { r as remoteServerPaths, t as ensureRemoteExtensions } from "./remote-extensions-CsI_BJ_f.js";
6
6
  import { randomBytes } from "node:crypto";
7
7
  import { z } from "zod";
@@ -1,9 +1,9 @@
1
- import { C as REVIEW_REMOTE_INSTALL_LOCK, w as REVIEW_REMOTE_WRAPPER_MARK } from "./src-DYHVzX3b.js";
1
+ import { C as REVIEW_REMOTE_INSTALL_LOCK, w as REVIEW_REMOTE_WRAPPER_MARK } from "./src-DEOc8bvC.js";
2
2
  import { M as DEV_REVIEW_HOME_ENV } from "./s3-config-CjcLyFV5.js";
3
3
  import "./review-home-paths-CG-sb9Cw.js";
4
- import { c as stopBackgroundServer, o as recordedBackgroundServer } from "./background-server-DHWHzpo5.js";
4
+ import { c as stopBackgroundServer, o as recordedBackgroundServer } from "./background-server-B1uwDQTr.js";
5
5
  import { i as whiteboardRemoteHome } from "./remote-extensions-CsI_BJ_f.js";
6
- import { n as remoteLanguageServerGroups, r as stopProcessGroup } from "./remote-language-server-Dx13Mg2m.js";
6
+ import { n as remoteLanguageServerGroups, r as stopProcessGroup } from "./remote-language-server-DQfg07BB.js";
7
7
  import { existsSync } from "node:fs";
8
8
  import { lstat, mkdir, readFile, readdir, rm, stat } from "node:fs/promises";
9
9
  import path from "node:path";
@@ -1,7 +1,7 @@
1
1
  import { a as jsonNumber, c as jsonString, i as jsonBoolean, n as isJsonObject } from "./src-X9phtB2j.js";
2
- import { _ as REVIEW_DIFF_LAYOUTS, g as REVIEW_COLOR_THEME_KINDS, v as REVIEW_DIFF_LAYOUT_SCOPES } from "./src-DYHVzX3b.js";
3
- import { t as SELECTION_UNAVAILABLE_REASONS } from "./lens-selection-9byzEgvU.js";
4
- import { n as askAgentIds } from "./thread-state-CO97FUqK.js";
2
+ import { _ as REVIEW_DIFF_LAYOUTS, g as REVIEW_COLOR_THEME_KINDS, v as REVIEW_DIFF_LAYOUT_SCOPES } from "./src-DEOc8bvC.js";
3
+ import { t as SELECTION_UNAVAILABLE_REASONS } from "./lens-selection-EuZdag4Q.js";
4
+ import { n as askAgentIds } from "./thread-state-CbLB0jUA.js";
5
5
  import { z } from "zod";
6
6
  //#region src/telemetry-clean-text.ts
7
7
  const USER_DATA_REGEXES = [
@@ -712,6 +712,15 @@ const UI_TELEMETRY_EVENTS = {
712
712
  files: "number"
713
713
  }
714
714
  },
715
+ diff_loaded: {
716
+ event: "review_diff_loaded",
717
+ properties: {
718
+ first_file_ms: "number",
719
+ updates_ms: "number",
720
+ files: "number",
721
+ update_errors: "number"
722
+ }
723
+ },
715
724
  discord_clicked: {
716
725
  event: "review_discord_clicked",
717
726
  properties: { via: DISCORD_VIA }
@@ -1,5 +1,5 @@
1
- import { o as parseReviewVerbResponse } from "./src-DYHVzX3b.js";
2
- import { b as selectReviewInstance, m as healthyReviewInstance, v as reviewInstanceStartHint, y as reviewInstanceUnavailable } from "./server-discovery-DKLIOgg3.js";
1
+ import { o as parseReviewVerbResponse } from "./src-DEOc8bvC.js";
2
+ import { b as selectReviewInstance, m as healthyReviewInstance, v as reviewInstanceStartHint, y as reviewInstanceUnavailable } from "./server-discovery-BchUrwFW.js";
3
3
  import { closeSync, existsSync, fstatSync, mkdtempSync, openSync, readSync } from "node:fs";
4
4
  import path from "node:path";
5
5
  import { homedir, tmpdir } from "node:os";
@@ -1,10 +1,10 @@
1
1
  import { c as jsonString, l as jsonValueSchema, o as jsonObject, u as parseJsonText } from "./src-X9phtB2j.js";
2
- import "./src-DYHVzX3b.js";
2
+ import "./src-DEOc8bvC.js";
3
3
  import "./src-Z1x4-Qmb.js";
4
4
  import { F as writeFileAtomic, N as devReviewHome, j as withFileLock, k as processIsAlive } from "./s3-config-CjcLyFV5.js";
5
5
  import { i as readReviewPackageVersion, t as findReviewPackageRoot } from "./package-paths-BeYHYjeR.js";
6
6
  import "./review-home-paths-CG-sb9Cw.js";
7
- import "./request-origin-CNSLVn7x.js";
7
+ import "./request-origin-BIBW432J.js";
8
8
  import { createHmac, randomUUID } from "node:crypto";
9
9
  import { z } from "zod";
10
10
  import { existsSync, readFileSync, rmSync } from "node:fs";
@@ -1,22 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
  import { S as splitGitPatchFiles, a as diff, o as diffFileSummaries } from "../src-X9ZebeOD.js";
3
3
  import { c as jsonString, i as jsonBoolean, n as isJsonObject, p as isObjectValue, s as jsonProperty, u as parseJsonText } from "../src-X9phtB2j.js";
4
- import { f as StreamLimitError, i as SharedReviewStore, p as readBoundedStream } from "../client-p9WB8Sj0.js";
5
- import { A as ReviewGatewayHostSchema, D as ReviewConnectRequestSchema, N as reviewDiffrSummarizerInputSchema, d as ReviewBugReportRequestSchema, f as parseReviewBugReportResponse, m as REVIEW_CLIENT_REMOTE, p as REVIEW_CLIENT_HEADER, r as parseReviewDesktopVerbFrame, s as parseZod, t as parseReviewCliInstallApplyRequest, u as ReviewBugReportMetaV2Schema, y as REVIEW_HOST_HEADER } from "../src-DYHVzX3b.js";
4
+ import { f as StreamLimitError, i as SharedReviewStore, p as readBoundedStream } from "../client-C8vT0mhW.js";
5
+ import { A as ReviewGatewayHostSchema, D as ReviewConnectRequestSchema, N as reviewDiffrSummarizerInputSchema, d as ReviewBugReportRequestSchema, f as parseReviewBugReportResponse, m as REVIEW_CLIENT_REMOTE, p as REVIEW_CLIENT_HEADER, r as parseReviewDesktopVerbFrame, s as parseZod, t as parseReviewCliInstallApplyRequest, u as ReviewBugReportMetaV2Schema, y as REVIEW_HOST_HEADER } from "../src-DEOc8bvC.js";
6
6
  import "../src-Z1x4-Qmb.js";
7
- import { B as resourceReferences, p as pullRequestProvider } from "../stored-document-migration-DEt8iwem.js";
7
+ import { B as resourceReferences, p as pullRequestProvider } from "../stored-document-migration-BCFx07Bq.js";
8
8
  import { t as ReviewInputError } from "../input-error-OLgB_h31.js";
9
9
  import { L as writePrivateJsonAtomic, N as devReviewHome } from "../s3-config-CjcLyFV5.js";
10
10
  import { t as errorMessage } from "../error-message-OtiDonty.js";
11
11
  import { i as readReviewPackageVersion, t as findReviewPackageRoot } from "../package-paths-BeYHYjeR.js";
12
12
  import { i as reviewInstanceDiscoveryPath, o as reviewLegacyDiscoveryPath } from "../review-home-paths-CG-sb9Cw.js";
13
- import { _ as reviewInstanceIdentity, u as REVIEW_INSTANCE_ENV } from "../server-discovery-DKLIOgg3.js";
14
- import { t as openReviewProfile } from "../profile-D9wdlPgw.js";
15
- import { r as reviewTelemetryChannel, t as ReviewTelemetry } from "../review-telemetry-BM-_KdLi.js";
16
- import { l as REVIEW_TELEMETRY_TABS } from "../request-origin-CNSLVn7x.js";
17
- import { c as removeLegacyReviewSkills, d as skipCliInstall, h as detectConnectAgents, i as finishCliInstallUpdate, l as resetCliInstall, m as connectAgent, n as applyCliInstall, o as pathShimPath, r as declineCliInstall, s as removeCliInstall, t as aliasInstallationToAccount, u as resolveCliInstallStatus } from "../account-alias-2yTAxoBx.js";
18
- import { C as saveDiffrSummarizer, E as cliAskTools, S as readDiffrConfig, T as testDiffrSummarizer, _ as DEFAULT_MAX_REQUEST_BYTES, a as drainServerCrashReport, b as GlobalReviewDesktopVerbRelay, c as answerErrorsAsJson, d as legacyModeSchema, f as captureSanitizedUiTelemetry, g as readBoundedRequestJson, h as createNodeRequestListener, l as createWhiteboardCore, m as recordClientError, o as installProcessErrorTelemetry, p as clientErrorsForSession, r as takeOverServerHome, s as serverCrashReportPath, u as serverJson, v as HttpJsonError, w as setDiffrConfigValue, x as migrateDiffrConfig, y as ReviewServerError } from "../headless-host-DJhcab6r.js";
19
- import { s as readQuerySchemas } from "../authoring-tools-D8EkIDjm.js";
13
+ import { _ as reviewInstanceIdentity, u as REVIEW_INSTANCE_ENV } from "../server-discovery-BchUrwFW.js";
14
+ import { t as openReviewProfile } from "../profile-DS1F6PBF.js";
15
+ import { r as reviewTelemetryChannel, t as ReviewTelemetry } from "../review-telemetry-ChlsTRPN.js";
16
+ import { l as REVIEW_TELEMETRY_TABS } from "../request-origin-BIBW432J.js";
17
+ import { c as removeLegacyReviewSkills, d as skipCliInstall, h as detectConnectAgents, i as finishCliInstallUpdate, l as resetCliInstall, m as connectAgent, n as applyCliInstall, o as pathShimPath, r as declineCliInstall, s as removeCliInstall, t as aliasInstallationToAccount, u as resolveCliInstallStatus } from "../account-alias-BpH8VvTR.js";
18
+ import { C as saveDiffrSummarizer, E as cliAskTools, S as readDiffrConfig, T as testDiffrSummarizer, _ as DEFAULT_MAX_REQUEST_BYTES, a as drainServerCrashReport, b as GlobalReviewDesktopVerbRelay, c as answerErrorsAsJson, d as legacyModeSchema, f as captureSanitizedUiTelemetry, g as readBoundedRequestJson, h as createNodeRequestListener, l as createWhiteboardCore, m as recordClientError, o as installProcessErrorTelemetry, p as clientErrorsForSession, r as takeOverServerHome, s as serverCrashReportPath, u as serverJson, v as HttpJsonError, w as setDiffrConfigValue, x as migrateDiffrConfig, y as ReviewServerError } from "../headless-host-Dl9g9Fvd.js";
19
+ import { s as readQuerySchemas } from "../authoring-tools-DmIJZq0b.js";
20
20
  import crypto, { createHash, randomBytes } from "node:crypto";
21
21
  import { z } from "zod";
22
22
  import fs, { existsSync, readFileSync } from "node:fs";
@@ -265,6 +265,30 @@ function listenForDesktopHostShutdown(hostProcess, onShutdown, onTelemetrySettin
265
265
  return () => hostProcess.off("message", handleMessage);
266
266
  }
267
267
  //#endregion
268
+ //#region src/review-preferences.ts
269
+ /**
270
+ * Machine-wide Review preferences the server itself needs. Workbench settings
271
+ * do not work here: the review server never reads the workbench
272
+ * configuration.
273
+ */
274
+ function reviewPreferencesPath(devHome = devReviewHome()) {
275
+ return path.join(devHome, "preferences.json");
276
+ }
277
+ /** Whether agents are offered animation authoring; existing animations
278
+ * always render. A missing or unreadable file means off; it never throws. */
279
+ async function readAnimationsEnabled(devHome) {
280
+ try {
281
+ const raw = parseJsonText(await readFile(reviewPreferencesPath(devHome), "utf8"));
282
+ return isJsonObject(raw) && raw.animationsEnabled === true;
283
+ } catch {
284
+ return false;
285
+ }
286
+ }
287
+ async function writeAnimationsEnabled(enabled, devHome) {
288
+ await writePrivateJsonAtomic(reviewPreferencesPath(devHome), { animationsEnabled: enabled });
289
+ return enabled;
290
+ }
291
+ //#endregion
268
292
  //#region src/server/crash-report.ts
269
293
  const CRASH_REPORT_URL = "https://bug.dev.fast/api/v2/crashes";
270
294
  const gzipAsync = promisify(gzip);
@@ -2099,6 +2123,7 @@ function createGlobalReviewServer(input) {
2099
2123
  const openWatchdog = new ReviewOpenWatchdog({ onTimeout: (context, elapsedMs) => void telemetry.captureEvent("review_open_timeout", { elapsed_ms: elapsedMs }, context) });
2100
2124
  let closing = false;
2101
2125
  const cliPath = path.join(input.packageRoot, "dist", "cli.js");
2126
+ let animationsEnabled = false;
2102
2127
  const discovery = {
2103
2128
  version: 3,
2104
2129
  instanceId,
@@ -2123,6 +2148,7 @@ function createGlobalReviewServer(input) {
2123
2148
  relay,
2124
2149
  token,
2125
2150
  instanceId,
2151
+ animations: () => animationsEnabled,
2126
2152
  status: () => {
2127
2153
  const { key, channel, checkout, appVersion, cliVersion, instanceId } = discovery;
2128
2154
  return {
@@ -2157,6 +2183,13 @@ function createGlobalReviewServer(input) {
2157
2183
  app.all("/reviews-api", (context) => gateway.fetch(context.req.raw));
2158
2184
  app.all("/reviews-api/*", (context) => gateway.fetch(context.req.raw));
2159
2185
  app.get("/remote-hosts", () => serverJson(200, gateway.hosts()));
2186
+ app.get("/preferences/animations", () => serverJson(200, { enabled: animationsEnabled }));
2187
+ app.put("/preferences/animations", async (context) => {
2188
+ const request = z.object({ enabled: z.boolean() }).safeParse(await readBoundedRequestJson(context.req.raw));
2189
+ if (!request.success) throw new ReviewServerError("enabled must be a boolean.", 400);
2190
+ animationsEnabled = await writeAnimationsEnabled(request.data.enabled);
2191
+ return serverJson(200, { enabled: animationsEnabled });
2192
+ });
2160
2193
  app.post("/app/focus", async () => {
2161
2194
  const result = await relay.dispatch({
2162
2195
  name: "focusWindow",
@@ -2282,6 +2315,7 @@ function createGlobalReviewServer(input) {
2282
2315
  },
2283
2316
  listen: async () => {
2284
2317
  await migrateDiffrConfig();
2318
+ animationsEnabled = await readAnimationsEnabled();
2285
2319
  boundPort = await listen(loopback.server, input.port);
2286
2320
  discovery.url = urlForBoundPort();
2287
2321
  for (const discoveryPath of discoveryPaths) await writePrivateJsonAtomic(discoveryPath, discovery);
@@ -1,5 +1,5 @@
1
1
  import { a as jsonNumber, n as isJsonObject, s as jsonProperty, u as parseJsonText } from "./src-X9phtB2j.js";
2
- import { n as parseReviewDesktopDiscovery } from "./src-DYHVzX3b.js";
2
+ import { n as parseReviewDesktopDiscovery } from "./src-DEOc8bvC.js";
3
3
  import "./src-Z1x4-Qmb.js";
4
4
  import { M as DEV_REVIEW_HOME_ENV, N as devReviewHome, k as processIsAlive } from "./s3-config-CjcLyFV5.js";
5
5
  import { a as reviewInstancesDir, o as reviewLegacyDiscoveryPath, r as reviewDevInstanceKey, t as reviewDefaultInstancePath } from "./review-home-paths-CG-sb9Cw.js";
@@ -126,7 +126,10 @@ type StructuralDiffEvent = {
126
126
  } | ({
127
127
  type: "file";
128
128
  file: StructuralPairing<StructuralFileRef>;
129
- } & StructuralOutcome) | {
129
+ } & StructuralOutcome) | ({
130
+ type: "update";
131
+ file: StructuralPairing<StructuralFileRef>;
132
+ } & StructuralUpdate) | {
130
133
  type: "complete";
131
134
  succeeded: number;
132
135
  failed: number;
@@ -140,6 +143,23 @@ type StructuralOutcome = {
140
143
  error: StructuralProblem;
141
144
  diff?: never;
142
145
  };
146
+ /**
147
+ * An update record carries the regions whose visibility deferred plugins
148
+ * changed, by region `id`, and the file's new `stats.visible`; or their error.
149
+ */
150
+ type StructuralUpdate = {
151
+ regions: StructuralRegionVisibility[];
152
+ visible: StructuralLineCounts;
153
+ error?: never;
154
+ } | {
155
+ error: StructuralProblem;
156
+ regions?: never;
157
+ visible?: never;
158
+ };
159
+ /** A region's new visibility; absent fields are open and unlabelled. */
160
+ type StructuralRegionVisibility = {
161
+ id: number;
162
+ } & StructuralVisibility;
143
163
  type StructuralSnapshot = {
144
164
  type: "revision";
145
165
  rev: string;
@@ -741,6 +761,21 @@ declare const leafSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
741
761
  id: z.ZodOptional<z.ZodString>;
742
762
  }, z.core.$strict>>;
743
763
  pins: any;
764
+ }, z.core.$strict>, z.ZodObject<{
765
+ type: z.ZodLiteral<"animation">;
766
+ id: z.ZodOptional<z.ZodString>;
767
+ title: z.ZodString;
768
+ html: z.ZodString;
769
+ frames: z.ZodArray<z.ZodObject<{
770
+ key: z.ZodString;
771
+ title: z.ZodString;
772
+ label: z.ZodOptional<z.ZodString>;
773
+ caption: z.ZodOptional<z.ZodString>;
774
+ duration: z.ZodOptional<z.ZodNumber>;
775
+ }, z.core.$strict>>;
776
+ code: z.ZodDefault<z.ZodRecord<z.ZodString, any>>;
777
+ height: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodNumber]>>;
778
+ pins: any;
744
779
  }, z.core.$strict>], "type">;
745
780
  type LeafBlock = z.infer<typeof leafSchema>;
746
781
  type Block = LeafBlock | SectionBlock | CalloutBlock;
@@ -994,6 +1029,21 @@ declare const editSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
994
1029
  id: z.ZodOptional<z.ZodString>;
995
1030
  }, z.core.$strict>>;
996
1031
  pins: any;
1032
+ }, z.core.$strict>, z.ZodObject<{
1033
+ type: z.ZodLiteral<"animation">;
1034
+ id: z.ZodOptional<z.ZodString>;
1035
+ title: z.ZodString;
1036
+ html: z.ZodString;
1037
+ frames: z.ZodArray<z.ZodObject<{
1038
+ key: z.ZodString;
1039
+ title: z.ZodString;
1040
+ label: z.ZodOptional<z.ZodString>;
1041
+ caption: z.ZodOptional<z.ZodString>;
1042
+ duration: z.ZodOptional<z.ZodNumber>;
1043
+ }, z.core.$strict>>;
1044
+ code: z.ZodDefault<z.ZodRecord<z.ZodString, any>>;
1045
+ height: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodNumber]>>;
1046
+ pins: any;
997
1047
  }, z.core.$strict>], "type">, z.ZodObject<{
998
1048
  type: z.ZodLiteral<"section">;
999
1049
  id: z.ZodOptional<z.ZodString>;
@@ -1287,8 +1337,8 @@ type AskOffer = z.infer<typeof askOfferSchema>;
1287
1337
  /** What an agent may do without asking: nothing that changes the checkout,
1288
1338
  * what its own judgment calls safe, or everything. */
1289
1339
  declare const askPermissionsSchema: z.ZodEnum<{
1290
- "read-only": "read-only";
1291
1340
  auto: "auto";
1341
+ "read-only": "read-only";
1292
1342
  bypass: "bypass";
1293
1343
  }>;
1294
1344
  type AskPermissions = z.infer<typeof askPermissionsSchema>;
@@ -1679,7 +1729,7 @@ declare class ReviewStore {
1679
1729
  history(id: string): HistoryEntry[];
1680
1730
  inspect(id: string, targetId?: string, version?: number): Element | {
1681
1731
  id: string | undefined;
1682
- type: "image" | "code" | "markdown" | "divider" | "code_peek" | "sequence" | "step" | "call_stack_diff" | "database_lens" | "trace_quote" | "software_map" | "flow_diagram" | "flow_node" | "flow_edge" | "section" | "callout";
1732
+ type: "image" | "code" | "markdown" | "divider" | "code_peek" | "sequence" | "step" | "call_stack_diff" | "database_lens" | "trace_quote" | "software_map" | "flow_diagram" | "flow_node" | "flow_edge" | "animation" | "section" | "callout";
1683
1733
  label: any;
1684
1734
  }[];
1685
1735
  /** The host can seed a document; transport callers only supply a command. */
@@ -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-p9WB8Sj0.js";
1
+ import { a as sharedReviewId, c as verifyShareRepository, i as SharedReviewStore, l as exportShare, n as ShareClient, o as validateShareBundle } from "../client-C8vT0mhW.js";
2
2
  export { ShareClient, SharedReviewStore, exportShare, sharedReviewId, validateShareBundle, verifyShareRepository };