@warmhub/cli 0.64.0 → 0.66.0

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 (2) hide show
  1. package/dist/wh.js +130 -156
  2. package/package.json +1 -1
package/dist/wh.js CHANGED
@@ -27292,7 +27292,6 @@ var SUBSCRIBABLE_EVENT_TYPES = [
27292
27292
  ];
27293
27293
  // ../../packages/rules/src/system-components/system.ts
27294
27294
  var SYSTEM_COMPONENT_ID = "com.warmhub.system";
27295
- var SYSTEM_REGISTERED_COMPONENT_REF = "warmhub/system";
27296
27295
  var COMPONENT_INSTALL_FIELDS = {
27297
27296
  componentId: "string",
27298
27297
  name: "string",
@@ -27353,7 +27352,7 @@ function findSystemComponent(componentId) {
27353
27352
  // ../../packages/sdk-ts/package.json
27354
27353
  var package_default = {
27355
27354
  name: "@warmhub/sdk-ts",
27356
- version: "0.63.0",
27355
+ version: "0.65.0",
27357
27356
  private: false,
27358
27357
  type: "module",
27359
27358
  description: "The TypeScript SDK for WarmHub — create repos, commit and query data, and compound knowledge with your AI agents.",
@@ -28439,6 +28438,18 @@ class WarmHubClient {
28439
28438
  throw toWarmHubError(error);
28440
28439
  }
28441
28440
  },
28441
+ history: async (orgName, repoName, opts) => {
28442
+ try {
28443
+ return await this.trpc.component.history.query({
28444
+ orgName,
28445
+ repoName,
28446
+ componentRef: opts?.componentRef,
28447
+ limit: opts?.limit
28448
+ });
28449
+ } catch (error) {
28450
+ throw toWarmHubError(error);
28451
+ }
28452
+ },
28442
28453
  install: async (orgName, repoName, componentRef) => {
28443
28454
  try {
28444
28455
  return await this.trpc.component.install.mutate({
@@ -32744,17 +32755,37 @@ function escapeTerminalTextForDisplay(value) {
32744
32755
  var escapeInlineTerminalText = escapeFieldNameForDisplay;
32745
32756
  function renderWarningLine(out, c, chars, op) {
32746
32757
  const warnings = op.warnings;
32747
- if (!warnings || warnings.undeclaredFields.length === 0)
32758
+ if (!warnings)
32748
32759
  return;
32749
- const shapeName = extractShapeName(op.name);
32750
- const total = warnings.totalUndeclared ?? warnings.undeclaredFields.length;
32760
+ renderUndeclaredFieldsWarning(out, c, chars, op.name, warnings);
32761
+ renderCoalescedWrefsWarning(out, c, chars, warnings);
32762
+ }
32763
+ function renderUndeclaredFieldsWarning(out, c, chars, opName, warnings) {
32764
+ const undeclaredFields = warnings.undeclaredFields;
32765
+ if (!undeclaredFields || undeclaredFields.length === 0)
32766
+ return;
32767
+ const shapeName = extractShapeName(opName);
32768
+ const total = warnings.totalUndeclared ?? undeclaredFields.length;
32751
32769
  const noun = total === 1 ? "field" : "fields";
32752
32770
  const shapeLabel = shapeName ? ` ${shapeName}` : "";
32753
- const remaining = warnings.undeclaredFieldsTruncated ? total - warnings.undeclaredFields.length : 0;
32754
- const fieldsList = warnings.undeclaredFields.map(escapeInlineTerminalText).join(", ");
32771
+ const remaining = warnings.undeclaredFieldsTruncated ? total - undeclaredFields.length : 0;
32772
+ const fieldsList = undeclaredFields.map(escapeInlineTerminalText).join(", ");
32755
32773
  const moreSuffix = remaining > 0 ? ` ${c.dim}(+${remaining} more)${c.reset}` : "";
32756
32774
  out(` ${c.yellow}${chars.warn}${c.reset} ${total} ${noun} not declared in shape${shapeLabel}: ${c.dim}${fieldsList}${c.reset}${moreSuffix}`);
32757
32775
  }
32776
+ function renderCoalescedWrefsWarning(out, c, chars, warnings) {
32777
+ const coalescedWrefs = warnings.coalescedWrefs;
32778
+ if (!coalescedWrefs || coalescedWrefs.length === 0)
32779
+ return;
32780
+ for (const entry of coalescedWrefs) {
32781
+ out(` ${c.yellow}${chars.warn}${c.reset} coalesced wref ${escapeInlineTerminalText(entry.fieldPath)}: ${c.dim}${escapeInlineTerminalText(entry.wref)}${c.reset} (${escapeInlineTerminalText(entry.reason)})`);
32782
+ }
32783
+ const total = warnings.totalCoalescedWrefs ?? coalescedWrefs.length;
32784
+ const remaining = warnings.coalescedWrefsTruncated ? total - coalescedWrefs.length : 0;
32785
+ if (remaining > 0) {
32786
+ out(` ${c.dim}(+${remaining} more coalesced wrefs)${c.reset}`);
32787
+ }
32788
+ }
32758
32789
  function renderCommitterEcho(out, c, committer) {
32759
32790
  if (!committer)
32760
32791
  return;
@@ -37882,6 +37913,24 @@ function isInstallSnapshotCacheShape(value) {
37882
37913
  if (!Array.isArray(component.methods))
37883
37914
  return false;
37884
37915
  }
37916
+ if (!isPlainObject2(value.installs))
37917
+ return false;
37918
+ const installs = value.installs;
37919
+ for (const entry of Object.values(installs)) {
37920
+ if (!isPlainObject2(entry))
37921
+ return false;
37922
+ const install = entry;
37923
+ if (typeof install.ref !== "string")
37924
+ return false;
37925
+ if (typeof install.version !== "string")
37926
+ return false;
37927
+ if (install.latestVersion !== undefined && typeof install.latestVersion !== "string") {
37928
+ return false;
37929
+ }
37930
+ if (install.updateAvailable !== undefined && typeof install.updateAvailable !== "boolean") {
37931
+ return false;
37932
+ }
37933
+ }
37885
37934
  return true;
37886
37935
  }
37887
37936
 
@@ -37955,6 +38004,7 @@ async function refreshInstallSnapshotCache(repoSlug, client, opts) {
37955
38004
  }
37956
38005
  async function refreshFromSummaries(repoSlug, parsed, activeItems, client, now, previousCache) {
37957
38006
  const components = {};
38007
+ const installs = {};
37958
38008
  let detailReadFailures = 0;
37959
38009
  for (const item of activeItems) {
37960
38010
  if (!item.ref)
@@ -37971,13 +38021,20 @@ async function refreshFromSummaries(repoSlug, parsed, activeItems, client, now,
37971
38021
  }
37972
38022
  continue;
37973
38023
  }
37974
- const manifest = extractInstalledManifest(detail.install.data);
37975
- if (!manifest)
37976
- continue;
38024
+ if (!detail.installedManifest || typeof detail.installedManifest !== "object") {
38025
+ throw new Error(`component.get returned no installedManifest for ${itemRef}; the backend must support GH-4690 (installedManifest on component.get)`);
38026
+ }
38027
+ const manifest = detail.installedManifest;
38028
+ installs[item.componentName] = {
38029
+ ref: itemRef,
38030
+ version: manifest.component.version ?? item.version ?? "",
38031
+ latestVersion: item.latestVersion,
38032
+ updateAvailable: item.updateAvailable
38033
+ };
37977
38034
  const methods = manifest.cli?.methods ?? [];
37978
38035
  if (methods.length === 0)
37979
38036
  continue;
37980
- const ref = extractRegisteredRef(detail.install.data);
38037
+ const ref = extractRegisteredRef(itemRef);
37981
38038
  if (!ref)
37982
38039
  continue;
37983
38040
  components[item.componentName] = {
@@ -37987,7 +38044,9 @@ async function refreshFromSummaries(repoSlug, parsed, activeItems, client, now,
37987
38044
  version: manifest.component.version ?? item.version ?? "",
37988
38045
  description: manifest.cli?.description,
37989
38046
  manifestHash: item.manifestHash ?? "",
37990
- methods
38047
+ methods,
38048
+ latestVersion: item.latestVersion,
38049
+ updateAvailable: item.updateAvailable
37991
38050
  };
37992
38051
  }
37993
38052
  if (activeItems.length > 0 && detailReadFailures === activeItems.length) {
@@ -37999,7 +38058,8 @@ async function refreshFromSummaries(repoSlug, parsed, activeItems, client, now,
37999
38058
  const cache = {
38000
38059
  cachedAt: now,
38001
38060
  repoSlug,
38002
- components
38061
+ components,
38062
+ installs
38003
38063
  };
38004
38064
  writeInstallSnapshotCache(repoSlug, cache);
38005
38065
  return cache;
@@ -38020,10 +38080,7 @@ async function fetchAllSummaries(client, org, repo) {
38020
38080
  function filterActiveItems(items) {
38021
38081
  return items.filter((i) => i.active && i.state !== "uninstalled" && i.state !== "paused" && i.state !== "error");
38022
38082
  }
38023
- function extractRegisteredRef(data) {
38024
- if (typeof data !== "object" || data === null)
38025
- return null;
38026
- const ref = data.registeredComponentRef;
38083
+ function extractRegisteredRef(ref) {
38027
38084
  if (typeof ref !== "string" || ref.length === 0)
38028
38085
  return null;
38029
38086
  const segments = ref.split("/");
@@ -38034,27 +38091,6 @@ function extractRegisteredRef(data) {
38034
38091
  return null;
38035
38092
  return { ownerOrgName: org, registeredComponentName: name };
38036
38093
  }
38037
- function extractInstalledManifest(data) {
38038
- if (typeof data !== "object" || data === null)
38039
- return null;
38040
- const raw = data.manifest;
38041
- let manifest;
38042
- if (typeof raw === "string") {
38043
- try {
38044
- manifest = JSON.parse(raw);
38045
- } catch {
38046
- return null;
38047
- }
38048
- } else {
38049
- manifest = raw;
38050
- }
38051
- if (typeof manifest !== "object" || manifest === null)
38052
- return null;
38053
- const component = manifest.component;
38054
- if (typeof component !== "object" || component === null)
38055
- return null;
38056
- return manifest;
38057
- }
38058
38094
 
38059
38095
  // ../../packages/warmhub-cli/src/manifest.ts
38060
38096
  var GLOBAL_FLAGS = [
@@ -38365,6 +38401,13 @@ var handleComponentExec = async (ctx, { args, terminator }) => {
38365
38401
  const cache = await ensureFreshInstallSnapshotCache(installRepo, ctx.client);
38366
38402
  const entry = cache.components[componentName];
38367
38403
  if (!entry) {
38404
+ const install = cache.installs[componentName];
38405
+ if (install?.updateAvailable && install.latestVersion) {
38406
+ throw new CliError(2 /* UserInput */, "USER_INPUT", `Component '${componentName}' is installed at ${install.version || "an older version"} in ${installRepo}, which exposes no CLI method${methodName ? ` '${methodName}'` : "s"}.`, undefined, `Version ${install.latestVersion} is available — run 'wh component update ${install.ref} --repo ${installRepo}', then 'wh component exec ${componentName} --help' to see its methods.`);
38407
+ }
38408
+ if (install) {
38409
+ throw new CliError(2 /* UserInput */, "USER_INPUT", `Component '${componentName}' is installed in ${installRepo} but exposes no CLI methods.`);
38410
+ }
38368
38411
  throw new CliError(2 /* UserInput */, "USER_INPUT", `Component '${componentName}' is not installed in ${installRepo}.`, undefined, `Run 'wh component install <ref> --repo ${installRepo}' first.`);
38369
38412
  }
38370
38413
  if (!methodName) {
@@ -38376,7 +38419,9 @@ var handleComponentExec = async (ctx, { args, terminator }) => {
38376
38419
  }
38377
38420
  const method = entry.methods.find((m) => m.name === methodName);
38378
38421
  if (!method) {
38379
- throw new CliError(2 /* UserInput */, "USER_INPUT", `Method '${methodName}' not found on component '${componentName}'.`, undefined, `Available: ${entry.methods.map((m) => m.name).join(", ")}. Run wh component update ${entry.ref} --repo ${installRepo} if you expect a newer method.`);
38422
+ const available = entry.methods.map((m) => m.name).join(", ");
38423
+ const updateHint = entry.updateAvailable && entry.latestVersion ? `Version ${entry.latestVersion} is available — run wh component update ${entry.ref} --repo ${installRepo} for newer methods.` : `Run wh component update ${entry.ref} --repo ${installRepo} if you expect a newer method.`;
38424
+ throw new CliError(2 /* UserInput */, "USER_INPUT", `Method '${methodName}' not found on component '${componentName}'.`, undefined, `Available: ${available}. ${updateHint}`);
38380
38425
  }
38381
38426
  if (helpRequested) {
38382
38427
  renderMethodHelp(ctx, componentName, method);
@@ -38697,6 +38742,9 @@ function renderTeardownResult(ctx, result) {
38697
38742
  if (result.pausedSubscriptions.length > 0) {
38698
38743
  ctx.out(` ${c.green}paused${c.reset} ${result.pausedSubscriptions.length} subscription(s): ${result.pausedSubscriptions.join(", ")}`);
38699
38744
  }
38745
+ if (result.releasedShapes.length > 0) {
38746
+ ctx.out(` ${c.green}released${c.reset} ${result.releasedShapes.length} shape(s): ${result.releasedShapes.join(", ")}`);
38747
+ }
38700
38748
  if (result.tokensRevoked > 0) {
38701
38749
  ctx.out(` ${c.green}revoked${c.reset} ${result.tokensRevoked} token(s)`);
38702
38750
  }
@@ -38856,46 +38904,6 @@ function readManifestArg(path2) {
38856
38904
  }
38857
38905
  return parsed;
38858
38906
  }
38859
- function asRecord(value) {
38860
- if (!value || typeof value !== "object" || Array.isArray(value)) {
38861
- return;
38862
- }
38863
- return value;
38864
- }
38865
- function readString(data, key) {
38866
- const candidate = data?.[key];
38867
- return typeof candidate === "string" && candidate.length > 0 ? candidate : undefined;
38868
- }
38869
- function componentInstallIdFromWref(wref) {
38870
- const prefix = "ComponentInstall/";
38871
- return wref.startsWith(prefix) ? wref.slice(prefix.length) : undefined;
38872
- }
38873
- function componentInstallCanonicalId(item) {
38874
- const data = asRecord(item.data);
38875
- return componentInstallIdFromWref(item.wref) ?? readString(data, "id") ?? readString(data, "componentId") ?? item.name;
38876
- }
38877
- function componentInstallHasRegisteredRef(item, ref) {
38878
- return readString(asRecord(item.data), "registeredComponentRef") === ref;
38879
- }
38880
- async function resolveInstalledComponentRefId(client, org, repo, ref) {
38881
- let cursor;
38882
- do {
38883
- const result = await client.thing.head(org, repo, {
38884
- shape: "ComponentInstall",
38885
- kind: "thing",
38886
- limit: 500,
38887
- cursor
38888
- });
38889
- const items = result.items ?? [];
38890
- const exactMatch = items.find((item) => componentInstallHasRegisteredRef(item, ref));
38891
- const resolved = exactMatch ? componentInstallCanonicalId(exactMatch) : undefined;
38892
- if (resolved) {
38893
- return resolved;
38894
- }
38895
- cursor = result.nextCursor;
38896
- } while (cursor);
38897
- throw new CliError(2 /* UserInput */, "USER_INPUT", `Component '${ref}' is not installed. Run 'wh component install <org>/<name>' first.`);
38898
- }
38899
38907
 
38900
38908
  // ../../packages/warmhub-cli/src/domains/component-handlers.ts
38901
38909
  var handleUpdate = async (ctx, { args }) => {
@@ -39025,8 +39033,9 @@ var handleView3 = async (ctx, { args }) => {
39025
39033
  writeOutput(ctx, viewData, () => {
39026
39034
  const c = ctx.colors;
39027
39035
  ctx.out(`${c.bold}Component:${c.reset} ${c.cyan}${viewData.ref ?? ref}${c.reset}`);
39028
- ctx.out(`${c.bold}Version:${c.reset} ${viewData.version ?? "unknown"}`);
39029
- ctx.out(`${c.bold}State:${c.reset} ${viewData.state ?? "-"}`);
39036
+ const update = viewData.updateAvailable && viewData.latestVersion ? ` ${c.yellow}(${viewData.latestVersion} available — run wh component update ${viewData.ref ?? ref} --repo ${org}/${repo})${c.reset}` : "";
39037
+ ctx.out(`${c.bold}Version:${c.reset} ${viewData.version ?? "unknown"}${update}`);
39038
+ ctx.out(`${c.bold}Lifecycle:${c.reset} ${viewData.state ?? "-"}`);
39030
39039
  ctx.out(`${c.bold}Source:${c.reset} ${viewData.source ?? "-"}`);
39031
39040
  if (viewData.ownedShapes.length > 0) {
39032
39041
  ctx.out("");
@@ -39077,67 +39086,37 @@ var handleValidate = async (ctx, { args }) => {
39077
39086
  throw new CliError(2 /* UserInput */, "USER_INPUT", "Component package validation failed");
39078
39087
  }
39079
39088
  };
39080
- // ../../packages/warmhub-cli/src/manifest/shared-infra.ts
39081
- var SHARED_INFRA_SHAPES = findSystemComponent(SYSTEM_COMPONENT_ID)?.shapes ?? [];
39082
-
39083
39089
  // ../../packages/warmhub-cli/src/manifest/doctor.ts
39084
- async function doctorComponent(client, org, repo, componentId) {
39090
+ async function doctorComponent(client, org, repo, ref) {
39085
39091
  const findings = [];
39086
- let installData;
39092
+ let detail;
39087
39093
  try {
39088
- const thing = await client.thing.get(org, repo, `ComponentInstall/${componentId}`);
39089
- installData = thing.data && typeof thing.data === "object" ? thing.data : {};
39094
+ detail = await client.component.get(org, repo, ref);
39090
39095
  findings.push({
39091
- resource: "ComponentInstall",
39096
+ resource: "install",
39092
39097
  status: "ok",
39093
39098
  message: "Install record found"
39094
39099
  });
39095
- } catch {
39100
+ } catch (err) {
39101
+ const kind = isWarmHubError(err) ? err.kind : undefined;
39102
+ const notInstalled = kind === "NOT_FOUND";
39096
39103
  return {
39097
- componentId,
39098
- componentName: componentId,
39099
- state: "error",
39104
+ componentId: ref,
39105
+ componentName: ref,
39106
+ state: notInstalled ? "uninstalled" : "error",
39100
39107
  findings: [
39101
39108
  {
39102
- resource: "ComponentInstall",
39109
+ resource: "install",
39103
39110
  status: "missing",
39104
- message: `ComponentInstall/${componentId} not found`
39111
+ message: notInstalled ? `Component "${ref}" is not actively installed` : `Failed to resolve component "${ref}"`
39105
39112
  }
39106
39113
  ]
39107
39114
  };
39108
39115
  }
39109
- const componentName = typeof installData.name === "string" ? installData.name : componentId;
39110
- const registeredComponentRef = typeof installData.registeredComponentRef === "string" && installData.registeredComponentRef.length > 0 ? installData.registeredComponentRef : undefined;
39111
- if (!registeredComponentRef) {
39112
- findings.push({
39113
- resource: "ComponentInstall",
39114
- status: "error",
39115
- message: "Install record is missing registeredComponentRef"
39116
- });
39117
- return { componentId, componentName, state: "error", findings };
39118
- }
39119
- const existingState = typeof installData.state === "string" ? installData.state : undefined;
39120
- if (existingState === "error") {
39121
- findings.push({
39122
- resource: "state",
39123
- status: "error",
39124
- message: "Component is in error state from a previous operation"
39125
- });
39126
- return { componentId, componentName, state: "error", findings };
39127
- }
39128
- if (existingState === "uninstalled") {
39129
- findings.push({
39130
- resource: "state",
39131
- status: "inactive",
39132
- message: "Component is uninstalled; reinstall to revive it"
39133
- });
39134
- return { componentId, componentName, state: "uninstalled", findings };
39135
- }
39136
- let manifest;
39137
- try {
39138
- const raw = typeof installData.manifest === "string" ? installData.manifest : undefined;
39139
- manifest = raw ? JSON.parse(raw) : { shapes: [], subscriptions: [], credentials: [], seeds: [] };
39140
- } catch {
39116
+ const componentName = detail.componentName;
39117
+ const componentId = detail.installComponentId ?? ref;
39118
+ const registeredComponentRef = detail.ref ?? ref;
39119
+ if (!detail.installedManifest || typeof detail.installedManifest !== "object") {
39141
39120
  return {
39142
39121
  componentId,
39143
39122
  componentName,
@@ -39147,11 +39126,12 @@ async function doctorComponent(client, org, repo, componentId) {
39147
39126
  {
39148
39127
  resource: "manifest",
39149
39128
  status: "error",
39150
- message: "Failed to parse installed manifest snapshot"
39129
+ message: "Installed manifest unavailable from the registry"
39151
39130
  }
39152
39131
  ]
39153
39132
  };
39154
39133
  }
39134
+ const manifest = detail.installedManifest;
39155
39135
  for (const shape of manifest.shapes ?? []) {
39156
39136
  try {
39157
39137
  const s = await client.shape.get(org, repo, shape.name);
@@ -39282,6 +39262,19 @@ async function doctorComponent(client, org, repo, componentId) {
39282
39262
  });
39283
39263
  }
39284
39264
  }
39265
+ if (detail.updateAvailable === true && detail.latestVersion) {
39266
+ findings.push({
39267
+ resource: "version",
39268
+ status: "warning",
39269
+ message: `Installed ${detail.version ?? "version"}; ${detail.latestVersion} available — run wh component update ${registeredComponentRef} --repo ${org}/${repo}`
39270
+ });
39271
+ } else if (detail.updateAvailable === false && detail.version) {
39272
+ findings.push({
39273
+ resource: "version",
39274
+ status: "ok",
39275
+ message: `Up to date (${detail.version})`
39276
+ });
39277
+ }
39285
39278
  const hasMissing = findings.some((f) => f.status === "missing");
39286
39279
  const hasInactive = findings.some((f) => f.status === "inactive" && !f.resource.startsWith("sub:"));
39287
39280
  const hasShapeDrift = findings.some((f) => f.resource.startsWith("shape:") && f.status === "warning" && f.message.includes("differs from installed manifest"));
@@ -39294,22 +39287,6 @@ async function doctorComponent(client, org, repo, componentId) {
39294
39287
  } else {
39295
39288
  state = "ready";
39296
39289
  }
39297
- try {
39298
- await client.commit.apply(org, repo, `Doctor: update ${componentName} state to ${state}`, [
39299
- {
39300
- operation: "revise",
39301
- kind: "thing",
39302
- name: `ComponentInstall/${componentId}`,
39303
- data: { ...installData, state, checkedAt: new Date().toISOString() }
39304
- }
39305
- ], { componentRef: SYSTEM_REGISTERED_COMPONENT_REF });
39306
- } catch {
39307
- findings.push({
39308
- resource: "state-update",
39309
- status: "warning",
39310
- message: "Failed to persist computed state"
39311
- });
39312
- }
39313
39290
  return { componentId, componentName, state, findings };
39314
39291
  }
39315
39292
 
@@ -39320,8 +39297,7 @@ var handleDoctor = async (ctx, { args }) => {
39320
39297
  usageError("Usage: wh component doctor <org/name> --repo org/repo", "wh component doctor warmhub/research-knowledge --repo myorg/myrepo");
39321
39298
  }
39322
39299
  const { org, repo } = parseOrgRepo(getRepoRef(ctx), ctx.config);
39323
- const componentId = await resolveInstalledComponentRefId(ctx.client, org, repo, name);
39324
- const result = await doctorComponent(ctx.client, org, repo, componentId);
39300
+ const result = await doctorComponent(ctx.client, org, repo, name);
39325
39301
  writeOutput(ctx, result, () => renderDoctorResult(ctx, result));
39326
39302
  };
39327
39303
  var handleTeardown = async (ctx, { args }) => {
@@ -39426,7 +39402,8 @@ var handleList2 = async (ctx, { flags }) => {
39426
39402
  const state = item.state ?? "unknown";
39427
39403
  const source = item.source ?? "-";
39428
39404
  const stateColor = stateToColor2(c, state);
39429
- ctx.out(` ${c.cyan}${item.ref ?? item.componentName}${c.reset} ${stateColor}${state}${c.reset} ${c.dim}v${version}${c.reset} ${source}`);
39405
+ const update = item.updateAvailable && item.latestVersion ? ` ${c.yellow}(${item.latestVersion} available)${c.reset}` : "";
39406
+ ctx.out(` ${c.cyan}${item.ref ?? item.componentName}${c.reset} ${stateColor}${state}${c.reset} ${c.dim}v${version}${c.reset}${update} ${source}`);
39430
39407
  }
39431
39408
  });
39432
39409
  };
@@ -39451,16 +39428,11 @@ var handleSearch2 = async (ctx, { flags, args }) => {
39451
39428
  };
39452
39429
  function stateToColor2(c, state) {
39453
39430
  switch (state) {
39454
- case "ready":
39431
+ case "active":
39455
39432
  return c.green;
39456
- case "paused":
39457
39433
  case "uninstalled":
39458
39434
  return c.yellow;
39459
- case "degraded":
39460
- return c.red;
39461
- case "error":
39462
- return c.red;
39463
- case "installing":
39435
+ case "initiated":
39464
39436
  return c.cyan;
39465
39437
  default:
39466
39438
  return c.dim;
@@ -45415,6 +45387,8 @@ async function dispatch(ctx) {
45415
45387
  const hint = ctx._domainHint ? ` ${ctx._domainHint}` : "";
45416
45388
  throw new CliError(2 /* UserInput */, "USER_INPUT", `Unknown command: ${command}`, undefined, hint.trim() || "Run 'wh help' for available commands.");
45417
45389
  }
45390
+ // ../../packages/warmhub-cli/src/manifest/shared-infra.ts
45391
+ var SHARED_INFRA_SHAPES = findSystemComponent(SYSTEM_COMPONENT_ID)?.shapes ?? [];
45418
45392
  // ../../packages/warmhub-cli/src/apply-global-flags.ts
45419
45393
  function invokesRemovedVerb(ctx) {
45420
45394
  return ctx.invocation.command === "credential" && ctx.invocation.positional[0] === "export";
@@ -45761,7 +45735,7 @@ function resolveLogLevel(flags, env) {
45761
45735
  // package.json
45762
45736
  var package_default3 = {
45763
45737
  name: "@warmhub/cli",
45764
- version: "0.64.0",
45738
+ version: "0.66.0",
45765
45739
  private: false,
45766
45740
  type: "module",
45767
45741
  description: "The wh CLI for WarmHub — create repos, commit and query data, and compound knowledge with your AI agents.",
@@ -46416,4 +46390,4 @@ if (!updateCheckSuppressedByArgv && shouldRunUpdateCheck(updateEligibility)) {
46416
46390
  var interceptedExitCode = await maybeHandleComponentShellBoundary(dispatchArgv);
46417
46391
  process.exitCode = interceptedExitCode === undefined ? await runCli(dispatchArgv, { version: package_default3.version }) : interceptedExitCode;
46418
46392
 
46419
- //# debugId=7FF3388CDD4F972C64756E2164756E21
46393
+ //# debugId=C5B05FE58189780B64756E2164756E21
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@warmhub/cli",
3
- "version": "0.64.0",
3
+ "version": "0.66.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "The wh CLI for WarmHub — create repos, commit and query data, and compound knowledge with your AI agents.",