@camstack/system 1.2.115 → 1.2.116

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 (61) hide show
  1. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  2. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  3. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  4. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  5. package/dist/builtins/alerts/alerts.addon.js +1 -1
  6. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  7. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +1 -1
  8. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
  9. package/dist/builtins/console-logging/index.js +1 -1
  10. package/dist/builtins/console-logging/index.mjs +1 -1
  11. package/dist/builtins/core-blocks/core-blocks.addon.js +1 -1
  12. package/dist/builtins/core-blocks/core-blocks.addon.mjs +1 -1
  13. package/dist/builtins/device-manager/device-manager.addon.js +2 -2
  14. package/dist/builtins/device-manager/device-manager.addon.mjs +2 -2
  15. package/dist/builtins/doorbell/virtual-doorbell.addon.js +1 -1
  16. package/dist/builtins/doorbell/virtual-doorbell.addon.mjs +1 -1
  17. package/dist/builtins/hub-forwarder/index.js +1 -1
  18. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  19. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  20. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  21. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  22. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  23. package/dist/builtins/local-network/local-hostname.d.ts +15 -0
  24. package/dist/builtins/local-network/local-network.addon.d.ts +31 -7
  25. package/dist/builtins/local-network/local-network.addon.js +177 -28
  26. package/dist/builtins/local-network/local-network.addon.mjs +177 -28
  27. package/dist/builtins/loki-logging/index.js +1 -1
  28. package/dist/builtins/loki-logging/index.mjs +1 -1
  29. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  30. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  31. package/dist/builtins/platform-probe/index.js +1 -1
  32. package/dist/builtins/platform-probe/index.mjs +1 -1
  33. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  34. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  35. package/dist/builtins/snapshot/index.js +1 -1
  36. package/dist/builtins/snapshot/index.mjs +1 -1
  37. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  38. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  39. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +2 -2
  40. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +2 -2
  41. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  42. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  43. package/dist/builtins/system-config/system-config.addon.js +1 -1
  44. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  45. package/dist/builtins/winston-logging/index.js +1 -1
  46. package/dist/builtins/winston-logging/index.mjs +1 -1
  47. package/dist/{dist-Drb54SZD.mjs → dist-BpzbLPel.mjs} +139 -5
  48. package/dist/{dist-iAwSA2_f.js → dist-Cri60Jd0.js} +139 -5
  49. package/dist/http/lan-http-bind.d.ts +19 -0
  50. package/dist/index.d.ts +1 -0
  51. package/dist/index.js +29 -472
  52. package/dist/index.mjs +11 -468
  53. package/dist/lan-http-bind-BDJm4d-K.mjs +716 -0
  54. package/dist/lan-http-bind-CZ4EBeD_.js +848 -0
  55. package/dist/{retired-settings-keys-OfhqQio4.js → retired-settings-keys-BVAxT5XL.js} +1 -1
  56. package/dist/{retired-settings-keys-Dz5-7gjt.mjs → retired-settings-keys-SrxMH3OT.mjs} +1 -1
  57. package/dist/tls/cert-manager.d.ts +11 -0
  58. package/dist/tls/index.d.ts +3 -1
  59. package/dist/tls/tls-status.d.ts +16 -0
  60. package/dist/tls/uploaded-cert.d.ts +14 -0
  61. package/package.json +1 -1
@@ -1,5 +1,43 @@
1
- import { Gt as EventCategory, Y as localNetworkCapability, yt as BaseAddon } from "../../dist-Drb54SZD.mjs";
1
+ import { Gt as EventCategory, Y as localNetworkCapability, yt as BaseAddon } from "../../dist-BpzbLPel.mjs";
2
+ import { a as readLanHttpState, c as readTlsAccessStatus, d as writeTlsMode, f as validateUploadedTls, h as reissueTlsLeaf, l as readTlsMode, n as applyLanHttp, p as ensureTlsCert, s as readExtraSans, t as DEFAULT_LAN_HTTP_PORT, u as writeExtraSans } from "../../lan-http-bind-BDJm4d-K.mjs";
3
+ import { mkdir, writeFile } from "node:fs/promises";
4
+ import { join } from "node:path";
2
5
  import * as os from "node:os";
6
+ import { isIP } from "node:net";
7
+ //#region src/builtins/local-network/local-hostname.ts
8
+ var DNS_NAME = /^(?=.{1,253}$)([a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])$/;
9
+ /**
10
+ * Parse the operator-typed local hostname.
11
+ *
12
+ * Empty / whitespace → `null` (advertise the raw LAN IP). A DNS name is
13
+ * lowercased. A URL, port suffix, path, or bare IP is rejected so it cannot
14
+ * leak into a SAN or a candidate URL.
15
+ */
16
+ function parseLocalHostname(raw) {
17
+ const trimmed = raw.trim();
18
+ if (trimmed === "") return {
19
+ ok: true,
20
+ value: null
21
+ };
22
+ if (/[\s/:?#]/.test(trimmed) || trimmed.includes("\\")) return {
23
+ ok: false,
24
+ error: "Enter a DNS name such as camstack.lan, without a scheme or port."
25
+ };
26
+ const lowered = trimmed.toLowerCase();
27
+ if (isIP(lowered) !== 0) return {
28
+ ok: false,
29
+ error: "Use the address allowlist for IPs — this field is a DNS name."
30
+ };
31
+ if (!DNS_NAME.test(lowered)) return {
32
+ ok: false,
33
+ error: "Enter a DNS name such as camstack.lan, without a scheme or port."
34
+ };
35
+ return {
36
+ ok: true,
37
+ value: lowered
38
+ };
39
+ }
40
+ //#endregion
3
41
  //#region src/builtins/local-network/local-network.addon.ts
4
42
  /**
5
43
  * local-network — hub-only system cap implementation.
@@ -48,7 +86,10 @@ var LocalNetworkAddon = class extends BaseAddon {
48
86
  super({
49
87
  allowedAddresses: [],
50
88
  bootSeeded: false,
51
- notificationBaseUrl: ""
89
+ notificationBaseUrl: "",
90
+ httpEnabled: true,
91
+ httpPort: DEFAULT_LAN_HTTP_PORT,
92
+ localHostname: ""
52
93
  });
53
94
  }
54
95
  /**
@@ -94,8 +135,15 @@ var LocalNetworkAddon = class extends BaseAddon {
94
135
  source: localPort.source
95
136
  } });
96
137
  await this.reconcileMeshEndpoint();
138
+ const httpState = readLanHttpState();
97
139
  return {
98
- endpoints: buildEndpoints(interfaces, localPort.port, includeLoopback, ipv4Only, this.publicHostname, scheme, this.meshEndpoint),
140
+ endpoints: buildEndpoints(interfaces, localPort.port, includeLoopback, ipv4Only, this.publicHostname, scheme, this.meshEndpoint, {
141
+ enabled: this.config.httpEnabled !== false,
142
+ listening: httpState.listening,
143
+ httpPort: this.resolvedHttpPort(),
144
+ httpsPort: localPort.port,
145
+ localHostname: this.config.localHostname || null
146
+ }),
99
147
  localPort
100
148
  };
101
149
  },
@@ -130,6 +178,33 @@ var LocalNetworkAddon = class extends BaseAddon {
130
178
  dropped: addresses.length - cleaned.length
131
179
  } });
132
180
  return { success: true };
181
+ },
182
+ getTlsStatus: async () => this.snapshotTls(false),
183
+ regenerateCertificate: async (_input) => {
184
+ if (readTlsMode(this.tlsDataDir()) === "uploaded") throw new Error("Cannot regenerate an uploaded certificate — revert to generated first.");
185
+ const extraSans = [...readExtraSans(this.tlsDataDir())];
186
+ await reissueTlsLeaf(this.tlsDataDir(), { extraSans });
187
+ return this.snapshotTls(true);
188
+ },
189
+ uploadCertificate: async ({ certPem, keyPem, caPem }) => {
190
+ const valid = validateUploadedTls(certPem, keyPem);
191
+ if (!valid.ok) throw new Error(valid.error);
192
+ const dir = join(this.tlsDataDir(), "tls");
193
+ await mkdir(dir, { recursive: true });
194
+ await writeFile(join(dir, "camstack.crt"), certPem.endsWith("\n") ? certPem : `${certPem}\n`);
195
+ await writeFile(join(dir, "camstack.key"), keyPem.endsWith("\n") ? keyPem : `${keyPem}\n`, { mode: 384 });
196
+ if (caPem && caPem.trim() !== "") await writeFile(join(dir, "camstack-ca.crt"), caPem.endsWith("\n") ? caPem : `${caPem}\n`);
197
+ writeTlsMode(this.tlsDataDir(), "uploaded");
198
+ return this.snapshotTls(true);
199
+ },
200
+ downloadCa: async () => {
201
+ return { pem: this.snapshotTls(false).caCertPem ?? "" };
202
+ },
203
+ revertToGeneratedCertificate: async () => {
204
+ writeTlsMode(this.tlsDataDir(), "generated");
205
+ const extraSans = [...readExtraSans(this.tlsDataDir())];
206
+ await ensureTlsCert(this.tlsDataDir(), { extraSans });
207
+ return this.snapshotTls(true);
133
208
  }
134
209
  };
135
210
  this.lastSnapshotKey = snapshotKey(this.enumerate());
@@ -153,11 +228,58 @@ var LocalNetworkAddon = class extends BaseAddon {
153
228
  } : null);
154
229
  });
155
230
  this.ctx.logger.info("local-network initialized", { meta: { interfaceCount: this.enumerate().length } });
231
+ try {
232
+ await this.applyLanAccessFromSettings();
233
+ } catch (err) {
234
+ this.ctx.logger.warn("local-network: LAN HTTP not applied at boot", { meta: { error: err instanceof Error ? err.message : String(err) } });
235
+ }
156
236
  return [{
157
237
  capability: localNetworkCapability,
158
238
  provider
159
239
  }];
160
240
  }
241
+ globalSettingsSchema() {
242
+ return this.schema({ sections: [{
243
+ id: "local-access",
244
+ title: "LAN HTTP",
245
+ description: "Native apps on this Wi-Fi use http:// and skip the private certificate. The tunnel and this admin UI stay on HTTPS. Turn off once a publicly-trusted certificate covers the LAN name.",
246
+ columns: 1,
247
+ fields: [
248
+ this.field({
249
+ type: "boolean",
250
+ key: "httpEnabled",
251
+ label: "Enable HTTP on the LAN",
252
+ style: "switch",
253
+ default: true
254
+ }),
255
+ this.field({
256
+ type: "number",
257
+ key: "httpPort",
258
+ label: "HTTP port",
259
+ description: "Dedicated listener. Must not equal the HTTPS port (4443 by default).",
260
+ min: 1,
261
+ max: 65535,
262
+ step: 1,
263
+ default: DEFAULT_LAN_HTTP_PORT,
264
+ showWhen: {
265
+ field: "httpEnabled",
266
+ equals: true
267
+ }
268
+ }),
269
+ this.field({
270
+ type: "text",
271
+ key: "localHostname",
272
+ label: "Local hostname",
273
+ description: "Advertised to the viewer instead of the raw LAN IP, and added to the certificate SAN. Requires this name to resolve on the LAN (router DNS, mDNS, or a hosts file). Leave empty to keep using the IP.",
274
+ maxLength: 253,
275
+ placeholder: "camstack.lan"
276
+ })
277
+ ]
278
+ }] });
279
+ }
280
+ async onConfigChanged() {
281
+ await this.applyLanAccessFromSettings();
282
+ }
161
283
  async onShutdown() {
162
284
  if (this.pollTimer) {
163
285
  clearInterval(this.pollTimer);
@@ -226,6 +348,42 @@ var LocalNetworkAddon = class extends BaseAddon {
226
348
  }
227
349
  }
228
350
  }
351
+ resolvedHttpPort() {
352
+ const port = this.config.httpPort;
353
+ return Number.isInteger(port) && port >= 1 && port <= 65535 ? port : DEFAULT_LAN_HTTP_PORT;
354
+ }
355
+ tlsDataDir() {
356
+ return this.ctx.nodeDataDir ?? this.ctx.dataDir;
357
+ }
358
+ snapshotTls(restartRequired) {
359
+ const status = readTlsAccessStatus(this.tlsDataDir(), restartRequired);
360
+ return {
361
+ ...status,
362
+ sans: [...status.sans]
363
+ };
364
+ }
365
+ /**
366
+ * Bind or unbind the LAN HTTP sibling from the addon's own settings, and
367
+ * keep the leaf SAN in sync with `localHostname`. This is the settings
368
+ * side-effect path — there is no second persist API.
369
+ */
370
+ async applyLanAccessFromSettings() {
371
+ const parsed = parseLocalHostname(this.config.localHostname ?? "");
372
+ if (!parsed.ok) throw new Error(parsed.error);
373
+ const hostname = parsed.value ?? "";
374
+ const httpsPort = (await this.resolveAdvertisedListenPort(null)).port;
375
+ const httpPort = this.resolvedHttpPort();
376
+ if (this.config.httpEnabled !== false && httpPort === httpsPort) throw new Error(`HTTP port ${httpPort} cannot equal the HTTPS listen port`);
377
+ await applyLanHttp({
378
+ enabled: this.config.httpEnabled !== false,
379
+ port: httpPort,
380
+ host: "0.0.0.0"
381
+ });
382
+ if (hostname !== "") {
383
+ writeExtraSans(this.tlsDataDir(), [hostname]);
384
+ if (readTlsMode(this.tlsDataDir()) === "generated") await ensureTlsCert(this.tlsDataDir(), { extraSans: [hostname] });
385
+ } else writeExtraSans(this.tlsDataDir(), []);
386
+ }
229
387
  /**
230
388
  * The port this hub is actually listening on, plus the provenance of the
231
389
  * number. The boot loader merges the `CAMSTACK_PORT` env override into the
@@ -399,31 +557,13 @@ function pickPreferred(interfaces) {
399
557
  return prefixLen(b.netmask) - prefixLen(a.netmask);
400
558
  })[0] ?? null;
401
559
  }
402
- /**
403
- * Build the ordered candidate URL list. Priority schema:
404
- * 0 — preferred LAN IPv4
405
- * 10+ — other LAN IPv4
406
- * 100 — public tunnel hostname (always HTTPS)
407
- * 150 — mesh endpoint (Tailscale MagicDNS / 100.x, always HTTPS)
408
- * 200+ — LAN IPv6
409
- * 1000 — loopback (last resort)
410
- *
411
- * The mesh endpoint ranks just below a true public funnel (a Funnel is
412
- * reachable by ANY client; the mesh needs the peer on the same tailnet)
413
- * but above the IPv6 / loopback fallbacks — giving remote, mesh-joined
414
- * clients a working candidate when no public tunnel is up.
415
- *
416
- * `scheme` controls LAN + loopback URLs. Browsers running over HTTPS
417
- * block `http://` candidates as mixed content, so callers loaded over
418
- * HTTPS should pass `scheme: 'https'` even when probing a LAN IP — the
419
- * hub's cert manager already issues a SAN-multi cert covering local
420
- * interfaces. The public tunnel + mesh endpoint always emit `https://`
421
- * (the tunnel edge / the hub itself terminates TLS).
422
- */
423
- function buildEndpoints(interfaces, port, includeLoopback, ipv4Only, publicHostname, scheme = "http", meshEndpoint = null) {
560
+ function buildEndpoints(interfaces, port, includeLoopback, ipv4Only, publicHostname, scheme = "http", meshEndpoint = null, lanHttp = null) {
424
561
  const out = [];
425
562
  let priority = 0;
426
563
  const preferred = pickPreferred(interfaces);
564
+ const httpLan = lanHttp?.enabled === true && lanHttp.listening === true;
565
+ const lanScheme = httpLan ? "http" : scheme;
566
+ const lanPort = httpLan ? lanHttp.httpPort : port;
427
567
  const emit = (iface, kind, label, baseUrl, pri) => {
428
568
  out.push({
429
569
  label,
@@ -435,13 +575,22 @@ function buildEndpoints(interfaces, port, includeLoopback, ipv4Only, publicHostn
435
575
  priority: pri
436
576
  });
437
577
  };
438
- if (preferred) emit(preferred, "lan-ipv4", `${formatKind(preferred.kind)} — ${preferred.name}`, `${scheme}://${preferred.address}:${port}`, priority++);
578
+ if (httpLan && lanHttp.localHostname) out.push({
579
+ label: "Local name",
580
+ baseUrl: `${lanScheme}://${lanHttp.localHostname}:${lanPort}`,
581
+ kind: "lan-ipv4",
582
+ interfaceKind: "lan",
583
+ plausible: true,
584
+ plausibleReason: "",
585
+ priority: priority++
586
+ });
587
+ if (preferred) emit(preferred, "lan-ipv4", `${formatKind(preferred.kind)} — ${preferred.name}`, `${lanScheme}://${preferred.address}:${lanPort}`, priority++);
439
588
  for (const iface of interfaces) {
440
589
  if (iface.internal || iface.family !== "IPv4") continue;
441
590
  if (iface.kind === "loopback") continue;
442
591
  if (preferred && iface.name === preferred.name && iface.address === preferred.address) continue;
443
592
  if (iface.address.startsWith("169.254.")) continue;
444
- emit(iface, "lan-ipv4", `${formatKind(iface.kind)} — ${iface.name}`, `${scheme}://${iface.address}:${port}`, 10 + priority++);
593
+ emit(iface, "lan-ipv4", `${formatKind(iface.kind)} — ${iface.name}`, `${lanScheme}://${iface.address}:${lanPort}`, 10 + priority++);
445
594
  }
446
595
  if (publicHostname) out.push({
447
596
  label: "Public tunnel",
@@ -467,7 +616,7 @@ function buildEndpoints(interfaces, port, includeLoopback, ipv4Only, publicHostn
467
616
  if (iface.internal || iface.family !== "IPv6") continue;
468
617
  if (iface.kind === "loopback") continue;
469
618
  if (iface.address.startsWith("fe80:")) continue;
470
- emit(iface, "lan-ipv6", `${formatKind(iface.kind)} — ${iface.name} (IPv6)`, `${scheme}://[${iface.address}]:${port}`, v6prio++);
619
+ emit(iface, "lan-ipv6", `${formatKind(iface.kind)} — ${iface.name} (IPv6)`, `${lanScheme}://[${iface.address}]:${lanPort}`, v6prio++);
471
620
  }
472
621
  }
473
622
  if (includeLoopback) out.push({
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-iAwSA2_f.js");
6
+ const require_dist = require("../../dist-Cri60Jd0.js");
7
7
  //#region src/builtins/loki-logging/loki-payload.ts
8
8
  /**
9
9
  * Loki rejects a label name that is not a valid Prometheus label
@@ -1,4 +1,4 @@
1
- import { X as logDestinationCapability, yt as BaseAddon } from "../../dist-Drb54SZD.mjs";
1
+ import { X as logDestinationCapability, yt as BaseAddon } from "../../dist-BpzbLPel.mjs";
2
2
  //#region src/builtins/loki-logging/loki-payload.ts
3
3
  /**
4
4
  * Loki rejects a label name that is not a valid Prometheus label
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-iAwSA2_f.js");
6
+ const require_dist = require("../../dist-Cri60Jd0.js");
7
7
  let node_child_process = require("node:child_process");
8
8
  let node_util = require("node:util");
9
9
  let node_os = require("node:os");
@@ -1,4 +1,4 @@
1
- import { $ as metricsProviderCapability, Gt as EventCategory, Mt as createEvent, yt as BaseAddon } from "../../dist-Drb54SZD.mjs";
1
+ import { $ as metricsProviderCapability, Gt as EventCategory, Mt as createEvent, yt as BaseAddon } from "../../dist-BpzbLPel.mjs";
2
2
  import { execFile, execFileSync } from "node:child_process";
3
3
  import { promisify } from "node:util";
4
4
  import * as os from "node:os";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-iAwSA2_f.js");
6
+ const require_dist = require("../../dist-Cri60Jd0.js");
7
7
  let node_child_process = require("node:child_process");
8
8
  let node_util = require("node:util");
9
9
  let node_os = require("node:os");
@@ -1,5 +1,5 @@
1
1
  import { o as __toESM } from "../../chunk-CNf5ZN-e.mjs";
2
- import { Gt as EventCategory, L as enumerateInferenceDevices, Pt as emitReadiness, ct as scoreRuntimes, rt as platformProbeCapability, vt as errMsg, yt as BaseAddon } from "../../dist-Drb54SZD.mjs";
2
+ import { Gt as EventCategory, L as enumerateInferenceDevices, Pt as emitReadiness, ct as scoreRuntimes, rt as platformProbeCapability, vt as errMsg, yt as BaseAddon } from "../../dist-BpzbLPel.mjs";
3
3
  import { execFile } from "node:child_process";
4
4
  import { promisify } from "node:util";
5
5
  import * as os from "node:os";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-iAwSA2_f.js");
6
+ const require_dist = require("../../dist-Cri60Jd0.js");
7
7
  //#region src/builtins/remote-access-orchestrator/enabled-providers-reconcile.ts
8
8
  /**
9
9
  * Reconcile the durable `enabledProviders` set against authoritative
@@ -1,4 +1,4 @@
1
- import { Gt as EventCategory, yt as BaseAddon } from "../../dist-Drb54SZD.mjs";
1
+ import { Gt as EventCategory, yt as BaseAddon } from "../../dist-BpzbLPel.mjs";
2
2
  //#region src/builtins/remote-access-orchestrator/enabled-providers-reconcile.ts
3
3
  /**
4
4
  * Reconcile the durable `enabledProviders` set against authoritative
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-iAwSA2_f.js");
6
+ const require_dist = require("../../dist-Cri60Jd0.js");
7
7
  let zod = require("zod");
8
8
  let node_crypto = require("node:crypto");
9
9
  let _camstack_types_node = require("@camstack/types/node");
@@ -1,4 +1,4 @@
1
- import { Ct as DeviceFeature, Gt as EventCategory, M as deriveBatteryPresence, Rt as nodePin, T as batteryCapability, Tt as DeviceType, i as BatteryStatusSchema, mt as streamQualityLabel, ut as snapshotCapability, vt as errMsg, w as bareAddonId, yt as BaseAddon } from "../../dist-Drb54SZD.mjs";
1
+ import { Ct as DeviceFeature, Gt as EventCategory, M as deriveBatteryPresence, Rt as nodePin, T as batteryCapability, Tt as DeviceType, i as BatteryStatusSchema, mt as streamQualityLabel, ut as snapshotCapability, vt as errMsg, w as bareAddonId, yt as BaseAddon } from "../../dist-BpzbLPel.mjs";
2
2
  import { z } from "zod";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { signExpiringUrl, verifyExpiringUrl } from "@camstack/types/node";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-iAwSA2_f.js");
6
+ const require_dist = require("../../dist-Cri60Jd0.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  let node_fs_promises = require("node:fs/promises");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { V as filesystemBrowseCapability, pt as storageProviderCapability, yt as BaseAddon } from "../../dist-Drb54SZD.mjs";
1
+ import { V as filesystemBrowseCapability, pt as storageProviderCapability, yt as BaseAddon } from "../../dist-BpzbLPel.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { mkdir, readdir, realpath, statfs } from "node:fs/promises";
4
4
  import * as path$1 from "node:path";
@@ -3,8 +3,8 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-iAwSA2_f.js");
7
- const require_retired_settings_keys = require("../../retired-settings-keys-OfhqQio4.js");
6
+ const require_dist = require("../../dist-Cri60Jd0.js");
7
+ const require_retired_settings_keys = require("../../retired-settings-keys-BVAxT5XL.js");
8
8
  let node_crypto = require("node:crypto");
9
9
  let node_fs = require("node:fs");
10
10
  let node_module = require("node:module");
@@ -1,5 +1,5 @@
1
- import { A as dataStoreProviderCapability, Bt as parseJsonUnknown, _t as vectorStoreCapability, f as RUNTIME_DEFAULTS, gt as vectorDimFromBase64, j as decodeVectorBase64, kt as asJsonObject, vt as errMsg, w as bareAddonId, yt as BaseAddon } from "../../dist-Drb54SZD.mjs";
2
- import { r as retiredKeyStoreOf, t as purgeRetiredSettingsKeys } from "../../retired-settings-keys-Dz5-7gjt.mjs";
1
+ import { A as dataStoreProviderCapability, Bt as parseJsonUnknown, _t as vectorStoreCapability, f as RUNTIME_DEFAULTS, gt as vectorDimFromBase64, j as decodeVectorBase64, kt as asJsonObject, vt as errMsg, w as bareAddonId, yt as BaseAddon } from "../../dist-BpzbLPel.mjs";
2
+ import { r as retiredKeyStoreOf, t as purgeRetiredSettingsKeys } from "../../retired-settings-keys-SrxMH3OT.mjs";
3
3
  import { createRequire } from "node:module";
4
4
  import { randomUUID } from "node:crypto";
5
5
  import { statSync } from "node:fs";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-iAwSA2_f.js");
6
+ const require_dist = require("../../dist-Cri60Jd0.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  let node_fs_promises = require("node:fs/promises");
9
9
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -1,4 +1,4 @@
1
- import { dt as storageCapability, ft as storageMigrationCapability, g as StorageMigrationJobSchema, h as StorageLocationTypeSchema, lt as settingsStoreCapability, yt as BaseAddon, zt as parseJsonObject } from "../../dist-Drb54SZD.mjs";
1
+ import { dt as storageCapability, ft as storageMigrationCapability, g as StorageMigrationJobSchema, h as StorageLocationTypeSchema, lt as settingsStoreCapability, yt as BaseAddon, zt as parseJsonObject } from "../../dist-BpzbLPel.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import * as fs from "node:fs/promises";
4
4
  import * as path$1 from "node:path";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-iAwSA2_f.js");
6
+ const require_dist = require("../../dist-Cri60Jd0.js");
7
7
  //#region src/builtins/system-config/system-config.addon.ts
8
8
  /**
9
9
  * Built-in `system-config` addon — Phase 4 of the settings redesign.
@@ -1,4 +1,4 @@
1
- import { It as hydrateSchema, vt as errMsg, yt as BaseAddon } from "../../dist-Drb54SZD.mjs";
1
+ import { It as hydrateSchema, vt as errMsg, yt as BaseAddon } from "../../dist-BpzbLPel.mjs";
2
2
  //#region src/builtins/system-config/system-config.addon.ts
3
3
  /**
4
4
  * Built-in `system-config` addon — Phase 4 of the settings redesign.
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-iAwSA2_f.js");
6
+ const require_dist = require("../../dist-Cri60Jd0.js");
7
7
  const require_formatter = require("../../formatter-DqAKDlvN.js");
8
8
  let node_path = require("node:path");
9
9
  node_path = require_chunk.__toESM(node_path);
@@ -1,4 +1,4 @@
1
- import { X as logDestinationCapability, yt as BaseAddon } from "../../dist-Drb54SZD.mjs";
1
+ import { X as logDestinationCapability, yt as BaseAddon } from "../../dist-BpzbLPel.mjs";
2
2
  import { t as formatLogLine } from "../../formatter-B7qW8bPJ.mjs";
3
3
  import * as path$1 from "node:path";
4
4
  import path from "node:path";