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