@dev.fast/whiteboard 0.3.4-preview.20261019.127 → 0.3.5-preview.20261020.130

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 (40) hide show
  1. package/dist/{account-alias-B5-HYi1D.js → account-alias-CMyXCuuq.js} +2 -2
  2. package/dist/{agent-cli-CohHf6Ua.js → agent-cli-CahKfDT0.js} +6 -6
  3. package/dist/agent-cli-CvYV2R6c.js +2 -0
  4. package/dist/{agent-client-Dtc-Kn_w.js → agent-client-D2RmE9NL.js} +3 -3
  5. package/dist/{authoring-tools-B7KU04f7.js → authoring-tools-BLhYKrNN.js} +3 -3
  6. package/dist/{background-server-CB9C4uoc.js → background-server-CFUU4VtN.js} +1 -1
  7. package/dist/{background-server-C03RKxKS.js → background-server-k4K_Hvh1.js} +2 -2
  8. package/dist/build-info.json +1 -1
  9. package/dist/{cli-CJaEb7zC.js → cli-BUVSMGud.js} +1 -1
  10. package/dist/{cli-runner-DGDIqh3V.js → cli-runner-C7W6VA94.js} +17 -17
  11. package/dist/cli.js +2 -2
  12. package/dist/{client-lKVF_Elo.js → client-B0f4EJ7v.js} +3 -3
  13. package/dist/{fuzzy-match-BmVJJm9I.js → fuzzy-match-BbaX-dGh.js} +2 -2
  14. package/dist/{headless-host-XhL1X4vX.js → headless-host-C7xYMe74.js} +12 -12
  15. package/dist/{headless-host-DRtjf9WA.js → headless-host-cYdlRYPB.js} +1 -1
  16. package/dist/{lens-selection-CyJapcsl.js → lens-selection-CAtsGaym.js} +1 -1
  17. package/dist/{local-data-Cpl4ENbJ.js → local-data-DrNSaiS5.js} +4 -4
  18. package/dist/{mcp-ovmiUE_x.js → mcp-yXnjUkOV.js} +4 -4
  19. package/dist/{profile-BadSkCkI.js → profile-BlqZlCPZ.js} +1 -1
  20. package/dist/profile-CGxNfeYQ.js +2 -0
  21. package/dist/{remote-attach-Dd-YobM6.js → remote-attach-CZTrtWIk.js} +3 -3
  22. package/dist/{remote-language-server-BXk87KCr.js → remote-language-server-BiPzol99.js} +1 -1
  23. package/dist/{remote-uninstall-DuOzsvaD.js → remote-uninstall-CFTkoioA.js} +3 -3
  24. package/dist/{request-origin-B9qCPiVB.js → request-origin--8lLCclv.js} +13 -5
  25. package/dist/{review-app-launcher-C7el2Uoy.js → review-app-launcher-KA2_mOeo.js} +2 -2
  26. package/dist/{review-telemetry-BsoRMC2w.js → review-telemetry-B2JniTIs.js} +2 -2
  27. package/dist/server/desktop-host.js +11 -11
  28. package/dist/{server-discovery-CKjw3-6h.js → server-discovery-CRXG48Uz.js} +1 -1
  29. package/dist/sharing/index.js +1 -1
  30. package/dist/{src-BiWNbcF_.js → src-CyYCvVHx.js} +2 -6
  31. package/dist/{stored-document-migration-dFbewRTG.js → stored-document-migration-B_BijGHF.js} +2 -2
  32. package/dist/{thread-state-Do5LX10I.js → thread-state-D6MlnGv7.js} +1 -1
  33. package/dist/{tool-failure-DvI-gys2.js → tool-failure-_makh_Sr.js} +2 -2
  34. package/instructions/authoring.md +15 -3
  35. package/package.json +6 -6
  36. package/src/review-api/authoring-tools.ts +1 -1
  37. package/src/review-api/mcp.ts +1 -1
  38. package/src/ui-telemetry-events.ts +11 -3
  39. package/dist/agent-cli-_YyMIMRY.js +0 -2
  40. package/dist/profile-DJvkBJNQ.js +0 -2
@@ -1,10 +1,10 @@
1
1
  import { n as isJsonObject } from "./src-X9phtB2j.js";
2
- import { E as ReviewCliInstallStampSchema } from "./src-BiWNbcF_.js";
2
+ import { E as ReviewCliInstallStampSchema } from "./src-CyYCvVHx.js";
3
3
  import { C as disableTraceMachine, E as traceMachineStatus, G as listTraceRepositoryRoots, K as traceRepositoryStatus, Q as removeAgentTraceHook, S as configureTraceMachine, T as traceMachineEnabled, U as disableAllTraceRepositories, W as enableTraceRepository, X as describeTraceHookOwners, Y as AGENT_TRACE_HOOK_AGENTS, Z as installHarnessHooks, at as readStoreAuth, n as reviewDesktopStateDir, nt as traceScope, ut as StoreClient } from "./review-home-paths-D8AoCdd2.js";
4
4
  import { I as writeFileAtomicAsync, L as writePrivateJsonAtomic, N as devReviewHome, j as withFileLock } from "./s3-config-CjcLyFV5.js";
5
5
  import { i as readReviewPackageVersion } from "./package-paths-BWxO-UEL.js";
6
6
  import { n as isFile, t as isDirectory } from "./fs-utils-BMPLt0cr.js";
7
- import { c as findExecutable, s as executableCommand } from "./fuzzy-match-BmVJJm9I.js";
7
+ import { c as findExecutable, s as executableCommand } from "./fuzzy-match-BbaX-dGh.js";
8
8
  import { createHash } from "node:crypto";
9
9
  import { constants } from "node:fs";
10
10
  import { access, chmod, lstat, mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
@@ -1,12 +1,12 @@
1
1
  import { n as isJsonObject, u as parseJsonText } from "./src-X9phtB2j.js";
2
2
  import { T as traceMachineEnabled } from "./review-home-paths-D8AoCdd2.js";
3
- import { a as toolResultText, i as connectReviewInstance, s as ReviewApiError } from "./agent-client-Dtc-Kn_w.js";
3
+ import { a as toolResultText, i as connectReviewInstance, s as ReviewApiError } from "./agent-client-D2RmE9NL.js";
4
4
  import { N as devReviewHome } from "./s3-config-CjcLyFV5.js";
5
5
  import { n as readBuildCommit } from "./package-paths-BWxO-UEL.js";
6
- import { b as selectReviewInstance, u as REVIEW_INSTANCE_ENV } from "./server-discovery-CKjw3-6h.js";
7
- import { n as reviewSessionAgent } from "./review-telemetry-BsoRMC2w.js";
8
- import { a as REVIEW_VIA_HEADER, i as REVIEW_THREAD_HEADER, n as REVIEW_AGENT_HEADER, t as ASK_THREAD_ENV } from "./request-origin-B9qCPiVB.js";
9
- import { i as publicTool, n as RECOVERY, r as callPublicTool, t as toolFailure } from "./tool-failure-DvI-gys2.js";
6
+ import { b as selectReviewInstance, u as REVIEW_INSTANCE_ENV } from "./server-discovery-CRXG48Uz.js";
7
+ import { n as reviewSessionAgent } from "./review-telemetry-B2JniTIs.js";
8
+ import { a as REVIEW_VIA_HEADER, i as REVIEW_THREAD_HEADER, n as REVIEW_AGENT_HEADER, t as ASK_THREAD_ENV } from "./request-origin--8lLCclv.js";
9
+ import { i as publicTool, n as RECOVERY, r as callPublicTool, t as toolFailure } from "./tool-failure-_makh_Sr.js";
10
10
  import { existsSync } from "node:fs";
11
11
  import path from "node:path";
12
12
  //#region src/review-api/install-update.ts
@@ -43,7 +43,7 @@ async function runReviewAgentCli(input) {
43
43
  [REVIEW_THREAD_HEADER, thread ?? ""]
44
44
  ]);
45
45
  if (mode === "mcp") {
46
- const { serveReviewMcp } = await import("./mcp-ovmiUE_x.js");
46
+ const { serveReviewMcp } = await import("./mcp-yXnjUkOV.js");
47
47
  exitOnInstallUpdate(input.stderr);
48
48
  await serveReviewMcp(async (key, agentKind) => {
49
49
  const connected = await connectReviewInstance(key ? {
@@ -0,0 +1,2 @@
1
+ import { n as runReviewAgentCli } from "./agent-cli-CahKfDT0.js";
2
+ export { runReviewAgentCli };
@@ -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-BiWNbcF_.js";
2
+ import "./src-CyYCvVHx.js";
3
3
  import { t as ReviewInputError } from "./input-error-OLgB_h31.js";
4
- import { b as selectReviewInstance, c as reviewServerStateDir, d as ReviewInstanceUnavailableError, i as readReviewServerDiscovery, l as serverNotReady, m as healthyReviewInstance, s as reviewServerIsHealthy, y as reviewInstanceUnavailable } from "./server-discovery-CKjw3-6h.js";
4
+ import { b as selectReviewInstance, c as reviewServerStateDir, d as ReviewInstanceUnavailableError, i as readReviewServerDiscovery, l as serverNotReady, m as healthyReviewInstance, s as reviewServerIsHealthy, y as reviewInstanceUnavailable } from "./server-discovery-CRXG48Uz.js";
5
5
  //#region ../review-protocol/src/review-api-client.ts
6
6
  const defaultRequest = (url, init) => fetch(url, init);
7
7
  /** A non-2xx reply; the status tells a caller whether retrying can help. */
@@ -259,7 +259,7 @@ async function connectReviewInstance(env = process.env, headers = {}, options =
259
259
  const selection = await selectReviewInstance({ env });
260
260
  const discovery = healthyReviewInstance(selection);
261
261
  if (!discovery) {
262
- const { ensureServerWithoutDesktop } = await import("./background-server-CB9C4uoc.js");
262
+ const { ensureServerWithoutDesktop } = await import("./background-server-CFUU4VtN.js");
263
263
  const server = await ensureServerWithoutDesktop({
264
264
  selection,
265
265
  env,
@@ -1,6 +1,6 @@
1
1
  import { n as isJsonObject } from "./src-X9phtB2j.js";
2
- import { c as activityBeginSchema, l as activityEndSchema, n as uploadSchema, r as commandSchema, u as activityUpdateSchema } from "./local-data-Cpl4ENbJ.js";
3
- import { C as pathTargetSchema, D as publishedEditSchema } from "./stored-document-migration-dFbewRTG.js";
2
+ import { c as activityBeginSchema, l as activityEndSchema, n as uploadSchema, r as commandSchema, u as activityUpdateSchema } from "./local-data-DrNSaiS5.js";
3
+ import { C as pathTargetSchema, D as publishedEditSchema } from "./stored-document-migration-B_BijGHF.js";
4
4
  import { t as ReviewInputError } from "./input-error-OLgB_h31.js";
5
5
  import { t as findReviewPackageRoot } from "./package-paths-BWxO-UEL.js";
6
6
  import { z } from "zod";
@@ -162,7 +162,7 @@ function authoringTools(traceEnabled = false) {
162
162
  kind: true
163
163
  });
164
164
  const descriptions = {
165
- create: "Create a whiteboard. target names its repository by the checkout's path, and what it shows: {kind:\"project\"} for a plan in that repository's project with no change; {kind:\"worktree\", base?} for the saved files in the checkout, uncommitted ones included and untracked ones left out (git add -N a new file to include it), against base, by default the repository's default branch, from the merge base of base and HEAD, which follows rebases; {kind:\"commits\", head, base?} for immutable commits (omitted base means source at head with no diff; supply the parent to review introduced changes); {kind:\"pullRequest\", pullRequest} for a GitHub PR by URL or number, fetched into that checkout and pinned at the PR head and GitHub diff base. For a branch stacked on another, pass the branch below it as base; Desktop links whiteboards into a stack through their bases. Revisions are resolved on acceptance. With a PR and no title the PR's title is used. When the existing review for that PR is in Trash, creation reports its ID; restore it with review_lifecycle state:\"active\" before continuing. When an active review for that PR exists, it is returned instead, reporting whether its head moved and whether an agent is working on it; update it in place, move its target with review_set_target, or create a separate review with reuseExisting:false. The result carries review, as review_list shows it, with its target and repositoryPath, so no follow-up read is needed before diffing. When Desktop is available the review opens there and the result reports opened, softwareMapEnabled and environmentIssues, as review_open does; set open:false to author in the background without taking over Desktop. parentId and dependsOn set its place among the project's reviews, as review_set_parent and review_set_dependencies do.",
165
+ create: "Create a whiteboard. target names its repository by the checkout's path, and what it shows: {kind:\"project\"} for a plan in that repository's project with no change; {kind:\"worktree\", base?} for the saved files in the checkout, uncommitted ones included and untracked ones left out (git add -N a new file to include it), against base, by default the repository's default branch, from the merge base of base and HEAD, which follows rebases; {kind:\"commits\", head, base?} for immutable commits (omitted base means source at head with no diff; supply the parent to review introduced changes); {kind:\"pullRequest\", pullRequest} for a GitHub PR by URL or number, fetched into that checkout and pinned at the PR head and GitHub diff base. For a branch stacked on another, pass the branch below it as base. Group plan implementations or a PR stack under one project-target overview with parentId, and order its children with dependsOn; Git bases do not set these relationships. Revisions are resolved on acceptance. With a PR and no title the PR's title is used. When the existing review for that PR is in Trash, creation reports its ID; restore it with review_lifecycle state:\"active\" before continuing. When an active review for that PR exists, it is returned instead, reporting whether its head moved and whether an agent is working on it; update it in place, move its target with review_set_target, or create a separate review with reuseExisting:false. The result carries review, as review_list shows it, with its target and repositoryPath, so no follow-up read is needed before diffing. When Desktop is available the review opens there and the result reports opened, softwareMapEnabled and environmentIssues, as review_open does; set open:false to author in the background without taking over Desktop. parentId and dependsOn set its place among the project's reviews, as review_set_parent and review_set_dependencies do.",
166
166
  set_target: "Move the review to a new target (the same targets review_create takes), such as the commits after a rebase or amend, or commits or a PR for a board that had none. The document and component IDs are kept. Revisions are resolved on acceptance. Returns warnings for retained source ranges in files the new commits changed, to verify, and resources that no longer match; fix them with review_edit. Earlier versions keep their source. A PR target names the PR; other targets keep it within the same repository and clear it across repositories.",
167
167
  edit: [
168
168
  "Edit one document component. content is one component, named by its type; each type's fields are in the Components section of session_get_instructions.",
@@ -1,2 +1,2 @@
1
- import { a as headlessServerOwner, c as stopBackgroundServer, i as ensureServerWithoutDesktop, r as ensureBackgroundServer } from "./background-server-C03RKxKS.js";
1
+ import { a as headlessServerOwner, c as stopBackgroundServer, i as ensureServerWithoutDesktop, r as ensureBackgroundServer } from "./background-server-k4K_Hvh1.js";
2
2
  export { ensureBackgroundServer, ensureServerWithoutDesktop, headlessServerOwner, stopBackgroundServer };
@@ -1,8 +1,8 @@
1
1
  import "./review-home-paths-D8AoCdd2.js";
2
2
  import { D as liveLockOwner, k as processIsAlive } from "./s3-config-CjcLyFV5.js";
3
3
  import { t as findReviewPackageRoot } from "./package-paths-BWxO-UEL.js";
4
- import { a as readReviewServerHealth, c as reviewServerStateDir, i as readReviewServerDiscovery, n as desktopOwnsHome, p as desktopUsesHome, r as headlessServerLockPath } from "./server-discovery-CKjw3-6h.js";
5
- import { t as desktopApplicationInstalled } from "./review-app-launcher-C7el2Uoy.js";
4
+ import { a as readReviewServerHealth, c as reviewServerStateDir, i as readReviewServerDiscovery, n as desktopOwnsHome, p as desktopUsesHome, r as headlessServerLockPath } from "./server-discovery-CRXG48Uz.js";
5
+ import { t as desktopApplicationInstalled } from "./review-app-launcher-KA2_mOeo.js";
6
6
  import { mkdir, open, readFile, realpath, stat } from "node:fs/promises";
7
7
  import path from "node:path";
8
8
  import { spawn } from "node:child_process";
@@ -1 +1 @@
1
- {"version":"0.3.4-preview.20261019.127","commit":"5dd55db92af13eac9187d16cf07b4bd80c456724","dirty":true,"builtAt":"2026-10-19T21:53:33.950Z"}
1
+ {"version":"0.3.5-preview.20261020.130","commit":"e4fb75564bd27f464cf214a4b3a9a75ada3d54a3","dirty":true,"builtAt":"2026-10-20T18:45:03.626Z"}
@@ -1,4 +1,4 @@
1
- import { r as connectReviewApi } from "./agent-client-Dtc-Kn_w.js";
1
+ import { r as connectReviewApi } from "./agent-client-D2RmE9NL.js";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { z } from "zod";
4
4
  //#region src/sharing/cli.ts
@@ -1,18 +1,18 @@
1
1
  import { A as __require, O as setLocalVcsCommandObserver, j as __toESM, k as __commonJSMin } from "./src-WPaQn75m.js";
2
2
  import { c as jsonString, n as isJsonObject, u as parseJsonText } from "./src-X9phtB2j.js";
3
- import { b as REVIEW_REMOTE_ATTACH_BEGIN, h as REVIEW_CLI_INSTALL_TARGET_LABELS, l as boardTitle, x as REVIEW_REMOTE_ATTACH_END, y as REVIEW_REMOTE_AGENT_IDS } from "./src-BiWNbcF_.js";
3
+ import { S as REVIEW_REMOTE_ATTACH_END, b as REVIEW_REMOTE_AGENT_IDS, h as REVIEW_CLI_INSTALL_TARGET_LABELS, l as boardTitle, x as REVIEW_REMOTE_ATTACH_BEGIN } from "./src-CyYCvVHx.js";
4
4
  import { $ as resolveTraceCommand, A as runTraceDeny, E as traceMachineStatus, F as describeSelection, H as resolveTraceRepositoryTarget, J as HOSTED_CAPTURE_SCOPE_DESCRIPTION, K as traceRepositoryStatus, L as loadS3TraceStorage, M as runTraceSessions, N as runTraceStoreDelete, P as runTraceStoreInfo, T as traceMachineEnabled, V as requireTraceConsent, _ as runTraceRepair, at as readStoreAuth, b as runTraceGitHook, c as registerTraceCommands, ct as runStoreWhoami, d as runTraceList$1, dt as withStoreAuthorization, f as runTracePull$1, ft as emitJsonEvent, g as runTraceInstallMachine, h as runTraceEnable, ht as jsonRequestedInArgv, j as runTraceOnboard, k as runTraceAllow, l as resolveTraceReadStorage, lt as StoreApiError, m as runTraceDisable, mt as humanStream, nt as traceScope, ot as runStoreLogin, p as runTraceShow, pt as failWithJsonError, q as readTraceUserConfig, rt as DEFAULT_STORE_ORIGIN, st as runStoreLogout, tt as traceHomeDir, u as runTraceBlame, ut as StoreClient, v as runTraceStatus, w as readLegacyCaptureSettings, x as runTraceHook, y as runTraceSync, z as selectTraceStorage } from "./review-home-paths-D8AoCdd2.js";
5
- import { o as ReviewApiClient, s as ReviewApiError } from "./agent-client-Dtc-Kn_w.js";
5
+ import { o as ReviewApiClient, s as ReviewApiError } from "./agent-client-D2RmE9NL.js";
6
6
  import { t as resolveReviewRoot } from "./runtime-Bj2tD33R.js";
7
7
  import { C as s3ProfileSchema, E as writeTraceConfigFile, N as devReviewHome, P as normalizeStoreOrigin, S as readTraceConfigFile, T as sameS3Profile, _ as emptyTraceConfig, c as resolveS3Setup, g as currentStore, h as TraceConfigurationError, i as isS3MockMode, n as clearTraceEnvCache, o as readTraceEnvFile, p as traceSettingsPath, w as s3Store } from "./s3-config-CjcLyFV5.js";
8
8
  import { t as errorMessage } from "./error-message-OtiDonty.js";
9
9
  import { i as readReviewPackageVersion, r as readBuildInfo, t as findReviewPackageRoot } from "./package-paths-BWxO-UEL.js";
10
- import { a as readReviewServerHealth, b as selectReviewInstance, c as reviewServerStateDir, d as ReviewInstanceUnavailableError, f as clearDefaultReviewInstance, g as requireHealthyReviewDesktop, h as readDefaultReviewInstance, i as readReviewServerDiscovery, l as serverNotReady, m as healthyReviewInstance, p as desktopUsesHome, t as DESKTOP_TAKEOVER_SIGNAL, u as REVIEW_INSTANCE_ENV, x as writeDefaultReviewInstance, y as reviewInstanceUnavailable } from "./server-discovery-CKjw3-6h.js";
11
- import { t as ReviewTelemetry } from "./review-telemetry-BsoRMC2w.js";
12
- import { t as fuzzyRank } from "./fuzzy-match-BmVJJm9I.js";
13
- import { _ as isInstallTarget, a as isOwnedShim, f as windowsInstallerCommand, g as ALL_INSTALL_TARGETS, h as detectConnectAgents, m as connectAgent, o as pathShimPath, p as scanLegacySkills, t as aliasInstallationToAccount, v as connectPrompts } from "./account-alias-B5-HYi1D.js";
14
- import { n as focusReviewDesktop, r as runReviewAppLaunch } from "./review-app-launcher-C7el2Uoy.js";
15
- import { t as reviewAgentCliHelp } from "./agent-cli-CohHf6Ua.js";
10
+ import { a as readReviewServerHealth, b as selectReviewInstance, c as reviewServerStateDir, d as ReviewInstanceUnavailableError, f as clearDefaultReviewInstance, g as requireHealthyReviewDesktop, h as readDefaultReviewInstance, i as readReviewServerDiscovery, l as serverNotReady, m as healthyReviewInstance, p as desktopUsesHome, t as DESKTOP_TAKEOVER_SIGNAL, u as REVIEW_INSTANCE_ENV, x as writeDefaultReviewInstance, y as reviewInstanceUnavailable } from "./server-discovery-CRXG48Uz.js";
11
+ import { t as ReviewTelemetry } from "./review-telemetry-B2JniTIs.js";
12
+ import { t as fuzzyRank } from "./fuzzy-match-BbaX-dGh.js";
13
+ import { _ as isInstallTarget, a as isOwnedShim, f as windowsInstallerCommand, g as ALL_INSTALL_TARGETS, h as detectConnectAgents, m as connectAgent, o as pathShimPath, p as scanLegacySkills, t as aliasInstallationToAccount, v as connectPrompts } from "./account-alias-CMyXCuuq.js";
14
+ import { n as focusReviewDesktop, r as runReviewAppLaunch } from "./review-app-launcher-KA2_mOeo.js";
15
+ import { t as reviewAgentCliHelp } from "./agent-cli-CahKfDT0.js";
16
16
  import { existsSync, mkdirSync, renameSync, writeFileSync } from "node:fs";
17
17
  import { realpath } from "node:fs/promises";
18
18
  import path from "node:path";
@@ -4297,7 +4297,7 @@ async function runReviewCli(input) {
4297
4297
  if (!Number.isInteger(port) || port < 0 || port > 65535) throw new ReviewCliUsageError("--port must be an integer between 0 and 65535.");
4298
4298
  const stateDir = reviewServerStateDir(authoringEnv(options.stateDir));
4299
4299
  if (options.detach) {
4300
- const { ensureBackgroundServer } = await import("./background-server-CB9C4uoc.js");
4300
+ const { ensureBackgroundServer } = await import("./background-server-CFUU4VtN.js");
4301
4301
  const { discovery, started } = await ensureBackgroundServer({
4302
4302
  stateDir,
4303
4303
  env,
@@ -4319,7 +4319,7 @@ async function runReviewCli(input) {
4319
4319
  process.once("SIGINT", stop);
4320
4320
  process.once("SIGTERM", stop);
4321
4321
  process.once(DESKTOP_TAKEOVER_SIGNAL, takeover);
4322
- const { HeadlessServerBusyError, runHeadlessServer } = await import("./headless-host-DRtjf9WA.js");
4322
+ const { HeadlessServerBusyError, runHeadlessServer } = await import("./headless-host-cYdlRYPB.js");
4323
4323
  try {
4324
4324
  await runHeadlessServer({
4325
4325
  stateDir,
@@ -4356,7 +4356,7 @@ async function runReviewCli(input) {
4356
4356
  configureJsonOutput(serverCommand.command("stop").description("Stop a background server started by --detach, the CLI, or Desktop").option("--state-dir <path>", "directory selected when starting the server"), "plain").action(async (_options, command) => {
4357
4357
  const options = command.optsWithGlobals();
4358
4358
  const stateDir = reviewServerStateDir(authoringEnv(options.stateDir));
4359
- const { headlessServerOwner, stopBackgroundServer } = await import("./background-server-CB9C4uoc.js");
4359
+ const { headlessServerOwner, stopBackgroundServer } = await import("./background-server-CFUU4VtN.js");
4360
4360
  const owner = await headlessServerOwner(stateDir);
4361
4361
  const discovery = await readReviewServerDiscovery(stateDir);
4362
4362
  if (owner === void 0) {
@@ -4384,7 +4384,7 @@ async function runReviewCli(input) {
4384
4384
  if (!existsSync(path.join(stateDir, "review-api.db"))) throw new Error(`No saved reviews in ${stateDir}, so there is no server id to reset. Check --state-dir.`);
4385
4385
  const inUse = `A Whiteboard server is using ${stateDir}. Stop it first, then run whiteboard server reset-id again.`;
4386
4386
  if (await desktopUsesHome(stateDir, env)) return refuse(inUse, options.json);
4387
- const [{ openReviewProfile }, { withHeadlessServerLock }] = await Promise.all([import("./profile-DJvkBJNQ.js"), import("./headless-host-DRtjf9WA.js")]);
4387
+ const [{ openReviewProfile }, { withHeadlessServerLock }] = await Promise.all([import("./profile-CGxNfeYQ.js"), import("./headless-host-cYdlRYPB.js")]);
4388
4388
  const reset = await withHeadlessServerLock(await realpath(stateDir), async () => {
4389
4389
  const local = await openReviewProfile(stateDir, { manageWorkspaces: false });
4390
4390
  try {
@@ -4406,7 +4406,7 @@ async function runReviewCli(input) {
4406
4406
  configureJsonOutput(remote.command("attach").description("Start a background server if none is healthy and report how to reach it").option("--state-dir <path>", "directory for saved reviews and server discovery").option("--groups <groups>", "comma-separated optional extension groups the Desktop has enabled, such as go").option("--replace", "stop a running server of another version that the CLI or Desktop started, and start this one"), "plain").action(async (_options, command) => {
4407
4407
  const options = command.optsWithGlobals();
4408
4408
  const stateDir = reviewServerStateDir(authoringEnv(options.stateDir));
4409
- const { remoteAttach } = await import("./remote-attach-Dd-YobM6.js");
4409
+ const { remoteAttach } = await import("./remote-attach-CZTrtWIk.js");
4410
4410
  let attach;
4411
4411
  try {
4412
4412
  attach = await remoteAttach({
@@ -4448,7 +4448,7 @@ async function runReviewCli(input) {
4448
4448
  configureJsonOutput(remote.command("uninstall").description("Remove what Whiteboard Desktop installed on this host, stopping a server it started").addOption(new Option("--keep-reviews", "leave the saved reviews in place").conflicts("deleteReviews")).addOption(new Option("--delete-reviews", "also delete the saved reviews")).option("--state-dir <path>", "directory for saved reviews and server discovery"), "plain").action(async (_options, command) => {
4449
4449
  const options = command.optsWithGlobals();
4450
4450
  const stateDir = reviewServerStateDir(authoringEnv(options.stateDir));
4451
- const { remoteUninstall } = await import("./remote-uninstall-DuOzsvaD.js");
4451
+ const { remoteUninstall } = await import("./remote-uninstall-CFTkoioA.js");
4452
4452
  let deleteReviews = options.deleteReviews ? true : options.keepReviews ? false : void 0;
4453
4453
  if (deleteReviews === void 0 && !options.json && input.stdin?.isTTY) {
4454
4454
  const prompt = createInterface$1({
@@ -4670,14 +4670,14 @@ async function runReviewCli(input) {
4670
4670
  command.showHelpAfterError(false).error("Markdown review migration is no longer supported. Ask your agent to migrate your old Whiteboard reviews.");
4671
4671
  });
4672
4672
  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) => {
4673
- const { runShareCli } = await import("./cli-CJaEb7zC.js");
4673
+ const { runShareCli } = await import("./cli-BUVSMGud.js");
4674
4674
  state.exitCode = await runShareCli({
4675
4675
  ...input,
4676
4676
  ...options,
4677
4677
  env: authoringEnv()
4678
4678
  });
4679
4679
  }).command("revoke <share-id>").description("Revoke future downloads of a share"), "plain").action(async (shareId, options) => {
4680
- const { runShareCli } = await import("./cli-CJaEb7zC.js");
4680
+ const { runShareCli } = await import("./cli-BUVSMGud.js");
4681
4681
  state.exitCode = await runShareCli({
4682
4682
  ...input,
4683
4683
  ...options,
@@ -4758,7 +4758,7 @@ async function runReviewCli(input) {
4758
4758
  return commands;
4759
4759
  } });
4760
4760
  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) => {
4761
- const { runReviewAgentCli } = await import("./agent-cli-_YyMIMRY.js");
4761
+ const { runReviewAgentCli } = await import("./agent-cli-CvYV2R6c.js");
4762
4762
  state.exitCode = await runReviewAgentCli({
4763
4763
  ...input,
4764
4764
  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-BiWNbcF_.js";
3
+ import "./src-CyYCvVHx.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-DGDIqh3V.js");
20
+ const { runReviewCli } = await import("./cli-runner-C7W6VA94.js");
21
21
  return runReviewCli({
22
22
  argv,
23
23
  cliPaths: {
@@ -1,8 +1,8 @@
1
1
  import { f as gitAt } from "./src-WPaQn75m.js";
2
2
  import { n as isJsonObject, u as parseJsonText } from "./src-X9phtB2j.js";
3
- import "./src-BiWNbcF_.js";
4
- import { f as sourceAnchors } from "./lens-selection-CyJapcsl.js";
5
- import { $ as parseMarkdown, A as resourceReferences, E as pinsSchema, G as lensSelections, I as sourceReferences, O as readsAtBoardPins, R as checkReferences, W as lensSchema, Z as markdownNodes, _ as boardRepositoryId, c as normalizedSoftwareRelationshipSchema, f as anchorPins, k as resourceReference, l as traceSchema, n as migrateStoredDocument, r as migrateStoredLenses, s as normalizedSoftwareElementSchema, t as liftFileLenses, u as textIncludesQuote, x as elements, y as documentSchema } from "./stored-document-migration-dFbewRTG.js";
3
+ import "./src-CyYCvVHx.js";
4
+ import { f as sourceAnchors } from "./lens-selection-CAtsGaym.js";
5
+ import { $ as parseMarkdown, A as resourceReferences, E as pinsSchema, G as lensSelections, I as sourceReferences, O as readsAtBoardPins, R as checkReferences, W as lensSchema, Z as markdownNodes, _ as boardRepositoryId, c as normalizedSoftwareRelationshipSchema, f as anchorPins, k as resourceReference, l as traceSchema, n as migrateStoredDocument, r as migrateStoredLenses, s as normalizedSoftwareElementSchema, t as liftFileLenses, u as textIncludesQuote, x as elements, y as documentSchema } from "./stored-document-migration-B_BijGHF.js";
6
6
  import { t as ReviewInputError } from "./input-error-OLgB_h31.js";
7
7
  import { createHash, randomUUID } from "node:crypto";
8
8
  import { z } from "zod";
@@ -1,7 +1,7 @@
1
1
  import "./review-home-paths-D8AoCdd2.js";
2
2
  import { N as devReviewHome } from "./s3-config-CjcLyFV5.js";
3
- import { n as askAgentIds } from "./thread-state-Do5LX10I.js";
4
- import { t as ASK_THREAD_ENV } from "./request-origin-B9qCPiVB.js";
3
+ import { n as askAgentIds } from "./thread-state-D6MlnGv7.js";
4
+ import { t as ASK_THREAD_ENV } from "./request-origin--8lLCclv.js";
5
5
  import { createRequire } from "node:module";
6
6
  import { constants } from "node:fs";
7
7
  import { access, chmod, mkdir, readFile, rename, stat, writeFile } from "node:fs/promises";
@@ -1,22 +1,22 @@
1
1
  import { E as runVcs, S as resolveRepoContextSync, d as git, r as defaultBranch } from "./src-WPaQn75m.js";
2
2
  import { c as jsonString, m as isStringValue, n as isJsonObject, p as isObjectValue, u as parseJsonText } from "./src-X9phtB2j.js";
3
- import { a as sharedReviewId, c as verifyShareRepository, d as validateShareSources, f as StreamLimitError, h as shareIdSchema, l as exportShare, m as parseShareLink, n as ShareClient, p as readBoundedStream, r as SharePreflightError, s as readShareRepository, t as ShareAuthError, u as referenceCommits } from "./client-lKVF_Elo.js";
4
- import { f as textualRows, h as diffrMissingError, i as inspectSnapshot, m as diffrExecutable, p as invalidateStructuralComparisons, r as commandSchema } from "./local-data-Cpl4ENbJ.js";
5
- import { N as reviewDiffrSummarizerInputSchema, O as ReviewFeedbackContactSchema, P as decodeStructuralDiffEvent, a as parseReviewVerbRequest, c as boardIconKind, i as parseReviewDesktopVerbResult, j as ReviewOnboardingRunRequestSchema, k as ReviewFeedbackSchema, l as boardTitle, m as REVIEW_CLIENT_REMOTE, p as REVIEW_CLIENT_HEADER, v as REVIEW_HOST_HEADER } from "./src-BiWNbcF_.js";
3
+ import { a as sharedReviewId, c as verifyShareRepository, d as validateShareSources, f as StreamLimitError, h as shareIdSchema, l as exportShare, m as parseShareLink, n as ShareClient, p as readBoundedStream, r as SharePreflightError, s as readShareRepository, t as ShareAuthError, u as referenceCommits } from "./client-B0f4EJ7v.js";
4
+ import { f as textualRows, h as diffrMissingError, i as inspectSnapshot, m as diffrExecutable, p as invalidateStructuralComparisons, r as commandSchema } from "./local-data-DrNSaiS5.js";
5
+ import { N as reviewDiffrSummarizerInputSchema, O as ReviewFeedbackContactSchema, P as decodeStructuralDiffEvent, a as parseReviewVerbRequest, c as boardIconKind, i as parseReviewDesktopVerbResult, j as ReviewOnboardingRunRequestSchema, k as ReviewFeedbackSchema, l as boardTitle, m as REVIEW_CLIENT_REMOTE, p as REVIEW_CLIENT_HEADER, y as REVIEW_HOST_HEADER } from "./src-CyYCvVHx.js";
6
6
  import { B as TraceStorageDeniedError, D as listReviewTraceSessions, I as isTraceStorageConfigured, O as loadReviewAgentTrace, R as resolveTraceStorage, T as traceMachineEnabled, at as readStoreAuth, et as shellQuote, it as clearStoreAuth, ot as runStoreLogin, rt as DEFAULT_STORE_ORIGIN, z as selectTraceStorage } from "./review-home-paths-D8AoCdd2.js";
7
- import { _ as scopedCoverage, h as emptyCoverage, i as anchorSelection, l as resolveDiffSelection, m as coverageSources, n as SelectionUnavailableError, o as comparisonKey, s as formatAnchor, u as selectionKey, v as subtractIntervals, y as unionIntervals } from "./lens-selection-CyJapcsl.js";
8
- import { B as stepSources, F as selectionReferences, G as lensSelections, J as fileLineRangeSchema, V as UNCATEGORIZED_LENS_ID, _ as boardRepositoryId, f as anchorPins, g as boardLinks, x as elements } from "./stored-document-migration-dFbewRTG.js";
7
+ import { _ as scopedCoverage, h as emptyCoverage, i as anchorSelection, l as resolveDiffSelection, m as coverageSources, n as SelectionUnavailableError, o as comparisonKey, s as formatAnchor, u as selectionKey, v as subtractIntervals, y as unionIntervals } from "./lens-selection-CAtsGaym.js";
8
+ import { B as stepSources, F as selectionReferences, G as lensSelections, J as fileLineRangeSchema, V as UNCATEGORIZED_LENS_ID, _ as boardRepositoryId, f as anchorPins, g as boardLinks, x as elements } from "./stored-document-migration-B_BijGHF.js";
9
9
  import { t as ReviewInputError } from "./input-error-OLgB_h31.js";
10
10
  import { A as processStartIdentity, L as writePrivateJsonAtomic, N as devReviewHome, h as TraceConfigurationError, i as isS3MockMode, j as withFileLock } from "./s3-config-CjcLyFV5.js";
11
11
  import { t as errorMessage } from "./error-message-OtiDonty.js";
12
12
  import { i as readReviewPackageVersion, n as readBuildCommit, t as findReviewPackageRoot } from "./package-paths-BWxO-UEL.js";
13
- import { _ as reviewInstanceIdentity, n as desktopOwnsHome, o as reviewServerDiscoveryPath, p as desktopUsesHome, r as headlessServerLockPath, t as DESKTOP_TAKEOVER_SIGNAL } from "./server-discovery-CKjw3-6h.js";
14
- import { c as askPicksSchema, d as selectionMarkdown, l as askQuestionSchema, n as askAgentIds, r as askChoiceKinds, s as askPermissionsSchema, t as applyAskChange, u as AgentSelectionSchema } from "./thread-state-Do5LX10I.js";
15
- import { t as openReviewProfile } from "./profile-BadSkCkI.js";
16
- import { c as REVIEW_APP_SESSION_ID_HEADER, d as sanitizeUiTelemetryEvent, f as cleanTelemetryText, o as reviewRequestOrigin, r as REVIEW_PERSON_HEADER, s as BUNDLE_FRAME_PATTERN, t as ASK_THREAD_ENV, u as isReportableCleanedMessage } from "./request-origin-B9qCPiVB.js";
17
- import { a as defaultAskPermissions, i as askAgents, l as launchAskAgent, n as askAgentSettings, o as detectAskAgents, r as askAgentTakesMcp, t as fuzzyRank } from "./fuzzy-match-BmVJJm9I.js";
18
- import { a as inspectQuerySchema, i as renderInstructions, o as queryAnchor, r as instructionsQuerySchema, s as readQuerySchemas, t as authoringTools } from "./authoring-tools-B7KU04f7.js";
19
- import { a as headlessServerOwner, c as stopBackgroundServer, o as recordedBackgroundServer } from "./background-server-C03RKxKS.js";
13
+ import { _ as reviewInstanceIdentity, n as desktopOwnsHome, o as reviewServerDiscoveryPath, p as desktopUsesHome, r as headlessServerLockPath, t as DESKTOP_TAKEOVER_SIGNAL } from "./server-discovery-CRXG48Uz.js";
14
+ import { c as askPicksSchema, d as selectionMarkdown, l as askQuestionSchema, n as askAgentIds, r as askChoiceKinds, s as askPermissionsSchema, t as applyAskChange, u as AgentSelectionSchema } from "./thread-state-D6MlnGv7.js";
15
+ import { t as openReviewProfile } from "./profile-BlqZlCPZ.js";
16
+ import { c as REVIEW_APP_SESSION_ID_HEADER, d as sanitizeUiTelemetryEvent, f as cleanTelemetryText, o as reviewRequestOrigin, r as REVIEW_PERSON_HEADER, s as BUNDLE_FRAME_PATTERN, t as ASK_THREAD_ENV, u as isReportableCleanedMessage } from "./request-origin--8lLCclv.js";
17
+ import { a as defaultAskPermissions, i as askAgents, l as launchAskAgent, n as askAgentSettings, o as detectAskAgents, r as askAgentTakesMcp, t as fuzzyRank } from "./fuzzy-match-BbaX-dGh.js";
18
+ import { a as inspectQuerySchema, i as renderInstructions, o as queryAnchor, r as instructionsQuerySchema, s as readQuerySchemas, t as authoringTools } from "./authoring-tools-BLhYKrNN.js";
19
+ import { a as headlessServerOwner, c as stopBackgroundServer, o as recordedBackgroundServer } from "./background-server-k4K_Hvh1.js";
20
20
  import crypto$1, { createHash, randomBytes, randomUUID } from "node:crypto";
21
21
  import { z } from "zod";
22
22
  import { existsSync, mkdirSync, writeFileSync } from "node:fs";
@@ -1,2 +1,2 @@
1
- import { i as withHeadlessServerLock, n as runHeadlessServer, r as takeOverServerHome, t as HeadlessServerBusyError } from "./headless-host-XhL1X4vX.js";
1
+ import { i as withHeadlessServerLock, n as runHeadlessServer, r as takeOverServerHome, t as HeadlessServerBusyError } from "./headless-host-C7xYMe74.js";
2
2
  export { HeadlessServerBusyError, runHeadlessServer, takeOverServerHome, withHeadlessServerLock };
@@ -1,4 +1,4 @@
1
- import "./src-BiWNbcF_.js";
1
+ import "./src-CyYCvVHx.js";
2
2
  import { z } from "zod";
3
3
  //#region src/viewed-coverage.ts
4
4
  const coverageSchema = z.object({
@@ -1,14 +1,14 @@
1
1
  import { C as resolveRevision, D as runVcsSync, E as runVcs, S as resolveRepoContextSync, T as renderVcsArgs, _ as listTrackedFilesAtCommit, a as diff, b as readFileAtCommit, c as diffFileSummariesWorkingTree, d as git, 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, x as resolveRepoContext, y as parseGitRemoteSlug } from "./src-WPaQn75m.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-BiWNbcF_.js";
3
+ import { F as structuralChangeCounts, P as decodeStructuralDiffEvent, c as boardIconKind, l as boardTitle } from "./src-CyYCvVHx.js";
4
4
  import { s as safeStorageSegment } from "./review-home-paths-D8AoCdd2.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-CyJapcsl.js";
6
- import { $ as parseMarkdown, A as resourceReferences, E as pinsSchema, G as lensSelections, H as applyLensEdit, I as sourceReferences, J as fileLineRangeSchema, K as SourceRangeError, L as summarizeEdit, M as respellDocumentLinks, N as respellEditLinks, P as reviewTargetSchema, Q as markdownText, R as checkReferences, S as explicitPins, T as pinnedRepositoryIds, U as lensEditSchema, X as sliceSourceRange, Y as requireVisibleSource, Z as markdownNodes, _ as boardRepositoryId, a as SoftwareModelValidationError, b as editSchema, d as adoptFlowUnits, f as anchorPins, g as boardLinks, h as assignMissingIds, i as readStoredDocument, j as respellCommitLinks, k as resourceReference, l as traceSchema, m as assignFreshIds, n as migrateStoredDocument, o as defineSoftwareMap, p as applyEdit, q as checkSourcePath, r as migrateStoredLenses, u as textIncludesQuote, v as commitLinkCommits, w as pinDocumentReferences, x as elements, y as documentSchema, z as documentAdvice } from "./stored-document-migration-dFbewRTG.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-CAtsGaym.js";
6
+ import { $ as parseMarkdown, A as resourceReferences, E as pinsSchema, G as lensSelections, H as applyLensEdit, I as sourceReferences, J as fileLineRangeSchema, K as SourceRangeError, L as summarizeEdit, M as respellDocumentLinks, N as respellEditLinks, P as reviewTargetSchema, Q as markdownText, R as checkReferences, S as explicitPins, T as pinnedRepositoryIds, U as lensEditSchema, X as sliceSourceRange, Y as requireVisibleSource, Z as markdownNodes, _ as boardRepositoryId, a as SoftwareModelValidationError, b as editSchema, d as adoptFlowUnits, f as anchorPins, g as boardLinks, h as assignMissingIds, i as readStoredDocument, j as respellCommitLinks, k as resourceReference, l as traceSchema, m as assignFreshIds, n as migrateStoredDocument, o as defineSoftwareMap, p as applyEdit, q as checkSourcePath, r as migrateStoredLenses, u as textIncludesQuote, v as commitLinkCommits, w as pinDocumentReferences, x as elements, y as documentSchema, z as documentAdvice } from "./stored-document-migration-B_BijGHF.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 { r as isMissingFileError } from "./fs-utils-BMPLt0cr.js";
11
- import { a as askHistoryEntrySchema, i as askEntrySchema, o as askOfferSchema, s as askPermissionsSchema } from "./thread-state-Do5LX10I.js";
11
+ import { a as askHistoryEntrySchema, i as askEntrySchema, o as askOfferSchema, s as askPermissionsSchema } from "./thread-state-D6MlnGv7.js";
12
12
  import { createRequire } from "node:module";
13
13
  import crypto, { createHash, randomUUID } from "node:crypto";
14
14
  import { z } from "zod";
@@ -1,7 +1,7 @@
1
- import { a as toolResultText, s as ReviewApiError } from "./agent-client-Dtc-Kn_w.js";
1
+ import { a as toolResultText, s as ReviewApiError } from "./agent-client-D2RmE9NL.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-B7KU04f7.js";
4
- import { i as publicTool, n as RECOVERY, r as callPublicTool, t as toolFailure } from "./tool-failure-DvI-gys2.js";
3
+ import { n as REVIEW_STATUS_TOOL, t as authoringTools } from "./authoring-tools-BLhYKrNN.js";
4
+ import { i as publicTool, n as RECOVERY, r as callPublicTool, t as toolFailure } from "./tool-failure-_makh_Sr.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";
@@ -30,7 +30,7 @@ function mcpClientAgent(name) {
30
30
  const RELOAD_TOOLS = "Whiteboard is running now, but this session listed Whiteboard's tools before it started, so you may see only session_get_instructions. Before authoring, reload the `whiteboard` MCP server's tools (reconnect it in your agent, or start a new agent session). If you can already see tools such as session_create, carry on.";
31
31
  function mcpAuthoringGuidance(context) {
32
32
  return [
33
- "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 review a branch, a change or a pull request, or to explain a system in Whiteboard), author a Whiteboard with the default topic.",
33
+ "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
34
  ...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\"})."] : [],
35
35
  "Never read or write Whiteboard files or SQL."
36
36
  ].join(" ");
@@ -1,4 +1,4 @@
1
- import { a as projectOfCheckout, g as CheckoutGroups, o as groupCheckoutsAhead, s as initializeReviewStoreSchema, t as openLocalReviewStore } from "./local-data-Cpl4ENbJ.js";
1
+ import { a as projectOfCheckout, g as CheckoutGroups, o as groupCheckoutsAhead, s as initializeReviewStoreSchema, t as openLocalReviewStore } from "./local-data-DrNSaiS5.js";
2
2
  import "./review-home-paths-D8AoCdd2.js";
3
3
  import { j as withFileLock } from "./s3-config-CjcLyFV5.js";
4
4
  import { access, mkdir } from "node:fs/promises";
@@ -0,0 +1,2 @@
1
+ import { t as openReviewProfile } from "./profile-BlqZlCPZ.js";
2
+ export { openReviewProfile };
@@ -1,7 +1,7 @@
1
1
  import { i as readReviewPackageVersion } from "./package-paths-BWxO-UEL.js";
2
- import { a as readReviewServerHealth, l as serverNotReady } from "./server-discovery-CKjw3-6h.js";
3
- import { c as stopBackgroundServer, o as recordedBackgroundServer, r as ensureBackgroundServer } from "./background-server-C03RKxKS.js";
4
- import { t as ensureRemoteLanguageServer } from "./remote-language-server-BXk87KCr.js";
2
+ import { a as readReviewServerHealth, l as serverNotReady } from "./server-discovery-CRXG48Uz.js";
3
+ import { c as stopBackgroundServer, o as recordedBackgroundServer, r as ensureBackgroundServer } from "./background-server-k4K_Hvh1.js";
4
+ import { t as ensureRemoteLanguageServer } from "./remote-language-server-BiPzol99.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 "./review-home-paths-D8AoCdd2.js";
2
2
  import { A as processStartIdentity, j as withFileLock } from "./s3-config-CjcLyFV5.js";
3
3
  import { t as findReviewPackageRoot } from "./package-paths-BWxO-UEL.js";
4
- import { n as cliSpawn, s as spawnDetached } from "./background-server-C03RKxKS.js";
4
+ import { n as cliSpawn, s as spawnDetached } from "./background-server-k4K_Hvh1.js";
5
5
  import { r as remoteServerPaths, t as ensureRemoteExtensions } from "./remote-extensions-CNXwqK0D.js";
6
6
  import { randomBytes } from "node:crypto";
7
7
  import { z } from "zod";
@@ -1,9 +1,9 @@
1
- import { C as REVIEW_REMOTE_WRAPPER_MARK, S as REVIEW_REMOTE_INSTALL_LOCK } from "./src-BiWNbcF_.js";
1
+ import { C as REVIEW_REMOTE_INSTALL_LOCK, w as REVIEW_REMOTE_WRAPPER_MARK } from "./src-CyYCvVHx.js";
2
2
  import "./review-home-paths-D8AoCdd2.js";
3
3
  import { M as DEV_REVIEW_HOME_ENV } from "./s3-config-CjcLyFV5.js";
4
- import { c as stopBackgroundServer, o as recordedBackgroundServer } from "./background-server-C03RKxKS.js";
4
+ import { c as stopBackgroundServer, o as recordedBackgroundServer } from "./background-server-k4K_Hvh1.js";
5
5
  import { i as whiteboardRemoteHome } from "./remote-extensions-CNXwqK0D.js";
6
- import { n as remoteLanguageServerGroups, r as stopProcessGroup } from "./remote-language-server-BXk87KCr.js";
6
+ import { n as remoteLanguageServerGroups, r as stopProcessGroup } from "./remote-language-server-BiPzol99.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_LAYOUT_SCOPES, g as REVIEW_DIFF_LAYOUTS, w as REVIEW_THEME_CHOICES } from "./src-BiWNbcF_.js";
3
- import { t as SELECTION_UNAVAILABLE_REASONS } from "./lens-selection-CyJapcsl.js";
4
- import { n as askAgentIds } from "./thread-state-Do5LX10I.js";
2
+ import { _ as REVIEW_DIFF_LAYOUTS, g as REVIEW_COLOR_THEME_KINDS, v as REVIEW_DIFF_LAYOUT_SCOPES } from "./src-CyYCvVHx.js";
3
+ import { t as SELECTION_UNAVAILABLE_REASONS } from "./lens-selection-CAtsGaym.js";
4
+ import { n as askAgentIds } from "./thread-state-D6MlnGv7.js";
5
5
  import { z } from "zod";
6
6
  //#region src/telemetry-clean-text.ts
7
7
  const USER_DATA_REGEXES = [
@@ -231,13 +231,21 @@ const SETTING_NAME = [
231
231
  "telemetry_enabled",
232
232
  "keymap",
233
233
  "software_map_enabled",
234
+ "sharing_enabled",
234
235
  "diffr_config",
235
236
  "theme",
236
237
  "ctrl_tab",
237
238
  "open_files_in",
238
239
  "ready_notification",
239
240
  "document_width",
240
- "code_font_size"
241
+ "code_font_size",
242
+ "document_font_size",
243
+ "reading_font",
244
+ "code_font_family",
245
+ "font_ligatures",
246
+ "diff_font_size",
247
+ "diff_word_wrap",
248
+ "diff_ignore_whitespace"
241
249
  ];
242
250
  const REVIEW_OPENED_VIA = [
243
251
  "home",
@@ -627,7 +635,7 @@ const UI_TELEMETRY_EVENTS = {
627
635
  properties: {
628
636
  setting: SETTING_NAME,
629
637
  enabled: "boolean",
630
- value: REVIEW_THEME_CHOICES
638
+ value: REVIEW_COLOR_THEME_KINDS
631
639
  }
632
640
  },
633
641
  review_opened: {
@@ -1,5 +1,5 @@
1
- import { o as parseReviewVerbResponse } from "./src-BiWNbcF_.js";
2
- import { b as selectReviewInstance, m as healthyReviewInstance, v as reviewInstanceStartHint, y as reviewInstanceUnavailable } from "./server-discovery-CKjw3-6h.js";
1
+ import { o as parseReviewVerbResponse } from "./src-CyYCvVHx.js";
2
+ import { b as selectReviewInstance, m as healthyReviewInstance, v as reviewInstanceStartHint, y as reviewInstanceUnavailable } from "./server-discovery-CRXG48Uz.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,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-BiWNbcF_.js";
2
+ import "./src-CyYCvVHx.js";
3
3
  import "./review-home-paths-D8AoCdd2.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-BWxO-UEL.js";
6
- import "./request-origin-B9qCPiVB.js";
6
+ import "./request-origin--8lLCclv.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,22 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
  import { a as diff, o as diffFileSummaries, w as splitGitPatchFiles } from "../src-WPaQn75m.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-lKVF_Elo.js";
5
- import { d as pullRequestProvider } from "../local-data-Cpl4ENbJ.js";
6
- 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, v as REVIEW_HOST_HEADER } from "../src-BiWNbcF_.js";
4
+ import { f as StreamLimitError, i as SharedReviewStore, p as readBoundedStream } from "../client-B0f4EJ7v.js";
5
+ import { d as pullRequestProvider } from "../local-data-DrNSaiS5.js";
6
+ 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-CyYCvVHx.js";
7
7
  import { i as reviewInstanceDiscoveryPath, o as reviewLegacyDiscoveryPath } from "../review-home-paths-D8AoCdd2.js";
8
- import { A as resourceReferences } from "../stored-document-migration-dFbewRTG.js";
8
+ import { A as resourceReferences } from "../stored-document-migration-B_BijGHF.js";
9
9
  import { t as ReviewInputError } from "../input-error-OLgB_h31.js";
10
10
  import { L as writePrivateJsonAtomic, N as devReviewHome } from "../s3-config-CjcLyFV5.js";
11
11
  import { t as errorMessage } from "../error-message-OtiDonty.js";
12
12
  import { i as readReviewPackageVersion, t as findReviewPackageRoot } from "../package-paths-BWxO-UEL.js";
13
- import { _ as reviewInstanceIdentity, u as REVIEW_INSTANCE_ENV } from "../server-discovery-CKjw3-6h.js";
14
- import { t as openReviewProfile } from "../profile-BadSkCkI.js";
15
- import { r as reviewTelemetryChannel, t as ReviewTelemetry } from "../review-telemetry-BsoRMC2w.js";
16
- import { l as REVIEW_TELEMETRY_TABS } from "../request-origin-B9qCPiVB.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-B5-HYi1D.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-XhL1X4vX.js";
19
- import { s as readQuerySchemas } from "../authoring-tools-B7KU04f7.js";
13
+ import { _ as reviewInstanceIdentity, u as REVIEW_INSTANCE_ENV } from "../server-discovery-CRXG48Uz.js";
14
+ import { t as openReviewProfile } from "../profile-BlqZlCPZ.js";
15
+ import { r as reviewTelemetryChannel, t as ReviewTelemetry } from "../review-telemetry-B2JniTIs.js";
16
+ import { l as REVIEW_TELEMETRY_TABS } from "../request-origin--8lLCclv.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-CMyXCuuq.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-C7xYMe74.js";
19
+ import { s as readQuerySchemas } from "../authoring-tools-BLhYKrNN.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";
@@ -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-BiWNbcF_.js";
2
+ import { n as parseReviewDesktopDiscovery } from "./src-CyYCvVHx.js";
3
3
  import { a as reviewInstancesDir, o as reviewLegacyDiscoveryPath, r as reviewDevInstanceKey, t as reviewDefaultInstancePath } from "./review-home-paths-D8AoCdd2.js";
4
4
  import { M as DEV_REVIEW_HOME_ENV, N as devReviewHome, k as processIsAlive } from "./s3-config-CjcLyFV5.js";
5
5
  import { z } from "zod";
@@ -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-B0f4EJ7v.js";
2
2
  export { ShareClient, SharedReviewStore, exportShare, sharedReviewId, validateShareBundle, verifyShareRepository };
@@ -233,11 +233,7 @@ z.strictObject({
233
233
  /** How embedded diffs lay out: base and head side by side, or one column. */
234
234
  const REVIEW_DIFF_LAYOUTS = ["split", "unified"];
235
235
  const REVIEW_DIFF_LAYOUT_SCOPES = ["diff", "peek"];
236
- const REVIEW_THEME_CHOICES = [
237
- "dark",
238
- "light",
239
- "system"
240
- ];
236
+ const REVIEW_COLOR_THEME_KINDS = ["dark", "light"];
241
237
  const reviewDiffrSummarizerInputSchema = z.object({
242
238
  enabled: z.boolean(),
243
239
  provider: z.string().min(1),
@@ -1116,4 +1112,4 @@ function formatIssuePath(path) {
1116
1112
  return output;
1117
1113
  }
1118
1114
  //#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 };
1115
+ export { ReviewGatewayHostSchema as A, REVIEW_REMOTE_INSTALL_LOCK 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_ATTACH_END as S, ReviewApiSelectionSourceSchema as T, REVIEW_DIFF_LAYOUTS as _, parseReviewVerbRequest as a, REVIEW_REMOTE_AGENT_IDS as b, boardIconKind as c, ReviewBugReportRequestSchema as d, parseReviewBugReportResponse as f, REVIEW_COLOR_THEME_KINDS 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_DIFF_LAYOUT_SCOPES as v, REVIEW_REMOTE_WRAPPER_MARK as w, REVIEW_REMOTE_ATTACH_BEGIN as x, REVIEW_HOST_HEADER as y };
@@ -1,6 +1,6 @@
1
1
  import { d as isBooleanValue, f as isNumberValue, l as jsonValueSchema, m as isStringValue, n as isJsonObject } from "./src-X9phtB2j.js";
2
- import "./src-BiWNbcF_.js";
3
- import { a as commitLinkTarget, c as parseAnchor, d as selectionProblem, f as sourceAnchors, i as anchorSelection, r as anchorSchema, s as formatAnchor } from "./lens-selection-CyJapcsl.js";
2
+ import "./src-CyYCvVHx.js";
3
+ import { a as commitLinkTarget, c as parseAnchor, d as selectionProblem, f as sourceAnchors, i as anchorSelection, r as anchorSchema, s as formatAnchor } from "./lens-selection-CAtsGaym.js";
4
4
  import { t as ReviewInputError } from "./input-error-OLgB_h31.js";
5
5
  import { z } from "zod";
6
6
  import { fromMarkdown } from "mdast-util-from-markdown";
@@ -1,4 +1,4 @@
1
- import { M as ReviewSelectedDiffSchema, T as ReviewApiSelectionSourceSchema } from "./src-BiWNbcF_.js";
1
+ import { M as ReviewSelectedDiffSchema, T as ReviewApiSelectionSourceSchema } from "./src-CyYCvVHx.js";
2
2
  import { z } from "zod";
3
3
  /** A semantic selection, independent of comment/thread creation. */
4
4
  const AgentSelectionSchema = z.strictObject({
@@ -1,6 +1,6 @@
1
1
  import { m as isStringValue, n as isJsonObject } from "./src-X9phtB2j.js";
2
- import { l as boardTitle } from "./src-BiWNbcF_.js";
3
- import { n as callAuthoringTool, s as ReviewApiError, t as ToolText } from "./agent-client-Dtc-Kn_w.js";
2
+ import { l as boardTitle } from "./src-CyYCvVHx.js";
3
+ import { n as callAuthoringTool, s as ReviewApiError, t as ToolText } from "./agent-client-D2RmE9NL.js";
4
4
  import { t as ReviewInputError } from "./input-error-OLgB_h31.js";
5
5
  //#region src/review-api/public-tools.ts
6
6
  function publicDescription(text) {
@@ -1,12 +1,24 @@
1
1
  you are writing an interactive rfc-style whiteboard, for consumption by a staff engineer.
2
2
 
3
+ **plans and stacks**
4
+
5
+ Organize related work automatically; do not wait for the user to request grouping, child boards, or dependency order. Choose the board structure before the authoring flow below. Use `session_list` to find an existing plan or stack overview in this project before creating one.
6
+
7
+ - For a plan with no changes yet, create a board with `target:{kind:"project", repositoryPath}`. Do not use a worktree or commit target for a plan: those attach code and show the code-board icon.
8
+ - When implementing a plan in several changes, keep the plan as the top-level board. Create one child board per PR or change with `parentId` set to the plan's session ID. Keep the plan's project target; do not replace it with one child's diff.
9
+ - When reviewing an existing PR stack without a plan, create one project-target board for the overview, then one child per PR. Explain the whole change on the overview and each layer's own diff on its child.
10
+ - Set each child's `dependsOn` to the session IDs it builds on. For a linear stack, each child after the first depends on the previous child. `parentId` groups boards; `dependsOn` orders them. Git bases alone do not create these relationships.
11
+ - For commit targets, use the branch below each layer as its `base`. For PR targets, use the PR itself; its GitHub base selects that layer's diff.
12
+ - Nest only one level: plan or overview → change boards. Update existing boards after rebases instead of creating duplicates. If `session_create` returns an existing PR board, use `session_set_parent` and `session_set_dependencies` to set its relationships.
13
+ - Link the children from the overview and link the parent from each child with `[label](whiteboard:board/<sessionId>)`. Read the overview and all children back to check their targets, parent, dependency order, and links.
14
+
3
15
  **flow**
4
- follow these first five steps in order, with no tool calls beyond what they need: loading the tools they use (`session_create`, `session_activity_begin`, `session_edit`, `session_get`, and later `session_activity_update` and `session_activity_end`) and, for a PR, reading its description (`gh pr view`).
16
+ For each board, follow these first five steps in order, with no tool calls beyond what they need: loading the tools they use (`session_create`, `session_activity_begin`, `session_edit`, `session_get`, and later `session_activity_update` and `session_activity_end`) and, for a PR, reading its description (`gh pr view`).
5
17
 
6
18
  - create the whiteboard with a `target` naming the checkout by its `repositoryPath`: `{kind:"commits", head, base?}` for commits, `{kind:"pullRequest", pullRequest}` for a PR by URL or number, or `{kind:"project"}` for a plan with no change yet. if they name none, use a `worktree` target with no `base`: it reviews the checkout, uncommitted work included, against the default branch. for uncommitted work only, pass `base: "HEAD"`. untracked files are left out: run `git add -N <file>` on new files you want reviewed
7
- - trigger a subagent with this exact instruction: "Call `session_get_instructions({topic:\"file-lenses\"})` and follow it for whiteboard <sessionId>, whose change is `<base>..<head>` in `<repositoryPath>`."
19
+ - for a change board only, trigger a subagent with this exact instruction: "Call `session_get_instructions({topic:\"file-lenses\"})` and follow it for whiteboard <sessionId>, whose change is `<base>..<head>` in `<repositoryPath>`."
8
20
  - call `session_activity_begin` and pass its `activityId` on every `session_edit`
9
- - read the diff with git (or jj) in `repositoryPath`, at the commits `session_create` returned: `git diff <base> <head>`, or for a worktree target `git diff <base>` plus `git status` for untracked files. if it shows no changes, the target is wrong: fix it with `session_set_target` before writing
21
+ - for a project-target plan or overview, read the relevant source or the stack's combined diff; no diff is expected on the project target itself. For a change board, read the diff with git (or jj) in `repositoryPath`, at the commits `session_create` returned: `git diff <base> <head>`, or for a worktree target `git diff <base>` plus `git status` for untracked files. if it shows no changes, the target is wrong: fix it with `session_set_target` before writing
10
22
  - immediately after reading the diff (and the PR description) - put down a first pass at the what/why section.
11
23
 
12
24
  - whiteboard structure - each of these should be written as a top-level `section`, in this order:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dev.fast/whiteboard",
3
- "version": "0.3.4-preview.20261019.127",
3
+ "version": "0.3.5-preview.20261020.130",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -48,7 +48,7 @@
48
48
  "@parcel/watcher": "2.6.0",
49
49
  "commander": "14.0.3",
50
50
  "fuzzysort": "4.0.2",
51
- "hono": "4.13.7",
51
+ "hono": "4.13.11",
52
52
  "mdast-util-from-markdown": "2.0.3",
53
53
  "mdast-util-gfm": "3.1.0",
54
54
  "mdast-util-math": "3.0.0",
@@ -75,10 +75,10 @@
75
75
  "typescript": "6.0.3",
76
76
  "vitest": "4.1.11",
77
77
  "@dev.fast/review-share-protocol": "0.1.2",
78
- "@dev.fast/review-protocol": "0.0.0",
79
78
  "@dev.fast/trace-core": "0.0.0",
80
- "@dev.fast/trace-protocol": "0.5.0",
81
- "@dev.fast/json": "0.0.0"
79
+ "@dev.fast/json": "0.0.0",
80
+ "@dev.fast/review-protocol": "0.0.0",
81
+ "@dev.fast/trace-protocol": "0.5.0"
82
82
  },
83
83
  "engines": {
84
84
  "node": ">=24 <25"
@@ -88,7 +88,7 @@
88
88
  "repo": "devdotfast/review",
89
89
  "docs": "packages/review/instructions/authoring.md"
90
90
  },
91
- "gitHead": "5dd55db92af13eac9187d16cf07b4bd80c456724",
91
+ "gitHead": "e4fb75564bd27f464cf214a4b3a9a75ada3d54a3",
92
92
  "scripts": {
93
93
  "prebuild": "pnpm run build:workspace-deps",
94
94
  "build": "node --max-old-space-size=8192 node_modules/tsdown/dist/run.mjs",
@@ -36,7 +36,7 @@ export function authoringTools(traceEnabled = false) {
36
36
 
37
37
  const descriptions = {
38
38
  create:
39
- 'Create a whiteboard. target names its repository by the checkout\'s path, and what it shows: {kind:"project"} for a plan in that repository\'s project with no change; {kind:"worktree", base?} for the saved files in the checkout, uncommitted ones included and untracked ones left out (git add -N a new file to include it), against base, by default the repository\'s default branch, from the merge base of base and HEAD, which follows rebases; {kind:"commits", head, base?} for immutable commits (omitted base means source at head with no diff; supply the parent to review introduced changes); {kind:"pullRequest", pullRequest} for a GitHub PR by URL or number, fetched into that checkout and pinned at the PR head and GitHub diff base. For a branch stacked on another, pass the branch below it as base; Desktop links whiteboards into a stack through their bases. Revisions are resolved on acceptance. With a PR and no title the PR\'s title is used. When the existing review for that PR is in Trash, creation reports its ID; restore it with review_lifecycle state:"active" before continuing. When an active review for that PR exists, it is returned instead, reporting whether its head moved and whether an agent is working on it; update it in place, move its target with review_set_target, or create a separate review with reuseExisting:false. The result carries review, as review_list shows it, with its target and repositoryPath, so no follow-up read is needed before diffing. When Desktop is available the review opens there and the result reports opened, softwareMapEnabled and environmentIssues, as review_open does; set open:false to author in the background without taking over Desktop. parentId and dependsOn set its place among the project\'s reviews, as review_set_parent and review_set_dependencies do.',
39
+ 'Create a whiteboard. target names its repository by the checkout\'s path, and what it shows: {kind:"project"} for a plan in that repository\'s project with no change; {kind:"worktree", base?} for the saved files in the checkout, uncommitted ones included and untracked ones left out (git add -N a new file to include it), against base, by default the repository\'s default branch, from the merge base of base and HEAD, which follows rebases; {kind:"commits", head, base?} for immutable commits (omitted base means source at head with no diff; supply the parent to review introduced changes); {kind:"pullRequest", pullRequest} for a GitHub PR by URL or number, fetched into that checkout and pinned at the PR head and GitHub diff base. For a branch stacked on another, pass the branch below it as base. Group plan implementations or a PR stack under one project-target overview with parentId, and order its children with dependsOn; Git bases do not set these relationships. Revisions are resolved on acceptance. With a PR and no title the PR\'s title is used. When the existing review for that PR is in Trash, creation reports its ID; restore it with review_lifecycle state:"active" before continuing. When an active review for that PR exists, it is returned instead, reporting whether its head moved and whether an agent is working on it; update it in place, move its target with review_set_target, or create a separate review with reuseExisting:false. The result carries review, as review_list shows it, with its target and repositoryPath, so no follow-up read is needed before diffing. When Desktop is available the review opens there and the result reports opened, softwareMapEnabled and environmentIssues, as review_open does; set open:false to author in the background without taking over Desktop. parentId and dependsOn set its place among the project\'s reviews, as review_set_parent and review_set_dependencies do.',
40
40
  set_target:
41
41
  "Move the review to a new target (the same targets review_create takes), such as the commits after a rebase or amend, or commits or a PR for a board that had none. The document and component IDs are kept. Revisions are resolved on acceptance. Returns warnings for retained source ranges in files the new commits changed, to verify, and resources that no longer match; fix them with review_edit. Earlier versions keep their source. A PR target names the PR; other targets keep it within the same repository and clear it across repositories.",
42
42
  edit: [
@@ -31,7 +31,7 @@ const RELOAD_TOOLS =
31
31
 
32
32
  function mcpAuthoringGuidance(context: { traceEnabled: boolean }): string {
33
33
  return [
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 review a branch, a change or a pull request, or to explain a system in Whiteboard), author a Whiteboard with the default topic.",
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.",
35
35
  ...(context.traceEnabled
36
36
  ? [
37
37
  'For why code exists, what an agent was thinking, or whether an agent solved something before, call session_get_instructions({topic:"trace-archaeology"}).',
@@ -18,9 +18,9 @@
18
18
 
19
19
  import {
20
20
  type JsonObject,
21
+ REVIEW_COLOR_THEME_KINDS,
21
22
  REVIEW_DIFF_LAYOUTS,
22
23
  REVIEW_DIFF_LAYOUT_SCOPES,
23
- REVIEW_THEME_CHOICES,
24
24
  isJsonObject,
25
25
  jsonBoolean,
26
26
  jsonNumber,
@@ -145,6 +145,7 @@ export const SETTING_NAME = [
145
145
  "telemetry_enabled",
146
146
  "keymap",
147
147
  "software_map_enabled",
148
+ "sharing_enabled",
148
149
  "diffr_config",
149
150
  "theme",
150
151
  "ctrl_tab",
@@ -152,6 +153,13 @@ export const SETTING_NAME = [
152
153
  "ready_notification",
153
154
  "document_width",
154
155
  "code_font_size",
156
+ "document_font_size",
157
+ "reading_font",
158
+ "code_font_family",
159
+ "font_ligatures",
160
+ "diff_font_size",
161
+ "diff_word_wrap",
162
+ "diff_ignore_whitespace",
155
163
  ] as const;
156
164
 
157
165
  export const REVIEW_OPENED_VIA = ["home", "cli", "other"] as const;
@@ -548,11 +556,11 @@ export const UI_TELEMETRY_EVENTS = {
548
556
  },
549
557
  setting_changed: {
550
558
  event: "review_setting_changed",
551
- // value carries the chosen option for the one multi-valued setting, theme.
559
+ // value carries whether the chosen theme is dark or light.
552
560
  properties: {
553
561
  setting: SETTING_NAME,
554
562
  enabled: "boolean",
555
- value: REVIEW_THEME_CHOICES,
563
+ value: REVIEW_COLOR_THEME_KINDS,
556
564
  },
557
565
  },
558
566
  review_opened: {
@@ -1,2 +0,0 @@
1
- import { n as runReviewAgentCli } from "./agent-cli-CohHf6Ua.js";
2
- export { runReviewAgentCli };
@@ -1,2 +0,0 @@
1
- import { t as openReviewProfile } from "./profile-BadSkCkI.js";
2
- export { openReviewProfile };