@camstack/addon-post-analysis 1.2.369 → 1.2.370

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 (15) hide show
  1. package/dist/{clip-model-registry-E4CGZ8NR.js → clip-model-registry-C3AUTkBR.js} +1618 -45
  2. package/dist/{clip-model-registry-C_-tWzrX.mjs → clip-model-registry-CCwyUQ7k.mjs} +1595 -46
  3. package/dist/embedding-encoder/index.js +1 -1
  4. package/dist/embedding-encoder/index.mjs +1 -1
  5. package/dist/pipeline-analytics/_stub.js +752 -631
  6. package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-Bac17NNv.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-C1gR-74b.mjs} +3 -3
  7. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BRMRfKVO.mjs +26 -0
  8. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CkaRW2Sy.mjs +26 -0
  9. package/dist/pipeline-analytics/{hostInit-CMFNXHOl.mjs → hostInit-s-NoTpFK.mjs} +3 -3
  10. package/dist/pipeline-analytics/index.js +982 -82
  11. package/dist/pipeline-analytics/index.mjs +1013 -113
  12. package/dist/pipeline-analytics/remoteEntry.js +1 -1
  13. package/package.json +5 -1
  14. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DOGD-EFh.mjs +0 -26
  15. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-Bb1tsxlC.mjs +0 -26
@@ -5459,7 +5459,7 @@ var ZodIssueCode = {
5459
5459
  var ZodFirstPartyTypeKind;
5460
5460
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5461
5461
  //#endregion
5462
- //#region ../types/dist/sleep-BBF1iXUi.mjs
5462
+ //#region ../types/dist/sleep-DRqxtc0C.mjs
5463
5463
  /**
5464
5464
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5465
5465
  * window to float samples (D455).
@@ -8486,6 +8486,10 @@ var DEVICE_SCOPED_CAPS = new Set([
8486
8486
  function isDeviceScopedCap(capName) {
8487
8487
  return DEVICE_SCOPED_CAPS.has(capName);
8488
8488
  }
8489
+ object({
8490
+ code: string().regex(/^[a-z][a-z0-9-]*(\.[a-z0-9-]+)+$/),
8491
+ params: record(string(), union([string(), number()])).optional()
8492
+ });
8489
8493
  function hfModelUrl(repo, path) {
8490
8494
  return `https://huggingface.co/${repo}/resolve/main/${path}`;
8491
8495
  }
@@ -8514,7 +8518,7 @@ function sleep(ms) {
8514
8518
  return new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));
8515
8519
  }
8516
8520
  //#endregion
8517
- //#region ../types/dist/err-msg-DX6i_MY4.mjs
8521
+ //#region ../types/dist/err-msg-DLerKiVO.mjs
8518
8522
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
8519
8523
  DeviceType["Camera"] = "camera";
8520
8524
  DeviceType["Hub"] = "hub";
@@ -8764,6 +8768,22 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
8764
8768
  DeviceRole["Nightvision"] = "nightvision";
8765
8769
  DeviceRole["PrivacyMask"] = "privacy-mask";
8766
8770
  DeviceRole["Doorbell"] = "doorbell";
8771
+ /** Interior blind / shade / roller blind. HA `device_class: blind|shade`. */
8772
+ DeviceRole["CoverBlind"] = "cover-blind";
8773
+ /** Exterior roller shutter. HA `device_class: shutter`; Homematic BROLL. */
8774
+ DeviceRole["CoverShutter"] = "cover-shutter";
8775
+ /** Exterior awning. HA `device_class: awning`. */
8776
+ DeviceRole["CoverAwning"] = "cover-awning";
8777
+ /** Curtain / drape. HA `device_class: curtain`. */
8778
+ DeviceRole["CoverCurtain"] = "cover-curtain";
8779
+ /** Garage door. HA `device_class: garage`. A security actuator: exports gate it. */
8780
+ DeviceRole["CoverGarage"] = "cover-garage";
8781
+ /** Gate. HA `device_class: gate`. A security actuator: exports gate it. */
8782
+ DeviceRole["CoverGate"] = "cover-gate";
8783
+ /** Door. HA `device_class: door`. A security actuator: exports gate it. */
8784
+ DeviceRole["CoverDoor"] = "cover-door";
8785
+ /** Window. HA `device_class: window`. */
8786
+ DeviceRole["CoverWindow"] = "cover-window";
8767
8787
  /** Virtual HA toggle (input_boolean.*) — distinguishable from a
8768
8788
  * real Switch device for UI rendering / export adapters. */
8769
8789
  DeviceRole["BinaryHelper"] = "binary-helper";
@@ -8844,7 +8864,7 @@ function errMsg(err) {
8844
8864
  return String(err);
8845
8865
  }
8846
8866
  //#endregion
8847
- //#region ../types/dist/composition-C-WpVYTX.mjs
8867
+ //#region ../types/dist/composition-EQ9Ok0Ee.mjs
8848
8868
  /**
8849
8869
  * Deterministic SHA-256 hash of an arbitrary serialisable value. The
8850
8870
  * canonical form sorts object keys alphabetically at every depth so two
@@ -13405,6 +13425,177 @@ var ConvertResultSchema = object({
13405
13425
  files: array(string()).readonly()
13406
13426
  })).readonly()
13407
13427
  });
13428
+ _enum(["new-session", "step-up"]);
13429
+ /** The languages the hub's app landing pages are written in (D858). */
13430
+ var AppPageLangSchema = _enum(["en", "it"]);
13431
+ /** How a native app starts one login method (D858), as `auth.listLoginMethods` reports it. */
13432
+ var AppLoginPathSchema = discriminatedUnion("kind", [object({ kind: literal("native") }), object({
13433
+ kind: literal("browser"),
13434
+ startPath: string().startsWith("/")
13435
+ })]);
13436
+ /**
13437
+ * Device certificates (D855) — the wire contract shared by the hub, the admin
13438
+ * UI and the native viewer.
13439
+ *
13440
+ * A device (a phone) generates its OWN P-256 key pair in hardware (Secure
13441
+ * Enclave / Android Keystore / a non-extractable WebCrypto key). The private
13442
+ * key never travels. The hub signs the PUBLIC key into an X.509 leaf under a
13443
+ * dedicated device CA; the device later proves possession of the key by
13444
+ * signing a hub-issued nonce, and the hub answers with the same session a
13445
+ * password login opens.
13446
+ *
13447
+ * Everything on the wire is a small string (a PEM, a base64url signature):
13448
+ * D613 is about bulk bytes, and a certificate is ~600 bytes.
13449
+ */
13450
+ /** Signature algorithm of every device credential: ECDSA, curve P-256, SHA-256. */
13451
+ var DEVICE_CERT_SIGNATURE = "ecdsa-p256-sha256";
13452
+ /** First line of every signed message; a change of format bumps the version. */
13453
+ var DEVICE_SIGNATURE_MESSAGE_VERSION = "camstack-device-cert-v1";
13454
+ _enum([
13455
+ "login",
13456
+ "renew",
13457
+ "revoke"
13458
+ ]);
13459
+ var DevicePlatformSchema = _enum([
13460
+ "ios",
13461
+ "android",
13462
+ "web",
13463
+ "other"
13464
+ ]);
13465
+ var Base64UrlSchema = string().min(1).max(4096).regex(/^[A-Za-z0-9_-]+$/);
13466
+ var PemSchema = string().min(1).max(16384);
13467
+ /**
13468
+ * Why a device-certificate endpoint said no. Distinct from a transport / 5xx
13469
+ * failure: those carry no reason and mean "try again", never "the credential is
13470
+ * dead". The viewer switches on this exhaustively.
13471
+ */
13472
+ var DeviceRefusalReasonSchema = _enum([
13473
+ "revoked",
13474
+ "unknown-credential",
13475
+ "expired",
13476
+ "bad-signature",
13477
+ "nonce-invalid",
13478
+ "rate-limited",
13479
+ "invalid-certificate",
13480
+ "superseded",
13481
+ "user-gone",
13482
+ "unavailable",
13483
+ "code-invalid",
13484
+ "self-enrollment-disabled",
13485
+ "step-up-required",
13486
+ "bad-public-key"
13487
+ ]);
13488
+ var DeviceRefusalSchema = object({
13489
+ ok: literal(false),
13490
+ reason: DeviceRefusalReasonSchema,
13491
+ definitive: boolean(),
13492
+ retryAfterSeconds: number().optional()
13493
+ });
13494
+ object({
13495
+ code: string().min(1).max(256),
13496
+ /** SubjectPublicKeyInfo DER of the device's P-256 public key, base64url. */
13497
+ publicKeySpki: Base64UrlSchema,
13498
+ deviceName: string().min(1).max(80).optional(),
13499
+ platform: DevicePlatformSchema
13500
+ });
13501
+ discriminatedUnion("ok", [object({
13502
+ credentialId: string(),
13503
+ certPem: PemSchema,
13504
+ /** The device CA certificate the leaf chains to. */
13505
+ chainPem: PemSchema,
13506
+ notAfter: number(),
13507
+ user: object({
13508
+ id: string(),
13509
+ username: string()
13510
+ })
13511
+ }).extend({ ok: literal(true) }), DeviceRefusalSchema]);
13512
+ object({
13513
+ /** The single-use step-up proof (`auth.deviceEnrollProofFrom…`). */
13514
+ proof: string().min(1).max(512),
13515
+ publicKeySpki: Base64UrlSchema,
13516
+ deviceName: string().min(1).max(80),
13517
+ platform: DevicePlatformSchema
13518
+ });
13519
+ object({
13520
+ proof: string(),
13521
+ expiresAt: number()
13522
+ });
13523
+ discriminatedUnion("ok", [object({
13524
+ nonce: string(),
13525
+ /** The origin to put in the signed message. The app compares it to the hub it dialled. */
13526
+ origin: string(),
13527
+ expiresAt: number(),
13528
+ signature: literal(DEVICE_CERT_SIGNATURE)
13529
+ }).extend({ ok: literal(true) }), DeviceRefusalSchema]);
13530
+ object({
13531
+ certPem: PemSchema,
13532
+ nonce: string().min(1).max(256),
13533
+ /** ECDSA P-256 SHA-256 over {@link buildDeviceSignatureMessage}; raw r||s or DER, base64url. */
13534
+ signature: Base64UrlSchema
13535
+ });
13536
+ discriminatedUnion("ok", [object({
13537
+ credentialId: string(),
13538
+ certPem: PemSchema,
13539
+ chainPem: PemSchema,
13540
+ notAfter: number()
13541
+ }).extend({ ok: literal(true) }), DeviceRefusalSchema]);
13542
+ discriminatedUnion("ok", [object({
13543
+ ok: literal(true),
13544
+ credentialId: string(),
13545
+ sessionsEnded: number().int()
13546
+ }), DeviceRefusalSchema]);
13547
+ var DeviceCredentialStatusSchema = _enum([
13548
+ "active",
13549
+ "expired",
13550
+ "revoked"
13551
+ ]);
13552
+ var DeviceCredentialSchema = object({
13553
+ id: string(),
13554
+ userId: string(),
13555
+ username: string().nullable(),
13556
+ deviceName: string(),
13557
+ platform: DevicePlatformSchema,
13558
+ enrolledVia: _enum(["qr", "self"]),
13559
+ /** SHA-256 of the leaf certificate DER, colon-hex. */
13560
+ fingerprint: string(),
13561
+ issuedAt: number(),
13562
+ expiresAt: number(),
13563
+ lastUsedAt: number().nullable(),
13564
+ lastUsedFrom: string().nullable(),
13565
+ revokedAt: number().nullable(),
13566
+ /** `admin:<userId>` | `user:<userId>` | `device` | `user-deleted`. */
13567
+ revokedBy: string().nullable(),
13568
+ status: DeviceCredentialStatusSchema
13569
+ });
13570
+ var StartEnrollmentOutputSchema = object({
13571
+ /** Shown once; only its hash is kept. */
13572
+ code: string(),
13573
+ expiresAt: number(),
13574
+ /** `camstack://enroll?hub=…&code=…` — what the QR encodes. */
13575
+ enrollUrl: string(),
13576
+ /** The hub origin in the link, or `null` when the hub could not name one (the link then has no `hub`). */
13577
+ hubOrigin: string().nullable(),
13578
+ /** Every origin the apps may try (role `appConnections`). */
13579
+ hubOrigins: array(string())
13580
+ });
13581
+ object({
13582
+ kind: literal("device-certificate"),
13583
+ id: literal("device-certificate"),
13584
+ label: string(),
13585
+ stage: literal("primary"),
13586
+ /** tRPC paths under the hub's `auth` router, so a client names no literal. */
13587
+ challengePath: literal("auth.getDeviceChallenge"),
13588
+ revokePath: literal("auth.revokeOwnDeviceCertificate"),
13589
+ enrollSelfPath: literal("auth.enrollSelf"),
13590
+ loginPath: literal("auth.loginWithDeviceCertificate"),
13591
+ renewPath: literal("auth.renewDeviceCertificate"),
13592
+ signature: literal(DEVICE_CERT_SIGNATURE),
13593
+ messageVersion: literal(DEVICE_SIGNATURE_MESSAGE_VERSION),
13594
+ /** Which clients can execute it: a native app silently, a browser with a non-extractable WebCrypto key. */
13595
+ clients: array(_enum(["native", "web"])),
13596
+ /** The app executes it itself, silently (D858). */
13597
+ app: AppLoginPathSchema.nullable()
13598
+ });
13408
13599
  var ExpressionBindingSourceSchema = union([
13409
13600
  object({
13410
13601
  kind: literal("field").optional(),
@@ -13733,7 +13924,9 @@ var ConfigTabDeclarationSchema = object({
13733
13924
  var ConfigSectionWithValuesSchema = object({
13734
13925
  id: string(),
13735
13926
  title: string(),
13927
+ titleKey: string().optional(),
13736
13928
  description: string().optional(),
13929
+ descriptionKey: string().optional(),
13737
13930
  style: _enum(["card", "accordion"]).optional(),
13738
13931
  defaultCollapsed: boolean().optional(),
13739
13932
  columns: union([
@@ -16248,7 +16441,11 @@ var cameraStreamsCapability = {
16248
16441
  * See `RuntimeStateDurability`. Enforced by
16249
16442
  * `scripts/check-runtime-state-durability.ts`.
16250
16443
  */
16251
- durability: "session"
16444
+ durability: "session",
16445
+ /**
16446
+ * History (D850): none — `online` duplicates device-status.online (one authority); slot data is nested enum/string.
16447
+ */
16448
+ history: "none"
16252
16449
  };
16253
16450
  /** kebab-case cap name → camelCase router-map key. */
16254
16451
  function kebabToCamel(s) {
@@ -17091,7 +17288,345 @@ method(object({
17091
17288
  }), method(object({ refs: RefListSchema }), KeychainResolveResultSchema, { auth: "admin" }), method(object({ refs: RefListSchema }), object({ deleted: number().int() }), {
17092
17289
  kind: "mutation",
17093
17290
  auth: "admin"
17291
+ }), method(object({ deviceId: number().int() }), object({ refs: array(string()).readonly() }), {
17292
+ kind: "mutation",
17293
+ auth: "admin"
17094
17294
  }), method(object({}), array(KeychainSecretMetaSchema).readonly(), { auth: "admin" }), method(object({}), KeychainStateSchema, { auth: "admin" });
17295
+ /**
17296
+ * device-history — the ONE mechanism for numeric history (D850).
17297
+ *
17298
+ * A device value is recorded because its capability says so (the `history`
17299
+ * block of a `*.cap.ts`, captured hub-side from `DeviceStateChanged`); any
17300
+ * other series is DECLARED by the addon that produces it and fed with points
17301
+ * (`record`) or closed five-minute buckets (`recordBuckets`). Rollups 5m / 1h /
17302
+ * 1d are computed here and nowhere else. Storage is `history.db` (D851).
17303
+ *
17304
+ * Who the PRODUCER is: `declareSeries`, `record` and `recordBuckets` are owner
17305
+ * checked against the `callerAddonId` the transport stamps into a call that
17306
+ * crossed a process (never in an input schema, so a session cannot supply it).
17307
+ * A call with no stamp is refused `not-owner`. The methods are `admin` so a
17308
+ * non-admin session never reaches them; an addon's `ctx.api` call bypasses the
17309
+ * tier by design.
17310
+ */
17311
+ /** Whose history: a real device, or a cluster node (load, memory). */
17312
+ var DeviceHistorySubjectSchema = discriminatedUnion("kind", [object({
17313
+ kind: literal("device"),
17314
+ deviceId: number().int()
17315
+ }), object({
17316
+ kind: literal("node"),
17317
+ nodeId: string().min(1)
17318
+ })]);
17319
+ var DeviceHistoryKindSchema = _enum([
17320
+ "gauge",
17321
+ "counter",
17322
+ "boolean"
17323
+ ]);
17324
+ var DeviceHistoryResolutionSchema = _enum([
17325
+ "raw",
17326
+ "5m",
17327
+ "1h",
17328
+ "1d"
17329
+ ]);
17330
+ /** Why a producer's point or bucket was not stored. Counted, never silent (D391). */
17331
+ var DeviceHistoryRefusalReasonSchema = _enum([
17332
+ "undeclared",
17333
+ "not-owner",
17334
+ "opted-out",
17335
+ "not-a-real-device",
17336
+ "rate",
17337
+ "ingest-mismatch",
17338
+ "out-of-range"
17339
+ ]);
17340
+ var RefusalSchema = object({
17341
+ key: string(),
17342
+ reason: DeviceHistoryRefusalReasonSchema,
17343
+ count: number().int()
17344
+ });
17345
+ var IngestResultSchema = object({
17346
+ accepted: number().int(),
17347
+ refused: array(RefusalSchema).readonly()
17348
+ });
17349
+ var SeriesInfoSchema = object({
17350
+ key: string(),
17351
+ scope: string(),
17352
+ kind: DeviceHistoryKindSchema,
17353
+ /** `null` is unknown (a `unitFrom` series whose device does not state a unit right now), never a guess. */
17354
+ unit: string().nullable(),
17355
+ displayName: string(),
17356
+ source: _enum(["cap", "addon"]),
17357
+ firstTs: number(),
17358
+ lastTs: number()
17359
+ });
17360
+ var QueryPointSchema = object({
17361
+ /** Raw: the point's time. Rollup: the bucket start. */
17362
+ t: number(),
17363
+ samples: number().int(),
17364
+ /** `sum / samples`. */
17365
+ mean: number().nullable(),
17366
+ /** Time-weighted mean (`tw_sum / tw_ms`); `null` for bucket-ingested series. For a boolean: the fraction of time true. */
17367
+ twMean: number().nullable(),
17368
+ min: number(),
17369
+ max: number(),
17370
+ /** `null` is unknown, never zero (D393). */
17371
+ last: number().nullable()
17372
+ });
17373
+ var QuerySeriesSchema = object({
17374
+ scope: string(),
17375
+ /** The last point STRICTLY BEFORE `from` in the chosen tier, so a step chart can start at the held value. */
17376
+ before: object({
17377
+ t: number(),
17378
+ value: number().nullable()
17379
+ }).nullable(),
17380
+ points: array(QueryPointSchema).readonly()
17381
+ });
17382
+ /** The window part of a query, shared by the device and node forms. */
17383
+ var QueryWindowShape = {
17384
+ key: string(),
17385
+ scope: string().optional(),
17386
+ from: number(),
17387
+ to: number(),
17388
+ resolution: union([DeviceHistoryResolutionSchema, literal("auto")]).default("auto"),
17389
+ maxPoints: number().int().positive().max(5e3).default(1e3)
17390
+ };
17391
+ var QueryResultSchema = object({
17392
+ resolution: DeviceHistoryResolutionSchema,
17393
+ series: array(QuerySeriesSchema).readonly(),
17394
+ truncated: boolean()
17395
+ });
17396
+ var TierStatusSchema = object({
17397
+ tier: DeviceHistoryResolutionSchema,
17398
+ /** `null` until the first background count answered. */
17399
+ rows: number().int().nullable(),
17400
+ /** `rows` times a fixed per-row estimate — approximate, labelled so. */
17401
+ approxBytes: number().nullable(),
17402
+ countedAt: number().nullable()
17403
+ });
17404
+ /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17405
+ var DeviceHistoryStatusSchema = object({
17406
+ startedAt: number(),
17407
+ /** The store is declared, series loaded and the first reconcile has answered. */
17408
+ ready: boolean(),
17409
+ series: number().int(),
17410
+ metrics: number().int(),
17411
+ optedOutDevices: number().int(),
17412
+ tiers: array(TierStatusSchema).readonly(),
17413
+ capture: object({
17414
+ eventsSeen: number().int(),
17415
+ pointsEmitted: number().int(),
17416
+ pointsWritten: number().int(),
17417
+ pointsDropped: number().int(),
17418
+ bufferDepth: number().int(),
17419
+ trailingEmitted: number().int(),
17420
+ reconciledPoints: number().int(),
17421
+ reconcileRuns: number().int(),
17422
+ reconcileFailures: number().int(),
17423
+ lastReconcileAt: number().nullable(),
17424
+ lastFlushAt: number().nullable(),
17425
+ flushFailures: number().int(),
17426
+ skipped: record(string(), number().int())
17427
+ }),
17428
+ ingest: object({
17429
+ accepted: number().int(),
17430
+ refused: record(string(), number().int())
17431
+ }),
17432
+ rollup: object({
17433
+ last5mAt: number().nullable(),
17434
+ last1hAt: number().nullable(),
17435
+ last1dAt: number().nullable(),
17436
+ errors: number().int(),
17437
+ dirty5m: number().int(),
17438
+ dirty1h: number().int(),
17439
+ dirty1d: number().int()
17440
+ }),
17441
+ retention: object({
17442
+ lastRunAt: number().nullable(),
17443
+ deleted: record(string(), number().int()),
17444
+ purgedSeries: number().int()
17445
+ }),
17446
+ directory: object({
17447
+ devices: number().int(),
17448
+ lastRefreshAt: number().nullable()
17449
+ })
17450
+ });
17451
+ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ nodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
17452
+ deviceId: number().int(),
17453
+ ...QueryWindowShape
17454
+ }), QueryResultSchema), method(object({
17455
+ nodeId: string().min(1),
17456
+ ...QueryWindowShape
17457
+ }), QueryResultSchema, { auth: "admin" }), method(object({
17458
+ name: string().regex(/^[a-z0-9-]+$/),
17459
+ subjectKind: _enum(["device", "node"]),
17460
+ kind: DeviceHistoryKindSchema,
17461
+ unit: string().optional(),
17462
+ displayName: string().min(1),
17463
+ ingest: _enum(["points", "buckets"])
17464
+ }), object({ key: string() }), {
17465
+ kind: "mutation",
17466
+ auth: "admin"
17467
+ }), method(object({ points: array(object({
17468
+ key: string(),
17469
+ subject: DeviceHistorySubjectSchema,
17470
+ scope: string().default(""),
17471
+ ts: number(),
17472
+ value: number()
17473
+ })).max(5e3) }), IngestResultSchema, {
17474
+ kind: "mutation",
17475
+ auth: "admin"
17476
+ }), method(object({ buckets: array(object({
17477
+ key: string(),
17478
+ subject: DeviceHistorySubjectSchema,
17479
+ scope: string().default(""),
17480
+ bucketStart: number(),
17481
+ samples: number().int().positive(),
17482
+ sum: number(),
17483
+ min: number(),
17484
+ max: number(),
17485
+ last: number().nullable(),
17486
+ lastTs: number().nullable()
17487
+ })).max(5e3) }), IngestResultSchema, {
17488
+ kind: "mutation",
17489
+ auth: "admin"
17490
+ }), method(object({ deviceId: number().int() }), object({ enabled: boolean() })), method(object({
17491
+ deviceId: number().int(),
17492
+ enabled: boolean()
17493
+ }), object({ enabled: boolean() }), {
17494
+ kind: "mutation",
17495
+ auth: "admin"
17496
+ }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17497
+ var DeviceCaStatusSchema = discriminatedUnion("state", [
17498
+ object({ state: literal("absent") }),
17499
+ object({
17500
+ state: literal("ready"),
17501
+ subject: string(),
17502
+ fingerprintSha256: string(),
17503
+ validTo: string()
17504
+ }),
17505
+ object({
17506
+ state: literal("unavailable"),
17507
+ reason: string()
17508
+ })
17509
+ ]);
17510
+ var DeviceCertificateSettingsSchema = object({ selfEnrollment: _enum(["allowed", "disabled"]) });
17511
+ method(object({
17512
+ userId: string().min(1).optional(),
17513
+ includeRevoked: boolean().default(false)
17514
+ }), array(DeviceCredentialSchema).readonly(), { auth: "admin" }), method(object({
17515
+ userId: string().min(1),
17516
+ deviceName: string().min(1).max(80)
17517
+ }), StartEnrollmentOutputSchema, {
17518
+ kind: "mutation",
17519
+ auth: "admin",
17520
+ caller: "required"
17521
+ }), method(object({ id: string().min(1) }), object({
17522
+ revoked: boolean(),
17523
+ sessionsEnded: number().int(),
17524
+ status: DeviceCredentialStatusSchema
17525
+ }), {
17526
+ kind: "mutation",
17527
+ auth: "admin",
17528
+ caller: "required"
17529
+ }), method(object({}), DeviceCertificateSettingsSchema, { auth: "admin" }), method(DeviceCertificateSettingsSchema, DeviceCertificateSettingsSchema, {
17530
+ kind: "mutation",
17531
+ auth: "admin"
17532
+ }), method(object({ id: string().min(1) }), object({ result: _enum([
17533
+ "deleted",
17534
+ "live",
17535
+ "unknown"
17536
+ ]) }), {
17537
+ kind: "mutation",
17538
+ auth: "admin",
17539
+ caller: "required"
17540
+ }), method(object({}), DeviceCaStatusSchema, { auth: "admin" }), method(object({
17541
+ id: string().min(1),
17542
+ deviceName: string().min(1).max(80)
17543
+ }), object({ renamed: boolean() }), {
17544
+ kind: "mutation",
17545
+ auth: "admin"
17546
+ });
17547
+ /**
17548
+ * `node-certificates` - what a node holds and the two renewals the hub drives
17549
+ * (D856): the node's MESH leaf (mutual TLS to the hub) and its HTTPS leaf (issued
17550
+ * from the hub's local CA so a device that trusts the hub root trusts the node).
17551
+ *
17552
+ * Provided by the AGENT RUNTIME (the synthetic `agent-runtime` addon id, like
17553
+ * `server-management`): the hub reaches it through the ordinary node-pinned
17554
+ * capability call - no new Moleculer action. The hub's own certificates are
17555
+ * handled in-process by the hub (`certificates` router), so this cap has no hub
17556
+ * provider.
17557
+ *
17558
+ * No private key ever crosses the mesh: the node generates its key pair, sends a
17559
+ * CSR, and the hub returns only the signed certificate.
17560
+ */
17561
+ var MeshLeafInfoSchema = object({
17562
+ cn: string(),
17563
+ serial: string(),
17564
+ fingerprintSha256: string(),
17565
+ notBefore: number(),
17566
+ notAfter: number()
17567
+ });
17568
+ var HttpsLeafInfoSchema = object({
17569
+ fingerprintSha256: string(),
17570
+ issuer: string(),
17571
+ sans: array(string()),
17572
+ notBefore: number(),
17573
+ notAfter: number()
17574
+ });
17575
+ var NodeHttpsStateSchema = discriminatedUnion("state", [object({
17576
+ state: literal("served"),
17577
+ leaf: HttpsLeafInfoSchema
17578
+ }), object({
17579
+ state: literal("not-issued"),
17580
+ reason: string()
17581
+ })]);
17582
+ method(object({}), object({
17583
+ nodeId: string(),
17584
+ mesh: MeshLeafInfoSchema.nullable(),
17585
+ https: NodeHttpsStateSchema
17586
+ }), { auth: "admin" }), method(object({}), object({ csrPem: string() }), {
17587
+ kind: "mutation",
17588
+ auth: "admin"
17589
+ }), method(object({
17590
+ certPem: string().min(1),
17591
+ caCertPem: string().min(1),
17592
+ confirmWithinMs: number().int().min(1e4).max(6e5)
17593
+ }), object({
17594
+ fingerprintSha256: string(),
17595
+ serial: string()
17596
+ }), {
17597
+ kind: "mutation",
17598
+ auth: "admin"
17599
+ }), method(object({ fingerprintSha256: string() }), object({ confirmed: boolean() }), {
17600
+ kind: "mutation",
17601
+ auth: "admin"
17602
+ }), method(object({}), object({ rolledBack: boolean() }), {
17603
+ kind: "mutation",
17604
+ auth: "admin"
17605
+ }), method(object({}), object({
17606
+ csrPem: string(),
17607
+ hostnames: array(string()),
17608
+ addresses: array(string()),
17609
+ /** SHA-256 of the hub local CA this node pinned at its first install; `null` before one. */
17610
+ pinnedCaFingerprintSha256: string().nullable()
17611
+ }), {
17612
+ kind: "mutation",
17613
+ auth: "admin"
17614
+ }), method(object({}), object({ ok: literal(true) }), {
17615
+ kind: "mutation",
17616
+ auth: "admin"
17617
+ }), method(object({
17618
+ certPem: string().min(1),
17619
+ caCertPem: string().min(1),
17620
+ /**
17621
+ * The hub signals that its local CA was rotated (D227) and this leaf chains to the NEW
17622
+ * one. Only the hub, over the authenticated mesh, can say so; a leaf with a different CA
17623
+ * and no signal is refused.
17624
+ */
17625
+ caRotation: boolean().optional()
17626
+ }), HttpsLeafInfoSchema, {
17627
+ kind: "mutation",
17628
+ auth: "admin"
17629
+ });
17095
17630
  var KeychainKeySourceSchema = object({
17096
17631
  kind: _enum([
17097
17632
  "config-file",
@@ -17566,6 +18101,10 @@ var deviceDiscoveryCapability = {
17566
18101
  * `scripts/check-runtime-state-durability.ts`.
17567
18102
  */
17568
18103
  durability: "session",
18104
+ /**
18105
+ * History (D850): none — inventory.
18106
+ */
18107
+ history: "none",
17569
18108
  methods: {
17570
18109
  /**
17571
18110
  * Snapshot of the current `discovered` list. Returns the
@@ -38266,6 +38805,42 @@ var DeviceRegisterPayloadSchema = object({
38266
38805
  * omits it and the keyword backstop applies. */
38267
38806
  secretConfigPaths: array(string()).optional()
38268
38807
  });
38808
+ /** One deleted device, kept by device-manager so an addon that missed the
38809
+ * deletion can still learn of it (D865). Written by the delete path ONLY. */
38810
+ var DeviceTombstoneSchema = object({
38811
+ deviceId: number().int().positive(),
38812
+ /** Epoch ms the device was deleted. */
38813
+ deletedAt: number(),
38814
+ /** The addon that owned the device when it was deleted. */
38815
+ providerAddonId: string()
38816
+ });
38817
+ /** How long a tombstone stays readable. Past it, a device that was deleted
38818
+ * and never cleaned is only reachable by the admin "clean data of deleted
38819
+ * devices" action. */
38820
+ var DEVICE_TOMBSTONE_RETENTION_MS = 2160 * 60 * 60 * 1e3;
38821
+ /** Data held for one device that device-manager no longer knows. */
38822
+ var OrphanDeviceDataSchema = object({
38823
+ deviceId: number().int().positive(),
38824
+ /** Rows/files per store (`<addonId>:<store>`). */
38825
+ stores: record(string(), number().int().nonnegative())
38826
+ });
38827
+ var CleanupDeletedDevicesResultSchema = object({
38828
+ /**
38829
+ * `skipped` — the absence check could not be trusted (a device-list read
38830
+ * failed or the two reads disagreed); nothing was listed or deleted.
38831
+ * `dry-run` — `devices` is what a confirmed run would delete.
38832
+ * `cleaned` — `devices` is what was deleted.
38833
+ */
38834
+ status: _enum([
38835
+ "skipped",
38836
+ "dry-run",
38837
+ "cleaned"
38838
+ ]),
38839
+ reason: string().nullable(),
38840
+ devices: array(OrphanDeviceDataSchema),
38841
+ /** Implementers that could not be asked (their stores are not in `devices`). */
38842
+ unreachable: array(string())
38843
+ });
38269
38844
  var DeviceRemovePayloadSchema = object({ deviceId: number() });
38270
38845
  var DevicePersistConfigPayloadSchema = object({
38271
38846
  deviceId: number(),
@@ -38504,6 +39079,9 @@ method(object({
38504
39079
  }), method(object({ deviceId: number() }), object({ success: literal(true) }), {
38505
39080
  kind: "mutation",
38506
39081
  auth: "admin"
39082
+ }), method(object({ sinceMs: number() }), array(DeviceTombstoneSchema).readonly(), { auth: "admin" }), method(object({ confirm: boolean() }), CleanupDeletedDevicesResultSchema, {
39083
+ kind: "mutation",
39084
+ auth: "admin"
38507
39085
  }), method(object({ integrationId: string() }), object({ removed: number() }), {
38508
39086
  kind: "mutation",
38509
39087
  auth: "admin"
@@ -39037,6 +39615,85 @@ var embeddingEncoderCapability = {
39037
39615
  }
39038
39616
  };
39039
39617
  /**
39618
+ * `device-removal-hook` — the reliable way an addon learns a device was DELETED,
39619
+ * so it can delete what it keeps for that device (D865).
39620
+ *
39621
+ * ## Why an event was not enough
39622
+ *
39623
+ * `DeviceUnregistered` is telemetry and may be dropped (D8, D11). An addon that
39624
+ * hung its per-device clean-up on it left durable garbage whenever the event was
39625
+ * lost, the addon was down, or it was restarting at that moment — footage,
39626
+ * analytics rows and settings of device 4483 outlived the device. Loss of this
39627
+ * signal corrupts durable state, so it travels by RPC with a recorded fact
39628
+ * behind it (D8: "if loss would corrupt durable state, use RPC plus a reconcile").
39629
+ *
39630
+ * ## The three pieces
39631
+ *
39632
+ * 1. device-manager records a TOMBSTONE per deleted device
39633
+ * (`deviceManager.listDeletedSince`). The tombstone is written by the delete
39634
+ * path only — a device that is unregistered, offline or whose provider is
39635
+ * restarting is NOT deleted and gets none.
39636
+ * 2. After a delete, device-manager calls `onDeviceRemoved` on EVERY provider of
39637
+ * this collection, one by one, with bounded retries, logged.
39638
+ * 3. An implementer that was down asks `deviceManager.listDeletedSince` at start
39639
+ * (and periodically) and runs its own `onDeviceRemoved` for each tombstone it
39640
+ * may have missed. Reconcile is driven by tombstones, never by "the device is
39641
+ * not in the current list": a failed or partial list read must not destroy data.
39642
+ *
39643
+ * ## Contract for an implementer
39644
+ *
39645
+ * - **Idempotent.** It is called again by a retry, by a reconcile and by the
39646
+ * admin cleanup of data that predates tombstones. A device with nothing left
39647
+ * answers zero counts.
39648
+ * - **One key per store** in `counts`, deleted rows/files per store, so the log
39649
+ * line and the admin dry run can say where the data was.
39650
+ * - **Training datasets are NOT device data** and are never deleted by a hook.
39651
+ * - **Per-device SETTINGS are not hooked.** Configuration lives in the standard
39652
+ * per-device store (`ctx.settings.*DeviceStore`), which device-manager clears
39653
+ * for every addon centrally at delete time. This hook is for device DATA
39654
+ * that is not settings: footage, event media, analytics rows, history.
39655
+ * - A provider that cannot tell is allowed to throw; the caller retries it.
39656
+ *
39657
+ * `listDeviceData` is the read side of the admin "Clean data of deleted devices"
39658
+ * action: which device ids this addon holds data for, and how much per store. It
39659
+ * never deletes. device-manager decides which of those ids are absent from the
39660
+ * fleet, from TWO consistent reads of the device list (D49).
39661
+ */
39662
+ /** What a hook is told about the deletion. */
39663
+ var DeviceRemovedInputSchema = object({
39664
+ deviceId: number().int().positive(),
39665
+ /** Epoch ms the device was deleted (the tombstone's `deletedAt`). */
39666
+ deletedAt: number(),
39667
+ /** The addon that owned the device, as device-manager last knew it. */
39668
+ providerAddonId: string()
39669
+ });
39670
+ /** Rows/files/refs deleted, per store this implementer owns. */
39671
+ var DeviceRemovedResultSchema = object({ counts: record(string(), number().int().nonnegative()) });
39672
+ /** One (store, device) pair an implementer holds data for. */
39673
+ var DeviceDataEntrySchema = object({
39674
+ store: string(),
39675
+ deviceId: number().int().positive(),
39676
+ /** Rows (or files) held for the device in the store. */
39677
+ count: number().int().nonnegative()
39678
+ });
39679
+ var deviceRemovalHookCapability = {
39680
+ name: "device-removal-hook",
39681
+ scope: "system",
39682
+ mode: "collection",
39683
+ internal: true,
39684
+ methods: {
39685
+ /** Delete everything this addon keeps for the deleted device. Idempotent. */
39686
+ onDeviceRemoved: method(DeviceRemovedInputSchema, DeviceRemovedResultSchema, {
39687
+ kind: "mutation",
39688
+ auth: "admin"
39689
+ }),
39690
+ /** Which devices this addon holds data for, per store. Reads only. */
39691
+ listDeviceData: method(_void(), array(DeviceDataEntrySchema).readonly(), { auth: "admin" })
39692
+ },
39693
+ /** In-process only — enumerated through `addons.listCapabilityProviders`. */
39694
+ mount: { kind: "skip" }
39695
+ };
39696
+ /**
39040
39697
  * `failure-contribution` — the capability an addon reports its OWN losses
39041
39698
  * through, per camera, with the denominator attached. It stores nothing.
39042
39699
  *
@@ -40113,7 +40770,13 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
40113
40770
  * `beginExternalLink` offer exactly the redirect methods that set this,
40114
40771
  * whatever their id. Absent / false — a login button only.
40115
40772
  */
40116
- linkable: boolean().optional()
40773
+ linkable: boolean().optional(),
40774
+ /**
40775
+ * How a NATIVE app starts this method (D858): `{ kind: 'browser', startPath }`
40776
+ * when the route understands the app flow query (`app=1&code_challenge=…`),
40777
+ * `null`/absent when there is no app path - the app hides the method.
40778
+ */
40779
+ app: AppLoginPathSchema.nullable().optional()
40117
40780
  }),
40118
40781
  object({
40119
40782
  kind: literal("widget"),
@@ -40125,7 +40788,9 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
40125
40788
  bundle: string(),
40126
40789
  /** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
40127
40790
  remote: WidgetRemoteSchema,
40128
- stage: LoginStageEnum
40791
+ stage: LoginStageEnum,
40792
+ /** Widgets are web ceremonies: no native app path (D858). Absent reads as `null`. */
40793
+ app: AppLoginPathSchema.nullable().optional()
40129
40794
  }),
40130
40795
  object({
40131
40796
  kind: literal("passkey"),
@@ -40137,7 +40802,9 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
40137
40802
  /** Effective WebAuthn RP ID (`resolveRpID()`) — the shell gates visibility on it. */
40138
40803
  rpId: string(),
40139
40804
  /** Effective expected origin (`resolveOrigin()`), null when unconfigured. */
40140
- origin: string().nullable()
40805
+ origin: string().nullable(),
40806
+ /** Set by the hub for the primary arm; a second-factor passkey has no app path (D858). */
40807
+ app: AppLoginPathSchema.nullable().optional()
40141
40808
  })
40142
40809
  ]);
40143
40810
  method(_void(), array(LoginMethodContributionSchema).readonly());
@@ -40647,7 +41314,21 @@ var NetworkEndpointSchema = object({
40647
41314
  url: string(),
40648
41315
  hostname: string(),
40649
41316
  port: number(),
40650
- protocol: _enum(["http", "https"])
41317
+ protocol: _enum(["http", "https"]),
41318
+ /**
41319
+ * Whether this address survives a restart of its provider. `false` = it is
41320
+ * re-issued every time (a Quick tunnel's random `*.trycloudflare.com`); the
41321
+ * hub never selects such an address AUTOMATICALLY for a role (D860), though
41322
+ * it stays visible and an operator may still flag it. Absent = stable: every
41323
+ * provider except a Quick tunnel owns a name that does not change.
41324
+ */
41325
+ stable: boolean().optional()
41326
+ });
41327
+ object({
41328
+ url: string(),
41329
+ /** Mirrors {@link NetworkEndpointSchema} `stable`; absent = stable. */
41330
+ stable: boolean().optional(),
41331
+ updated: boolean().optional()
40651
41332
  });
40652
41333
  var NetworkAccessStatusSchema = object({
40653
41334
  connected: boolean(),
@@ -41775,6 +42456,10 @@ var alarmPanelCapability = {
41775
42456
  * `scripts/check-runtime-state-durability.ts`.
41776
42457
  */
41777
42458
  durability: "restored",
42459
+ /**
42460
+ * History (D850): none — enum state; arm/disarm history belongs in the events ledger.
42461
+ */
42462
+ history: "none",
41778
42463
  /** Clock fields: written, but excluded from the compare that decides
41779
42464
  * whether persisting is worth a SQLite commit. */
41780
42465
  volatileStateFields: ["lastChangedAt"]
@@ -50189,7 +50874,11 @@ var zonesCapability = {
50189
50874
  * See `RuntimeStateDurability`. Enforced by
50190
50875
  * `scripts/check-runtime-state-durability.ts`.
50191
50876
  */
50192
- durability: "restored"
50877
+ durability: "restored",
50878
+ /**
50879
+ * History (D850): none — configuration arrays.
50880
+ */
50881
+ history: "none"
50193
50882
  };
50194
50883
  /**
50195
50884
  * A bounding box in NORMALIZED [0,1] frame coordinates for `getNativeCrop`. The
@@ -52570,7 +53259,22 @@ var SsoBridgeClaimsSchema = object({
52570
53259
  * request to present the matching cookie — a login bridge is useless in
52571
53260
  * any other browser.
52572
53261
  */
52573
- browserBinding: string().optional()
53262
+ browserBinding: string().optional(),
53263
+ /**
53264
+ * The native app that started this sign-in (D858): its PKCE challenge,
53265
+ * `state`, purpose and allow-listed return URL, copied from the server-side
53266
+ * pending OIDC state. A bridge carrying it is finished ONLY at
53267
+ * `/api/auth/sso/finish-app` (which mints a handoff code, never a web
53268
+ * session); `/api/auth/sso/finish` refuses it.
53269
+ */
53270
+ app: object({
53271
+ codeChallenge: string(),
53272
+ state: string(),
53273
+ purpose: _enum(["new-session", "step-up"]),
53274
+ redirect: string(),
53275
+ /** The page language the app asked for (D858); the confirm page speaks it. */
53276
+ lang: _enum(["en", "it"]).optional()
53277
+ }).optional()
52574
53278
  });
52575
53279
  method(object({
52576
53280
  claims: SsoBridgeClaimsSchema,
@@ -52977,6 +53681,10 @@ var streamSignalsCapability = {
52977
53681
  * `scripts/check-runtime-state-durability.ts`.
52978
53682
  */
52979
53683
  durability: "session",
53684
+ /**
53685
+ * History (D850): none — array state.
53686
+ */
53687
+ history: "none",
52980
53688
  methods: {
52981
53689
  /**
52982
53690
  * What this device can emit. Empty is a valid and common answer — most
@@ -54839,7 +55547,12 @@ var SearchResultSchema = object({
54839
55547
  publishedAt: string(),
54840
55548
  author: string(),
54841
55549
  installed: boolean(),
54842
- installedVersion: string().optional()
55550
+ installedVersion: string().optional(),
55551
+ /**
55552
+ * Capability names the package's addons declare (from its published
55553
+ * manifest). `null` = the registry lookup failed — unknown, never `[]` (D393).
55554
+ */
55555
+ capabilities: array(string()).readonly().nullable()
54843
55556
  });
54844
55557
  var AutoUpdateSettingsSchema = object({
54845
55558
  channel: ChannelSchema,
@@ -55001,7 +55714,11 @@ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSc
55001
55714
  }), method(object({ packageName: string().optional() }), PackageInstallationsSchema, { auth: "admin" }), method(_void(), ReloadPackagesResultSchema, {
55002
55715
  kind: "mutation",
55003
55716
  auth: "admin"
55004
- }), method(object({ query: string().optional() }), array(SearchResultSchema)), method(object({ nodeId: string().optional() }), array(PackageUpdateSchema).readonly(), { auth: "admin" }), method(object({
55717
+ }), method(object({
55718
+ query: string().optional(),
55719
+ /** Only packages whose addons declare this capability (unknown ones excluded). */
55720
+ capability: string().optional()
55721
+ }), array(SearchResultSchema)), method(object({ nodeId: string().optional() }), array(PackageUpdateSchema).readonly(), { auth: "admin" }), method(object({
55005
55722
  name: string().min(1),
55006
55723
  version: string().optional(),
55007
55724
  nodeId: string().optional()
@@ -55137,6 +55854,36 @@ var airQualitySensorCapability = {
55137
55854
  * `scripts/check-runtime-state-durability.ts`.
55138
55855
  */
55139
55856
  durability: "restored",
55857
+ /**
55858
+ * History (D850): recorded series.
55859
+ */
55860
+ history: { fields: {
55861
+ co2Ppm: {
55862
+ kind: "gauge",
55863
+ unit: "ppm",
55864
+ deadband: 5
55865
+ },
55866
+ vocPpb: {
55867
+ kind: "gauge",
55868
+ unit: "ppb",
55869
+ deadband: 5
55870
+ },
55871
+ pm25: {
55872
+ kind: "gauge",
55873
+ unit: "ug/m3",
55874
+ deadband: 1
55875
+ },
55876
+ pm10: {
55877
+ kind: "gauge",
55878
+ unit: "ug/m3",
55879
+ deadband: 1
55880
+ },
55881
+ aqi: {
55882
+ kind: "gauge",
55883
+ unit: "count",
55884
+ deadband: 1
55885
+ }
55886
+ } },
55140
55887
  /** Clock fields: written, but excluded from the compare that decides
55141
55888
  * whether persisting is worth a SQLite commit. */
55142
55889
  volatileStateFields: ["lastFetchedAt"]
@@ -55179,6 +55926,15 @@ var ambientLightSensorCapability = {
55179
55926
  * `scripts/check-runtime-state-durability.ts`.
55180
55927
  */
55181
55928
  durability: "restored",
55929
+ /**
55930
+ * History (D850): recorded series. Wide range, so a RELATIVE deadband (10 %).
55931
+ */
55932
+ history: { fields: { lux: {
55933
+ kind: "gauge",
55934
+ unit: "lx",
55935
+ deadbandPct: 10,
55936
+ minIntervalMs: 6e4
55937
+ } } },
55182
55938
  /** Clock fields: written, but excluded from the compare that decides
55183
55939
  * whether persisting is worth a SQLite commit. */
55184
55940
  volatileStateFields: ["lastFetchedAt"]
@@ -55306,7 +56062,11 @@ var audioMetricsCapability = {
55306
56062
  * See `RuntimeStateDurability`. Enforced by
55307
56063
  * `scripts/check-runtime-state-durability.ts`.
55308
56064
  */
55309
- durability: "session"
56065
+ durability: "session",
56066
+ /**
56067
+ * History (D850): none — the level is the addon series `pipeline-analytics/audio-level` (producer `record`); the other numbers move every inference window and duplicate it.
56068
+ */
56069
+ history: "none"
55310
56070
  };
55311
56071
  /**
55312
56072
  * Automation-control cap. Models HA `automation.*` entities on
@@ -55375,7 +56135,11 @@ var automationControlCapability = {
55375
56135
  * See `RuntimeStateDurability`. Enforced by
55376
56136
  * `scripts/check-runtime-state-durability.ts`.
55377
56137
  */
55378
- durability: "session"
56138
+ durability: "session",
56139
+ /**
56140
+ * History (D850): none — configuration and transient run state.
56141
+ */
56142
+ history: "none"
55379
56143
  };
55380
56144
  /**
55381
56145
  * Battery status snapshot. Emitted by providers whose device is
@@ -55556,6 +56320,13 @@ onStatusChanged: { data: object({
55556
56320
  * `scripts/check-runtime-state-durability.ts`.
55557
56321
  */
55558
56322
  durability: "restored",
56323
+ /**
56324
+ * History (D850): recorded series. The generic capture replaces the `battery` series of `pipeline-analytics:stats-5m`.
56325
+ */
56326
+ history: { fields: { percentage: {
56327
+ kind: "gauge",
56328
+ unit: "%"
56329
+ } } },
55559
56330
  /** Clock fields: written, but excluded from the compare that decides
55560
56331
  * whether persisting is worth a SQLite commit. */
55561
56332
  volatileStateFields: ["lastUpdated"]
@@ -55595,6 +56366,10 @@ var binaryCapability = {
55595
56366
  * `scripts/check-runtime-state-durability.ts`.
55596
56367
  */
55597
56368
  durability: "restored",
56369
+ /**
56370
+ * History (D850): recorded series.
56371
+ */
56372
+ history: { fields: { on: { kind: "boolean" } } },
55598
56373
  /** Clock fields: written, but excluded from the compare that decides
55599
56374
  * whether persisting is worth a SQLite commit. */
55600
56375
  volatileStateFields: ["lastChangedAt"]
@@ -55657,7 +56432,15 @@ onBrightnessChanged: { data: object({
55657
56432
  * See `RuntimeStateDurability`. Enforced by
55658
56433
  * `scripts/check-runtime-state-durability.ts`.
55659
56434
  */
55660
- durability: "session"
56435
+ durability: "session",
56436
+ /**
56437
+ * History (D850): recorded series. Actuator tier: level keeps every change.
56438
+ */
56439
+ history: { fields: { percentage: {
56440
+ kind: "gauge",
56441
+ unit: "%",
56442
+ minIntervalMs: 0
56443
+ } } }
55661
56444
  };
55662
56445
  DeviceType.Button, method(object({ deviceId: number().int().nonnegative() }), _void(), {
55663
56446
  kind: "mutation",
@@ -56018,6 +56801,10 @@ var carbonMonoxideCapability = {
56018
56801
  * `scripts/check-runtime-state-durability.ts`.
56019
56802
  */
56020
56803
  durability: "restored",
56804
+ /**
56805
+ * History (D850): recorded series.
56806
+ */
56807
+ history: { fields: { detected: { kind: "boolean" } } },
56021
56808
  /** Clock fields: written, but excluded from the compare that decides
56022
56809
  * whether persisting is worth a SQLite commit. */
56023
56810
  volatileStateFields: ["lastChangedAt"]
@@ -56187,7 +56974,37 @@ var climateControlCapability = {
56187
56974
  * See `RuntimeStateDurability`. Enforced by
56188
56975
  * `scripts/check-runtime-state-durability.ts`.
56189
56976
  */
56190
- durability: "session"
56977
+ durability: "session",
56978
+ /**
56979
+ * History (D850): recorded series. Celsius by contract; setpoints keep every change (`minIntervalMs: 0`).
56980
+ */
56981
+ history: { fields: {
56982
+ currentTemp: {
56983
+ kind: "gauge",
56984
+ unit: "°C",
56985
+ deadband: .1
56986
+ },
56987
+ currentHumidity: {
56988
+ kind: "gauge",
56989
+ unit: "%",
56990
+ deadband: .5
56991
+ },
56992
+ target: {
56993
+ kind: "gauge",
56994
+ unit: "°C",
56995
+ minIntervalMs: 0
56996
+ },
56997
+ targetHigh: {
56998
+ kind: "gauge",
56999
+ unit: "°C",
57000
+ minIntervalMs: 0
57001
+ },
57002
+ targetLow: {
57003
+ kind: "gauge",
57004
+ unit: "°C",
57005
+ minIntervalMs: 0
57006
+ }
57007
+ } }
56191
57008
  };
56192
57009
  /**
56193
57010
  * Color-light cap. Coexists with `switch` (on/off) and `brightness`
@@ -56304,7 +57121,11 @@ onColorChanged: { data: object({
56304
57121
  * See `RuntimeStateDurability`. Enforced by
56305
57122
  * `scripts/check-runtime-state-durability.ts`.
56306
57123
  */
56307
- durability: "session"
57124
+ durability: "session",
57125
+ /**
57126
+ * History (D850): none — nested and cosmetic.
57127
+ */
57128
+ history: "none"
56308
57129
  };
56309
57130
  var ConnectionTestOutcomeSchema = discriminatedUnion("outcome", [
56310
57131
  object({
@@ -56370,6 +57191,10 @@ var connectivityCapability = {
56370
57191
  * `scripts/check-runtime-state-durability.ts`.
56371
57192
  */
56372
57193
  durability: "restored",
57194
+ /**
57195
+ * History (D850): none — duplicates device-status.online (one authority for availability).
57196
+ */
57197
+ history: "none",
56373
57198
  /** Clock fields: written, but excluded from the compare that decides
56374
57199
  * whether persisting is worth a SQLite commit. */
56375
57200
  volatileStateFields: ["lastChangedAt"]
@@ -56494,6 +57319,10 @@ reset: method(object({
56494
57319
  * `scripts/check-runtime-state-durability.ts`.
56495
57320
  */
56496
57321
  durability: "restored",
57322
+ /**
57323
+ * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
57324
+ */
57325
+ history: "none",
56497
57326
  /** Clocks, not content: a re-read that changed no item costs no commit. */
56498
57327
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
56499
57328
  };
@@ -56534,6 +57363,10 @@ var contactCapability = {
56534
57363
  * `scripts/check-runtime-state-durability.ts`.
56535
57364
  */
56536
57365
  durability: "restored",
57366
+ /**
57367
+ * History (D850): recorded series.
57368
+ */
57369
+ history: { fields: { entryOpen: { kind: "boolean" } } },
56537
57370
  /** Clock fields: written, but excluded from the compare that decides
56538
57371
  * whether persisting is worth a SQLite commit. */
56539
57372
  volatileStateFields: ["lastChangedAt"]
@@ -56649,7 +57482,11 @@ var controlCapability = {
56649
57482
  * See `RuntimeStateDurability`. Enforced by
56650
57483
  * `scripts/check-runtime-state-durability.ts`.
56651
57484
  */
56652
- durability: "session"
57485
+ durability: "session",
57486
+ /**
57487
+ * History (D850): none — `value` is a number/string union; configuration entity.
57488
+ */
57489
+ history: "none"
56653
57490
  };
56654
57491
  /**
56655
57492
  * Window covering / blinds / garage door / valve cap. Models HA
@@ -56740,6 +57577,14 @@ var coverCapability = {
56740
57577
  * `scripts/check-runtime-state-durability.ts`.
56741
57578
  */
56742
57579
  durability: "restored",
57580
+ /**
57581
+ * History (D850): recorded series. Actuator tier: position keeps every tick of a movement.
57582
+ */
57583
+ history: { fields: { position: {
57584
+ kind: "gauge",
57585
+ unit: "%",
57586
+ minIntervalMs: 0
57587
+ } } },
56743
57588
  /** Clock fields: written, but excluded from the compare that decides
56744
57589
  * whether persisting is worth a SQLite commit. */
56745
57590
  volatileStateFields: ["lastChangedAt"]
@@ -56844,6 +57689,10 @@ var dayNightCapability = {
56844
57689
  * `scripts/check-runtime-state-durability.ts`.
56845
57690
  */
56846
57691
  durability: "restored",
57692
+ /**
57693
+ * History (D850): none — firmware configuration, not a measurement.
57694
+ */
57695
+ history: "none",
56847
57696
  /** Clock fields: written, but excluded from the compare that decides
56848
57697
  * whether persisting is worth a SQLite commit. */
56849
57698
  volatileStateFields: ["lastFetchedAt"]
@@ -56901,6 +57750,10 @@ onStatusChanged: { data: object({
56901
57750
  * `scripts/check-runtime-state-durability.ts`.
56902
57751
  */
56903
57752
  durability: "restored",
57753
+ /**
57754
+ * History (D850): recorded series. The ONE availability series.
57755
+ */
57756
+ history: { fields: { online: { kind: "boolean" } } },
56904
57757
  /** Clock fields: written, but excluded from the compare that decides
56905
57758
  * whether persisting is worth a SQLite commit. */
56906
57759
  volatileStateFields: ["lastChangedAt"]
@@ -56967,7 +57820,11 @@ onPressed: {
56967
57820
  * See `RuntimeStateDurability`. Enforced by
56968
57821
  * `scripts/check-runtime-state-durability.ts`.
56969
57822
  */
56970
- durability: "restored"
57823
+ durability: "restored",
57824
+ /**
57825
+ * History (D850): none — `pressCountSinceStart` resets with the addon, so it is not a monotonic meter; presses live in the events ledger.
57826
+ */
57827
+ history: "none"
56971
57828
  };
56972
57829
  /**
56973
57830
  * Enum-state sensor — a string value picked from a finite option set.
@@ -57015,6 +57872,10 @@ var enumSensorCapability = {
57015
57872
  * `scripts/check-runtime-state-durability.ts`.
57016
57873
  */
57017
57874
  durability: "restored",
57875
+ /**
57876
+ * History (D850): none — text/enum state has no history (non-goal).
57877
+ */
57878
+ history: "none",
57018
57879
  /** Clock fields: written, but excluded from the compare that decides
57019
57880
  * whether persisting is worth a SQLite commit. */
57020
57881
  volatileStateFields: ["lastFetchedAt"]
@@ -57060,7 +57921,11 @@ var eventEmitterCapability = {
57060
57921
  * See `RuntimeStateDurability`. Enforced by
57061
57922
  * `scripts/check-runtime-state-durability.ts`.
57062
57923
  */
57063
- durability: "session"
57924
+ durability: "session",
57925
+ /**
57926
+ * History (D850): none — `eventCountSinceStart` resets with the addon; events live in ledgers.
57927
+ */
57928
+ history: "none"
57064
57929
  };
57065
57930
  var IdentitySchema = object({
57066
57931
  id: string(),
@@ -57556,7 +58421,18 @@ var fanControlCapability = {
57556
58421
  * See `RuntimeStateDurability`. Enforced by
57557
58422
  * `scripts/check-runtime-state-durability.ts`.
57558
58423
  */
57559
- durability: "session"
58424
+ durability: "session",
58425
+ /**
58426
+ * History (D850): recorded series. Actuator tier: speed keeps every change.
58427
+ */
58428
+ history: { fields: {
58429
+ percentage: {
58430
+ kind: "gauge",
58431
+ unit: "%",
58432
+ minIntervalMs: 0
58433
+ },
58434
+ oscillating: { kind: "boolean" }
58435
+ } }
57560
58436
  };
57561
58437
  /**
57562
58438
  * Per-device feature/identity probe slice. Holds the runtime-resolved
@@ -57639,7 +58515,11 @@ onProbeChanged: { data: object({
57639
58515
  * See `RuntimeStateDurability`. Enforced by
57640
58516
  * `scripts/check-runtime-state-durability.ts`.
57641
58517
  */
57642
- durability: "session"
58518
+ durability: "session",
58519
+ /**
58520
+ * History (D850): none — static identity and capability probe.
58521
+ */
58522
+ history: "none"
57643
58523
  };
57644
58524
  /**
57645
58525
  * Water leak / moisture sensor. Boolean "is liquid currently
@@ -57674,6 +58554,10 @@ var floodCapability = {
57674
58554
  * `scripts/check-runtime-state-durability.ts`.
57675
58555
  */
57676
58556
  durability: "restored",
58557
+ /**
58558
+ * History (D850): recorded series.
58559
+ */
58560
+ history: { fields: { flooded: { kind: "boolean" } } },
57677
58561
  /** Clock fields: written, but excluded from the compare that decides
57678
58562
  * whether persisting is worth a SQLite commit. */
57679
58563
  volatileStateFields: ["lastChangedAt"]
@@ -57707,6 +58591,10 @@ var gasCapability = {
57707
58591
  * `scripts/check-runtime-state-durability.ts`.
57708
58592
  */
57709
58593
  durability: "restored",
58594
+ /**
58595
+ * History (D850): recorded series.
58596
+ */
58597
+ history: { fields: { detected: { kind: "boolean" } } },
57710
58598
  /** Clock fields: written, but excluded from the compare that decides
57711
58599
  * whether persisting is worth a SQLite commit. */
57712
58600
  volatileStateFields: ["lastChangedAt"]
@@ -57792,7 +58680,18 @@ var humidifierCapability = {
57792
58680
  * See `RuntimeStateDurability`. Enforced by
57793
58681
  * `scripts/check-runtime-state-durability.ts`.
57794
58682
  */
57795
- durability: "session"
58683
+ durability: "session",
58684
+ /**
58685
+ * History (D850): recorded series.
58686
+ */
58687
+ history: { fields: {
58688
+ currentHumidity: {
58689
+ kind: "gauge",
58690
+ unit: "%",
58691
+ deadband: .5
58692
+ },
58693
+ on: { kind: "boolean" }
58694
+ } }
57796
58695
  };
57797
58696
  /**
57798
58697
  * Single-metric humidity reading. Drives Home Assistant `sensor`
@@ -57836,6 +58735,14 @@ var humiditySensorCapability = {
57836
58735
  * `scripts/check-runtime-state-durability.ts`.
57837
58736
  */
57838
58737
  durability: "restored",
58738
+ /**
58739
+ * History (D850): recorded series.
58740
+ */
58741
+ history: { fields: { percent: {
58742
+ kind: "gauge",
58743
+ unit: "%",
58744
+ deadband: .5
58745
+ } } },
57839
58746
  /** Clock fields: written, but excluded from the compare that decides
57840
58747
  * whether persisting is worth a SQLite commit. */
57841
58748
  volatileStateFields: ["lastFetchedAt"]
@@ -57883,7 +58790,11 @@ var imageCapability = {
57883
58790
  * See `RuntimeStateDurability`. Enforced by
57884
58791
  * `scripts/check-runtime-state-durability.ts`.
57885
58792
  */
57886
- durability: "session"
58793
+ durability: "session",
58794
+ /**
58795
+ * History (D850): none — not numeric.
58796
+ */
58797
+ history: "none"
57887
58798
  };
57888
58799
  /**
57889
58800
  * Vendor-neutral image / picture-adjustment cap — the per-camera config
@@ -58040,6 +58951,10 @@ var imageSettingsCapability = {
58040
58951
  * `scripts/check-runtime-state-durability.ts`.
58041
58952
  */
58042
58953
  durability: "restored",
58954
+ /**
58955
+ * History (D850): none — camera image configuration (operator intent), not a trend.
58956
+ */
58957
+ history: "none",
58043
58958
  /** Clock fields: written, but excluded from the compare that decides
58044
58959
  * whether persisting is worth a SQLite commit. */
58045
58960
  volatileStateFields: ["lastFetchedAt"]
@@ -58425,7 +59340,11 @@ var intercomCapability = {
58425
59340
  * See `RuntimeStateDurability`. Enforced by
58426
59341
  * `scripts/check-runtime-state-durability.ts`.
58427
59342
  */
58428
- durability: "session"
59343
+ durability: "session",
59344
+ /**
59345
+ * History (D850): none — talk sessions are a ledger concern, not a trend.
59346
+ */
59347
+ history: "none"
58429
59348
  };
58430
59349
  /**
58431
59350
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
@@ -58506,7 +59425,15 @@ var lawnMowerControlCapability = {
58506
59425
  * See `RuntimeStateDurability`. Enforced by
58507
59426
  * `scripts/check-runtime-state-durability.ts`.
58508
59427
  */
58509
- durability: "session"
59428
+ durability: "session",
59429
+ /**
59430
+ * History (D850): recorded series.
59431
+ */
59432
+ history: { fields: { batteryLevel: {
59433
+ kind: "gauge",
59434
+ unit: "%",
59435
+ deadband: 2
59436
+ } } }
58510
59437
  };
58511
59438
  /**
58512
59439
  * local-network — hub-only singleton.
@@ -58633,7 +59560,13 @@ var ConnectionEndpointSchema = object({
58633
59560
  * calls so the client can sort even if the cap returns a new
58634
59561
  * ordering between polls.
58635
59562
  */
58636
- priority: number()
59563
+ priority: number(),
59564
+ /**
59565
+ * `false` = the address changes on its own (a Quick tunnel, re-issued on
59566
+ * every respawn). Automatic role resolution skips it (D860); an explicit
59567
+ * operator flag still honours it. Absent = stable.
59568
+ */
59569
+ stable: boolean().optional()
58637
59570
  });
58638
59571
  /**
58639
59572
  * Where the advertised local port came from. Ordered most → least
@@ -58934,6 +59867,10 @@ var lockControlCapability = {
58934
59867
  * `scripts/check-runtime-state-durability.ts`.
58935
59868
  */
58936
59869
  durability: "restored",
59870
+ /**
59871
+ * History (D850): none — enum state; lock events belong in the events ledger.
59872
+ */
59873
+ history: "none",
58937
59874
  /** Clock fields: written, but excluded from the compare that decides
58938
59875
  * whether persisting is worth a SQLite commit. */
58939
59876
  volatileStateFields: ["lastChangedAt"]
@@ -59105,7 +60042,11 @@ var mediaPlayerCapability = {
59105
60042
  * See `RuntimeStateDurability`. Enforced by
59106
60043
  * `scripts/check-runtime-state-durability.ts`.
59107
60044
  */
59108
- durability: "session"
60045
+ durability: "session",
60046
+ /**
60047
+ * History (D850): none — `positionMs` moves continuously while playing; volume is transient.
60048
+ */
60049
+ history: "none"
59109
60050
  };
59110
60051
  /**
59111
60052
  * mesh-network — collection cap for mesh-VPN providers.
@@ -59439,7 +60380,14 @@ onMotionChanged: { data: MotionOnMotionChangedDataSchema } },
59439
60380
  * See `RuntimeStateDurability`. Enforced by
59440
60381
  * `scripts/check-runtime-state-durability.ts`.
59441
60382
  */
59442
- durability: "session"
60383
+ durability: "session",
60384
+ /**
60385
+ * History (D850): recorded series. A PIR sensor is a series; a camera is not (its motion is an addon series and a ledger).
60386
+ */
60387
+ history: { fields: { detected: {
60388
+ kind: "boolean",
60389
+ excludeDeviceTypes: [DeviceType.Camera]
60390
+ } } }
59443
60391
  };
59444
60392
  /**
59445
60393
  * Motion-trigger toggle for accessory devices.
@@ -59511,7 +60459,11 @@ var motionTriggerCapability = {
59511
60459
  * See `RuntimeStateDurability`. Enforced by
59512
60460
  * `scripts/check-runtime-state-durability.ts`.
59513
60461
  */
59514
- durability: "session"
60462
+ durability: "session",
60463
+ /**
60464
+ * History (D850): none — configuration switch.
60465
+ */
60466
+ history: "none"
59515
60467
  };
59516
60468
  /**
59517
60469
  * Motion-zones share the same MaskShape vocabulary as privacy-mask — the
@@ -59586,6 +60538,10 @@ var motionZonesCapability = {
59586
60538
  * `scripts/check-runtime-state-durability.ts`.
59587
60539
  */
59588
60540
  durability: "restored",
60541
+ /**
60542
+ * History (D850): none — configuration.
60543
+ */
60544
+ history: "none",
59589
60545
  /** Clock fields: written, but excluded from the compare that decides
59590
60546
  * whether persisting is worth a SQLite commit. */
59591
60547
  volatileStateFields: ["lastFetchedAt"]
@@ -59715,6 +60671,10 @@ var nativeObjectDetectionCapability = {
59715
60671
  * `scripts/check-runtime-state-durability.ts`.
59716
60672
  */
59717
60673
  durability: "restored",
60674
+ /**
60675
+ * History (D850): none — event-like and nested per class; detections live in the objects ledger.
60676
+ */
60677
+ history: "none",
59718
60678
  /** Clock fields: written, but excluded from the compare that decides
59719
60679
  * whether persisting is worth a SQLite commit. */
59720
60680
  volatileStateFields: ["lastFetchedAt"]
@@ -59998,7 +60958,11 @@ var navigationCapability = {
59998
60958
  * See `RuntimeStateDurability`. Enforced by
59999
60959
  * `scripts/check-runtime-state-durability.ts`.
60000
60960
  */
60001
- durability: "session"
60961
+ durability: "session",
60962
+ /**
60963
+ * History (D850): none — control state of a robotic camera, configuration-like.
60964
+ */
60965
+ history: "none"
60002
60966
  };
60003
60967
  /**
60004
60968
  * Network-link snapshot. Same shape for every provider (a Reolink wifi
@@ -60078,6 +61042,23 @@ onStatusChanged: { data: object({
60078
61042
  * `scripts/check-runtime-state-durability.ts`.
60079
61043
  */
60080
61044
  durability: "restored",
61045
+ /**
61046
+ * History (D850): recorded series.
61047
+ */
61048
+ history: { fields: {
61049
+ signalPercent: {
61050
+ kind: "gauge",
61051
+ unit: "%",
61052
+ deadband: 3,
61053
+ minIntervalMs: 6e4
61054
+ },
61055
+ rssiDbm: {
61056
+ kind: "gauge",
61057
+ unit: "dBm",
61058
+ deadband: 2,
61059
+ minIntervalMs: 6e4
61060
+ }
61061
+ } },
60081
61062
  /** Clock fields: written, but excluded from the compare that decides
60082
61063
  * whether persisting is worth a SQLite commit. */
60083
61064
  volatileStateFields: ["lastUpdated"]
@@ -60466,7 +61447,11 @@ onSent: { data: object({
60466
61447
  * See `RuntimeStateDurability`. Enforced by
60467
61448
  * `scripts/check-runtime-state-durability.ts`.
60468
61449
  */
60469
- durability: "session"
61450
+ durability: "session",
61451
+ /**
61452
+ * History (D850): none — `queueDepth` is outbox operational state, not a device trend.
61453
+ */
61454
+ history: "none"
60470
61455
  };
60471
61456
  /**
60472
61457
  * Generic numeric sensor — last-resort fallback when no typed numeric
@@ -60517,6 +61502,14 @@ var numericSensorCapability = {
60517
61502
  * `scripts/check-runtime-state-durability.ts`.
60518
61503
  */
60519
61504
  durability: "restored",
61505
+ /**
61506
+ * History (D850): recorded series. The unit is per device, read from the sibling `unit` field.
61507
+ */
61508
+ history: { fields: { value: {
61509
+ kind: "gauge",
61510
+ unitFrom: "unit",
61511
+ minIntervalMs: 3e4
61512
+ } } },
60520
61513
  /** Clock fields: written, but excluded from the compare that decides
60521
61514
  * whether persisting is worth a SQLite commit. */
60522
61515
  volatileStateFields: ["lastFetchedAt"]
@@ -60947,7 +61940,24 @@ var petFeederCapability = {
60947
61940
  * See `RuntimeStateDurability`. Enforced by
60948
61941
  * `scripts/check-runtime-state-durability.ts`.
60949
61942
  */
60950
- durability: "session"
61943
+ durability: "session",
61944
+ /**
61945
+ * History (D850): recorded series.
61946
+ */
61947
+ history: { fields: {
61948
+ foodLevel: { kind: "gauge" },
61949
+ food1: { kind: "gauge" },
61950
+ food2: { kind: "gauge" },
61951
+ batteryPower: {
61952
+ kind: "gauge",
61953
+ unit: "%",
61954
+ deadband: 2
61955
+ },
61956
+ desiccantLeftDays: {
61957
+ kind: "gauge",
61958
+ unit: "days"
61959
+ }
61960
+ } }
60951
61961
  };
60952
61962
  var VehicleSchema = object({
60953
61963
  id: string(),
@@ -61359,6 +62369,47 @@ var powerMeterCapability = {
61359
62369
  * `scripts/check-runtime-state-durability.ts`.
61360
62370
  */
61361
62371
  durability: "restored",
62372
+ /**
62373
+ * History (D850): recorded series. Gauges are floored at 30 s; `kwhTotal` is the one monotonic meter (counter).
62374
+ */
62375
+ history: { fields: {
62376
+ watts: {
62377
+ kind: "gauge",
62378
+ unit: "W",
62379
+ deadband: 1,
62380
+ minIntervalMs: 3e4
62381
+ },
62382
+ kwhTotal: {
62383
+ kind: "counter",
62384
+ unit: "kWh",
62385
+ deadband: .01,
62386
+ minIntervalMs: 6e4
62387
+ },
62388
+ volts: {
62389
+ kind: "gauge",
62390
+ unit: "V",
62391
+ deadband: 1,
62392
+ minIntervalMs: 3e4
62393
+ },
62394
+ amps: {
62395
+ kind: "gauge",
62396
+ unit: "A",
62397
+ deadband: .05,
62398
+ minIntervalMs: 3e4
62399
+ },
62400
+ va: {
62401
+ kind: "gauge",
62402
+ unit: "VA",
62403
+ deadband: 1,
62404
+ minIntervalMs: 3e4
62405
+ },
62406
+ powerFactor: {
62407
+ kind: "gauge",
62408
+ unit: "ratio",
62409
+ deadband: .01,
62410
+ minIntervalMs: 6e4
62411
+ }
62412
+ } },
61362
62413
  /** Clock fields: written, but excluded from the compare that decides
61363
62414
  * whether persisting is worth a SQLite commit. */
61364
62415
  volatileStateFields: ["lastFetchedAt"]
@@ -61426,6 +62477,14 @@ var presenceCapability = {
61426
62477
  * `scripts/check-runtime-state-durability.ts`.
61427
62478
  */
61428
62479
  durability: "restored",
62480
+ /**
62481
+ * History (D850): recorded series.
62482
+ */
62483
+ history: { fields: { batteryPercent: {
62484
+ kind: "gauge",
62485
+ unit: "%",
62486
+ deadband: 1
62487
+ } } },
61429
62488
  /** Clock fields: written, but excluded from the compare that decides
61430
62489
  * whether persisting is worth a SQLite commit. */
61431
62490
  volatileStateFields: ["lastChangedAt"]
@@ -61472,6 +62531,14 @@ var pressureSensorCapability = {
61472
62531
  * `scripts/check-runtime-state-durability.ts`.
61473
62532
  */
61474
62533
  durability: "restored",
62534
+ /**
62535
+ * History (D850): recorded series.
62536
+ */
62537
+ history: { fields: { hpa: {
62538
+ kind: "gauge",
62539
+ unit: "hPa",
62540
+ deadband: .1
62541
+ } } },
61475
62542
  /** Clock fields: written, but excluded from the compare that decides
61476
62543
  * whether persisting is worth a SQLite commit. */
61477
62544
  volatileStateFields: ["lastFetchedAt"]
@@ -61631,6 +62698,10 @@ var privacyMaskCapability = {
61631
62698
  * `scripts/check-runtime-state-durability.ts`.
61632
62699
  */
61633
62700
  durability: "restored",
62701
+ /**
62702
+ * History (D850): none — configuration.
62703
+ */
62704
+ history: "none",
61634
62705
  /** Clock fields: written, but excluded from the compare that decides
61635
62706
  * whether persisting is worth a SQLite commit. */
61636
62707
  volatileStateFields: ["lastFetchedAt"]
@@ -61992,7 +63063,11 @@ var ptzAutotrackCapability = {
61992
63063
  * See `RuntimeStateDurability`. Enforced by
61993
63064
  * `scripts/check-runtime-state-durability.ts`.
61994
63065
  */
61995
- durability: "session"
63066
+ durability: "session",
63067
+ /**
63068
+ * History (D850): none — configuration and capability.
63069
+ */
63070
+ history: "none"
61996
63071
  };
61997
63072
  DeviceType.Camera, DeviceType.Sensor, DeviceType.Switch, method(object({ deviceId: number().int().nonnegative() }), object({ success: literal(true) }), {
61998
63073
  kind: "mutation",
@@ -63450,6 +64525,10 @@ var recordingOnboardCapability = {
63450
64525
  * `scripts/check-runtime-state-durability.ts`.
63451
64526
  */
63452
64527
  durability: "restored",
64528
+ /**
64529
+ * History (D850): none — SD-card configuration and window inventory; arrays.
64530
+ */
64531
+ history: "none",
63453
64532
  /** Clock fields: written, but excluded from the compare that decides
63454
64533
  * whether persisting is worth a SQLite commit. */
63455
64534
  volatileStateFields: ["lastFetchedAt"]
@@ -63523,7 +64602,11 @@ getStatus: method(object({ deviceId: number() }), RecordingSignalStatusSchema) }
63523
64602
  * See `RuntimeStateDurability`. Enforced by
63524
64603
  * `scripts/check-runtime-state-durability.ts`.
63525
64604
  */
63526
- durability: "session"
64605
+ durability: "session",
64606
+ /**
64607
+ * History (D850): none — recording intent is already in the recordings ledger.
64608
+ */
64609
+ history: "none"
63527
64610
  };
63528
64611
  /**
63529
64612
  * scene-monitor — device-scoped reference-region state cap. An operator marks
@@ -63914,7 +64997,11 @@ var sceneMonitorCapability = {
63914
64997
  * See `RuntimeStateDurability`. Enforced by
63915
64998
  * `scripts/check-runtime-state-durability.ts`.
63916
64999
  */
63917
- durability: "session"
65000
+ durability: "session",
65001
+ /**
65002
+ * History (D850): none — nested configuration.
65003
+ */
65004
+ history: "none"
63918
65005
  };
63919
65006
  /**
63920
65007
  * Per-stage gating mode applied to the zones a rule references.
@@ -64065,7 +65152,11 @@ var scriptRunnerCapability = {
64065
65152
  * See `RuntimeStateDurability`. Enforced by
64066
65153
  * `scripts/check-runtime-state-durability.ts`.
64067
65154
  */
64068
- durability: "session"
65155
+ durability: "session",
65156
+ /**
65157
+ * History (D850): none — transient; run results belong in a ledger.
65158
+ */
65159
+ history: "none"
64069
65160
  };
64070
65161
  /**
64071
65162
  * Smoke alarm sensor — boolean "is smoke currently detected" with
@@ -64100,6 +65191,10 @@ var smokeCapability = {
64100
65191
  * `scripts/check-runtime-state-durability.ts`.
64101
65192
  */
64102
65193
  durability: "restored",
65194
+ /**
65195
+ * History (D850): recorded series.
65196
+ */
65197
+ history: { fields: { detected: { kind: "boolean" } } },
64103
65198
  /** Clock fields: written, but excluded from the compare that decides
64104
65199
  * whether persisting is worth a SQLite commit. */
64105
65200
  volatileStateFields: ["lastChangedAt"]
@@ -64199,6 +65294,10 @@ var streamCatalogCapability = {
64199
65294
  * `scripts/check-runtime-state-durability.ts`.
64200
65295
  */
64201
65296
  durability: "restored",
65297
+ /**
65298
+ * History (D850): none — stream inventory.
65299
+ */
65300
+ history: "none",
64202
65301
  /** Clock field: written, but excluded from the compare that decides whether
64203
65302
  * persisting is worth a SQLite commit — the descriptors are the value. */
64204
65303
  volatileStateFields: ["lastFetchedAt"]
@@ -64348,6 +65447,10 @@ var streamParamsCapability = {
64348
65447
  * `scripts/check-runtime-state-durability.ts`.
64349
65448
  */
64350
65449
  durability: "restored",
65450
+ /**
65451
+ * History (D850): none — encoder configuration.
65452
+ */
65453
+ history: "none",
64351
65454
  /** Clock fields: written, but excluded from the compare that decides
64352
65455
  * whether persisting is worth a SQLite commit. */
64353
65456
  volatileStateFields: ["lastFetchedAt"]
@@ -64403,6 +65506,10 @@ var switchCapability = {
64403
65506
  * `scripts/check-runtime-state-durability.ts`.
64404
65507
  */
64405
65508
  durability: "restored",
65509
+ /**
65510
+ * History (D850): recorded series.
65511
+ */
65512
+ history: { fields: { on: { kind: "boolean" } } },
64406
65513
  /** Clock fields: written, but excluded from the compare that decides
64407
65514
  * whether persisting is worth a SQLite commit. */
64408
65515
  volatileStateFields: ["lastChangedAt"],
@@ -64417,6 +65524,21 @@ var switchCapability = {
64417
65524
  }
64418
65525
  }] }
64419
65526
  };
65527
+ /** C0 controls, DEL and the C1 range: none of them belongs in a name. */
65528
+ function hasControlCharacter(value) {
65529
+ for (const char of value) {
65530
+ const code = char.codePointAt(0) ?? 0;
65531
+ if (code <= 31 || code >= 127 && code <= 159) return true;
65532
+ }
65533
+ return false;
65534
+ }
65535
+ string().transform((value) => value.trim()).pipe(string().min(1, "The server name cannot be empty").max(48, `The server name is at most 48 characters`).refine((value) => !hasControlCharacter(value), { message: "The server name cannot contain control characters" }));
65536
+ /** What every reader gets: the name to show, and whether the hub chose it itself. */
65537
+ var ServerNameInfoSchema = object({
65538
+ name: string(),
65539
+ /** `true` when nobody named the hub: `name` is the machine hostname. */
65540
+ isDefault: boolean()
65541
+ });
64420
65542
  /**
64421
65543
  * system — system-scoped singleton capability exposing hub-level
64422
65544
  * health, feature flags, network interface enumeration, and the
@@ -64446,6 +65568,12 @@ var FeatureManifestSchema = object({
64446
65568
  backup: boolean(),
64447
65569
  repl: boolean()
64448
65570
  });
65571
+ /**
65572
+ * `system.info`: the feature flags plus the hub's human name (D861). The name is
65573
+ * `{ name, isDefault }` — `isDefault: true` means nobody named the hub and `name`
65574
+ * is the machine hostname.
65575
+ */
65576
+ var SystemInfoSchema = FeatureManifestSchema.extend({ serverName: ServerNameInfoSchema });
64449
65577
  var HealthStatusSchema = object({
64450
65578
  status: literal("ok"),
64451
65579
  uptime: number()
@@ -64918,7 +66046,7 @@ var LoggingSettingsStateSchema = object({
64918
66046
  opsLogRetentionDays: number().int().min(0),
64919
66047
  persisted: boolean()
64920
66048
  });
64921
- method(_void(), FeatureManifestSchema), method(_void(), HealthStatusSchema), method(_void(), FeatureManifestSchema), method(_void(), array(NetworkAddressSchema).readonly()), method(_void(), unknown().nullable(), { auth: "admin" }), method(record(string(), unknown()), _null(), {
66049
+ method(_void(), SystemInfoSchema), method(_void(), HealthStatusSchema), method(_void(), FeatureManifestSchema), method(_void(), array(NetworkAddressSchema).readonly()), method(_void(), unknown().nullable(), { auth: "admin" }), method(record(string(), unknown()), _null(), {
64922
66050
  kind: "mutation",
64923
66051
  auth: "admin"
64924
66052
  }), method(_void(), _void(), {
@@ -64964,6 +66092,10 @@ var tamperCapability = {
64964
66092
  * `scripts/check-runtime-state-durability.ts`.
64965
66093
  */
64966
66094
  durability: "restored",
66095
+ /**
66096
+ * History (D850): recorded series.
66097
+ */
66098
+ history: { fields: { tampered: { kind: "boolean" } } },
64967
66099
  /** Clock fields: written, but excluded from the compare that decides
64968
66100
  * whether persisting is worth a SQLite commit. */
64969
66101
  volatileStateFields: ["lastChangedAt"]
@@ -65019,6 +66151,14 @@ var temperatureSensorCapability = {
65019
66151
  * `scripts/check-runtime-state-durability.ts`.
65020
66152
  */
65021
66153
  durability: "restored",
66154
+ /**
66155
+ * History (D850): recorded series.
66156
+ */
66157
+ history: { fields: { celsius: {
66158
+ kind: "gauge",
66159
+ unit: "°C",
66160
+ deadband: .1
66161
+ } } },
65022
66162
  /** Clock fields: written, but excluded from the compare that decides
65023
66163
  * whether persisting is worth a SQLite commit. */
65024
66164
  volatileStateFields: ["lastFetchedAt"]
@@ -65097,7 +66237,11 @@ var updateCapability = {
65097
66237
  * See `RuntimeStateDurability`. Enforced by
65098
66238
  * `scripts/check-runtime-state-durability.ts`.
65099
66239
  */
65100
- durability: "session"
66240
+ durability: "session",
66241
+ /**
66242
+ * History (D850): none — text and state.
66243
+ */
66244
+ history: "none"
65101
66245
  };
65102
66246
  var UserSummarySchema = object({
65103
66247
  id: string(),
@@ -65454,7 +66598,37 @@ var vacuumControlCapability = {
65454
66598
  * See `RuntimeStateDurability`. Enforced by
65455
66599
  * `scripts/check-runtime-state-durability.ts`.
65456
66600
  */
65457
- durability: "session"
66601
+ durability: "session",
66602
+ /**
66603
+ * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
66604
+ */
66605
+ history: { fields: {
66606
+ batteryLevel: {
66607
+ kind: "gauge",
66608
+ unit: "%",
66609
+ deadband: 2
66610
+ },
66611
+ "cleanWater.level": {
66612
+ kind: "gauge",
66613
+ unit: "%",
66614
+ deadband: 2
66615
+ },
66616
+ "dirtyWater.level": {
66617
+ kind: "gauge",
66618
+ unit: "%",
66619
+ deadband: 2
66620
+ },
66621
+ "detergent.level": {
66622
+ kind: "gauge",
66623
+ unit: "%",
66624
+ deadband: 2
66625
+ },
66626
+ "dustBin.level": {
66627
+ kind: "gauge",
66628
+ unit: "%",
66629
+ deadband: 2
66630
+ }
66631
+ } }
65458
66632
  };
65459
66633
  var ValveStatusSchema = object({
65460
66634
  /** Lifecycle state of the valve. */
@@ -65513,7 +66687,15 @@ var valveCapability = {
65513
66687
  * See `RuntimeStateDurability`. Enforced by
65514
66688
  * `scripts/check-runtime-state-durability.ts`.
65515
66689
  */
65516
- durability: "session"
66690
+ durability: "session",
66691
+ /**
66692
+ * History (D850): recorded series. Actuator tier: position keeps every change.
66693
+ */
66694
+ history: { fields: { position: {
66695
+ kind: "gauge",
66696
+ unit: "%",
66697
+ minIntervalMs: 0
66698
+ } } }
65517
66699
  };
65518
66700
  /**
65519
66701
  * Vibration / shake / impact sensor. Drives Home Assistant
@@ -65543,6 +66725,10 @@ var vibrationCapability = {
65543
66725
  * `scripts/check-runtime-state-durability.ts`.
65544
66726
  */
65545
66727
  durability: "restored",
66728
+ /**
66729
+ * History (D850): recorded series.
66730
+ */
66731
+ history: { fields: { detected: { kind: "boolean" } } },
65546
66732
  /** Clock fields: written, but excluded from the compare that decides
65547
66733
  * whether persisting is worth a SQLite commit. */
65548
66734
  volatileStateFields: ["lastChangedAt"]
@@ -65626,7 +66812,22 @@ var waterHeaterCapability = {
65626
66812
  * See `RuntimeStateDurability`. Enforced by
65627
66813
  * `scripts/check-runtime-state-durability.ts`.
65628
66814
  */
65629
- durability: "session"
66815
+ durability: "session",
66816
+ /**
66817
+ * History (D850): recorded series. The schema carries no unit; providers publish Celsius. Setpoint keeps every change.
66818
+ */
66819
+ history: { fields: {
66820
+ currentTemp: {
66821
+ kind: "gauge",
66822
+ unit: "°C",
66823
+ deadband: .5
66824
+ },
66825
+ targetTemp: {
66826
+ kind: "gauge",
66827
+ unit: "°C",
66828
+ minIntervalMs: 0
66829
+ }
66830
+ } }
65630
66831
  };
65631
66832
  /**
65632
66833
  * Weather provider cap. Models HA `weather.*` entities — a read-only
@@ -65692,7 +66893,32 @@ var weatherCapability = {
65692
66893
  * See `RuntimeStateDurability`. Enforced by
65693
66894
  * `scripts/check-runtime-state-durability.ts`.
65694
66895
  */
65695
- durability: "session"
66896
+ durability: "session",
66897
+ /**
66898
+ * History (D850): recorded series. Units follow the sibling `*Unit` fields.
66899
+ */
66900
+ history: { fields: {
66901
+ temperature: {
66902
+ kind: "gauge",
66903
+ unitFrom: "temperatureUnit",
66904
+ deadband: .2
66905
+ },
66906
+ humidity: {
66907
+ kind: "gauge",
66908
+ unit: "%",
66909
+ deadband: 1
66910
+ },
66911
+ pressure: {
66912
+ kind: "gauge",
66913
+ unitFrom: "pressureUnit",
66914
+ deadband: .5
66915
+ },
66916
+ windSpeed: {
66917
+ kind: "gauge",
66918
+ unitFrom: "windSpeedUnit",
66919
+ deadband: .5
66920
+ }
66921
+ } }
65696
66922
  };
65697
66923
  /**
65698
66924
  * Per-zone occupancy aggregation produced by the analytics frame
@@ -65934,7 +67160,11 @@ var zoneAnalyticsCapability = {
65934
67160
  * See `RuntimeStateDurability`. Enforced by
65935
67161
  * `scripts/check-runtime-state-durability.ts`.
65936
67162
  */
65937
- durability: "session"
67163
+ durability: "session",
67164
+ /**
67165
+ * History (D850): none — occupancy is the addon series `pipeline-analytics/occupancy`; the rest is per-zone arrays keyed by runtime ids.
67166
+ */
67167
+ history: "none"
65938
67168
  };
65939
67169
  /**
65940
67170
  * Stages a {@link ZoneRule} can apply to. Discriminator on the rules
@@ -66019,7 +67249,11 @@ var zoneRulesCapability = {
66019
67249
  * See `RuntimeStateDurability`. Enforced by
66020
67250
  * `scripts/check-runtime-state-durability.ts`.
66021
67251
  */
66022
- durability: "restored"
67252
+ durability: "restored",
67253
+ /**
67254
+ * History (D850): none — configuration arrays.
67255
+ */
67256
+ history: "none"
66023
67257
  };
66024
67258
  /**
66025
67259
  * `training-provider` — ONE cloud that can run the CamStack trainer.
@@ -69184,6 +70418,54 @@ Object.freeze({
69184
70418
  addonId: null,
69185
70419
  access: "create"
69186
70420
  },
70421
+ "deviceCredentials.deleteDeviceCredential": {
70422
+ capName: "device-credentials",
70423
+ capScope: "system",
70424
+ addonId: null,
70425
+ access: "delete"
70426
+ },
70427
+ "deviceCredentials.getDeviceCaStatus": {
70428
+ capName: "device-credentials",
70429
+ capScope: "system",
70430
+ addonId: null,
70431
+ access: "view"
70432
+ },
70433
+ "deviceCredentials.getDeviceCertificateSettings": {
70434
+ capName: "device-credentials",
70435
+ capScope: "system",
70436
+ addonId: null,
70437
+ access: "view"
70438
+ },
70439
+ "deviceCredentials.listDeviceCredentials": {
70440
+ capName: "device-credentials",
70441
+ capScope: "system",
70442
+ addonId: null,
70443
+ access: "view"
70444
+ },
70445
+ "deviceCredentials.renameDeviceCredential": {
70446
+ capName: "device-credentials",
70447
+ capScope: "system",
70448
+ addonId: null,
70449
+ access: "create"
70450
+ },
70451
+ "deviceCredentials.revokeDeviceCredential": {
70452
+ capName: "device-credentials",
70453
+ capScope: "system",
70454
+ addonId: null,
70455
+ access: "delete"
70456
+ },
70457
+ "deviceCredentials.setDeviceCertificateSettings": {
70458
+ capName: "device-credentials",
70459
+ capScope: "system",
70460
+ addonId: null,
70461
+ access: "create"
70462
+ },
70463
+ "deviceCredentials.startEnrollment": {
70464
+ capName: "device-credentials",
70465
+ capScope: "system",
70466
+ addonId: null,
70467
+ access: "create"
70468
+ },
69187
70469
  "deviceDiscovery.adoptDevice": {
69188
70470
  capName: "device-discovery",
69189
70471
  capScope: "device",
@@ -69286,6 +70568,66 @@ Object.freeze({
69286
70568
  addonId: null,
69287
70569
  access: "create"
69288
70570
  },
70571
+ "deviceHistory.declareSeries": {
70572
+ capName: "device-history",
70573
+ capScope: "system",
70574
+ addonId: null,
70575
+ access: "create"
70576
+ },
70577
+ "deviceHistory.getDeviceEnabled": {
70578
+ capName: "device-history",
70579
+ capScope: "system",
70580
+ addonId: null,
70581
+ access: "view"
70582
+ },
70583
+ "deviceHistory.getStatus": {
70584
+ capName: "device-history",
70585
+ capScope: "system",
70586
+ addonId: null,
70587
+ access: "view"
70588
+ },
70589
+ "deviceHistory.listNodeSeries": {
70590
+ capName: "device-history",
70591
+ capScope: "system",
70592
+ addonId: null,
70593
+ access: "view"
70594
+ },
70595
+ "deviceHistory.listSeries": {
70596
+ capName: "device-history",
70597
+ capScope: "system",
70598
+ addonId: null,
70599
+ access: "view"
70600
+ },
70601
+ "deviceHistory.query": {
70602
+ capName: "device-history",
70603
+ capScope: "system",
70604
+ addonId: null,
70605
+ access: "view"
70606
+ },
70607
+ "deviceHistory.queryNode": {
70608
+ capName: "device-history",
70609
+ capScope: "system",
70610
+ addonId: null,
70611
+ access: "view"
70612
+ },
70613
+ "deviceHistory.record": {
70614
+ capName: "device-history",
70615
+ capScope: "system",
70616
+ addonId: null,
70617
+ access: "create"
70618
+ },
70619
+ "deviceHistory.recordBuckets": {
70620
+ capName: "device-history",
70621
+ capScope: "system",
70622
+ addonId: null,
70623
+ access: "create"
70624
+ },
70625
+ "deviceHistory.setDeviceEnabled": {
70626
+ capName: "device-history",
70627
+ capScope: "system",
70628
+ addonId: null,
70629
+ access: "create"
70630
+ },
69289
70631
  "deviceManager.addLocation": {
69290
70632
  capName: "device-manager",
69291
70633
  capScope: "system",
@@ -69364,6 +70706,12 @@ Object.freeze({
69364
70706
  addonId: null,
69365
70707
  access: "create"
69366
70708
  },
70709
+ "deviceManager.cleanupDeletedDevicesData": {
70710
+ capName: "device-manager",
70711
+ capScope: "system",
70712
+ addonId: null,
70713
+ access: "create"
70714
+ },
69367
70715
  "deviceManager.createDevice": {
69368
70716
  capName: "device-manager",
69369
70717
  capScope: "system",
@@ -69544,6 +70892,12 @@ Object.freeze({
69544
70892
  addonId: null,
69545
70893
  access: "view"
69546
70894
  },
70895
+ "deviceManager.listDeletedSince": {
70896
+ capName: "device-manager",
70897
+ capScope: "system",
70898
+ addonId: null,
70899
+ access: "view"
70900
+ },
69547
70901
  "deviceManager.listDeviceIdsByCaps": {
69548
70902
  capName: "device-manager",
69549
70903
  capScope: "system",
@@ -69952,6 +71306,18 @@ Object.freeze({
69952
71306
  addonId: null,
69953
71307
  access: "create"
69954
71308
  },
71309
+ "deviceRemovalHook.listDeviceData": {
71310
+ capName: "device-removal-hook",
71311
+ capScope: "system",
71312
+ addonId: null,
71313
+ access: "view"
71314
+ },
71315
+ "deviceRemovalHook.onDeviceRemoved": {
71316
+ capName: "device-removal-hook",
71317
+ capScope: "system",
71318
+ addonId: null,
71319
+ access: "create"
71320
+ },
69955
71321
  "deviceState.claimFields": {
69956
71322
  capName: "device-state",
69957
71323
  capScope: "system",
@@ -70384,6 +71750,12 @@ Object.freeze({
70384
71750
  addonId: null,
70385
71751
  access: "delete"
70386
71752
  },
71753
+ "keychain.deleteDeviceScope": {
71754
+ capName: "keychain",
71755
+ capScope: "system",
71756
+ addonId: null,
71757
+ access: "delete"
71758
+ },
70387
71759
  "keychain.getState": {
70388
71760
  capName: "keychain",
70389
71761
  capScope: "system",
@@ -71344,6 +72716,54 @@ Object.freeze({
71344
72716
  addonId: null,
71345
72717
  access: "create"
71346
72718
  },
72719
+ "nodeCertificates.confirmMeshLeaf": {
72720
+ capName: "node-certificates",
72721
+ capScope: "system",
72722
+ addonId: null,
72723
+ access: "create"
72724
+ },
72725
+ "nodeCertificates.forgetHub": {
72726
+ capName: "node-certificates",
72727
+ capScope: "system",
72728
+ addonId: null,
72729
+ access: "delete"
72730
+ },
72731
+ "nodeCertificates.getCertificates": {
72732
+ capName: "node-certificates",
72733
+ capScope: "system",
72734
+ addonId: null,
72735
+ access: "view"
72736
+ },
72737
+ "nodeCertificates.installHttpsCertificate": {
72738
+ capName: "node-certificates",
72739
+ capScope: "system",
72740
+ addonId: null,
72741
+ access: "create"
72742
+ },
72743
+ "nodeCertificates.installMeshLeaf": {
72744
+ capName: "node-certificates",
72745
+ capScope: "system",
72746
+ addonId: null,
72747
+ access: "create"
72748
+ },
72749
+ "nodeCertificates.prepareHttpsCertificate": {
72750
+ capName: "node-certificates",
72751
+ capScope: "system",
72752
+ addonId: null,
72753
+ access: "create"
72754
+ },
72755
+ "nodeCertificates.prepareMeshRenewal": {
72756
+ capName: "node-certificates",
72757
+ capScope: "system",
72758
+ addonId: null,
72759
+ access: "create"
72760
+ },
72761
+ "nodeCertificates.rollbackMeshLeaf": {
72762
+ capName: "node-certificates",
72763
+ capScope: "system",
72764
+ addonId: null,
72765
+ access: "create"
72766
+ },
71347
72767
  "nodes.clusterAddonStatus": {
71348
72768
  capName: "nodes",
71349
72769
  capScope: "system",
@@ -76035,6 +77455,26 @@ Object.freeze({
76035
77455
  form: "single",
76036
77456
  optional: false
76037
77457
  }],
77458
+ "deviceHistory.getDeviceEnabled": [{
77459
+ name: "deviceId",
77460
+ form: "single",
77461
+ optional: false
77462
+ }],
77463
+ "deviceHistory.listSeries": [{
77464
+ name: "deviceId",
77465
+ form: "single",
77466
+ optional: false
77467
+ }],
77468
+ "deviceHistory.query": [{
77469
+ name: "deviceId",
77470
+ form: "single",
77471
+ optional: false
77472
+ }],
77473
+ "deviceHistory.setDeviceEnabled": [{
77474
+ name: "deviceId",
77475
+ form: "single",
77476
+ optional: false
77477
+ }],
76038
77478
  "deviceManager.adoptionRelease": [{
76039
77479
  name: "camDeviceId",
76040
77480
  form: "single",
@@ -76328,6 +77768,11 @@ Object.freeze({
76328
77768
  form: "single",
76329
77769
  optional: false
76330
77770
  }],
77771
+ "deviceRemovalHook.onDeviceRemoved": [{
77772
+ name: "deviceId",
77773
+ form: "single",
77774
+ optional: false
77775
+ }],
76331
77776
  "deviceState.claimFields": [{
76332
77777
  name: "deviceId",
76333
77778
  form: "single",
@@ -76517,6 +77962,11 @@ Object.freeze({
76517
77962
  form: "single",
76518
77963
  optional: false
76519
77964
  }],
77965
+ "keychain.deleteDeviceScope": [{
77966
+ name: "deviceId",
77967
+ form: "single",
77968
+ optional: false
77969
+ }],
76520
77970
  "lawnMowerControl.dock": [{
76521
77971
  name: "deviceId",
76522
77972
  form: "single",
@@ -78213,6 +79663,7 @@ Object.freeze({
78213
79663
  "network-access": "ingress",
78214
79664
  "smtp-provider": "email"
78215
79665
  });
79666
+ DeviceType.Camera;
78216
79667
  var G711_SCALE_CORRECTION_DB = {
78217
79668
  PCMU: 20 * Math.log10(4),
78218
79669
  PCMA: 20 * Math.log10(8)
@@ -80997,6 +82448,8 @@ function eventKindLabel(kind, locale) {
80997
82448
  const key = kind.trim().toLowerCase();
80998
82449
  return isEventKindLabelKey(key) ? EVENT_KIND_LABELS[key][locale] : kind;
80999
82450
  }
82451
+ AppPageLangSchema.options;
82452
+ record(string().min(1), string());
81000
82453
  /**
81001
82454
  * TimelapseRule — the STANDALONE scheduled timelapse producer's rule model.
81002
82455
  *
@@ -81425,6 +82878,32 @@ function slideInsideFrame(rect, frameWidth, frameHeight) {
81425
82878
  h
81426
82879
  };
81427
82880
  }
82881
+ /** Slider bounds. `0` is "disabled"; anything in 1..9 is raised to `min`. */
82882
+ var FACE_RESCORE_INTERVAL_FIELD = {
82883
+ min: 0,
82884
+ max: 1440,
82885
+ step: 5,
82886
+ default: 60
82887
+ };
82888
+ /**
82889
+ * Narrow a stored value to minutes. `0` ⇒ disabled; a positive value under
82890
+ * {@link FACE_RESCORE_INTERVAL_MIN_RUNNING} is raised to it; junk or absent ⇒
82891
+ * the default (an unreadable setting must not switch the job off nor storm it).
82892
+ */
82893
+ function readFaceRescoreIntervalMinutes(value) {
82894
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0) return FACE_RESCORE_INTERVAL_FIELD.default;
82895
+ if (value === 0) return 0;
82896
+ return Math.min(FACE_RESCORE_INTERVAL_FIELD.max, Math.max(10, Math.floor(value)));
82897
+ }
82898
+ /** The interval out of a hydrated payload; a `null` view (mid-boot) is the default. */
82899
+ function pickFaceRescoreIntervalMinutes(view) {
82900
+ if (view === null) return FACE_RESCORE_INTERVAL_FIELD.default;
82901
+ for (const section of view.sections) for (const entry of section.fields) {
82902
+ if (typeof entry !== "object" || entry === null || !("key" in entry)) continue;
82903
+ if (entry.key === "faceRescoreIntervalMinutes") return readFaceRescoreIntervalMinutes("value" in entry ? entry.value : void 0);
82904
+ }
82905
+ return FACE_RESCORE_INTERVAL_FIELD.default;
82906
+ }
81428
82907
  /**
81429
82908
  * WHICH delivered frames the decode worker retains a native copy of.
81430
82909
  *
@@ -81909,6 +83388,76 @@ function encodeVectorBase64(vector) {
81909
83388
  function vectorDimFromBase64(encoded) {
81910
83389
  return Math.floor(Buffer.from(encoded, "base64").byteLength / 4);
81911
83390
  }
83391
+ /** How often an implementer re-asks for tombstones after its start-up pass. */
83392
+ var REMOVAL_RECONCILE_INTERVAL_MS = 360 * 60 * 1e3;
83393
+ /** One reconcile pass over every tombstone inside the retention window. */
83394
+ async function reconcileRemovedDevices(opts) {
83395
+ const now = opts.now ?? (() => Date.now());
83396
+ const api = opts.api;
83397
+ if (api === void 0) {
83398
+ opts.logger.warn("device removal reconcile skipped — no device-manager api");
83399
+ return {
83400
+ read: false,
83401
+ applied: 0,
83402
+ failed: 0
83403
+ };
83404
+ }
83405
+ let tombstones;
83406
+ try {
83407
+ tombstones = await api.deviceManager.listDeletedSince.query({ sinceMs: now() - DEVICE_TOMBSTONE_RETENTION_MS });
83408
+ } catch (err) {
83409
+ opts.logger.warn("device removal reconcile skipped — tombstones unreadable, nothing deleted", { meta: { error: errMsg(err) } });
83410
+ return {
83411
+ read: false,
83412
+ applied: 0,
83413
+ failed: 0
83414
+ };
83415
+ }
83416
+ let applied = 0;
83417
+ let failed = 0;
83418
+ for (const tombstone of tombstones) try {
83419
+ const result = await opts.remove(tombstone);
83420
+ applied += 1;
83421
+ if (Object.values(result.counts).reduce((sum, n) => sum + n, 0) > 0) opts.logger.info("device removal reconcile cleaned a missed deletion", {
83422
+ tags: { deviceId: tombstone.deviceId },
83423
+ meta: {
83424
+ counts: result.counts,
83425
+ deletedAt: tombstone.deletedAt
83426
+ }
83427
+ });
83428
+ } catch (err) {
83429
+ failed += 1;
83430
+ opts.logger.warn("device removal reconcile failed for a device — retried next pass", {
83431
+ tags: { deviceId: tombstone.deviceId },
83432
+ meta: { error: errMsg(err) }
83433
+ });
83434
+ }
83435
+ return {
83436
+ read: true,
83437
+ applied,
83438
+ failed
83439
+ };
83440
+ }
83441
+ /**
83442
+ * Run the reconcile now and then periodically. Returns the disposer. The timer
83443
+ * is unref'd and a pass never overlaps the previous one.
83444
+ */
83445
+ function armRemovalReconcile(opts) {
83446
+ let running = false;
83447
+ const pass = () => {
83448
+ if (running) return;
83449
+ running = true;
83450
+ reconcileRemovedDevices(opts).catch((err) => {
83451
+ opts.logger.warn("device removal reconcile pass crashed", { meta: { error: errMsg(err) } });
83452
+ }).finally(() => {
83453
+ running = false;
83454
+ });
83455
+ };
83456
+ pass();
83457
+ const timer = setInterval(pass, REMOVAL_RECONCILE_INTERVAL_MS);
83458
+ timer.unref?.();
83459
+ return () => clearInterval(timer);
83460
+ }
81912
83461
  //#endregion
81913
83462
  //#region src/pipeline-analytics/cluster-model-pin.ts
81914
83463
  /**
@@ -82205,4 +83754,4 @@ function buildClipModelRegistry(entries) {
82205
83754
  /** The built-in catalog's registry. */
82206
83755
  var BUILTIN_CLIP_MODELS = buildClipModelRegistry(CLIP_IMAGE_MODELS);
82207
83756
  //#endregion
82208
- export { NC_ALARM_DEFAULT_PROFILE_ID as $, describeSystemEventFamilyProblem as $n, ruleKindOf as $r, RECORDING_EXPORT_MAX_READ_BYTES as $t, EMBEDDING_MODEL_FAILED as A, isDeviceScopedCap as Ai, alarmDeviceSecureOnArm as An, linkedStepOf as Ar, NcConditionsSchema as At, LABEL_SUPPLY_MACRO as B, looseObject as Bi, buildViewerLink as Bn, readTimelapseGeneratedAt as Br, NcSharedSequenceSchema as Bt, DEFAULT_DETAIL_CROP_CONVENTION as C, errMsg as Ci, TrackPuritySchema as Cn, isRetiredClearKey as Cr, NC_TEMPLATE_VARS as Ct, DETECTION_PIPELINE_CAP_NAME as D, customAction as Di, TrackSourceSchema as Dn, isSystemEventSummaryRule as Dr, NcAlarmSensorsSchema as Dt, DETECTION_MACRO_CLASSES as E, createEvent as Ei, TrackSideSchema as En, isSystemDelivery as Er, NcAlarmSensorsInputSchema as Et, EVENT_OWNER_TYPES as F, _enum as Fi, applySecureOnArmEdit as Fn, parseProcStatus as Fr, NcRulePatchSchema as Ft, MAX_ARCHIVED_DEBUG_NOTES as G, strictObject as Gi, coreBlockIdFromAddonId as Gn, resolveModeNotifyPolicy as Gr, NcSystemEventKindSchema as Gt, ListTrackRelationsInputSchema as H, object as Hi, classifyRetrainReview as Hn, resolveClipSearchMinScore as Hr, NcSnoozeSchema as Ht, EXPORT_DENSE_MAX_RANGES as I, array as Ii, assertTimelapseCadences as In, pipelineAnalyticsCapability as Ir, NcRuleSchema as It, MAX_TRACK_PURITIES as J, tuple as Ji, deleteAlarmProfile as Jn, rootSupplyServes as Jr, NcTemplatePreviewSchema as Jt, MAX_BIRTH_DECISION_RECORDS as K, string as Ki, cosineSimilarity as Kn, resolvePoolMemoryPolicy as Kr, NcTaxonomySchema as Kt, FIRST_LEVEL_MACRO_CLASSES as L, boolean as Li, audioMetricsCapability as Ln, plateGalleryCapability as Lr, NcRuleTargetSchema as Lt, EMBEDDING_REQUIREMENTS_UNAVAILABLE as M, normalizeNodeId as Mi, applyBlockingEdit as Mn, memoizePinnedFfmpeg as Mr, NcRuleActionSchema as Mt, EVENT_DENSITY_BATCH_MAX as N, sleep as Ni, applyModeDelaysEdits as Nn, notificationRulesCapability as Nr, NcRuleActionsSchema as Nt, DeclaredDevices as O, defineCustomActions as Oi, activateAlarmProfile as On, isVectorIndexDimConflict as Or, NcAlarmSettingsPatchSchema as Ot, EVENT_KIND_BY_CAP as P, ZodObject as Pi, applyNonBlockingEdit as Pn, occupancyScope as Pr, NcRuleInputSchema as Pt, MotionTriggeredBySchema as Q, describeSystemEventDeliveryProblem as Qn, ruleGroupingApplies as Qr, PoolMemoryWatchdog as Qt, FULL_IMAGE_BBOX as R, discriminatedUnion as Ri, audioModeOf as Rn, readDeviceStateFrom as Rr, NcRuleUpdateInputSchema as Rt, CoverStateSchema as S, DeviceType as Si, TimelapseRuleSchema as Sn, isMediaOwnerType as Sr, NC_TAXONOMY as St, DEFAULT_TIMELAPSE_PREVIEW_TEXT as T, CamProfileSchema as Ti, TrackRelationSchema as Tn, isScheduleActive as Tr, NcAlarmPostTriggeredActionSchema as Tt, ListTrackRelationsResultSchema as U, partialRecord as Ui, cloneAlarmSettings as Un, resolveLocationMode as Ur, NcSnoozeSuppressedSchema as Ut, LabelAttributionSchema as V, number as Vi, calendarEventLocalSpan as Vn, renameAlarmProfile as Vr, NcSnoozeInputSchema as Vt, LockStateSchema as W, record as Wi, consumableLowPercentOf as Wn, resolveModeDelays as Wr, NcStateSummarySectionIdSchema as Wt, MOTION_CLOSE_AFTER_MS as X, unknown as Xi, derivePostTriggeredAction as Xn, ruleBelongsToAlarm as Xr, OPS_LOG_DEFAULT_LIMIT as Xt, MAX_TRACK_RELATIONS as Y, union as Yi, deriveDetailCropRect as Yn, ruleAutoTriggersAlarm as Yr, NcTemplateVarDescriptorSchema as Yt, MediaFileKindEnum as Z, EventCategory as Zi, deriveRecordingMode as Zn, ruleDeviceCompatCapQueries as Zr, OpsLogEntrySchema as Zt, BaseDevice as _, zoneAnalyticsCapability as _i, SetTrackRelationInputSchema as _n, isDetectionMacroClass as _r, NC_GROUPING_MIN_SEC as _t, CLIP_EMBEDDING_STEP_ID as a, subKindsOf as ai, SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX as an, encodeVectorBase64 as ar, NC_ALARM_TRIGGERED_MAX_SEC as at, ClearTrackRelationInputSchema as b, evaluateSensorEdge as bi, TimelapseRuleInputSchema as bn, isKnownTemplateVar as br, NC_SYSTEM_EVENT_KIND_GROUP_SPECS as bt, resolveClusterModelPin as c, systemEventDeliveryProblems as ci, SCENE_DEFAULT_CHECK_INTERVAL_SEC as cn, evictionPolicyOfLocation as cr, NC_CLIP_POST_ROLL_DEFAULT_SEC as ct, APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT as d, systemEventSummaryScheduleOf as di, SCENE_DEFAULT_UNCOVERED_POLICY as dn, gifDeriveSpeed as dr, NC_CONDITION_CATALOG as dt, sceneMonitorCapability as ei, RECORDING_SOURCE_CAMSTACK_ADDON as en, embeddingEncoderCapability as er, NC_ALARM_DEFAULT_TRIGGERED_DURATION_SEC as et, ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT as f, systemEventSummarySplitOf as fi, SCENE_DIVERGED as fn, gifFromMp4Args as fr, NC_CONSUMABLE_LOW_PERCENT_DEFAULT as ft, BIRTH_DECISION_DEFAULT_LIMIT as g, viewerLinkBaseOf as gi, SetTrackPurityResultSchema as gn, isDefaultAlarmProfileId as gr, NC_GROUPING_MAX_SEC as gt, ArchivedDebugNoteSchema as h, vectorDimFromBase64 as hi, SetTrackPurityInputSchema as hn, isAudioClassName as hr, NC_GROUPING_DEFAULT_SEC as ht, CLIP_TEXT_MODELS as i, storageOccupancyCapability as ii, RetrainStatusSchema as in, embeddingRequirementsUnavailableError as ir, NC_ALARM_SYSTEM_EVENT_KINDS as it, EMBEDDING_REQUIREMENTS_FAILED as j, nodePin as ji, alarmPanelCapability as jn, mayWriteToLocation as jr, NcLegacyRuleActionSequenceSchema as jt, DetectionSourceSchema as k, hydrateSchema as ki, addonWidgetsSourceCapability as kn, kebabToCamel as kr, NcConditionDescriptorSchema as kt, APPEARANCE_BIN_COUNT as l, systemEventFamilyProblems as li, SCENE_DEFAULT_OBSERVATION_SPACING_SEC as ln, faceGalleryCapability as lr, NC_CLIP_PRE_ROLL_DEFAULT_SEC as lt, AlarmArmModeSchema as m, templateVarsFor as mi, SceneMonitorSchema as mn, isAppLinkBase as mr, NC_DEFAULT_SNOOZE_MINUTES as mt, DEFAULT_CLIP_MODEL as n, sensorRaisedOf as ni, RetrainDismissedSchema as nn, embeddingRefusalOf as nr, NC_ALARM_DELAY_MAX_SEC as nt, FACE_EMBEDDING_STEP_ID as o, summarizeReview as oi, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as on, ensureAlarmProfiles as or, NC_AUDIO_CONFIRM_HITS_DEFAULT as ot, AUDIO_MACRO_LABELS as p, templateCarriesSummary as pi, SCENE_RESET_RECAPTURES as pn, isAlarmControllableCap as pr, NC_CONSUMABLE_SYSTEM_EVENT_KINDS as pt, MAX_BIRTH_LATENCY_PROXY_MS as q, templateLiteral as qi, createAlarmProfile as qn, retrainRevisionConflictMessage as qr, NcTemplatePreviewInputSchema as qt, CLIP_IMAGE_MODELS as r, servedTemplateVars as ri, RetrainOriginSchema as rn, embeddingRequirementsFailedError as rr, NC_ALARM_NOTIFY_FIELDS as rt, readClusterModelPinStrict as s, syncActiveAlarmProfileSettings as si, SCENE_DEFAULT_ANCHOR_THRESHOLD as sn, eventKindLabel as sr, NC_AUDIO_CONFIRM_WINDOW_SEC_DEFAULT as st, BUILTIN_CLIP_MODELS as t, secureActuationFor as ti, RebuildObjectEmbeddingsRefusalSchema as tn, embeddingModelFailedError as tr, NC_ALARM_DELAY_FIELDS as tt, APPEARANCE_BLOCKS as u, systemEventFilterApplies as ui, SCENE_DEFAULT_QUIET_SECONDS as un, failureContributionCapability as ur, NC_CLIP_RETENTION_MAX_SEC as ut, BirthDecisionRecordSchema as v, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as vi, TIMELAPSE_DENSE_FLOOR_SEC as vn, isEventKindLabelKey as vr, NC_SENSOR_TRANSITION_KINDS as vt, DEFAULT_EVENT_COLOR as w, BaseAddon as wi, TrackRelationKindSchema as wn, isRootSuppliableStepId as wr, NcAlarmConfigSchema as wt, ClearTrackRelationResultSchema as x, isSourceCap as xi, TimelapseRulePatchSchema as xn, isLabelSupplyStepId as xr, NC_TANK_SYSTEM_EVENT_KINDS as xt, COCO_TO_MACRO as y, canonicalHash as yi, TRACK_RELATIONS_DEFAULT_LIMIT as yn, isEventOwnerType as yr, NC_SNOOZE_MAX_MINUTES as yt, FailureCounters as z, literal as zi, buildEventKindDescriptor as zn, readMotionTriggeredBy as zr, NcScheduleSchema as zt };
83757
+ export { MotionTriggeredBySchema as $, union as $i, deriveRecordingMode as $n, ruleAutoTriggersAlarm as $r, PoolMemoryWatchdog as $t, DetectionSourceSchema as A, createEvent as Ai, addonWidgetsSourceCapability as An, isSystemEventSummaryRule as Ar, NcConditionDescriptorSchema as At, FailureCounters as B, array as Bi, audioModeOf as Bn, pipelineAnalyticsCapability as Br, NcScheduleSchema as Bt, CoverStateSchema as C, canonicalHash as Ci, TimelapseRuleSchema as Cn, isKnownTemplateVar as Cr, NC_TAXONOMY as Ct, DETECTION_MACRO_CLASSES as D, errMsg as Di, TrackSideSchema as Dn, isRootSuppliableStepId as Dr, NcAlarmSensorsInputSchema as Dt, DEFAULT_TIMELAPSE_PREVIEW_TEXT as E, DeviceType as Ei, TrackRelationSchema as En, isRetiredClearKey as Er, NcAlarmPostTriggeredActionSchema as Et, EVENT_KIND_BY_CAP as F, nodePin as Fi, applyNonBlockingEdit as Fn, memoizePinnedFfmpeg as Fr, NcRuleInputSchema as Ft, LockStateSchema as G, number as Gi, cloneAlarmSettings as Gn, renameAlarmProfile as Gr, NcStateSummarySectionIdSchema as Gt, LabelAttributionSchema as H, discriminatedUnion as Hi, buildViewerLink as Hn, readDeviceStateFrom as Hr, NcSnoozeInputSchema as Ht, EVENT_OWNER_TYPES as I, normalizeNodeId as Ii, applySecureOnArmEdit as In, notificationRulesCapability as Ir, NcRulePatchSchema as It, MAX_BIRTH_LATENCY_PROXY_MS as J, record as Ji, cosineSimilarity as Jn, resolveModeDelays as Jr, NcTemplatePreviewInputSchema as Jt, MAX_ARCHIVED_DEBUG_NOTES as K, object as Ki, consumableLowPercentOf as Kn, resolveClipSearchMinScore as Kr, NcSystemEventKindSchema as Kt, EXPORT_DENSE_MAX_RANGES as L, sleep as Li, armRemovalReconcile as Ln, occupancyScope as Lr, NcRuleSchema as Lt, EMBEDDING_REQUIREMENTS_FAILED as M, defineCustomActions as Mi, alarmPanelCapability as Mn, kebabToCamel as Mr, NcLegacyRuleActionSequenceSchema as Mt, EMBEDDING_REQUIREMENTS_UNAVAILABLE as N, hydrateSchema as Ni, applyBlockingEdit as Nn, linkedStepOf as Nr, NcRuleActionSchema as Nt, DETECTION_PIPELINE_CAP_NAME as O, BaseAddon as Oi, TrackSourceSchema as On, isScheduleActive as Or, NcAlarmSensorsSchema as Ot, EVENT_DENSITY_BATCH_MAX as P, isDeviceScopedCap as Pi, applyModeDelaysEdits as Pn, mayWriteToLocation as Pr, NcRuleActionsSchema as Pt, MediaFileKindEnum as Q, tuple as Qi, derivePostTriggeredAction as Qn, rootSupplyServes as Qr, OpsLogEntrySchema as Qt, FIRST_LEVEL_MACRO_CLASSES as R, ZodObject as Ri, assertTimelapseCadences as Rn, parseProcStatus as Rr, NcRuleTargetSchema as Rt, ClearTrackRelationResultSchema as S, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as Si, TimelapseRulePatchSchema as Sn, isEventOwnerType as Sr, NC_TANK_SYSTEM_EVENT_KINDS as St, DEFAULT_EVENT_COLOR as T, isSourceCap as Ti, TrackRelationKindSchema as Tn, isMediaOwnerType as Tr, NcAlarmConfigSchema as Tt, ListTrackRelationsInputSchema as U, literal as Ui, calendarEventLocalSpan as Un, readMotionTriggeredBy as Ur, NcSnoozeSchema as Ut, LABEL_SUPPLY_MACRO as V, boolean as Vi, buildEventKindDescriptor as Vn, plateGalleryCapability as Vr, NcSharedSequenceSchema as Vt, ListTrackRelationsResultSchema as W, looseObject as Wi, classifyRetrainReview as Wn, readTimelapseGeneratedAt as Wr, NcSnoozeSuppressedSchema as Wt, MAX_TRACK_RELATIONS as X, string as Xi, deleteAlarmProfile as Xn, resolvePoolMemoryPolicy as Xr, NcTemplateVarDescriptorSchema as Xt, MAX_TRACK_PURITIES as Y, strictObject as Yi, createAlarmProfile as Yn, resolveModeNotifyPolicy as Yr, NcTemplatePreviewSchema as Yt, MOTION_CLOSE_AFTER_MS as Z, templateLiteral as Zi, deriveDetailCropRect as Zn, retrainRevisionConflictMessage as Zr, OPS_LOG_DEFAULT_LIMIT as Zt, BIRTH_DECISION_DEFAULT_LIMIT as _, templateCarriesSummary as _i, SetTrackPurityResultSchema as _n, isAppLinkBase as _r, NC_GROUPING_MAX_SEC as _t, CLIP_EMBEDDING_STEP_ID as a, secureActuationFor as ai, RetrainStatusSchema as an, embeddingRefusalOf as ar, NC_ALARM_SYSTEM_EVENT_KINDS as at, COCO_TO_MACRO as b, viewerLinkBaseOf as bi, TRACK_RELATIONS_DEFAULT_LIMIT as bn, isDetectionMacroClass as br, NC_SNOOZE_MAX_MINUTES as bt, readClusterModelPinStrict as c, storageOccupancyCapability as ci, SCENE_DEFAULT_ANCHOR_THRESHOLD as cn, encodeVectorBase64 as cr, NC_AUDIO_CONFIRM_WINDOW_SEC_DEFAULT as ct, APPEARANCE_BLOCKS as d, syncActiveAlarmProfileSettings as di, SCENE_DEFAULT_QUIET_SECONDS as dn, evictionPolicyOfLocation as dr, NC_CLIP_RETENTION_MAX_SEC as dt, unknown as ea, ruleBelongsToAlarm as ei, RECORDING_EXPORT_MAX_READ_BYTES as en, describeSystemEventDeliveryProblem as er, NC_ALARM_DEFAULT_PROFILE_ID as et, APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT as f, systemEventDeliveryProblems as fi, SCENE_DEFAULT_UNCOVERED_POLICY as fn, faceGalleryCapability as fr, NC_CONDITION_CATALOG as ft, ArchivedDebugNoteSchema as g, systemEventSummarySplitOf as gi, SetTrackPurityInputSchema as gn, isAlarmControllableCap as gr, NC_GROUPING_DEFAULT_SEC as gt, AlarmArmModeSchema as h, systemEventSummaryScheduleOf as hi, SceneMonitorSchema as hn, gifFromMp4Args as hr, NC_DEFAULT_SNOOZE_MINUTES as ht, CLIP_TEXT_MODELS as i, sceneMonitorCapability as ii, RetrainOriginSchema as in, embeddingModelFailedError as ir, NC_ALARM_NOTIFY_FIELDS as it, EMBEDDING_MODEL_FAILED as j, customAction as ji, alarmDeviceSecureOnArm as jn, isVectorIndexDimConflict as jr, NcConditionsSchema as jt, DeclaredDevices as k, CamProfileSchema as ki, activateAlarmProfile as kn, isSystemDelivery as kr, NcAlarmSettingsPatchSchema as kt, resolveClusterModelPin as l, subKindsOf as li, SCENE_DEFAULT_CHECK_INTERVAL_SEC as ln, ensureAlarmProfiles as lr, NC_CLIP_POST_ROLL_DEFAULT_SEC as lt, AUDIO_MACRO_LABELS as m, systemEventFilterApplies as mi, SCENE_RESET_RECAPTURES as mn, gifDeriveSpeed as mr, NC_CONSUMABLE_SYSTEM_EVENT_KINDS as mt, DEFAULT_CLIP_MODEL as n, ruleGroupingApplies as ni, RebuildObjectEmbeddingsRefusalSchema as nn, deviceRemovalHookCapability as nr, NC_ALARM_DELAY_FIELDS as nt, CLUSTER_MODEL_OWNER_ADDON_ID as o, sensorRaisedOf as oi, SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX as on, embeddingRequirementsFailedError as or, NC_ALARM_TRIGGERED_MAX_SEC as ot, ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT as p, systemEventFamilyProblems as pi, SCENE_DIVERGED as pn, failureContributionCapability as pr, NC_CONSUMABLE_LOW_PERCENT_DEFAULT as pt, MAX_BIRTH_DECISION_RECORDS as q, partialRecord as qi, coreBlockIdFromAddonId as qn, resolveLocationMode as qr, NcTaxonomySchema as qt, CLIP_IMAGE_MODELS as r, ruleKindOf as ri, RetrainDismissedSchema as rn, embeddingEncoderCapability as rr, NC_ALARM_DELAY_MAX_SEC as rt, FACE_EMBEDDING_STEP_ID as s, servedTemplateVars as si, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as sn, embeddingRequirementsUnavailableError as sr, NC_AUDIO_CONFIRM_HITS_DEFAULT as st, BUILTIN_CLIP_MODELS as t, EventCategory as ta, ruleDeviceCompatCapQueries as ti, RECORDING_SOURCE_CAMSTACK_ADDON as tn, describeSystemEventFamilyProblem as tr, NC_ALARM_DEFAULT_TRIGGERED_DURATION_SEC as tt, APPEARANCE_BIN_COUNT as u, summarizeReview as ui, SCENE_DEFAULT_OBSERVATION_SPACING_SEC as un, eventKindLabel as ur, NC_CLIP_PRE_ROLL_DEFAULT_SEC as ut, BaseDevice as v, templateVarsFor as vi, SetTrackRelationInputSchema as vn, isAudioClassName as vr, NC_GROUPING_MIN_SEC as vt, DEFAULT_DETAIL_CROP_CONVENTION as w, evaluateSensorEdge as wi, TrackPuritySchema as wn, isLabelSupplyStepId as wr, NC_TEMPLATE_VARS as wt, ClearTrackRelationInputSchema as x, zoneAnalyticsCapability as xi, TimelapseRuleInputSchema as xn, isEventKindLabelKey as xr, NC_SYSTEM_EVENT_KIND_GROUP_SPECS as xt, BirthDecisionRecordSchema as y, vectorDimFromBase64 as yi, TIMELAPSE_DENSE_FLOOR_SEC as yn, isDefaultAlarmProfileId as yr, NC_SENSOR_TRANSITION_KINDS as yt, FULL_IMAGE_BBOX as z, _enum as zi, audioMetricsCapability as zn, pickFaceRescoreIntervalMinutes as zr, NcRuleUpdateInputSchema as zt };