@camstack/addon-post-analysis 1.2.369 → 1.2.371

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-C_-tWzrX.mjs → clip-model-registry-DnJSHCsn.mjs} +1620 -51
  2. package/dist/{clip-model-registry-E4CGZ8NR.js → clip-model-registry-aWakBGm3.js} +1643 -50
  3. package/dist/embedding-encoder/index.js +13 -2
  4. package/dist/embedding-encoder/index.mjs +13 -2
  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-DzBqyp65.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-CYfz4e5v.mjs +26 -0
  9. package/dist/pipeline-analytics/{hostInit-CMFNXHOl.mjs → hostInit-B83y5X7G.mjs} +3 -3
  10. package/dist/pipeline-analytics/index.js +3158 -2001
  11. package/dist/pipeline-analytics/index.mjs +3189 -2032
  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
@@ -12873,11 +12893,10 @@ var ClipModelMetaSchema = object({
12873
12893
  /**
12874
12894
  * The `vector-store` index this model's vectors live in. ONE feature space
12875
12895
  * per index: two models share an index only when their vectors are ranked
12876
- * against each other, which for CLIP means never across families. MobileCLIP
12877
- * S1 and S2 share `object-clip` for history (separated by the row's
12878
- * `modelId`); any other model gets its own.
12896
+ * against each other, which for CLIP means never across families. Every
12897
+ * model gets its own.
12879
12898
  */
12880
- vectorIndex: string().regex(/^object-clip(-[a-z0-9][a-z0-9-]*)?$/),
12899
+ vectorIndex: string().regex(/^object-clip-[a-z0-9][a-z0-9-]*$/),
12881
12900
  /**
12882
12901
  * The text encoder's tokenizer, a declared SIBLING file of its onnx. The name
12883
12902
  * must be unique per tokenizer: every model's siblings land in ONE flat
@@ -13405,6 +13424,177 @@ var ConvertResultSchema = object({
13405
13424
  files: array(string()).readonly()
13406
13425
  })).readonly()
13407
13426
  });
13427
+ _enum(["new-session", "step-up"]);
13428
+ /** The languages the hub's app landing pages are written in (D858). */
13429
+ var AppPageLangSchema = _enum(["en", "it"]);
13430
+ /** How a native app starts one login method (D858), as `auth.listLoginMethods` reports it. */
13431
+ var AppLoginPathSchema = discriminatedUnion("kind", [object({ kind: literal("native") }), object({
13432
+ kind: literal("browser"),
13433
+ startPath: string().startsWith("/")
13434
+ })]);
13435
+ /**
13436
+ * Device certificates (D855) — the wire contract shared by the hub, the admin
13437
+ * UI and the native viewer.
13438
+ *
13439
+ * A device (a phone) generates its OWN P-256 key pair in hardware (Secure
13440
+ * Enclave / Android Keystore / a non-extractable WebCrypto key). The private
13441
+ * key never travels. The hub signs the PUBLIC key into an X.509 leaf under a
13442
+ * dedicated device CA; the device later proves possession of the key by
13443
+ * signing a hub-issued nonce, and the hub answers with the same session a
13444
+ * password login opens.
13445
+ *
13446
+ * Everything on the wire is a small string (a PEM, a base64url signature):
13447
+ * D613 is about bulk bytes, and a certificate is ~600 bytes.
13448
+ */
13449
+ /** Signature algorithm of every device credential: ECDSA, curve P-256, SHA-256. */
13450
+ var DEVICE_CERT_SIGNATURE = "ecdsa-p256-sha256";
13451
+ /** First line of every signed message; a change of format bumps the version. */
13452
+ var DEVICE_SIGNATURE_MESSAGE_VERSION = "camstack-device-cert-v1";
13453
+ _enum([
13454
+ "login",
13455
+ "renew",
13456
+ "revoke"
13457
+ ]);
13458
+ var DevicePlatformSchema = _enum([
13459
+ "ios",
13460
+ "android",
13461
+ "web",
13462
+ "other"
13463
+ ]);
13464
+ var Base64UrlSchema = string().min(1).max(4096).regex(/^[A-Za-z0-9_-]+$/);
13465
+ var PemSchema = string().min(1).max(16384);
13466
+ /**
13467
+ * Why a device-certificate endpoint said no. Distinct from a transport / 5xx
13468
+ * failure: those carry no reason and mean "try again", never "the credential is
13469
+ * dead". The viewer switches on this exhaustively.
13470
+ */
13471
+ var DeviceRefusalReasonSchema = _enum([
13472
+ "revoked",
13473
+ "unknown-credential",
13474
+ "expired",
13475
+ "bad-signature",
13476
+ "nonce-invalid",
13477
+ "rate-limited",
13478
+ "invalid-certificate",
13479
+ "superseded",
13480
+ "user-gone",
13481
+ "unavailable",
13482
+ "code-invalid",
13483
+ "self-enrollment-disabled",
13484
+ "step-up-required",
13485
+ "bad-public-key"
13486
+ ]);
13487
+ var DeviceRefusalSchema = object({
13488
+ ok: literal(false),
13489
+ reason: DeviceRefusalReasonSchema,
13490
+ definitive: boolean(),
13491
+ retryAfterSeconds: number().optional()
13492
+ });
13493
+ object({
13494
+ code: string().min(1).max(256),
13495
+ /** SubjectPublicKeyInfo DER of the device's P-256 public key, base64url. */
13496
+ publicKeySpki: Base64UrlSchema,
13497
+ deviceName: string().min(1).max(80).optional(),
13498
+ platform: DevicePlatformSchema
13499
+ });
13500
+ discriminatedUnion("ok", [object({
13501
+ credentialId: string(),
13502
+ certPem: PemSchema,
13503
+ /** The device CA certificate the leaf chains to. */
13504
+ chainPem: PemSchema,
13505
+ notAfter: number(),
13506
+ user: object({
13507
+ id: string(),
13508
+ username: string()
13509
+ })
13510
+ }).extend({ ok: literal(true) }), DeviceRefusalSchema]);
13511
+ object({
13512
+ /** The single-use step-up proof (`auth.deviceEnrollProofFrom…`). */
13513
+ proof: string().min(1).max(512),
13514
+ publicKeySpki: Base64UrlSchema,
13515
+ deviceName: string().min(1).max(80),
13516
+ platform: DevicePlatformSchema
13517
+ });
13518
+ object({
13519
+ proof: string(),
13520
+ expiresAt: number()
13521
+ });
13522
+ discriminatedUnion("ok", [object({
13523
+ nonce: string(),
13524
+ /** The origin to put in the signed message. The app compares it to the hub it dialled. */
13525
+ origin: string(),
13526
+ expiresAt: number(),
13527
+ signature: literal(DEVICE_CERT_SIGNATURE)
13528
+ }).extend({ ok: literal(true) }), DeviceRefusalSchema]);
13529
+ object({
13530
+ certPem: PemSchema,
13531
+ nonce: string().min(1).max(256),
13532
+ /** ECDSA P-256 SHA-256 over {@link buildDeviceSignatureMessage}; raw r||s or DER, base64url. */
13533
+ signature: Base64UrlSchema
13534
+ });
13535
+ discriminatedUnion("ok", [object({
13536
+ credentialId: string(),
13537
+ certPem: PemSchema,
13538
+ chainPem: PemSchema,
13539
+ notAfter: number()
13540
+ }).extend({ ok: literal(true) }), DeviceRefusalSchema]);
13541
+ discriminatedUnion("ok", [object({
13542
+ ok: literal(true),
13543
+ credentialId: string(),
13544
+ sessionsEnded: number().int()
13545
+ }), DeviceRefusalSchema]);
13546
+ var DeviceCredentialStatusSchema = _enum([
13547
+ "active",
13548
+ "expired",
13549
+ "revoked"
13550
+ ]);
13551
+ var DeviceCredentialSchema = object({
13552
+ id: string(),
13553
+ userId: string(),
13554
+ username: string().nullable(),
13555
+ deviceName: string(),
13556
+ platform: DevicePlatformSchema,
13557
+ enrolledVia: _enum(["qr", "self"]),
13558
+ /** SHA-256 of the leaf certificate DER, colon-hex. */
13559
+ fingerprint: string(),
13560
+ issuedAt: number(),
13561
+ expiresAt: number(),
13562
+ lastUsedAt: number().nullable(),
13563
+ lastUsedFrom: string().nullable(),
13564
+ revokedAt: number().nullable(),
13565
+ /** `admin:<userId>` | `user:<userId>` | `device` | `user-deleted`. */
13566
+ revokedBy: string().nullable(),
13567
+ status: DeviceCredentialStatusSchema
13568
+ });
13569
+ var StartEnrollmentOutputSchema = object({
13570
+ /** Shown once; only its hash is kept. */
13571
+ code: string(),
13572
+ expiresAt: number(),
13573
+ /** `camstack://enroll?hub=…&code=…` — what the QR encodes. */
13574
+ enrollUrl: string(),
13575
+ /** The hub origin in the link, or `null` when the hub could not name one (the link then has no `hub`). */
13576
+ hubOrigin: string().nullable(),
13577
+ /** Every origin the apps may try (role `appConnections`). */
13578
+ hubOrigins: array(string())
13579
+ });
13580
+ object({
13581
+ kind: literal("device-certificate"),
13582
+ id: literal("device-certificate"),
13583
+ label: string(),
13584
+ stage: literal("primary"),
13585
+ /** tRPC paths under the hub's `auth` router, so a client names no literal. */
13586
+ challengePath: literal("auth.getDeviceChallenge"),
13587
+ revokePath: literal("auth.revokeOwnDeviceCertificate"),
13588
+ enrollSelfPath: literal("auth.enrollSelf"),
13589
+ loginPath: literal("auth.loginWithDeviceCertificate"),
13590
+ renewPath: literal("auth.renewDeviceCertificate"),
13591
+ signature: literal(DEVICE_CERT_SIGNATURE),
13592
+ messageVersion: literal(DEVICE_SIGNATURE_MESSAGE_VERSION),
13593
+ /** Which clients can execute it: a native app silently, a browser with a non-extractable WebCrypto key. */
13594
+ clients: array(_enum(["native", "web"])),
13595
+ /** The app executes it itself, silently (D858). */
13596
+ app: AppLoginPathSchema.nullable()
13597
+ });
13408
13598
  var ExpressionBindingSourceSchema = union([
13409
13599
  object({
13410
13600
  kind: literal("field").optional(),
@@ -13733,7 +13923,9 @@ var ConfigTabDeclarationSchema = object({
13733
13923
  var ConfigSectionWithValuesSchema = object({
13734
13924
  id: string(),
13735
13925
  title: string(),
13926
+ titleKey: string().optional(),
13736
13927
  description: string().optional(),
13928
+ descriptionKey: string().optional(),
13737
13929
  style: _enum(["card", "accordion"]).optional(),
13738
13930
  defaultCollapsed: boolean().optional(),
13739
13931
  columns: union([
@@ -16248,7 +16440,11 @@ var cameraStreamsCapability = {
16248
16440
  * See `RuntimeStateDurability`. Enforced by
16249
16441
  * `scripts/check-runtime-state-durability.ts`.
16250
16442
  */
16251
- durability: "session"
16443
+ durability: "session",
16444
+ /**
16445
+ * History (D850): none — `online` duplicates device-status.online (one authority); slot data is nested enum/string.
16446
+ */
16447
+ history: "none"
16252
16448
  };
16253
16449
  /** kebab-case cap name → camelCase router-map key. */
16254
16450
  function kebabToCamel(s) {
@@ -17091,7 +17287,345 @@ method(object({
17091
17287
  }), method(object({ refs: RefListSchema }), KeychainResolveResultSchema, { auth: "admin" }), method(object({ refs: RefListSchema }), object({ deleted: number().int() }), {
17092
17288
  kind: "mutation",
17093
17289
  auth: "admin"
17290
+ }), method(object({ deviceId: number().int() }), object({ refs: array(string()).readonly() }), {
17291
+ kind: "mutation",
17292
+ auth: "admin"
17094
17293
  }), method(object({}), array(KeychainSecretMetaSchema).readonly(), { auth: "admin" }), method(object({}), KeychainStateSchema, { auth: "admin" });
17294
+ /**
17295
+ * device-history — the ONE mechanism for numeric history (D850).
17296
+ *
17297
+ * A device value is recorded because its capability says so (the `history`
17298
+ * block of a `*.cap.ts`, captured hub-side from `DeviceStateChanged`); any
17299
+ * other series is DECLARED by the addon that produces it and fed with points
17300
+ * (`record`) or closed five-minute buckets (`recordBuckets`). Rollups 5m / 1h /
17301
+ * 1d are computed here and nowhere else. Storage is `history.db` (D851).
17302
+ *
17303
+ * Who the PRODUCER is: `declareSeries`, `record` and `recordBuckets` are owner
17304
+ * checked against the `callerAddonId` the transport stamps into a call that
17305
+ * crossed a process (never in an input schema, so a session cannot supply it).
17306
+ * A call with no stamp is refused `not-owner`. The methods are `admin` so a
17307
+ * non-admin session never reaches them; an addon's `ctx.api` call bypasses the
17308
+ * tier by design.
17309
+ */
17310
+ /** Whose history: a real device, or a cluster node (load, memory). */
17311
+ var DeviceHistorySubjectSchema = discriminatedUnion("kind", [object({
17312
+ kind: literal("device"),
17313
+ deviceId: number().int()
17314
+ }), object({
17315
+ kind: literal("node"),
17316
+ nodeId: string().min(1)
17317
+ })]);
17318
+ var DeviceHistoryKindSchema = _enum([
17319
+ "gauge",
17320
+ "counter",
17321
+ "boolean"
17322
+ ]);
17323
+ var DeviceHistoryResolutionSchema = _enum([
17324
+ "raw",
17325
+ "5m",
17326
+ "1h",
17327
+ "1d"
17328
+ ]);
17329
+ /** Why a producer's point or bucket was not stored. Counted, never silent (D391). */
17330
+ var DeviceHistoryRefusalReasonSchema = _enum([
17331
+ "undeclared",
17332
+ "not-owner",
17333
+ "opted-out",
17334
+ "not-a-real-device",
17335
+ "rate",
17336
+ "ingest-mismatch",
17337
+ "out-of-range"
17338
+ ]);
17339
+ var RefusalSchema = object({
17340
+ key: string(),
17341
+ reason: DeviceHistoryRefusalReasonSchema,
17342
+ count: number().int()
17343
+ });
17344
+ var IngestResultSchema = object({
17345
+ accepted: number().int(),
17346
+ refused: array(RefusalSchema).readonly()
17347
+ });
17348
+ var SeriesInfoSchema = object({
17349
+ key: string(),
17350
+ scope: string(),
17351
+ kind: DeviceHistoryKindSchema,
17352
+ /** `null` is unknown (a `unitFrom` series whose device does not state a unit right now), never a guess. */
17353
+ unit: string().nullable(),
17354
+ displayName: string(),
17355
+ source: _enum(["cap", "addon"]),
17356
+ firstTs: number(),
17357
+ lastTs: number()
17358
+ });
17359
+ var QueryPointSchema = object({
17360
+ /** Raw: the point's time. Rollup: the bucket start. */
17361
+ t: number(),
17362
+ samples: number().int(),
17363
+ /** `sum / samples`. */
17364
+ mean: number().nullable(),
17365
+ /** Time-weighted mean (`tw_sum / tw_ms`); `null` for bucket-ingested series. For a boolean: the fraction of time true. */
17366
+ twMean: number().nullable(),
17367
+ min: number(),
17368
+ max: number(),
17369
+ /** `null` is unknown, never zero (D393). */
17370
+ last: number().nullable()
17371
+ });
17372
+ var QuerySeriesSchema = object({
17373
+ scope: string(),
17374
+ /** The last point STRICTLY BEFORE `from` in the chosen tier, so a step chart can start at the held value. */
17375
+ before: object({
17376
+ t: number(),
17377
+ value: number().nullable()
17378
+ }).nullable(),
17379
+ points: array(QueryPointSchema).readonly()
17380
+ });
17381
+ /** The window part of a query, shared by the device and node forms. */
17382
+ var QueryWindowShape = {
17383
+ key: string(),
17384
+ scope: string().optional(),
17385
+ from: number(),
17386
+ to: number(),
17387
+ resolution: union([DeviceHistoryResolutionSchema, literal("auto")]).default("auto"),
17388
+ maxPoints: number().int().positive().max(5e3).default(1e3)
17389
+ };
17390
+ var QueryResultSchema = object({
17391
+ resolution: DeviceHistoryResolutionSchema,
17392
+ series: array(QuerySeriesSchema).readonly(),
17393
+ truncated: boolean()
17394
+ });
17395
+ var TierStatusSchema = object({
17396
+ tier: DeviceHistoryResolutionSchema,
17397
+ /** `null` until the first background count answered. */
17398
+ rows: number().int().nullable(),
17399
+ /** `rows` times a fixed per-row estimate — approximate, labelled so. */
17400
+ approxBytes: number().nullable(),
17401
+ countedAt: number().nullable()
17402
+ });
17403
+ /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17404
+ var DeviceHistoryStatusSchema = object({
17405
+ startedAt: number(),
17406
+ /** The store is declared, series loaded and the first reconcile has answered. */
17407
+ ready: boolean(),
17408
+ series: number().int(),
17409
+ metrics: number().int(),
17410
+ optedOutDevices: number().int(),
17411
+ tiers: array(TierStatusSchema).readonly(),
17412
+ capture: object({
17413
+ eventsSeen: number().int(),
17414
+ pointsEmitted: number().int(),
17415
+ pointsWritten: number().int(),
17416
+ pointsDropped: number().int(),
17417
+ bufferDepth: number().int(),
17418
+ trailingEmitted: number().int(),
17419
+ reconciledPoints: number().int(),
17420
+ reconcileRuns: number().int(),
17421
+ reconcileFailures: number().int(),
17422
+ lastReconcileAt: number().nullable(),
17423
+ lastFlushAt: number().nullable(),
17424
+ flushFailures: number().int(),
17425
+ skipped: record(string(), number().int())
17426
+ }),
17427
+ ingest: object({
17428
+ accepted: number().int(),
17429
+ refused: record(string(), number().int())
17430
+ }),
17431
+ rollup: object({
17432
+ last5mAt: number().nullable(),
17433
+ last1hAt: number().nullable(),
17434
+ last1dAt: number().nullable(),
17435
+ errors: number().int(),
17436
+ dirty5m: number().int(),
17437
+ dirty1h: number().int(),
17438
+ dirty1d: number().int()
17439
+ }),
17440
+ retention: object({
17441
+ lastRunAt: number().nullable(),
17442
+ deleted: record(string(), number().int()),
17443
+ purgedSeries: number().int()
17444
+ }),
17445
+ directory: object({
17446
+ devices: number().int(),
17447
+ lastRefreshAt: number().nullable()
17448
+ })
17449
+ });
17450
+ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ nodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
17451
+ deviceId: number().int(),
17452
+ ...QueryWindowShape
17453
+ }), QueryResultSchema), method(object({
17454
+ nodeId: string().min(1),
17455
+ ...QueryWindowShape
17456
+ }), QueryResultSchema, { auth: "admin" }), method(object({
17457
+ name: string().regex(/^[a-z0-9-]+$/),
17458
+ subjectKind: _enum(["device", "node"]),
17459
+ kind: DeviceHistoryKindSchema,
17460
+ unit: string().optional(),
17461
+ displayName: string().min(1),
17462
+ ingest: _enum(["points", "buckets"])
17463
+ }), object({ key: string() }), {
17464
+ kind: "mutation",
17465
+ auth: "admin"
17466
+ }), method(object({ points: array(object({
17467
+ key: string(),
17468
+ subject: DeviceHistorySubjectSchema,
17469
+ scope: string().default(""),
17470
+ ts: number(),
17471
+ value: number()
17472
+ })).max(5e3) }), IngestResultSchema, {
17473
+ kind: "mutation",
17474
+ auth: "admin"
17475
+ }), method(object({ buckets: array(object({
17476
+ key: string(),
17477
+ subject: DeviceHistorySubjectSchema,
17478
+ scope: string().default(""),
17479
+ bucketStart: number(),
17480
+ samples: number().int().positive(),
17481
+ sum: number(),
17482
+ min: number(),
17483
+ max: number(),
17484
+ last: number().nullable(),
17485
+ lastTs: number().nullable()
17486
+ })).max(5e3) }), IngestResultSchema, {
17487
+ kind: "mutation",
17488
+ auth: "admin"
17489
+ }), method(object({ deviceId: number().int() }), object({ enabled: boolean() })), method(object({
17490
+ deviceId: number().int(),
17491
+ enabled: boolean()
17492
+ }), object({ enabled: boolean() }), {
17493
+ kind: "mutation",
17494
+ auth: "admin"
17495
+ }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17496
+ var DeviceCaStatusSchema = discriminatedUnion("state", [
17497
+ object({ state: literal("absent") }),
17498
+ object({
17499
+ state: literal("ready"),
17500
+ subject: string(),
17501
+ fingerprintSha256: string(),
17502
+ validTo: string()
17503
+ }),
17504
+ object({
17505
+ state: literal("unavailable"),
17506
+ reason: string()
17507
+ })
17508
+ ]);
17509
+ var DeviceCertificateSettingsSchema = object({ selfEnrollment: _enum(["allowed", "disabled"]) });
17510
+ method(object({
17511
+ userId: string().min(1).optional(),
17512
+ includeRevoked: boolean().default(false)
17513
+ }), array(DeviceCredentialSchema).readonly(), { auth: "admin" }), method(object({
17514
+ userId: string().min(1),
17515
+ deviceName: string().min(1).max(80)
17516
+ }), StartEnrollmentOutputSchema, {
17517
+ kind: "mutation",
17518
+ auth: "admin",
17519
+ caller: "required"
17520
+ }), method(object({ id: string().min(1) }), object({
17521
+ revoked: boolean(),
17522
+ sessionsEnded: number().int(),
17523
+ status: DeviceCredentialStatusSchema
17524
+ }), {
17525
+ kind: "mutation",
17526
+ auth: "admin",
17527
+ caller: "required"
17528
+ }), method(object({}), DeviceCertificateSettingsSchema, { auth: "admin" }), method(DeviceCertificateSettingsSchema, DeviceCertificateSettingsSchema, {
17529
+ kind: "mutation",
17530
+ auth: "admin"
17531
+ }), method(object({ id: string().min(1) }), object({ result: _enum([
17532
+ "deleted",
17533
+ "live",
17534
+ "unknown"
17535
+ ]) }), {
17536
+ kind: "mutation",
17537
+ auth: "admin",
17538
+ caller: "required"
17539
+ }), method(object({}), DeviceCaStatusSchema, { auth: "admin" }), method(object({
17540
+ id: string().min(1),
17541
+ deviceName: string().min(1).max(80)
17542
+ }), object({ renamed: boolean() }), {
17543
+ kind: "mutation",
17544
+ auth: "admin"
17545
+ });
17546
+ /**
17547
+ * `node-certificates` - what a node holds and the two renewals the hub drives
17548
+ * (D856): the node's MESH leaf (mutual TLS to the hub) and its HTTPS leaf (issued
17549
+ * from the hub's local CA so a device that trusts the hub root trusts the node).
17550
+ *
17551
+ * Provided by the AGENT RUNTIME (the synthetic `agent-runtime` addon id, like
17552
+ * `server-management`): the hub reaches it through the ordinary node-pinned
17553
+ * capability call - no new Moleculer action. The hub's own certificates are
17554
+ * handled in-process by the hub (`certificates` router), so this cap has no hub
17555
+ * provider.
17556
+ *
17557
+ * No private key ever crosses the mesh: the node generates its key pair, sends a
17558
+ * CSR, and the hub returns only the signed certificate.
17559
+ */
17560
+ var MeshLeafInfoSchema = object({
17561
+ cn: string(),
17562
+ serial: string(),
17563
+ fingerprintSha256: string(),
17564
+ notBefore: number(),
17565
+ notAfter: number()
17566
+ });
17567
+ var HttpsLeafInfoSchema = object({
17568
+ fingerprintSha256: string(),
17569
+ issuer: string(),
17570
+ sans: array(string()),
17571
+ notBefore: number(),
17572
+ notAfter: number()
17573
+ });
17574
+ var NodeHttpsStateSchema = discriminatedUnion("state", [object({
17575
+ state: literal("served"),
17576
+ leaf: HttpsLeafInfoSchema
17577
+ }), object({
17578
+ state: literal("not-issued"),
17579
+ reason: string()
17580
+ })]);
17581
+ method(object({}), object({
17582
+ nodeId: string(),
17583
+ mesh: MeshLeafInfoSchema.nullable(),
17584
+ https: NodeHttpsStateSchema
17585
+ }), { auth: "admin" }), method(object({}), object({ csrPem: string() }), {
17586
+ kind: "mutation",
17587
+ auth: "admin"
17588
+ }), method(object({
17589
+ certPem: string().min(1),
17590
+ caCertPem: string().min(1),
17591
+ confirmWithinMs: number().int().min(1e4).max(6e5)
17592
+ }), object({
17593
+ fingerprintSha256: string(),
17594
+ serial: string()
17595
+ }), {
17596
+ kind: "mutation",
17597
+ auth: "admin"
17598
+ }), method(object({ fingerprintSha256: string() }), object({ confirmed: boolean() }), {
17599
+ kind: "mutation",
17600
+ auth: "admin"
17601
+ }), method(object({}), object({ rolledBack: boolean() }), {
17602
+ kind: "mutation",
17603
+ auth: "admin"
17604
+ }), method(object({}), object({
17605
+ csrPem: string(),
17606
+ hostnames: array(string()),
17607
+ addresses: array(string()),
17608
+ /** SHA-256 of the hub local CA this node pinned at its first install; `null` before one. */
17609
+ pinnedCaFingerprintSha256: string().nullable()
17610
+ }), {
17611
+ kind: "mutation",
17612
+ auth: "admin"
17613
+ }), method(object({}), object({ ok: literal(true) }), {
17614
+ kind: "mutation",
17615
+ auth: "admin"
17616
+ }), method(object({
17617
+ certPem: string().min(1),
17618
+ caCertPem: string().min(1),
17619
+ /**
17620
+ * The hub signals that its local CA was rotated (D227) and this leaf chains to the NEW
17621
+ * one. Only the hub, over the authenticated mesh, can say so; a leaf with a different CA
17622
+ * and no signal is refused.
17623
+ */
17624
+ caRotation: boolean().optional()
17625
+ }), HttpsLeafInfoSchema, {
17626
+ kind: "mutation",
17627
+ auth: "admin"
17628
+ });
17095
17629
  var KeychainKeySourceSchema = object({
17096
17630
  kind: _enum([
17097
17631
  "config-file",
@@ -17566,6 +18100,10 @@ var deviceDiscoveryCapability = {
17566
18100
  * `scripts/check-runtime-state-durability.ts`.
17567
18101
  */
17568
18102
  durability: "session",
18103
+ /**
18104
+ * History (D850): none — inventory.
18105
+ */
18106
+ history: "none",
17569
18107
  methods: {
17570
18108
  /**
17571
18109
  * Snapshot of the current `discovered` list. Returns the
@@ -38266,6 +38804,42 @@ var DeviceRegisterPayloadSchema = object({
38266
38804
  * omits it and the keyword backstop applies. */
38267
38805
  secretConfigPaths: array(string()).optional()
38268
38806
  });
38807
+ /** One deleted device, kept by device-manager so an addon that missed the
38808
+ * deletion can still learn of it (D865). Written by the delete path ONLY. */
38809
+ var DeviceTombstoneSchema = object({
38810
+ deviceId: number().int().positive(),
38811
+ /** Epoch ms the device was deleted. */
38812
+ deletedAt: number(),
38813
+ /** The addon that owned the device when it was deleted. */
38814
+ providerAddonId: string()
38815
+ });
38816
+ /** How long a tombstone stays readable. Past it, a device that was deleted
38817
+ * and never cleaned is only reachable by the admin "clean data of deleted
38818
+ * devices" action. */
38819
+ var DEVICE_TOMBSTONE_RETENTION_MS = 2160 * 60 * 60 * 1e3;
38820
+ /** Data held for one device that device-manager no longer knows. */
38821
+ var OrphanDeviceDataSchema = object({
38822
+ deviceId: number().int().positive(),
38823
+ /** Rows/files per store (`<addonId>:<store>`). */
38824
+ stores: record(string(), number().int().nonnegative())
38825
+ });
38826
+ var CleanupDeletedDevicesResultSchema = object({
38827
+ /**
38828
+ * `skipped` — the absence check could not be trusted (a device-list read
38829
+ * failed or the two reads disagreed); nothing was listed or deleted.
38830
+ * `dry-run` — `devices` is what a confirmed run would delete.
38831
+ * `cleaned` — `devices` is what was deleted.
38832
+ */
38833
+ status: _enum([
38834
+ "skipped",
38835
+ "dry-run",
38836
+ "cleaned"
38837
+ ]),
38838
+ reason: string().nullable(),
38839
+ devices: array(OrphanDeviceDataSchema),
38840
+ /** Implementers that could not be asked (their stores are not in `devices`). */
38841
+ unreachable: array(string())
38842
+ });
38269
38843
  var DeviceRemovePayloadSchema = object({ deviceId: number() });
38270
38844
  var DevicePersistConfigPayloadSchema = object({
38271
38845
  deviceId: number(),
@@ -38504,6 +39078,9 @@ method(object({
38504
39078
  }), method(object({ deviceId: number() }), object({ success: literal(true) }), {
38505
39079
  kind: "mutation",
38506
39080
  auth: "admin"
39081
+ }), method(object({ sinceMs: number() }), array(DeviceTombstoneSchema).readonly(), { auth: "admin" }), method(object({ confirm: boolean() }), CleanupDeletedDevicesResultSchema, {
39082
+ kind: "mutation",
39083
+ auth: "admin"
38507
39084
  }), method(object({ integrationId: string() }), object({ removed: number() }), {
38508
39085
  kind: "mutation",
38509
39086
  auth: "admin"
@@ -39037,6 +39614,85 @@ var embeddingEncoderCapability = {
39037
39614
  }
39038
39615
  };
39039
39616
  /**
39617
+ * `device-removal-hook` — the reliable way an addon learns a device was DELETED,
39618
+ * so it can delete what it keeps for that device (D865).
39619
+ *
39620
+ * ## Why an event was not enough
39621
+ *
39622
+ * `DeviceUnregistered` is telemetry and may be dropped (D8, D11). An addon that
39623
+ * hung its per-device clean-up on it left durable garbage whenever the event was
39624
+ * lost, the addon was down, or it was restarting at that moment — footage,
39625
+ * analytics rows and settings of device 4483 outlived the device. Loss of this
39626
+ * signal corrupts durable state, so it travels by RPC with a recorded fact
39627
+ * behind it (D8: "if loss would corrupt durable state, use RPC plus a reconcile").
39628
+ *
39629
+ * ## The three pieces
39630
+ *
39631
+ * 1. device-manager records a TOMBSTONE per deleted device
39632
+ * (`deviceManager.listDeletedSince`). The tombstone is written by the delete
39633
+ * path only — a device that is unregistered, offline or whose provider is
39634
+ * restarting is NOT deleted and gets none.
39635
+ * 2. After a delete, device-manager calls `onDeviceRemoved` on EVERY provider of
39636
+ * this collection, one by one, with bounded retries, logged.
39637
+ * 3. An implementer that was down asks `deviceManager.listDeletedSince` at start
39638
+ * (and periodically) and runs its own `onDeviceRemoved` for each tombstone it
39639
+ * may have missed. Reconcile is driven by tombstones, never by "the device is
39640
+ * not in the current list": a failed or partial list read must not destroy data.
39641
+ *
39642
+ * ## Contract for an implementer
39643
+ *
39644
+ * - **Idempotent.** It is called again by a retry, by a reconcile and by the
39645
+ * admin cleanup of data that predates tombstones. A device with nothing left
39646
+ * answers zero counts.
39647
+ * - **One key per store** in `counts`, deleted rows/files per store, so the log
39648
+ * line and the admin dry run can say where the data was.
39649
+ * - **Training datasets are NOT device data** and are never deleted by a hook.
39650
+ * - **Per-device SETTINGS are not hooked.** Configuration lives in the standard
39651
+ * per-device store (`ctx.settings.*DeviceStore`), which device-manager clears
39652
+ * for every addon centrally at delete time. This hook is for device DATA
39653
+ * that is not settings: footage, event media, analytics rows, history.
39654
+ * - A provider that cannot tell is allowed to throw; the caller retries it.
39655
+ *
39656
+ * `listDeviceData` is the read side of the admin "Clean data of deleted devices"
39657
+ * action: which device ids this addon holds data for, and how much per store. It
39658
+ * never deletes. device-manager decides which of those ids are absent from the
39659
+ * fleet, from TWO consistent reads of the device list (D49).
39660
+ */
39661
+ /** What a hook is told about the deletion. */
39662
+ var DeviceRemovedInputSchema = object({
39663
+ deviceId: number().int().positive(),
39664
+ /** Epoch ms the device was deleted (the tombstone's `deletedAt`). */
39665
+ deletedAt: number(),
39666
+ /** The addon that owned the device, as device-manager last knew it. */
39667
+ providerAddonId: string()
39668
+ });
39669
+ /** Rows/files/refs deleted, per store this implementer owns. */
39670
+ var DeviceRemovedResultSchema = object({ counts: record(string(), number().int().nonnegative()) });
39671
+ /** One (store, device) pair an implementer holds data for. */
39672
+ var DeviceDataEntrySchema = object({
39673
+ store: string(),
39674
+ deviceId: number().int().positive(),
39675
+ /** Rows (or files) held for the device in the store. */
39676
+ count: number().int().nonnegative()
39677
+ });
39678
+ var deviceRemovalHookCapability = {
39679
+ name: "device-removal-hook",
39680
+ scope: "system",
39681
+ mode: "collection",
39682
+ internal: true,
39683
+ methods: {
39684
+ /** Delete everything this addon keeps for the deleted device. Idempotent. */
39685
+ onDeviceRemoved: method(DeviceRemovedInputSchema, DeviceRemovedResultSchema, {
39686
+ kind: "mutation",
39687
+ auth: "admin"
39688
+ }),
39689
+ /** Which devices this addon holds data for, per store. Reads only. */
39690
+ listDeviceData: method(_void(), array(DeviceDataEntrySchema).readonly(), { auth: "admin" })
39691
+ },
39692
+ /** In-process only — enumerated through `addons.listCapabilityProviders`. */
39693
+ mount: { kind: "skip" }
39694
+ };
39695
+ /**
39040
39696
  * `failure-contribution` — the capability an addon reports its OWN losses
39041
39697
  * through, per camera, with the denominator attached. It stores nothing.
39042
39698
  *
@@ -40113,7 +40769,13 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
40113
40769
  * `beginExternalLink` offer exactly the redirect methods that set this,
40114
40770
  * whatever their id. Absent / false — a login button only.
40115
40771
  */
40116
- linkable: boolean().optional()
40772
+ linkable: boolean().optional(),
40773
+ /**
40774
+ * How a NATIVE app starts this method (D858): `{ kind: 'browser', startPath }`
40775
+ * when the route understands the app flow query (`app=1&code_challenge=…`),
40776
+ * `null`/absent when there is no app path - the app hides the method.
40777
+ */
40778
+ app: AppLoginPathSchema.nullable().optional()
40117
40779
  }),
40118
40780
  object({
40119
40781
  kind: literal("widget"),
@@ -40125,7 +40787,9 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
40125
40787
  bundle: string(),
40126
40788
  /** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
40127
40789
  remote: WidgetRemoteSchema,
40128
- stage: LoginStageEnum
40790
+ stage: LoginStageEnum,
40791
+ /** Widgets are web ceremonies: no native app path (D858). Absent reads as `null`. */
40792
+ app: AppLoginPathSchema.nullable().optional()
40129
40793
  }),
40130
40794
  object({
40131
40795
  kind: literal("passkey"),
@@ -40137,7 +40801,9 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
40137
40801
  /** Effective WebAuthn RP ID (`resolveRpID()`) — the shell gates visibility on it. */
40138
40802
  rpId: string(),
40139
40803
  /** Effective expected origin (`resolveOrigin()`), null when unconfigured. */
40140
- origin: string().nullable()
40804
+ origin: string().nullable(),
40805
+ /** Set by the hub for the primary arm; a second-factor passkey has no app path (D858). */
40806
+ app: AppLoginPathSchema.nullable().optional()
40141
40807
  })
40142
40808
  ]);
40143
40809
  method(_void(), array(LoginMethodContributionSchema).readonly());
@@ -40647,7 +41313,21 @@ var NetworkEndpointSchema = object({
40647
41313
  url: string(),
40648
41314
  hostname: string(),
40649
41315
  port: number(),
40650
- protocol: _enum(["http", "https"])
41316
+ protocol: _enum(["http", "https"]),
41317
+ /**
41318
+ * Whether this address survives a restart of its provider. `false` = it is
41319
+ * re-issued every time (a Quick tunnel's random `*.trycloudflare.com`); the
41320
+ * hub never selects such an address AUTOMATICALLY for a role (D860), though
41321
+ * it stays visible and an operator may still flag it. Absent = stable: every
41322
+ * provider except a Quick tunnel owns a name that does not change.
41323
+ */
41324
+ stable: boolean().optional()
41325
+ });
41326
+ object({
41327
+ url: string(),
41328
+ /** Mirrors {@link NetworkEndpointSchema} `stable`; absent = stable. */
41329
+ stable: boolean().optional(),
41330
+ updated: boolean().optional()
40651
41331
  });
40652
41332
  var NetworkAccessStatusSchema = object({
40653
41333
  connected: boolean(),
@@ -41775,6 +42455,10 @@ var alarmPanelCapability = {
41775
42455
  * `scripts/check-runtime-state-durability.ts`.
41776
42456
  */
41777
42457
  durability: "restored",
42458
+ /**
42459
+ * History (D850): none — enum state; arm/disarm history belongs in the events ledger.
42460
+ */
42461
+ history: "none",
41778
42462
  /** Clock fields: written, but excluded from the compare that decides
41779
42463
  * whether persisting is worth a SQLite commit. */
41780
42464
  volatileStateFields: ["lastChangedAt"]
@@ -50189,7 +50873,11 @@ var zonesCapability = {
50189
50873
  * See `RuntimeStateDurability`. Enforced by
50190
50874
  * `scripts/check-runtime-state-durability.ts`.
50191
50875
  */
50192
- durability: "restored"
50876
+ durability: "restored",
50877
+ /**
50878
+ * History (D850): none — configuration arrays.
50879
+ */
50880
+ history: "none"
50193
50881
  };
50194
50882
  /**
50195
50883
  * A bounding box in NORMALIZED [0,1] frame coordinates for `getNativeCrop`. The
@@ -52570,7 +53258,22 @@ var SsoBridgeClaimsSchema = object({
52570
53258
  * request to present the matching cookie — a login bridge is useless in
52571
53259
  * any other browser.
52572
53260
  */
52573
- browserBinding: string().optional()
53261
+ browserBinding: string().optional(),
53262
+ /**
53263
+ * The native app that started this sign-in (D858): its PKCE challenge,
53264
+ * `state`, purpose and allow-listed return URL, copied from the server-side
53265
+ * pending OIDC state. A bridge carrying it is finished ONLY at
53266
+ * `/api/auth/sso/finish-app` (which mints a handoff code, never a web
53267
+ * session); `/api/auth/sso/finish` refuses it.
53268
+ */
53269
+ app: object({
53270
+ codeChallenge: string(),
53271
+ state: string(),
53272
+ purpose: _enum(["new-session", "step-up"]),
53273
+ redirect: string(),
53274
+ /** The page language the app asked for (D858); the confirm page speaks it. */
53275
+ lang: _enum(["en", "it"]).optional()
53276
+ }).optional()
52574
53277
  });
52575
53278
  method(object({
52576
53279
  claims: SsoBridgeClaimsSchema,
@@ -52977,6 +53680,10 @@ var streamSignalsCapability = {
52977
53680
  * `scripts/check-runtime-state-durability.ts`.
52978
53681
  */
52979
53682
  durability: "session",
53683
+ /**
53684
+ * History (D850): none — array state.
53685
+ */
53686
+ history: "none",
52980
53687
  methods: {
52981
53688
  /**
52982
53689
  * What this device can emit. Empty is a valid and common answer — most
@@ -54839,7 +55546,12 @@ var SearchResultSchema = object({
54839
55546
  publishedAt: string(),
54840
55547
  author: string(),
54841
55548
  installed: boolean(),
54842
- installedVersion: string().optional()
55549
+ installedVersion: string().optional(),
55550
+ /**
55551
+ * Capability names the package's addons declare (from its published
55552
+ * manifest). `null` = the registry lookup failed — unknown, never `[]` (D393).
55553
+ */
55554
+ capabilities: array(string()).readonly().nullable()
54843
55555
  });
54844
55556
  var AutoUpdateSettingsSchema = object({
54845
55557
  channel: ChannelSchema,
@@ -55001,7 +55713,11 @@ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSc
55001
55713
  }), method(object({ packageName: string().optional() }), PackageInstallationsSchema, { auth: "admin" }), method(_void(), ReloadPackagesResultSchema, {
55002
55714
  kind: "mutation",
55003
55715
  auth: "admin"
55004
- }), method(object({ query: string().optional() }), array(SearchResultSchema)), method(object({ nodeId: string().optional() }), array(PackageUpdateSchema).readonly(), { auth: "admin" }), method(object({
55716
+ }), method(object({
55717
+ query: string().optional(),
55718
+ /** Only packages whose addons declare this capability (unknown ones excluded). */
55719
+ capability: string().optional()
55720
+ }), array(SearchResultSchema)), method(object({ nodeId: string().optional() }), array(PackageUpdateSchema).readonly(), { auth: "admin" }), method(object({
55005
55721
  name: string().min(1),
55006
55722
  version: string().optional(),
55007
55723
  nodeId: string().optional()
@@ -55137,6 +55853,36 @@ var airQualitySensorCapability = {
55137
55853
  * `scripts/check-runtime-state-durability.ts`.
55138
55854
  */
55139
55855
  durability: "restored",
55856
+ /**
55857
+ * History (D850): recorded series.
55858
+ */
55859
+ history: { fields: {
55860
+ co2Ppm: {
55861
+ kind: "gauge",
55862
+ unit: "ppm",
55863
+ deadband: 5
55864
+ },
55865
+ vocPpb: {
55866
+ kind: "gauge",
55867
+ unit: "ppb",
55868
+ deadband: 5
55869
+ },
55870
+ pm25: {
55871
+ kind: "gauge",
55872
+ unit: "ug/m3",
55873
+ deadband: 1
55874
+ },
55875
+ pm10: {
55876
+ kind: "gauge",
55877
+ unit: "ug/m3",
55878
+ deadband: 1
55879
+ },
55880
+ aqi: {
55881
+ kind: "gauge",
55882
+ unit: "count",
55883
+ deadband: 1
55884
+ }
55885
+ } },
55140
55886
  /** Clock fields: written, but excluded from the compare that decides
55141
55887
  * whether persisting is worth a SQLite commit. */
55142
55888
  volatileStateFields: ["lastFetchedAt"]
@@ -55179,6 +55925,15 @@ var ambientLightSensorCapability = {
55179
55925
  * `scripts/check-runtime-state-durability.ts`.
55180
55926
  */
55181
55927
  durability: "restored",
55928
+ /**
55929
+ * History (D850): recorded series. Wide range, so a RELATIVE deadband (10 %).
55930
+ */
55931
+ history: { fields: { lux: {
55932
+ kind: "gauge",
55933
+ unit: "lx",
55934
+ deadbandPct: 10,
55935
+ minIntervalMs: 6e4
55936
+ } } },
55182
55937
  /** Clock fields: written, but excluded from the compare that decides
55183
55938
  * whether persisting is worth a SQLite commit. */
55184
55939
  volatileStateFields: ["lastFetchedAt"]
@@ -55306,7 +56061,11 @@ var audioMetricsCapability = {
55306
56061
  * See `RuntimeStateDurability`. Enforced by
55307
56062
  * `scripts/check-runtime-state-durability.ts`.
55308
56063
  */
55309
- durability: "session"
56064
+ durability: "session",
56065
+ /**
56066
+ * 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.
56067
+ */
56068
+ history: "none"
55310
56069
  };
55311
56070
  /**
55312
56071
  * Automation-control cap. Models HA `automation.*` entities on
@@ -55375,7 +56134,11 @@ var automationControlCapability = {
55375
56134
  * See `RuntimeStateDurability`. Enforced by
55376
56135
  * `scripts/check-runtime-state-durability.ts`.
55377
56136
  */
55378
- durability: "session"
56137
+ durability: "session",
56138
+ /**
56139
+ * History (D850): none — configuration and transient run state.
56140
+ */
56141
+ history: "none"
55379
56142
  };
55380
56143
  /**
55381
56144
  * Battery status snapshot. Emitted by providers whose device is
@@ -55556,6 +56319,13 @@ onStatusChanged: { data: object({
55556
56319
  * `scripts/check-runtime-state-durability.ts`.
55557
56320
  */
55558
56321
  durability: "restored",
56322
+ /**
56323
+ * History (D850): recorded series. The generic capture replaces the `battery` series of `pipeline-analytics:stats-5m`.
56324
+ */
56325
+ history: { fields: { percentage: {
56326
+ kind: "gauge",
56327
+ unit: "%"
56328
+ } } },
55559
56329
  /** Clock fields: written, but excluded from the compare that decides
55560
56330
  * whether persisting is worth a SQLite commit. */
55561
56331
  volatileStateFields: ["lastUpdated"]
@@ -55595,6 +56365,10 @@ var binaryCapability = {
55595
56365
  * `scripts/check-runtime-state-durability.ts`.
55596
56366
  */
55597
56367
  durability: "restored",
56368
+ /**
56369
+ * History (D850): recorded series.
56370
+ */
56371
+ history: { fields: { on: { kind: "boolean" } } },
55598
56372
  /** Clock fields: written, but excluded from the compare that decides
55599
56373
  * whether persisting is worth a SQLite commit. */
55600
56374
  volatileStateFields: ["lastChangedAt"]
@@ -55657,7 +56431,15 @@ onBrightnessChanged: { data: object({
55657
56431
  * See `RuntimeStateDurability`. Enforced by
55658
56432
  * `scripts/check-runtime-state-durability.ts`.
55659
56433
  */
55660
- durability: "session"
56434
+ durability: "session",
56435
+ /**
56436
+ * History (D850): recorded series. Actuator tier: level keeps every change.
56437
+ */
56438
+ history: { fields: { percentage: {
56439
+ kind: "gauge",
56440
+ unit: "%",
56441
+ minIntervalMs: 0
56442
+ } } }
55661
56443
  };
55662
56444
  DeviceType.Button, method(object({ deviceId: number().int().nonnegative() }), _void(), {
55663
56445
  kind: "mutation",
@@ -56018,6 +56800,10 @@ var carbonMonoxideCapability = {
56018
56800
  * `scripts/check-runtime-state-durability.ts`.
56019
56801
  */
56020
56802
  durability: "restored",
56803
+ /**
56804
+ * History (D850): recorded series.
56805
+ */
56806
+ history: { fields: { detected: { kind: "boolean" } } },
56021
56807
  /** Clock fields: written, but excluded from the compare that decides
56022
56808
  * whether persisting is worth a SQLite commit. */
56023
56809
  volatileStateFields: ["lastChangedAt"]
@@ -56187,7 +56973,37 @@ var climateControlCapability = {
56187
56973
  * See `RuntimeStateDurability`. Enforced by
56188
56974
  * `scripts/check-runtime-state-durability.ts`.
56189
56975
  */
56190
- durability: "session"
56976
+ durability: "session",
56977
+ /**
56978
+ * History (D850): recorded series. Celsius by contract; setpoints keep every change (`minIntervalMs: 0`).
56979
+ */
56980
+ history: { fields: {
56981
+ currentTemp: {
56982
+ kind: "gauge",
56983
+ unit: "°C",
56984
+ deadband: .1
56985
+ },
56986
+ currentHumidity: {
56987
+ kind: "gauge",
56988
+ unit: "%",
56989
+ deadband: .5
56990
+ },
56991
+ target: {
56992
+ kind: "gauge",
56993
+ unit: "°C",
56994
+ minIntervalMs: 0
56995
+ },
56996
+ targetHigh: {
56997
+ kind: "gauge",
56998
+ unit: "°C",
56999
+ minIntervalMs: 0
57000
+ },
57001
+ targetLow: {
57002
+ kind: "gauge",
57003
+ unit: "°C",
57004
+ minIntervalMs: 0
57005
+ }
57006
+ } }
56191
57007
  };
56192
57008
  /**
56193
57009
  * Color-light cap. Coexists with `switch` (on/off) and `brightness`
@@ -56304,7 +57120,11 @@ onColorChanged: { data: object({
56304
57120
  * See `RuntimeStateDurability`. Enforced by
56305
57121
  * `scripts/check-runtime-state-durability.ts`.
56306
57122
  */
56307
- durability: "session"
57123
+ durability: "session",
57124
+ /**
57125
+ * History (D850): none — nested and cosmetic.
57126
+ */
57127
+ history: "none"
56308
57128
  };
56309
57129
  var ConnectionTestOutcomeSchema = discriminatedUnion("outcome", [
56310
57130
  object({
@@ -56370,6 +57190,10 @@ var connectivityCapability = {
56370
57190
  * `scripts/check-runtime-state-durability.ts`.
56371
57191
  */
56372
57192
  durability: "restored",
57193
+ /**
57194
+ * History (D850): none — duplicates device-status.online (one authority for availability).
57195
+ */
57196
+ history: "none",
56373
57197
  /** Clock fields: written, but excluded from the compare that decides
56374
57198
  * whether persisting is worth a SQLite commit. */
56375
57199
  volatileStateFields: ["lastChangedAt"]
@@ -56494,6 +57318,10 @@ reset: method(object({
56494
57318
  * `scripts/check-runtime-state-durability.ts`.
56495
57319
  */
56496
57320
  durability: "restored",
57321
+ /**
57322
+ * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
57323
+ */
57324
+ history: "none",
56497
57325
  /** Clocks, not content: a re-read that changed no item costs no commit. */
56498
57326
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
56499
57327
  };
@@ -56534,6 +57362,10 @@ var contactCapability = {
56534
57362
  * `scripts/check-runtime-state-durability.ts`.
56535
57363
  */
56536
57364
  durability: "restored",
57365
+ /**
57366
+ * History (D850): recorded series.
57367
+ */
57368
+ history: { fields: { entryOpen: { kind: "boolean" } } },
56537
57369
  /** Clock fields: written, but excluded from the compare that decides
56538
57370
  * whether persisting is worth a SQLite commit. */
56539
57371
  volatileStateFields: ["lastChangedAt"]
@@ -56649,7 +57481,11 @@ var controlCapability = {
56649
57481
  * See `RuntimeStateDurability`. Enforced by
56650
57482
  * `scripts/check-runtime-state-durability.ts`.
56651
57483
  */
56652
- durability: "session"
57484
+ durability: "session",
57485
+ /**
57486
+ * History (D850): none — `value` is a number/string union; configuration entity.
57487
+ */
57488
+ history: "none"
56653
57489
  };
56654
57490
  /**
56655
57491
  * Window covering / blinds / garage door / valve cap. Models HA
@@ -56740,6 +57576,14 @@ var coverCapability = {
56740
57576
  * `scripts/check-runtime-state-durability.ts`.
56741
57577
  */
56742
57578
  durability: "restored",
57579
+ /**
57580
+ * History (D850): recorded series. Actuator tier: position keeps every tick of a movement.
57581
+ */
57582
+ history: { fields: { position: {
57583
+ kind: "gauge",
57584
+ unit: "%",
57585
+ minIntervalMs: 0
57586
+ } } },
56743
57587
  /** Clock fields: written, but excluded from the compare that decides
56744
57588
  * whether persisting is worth a SQLite commit. */
56745
57589
  volatileStateFields: ["lastChangedAt"]
@@ -56844,6 +57688,10 @@ var dayNightCapability = {
56844
57688
  * `scripts/check-runtime-state-durability.ts`.
56845
57689
  */
56846
57690
  durability: "restored",
57691
+ /**
57692
+ * History (D850): none — firmware configuration, not a measurement.
57693
+ */
57694
+ history: "none",
56847
57695
  /** Clock fields: written, but excluded from the compare that decides
56848
57696
  * whether persisting is worth a SQLite commit. */
56849
57697
  volatileStateFields: ["lastFetchedAt"]
@@ -56901,6 +57749,10 @@ onStatusChanged: { data: object({
56901
57749
  * `scripts/check-runtime-state-durability.ts`.
56902
57750
  */
56903
57751
  durability: "restored",
57752
+ /**
57753
+ * History (D850): recorded series. The ONE availability series.
57754
+ */
57755
+ history: { fields: { online: { kind: "boolean" } } },
56904
57756
  /** Clock fields: written, but excluded from the compare that decides
56905
57757
  * whether persisting is worth a SQLite commit. */
56906
57758
  volatileStateFields: ["lastChangedAt"]
@@ -56967,7 +57819,11 @@ onPressed: {
56967
57819
  * See `RuntimeStateDurability`. Enforced by
56968
57820
  * `scripts/check-runtime-state-durability.ts`.
56969
57821
  */
56970
- durability: "restored"
57822
+ durability: "restored",
57823
+ /**
57824
+ * History (D850): none — `pressCountSinceStart` resets with the addon, so it is not a monotonic meter; presses live in the events ledger.
57825
+ */
57826
+ history: "none"
56971
57827
  };
56972
57828
  /**
56973
57829
  * Enum-state sensor — a string value picked from a finite option set.
@@ -57015,6 +57871,10 @@ var enumSensorCapability = {
57015
57871
  * `scripts/check-runtime-state-durability.ts`.
57016
57872
  */
57017
57873
  durability: "restored",
57874
+ /**
57875
+ * History (D850): none — text/enum state has no history (non-goal).
57876
+ */
57877
+ history: "none",
57018
57878
  /** Clock fields: written, but excluded from the compare that decides
57019
57879
  * whether persisting is worth a SQLite commit. */
57020
57880
  volatileStateFields: ["lastFetchedAt"]
@@ -57060,7 +57920,11 @@ var eventEmitterCapability = {
57060
57920
  * See `RuntimeStateDurability`. Enforced by
57061
57921
  * `scripts/check-runtime-state-durability.ts`.
57062
57922
  */
57063
- durability: "session"
57923
+ durability: "session",
57924
+ /**
57925
+ * History (D850): none — `eventCountSinceStart` resets with the addon; events live in ledgers.
57926
+ */
57927
+ history: "none"
57064
57928
  };
57065
57929
  var IdentitySchema = object({
57066
57930
  id: string(),
@@ -57556,7 +58420,18 @@ var fanControlCapability = {
57556
58420
  * See `RuntimeStateDurability`. Enforced by
57557
58421
  * `scripts/check-runtime-state-durability.ts`.
57558
58422
  */
57559
- durability: "session"
58423
+ durability: "session",
58424
+ /**
58425
+ * History (D850): recorded series. Actuator tier: speed keeps every change.
58426
+ */
58427
+ history: { fields: {
58428
+ percentage: {
58429
+ kind: "gauge",
58430
+ unit: "%",
58431
+ minIntervalMs: 0
58432
+ },
58433
+ oscillating: { kind: "boolean" }
58434
+ } }
57560
58435
  };
57561
58436
  /**
57562
58437
  * Per-device feature/identity probe slice. Holds the runtime-resolved
@@ -57639,7 +58514,11 @@ onProbeChanged: { data: object({
57639
58514
  * See `RuntimeStateDurability`. Enforced by
57640
58515
  * `scripts/check-runtime-state-durability.ts`.
57641
58516
  */
57642
- durability: "session"
58517
+ durability: "session",
58518
+ /**
58519
+ * History (D850): none — static identity and capability probe.
58520
+ */
58521
+ history: "none"
57643
58522
  };
57644
58523
  /**
57645
58524
  * Water leak / moisture sensor. Boolean "is liquid currently
@@ -57674,6 +58553,10 @@ var floodCapability = {
57674
58553
  * `scripts/check-runtime-state-durability.ts`.
57675
58554
  */
57676
58555
  durability: "restored",
58556
+ /**
58557
+ * History (D850): recorded series.
58558
+ */
58559
+ history: { fields: { flooded: { kind: "boolean" } } },
57677
58560
  /** Clock fields: written, but excluded from the compare that decides
57678
58561
  * whether persisting is worth a SQLite commit. */
57679
58562
  volatileStateFields: ["lastChangedAt"]
@@ -57707,6 +58590,10 @@ var gasCapability = {
57707
58590
  * `scripts/check-runtime-state-durability.ts`.
57708
58591
  */
57709
58592
  durability: "restored",
58593
+ /**
58594
+ * History (D850): recorded series.
58595
+ */
58596
+ history: { fields: { detected: { kind: "boolean" } } },
57710
58597
  /** Clock fields: written, but excluded from the compare that decides
57711
58598
  * whether persisting is worth a SQLite commit. */
57712
58599
  volatileStateFields: ["lastChangedAt"]
@@ -57792,7 +58679,18 @@ var humidifierCapability = {
57792
58679
  * See `RuntimeStateDurability`. Enforced by
57793
58680
  * `scripts/check-runtime-state-durability.ts`.
57794
58681
  */
57795
- durability: "session"
58682
+ durability: "session",
58683
+ /**
58684
+ * History (D850): recorded series.
58685
+ */
58686
+ history: { fields: {
58687
+ currentHumidity: {
58688
+ kind: "gauge",
58689
+ unit: "%",
58690
+ deadband: .5
58691
+ },
58692
+ on: { kind: "boolean" }
58693
+ } }
57796
58694
  };
57797
58695
  /**
57798
58696
  * Single-metric humidity reading. Drives Home Assistant `sensor`
@@ -57836,6 +58734,14 @@ var humiditySensorCapability = {
57836
58734
  * `scripts/check-runtime-state-durability.ts`.
57837
58735
  */
57838
58736
  durability: "restored",
58737
+ /**
58738
+ * History (D850): recorded series.
58739
+ */
58740
+ history: { fields: { percent: {
58741
+ kind: "gauge",
58742
+ unit: "%",
58743
+ deadband: .5
58744
+ } } },
57839
58745
  /** Clock fields: written, but excluded from the compare that decides
57840
58746
  * whether persisting is worth a SQLite commit. */
57841
58747
  volatileStateFields: ["lastFetchedAt"]
@@ -57883,7 +58789,11 @@ var imageCapability = {
57883
58789
  * See `RuntimeStateDurability`. Enforced by
57884
58790
  * `scripts/check-runtime-state-durability.ts`.
57885
58791
  */
57886
- durability: "session"
58792
+ durability: "session",
58793
+ /**
58794
+ * History (D850): none — not numeric.
58795
+ */
58796
+ history: "none"
57887
58797
  };
57888
58798
  /**
57889
58799
  * Vendor-neutral image / picture-adjustment cap — the per-camera config
@@ -58040,6 +58950,10 @@ var imageSettingsCapability = {
58040
58950
  * `scripts/check-runtime-state-durability.ts`.
58041
58951
  */
58042
58952
  durability: "restored",
58953
+ /**
58954
+ * History (D850): none — camera image configuration (operator intent), not a trend.
58955
+ */
58956
+ history: "none",
58043
58957
  /** Clock fields: written, but excluded from the compare that decides
58044
58958
  * whether persisting is worth a SQLite commit. */
58045
58959
  volatileStateFields: ["lastFetchedAt"]
@@ -58425,7 +59339,11 @@ var intercomCapability = {
58425
59339
  * See `RuntimeStateDurability`. Enforced by
58426
59340
  * `scripts/check-runtime-state-durability.ts`.
58427
59341
  */
58428
- durability: "session"
59342
+ durability: "session",
59343
+ /**
59344
+ * History (D850): none — talk sessions are a ledger concern, not a trend.
59345
+ */
59346
+ history: "none"
58429
59347
  };
58430
59348
  /**
58431
59349
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
@@ -58506,7 +59424,15 @@ var lawnMowerControlCapability = {
58506
59424
  * See `RuntimeStateDurability`. Enforced by
58507
59425
  * `scripts/check-runtime-state-durability.ts`.
58508
59426
  */
58509
- durability: "session"
59427
+ durability: "session",
59428
+ /**
59429
+ * History (D850): recorded series.
59430
+ */
59431
+ history: { fields: { batteryLevel: {
59432
+ kind: "gauge",
59433
+ unit: "%",
59434
+ deadband: 2
59435
+ } } }
58510
59436
  };
58511
59437
  /**
58512
59438
  * local-network — hub-only singleton.
@@ -58633,7 +59559,13 @@ var ConnectionEndpointSchema = object({
58633
59559
  * calls so the client can sort even if the cap returns a new
58634
59560
  * ordering between polls.
58635
59561
  */
58636
- priority: number()
59562
+ priority: number(),
59563
+ /**
59564
+ * `false` = the address changes on its own (a Quick tunnel, re-issued on
59565
+ * every respawn). Automatic role resolution skips it (D860); an explicit
59566
+ * operator flag still honours it. Absent = stable.
59567
+ */
59568
+ stable: boolean().optional()
58637
59569
  });
58638
59570
  /**
58639
59571
  * Where the advertised local port came from. Ordered most → least
@@ -58798,7 +59730,19 @@ var TlsStatusSchema = object({
58798
59730
  sans: array(string()),
58799
59731
  caCertPem: string().nullable(),
58800
59732
  reissueError: string().nullable(),
58801
- restartRequired: boolean()
59733
+ restartRequired: boolean(),
59734
+ /** An uploaded certificate is served but no CA is kept for it and it is not publicly signed (D873). */
59735
+ caMissing: boolean(),
59736
+ /** Does the hub's own generated CA carry a critical name constraint? `null` while it has none. */
59737
+ localCaConstrained: boolean().nullable(),
59738
+ /** ISO time the generated CA was replaced by a constrained one; devices must re-download it. */
59739
+ caReplacedAt: string().nullable(),
59740
+ /** The uploaded certificate kept on disk, selectable again after "Revert to generated". */
59741
+ storedUpload: object({
59742
+ leafFingerprintSha256: string(),
59743
+ validTo: string(),
59744
+ hasCa: boolean()
59745
+ }).nullable()
58802
59746
  });
58803
59747
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
58804
59748
  /**
@@ -58854,6 +59798,9 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
58854
59798
  }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
58855
59799
  kind: "mutation",
58856
59800
  auth: "admin"
59801
+ }), method(_void(), TlsStatusSchema, {
59802
+ kind: "mutation",
59803
+ auth: "admin"
58857
59804
  });
58858
59805
  /**
58859
59806
  * Smart-lock cap. Models HA `lock.*` entities — anything with a
@@ -58934,6 +59881,10 @@ var lockControlCapability = {
58934
59881
  * `scripts/check-runtime-state-durability.ts`.
58935
59882
  */
58936
59883
  durability: "restored",
59884
+ /**
59885
+ * History (D850): none — enum state; lock events belong in the events ledger.
59886
+ */
59887
+ history: "none",
58937
59888
  /** Clock fields: written, but excluded from the compare that decides
58938
59889
  * whether persisting is worth a SQLite commit. */
58939
59890
  volatileStateFields: ["lastChangedAt"]
@@ -59105,7 +60056,11 @@ var mediaPlayerCapability = {
59105
60056
  * See `RuntimeStateDurability`. Enforced by
59106
60057
  * `scripts/check-runtime-state-durability.ts`.
59107
60058
  */
59108
- durability: "session"
60059
+ durability: "session",
60060
+ /**
60061
+ * History (D850): none — `positionMs` moves continuously while playing; volume is transient.
60062
+ */
60063
+ history: "none"
59109
60064
  };
59110
60065
  /**
59111
60066
  * mesh-network — collection cap for mesh-VPN providers.
@@ -59439,7 +60394,14 @@ onMotionChanged: { data: MotionOnMotionChangedDataSchema } },
59439
60394
  * See `RuntimeStateDurability`. Enforced by
59440
60395
  * `scripts/check-runtime-state-durability.ts`.
59441
60396
  */
59442
- durability: "session"
60397
+ durability: "session",
60398
+ /**
60399
+ * History (D850): recorded series. A PIR sensor is a series; a camera is not (its motion is an addon series and a ledger).
60400
+ */
60401
+ history: { fields: { detected: {
60402
+ kind: "boolean",
60403
+ excludeDeviceTypes: [DeviceType.Camera]
60404
+ } } }
59443
60405
  };
59444
60406
  /**
59445
60407
  * Motion-trigger toggle for accessory devices.
@@ -59511,7 +60473,11 @@ var motionTriggerCapability = {
59511
60473
  * See `RuntimeStateDurability`. Enforced by
59512
60474
  * `scripts/check-runtime-state-durability.ts`.
59513
60475
  */
59514
- durability: "session"
60476
+ durability: "session",
60477
+ /**
60478
+ * History (D850): none — configuration switch.
60479
+ */
60480
+ history: "none"
59515
60481
  };
59516
60482
  /**
59517
60483
  * Motion-zones share the same MaskShape vocabulary as privacy-mask — the
@@ -59586,6 +60552,10 @@ var motionZonesCapability = {
59586
60552
  * `scripts/check-runtime-state-durability.ts`.
59587
60553
  */
59588
60554
  durability: "restored",
60555
+ /**
60556
+ * History (D850): none — configuration.
60557
+ */
60558
+ history: "none",
59589
60559
  /** Clock fields: written, but excluded from the compare that decides
59590
60560
  * whether persisting is worth a SQLite commit. */
59591
60561
  volatileStateFields: ["lastFetchedAt"]
@@ -59715,6 +60685,10 @@ var nativeObjectDetectionCapability = {
59715
60685
  * `scripts/check-runtime-state-durability.ts`.
59716
60686
  */
59717
60687
  durability: "restored",
60688
+ /**
60689
+ * History (D850): none — event-like and nested per class; detections live in the objects ledger.
60690
+ */
60691
+ history: "none",
59718
60692
  /** Clock fields: written, but excluded from the compare that decides
59719
60693
  * whether persisting is worth a SQLite commit. */
59720
60694
  volatileStateFields: ["lastFetchedAt"]
@@ -59998,7 +60972,11 @@ var navigationCapability = {
59998
60972
  * See `RuntimeStateDurability`. Enforced by
59999
60973
  * `scripts/check-runtime-state-durability.ts`.
60000
60974
  */
60001
- durability: "session"
60975
+ durability: "session",
60976
+ /**
60977
+ * History (D850): none — control state of a robotic camera, configuration-like.
60978
+ */
60979
+ history: "none"
60002
60980
  };
60003
60981
  /**
60004
60982
  * Network-link snapshot. Same shape for every provider (a Reolink wifi
@@ -60078,6 +61056,23 @@ onStatusChanged: { data: object({
60078
61056
  * `scripts/check-runtime-state-durability.ts`.
60079
61057
  */
60080
61058
  durability: "restored",
61059
+ /**
61060
+ * History (D850): recorded series.
61061
+ */
61062
+ history: { fields: {
61063
+ signalPercent: {
61064
+ kind: "gauge",
61065
+ unit: "%",
61066
+ deadband: 3,
61067
+ minIntervalMs: 6e4
61068
+ },
61069
+ rssiDbm: {
61070
+ kind: "gauge",
61071
+ unit: "dBm",
61072
+ deadband: 2,
61073
+ minIntervalMs: 6e4
61074
+ }
61075
+ } },
60081
61076
  /** Clock fields: written, but excluded from the compare that decides
60082
61077
  * whether persisting is worth a SQLite commit. */
60083
61078
  volatileStateFields: ["lastUpdated"]
@@ -60466,7 +61461,11 @@ onSent: { data: object({
60466
61461
  * See `RuntimeStateDurability`. Enforced by
60467
61462
  * `scripts/check-runtime-state-durability.ts`.
60468
61463
  */
60469
- durability: "session"
61464
+ durability: "session",
61465
+ /**
61466
+ * History (D850): none — `queueDepth` is outbox operational state, not a device trend.
61467
+ */
61468
+ history: "none"
60470
61469
  };
60471
61470
  /**
60472
61471
  * Generic numeric sensor — last-resort fallback when no typed numeric
@@ -60517,6 +61516,14 @@ var numericSensorCapability = {
60517
61516
  * `scripts/check-runtime-state-durability.ts`.
60518
61517
  */
60519
61518
  durability: "restored",
61519
+ /**
61520
+ * History (D850): recorded series. The unit is per device, read from the sibling `unit` field.
61521
+ */
61522
+ history: { fields: { value: {
61523
+ kind: "gauge",
61524
+ unitFrom: "unit",
61525
+ minIntervalMs: 3e4
61526
+ } } },
60520
61527
  /** Clock fields: written, but excluded from the compare that decides
60521
61528
  * whether persisting is worth a SQLite commit. */
60522
61529
  volatileStateFields: ["lastFetchedAt"]
@@ -60947,7 +61954,24 @@ var petFeederCapability = {
60947
61954
  * See `RuntimeStateDurability`. Enforced by
60948
61955
  * `scripts/check-runtime-state-durability.ts`.
60949
61956
  */
60950
- durability: "session"
61957
+ durability: "session",
61958
+ /**
61959
+ * History (D850): recorded series.
61960
+ */
61961
+ history: { fields: {
61962
+ foodLevel: { kind: "gauge" },
61963
+ food1: { kind: "gauge" },
61964
+ food2: { kind: "gauge" },
61965
+ batteryPower: {
61966
+ kind: "gauge",
61967
+ unit: "%",
61968
+ deadband: 2
61969
+ },
61970
+ desiccantLeftDays: {
61971
+ kind: "gauge",
61972
+ unit: "days"
61973
+ }
61974
+ } }
60951
61975
  };
60952
61976
  var VehicleSchema = object({
60953
61977
  id: string(),
@@ -61359,6 +62383,47 @@ var powerMeterCapability = {
61359
62383
  * `scripts/check-runtime-state-durability.ts`.
61360
62384
  */
61361
62385
  durability: "restored",
62386
+ /**
62387
+ * History (D850): recorded series. Gauges are floored at 30 s; `kwhTotal` is the one monotonic meter (counter).
62388
+ */
62389
+ history: { fields: {
62390
+ watts: {
62391
+ kind: "gauge",
62392
+ unit: "W",
62393
+ deadband: 1,
62394
+ minIntervalMs: 3e4
62395
+ },
62396
+ kwhTotal: {
62397
+ kind: "counter",
62398
+ unit: "kWh",
62399
+ deadband: .01,
62400
+ minIntervalMs: 6e4
62401
+ },
62402
+ volts: {
62403
+ kind: "gauge",
62404
+ unit: "V",
62405
+ deadband: 1,
62406
+ minIntervalMs: 3e4
62407
+ },
62408
+ amps: {
62409
+ kind: "gauge",
62410
+ unit: "A",
62411
+ deadband: .05,
62412
+ minIntervalMs: 3e4
62413
+ },
62414
+ va: {
62415
+ kind: "gauge",
62416
+ unit: "VA",
62417
+ deadband: 1,
62418
+ minIntervalMs: 3e4
62419
+ },
62420
+ powerFactor: {
62421
+ kind: "gauge",
62422
+ unit: "ratio",
62423
+ deadband: .01,
62424
+ minIntervalMs: 6e4
62425
+ }
62426
+ } },
61362
62427
  /** Clock fields: written, but excluded from the compare that decides
61363
62428
  * whether persisting is worth a SQLite commit. */
61364
62429
  volatileStateFields: ["lastFetchedAt"]
@@ -61426,6 +62491,14 @@ var presenceCapability = {
61426
62491
  * `scripts/check-runtime-state-durability.ts`.
61427
62492
  */
61428
62493
  durability: "restored",
62494
+ /**
62495
+ * History (D850): recorded series.
62496
+ */
62497
+ history: { fields: { batteryPercent: {
62498
+ kind: "gauge",
62499
+ unit: "%",
62500
+ deadband: 1
62501
+ } } },
61429
62502
  /** Clock fields: written, but excluded from the compare that decides
61430
62503
  * whether persisting is worth a SQLite commit. */
61431
62504
  volatileStateFields: ["lastChangedAt"]
@@ -61472,6 +62545,14 @@ var pressureSensorCapability = {
61472
62545
  * `scripts/check-runtime-state-durability.ts`.
61473
62546
  */
61474
62547
  durability: "restored",
62548
+ /**
62549
+ * History (D850): recorded series.
62550
+ */
62551
+ history: { fields: { hpa: {
62552
+ kind: "gauge",
62553
+ unit: "hPa",
62554
+ deadband: .1
62555
+ } } },
61475
62556
  /** Clock fields: written, but excluded from the compare that decides
61476
62557
  * whether persisting is worth a SQLite commit. */
61477
62558
  volatileStateFields: ["lastFetchedAt"]
@@ -61631,6 +62712,10 @@ var privacyMaskCapability = {
61631
62712
  * `scripts/check-runtime-state-durability.ts`.
61632
62713
  */
61633
62714
  durability: "restored",
62715
+ /**
62716
+ * History (D850): none — configuration.
62717
+ */
62718
+ history: "none",
61634
62719
  /** Clock fields: written, but excluded from the compare that decides
61635
62720
  * whether persisting is worth a SQLite commit. */
61636
62721
  volatileStateFields: ["lastFetchedAt"]
@@ -61992,7 +63077,11 @@ var ptzAutotrackCapability = {
61992
63077
  * See `RuntimeStateDurability`. Enforced by
61993
63078
  * `scripts/check-runtime-state-durability.ts`.
61994
63079
  */
61995
- durability: "session"
63080
+ durability: "session",
63081
+ /**
63082
+ * History (D850): none — configuration and capability.
63083
+ */
63084
+ history: "none"
61996
63085
  };
61997
63086
  DeviceType.Camera, DeviceType.Sensor, DeviceType.Switch, method(object({ deviceId: number().int().nonnegative() }), object({ success: literal(true) }), {
61998
63087
  kind: "mutation",
@@ -63450,6 +64539,10 @@ var recordingOnboardCapability = {
63450
64539
  * `scripts/check-runtime-state-durability.ts`.
63451
64540
  */
63452
64541
  durability: "restored",
64542
+ /**
64543
+ * History (D850): none — SD-card configuration and window inventory; arrays.
64544
+ */
64545
+ history: "none",
63453
64546
  /** Clock fields: written, but excluded from the compare that decides
63454
64547
  * whether persisting is worth a SQLite commit. */
63455
64548
  volatileStateFields: ["lastFetchedAt"]
@@ -63523,7 +64616,11 @@ getStatus: method(object({ deviceId: number() }), RecordingSignalStatusSchema) }
63523
64616
  * See `RuntimeStateDurability`. Enforced by
63524
64617
  * `scripts/check-runtime-state-durability.ts`.
63525
64618
  */
63526
- durability: "session"
64619
+ durability: "session",
64620
+ /**
64621
+ * History (D850): none — recording intent is already in the recordings ledger.
64622
+ */
64623
+ history: "none"
63527
64624
  };
63528
64625
  /**
63529
64626
  * scene-monitor — device-scoped reference-region state cap. An operator marks
@@ -63914,7 +65011,11 @@ var sceneMonitorCapability = {
63914
65011
  * See `RuntimeStateDurability`. Enforced by
63915
65012
  * `scripts/check-runtime-state-durability.ts`.
63916
65013
  */
63917
- durability: "session"
65014
+ durability: "session",
65015
+ /**
65016
+ * History (D850): none — nested configuration.
65017
+ */
65018
+ history: "none"
63918
65019
  };
63919
65020
  /**
63920
65021
  * Per-stage gating mode applied to the zones a rule references.
@@ -64065,7 +65166,11 @@ var scriptRunnerCapability = {
64065
65166
  * See `RuntimeStateDurability`. Enforced by
64066
65167
  * `scripts/check-runtime-state-durability.ts`.
64067
65168
  */
64068
- durability: "session"
65169
+ durability: "session",
65170
+ /**
65171
+ * History (D850): none — transient; run results belong in a ledger.
65172
+ */
65173
+ history: "none"
64069
65174
  };
64070
65175
  /**
64071
65176
  * Smoke alarm sensor — boolean "is smoke currently detected" with
@@ -64100,6 +65205,10 @@ var smokeCapability = {
64100
65205
  * `scripts/check-runtime-state-durability.ts`.
64101
65206
  */
64102
65207
  durability: "restored",
65208
+ /**
65209
+ * History (D850): recorded series.
65210
+ */
65211
+ history: { fields: { detected: { kind: "boolean" } } },
64103
65212
  /** Clock fields: written, but excluded from the compare that decides
64104
65213
  * whether persisting is worth a SQLite commit. */
64105
65214
  volatileStateFields: ["lastChangedAt"]
@@ -64199,6 +65308,10 @@ var streamCatalogCapability = {
64199
65308
  * `scripts/check-runtime-state-durability.ts`.
64200
65309
  */
64201
65310
  durability: "restored",
65311
+ /**
65312
+ * History (D850): none — stream inventory.
65313
+ */
65314
+ history: "none",
64202
65315
  /** Clock field: written, but excluded from the compare that decides whether
64203
65316
  * persisting is worth a SQLite commit — the descriptors are the value. */
64204
65317
  volatileStateFields: ["lastFetchedAt"]
@@ -64348,6 +65461,10 @@ var streamParamsCapability = {
64348
65461
  * `scripts/check-runtime-state-durability.ts`.
64349
65462
  */
64350
65463
  durability: "restored",
65464
+ /**
65465
+ * History (D850): none — encoder configuration.
65466
+ */
65467
+ history: "none",
64351
65468
  /** Clock fields: written, but excluded from the compare that decides
64352
65469
  * whether persisting is worth a SQLite commit. */
64353
65470
  volatileStateFields: ["lastFetchedAt"]
@@ -64403,6 +65520,10 @@ var switchCapability = {
64403
65520
  * `scripts/check-runtime-state-durability.ts`.
64404
65521
  */
64405
65522
  durability: "restored",
65523
+ /**
65524
+ * History (D850): recorded series.
65525
+ */
65526
+ history: { fields: { on: { kind: "boolean" } } },
64406
65527
  /** Clock fields: written, but excluded from the compare that decides
64407
65528
  * whether persisting is worth a SQLite commit. */
64408
65529
  volatileStateFields: ["lastChangedAt"],
@@ -64417,6 +65538,21 @@ var switchCapability = {
64417
65538
  }
64418
65539
  }] }
64419
65540
  };
65541
+ /** C0 controls, DEL and the C1 range: none of them belongs in a name. */
65542
+ function hasControlCharacter(value) {
65543
+ for (const char of value) {
65544
+ const code = char.codePointAt(0) ?? 0;
65545
+ if (code <= 31 || code >= 127 && code <= 159) return true;
65546
+ }
65547
+ return false;
65548
+ }
65549
+ 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" }));
65550
+ /** What every reader gets: the name to show, and whether the hub chose it itself. */
65551
+ var ServerNameInfoSchema = object({
65552
+ name: string(),
65553
+ /** `true` when nobody named the hub: `name` is the machine hostname. */
65554
+ isDefault: boolean()
65555
+ });
64420
65556
  /**
64421
65557
  * system — system-scoped singleton capability exposing hub-level
64422
65558
  * health, feature flags, network interface enumeration, and the
@@ -64446,6 +65582,12 @@ var FeatureManifestSchema = object({
64446
65582
  backup: boolean(),
64447
65583
  repl: boolean()
64448
65584
  });
65585
+ /**
65586
+ * `system.info`: the feature flags plus the hub's human name (D861). The name is
65587
+ * `{ name, isDefault }` — `isDefault: true` means nobody named the hub and `name`
65588
+ * is the machine hostname.
65589
+ */
65590
+ var SystemInfoSchema = FeatureManifestSchema.extend({ serverName: ServerNameInfoSchema });
64449
65591
  var HealthStatusSchema = object({
64450
65592
  status: literal("ok"),
64451
65593
  uptime: number()
@@ -64918,7 +66060,7 @@ var LoggingSettingsStateSchema = object({
64918
66060
  opsLogRetentionDays: number().int().min(0),
64919
66061
  persisted: boolean()
64920
66062
  });
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(), {
66063
+ 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
66064
  kind: "mutation",
64923
66065
  auth: "admin"
64924
66066
  }), method(_void(), _void(), {
@@ -64964,6 +66106,10 @@ var tamperCapability = {
64964
66106
  * `scripts/check-runtime-state-durability.ts`.
64965
66107
  */
64966
66108
  durability: "restored",
66109
+ /**
66110
+ * History (D850): recorded series.
66111
+ */
66112
+ history: { fields: { tampered: { kind: "boolean" } } },
64967
66113
  /** Clock fields: written, but excluded from the compare that decides
64968
66114
  * whether persisting is worth a SQLite commit. */
64969
66115
  volatileStateFields: ["lastChangedAt"]
@@ -65019,6 +66165,14 @@ var temperatureSensorCapability = {
65019
66165
  * `scripts/check-runtime-state-durability.ts`.
65020
66166
  */
65021
66167
  durability: "restored",
66168
+ /**
66169
+ * History (D850): recorded series.
66170
+ */
66171
+ history: { fields: { celsius: {
66172
+ kind: "gauge",
66173
+ unit: "°C",
66174
+ deadband: .1
66175
+ } } },
65022
66176
  /** Clock fields: written, but excluded from the compare that decides
65023
66177
  * whether persisting is worth a SQLite commit. */
65024
66178
  volatileStateFields: ["lastFetchedAt"]
@@ -65097,7 +66251,11 @@ var updateCapability = {
65097
66251
  * See `RuntimeStateDurability`. Enforced by
65098
66252
  * `scripts/check-runtime-state-durability.ts`.
65099
66253
  */
65100
- durability: "session"
66254
+ durability: "session",
66255
+ /**
66256
+ * History (D850): none — text and state.
66257
+ */
66258
+ history: "none"
65101
66259
  };
65102
66260
  var UserSummarySchema = object({
65103
66261
  id: string(),
@@ -65454,7 +66612,37 @@ var vacuumControlCapability = {
65454
66612
  * See `RuntimeStateDurability`. Enforced by
65455
66613
  * `scripts/check-runtime-state-durability.ts`.
65456
66614
  */
65457
- durability: "session"
66615
+ durability: "session",
66616
+ /**
66617
+ * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
66618
+ */
66619
+ history: { fields: {
66620
+ batteryLevel: {
66621
+ kind: "gauge",
66622
+ unit: "%",
66623
+ deadband: 2
66624
+ },
66625
+ "cleanWater.level": {
66626
+ kind: "gauge",
66627
+ unit: "%",
66628
+ deadband: 2
66629
+ },
66630
+ "dirtyWater.level": {
66631
+ kind: "gauge",
66632
+ unit: "%",
66633
+ deadband: 2
66634
+ },
66635
+ "detergent.level": {
66636
+ kind: "gauge",
66637
+ unit: "%",
66638
+ deadband: 2
66639
+ },
66640
+ "dustBin.level": {
66641
+ kind: "gauge",
66642
+ unit: "%",
66643
+ deadband: 2
66644
+ }
66645
+ } }
65458
66646
  };
65459
66647
  var ValveStatusSchema = object({
65460
66648
  /** Lifecycle state of the valve. */
@@ -65513,7 +66701,15 @@ var valveCapability = {
65513
66701
  * See `RuntimeStateDurability`. Enforced by
65514
66702
  * `scripts/check-runtime-state-durability.ts`.
65515
66703
  */
65516
- durability: "session"
66704
+ durability: "session",
66705
+ /**
66706
+ * History (D850): recorded series. Actuator tier: position keeps every change.
66707
+ */
66708
+ history: { fields: { position: {
66709
+ kind: "gauge",
66710
+ unit: "%",
66711
+ minIntervalMs: 0
66712
+ } } }
65517
66713
  };
65518
66714
  /**
65519
66715
  * Vibration / shake / impact sensor. Drives Home Assistant
@@ -65543,6 +66739,10 @@ var vibrationCapability = {
65543
66739
  * `scripts/check-runtime-state-durability.ts`.
65544
66740
  */
65545
66741
  durability: "restored",
66742
+ /**
66743
+ * History (D850): recorded series.
66744
+ */
66745
+ history: { fields: { detected: { kind: "boolean" } } },
65546
66746
  /** Clock fields: written, but excluded from the compare that decides
65547
66747
  * whether persisting is worth a SQLite commit. */
65548
66748
  volatileStateFields: ["lastChangedAt"]
@@ -65626,7 +66826,22 @@ var waterHeaterCapability = {
65626
66826
  * See `RuntimeStateDurability`. Enforced by
65627
66827
  * `scripts/check-runtime-state-durability.ts`.
65628
66828
  */
65629
- durability: "session"
66829
+ durability: "session",
66830
+ /**
66831
+ * History (D850): recorded series. The schema carries no unit; providers publish Celsius. Setpoint keeps every change.
66832
+ */
66833
+ history: { fields: {
66834
+ currentTemp: {
66835
+ kind: "gauge",
66836
+ unit: "°C",
66837
+ deadband: .5
66838
+ },
66839
+ targetTemp: {
66840
+ kind: "gauge",
66841
+ unit: "°C",
66842
+ minIntervalMs: 0
66843
+ }
66844
+ } }
65630
66845
  };
65631
66846
  /**
65632
66847
  * Weather provider cap. Models HA `weather.*` entities — a read-only
@@ -65692,7 +66907,32 @@ var weatherCapability = {
65692
66907
  * See `RuntimeStateDurability`. Enforced by
65693
66908
  * `scripts/check-runtime-state-durability.ts`.
65694
66909
  */
65695
- durability: "session"
66910
+ durability: "session",
66911
+ /**
66912
+ * History (D850): recorded series. Units follow the sibling `*Unit` fields.
66913
+ */
66914
+ history: { fields: {
66915
+ temperature: {
66916
+ kind: "gauge",
66917
+ unitFrom: "temperatureUnit",
66918
+ deadband: .2
66919
+ },
66920
+ humidity: {
66921
+ kind: "gauge",
66922
+ unit: "%",
66923
+ deadband: 1
66924
+ },
66925
+ pressure: {
66926
+ kind: "gauge",
66927
+ unitFrom: "pressureUnit",
66928
+ deadband: .5
66929
+ },
66930
+ windSpeed: {
66931
+ kind: "gauge",
66932
+ unitFrom: "windSpeedUnit",
66933
+ deadband: .5
66934
+ }
66935
+ } }
65696
66936
  };
65697
66937
  /**
65698
66938
  * Per-zone occupancy aggregation produced by the analytics frame
@@ -65934,7 +67174,11 @@ var zoneAnalyticsCapability = {
65934
67174
  * See `RuntimeStateDurability`. Enforced by
65935
67175
  * `scripts/check-runtime-state-durability.ts`.
65936
67176
  */
65937
- durability: "session"
67177
+ durability: "session",
67178
+ /**
67179
+ * History (D850): none — occupancy is the addon series `pipeline-analytics/occupancy`; the rest is per-zone arrays keyed by runtime ids.
67180
+ */
67181
+ history: "none"
65938
67182
  };
65939
67183
  /**
65940
67184
  * Stages a {@link ZoneRule} can apply to. Discriminator on the rules
@@ -66019,7 +67263,11 @@ var zoneRulesCapability = {
66019
67263
  * See `RuntimeStateDurability`. Enforced by
66020
67264
  * `scripts/check-runtime-state-durability.ts`.
66021
67265
  */
66022
- durability: "restored"
67266
+ durability: "restored",
67267
+ /**
67268
+ * History (D850): none — configuration arrays.
67269
+ */
67270
+ history: "none"
66023
67271
  };
66024
67272
  /**
66025
67273
  * `training-provider` — ONE cloud that can run the CamStack trainer.
@@ -69184,6 +70432,54 @@ Object.freeze({
69184
70432
  addonId: null,
69185
70433
  access: "create"
69186
70434
  },
70435
+ "deviceCredentials.deleteDeviceCredential": {
70436
+ capName: "device-credentials",
70437
+ capScope: "system",
70438
+ addonId: null,
70439
+ access: "delete"
70440
+ },
70441
+ "deviceCredentials.getDeviceCaStatus": {
70442
+ capName: "device-credentials",
70443
+ capScope: "system",
70444
+ addonId: null,
70445
+ access: "view"
70446
+ },
70447
+ "deviceCredentials.getDeviceCertificateSettings": {
70448
+ capName: "device-credentials",
70449
+ capScope: "system",
70450
+ addonId: null,
70451
+ access: "view"
70452
+ },
70453
+ "deviceCredentials.listDeviceCredentials": {
70454
+ capName: "device-credentials",
70455
+ capScope: "system",
70456
+ addonId: null,
70457
+ access: "view"
70458
+ },
70459
+ "deviceCredentials.renameDeviceCredential": {
70460
+ capName: "device-credentials",
70461
+ capScope: "system",
70462
+ addonId: null,
70463
+ access: "create"
70464
+ },
70465
+ "deviceCredentials.revokeDeviceCredential": {
70466
+ capName: "device-credentials",
70467
+ capScope: "system",
70468
+ addonId: null,
70469
+ access: "delete"
70470
+ },
70471
+ "deviceCredentials.setDeviceCertificateSettings": {
70472
+ capName: "device-credentials",
70473
+ capScope: "system",
70474
+ addonId: null,
70475
+ access: "create"
70476
+ },
70477
+ "deviceCredentials.startEnrollment": {
70478
+ capName: "device-credentials",
70479
+ capScope: "system",
70480
+ addonId: null,
70481
+ access: "create"
70482
+ },
69187
70483
  "deviceDiscovery.adoptDevice": {
69188
70484
  capName: "device-discovery",
69189
70485
  capScope: "device",
@@ -69286,6 +70582,66 @@ Object.freeze({
69286
70582
  addonId: null,
69287
70583
  access: "create"
69288
70584
  },
70585
+ "deviceHistory.declareSeries": {
70586
+ capName: "device-history",
70587
+ capScope: "system",
70588
+ addonId: null,
70589
+ access: "create"
70590
+ },
70591
+ "deviceHistory.getDeviceEnabled": {
70592
+ capName: "device-history",
70593
+ capScope: "system",
70594
+ addonId: null,
70595
+ access: "view"
70596
+ },
70597
+ "deviceHistory.getStatus": {
70598
+ capName: "device-history",
70599
+ capScope: "system",
70600
+ addonId: null,
70601
+ access: "view"
70602
+ },
70603
+ "deviceHistory.listNodeSeries": {
70604
+ capName: "device-history",
70605
+ capScope: "system",
70606
+ addonId: null,
70607
+ access: "view"
70608
+ },
70609
+ "deviceHistory.listSeries": {
70610
+ capName: "device-history",
70611
+ capScope: "system",
70612
+ addonId: null,
70613
+ access: "view"
70614
+ },
70615
+ "deviceHistory.query": {
70616
+ capName: "device-history",
70617
+ capScope: "system",
70618
+ addonId: null,
70619
+ access: "view"
70620
+ },
70621
+ "deviceHistory.queryNode": {
70622
+ capName: "device-history",
70623
+ capScope: "system",
70624
+ addonId: null,
70625
+ access: "view"
70626
+ },
70627
+ "deviceHistory.record": {
70628
+ capName: "device-history",
70629
+ capScope: "system",
70630
+ addonId: null,
70631
+ access: "create"
70632
+ },
70633
+ "deviceHistory.recordBuckets": {
70634
+ capName: "device-history",
70635
+ capScope: "system",
70636
+ addonId: null,
70637
+ access: "create"
70638
+ },
70639
+ "deviceHistory.setDeviceEnabled": {
70640
+ capName: "device-history",
70641
+ capScope: "system",
70642
+ addonId: null,
70643
+ access: "create"
70644
+ },
69289
70645
  "deviceManager.addLocation": {
69290
70646
  capName: "device-manager",
69291
70647
  capScope: "system",
@@ -69364,6 +70720,12 @@ Object.freeze({
69364
70720
  addonId: null,
69365
70721
  access: "create"
69366
70722
  },
70723
+ "deviceManager.cleanupDeletedDevicesData": {
70724
+ capName: "device-manager",
70725
+ capScope: "system",
70726
+ addonId: null,
70727
+ access: "create"
70728
+ },
69367
70729
  "deviceManager.createDevice": {
69368
70730
  capName: "device-manager",
69369
70731
  capScope: "system",
@@ -69544,6 +70906,12 @@ Object.freeze({
69544
70906
  addonId: null,
69545
70907
  access: "view"
69546
70908
  },
70909
+ "deviceManager.listDeletedSince": {
70910
+ capName: "device-manager",
70911
+ capScope: "system",
70912
+ addonId: null,
70913
+ access: "view"
70914
+ },
69547
70915
  "deviceManager.listDeviceIdsByCaps": {
69548
70916
  capName: "device-manager",
69549
70917
  capScope: "system",
@@ -69952,6 +71320,18 @@ Object.freeze({
69952
71320
  addonId: null,
69953
71321
  access: "create"
69954
71322
  },
71323
+ "deviceRemovalHook.listDeviceData": {
71324
+ capName: "device-removal-hook",
71325
+ capScope: "system",
71326
+ addonId: null,
71327
+ access: "view"
71328
+ },
71329
+ "deviceRemovalHook.onDeviceRemoved": {
71330
+ capName: "device-removal-hook",
71331
+ capScope: "system",
71332
+ addonId: null,
71333
+ access: "create"
71334
+ },
69955
71335
  "deviceState.claimFields": {
69956
71336
  capName: "device-state",
69957
71337
  capScope: "system",
@@ -70384,6 +71764,12 @@ Object.freeze({
70384
71764
  addonId: null,
70385
71765
  access: "delete"
70386
71766
  },
71767
+ "keychain.deleteDeviceScope": {
71768
+ capName: "keychain",
71769
+ capScope: "system",
71770
+ addonId: null,
71771
+ access: "delete"
71772
+ },
70387
71773
  "keychain.getState": {
70388
71774
  capName: "keychain",
70389
71775
  capScope: "system",
@@ -70822,6 +72208,12 @@ Object.freeze({
70822
72208
  addonId: null,
70823
72209
  access: "create"
70824
72210
  },
72211
+ "localNetwork.useStoredUploadedCertificate": {
72212
+ capName: "local-network",
72213
+ capScope: "system",
72214
+ addonId: null,
72215
+ access: "create"
72216
+ },
70825
72217
  "lockControl.getStatus": {
70826
72218
  capName: "lock-control",
70827
72219
  capScope: "device",
@@ -71344,6 +72736,54 @@ Object.freeze({
71344
72736
  addonId: null,
71345
72737
  access: "create"
71346
72738
  },
72739
+ "nodeCertificates.confirmMeshLeaf": {
72740
+ capName: "node-certificates",
72741
+ capScope: "system",
72742
+ addonId: null,
72743
+ access: "create"
72744
+ },
72745
+ "nodeCertificates.forgetHub": {
72746
+ capName: "node-certificates",
72747
+ capScope: "system",
72748
+ addonId: null,
72749
+ access: "delete"
72750
+ },
72751
+ "nodeCertificates.getCertificates": {
72752
+ capName: "node-certificates",
72753
+ capScope: "system",
72754
+ addonId: null,
72755
+ access: "view"
72756
+ },
72757
+ "nodeCertificates.installHttpsCertificate": {
72758
+ capName: "node-certificates",
72759
+ capScope: "system",
72760
+ addonId: null,
72761
+ access: "create"
72762
+ },
72763
+ "nodeCertificates.installMeshLeaf": {
72764
+ capName: "node-certificates",
72765
+ capScope: "system",
72766
+ addonId: null,
72767
+ access: "create"
72768
+ },
72769
+ "nodeCertificates.prepareHttpsCertificate": {
72770
+ capName: "node-certificates",
72771
+ capScope: "system",
72772
+ addonId: null,
72773
+ access: "create"
72774
+ },
72775
+ "nodeCertificates.prepareMeshRenewal": {
72776
+ capName: "node-certificates",
72777
+ capScope: "system",
72778
+ addonId: null,
72779
+ access: "create"
72780
+ },
72781
+ "nodeCertificates.rollbackMeshLeaf": {
72782
+ capName: "node-certificates",
72783
+ capScope: "system",
72784
+ addonId: null,
72785
+ access: "create"
72786
+ },
71347
72787
  "nodes.clusterAddonStatus": {
71348
72788
  capName: "nodes",
71349
72789
  capScope: "system",
@@ -76035,6 +77475,26 @@ Object.freeze({
76035
77475
  form: "single",
76036
77476
  optional: false
76037
77477
  }],
77478
+ "deviceHistory.getDeviceEnabled": [{
77479
+ name: "deviceId",
77480
+ form: "single",
77481
+ optional: false
77482
+ }],
77483
+ "deviceHistory.listSeries": [{
77484
+ name: "deviceId",
77485
+ form: "single",
77486
+ optional: false
77487
+ }],
77488
+ "deviceHistory.query": [{
77489
+ name: "deviceId",
77490
+ form: "single",
77491
+ optional: false
77492
+ }],
77493
+ "deviceHistory.setDeviceEnabled": [{
77494
+ name: "deviceId",
77495
+ form: "single",
77496
+ optional: false
77497
+ }],
76038
77498
  "deviceManager.adoptionRelease": [{
76039
77499
  name: "camDeviceId",
76040
77500
  form: "single",
@@ -76328,6 +77788,11 @@ Object.freeze({
76328
77788
  form: "single",
76329
77789
  optional: false
76330
77790
  }],
77791
+ "deviceRemovalHook.onDeviceRemoved": [{
77792
+ name: "deviceId",
77793
+ form: "single",
77794
+ optional: false
77795
+ }],
76331
77796
  "deviceState.claimFields": [{
76332
77797
  name: "deviceId",
76333
77798
  form: "single",
@@ -76517,6 +77982,11 @@ Object.freeze({
76517
77982
  form: "single",
76518
77983
  optional: false
76519
77984
  }],
77985
+ "keychain.deleteDeviceScope": [{
77986
+ name: "deviceId",
77987
+ form: "single",
77988
+ optional: false
77989
+ }],
76520
77990
  "lawnMowerControl.dock": [{
76521
77991
  name: "deviceId",
76522
77992
  form: "single",
@@ -78213,6 +79683,7 @@ Object.freeze({
78213
79683
  "network-access": "ingress",
78214
79684
  "smtp-provider": "email"
78215
79685
  });
79686
+ DeviceType.Camera;
78216
79687
  var G711_SCALE_CORRECTION_DB = {
78217
79688
  PCMU: 20 * Math.log10(4),
78218
79689
  PCMA: 20 * Math.log10(8)
@@ -80997,6 +82468,8 @@ function eventKindLabel(kind, locale) {
80997
82468
  const key = kind.trim().toLowerCase();
80998
82469
  return isEventKindLabelKey(key) ? EVENT_KIND_LABELS[key][locale] : kind;
80999
82470
  }
82471
+ AppPageLangSchema.options;
82472
+ record(string().min(1), string());
81000
82473
  /**
81001
82474
  * TimelapseRule — the STANDALONE scheduled timelapse producer's rule model.
81002
82475
  *
@@ -81425,6 +82898,32 @@ function slideInsideFrame(rect, frameWidth, frameHeight) {
81425
82898
  h
81426
82899
  };
81427
82900
  }
82901
+ /** Slider bounds. `0` is "disabled"; anything in 1..9 is raised to `min`. */
82902
+ var FACE_RESCORE_INTERVAL_FIELD = {
82903
+ min: 0,
82904
+ max: 1440,
82905
+ step: 5,
82906
+ default: 60
82907
+ };
82908
+ /**
82909
+ * Narrow a stored value to minutes. `0` ⇒ disabled; a positive value under
82910
+ * {@link FACE_RESCORE_INTERVAL_MIN_RUNNING} is raised to it; junk or absent ⇒
82911
+ * the default (an unreadable setting must not switch the job off nor storm it).
82912
+ */
82913
+ function readFaceRescoreIntervalMinutes(value) {
82914
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0) return FACE_RESCORE_INTERVAL_FIELD.default;
82915
+ if (value === 0) return 0;
82916
+ return Math.min(FACE_RESCORE_INTERVAL_FIELD.max, Math.max(10, Math.floor(value)));
82917
+ }
82918
+ /** The interval out of a hydrated payload; a `null` view (mid-boot) is the default. */
82919
+ function pickFaceRescoreIntervalMinutes(view) {
82920
+ if (view === null) return FACE_RESCORE_INTERVAL_FIELD.default;
82921
+ for (const section of view.sections) for (const entry of section.fields) {
82922
+ if (typeof entry !== "object" || entry === null || !("key" in entry)) continue;
82923
+ if (entry.key === "faceRescoreIntervalMinutes") return readFaceRescoreIntervalMinutes("value" in entry ? entry.value : void 0);
82924
+ }
82925
+ return FACE_RESCORE_INTERVAL_FIELD.default;
82926
+ }
81428
82927
  /**
81429
82928
  * WHICH delivered frames the decode worker retains a native copy of.
81430
82929
  *
@@ -81909,6 +83408,76 @@ function encodeVectorBase64(vector) {
81909
83408
  function vectorDimFromBase64(encoded) {
81910
83409
  return Math.floor(Buffer.from(encoded, "base64").byteLength / 4);
81911
83410
  }
83411
+ /** How often an implementer re-asks for tombstones after its start-up pass. */
83412
+ var REMOVAL_RECONCILE_INTERVAL_MS = 360 * 60 * 1e3;
83413
+ /** One reconcile pass over every tombstone inside the retention window. */
83414
+ async function reconcileRemovedDevices(opts) {
83415
+ const now = opts.now ?? (() => Date.now());
83416
+ const api = opts.api;
83417
+ if (api === void 0) {
83418
+ opts.logger.warn("device removal reconcile skipped — no device-manager api");
83419
+ return {
83420
+ read: false,
83421
+ applied: 0,
83422
+ failed: 0
83423
+ };
83424
+ }
83425
+ let tombstones;
83426
+ try {
83427
+ tombstones = await api.deviceManager.listDeletedSince.query({ sinceMs: now() - DEVICE_TOMBSTONE_RETENTION_MS });
83428
+ } catch (err) {
83429
+ opts.logger.warn("device removal reconcile skipped — tombstones unreadable, nothing deleted", { meta: { error: errMsg(err) } });
83430
+ return {
83431
+ read: false,
83432
+ applied: 0,
83433
+ failed: 0
83434
+ };
83435
+ }
83436
+ let applied = 0;
83437
+ let failed = 0;
83438
+ for (const tombstone of tombstones) try {
83439
+ const result = await opts.remove(tombstone);
83440
+ applied += 1;
83441
+ if (Object.values(result.counts).reduce((sum, n) => sum + n, 0) > 0) opts.logger.info("device removal reconcile cleaned a missed deletion", {
83442
+ tags: { deviceId: tombstone.deviceId },
83443
+ meta: {
83444
+ counts: result.counts,
83445
+ deletedAt: tombstone.deletedAt
83446
+ }
83447
+ });
83448
+ } catch (err) {
83449
+ failed += 1;
83450
+ opts.logger.warn("device removal reconcile failed for a device — retried next pass", {
83451
+ tags: { deviceId: tombstone.deviceId },
83452
+ meta: { error: errMsg(err) }
83453
+ });
83454
+ }
83455
+ return {
83456
+ read: true,
83457
+ applied,
83458
+ failed
83459
+ };
83460
+ }
83461
+ /**
83462
+ * Run the reconcile now and then periodically. Returns the disposer. The timer
83463
+ * is unref'd and a pass never overlaps the previous one.
83464
+ */
83465
+ function armRemovalReconcile(opts) {
83466
+ let running = false;
83467
+ const pass = () => {
83468
+ if (running) return;
83469
+ running = true;
83470
+ reconcileRemovedDevices(opts).catch((err) => {
83471
+ opts.logger.warn("device removal reconcile pass crashed", { meta: { error: errMsg(err) } });
83472
+ }).finally(() => {
83473
+ running = false;
83474
+ });
83475
+ };
83476
+ pass();
83477
+ const timer = setInterval(pass, REMOVAL_RECONCILE_INTERVAL_MS);
83478
+ timer.unref?.();
83479
+ return () => clearInterval(timer);
83480
+ }
81912
83481
  //#endregion
81913
83482
  //#region src/pipeline-analytics/cluster-model-pin.ts
81914
83483
  /**
@@ -82205,4 +83774,4 @@ function buildClipModelRegistry(entries) {
82205
83774
  /** The built-in catalog's registry. */
82206
83775
  var BUILTIN_CLIP_MODELS = buildClipModelRegistry(CLIP_IMAGE_MODELS);
82207
83776
  //#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 };
83777
+ 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 };