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