@camstack/system 1.2.431 → 1.2.433

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 (97) hide show
  1. package/dist/{tls-C5IYg3V5.js → agent-https-CHZTxK-q.js} +123 -759
  2. package/dist/{tls-CpcGkeJV.mjs → agent-https-DtRU9A7I.mjs} +89 -611
  3. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  4. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  5. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  6. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  7. package/dist/builtins/alerts/alerts.addon.js +1 -1
  8. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  9. package/dist/builtins/autotrack/index.js +1 -1
  10. package/dist/builtins/autotrack/index.mjs +1 -1
  11. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +2 -2
  12. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +2 -2
  13. package/dist/builtins/calendars/calendars.addon.js +1 -1
  14. package/dist/builtins/calendars/calendars.addon.mjs +1 -1
  15. package/dist/builtins/camera-grid/index.js +1 -1
  16. package/dist/builtins/camera-grid/index.mjs +1 -1
  17. package/dist/builtins/composer/composer.addon.js +2 -2
  18. package/dist/builtins/composer/composer.addon.mjs +2 -2
  19. package/dist/builtins/console-logging/index.js +1 -1
  20. package/dist/builtins/console-logging/index.mjs +1 -1
  21. package/dist/builtins/core-blocks/core-blocks.addon.js +2 -2
  22. package/dist/builtins/core-blocks/core-blocks.addon.mjs +2 -2
  23. package/dist/builtins/device-manager/device-manager.addon.js +2 -2
  24. package/dist/builtins/device-manager/device-manager.addon.mjs +2 -2
  25. package/dist/builtins/hub-forwarder/index.js +1 -1
  26. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  27. package/dist/builtins/keychain/index.js +3 -3
  28. package/dist/builtins/keychain/index.mjs +3 -3
  29. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  30. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  31. package/dist/builtins/local-auth/local-auth.addon.js +2 -2
  32. package/dist/builtins/local-auth/local-auth.addon.mjs +2 -2
  33. package/dist/builtins/local-network/agent-mdns.d.ts +51 -0
  34. package/dist/builtins/local-network/local-network.addon.js +20 -45
  35. package/dist/builtins/local-network/local-network.addon.mjs +2 -28
  36. package/dist/builtins/loki-logging/index.js +1 -1
  37. package/dist/builtins/loki-logging/index.mjs +1 -1
  38. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  39. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  40. package/dist/builtins/platform-probe/index.js +1 -1
  41. package/dist/builtins/platform-probe/index.mjs +1 -1
  42. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  43. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  44. package/dist/builtins/snapshot/index.js +1 -1
  45. package/dist/builtins/snapshot/index.mjs +1 -1
  46. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  47. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  48. package/dist/builtins/sqlite-storage/index.js +1 -1
  49. package/dist/builtins/sqlite-storage/index.mjs +1 -1
  50. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +3 -3
  51. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +3 -3
  52. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  53. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  54. package/dist/builtins/system-config/system-config.addon.js +1370 -28
  55. package/dist/builtins/system-config/system-config.addon.mjs +1344 -25
  56. package/dist/builtins/winston-logging/index.js +1 -1
  57. package/dist/builtins/winston-logging/index.mjs +1 -1
  58. package/dist/{composition-sources-Cw_TXEq9.mjs → composition-sources-8-cpAt1c.mjs} +1 -1
  59. package/dist/{composition-sources-o5MPSlk6.js → composition-sources-BgJWQMjr.js} +1 -1
  60. package/dist/{constants-BcNaVkvI.js → constants-Ah3T_KAW.js} +2 -2
  61. package/dist/{constants-CttE77VF.mjs → constants-Cg9ve13y.mjs} +2 -2
  62. package/dist/{device-ca-B-BTxeCj.mjs → device-ca-DUrcTW5h.mjs} +1 -1
  63. package/dist/{device-ca-CKiqh2Iu.js → device-ca-NNP4Jz0P.js} +1 -1
  64. package/dist/{dist-DxJdci75.js → dist-C6Yvfhpq.js} +360 -1
  65. package/dist/{dist-CXG6muCR.mjs → dist-DJnlnL7P.mjs} +349 -2
  66. package/dist/file-host-worker.js +1 -1
  67. package/dist/file-host-worker.mjs +1 -1
  68. package/dist/hub-mdns-ciao-8_Ed1Za5.mjs +648 -0
  69. package/dist/hub-mdns-ciao-B50jAU5C.js +821 -0
  70. package/dist/index.d.ts +3 -0
  71. package/dist/index.js +176 -67
  72. package/dist/index.mjs +96 -13
  73. package/dist/kernel/index.d.ts +5 -4
  74. package/dist/kernel/moleculer/agent-mesh-authenticator.d.ts +12 -1
  75. package/dist/kernel/moleculer/agent-ui-unlock.d.ts +40 -0
  76. package/dist/kernel/moleculer/mesh-authenticator.d.ts +6 -0
  77. package/dist/kernel/moleculer/mesh-mtls/constants.d.ts +1 -1
  78. package/dist/kernel/moleculer/mesh-mtls/index.d.ts +3 -2
  79. package/dist/kernel/moleculer/mesh-mtls/mesh-ca.d.ts +4 -0
  80. package/dist/kernel/moleculer/mesh-mtls/mesh-certificate-registry.d.ts +2 -2
  81. package/dist/kernel/moleculer/mesh-mtls/mesh-join-token.d.ts +3 -2
  82. package/dist/kernel/moleculer/mesh-mtls/mesh-peer-transport.d.ts +7 -0
  83. package/dist/kernel/moleculer/mesh-mtls/pairing/agent-pairing.d.ts +204 -0
  84. package/dist/kernel/moleculer/mesh-mtls/pairing/hub-pairing.d.ts +115 -0
  85. package/dist/kernel/moleculer/mesh-mtls/pairing/index.d.ts +3 -0
  86. package/dist/kernel/moleculer/mesh-mtls/pairing/pairing-protocol.d.ts +107 -0
  87. package/dist/kernel/moleculer/mesh-mtls/tls-tcp-transporter.d.ts +18 -0
  88. package/dist/{restore-archive-D_wBL1OO.mjs → restore-archive-C3_rzOCx.mjs} +1 -1
  89. package/dist/{restore-archive-CQJNoqRK.js → restore-archive-DqPaRjjY.js} +1 -1
  90. package/dist/{retired-settings-keys-EmDe11cP.mjs → retired-settings-keys-CAWHWDwy.mjs} +1 -1
  91. package/dist/{retired-settings-keys-g1oifXxR.js → retired-settings-keys-DJBQkZok.js} +1 -1
  92. package/dist/tls/agent-https-names.d.ts +2 -0
  93. package/dist/{wal-maintenance-vhPZLYuA.mjs → wal-maintenance-Bc38yI3r.mjs} +0 -0
  94. package/dist/{wal-maintenance-BW1LIHi0.js → wal-maintenance-CPLvZbzA.js} +0 -0
  95. package/package.json +1 -1
  96. package/dist/agent-https-names-CpUSuP4w.js +0 -120
  97. package/dist/agent-https-names-uetr4OQl.mjs +0 -91
@@ -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-DxJdci75.js");
6
+ const require_dist = require("../../dist-C6Yvfhpq.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 { _r as BaseAddon, an as logDestinationCapability } from "../../dist-CXG6muCR.mjs";
1
+ import { sn as logDestinationCapability, yr as BaseAddon } from "../../dist-DJnlnL7P.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";
@@ -1,4 +1,4 @@
1
- import { gr as errMsg, lr as compositionSourceKey } from "./dist-CXG6muCR.mjs";
1
+ import { dr as compositionSourceKey, vr as errMsg } from "./dist-DJnlnL7P.mjs";
2
2
  //#region src/builtins/core-blocks/composition-sources.ts
3
3
  /**
4
4
  * Describe what a composition reads and writes for SAVE-time validation
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-DxJdci75.js");
1
+ const require_dist = require("./dist-C6Yvfhpq.js");
2
2
  //#region src/builtins/core-blocks/composition-sources.ts
3
3
  /**
4
4
  * Describe what a composition reads and writes for SAVE-time validation
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-DxJdci75.js");
1
+ const require_dist = require("./dist-C6Yvfhpq.js");
2
2
  let node_crypto = require("node:crypto");
3
3
  //#region src/kernel/moleculer/cluster-secret.ts
4
4
  /**
@@ -87,7 +87,7 @@ var MESH_CA_KEY_REF = require_dist.buildSecretRef({
87
87
  });
88
88
  /** `system-settings` key holding the public CA certificate PEM. */
89
89
  var MESH_CA_SETTINGS_KEY = "cluster.meshCa";
90
- /** Field inside the `cluster` section (same row as the secret). */
90
+ /** Field inside the `cluster` section. */
91
91
  var MESH_CA_FIELD = "meshCa";
92
92
  /** Join-token / leaf lifetimes. */
93
93
  var MESH_JOIN_TOKEN_MAX_TTL_SEC = 3600;
@@ -1,4 +1,4 @@
1
- import { Ar as buildSecretRef } from "./dist-CXG6muCR.mjs";
1
+ import { Mr as buildSecretRef } from "./dist-DJnlnL7P.mjs";
2
2
  import { createHash, timingSafeEqual } from "node:crypto";
3
3
  //#region src/kernel/moleculer/cluster-secret.ts
4
4
  /**
@@ -87,7 +87,7 @@ var MESH_CA_KEY_REF = buildSecretRef({
87
87
  });
88
88
  /** `system-settings` key holding the public CA certificate PEM. */
89
89
  var MESH_CA_SETTINGS_KEY = "cluster.meshCa";
90
- /** Field inside the `cluster` section (same row as the secret). */
90
+ /** Field inside the `cluster` section. */
91
91
  var MESH_CA_FIELD = "meshCa";
92
92
  /** Join-token / leaf lifetimes. */
93
93
  var MESH_JOIN_TOKEN_MAX_TTL_SEC = 3600;
@@ -1,4 +1,4 @@
1
- import { Ar as buildSecretRef, C as DEVICE_SAN_CREDENTIAL_PREFIX, w as DEVICE_SAN_USER_PREFIX } from "./dist-CXG6muCR.mjs";
1
+ import { E as DEVICE_SAN_USER_PREFIX, Mr as buildSecretRef, T as DEVICE_SAN_CREDENTIAL_PREFIX } from "./dist-DJnlnL7P.mjs";
2
2
  import { a as KeyUsagesExtension, d as X509Certificate$1, f as X509CertificateGenerator, i as KeyUsageFlags, l as SubjectAlternativeNameExtension, n as BasicConstraintsExtension, o as PemConverter, p as cryptoProvider, r as ExtendedKeyUsageExtension, t as AuthorityKeyIdentifierExtension, u as SubjectKeyIdentifierExtension } from "./x509.es-CAjSsrkk.mjs";
3
3
  import { X509Certificate, createPublicKey, randomBytes, verify, webcrypto } from "node:crypto";
4
4
  //#region src/auth/jwt-signing-key.ts
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-DxJdci75.js");
1
+ const require_dist = require("./dist-C6Yvfhpq.js");
2
2
  const require_x509_es = require("./x509.es-Dzl0BbmG.js");
3
3
  let node_crypto = require("node:crypto");
4
4
  //#region src/auth/jwt-signing-key.ts
@@ -718,7 +718,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
718
718
  return EventCategory;
719
719
  }({});
720
720
  //#endregion
721
- //#region ../types/dist/sleep-DxJdzHni.mjs
721
+ //#region ../types/dist/sleep--g-h2_c_.mjs
722
722
  /**
723
723
  * The audio chunk plane's byte format, and the ONE expansion from a coded
724
724
  * window to float samples (D455).
@@ -16213,6 +16213,241 @@ var keychainCapability = {
16213
16213
  getState: method(zod.z.object({}), KeychainStateSchema, { auth: "admin" })
16214
16214
  }
16215
16215
  };
16216
+ /**
16217
+ * device-history — the ONE mechanism for numeric history (D850).
16218
+ *
16219
+ * A device value is recorded because its capability says so (the `history`
16220
+ * block of a `*.cap.ts`, captured hub-side from `DeviceStateChanged`); any
16221
+ * other series is DECLARED by the addon that produces it and fed with points
16222
+ * (`record`) or closed five-minute buckets (`recordBuckets`). Rollups 5m / 1h /
16223
+ * 1d are computed here and nowhere else. Storage is `history.db` (D851).
16224
+ *
16225
+ * Who the PRODUCER is: `declareSeries`, `record` and `recordBuckets` are owner
16226
+ * checked against the `callerAddonId` the transport stamps into a call that
16227
+ * crossed a process (never in an input schema, so a session cannot supply it).
16228
+ * A call with no stamp is refused `not-owner`. The methods are `admin` so a
16229
+ * non-admin session never reaches them; an addon's `ctx.api` call bypasses the
16230
+ * tier by design.
16231
+ */
16232
+ /** Whose history: a real device, or a cluster node (load, memory). */
16233
+ var DeviceHistorySubjectSchema = zod.z.discriminatedUnion("kind", [zod.z.object({
16234
+ kind: zod.z.literal("device"),
16235
+ deviceId: zod.z.number().int()
16236
+ }), zod.z.object({
16237
+ kind: zod.z.literal("node"),
16238
+ nodeId: zod.z.string().min(1)
16239
+ })]);
16240
+ var DeviceHistoryKindSchema = zod.z.enum([
16241
+ "gauge",
16242
+ "counter",
16243
+ "boolean"
16244
+ ]);
16245
+ var DeviceHistoryResolutionSchema = zod.z.enum([
16246
+ "raw",
16247
+ "5m",
16248
+ "1h",
16249
+ "1d"
16250
+ ]);
16251
+ /** Why a producer's point or bucket was not stored. Counted, never silent (D391). */
16252
+ var DeviceHistoryRefusalReasonSchema = zod.z.enum([
16253
+ "undeclared",
16254
+ "not-owner",
16255
+ "opted-out",
16256
+ "not-a-real-device",
16257
+ "rate",
16258
+ "ingest-mismatch",
16259
+ "out-of-range"
16260
+ ]);
16261
+ var RefusalSchema = zod.z.object({
16262
+ key: zod.z.string(),
16263
+ reason: DeviceHistoryRefusalReasonSchema,
16264
+ count: zod.z.number().int()
16265
+ });
16266
+ var IngestResultSchema = zod.z.object({
16267
+ accepted: zod.z.number().int(),
16268
+ refused: zod.z.array(RefusalSchema).readonly()
16269
+ });
16270
+ var SeriesInfoSchema = zod.z.object({
16271
+ key: zod.z.string(),
16272
+ scope: zod.z.string(),
16273
+ kind: DeviceHistoryKindSchema,
16274
+ /** `null` is unknown (a `unitFrom` series whose device does not state a unit right now), never a guess. */
16275
+ unit: zod.z.string().nullable(),
16276
+ displayName: zod.z.string(),
16277
+ source: zod.z.enum(["cap", "addon"]),
16278
+ firstTs: zod.z.number(),
16279
+ lastTs: zod.z.number()
16280
+ });
16281
+ var QueryPointSchema = zod.z.object({
16282
+ /** Raw: the point's time. Rollup: the bucket start. */
16283
+ t: zod.z.number(),
16284
+ samples: zod.z.number().int(),
16285
+ /** `sum / samples`. */
16286
+ mean: zod.z.number().nullable(),
16287
+ /** Time-weighted mean (`tw_sum / tw_ms`); `null` for bucket-ingested series. For a boolean: the fraction of time true. */
16288
+ twMean: zod.z.number().nullable(),
16289
+ min: zod.z.number(),
16290
+ max: zod.z.number(),
16291
+ /** `null` is unknown, never zero (D393). */
16292
+ last: zod.z.number().nullable()
16293
+ });
16294
+ var QuerySeriesSchema = zod.z.object({
16295
+ scope: zod.z.string(),
16296
+ /** The last point STRICTLY BEFORE `from` in the chosen tier, so a step chart can start at the held value. */
16297
+ before: zod.z.object({
16298
+ t: zod.z.number(),
16299
+ value: zod.z.number().nullable()
16300
+ }).nullable(),
16301
+ points: zod.z.array(QueryPointSchema).readonly()
16302
+ });
16303
+ /** The window part of a query, shared by the device and node forms. */
16304
+ var QueryWindowShape = {
16305
+ key: zod.z.string(),
16306
+ scope: zod.z.string().optional(),
16307
+ from: zod.z.number(),
16308
+ to: zod.z.number(),
16309
+ resolution: zod.z.union([DeviceHistoryResolutionSchema, zod.z.literal("auto")]).default("auto"),
16310
+ maxPoints: zod.z.number().int().positive().max(5e3).default(1e3)
16311
+ };
16312
+ var QueryResultSchema = zod.z.object({
16313
+ resolution: DeviceHistoryResolutionSchema,
16314
+ series: zod.z.array(QuerySeriesSchema).readonly(),
16315
+ truncated: zod.z.boolean()
16316
+ });
16317
+ var TierStatusSchema = zod.z.object({
16318
+ tier: DeviceHistoryResolutionSchema,
16319
+ /** `null` until the first background count answered. */
16320
+ rows: zod.z.number().int().nullable(),
16321
+ /** `rows` times a fixed per-row estimate — approximate, labelled so. */
16322
+ approxBytes: zod.z.number().nullable(),
16323
+ countedAt: zod.z.number().nullable()
16324
+ });
16325
+ /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
16326
+ var DeviceHistoryStatusSchema = zod.z.object({
16327
+ startedAt: zod.z.number(),
16328
+ /** The store is declared, series loaded and the first reconcile has answered. */
16329
+ ready: zod.z.boolean(),
16330
+ series: zod.z.number().int(),
16331
+ metrics: zod.z.number().int(),
16332
+ optedOutDevices: zod.z.number().int(),
16333
+ tiers: zod.z.array(TierStatusSchema).readonly(),
16334
+ capture: zod.z.object({
16335
+ eventsSeen: zod.z.number().int(),
16336
+ pointsEmitted: zod.z.number().int(),
16337
+ pointsWritten: zod.z.number().int(),
16338
+ pointsDropped: zod.z.number().int(),
16339
+ bufferDepth: zod.z.number().int(),
16340
+ trailingEmitted: zod.z.number().int(),
16341
+ reconciledPoints: zod.z.number().int(),
16342
+ reconcileRuns: zod.z.number().int(),
16343
+ reconcileFailures: zod.z.number().int(),
16344
+ lastReconcileAt: zod.z.number().nullable(),
16345
+ lastFlushAt: zod.z.number().nullable(),
16346
+ flushFailures: zod.z.number().int(),
16347
+ skipped: zod.z.record(zod.z.string(), zod.z.number().int())
16348
+ }),
16349
+ ingest: zod.z.object({
16350
+ accepted: zod.z.number().int(),
16351
+ refused: zod.z.record(zod.z.string(), zod.z.number().int())
16352
+ }),
16353
+ rollup: zod.z.object({
16354
+ last5mAt: zod.z.number().nullable(),
16355
+ last1hAt: zod.z.number().nullable(),
16356
+ last1dAt: zod.z.number().nullable(),
16357
+ errors: zod.z.number().int(),
16358
+ dirty5m: zod.z.number().int(),
16359
+ dirty1h: zod.z.number().int(),
16360
+ dirty1d: zod.z.number().int()
16361
+ }),
16362
+ retention: zod.z.object({
16363
+ lastRunAt: zod.z.number().nullable(),
16364
+ deleted: zod.z.record(zod.z.string(), zod.z.number().int()),
16365
+ purgedSeries: zod.z.number().int()
16366
+ }),
16367
+ directory: zod.z.object({
16368
+ devices: zod.z.number().int(),
16369
+ lastRefreshAt: zod.z.number().nullable()
16370
+ })
16371
+ });
16372
+ var deviceHistoryCapability = {
16373
+ name: "device-history",
16374
+ scope: "system",
16375
+ mode: "singleton",
16376
+ methods: {
16377
+ /**
16378
+ * The series a DEVICE has, and their span. `deviceId` is a flat top-level field
16379
+ * on purpose: the generated device selector (and so the scope gate) only sees
16380
+ * top-level ids, and a nested `subject.deviceId` would let a principal limited
16381
+ * to one device read another's history. Node series are the admin-only
16382
+ * `listNodeSeries` / `queryNode`.
16383
+ */
16384
+ listSeries: method(zod.z.object({ deviceId: zod.z.number().int() }), zod.z.array(SeriesInfoSchema).readonly()),
16385
+ listNodeSeries: method(zod.z.object({ nodeId: zod.z.string().min(1) }), zod.z.array(SeriesInfoSchema).readonly(), { auth: "admin" }),
16386
+ /**
16387
+ * One series (or every scope of it) at one resolution. `auto` picks the
16388
+ * finest tier whose retention covers `from` and whose point count fits
16389
+ * `maxPoints`; when even the coarsest tier does not fit, the newest
16390
+ * `maxPoints` points are returned and `truncated` is true.
16391
+ */
16392
+ query: method(zod.z.object({
16393
+ deviceId: zod.z.number().int(),
16394
+ ...QueryWindowShape
16395
+ }), QueryResultSchema),
16396
+ queryNode: method(zod.z.object({
16397
+ nodeId: zod.z.string().min(1),
16398
+ ...QueryWindowShape
16399
+ }), QueryResultSchema, { auth: "admin" }),
16400
+ /** Producer: declare (idempotent) a series key this addon owns: `addon:<callerAddonId>/<name>`. */
16401
+ declareSeries: method(zod.z.object({
16402
+ name: zod.z.string().regex(/^[a-z0-9-]+$/),
16403
+ subjectKind: zod.z.enum(["device", "node"]),
16404
+ kind: DeviceHistoryKindSchema,
16405
+ unit: zod.z.string().optional(),
16406
+ displayName: zod.z.string().min(1),
16407
+ ingest: zod.z.enum(["points", "buckets"])
16408
+ }), zod.z.object({ key: zod.z.string() }), {
16409
+ kind: "mutation",
16410
+ auth: "admin"
16411
+ }),
16412
+ /** Producer: points. Low rate: at most one per 10 s per series, sustained. */
16413
+ record: method(zod.z.object({ points: zod.z.array(zod.z.object({
16414
+ key: zod.z.string(),
16415
+ subject: DeviceHistorySubjectSchema,
16416
+ scope: zod.z.string().default(""),
16417
+ ts: zod.z.number(),
16418
+ value: zod.z.number()
16419
+ })).max(5e3) }), IngestResultSchema, {
16420
+ kind: "mutation",
16421
+ auth: "admin"
16422
+ }),
16423
+ /** Producer: CLOSED five-minute buckets. Idempotent upsert keyed (series, bucketStart). */
16424
+ recordBuckets: method(zod.z.object({ buckets: zod.z.array(zod.z.object({
16425
+ key: zod.z.string(),
16426
+ subject: DeviceHistorySubjectSchema,
16427
+ scope: zod.z.string().default(""),
16428
+ bucketStart: zod.z.number(),
16429
+ samples: zod.z.number().int().positive(),
16430
+ sum: zod.z.number(),
16431
+ min: zod.z.number(),
16432
+ max: zod.z.number(),
16433
+ last: zod.z.number().nullable(),
16434
+ lastTs: zod.z.number().nullable()
16435
+ })).max(5e3) }), IngestResultSchema, {
16436
+ kind: "mutation",
16437
+ auth: "admin"
16438
+ }),
16439
+ /** Per-device opt-out. This addon IS the authority: the switch stores nothing elsewhere (D62). */
16440
+ getDeviceEnabled: method(zod.z.object({ deviceId: zod.z.number().int() }), zod.z.object({ enabled: zod.z.boolean() })),
16441
+ setDeviceEnabled: method(zod.z.object({
16442
+ deviceId: zod.z.number().int(),
16443
+ enabled: zod.z.boolean()
16444
+ }), zod.z.object({ enabled: zod.z.boolean() }), {
16445
+ kind: "mutation",
16446
+ auth: "admin"
16447
+ }),
16448
+ getStatus: method(zod.z.object({}), DeviceHistoryStatusSchema, { auth: "admin" })
16449
+ }
16450
+ };
16216
16451
  var DeviceCaStatusSchema = zod.z.discriminatedUnion("state", [
16217
16452
  zod.z.object({ state: zod.z.literal("absent") }),
16218
16453
  zod.z.object({
@@ -16410,6 +16645,16 @@ var nodeCertificatesCapability = {
16410
16645
  kind: "mutation",
16411
16646
  auth: "admin"
16412
16647
  }),
16648
+ /**
16649
+ * The hub unpairs this node (D857): it erases its mesh material, goes back to the
16650
+ * unpaired state and advertises itself again. The call is answered first; the wire
16651
+ * goes down right after, so the hub revokes the node's certificates BEFORE this
16652
+ * connection drops, never after.
16653
+ */
16654
+ forgetHub: method(zod.z.object({}), zod.z.object({ ok: zod.z.literal(true) }), {
16655
+ kind: "mutation",
16656
+ auth: "admin"
16657
+ }),
16413
16658
  /** Install the hub-signed HTTPS leaf and hot-swap the serving context (no restart). */
16414
16659
  installHttpsCertificate: method(zod.z.object({
16415
16660
  certPem: zod.z.string().min(1),
@@ -39937,6 +40182,21 @@ var HUB_MDNS_TXT_KEYS = {
39937
40182
  url: "url"
39938
40183
  };
39939
40184
  /**
40185
+ * How a hub finds agents to pair (D857): every agent publishes ONE mDNS service for its API
40186
+ * port, paired or not. The TXT record carries only public facts. Finding an agent grants
40187
+ * nothing: pairing still needs the six-digit code confirmed on both screens.
40188
+ */
40189
+ var AGENT_MDNS_SERVICE_TYPE = "camstack-agent";
40190
+ /** The TXT keys of the agent advertisement. Every value is public. */
40191
+ var AGENT_MDNS_TXT_KEYS = {
40192
+ nodeId: "nodeId",
40193
+ version: "version",
40194
+ /** `unpaired` | `pending` | `paired`. */
40195
+ state: "state",
40196
+ /** First 16 hex chars of the SHA-256 of the agent's mesh leaf; present once paired. */
40197
+ keyFingerprint: "fp"
40198
+ };
40199
+ /**
39940
40200
  * Transport bounds for AI capability methods.
39941
40201
  *
39942
40202
  * Its own module because `llm.cap.ts` and `llm-runtime.cap.ts` already import
@@ -74293,6 +74553,66 @@ var METHOD_ACCESS_MAP = Object.freeze({
74293
74553
  addonId: null,
74294
74554
  access: "create"
74295
74555
  },
74556
+ "deviceHistory.declareSeries": {
74557
+ capName: "device-history",
74558
+ capScope: "system",
74559
+ addonId: null,
74560
+ access: "create"
74561
+ },
74562
+ "deviceHistory.getDeviceEnabled": {
74563
+ capName: "device-history",
74564
+ capScope: "system",
74565
+ addonId: null,
74566
+ access: "view"
74567
+ },
74568
+ "deviceHistory.getStatus": {
74569
+ capName: "device-history",
74570
+ capScope: "system",
74571
+ addonId: null,
74572
+ access: "view"
74573
+ },
74574
+ "deviceHistory.listNodeSeries": {
74575
+ capName: "device-history",
74576
+ capScope: "system",
74577
+ addonId: null,
74578
+ access: "view"
74579
+ },
74580
+ "deviceHistory.listSeries": {
74581
+ capName: "device-history",
74582
+ capScope: "system",
74583
+ addonId: null,
74584
+ access: "view"
74585
+ },
74586
+ "deviceHistory.query": {
74587
+ capName: "device-history",
74588
+ capScope: "system",
74589
+ addonId: null,
74590
+ access: "view"
74591
+ },
74592
+ "deviceHistory.queryNode": {
74593
+ capName: "device-history",
74594
+ capScope: "system",
74595
+ addonId: null,
74596
+ access: "view"
74597
+ },
74598
+ "deviceHistory.record": {
74599
+ capName: "device-history",
74600
+ capScope: "system",
74601
+ addonId: null,
74602
+ access: "create"
74603
+ },
74604
+ "deviceHistory.recordBuckets": {
74605
+ capName: "device-history",
74606
+ capScope: "system",
74607
+ addonId: null,
74608
+ access: "create"
74609
+ },
74610
+ "deviceHistory.setDeviceEnabled": {
74611
+ capName: "device-history",
74612
+ capScope: "system",
74613
+ addonId: null,
74614
+ access: "create"
74615
+ },
74296
74616
  "deviceManager.addLocation": {
74297
74617
  capName: "device-manager",
74298
74618
  capScope: "system",
@@ -76357,6 +76677,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
76357
76677
  addonId: null,
76358
76678
  access: "create"
76359
76679
  },
76680
+ "nodeCertificates.forgetHub": {
76681
+ capName: "node-certificates",
76682
+ capScope: "system",
76683
+ addonId: null,
76684
+ access: "delete"
76685
+ },
76360
76686
  "nodeCertificates.getCertificates": {
76361
76687
  capName: "node-certificates",
76362
76688
  capScope: "system",
@@ -80763,6 +81089,7 @@ var ALL_CAPABILITY_DEFINITIONS = [
80763
81089
  deviceDiscoveryCapability,
80764
81090
  deviceExportCapability,
80765
81091
  deviceExtensionCapability,
81092
+ deviceHistoryCapability,
80766
81093
  deviceManagerCapability,
80767
81094
  deviceOpsCapability,
80768
81095
  deviceProviderCapability,
@@ -81346,6 +81673,26 @@ Object.freeze({
81346
81673
  form: "single",
81347
81674
  optional: false
81348
81675
  }],
81676
+ "deviceHistory.getDeviceEnabled": [{
81677
+ name: "deviceId",
81678
+ form: "single",
81679
+ optional: false
81680
+ }],
81681
+ "deviceHistory.listSeries": [{
81682
+ name: "deviceId",
81683
+ form: "single",
81684
+ optional: false
81685
+ }],
81686
+ "deviceHistory.query": [{
81687
+ name: "deviceId",
81688
+ form: "single",
81689
+ optional: false
81690
+ }],
81691
+ "deviceHistory.setDeviceEnabled": [{
81692
+ name: "deviceId",
81693
+ form: "single",
81694
+ optional: false
81695
+ }],
81349
81696
  "deviceManager.adoptionRelease": [{
81350
81697
  name: "camDeviceId",
81351
81698
  form: "single",
@@ -85167,6 +85514,18 @@ function enumerateInferenceDevices(hw) {
85167
85514
  return out;
85168
85515
  }
85169
85516
  //#endregion
85517
+ Object.defineProperty(exports, "AGENT_MDNS_SERVICE_TYPE", {
85518
+ enumerable: true,
85519
+ get: function() {
85520
+ return AGENT_MDNS_SERVICE_TYPE;
85521
+ }
85522
+ });
85523
+ Object.defineProperty(exports, "AGENT_MDNS_TXT_KEYS", {
85524
+ enumerable: true,
85525
+ get: function() {
85526
+ return AGENT_MDNS_TXT_KEYS;
85527
+ }
85528
+ });
85170
85529
  Object.defineProperty(exports, "ALL_CAPABILITY_DEFINITIONS", {
85171
85530
  enumerable: true,
85172
85531
  get: function() {