@camstack/system 1.2.436 → 1.2.438
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/addon-runner.js +64 -12
- package/dist/addon-runner.mjs +65 -13
- package/dist/{agent-https-B8lKYVtU.mjs → agent-https-BPfHrI4c.mjs} +3 -3
- package/dist/auth/login-session-manager.d.ts +2 -0
- package/dist/auth/session-revocation-bus.d.ts +32 -0
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
- package/dist/builtins/alerts/alerts.addon.js +7 -1
- package/dist/builtins/alerts/alerts.addon.mjs +7 -1
- package/dist/builtins/autotrack/index.js +1 -1
- package/dist/builtins/autotrack/index.mjs +1 -1
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +2 -2
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +2 -2
- package/dist/builtins/calendars/calendars.addon.js +1 -1
- package/dist/builtins/calendars/calendars.addon.mjs +1 -1
- package/dist/builtins/camera-grid/index.js +9 -1
- package/dist/builtins/camera-grid/index.mjs +9 -1
- package/dist/builtins/composer/composer.addon.js +2 -2
- package/dist/builtins/composer/composer.addon.mjs +2 -2
- package/dist/builtins/console-logging/index.js +12 -5
- package/dist/builtins/console-logging/index.mjs +12 -5
- package/dist/builtins/core-blocks/core-blocks.addon.js +2 -2
- package/dist/builtins/core-blocks/core-blocks.addon.mjs +5 -5
- package/dist/builtins/device-manager/device-manager.addon.d.ts +5 -0
- package/dist/builtins/device-manager/device-manager.addon.js +702 -28
- package/dist/builtins/device-manager/device-manager.addon.mjs +702 -28
- package/dist/builtins/device-manager/device-meta-types.d.ts +4 -0
- package/dist/builtins/device-manager/device-provider-context.d.ts +9 -0
- package/dist/builtins/device-manager/device-removal-hooks.d.ts +103 -0
- package/dist/builtins/device-manager/device-row-store.d.ts +1 -0
- package/dist/builtins/device-manager/device-tombstone-store.d.ts +58 -0
- package/dist/builtins/device-manager/removal-cleanup.d.ts +50 -0
- package/dist/builtins/hub-forwarder/index.js +1 -1
- package/dist/builtins/hub-forwarder/index.mjs +1 -1
- package/dist/builtins/keychain/index.js +37 -4
- package/dist/builtins/keychain/index.mjs +37 -4
- package/dist/builtins/keychain/keychain-service.d.ts +14 -0
- package/dist/builtins/keychain/keychain-store.d.ts +1 -1
- package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
- package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
- package/dist/builtins/local-auth/local-auth.addon.js +53 -12
- package/dist/builtins/local-auth/local-auth.addon.mjs +53 -13
- package/dist/builtins/local-network/local-network.addon.js +10 -1
- package/dist/builtins/local-network/local-network.addon.mjs +13 -4
- package/dist/builtins/loki-logging/index.js +28 -5
- package/dist/builtins/loki-logging/index.mjs +28 -5
- package/dist/builtins/native-metrics/native-metrics.addon.js +11 -1
- package/dist/builtins/native-metrics/native-metrics.addon.mjs +20 -10
- package/dist/builtins/platform-probe/index.js +1 -1
- package/dist/builtins/platform-probe/index.mjs +8 -8
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
- package/dist/builtins/snapshot/index.js +11 -1
- package/dist/builtins/snapshot/index.mjs +11 -1
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +4 -1
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +4 -1
- package/dist/builtins/sqlite-storage/index.js +1 -1
- package/dist/builtins/sqlite-storage/index.mjs +1 -1
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +3 -3
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +3 -3
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
- package/dist/builtins/system-config/system-config.addon.d.ts +9 -0
- package/dist/builtins/system-config/system-config.addon.js +135 -72
- package/dist/builtins/system-config/system-config.addon.mjs +135 -73
- package/dist/builtins/winston-logging/index.js +14 -5
- package/dist/builtins/winston-logging/index.mjs +14 -5
- package/dist/{composition-sources-BAOlCu4j.js → composition-sources-DI3Z83vG.js} +1 -1
- package/dist/{composition-sources-gN_BWUKp.mjs → composition-sources-DpHGCjdL.mjs} +1 -1
- package/dist/{constants-BFpowodq.mjs → constants-DQK705Sb.mjs} +1 -1
- package/dist/{constants-GENKqk9k.js → constants-wkcn5Ij3.js} +1 -1
- package/dist/{device-ca-CuWuRW9N.js → device-ca-BSvkXqyI.js} +1 -1
- package/dist/{device-ca-BNM5ai4t.mjs → device-ca-DvIZjXIl.mjs} +1 -1
- package/dist/{dist-DjD2M79P.mjs → dist-Dc8GKC5H.mjs} +301 -6
- package/dist/{dist-DVe0Nsp8.js → dist-GgG-7amw.js} +348 -5
- package/dist/file-host-worker.js +1 -1
- package/dist/file-host-worker.mjs +1 -1
- package/dist/{hub-mdns-ciao-DJRwtlA8.mjs → hub-mdns-ciao-DMlQTdPU.mjs} +1 -1
- package/dist/i18n/catalog-registry.d.ts +35 -0
- package/dist/i18n/index.d.ts +2 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +666 -21
- package/dist/index.mjs +676 -38
- package/dist/kernel/gc-census.d.ts +18 -1
- package/dist/kernel/settings-view-types.d.ts +2 -0
- package/dist/kernel/transport/local-transport.d.ts +3 -0
- package/dist/kernel/transport/peer-answered-error.d.ts +5 -1
- package/dist/{restore-archive-D4h904rb.js → restore-archive-CTRz8v9o.js} +1 -1
- package/dist/{restore-archive-BxmP1ChO.mjs → restore-archive-DPg9duVY.mjs} +1 -1
- package/dist/{retired-settings-keys-CYP5IZJ5.js → retired-settings-keys-Dr_4lfKu.js} +1 -1
- package/dist/{retired-settings-keys-CQaknvx1.mjs → retired-settings-keys-Is0zO8gX.mjs} +1 -1
- package/dist/{wal-maintenance-CaDsrJM_.mjs → wal-maintenance-Bx3lcVA7.mjs} +0 -0
- package/dist/{wal-maintenance-Br60onAQ.js → wal-maintenance-mjB2i-VR.js} +0 -0
- package/package.json +1 -1
|
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
|
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
5
|
const require_chunk = require("../../chunk-Cek0wNdY.js");
|
|
6
|
-
const require_dist = require("../../dist-
|
|
6
|
+
const require_dist = require("../../dist-GgG-7amw.js");
|
|
7
7
|
const require_formatter = require("../../formatter-DqAKDlvN.js");
|
|
8
8
|
let node_path = require("node:path");
|
|
9
9
|
node_path = require_chunk.__toESM(node_path);
|
|
@@ -106,36 +106,45 @@ var WinstonLoggingAddon = class extends require_dist.BaseAddon {
|
|
|
106
106
|
return this.schema({ sections: [{
|
|
107
107
|
id: "winston-logging",
|
|
108
108
|
title: "Logging",
|
|
109
|
+
titleKey: "server:globalSettings.s_winston-logging.title",
|
|
109
110
|
description: "Global log verbosity + retention for rotated log files on this node.",
|
|
111
|
+
descriptionKey: "server:globalSettings.s_winston-logging.description",
|
|
110
112
|
columns: 2,
|
|
111
113
|
fields: [this.field({
|
|
112
114
|
type: "select",
|
|
113
115
|
key: "level",
|
|
114
116
|
label: "Log Level",
|
|
117
|
+
labelKey: "server:globalSettings.s_winston-logging.level.label",
|
|
115
118
|
default: "info",
|
|
116
119
|
options: [
|
|
117
120
|
{
|
|
118
121
|
value: "debug",
|
|
119
|
-
label: "Debug"
|
|
122
|
+
label: "Debug",
|
|
123
|
+
labelKey: "server:globalSettings.s_winston-logging.level.o_debug.label"
|
|
120
124
|
},
|
|
121
125
|
{
|
|
122
126
|
value: "info",
|
|
123
|
-
label: "Info"
|
|
127
|
+
label: "Info",
|
|
128
|
+
labelKey: "server:globalSettings.s_winston-logging.level.o_info.label"
|
|
124
129
|
},
|
|
125
130
|
{
|
|
126
131
|
value: "warn",
|
|
127
|
-
label: "Warn"
|
|
132
|
+
label: "Warn",
|
|
133
|
+
labelKey: "server:globalSettings.s_winston-logging.level.o_warn.label"
|
|
128
134
|
},
|
|
129
135
|
{
|
|
130
136
|
value: "error",
|
|
131
|
-
label: "Error"
|
|
137
|
+
label: "Error",
|
|
138
|
+
labelKey: "server:globalSettings.s_winston-logging.level.o_error.label"
|
|
132
139
|
}
|
|
133
140
|
]
|
|
134
141
|
}), this.field({
|
|
135
142
|
type: "number",
|
|
136
143
|
key: "retentionDays",
|
|
137
144
|
label: "Retention (days)",
|
|
145
|
+
labelKey: "server:globalSettings.s_winston-logging.retentionDays.label",
|
|
138
146
|
description: "Number of days to keep rotated log files before deletion",
|
|
147
|
+
descriptionKey: "server:globalSettings.s_winston-logging.retentionDays.description",
|
|
139
148
|
min: 1,
|
|
140
149
|
max: 365,
|
|
141
150
|
step: 1,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Or as BaseAddon, mn as logDestinationCapability } from "../../dist-Dc8GKC5H.mjs";
|
|
2
2
|
import { t as formatLogLine } from "../../formatter-B7qW8bPJ.mjs";
|
|
3
3
|
import * as path$1 from "node:path";
|
|
4
4
|
import path from "node:path";
|
|
@@ -99,36 +99,45 @@ var WinstonLoggingAddon = class extends BaseAddon {
|
|
|
99
99
|
return this.schema({ sections: [{
|
|
100
100
|
id: "winston-logging",
|
|
101
101
|
title: "Logging",
|
|
102
|
+
titleKey: "server:globalSettings.s_winston-logging.title",
|
|
102
103
|
description: "Global log verbosity + retention for rotated log files on this node.",
|
|
104
|
+
descriptionKey: "server:globalSettings.s_winston-logging.description",
|
|
103
105
|
columns: 2,
|
|
104
106
|
fields: [this.field({
|
|
105
107
|
type: "select",
|
|
106
108
|
key: "level",
|
|
107
109
|
label: "Log Level",
|
|
110
|
+
labelKey: "server:globalSettings.s_winston-logging.level.label",
|
|
108
111
|
default: "info",
|
|
109
112
|
options: [
|
|
110
113
|
{
|
|
111
114
|
value: "debug",
|
|
112
|
-
label: "Debug"
|
|
115
|
+
label: "Debug",
|
|
116
|
+
labelKey: "server:globalSettings.s_winston-logging.level.o_debug.label"
|
|
113
117
|
},
|
|
114
118
|
{
|
|
115
119
|
value: "info",
|
|
116
|
-
label: "Info"
|
|
120
|
+
label: "Info",
|
|
121
|
+
labelKey: "server:globalSettings.s_winston-logging.level.o_info.label"
|
|
117
122
|
},
|
|
118
123
|
{
|
|
119
124
|
value: "warn",
|
|
120
|
-
label: "Warn"
|
|
125
|
+
label: "Warn",
|
|
126
|
+
labelKey: "server:globalSettings.s_winston-logging.level.o_warn.label"
|
|
121
127
|
},
|
|
122
128
|
{
|
|
123
129
|
value: "error",
|
|
124
|
-
label: "Error"
|
|
130
|
+
label: "Error",
|
|
131
|
+
labelKey: "server:globalSettings.s_winston-logging.level.o_error.label"
|
|
125
132
|
}
|
|
126
133
|
]
|
|
127
134
|
}), this.field({
|
|
128
135
|
type: "number",
|
|
129
136
|
key: "retentionDays",
|
|
130
137
|
label: "Retention (days)",
|
|
138
|
+
labelKey: "server:globalSettings.s_winston-logging.retentionDays.label",
|
|
131
139
|
description: "Number of days to keep rotated log files before deletion",
|
|
140
|
+
descriptionKey: "server:globalSettings.s_winston-logging.retentionDays.description",
|
|
132
141
|
min: 1,
|
|
133
142
|
max: 365,
|
|
134
143
|
step: 1,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Dr as errMsg, br as compositionSourceKey } from "./dist-Dc8GKC5H.mjs";
|
|
2
2
|
//#region src/builtins/core-blocks/composition-sources.ts
|
|
3
3
|
/**
|
|
4
4
|
* Describe what a composition reads and writes for SAVE-time validation
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** `secret://system/global/meshCaKey` — EC P-256 PKCS#8 PEM of the hub mesh CA. */
|
|
2
|
-
var MESH_CA_KEY_REF = require("./dist-
|
|
2
|
+
var MESH_CA_KEY_REF = require("./dist-GgG-7amw.js").buildSecretRef({
|
|
3
3
|
owner: "system",
|
|
4
4
|
scope: { kind: "global" },
|
|
5
5
|
fieldPath: "meshCaKey"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { D as DEVICE_SAN_CREDENTIAL_PREFIX, O as DEVICE_SAN_USER_PREFIX, Vr as buildSecretRef } from "./dist-Dc8GKC5H.mjs";
|
|
2
2
|
import { a as KeyUsagesExtension, d as X509Certificate$1, f as X509CertificateGenerator, g as backdatedNotBefore, i as KeyUsageFlags, l as SubjectAlternativeNameExtension, n as BasicConstraintsExtension, o as PemConverter, p as cryptoProvider, r as ExtendedKeyUsageExtension, t as AuthorityKeyIdentifierExtension, u as SubjectKeyIdentifierExtension } from "./x509.es-CDvj67p1.mjs";
|
|
3
3
|
import { X509Certificate, createPublicKey, randomBytes, verify, webcrypto } from "node:crypto";
|
|
4
4
|
//#region src/auth/jwt-signing-key.ts
|
|
@@ -718,7 +718,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
718
718
|
return EventCategory;
|
|
719
719
|
}({});
|
|
720
720
|
//#endregion
|
|
721
|
-
//#region ../types/dist/sleep-
|
|
721
|
+
//#region ../types/dist/sleep-DRqxtc0C.mjs
|
|
722
722
|
/**
|
|
723
723
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
724
724
|
* window to float samples (D455).
|
|
@@ -4421,6 +4421,35 @@ function collectZodSecretPaths(schema, prefix = "") {
|
|
|
4421
4421
|
return [...new Set(paths)];
|
|
4422
4422
|
}
|
|
4423
4423
|
/**
|
|
4424
|
+
* A user-facing error with a STABLE code (D863).
|
|
4425
|
+
*
|
|
4426
|
+
* `message` is always the English text, so every consumer that knows nothing
|
|
4427
|
+
* of codes (old clients, logs, the mesh) behaves exactly as before. The hub's
|
|
4428
|
+
* tRPC error formatter reads `code` + `params` and, when the request language
|
|
4429
|
+
* has a text for `server:<code>`, replaces the response `message`; the code
|
|
4430
|
+
* stays in the payload (`data.i18n`).
|
|
4431
|
+
*/
|
|
4432
|
+
/** Dotted lower-case code, e.g. `auth.invalid-credentials`. It is the key in the `server` catalog. */
|
|
4433
|
+
var ErrorCodeSchema = z.string().regex(/^[a-z][a-z0-9-]*(\.[a-z0-9-]+)+$/);
|
|
4434
|
+
z.object({
|
|
4435
|
+
code: ErrorCodeSchema,
|
|
4436
|
+
params: z.record(z.string(), z.union([z.string(), z.number()])).optional()
|
|
4437
|
+
});
|
|
4438
|
+
var CamstackError = class extends Error {
|
|
4439
|
+
i18nCode;
|
|
4440
|
+
i18nParams;
|
|
4441
|
+
constructor(code, params, englishMessage) {
|
|
4442
|
+
super(englishMessage);
|
|
4443
|
+
this.name = "CamstackError";
|
|
4444
|
+
this.i18nCode = code;
|
|
4445
|
+
this.i18nParams = params;
|
|
4446
|
+
}
|
|
4447
|
+
};
|
|
4448
|
+
/** `throw userError('device.not-found', { id }, 'Device 12 not found')` */
|
|
4449
|
+
function userError(code, params, englishFallback) {
|
|
4450
|
+
return new CamstackError(code, params, englishFallback);
|
|
4451
|
+
}
|
|
4452
|
+
/**
|
|
4424
4453
|
* Type-safe JSON parsing helpers.
|
|
4425
4454
|
*
|
|
4426
4455
|
* `JSON.parse` is typed as `any` in lib.es5.d.ts, which triggers
|
|
@@ -4486,7 +4515,7 @@ function sleep(ms) {
|
|
|
4486
4515
|
return new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));
|
|
4487
4516
|
}
|
|
4488
4517
|
//#endregion
|
|
4489
|
-
//#region ../types/dist/err-msg-
|
|
4518
|
+
//#region ../types/dist/err-msg-DLerKiVO.mjs
|
|
4490
4519
|
var DeviceType = /* @__PURE__ */ function(DeviceType) {
|
|
4491
4520
|
DeviceType["Camera"] = "camera";
|
|
4492
4521
|
DeviceType["Hub"] = "hub";
|
|
@@ -4736,6 +4765,22 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
|
|
|
4736
4765
|
DeviceRole["Nightvision"] = "nightvision";
|
|
4737
4766
|
DeviceRole["PrivacyMask"] = "privacy-mask";
|
|
4738
4767
|
DeviceRole["Doorbell"] = "doorbell";
|
|
4768
|
+
/** Interior blind / shade / roller blind. HA `device_class: blind|shade`. */
|
|
4769
|
+
DeviceRole["CoverBlind"] = "cover-blind";
|
|
4770
|
+
/** Exterior roller shutter. HA `device_class: shutter`; Homematic BROLL. */
|
|
4771
|
+
DeviceRole["CoverShutter"] = "cover-shutter";
|
|
4772
|
+
/** Exterior awning. HA `device_class: awning`. */
|
|
4773
|
+
DeviceRole["CoverAwning"] = "cover-awning";
|
|
4774
|
+
/** Curtain / drape. HA `device_class: curtain`. */
|
|
4775
|
+
DeviceRole["CoverCurtain"] = "cover-curtain";
|
|
4776
|
+
/** Garage door. HA `device_class: garage`. A security actuator: exports gate it. */
|
|
4777
|
+
DeviceRole["CoverGarage"] = "cover-garage";
|
|
4778
|
+
/** Gate. HA `device_class: gate`. A security actuator: exports gate it. */
|
|
4779
|
+
DeviceRole["CoverGate"] = "cover-gate";
|
|
4780
|
+
/** Door. HA `device_class: door`. A security actuator: exports gate it. */
|
|
4781
|
+
DeviceRole["CoverDoor"] = "cover-door";
|
|
4782
|
+
/** Window. HA `device_class: window`. */
|
|
4783
|
+
DeviceRole["CoverWindow"] = "cover-window";
|
|
4739
4784
|
/** Virtual HA toggle (input_boolean.*) — distinguishable from a
|
|
4740
4785
|
* real Switch device for UI rendering / export adapters. */
|
|
4741
4786
|
DeviceRole["BinaryHelper"] = "binary-helper";
|
|
@@ -4816,7 +4861,7 @@ function errMsg(err) {
|
|
|
4816
4861
|
return String(err);
|
|
4817
4862
|
}
|
|
4818
4863
|
//#endregion
|
|
4819
|
-
//#region ../types/dist/composition-
|
|
4864
|
+
//#region ../types/dist/composition-EQ9Ok0Ee.mjs
|
|
4820
4865
|
var AUDIO_ENCODER_BY_CODEC = {
|
|
4821
4866
|
opus: "libopus",
|
|
4822
4867
|
aac: "aac",
|
|
@@ -9769,6 +9814,8 @@ function scopesAllowAddon(scopes, addonId, access) {
|
|
|
9769
9814
|
return scopes.some((s) => s.type === "addon" && s.target === addonId && s.access.includes(access));
|
|
9770
9815
|
}
|
|
9771
9816
|
z.enum(["new-session", "step-up"]);
|
|
9817
|
+
/** The languages the hub's app landing pages are written in (D858). */
|
|
9818
|
+
var AppPageLangSchema = z.enum(["en", "it"]);
|
|
9772
9819
|
/** How a native app starts one login method (D858), as `auth.listLoginMethods` reports it. */
|
|
9773
9820
|
var AppLoginPathSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("native") }), z.object({
|
|
9774
9821
|
kind: z.literal("browser"),
|
|
@@ -10371,7 +10418,9 @@ var ConfigTabDeclarationSchema = z.object({
|
|
|
10371
10418
|
var ConfigSectionWithValuesSchema = z.object({
|
|
10372
10419
|
id: z.string(),
|
|
10373
10420
|
title: z.string(),
|
|
10421
|
+
titleKey: z.string().optional(),
|
|
10374
10422
|
description: z.string().optional(),
|
|
10423
|
+
descriptionKey: z.string().optional(),
|
|
10375
10424
|
style: z.enum(["card", "accordion"]).optional(),
|
|
10376
10425
|
defaultCollapsed: z.boolean().optional(),
|
|
10377
10426
|
columns: z.union([
|
|
@@ -16215,6 +16264,16 @@ var keychainCapability = {
|
|
|
16215
16264
|
kind: "mutation",
|
|
16216
16265
|
auth: "admin"
|
|
16217
16266
|
}),
|
|
16267
|
+
/**
|
|
16268
|
+
* Delete every value scoped `device/<deviceId>`, whatever its owner (D864).
|
|
16269
|
+
* Reserved to `device-manager`, on the device-removed path: a driver's
|
|
16270
|
+
* device-scoped secret is not anybody's once the device is gone. Answers the
|
|
16271
|
+
* refs removed (never values).
|
|
16272
|
+
*/
|
|
16273
|
+
deleteDeviceScope: method(z.object({ deviceId: z.number().int() }), z.object({ refs: z.array(z.string()).readonly() }), {
|
|
16274
|
+
kind: "mutation",
|
|
16275
|
+
auth: "admin"
|
|
16276
|
+
}),
|
|
16218
16277
|
/** The caller's own refs, metadata only. */
|
|
16219
16278
|
listMeta: method(z.object({}), z.array(KeychainSecretMetaSchema).readonly(), { auth: "admin" }),
|
|
16220
16279
|
/** Whether values can be served — the save path refuses a write while locked. */
|
|
@@ -38219,6 +38278,42 @@ var DeviceRegisterPayloadSchema = z.object({
|
|
|
38219
38278
|
* omits it and the keyword backstop applies. */
|
|
38220
38279
|
secretConfigPaths: z.array(z.string()).optional()
|
|
38221
38280
|
});
|
|
38281
|
+
/** One deleted device, kept by device-manager so an addon that missed the
|
|
38282
|
+
* deletion can still learn of it (D865). Written by the delete path ONLY. */
|
|
38283
|
+
var DeviceTombstoneSchema = z.object({
|
|
38284
|
+
deviceId: z.number().int().positive(),
|
|
38285
|
+
/** Epoch ms the device was deleted. */
|
|
38286
|
+
deletedAt: z.number(),
|
|
38287
|
+
/** The addon that owned the device when it was deleted. */
|
|
38288
|
+
providerAddonId: z.string()
|
|
38289
|
+
});
|
|
38290
|
+
/** How long a tombstone stays readable. Past it, a device that was deleted
|
|
38291
|
+
* and never cleaned is only reachable by the admin "clean data of deleted
|
|
38292
|
+
* devices" action. */
|
|
38293
|
+
var DEVICE_TOMBSTONE_RETENTION_MS = 2160 * 60 * 60 * 1e3;
|
|
38294
|
+
/** Data held for one device that device-manager no longer knows. */
|
|
38295
|
+
var OrphanDeviceDataSchema = z.object({
|
|
38296
|
+
deviceId: z.number().int().positive(),
|
|
38297
|
+
/** Rows/files per store (`<addonId>:<store>`). */
|
|
38298
|
+
stores: z.record(z.string(), z.number().int().nonnegative())
|
|
38299
|
+
});
|
|
38300
|
+
var CleanupDeletedDevicesResultSchema = z.object({
|
|
38301
|
+
/**
|
|
38302
|
+
* `skipped` — the absence check could not be trusted (a device-list read
|
|
38303
|
+
* failed or the two reads disagreed); nothing was listed or deleted.
|
|
38304
|
+
* `dry-run` — `devices` is what a confirmed run would delete.
|
|
38305
|
+
* `cleaned` — `devices` is what was deleted.
|
|
38306
|
+
*/
|
|
38307
|
+
status: z.enum([
|
|
38308
|
+
"skipped",
|
|
38309
|
+
"dry-run",
|
|
38310
|
+
"cleaned"
|
|
38311
|
+
]),
|
|
38312
|
+
reason: z.string().nullable(),
|
|
38313
|
+
devices: z.array(OrphanDeviceDataSchema),
|
|
38314
|
+
/** Implementers that could not be asked (their stores are not in `devices`). */
|
|
38315
|
+
unreachable: z.array(z.string())
|
|
38316
|
+
});
|
|
38222
38317
|
var DeviceRemovePayloadSchema = z.object({ deviceId: z.number() });
|
|
38223
38318
|
var DevicePersistConfigPayloadSchema = z.object({
|
|
38224
38319
|
deviceId: z.number(),
|
|
@@ -38815,6 +38910,27 @@ var deviceManagerCapability = {
|
|
|
38815
38910
|
kind: "mutation",
|
|
38816
38911
|
auth: "admin"
|
|
38817
38912
|
}),
|
|
38913
|
+
/**
|
|
38914
|
+
* The tombstones of devices deleted at or after `sinceMs` (D865). The
|
|
38915
|
+
* reconcile feed of every `device-removal-hook` implementer: an addon that
|
|
38916
|
+
* was down when a device was deleted asks here at start and periodically.
|
|
38917
|
+
* A tombstone exists only for a DELETE — never for a device that is merely
|
|
38918
|
+
* unregistered, offline or whose provider is restarting. Tombstones older
|
|
38919
|
+
* than `DEVICE_TOMBSTONE_RETENTION_MS` are gone.
|
|
38920
|
+
*/
|
|
38921
|
+
listDeletedSince: method(z.object({ sinceMs: z.number() }), z.array(DeviceTombstoneSchema).readonly(), { auth: "admin" }),
|
|
38922
|
+
/**
|
|
38923
|
+
* Admin-triggered clean-up of data that belongs to devices deleted BEFORE
|
|
38924
|
+
* tombstones existed (D865). Asks every `device-removal-hook` implementer
|
|
38925
|
+
* which device ids it holds data for, keeps those absent from the device
|
|
38926
|
+
* list — confirmed by TWO reads of the list, skipped if either fails — and
|
|
38927
|
+
* with `confirm: false` only reports the counts per store. `confirm: true`
|
|
38928
|
+
* deletes. Never runs on its own.
|
|
38929
|
+
*/
|
|
38930
|
+
cleanupDeletedDevicesData: method(z.object({ confirm: z.boolean() }), CleanupDeletedDevicesResultSchema, {
|
|
38931
|
+
kind: "mutation",
|
|
38932
|
+
auth: "admin"
|
|
38933
|
+
}),
|
|
38818
38934
|
/** Cascade-delete every top-level device whose `integrationId` matches.
|
|
38819
38935
|
* Children cascade automatically via the per-parent remove path.
|
|
38820
38936
|
* Idempotent: a device whose `integrationId` was never set never matches.
|
|
@@ -39730,6 +39846,85 @@ var embeddingEncoderCapability = {
|
|
|
39730
39846
|
}
|
|
39731
39847
|
};
|
|
39732
39848
|
/**
|
|
39849
|
+
* `device-removal-hook` — the reliable way an addon learns a device was DELETED,
|
|
39850
|
+
* so it can delete what it keeps for that device (D865).
|
|
39851
|
+
*
|
|
39852
|
+
* ## Why an event was not enough
|
|
39853
|
+
*
|
|
39854
|
+
* `DeviceUnregistered` is telemetry and may be dropped (D8, D11). An addon that
|
|
39855
|
+
* hung its per-device clean-up on it left durable garbage whenever the event was
|
|
39856
|
+
* lost, the addon was down, or it was restarting at that moment — footage,
|
|
39857
|
+
* analytics rows and settings of device 4483 outlived the device. Loss of this
|
|
39858
|
+
* signal corrupts durable state, so it travels by RPC with a recorded fact
|
|
39859
|
+
* behind it (D8: "if loss would corrupt durable state, use RPC plus a reconcile").
|
|
39860
|
+
*
|
|
39861
|
+
* ## The three pieces
|
|
39862
|
+
*
|
|
39863
|
+
* 1. device-manager records a TOMBSTONE per deleted device
|
|
39864
|
+
* (`deviceManager.listDeletedSince`). The tombstone is written by the delete
|
|
39865
|
+
* path only — a device that is unregistered, offline or whose provider is
|
|
39866
|
+
* restarting is NOT deleted and gets none.
|
|
39867
|
+
* 2. After a delete, device-manager calls `onDeviceRemoved` on EVERY provider of
|
|
39868
|
+
* this collection, one by one, with bounded retries, logged.
|
|
39869
|
+
* 3. An implementer that was down asks `deviceManager.listDeletedSince` at start
|
|
39870
|
+
* (and periodically) and runs its own `onDeviceRemoved` for each tombstone it
|
|
39871
|
+
* may have missed. Reconcile is driven by tombstones, never by "the device is
|
|
39872
|
+
* not in the current list": a failed or partial list read must not destroy data.
|
|
39873
|
+
*
|
|
39874
|
+
* ## Contract for an implementer
|
|
39875
|
+
*
|
|
39876
|
+
* - **Idempotent.** It is called again by a retry, by a reconcile and by the
|
|
39877
|
+
* admin cleanup of data that predates tombstones. A device with nothing left
|
|
39878
|
+
* answers zero counts.
|
|
39879
|
+
* - **One key per store** in `counts`, deleted rows/files per store, so the log
|
|
39880
|
+
* line and the admin dry run can say where the data was.
|
|
39881
|
+
* - **Training datasets are NOT device data** and are never deleted by a hook.
|
|
39882
|
+
* - **Per-device SETTINGS are not hooked.** Configuration lives in the standard
|
|
39883
|
+
* per-device store (`ctx.settings.*DeviceStore`), which device-manager clears
|
|
39884
|
+
* for every addon centrally at delete time. This hook is for device DATA
|
|
39885
|
+
* that is not settings: footage, event media, analytics rows, history.
|
|
39886
|
+
* - A provider that cannot tell is allowed to throw; the caller retries it.
|
|
39887
|
+
*
|
|
39888
|
+
* `listDeviceData` is the read side of the admin "Clean data of deleted devices"
|
|
39889
|
+
* action: which device ids this addon holds data for, and how much per store. It
|
|
39890
|
+
* never deletes. device-manager decides which of those ids are absent from the
|
|
39891
|
+
* fleet, from TWO consistent reads of the device list (D49).
|
|
39892
|
+
*/
|
|
39893
|
+
/** What a hook is told about the deletion. */
|
|
39894
|
+
var DeviceRemovedInputSchema = z.object({
|
|
39895
|
+
deviceId: z.number().int().positive(),
|
|
39896
|
+
/** Epoch ms the device was deleted (the tombstone's `deletedAt`). */
|
|
39897
|
+
deletedAt: z.number(),
|
|
39898
|
+
/** The addon that owned the device, as device-manager last knew it. */
|
|
39899
|
+
providerAddonId: z.string()
|
|
39900
|
+
});
|
|
39901
|
+
/** Rows/files/refs deleted, per store this implementer owns. */
|
|
39902
|
+
var DeviceRemovedResultSchema = z.object({ counts: z.record(z.string(), z.number().int().nonnegative()) });
|
|
39903
|
+
/** One (store, device) pair an implementer holds data for. */
|
|
39904
|
+
var DeviceDataEntrySchema = z.object({
|
|
39905
|
+
store: z.string(),
|
|
39906
|
+
deviceId: z.number().int().positive(),
|
|
39907
|
+
/** Rows (or files) held for the device in the store. */
|
|
39908
|
+
count: z.number().int().nonnegative()
|
|
39909
|
+
});
|
|
39910
|
+
var deviceRemovalHookCapability = {
|
|
39911
|
+
name: "device-removal-hook",
|
|
39912
|
+
scope: "system",
|
|
39913
|
+
mode: "collection",
|
|
39914
|
+
internal: true,
|
|
39915
|
+
methods: {
|
|
39916
|
+
/** Delete everything this addon keeps for the deleted device. Idempotent. */
|
|
39917
|
+
onDeviceRemoved: method(DeviceRemovedInputSchema, DeviceRemovedResultSchema, {
|
|
39918
|
+
kind: "mutation",
|
|
39919
|
+
auth: "admin"
|
|
39920
|
+
}),
|
|
39921
|
+
/** Which devices this addon holds data for, per store. Reads only. */
|
|
39922
|
+
listDeviceData: method(z.void(), z.array(DeviceDataEntrySchema).readonly(), { auth: "admin" })
|
|
39923
|
+
},
|
|
39924
|
+
/** In-process only — enumerated through `addons.listCapabilityProviders`. */
|
|
39925
|
+
mount: { kind: "skip" }
|
|
39926
|
+
};
|
|
39927
|
+
/**
|
|
39733
39928
|
* `failure-contribution` — the capability an addon reports its OWN losses
|
|
39734
39929
|
* through, per camera, with the denominator attached. It stores nothing.
|
|
39735
39930
|
*
|
|
@@ -54193,7 +54388,9 @@ var SsoBridgeClaimsSchema = z.object({
|
|
|
54193
54388
|
codeChallenge: z.string(),
|
|
54194
54389
|
state: z.string(),
|
|
54195
54390
|
purpose: z.enum(["new-session", "step-up"]),
|
|
54196
|
-
redirect: z.string()
|
|
54391
|
+
redirect: z.string(),
|
|
54392
|
+
/** The page language the app asked for (D858); the confirm page speaks it. */
|
|
54393
|
+
lang: z.enum(["en", "it"]).optional()
|
|
54197
54394
|
}).optional()
|
|
54198
54395
|
});
|
|
54199
54396
|
var ssoBridgeCapability = {
|
|
@@ -68642,6 +68839,37 @@ var switchCapability = {
|
|
|
68642
68839
|
}
|
|
68643
68840
|
}] }
|
|
68644
68841
|
};
|
|
68842
|
+
/** C0 controls, DEL and the C1 range: none of them belongs in a name. */
|
|
68843
|
+
function hasControlCharacter(value) {
|
|
68844
|
+
for (const char of value) {
|
|
68845
|
+
const code = char.codePointAt(0) ?? 0;
|
|
68846
|
+
if (code <= 31 || code >= 127 && code <= 159) return true;
|
|
68847
|
+
}
|
|
68848
|
+
return false;
|
|
68849
|
+
}
|
|
68850
|
+
/** A name an operator may save: trimmed, 1-48 characters, no control characters. */
|
|
68851
|
+
var ServerNameSchema = z.string().transform((value) => value.trim()).pipe(z.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" }));
|
|
68852
|
+
/** What every reader gets: the name to show, and whether the hub chose it itself. */
|
|
68853
|
+
var ServerNameInfoSchema = z.object({
|
|
68854
|
+
name: z.string(),
|
|
68855
|
+
/** `true` when nobody named the hub: `name` is the machine hostname. */
|
|
68856
|
+
isDefault: z.boolean()
|
|
68857
|
+
});
|
|
68858
|
+
/** What an unset name shows when the hostname says nothing about the hub. */
|
|
68859
|
+
var SERVER_NAME_FALLBACK = "CamStack";
|
|
68860
|
+
/** A container id: Docker's default hostname (12 hex chars, or the full 64). */
|
|
68861
|
+
var CONTAINER_ID_PATTERN = /^(?:[0-9a-f]{12}|[0-9a-f]{64})$/;
|
|
68862
|
+
/**
|
|
68863
|
+
* The hostname without its domain (`nas.lan.example` becomes `nas`). A hostname
|
|
68864
|
+
* that names nothing (empty, `localhost`, a container id) yields
|
|
68865
|
+
* {@link SERVER_NAME_FALLBACK}.
|
|
68866
|
+
*/
|
|
68867
|
+
function shortHostname(hostname) {
|
|
68868
|
+
const first = hostname.trim().split(".")[0] ?? "";
|
|
68869
|
+
if (first.length === 0 || first.toLowerCase() === "localhost") return SERVER_NAME_FALLBACK;
|
|
68870
|
+
if (CONTAINER_ID_PATTERN.test(first)) return SERVER_NAME_FALLBACK;
|
|
68871
|
+
return first;
|
|
68872
|
+
}
|
|
68645
68873
|
/**
|
|
68646
68874
|
* system — system-scoped singleton capability exposing hub-level
|
|
68647
68875
|
* health, feature flags, network interface enumeration, and the
|
|
@@ -68671,6 +68899,12 @@ var FeatureManifestSchema = z.object({
|
|
|
68671
68899
|
backup: z.boolean(),
|
|
68672
68900
|
repl: z.boolean()
|
|
68673
68901
|
});
|
|
68902
|
+
/**
|
|
68903
|
+
* `system.info`: the feature flags plus the hub's human name (D861). The name is
|
|
68904
|
+
* `{ name, isDefault }` — `isDefault: true` means nobody named the hub and `name`
|
|
68905
|
+
* is the machine hostname.
|
|
68906
|
+
*/
|
|
68907
|
+
var SystemInfoSchema = FeatureManifestSchema.extend({ serverName: ServerNameInfoSchema });
|
|
68674
68908
|
var HealthStatusSchema = z.object({
|
|
68675
68909
|
status: z.literal("ok"),
|
|
68676
68910
|
uptime: z.number()
|
|
@@ -69157,7 +69391,7 @@ var systemCapability = {
|
|
|
69157
69391
|
scope: "system",
|
|
69158
69392
|
mode: "singleton",
|
|
69159
69393
|
methods: {
|
|
69160
|
-
info: method(z.void(),
|
|
69394
|
+
info: method(z.void(), SystemInfoSchema),
|
|
69161
69395
|
health: method(z.void(), HealthStatusSchema),
|
|
69162
69396
|
featureFlags: method(z.void(), FeatureManifestSchema),
|
|
69163
69397
|
networkAddresses: method(z.void(), z.array(NetworkAddressSchema).readonly()),
|
|
@@ -74760,6 +74994,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
74760
74994
|
addonId: null,
|
|
74761
74995
|
access: "create"
|
|
74762
74996
|
},
|
|
74997
|
+
"deviceManager.cleanupDeletedDevicesData": {
|
|
74998
|
+
capName: "device-manager",
|
|
74999
|
+
capScope: "system",
|
|
75000
|
+
addonId: null,
|
|
75001
|
+
access: "create"
|
|
75002
|
+
},
|
|
74763
75003
|
"deviceManager.createDevice": {
|
|
74764
75004
|
capName: "device-manager",
|
|
74765
75005
|
capScope: "system",
|
|
@@ -74940,6 +75180,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
74940
75180
|
addonId: null,
|
|
74941
75181
|
access: "view"
|
|
74942
75182
|
},
|
|
75183
|
+
"deviceManager.listDeletedSince": {
|
|
75184
|
+
capName: "device-manager",
|
|
75185
|
+
capScope: "system",
|
|
75186
|
+
addonId: null,
|
|
75187
|
+
access: "view"
|
|
75188
|
+
},
|
|
74943
75189
|
"deviceManager.listDeviceIdsByCaps": {
|
|
74944
75190
|
capName: "device-manager",
|
|
74945
75191
|
capScope: "system",
|
|
@@ -75348,6 +75594,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
75348
75594
|
addonId: null,
|
|
75349
75595
|
access: "create"
|
|
75350
75596
|
},
|
|
75597
|
+
"deviceRemovalHook.listDeviceData": {
|
|
75598
|
+
capName: "device-removal-hook",
|
|
75599
|
+
capScope: "system",
|
|
75600
|
+
addonId: null,
|
|
75601
|
+
access: "view"
|
|
75602
|
+
},
|
|
75603
|
+
"deviceRemovalHook.onDeviceRemoved": {
|
|
75604
|
+
capName: "device-removal-hook",
|
|
75605
|
+
capScope: "system",
|
|
75606
|
+
addonId: null,
|
|
75607
|
+
access: "create"
|
|
75608
|
+
},
|
|
75351
75609
|
"deviceState.claimFields": {
|
|
75352
75610
|
capName: "device-state",
|
|
75353
75611
|
capScope: "system",
|
|
@@ -75780,6 +76038,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
75780
76038
|
addonId: null,
|
|
75781
76039
|
access: "delete"
|
|
75782
76040
|
},
|
|
76041
|
+
"keychain.deleteDeviceScope": {
|
|
76042
|
+
capName: "keychain",
|
|
76043
|
+
capScope: "system",
|
|
76044
|
+
addonId: null,
|
|
76045
|
+
access: "delete"
|
|
76046
|
+
},
|
|
75783
76047
|
"keychain.getState": {
|
|
75784
76048
|
capName: "keychain",
|
|
75785
76049
|
capScope: "system",
|
|
@@ -81162,6 +81426,7 @@ var ALL_CAPABILITY_DEFINITIONS = [
|
|
|
81162
81426
|
deviceManagerCapability,
|
|
81163
81427
|
deviceOpsCapability,
|
|
81164
81428
|
deviceProviderCapability,
|
|
81429
|
+
deviceRemovalHookCapability,
|
|
81165
81430
|
deviceStateCapability,
|
|
81166
81431
|
deviceStatusCapability,
|
|
81167
81432
|
doorbellCapability,
|
|
@@ -82055,6 +82320,11 @@ Object.freeze({
|
|
|
82055
82320
|
form: "single",
|
|
82056
82321
|
optional: false
|
|
82057
82322
|
}],
|
|
82323
|
+
"deviceRemovalHook.onDeviceRemoved": [{
|
|
82324
|
+
name: "deviceId",
|
|
82325
|
+
form: "single",
|
|
82326
|
+
optional: false
|
|
82327
|
+
}],
|
|
82058
82328
|
"deviceState.claimFields": [{
|
|
82059
82329
|
name: "deviceId",
|
|
82060
82330
|
form: "single",
|
|
@@ -82244,6 +82514,11 @@ Object.freeze({
|
|
|
82244
82514
|
form: "single",
|
|
82245
82515
|
optional: false
|
|
82246
82516
|
}],
|
|
82517
|
+
"keychain.deleteDeviceScope": [{
|
|
82518
|
+
name: "deviceId",
|
|
82519
|
+
form: "single",
|
|
82520
|
+
optional: false
|
|
82521
|
+
}],
|
|
82247
82522
|
"lawnMowerControl.dock": [{
|
|
82248
82523
|
name: "deviceId",
|
|
82249
82524
|
form: "single",
|
|
@@ -84892,6 +85167,26 @@ new Set([
|
|
|
84892
85167
|
"audio-tools",
|
|
84893
85168
|
"audio-silence"
|
|
84894
85169
|
]);
|
|
85170
|
+
var CATALOG_LANGS = AppPageLangSchema.options;
|
|
85171
|
+
/** One catalog file: flat key to text. A file of any other shape is rejected whole. */
|
|
85172
|
+
var CatalogFileSchema = z.record(z.string().min(1), z.string());
|
|
85173
|
+
/** Fills `{name}` placeholders; an unknown placeholder is left as written. */
|
|
85174
|
+
function interpolate(template, params) {
|
|
85175
|
+
if (params === void 0) return template;
|
|
85176
|
+
return template.replace(/\{(\w+)\}/g, (whole, name) => {
|
|
85177
|
+
const value = params[name];
|
|
85178
|
+
return value === void 0 ? whole : String(value);
|
|
85179
|
+
});
|
|
85180
|
+
}
|
|
85181
|
+
/** Splits `"ns:key"`; `null` when the reference has no namespace. */
|
|
85182
|
+
function splitTranslationRef(ref) {
|
|
85183
|
+
const at = ref.indexOf(":");
|
|
85184
|
+
if (at <= 0 || at === ref.length - 1) return null;
|
|
85185
|
+
return {
|
|
85186
|
+
ns: ref.slice(0, at),
|
|
85187
|
+
key: ref.slice(at + 1)
|
|
85188
|
+
};
|
|
85189
|
+
}
|
|
84895
85190
|
/**
|
|
84896
85191
|
* TimelapseRule — the STANDALONE scheduled timelapse producer's rule model.
|
|
84897
85192
|
*
|
|
@@ -85583,4 +85878,4 @@ function enumerateInferenceDevices(hw) {
|
|
|
85583
85878
|
return out;
|
|
85584
85879
|
}
|
|
85585
85880
|
//#endregion
|
|
85586
|
-
export {
|
|
85881
|
+
export { StorageLocationTypeSchema as $, storageMigrationCapability as $n, isEvent as $r, isAppLinkBase as $t, DeclaredDevices as A, platformProbeCapability as An, DEVICE_SETTINGS_CONTRIBUTION_METHODS as Ar, decodeVectorBase64 as At, METHOD_ACCESS_MAP as B, resolveLocationMode as Bn, asString$1 as Br, enumerateItemArrayFields as Bt, DAY_NAMES as C, normalizeCoreBlockWrite as Cn, toExpressionValue as Cr, coreBlockIdFromAddonId as Ct, DEVICE_SAN_CREDENTIAL_PREFIX as D, parseStreamParamsFormPatch as Dn, errMsg as Dr, dataStoreProviderCapability as Dt, DEVICE_NONCE_TTL_MS as E, objectInputDeclaresRequiredDeviceId as En, DeviceType as Er, createDeviceExtensionProvider as Et, HUB_MDNS_SERVICE_TYPE as F, resolveAppConnections as Fn, ReadinessTimeoutError as Fr, deviceExtensionCapability as Ft, RecordingStatusSchema as G, scopesAllowDeviceCap as Gn, customAction as Gr, expressionContainsBuiltinCall as Gt, MOTION_CLOSE_AFTER_MS as H, resolveNotificationTapAddress as Hn, collectSecretConfigKeys as Hr, evaluateCompositionField as Ht, HUB_MDNS_TXT_KEYS as I, resolveBucketMs as In, SECRET_CLEAR as Ir, deviceManagerCapability as It, ScopedTokenSchema as J, shortHostname as Jn, emitReadiness as Jr, foldSnapshotByFunction as Jt, STORAGE_ACCESS_FALLBACK as K, scoreRuntimes as Kn, defineCustomActions as Kr, extractNestedAddonId as Kt, KEYCHAIN_RESET_TRIGGER_ACTOR as L, resolveCoreBlockEntry as Ln, WELL_KNOWN_TAB_MAP as Lr, deviceStateCapability as Lt, FIRST_LEVEL_MACRO_CLASSES as M, ptzAutotrackCapability as Mn, REDACTED_SECRET as Mr, deriveBatteryPresence as Mt, FieldClaimModeSchema as N, reducePoints as Nn, RUNTIME_DEFAULTS as Nr, describeComposableCaps as Nt, DEVICE_SAN_USER_PREFIX as O, pickAppLinkHub as On, BaseAddon as Or, databaseSnapshotCapability as Ot, FieldClaimSchema as P, replacedFieldKeys as Pn, ReadinessRegistry as Pr, deviceCredentialsCapability as Pt, StorageLocationModeSchema as Q, storageCapability as Qn, isDeviceConfigCap as Qr, interpolate as Qt, LOG_LEVEL_RANK as R, resolveCoreBlockFiles as Rn, asJsonObject as Rr, deviceStatusCapability as Rt, DATA_STORE_DATABASES as S, motionCapability as Sn, disarmRoseMemory as Sr, coreBlockComposition as St, DEVICE_ENROLLMENT_TTL_MS as T, objectInputDeclaresAddonId as Tn, DeviceRole as Tr, coreBlocksCapability as Tt, NetworkTunnelStartedDataSchema as U, runtimeStatePolicyFor as Un, collectZodSecretPaths as Ur, evictionPolicyOfLocation as Ut, MINUTES_PER_DAY as V, resolveMethodAuth as Vn, buildSecretRef as Vr, enumerateSchemaFields as Vt, RECORDING_SOURCE_CAMSTACK_ADDON as W, scopesAllowAddon as Wn, createEvent as Wr, expandContainer as Wt, SsoBridgeClaimsSchema as X, snapshotCapability as Xn, formatSecretScope as Xr, formatMinutes as Xt, ServerNameSchema as Y, siteZoneKey as Yn, expandCapMethods as Yr, formatDeviceRevoker as Yt, StorageCleanupJobSchema as Z, splitTranslationRef as Zn, hydrateSchema as Zr, gbToBytes as Zt, CatalogFileSchema as _, transformSecretWrite as _i, mayReadLocation as _n, compositionFeatureEnabled as _r, checkRoleAddress as _t, ApiKeyRecordSchema as a, normalizeSecretOwner as ai, isVoidInput as an, userManagementCapability as ar, alertsCapability as at, DATABASE_SNAPSHOT_SUFFIX as b, metricsProviderCapability as bn, compositionSourceKey as br, compositionSourceRefs as bt, CAMERA_SWITCH_ORDER as c, parseSecretRef as ci, keychainCapability as cn, vectorDimFromBase64 as cr, bareAddonId as ct, CATALOG_LANGS as d, resolveSecretMarkers as di, lifecycleJobSchema as dn, withLocationMode as dr, buildDeviceEnrollmentLink as dt, isKeychainStoredField as ei, isArrayOutputSchema as en, storageOccupancyCapability as er, StorageMigrationJobSchema as et, COMPOSED_ITEM_FIXED_FIELDS as f, scopeKey as fi, localNetworkCapability as fn, COMPOSER_ADDON_ID as fr, buildDeviceSignatureMessage as ft, CalendarPreferencesSchema as g, toSecretFieldView as gi, looseSchema as gn, composedDeviceStableId as gr, canonicalIconKey as gt, CORE_BLOCK_ADDON_PREFIX as h, toNodeId as hi, logLevelAtMost as hn, composedDeviceRef as hr, cameraGridLayoutCapability as ht, AlertSchema as i, nodePin as ii, isObjectInput as in, supportedRuntimes as ir, addonWidgetsCapability as it, DeviceStatusSchema as j, procedureAuthKey as jn, DEVICE_STATUS_METHOD as jr, defineExtensionSlotProvider as jt, DEVICE_TOMBSTONE_RETENTION_MS as k, planComposition as kn, DATAPLANE_SECRET_HEADER as kr, declarationOwnerNodeId as kt, CAMSTACK_APP_LINK_ORIGIN as l, readinessKey as li, legacyAutoLinkIds as ln, vectorIndexDimConflictError as lr, batteryCapability as lt, CORE_BLOCKS_ADDON_ID as m, sleep as mi, logDestinationCapability as mn, cloneStatefulExpressionMemory as mr, calendarsCapability as mt, AGENT_MDNS_TXT_KEYS as n, isSecretMarker as ni, isDefaultAppConnectionEndpoint as nn, streamCatalogCapability as nr, addonPagesCapability as nt, BaseDevice as o, parseJsonObject as oi, kebabToCamel as on, validateComposition as or, authProviderCapability as ot, COMPOSER_RUNNER_ID as p, secretTreeFromPaths as pi, locationIconKey as pn, buildFfmpegArgs as pr, buildStreamParamsConfigSchema as pt, STREAM_PROFILE_META as q, settingsStoreCapability as qn, emitDownForOwnedCaps as qr, filesystemBrowseCapability as qt, ALL_CAPABILITY_DEFINITIONS as r, isSecretMarkerLike as ri, isLocationEnabled as rn, streamQualityLabel as rr, addonSettingsCapability as rt, BatteryStatusSchema as s, parseJsonUnknown as si, keychainAdminCapability as sn, validateCustomAddress as sr, backupCapability as st, AGENT_MDNS_SERVICE_TYPE as t, isSecretClear as ti, isCollectionArrayMethod as tn, storageProviderCapability as tr, UserRecordSchema as tt, CAP_NAMES_WITH_STATUS as u, resolveCapMount as ui, legacyModeOf as un, vectorStoreCapability as ur, buildCapabilityLookup as ut, CoreBlockSchema as v, userError as vi, mayWriteToLocation as vn, compositionItemFieldPath as vr, composerCapability as vt, DERIVED_CAMERA_SILENCED_CAP_NAMES as w, normalizeUnit as wn, DeviceFeature as wr, coreBlockSourceKind as wt, DATABASE_SNAPSHOT_TIMEOUT_MS as x, modeMayWrite as xn, createStatefulExpressionMemory as xr, coreBlockAddonId as xt, DATABASE_SNAPSHOT_PARTIAL_SUFFIX as y, EventCategory as yi, memoizePinnedFfmpeg as yn, compositionSliceKey as yr, compositionFieldKey as yt, LegacyStorageLocationDefaultSchema as z, resolveHubAddressRoles as zn, asNumber as zr, enumerateInferenceDevices as zt };
|