camstack 1.2.135 → 1.2.136
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.
|
@@ -27110,7 +27110,17 @@ var EventDensityBucketSchema = external_exports.object({
|
|
|
27110
27110
|
bucketStart: external_exports.number(),
|
|
27111
27111
|
motion: external_exports.number().int(),
|
|
27112
27112
|
object: external_exports.number().int(),
|
|
27113
|
-
audio: external_exports.number().int()
|
|
27113
|
+
audio: external_exports.number().int(),
|
|
27114
|
+
/**
|
|
27115
|
+
* Energy-weighted mean dBFS of the audio events in this bucket — the LEVEL,
|
|
27116
|
+
* as opposed to `audio`, which is their COUNT (D431).
|
|
27117
|
+
*
|
|
27118
|
+
* ABSENT when the bucket holds no audio event. Absence means "nothing was
|
|
27119
|
+
* measured", which is not the same claim as silence, and a lane that cannot
|
|
27120
|
+
* tell them apart paints a quiet hour at full scale — which is exactly what
|
|
27121
|
+
* the count-on-a-level-meter did.
|
|
27122
|
+
*/
|
|
27123
|
+
audioDbfs: external_exports.number().optional()
|
|
27114
27124
|
});
|
|
27115
27125
|
var EventDensityForDeviceSchema = external_exports.object({
|
|
27116
27126
|
deviceId: external_exports.number(),
|
|
@@ -37795,7 +37805,23 @@ var RecordingRangeSchema = external_exports.object({
|
|
|
37795
37805
|
});
|
|
37796
37806
|
var RecordingAvailabilitySchema = external_exports.object({
|
|
37797
37807
|
deviceId: external_exports.number(),
|
|
37798
|
-
ranges: external_exports.array(RecordingRangeSchema)
|
|
37808
|
+
ranges: external_exports.array(RecordingRangeSchema),
|
|
37809
|
+
/**
|
|
37810
|
+
* Every profile this camera has footage in — not only the one `ranges`
|
|
37811
|
+
* describes (D433).
|
|
37812
|
+
*
|
|
37813
|
+
* `ranges` answers for ONE profile by design: the timeline is a single bar,
|
|
37814
|
+
* and enumerating all of them triples the directory reads for a bar that
|
|
37815
|
+
* would look identical. But the answer used to say nothing about that, so a
|
|
37816
|
+
* caller asking "what can I export?" read the single preferred profile as
|
|
37817
|
+
* the only one that exists — on this deployment every camera records `high`
|
|
37818
|
+
* AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
|
|
37819
|
+
* UI could not see it.
|
|
37820
|
+
*
|
|
37821
|
+
* Cheap: it is the same shallow directory read the profile CHOICE already
|
|
37822
|
+
* makes. Ask for a specific profile's ranges with the `profile` input.
|
|
37823
|
+
*/
|
|
37824
|
+
profilesWithFootage: external_exports.array(external_exports.string())
|
|
37799
37825
|
});
|
|
37800
37826
|
var RecordingDaysSchema = external_exports.object({
|
|
37801
37827
|
deviceId: external_exports.number(),
|
|
@@ -37805,7 +37831,11 @@ var RecordingDaysSchema = external_exports.object({
|
|
|
37805
37831
|
var RecordingAvailabilityForDeviceSchema = external_exports.object({
|
|
37806
37832
|
deviceId: external_exports.number(),
|
|
37807
37833
|
read: external_exports.enum(["read", "unreadable"]),
|
|
37808
|
-
ranges: external_exports.array(RecordingRangeSchema).readonly()
|
|
37834
|
+
ranges: external_exports.array(RecordingRangeSchema).readonly(),
|
|
37835
|
+
/** Same field, same meaning, as the singular answer (D433). A row that
|
|
37836
|
+
* dropped it would tell a grid caller the archive holds one profile.
|
|
37837
|
+
* Empty on an `'unreadable'` row: nobody looked. */
|
|
37838
|
+
profilesWithFootage: external_exports.array(external_exports.string()).readonly()
|
|
37809
37839
|
});
|
|
37810
37840
|
var RecordingDaysForDeviceSchema = external_exports.object({
|
|
37811
37841
|
deviceId: external_exports.number(),
|
|
@@ -38020,7 +38050,14 @@ var recordingCapability = {
|
|
|
38020
38050
|
getAvailability: method(external_exports.object({
|
|
38021
38051
|
deviceId: external_exports.number(),
|
|
38022
38052
|
fromMs: external_exports.number(),
|
|
38023
|
-
toMs: external_exports.number()
|
|
38053
|
+
toMs: external_exports.number(),
|
|
38054
|
+
/**
|
|
38055
|
+
* Answer for THIS profile instead of the preferred one (D433). Absent
|
|
38056
|
+
* keeps the timeline's behaviour — one bar, one profile, one set of
|
|
38057
|
+
* reads. `profilesWithFootage` on the answer says what may be asked
|
|
38058
|
+
* for.
|
|
38059
|
+
*/
|
|
38060
|
+
profile: external_exports.string().optional()
|
|
38024
38061
|
}), RecordingAvailabilitySchema, {
|
|
38025
38062
|
kind: "query",
|
|
38026
38063
|
auth: "protected"
|
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-XZJ7JATD.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-SY5BQXD2.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-SY5BQXD2.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-3BUZVVZ3.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-C85OOASj.js
|
|
23637
|
+
var require_dist_C85OOASj = __commonJS({
|
|
23638
|
+
"../system/dist/dist-C85OOASj.js"(exports) {
|
|
23639
23639
|
"use strict";
|
|
23640
23640
|
var zod = require_zod();
|
|
23641
23641
|
var EventCategory = /* @__PURE__ */ (function(EventCategory2) {
|
|
@@ -37878,7 +37878,17 @@ var require_dist_DYWqXngV = __commonJS({
|
|
|
37878
37878
|
bucketStart: zod.z.number(),
|
|
37879
37879
|
motion: zod.z.number().int(),
|
|
37880
37880
|
object: zod.z.number().int(),
|
|
37881
|
-
audio: zod.z.number().int()
|
|
37881
|
+
audio: zod.z.number().int(),
|
|
37882
|
+
/**
|
|
37883
|
+
* Energy-weighted mean dBFS of the audio events in this bucket — the LEVEL,
|
|
37884
|
+
* as opposed to `audio`, which is their COUNT (D431).
|
|
37885
|
+
*
|
|
37886
|
+
* ABSENT when the bucket holds no audio event. Absence means "nothing was
|
|
37887
|
+
* measured", which is not the same claim as silence, and a lane that cannot
|
|
37888
|
+
* tell them apart paints a quiet hour at full scale — which is exactly what
|
|
37889
|
+
* the count-on-a-level-meter did.
|
|
37890
|
+
*/
|
|
37891
|
+
audioDbfs: zod.z.number().optional()
|
|
37882
37892
|
});
|
|
37883
37893
|
var EventDensityForDeviceSchema = zod.z.object({
|
|
37884
37894
|
deviceId: zod.z.number(),
|
|
@@ -48386,7 +48396,23 @@ var require_dist_DYWqXngV = __commonJS({
|
|
|
48386
48396
|
});
|
|
48387
48397
|
var RecordingAvailabilitySchema = zod.z.object({
|
|
48388
48398
|
deviceId: zod.z.number(),
|
|
48389
|
-
ranges: zod.z.array(RecordingRangeSchema)
|
|
48399
|
+
ranges: zod.z.array(RecordingRangeSchema),
|
|
48400
|
+
/**
|
|
48401
|
+
* Every profile this camera has footage in — not only the one `ranges`
|
|
48402
|
+
* describes (D433).
|
|
48403
|
+
*
|
|
48404
|
+
* `ranges` answers for ONE profile by design: the timeline is a single bar,
|
|
48405
|
+
* and enumerating all of them triples the directory reads for a bar that
|
|
48406
|
+
* would look identical. But the answer used to say nothing about that, so a
|
|
48407
|
+
* caller asking "what can I export?" read the single preferred profile as
|
|
48408
|
+
* the only one that exists — on this deployment every camera records `high`
|
|
48409
|
+
* AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
|
|
48410
|
+
* UI could not see it.
|
|
48411
|
+
*
|
|
48412
|
+
* Cheap: it is the same shallow directory read the profile CHOICE already
|
|
48413
|
+
* makes. Ask for a specific profile's ranges with the `profile` input.
|
|
48414
|
+
*/
|
|
48415
|
+
profilesWithFootage: zod.z.array(zod.z.string())
|
|
48390
48416
|
});
|
|
48391
48417
|
var RecordingDaysSchema = zod.z.object({
|
|
48392
48418
|
deviceId: zod.z.number(),
|
|
@@ -48396,7 +48422,11 @@ var require_dist_DYWqXngV = __commonJS({
|
|
|
48396
48422
|
var RecordingAvailabilityForDeviceSchema = zod.z.object({
|
|
48397
48423
|
deviceId: zod.z.number(),
|
|
48398
48424
|
read: zod.z.enum(["read", "unreadable"]),
|
|
48399
|
-
ranges: zod.z.array(RecordingRangeSchema).readonly()
|
|
48425
|
+
ranges: zod.z.array(RecordingRangeSchema).readonly(),
|
|
48426
|
+
/** Same field, same meaning, as the singular answer (D433). A row that
|
|
48427
|
+
* dropped it would tell a grid caller the archive holds one profile.
|
|
48428
|
+
* Empty on an `'unreadable'` row: nobody looked. */
|
|
48429
|
+
profilesWithFootage: zod.z.array(zod.z.string()).readonly()
|
|
48400
48430
|
});
|
|
48401
48431
|
var RecordingDaysForDeviceSchema = zod.z.object({
|
|
48402
48432
|
deviceId: zod.z.number(),
|
|
@@ -48611,7 +48641,14 @@ var require_dist_DYWqXngV = __commonJS({
|
|
|
48611
48641
|
getAvailability: method(zod.z.object({
|
|
48612
48642
|
deviceId: zod.z.number(),
|
|
48613
48643
|
fromMs: zod.z.number(),
|
|
48614
|
-
toMs: zod.z.number()
|
|
48644
|
+
toMs: zod.z.number(),
|
|
48645
|
+
/**
|
|
48646
|
+
* Answer for THIS profile instead of the preferred one (D433). Absent
|
|
48647
|
+
* keeps the timeline's behaviour — one bar, one profile, one set of
|
|
48648
|
+
* reads. `profilesWithFootage` on the answer says what may be asked
|
|
48649
|
+
* for.
|
|
48650
|
+
*/
|
|
48651
|
+
profile: zod.z.string().optional()
|
|
48615
48652
|
}), RecordingAvailabilitySchema, {
|
|
48616
48653
|
kind: "query",
|
|
48617
48654
|
auth: "protected"
|
|
@@ -61487,7 +61524,7 @@ var require_alerts_addon = __commonJS({
|
|
|
61487
61524
|
[Symbol.toStringTag]: { value: "Module" }
|
|
61488
61525
|
});
|
|
61489
61526
|
require_chunk_Cek0wNdY();
|
|
61490
|
-
var require_dist10 =
|
|
61527
|
+
var require_dist10 = require_dist_C85OOASj();
|
|
61491
61528
|
function selectExpired(alerts, cutoffMs) {
|
|
61492
61529
|
return alerts.filter((a) => a.createdAt < cutoffMs).sort((a, b) => a.createdAt - b.createdAt).map((a) => a.id);
|
|
61493
61530
|
}
|
|
@@ -62306,7 +62343,7 @@ var require_console_logging = __commonJS({
|
|
|
62306
62343
|
[Symbol.toStringTag]: { value: "Module" }
|
|
62307
62344
|
});
|
|
62308
62345
|
require_chunk_Cek0wNdY();
|
|
62309
|
-
var require_dist10 =
|
|
62346
|
+
var require_dist10 = require_dist_C85OOASj();
|
|
62310
62347
|
var require_formatter = require_formatter_DqAKDlvN();
|
|
62311
62348
|
var LEVEL_RANK = {
|
|
62312
62349
|
debug: 0,
|
|
@@ -62400,7 +62437,7 @@ var require_core_blocks_addon = __commonJS({
|
|
|
62400
62437
|
"use strict";
|
|
62401
62438
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
62402
62439
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
62403
|
-
var require_dist10 =
|
|
62440
|
+
var require_dist10 = require_dist_C85OOASj();
|
|
62404
62441
|
var node_crypto = __require("crypto");
|
|
62405
62442
|
var node_fs_promises = __require("fs/promises");
|
|
62406
62443
|
node_fs_promises = require_chunk.__toESM(node_fs_promises);
|
|
@@ -63297,11 +63334,11 @@ var require_core_blocks = __commonJS({
|
|
|
63297
63334
|
}
|
|
63298
63335
|
});
|
|
63299
63336
|
|
|
63300
|
-
// ../system/dist/retired-settings-keys-
|
|
63301
|
-
var
|
|
63302
|
-
"../system/dist/retired-settings-keys-
|
|
63337
|
+
// ../system/dist/retired-settings-keys-Dfj9LA-i.js
|
|
63338
|
+
var require_retired_settings_keys_Dfj9LA_i = __commonJS({
|
|
63339
|
+
"../system/dist/retired-settings-keys-Dfj9LA-i.js"(exports) {
|
|
63303
63340
|
"use strict";
|
|
63304
|
-
var require_dist10 =
|
|
63341
|
+
var require_dist10 = require_dist_C85OOASj();
|
|
63305
63342
|
function settingsStoreIsAuthoritativeHere(env) {
|
|
63306
63343
|
const raw = (env["CAMSTACK_ROLE"] ?? "").trim().toLowerCase();
|
|
63307
63344
|
return raw === "" || raw === "hub";
|
|
@@ -65536,8 +65573,8 @@ var require_device_manager_addon = __commonJS({
|
|
|
65536
65573
|
[Symbol.toStringTag]: { value: "Module" }
|
|
65537
65574
|
});
|
|
65538
65575
|
require_chunk_Cek0wNdY();
|
|
65539
|
-
var require_dist10 =
|
|
65540
|
-
var require_retired_settings_keys =
|
|
65576
|
+
var require_dist10 = require_dist_C85OOASj();
|
|
65577
|
+
var require_retired_settings_keys = require_retired_settings_keys_Dfj9LA_i();
|
|
65541
65578
|
var node_crypto = __require("crypto");
|
|
65542
65579
|
var _camstack_types_node = require_node();
|
|
65543
65580
|
var JOB_HISTORY = 20;
|
|
@@ -71162,7 +71199,7 @@ var require_hub_forwarder = __commonJS({
|
|
|
71162
71199
|
[Symbol.toStringTag]: { value: "Module" }
|
|
71163
71200
|
});
|
|
71164
71201
|
require_chunk_Cek0wNdY();
|
|
71165
|
-
var require_dist10 =
|
|
71202
|
+
var require_dist10 = require_dist_C85OOASj();
|
|
71166
71203
|
var require_formatter = require_formatter_DqAKDlvN();
|
|
71167
71204
|
var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
|
|
71168
71205
|
var HubForwarderDestination = class {
|
|
@@ -71299,7 +71336,7 @@ var require_liveness_monitor_addon = __commonJS({
|
|
|
71299
71336
|
"use strict";
|
|
71300
71337
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
71301
71338
|
require_chunk_Cek0wNdY();
|
|
71302
|
-
var require_dist10 =
|
|
71339
|
+
var require_dist10 = require_dist_C85OOASj();
|
|
71303
71340
|
var NO_DEVICES = "liveness:no-devices";
|
|
71304
71341
|
var ALL_OFFLINE = "liveness:all-devices-offline";
|
|
71305
71342
|
var NO_FOOTAGE_PREFIX = "liveness:no-footage:";
|
|
@@ -71495,7 +71532,7 @@ var require_local_auth_addon = __commonJS({
|
|
|
71495
71532
|
[Symbol.toStringTag]: { value: "Module" }
|
|
71496
71533
|
});
|
|
71497
71534
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
71498
|
-
var require_dist10 =
|
|
71535
|
+
var require_dist10 = require_dist_C85OOASj();
|
|
71499
71536
|
var node_crypto = __require("crypto");
|
|
71500
71537
|
node_crypto = require_chunk.__toESM(node_crypto);
|
|
71501
71538
|
var crypto$1 = __require("crypto");
|
|
@@ -79308,7 +79345,7 @@ var require_loki_logging = __commonJS({
|
|
|
79308
79345
|
[Symbol.toStringTag]: { value: "Module" }
|
|
79309
79346
|
});
|
|
79310
79347
|
require_chunk_Cek0wNdY();
|
|
79311
|
-
var require_dist10 =
|
|
79348
|
+
var require_dist10 = require_dist_C85OOASj();
|
|
79312
79349
|
function sanitizeLabelName(raw) {
|
|
79313
79350
|
const replaced = raw.replaceAll(/[^a-zA-Z0-9_]/g, "_");
|
|
79314
79351
|
return /^[a-zA-Z_]/.test(replaced) ? replaced : `_${replaced}`;
|
|
@@ -79873,7 +79910,7 @@ var require_native_metrics_addon = __commonJS({
|
|
|
79873
79910
|
[Symbol.toStringTag]: { value: "Module" }
|
|
79874
79911
|
});
|
|
79875
79912
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
79876
|
-
var require_dist10 =
|
|
79913
|
+
var require_dist10 = require_dist_C85OOASj();
|
|
79877
79914
|
var node_fs_promises = __require("fs/promises");
|
|
79878
79915
|
var node_child_process = __require("child_process");
|
|
79879
79916
|
var node_util = __require("util");
|
|
@@ -82457,7 +82494,7 @@ var require_filesystem_storage_addon = __commonJS({
|
|
|
82457
82494
|
[Symbol.toStringTag]: { value: "Module" }
|
|
82458
82495
|
});
|
|
82459
82496
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
82460
|
-
var require_dist10 =
|
|
82497
|
+
var require_dist10 = require_dist_C85OOASj();
|
|
82461
82498
|
var node_crypto = __require("crypto");
|
|
82462
82499
|
var node_fs_promises = __require("fs/promises");
|
|
82463
82500
|
var node_path = __require("path");
|
|
@@ -83573,8 +83610,8 @@ var require_sqlite_settings_addon = __commonJS({
|
|
|
83573
83610
|
[Symbol.toStringTag]: { value: "Module" }
|
|
83574
83611
|
});
|
|
83575
83612
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
83576
|
-
var require_dist10 =
|
|
83577
|
-
var require_retired_settings_keys =
|
|
83613
|
+
var require_dist10 = require_dist_C85OOASj();
|
|
83614
|
+
var require_retired_settings_keys = require_retired_settings_keys_Dfj9LA_i();
|
|
83578
83615
|
var node_crypto = __require("crypto");
|
|
83579
83616
|
var node_fs = __require("fs");
|
|
83580
83617
|
var node_module = __require("module");
|
|
@@ -86078,7 +86115,7 @@ var require_storage_orchestrator_addon = __commonJS({
|
|
|
86078
86115
|
[Symbol.toStringTag]: { value: "Module" }
|
|
86079
86116
|
});
|
|
86080
86117
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
86081
|
-
var require_dist10 =
|
|
86118
|
+
var require_dist10 = require_dist_C85OOASj();
|
|
86082
86119
|
var require_hub_cap_forward = require_hub_cap_forward_DmHNjbB0();
|
|
86083
86120
|
var zod = require_zod();
|
|
86084
86121
|
var node_crypto = __require("crypto");
|
|
@@ -89728,7 +89765,7 @@ var require_system_config_addon = __commonJS({
|
|
|
89728
89765
|
[Symbol.toStringTag]: { value: "Module" }
|
|
89729
89766
|
});
|
|
89730
89767
|
require_chunk_Cek0wNdY();
|
|
89731
|
-
var require_dist10 =
|
|
89768
|
+
var require_dist10 = require_dist_C85OOASj();
|
|
89732
89769
|
var SECTION_TITLES = {
|
|
89733
89770
|
server: "Server",
|
|
89734
89771
|
auth: "Authentication"
|
|
@@ -107789,7 +107826,7 @@ var require_winston_logging = __commonJS({
|
|
|
107789
107826
|
[Symbol.toStringTag]: { value: "Module" }
|
|
107790
107827
|
});
|
|
107791
107828
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
107792
|
-
var require_dist10 =
|
|
107829
|
+
var require_dist10 = require_dist_C85OOASj();
|
|
107793
107830
|
var require_formatter = require_formatter_DqAKDlvN();
|
|
107794
107831
|
var node_path = __require("path");
|
|
107795
107832
|
node_path = require_chunk.__toESM(node_path);
|
|
@@ -132498,7 +132535,7 @@ var require_dist3 = __commonJS({
|
|
|
132498
132535
|
"use strict";
|
|
132499
132536
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
132500
132537
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
132501
|
-
var require_dist10 =
|
|
132538
|
+
var require_dist10 = require_dist_C85OOASj();
|
|
132502
132539
|
var require_builtins_alerts_alerts_addon = require_alerts_addon();
|
|
132503
132540
|
require_alerts();
|
|
132504
132541
|
var require_formatter = require_formatter_DqAKDlvN();
|
|
@@ -228610,7 +228647,17 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
228610
228647
|
bucketStart: zod.z.number(),
|
|
228611
228648
|
motion: zod.z.number().int(),
|
|
228612
228649
|
object: zod.z.number().int(),
|
|
228613
|
-
audio: zod.z.number().int()
|
|
228650
|
+
audio: zod.z.number().int(),
|
|
228651
|
+
/**
|
|
228652
|
+
* Energy-weighted mean dBFS of the audio events in this bucket — the LEVEL,
|
|
228653
|
+
* as opposed to `audio`, which is their COUNT (D431).
|
|
228654
|
+
*
|
|
228655
|
+
* ABSENT when the bucket holds no audio event. Absence means "nothing was
|
|
228656
|
+
* measured", which is not the same claim as silence, and a lane that cannot
|
|
228657
|
+
* tell them apart paints a quiet hour at full scale — which is exactly what
|
|
228658
|
+
* the count-on-a-level-meter did.
|
|
228659
|
+
*/
|
|
228660
|
+
audioDbfs: zod.z.number().optional()
|
|
228614
228661
|
});
|
|
228615
228662
|
var EVENT_DENSITY_BATCH_MAX = 200;
|
|
228616
228663
|
var EventDensityForDeviceSchema = zod.z.object({
|
|
@@ -239461,7 +239508,23 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
239461
239508
|
});
|
|
239462
239509
|
var RecordingAvailabilitySchema = zod.z.object({
|
|
239463
239510
|
deviceId: zod.z.number(),
|
|
239464
|
-
ranges: zod.z.array(RecordingRangeSchema)
|
|
239511
|
+
ranges: zod.z.array(RecordingRangeSchema),
|
|
239512
|
+
/**
|
|
239513
|
+
* Every profile this camera has footage in — not only the one `ranges`
|
|
239514
|
+
* describes (D433).
|
|
239515
|
+
*
|
|
239516
|
+
* `ranges` answers for ONE profile by design: the timeline is a single bar,
|
|
239517
|
+
* and enumerating all of them triples the directory reads for a bar that
|
|
239518
|
+
* would look identical. But the answer used to say nothing about that, so a
|
|
239519
|
+
* caller asking "what can I export?" read the single preferred profile as
|
|
239520
|
+
* the only one that exists — on this deployment every camera records `high`
|
|
239521
|
+
* AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
|
|
239522
|
+
* UI could not see it.
|
|
239523
|
+
*
|
|
239524
|
+
* Cheap: it is the same shallow directory read the profile CHOICE already
|
|
239525
|
+
* makes. Ask for a specific profile's ranges with the `profile` input.
|
|
239526
|
+
*/
|
|
239527
|
+
profilesWithFootage: zod.z.array(zod.z.string())
|
|
239465
239528
|
});
|
|
239466
239529
|
var RecordingDaysSchema = zod.z.object({
|
|
239467
239530
|
deviceId: zod.z.number(),
|
|
@@ -239472,7 +239535,11 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
239472
239535
|
var RecordingAvailabilityForDeviceSchema = zod.z.object({
|
|
239473
239536
|
deviceId: zod.z.number(),
|
|
239474
239537
|
read: zod.z.enum(["read", "unreadable"]),
|
|
239475
|
-
ranges: zod.z.array(RecordingRangeSchema).readonly()
|
|
239538
|
+
ranges: zod.z.array(RecordingRangeSchema).readonly(),
|
|
239539
|
+
/** Same field, same meaning, as the singular answer (D433). A row that
|
|
239540
|
+
* dropped it would tell a grid caller the archive holds one profile.
|
|
239541
|
+
* Empty on an `'unreadable'` row: nobody looked. */
|
|
239542
|
+
profilesWithFootage: zod.z.array(zod.z.string()).readonly()
|
|
239476
239543
|
});
|
|
239477
239544
|
var RecordingDaysForDeviceSchema = zod.z.object({
|
|
239478
239545
|
deviceId: zod.z.number(),
|
|
@@ -239687,7 +239754,14 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
239687
239754
|
getAvailability: require_sleep.method(zod.z.object({
|
|
239688
239755
|
deviceId: zod.z.number(),
|
|
239689
239756
|
fromMs: zod.z.number(),
|
|
239690
|
-
toMs: zod.z.number()
|
|
239757
|
+
toMs: zod.z.number(),
|
|
239758
|
+
/**
|
|
239759
|
+
* Answer for THIS profile instead of the preferred one (D433). Absent
|
|
239760
|
+
* keeps the timeline's behaviour — one bar, one profile, one set of
|
|
239761
|
+
* reads. `profilesWithFootage` on the answer says what may be asked
|
|
239762
|
+
* for.
|
|
239763
|
+
*/
|
|
239764
|
+
profile: zod.z.string().optional()
|
|
239691
239765
|
}), RecordingAvailabilitySchema, {
|
|
239692
239766
|
kind: "query",
|
|
239693
239767
|
auth: "protected"
|