@workbench-ai/workbench 0.0.101 → 0.0.102

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiEA,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;CAC/B;AAuTD,wBAAsB,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,GAAE,KAGzD,GAAG,OAAO,CAAC,MAAM,CAAC,CA8NlB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiEA,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;CAC/B;AAuTD,wBAAsB,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,GAAE,KAGzD,GAAG,OAAO,CAAC,MAAM,CAAC,CAgOlB"}
package/dist/index.js CHANGED
@@ -337,7 +337,7 @@ export async function runCli(argv, io = {
337
337
  rejectExtraInput(parsed, {
338
338
  maxPositionals: 1,
339
339
  message: "workbench eval does not accept a VERSION argument.",
340
- remediation: "Run workbench eval for current source, or use workbench show VERSION to inspect old source.",
340
+ remediation: "workbench eval",
341
341
  });
342
342
  if (parsed.flags.cloud === true) {
343
343
  return await handleCloudEval(parsed, io);
@@ -373,7 +373,7 @@ export async function runCli(argv, io = {
373
373
  rejectExtraInput(parsed, {
374
374
  maxPositionals: 1,
375
375
  message: "workbench improve does not accept a VERSION argument.",
376
- remediation: "Run workbench improve for current source after recording failed or reviewed eval evidence.",
376
+ remediation: "workbench improve",
377
377
  });
378
378
  if (parsed.flags.cloud === true) {
379
379
  return await handleCloudImprove(parsed, io);
@@ -384,6 +384,7 @@ export async function runCli(argv, io = {
384
384
  agent: stringFlag(parsed, "agents"),
385
385
  budget: intFlag(parsed, "budget"),
386
386
  samples: intFlag(parsed, "samples"),
387
+ progress: (message) => writeCliProgress(parsed, io, message, { json: true }),
387
388
  });
388
389
  return output({
389
390
  ...result,
@@ -469,6 +470,7 @@ export async function runCli(argv, io = {
469
470
  try {
470
471
  writeCliProgress(parsed, io, "workbench publish: preparing Cloud skill.");
471
472
  remote = await ensurePublishRemote(parsed);
473
+ await writeAuthenticatedJsonProgress(parsed, io, remote, `workbench publish: publishing ${optionalPositional(parsed, 1) ?? "current"} source.`);
472
474
  writeCliProgress(parsed, io, `workbench publish: publishing ${optionalPositional(parsed, 1) ?? "current"} source.`);
473
475
  result = await publishWorkbenchVersion({
474
476
  ...core,
@@ -535,7 +537,7 @@ async function handleStatus(parsed, io) {
535
537
  async function handleLog(parsed, io) {
536
538
  if (parsed.flags.runs === true && parsed.flags.versions === true) {
537
539
  throw new WorkbenchCodedError("usage", "workbench log accepts only one of --runs or --versions.", {
538
- remediation: "Run workbench log --runs or workbench log --versions.",
540
+ remediation: "workbench log --runs",
539
541
  exitCode: 2,
540
542
  });
541
543
  }
@@ -549,7 +551,7 @@ async function handleLog(parsed, io) {
549
551
  rejectExtraInput(parsed, {
550
552
  maxPositionals: 1,
551
553
  message: "workbench log does not accept refs or paths.",
552
- remediation: "Run workbench log, workbench log --runs, or workbench log --versions.",
554
+ remediation: "workbench log",
553
555
  });
554
556
  }
555
557
  const snapshot = await createWorkbenchInspectionSnapshot(await coreOptions(parsed));
@@ -683,7 +685,7 @@ async function handleAdapterLogout(provider, parsed, io) {
683
685
  status: "not_authenticated",
684
686
  sync: "skipped",
685
687
  reason: "not_authenticated",
686
- remediation: "Run workbench login.",
688
+ remediation: "workbench login",
687
689
  };
688
690
  }
689
691
  throw error;
@@ -772,7 +774,7 @@ async function handleLogin(parsed, io) {
772
774
  }
773
775
  if (parsed.flags["start-only"] === true || parsed.flags.wait === true || parsed.flags.timeout !== undefined || parsed.flags["no-open"] === true) {
774
776
  throw new WorkbenchCodedError("usage", "Workbench Cloud login flags do not apply to provider login.", {
775
- remediation: `Run workbench login ${provider} --method ${authMethod(parsed, provider)}.`,
777
+ remediation: `workbench login ${provider} --method ${authMethod(parsed, provider)}`,
776
778
  exitCode: 2,
777
779
  });
778
780
  }
@@ -780,7 +782,7 @@ async function handleLogin(parsed, io) {
780
782
  }
781
783
  if (parsed.flags["start-only"] === true && parsed.flags.wait === true) {
782
784
  throw new WorkbenchCodedError("usage", "workbench login accepts only one of --start-only or --wait.", {
783
- remediation: `Run workbench login --start-only or workbench login --wait --timeout ${LOGIN_WAIT_TIMEOUT_SECONDS}.`,
785
+ remediation: "workbench login --start-only",
784
786
  exitCode: 2,
785
787
  });
786
788
  }
@@ -790,13 +792,13 @@ async function handleLogin(parsed, io) {
790
792
  const timeoutSeconds = intFlag(parsed, "timeout");
791
793
  if (startOnly && timeoutSeconds !== undefined) {
792
794
  throw new WorkbenchCodedError("usage", "workbench login --timeout only applies with --wait.", {
793
- remediation: `Run workbench login --start-only, then workbench login --wait --timeout ${LOGIN_WAIT_TIMEOUT_SECONDS}.`,
795
+ remediation: "workbench login --start-only",
794
796
  exitCode: 2,
795
797
  });
796
798
  }
797
799
  if (waitOnly && timeoutSeconds === undefined) {
798
800
  throw new WorkbenchCodedError("usage", "workbench login --wait requires --timeout N.", {
799
- remediation: `Run workbench login --wait --timeout ${LOGIN_WAIT_TIMEOUT_SECONDS}.`,
801
+ remediation: `workbench login --wait --timeout ${LOGIN_WAIT_TIMEOUT_SECONDS}`,
800
802
  exitCode: 2,
801
803
  });
802
804
  }
@@ -905,11 +907,11 @@ async function handleInstall(parsed, io) {
905
907
  rejectExtraInput(parsed, {
906
908
  maxPositionals: 1,
907
909
  message: "workbench install with no HANDLE_OR_URL lists installed skills.",
908
- remediation: "Run workbench install OWNER/SKILL to install a published skill.",
910
+ remediation: "workbench install OWNER/SKILL",
909
911
  });
910
912
  if (parsed.flags.yes === true || parsed.flags["dry-run"] === true) {
911
913
  throw new WorkbenchCodedError("usage", "workbench install inventory does not accept --yes or --dry-run.", {
912
- remediation: "Run workbench install --json, or run workbench install OWNER/SKILL --dry-run.",
914
+ remediation: "workbench install OWNER/SKILL --dry-run",
913
915
  exitCode: 2,
914
916
  });
915
917
  }
@@ -922,13 +924,13 @@ async function handleInstall(parsed, io) {
922
924
  rejectExtraInput(parsed, {
923
925
  maxPositionals: 2,
924
926
  message: "workbench install accepts one HANDLE_OR_URL argument.",
925
- remediation: "Run workbench install OWNER/SKILL.",
927
+ remediation: "workbench install OWNER/SKILL",
926
928
  });
927
929
  const source = await resolveWorkbenchInstallSourceInput(sourceInput);
928
930
  const workbenchSource = parseWorkbenchInstallSource(source);
929
931
  if (!workbenchSource) {
930
932
  throw new WorkbenchCodedError("usage", "workbench install requires a Workbench Cloud source URL.", {
931
- remediation: "Run workbench install OWNER/SKILL.",
933
+ remediation: "workbench install OWNER/SKILL",
932
934
  exitCode: 2,
933
935
  });
934
936
  }
@@ -1096,7 +1098,7 @@ async function startCloudExecution(command, parsed, io) {
1096
1098
  const source = parseWorkbenchInstallSource(remote.url);
1097
1099
  if (!source) {
1098
1100
  throw new WorkbenchCodedError("remote_invalid_url", `Workbench remote is not a Cloud skill URL: ${remote.url}`, {
1099
- remediation: "Run workbench publish to recreate the Workbench Cloud link.",
1101
+ remediation: "workbench publish",
1100
1102
  subject: { remote: remote.name, url: remote.url },
1101
1103
  exitCode: 2,
1102
1104
  });
@@ -1241,7 +1243,7 @@ async function resolveCloudAdapterAuthTargets(input) {
1241
1243
  const version = snapshotVersionByRef(snapshot, input.versionId);
1242
1244
  if (!version) {
1243
1245
  throw new WorkbenchCodedError("version_not_found", `Version not found: ${input.versionId}`, {
1244
- remediation: "Run workbench status.",
1246
+ remediation: "workbench status",
1245
1247
  subject: { versionId: input.versionId },
1246
1248
  exitCode: 1,
1247
1249
  });
@@ -1263,8 +1265,8 @@ async function assertCloudAdapterAuthConnected(input) {
1263
1265
  if (!missing) {
1264
1266
  return;
1265
1267
  }
1266
- throw new WorkbenchCodedError("adapter_auth_required", `${formatCloudAdapterAuthTarget(missing)} disconnected. Run workbench login ${missing.adapterId}.`, {
1267
- remediation: `Run workbench login ${missing.adapterId}.`,
1268
+ throw new WorkbenchCodedError("adapter_auth_required", `${formatCloudAdapterAuthTarget(missing)} disconnected.`, {
1269
+ remediation: `workbench login ${missing.adapterId}`,
1268
1270
  subject: {
1269
1271
  adapterId: missing.adapterId,
1270
1272
  profile: missing.profile,
@@ -1397,7 +1399,7 @@ async function switchHostedImproveVersionIfPromoted(started) {
1397
1399
  const currentVersionId = snapshot.status.currentVersionId ?? snapshot.refs.current;
1398
1400
  if (started.startVersionId && currentVersionId && currentVersionId !== started.startVersionId) {
1399
1401
  throw new WorkbenchCodedError("worktree_changed", "Local source changed while hosted improve was running; refusing to overwrite it.", {
1400
- remediation: `Review workbench diff, then run workbench switch ${outputVersionId} when ready.`,
1402
+ remediation: `workbench switch ${outputVersionId}`,
1401
1403
  subject: {
1402
1404
  startedFrom: started.startVersionId,
1403
1405
  current: currentVersionId,
@@ -1423,7 +1425,7 @@ async function ensureCloudRemoteForExecution(root, parsed) {
1423
1425
  const source = parseWorkbenchInstallSource(remote.url);
1424
1426
  if (!source) {
1425
1427
  throw new WorkbenchCodedError("remote_invalid_url", `Workbench remote is not a Cloud skill URL: ${remote.url}`, {
1426
- remediation: "Run workbench publish to recreate the Workbench Cloud link.",
1428
+ remediation: "workbench publish",
1427
1429
  subject: { remote: remote.name, url: remote.url },
1428
1430
  exitCode: 2,
1429
1431
  });
@@ -1485,7 +1487,7 @@ async function resolveCloudSkillId(source) {
1485
1487
  const skill = listed.skills?.find((entry) => entry.ownerSlug === source.owner && entry.name === source.skill);
1486
1488
  if (!skill?.id) {
1487
1489
  throw new WorkbenchCodedError("remote_not_found", `Workbench Cloud skill not found: ${source.owner}/${source.skill}`, {
1488
- remediation: "Run workbench publish.",
1490
+ remediation: "workbench publish",
1489
1491
  subject: { owner: source.owner, skill: source.skill },
1490
1492
  exitCode: 1,
1491
1493
  });
@@ -1603,8 +1605,8 @@ function writeCloudProgress(io, message, enabled = true) {
1603
1605
  }
1604
1606
  io.stderr.write(`${message}\n`);
1605
1607
  }
1606
- function writeCliProgress(parsed, io, message) {
1607
- if (parsed.flags.json === true) {
1608
+ function writeCliProgress(parsed, io, message, options = {}) {
1609
+ if (parsed.flags.json === true && options.json !== true) {
1608
1610
  return;
1609
1611
  }
1610
1612
  io.stderr.write(`${message}\n`);
@@ -1698,7 +1700,7 @@ async function fetchWorkbenchInstallSourceSnapshot(source, displaySource) {
1698
1700
  throw new WorkbenchCodedError("auth_required", token
1699
1701
  ? `Workbench Cloud rejected the provided token while installing ${displaySource}.`
1700
1702
  : `Authentication is required to install ${displaySource}.`, {
1701
- remediation: "Run workbench login.",
1703
+ remediation: "workbench login",
1702
1704
  exitCode: 1,
1703
1705
  });
1704
1706
  }
@@ -1837,9 +1839,9 @@ function optionalWorkbenchBaseUrl(input = {}) {
1837
1839
  function workbenchLoginRemediation(baseUrl) {
1838
1840
  const normalized = baseUrl ? normalizeBaseUrl(baseUrl) : DEFAULT_WORKBENCH_CLOUD_BASE_URL;
1839
1841
  if (normalized === DEFAULT_WORKBENCH_CLOUD_BASE_URL) {
1840
- return "Run workbench login.";
1842
+ return "workbench login";
1841
1843
  }
1842
- return `Run workbench login --base-url ${normalized}.`;
1844
+ return `workbench login --base-url ${normalized}`;
1843
1845
  }
1844
1846
  function normalizeBaseUrl(value) {
1845
1847
  return value.trim().replace(/\/+$/u, "");
@@ -1915,7 +1917,7 @@ async function pollDeviceToken(baseUrl, authorization, timeoutSeconds) {
1915
1917
  }
1916
1918
  throw new WorkbenchCodedError("login_pending", "Device login is still waiting for browser authorization.", {
1917
1919
  retryable: true,
1918
- remediation: `Authorize the device in the browser, then run workbench login --wait --timeout ${LOGIN_WAIT_TIMEOUT_SECONDS}.`,
1920
+ remediation: `workbench login --wait --timeout ${LOGIN_WAIT_TIMEOUT_SECONDS}`,
1919
1921
  subject: {
1920
1922
  retryAfterSeconds: Math.max(1, Math.ceil(intervalMs / 1000)),
1921
1923
  verificationUri: authorization.verification_uri,
@@ -2088,7 +2090,7 @@ async function uploadAdapterConnection(bundle, parsed) {
2088
2090
  status: "not_authenticated",
2089
2091
  sync: "skipped",
2090
2092
  reason: "not_authenticated",
2091
- remediation: "Run workbench login.",
2093
+ remediation: "workbench login",
2092
2094
  };
2093
2095
  }
2094
2096
  await apiRequest(adapterConnectionApiPath(bundle), { method: "PUT", body: { bundle } });
@@ -2108,7 +2110,7 @@ async function deleteAdapterConnectionRemote(target, parsed) {
2108
2110
  status: "not_authenticated",
2109
2111
  sync: "skipped",
2110
2112
  reason: "not_authenticated",
2111
- remediation: "Run workbench login.",
2113
+ remediation: "workbench login",
2112
2114
  };
2113
2115
  }
2114
2116
  await apiRequest(adapterConnectionApiPath(target), { method: "DELETE" });
@@ -2682,7 +2684,7 @@ async function defaultDiffRange(core) {
2682
2684
  const current = snapshot.versions.find((version) => version.id === currentId);
2683
2685
  if (!current) {
2684
2686
  throw new WorkbenchCodedError("version_not_found", "Current Workbench version was not found.", {
2685
- remediation: "Run workbench log --versions.",
2687
+ remediation: "workbench log --versions",
2686
2688
  exitCode: 1,
2687
2689
  });
2688
2690
  }
@@ -2697,7 +2699,7 @@ function parsePublishVisibilityFlags(parsed) {
2697
2699
  ].filter((value) => Boolean(value));
2698
2700
  if (selected.length > 1) {
2699
2701
  throw new WorkbenchCodedError("usage", "workbench publish accepts only one visibility flag.", {
2700
- remediation: "Run workbench publish --private, workbench publish --team, or workbench publish --public.",
2702
+ remediation: "workbench publish --private",
2701
2703
  exitCode: 2,
2702
2704
  });
2703
2705
  }
@@ -2716,7 +2718,7 @@ async function previewPublishWithDerivedRemote(parsed) {
2716
2718
  : snapshotVersionByRef(reconciledSnapshot, reconciledSnapshot.status.currentVersionId ?? reconciledSnapshot.refs.current ?? "");
2717
2719
  if (!version) {
2718
2720
  throw new WorkbenchCodedError("version_not_found", `Version not found: ${requestedVersion ?? "current"}`, {
2719
- remediation: "Run workbench log --versions.",
2721
+ remediation: "workbench log --versions",
2720
2722
  subject: { version: requestedVersion ?? "current" },
2721
2723
  exitCode: 1,
2722
2724
  });
@@ -2755,6 +2757,20 @@ async function ensurePublishRemote(parsed) {
2755
2757
  const result = await addWorkbenchRemote(remote.name, remote.url, core);
2756
2758
  return result.remote.name;
2757
2759
  }
2760
+ async function writeAuthenticatedJsonProgress(parsed, io, remoteName, message) {
2761
+ if (parsed.flags.json !== true) {
2762
+ return;
2763
+ }
2764
+ const root = path.resolve(dirFlag(parsed) ?? process.cwd());
2765
+ const remote = remoteName
2766
+ ? (await inspectionRemotes(root)).find((entry) => entry.name === remoteName)
2767
+ : preferredCloudRemote(await inspectionRemotes(root));
2768
+ const source = remote ? parseWorkbenchInstallSource(remote.url) : undefined;
2769
+ if (!source || !await workbenchCloudToken({ baseUrl: source.baseUrl })) {
2770
+ return;
2771
+ }
2772
+ writeCliProgress(parsed, io, message, { json: true });
2773
+ }
2758
2774
  async function derivePublishCloudRemote(parsed, action = "workbench publish", name = "cloud") {
2759
2775
  const config = await loadConfig();
2760
2776
  const baseUrl = optionalWorkbenchBaseUrl({ configBaseUrl: config.baseUrl }) ?? DEFAULT_WORKBENCH_CLOUD_BASE_URL;
@@ -2767,7 +2783,7 @@ function installHandleFromCloudRemote(remote) {
2767
2783
  const source = parseWorkbenchInstallSource(remote.url);
2768
2784
  if (!source) {
2769
2785
  throw new WorkbenchCodedError("remote_invalid_url", `Workbench remote is not a Cloud skill URL: ${remote.url}`, {
2770
- remediation: "Run workbench publish to recreate the Workbench Cloud link.",
2786
+ remediation: "workbench publish",
2771
2787
  subject: { remote: remote.name, url: remote.url },
2772
2788
  exitCode: 2,
2773
2789
  });
@@ -2798,14 +2814,14 @@ async function publishAuthRemediation(parsed, remoteName, fallback) {
2798
2814
  return workbenchLoginRemediation(source?.baseUrl);
2799
2815
  }
2800
2816
  catch {
2801
- return fallback ?? "Run workbench login.";
2817
+ return fallback ?? "workbench login";
2802
2818
  }
2803
2819
  }
2804
2820
  function parseOwnerSkillHandle(input) {
2805
2821
  const handle = normalizedOwnerSkillHandle(input);
2806
2822
  if (!handle) {
2807
2823
  throw new WorkbenchCodedError("usage", "workbench publish --as expects OWNER/SKILL.", {
2808
- remediation: "Run workbench publish --as OWNER/SKILL.",
2824
+ remediation: "workbench publish --as OWNER/SKILL",
2809
2825
  exitCode: 2,
2810
2826
  });
2811
2827
  }
@@ -2815,7 +2831,7 @@ function derivedOwnerSkillHandle(parsed, config, action) {
2815
2831
  const owner = config.username?.trim();
2816
2832
  if (!owner) {
2817
2833
  throw new WorkbenchCodedError("auth_required", `${action} needs a logged-in Workbench Cloud username before it can derive OWNER/SKILL.`, {
2818
- remediation: "Run workbench login.",
2834
+ remediation: "workbench login",
2819
2835
  exitCode: 1,
2820
2836
  });
2821
2837
  }
@@ -2823,7 +2839,7 @@ function derivedOwnerSkillHandle(parsed, config, action) {
2823
2839
  const handle = normalizeOwnerSkillHandle(owner, path.basename(root));
2824
2840
  if (!handle.owner || !handle.skill) {
2825
2841
  throw new WorkbenchCodedError("usage", `${action} could not derive a valid OWNER/SKILL handle.`, {
2826
- remediation: `Run ${action} --as OWNER/SKILL.`,
2842
+ remediation: `${action} --as OWNER/SKILL`,
2827
2843
  subject: { owner, skill: path.basename(root) },
2828
2844
  exitCode: 2,
2829
2845
  });
@@ -2837,7 +2853,7 @@ async function resolveWorkbenchInstallSourceInput(input) {
2837
2853
  const handle = normalizedOwnerSkillHandle(input);
2838
2854
  if (!handle) {
2839
2855
  throw new WorkbenchCodedError("usage", "workbench install expects OWNER/SKILL or a Workbench Cloud skill URL.", {
2840
- remediation: "Run workbench install OWNER/SKILL.",
2856
+ remediation: "workbench install OWNER/SKILL",
2841
2857
  exitCode: 2,
2842
2858
  });
2843
2859
  }
@@ -3446,7 +3462,7 @@ async function fileForRunOrJobRef(core, objectRef, requestedPath) {
3446
3462
  return file;
3447
3463
  }
3448
3464
  throw new WorkbenchCodedError("ref_not_found", `File not found in ${objectRef}: ${requestedPath}`, {
3449
- remediation: `Run workbench show ${objectRef}.`,
3465
+ remediation: `workbench show ${objectRef}`,
3450
3466
  subject: { ref: objectRef, path: requestedPath },
3451
3467
  exitCode: 1,
3452
3468
  });
@@ -3507,7 +3523,7 @@ function singleEquivalentShowFile(files) {
3507
3523
  function ambiguousShowPath(objectRef, requestedPath, candidates) {
3508
3524
  const candidatePaths = candidates.map((file) => file.path);
3509
3525
  return new WorkbenchCodedError("ref_ambiguous", `File path is ambiguous in ${objectRef}: ${requestedPath}. Candidates: ${candidatePaths.join(", ")}.`, {
3510
- remediation: `Run workbench show ${objectRef}.`,
3526
+ remediation: `workbench show ${objectRef}`,
3511
3527
  subject: { ref: objectRef, path: requestedPath, candidates: candidatePaths },
3512
3528
  exitCode: 2,
3513
3529
  });
@@ -47,7 +47,7 @@ export async function installSnapshotToStore(options) {
47
47
  : "none";
48
48
  if (!options.dryRun && existingHash && previous === "overwritten" && !options.overwrite) {
49
49
  throw new WorkbenchCodedError("install_failed", `Canonical skill already exists: ${destination}`, {
50
- remediation: "Pass --yes to overwrite the existing canonical store skill.",
50
+ remediation: `workbench install ${options.provenance.handle} --yes`,
51
51
  subject: { destination },
52
52
  exitCode: 1,
53
53
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workbench-ai/workbench",
3
- "version": "0.0.101",
3
+ "version": "0.0.102",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/workbench-ai/workbench.git",
@@ -21,10 +21,10 @@
21
21
  ],
22
22
  "dependencies": {
23
23
  "yaml": "^2.8.2",
24
- "@workbench-ai/workbench-contract": "0.0.101",
25
- "@workbench-ai/workbench-built-in-adapters": "0.0.101",
26
- "@workbench-ai/workbench-protocol": "0.0.101",
27
- "@workbench-ai/workbench-core": "0.0.101"
24
+ "@workbench-ai/workbench-built-in-adapters": "0.0.102",
25
+ "@workbench-ai/workbench-protocol": "0.0.102",
26
+ "@workbench-ai/workbench-contract": "0.0.102",
27
+ "@workbench-ai/workbench-core": "0.0.102"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@tailwindcss/postcss": "^4.2.2",
@@ -35,7 +35,7 @@
35
35
  "react-dom": "^19.2.0",
36
36
  "typescript": "^5.9.2",
37
37
  "vitest": "^3.2.4",
38
- "@workbench-ai/workbench-ui": "0.0.101"
38
+ "@workbench-ai/workbench-ui": "0.0.102"
39
39
  },
40
40
  "scripts": {
41
41
  "build": "rm -rf dist && tsc -p tsconfig.json && chmod 755 dist/workbench.js && node ./scripts/build-dev-open-assets.mjs",