@thingd/cli 0.52.7 → 0.52.9

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":"server.d.ts","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAqErD,wBAAsB,oBAAoB,CACxC,iBAAiB,EAAE,iBAAiB,EACpC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAunB7E"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAqErD,wBAAsB,oBAAoB,CACxC,iBAAiB,EAAE,iBAAiB,EACpC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAwnB7E"}
@@ -74,6 +74,7 @@ export async function startDashboardServer(connectionOptions, port) {
74
74
  url: activeOptions.cloud ? activeOptions.path : undefined,
75
75
  driver: activeOptions.driver,
76
76
  authToken: activeOptions.authToken,
77
+ instanceSlug: activeOptions.instanceSlug,
77
78
  });
78
79
  // 2. Create HTTP Server
79
80
  const server = createServer(async (req, res) => {
package/dist/index.d.ts CHANGED
@@ -29,6 +29,8 @@ export type ConnectionOptions = {
29
29
  driver?: ThingDDriver;
30
30
  authToken?: string;
31
31
  cloud: boolean;
32
+ /** Cloud instance slug for multi-instance routing. */
33
+ instanceSlug?: string;
32
34
  };
33
35
  export declare function runCli(args?: string[], options?: RunCliOptions): Promise<number>;
34
36
  export declare function withDb(context: CliContext, callback: (db: ThingD) => Promise<void>): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAQA,OAAO,EAUL,MAAM,EACN,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAQrB,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAEjD,KAAK,YAAY,GAAG;IAClB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF,KAAK,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC;AAE1C,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7B,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAsCF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAwFF,wBAAsB,MAAM,CAC1B,IAAI,WAAwB,EAC5B,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,MAAM,CAAC,CA8EjB;AAk6BD,wBAAsB,MAAM,CAC1B,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC,CAcf;AA4BD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,iBAAiB,CAmCxE;AAiDD,wBAAgB,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE/E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAGlF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMrE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEnF;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMrF;AAyFD,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAEpF;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAElE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAQA,OAAO,EAUL,MAAM,EACN,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AASrB,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAEjD,KAAK,YAAY,GAAG;IAClB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF,KAAK,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC;AAE1C,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7B,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAsCF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAwFF,wBAAsB,MAAM,CAC1B,IAAI,WAAwB,EAC5B,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,MAAM,CAAC,CA8EjB;AAk6BD,wBAAsB,MAAM,CAC1B,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC,CAef;AA4BD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,iBAAiB,CA6CxE;AAiDD,wBAAgB,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE/E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAGlF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMrE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEnF;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMrF;AAyFD,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAEpF;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAElE"}
package/dist/index.js CHANGED
@@ -8,6 +8,7 @@ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/
8
8
  import { SDK_VERSION, ThingD, } from "@thingd/sdk";
9
9
  import pc from "picocolors";
10
10
  import { runInteractiveCli } from "./interactive.js";
11
+ import { deriveRestUrl } from "./lib/cloud-api.js";
11
12
  import { readCloudConfig, resolveCloudUrl } from "./lib/cloud-config.js";
12
13
  import { logoLine } from "./logo.js";
13
14
  import { runMcp } from "./mcp.js";
@@ -904,6 +905,7 @@ export async function withDb(context, callback) {
904
905
  url: connection.cloud ? connection.path : undefined,
905
906
  driver: connection.driver,
906
907
  authToken: connection.authToken,
908
+ instanceSlug: connection.instanceSlug,
907
909
  });
908
910
  try {
909
911
  await callback(db);
@@ -936,7 +938,7 @@ function buildMemoryEvent(parsed, type) {
936
938
  export function resolveConnection(context) {
937
939
  const url = stringFlag(context.parsed, "url") ?? context.env.THINGD_URL;
938
940
  const path = url ?? stringFlag(context.parsed, "path") ?? context.env.THINGD_PATH ?? defaultThingdDbPath();
939
- const cloud = isCloudPath(path);
941
+ let cloud = isCloudPath(path);
940
942
  let driver = parseDriver(stringFlag(context.parsed, "driver") ?? context.env.THINGD_DRIVER);
941
943
  if (!driver) {
942
944
  if (cloud) {
@@ -949,19 +951,27 @@ export function resolveConnection(context) {
949
951
  driver = "memory";
950
952
  }
951
953
  }
954
+ if (driver === "cloud") {
955
+ cloud = true;
956
+ }
952
957
  if (!cloud && path === defaultThingdDbPath()) {
953
958
  ensureThingdDir();
954
959
  }
955
960
  // Fall back to saved cloud config when no explicit URL/token is provided
956
961
  const cloudCfg = cloud && !url ? readCloudConfig() : null;
957
- const resolvedAuthToken = stringFlag(context.parsed, "auth-token") ?? context.env.THINGD_AUTH_TOKEN ?? cloudCfg?.token;
962
+ const resolvedAuthToken = stringFlag(context.parsed, "auth-token") ??
963
+ context.env.THINGD_AUTH_TOKEN ??
964
+ cloudCfg?.apiKey ??
965
+ cloudCfg?.token;
958
966
  // Prefer instanceUrl (resolved MCP endpoint) over raw cloudCfg.url (API base)
959
967
  const resolvedCloudUrl = cloudCfg ? resolveCloudUrl(cloudCfg) : undefined;
968
+ const effectiveCloudUrl = resolvedCloudUrl && driver === "cloud" ? deriveRestUrl(resolvedCloudUrl) : resolvedCloudUrl;
960
969
  return {
961
- path: resolvedCloudUrl && !url ? resolvedCloudUrl : path,
970
+ path: effectiveCloudUrl && !url ? effectiveCloudUrl : path,
962
971
  driver,
963
972
  authToken: resolvedAuthToken,
964
973
  cloud,
974
+ instanceSlug: cloudCfg?.instanceSlug,
965
975
  };
966
976
  }
967
977
  function parseArgs(args) {
@@ -1 +1 @@
1
- {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"AAilEA,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAyDvD"}
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"AAwmEA,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CA+DvD"}
@@ -406,12 +406,13 @@ async function fetchResources() {
406
406
  }
407
407
  }
408
408
  // ── Connection helpers ───────────────────────────────────────────────
409
- async function connectToDriver(selectedDriver, resolvedPath, url, token) {
409
+ async function connectToDriver(selectedDriver, resolvedPath, url, token, instanceSlug) {
410
410
  db = await ThingD.open({
411
411
  path: resolvedPath,
412
412
  url,
413
413
  driver: selectedDriver,
414
414
  authToken: token,
415
+ instanceSlug,
415
416
  });
416
417
  driver = selectedDriver;
417
418
  dbPath = resolvedPath;
@@ -1724,14 +1725,14 @@ async function handleConnect(node) {
1724
1725
  cloudCfg.projectSlug = selected.projectSlug;
1725
1726
  cloudCfg.instanceSlug = selected.instanceSlug;
1726
1727
  writeCloudConfig(cloudCfg);
1727
- await connectToDriver("cloud", deriveRestUrl(selected.mcpUrl), deriveRestUrl(selected.mcpUrl), cloudCfg.apiKey ?? cloudCfg.token);
1728
+ await connectToDriver("cloud", deriveRestUrl(selected.mcpUrl), deriveRestUrl(selected.mcpUrl), cloudCfg.apiKey ?? cloudCfg.token, selected.instanceSlug);
1728
1729
  });
1729
1730
  return;
1730
1731
  }
1731
1732
  // No instances found — try saved URL or show error
1732
1733
  if (cloudCfg.instanceUrl) {
1733
1734
  const restUrl = deriveRestUrl(cloudCfg.instanceUrl);
1734
- await connectToDriver("cloud", restUrl, restUrl, cloudCfg.apiKey ?? cloudCfg.token);
1735
+ await connectToDriver("cloud", restUrl, restUrl, cloudCfg.apiKey ?? cloudCfg.token, cloudCfg.instanceSlug);
1735
1736
  return;
1736
1737
  }
1737
1738
  viewerLines = [
@@ -1744,7 +1745,7 @@ async function handleConnect(node) {
1744
1745
  catch {
1745
1746
  if (cloudCfg.instanceUrl) {
1746
1747
  const restUrl = deriveRestUrl(cloudCfg.instanceUrl);
1747
- await connectToDriver("cloud", restUrl, restUrl, cloudCfg.apiKey ?? cloudCfg.token);
1748
+ await connectToDriver("cloud", restUrl, restUrl, cloudCfg.apiKey ?? cloudCfg.token, cloudCfg.instanceSlug);
1748
1749
  return;
1749
1750
  }
1750
1751
  viewerLines = [
@@ -1803,6 +1804,7 @@ async function handleConnect(node) {
1803
1804
  ]),
1804
1805
  ], async (vals) => {
1805
1806
  let cloudUrl;
1807
+ let instanceSlugVal;
1806
1808
  if (selectedDriver === "cloud") {
1807
1809
  if (isCloudWithConfig) {
1808
1810
  if (!vals.project || !vals.instance) {
@@ -1810,13 +1812,14 @@ async function handleConnect(node) {
1810
1812
  draw();
1811
1813
  return;
1812
1814
  }
1815
+ instanceSlugVal = vals.instance;
1813
1816
  // Construct URL from project + instance slugs
1814
1817
  cloudUrl = `${baseUrl}/mcp/${encodeURIComponent(vals.project)}/${encodeURIComponent(vals.instance)}`;
1815
1818
  // Save selection to cloud config
1816
1819
  const cfg = cloudCfg ?? { token: vals.token, url: baseUrl };
1817
1820
  cfg.instanceUrl = cloudUrl;
1818
1821
  cfg.projectSlug = vals.project;
1819
- cfg.instanceSlug = vals.instance;
1822
+ cfg.instanceSlug = instanceSlugVal;
1820
1823
  if (vals.token) {
1821
1824
  cfg.token = vals.token;
1822
1825
  }
@@ -1834,7 +1837,7 @@ async function handleConnect(node) {
1834
1837
  // Save manual credentials to cloud config
1835
1838
  writeCloudConfig({ token: vals.token || "", url: cloudUrl });
1836
1839
  }
1837
- await connectToDriver(selectedDriver, cloudUrl, cloudUrl, cloudCfg?.apiKey ?? vals.token);
1840
+ await connectToDriver(selectedDriver, cloudUrl, cloudUrl, cloudCfg?.apiKey ?? vals.token, instanceSlugVal);
1838
1841
  }
1839
1842
  else {
1840
1843
  await connectToDriver(selectedDriver, vals.path || "", undefined, undefined);
@@ -1959,7 +1962,7 @@ export async function runInteractiveCli() {
1959
1962
  if (cloudUrl) {
1960
1963
  try {
1961
1964
  const restUrl = deriveRestUrl(cloudUrl);
1962
- await connectToDriver("cloud", restUrl, restUrl, cloudCfg.apiKey ?? cloudCfg.token);
1965
+ await connectToDriver("cloud", restUrl, restUrl, cloudCfg.apiKey ?? cloudCfg.token, cloudCfg.instanceSlug);
1963
1966
  }
1964
1967
  catch (err) {
1965
1968
  const msg = err instanceof Error ? err.message : String(err);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thingd/cli",
3
- "version": "0.52.7",
3
+ "version": "0.52.9",
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.52.7"
48
+ "@thingd/sdk": "0.52.9"
49
49
  },
50
50
  "engines": {
51
51
  "node": ">=24.0.0"