camstack 1.2.82 → 1.2.83
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.
|
@@ -26454,7 +26454,20 @@ var RecentTracksQueryInput = external_exports.object({
|
|
|
26454
26454
|
projection: TrackProjectionSchema.optional(),
|
|
26455
26455
|
/** Include stationary-promoted rows (parked objects). Default false: the
|
|
26456
26456
|
* feed lists passages; parking records live on the stationary registry. */
|
|
26457
|
-
includeStationary: external_exports.boolean().optional()
|
|
26457
|
+
includeStationary: external_exports.boolean().optional(),
|
|
26458
|
+
/**
|
|
26459
|
+
* Restrict to these track classes. ABSENT or EMPTY means no filter.
|
|
26460
|
+
*
|
|
26461
|
+
* The same filter `listTracks` takes, because the timeline's class chips must
|
|
26462
|
+
* mean the same thing whether the scope is one camera or twelve. Until this
|
|
26463
|
+
* existed the scoped feed downloaded a page and narrowed it on the phone
|
|
26464
|
+
* while the single-camera path narrowed the read — one filter, two costs.
|
|
26465
|
+
*
|
|
26466
|
+
* A SUPERSET prefilter on `classes[]`, like its single-camera twin: rows
|
|
26467
|
+
* whose class list is unreadable are kept, and the client's rule stays the
|
|
26468
|
+
* exact one.
|
|
26469
|
+
*/
|
|
26470
|
+
classes: external_exports.array(external_exports.string()).optional()
|
|
26458
26471
|
});
|
|
26459
26472
|
var RecentTracksPageSchema = external_exports.object({
|
|
26460
26473
|
/** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
|
|
@@ -31730,8 +31743,22 @@ var automationControlCapability = {
|
|
|
31730
31743
|
durability: "session"
|
|
31731
31744
|
};
|
|
31732
31745
|
var BatteryStatusSchema = external_exports.object({
|
|
31733
|
-
/**
|
|
31734
|
-
|
|
31746
|
+
/**
|
|
31747
|
+
* 0..100 inclusive, firmware-reported. **`null` means NOT YET KNOWN** — the
|
|
31748
|
+
* provider has registered the capability but no reading has landed.
|
|
31749
|
+
*
|
|
31750
|
+
* It is nullable because it was not, and the only value a provider could
|
|
31751
|
+
* seed with was `0`. A battery camera behind an NVR therefore announced
|
|
31752
|
+
* itself at 0% on every start and corrected itself a moment later, which is
|
|
31753
|
+
* indistinguishable from a real flat battery: it fires the low-battery alert
|
|
31754
|
+
* every time the hub restarts. Unknown is not empty (D315), and on a battery
|
|
31755
|
+
* reading the difference is an alarm.
|
|
31756
|
+
*
|
|
31757
|
+
* `vacuum-control` and `lawn-mower-control` already model it this way.
|
|
31758
|
+
* Consumers must SKIP a null rather than coerce it — `battery-band` already
|
|
31759
|
+
* declines to band a non-finite reading, which is the correct shape.
|
|
31760
|
+
*/
|
|
31761
|
+
percentage: external_exports.number().min(0).max(100).nullable(),
|
|
31735
31762
|
/**
|
|
31736
31763
|
* Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
|
|
31737
31764
|
* Reolink-specific for the Solar Panel 2 accessory (will become
|
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
runDiscover
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-U3YITXU5.js";
|
|
5
5
|
import "./chunk-LMMQX4CK.js";
|
|
6
6
|
|
|
7
7
|
// src/cli.ts
|
|
@@ -38,7 +38,7 @@ async function runServe(args) {
|
|
|
38
38
|
...typeof values.data === "string" ? { data: values.data } : {}
|
|
39
39
|
};
|
|
40
40
|
Object.assign(process.env, buildServeEnv(opts));
|
|
41
|
-
await import("./launcher-
|
|
41
|
+
await import("./launcher-FITGLHP4.js");
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
// src/commands/agent.ts
|
|
@@ -83,7 +83,7 @@ async function runAgent(args) {
|
|
|
83
83
|
...typeof values.port === "string" ? { port: values.port } : {}
|
|
84
84
|
};
|
|
85
85
|
Object.assign(process.env, buildAgentEnv(opts));
|
|
86
|
-
await import("./launcher-
|
|
86
|
+
await import("./launcher-FITGLHP4.js");
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
// src/commands/setup.ts
|
|
@@ -1130,7 +1130,7 @@ function isUnknown(_value) {
|
|
|
1130
1130
|
return true;
|
|
1131
1131
|
}
|
|
1132
1132
|
async function resolveServerInteractive(presetNamespace) {
|
|
1133
|
-
const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-
|
|
1133
|
+
const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-F573GVRC.js");
|
|
1134
1134
|
if (presetNamespace) {
|
|
1135
1135
|
const spinner4 = clack.spinner();
|
|
1136
1136
|
spinner4.start(`Discovering hub on LAN (namespace "${presetNamespace}")`);
|
|
@@ -23633,9 +23633,9 @@ var require_zod = __commonJS({
|
|
|
23633
23633
|
}
|
|
23634
23634
|
});
|
|
23635
23635
|
|
|
23636
|
-
// ../system/dist/dist-
|
|
23637
|
-
var
|
|
23638
|
-
"../system/dist/dist-
|
|
23636
|
+
// ../system/dist/dist-C7qWwrK1.js
|
|
23637
|
+
var require_dist_C7qWwrK1 = __commonJS({
|
|
23638
|
+
"../system/dist/dist-C7qWwrK1.js"(exports) {
|
|
23639
23639
|
"use strict";
|
|
23640
23640
|
var zod = require_zod();
|
|
23641
23641
|
var EventCategory = /* @__PURE__ */ (function(EventCategory2) {
|
|
@@ -37159,7 +37159,20 @@ var require_dist_C0IXtI_E = __commonJS({
|
|
|
37159
37159
|
projection: TrackProjectionSchema.optional(),
|
|
37160
37160
|
/** Include stationary-promoted rows (parked objects). Default false: the
|
|
37161
37161
|
* feed lists passages; parking records live on the stationary registry. */
|
|
37162
|
-
includeStationary: zod.z.boolean().optional()
|
|
37162
|
+
includeStationary: zod.z.boolean().optional(),
|
|
37163
|
+
/**
|
|
37164
|
+
* Restrict to these track classes. ABSENT or EMPTY means no filter.
|
|
37165
|
+
*
|
|
37166
|
+
* The same filter `listTracks` takes, because the timeline's class chips must
|
|
37167
|
+
* mean the same thing whether the scope is one camera or twelve. Until this
|
|
37168
|
+
* existed the scoped feed downloaded a page and narrowed it on the phone
|
|
37169
|
+
* while the single-camera path narrowed the read — one filter, two costs.
|
|
37170
|
+
*
|
|
37171
|
+
* A SUPERSET prefilter on `classes[]`, like its single-camera twin: rows
|
|
37172
|
+
* whose class list is unreadable are kept, and the client's rule stays the
|
|
37173
|
+
* exact one.
|
|
37174
|
+
*/
|
|
37175
|
+
classes: zod.z.array(zod.z.string()).optional()
|
|
37163
37176
|
});
|
|
37164
37177
|
var RecentTracksPageSchema = zod.z.object({
|
|
37165
37178
|
/** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
|
|
@@ -42290,8 +42303,22 @@ var require_dist_C0IXtI_E = __commonJS({
|
|
|
42290
42303
|
durability: "session"
|
|
42291
42304
|
};
|
|
42292
42305
|
var BatteryStatusSchema = zod.z.object({
|
|
42293
|
-
/**
|
|
42294
|
-
|
|
42306
|
+
/**
|
|
42307
|
+
* 0..100 inclusive, firmware-reported. **`null` means NOT YET KNOWN** — the
|
|
42308
|
+
* provider has registered the capability but no reading has landed.
|
|
42309
|
+
*
|
|
42310
|
+
* It is nullable because it was not, and the only value a provider could
|
|
42311
|
+
* seed with was `0`. A battery camera behind an NVR therefore announced
|
|
42312
|
+
* itself at 0% on every start and corrected itself a moment later, which is
|
|
42313
|
+
* indistinguishable from a real flat battery: it fires the low-battery alert
|
|
42314
|
+
* every time the hub restarts. Unknown is not empty (D315), and on a battery
|
|
42315
|
+
* reading the difference is an alarm.
|
|
42316
|
+
*
|
|
42317
|
+
* `vacuum-control` and `lawn-mower-control` already model it this way.
|
|
42318
|
+
* Consumers must SKIP a null rather than coerce it — `battery-band` already
|
|
42319
|
+
* declines to band a non-finite reading, which is the correct shape.
|
|
42320
|
+
*/
|
|
42321
|
+
percentage: zod.z.number().min(0).max(100).nullable(),
|
|
42295
42322
|
/**
|
|
42296
42323
|
* Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
|
|
42297
42324
|
* Reolink-specific for the Solar Panel 2 accessory (will become
|
|
@@ -50087,7 +50114,7 @@ var require_dist_C0IXtI_E = __commonJS({
|
|
|
50087
50114
|
}
|
|
50088
50115
|
function resolveContainerPrimaryChild(children, overrideEntityId) {
|
|
50089
50116
|
if (overrideEntityId !== void 0 && overrideEntityId !== null) {
|
|
50090
|
-
const picked = children.find((c) => c.entityId === overrideEntityId);
|
|
50117
|
+
const picked = children.find((c) => c.stableId === overrideEntityId) ?? children.find((c) => c.entityId !== void 0 && c.entityId === overrideEntityId);
|
|
50091
50118
|
if (picked !== void 0) return picked;
|
|
50092
50119
|
}
|
|
50093
50120
|
return [...children].toSorted((a, b) => rank(a.type) - rank(b.type))[0] ?? null;
|
|
@@ -59827,7 +59854,7 @@ var require_alerts_addon = __commonJS({
|
|
|
59827
59854
|
[Symbol.toStringTag]: { value: "Module" }
|
|
59828
59855
|
});
|
|
59829
59856
|
require_chunk_Cek0wNdY();
|
|
59830
|
-
var require_dist10 =
|
|
59857
|
+
var require_dist10 = require_dist_C7qWwrK1();
|
|
59831
59858
|
function selectExpired(alerts, cutoffMs) {
|
|
59832
59859
|
return alerts.filter((a) => a.createdAt < cutoffMs).sort((a, b) => a.createdAt - b.createdAt).map((a) => a.id);
|
|
59833
59860
|
}
|
|
@@ -60646,7 +60673,7 @@ var require_console_logging = __commonJS({
|
|
|
60646
60673
|
[Symbol.toStringTag]: { value: "Module" }
|
|
60647
60674
|
});
|
|
60648
60675
|
require_chunk_Cek0wNdY();
|
|
60649
|
-
var require_dist10 =
|
|
60676
|
+
var require_dist10 = require_dist_C7qWwrK1();
|
|
60650
60677
|
var require_formatter = require_formatter_DqAKDlvN();
|
|
60651
60678
|
var LEVEL_RANK = {
|
|
60652
60679
|
debug: 0,
|
|
@@ -60740,7 +60767,7 @@ var require_core_blocks_addon = __commonJS({
|
|
|
60740
60767
|
"use strict";
|
|
60741
60768
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
60742
60769
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
60743
|
-
var require_dist10 =
|
|
60770
|
+
var require_dist10 = require_dist_C7qWwrK1();
|
|
60744
60771
|
var node_crypto = __require("crypto");
|
|
60745
60772
|
var node_fs_promises = __require("fs/promises");
|
|
60746
60773
|
node_fs_promises = require_chunk.__toESM(node_fs_promises);
|
|
@@ -61637,11 +61664,11 @@ var require_core_blocks = __commonJS({
|
|
|
61637
61664
|
}
|
|
61638
61665
|
});
|
|
61639
61666
|
|
|
61640
|
-
// ../system/dist/retired-settings-keys-
|
|
61641
|
-
var
|
|
61642
|
-
"../system/dist/retired-settings-keys-
|
|
61667
|
+
// ../system/dist/retired-settings-keys-3soU9pfP.js
|
|
61668
|
+
var require_retired_settings_keys_3soU9pfP = __commonJS({
|
|
61669
|
+
"../system/dist/retired-settings-keys-3soU9pfP.js"(exports) {
|
|
61643
61670
|
"use strict";
|
|
61644
|
-
var require_dist10 =
|
|
61671
|
+
var require_dist10 = require_dist_C7qWwrK1();
|
|
61645
61672
|
function settingsStoreIsAuthoritativeHere(env) {
|
|
61646
61673
|
const raw = (env["CAMSTACK_ROLE"] ?? "").trim().toLowerCase();
|
|
61647
61674
|
return raw === "" || raw === "hub";
|
|
@@ -63855,8 +63882,8 @@ var require_device_manager_addon = __commonJS({
|
|
|
63855
63882
|
[Symbol.toStringTag]: { value: "Module" }
|
|
63856
63883
|
});
|
|
63857
63884
|
require_chunk_Cek0wNdY();
|
|
63858
|
-
var require_dist10 =
|
|
63859
|
-
var require_retired_settings_keys =
|
|
63885
|
+
var require_dist10 = require_dist_C7qWwrK1();
|
|
63886
|
+
var require_retired_settings_keys = require_retired_settings_keys_3soU9pfP();
|
|
63860
63887
|
var node_crypto = __require("crypto");
|
|
63861
63888
|
var _camstack_types_node = require_node();
|
|
63862
63889
|
var JOB_HISTORY = 20;
|
|
@@ -65498,9 +65525,9 @@ var require_device_manager_addon = __commonJS({
|
|
|
65498
65525
|
nextVisited.add(id);
|
|
65499
65526
|
const primary = require_dist10.resolveContainerPrimaryChild((byParent.get(id) ?? []).map((c) => ({
|
|
65500
65527
|
id: c.id,
|
|
65501
|
-
|
|
65528
|
+
stableId: c.stableId,
|
|
65502
65529
|
type: c.type
|
|
65503
|
-
})),
|
|
65530
|
+
})), byId.get(id)?.primaryChildEntityId);
|
|
65504
65531
|
if (primary !== null) expandContainer(primary.id, byId, byParent, nextVisited, out);
|
|
65505
65532
|
}
|
|
65506
65533
|
function resolveLinkedDeviceIds(params) {
|
|
@@ -68896,7 +68923,7 @@ var require_hub_forwarder = __commonJS({
|
|
|
68896
68923
|
[Symbol.toStringTag]: { value: "Module" }
|
|
68897
68924
|
});
|
|
68898
68925
|
require_chunk_Cek0wNdY();
|
|
68899
|
-
var require_dist10 =
|
|
68926
|
+
var require_dist10 = require_dist_C7qWwrK1();
|
|
68900
68927
|
var require_formatter = require_formatter_DqAKDlvN();
|
|
68901
68928
|
var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
|
|
68902
68929
|
var HubForwarderDestination = class {
|
|
@@ -69033,7 +69060,7 @@ var require_liveness_monitor_addon = __commonJS({
|
|
|
69033
69060
|
"use strict";
|
|
69034
69061
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
69035
69062
|
require_chunk_Cek0wNdY();
|
|
69036
|
-
var require_dist10 =
|
|
69063
|
+
var require_dist10 = require_dist_C7qWwrK1();
|
|
69037
69064
|
var NO_DEVICES = "liveness:no-devices";
|
|
69038
69065
|
var ALL_OFFLINE = "liveness:all-devices-offline";
|
|
69039
69066
|
var NO_FOOTAGE_PREFIX = "liveness:no-footage:";
|
|
@@ -69223,7 +69250,7 @@ var require_local_auth_addon = __commonJS({
|
|
|
69223
69250
|
[Symbol.toStringTag]: { value: "Module" }
|
|
69224
69251
|
});
|
|
69225
69252
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
69226
|
-
var require_dist10 =
|
|
69253
|
+
var require_dist10 = require_dist_C7qWwrK1();
|
|
69227
69254
|
var node_crypto = __require("crypto");
|
|
69228
69255
|
node_crypto = require_chunk.__toESM(node_crypto);
|
|
69229
69256
|
var crypto$1 = __require("crypto");
|
|
@@ -77036,7 +77063,7 @@ var require_loki_logging = __commonJS({
|
|
|
77036
77063
|
[Symbol.toStringTag]: { value: "Module" }
|
|
77037
77064
|
});
|
|
77038
77065
|
require_chunk_Cek0wNdY();
|
|
77039
|
-
var require_dist10 =
|
|
77066
|
+
var require_dist10 = require_dist_C7qWwrK1();
|
|
77040
77067
|
function sanitizeLabelName(raw) {
|
|
77041
77068
|
const replaced = raw.replaceAll(/[^a-zA-Z0-9_]/g, "_");
|
|
77042
77069
|
return /^[a-zA-Z_]/.test(replaced) ? replaced : `_${replaced}`;
|
|
@@ -77601,7 +77628,7 @@ var require_native_metrics_addon = __commonJS({
|
|
|
77601
77628
|
[Symbol.toStringTag]: { value: "Module" }
|
|
77602
77629
|
});
|
|
77603
77630
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
77604
|
-
var require_dist10 =
|
|
77631
|
+
var require_dist10 = require_dist_C7qWwrK1();
|
|
77605
77632
|
var node_fs_promises = __require("fs/promises");
|
|
77606
77633
|
var node_child_process = __require("child_process");
|
|
77607
77634
|
var node_util = __require("util");
|
|
@@ -80185,7 +80212,7 @@ var require_filesystem_storage_addon = __commonJS({
|
|
|
80185
80212
|
[Symbol.toStringTag]: { value: "Module" }
|
|
80186
80213
|
});
|
|
80187
80214
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
80188
|
-
var require_dist10 =
|
|
80215
|
+
var require_dist10 = require_dist_C7qWwrK1();
|
|
80189
80216
|
var node_crypto = __require("crypto");
|
|
80190
80217
|
var node_fs_promises = __require("fs/promises");
|
|
80191
80218
|
var node_path = __require("path");
|
|
@@ -81301,8 +81328,8 @@ var require_sqlite_settings_addon = __commonJS({
|
|
|
81301
81328
|
[Symbol.toStringTag]: { value: "Module" }
|
|
81302
81329
|
});
|
|
81303
81330
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
81304
|
-
var require_dist10 =
|
|
81305
|
-
var require_retired_settings_keys =
|
|
81331
|
+
var require_dist10 = require_dist_C7qWwrK1();
|
|
81332
|
+
var require_retired_settings_keys = require_retired_settings_keys_3soU9pfP();
|
|
81306
81333
|
var node_crypto = __require("crypto");
|
|
81307
81334
|
var node_fs = __require("fs");
|
|
81308
81335
|
var node_module = __require("module");
|
|
@@ -83792,7 +83819,7 @@ var require_storage_orchestrator_addon = __commonJS({
|
|
|
83792
83819
|
[Symbol.toStringTag]: { value: "Module" }
|
|
83793
83820
|
});
|
|
83794
83821
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
83795
|
-
var require_dist10 =
|
|
83822
|
+
var require_dist10 = require_dist_C7qWwrK1();
|
|
83796
83823
|
var require_hub_cap_forward = require_hub_cap_forward_DmHNjbB0();
|
|
83797
83824
|
var zod = require_zod();
|
|
83798
83825
|
var node_crypto = __require("crypto");
|
|
@@ -86743,7 +86770,7 @@ var require_system_config_addon = __commonJS({
|
|
|
86743
86770
|
[Symbol.toStringTag]: { value: "Module" }
|
|
86744
86771
|
});
|
|
86745
86772
|
require_chunk_Cek0wNdY();
|
|
86746
|
-
var require_dist10 =
|
|
86773
|
+
var require_dist10 = require_dist_C7qWwrK1();
|
|
86747
86774
|
var SECTION_TITLES = {
|
|
86748
86775
|
server: "Server",
|
|
86749
86776
|
auth: "Authentication"
|
|
@@ -104804,7 +104831,7 @@ var require_winston_logging = __commonJS({
|
|
|
104804
104831
|
[Symbol.toStringTag]: { value: "Module" }
|
|
104805
104832
|
});
|
|
104806
104833
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
104807
|
-
var require_dist10 =
|
|
104834
|
+
var require_dist10 = require_dist_C7qWwrK1();
|
|
104808
104835
|
var require_formatter = require_formatter_DqAKDlvN();
|
|
104809
104836
|
var node_path = __require("path");
|
|
104810
104837
|
node_path = require_chunk.__toESM(node_path);
|
|
@@ -117304,12 +117331,12 @@ var require_dist2 = __commonJS({
|
|
|
117304
117331
|
}
|
|
117305
117332
|
});
|
|
117306
117333
|
|
|
117307
|
-
// ../system/dist/manifest-system-deps-
|
|
117308
|
-
var
|
|
117309
|
-
"../system/dist/manifest-system-deps-
|
|
117334
|
+
// ../system/dist/manifest-system-deps-PAIfmNun.js
|
|
117335
|
+
var require_manifest_system_deps_PAIfmNun = __commonJS({
|
|
117336
|
+
"../system/dist/manifest-system-deps-PAIfmNun.js"(exports) {
|
|
117310
117337
|
"use strict";
|
|
117311
117338
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
117312
|
-
|
|
117339
|
+
require_dist_C7qWwrK1();
|
|
117313
117340
|
require_hub_cap_forward_DmHNjbB0();
|
|
117314
117341
|
var node_crypto = __require("crypto");
|
|
117315
117342
|
node_crypto = require_chunk.__toESM(node_crypto);
|
|
@@ -129376,7 +129403,7 @@ var require_dist3 = __commonJS({
|
|
|
129376
129403
|
"use strict";
|
|
129377
129404
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
129378
129405
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
129379
|
-
var require_dist10 =
|
|
129406
|
+
var require_dist10 = require_dist_C7qWwrK1();
|
|
129380
129407
|
var require_builtins_alerts_alerts_addon = require_alerts_addon();
|
|
129381
129408
|
require_alerts();
|
|
129382
129409
|
var require_formatter = require_formatter_DqAKDlvN();
|
|
@@ -129403,7 +129430,7 @@ var require_dist3 = __commonJS({
|
|
|
129403
129430
|
var require_builtins_winston_logging_index = require_winston_logging();
|
|
129404
129431
|
var require_file_data_plane = require_file_data_plane_DO8KbxCe();
|
|
129405
129432
|
var require_tls$1 = require_tls_BxQlomxd();
|
|
129406
|
-
var require_manifest_system_deps =
|
|
129433
|
+
var require_manifest_system_deps = require_manifest_system_deps_PAIfmNun();
|
|
129407
129434
|
var require_resource_monitor = require_resource_monitor_CdnzxBLP();
|
|
129408
129435
|
var require_custom_action_registry = require_custom_action_registry_jY0NOZK8();
|
|
129409
129436
|
var zod = require_zod();
|
|
@@ -224265,7 +224292,20 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
224265
224292
|
projection: TrackProjectionSchema.optional(),
|
|
224266
224293
|
/** Include stationary-promoted rows (parked objects). Default false: the
|
|
224267
224294
|
* feed lists passages; parking records live on the stationary registry. */
|
|
224268
|
-
includeStationary: zod.z.boolean().optional()
|
|
224295
|
+
includeStationary: zod.z.boolean().optional(),
|
|
224296
|
+
/**
|
|
224297
|
+
* Restrict to these track classes. ABSENT or EMPTY means no filter.
|
|
224298
|
+
*
|
|
224299
|
+
* The same filter `listTracks` takes, because the timeline's class chips must
|
|
224300
|
+
* mean the same thing whether the scope is one camera or twelve. Until this
|
|
224301
|
+
* existed the scoped feed downloaded a page and narrowed it on the phone
|
|
224302
|
+
* while the single-camera path narrowed the read — one filter, two costs.
|
|
224303
|
+
*
|
|
224304
|
+
* A SUPERSET prefilter on `classes[]`, like its single-camera twin: rows
|
|
224305
|
+
* whose class list is unreadable are kept, and the client's rule stays the
|
|
224306
|
+
* exact one.
|
|
224307
|
+
*/
|
|
224308
|
+
classes: zod.z.array(zod.z.string()).optional()
|
|
224269
224309
|
});
|
|
224270
224310
|
var RecentTracksPageSchema = zod.z.object({
|
|
224271
224311
|
/** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
|
|
@@ -229563,8 +229603,22 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
229563
229603
|
durability: "session"
|
|
229564
229604
|
};
|
|
229565
229605
|
var BatteryStatusSchema = zod.z.object({
|
|
229566
|
-
/**
|
|
229567
|
-
|
|
229606
|
+
/**
|
|
229607
|
+
* 0..100 inclusive, firmware-reported. **`null` means NOT YET KNOWN** — the
|
|
229608
|
+
* provider has registered the capability but no reading has landed.
|
|
229609
|
+
*
|
|
229610
|
+
* It is nullable because it was not, and the only value a provider could
|
|
229611
|
+
* seed with was `0`. A battery camera behind an NVR therefore announced
|
|
229612
|
+
* itself at 0% on every start and corrected itself a moment later, which is
|
|
229613
|
+
* indistinguishable from a real flat battery: it fires the low-battery alert
|
|
229614
|
+
* every time the hub restarts. Unknown is not empty (D315), and on a battery
|
|
229615
|
+
* reading the difference is an alarm.
|
|
229616
|
+
*
|
|
229617
|
+
* `vacuum-control` and `lawn-mower-control` already model it this way.
|
|
229618
|
+
* Consumers must SKIP a null rather than coerce it — `battery-band` already
|
|
229619
|
+
* declines to band a non-finite reading, which is the correct shape.
|
|
229620
|
+
*/
|
|
229621
|
+
percentage: zod.z.number().min(0).max(100).nullable(),
|
|
229568
229622
|
/**
|
|
229569
229623
|
* Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
|
|
229570
229624
|
* Reolink-specific for the Solar Panel 2 accessory (will become
|
|
@@ -237456,7 +237510,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
237456
237510
|
}
|
|
237457
237511
|
function resolveContainerPrimaryChild(children, overrideEntityId) {
|
|
237458
237512
|
if (overrideEntityId !== void 0 && overrideEntityId !== null) {
|
|
237459
|
-
const picked = children.find((c) => c.entityId === overrideEntityId);
|
|
237513
|
+
const picked = children.find((c) => c.stableId === overrideEntityId) ?? children.find((c) => c.entityId !== void 0 && c.entityId === overrideEntityId);
|
|
237460
237514
|
if (picked !== void 0) return picked;
|
|
237461
237515
|
}
|
|
237462
237516
|
return [...children].toSorted((a, b) => rank(a.type) - rank(b.type))[0] ?? null;
|