@dev.fast/whiteboard 0.5.2-preview.20261109.148 → 0.5.2-preview.20261109.150

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.
@@ -4,7 +4,7 @@ import { C as disableTraceMachine, E as traceMachineStatus, G as listTraceReposi
4
4
  import { i as readReviewPackageVersion } from "./package-paths-wobHueCx.js";
5
5
  import { D as ReviewCliInstallStampSchema } from "./src-B-91Rd2d.js";
6
6
  import { f as isDirectory, p as isFile } from "./thread-state-Jxoh1hde.js";
7
- import { c as findExecutable, s as executableCommand } from "./fuzzy-match-DNyQDN3P.js";
7
+ import { c as findExecutable, s as executableCommand } from "./fuzzy-match-uqvwAGZa.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";
@@ -0,0 +1,2 @@
1
+ import { n as runReviewAgentCli } from "./agent-cli-JjA6UVgL.js";
2
+ export { runReviewAgentCli };
@@ -4,8 +4,8 @@ import { T as traceMachineEnabled } from "./review-home-paths-B8909D07.js";
4
4
  import { n as readBuildCommit } from "./package-paths-wobHueCx.js";
5
5
  import { a as toolResultText, i as connectReviewInstance, s as ReviewApiError } from "./agent-client-CgnEo6lf.js";
6
6
  import { b as selectReviewInstance, u as REVIEW_INSTANCE_ENV } from "./server-discovery-Fme7f3fb.js";
7
- import { n as reviewSessionAgent } from "./review-telemetry-CxNvwdDS.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-ENYd0Ymr.js";
7
+ import { n as reviewSessionAgent } from "./review-telemetry-aJ2v-xX-.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-DKjvGOKA.js";
9
9
  import { a as renderedImage, i as publicTool, n as RECOVERY, r as callPublicTool, t as toolFailure } from "./tool-failure-Cgjidoud.js";
10
10
  import { existsSync } from "node:fs";
11
11
  import path from "node:path";
@@ -1 +1 @@
1
- {"version":"0.5.2-preview.20261109.148","commit":"b2e15bbe59af85f4e1a721e310526de6c60a4f3b","dirty":true,"builtAt":"2026-11-09T20:31:06.709Z"}
1
+ {"version":"0.5.2-preview.20261109.150","commit":"ea6255fa3a7f52aaafaa6751ace869dfa5d1624e","dirty":true,"builtAt":"2026-11-09T22:07:12.027Z"}
@@ -8,11 +8,11 @@ import { C as REVIEW_REMOTE_ATTACH_END, S as REVIEW_REMOTE_ATTACH_BEGIN, h as RE
8
8
  import { o as ReviewApiClient, s as ReviewApiError } from "./agent-client-CgnEo6lf.js";
9
9
  import { t as resolveReviewRoot } from "./runtime-Bhk5L_SN.js";
10
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-Fme7f3fb.js";
11
- import { t as ReviewTelemetry } from "./review-telemetry-CxNvwdDS.js";
12
- import { t as fuzzyRank } from "./fuzzy-match-DNyQDN3P.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-Cs5YqXRj.js";
11
+ import { t as ReviewTelemetry } from "./review-telemetry-aJ2v-xX-.js";
12
+ import { t as fuzzyRank } from "./fuzzy-match-uqvwAGZa.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-DZtV8xhh.js";
14
14
  import { n as focusReviewDesktop, r as runReviewAppLaunch } from "./review-app-launcher-DR5vYGEl.js";
15
- import { t as reviewAgentCliHelp } from "./agent-cli-a5J-juuu.js";
15
+ import { t as reviewAgentCliHelp } from "./agent-cli-JjA6UVgL.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";
@@ -4355,7 +4355,7 @@ async function runReviewCli(input) {
4355
4355
  process.once("SIGINT", stop);
4356
4356
  process.once("SIGTERM", stop);
4357
4357
  process.once(DESKTOP_TAKEOVER_SIGNAL, takeover);
4358
- const { HeadlessServerBusyError, runHeadlessServer } = await import("./headless-host-CGyfb5mS.js");
4358
+ const { HeadlessServerBusyError, runHeadlessServer } = await import("./headless-host-CyVN-cHn.js");
4359
4359
  try {
4360
4360
  await runHeadlessServer({
4361
4361
  stateDir,
@@ -4420,7 +4420,7 @@ async function runReviewCli(input) {
4420
4420
  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.`);
4421
4421
  const inUse = `A Whiteboard server is using ${stateDir}. Stop it first, then run whiteboard server reset-id again.`;
4422
4422
  if (await desktopUsesHome(stateDir, env)) return refuse(inUse, options.json);
4423
- const [{ openReviewProfile }, { withHeadlessServerLock }] = await Promise.all([import("./profile-Bi2SbpSI.js"), import("./headless-host-CGyfb5mS.js")]);
4423
+ const [{ openReviewProfile }, { withHeadlessServerLock }] = await Promise.all([import("./profile-Bi2SbpSI.js"), import("./headless-host-CyVN-cHn.js")]);
4424
4424
  const reset = await withHeadlessServerLock(await realpath(stateDir), async () => {
4425
4425
  const local = await openReviewProfile(stateDir, { manageWorkspaces: false });
4426
4426
  try {
@@ -4803,7 +4803,7 @@ async function runReviewCli(input) {
4803
4803
  return commands;
4804
4804
  } });
4805
4805
  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) => {
4806
- const { runReviewAgentCli } = await import("./agent-cli-DdUAmdca.js");
4806
+ const { runReviewAgentCli } = await import("./agent-cli-CD4PxPmr.js");
4807
4807
  state.exitCode = await runReviewAgentCli({
4808
4808
  ...input,
4809
4809
  env: authoringEnv(),
package/dist/cli.js CHANGED
@@ -17,7 +17,7 @@ async function runCli(effectivePath) {
17
17
  `);
18
18
  return 1;
19
19
  }
20
- const { runReviewCli } = await import("./cli-runner-hL2efcxb.js");
20
+ const { runReviewCli } = await import("./cli-runner-DjogiuQz.js");
21
21
  return runReviewCli({
22
22
  argv,
23
23
  cliPaths: {
@@ -1,7 +1,7 @@
1
1
  import { N as devReviewHome } from "./s3-config-CjcLyFV5.js";
2
2
  import "./review-home-paths-B8909D07.js";
3
3
  import { n as askAgentIds } from "./thread-state-Jxoh1hde.js";
4
- import { t as ASK_THREAD_ENV } from "./request-origin-ENYd0Ymr.js";
4
+ import { t as ASK_THREAD_ENV } from "./request-origin-DKjvGOKA.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,2 +1,2 @@
1
- import { i as withHeadlessServerLock, n as runHeadlessServer, r as takeOverServerHome, t as HeadlessServerBusyError } from "./headless-host-bb09yVkX.js";
1
+ import { i as withHeadlessServerLock, n as runHeadlessServer, r as takeOverServerHome, t as HeadlessServerBusyError } from "./headless-host-CzUYx5gz.js";
2
2
  export { HeadlessServerBusyError, runHeadlessServer, takeOverServerHome, withHeadlessServerLock };
@@ -12,8 +12,8 @@ import { A as ReviewFeedbackSchema, F as reviewDiffrSummarizerInputSchema, L as
12
12
  import { _ as reviewInstanceIdentity, n as desktopOwnsHome, o as reviewServerDiscoveryPath, p as desktopUsesHome, r as headlessServerLockPath, t as DESKTOP_TAKEOVER_SIGNAL } from "./server-discovery-Fme7f3fb.js";
13
13
  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-Jxoh1hde.js";
14
14
  import { t as openReviewProfile } from "./profile-D-SbO3p9.js";
15
- 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-ENYd0Ymr.js";
16
- 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-DNyQDN3P.js";
15
+ 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-DKjvGOKA.js";
16
+ 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-uqvwAGZa.js";
17
17
  import { a as inspectQuerySchema, i as renderInstructions, o as queryAnchor, r as instructionsQuerySchema, s as readQuerySchemas, t as authoringTools } from "./authoring-tools-BgZvnbjN.js";
18
18
  import { a as headlessServerOwner, c as stopBackgroundServer, o as recordedBackgroundServer } from "./background-server-DHEcsFwH.js";
19
19
  import crypto$1, { createHash, randomBytes, randomUUID } from "node:crypto";
@@ -233,7 +233,6 @@ const SETTING_NAME = [
233
233
  "keymap",
234
234
  "software_map_enabled",
235
235
  "show_release_notes",
236
- "update_pill",
237
236
  "diffr_config",
238
237
  "theme",
239
238
  "diff_theme",
@@ -3,7 +3,7 @@ import { F as writeFileAtomic, N as devReviewHome, j as withFileLock, k as proce
3
3
  import "./review-home-paths-B8909D07.js";
4
4
  import { i as readReviewPackageVersion, t as findReviewPackageRoot } from "./package-paths-wobHueCx.js";
5
5
  import "./src-B-91Rd2d.js";
6
- import "./request-origin-ENYd0Ymr.js";
6
+ import "./request-origin-DKjvGOKA.js";
7
7
  import { createHmac, randomUUID } from "node:crypto";
8
8
  import { z } from "zod";
9
9
  import { existsSync, readFileSync, rmSync } from "node:fs";
@@ -11,10 +11,10 @@ import { i as readReviewPackageVersion, t as findReviewPackageRoot } from "../pa
11
11
  import { F as reviewDiffrSummarizerInputSchema, O as ReviewConnectRequestSchema, d as ReviewBugReportRequestSchema, f as parseReviewBugReportResponse, j as ReviewGatewayHostSchema, 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-B-91Rd2d.js";
12
12
  import { _ as reviewInstanceIdentity, u as REVIEW_INSTANCE_ENV } from "../server-discovery-Fme7f3fb.js";
13
13
  import { t as openReviewProfile } from "../profile-D-SbO3p9.js";
14
- import { r as reviewTelemetryChannel, t as ReviewTelemetry } from "../review-telemetry-CxNvwdDS.js";
15
- import { l as REVIEW_TELEMETRY_TABS } from "../request-origin-ENYd0Ymr.js";
16
- 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-Cs5YqXRj.js";
17
- import { C as DEFAULT_MAX_REQUEST_BYTES, D as writeAnimationsEnabled, E as readAnimationsEnabled, O as cliAskTools, S as readBoundedRequestJson, T as ReviewServerError, _ as saveDiffrSummarizer, a as drainServerCrashReport, b as remoteShare, c as answerErrorsAsJson, d as captureSanitizedUiTelemetry, f as clientErrorsForSession, g as readDiffrConfig, h as migrateDiffrConfig, l as createWhiteboardCore, m as GlobalReviewDesktopVerbRelay, o as installProcessErrorTelemetry, p as recordClientError, r as takeOverServerHome, s as serverCrashReportPath, u as serverJson, v as setDiffrConfigValue, w as HttpJsonError, x as createNodeRequestListener, y as testDiffrSummarizer } from "../headless-host-bb09yVkX.js";
14
+ import { r as reviewTelemetryChannel, t as ReviewTelemetry } from "../review-telemetry-aJ2v-xX-.js";
15
+ import { l as REVIEW_TELEMETRY_TABS } from "../request-origin-DKjvGOKA.js";
16
+ 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-DZtV8xhh.js";
17
+ import { C as DEFAULT_MAX_REQUEST_BYTES, D as writeAnimationsEnabled, E as readAnimationsEnabled, O as cliAskTools, S as readBoundedRequestJson, T as ReviewServerError, _ as saveDiffrSummarizer, a as drainServerCrashReport, b as remoteShare, c as answerErrorsAsJson, d as captureSanitizedUiTelemetry, f as clientErrorsForSession, g as readDiffrConfig, h as migrateDiffrConfig, l as createWhiteboardCore, m as GlobalReviewDesktopVerbRelay, o as installProcessErrorTelemetry, p as recordClientError, r as takeOverServerHome, s as serverCrashReportPath, u as serverJson, v as setDiffrConfigValue, w as HttpJsonError, x as createNodeRequestListener, y as testDiffrSummarizer } from "../headless-host-CzUYx5gz.js";
18
18
  import { s as readQuerySchemas } from "../authoring-tools-BgZvnbjN.js";
19
19
  import crypto, { createHash, randomBytes } from "node:crypto";
20
20
  import { z } from "zod";
@@ -1318,7 +1318,8 @@ function openGatewayMemory(home, log = () => {}) {
1318
1318
  const REMOTE_VERBS = /* @__PURE__ */ new Set([
1319
1319
  "authoringCapabilities",
1320
1320
  "openApiReview",
1321
- "focusWindow"
1321
+ "focusWindow",
1322
+ "renderAnimation"
1322
1323
  ]);
1323
1324
  function createGatewayPushes(input) {
1324
1325
  const { hosts, relay } = input;
@@ -1328,7 +1329,7 @@ function createGatewayPushes(input) {
1328
1329
  ok: false,
1329
1330
  error: `${request.name} is not available from another machine.`
1330
1331
  };
1331
- if (request.name === "openApiReview") {
1332
+ if (request.name === "openApiReview" || request.name === "renderAnimation") {
1332
1333
  const refused = await input.claim(remote, request.args.reviewId);
1333
1334
  if (refused) return {
1334
1335
  ok: false,
@@ -1682,6 +1683,63 @@ const REMOTE_ROUTES = [
1682
1683
  method: "GET",
1683
1684
  path: "stack"
1684
1685
  },
1686
+ {
1687
+ method: "GET",
1688
+ path: "place"
1689
+ },
1690
+ {
1691
+ method: "GET",
1692
+ path: "project"
1693
+ },
1694
+ {
1695
+ method: "GET",
1696
+ path: "inspect"
1697
+ },
1698
+ {
1699
+ method: "GET",
1700
+ path: "history"
1701
+ },
1702
+ {
1703
+ method: "GET",
1704
+ path: "lenses"
1705
+ },
1706
+ {
1707
+ method: "GET",
1708
+ path: "activity"
1709
+ },
1710
+ {
1711
+ method: "POST",
1712
+ path: "activity/:action{begin|update|end}"
1713
+ },
1714
+ {
1715
+ method: "POST",
1716
+ path: "person-edit"
1717
+ },
1718
+ {
1719
+ method: "POST",
1720
+ path: "focus"
1721
+ },
1722
+ {
1723
+ method: "POST",
1724
+ path: "animation-run"
1725
+ },
1726
+ {
1727
+ method: "GET",
1728
+ path: "render",
1729
+ slow: true
1730
+ },
1731
+ {
1732
+ method: "GET",
1733
+ path: "links"
1734
+ },
1735
+ {
1736
+ method: "GET",
1737
+ path: "links/peek"
1738
+ },
1739
+ {
1740
+ method: "GET",
1741
+ path: "commit/:commit"
1742
+ },
1685
1743
  {
1686
1744
  method: "GET",
1687
1745
  path: "tree"
@@ -1754,7 +1812,7 @@ const REMOTE_ROUTES = [
1754
1812
  },
1755
1813
  {
1756
1814
  method: "POST",
1757
- path: "ask/:thread/:action{prompt|permission|files|retry|cancel|close}"
1815
+ path: "ask/:thread/:action{prompt|permission|files|retry|cancel|close|viewed}"
1758
1816
  },
1759
1817
  {
1760
1818
  method: "DELETE",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dev.fast/whiteboard",
3
- "version": "0.5.2-preview.20261109.148",
3
+ "version": "0.5.2-preview.20261109.150",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -75,12 +75,12 @@
75
75
  "tsx": "4.21.0",
76
76
  "typescript": "6.0.3",
77
77
  "vitest": "4.1.12",
78
+ "@dev.fast/review-protocol": "0.0.0",
78
79
  "@dev.fast/json": "0.0.0",
79
80
  "@dev.fast/review-share-protocol": "0.6.0",
80
- "@dev.fast/trace-core": "0.0.0",
81
81
  "@dev.fast/trace-protocol": "0.5.0",
82
- "@dev.fast/review-protocol": "0.0.0",
83
- "@dev.fast/whiteboard-document": "0.3.0"
82
+ "@dev.fast/whiteboard-document": "0.3.0",
83
+ "@dev.fast/trace-core": "0.0.0"
84
84
  },
85
85
  "engines": {
86
86
  "node": ">=24 <25"
@@ -90,7 +90,7 @@
90
90
  "repo": "devdotfast/review",
91
91
  "docs": "packages/review/instructions/authoring.md"
92
92
  },
93
- "gitHead": "b2e15bbe59af85f4e1a721e310526de6c60a4f3b",
93
+ "gitHead": "ea6255fa3a7f52aaafaa6751ace869dfa5d1624e",
94
94
  "scripts": {
95
95
  "prebuild": "pnpm run build:workspace-deps",
96
96
  "build": "node --max-old-space-size=8192 node_modules/tsdown/dist/run.mjs",
@@ -20,6 +20,7 @@ const REMOTE_VERBS = new Set<ReviewVerbRequest["name"]>([
20
20
  "authoringCapabilities",
21
21
  "openApiReview",
22
22
  "focusWindow",
23
+ "renderAnimation",
23
24
  ]);
24
25
 
25
26
  export function createGatewayPushes(input: {
@@ -41,7 +42,10 @@ export function createGatewayPushes(input: {
41
42
  error: `${request.name} is not available from another machine.`,
42
43
  };
43
44
 
44
- if (request.name === "openApiReview") {
45
+ if (
46
+ request.name === "openApiReview" ||
47
+ request.name === "renderAnimation"
48
+ ) {
45
49
  const refused = await input.claim(remote, request.args.reviewId);
46
50
 
47
51
  if (refused) return { ok: false, error: refused };
@@ -63,6 +63,20 @@ const REMOTE_ROUTES: readonly RemoteRoute[] = [
63
63
  { method: "GET", path: "diff" },
64
64
  { method: "GET", path: "structural-diff" },
65
65
  { method: "GET", path: "stack" },
66
+ { method: "GET", path: "place" },
67
+ { method: "GET", path: "project" },
68
+ { method: "GET", path: "inspect" },
69
+ { method: "GET", path: "history" },
70
+ { method: "GET", path: "lenses" },
71
+ { method: "GET", path: "activity" },
72
+ { method: "POST", path: "activity/:action{begin|update|end}" },
73
+ { method: "POST", path: "person-edit" },
74
+ { method: "POST", path: "focus" },
75
+ { method: "POST", path: "animation-run" },
76
+ { method: "GET", path: "render", slow: true },
77
+ { method: "GET", path: "links" },
78
+ { method: "GET", path: "links/peek" },
79
+ { method: "GET", path: "commit/:commit" },
66
80
  { method: "GET", path: "tree" },
67
81
  { method: "GET", path: "file" },
68
82
  { method: "GET", path: "resources/:name" },
@@ -85,7 +99,7 @@ const REMOTE_ROUTES: readonly RemoteRoute[] = [
85
99
  },
86
100
  {
87
101
  method: "POST",
88
- path: "ask/:thread/:action{prompt|permission|files|retry|cancel|close}",
102
+ path: "ask/:thread/:action{prompt|permission|files|retry|cancel|close|viewed}",
89
103
  },
90
104
  { method: "DELETE", path: "ask/:thread" },
91
105
  ];
@@ -152,7 +152,6 @@ export const SETTING_NAME = [
152
152
  "keymap",
153
153
  "software_map_enabled",
154
154
  "show_release_notes",
155
- "update_pill",
156
155
  "diffr_config",
157
156
  "theme",
158
157
  "diff_theme",
@@ -1,2 +0,0 @@
1
- import { n as runReviewAgentCli } from "./agent-cli-a5J-juuu.js";
2
- export { runReviewAgentCli };