@dev.fast/whiteboard 0.2.3 → 0.2.4-preview.20261009.108

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 (32) hide show
  1. package/dist/{account-alias-DLE9XZhi.js → account-alias-_1_7vROx.js} +1 -1
  2. package/dist/agent-cli-BJ_SxT1P.js +2 -0
  3. package/dist/{agent-cli-DRRQfHQ-.js → agent-cli-BYMMEOlO.js} +6 -6
  4. package/dist/{agent-client-DoaODH6I.js → agent-client-B_b1GtUc.js} +2 -2
  5. package/dist/{authoring-tools-F_q8cC7J.js → authoring-tools-CUJ_56bd.js} +2 -2
  6. package/dist/build-info.json +1 -1
  7. package/dist/{cli-DtolttUF.js → cli-gRGxkwc0.js} +1 -1
  8. package/dist/{cli-runner-Cwg5PeH2.js → cli-runner-CyBLX8Oj.js} +11 -11
  9. package/dist/cli.js +2 -2
  10. package/dist/{client-D01H2KOV.js → client-BFClfQLO.js} +2 -2
  11. package/dist/{desktop-discovery-DK2HoBy5.js → desktop-discovery-C-Qz54wO.js} +1 -1
  12. package/dist/{headless-host-Dd_-zkC4.js → headless-host-wMPUx0Aj.js} +2 -2
  13. package/dist/{local-data-D-EoJfPx.js → local-data-BfAaQmqC.js} +5 -5
  14. package/dist/{mcp-BAE5rMgB.js → mcp-BWp_kC0V.js} +3 -3
  15. package/dist/{process-error-telemetry-mzRG988B.js → process-error-telemetry-WjZ2FTnX.js} +12 -9
  16. package/dist/{profile-WzZu7Spt.js → profile-CviK33_F.js} +1 -1
  17. package/dist/profile-YLwWPRQp.js +2 -0
  18. package/dist/{request-origin-DlHTFCrQ.js → request-origin-DA4K1qWY.js} +1 -1
  19. package/dist/{review-telemetry-Pp4ZsVrh.js → review-telemetry-DBy3eVCo.js} +2 -2
  20. package/dist/server/desktop-host.js +10 -10
  21. package/dist/sharing/index.d.ts +3 -1
  22. package/dist/sharing/index.js +1 -1
  23. package/dist/{src-DHiDJQDy.js → src-WCbabvdS.js} +3 -2
  24. package/dist/{stored-document-migration-T9Uj5MkN.js → stored-document-migration-BxZWQQjv.js} +1 -1
  25. package/dist/{tool-failure-Djeeax6q.js → tool-failure-DJmTieh5.js} +1 -1
  26. package/package.json +6 -6
  27. package/src/review-api/comparison-coverage.ts +6 -1
  28. package/src/review-api/http.ts +11 -0
  29. package/src/server/diffr-config.ts +1 -1
  30. package/src/server/structural-diff.ts +3 -2
  31. package/dist/agent-cli-50KJgMKi.js +0 -2
  32. package/dist/profile-Cqztt-9-.js +0 -2
@@ -1,4 +1,4 @@
1
- import { h as ReviewCliInstallStampSchema } from "./src-DHiDJQDy.js";
1
+ import { h as ReviewCliInstallStampSchema } from "./src-WCbabvdS.js";
2
2
  import { G as readStoreAuth, Z as StoreClient } from "./review-agent-traces-DNJFYzc8.js";
3
3
  import { A as devReviewHome, N as writeFileAtomicAsync, O as withFileLock, P as writePrivateJsonAtomic } from "./s3-config-CAxhO9u_.js";
4
4
  import { B as installHarnessHooks, C as disableTraceMachine, E as traceMachineStatus, F as listTraceRepositoryRoots, G as traceScope, I as traceRepositoryStatus, N as disableAllTraceRepositories, P as enableTraceRepository, R as AGENT_TRACE_HOOK_AGENTS, S as configureTraceMachine, T as traceMachineEnabled, V as removeAgentTraceHook, n as reviewDesktopStateDir, z as describeTraceHookOwners } from "./review-home-paths-6zZH-1c9.js";
@@ -0,0 +1,2 @@
1
+ import { n as runReviewAgentCli } from "./agent-cli-BYMMEOlO.js";
2
+ export { runReviewAgentCli };
@@ -1,11 +1,11 @@
1
1
  import { n as isJsonObject, u as parseJsonText } from "./src-X9phtB2j.js";
2
- import { a as toolResultText, i as connectReviewInstance, s as ReviewApiError } from "./agent-client-DoaODH6I.js";
2
+ import { a as toolResultText, i as connectReviewInstance, s as ReviewApiError } from "./agent-client-B_b1GtUc.js";
3
3
  import { A as devReviewHome } from "./s3-config-CAxhO9u_.js";
4
4
  import { T as traceMachineEnabled } from "./review-home-paths-6zZH-1c9.js";
5
- import { d as selectReviewInstance, t as REVIEW_INSTANCE_ENV } from "./desktop-discovery-DK2HoBy5.js";
6
- import { n as reviewSessionAgent } from "./review-telemetry-Pp4ZsVrh.js";
7
- import { n as REVIEW_VIA_HEADER, t as REVIEW_AGENT_HEADER } from "./request-origin-DlHTFCrQ.js";
8
- import { i as publicTool, n as RECOVERY, r as callPublicTool, t as toolFailure } from "./tool-failure-Djeeax6q.js";
5
+ import { d as selectReviewInstance, t as REVIEW_INSTANCE_ENV } from "./desktop-discovery-C-Qz54wO.js";
6
+ import { n as reviewSessionAgent } from "./review-telemetry-DBy3eVCo.js";
7
+ import { n as REVIEW_VIA_HEADER, t as REVIEW_AGENT_HEADER } from "./request-origin-DA4K1qWY.js";
8
+ import { i as publicTool, n as RECOVERY, r as callPublicTool, t as toolFailure } from "./tool-failure-DJmTieh5.js";
9
9
  //#region src/review-api/agent-cli.ts
10
10
  const reviewAgentCliHelp = "whiteboard api tools (one line per tool)\nwhiteboard api tools <tool-name> (its description and input schema)\nwhiteboard api <tool-name> '<json>'\nwhiteboard api <tool-name> - (read JSON from stdin)\nwhiteboard mcp (stdio MCP adapter; Whiteboard Desktop or whiteboard server start must be running)\nSelect headless state with DEV_REVIEW_SERVER_DIR or whiteboard --state-dir <path> api/mcp.\n";
11
11
  async function runReviewAgentCli(input) {
@@ -23,7 +23,7 @@ async function runReviewAgentCli(input) {
23
23
  [REVIEW_AGENT_HEADER]: reviewSessionAgent(env)
24
24
  };
25
25
  if (mode === "mcp") {
26
- const { serveReviewMcp } = await import("./mcp-BAE5rMgB.js");
26
+ const { serveReviewMcp } = await import("./mcp-BWp_kC0V.js");
27
27
  await serveReviewMcp(async (key, agentKind) => {
28
28
  const connected = await connectReviewInstance(key ? {
29
29
  ...env,
@@ -1,7 +1,7 @@
1
1
  import { d as isBooleanValue, f as isNumberValue, m as isStringValue, u as parseJsonText } from "./src-X9phtB2j.js";
2
- import "./src-DHiDJQDy.js";
2
+ import "./src-WCbabvdS.js";
3
3
  import { t as ReviewInputError } from "./input-error-OLgB_h31.js";
4
- import { d as selectReviewInstance, i as healthyReviewInstance, n as ReviewInstanceUnavailableError, u as reviewInstanceUnavailable } from "./desktop-discovery-DK2HoBy5.js";
4
+ import { d as selectReviewInstance, i as healthyReviewInstance, n as ReviewInstanceUnavailableError, u as reviewInstanceUnavailable } from "./desktop-discovery-C-Qz54wO.js";
5
5
  import { a as reviewServerIsHealthy, n as readReviewServerDiscovery, o as reviewServerStateDir, s as serverNotReady } from "./server-discovery-Dbzn3w6Z.js";
6
6
  //#region ../review-protocol/src/review-api-client.ts
7
7
  const defaultRequest = (url, init) => fetch(url, init);
@@ -1,5 +1,5 @@
1
- import { g as activityUpdateSchema, h as activityEndSchema, i as commandSchema, m as activityBeginSchema, n as uploadSchema } from "./local-data-D-EoJfPx.js";
2
- import { x as publishedEditSchema, y as pathTargetSchema } from "./stored-document-migration-T9Uj5MkN.js";
1
+ import { g as activityUpdateSchema, h as activityEndSchema, i as commandSchema, m as activityBeginSchema, n as uploadSchema } from "./local-data-BfAaQmqC.js";
2
+ import { x as publishedEditSchema, y as pathTargetSchema } from "./stored-document-migration-BxZWQQjv.js";
3
3
  import { t as ReviewInputError } from "./input-error-OLgB_h31.js";
4
4
  import { t as findReviewPackageRoot } from "./package-paths-B6-zxvIO.js";
5
5
  import { z } from "zod";
@@ -1 +1 @@
1
- {"version":"0.2.3","commit":"29a00b6b1c647529bfe19e0571cae2336a44356b","dirty":true,"builtAt":"2026-10-08T14:23:04.864Z"}
1
+ {"version":"0.2.4-preview.20261009.108","commit":"449d5ddd42bb5bd075544be06a5dd3ff5826ab52","dirty":true,"builtAt":"2026-10-09T02:49:52.008Z"}
@@ -1,4 +1,4 @@
1
- import { r as connectReviewApi } from "./agent-client-DoaODH6I.js";
1
+ import { r as connectReviewApi } from "./agent-client-B_b1GtUc.js";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { z } from "zod";
4
4
  //#region src/sharing/cli.ts
@@ -1,19 +1,19 @@
1
1
  import { C as __commonJSMin, S as setLocalVcsCommandObserver, T as __toESM, w as __require } from "./src-CmdiBL20.js";
2
2
  import { c as jsonString, n as isJsonObject, u as parseJsonText } from "./src-X9phtB2j.js";
3
- import { a as parseReviewVerbResponse } from "./src-DHiDJQDy.js";
3
+ import { a as parseReviewVerbResponse } from "./src-WCbabvdS.js";
4
4
  import { $ as emitJsonEvent, G as readStoreAuth, H as DEFAULT_STORE_ORIGIN, J as runStoreLogout, N as requireTraceConsent, P as resolveTraceRepositoryTarget, Q as withStoreAuthorization, V as readTraceUserConfig, X as StoreApiError, Y as runStoreWhoami, Z as StoreClient, b as selectTraceStorage, et as failWithJsonError, g as describeSelection, nt as jsonRequestedInArgv, q as runStoreLogin, tt as humanStream, v as loadS3TraceStorage } from "./review-agent-traces-DNJFYzc8.js";
5
- import { o as ReviewApiClient, s as ReviewApiError } from "./agent-client-DoaODH6I.js";
5
+ import { o as ReviewApiClient, s as ReviewApiError } from "./agent-client-B_b1GtUc.js";
6
6
  import { t as resolveReviewRoot } from "./runtime-CKiWhGrf.js";
7
7
  import { A as devReviewHome, C as s3ProfileSchema, D as processIsAlive, E as writeTraceConfigFile, S as readTraceConfigFile, T as sameS3Profile, _ as emptyTraceConfig, c as resolveS3Setup, g as currentStore, h as TraceConfigurationError, i as isS3MockMode, j as normalizeStoreOrigin, k as DEV_REVIEW_HOME_ENV, n as clearTraceEnvCache, o as readTraceEnvFile, p as traceSettingsPath, w as s3Store } from "./s3-config-CAxhO9u_.js";
8
8
  import { t as errorMessage } from "./error-message-OtiDonty.js";
9
9
  import { A as runTraceSessions, D as runTraceAllow, E as traceMachineStatus, G as traceScope, H as resolveTraceCommand, I as traceRepositoryStatus, L as HOSTED_CAPTURE_SCOPE_DESCRIPTION, M as runTraceStoreInfo, O as runTraceDeny, T as traceMachineEnabled, W as traceHomeDir, _ as runTraceRepair, b as runTraceGitHook, c as registerTraceCommands, d as runTraceList$1, f as runTracePull$1, g as runTraceInstallMachine, h as runTraceEnable, j as runTraceStoreDelete, k as runTraceOnboard, l as resolveTraceReadStorage, m as runTraceDisable, p as runTraceShow, u as runTraceBlame, v as runTraceStatus, w as readLegacyCaptureSettings, x as runTraceHook, y as runTraceSync } from "./review-home-paths-6zZH-1c9.js";
10
10
  import { i as readReviewPackageVersion, r as readBuildInfo, t as findReviewPackageRoot } from "./package-paths-B6-zxvIO.js";
11
- import { a as readDefaultReviewInstance, d as selectReviewInstance, f as writeDefaultReviewInstance, i as healthyReviewInstance, l as reviewInstanceStartHint, n as ReviewInstanceUnavailableError, o as readReviewInstances, r as clearDefaultReviewInstance, s as requireHealthyReviewDesktop, t as REVIEW_INSTANCE_ENV, u as reviewInstanceUnavailable } from "./desktop-discovery-DK2HoBy5.js";
12
- import { t as ReviewTelemetry } from "./review-telemetry-Pp4ZsVrh.js";
13
- import { a as isOwnedShim, f as windowsInstallerCommand, m as connectPrompts, o as pathShimPath, p as scanLegacySkills, t as aliasInstallationToAccount } from "./account-alias-DLE9XZhi.js";
11
+ import { a as readDefaultReviewInstance, d as selectReviewInstance, f as writeDefaultReviewInstance, i as healthyReviewInstance, l as reviewInstanceStartHint, n as ReviewInstanceUnavailableError, o as readReviewInstances, r as clearDefaultReviewInstance, s as requireHealthyReviewDesktop, t as REVIEW_INSTANCE_ENV, u as reviewInstanceUnavailable } from "./desktop-discovery-C-Qz54wO.js";
12
+ import { t as ReviewTelemetry } from "./review-telemetry-DBy3eVCo.js";
13
+ import { a as isOwnedShim, f as windowsInstallerCommand, m as connectPrompts, o as pathShimPath, p as scanLegacySkills, t as aliasInstallationToAccount } from "./account-alias-_1_7vROx.js";
14
14
  import { t as fuzzyRank } from "./fuzzy-match-BoAmcyak.js";
15
15
  import { n as readReviewServerDiscovery, o as reviewServerStateDir, r as readReviewServerHealth, s as serverNotReady } from "./server-discovery-Dbzn3w6Z.js";
16
- import { t as reviewAgentCliHelp } from "./agent-cli-DRRQfHQ-.js";
16
+ import { t as reviewAgentCliHelp } from "./agent-cli-BYMMEOlO.js";
17
17
  import { closeSync, existsSync, fstatSync, mkdirSync, mkdtempSync, openSync, readSync, renameSync, writeFileSync } from "node:fs";
18
18
  import { realpath } from "node:fs/promises";
19
19
  import path from "node:path";
@@ -4495,7 +4495,7 @@ async function runReviewCli(input) {
4495
4495
  process.once("SIGINT", stop);
4496
4496
  process.once("SIGTERM", stop);
4497
4497
  try {
4498
- const { runHeadlessServer } = await import("./headless-host-Dd_-zkC4.js");
4498
+ const { runHeadlessServer } = await import("./headless-host-wMPUx0Aj.js");
4499
4499
  await runHeadlessServer({
4500
4500
  stateDir,
4501
4501
  port,
@@ -4546,7 +4546,7 @@ async function runReviewCli(input) {
4546
4546
  if (problem) throw new Error(`Cannot tell whether a Whiteboard Desktop is using ${stateDir}: ${problem.message}`);
4547
4547
  const inUse = () => /* @__PURE__ */ new Error(`A Whiteboard server is using ${stateDir}. Stop it first, then run whiteboard server reset-id again.`);
4548
4548
  if (desktops.instances.some(({ discovery }) => [discovery.appPid, discovery.serverPid].some((pid) => processIsAlive(pid)))) throw inUse();
4549
- const [{ openReviewProfile }, { withHeadlessServerLock }] = await Promise.all([import("./profile-Cqztt-9-.js"), import("./headless-host-Dd_-zkC4.js")]);
4549
+ const [{ openReviewProfile }, { withHeadlessServerLock }] = await Promise.all([import("./profile-YLwWPRQp.js"), import("./headless-host-wMPUx0Aj.js")]);
4550
4550
  const reset = await withHeadlessServerLock(await realpath(stateDir), async () => {
4551
4551
  const local = await openReviewProfile(stateDir, { manageWorkspaces: false });
4552
4552
  try {
@@ -4686,14 +4686,14 @@ async function runReviewCli(input) {
4686
4686
  command.showHelpAfterError(false).error("Markdown review migration is no longer supported. Ask your agent to migrate your old Whiteboard reviews.");
4687
4687
  });
4688
4688
  configureJsonOutput(configureJsonOutput(program.command("share").description("Upload an immutable review snapshot and return its share link"), "plain").option("--review <id>", "review ID").option("--version <number>", "Saved version to share").option("--preview", "Open the share link in Whiteboard Preview by default").option("--request-id <uuid>", "Reuse this ID when retrying the same immutable upload").action(async (options) => {
4689
- const { runShareCli } = await import("./cli-DtolttUF.js");
4689
+ const { runShareCli } = await import("./cli-gRGxkwc0.js");
4690
4690
  state.exitCode = await runShareCli({
4691
4691
  ...input,
4692
4692
  ...options,
4693
4693
  env: authoringEnv()
4694
4694
  });
4695
4695
  }).command("revoke <share-id>").description("Revoke future downloads of a share"), "plain").action(async (shareId, options) => {
4696
- const { runShareCli } = await import("./cli-DtolttUF.js");
4696
+ const { runShareCli } = await import("./cli-gRGxkwc0.js");
4697
4697
  state.exitCode = await runShareCli({
4698
4698
  ...input,
4699
4699
  ...options,
@@ -4774,7 +4774,7 @@ async function runReviewCli(input) {
4774
4774
  return commands;
4775
4775
  } });
4776
4776
  for (const [name, description] of [["api", "Call a JSON review authoring tool on the running server"], ["mcp", "Serve the JSON review authoring tools over stdio MCP"]]) configureOutput(program.command(name).description(description).argument("[args...]", "tool name and JSON input").allowUnknownOption().allowExcessArguments().helpOption(false).passThroughOptions().addHelpText("after", `\n${reviewAgentCliHelp}`), "plain").action(async (args) => {
4777
- const { runReviewAgentCli } = await import("./agent-cli-50KJgMKi.js");
4777
+ const { runReviewAgentCli } = await import("./agent-cli-BJ_SxT1P.js");
4778
4778
  state.exitCode = await runReviewAgentCli({
4779
4779
  ...input,
4780
4780
  env: authoringEnv(),
package/dist/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { a as jsonNumber, c as jsonString, o as jsonObject, u as parseJsonText } from "./src-X9phtB2j.js";
3
- import "./src-DHiDJQDy.js";
3
+ import "./src-WCbabvdS.js";
4
4
  import { existsSync, readFileSync, readdirSync, realpathSync } from "node:fs";
5
5
  import path from "node:path";
6
6
  import os from "node:os";
@@ -17,7 +17,7 @@ async function runCli(effectivePath) {
17
17
  `);
18
18
  return 1;
19
19
  }
20
- const { runReviewCli } = await import("./cli-runner-Cwg5PeH2.js");
20
+ const { runReviewCli } = await import("./cli-runner-CyBLX8Oj.js");
21
21
  return runReviewCli({
22
22
  argv,
23
23
  cliPaths: {
@@ -1,7 +1,7 @@
1
1
  import { d as gitAt } from "./src-CmdiBL20.js";
2
2
  import { n as isJsonObject, u as parseJsonText } from "./src-X9phtB2j.js";
3
- import "./src-DHiDJQDy.js";
4
- import { B as parseMarkdown, C as resourceReferences, E as sourceReferences, K as sourceAnchors, M as lensSchema, N as lensSelections, O as checkReferences, S as resourceReference, _ as hasCodeReferences, b as pinsSchema, c as traceSchema, h as elements, l as textIncludesQuote, n as migrateStoredDocument, o as normalizedSoftwareElementSchema, p as documentSchema, r as migrateStoredLenses, s as normalizedSoftwareRelationshipSchema, t as liftFileLenses, u as anchorPins, z as markdownNodes } from "./stored-document-migration-T9Uj5MkN.js";
3
+ import "./src-WCbabvdS.js";
4
+ import { B as parseMarkdown, C as resourceReferences, E as sourceReferences, K as sourceAnchors, M as lensSchema, N as lensSelections, O as checkReferences, S as resourceReference, _ as hasCodeReferences, b as pinsSchema, c as traceSchema, h as elements, l as textIncludesQuote, n as migrateStoredDocument, o as normalizedSoftwareElementSchema, p as documentSchema, r as migrateStoredLenses, s as normalizedSoftwareRelationshipSchema, t as liftFileLenses, u as anchorPins, z as markdownNodes } from "./stored-document-migration-BxZWQQjv.js";
5
5
  import { t as ReviewInputError } from "./input-error-OLgB_h31.js";
6
6
  import { createHash, randomUUID } from "node:crypto";
7
7
  import { z } from "zod";
@@ -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-DHiDJQDy.js";
2
+ import { n as parseReviewDesktopDiscovery } from "./src-WCbabvdS.js";
3
3
  import { a as reviewInstancesDir, o as reviewLegacyDiscoveryPath, r as reviewDevInstanceKey, t as reviewDefaultInstancePath } from "./review-home-paths-6zZH-1c9.js";
4
4
  import { mkdir, readFile, readdir, rm, writeFile } from "node:fs/promises";
5
5
  import path from "node:path";
@@ -1,8 +1,8 @@
1
1
  import { p as isObjectValue } from "./src-X9phtB2j.js";
2
2
  import { O as withFileLock, P as writePrivateJsonAtomic } from "./s3-config-CAxhO9u_.js";
3
3
  import "./review-home-paths-6zZH-1c9.js";
4
- import { t as openReviewProfile } from "./profile-WzZu7Spt.js";
5
- import { i as createWhiteboardCore, l as createNodeRequestListener, m as migrateDiffrConfig, n as installProcessErrorTelemetry, p as GlobalReviewDesktopVerbRelay, t as drainServerCrashReport } from "./process-error-telemetry-mzRG988B.js";
4
+ import { t as openReviewProfile } from "./profile-CviK33_F.js";
5
+ import { i as createWhiteboardCore, l as createNodeRequestListener, m as migrateDiffrConfig, n as installProcessErrorTelemetry, p as GlobalReviewDesktopVerbRelay, t as drainServerCrashReport } from "./process-error-telemetry-WjZ2FTnX.js";
6
6
  import { i as reviewServerDiscoveryPath, t as headlessServerLockPath } from "./server-discovery-Dbzn3w6Z.js";
7
7
  import { randomBytes, randomUUID } from "node:crypto";
8
8
  import { mkdir, realpath, rm } from "node:fs/promises";
@@ -1,7 +1,7 @@
1
1
  import { _ as readFileAtCommit, b as resolveRevision, c as diffTrees, f as gitCommonDir, g as parseGitRemote, h as listTrackedFilesAtCommit, i as diff, l as diffWorkingTree, m as listCommitRange, n as createBlobBatchReader, o as diffFileSummariesTrees, p as jjRevisionIsConflicted, r as detectLocalVcs, s as diffFileSummariesWorkingTree, t as LocalVcsToolsMissingError, u as git, v as resolveRepoContext, y as resolveRepoContextSync } from "./src-CmdiBL20.js";
2
2
  import { c as jsonString, o as jsonObject, u as parseJsonText } from "./src-X9phtB2j.js";
3
- import { _ as SCRATCHPAD_REVIEW_ID, b as structuralChangeCounts, g as ReviewSelectedDiffSchema, m as ReviewApiSelectionSourceSchema, y as decodeStructuralDiffEvent } from "./src-DHiDJQDy.js";
4
- import { $ as unionIntervals, A as applyLensEdit, C as resourceReferences, D as summarizeEdit, E as sourceReferences, F as checkSourcePath, I as fileLineRangeSchema, K as sourceAnchors, L as requireVisibleSource, N as lensSelections, O as checkReferences, P as SourceRangeError, Q as subtractIntervals, R as sliceSourceRange, S as resourceReference, X as intersectIntervals, Y as emptyCoverage, a as defineSoftwareMap, b as pinsSchema, c as traceSchema, d as applyEdit, et as updateCoverage, f as assignFreshIds, g as explicitPins, h as elements, i as SoftwareModelValidationError, j as lensEditSchema, l as textIncludesQuote, m as editSchema, n as migrateStoredDocument, p as documentSchema, q as coverageSchema, r as migrateStoredLenses, t as liftFileLenses, u as anchorPins, v as isUnit, w as reviewTargetSchema } from "./stored-document-migration-T9Uj5MkN.js";
3
+ import { _ as SCRATCHPAD_REVIEW_ID, b as structuralChangeCounts, g as ReviewSelectedDiffSchema, m as ReviewApiSelectionSourceSchema, y as decodeStructuralDiffEvent } from "./src-WCbabvdS.js";
4
+ import { $ as unionIntervals, A as applyLensEdit, C as resourceReferences, D as summarizeEdit, E as sourceReferences, F as checkSourcePath, I as fileLineRangeSchema, K as sourceAnchors, L as requireVisibleSource, N as lensSelections, O as checkReferences, P as SourceRangeError, Q as subtractIntervals, R as sliceSourceRange, S as resourceReference, X as intersectIntervals, Y as emptyCoverage, a as defineSoftwareMap, b as pinsSchema, c as traceSchema, d as applyEdit, et as updateCoverage, f as assignFreshIds, g as explicitPins, h as elements, i as SoftwareModelValidationError, j as lensEditSchema, l as textIncludesQuote, m as editSchema, n as migrateStoredDocument, p as documentSchema, q as coverageSchema, r as migrateStoredLenses, t as liftFileLenses, u as anchorPins, v as isUnit, w as reviewTargetSchema } from "./stored-document-migration-BxZWQQjv.js";
5
5
  import { t as ReviewInputError } from "./input-error-OLgB_h31.js";
6
6
  import { D as processIsAlive, O as withFileLock, P as writePrivateJsonAtomic } from "./s3-config-CAxhO9u_.js";
7
7
  import { t as errorMessage } from "./error-message-OtiDonty.js";
@@ -18,7 +18,7 @@ import { execFile, spawn } from "node:child_process";
18
18
  import { promisify } from "node:util";
19
19
  import { DatabaseSync } from "node:sqlite";
20
20
  import { createInterface } from "node:readline";
21
- //#region ../../node_modules/@dev.fast/diffr/dist/binary.js
21
+ //#region ../../diffr/diffr-ts/dist/binary.js
22
22
  /** The diffr executable from the installed platform package, if npm installed one for this machine. */
23
23
  function diffrBinaryPath() {
24
24
  const name = process.platform === "win32" ? "diffr.exe" : "diffr";
@@ -462,7 +462,7 @@ async function* structuralDiff(input) {
462
462
  try {
463
463
  for await (const line of lines) {
464
464
  idle.refresh();
465
- if (Buffer.byteLength(line) > 67108864) throw new Error("Structural diff record exceeded 64 MiB.");
465
+ if (Buffer.byteLength(line) > 100663296) throw new Error("Structural diff record exceeded 96 MiB.");
466
466
  if (!line.trim()) continue;
467
467
  const event = decodeStructuralDiffEvent(line);
468
468
  if (completed) throw new Error("diffr emitted data after completion.");
@@ -1024,7 +1024,7 @@ async function comparisonCoverage(data, reviewId, pins, mode, signal, publish) {
1024
1024
  const path = (event.file.rhs ?? event.file.lhs).path;
1025
1025
  if (!remaining.delete(path)) throw new Error(`Unexpected structural result: ${path}`);
1026
1026
  if (event.error) {
1027
- if (event.error.code !== "unsupported_file_type") throw new Error(`Cannot count ${path}: ${event.error.message}`);
1027
+ if (event.error.code !== "unsupported_file_type" && event.error.code !== "not_utf8") throw new Error(`Cannot count ${path}: ${event.error.message}`);
1028
1028
  if (!remaining.size) break;
1029
1029
  continue;
1030
1030
  }
@@ -1,7 +1,7 @@
1
- import { a as toolResultText, s as ReviewApiError } from "./agent-client-DoaODH6I.js";
1
+ import { a as toolResultText, s as ReviewApiError } from "./agent-client-B_b1GtUc.js";
2
2
  import { t as ReviewInputError } from "./input-error-OLgB_h31.js";
3
- import { n as REVIEW_STATUS_TOOL, t as authoringTools } from "./authoring-tools-F_q8cC7J.js";
4
- import { i as publicTool, n as RECOVERY, r as callPublicTool, t as toolFailure } from "./tool-failure-Djeeax6q.js";
3
+ import { n as REVIEW_STATUS_TOOL, t as authoringTools } from "./authoring-tools-CUJ_56bd.js";
4
+ import { i as publicTool, n as RECOVERY, r as callPublicTool, t as toolFailure } from "./tool-failure-DJmTieh5.js";
5
5
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
6
6
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
7
  import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
@@ -1,16 +1,16 @@
1
1
  import { c as jsonString, m as isStringValue, n as isJsonObject, u as parseJsonText } from "./src-X9phtB2j.js";
2
- import { a as sharedReviewId, c as verifyShareRepository, d as StreamLimitError, f as readBoundedStream, l as exportShare, m as shareIdSchema, n as ShareClient, p as parseShareLink, r as SharePreflightError, s as readShareRepository, t as ShareAuthError, u as validateShareSources } from "./client-D01H2KOV.js";
3
- import { _ as invalidateStructuralComparisons, a as inspectSnapshot, c as askAgentIds, d as askQuestionSchema, f as AgentSelectionSchema, i as commandSchema, l as askChoiceKinds, p as selectionMarkdown, r as SCRATCHPAD_ID, s as applyAskChange, u as askPicksSchema, v as diffrExecutable, y as diffrMissingError } from "./local-data-D-EoJfPx.js";
4
- import { d as REVIEW_CLIENT_REMOTE, i as parseReviewVerbRequest, r as parseReviewDesktopVerbResult, u as REVIEW_CLIENT_HEADER, v as reviewDiffrSummarizerInputSchema, y as decodeStructuralDiffEvent } from "./src-DHiDJQDy.js";
2
+ import { a as sharedReviewId, c as verifyShareRepository, d as StreamLimitError, f as readBoundedStream, l as exportShare, m as shareIdSchema, n as ShareClient, p as parseShareLink, r as SharePreflightError, s as readShareRepository, t as ShareAuthError, u as validateShareSources } from "./client-BFClfQLO.js";
3
+ import { _ as invalidateStructuralComparisons, a as inspectSnapshot, c as askAgentIds, d as askQuestionSchema, f as AgentSelectionSchema, i as commandSchema, l as askChoiceKinds, p as selectionMarkdown, r as SCRATCHPAD_ID, s as applyAskChange, u as askPicksSchema, v as diffrExecutable, y as diffrMissingError } from "./local-data-BfAaQmqC.js";
4
+ import { d as REVIEW_CLIENT_REMOTE, i as parseReviewVerbRequest, r as parseReviewDesktopVerbResult, u as REVIEW_CLIENT_HEADER, v as reviewDiffrSummarizerInputSchema, y as decodeStructuralDiffEvent } from "./src-WCbabvdS.js";
5
5
  import { C as TraceStorageDeniedError, G as readStoreAuth, H as DEFAULT_STORE_ORIGIN, U as clearStoreAuth, W as openUrlInBrowser, _ as isTraceStorageConfigured, b as selectTraceStorage, o as listReviewTraceSessions, q as runStoreLogin, s as loadReviewAgentTrace, y as resolveTraceStorage } from "./review-agent-traces-DNJFYzc8.js";
6
- import { $ as unionIntervals, G as selectionKey, H as comparisonKey, I as fileLineRangeSchema, J as coverageSources, N as lensSelections, Q as subtractIntervals, T as selectionReferences, U as formatAnchor, V as anchorSelection, W as resolveDiffSelection, Y as emptyCoverage, Z as scopedCoverage, h as elements, k as UNCATEGORIZED_LENS_ID, u as anchorPins } from "./stored-document-migration-T9Uj5MkN.js";
6
+ import { $ as unionIntervals, G as selectionKey, H as comparisonKey, I as fileLineRangeSchema, J as coverageSources, N as lensSelections, Q as subtractIntervals, T as selectionReferences, U as formatAnchor, V as anchorSelection, W as resolveDiffSelection, Y as emptyCoverage, Z as scopedCoverage, h as elements, k as UNCATEGORIZED_LENS_ID, u as anchorPins } from "./stored-document-migration-BxZWQQjv.js";
7
7
  import { t as ReviewInputError } from "./input-error-OLgB_h31.js";
8
8
  import { A as devReviewHome, h as TraceConfigurationError, i as isS3MockMode } from "./s3-config-CAxhO9u_.js";
9
9
  import { t as errorMessage } from "./error-message-OtiDonty.js";
10
10
  import { T as traceMachineEnabled } from "./review-home-paths-6zZH-1c9.js";
11
11
  import { i as readReviewPackageVersion, n as readBuildCommit } from "./package-paths-B6-zxvIO.js";
12
- import { a as REVIEW_APP_SESSION_ID_HEADER, c as sanitizeUiTelemetryEvent, i as BUNDLE_FRAME_PATTERN, l as cleanTelemetryText, r as reviewRequestOrigin, s as isReportableCleanedMessage } from "./request-origin-DlHTFCrQ.js";
13
- import { a as scratchpadAvailable, c as readQuerySchemas, i as renderInstructions, o as inspectQuerySchema, r as instructionsQuerySchema, s as queryAnchor, t as authoringTools } from "./authoring-tools-F_q8cC7J.js";
12
+ import { a as REVIEW_APP_SESSION_ID_HEADER, c as sanitizeUiTelemetryEvent, i as BUNDLE_FRAME_PATTERN, l as cleanTelemetryText, r as reviewRequestOrigin, s as isReportableCleanedMessage } from "./request-origin-DA4K1qWY.js";
13
+ import { a as scratchpadAvailable, c as readQuerySchemas, i as renderInstructions, o as inspectQuerySchema, r as instructionsQuerySchema, s as queryAnchor, t as authoringTools } from "./authoring-tools-CUJ_56bd.js";
14
14
  import { t as fuzzyRank } from "./fuzzy-match-BoAmcyak.js";
15
15
  import { createRequire } from "node:module";
16
16
  import crypto$1, { createHash, randomUUID } from "node:crypto";
@@ -49,7 +49,7 @@ function diffrArgv(args) {
49
49
  case "set": return [
50
50
  "config",
51
51
  "set",
52
- "--stdin",
52
+ "-",
53
53
  "--json"
54
54
  ];
55
55
  case "migrate": return [
@@ -3294,7 +3294,10 @@ function createReviewApi(store, data, open, shared, capabilities = () => ({
3294
3294
  const input = progressUpdateSchema.parse(await readBoundedRequestJson(context.req.raw));
3295
3295
  const id = context.req.param("id");
3296
3296
  const snapshot = store.read(id);
3297
- const progress = await reviewProgress(store, data, snapshot, context.req.raw.signal, input.mode);
3297
+ const pins = snapshot.pins ? (await data.resolveSource(snapshot)).pins : void 0;
3298
+ const coverage = pins && data.coverageSnapshot(id, pins, input.mode);
3299
+ const partial = coverage && coverage.pending ? coverage.comparison : void 0;
3300
+ const progress = await reviewProgress(store, data, snapshot, context.req.raw.signal, input.mode, partial);
3298
3301
  const files = input.files.map((update) => {
3299
3302
  const file = progress.files.find((file) => file.path === update.path);
3300
3303
  if (!file || file.fingerprint !== update.fingerprint) throw new ReviewInputError("This file changed. Reload before marking it viewed.", 409);
@@ -3306,7 +3309,7 @@ function createReviewApi(store, data, open, shared, capabilities = () => ({
3306
3309
  });
3307
3310
  if (store.read(id).version !== snapshot.version) throw new ReviewInputError("Review changed during this update. Try again.", 409);
3308
3311
  store.updateViewedCoverage(id, files, input.viewed);
3309
- return context.json(await reviewProgress(store, data, store.read(id, input.version), context.req.raw.signal, input.mode));
3312
+ return context.json(await reviewProgress(store, data, store.read(id, input.version), context.req.raw.signal, input.mode, partial));
3310
3313
  });
3311
3314
  app.get("/:id/lenses", async (context) => {
3312
3315
  if (!data) throw new ReviewInputError("Source data is unavailable.", 409);
@@ -1,4 +1,4 @@
1
- import { o as initializeReviewStoreSchema, t as openLocalReviewStore } from "./local-data-D-EoJfPx.js";
1
+ import { o as initializeReviewStoreSchema, t as openLocalReviewStore } from "./local-data-BfAaQmqC.js";
2
2
  import { O as withFileLock } from "./s3-config-CAxhO9u_.js";
3
3
  import "./review-home-paths-6zZH-1c9.js";
4
4
  import { access, mkdir } from "node:fs/promises";
@@ -0,0 +1,2 @@
1
+ import { t as openReviewProfile } from "./profile-CviK33_F.js";
2
+ export { openReviewProfile };
@@ -1,5 +1,5 @@
1
1
  import { a as jsonNumber, c as jsonString, i as jsonBoolean, n as isJsonObject } from "./src-X9phtB2j.js";
2
- import { f as REVIEW_DIFF_LAYOUTS, p as REVIEW_THEME_CHOICES } from "./src-DHiDJQDy.js";
2
+ import { f as REVIEW_DIFF_LAYOUTS, p as REVIEW_THEME_CHOICES } from "./src-WCbabvdS.js";
3
3
  import { z } from "zod";
4
4
  //#region src/telemetry-clean-text.ts
5
5
  const USER_DATA_REGEXES = [
@@ -1,9 +1,9 @@
1
1
  import { c as jsonString, l as jsonValueSchema, o as jsonObject, u as parseJsonText } from "./src-X9phtB2j.js";
2
- import "./src-DHiDJQDy.js";
2
+ import "./src-WCbabvdS.js";
3
3
  import { A as devReviewHome, D as processIsAlive, M as writeFileAtomic, O as withFileLock } from "./s3-config-CAxhO9u_.js";
4
4
  import "./review-home-paths-6zZH-1c9.js";
5
5
  import { i as readReviewPackageVersion, t as findReviewPackageRoot } from "./package-paths-B6-zxvIO.js";
6
- import "./request-origin-DlHTFCrQ.js";
6
+ import "./request-origin-DA4K1qWY.js";
7
7
  import { createHmac, randomUUID } from "node:crypto";
8
8
  import { z } from "zod";
9
9
  import { existsSync, readFileSync, rmSync } from "node:fs";
@@ -1,20 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import { a as diffFileSummaries, b as resolveRevision, i as diff, x as splitGitPatchFiles } from "../src-CmdiBL20.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 { i as SharedReviewStore } from "../client-D01H2KOV.js";
5
- import { c as ReviewBugReportRequestSchema, l as parseReviewBugReportResponse, o as parseZod, s as ReviewBugReportMetaV2Schema, t as parseReviewCliInstallApplyRequest, v as reviewDiffrSummarizerInputSchema } from "../src-DHiDJQDy.js";
6
- import { C as resourceReferences, p as documentSchema } from "../stored-document-migration-T9Uj5MkN.js";
4
+ import { i as SharedReviewStore } from "../client-BFClfQLO.js";
5
+ import { c as ReviewBugReportRequestSchema, l as parseReviewBugReportResponse, o as parseZod, s as ReviewBugReportMetaV2Schema, t as parseReviewCliInstallApplyRequest, v as reviewDiffrSummarizerInputSchema } from "../src-WCbabvdS.js";
6
+ import { C as resourceReferences, p as documentSchema } from "../stored-document-migration-BxZWQQjv.js";
7
7
  import { t as ReviewInputError } from "../input-error-OLgB_h31.js";
8
8
  import { A as devReviewHome, P as writePrivateJsonAtomic } from "../s3-config-CAxhO9u_.js";
9
9
  import { U as shellQuote, i as reviewInstanceDiscoveryPath, o as reviewLegacyDiscoveryPath } from "../review-home-paths-6zZH-1c9.js";
10
10
  import { i as readReviewPackageVersion, t as findReviewPackageRoot } from "../package-paths-B6-zxvIO.js";
11
- import { c as reviewInstanceIdentity, t as REVIEW_INSTANCE_ENV } from "../desktop-discovery-DK2HoBy5.js";
12
- import { t as openReviewProfile } from "../profile-WzZu7Spt.js";
13
- import { r as reviewTelemetryChannel, t as ReviewTelemetry } from "../review-telemetry-Pp4ZsVrh.js";
14
- import { o as REVIEW_TELEMETRY_TABS } from "../request-origin-DlHTFCrQ.js";
15
- import { c as removeLegacyReviewSkills, d as skipCliInstall, i as finishCliInstallUpdate, l as resetCliInstall, n as applyCliInstall, r as declineCliInstall, s as removeCliInstall, t as aliasInstallationToAccount, u as resolveCliInstallStatus } from "../account-alias-DLE9XZhi.js";
16
- import { _ as setDiffrConfigValue, a as serverJson, c as recordClientError, d as HttpJsonError, f as ReviewServerError, g as saveDiffrSummarizer, h as readDiffrConfig, i as createWhiteboardCore, l as createNodeRequestListener, m as migrateDiffrConfig, n as installProcessErrorTelemetry, o as captureSanitizedUiTelemetry, p as GlobalReviewDesktopVerbRelay, r as serverCrashReportPath, s as clientErrorsForSession, t as drainServerCrashReport, u as readBoundedRequestJson, v as testDiffrSummarizer } from "../process-error-telemetry-mzRG988B.js";
17
- import { c as readQuerySchemas } from "../authoring-tools-F_q8cC7J.js";
11
+ import { c as reviewInstanceIdentity, t as REVIEW_INSTANCE_ENV } from "../desktop-discovery-C-Qz54wO.js";
12
+ import { t as openReviewProfile } from "../profile-CviK33_F.js";
13
+ import { r as reviewTelemetryChannel, t as ReviewTelemetry } from "../review-telemetry-DBy3eVCo.js";
14
+ import { o as REVIEW_TELEMETRY_TABS } from "../request-origin-DA4K1qWY.js";
15
+ import { c as removeLegacyReviewSkills, d as skipCliInstall, i as finishCliInstallUpdate, l as resetCliInstall, n as applyCliInstall, r as declineCliInstall, s as removeCliInstall, t as aliasInstallationToAccount, u as resolveCliInstallStatus } from "../account-alias-_1_7vROx.js";
16
+ import { _ as setDiffrConfigValue, a as serverJson, c as recordClientError, d as HttpJsonError, f as ReviewServerError, g as saveDiffrSummarizer, h as readDiffrConfig, i as createWhiteboardCore, l as createNodeRequestListener, m as migrateDiffrConfig, n as installProcessErrorTelemetry, o as captureSanitizedUiTelemetry, p as GlobalReviewDesktopVerbRelay, r as serverCrashReportPath, s as clientErrorsForSession, t as drainServerCrashReport, u as readBoundedRequestJson, v as testDiffrSummarizer } from "../process-error-telemetry-WjZ2FTnX.js";
17
+ import { c as readQuerySchemas } from "../authoring-tools-CUJ_56bd.js";
18
18
  import crypto, { createHash, randomBytes, randomUUID } from "node:crypto";
19
19
  import { z } from "zod";
20
20
  import fs, { existsSync } from "node:fs";
@@ -67,7 +67,7 @@ interface LocalVcsCommitSummary {
67
67
  deletions: number;
68
68
  }
69
69
  //#endregion
70
- //#region ../../node_modules/@dev.fast/diffr/dist/contract.d.ts
70
+ //#region ../../diffr/diffr-ts/dist/contract.d.ts
71
71
  /** A pairing always has at least one side; additions/deletions omit the other. */
72
72
  type StructuralPairing<T> = {
73
73
  lhs: T;
@@ -171,6 +171,8 @@ type StructuralRegion = {
171
171
  type StructuralNode = {
172
172
  kind: "leaf";
173
173
  alignment_id: number;
174
+ /** The partner leaf's `id` on the other side; absent when added or deleted. */
175
+ pair?: number;
174
176
  changed?: StructuralSpan[];
175
177
  } | {
176
178
  kind: "fold";
@@ -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-D01H2KOV.js";
1
+ import { a as sharedReviewId, c as verifyShareRepository, i as SharedReviewStore, l as exportShare, n as ShareClient, o as validateShareBundle } from "../client-BFClfQLO.js";
2
2
  export { ShareClient, SharedReviewStore, exportShare, sharedReviewId, validateShareBundle, verifyShareRepository };
@@ -1,7 +1,7 @@
1
1
  import { n as isJsonObject } from "./src-X9phtB2j.js";
2
2
  import { _ as ReviewAgentTraceEventSchema, v as ReviewAgentTraceSessionSchema } from "./src-CGP5ytbV.js";
3
3
  import { z } from "zod";
4
- //#region ../../node_modules/@dev.fast/diffr/dist/contract.js
4
+ //#region ../../diffr/diffr-ts/dist/contract.js
5
5
  /**
6
6
  * Mirrors crates/diffr-core/src/protocol/mod.rs and crates/diffr-core/src/pairing.rs. See ../README.md for sync checks.
7
7
  * Import only zod: Review embeds this file in generated source.
@@ -128,6 +128,7 @@ const StructuralRegionSchema = z.lazy(() => z.object({
128
128
  const StructuralNodeSchema = z.lazy(() => z.union([z.object({
129
129
  kind: z.literal("leaf"),
130
130
  alignment_id: structuralU32,
131
+ pair: structuralU32.optional(),
131
132
  changed: z.array(StructuralSpanSchema).optional()
132
133
  }), z.object({
133
134
  kind: z.literal("fold"),
@@ -158,7 +159,7 @@ const StructuralLineCountsSchema = z.lazy(() => z.object({
158
159
  removed: structuralU32
159
160
  }));
160
161
  //#endregion
161
- //#region ../../node_modules/@dev.fast/diffr/dist/stream.js
162
+ //#region ../../diffr/diffr-ts/dist/stream.js
162
163
  function decodeStructuralDiffEvent(line) {
163
164
  try {
164
165
  return StructuralDiffEventSchema.parse(JSON.parse(line));
@@ -1,5 +1,5 @@
1
1
  import { f as isNumberValue, l as jsonValueSchema, m as isStringValue, n as isJsonObject } from "./src-X9phtB2j.js";
2
- import "./src-DHiDJQDy.js";
2
+ import "./src-WCbabvdS.js";
3
3
  import { t as ReviewInputError } from "./input-error-OLgB_h31.js";
4
4
  import { z } from "zod";
5
5
  import { fromMarkdown } from "mdast-util-from-markdown";
@@ -1,5 +1,5 @@
1
1
  import { m as isStringValue, n as isJsonObject } from "./src-X9phtB2j.js";
2
- import { n as callAuthoringTool, s as ReviewApiError, t as ToolText } from "./agent-client-DoaODH6I.js";
2
+ import { n as callAuthoringTool, s as ReviewApiError, t as ToolText } from "./agent-client-B_b1GtUc.js";
3
3
  import { t as ReviewInputError } from "./input-error-OLgB_h31.js";
4
4
  //#region src/review-api/public-tools.ts
5
5
  function publicDescription(text) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dev.fast/whiteboard",
3
- "version": "0.2.3",
3
+ "version": "0.2.4-preview.20261009.108",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -43,7 +43,6 @@
43
43
  "@agentclientprotocol/claude-agent-acp": "0.84.0",
44
44
  "@agentclientprotocol/codex-acp": "2.0.0",
45
45
  "@agentclientprotocol/sdk": "1.5.1",
46
- "@dev.fast/diffr": "0.1.15",
47
46
  "@hono/node-server": "2.0.12",
48
47
  "@img/sharp-wasm32": "0.35.5",
49
48
  "@modelcontextprotocol/sdk": "1.31.0",
@@ -59,7 +58,8 @@
59
58
  "semver": "7.8.5",
60
59
  "sharp": "0.35.5",
61
60
  "smol-toml": "1.9.0",
62
- "zod": "4.6.5"
61
+ "zod": "4.6.5",
62
+ "@dev.fast/diffr": "0.1.17"
63
63
  },
64
64
  "devDependencies": {
65
65
  "@dev.fast/local-vcs": "^0.1.0",
@@ -71,10 +71,10 @@
71
71
  "tsx": "4.21.0",
72
72
  "typescript": "6.0.3",
73
73
  "vitest": "4.1.11",
74
- "@dev.fast/json": "0.0.0",
75
74
  "@dev.fast/review-protocol": "0.0.0",
76
75
  "@dev.fast/review-share-protocol": "0.1.2",
77
76
  "@dev.fast/trace-core": "0.0.0",
77
+ "@dev.fast/json": "0.0.0",
78
78
  "@dev.fast/trace-protocol": "0.5.0"
79
79
  },
80
80
  "engines": {
@@ -85,14 +85,14 @@
85
85
  "repo": "devdotfast/review",
86
86
  "docs": "packages/review/instructions/authoring.md"
87
87
  },
88
- "gitHead": "29a00b6b1c647529bfe19e0571cae2336a44356b",
88
+ "gitHead": "449d5ddd42bb5bd075544be06a5dd3ff5826ab52",
89
89
  "scripts": {
90
90
  "prebuild": "pnpm run build:workspace-deps",
91
91
  "build": "node --max-old-space-size=8192 node_modules/tsdown/dist/run.mjs",
92
92
  "build:tutorial-assets": "tsx scripts/build-tutorial-assets.ts",
93
93
  "ensure:tutorial-assets": "tsx scripts/ensure-tutorial-assets.ts",
94
94
  "check:tutorial": "tsx scripts/check-tutorial.ts",
95
- "build:workspace-deps": "pnpm --filter @dev.fast/json --filter @dev.fast/local-vcs --filter @dev.fast/review-protocol --filter @dev.fast/review-share-protocol --filter @dev.fast/trace-protocol --filter @dev.fast/trace-core build",
95
+ "build:workspace-deps": "pnpm --filter @dev.fast/diffr --filter @dev.fast/json --filter @dev.fast/local-vcs --filter @dev.fast/review-protocol --filter @dev.fast/review-share-protocol --filter @dev.fast/trace-protocol --filter @dev.fast/trace-core build",
96
96
  "pretypecheck": "pnpm run ensure:tutorial-assets",
97
97
  "pretest": "pnpm run ensure:tutorial-assets",
98
98
  "pretest:node": "pnpm run ensure:tutorial-assets",
@@ -166,7 +166,12 @@ export async function comparisonCoverage(
166
166
  throw new Error(`Unexpected structural result: ${path}`);
167
167
 
168
168
  if (event.error) {
169
- if (event.error.code !== "unsupported_file_type")
169
+ // Neither kind has line ranges to count. Keep the rest of the review
170
+ // available when a repository contains non-UTF-8 fixtures or links.
171
+ if (
172
+ event.error.code !== "unsupported_file_type" &&
173
+ event.error.code !== "not_utf8"
174
+ )
170
175
  throw new Error(`Cannot count ${path}: ${event.error.message}`);
171
176
 
172
177
  if (!remaining.size) break;
@@ -389,12 +389,22 @@ export function createReviewApi(
389
389
 
390
390
  const snapshot = store.read(id);
391
391
 
392
+ const pins = snapshot.pins
393
+ ? (await data.resolveSource(snapshot)).pins
394
+ : undefined;
395
+
396
+ const coverage = pins && data.coverageSnapshot(id, pins, input.mode);
397
+
398
+ const partial =
399
+ coverage && coverage.pending ? coverage.comparison : undefined;
400
+
392
401
  const progress = await reviewProgress(
393
402
  store,
394
403
  data,
395
404
  snapshot,
396
405
  context.req.raw.signal,
397
406
  input.mode,
407
+ partial,
398
408
  );
399
409
 
400
410
  const files = input.files.map((update) => {
@@ -427,6 +437,7 @@ export function createReviewApi(
427
437
  store.read(id, input.version),
428
438
  context.req.raw.signal,
429
439
  input.mode,
440
+ partial,
430
441
  ),
431
442
  );
432
443
  });
@@ -51,7 +51,7 @@ function diffrArgv(args: DiffrArguments): string[] {
51
51
  case "show":
52
52
  return ["config", "show", "--json", ...(args.reveal ? ["--reveal"] : [])];
53
53
  case "set":
54
- return ["config", "set", "--stdin", "--json"];
54
+ return ["config", "set", "-", "--json"];
55
55
  case "migrate":
56
56
  return ["config", "migrate", "--json"];
57
57
  case "diff":
@@ -108,8 +108,9 @@ export async function* structuralDiff(
108
108
 
109
109
  // Bound individual records, not the entire streamed comparison: a
110
110
  // directory move can legitimately contain thousands of small files.
111
- if (Buffer.byteLength(line) > 64 * 1024 * 1024)
112
- throw new Error("Structural diff record exceeded 64 MiB.");
111
+ // Generated parsers in diffr can exceed 64 MiB after JSON encoding.
112
+ if (Buffer.byteLength(line) > 96 * 1024 * 1024)
113
+ throw new Error("Structural diff record exceeded 96 MiB.");
113
114
 
114
115
  if (!line.trim()) continue;
115
116
  const event = decodeStructuralDiffEvent(line);
@@ -1,2 +0,0 @@
1
- import { n as runReviewAgentCli } from "./agent-cli-DRRQfHQ-.js";
2
- export { runReviewAgentCli };
@@ -1,2 +0,0 @@
1
- import { t as openReviewProfile } from "./profile-WzZu7Spt.js";
2
- export { openReviewProfile };