@camstack/system 1.2.115 → 1.2.117

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 (62) 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/ipv6-lan.d.ts +26 -0
  24. package/dist/builtins/local-network/local-hostname.d.ts +15 -0
  25. package/dist/builtins/local-network/local-network.addon.d.ts +59 -21
  26. package/dist/builtins/local-network/local-network.addon.js +369 -50
  27. package/dist/builtins/local-network/local-network.addon.mjs +365 -51
  28. package/dist/builtins/loki-logging/index.js +1 -1
  29. package/dist/builtins/loki-logging/index.mjs +1 -1
  30. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  31. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  32. package/dist/builtins/platform-probe/index.js +1 -1
  33. package/dist/builtins/platform-probe/index.mjs +1 -1
  34. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  35. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  36. package/dist/builtins/snapshot/index.js +1 -1
  37. package/dist/builtins/snapshot/index.mjs +1 -1
  38. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  39. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  40. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +2 -2
  41. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +2 -2
  42. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  43. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  44. package/dist/builtins/system-config/system-config.addon.js +1 -1
  45. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  46. package/dist/builtins/winston-logging/index.js +1 -1
  47. package/dist/builtins/winston-logging/index.mjs +1 -1
  48. package/dist/{dist-Drb54SZD.mjs → dist-D4Vmj8iw.mjs} +151 -9
  49. package/dist/{dist-iAwSA2_f.js → dist-DMEGlqg6.js} +151 -9
  50. package/dist/http/lan-http-bind.d.ts +30 -0
  51. package/dist/index.d.ts +1 -0
  52. package/dist/index.js +30 -472
  53. package/dist/index.mjs +11 -468
  54. package/dist/lan-http-bind-DmgpFP6_.js +890 -0
  55. package/dist/lan-http-bind-jKrj6OjQ.mjs +752 -0
  56. package/dist/{retired-settings-keys-Dz5-7gjt.mjs → retired-settings-keys--aM_vGF9.mjs} +1 -1
  57. package/dist/{retired-settings-keys-OfhqQio4.js → retired-settings-keys-DET4YkAU.js} +1 -1
  58. package/dist/tls/cert-manager.d.ts +11 -0
  59. package/dist/tls/index.d.ts +3 -1
  60. package/dist/tls/tls-status.d.ts +16 -0
  61. package/dist/tls/uploaded-cert.d.ts +14 -0
  62. package/package.json +1 -1
@@ -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-D4Vmj8iw.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-DMEGlqg6.js");
7
+ const require_retired_settings_keys = require("../../retired-settings-keys-DET4YkAU.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-D4Vmj8iw.mjs";
2
+ import { r as retiredKeyStoreOf, t as purgeRetiredSettingsKeys } from "../../retired-settings-keys--aM_vGF9.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-DMEGlqg6.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-D4Vmj8iw.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-DMEGlqg6.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-D4Vmj8iw.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-DMEGlqg6.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-D4Vmj8iw.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";
@@ -19197,6 +19197,9 @@ var storageProviderCapability = {
19197
19197
  endDownload: method(EndDownloadInputSchema, z.void(), { kind: "mutation" })
19198
19198
  }
19199
19199
  };
19200
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19201
+ var ProfileSettingsSchemaBridge = z.unknown().nullable();
19202
+ var ProfileSettingsBagSchema = z.record(z.string(), z.unknown());
19200
19203
  /**
19201
19204
  * A live terminal session hosted by the provider addon. Output and input do
19202
19205
  * NOT flow through the capability — they use the addon data plane
@@ -19226,7 +19229,14 @@ var TerminalSessionInfoSchema = z.object({
19226
19229
  var TerminalProfileInfoSchema = z.object({
19227
19230
  profileId: z.string(),
19228
19231
  label: z.string(),
19229
- description: z.string().optional()
19232
+ description: z.string().optional(),
19233
+ /** Spawn defaults the instance form copies on create. */
19234
+ executable: z.string().optional(),
19235
+ args: z.array(z.string()).readonly().optional(),
19236
+ cwd: z.string().optional(),
19237
+ environment: z.array(z.string()).readonly().optional(),
19238
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
19239
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
19230
19240
  });
19231
19241
  /**
19232
19242
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -19239,7 +19249,12 @@ var TerminalInstanceInfoSchema = z.object({
19239
19249
  profileId: z.string(),
19240
19250
  profileLabel: z.string(),
19241
19251
  name: z.string(),
19242
- enabled: z.boolean()
19252
+ enabled: z.boolean(),
19253
+ executable: z.string(),
19254
+ args: z.array(z.string()).readonly(),
19255
+ cwd: z.string(),
19256
+ environment: z.array(z.string()).readonly(),
19257
+ profileSettings: ProfileSettingsBagSchema
19243
19258
  });
19244
19259
  var TerminalLegacyCameraSchema = z.object({
19245
19260
  stableId: z.string(),
@@ -19285,7 +19300,24 @@ var terminalSessionCapability = {
19285
19300
  createInstance: method(z.object({
19286
19301
  targetNodeId: z.string().min(1),
19287
19302
  profileId: z.string().min(1),
19288
- name: z.string().trim().min(1).max(160).optional()
19303
+ name: z.string().trim().min(1).max(160).optional(),
19304
+ executable: z.string().max(1024).optional(),
19305
+ args: z.array(z.string().max(2048)).max(64).optional(),
19306
+ cwd: z.string().max(1024).optional(),
19307
+ environment: z.array(z.string().max(4096)).max(64).optional(),
19308
+ profileSettings: ProfileSettingsBagSchema.optional()
19309
+ }), TerminalInstanceInfoSchema, {
19310
+ kind: "mutation",
19311
+ auth: "admin"
19312
+ }),
19313
+ updateInstance: method(z.object({
19314
+ instanceId: z.string().min(1),
19315
+ name: z.string().trim().min(1).max(160).optional(),
19316
+ executable: z.string().max(1024).optional(),
19317
+ args: z.array(z.string().max(2048)).max(64).optional(),
19318
+ cwd: z.string().max(1024).optional(),
19319
+ environment: z.array(z.string().max(4096)).max(64).optional(),
19320
+ profileSettings: ProfileSettingsBagSchema.optional()
19289
19321
  }), TerminalInstanceInfoSchema, {
19290
19322
  kind: "mutation",
19291
19323
  auth: "admin"
@@ -19320,7 +19352,11 @@ var terminalSessionCapability = {
19320
19352
  openSession: method(z.object({
19321
19353
  profileId: z.string(),
19322
19354
  cols: z.number().int().positive(),
19323
- rows: z.number().int().positive()
19355
+ rows: z.number().int().positive(),
19356
+ executable: z.string().max(1024).optional(),
19357
+ args: z.array(z.string().max(2048)).max(64).optional(),
19358
+ cwd: z.string().max(1024).optional(),
19359
+ environment: z.array(z.string().max(4096)).max(64).optional()
19324
19360
  }), TerminalSessionInfoSchema, {
19325
19361
  kind: "mutation",
19326
19362
  auth: "admin"
@@ -23753,10 +23789,10 @@ var lawnMowerControlCapability = {
23753
23789
  *
23754
23790
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
23755
23791
  * to receive an ordered list of candidate base URLs it should race
23756
- * on connect — LAN IPv4 first (lowest latency when on same network),
23757
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
23758
- * race them with short timeouts and stick with the winner for the
23759
- * session.
23792
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
23793
+ * when on the same network), then public hostname (if a tunnel is
23794
+ * up). The SDK can race them with short timeouts and stick with the
23795
+ * winner for the session.
23760
23796
  *
23761
23797
  * Why hub-only: agents are not directly addressable by the operator's
23762
23798
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -23919,6 +23955,20 @@ var AllowedAddressesSchema = z.object({
23919
23955
  * Network Addresses admin page and persisted by the addon.
23920
23956
  */
23921
23957
  addresses: z.array(z.string()).readonly() });
23958
+ var TlsStatusSchema = z.object({
23959
+ mode: z.enum([
23960
+ "generated",
23961
+ "uploaded",
23962
+ "disabled"
23963
+ ]),
23964
+ leafFingerprintSha256: z.string().nullable(),
23965
+ caFingerprintSha256: z.string().nullable(),
23966
+ validTo: z.string().nullable(),
23967
+ sans: z.array(z.string()),
23968
+ caCertPem: z.string().nullable(),
23969
+ reissueError: z.string().nullable(),
23970
+ restartRequired: z.boolean()
23971
+ });
23922
23972
  var localNetworkCapability = {
23923
23973
  name: "local-network",
23924
23974
  scope: "system",
@@ -24024,7 +24074,34 @@ var localNetworkCapability = {
24024
24074
  * when the operator wants to wipe their manual edits and start
24025
24075
  * over from the auto-detected best matches.
24026
24076
  */
24027
- resetAllowlistToBestMatch: method(z.void(), AllowedAddressesSchema, { kind: "mutation" })
24077
+ resetAllowlistToBestMatch: method(z.void(), AllowedAddressesSchema, { kind: "mutation" }),
24078
+ /**
24079
+ * Live TLS material for the Network → Local access certificate card.
24080
+ * LAN HTTP / hostname are addon settings (`globalSettingsSchema`), not
24081
+ * a second store — this query is status, not configuration.
24082
+ */
24083
+ getTlsStatus: method(z.void(), TlsStatusSchema),
24084
+ /** Issue a new leaf under the existing local CA. Disabled in uploaded mode. */
24085
+ regenerateCertificate: method(z.object({ reason: z.string().optional() }), TlsStatusSchema, {
24086
+ kind: "mutation",
24087
+ auth: "admin"
24088
+ }),
24089
+ /** Replace the served material with operator-supplied PEMs. */
24090
+ uploadCertificate: method(z.object({
24091
+ certPem: z.string().min(1),
24092
+ keyPem: z.string().min(1),
24093
+ caPem: z.string().optional()
24094
+ }), TlsStatusSchema, {
24095
+ kind: "mutation",
24096
+ auth: "admin"
24097
+ }),
24098
+ /** The local CA PEM, or empty when there is none to download. */
24099
+ downloadCa: method(z.void(), z.object({ pem: z.string() })),
24100
+ /** Drop uploaded material and return to the generated local CA. */
24101
+ revertToGeneratedCertificate: method(z.void(), TlsStatusSchema, {
24102
+ kind: "mutation",
24103
+ auth: "admin"
24104
+ })
24028
24105
  },
24029
24106
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
24030
24107
  mount: { kind: "hub-only" }
@@ -32478,6 +32555,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
32478
32555
  addonId: null,
32479
32556
  access: "create"
32480
32557
  },
32558
+ "localNetwork.downloadCa": {
32559
+ capName: "local-network",
32560
+ capScope: "system",
32561
+ addonId: null,
32562
+ access: "view"
32563
+ },
32481
32564
  "localNetwork.getAllowedAddresses": {
32482
32565
  capName: "local-network",
32483
32566
  capScope: "system",
@@ -32502,18 +32585,36 @@ var METHOD_ACCESS_MAP = Object.freeze({
32502
32585
  addonId: null,
32503
32586
  access: "view"
32504
32587
  },
32588
+ "localNetwork.getTlsStatus": {
32589
+ capName: "local-network",
32590
+ capScope: "system",
32591
+ addonId: null,
32592
+ access: "view"
32593
+ },
32505
32594
  "localNetwork.list": {
32506
32595
  capName: "local-network",
32507
32596
  capScope: "system",
32508
32597
  addonId: null,
32509
32598
  access: "view"
32510
32599
  },
32600
+ "localNetwork.regenerateCertificate": {
32601
+ capName: "local-network",
32602
+ capScope: "system",
32603
+ addonId: null,
32604
+ access: "create"
32605
+ },
32511
32606
  "localNetwork.resetAllowlistToBestMatch": {
32512
32607
  capName: "local-network",
32513
32608
  capScope: "system",
32514
32609
  addonId: null,
32515
32610
  access: "delete"
32516
32611
  },
32612
+ "localNetwork.revertToGeneratedCertificate": {
32613
+ capName: "local-network",
32614
+ capScope: "system",
32615
+ addonId: null,
32616
+ access: "create"
32617
+ },
32517
32618
  "localNetwork.setAllowedAddresses": {
32518
32619
  capName: "local-network",
32519
32620
  capScope: "system",
@@ -32526,6 +32627,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
32526
32627
  addonId: null,
32527
32628
  access: "create"
32528
32629
  },
32630
+ "localNetwork.uploadCertificate": {
32631
+ capName: "local-network",
32632
+ capScope: "system",
32633
+ addonId: null,
32634
+ access: "create"
32635
+ },
32529
32636
  "lockControl.lock": {
32530
32637
  capName: "lock-control",
32531
32638
  capScope: "device",
@@ -35406,6 +35513,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
35406
35513
  addonId: null,
35407
35514
  access: "create"
35408
35515
  },
35516
+ "terminalSession.updateInstance": {
35517
+ capName: "terminal-session",
35518
+ capScope: "system",
35519
+ addonId: null,
35520
+ access: "create"
35521
+ },
35409
35522
  "terminalSession.writeInput": {
35410
35523
  capName: "terminal-session",
35411
35524
  capScope: "system",
@@ -38173,6 +38286,35 @@ Object.freeze(Object.fromEntries([{
38173
38286
  }]
38174
38287
  }].map((s) => [s.stepId, s.defaultModelId])));
38175
38288
  z.string().min(1);
38289
+ var CLUSTER_STEP_SETTING_FIELDS = [{
38290
+ stepId: "face-embedding",
38291
+ key: "minLandmarkFaceSize",
38292
+ label: "Min face size for recognition (detection px)",
38293
+ description: "Refuse to embed a face smaller than this IN THE DETECTION FRAME. Applies to every node — the enrolled gallery is one index, and two admission floors would fill it from two policies. 0 disables the gate.",
38294
+ type: "slider",
38295
+ min: 0,
38296
+ max: 64,
38297
+ step: 2,
38298
+ default: 24
38299
+ }];
38300
+ function clusterStepSettingKey(stepId, fieldKey) {
38301
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
38302
+ }
38303
+ var ClusterSettingNumberSchema = z.number().finite();
38304
+ function readClusterStepSettings(config) {
38305
+ const out = {};
38306
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
38307
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
38308
+ const value = parsed.success ? parsed.data : field.default;
38309
+ const existing = out[field.stepId] ?? {};
38310
+ out[field.stepId] = {
38311
+ ...existing,
38312
+ [field.key]: value
38313
+ };
38314
+ }
38315
+ return out;
38316
+ }
38317
+ readClusterStepSettings({});
38176
38318
  z.object({
38177
38319
  /**
38178
38320
  * Fraction of the box's own size added on EACH side before cutting.
@@ -19197,6 +19197,9 @@ var storageProviderCapability = {
19197
19197
  endDownload: method(EndDownloadInputSchema, zod.z.void(), { kind: "mutation" })
19198
19198
  }
19199
19199
  };
19200
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19201
+ var ProfileSettingsSchemaBridge = zod.z.unknown().nullable();
19202
+ var ProfileSettingsBagSchema = zod.z.record(zod.z.string(), zod.z.unknown());
19200
19203
  /**
19201
19204
  * A live terminal session hosted by the provider addon. Output and input do
19202
19205
  * NOT flow through the capability — they use the addon data plane
@@ -19226,7 +19229,14 @@ var TerminalSessionInfoSchema = zod.z.object({
19226
19229
  var TerminalProfileInfoSchema = zod.z.object({
19227
19230
  profileId: zod.z.string(),
19228
19231
  label: zod.z.string(),
19229
- description: zod.z.string().optional()
19232
+ description: zod.z.string().optional(),
19233
+ /** Spawn defaults the instance form copies on create. */
19234
+ executable: zod.z.string().optional(),
19235
+ args: zod.z.array(zod.z.string()).readonly().optional(),
19236
+ cwd: zod.z.string().optional(),
19237
+ environment: zod.z.array(zod.z.string()).readonly().optional(),
19238
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
19239
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
19230
19240
  });
19231
19241
  /**
19232
19242
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -19239,7 +19249,12 @@ var TerminalInstanceInfoSchema = zod.z.object({
19239
19249
  profileId: zod.z.string(),
19240
19250
  profileLabel: zod.z.string(),
19241
19251
  name: zod.z.string(),
19242
- enabled: zod.z.boolean()
19252
+ enabled: zod.z.boolean(),
19253
+ executable: zod.z.string(),
19254
+ args: zod.z.array(zod.z.string()).readonly(),
19255
+ cwd: zod.z.string(),
19256
+ environment: zod.z.array(zod.z.string()).readonly(),
19257
+ profileSettings: ProfileSettingsBagSchema
19243
19258
  });
19244
19259
  var TerminalLegacyCameraSchema = zod.z.object({
19245
19260
  stableId: zod.z.string(),
@@ -19285,7 +19300,24 @@ var terminalSessionCapability = {
19285
19300
  createInstance: method(zod.z.object({
19286
19301
  targetNodeId: zod.z.string().min(1),
19287
19302
  profileId: zod.z.string().min(1),
19288
- name: zod.z.string().trim().min(1).max(160).optional()
19303
+ name: zod.z.string().trim().min(1).max(160).optional(),
19304
+ executable: zod.z.string().max(1024).optional(),
19305
+ args: zod.z.array(zod.z.string().max(2048)).max(64).optional(),
19306
+ cwd: zod.z.string().max(1024).optional(),
19307
+ environment: zod.z.array(zod.z.string().max(4096)).max(64).optional(),
19308
+ profileSettings: ProfileSettingsBagSchema.optional()
19309
+ }), TerminalInstanceInfoSchema, {
19310
+ kind: "mutation",
19311
+ auth: "admin"
19312
+ }),
19313
+ updateInstance: method(zod.z.object({
19314
+ instanceId: zod.z.string().min(1),
19315
+ name: zod.z.string().trim().min(1).max(160).optional(),
19316
+ executable: zod.z.string().max(1024).optional(),
19317
+ args: zod.z.array(zod.z.string().max(2048)).max(64).optional(),
19318
+ cwd: zod.z.string().max(1024).optional(),
19319
+ environment: zod.z.array(zod.z.string().max(4096)).max(64).optional(),
19320
+ profileSettings: ProfileSettingsBagSchema.optional()
19289
19321
  }), TerminalInstanceInfoSchema, {
19290
19322
  kind: "mutation",
19291
19323
  auth: "admin"
@@ -19320,7 +19352,11 @@ var terminalSessionCapability = {
19320
19352
  openSession: method(zod.z.object({
19321
19353
  profileId: zod.z.string(),
19322
19354
  cols: zod.z.number().int().positive(),
19323
- rows: zod.z.number().int().positive()
19355
+ rows: zod.z.number().int().positive(),
19356
+ executable: zod.z.string().max(1024).optional(),
19357
+ args: zod.z.array(zod.z.string().max(2048)).max(64).optional(),
19358
+ cwd: zod.z.string().max(1024).optional(),
19359
+ environment: zod.z.array(zod.z.string().max(4096)).max(64).optional()
19324
19360
  }), TerminalSessionInfoSchema, {
19325
19361
  kind: "mutation",
19326
19362
  auth: "admin"
@@ -23753,10 +23789,10 @@ var lawnMowerControlCapability = {
23753
23789
  *
23754
23790
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
23755
23791
  * to receive an ordered list of candidate base URLs it should race
23756
- * on connect — LAN IPv4 first (lowest latency when on same network),
23757
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
23758
- * race them with short timeouts and stick with the winner for the
23759
- * session.
23792
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
23793
+ * when on the same network), then public hostname (if a tunnel is
23794
+ * up). The SDK can race them with short timeouts and stick with the
23795
+ * winner for the session.
23760
23796
  *
23761
23797
  * Why hub-only: agents are not directly addressable by the operator's
23762
23798
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -23919,6 +23955,20 @@ var AllowedAddressesSchema = zod.z.object({
23919
23955
  * Network Addresses admin page and persisted by the addon.
23920
23956
  */
23921
23957
  addresses: zod.z.array(zod.z.string()).readonly() });
23958
+ var TlsStatusSchema = zod.z.object({
23959
+ mode: zod.z.enum([
23960
+ "generated",
23961
+ "uploaded",
23962
+ "disabled"
23963
+ ]),
23964
+ leafFingerprintSha256: zod.z.string().nullable(),
23965
+ caFingerprintSha256: zod.z.string().nullable(),
23966
+ validTo: zod.z.string().nullable(),
23967
+ sans: zod.z.array(zod.z.string()),
23968
+ caCertPem: zod.z.string().nullable(),
23969
+ reissueError: zod.z.string().nullable(),
23970
+ restartRequired: zod.z.boolean()
23971
+ });
23922
23972
  var localNetworkCapability = {
23923
23973
  name: "local-network",
23924
23974
  scope: "system",
@@ -24024,7 +24074,34 @@ var localNetworkCapability = {
24024
24074
  * when the operator wants to wipe their manual edits and start
24025
24075
  * over from the auto-detected best matches.
24026
24076
  */
24027
- resetAllowlistToBestMatch: method(zod.z.void(), AllowedAddressesSchema, { kind: "mutation" })
24077
+ resetAllowlistToBestMatch: method(zod.z.void(), AllowedAddressesSchema, { kind: "mutation" }),
24078
+ /**
24079
+ * Live TLS material for the Network → Local access certificate card.
24080
+ * LAN HTTP / hostname are addon settings (`globalSettingsSchema`), not
24081
+ * a second store — this query is status, not configuration.
24082
+ */
24083
+ getTlsStatus: method(zod.z.void(), TlsStatusSchema),
24084
+ /** Issue a new leaf under the existing local CA. Disabled in uploaded mode. */
24085
+ regenerateCertificate: method(zod.z.object({ reason: zod.z.string().optional() }), TlsStatusSchema, {
24086
+ kind: "mutation",
24087
+ auth: "admin"
24088
+ }),
24089
+ /** Replace the served material with operator-supplied PEMs. */
24090
+ uploadCertificate: method(zod.z.object({
24091
+ certPem: zod.z.string().min(1),
24092
+ keyPem: zod.z.string().min(1),
24093
+ caPem: zod.z.string().optional()
24094
+ }), TlsStatusSchema, {
24095
+ kind: "mutation",
24096
+ auth: "admin"
24097
+ }),
24098
+ /** The local CA PEM, or empty when there is none to download. */
24099
+ downloadCa: method(zod.z.void(), zod.z.object({ pem: zod.z.string() })),
24100
+ /** Drop uploaded material and return to the generated local CA. */
24101
+ revertToGeneratedCertificate: method(zod.z.void(), TlsStatusSchema, {
24102
+ kind: "mutation",
24103
+ auth: "admin"
24104
+ })
24028
24105
  },
24029
24106
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
24030
24107
  mount: { kind: "hub-only" }
@@ -32478,6 +32555,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
32478
32555
  addonId: null,
32479
32556
  access: "create"
32480
32557
  },
32558
+ "localNetwork.downloadCa": {
32559
+ capName: "local-network",
32560
+ capScope: "system",
32561
+ addonId: null,
32562
+ access: "view"
32563
+ },
32481
32564
  "localNetwork.getAllowedAddresses": {
32482
32565
  capName: "local-network",
32483
32566
  capScope: "system",
@@ -32502,18 +32585,36 @@ var METHOD_ACCESS_MAP = Object.freeze({
32502
32585
  addonId: null,
32503
32586
  access: "view"
32504
32587
  },
32588
+ "localNetwork.getTlsStatus": {
32589
+ capName: "local-network",
32590
+ capScope: "system",
32591
+ addonId: null,
32592
+ access: "view"
32593
+ },
32505
32594
  "localNetwork.list": {
32506
32595
  capName: "local-network",
32507
32596
  capScope: "system",
32508
32597
  addonId: null,
32509
32598
  access: "view"
32510
32599
  },
32600
+ "localNetwork.regenerateCertificate": {
32601
+ capName: "local-network",
32602
+ capScope: "system",
32603
+ addonId: null,
32604
+ access: "create"
32605
+ },
32511
32606
  "localNetwork.resetAllowlistToBestMatch": {
32512
32607
  capName: "local-network",
32513
32608
  capScope: "system",
32514
32609
  addonId: null,
32515
32610
  access: "delete"
32516
32611
  },
32612
+ "localNetwork.revertToGeneratedCertificate": {
32613
+ capName: "local-network",
32614
+ capScope: "system",
32615
+ addonId: null,
32616
+ access: "create"
32617
+ },
32517
32618
  "localNetwork.setAllowedAddresses": {
32518
32619
  capName: "local-network",
32519
32620
  capScope: "system",
@@ -32526,6 +32627,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
32526
32627
  addonId: null,
32527
32628
  access: "create"
32528
32629
  },
32630
+ "localNetwork.uploadCertificate": {
32631
+ capName: "local-network",
32632
+ capScope: "system",
32633
+ addonId: null,
32634
+ access: "create"
32635
+ },
32529
32636
  "lockControl.lock": {
32530
32637
  capName: "lock-control",
32531
32638
  capScope: "device",
@@ -35406,6 +35513,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
35406
35513
  addonId: null,
35407
35514
  access: "create"
35408
35515
  },
35516
+ "terminalSession.updateInstance": {
35517
+ capName: "terminal-session",
35518
+ capScope: "system",
35519
+ addonId: null,
35520
+ access: "create"
35521
+ },
35409
35522
  "terminalSession.writeInput": {
35410
35523
  capName: "terminal-session",
35411
35524
  capScope: "system",
@@ -38173,6 +38286,35 @@ Object.freeze(Object.fromEntries([{
38173
38286
  }]
38174
38287
  }].map((s) => [s.stepId, s.defaultModelId])));
38175
38288
  zod.z.string().min(1);
38289
+ var CLUSTER_STEP_SETTING_FIELDS = [{
38290
+ stepId: "face-embedding",
38291
+ key: "minLandmarkFaceSize",
38292
+ label: "Min face size for recognition (detection px)",
38293
+ description: "Refuse to embed a face smaller than this IN THE DETECTION FRAME. Applies to every node — the enrolled gallery is one index, and two admission floors would fill it from two policies. 0 disables the gate.",
38294
+ type: "slider",
38295
+ min: 0,
38296
+ max: 64,
38297
+ step: 2,
38298
+ default: 24
38299
+ }];
38300
+ function clusterStepSettingKey(stepId, fieldKey) {
38301
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
38302
+ }
38303
+ var ClusterSettingNumberSchema = zod.z.number().finite();
38304
+ function readClusterStepSettings(config) {
38305
+ const out = {};
38306
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
38307
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
38308
+ const value = parsed.success ? parsed.data : field.default;
38309
+ const existing = out[field.stepId] ?? {};
38310
+ out[field.stepId] = {
38311
+ ...existing,
38312
+ [field.key]: value
38313
+ };
38314
+ }
38315
+ return out;
38316
+ }
38317
+ readClusterStepSettings({});
38176
38318
  zod.z.object({
38177
38319
  /**
38178
38320
  * Fraction of the box's own size added on EACH side before cutting.
@@ -0,0 +1,30 @@
1
+ import { IncomingMessage, ServerResponse } from 'node:http';
2
+ import { Duplex } from 'node:stream';
3
+ export interface LanHttpBindOptions {
4
+ readonly enabled: boolean;
5
+ readonly port: number;
6
+ readonly host: string;
7
+ }
8
+ export interface LanHttpBindResult {
9
+ readonly listening: boolean;
10
+ readonly error: string | null;
11
+ readonly port: number;
12
+ }
13
+ export type LanHttpRequestHandler = (req: IncomingMessage, res: ServerResponse) => void;
14
+ export type LanHttpUpgradeHandler = (req: IncomingMessage, socket: Duplex, head: Buffer) => void;
15
+ export interface LanHttpHandlers {
16
+ readonly onRequest: LanHttpRequestHandler;
17
+ readonly onUpgrade: LanHttpUpgradeHandler;
18
+ }
19
+ export declare const DEFAULT_LAN_HTTP_PORT = 4480;
20
+ /** Map "all IPv4" to dual-stack IPv6 (`::`, ipv6Only false) so IPv4 still works. */
21
+ export declare function allFamiliesListenHost(host: string): {
22
+ host: string;
23
+ ipv6Only: boolean;
24
+ };
25
+ export declare function registerLanHttpHandler(next: LanHttpHandlers | null): void;
26
+ export declare function readLanHttpState(): LanHttpBindResult;
27
+ export declare function applyLanHttp(options: LanHttpBindOptions): Promise<LanHttpBindResult>;
28
+ /** After the hub registers the Fastify request handler, bind whatever was pending. */
29
+ export declare function bindPendingLanHttp(): Promise<LanHttpBindResult>;
30
+ export declare function closeLanHttp(): Promise<void>;
package/dist/index.d.ts CHANGED
@@ -80,6 +80,7 @@ export { StorageLocationManager } from './storage/storage-location-manager.js';
80
80
  export type { IFileStorage, IStorageLocation, IStorageProvider as ICoreStorageProvider, IStructuredStorage, QueryFilter, StorageRecord, } from './storage/storage-manager.js';
81
81
  export { StorageManager } from './storage/storage-manager.js';
82
82
  export * from './tls/index.js';
83
+ export { applyLanHttp, allFamiliesListenHost, bindPendingLanHttp, closeLanHttp, DEFAULT_LAN_HTTP_PORT, readLanHttpState, registerLanHttpHandler, } from './http/lan-http-bind.js';
83
84
  export { IntegrationRegistry } from './builtins/sqlite-storage/integration-registry.js';
84
85
  export { type EnsureAddonNativePrebuildsOptions, ensureAddonNativePrebuilds, type NativeEnsureOutcome, type NativeEnsureResult, } from './kernel/deps/ensure-addon-natives.js';
85
86
  export { type EnsureNativePrebuildsOptions, ensureNativePrebuilds, hasDotNode, NATIVE_SCAN_DEPTH, type PrebuildFetchFn, type PrebuildTarget, TRADITIONAL_NATIVE_PACKAGES, } from './kernel/deps/ensure-native-prebuilds.js';