@thingd/cli 0.51.3 → 0.52.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.
@@ -1 +1 @@
1
- {"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../src/commands/cloud.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAA6B,MAAM,aAAa,CAAC;AA2GzE,wBAAsB,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BjE"}
1
+ {"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../src/commands/cloud.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAA6B,MAAM,aAAa,CAAC;AAqIzE,wBAAsB,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BjE"}
@@ -76,6 +76,32 @@ async function pickAndSaveInstance(context, cloudConfig) {
76
76
  rl.close();
77
77
  }
78
78
  }
79
+ /**
80
+ * Ensure a data-plane API key exists in the cloud config.
81
+ * Best-effort — if creation fails, the JWT is still usable for management API.
82
+ */
83
+ async function ensureApiKey(context, cloudConfig) {
84
+ if (cloudConfig.apiKey) {
85
+ return;
86
+ }
87
+ try {
88
+ const { projects } = await listProjects(cloudConfig);
89
+ if (projects.length === 0) {
90
+ return;
91
+ }
92
+ const project = projects[0];
93
+ if (!project) {
94
+ return;
95
+ }
96
+ const result = await createApiKey(cloudConfig, project.id);
97
+ cloudConfig.apiKey = result.token;
98
+ writeCloudConfig(cloudConfig);
99
+ context.stderr.write(` ${pc.dim("API key created for data access\n")}`);
100
+ }
101
+ catch {
102
+ // API key creation is best-effort
103
+ }
104
+ }
79
105
  export async function runCloud(context) {
80
106
  const sub = requiredToken(context.parsed, 1, "subcommand");
81
107
  switch (sub) {
@@ -119,6 +145,8 @@ async function runLogin(context) {
119
145
  context.stdout.write(pc.green(`✓ Logged in as ${user.email}\n`));
120
146
  // Discover and select an instance (interactive if multiple)
121
147
  await pickAndSaveInstance(context, cloudConfig);
148
+ // Create a data-plane API key for REST/MCP operations
149
+ await ensureApiKey(context, cloudConfig);
122
150
  }
123
151
  catch (err) {
124
152
  if (err instanceof CloudApiError && err.status === 401) {
@@ -164,6 +192,8 @@ async function runLogin(context) {
164
192
  context.stdout.write(pc.green(`\r✓ Logged in as ${user.email}\n`));
165
193
  // Discover and select an instance (interactive if multiple)
166
194
  await pickAndSaveInstance(context, cloudConfig);
195
+ // Create a data-plane API key for REST/MCP operations
196
+ await ensureApiKey(context, cloudConfig);
167
197
  return;
168
198
  }
169
199
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"AAkiEA,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoDvD"}
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"AAmkEA,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAqDvD"}
@@ -234,7 +234,9 @@ async function fetchResourcesFallback() {
234
234
  const listed = await db.listQueues();
235
235
  queues = (listed ?? []).sort();
236
236
  }
237
- catch {
237
+ catch (err) {
238
+ const msg = err instanceof Error ? err.message : String(err);
239
+ cloudError = cloudError ?? `Failed to load queues: ${msg}`;
238
240
  queues = [];
239
241
  }
240
242
  // Link count
@@ -740,6 +742,9 @@ async function loadContent(node) {
740
742
  content += ` ${pc.dim("Writes".padEnd(14))} ${pc.cyan(wLine)} ${pc.cyan(String(currentWrite).padEnd(4))} ${pc.dim(`w/s`)}\n`;
741
743
  content += ` ${pc.dim("Appends".padEnd(14))} ${pc.green(apLine)} ${pc.green(String(currentAppend).padEnd(4))} ${pc.dim(`e/s`)}\n\n`;
742
744
  content += ` ${pc.dim("Shortcuts:")} ${pc.bold("[c]")} Create ${pc.bold("[r]")} Refresh ${pc.bold("[/]")} Search\n`;
745
+ if (cloudError) {
746
+ content += `\n ${pc.yellow("⚠")} ${pc.dim(cloudError)}\n`;
747
+ }
743
748
  }
744
749
  else if (node.type === "category") {
745
750
  content = pc.dim("Expand to browse items.");
@@ -1253,34 +1258,61 @@ async function handleInfo() {
1253
1258
  const baseUrl = dbPath.startsWith("thingd://")
1254
1259
  ? `http://${dbPath.slice("thingd://".length)}`
1255
1260
  : dbPath;
1256
- const urlObj = new URL(baseUrl);
1257
- if (urlObj.pathname === "/mcp") {
1258
- urlObj.pathname = "/";
1259
- }
1261
+ const apiRoot = baseUrl.replace(/\/+$/, "");
1260
1262
  const fetchJson = async (p) => {
1261
- const u = new URL(p, urlObj.toString());
1263
+ const u = `${apiRoot}${p}`;
1262
1264
  const headers = {};
1263
1265
  if (authToken) {
1264
1266
  headers.Authorization = `Bearer ${authToken}`;
1265
1267
  }
1266
1268
  const res = await fetch(u, { headers });
1269
+ const json = await res.json();
1267
1270
  if (!res.ok) {
1268
- throw new Error(`HTTP ${res.status}`);
1271
+ const detail = json?.error?.detail ?? json?.error?.message ?? `HTTP ${res.status}`;
1272
+ throw new Error(`${res.status}: ${detail}`);
1269
1273
  }
1270
- return res.json();
1274
+ return json;
1271
1275
  };
1272
- const health = await fetchJson("/healthz");
1273
- const cluster = await fetchJson("/cluster/status");
1274
- lines.push("");
1275
- lines.push(` ${pc.bold("Cloud Health")}`);
1276
- lines.push(...JSON.stringify(health, null, 2)
1277
- .split("\n")
1278
- .map((l) => ` ${pc.dim(l)}`));
1276
+ // Health check
1277
+ let healthError = null;
1278
+ let health = null;
1279
+ try {
1280
+ health = await fetchJson("/v1/health");
1281
+ }
1282
+ catch (err) {
1283
+ healthError = err instanceof Error ? err.message : String(err);
1284
+ }
1285
+ // Collections check
1286
+ let collectionsResult = null;
1287
+ if (!healthError) {
1288
+ try {
1289
+ const colResp = await fetchJson("/v1/collections");
1290
+ collectionsResult = colResp?.data ?? null;
1291
+ }
1292
+ catch {
1293
+ // collections endpoint may not be available on all setups
1294
+ }
1295
+ }
1279
1296
  lines.push("");
1280
- lines.push(` ${pc.bold("Cloud Cluster")}`);
1281
- lines.push(...JSON.stringify(cluster, null, 2)
1282
- .split("\n")
1283
- .map((l) => ` ${pc.dim(l)}`));
1297
+ lines.push(` ${pc.bold("Cloud REST API")}`);
1298
+ if (healthError) {
1299
+ lines.push(` ${pc.red("Health check failed:")} ${healthError}`);
1300
+ lines.push(` ${pc.dim("API URL:")} ${apiRoot}/v1/...`);
1301
+ lines.push(` ${pc.dim("Auth:")} ${authToken ? pc.green("Bearer token set") : pc.red("No token")}`);
1302
+ }
1303
+ else {
1304
+ const h = health;
1305
+ const status = h?.data?.status ?? h?.status ?? "ok";
1306
+ lines.push(` ${pc.dim("Status:")} ${pc.green(String(status))}`);
1307
+ lines.push(` ${pc.dim("Collections:")} ${collectionsResult ? pc.cyan(String(collectionsResult.length)) : pc.yellow("unknown")}`);
1308
+ if (collectionsResult && collectionsResult.length > 0) {
1309
+ lines.push(` ${pc.dim("Names:")} ${collectionsResult.join(", ")}`);
1310
+ }
1311
+ }
1312
+ if (cloudError) {
1313
+ lines.push("");
1314
+ lines.push(` ${pc.yellow("⚠ Recent error:")} ${cloudError}`);
1315
+ }
1284
1316
  }
1285
1317
  catch (err) {
1286
1318
  const errMsg = err instanceof Error ? err.message : String(err);
@@ -1674,14 +1706,14 @@ async function handleConnect(node) {
1674
1706
  cloudCfg.projectSlug = selected.projectSlug;
1675
1707
  cloudCfg.instanceSlug = selected.instanceSlug;
1676
1708
  writeCloudConfig(cloudCfg);
1677
- await connectToDriver("cloud", deriveRestUrl(selected.mcpUrl), deriveRestUrl(selected.mcpUrl), cloudCfg.token);
1709
+ await connectToDriver("cloud", deriveRestUrl(selected.mcpUrl), deriveRestUrl(selected.mcpUrl), cloudCfg.apiKey ?? cloudCfg.token);
1678
1710
  });
1679
1711
  return;
1680
1712
  }
1681
1713
  // No instances found — try saved URL or show error
1682
1714
  if (cloudCfg.instanceUrl) {
1683
1715
  const restUrl = deriveRestUrl(cloudCfg.instanceUrl);
1684
- await connectToDriver("cloud", restUrl, restUrl, cloudCfg.token);
1716
+ await connectToDriver("cloud", restUrl, restUrl, cloudCfg.apiKey ?? cloudCfg.token);
1685
1717
  return;
1686
1718
  }
1687
1719
  viewerLines = [
@@ -1694,7 +1726,7 @@ async function handleConnect(node) {
1694
1726
  catch {
1695
1727
  if (cloudCfg.instanceUrl) {
1696
1728
  const restUrl = deriveRestUrl(cloudCfg.instanceUrl);
1697
- await connectToDriver("cloud", restUrl, restUrl, cloudCfg.token);
1729
+ await connectToDriver("cloud", restUrl, restUrl, cloudCfg.apiKey ?? cloudCfg.token);
1698
1730
  return;
1699
1731
  }
1700
1732
  viewerLines = [
@@ -1784,7 +1816,7 @@ async function handleConnect(node) {
1784
1816
  // Save manual credentials to cloud config
1785
1817
  writeCloudConfig({ token: vals.token || "", url: cloudUrl });
1786
1818
  }
1787
- await connectToDriver(selectedDriver, cloudUrl, cloudUrl, vals.token);
1819
+ await connectToDriver(selectedDriver, cloudUrl, cloudUrl, cloudCfg?.apiKey ?? vals.token);
1788
1820
  }
1789
1821
  else {
1790
1822
  await connectToDriver(selectedDriver, vals.path || "", undefined, undefined);
@@ -1908,7 +1940,8 @@ export async function runInteractiveCli() {
1908
1940
  const cloudUrl = resolveCloudUrl(cloudCfg);
1909
1941
  if (cloudUrl) {
1910
1942
  try {
1911
- await connectToDriver("cloud", cloudUrl, cloudUrl, cloudCfg.token);
1943
+ const restUrl = deriveRestUrl(cloudUrl);
1944
+ await connectToDriver("cloud", restUrl, restUrl, cloudCfg.apiKey ?? cloudCfg.token);
1912
1945
  }
1913
1946
  catch (err) {
1914
1947
  const msg = err instanceof Error ? err.message : String(err);
@@ -59,6 +59,7 @@ export declare function createInstance(config: CloudConfig, projectId: string, n
59
59
  }>;
60
60
  export declare function createApiKey(config: CloudConfig, projectId: string, name?: string): Promise<{
61
61
  key: CloudApiKey;
62
+ token: string;
62
63
  }>;
63
64
  export declare function createOrganization(config: CloudConfig, name: string): Promise<{
64
65
  organization: CloudOrganization;
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-api.d.ts","sourceRoot":"","sources":["../../src/lib/cloud-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AASrD,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,qBAAa,aAAc,SAAQ,KAAK;IACtC,MAAM,EAAE,MAAM,CAAC;IAEf,YAAY,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAI1C;CACF;AA0BD,wBAAsB,KAAK,CACzB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC;IAAE,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CAE9E;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC,CAE7F;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC;IAAE,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,CAMpC;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,SAAS,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC,CAEzC;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,QAAQ,EAAE,aAAa,CAAA;CAAE,CAAC,CAKtC;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,GAAG,EAAE,WAAW,CAAA;CAAE,CAAC,CAK/B;AAID,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,YAAY,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAE9C;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC;IAAE,aAAa,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAAC,CAEjD;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,YAAY,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAE5D;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,OAAO,EAAE,uBAAuB,EAAE,CAAA;CAAE,CAAC,CAEjD;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,MAAiB,GACtB,OAAO,CAAC;IAAE,MAAM,EAAE,uBAAuB,CAAA;CAAE,CAAC,CAK9C;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAA;CAAE,CAAC,CAI1B;AAkBD,wBAAsB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAEjF;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAEjD;AAID,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAsBhG;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAwB1F"}
1
+ {"version":3,"file":"cloud-api.d.ts","sourceRoot":"","sources":["../../src/lib/cloud-api.ts"],"names":[],"mappings":"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"}
@@ -52,7 +52,7 @@ export async function createInstance(config, projectId, name) {
52
52
  export async function createApiKey(config, projectId, name) {
53
53
  return request(config, `/projects/${projectId}/api-keys`, {
54
54
  method: "POST",
55
- body: { name: name ?? "CLI key" },
55
+ body: { name: name ?? "thingd CLI" },
56
56
  });
57
57
  }
58
58
  // ── Organization API ─────────────────────────────────────────────────
@@ -1,5 +1,7 @@
1
1
  export type CloudConfig = {
2
2
  token: string;
3
+ /** API key for data plane operations (REST/MCP) — created after login. */
4
+ apiKey?: string;
3
5
  email?: string;
4
6
  url?: string;
5
7
  /** Currently active organization context (set by `thingd cloud org use`). */
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-config.d.ts","sourceRoot":"","sources":["../../src/lib/cloud-config.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8GAA8G;IAC9G,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAUpD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAG1D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAKvE;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAMxC"}
1
+ {"version":3,"file":"cloud-config.d.ts","sourceRoot":"","sources":["../../src/lib/cloud-config.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8GAA8G;IAC9G,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAUpD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAG1D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAKvE;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAMxC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thingd/cli",
3
- "version": "0.51.3",
3
+ "version": "0.52.0",
4
4
  "description": "CLI, Interactive TUI Dashboard, and MCP server for thingd — a fast object-first data engine for applications and AI agents.",
5
5
  "type": "module",
6
6
  "homepage": "https://engine.thingd.cloud",
@@ -45,7 +45,7 @@
45
45
  "cli-table3": "^0.6.5",
46
46
  "picocolors": "^1.1.1",
47
47
  "zod": "^4.4.3",
48
- "@thingd/sdk": "0.51.3"
48
+ "@thingd/sdk": "0.52.0"
49
49
  },
50
50
  "engines": {
51
51
  "node": ">=24.0.0"