camstack 1.2.154 → 1.2.156
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.
|
@@ -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-C6JIhqS6.js
|
|
23637
|
+
var require_dist_C6JIhqS6 = __commonJS({
|
|
23638
|
+
"../system/dist/dist-C6JIhqS6.js"(exports) {
|
|
23639
23639
|
"use strict";
|
|
23640
23640
|
var zod = require_zod();
|
|
23641
23641
|
var EventCategory = /* @__PURE__ */ (function(EventCategory2) {
|
|
@@ -29471,6 +29471,21 @@ var require_dist_DaSCLJVH = __commonJS({
|
|
|
29471
29471
|
mode: "singleton",
|
|
29472
29472
|
deviceTypes: Object.values(DeviceType),
|
|
29473
29473
|
runtimeState: StreamSignalsStatusSchema,
|
|
29474
|
+
/**
|
|
29475
|
+
* Runtime-state durability: **session** — mirrored in RAM, never written.
|
|
29476
|
+
*
|
|
29477
|
+
* The slice holds what the DEVICE says it can emit. That is a probed fact,
|
|
29478
|
+
* not an operator choice: the provider re-declares it on every registration,
|
|
29479
|
+
* so losing it loses nothing and persisting it would freeze an answer the
|
|
29480
|
+
* camera is entitled to change. Measured the same day on the sibling case —
|
|
29481
|
+
* `native-object-detection.supportedClasses` was persisted, and a firmware
|
|
29482
|
+
* class the camera really detected stayed missing for the life of the row
|
|
29483
|
+
* because the fix could not reach it.
|
|
29484
|
+
*
|
|
29485
|
+
* See `RuntimeStateDurability`. Enforced by
|
|
29486
|
+
* `scripts/check-runtime-state-durability.ts`.
|
|
29487
|
+
*/
|
|
29488
|
+
durability: "session",
|
|
29474
29489
|
methods: {
|
|
29475
29490
|
/**
|
|
29476
29491
|
* What this device can emit. Empty is a valid and common answer — most
|
|
@@ -30735,16 +30750,6 @@ var require_dist_DaSCLJVH = __commonJS({
|
|
|
30735
30750
|
})) }), { auth: "admin" })
|
|
30736
30751
|
}
|
|
30737
30752
|
};
|
|
30738
|
-
function describeCustomActions(catalog) {
|
|
30739
|
-
const out = {};
|
|
30740
|
-
for (const [name, spec] of Object.entries(catalog)) out[name] = {
|
|
30741
|
-
kind: spec.kind,
|
|
30742
|
-
auth: spec.auth,
|
|
30743
|
-
scope: spec.scope,
|
|
30744
|
-
...spec.caller === "required" ? { caller: "required" } : {}
|
|
30745
|
-
};
|
|
30746
|
-
return out;
|
|
30747
|
-
}
|
|
30748
30753
|
var CustomModelDescriptorSchema = zod.z.object({
|
|
30749
30754
|
stepId: zod.z.string(),
|
|
30750
30755
|
entry: ModelCatalogEntrySchema
|
|
@@ -36354,6 +36359,29 @@ var require_dist_DaSCLJVH = __commonJS({
|
|
|
36354
36359
|
settings: NcAlarmSettingsSchema,
|
|
36355
36360
|
coverage: zod.z.array(NcAlarmModeCoverageSchema)
|
|
36356
36361
|
});
|
|
36362
|
+
var NcClipRetentionAskSchema = zod.z.object({
|
|
36363
|
+
/**
|
|
36364
|
+
* The camera this ask is about. **Absent = every camera**, which is what a
|
|
36365
|
+
* rule with no `conditions.devices` means: it can fire anywhere, so it is
|
|
36366
|
+
* asking everywhere.
|
|
36367
|
+
*/
|
|
36368
|
+
deviceId: zod.z.number().int().nonnegative().optional(),
|
|
36369
|
+
/** Seconds of history the rule needs held for it. Never zero — a rule that
|
|
36370
|
+
* needs nothing produces no ask at all. */
|
|
36371
|
+
seconds: zod.z.number().min(0).max(60),
|
|
36372
|
+
/** The profile the rule cuts from, when it named one. Absent = the cheapest
|
|
36373
|
+
* assigned, which is what the cut defaults to. */
|
|
36374
|
+
profile: CamProfileSchema.optional(),
|
|
36375
|
+
/** Who is asking — so a retention the operator did not expect names a rule. */
|
|
36376
|
+
ruleId: zod.z.string(),
|
|
36377
|
+
ruleName: zod.z.string(),
|
|
36378
|
+
/** Why this many seconds: the rule's own window, or the occupancy ceiling. */
|
|
36379
|
+
reason: zod.z.enum(["window", "occupancy"])
|
|
36380
|
+
});
|
|
36381
|
+
var NcClipRetentionPlanSchema = zod.z.object({
|
|
36382
|
+
rulesLoaded: zod.z.boolean(),
|
|
36383
|
+
asks: zod.z.array(NcClipRetentionAskSchema).readonly()
|
|
36384
|
+
});
|
|
36357
36385
|
var notificationRulesCapability = {
|
|
36358
36386
|
name: "notification-rules",
|
|
36359
36387
|
scope: "system",
|
|
@@ -36386,6 +36414,23 @@ var require_dist_DaSCLJVH = __commonJS({
|
|
|
36386
36414
|
auth: "admin"
|
|
36387
36415
|
}),
|
|
36388
36416
|
/**
|
|
36417
|
+
* WHAT THE RULES ACTUALLY ASK the stream broker to retain, per camera.
|
|
36418
|
+
*
|
|
36419
|
+
* The notification centre owns the rules, so it is the only thing that can
|
|
36420
|
+
* say how much history a camera's notifications will ever reach back for.
|
|
36421
|
+
* Before this the broker guessed — a flat minute on every camera — and
|
|
36422
|
+
* learned the PROFILE reactively, after the first clip had already been cut
|
|
36423
|
+
* from the wrong one. This is the same ask stated once, in front.
|
|
36424
|
+
*
|
|
36425
|
+
* A QUERY, pulled by each node's broker, not a push: brokers are per node
|
|
36426
|
+
* (a camera's ring lives wherever its stream is ingested) while this cap is
|
|
36427
|
+
* a singleton, so a push would have to enumerate the cluster. The pull also
|
|
36428
|
+
* makes the failure mode right — a broker that cannot reach the centre
|
|
36429
|
+
* keeps the plan it has, and a plan that has never arrived is UNKNOWN
|
|
36430
|
+
* rather than empty (D49: a read that fails changes nothing).
|
|
36431
|
+
*/
|
|
36432
|
+
getClipRetentionAsks: method(zod.z.object({}), NcClipRetentionPlanSchema, { auth: "admin" }),
|
|
36433
|
+
/**
|
|
36389
36434
|
* PERMANENT per-camera mute — the notifications half of the per-camera
|
|
36390
36435
|
* function switch group ([D61](../../../../docs/decisions/adr-0067.md)).
|
|
36391
36436
|
*
|
|
@@ -37545,6 +37590,7 @@ var require_dist_DaSCLJVH = __commonJS({
|
|
|
37545
37590
|
});
|
|
37546
37591
|
var TrackSourceSchema = zod.z.enum([
|
|
37547
37592
|
"pipeline",
|
|
37593
|
+
"onboard",
|
|
37548
37594
|
"sensor",
|
|
37549
37595
|
"audio"
|
|
37550
37596
|
]);
|
|
@@ -38594,6 +38640,20 @@ var require_dist_DaSCLJVH = __commonJS({
|
|
|
38594
38640
|
framesMatched: zod.z.number().int()
|
|
38595
38641
|
});
|
|
38596
38642
|
var RunReplayFrameProcessorResultSchema = zod.z.object({ tracks: zod.z.array(ReplayTrackSchema).readonly() });
|
|
38643
|
+
var AnalyticsLtsSeriesSchema = zod.z.enum([
|
|
38644
|
+
"motion",
|
|
38645
|
+
"audio-dbfs",
|
|
38646
|
+
"battery",
|
|
38647
|
+
"occupancy"
|
|
38648
|
+
]);
|
|
38649
|
+
var LtsBucketSchema = zod.z.object({
|
|
38650
|
+
scope: zod.z.string(),
|
|
38651
|
+
bucketStart: zod.z.number().int(),
|
|
38652
|
+
samples: zod.z.number().int().nonnegative(),
|
|
38653
|
+
sum: zod.z.number(),
|
|
38654
|
+
min: zod.z.number(),
|
|
38655
|
+
max: zod.z.number()
|
|
38656
|
+
});
|
|
38597
38657
|
var pipelineAnalyticsCapability = {
|
|
38598
38658
|
name: "pipeline-analytics",
|
|
38599
38659
|
scope: "device",
|
|
@@ -38737,6 +38797,30 @@ var require_dist_DaSCLJVH = __commonJS({
|
|
|
38737
38797
|
getKeyEventsBatch: method(KeyEventBatchQueryInput, zod.z.array(KeyEventsForDeviceSchema).readonly()),
|
|
38738
38798
|
/** Server-side bucketed event counts for the 24-hour timeline.
|
|
38739
38799
|
* Returns one entry per non-empty bucket; empty buckets are omitted. */
|
|
38800
|
+
/**
|
|
38801
|
+
* Read one camera's long-term series — 5-minute buckets, kept for a year.
|
|
38802
|
+
*
|
|
38803
|
+
* This is the history surface for every chart that used to be served from a
|
|
38804
|
+
* RAM ring: the ring dies with the process, cannot answer about last night,
|
|
38805
|
+
* and had a 60-minute horizon, while these rows are ~60 bytes and already
|
|
38806
|
+
* written. `scope` is the series' own dimension — for `occupancy`, spell it
|
|
38807
|
+
* with {@link occupancyScope} rather than by hand, and omit it to get every
|
|
38808
|
+
* scope back at once (the caller then groups with
|
|
38809
|
+
* {@link parseOccupancyScope}).
|
|
38810
|
+
*
|
|
38811
|
+
* Bounds are inclusive on the BUCKET START, so a range that ends mid-bucket
|
|
38812
|
+
* still returns the bucket it lands in — the alternative is a chart whose
|
|
38813
|
+
* last column silently disappears for five minutes out of every five.
|
|
38814
|
+
*/
|
|
38815
|
+
readLongTermSeries: method(zod.z.object({
|
|
38816
|
+
deviceId: zod.z.number(),
|
|
38817
|
+
series: AnalyticsLtsSeriesSchema,
|
|
38818
|
+
/** Omit for EVERY scope of this series in the range. */
|
|
38819
|
+
scope: zod.z.string().optional(),
|
|
38820
|
+
from: zod.z.number(),
|
|
38821
|
+
to: zod.z.number(),
|
|
38822
|
+
limit: zod.z.number().int().positive().optional()
|
|
38823
|
+
}), zod.z.array(LtsBucketSchema).readonly()),
|
|
38740
38824
|
getEventDensity: method(zod.z.object({
|
|
38741
38825
|
deviceId: zod.z.number(),
|
|
38742
38826
|
since: zod.z.number(),
|
|
@@ -39745,7 +39829,7 @@ var require_dist_DaSCLJVH = __commonJS({
|
|
|
39745
39829
|
"device-activity"
|
|
39746
39830
|
]);
|
|
39747
39831
|
var MotionSourcesSchema = zod.z.array(MotionSourceEnum);
|
|
39748
|
-
var DetectionSourcesSchema = zod.z.array(DetectionSourceSchema);
|
|
39832
|
+
var DetectionSourcesSchema = zod.z.preprocess((value) => Array.isArray(value) && value.length > 1 ? value.slice(0, 1) : value, zod.z.array(DetectionSourceSchema).max(1));
|
|
39749
39833
|
var ReportMotionInputSchema = zod.z.object({
|
|
39750
39834
|
deviceId: zod.z.number(),
|
|
39751
39835
|
detected: zod.z.boolean(),
|
|
@@ -40053,6 +40137,12 @@ var require_dist_DaSCLJVH = __commonJS({
|
|
|
40053
40137
|
queueDepth: zod.z.number(),
|
|
40054
40138
|
frameLazy: FrameLazyMetricsSchema.optional()
|
|
40055
40139
|
});
|
|
40140
|
+
var OccupancyBurstRefusalSchema = zod.z.enum([
|
|
40141
|
+
"not-attached",
|
|
40142
|
+
"battery-asleep",
|
|
40143
|
+
"not-watching",
|
|
40144
|
+
"already-bursting"
|
|
40145
|
+
]);
|
|
40056
40146
|
var pipelineRunnerCapability = {
|
|
40057
40147
|
name: "pipeline-runner",
|
|
40058
40148
|
scope: "system",
|
|
@@ -40089,6 +40179,50 @@ var require_dist_DaSCLJVH = __commonJS({
|
|
|
40089
40179
|
/** List the deviceIds currently attached to this runner. */
|
|
40090
40180
|
getLocalCameras: method(zod.z.void(), zod.z.array(zod.z.number()).readonly()),
|
|
40091
40181
|
/**
|
|
40182
|
+
* Look at a camera NOW, out of band, because something just happened that
|
|
40183
|
+
* only a fresh look can settle.
|
|
40184
|
+
*
|
|
40185
|
+
* The periodic recheck (`occupancyRecheckSec`, 300 s) exists to watch a
|
|
40186
|
+
* still scene. It is the wrong instrument for a QUESTION that has just been
|
|
40187
|
+
* asked: on device 617 a parked car's departure was observed, a departure
|
|
40188
|
+
* strike was armed — and then the motion session ended, the strike decayed
|
|
40189
|
+
* after its 30 s TTL, and the next periodic look arrived up to five minutes
|
|
40190
|
+
* later with nothing left to confirm. Every one of those departures was
|
|
40191
|
+
* settled by the entry ageing out 6 to 10 minutes of observed time later,
|
|
40192
|
+
* and the notification's clip showed an empty space with nothing leaving
|
|
40193
|
+
* it.
|
|
40194
|
+
*
|
|
40195
|
+
* Two numbers make the ask specific, and a caller that ignores them wastes
|
|
40196
|
+
* the burst: a confirmation must land at least
|
|
40197
|
+
* `DEPARTURE_CONFIRM_MIN_GAP_MS` (3 s) after the read that armed the
|
|
40198
|
+
* strike — before that it is the same optical event and is refused — and
|
|
40199
|
+
* `DEPARTURE_ABSENCE_MIN_READS` (5) consecutive unassociated frames are
|
|
40200
|
+
* needed, while `occupancyRecheckFrames` defaults to FOUR. A burst of four
|
|
40201
|
+
* can never confirm an absence; that is why two periodic looks were always
|
|
40202
|
+
* required.
|
|
40203
|
+
*
|
|
40204
|
+
* The runner answers whether it actually started one. A refusal is NAMED,
|
|
40205
|
+
* never a silent `false`: a camera that is asleep on battery (D173 — this
|
|
40206
|
+
* must not become a self-initiated wake), detached, mid-session or already
|
|
40207
|
+
* bursting are four different facts, and a caller told only "no" cannot
|
|
40208
|
+
* tell a protection from a bug.
|
|
40209
|
+
*/
|
|
40210
|
+
requestOccupancyBurst: method(zod.z.object({
|
|
40211
|
+
deviceId: zod.z.number(),
|
|
40212
|
+
/** How many frames to collect. The caller sizes this against what its
|
|
40213
|
+
* own confirmation needs; the runner clamps it to the field's range. */
|
|
40214
|
+
frames: zod.z.number().int().positive().optional(),
|
|
40215
|
+
/** Why, for the log. A burst nobody can attribute is a cost nobody can
|
|
40216
|
+
* defend — the periodic one at least has a timer to point at. */
|
|
40217
|
+
reason: zod.z.string()
|
|
40218
|
+
}), zod.z.object({
|
|
40219
|
+
started: zod.z.boolean(),
|
|
40220
|
+
refusedBecause: OccupancyBurstRefusalSchema.optional()
|
|
40221
|
+
}), {
|
|
40222
|
+
auth: "admin",
|
|
40223
|
+
kind: "mutation"
|
|
40224
|
+
}),
|
|
40225
|
+
/**
|
|
40092
40226
|
* Best-effort NATIVE-resolution crop of a retention-ring frame. Given the
|
|
40093
40227
|
* `FrameHandle` that rode an inference-result event and a normalized `bbox`,
|
|
40094
40228
|
* the runner asks the decode worker still holding that frame's NATIVE
|
|
@@ -51841,7 +51975,28 @@ var require_dist_DaSCLJVH = __commonJS({
|
|
|
51841
51975
|
/** Total tracked objects in this scope (frame / zone / unzoned). */
|
|
51842
51976
|
totalObjects: zod.z.number().int().nonnegative(),
|
|
51843
51977
|
/** Per-class count. Keys are macro class names (e.g. `person`, `car`). */
|
|
51844
|
-
byClass: zod.z.record(zod.z.string(), zod.z.number().int().nonnegative())
|
|
51978
|
+
byClass: zod.z.record(zod.z.string(), zod.z.number().int().nonnegative()),
|
|
51979
|
+
/**
|
|
51980
|
+
* Of `totalObjects`, how many are STANDING — objects the census holds,
|
|
51981
|
+
* present but not going anywhere (a parked car, a bin, a statue).
|
|
51982
|
+
*
|
|
51983
|
+
* The operator's question about a scene has two halves and they answer
|
|
51984
|
+
* different things: "what is parked here" is stable for hours and must not
|
|
51985
|
+
* flap, while "who is walking through" is the thing an alert is about. One
|
|
51986
|
+
* number could only serve one of them, and `totalObjects` served the first
|
|
51987
|
+
* badly — a passer-by moved it and every occupancy rule saw a change.
|
|
51988
|
+
*
|
|
51989
|
+
* `standing + transient === totalObjects`, always. The total keeps its old
|
|
51990
|
+
* meaning exactly, so no rule written against it changes behaviour.
|
|
51991
|
+
*
|
|
51992
|
+
* ABSENT means UNKNOWN, never zero (D393): a snapshot from a node older than
|
|
51993
|
+
* this field cannot say, and a reader that folds absence in as 0 reports "no
|
|
51994
|
+
* parked objects here" about a camera whose lot is full.
|
|
51995
|
+
*/
|
|
51996
|
+
standingObjects: zod.z.number().int().nonnegative().optional(),
|
|
51997
|
+
/** Of `totalObjects`, how many are passing through. See `standingObjects` —
|
|
51998
|
+
* same absence rule. */
|
|
51999
|
+
transientObjects: zod.z.number().int().nonnegative().optional()
|
|
51845
52000
|
});
|
|
51846
52001
|
var ZoneScopeBreakdownSchema = PerScopeBreakdownSchema.extend({
|
|
51847
52002
|
zoneId: zod.z.string(),
|
|
@@ -55763,6 +55918,12 @@ var require_dist_DaSCLJVH = __commonJS({
|
|
|
55763
55918
|
addonId: null,
|
|
55764
55919
|
access: "view"
|
|
55765
55920
|
},
|
|
55921
|
+
"notificationRules.getClipRetentionAsks": {
|
|
55922
|
+
capName: "notification-rules",
|
|
55923
|
+
capScope: "system",
|
|
55924
|
+
addonId: null,
|
|
55925
|
+
access: "view"
|
|
55926
|
+
},
|
|
55766
55927
|
"notificationRules.getConditionCatalog": {
|
|
55767
55928
|
capName: "notification-rules",
|
|
55768
55929
|
capScope: "system",
|
|
@@ -56273,6 +56434,12 @@ var require_dist_DaSCLJVH = __commonJS({
|
|
|
56273
56434
|
addonId: null,
|
|
56274
56435
|
access: "create"
|
|
56275
56436
|
},
|
|
56437
|
+
"pipelineAnalytics.readLongTermSeries": {
|
|
56438
|
+
capName: "pipeline-analytics",
|
|
56439
|
+
capScope: "device",
|
|
56440
|
+
addonId: null,
|
|
56441
|
+
access: "view"
|
|
56442
|
+
},
|
|
56276
56443
|
"pipelineAnalytics.rebuildObjectEmbeddings": {
|
|
56277
56444
|
capName: "pipeline-analytics",
|
|
56278
56445
|
capScope: "device",
|
|
@@ -56945,6 +57112,12 @@ var require_dist_DaSCLJVH = __commonJS({
|
|
|
56945
57112
|
addonId: null,
|
|
56946
57113
|
access: "create"
|
|
56947
57114
|
},
|
|
57115
|
+
"pipelineRunner.requestOccupancyBurst": {
|
|
57116
|
+
capName: "pipeline-runner",
|
|
57117
|
+
capScope: "system",
|
|
57118
|
+
addonId: null,
|
|
57119
|
+
access: "create"
|
|
57120
|
+
},
|
|
56948
57121
|
"pipelineRunner.runDetailSubtree": {
|
|
56949
57122
|
capName: "pipeline-runner",
|
|
56950
57123
|
capScope: "system",
|
|
@@ -60089,6 +60262,11 @@ var require_dist_DaSCLJVH = __commonJS({
|
|
|
60089
60262
|
form: "single",
|
|
60090
60263
|
optional: false
|
|
60091
60264
|
}],
|
|
60265
|
+
"pipelineAnalytics.readLongTermSeries": [{
|
|
60266
|
+
name: "deviceId",
|
|
60267
|
+
form: "single",
|
|
60268
|
+
optional: false
|
|
60269
|
+
}],
|
|
60092
60270
|
"pipelineAnalytics.rebuildObjectEmbeddings": [{
|
|
60093
60271
|
name: "deviceId",
|
|
60094
60272
|
form: "single",
|
|
@@ -60279,6 +60457,11 @@ var require_dist_DaSCLJVH = __commonJS({
|
|
|
60279
60457
|
form: "single",
|
|
60280
60458
|
optional: false
|
|
60281
60459
|
}],
|
|
60460
|
+
"pipelineRunner.requestOccupancyBurst": [{
|
|
60461
|
+
name: "deviceId",
|
|
60462
|
+
form: "single",
|
|
60463
|
+
optional: false
|
|
60464
|
+
}],
|
|
60282
60465
|
"pipelineRunner.runDetailSubtree": [{
|
|
60283
60466
|
name: "deviceId",
|
|
60284
60467
|
form: "single",
|
|
@@ -61947,12 +62130,6 @@ var require_dist_DaSCLJVH = __commonJS({
|
|
|
61947
62130
|
return deriveBatteryPresence;
|
|
61948
62131
|
}
|
|
61949
62132
|
});
|
|
61950
|
-
Object.defineProperty(exports, "describeCustomActions", {
|
|
61951
|
-
enumerable: true,
|
|
61952
|
-
get: function() {
|
|
61953
|
-
return describeCustomActions;
|
|
61954
|
-
}
|
|
61955
|
-
});
|
|
61956
62133
|
Object.defineProperty(exports, "deviceManagerCapability", {
|
|
61957
62134
|
enumerable: true,
|
|
61958
62135
|
get: function() {
|
|
@@ -62379,7 +62556,7 @@ var require_alerts_addon = __commonJS({
|
|
|
62379
62556
|
[Symbol.toStringTag]: { value: "Module" }
|
|
62380
62557
|
});
|
|
62381
62558
|
require_chunk_Cek0wNdY();
|
|
62382
|
-
var require_dist10 =
|
|
62559
|
+
var require_dist10 = require_dist_C6JIhqS6();
|
|
62383
62560
|
function selectExpired(alerts, cutoffMs) {
|
|
62384
62561
|
return alerts.filter((a) => a.createdAt < cutoffMs).sort((a, b) => a.createdAt - b.createdAt).map((a) => a.id);
|
|
62385
62562
|
}
|
|
@@ -63198,7 +63375,7 @@ var require_console_logging = __commonJS({
|
|
|
63198
63375
|
[Symbol.toStringTag]: { value: "Module" }
|
|
63199
63376
|
});
|
|
63200
63377
|
require_chunk_Cek0wNdY();
|
|
63201
|
-
var require_dist10 =
|
|
63378
|
+
var require_dist10 = require_dist_C6JIhqS6();
|
|
63202
63379
|
var require_formatter = require_formatter_DqAKDlvN();
|
|
63203
63380
|
var LEVEL_RANK = {
|
|
63204
63381
|
debug: 0,
|
|
@@ -63292,7 +63469,7 @@ var require_core_blocks_addon = __commonJS({
|
|
|
63292
63469
|
"use strict";
|
|
63293
63470
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
63294
63471
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
63295
|
-
var require_dist10 =
|
|
63472
|
+
var require_dist10 = require_dist_C6JIhqS6();
|
|
63296
63473
|
var node_crypto = __require("crypto");
|
|
63297
63474
|
var node_fs_promises = __require("fs/promises");
|
|
63298
63475
|
node_fs_promises = require_chunk.__toESM(node_fs_promises);
|
|
@@ -64189,11 +64366,11 @@ var require_core_blocks = __commonJS({
|
|
|
64189
64366
|
}
|
|
64190
64367
|
});
|
|
64191
64368
|
|
|
64192
|
-
// ../system/dist/retired-settings-keys-
|
|
64193
|
-
var
|
|
64194
|
-
"../system/dist/retired-settings-keys-
|
|
64369
|
+
// ../system/dist/retired-settings-keys-C53Y2Q1C.js
|
|
64370
|
+
var require_retired_settings_keys_C53Y2Q1C = __commonJS({
|
|
64371
|
+
"../system/dist/retired-settings-keys-C53Y2Q1C.js"(exports) {
|
|
64195
64372
|
"use strict";
|
|
64196
|
-
var require_dist10 =
|
|
64373
|
+
var require_dist10 = require_dist_C6JIhqS6();
|
|
64197
64374
|
function settingsStoreIsAuthoritativeHere(env) {
|
|
64198
64375
|
const raw = (env["CAMSTACK_ROLE"] ?? "").trim().toLowerCase();
|
|
64199
64376
|
return raw === "" || raw === "hub";
|
|
@@ -66430,8 +66607,8 @@ var require_device_manager_addon = __commonJS({
|
|
|
66430
66607
|
[Symbol.toStringTag]: { value: "Module" }
|
|
66431
66608
|
});
|
|
66432
66609
|
require_chunk_Cek0wNdY();
|
|
66433
|
-
var require_dist10 =
|
|
66434
|
-
var require_retired_settings_keys =
|
|
66610
|
+
var require_dist10 = require_dist_C6JIhqS6();
|
|
66611
|
+
var require_retired_settings_keys = require_retired_settings_keys_C53Y2Q1C();
|
|
66435
66612
|
var node_crypto = __require("crypto");
|
|
66436
66613
|
var _camstack_types_node = require_node();
|
|
66437
66614
|
var JOB_HISTORY = 20;
|
|
@@ -72141,7 +72318,7 @@ var require_hub_forwarder = __commonJS({
|
|
|
72141
72318
|
[Symbol.toStringTag]: { value: "Module" }
|
|
72142
72319
|
});
|
|
72143
72320
|
require_chunk_Cek0wNdY();
|
|
72144
|
-
var require_dist10 =
|
|
72321
|
+
var require_dist10 = require_dist_C6JIhqS6();
|
|
72145
72322
|
var require_formatter = require_formatter_DqAKDlvN();
|
|
72146
72323
|
var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
|
|
72147
72324
|
var HubForwarderDestination = class {
|
|
@@ -72278,7 +72455,7 @@ var require_liveness_monitor_addon = __commonJS({
|
|
|
72278
72455
|
"use strict";
|
|
72279
72456
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
72280
72457
|
require_chunk_Cek0wNdY();
|
|
72281
|
-
var require_dist10 =
|
|
72458
|
+
var require_dist10 = require_dist_C6JIhqS6();
|
|
72282
72459
|
var NO_DEVICES = "liveness:no-devices";
|
|
72283
72460
|
var ALL_OFFLINE = "liveness:all-devices-offline";
|
|
72284
72461
|
var NO_FOOTAGE_PREFIX = "liveness:no-footage:";
|
|
@@ -72474,7 +72651,7 @@ var require_local_auth_addon = __commonJS({
|
|
|
72474
72651
|
[Symbol.toStringTag]: { value: "Module" }
|
|
72475
72652
|
});
|
|
72476
72653
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
72477
|
-
var require_dist10 =
|
|
72654
|
+
var require_dist10 = require_dist_C6JIhqS6();
|
|
72478
72655
|
var node_crypto = __require("crypto");
|
|
72479
72656
|
node_crypto = require_chunk.__toESM(node_crypto);
|
|
72480
72657
|
var crypto$1 = __require("crypto");
|
|
@@ -80287,7 +80464,7 @@ var require_loki_logging = __commonJS({
|
|
|
80287
80464
|
[Symbol.toStringTag]: { value: "Module" }
|
|
80288
80465
|
});
|
|
80289
80466
|
require_chunk_Cek0wNdY();
|
|
80290
|
-
var require_dist10 =
|
|
80467
|
+
var require_dist10 = require_dist_C6JIhqS6();
|
|
80291
80468
|
function sanitizeLabelName(raw) {
|
|
80292
80469
|
const replaced = raw.replaceAll(/[^a-zA-Z0-9_]/g, "_");
|
|
80293
80470
|
return /^[a-zA-Z_]/.test(replaced) ? replaced : `_${replaced}`;
|
|
@@ -80874,7 +81051,7 @@ var require_native_metrics_addon = __commonJS({
|
|
|
80874
81051
|
[Symbol.toStringTag]: { value: "Module" }
|
|
80875
81052
|
});
|
|
80876
81053
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
80877
|
-
var require_dist10 =
|
|
81054
|
+
var require_dist10 = require_dist_C6JIhqS6();
|
|
80878
81055
|
var node_fs_promises = __require("fs/promises");
|
|
80879
81056
|
var node_fs = __require("fs");
|
|
80880
81057
|
node_fs = require_chunk.__toESM(node_fs);
|
|
@@ -83627,7 +83804,7 @@ var require_filesystem_storage_addon = __commonJS({
|
|
|
83627
83804
|
[Symbol.toStringTag]: { value: "Module" }
|
|
83628
83805
|
});
|
|
83629
83806
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
83630
|
-
var require_dist10 =
|
|
83807
|
+
var require_dist10 = require_dist_C6JIhqS6();
|
|
83631
83808
|
var node_crypto = __require("crypto");
|
|
83632
83809
|
var node_fs_promises = __require("fs/promises");
|
|
83633
83810
|
var node_path = __require("path");
|
|
@@ -84854,8 +85031,8 @@ var require_sqlite_settings_addon = __commonJS({
|
|
|
84854
85031
|
[Symbol.toStringTag]: { value: "Module" }
|
|
84855
85032
|
});
|
|
84856
85033
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
84857
|
-
var require_dist10 =
|
|
84858
|
-
var require_retired_settings_keys =
|
|
85034
|
+
var require_dist10 = require_dist_C6JIhqS6();
|
|
85035
|
+
var require_retired_settings_keys = require_retired_settings_keys_C53Y2Q1C();
|
|
84859
85036
|
var require_wal_checkpoint_policy = require_wal_checkpoint_policy_CCJZngds();
|
|
84860
85037
|
var node_crypto = __require("crypto");
|
|
84861
85038
|
var node_path = __require("path");
|
|
@@ -87642,7 +87819,7 @@ var require_storage_orchestrator_addon = __commonJS({
|
|
|
87642
87819
|
[Symbol.toStringTag]: { value: "Module" }
|
|
87643
87820
|
});
|
|
87644
87821
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
87645
|
-
var require_dist10 =
|
|
87822
|
+
var require_dist10 = require_dist_C6JIhqS6();
|
|
87646
87823
|
var require_hub_cap_forward = require_hub_cap_forward_DmHNjbB0();
|
|
87647
87824
|
var zod = require_zod();
|
|
87648
87825
|
var node_crypto = __require("crypto");
|
|
@@ -91369,7 +91546,7 @@ var require_system_config_addon = __commonJS({
|
|
|
91369
91546
|
[Symbol.toStringTag]: { value: "Module" }
|
|
91370
91547
|
});
|
|
91371
91548
|
require_chunk_Cek0wNdY();
|
|
91372
|
-
var require_dist10 =
|
|
91549
|
+
var require_dist10 = require_dist_C6JIhqS6();
|
|
91373
91550
|
var SECTION_TITLES = {
|
|
91374
91551
|
server: "Server",
|
|
91375
91552
|
auth: "Authentication"
|
|
@@ -109430,7 +109607,7 @@ var require_winston_logging = __commonJS({
|
|
|
109430
109607
|
[Symbol.toStringTag]: { value: "Module" }
|
|
109431
109608
|
});
|
|
109432
109609
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
109433
|
-
var require_dist10 =
|
|
109610
|
+
var require_dist10 = require_dist_C6JIhqS6();
|
|
109434
109611
|
var require_formatter = require_formatter_DqAKDlvN();
|
|
109435
109612
|
var node_path = __require("path");
|
|
109436
109613
|
node_path = require_chunk.__toESM(node_path);
|
|
@@ -111468,9 +111645,9 @@ var require_event_category_BVfsrBYA = __commonJS({
|
|
|
111468
111645
|
}
|
|
111469
111646
|
});
|
|
111470
111647
|
|
|
111471
|
-
// ../types/dist/sleep-
|
|
111472
|
-
var
|
|
111473
|
-
"../types/dist/sleep-
|
|
111648
|
+
// ../types/dist/sleep-DqtlfkSS.js
|
|
111649
|
+
var require_sleep_DqtlfkSS = __commonJS({
|
|
111650
|
+
"../types/dist/sleep-DqtlfkSS.js"(exports) {
|
|
111474
111651
|
"use strict";
|
|
111475
111652
|
var require_event_category = require_event_category_BVfsrBYA();
|
|
111476
111653
|
var zod = require_zod();
|
|
@@ -113548,6 +113725,41 @@ var require_sleep_B8nfmQ8a = __commonJS({
|
|
|
113548
113725
|
DeviceRole2["GenericNotifier"] = "generic-notifier";
|
|
113549
113726
|
return DeviceRole2;
|
|
113550
113727
|
})({});
|
|
113728
|
+
function defineCustomActions(spec) {
|
|
113729
|
+
return spec;
|
|
113730
|
+
}
|
|
113731
|
+
function customAction(input, output, options) {
|
|
113732
|
+
return {
|
|
113733
|
+
input,
|
|
113734
|
+
output,
|
|
113735
|
+
kind: options?.kind ?? "query",
|
|
113736
|
+
auth: options?.auth ?? "protected",
|
|
113737
|
+
scope: options?.scope ?? { kind: "system" },
|
|
113738
|
+
...options?.caller ? { caller: "required" } : {}
|
|
113739
|
+
};
|
|
113740
|
+
}
|
|
113741
|
+
function deviceCustomAction(input, output, options) {
|
|
113742
|
+
return {
|
|
113743
|
+
input,
|
|
113744
|
+
output,
|
|
113745
|
+
kind: options?.kind ?? "query",
|
|
113746
|
+
auth: options?.auth ?? "protected",
|
|
113747
|
+
scope: {
|
|
113748
|
+
kind: "device",
|
|
113749
|
+
...options?.deviceTypes ? { deviceTypes: options.deviceTypes } : {}
|
|
113750
|
+
}
|
|
113751
|
+
};
|
|
113752
|
+
}
|
|
113753
|
+
function describeCustomActions(catalog) {
|
|
113754
|
+
const out = {};
|
|
113755
|
+
for (const [name, spec] of Object.entries(catalog)) out[name] = {
|
|
113756
|
+
kind: spec.kind,
|
|
113757
|
+
auth: spec.auth,
|
|
113758
|
+
scope: spec.scope,
|
|
113759
|
+
...spec.caller === "required" ? { caller: "required" } : {}
|
|
113760
|
+
};
|
|
113761
|
+
return out;
|
|
113762
|
+
}
|
|
113551
113763
|
var DEVICE_CHILDREN_BATCH_MAX = 256;
|
|
113552
113764
|
var StaticDirOutputSchema = zod.z.object({ staticDir: zod.z.string() });
|
|
113553
113765
|
var VersionOutputSchema = zod.z.object({ version: zod.z.string() });
|
|
@@ -114211,6 +114423,7 @@ var require_sleep_B8nfmQ8a = __commonJS({
|
|
|
114211
114423
|
updateRule: (input) => dispatch("notification-rules", "notificationRules", "updateRule", "mutation", input),
|
|
114212
114424
|
deleteRule: (input) => dispatch("notification-rules", "notificationRules", "deleteRule", "mutation", input),
|
|
114213
114425
|
setRuleEnabled: (input) => dispatch("notification-rules", "notificationRules", "setRuleEnabled", "mutation", input),
|
|
114426
|
+
getClipRetentionAsks: (input) => dispatch("notification-rules", "notificationRules", "getClipRetentionAsks", "query", input),
|
|
114214
114427
|
listDeviceMutes: (input) => dispatch("notification-rules", "notificationRules", "listDeviceMutes", "query", input),
|
|
114215
114428
|
setDeviceMuted: (input) => dispatch("notification-rules", "notificationRules", "setDeviceMuted", "mutation", input),
|
|
114216
114429
|
testRule: (input) => dispatch("notification-rules", "notificationRules", "testRule", "mutation", input),
|
|
@@ -114263,6 +114476,7 @@ var require_sleep_B8nfmQ8a = __commonJS({
|
|
|
114263
114476
|
getSensorEvents: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getSensorEvents", "query", input),
|
|
114264
114477
|
getKeyEvents: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getKeyEvents", "query", input),
|
|
114265
114478
|
getKeyEventsBatch: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getKeyEventsBatch", "query", input),
|
|
114479
|
+
readLongTermSeries: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "readLongTermSeries", "query", input),
|
|
114266
114480
|
getEventDensity: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getEventDensity", "query", input),
|
|
114267
114481
|
getEventDensityBatch: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getEventDensityBatch", "query", input),
|
|
114268
114482
|
pruneEventsBefore: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "pruneEventsBefore", "mutation", input),
|
|
@@ -114563,6 +114777,7 @@ var require_sleep_B8nfmQ8a = __commonJS({
|
|
|
114563
114777
|
pipelineRunner: {
|
|
114564
114778
|
detachCamera: (input) => dispatchSystem("pipelineRunner", "detachCamera", "mutation", input),
|
|
114565
114779
|
getCameraMetrics: (input) => dispatchSystem("pipelineRunner", "getCameraMetrics", "query", input),
|
|
114780
|
+
requestOccupancyBurst: (input) => dispatchSystem("pipelineRunner", "requestOccupancyBurst", "mutation", input),
|
|
114566
114781
|
runDetailSubtree: (input) => dispatchSystem("pipelineRunner", "runDetailSubtree", "mutation", input),
|
|
114567
114782
|
parkTrackFrame: (input) => dispatchSystem("pipelineRunner", "parkTrackFrame", "mutation", input),
|
|
114568
114783
|
getParkedTrackFrame: (input) => dispatchSystem("pipelineRunner", "getParkedTrackFrame", "query", input),
|
|
@@ -115115,6 +115330,30 @@ var require_sleep_B8nfmQ8a = __commonJS({
|
|
|
115115
115330
|
return createSliceHandle;
|
|
115116
115331
|
}
|
|
115117
115332
|
});
|
|
115333
|
+
Object.defineProperty(exports, "customAction", {
|
|
115334
|
+
enumerable: true,
|
|
115335
|
+
get: function() {
|
|
115336
|
+
return customAction;
|
|
115337
|
+
}
|
|
115338
|
+
});
|
|
115339
|
+
Object.defineProperty(exports, "defineCustomActions", {
|
|
115340
|
+
enumerable: true,
|
|
115341
|
+
get: function() {
|
|
115342
|
+
return defineCustomActions;
|
|
115343
|
+
}
|
|
115344
|
+
});
|
|
115345
|
+
Object.defineProperty(exports, "describeCustomActions", {
|
|
115346
|
+
enumerable: true,
|
|
115347
|
+
get: function() {
|
|
115348
|
+
return describeCustomActions;
|
|
115349
|
+
}
|
|
115350
|
+
});
|
|
115351
|
+
Object.defineProperty(exports, "deviceCustomAction", {
|
|
115352
|
+
enumerable: true,
|
|
115353
|
+
get: function() {
|
|
115354
|
+
return deviceCustomAction;
|
|
115355
|
+
}
|
|
115356
|
+
});
|
|
115118
115357
|
Object.defineProperty(exports, "deviceOpsCapability", {
|
|
115119
115358
|
enumerable: true,
|
|
115120
115359
|
get: function() {
|
|
@@ -115309,7 +115548,7 @@ var require_addon = __commonJS({
|
|
|
115309
115548
|
"../types/dist/addon.js"(exports) {
|
|
115310
115549
|
"use strict";
|
|
115311
115550
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
115312
|
-
var require_sleep =
|
|
115551
|
+
var require_sleep = require_sleep_DqtlfkSS();
|
|
115313
115552
|
var require_event_category = require_event_category_BVfsrBYA();
|
|
115314
115553
|
var require_err_msg = require_err_msg_COpsHMw2();
|
|
115315
115554
|
var CAP_INPUT_DEFAULTS = Object.freeze({
|
|
@@ -115622,6 +115861,7 @@ var require_addon = __commonJS({
|
|
|
115622
115861
|
exports.asString = require_sleep.asString;
|
|
115623
115862
|
exports.createDeviceProxy = require_sleep.createDeviceProxy;
|
|
115624
115863
|
exports.createEventBusSliceSource = require_sleep.createEventBusSliceSource;
|
|
115864
|
+
exports.describeCustomActions = require_sleep.describeCustomActions;
|
|
115625
115865
|
exports.deviceOpsCapability = require_sleep.deviceOpsCapability;
|
|
115626
115866
|
exports.emitReadiness = require_sleep.emitReadiness;
|
|
115627
115867
|
exports.errMsg = require_err_msg.errMsg;
|
|
@@ -122176,9 +122416,9 @@ var require_dist2 = __commonJS({
|
|
|
122176
122416
|
}
|
|
122177
122417
|
});
|
|
122178
122418
|
|
|
122179
|
-
// ../system/dist/manifest-system-deps-
|
|
122180
|
-
var
|
|
122181
|
-
"../system/dist/manifest-system-deps-
|
|
122419
|
+
// ../system/dist/manifest-system-deps-CzyjTMcO.js
|
|
122420
|
+
var require_manifest_system_deps_CzyjTMcO = __commonJS({
|
|
122421
|
+
"../system/dist/manifest-system-deps-CzyjTMcO.js"(exports) {
|
|
122182
122422
|
"use strict";
|
|
122183
122423
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
122184
122424
|
require_hub_cap_forward_DmHNjbB0();
|
|
@@ -127283,10 +127523,104 @@ var require_manifest_system_deps_CrSP0Kkp = __commonJS({
|
|
|
127283
127523
|
function __resetCapUsageRegistryForTests() {
|
|
127284
127524
|
singleton = null;
|
|
127285
127525
|
}
|
|
127526
|
+
var MIRROR_REASON_BY_CATEGORY = new Map([
|
|
127527
|
+
{
|
|
127528
|
+
category: "device.state-changed",
|
|
127529
|
+
reason: "Device runtime-state mirror, 69.1 % of fleet traffic. Each event is a snapshot of the slice AFTER the change; the superseded snapshot describes a state the device is no longer in, and every consumer (SystemMirror, DeviceStateHandle) reads the latest one only."
|
|
127530
|
+
},
|
|
127531
|
+
{
|
|
127532
|
+
category: "camera-streams.onCamStreamsChanged",
|
|
127533
|
+
reason: "Full stream-list snapshot per camera, 20.1 % of fleet traffic. The payload is the complete current list, not a delta, so an older list is strictly less true than the newer one."
|
|
127534
|
+
},
|
|
127535
|
+
{
|
|
127536
|
+
category: "system.ready-state",
|
|
127537
|
+
reason: "Readiness is a LEVEL, not an edge: the event reports whether a capability is ready right now. Declared for the case where it carries a deviceId; when it does not it stays in the global ring like any other unattributed event."
|
|
127538
|
+
}
|
|
127539
|
+
].map((m) => [m.category, m.reason]));
|
|
127540
|
+
function isMirrorCategory(category) {
|
|
127541
|
+
return MIRROR_REASON_BY_CATEGORY.has(category);
|
|
127542
|
+
}
|
|
127543
|
+
var MAX_DEVICE_RING_EVENTS = 2e3;
|
|
127544
|
+
function serializePayload(data) {
|
|
127545
|
+
try {
|
|
127546
|
+
const json = JSON.stringify(data);
|
|
127547
|
+
if (typeof json !== "string") return null;
|
|
127548
|
+
return {
|
|
127549
|
+
json,
|
|
127550
|
+
bytes: Buffer.byteLength(json, "utf8")
|
|
127551
|
+
};
|
|
127552
|
+
} catch {
|
|
127553
|
+
return null;
|
|
127554
|
+
}
|
|
127555
|
+
}
|
|
127556
|
+
function capEventData(event) {
|
|
127557
|
+
const serialized = serializePayload(event.data);
|
|
127558
|
+
if (serialized !== null && serialized.bytes <= 256) return event;
|
|
127559
|
+
const truncated = {
|
|
127560
|
+
__truncated: true,
|
|
127561
|
+
__originalBytes: serialized?.bytes ?? null,
|
|
127562
|
+
__preview: serialized === null ? "" : serialized.json.slice(0, 160)
|
|
127563
|
+
};
|
|
127564
|
+
return {
|
|
127565
|
+
...event,
|
|
127566
|
+
data: truncated
|
|
127567
|
+
};
|
|
127568
|
+
}
|
|
127569
|
+
function eventDeviceId(event) {
|
|
127570
|
+
const explicit = event.source.deviceId;
|
|
127571
|
+
if (explicit !== void 0) return Number.isFinite(explicit) ? explicit : void 0;
|
|
127572
|
+
if (event.source.type !== "device") return void 0;
|
|
127573
|
+
const asNumber = Number(event.source.id);
|
|
127574
|
+
return Number.isFinite(asNumber) ? asNumber : void 0;
|
|
127575
|
+
}
|
|
127576
|
+
function createDeviceEventRings() {
|
|
127577
|
+
return { byDevice: /* @__PURE__ */ new Map() };
|
|
127578
|
+
}
|
|
127579
|
+
function ringFor(rings, deviceId) {
|
|
127580
|
+
const existing = rings.byDevice.get(deviceId);
|
|
127581
|
+
if (existing !== void 0) {
|
|
127582
|
+
rings.byDevice.delete(deviceId);
|
|
127583
|
+
rings.byDevice.set(deviceId, existing);
|
|
127584
|
+
return existing;
|
|
127585
|
+
}
|
|
127586
|
+
const created = {
|
|
127587
|
+
history: [],
|
|
127588
|
+
mirrors: /* @__PURE__ */ new Map()
|
|
127589
|
+
};
|
|
127590
|
+
rings.byDevice.set(deviceId, created);
|
|
127591
|
+
while (rings.byDevice.size > 512) {
|
|
127592
|
+
const oldest = rings.byDevice.keys().next();
|
|
127593
|
+
if (oldest.done === true) break;
|
|
127594
|
+
rings.byDevice.delete(oldest.value);
|
|
127595
|
+
}
|
|
127596
|
+
return created;
|
|
127597
|
+
}
|
|
127598
|
+
function recordDeviceEvent(rings, event) {
|
|
127599
|
+
const deviceId = eventDeviceId(event);
|
|
127600
|
+
if (deviceId === void 0) return void 0;
|
|
127601
|
+
const ring = ringFor(rings, deviceId);
|
|
127602
|
+
const retained = capEventData(event);
|
|
127603
|
+
if (isMirrorCategory(event.category)) {
|
|
127604
|
+
ring.mirrors.set(event.category, retained);
|
|
127605
|
+
return deviceId;
|
|
127606
|
+
}
|
|
127607
|
+
ring.history.push(retained);
|
|
127608
|
+
if (ring.history.length > 2e3) ring.history.splice(0, ring.history.length - MAX_DEVICE_RING_EVENTS);
|
|
127609
|
+
return deviceId;
|
|
127610
|
+
}
|
|
127611
|
+
function getDeviceRecent(rings, deviceId) {
|
|
127612
|
+
const ring = rings.byDevice.get(deviceId);
|
|
127613
|
+
if (ring === void 0) return [];
|
|
127614
|
+
if (ring.mirrors.size === 0) return ring.history;
|
|
127615
|
+
const merged = [...ring.history, ...ring.mirrors.values()];
|
|
127616
|
+
merged.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
|
|
127617
|
+
return merged;
|
|
127618
|
+
}
|
|
127286
127619
|
function createSharedBusState(retainRecent = false) {
|
|
127287
127620
|
return {
|
|
127288
127621
|
handlers: /* @__PURE__ */ new Map(),
|
|
127289
127622
|
recent: [],
|
|
127623
|
+
deviceRings: createDeviceEventRings(),
|
|
127290
127624
|
retainRecent
|
|
127291
127625
|
};
|
|
127292
127626
|
}
|
|
@@ -127394,6 +127728,7 @@ var require_manifest_system_deps_CrSP0Kkp = __commonJS({
|
|
|
127394
127728
|
if (state.retainRecent && !isHighFrequencyCategory(event.category)) {
|
|
127395
127729
|
state.recent.push(event);
|
|
127396
127730
|
if (state.recent.length > 1e3) state.recent.splice(0, state.recent.length - MAX_RECENT_EVENTS);
|
|
127731
|
+
recordDeviceEvent(state.deviceRings, event);
|
|
127397
127732
|
}
|
|
127398
127733
|
const delivered = /* @__PURE__ */ new Set();
|
|
127399
127734
|
for (const [pattern, set] of state.handlers) {
|
|
@@ -129788,14 +130123,15 @@ var require_manifest_system_deps_CrSP0Kkp = __commonJS({
|
|
|
129788
130123
|
});
|
|
129789
130124
|
},
|
|
129790
130125
|
getRecent(filter, limit) {
|
|
129791
|
-
const
|
|
130126
|
+
const source = filter?.deviceId !== void 0 ? getDeviceRecent(state.deviceRings, filter.deviceId) : state.recent;
|
|
130127
|
+
const filtered = filter ? source.filter((e) => {
|
|
129792
130128
|
const cat = filter.category;
|
|
129793
130129
|
if (cat) {
|
|
129794
130130
|
const categories = typeof cat === "string" ? [cat] : Array.isArray(cat) ? cat : [];
|
|
129795
130131
|
if (categories.length > 0 && !categories.some((c) => matchesPattern(String(c), e.category))) return false;
|
|
129796
130132
|
}
|
|
129797
130133
|
return matchesEventFilter(e, filter);
|
|
129798
|
-
}) :
|
|
130134
|
+
}) : source;
|
|
129799
130135
|
return limit !== void 0 ? filtered.slice(-limit) : filtered;
|
|
129800
130136
|
}
|
|
129801
130137
|
};
|
|
@@ -131720,11 +132056,11 @@ var require_manifest_system_deps_CrSP0Kkp = __commonJS({
|
|
|
131720
132056
|
}
|
|
131721
132057
|
});
|
|
131722
132058
|
|
|
131723
|
-
// ../system/dist/custom-action-registry-
|
|
131724
|
-
var
|
|
131725
|
-
"../system/dist/custom-action-registry-
|
|
132059
|
+
// ../system/dist/custom-action-registry-acBY3mHA.js
|
|
132060
|
+
var require_custom_action_registry_acBY3mHA = __commonJS({
|
|
132061
|
+
"../system/dist/custom-action-registry-acBY3mHA.js"(exports) {
|
|
131726
132062
|
"use strict";
|
|
131727
|
-
var
|
|
132063
|
+
var _camstack_types_addon = require_addon();
|
|
131728
132064
|
var CustomActionRegistry = class {
|
|
131729
132065
|
byAddon = /* @__PURE__ */ new Map();
|
|
131730
132066
|
registerAddon(addonId, catalog, handler) {
|
|
@@ -131765,7 +132101,7 @@ var require_custom_action_registry_DG_QIWxd = __commonJS({
|
|
|
131765
132101
|
for (const [addonId, actions] of this.byAddon) {
|
|
131766
132102
|
const catalog = {};
|
|
131767
132103
|
for (const [name, entry] of actions) catalog[name] = entry.spec;
|
|
131768
|
-
out[addonId] =
|
|
132104
|
+
out[addonId] = (0, _camstack_types_addon.describeCustomActions)(catalog);
|
|
131769
132105
|
}
|
|
131770
132106
|
return out;
|
|
131771
132107
|
}
|
|
@@ -135538,7 +135874,7 @@ var require_dist3 = __commonJS({
|
|
|
135538
135874
|
"use strict";
|
|
135539
135875
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
135540
135876
|
var require_chunk = require_chunk_Cek0wNdY();
|
|
135541
|
-
var require_dist10 =
|
|
135877
|
+
var require_dist10 = require_dist_C6JIhqS6();
|
|
135542
135878
|
var require_builtins_alerts_alerts_addon = require_alerts_addon();
|
|
135543
135879
|
require_alerts();
|
|
135544
135880
|
var require_formatter = require_formatter_DqAKDlvN();
|
|
@@ -135565,9 +135901,9 @@ var require_dist3 = __commonJS({
|
|
|
135565
135901
|
var require_builtins_winston_logging_index = require_winston_logging();
|
|
135566
135902
|
var require_event_loop_stall_monitor = require_event_loop_stall_monitor_CAsHdMwP();
|
|
135567
135903
|
var require_tls$1 = require_tls_BFs4PzoW();
|
|
135568
|
-
var require_manifest_system_deps =
|
|
135904
|
+
var require_manifest_system_deps = require_manifest_system_deps_CzyjTMcO();
|
|
135569
135905
|
var require_resource_monitor = require_resource_monitor_LVE1BoLs();
|
|
135570
|
-
var require_custom_action_registry =
|
|
135906
|
+
var require_custom_action_registry = require_custom_action_registry_acBY3mHA();
|
|
135571
135907
|
var zod = require_zod();
|
|
135572
135908
|
var node_crypto = __require("crypto");
|
|
135573
135909
|
var _camstack_types_node = require_node();
|
|
@@ -216676,7 +217012,7 @@ var require_dist4 = __commonJS({
|
|
|
216676
217012
|
"../types/dist/index.js"(exports) {
|
|
216677
217013
|
"use strict";
|
|
216678
217014
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
216679
|
-
var require_sleep =
|
|
217015
|
+
var require_sleep = require_sleep_DqtlfkSS();
|
|
216680
217016
|
var require_event_category = require_event_category_BVfsrBYA();
|
|
216681
217017
|
var require_canonical_hash = require_canonical_hash_9lydiEzx();
|
|
216682
217018
|
var require_enums2 = require_enums();
|
|
@@ -219486,6 +219822,49 @@ var require_dist4 = __commonJS({
|
|
|
219486
219822
|
pixels: entry.resolution.width * entry.resolution.height
|
|
219487
219823
|
}])].sort((a, b) => compareToTarget(a.pixels, b.pixels, targetPixels))[0]?.entry;
|
|
219488
219824
|
}
|
|
219825
|
+
var OVERLAY_LAYERS = [
|
|
219826
|
+
"motion",
|
|
219827
|
+
"objects",
|
|
219828
|
+
"discarded",
|
|
219829
|
+
"stationary"
|
|
219830
|
+
];
|
|
219831
|
+
var DEFAULT_OVERLAY_LAYERS = [
|
|
219832
|
+
"motion",
|
|
219833
|
+
"objects",
|
|
219834
|
+
"stationary"
|
|
219835
|
+
];
|
|
219836
|
+
var STATIONARY_OVERLAY_STYLE = {
|
|
219837
|
+
/** Border width in px, at the surface's own scale. */
|
|
219838
|
+
borderWidth: 2,
|
|
219839
|
+
/** Dashed, not solid — the census is not a live detection. */
|
|
219840
|
+
dashed: true,
|
|
219841
|
+
/** Dash on/off lengths in px, for a renderer that needs them explicitly
|
|
219842
|
+
* (React Native cannot express `border-dashed` without them). */
|
|
219843
|
+
dashPattern: [6, 4],
|
|
219844
|
+
/**
|
|
219845
|
+
* FULL opacity, deliberately.
|
|
219846
|
+
*
|
|
219847
|
+
* This was 0.7, to make a parked car quieter than a live subject. It made it
|
|
219848
|
+
* quieter by lying about its colour: a class hue at 70% over a dark frame
|
|
219849
|
+
* reads as a different hue, and the operator saw the census boxes as the
|
|
219850
|
+
* wrong colour — which they effectively were.
|
|
219851
|
+
*
|
|
219852
|
+
* The dash already says "censused", and it says it without touching the
|
|
219853
|
+
* hue. Two signals for one fact was one too many, and the one that had to go
|
|
219854
|
+
* is the one that corrupts a value the rest of the system agrees on: the
|
|
219855
|
+
* class colour comes from `EVENT_TAXONOMY` and must reach the screen intact
|
|
219856
|
+
* on every surface, or the palette is shared in name only.
|
|
219857
|
+
*/
|
|
219858
|
+
opacity: 1,
|
|
219859
|
+
/** Corner radius in px. */
|
|
219860
|
+
borderRadius: 2
|
|
219861
|
+
};
|
|
219862
|
+
function formatParkedFor(ms) {
|
|
219863
|
+
if (!Number.isFinite(ms) || ms <= 0) return "0 s";
|
|
219864
|
+
if (ms < 6e4) return `${String(Math.round(ms / 1e3))} s`;
|
|
219865
|
+
if (ms < 36e5) return `${String(Math.round(ms / 6e4))} min`;
|
|
219866
|
+
return `${String(Math.round(ms / 36e5))} h`;
|
|
219867
|
+
}
|
|
219489
219868
|
var FORMAT_KEYS = [
|
|
219490
219869
|
"onnx",
|
|
219491
219870
|
"coreml",
|
|
@@ -222370,6 +222749,21 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
222370
222749
|
mode: "singleton",
|
|
222371
222750
|
deviceTypes: Object.values(require_sleep.DeviceType),
|
|
222372
222751
|
runtimeState: StreamSignalsStatusSchema,
|
|
222752
|
+
/**
|
|
222753
|
+
* Runtime-state durability: **session** — mirrored in RAM, never written.
|
|
222754
|
+
*
|
|
222755
|
+
* The slice holds what the DEVICE says it can emit. That is a probed fact,
|
|
222756
|
+
* not an operator choice: the provider re-declares it on every registration,
|
|
222757
|
+
* so losing it loses nothing and persisting it would freeze an answer the
|
|
222758
|
+
* camera is entitled to change. Measured the same day on the sibling case —
|
|
222759
|
+
* `native-object-detection.supportedClasses` was persisted, and a firmware
|
|
222760
|
+
* class the camera really detected stayed missing for the life of the row
|
|
222761
|
+
* because the fix could not reach it.
|
|
222762
|
+
*
|
|
222763
|
+
* See `RuntimeStateDurability`. Enforced by
|
|
222764
|
+
* `scripts/check-runtime-state-durability.ts`.
|
|
222765
|
+
*/
|
|
222766
|
+
durability: "session",
|
|
222373
222767
|
methods: {
|
|
222374
222768
|
/**
|
|
222375
222769
|
* What this device can emit. Empty is a valid and common answer — most
|
|
@@ -223634,41 +224028,6 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
223634
224028
|
})) }), { auth: "admin" })
|
|
223635
224029
|
}
|
|
223636
224030
|
};
|
|
223637
|
-
function defineCustomActions(spec) {
|
|
223638
|
-
return spec;
|
|
223639
|
-
}
|
|
223640
|
-
function customAction(input, output, options) {
|
|
223641
|
-
return {
|
|
223642
|
-
input,
|
|
223643
|
-
output,
|
|
223644
|
-
kind: options?.kind ?? "query",
|
|
223645
|
-
auth: options?.auth ?? "protected",
|
|
223646
|
-
scope: options?.scope ?? { kind: "system" },
|
|
223647
|
-
...options?.caller ? { caller: "required" } : {}
|
|
223648
|
-
};
|
|
223649
|
-
}
|
|
223650
|
-
function deviceCustomAction(input, output, options) {
|
|
223651
|
-
return {
|
|
223652
|
-
input,
|
|
223653
|
-
output,
|
|
223654
|
-
kind: options?.kind ?? "query",
|
|
223655
|
-
auth: options?.auth ?? "protected",
|
|
223656
|
-
scope: {
|
|
223657
|
-
kind: "device",
|
|
223658
|
-
...options?.deviceTypes ? { deviceTypes: options.deviceTypes } : {}
|
|
223659
|
-
}
|
|
223660
|
-
};
|
|
223661
|
-
}
|
|
223662
|
-
function describeCustomActions(catalog) {
|
|
223663
|
-
const out = {};
|
|
223664
|
-
for (const [name, spec] of Object.entries(catalog)) out[name] = {
|
|
223665
|
-
kind: spec.kind,
|
|
223666
|
-
auth: spec.auth,
|
|
223667
|
-
scope: spec.scope,
|
|
223668
|
-
...spec.caller === "required" ? { caller: "required" } : {}
|
|
223669
|
-
};
|
|
223670
|
-
return out;
|
|
223671
|
-
}
|
|
223672
224031
|
var CustomModelDescriptorSchema = zod.z.object({
|
|
223673
224032
|
stepId: zod.z.string(),
|
|
223674
224033
|
entry: ModelCatalogEntrySchema
|
|
@@ -230190,6 +230549,30 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
230190
230549
|
settings: NcAlarmSettingsSchema,
|
|
230191
230550
|
coverage: zod.z.array(NcAlarmModeCoverageSchema)
|
|
230192
230551
|
});
|
|
230552
|
+
var NC_CLIP_RETENTION_MAX_SEC = 60;
|
|
230553
|
+
var NcClipRetentionAskSchema = zod.z.object({
|
|
230554
|
+
/**
|
|
230555
|
+
* The camera this ask is about. **Absent = every camera**, which is what a
|
|
230556
|
+
* rule with no `conditions.devices` means: it can fire anywhere, so it is
|
|
230557
|
+
* asking everywhere.
|
|
230558
|
+
*/
|
|
230559
|
+
deviceId: zod.z.number().int().nonnegative().optional(),
|
|
230560
|
+
/** Seconds of history the rule needs held for it. Never zero — a rule that
|
|
230561
|
+
* needs nothing produces no ask at all. */
|
|
230562
|
+
seconds: zod.z.number().min(0).max(60),
|
|
230563
|
+
/** The profile the rule cuts from, when it named one. Absent = the cheapest
|
|
230564
|
+
* assigned, which is what the cut defaults to. */
|
|
230565
|
+
profile: require_sleep.CamProfileSchema.optional(),
|
|
230566
|
+
/** Who is asking — so a retention the operator did not expect names a rule. */
|
|
230567
|
+
ruleId: zod.z.string(),
|
|
230568
|
+
ruleName: zod.z.string(),
|
|
230569
|
+
/** Why this many seconds: the rule's own window, or the occupancy ceiling. */
|
|
230570
|
+
reason: zod.z.enum(["window", "occupancy"])
|
|
230571
|
+
});
|
|
230572
|
+
var NcClipRetentionPlanSchema = zod.z.object({
|
|
230573
|
+
rulesLoaded: zod.z.boolean(),
|
|
230574
|
+
asks: zod.z.array(NcClipRetentionAskSchema).readonly()
|
|
230575
|
+
});
|
|
230193
230576
|
var notificationRulesCapability = {
|
|
230194
230577
|
name: "notification-rules",
|
|
230195
230578
|
scope: "system",
|
|
@@ -230222,6 +230605,23 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
230222
230605
|
auth: "admin"
|
|
230223
230606
|
}),
|
|
230224
230607
|
/**
|
|
230608
|
+
* WHAT THE RULES ACTUALLY ASK the stream broker to retain, per camera.
|
|
230609
|
+
*
|
|
230610
|
+
* The notification centre owns the rules, so it is the only thing that can
|
|
230611
|
+
* say how much history a camera's notifications will ever reach back for.
|
|
230612
|
+
* Before this the broker guessed — a flat minute on every camera — and
|
|
230613
|
+
* learned the PROFILE reactively, after the first clip had already been cut
|
|
230614
|
+
* from the wrong one. This is the same ask stated once, in front.
|
|
230615
|
+
*
|
|
230616
|
+
* A QUERY, pulled by each node's broker, not a push: brokers are per node
|
|
230617
|
+
* (a camera's ring lives wherever its stream is ingested) while this cap is
|
|
230618
|
+
* a singleton, so a push would have to enumerate the cluster. The pull also
|
|
230619
|
+
* makes the failure mode right — a broker that cannot reach the centre
|
|
230620
|
+
* keeps the plan it has, and a plan that has never arrived is UNKNOWN
|
|
230621
|
+
* rather than empty (D49: a read that fails changes nothing).
|
|
230622
|
+
*/
|
|
230623
|
+
getClipRetentionAsks: require_sleep.method(zod.z.object({}), NcClipRetentionPlanSchema, { auth: "admin" }),
|
|
230624
|
+
/**
|
|
230225
230625
|
* PERMANENT per-camera mute — the notifications half of the per-camera
|
|
230226
230626
|
* function switch group ([D61](../../../../docs/decisions/adr-0067.md)).
|
|
230227
230627
|
*
|
|
@@ -231381,6 +231781,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
231381
231781
|
});
|
|
231382
231782
|
var TrackSourceSchema = zod.z.enum([
|
|
231383
231783
|
"pipeline",
|
|
231784
|
+
"onboard",
|
|
231384
231785
|
"sensor",
|
|
231385
231786
|
"audio"
|
|
231386
231787
|
]);
|
|
@@ -232435,6 +232836,33 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
232435
232836
|
framesMatched: zod.z.number().int()
|
|
232436
232837
|
});
|
|
232437
232838
|
var RunReplayFrameProcessorResultSchema = zod.z.object({ tracks: zod.z.array(ReplayTrackSchema).readonly() });
|
|
232839
|
+
var AnalyticsLtsSeriesSchema = zod.z.enum([
|
|
232840
|
+
"motion",
|
|
232841
|
+
"audio-dbfs",
|
|
232842
|
+
"battery",
|
|
232843
|
+
"occupancy"
|
|
232844
|
+
]);
|
|
232845
|
+
var LTS_SCOPE_CLASS_SEPARATOR = "|";
|
|
232846
|
+
function occupancyScope(zoneId, className) {
|
|
232847
|
+
const place = zoneId ?? "";
|
|
232848
|
+
return className === void 0 ? place : `${place}|${className}`;
|
|
232849
|
+
}
|
|
232850
|
+
function parseOccupancyScope(scope) {
|
|
232851
|
+
const at = scope.indexOf("|");
|
|
232852
|
+
if (at < 0) return { zoneId: scope };
|
|
232853
|
+
return {
|
|
232854
|
+
zoneId: scope.slice(0, at),
|
|
232855
|
+
className: scope.slice(at + 1)
|
|
232856
|
+
};
|
|
232857
|
+
}
|
|
232858
|
+
var LtsBucketSchema = zod.z.object({
|
|
232859
|
+
scope: zod.z.string(),
|
|
232860
|
+
bucketStart: zod.z.number().int(),
|
|
232861
|
+
samples: zod.z.number().int().nonnegative(),
|
|
232862
|
+
sum: zod.z.number(),
|
|
232863
|
+
min: zod.z.number(),
|
|
232864
|
+
max: zod.z.number()
|
|
232865
|
+
});
|
|
232438
232866
|
var pipelineAnalyticsCapability = {
|
|
232439
232867
|
name: "pipeline-analytics",
|
|
232440
232868
|
scope: "device",
|
|
@@ -232578,6 +233006,30 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
232578
233006
|
getKeyEventsBatch: require_sleep.method(KeyEventBatchQueryInput, zod.z.array(KeyEventsForDeviceSchema).readonly()),
|
|
232579
233007
|
/** Server-side bucketed event counts for the 24-hour timeline.
|
|
232580
233008
|
* Returns one entry per non-empty bucket; empty buckets are omitted. */
|
|
233009
|
+
/**
|
|
233010
|
+
* Read one camera's long-term series — 5-minute buckets, kept for a year.
|
|
233011
|
+
*
|
|
233012
|
+
* This is the history surface for every chart that used to be served from a
|
|
233013
|
+
* RAM ring: the ring dies with the process, cannot answer about last night,
|
|
233014
|
+
* and had a 60-minute horizon, while these rows are ~60 bytes and already
|
|
233015
|
+
* written. `scope` is the series' own dimension — for `occupancy`, spell it
|
|
233016
|
+
* with {@link occupancyScope} rather than by hand, and omit it to get every
|
|
233017
|
+
* scope back at once (the caller then groups with
|
|
233018
|
+
* {@link parseOccupancyScope}).
|
|
233019
|
+
*
|
|
233020
|
+
* Bounds are inclusive on the BUCKET START, so a range that ends mid-bucket
|
|
233021
|
+
* still returns the bucket it lands in — the alternative is a chart whose
|
|
233022
|
+
* last column silently disappears for five minutes out of every five.
|
|
233023
|
+
*/
|
|
233024
|
+
readLongTermSeries: require_sleep.method(zod.z.object({
|
|
233025
|
+
deviceId: zod.z.number(),
|
|
233026
|
+
series: AnalyticsLtsSeriesSchema,
|
|
233027
|
+
/** Omit for EVERY scope of this series in the range. */
|
|
233028
|
+
scope: zod.z.string().optional(),
|
|
233029
|
+
from: zod.z.number(),
|
|
233030
|
+
to: zod.z.number(),
|
|
233031
|
+
limit: zod.z.number().int().positive().optional()
|
|
233032
|
+
}), zod.z.array(LtsBucketSchema).readonly()),
|
|
232581
233033
|
getEventDensity: require_sleep.method(zod.z.object({
|
|
232582
233034
|
deviceId: zod.z.number(),
|
|
232583
233035
|
since: zod.z.number(),
|
|
@@ -233586,7 +234038,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
233586
234038
|
"device-activity"
|
|
233587
234039
|
]);
|
|
233588
234040
|
var MotionSourcesSchema = zod.z.array(MotionSourceEnum);
|
|
233589
|
-
var DetectionSourcesSchema = zod.z.array(DetectionSourceSchema);
|
|
234041
|
+
var DetectionSourcesSchema = zod.z.preprocess((value) => Array.isArray(value) && value.length > 1 ? value.slice(0, 1) : value, zod.z.array(DetectionSourceSchema).max(1));
|
|
233590
234042
|
var ReportMotionInputSchema = zod.z.object({
|
|
233591
234043
|
deviceId: zod.z.number(),
|
|
233592
234044
|
detected: zod.z.boolean(),
|
|
@@ -234080,6 +234532,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
234080
234532
|
queueDepth: zod.z.number(),
|
|
234081
234533
|
frameLazy: FrameLazyMetricsSchema.optional()
|
|
234082
234534
|
});
|
|
234535
|
+
var OccupancyBurstRefusalSchema = zod.z.enum([
|
|
234536
|
+
"not-attached",
|
|
234537
|
+
"battery-asleep",
|
|
234538
|
+
"not-watching",
|
|
234539
|
+
"already-bursting"
|
|
234540
|
+
]);
|
|
234083
234541
|
var pipelineRunnerCapability = {
|
|
234084
234542
|
name: "pipeline-runner",
|
|
234085
234543
|
scope: "system",
|
|
@@ -234116,6 +234574,50 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
234116
234574
|
/** List the deviceIds currently attached to this runner. */
|
|
234117
234575
|
getLocalCameras: require_sleep.method(zod.z.void(), zod.z.array(zod.z.number()).readonly()),
|
|
234118
234576
|
/**
|
|
234577
|
+
* Look at a camera NOW, out of band, because something just happened that
|
|
234578
|
+
* only a fresh look can settle.
|
|
234579
|
+
*
|
|
234580
|
+
* The periodic recheck (`occupancyRecheckSec`, 300 s) exists to watch a
|
|
234581
|
+
* still scene. It is the wrong instrument for a QUESTION that has just been
|
|
234582
|
+
* asked: on device 617 a parked car's departure was observed, a departure
|
|
234583
|
+
* strike was armed — and then the motion session ended, the strike decayed
|
|
234584
|
+
* after its 30 s TTL, and the next periodic look arrived up to five minutes
|
|
234585
|
+
* later with nothing left to confirm. Every one of those departures was
|
|
234586
|
+
* settled by the entry ageing out 6 to 10 minutes of observed time later,
|
|
234587
|
+
* and the notification's clip showed an empty space with nothing leaving
|
|
234588
|
+
* it.
|
|
234589
|
+
*
|
|
234590
|
+
* Two numbers make the ask specific, and a caller that ignores them wastes
|
|
234591
|
+
* the burst: a confirmation must land at least
|
|
234592
|
+
* `DEPARTURE_CONFIRM_MIN_GAP_MS` (3 s) after the read that armed the
|
|
234593
|
+
* strike — before that it is the same optical event and is refused — and
|
|
234594
|
+
* `DEPARTURE_ABSENCE_MIN_READS` (5) consecutive unassociated frames are
|
|
234595
|
+
* needed, while `occupancyRecheckFrames` defaults to FOUR. A burst of four
|
|
234596
|
+
* can never confirm an absence; that is why two periodic looks were always
|
|
234597
|
+
* required.
|
|
234598
|
+
*
|
|
234599
|
+
* The runner answers whether it actually started one. A refusal is NAMED,
|
|
234600
|
+
* never a silent `false`: a camera that is asleep on battery (D173 — this
|
|
234601
|
+
* must not become a self-initiated wake), detached, mid-session or already
|
|
234602
|
+
* bursting are four different facts, and a caller told only "no" cannot
|
|
234603
|
+
* tell a protection from a bug.
|
|
234604
|
+
*/
|
|
234605
|
+
requestOccupancyBurst: require_sleep.method(zod.z.object({
|
|
234606
|
+
deviceId: zod.z.number(),
|
|
234607
|
+
/** How many frames to collect. The caller sizes this against what its
|
|
234608
|
+
* own confirmation needs; the runner clamps it to the field's range. */
|
|
234609
|
+
frames: zod.z.number().int().positive().optional(),
|
|
234610
|
+
/** Why, for the log. A burst nobody can attribute is a cost nobody can
|
|
234611
|
+
* defend — the periodic one at least has a timer to point at. */
|
|
234612
|
+
reason: zod.z.string()
|
|
234613
|
+
}), zod.z.object({
|
|
234614
|
+
started: zod.z.boolean(),
|
|
234615
|
+
refusedBecause: OccupancyBurstRefusalSchema.optional()
|
|
234616
|
+
}), {
|
|
234617
|
+
auth: "admin",
|
|
234618
|
+
kind: "mutation"
|
|
234619
|
+
}),
|
|
234620
|
+
/**
|
|
234119
234621
|
* Best-effort NATIVE-resolution crop of a retention-ring frame. Given the
|
|
234120
234622
|
* `FrameHandle` that rode an inference-result event and a normalized `bbox`,
|
|
234121
234623
|
* the runner asks the decode worker still holding that frame's NATIVE
|
|
@@ -246057,7 +246559,28 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
246057
246559
|
/** Total tracked objects in this scope (frame / zone / unzoned). */
|
|
246058
246560
|
totalObjects: zod.z.number().int().nonnegative(),
|
|
246059
246561
|
/** Per-class count. Keys are macro class names (e.g. `person`, `car`). */
|
|
246060
|
-
byClass: zod.z.record(zod.z.string(), zod.z.number().int().nonnegative())
|
|
246562
|
+
byClass: zod.z.record(zod.z.string(), zod.z.number().int().nonnegative()),
|
|
246563
|
+
/**
|
|
246564
|
+
* Of `totalObjects`, how many are STANDING — objects the census holds,
|
|
246565
|
+
* present but not going anywhere (a parked car, a bin, a statue).
|
|
246566
|
+
*
|
|
246567
|
+
* The operator's question about a scene has two halves and they answer
|
|
246568
|
+
* different things: "what is parked here" is stable for hours and must not
|
|
246569
|
+
* flap, while "who is walking through" is the thing an alert is about. One
|
|
246570
|
+
* number could only serve one of them, and `totalObjects` served the first
|
|
246571
|
+
* badly — a passer-by moved it and every occupancy rule saw a change.
|
|
246572
|
+
*
|
|
246573
|
+
* `standing + transient === totalObjects`, always. The total keeps its old
|
|
246574
|
+
* meaning exactly, so no rule written against it changes behaviour.
|
|
246575
|
+
*
|
|
246576
|
+
* ABSENT means UNKNOWN, never zero (D393): a snapshot from a node older than
|
|
246577
|
+
* this field cannot say, and a reader that folds absence in as 0 reports "no
|
|
246578
|
+
* parked objects here" about a camera whose lot is full.
|
|
246579
|
+
*/
|
|
246580
|
+
standingObjects: zod.z.number().int().nonnegative().optional(),
|
|
246581
|
+
/** Of `totalObjects`, how many are passing through. See `standingObjects` —
|
|
246582
|
+
* same absence rule. */
|
|
246583
|
+
transientObjects: zod.z.number().int().nonnegative().optional()
|
|
246061
246584
|
});
|
|
246062
246585
|
var ZoneScopeBreakdownSchema = PerScopeBreakdownSchema.extend({
|
|
246063
246586
|
zoneId: zod.z.string(),
|
|
@@ -253334,6 +253857,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
253334
253857
|
addonId: null,
|
|
253335
253858
|
access: "view"
|
|
253336
253859
|
},
|
|
253860
|
+
"notificationRules.getClipRetentionAsks": {
|
|
253861
|
+
capName: "notification-rules",
|
|
253862
|
+
capScope: "system",
|
|
253863
|
+
addonId: null,
|
|
253864
|
+
access: "view"
|
|
253865
|
+
},
|
|
253337
253866
|
"notificationRules.getConditionCatalog": {
|
|
253338
253867
|
capName: "notification-rules",
|
|
253339
253868
|
capScope: "system",
|
|
@@ -253844,6 +254373,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
253844
254373
|
addonId: null,
|
|
253845
254374
|
access: "create"
|
|
253846
254375
|
},
|
|
254376
|
+
"pipelineAnalytics.readLongTermSeries": {
|
|
254377
|
+
capName: "pipeline-analytics",
|
|
254378
|
+
capScope: "device",
|
|
254379
|
+
addonId: null,
|
|
254380
|
+
access: "view"
|
|
254381
|
+
},
|
|
253847
254382
|
"pipelineAnalytics.rebuildObjectEmbeddings": {
|
|
253848
254383
|
capName: "pipeline-analytics",
|
|
253849
254384
|
capScope: "device",
|
|
@@ -254516,6 +255051,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
254516
255051
|
addonId: null,
|
|
254517
255052
|
access: "create"
|
|
254518
255053
|
},
|
|
255054
|
+
"pipelineRunner.requestOccupancyBurst": {
|
|
255055
|
+
capName: "pipeline-runner",
|
|
255056
|
+
capScope: "system",
|
|
255057
|
+
addonId: null,
|
|
255058
|
+
access: "create"
|
|
255059
|
+
},
|
|
254519
255060
|
"pipelineRunner.runDetailSubtree": {
|
|
254520
255061
|
capName: "pipeline-runner",
|
|
254521
255062
|
capScope: "system",
|
|
@@ -257926,6 +258467,11 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
257926
258467
|
form: "single",
|
|
257927
258468
|
optional: false
|
|
257928
258469
|
}],
|
|
258470
|
+
"pipelineAnalytics.readLongTermSeries": [{
|
|
258471
|
+
name: "deviceId",
|
|
258472
|
+
form: "single",
|
|
258473
|
+
optional: false
|
|
258474
|
+
}],
|
|
257929
258475
|
"pipelineAnalytics.rebuildObjectEmbeddings": [{
|
|
257930
258476
|
name: "deviceId",
|
|
257931
258477
|
form: "single",
|
|
@@ -258116,6 +258662,11 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
258116
258662
|
form: "single",
|
|
258117
258663
|
optional: false
|
|
258118
258664
|
}],
|
|
258665
|
+
"pipelineRunner.requestOccupancyBurst": [{
|
|
258666
|
+
name: "deviceId",
|
|
258667
|
+
form: "single",
|
|
258668
|
+
optional: false
|
|
258669
|
+
}],
|
|
258119
258670
|
"pipelineRunner.runDetailSubtree": [{
|
|
258120
258671
|
name: "deviceId",
|
|
258121
258672
|
form: "single",
|
|
@@ -258799,6 +259350,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
258799
259350
|
"pipelineRunner.parkTrackFrame",
|
|
258800
259351
|
"pipelineRunner.releaseParkedTrackFrames",
|
|
258801
259352
|
"pipelineRunner.reportMotion",
|
|
259353
|
+
"pipelineRunner.requestOccupancyBurst",
|
|
258802
259354
|
"pipelineRunner.runDetailSubtree",
|
|
258803
259355
|
"pipelineRunner.runStatelessStep",
|
|
258804
259356
|
"plateGallery.getPlateByTrack",
|
|
@@ -262607,6 +263159,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
262607
263159
|
exports.AlertSourceSchema = AlertSourceSchema;
|
|
262608
263160
|
exports.AlertStatusSchema = AlertStatusSchema;
|
|
262609
263161
|
exports.AmbientLightSensorStatusSchema = AmbientLightSensorStatusSchema;
|
|
263162
|
+
exports.AnalyticsLtsSeriesSchema = AnalyticsLtsSeriesSchema;
|
|
262610
263163
|
exports.ApiKeyRecordSchema = ApiKeyRecordSchema;
|
|
262611
263164
|
exports.ApiKeySummarySchema = ApiKeySummarySchema;
|
|
262612
263165
|
exports.ArchiveEntrySchema = ArchiveEntrySchema;
|
|
@@ -262801,6 +263354,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
262801
263354
|
exports.DEFAULT_FIRST_SIGHTING_FRESHNESS_MS = DEFAULT_FIRST_SIGHTING_FRESHNESS_MS;
|
|
262802
263355
|
exports.DEFAULT_MIN_LANDMARK_FACE_SIZE_PX = DEFAULT_MIN_LANDMARK_FACE_SIZE_PX;
|
|
262803
263356
|
exports.DEFAULT_NATIVE_LEASE_SETTINGS = DEFAULT_NATIVE_LEASE_SETTINGS;
|
|
263357
|
+
exports.DEFAULT_OVERLAY_LAYERS = DEFAULT_OVERLAY_LAYERS;
|
|
262804
263358
|
exports.DEFAULT_POOL_MEMORY_POLICY = DEFAULT_POOL_MEMORY_POLICY;
|
|
262805
263359
|
exports.DEFAULT_RECORDING_PROFILES = DEFAULT_RECORDING_PROFILES;
|
|
262806
263360
|
exports.DEFAULT_RETENTION = DEFAULT_RETENTION;
|
|
@@ -262984,6 +263538,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
262984
263538
|
exports.LOAD_CONTRIBUTION_ROLES = LOAD_CONTRIBUTION_ROLES;
|
|
262985
263539
|
exports.LOG_CHANNEL_TICK_MS = LOG_CHANNEL_TICK_MS;
|
|
262986
263540
|
exports.LOG_LEVEL_RANK = LOG_LEVEL_RANK;
|
|
263541
|
+
exports.LTS_SCOPE_CLASS_SEPARATOR = LTS_SCOPE_CLASS_SEPARATOR;
|
|
262987
263542
|
exports.LabelAttributionSchema = LabelAttributionSchema;
|
|
262988
263543
|
exports.LabelDefinitionSchema = LabelDefinitionSchema;
|
|
262989
263544
|
exports.LabelTierSchema = LabelTierSchema;
|
|
@@ -263044,6 +263599,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
263044
263599
|
exports.LoggingSettingsStateSchema = LoggingSettingsStateSchema;
|
|
263045
263600
|
exports.LoginMethodContributionSchema = LoginMethodContributionSchema;
|
|
263046
263601
|
exports.LoginStageEnum = LoginStageEnum;
|
|
263602
|
+
exports.LtsBucketSchema = LtsBucketSchema;
|
|
263047
263603
|
exports.MACRO_LABELS = MACRO_LABELS;
|
|
263048
263604
|
exports.MAX_ARCHIVED_DEBUG_NOTES = MAX_ARCHIVED_DEBUG_NOTES;
|
|
263049
263605
|
exports.MAX_BIRTH_DECISION_RECORDS = MAX_BIRTH_DECISION_RECORDS;
|
|
@@ -263157,6 +263713,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
263157
263713
|
exports.NC_AUDIO_SEED = NC_AUDIO_SEED;
|
|
263158
263714
|
exports.NC_AUTHORABLE_SYSTEM_EVENT_KINDS = NC_AUTHORABLE_SYSTEM_EVENT_KINDS;
|
|
263159
263715
|
exports.NC_BASE_CONDITION_KEYS = NC_BASE_CONDITION_KEYS;
|
|
263716
|
+
exports.NC_CLIP_RETENTION_MAX_SEC = NC_CLIP_RETENTION_MAX_SEC;
|
|
263160
263717
|
exports.NC_CONDITION_CATALOG = NC_CONDITION_CATALOG;
|
|
263161
263718
|
exports.NC_CONFIRM_DEFAULT_MAX_IMAGE_PX = NC_CONFIRM_DEFAULT_MAX_IMAGE_PX;
|
|
263162
263719
|
exports.NC_CONFIRM_DEFAULT_TIMEOUT_MS = NC_CONFIRM_DEFAULT_TIMEOUT_MS;
|
|
@@ -263205,6 +263762,8 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
263205
263762
|
exports.NcAlarmSkipReasonSchema = NcAlarmSkipReasonSchema;
|
|
263206
263763
|
exports.NcAlarmSkippedDeviceSchema = NcAlarmSkippedDeviceSchema;
|
|
263207
263764
|
exports.NcAudioConditionSchema = NcAudioConditionSchema;
|
|
263765
|
+
exports.NcClipRetentionAskSchema = NcClipRetentionAskSchema;
|
|
263766
|
+
exports.NcClipRetentionPlanSchema = NcClipRetentionPlanSchema;
|
|
263208
263767
|
exports.NcConditionDescriptorSchema = NcConditionDescriptorSchema;
|
|
263209
263768
|
exports.NcConditionsSchema = NcConditionsSchema;
|
|
263210
263769
|
exports.NcConfirmExpectSchema = NcConfirmExpectSchema;
|
|
@@ -263258,8 +263817,10 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
263258
263817
|
exports.OPS_LOG_DEFAULT_LIMIT = OPS_LOG_DEFAULT_LIMIT;
|
|
263259
263818
|
exports.OPS_LOG_RING_DEFAULT_MAX = OPS_LOG_RING_DEFAULT_MAX;
|
|
263260
263819
|
exports.OVERFLOW_REASON = OVERFLOW_REASON;
|
|
263820
|
+
exports.OVERLAY_LAYERS = OVERLAY_LAYERS;
|
|
263261
263821
|
exports.OauthIntegrationDescriptorSchema = OauthIntegrationDescriptorSchema;
|
|
263262
263822
|
exports.ObjectEventSchema = ObjectEventSchema;
|
|
263823
|
+
exports.OccupancyBurstRefusalSchema = OccupancyBurstRefusalSchema;
|
|
263263
263824
|
exports.OpsLogDomainSchema = OpsLogDomainSchema;
|
|
263264
263825
|
exports.OpsLogEntrySchema = OpsLogEntrySchema;
|
|
263265
263826
|
exports.OpsLogOpSchema = OpsLogOpSchema;
|
|
@@ -263443,6 +264004,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
263443
264004
|
exports.SOURCE_CAP_CHANGED_AT_FIELD = SOURCE_CAP_CHANGED_AT_FIELD;
|
|
263444
264005
|
exports.SOURCE_DEVICE_TYPES = SOURCE_DEVICE_TYPES;
|
|
263445
264006
|
exports.SOURCE_INFO_METADATA_KEY = SOURCE_INFO_METADATA_KEY;
|
|
264007
|
+
exports.STATIONARY_OVERLAY_STYLE = STATIONARY_OVERLAY_STYLE;
|
|
263446
264008
|
exports.STORAGE_ACCESS_FALLBACK = STORAGE_ACCESS_FALLBACK;
|
|
263447
264009
|
exports.STORAGE_BYTES_PER_GB = STORAGE_BYTES_PER_GB;
|
|
263448
264010
|
exports.STORAGE_LOCATION_MODES = STORAGE_LOCATION_MODES;
|
|
@@ -263775,7 +264337,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
263775
264337
|
exports.createRuntimeStateBridge = createRuntimeStateBridge;
|
|
263776
264338
|
exports.createSliceHandle = require_sleep.createSliceHandle;
|
|
263777
264339
|
exports.createSystemProxy = createSystemProxy;
|
|
263778
|
-
exports.customAction = customAction;
|
|
264340
|
+
exports.customAction = require_sleep.customAction;
|
|
263779
264341
|
exports.customModelRegistryCapability = customModelRegistryCapability;
|
|
263780
264342
|
exports.dataStoreProviderCapability = dataStoreProviderCapability;
|
|
263781
264343
|
exports.dayNightCapability = dayNightCapability;
|
|
@@ -263785,18 +264347,18 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
263785
264347
|
exports.decoderCapability = decoderCapability;
|
|
263786
264348
|
exports.defaultDeliveryForSection = defaultDeliveryForSection;
|
|
263787
264349
|
exports.defaultDeviceFor = defaultDeviceFor;
|
|
263788
|
-
exports.defineCustomActions = defineCustomActions;
|
|
264350
|
+
exports.defineCustomActions = require_sleep.defineCustomActions;
|
|
263789
264351
|
exports.deriveBatteryPresence = deriveBatteryPresence;
|
|
263790
264352
|
exports.deriveCameraSwitches = deriveCameraSwitches;
|
|
263791
264353
|
exports.deriveDetailCropRect = deriveDetailCropRect;
|
|
263792
264354
|
exports.deriveRecordingMode = deriveRecordingMode;
|
|
263793
|
-
exports.describeCustomActions = describeCustomActions;
|
|
264355
|
+
exports.describeCustomActions = require_sleep.describeCustomActions;
|
|
263794
264356
|
exports.describeModelVariant = describeModelVariant;
|
|
263795
264357
|
exports.detectAccessRole = detectAccessRole;
|
|
263796
264358
|
exports.detectionPipelineCapability = detectionPipelineCapability;
|
|
263797
264359
|
exports.deviceAdoptionCapability = deviceAdoptionCapability;
|
|
263798
264360
|
exports.deviceBackendToFormat = deviceBackendToFormat;
|
|
263799
|
-
exports.deviceCustomAction = deviceCustomAction;
|
|
264361
|
+
exports.deviceCustomAction = require_sleep.deviceCustomAction;
|
|
263800
264362
|
exports.deviceDiscoveryCapability = deviceDiscoveryCapability;
|
|
263801
264363
|
exports.deviceExportCapability = deviceExportCapability;
|
|
263802
264364
|
exports.deviceManagerCapability = deviceManagerCapability;
|
|
@@ -263846,6 +264408,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
263846
264408
|
exports.formatForBackend = formatForBackend;
|
|
263847
264409
|
exports.formatForRuntime = formatForRuntime;
|
|
263848
264410
|
exports.formatMediaOwnerKey = formatMediaOwnerKey;
|
|
264411
|
+
exports.formatParkedFor = formatParkedFor;
|
|
263849
264412
|
exports.gasCapability = gasCapability;
|
|
263850
264413
|
exports.gbToBytes = gbToBytes;
|
|
263851
264414
|
exports.generateAutomationBlock = generateAutomationBlock;
|
|
@@ -263962,6 +264525,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
263962
264525
|
exports.numericSensorCapability = numericSensorCapability;
|
|
263963
264526
|
exports.oauthIntegrationCapability = oauthIntegrationCapability;
|
|
263964
264527
|
exports.objectInputDeclaresAddonId = objectInputDeclaresAddonId;
|
|
264528
|
+
exports.occupancyScope = occupancyScope;
|
|
263965
264529
|
exports.osdCapability = osdCapability;
|
|
263966
264530
|
exports.osdManagerCapability = osdManagerCapability;
|
|
263967
264531
|
exports.overlayClusterStepSettings = overlayClusterStepSettings;
|
|
@@ -263971,6 +264535,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
|
|
|
263971
264535
|
exports.parseJsonObject = require_sleep.parseJsonObject;
|
|
263972
264536
|
exports.parseJsonUnknown = require_sleep.parseJsonUnknown;
|
|
263973
264537
|
exports.parseMediaOwnerKey = parseMediaOwnerKey;
|
|
264538
|
+
exports.parseOccupancyScope = parseOccupancyScope;
|
|
263974
264539
|
exports.parseProcStatus = parseProcStatus;
|
|
263975
264540
|
exports.parseProfileBrokerId = require_sleep.parseProfileBrokerId;
|
|
263976
264541
|
exports.parseRuleSection = parseRuleSection;
|