@camstack/addon-model-studio 1.1.128 → 1.1.130
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{MotionZonesSettings-Y4BOcwCT.mjs → MotionZonesSettings-C0ZZHN5q.mjs} +2 -2
- package/dist/{PrivacyMaskSettings-D0dMH34n.mjs → PrivacyMaskSettings-D4uGl7zT.mjs} +4 -4
- package/dist/{SceneMonitorEditor-iS9jtSJq.mjs → SceneMonitorEditor-BKYzMLFb.mjs} +258 -255
- package/dist/_stub.js +10 -10
- package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-DStSHZb_.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-CGKDpBk2.mjs} +4 -4
- package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CXCz80XV.mjs +26 -0
- package/dist/{hostInit-s1JYi2jS.mjs → hostInit-BihGjZ1F.mjs} +3 -3
- package/dist/model-studio.addon.js +292 -58
- package/dist/model-studio.addon.mjs +292 -58
- package/dist/{player-overlays-q0vtmqkn.mjs → player-overlays-CMrYqFCL.mjs} +1 -1
- package/dist/remoteEntry.js +1 -1
- package/dist/{responsive-DNXbYsNH.mjs → responsive-JVBuLbSa.mjs} +3 -3
- package/dist/{square-CvCVejCK.mjs → square-BCP4gOno.mjs} +1 -1
- package/dist/{trash-2-pcumgheo.mjs → trash-2-CeqN21XB.mjs} +1 -1
- package/dist/{use-device-snapshot-BKYQa7fa.mjs → use-device-snapshot-UOdeTQpP.mjs} +1 -1
- package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-CNgFCxL8.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-B5isrrh9.mjs} +1 -1
- package/package.json +1 -1
- package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CO-CV0SJ.mjs +0 -26
|
@@ -523,7 +523,7 @@ async function importScryptedCatalogModel(input, deps) {
|
|
|
523
523
|
}
|
|
524
524
|
}
|
|
525
525
|
//#endregion
|
|
526
|
-
//#region ../types/dist/event-category-
|
|
526
|
+
//#region ../types/dist/event-category-ZyX6jcse.mjs
|
|
527
527
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
528
528
|
EventCategory["SystemBoot"] = "system.boot";
|
|
529
529
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -1084,7 +1084,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
1084
1084
|
* a package zone — a newly-appeared stationary object of a package class
|
|
1085
1085
|
* that cleared the class / zone / dwell / size gates. Payload:
|
|
1086
1086
|
* `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
|
|
1087
|
-
* entryId, className, zoneIds,
|
|
1087
|
+
* entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
|
|
1088
1088
|
* Telemetry (D8): the durable record is the `package-events` store row;
|
|
1089
1089
|
* this bus topic drives notifier rules + live UI. See
|
|
1090
1090
|
* docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
|
|
@@ -5870,7 +5870,7 @@ var ZodIssueCode = {
|
|
|
5870
5870
|
var ZodFirstPartyTypeKind;
|
|
5871
5871
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5872
5872
|
//#endregion
|
|
5873
|
-
//#region ../types/dist/sleep-
|
|
5873
|
+
//#region ../types/dist/sleep-DBKu2-U5.mjs
|
|
5874
5874
|
/**
|
|
5875
5875
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5876
5876
|
* window to float samples (D455).
|
|
@@ -7880,13 +7880,30 @@ new Set([
|
|
|
7880
7880
|
"scene",
|
|
7881
7881
|
"motion",
|
|
7882
7882
|
"object",
|
|
7883
|
-
"audio"
|
|
7883
|
+
"audio",
|
|
7884
|
+
"mosaic"
|
|
7884
7885
|
]);
|
|
7885
|
-
|
|
7886
|
+
/**
|
|
7887
|
+
* The owner types that are event tables, in the order the event-media resolver
|
|
7888
|
+
* should consider them. Exported so a consumer asking "is this key an event?"
|
|
7889
|
+
* does not re-spell the list and drift from it.
|
|
7890
|
+
*/
|
|
7891
|
+
var EVENT_OWNER_TYPES = [
|
|
7886
7892
|
"motion",
|
|
7887
7893
|
"object",
|
|
7888
7894
|
"audio"
|
|
7889
|
-
]
|
|
7895
|
+
];
|
|
7896
|
+
/**
|
|
7897
|
+
* The same list as a Zod enum, for the cap inputs that must NAME the table
|
|
7898
|
+
* (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
|
|
7899
|
+
* `(table, id)`).
|
|
7900
|
+
*
|
|
7901
|
+
* Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
|
|
7902
|
+
* table would otherwise be accepted by the codec and refused at the door, with
|
|
7903
|
+
* nothing failing until a caller asked.
|
|
7904
|
+
*/
|
|
7905
|
+
var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
|
|
7906
|
+
new Set(EVENT_OWNER_TYPES);
|
|
7890
7907
|
var EncodeProfileSchema = object({
|
|
7891
7908
|
video: object({
|
|
7892
7909
|
codec: _enum([
|
|
@@ -7925,7 +7942,23 @@ var EncodeProfileSchema = object({
|
|
|
7925
7942
|
"zerolatency",
|
|
7926
7943
|
"film",
|
|
7927
7944
|
"animation"
|
|
7928
|
-
]).optional()
|
|
7945
|
+
]).optional(),
|
|
7946
|
+
/**
|
|
7947
|
+
* ONE slice per access unit.
|
|
7948
|
+
*
|
|
7949
|
+
* `-tune zerolatency` turns on x264's sliced threads, and a frame then leaves
|
|
7950
|
+
* the encoder as five NAL slices that share one RTP timestamp and carry one
|
|
7951
|
+
* marker bit. A libwebrtc depacketiser sees five frame-starts and one
|
|
7952
|
+
* frame-end per frame: the first pictures render and the video then freezes
|
|
7953
|
+
* for good while the audio, on its own plane, plays on. Measured on this hub
|
|
7954
|
+
* 2026-09-13 against the Echo, and reduced to one slice by this flag alone.
|
|
7955
|
+
*
|
|
7956
|
+
* A NAMED field and not a raw flag, because {@link EgressEncodeSchema} omits
|
|
7957
|
+
* `outputArgs` on purpose: an opaque array is part of the sharing key, so two
|
|
7958
|
+
* consumers meaning the same thing spelled differently would stop sharing one
|
|
7959
|
+
* child. Absent means "whatever the encoder does" — today's behaviour.
|
|
7960
|
+
*/
|
|
7961
|
+
singleSlicePerFrame: boolean().optional()
|
|
7929
7962
|
}),
|
|
7930
7963
|
audio: union([literal("passthrough"), object({
|
|
7931
7964
|
codec: _enum([
|
|
@@ -7975,7 +8008,7 @@ var BASE_LIVE_EGRESS_PROFILE = {
|
|
|
7975
8008
|
audio: "passthrough"
|
|
7976
8009
|
};
|
|
7977
8010
|
({ ...BASE_LIVE_EGRESS_PROFILE }), { ...BASE_LIVE_EGRESS_PROFILE.video };
|
|
7978
|
-
({ ...BASE_LIVE_EGRESS_PROFILE });
|
|
8011
|
+
({ ...BASE_LIVE_EGRESS_PROFILE }), { ...BASE_LIVE_EGRESS_PROFILE.video };
|
|
7979
8012
|
/**
|
|
7980
8013
|
* Deep wiring healthcheck — snapshot of active reachability probes across
|
|
7981
8014
|
* every declared capability + widget of every installed plugin, on every
|
|
@@ -13039,6 +13072,16 @@ method(object({
|
|
|
13039
13072
|
filter: QueryFilterSchema.optional(),
|
|
13040
13073
|
columns: array(string()).readonly().optional()
|
|
13041
13074
|
}), array(SettingsRecordSchema).readonly()), method(object({
|
|
13075
|
+
namespace: string().optional(),
|
|
13076
|
+
collection: string(),
|
|
13077
|
+
/** Declared columns identifying the slot; must be covered by a UNIQUE
|
|
13078
|
+
* index on the collection. Never empty. */
|
|
13079
|
+
conflict: array(string()).readonly(),
|
|
13080
|
+
record: BulkRecordSchema
|
|
13081
|
+
}), object({
|
|
13082
|
+
/** The id the row HAS: assigned by SQLite on an insert, or the existing
|
|
13083
|
+
* row's own id on an update. */
|
|
13084
|
+
id: union([string(), number()]) }), { kind: "mutation" }), method(object({
|
|
13042
13085
|
namespace: string().optional(),
|
|
13043
13086
|
collection: string(),
|
|
13044
13087
|
record: object({
|
|
@@ -13173,6 +13216,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
|
|
|
13173
13216
|
id: union([string(), number()]) }), {
|
|
13174
13217
|
kind: "mutation",
|
|
13175
13218
|
auth: "admin"
|
|
13219
|
+
}), method(object({
|
|
13220
|
+
namespace: string().optional(),
|
|
13221
|
+
collection: string(),
|
|
13222
|
+
conflict: array(string()).readonly(),
|
|
13223
|
+
record: BulkRecordSchema
|
|
13224
|
+
}), object({ id: union([string(), number()]) }), {
|
|
13225
|
+
kind: "mutation",
|
|
13226
|
+
auth: "admin"
|
|
13176
13227
|
}), method(object({
|
|
13177
13228
|
namespace: string().optional(),
|
|
13178
13229
|
collection: string(),
|
|
@@ -19395,8 +19446,8 @@ var TrackPositionSchema = object({
|
|
|
19395
19446
|
var TrackSnapshotSchema = object({
|
|
19396
19447
|
timestamp: number(),
|
|
19397
19448
|
position: TrackPositionSchema,
|
|
19398
|
-
/**
|
|
19399
|
-
|
|
19449
|
+
/** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
|
|
19450
|
+
mediaId: number().int()
|
|
19400
19451
|
});
|
|
19401
19452
|
/**
|
|
19402
19453
|
* Normalized 0..1 trajectory envelope (min/max over every position bbox,
|
|
@@ -20000,14 +20051,14 @@ var ObjectEventSchema = object({
|
|
|
20000
20051
|
* pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
|
|
20001
20052
|
frameWidth: number().optional(),
|
|
20002
20053
|
frameHeight: number().optional(),
|
|
20003
|
-
/**
|
|
20004
|
-
|
|
20005
|
-
/** Design B:
|
|
20054
|
+
/** Media row id of the crop attached to this event (if any) — D482. */
|
|
20055
|
+
mediaId: number().int().optional(),
|
|
20056
|
+
/** Design B: media row id of the track's native-resolution key frame (the
|
|
20006
20057
|
* best-detection full frame). Resolve via the event-media data-plane
|
|
20007
|
-
* (`/addon/<addonId>/event-media/<
|
|
20058
|
+
* (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
|
|
20008
20059
|
* draws `bbox` over the native frame. Absent on legacy rows / non-decoded
|
|
20009
|
-
* sources — consumers fall back to `
|
|
20010
|
-
|
|
20060
|
+
* sources — consumers fall back to `mediaId` (the tight crop). */
|
|
20061
|
+
keyFrameMediaId: number().int().optional(),
|
|
20011
20062
|
/** Populated by B5 (recording playback URL for this event). */
|
|
20012
20063
|
mediaUrl: string().optional(),
|
|
20013
20064
|
/** The parent track's key-event importance [0,1], propagated to every object
|
|
@@ -20057,7 +20108,7 @@ var MediaFileKindEnum = _enum([
|
|
|
20057
20108
|
* hub-main's heap on the way past — for an `<img>` that would have cached it.
|
|
20058
20109
|
*
|
|
20059
20110
|
* `url` points at the `event-media` data plane
|
|
20060
|
-
* (`/addon/<addonId>/event-media/<
|
|
20111
|
+
* (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
|
|
20061
20112
|
* with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
|
|
20062
20113
|
* render a `?variant=thumb`, and streams. The hub gate in front of it requires
|
|
20063
20114
|
* a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
|
|
@@ -20065,10 +20116,13 @@ var MediaFileKindEnum = _enum([
|
|
|
20065
20116
|
* `data-plane-access.ts` for the rule and the one gap it does not close
|
|
20066
20117
|
* (per-device scoping).
|
|
20067
20118
|
*
|
|
20068
|
-
* The URL is built from the row's
|
|
20069
|
-
*
|
|
20119
|
+
* The URL is built from the row's own id, which since D482 says nothing about
|
|
20120
|
+
* the row's owner or kind — and that is the point. The published `kind` is not
|
|
20121
|
+
* the stored one (a track's face/plate crop is stored as `crop` under
|
|
20070
20122
|
* `('face'|'plate', '<prefix>-<trackId>')` and published as
|
|
20071
|
-
* `faceCrop`/`plateCrop
|
|
20123
|
+
* `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
|
|
20124
|
+
* taken from `row.key` verbatim or it 404'd exactly those two rows. An id
|
|
20125
|
+
* cannot be mis-reconstructed, because there is nothing in it to reconstruct.
|
|
20072
20126
|
*
|
|
20073
20127
|
* ## `base64` is TRANSITIONAL and is going away
|
|
20074
20128
|
*
|
|
@@ -20081,7 +20135,19 @@ var MediaFileKindEnum = _enum([
|
|
|
20081
20135
|
* `analytics-query-facade.ts`; nothing else reads it.
|
|
20082
20136
|
*/
|
|
20083
20137
|
var MediaFileSchema = object({
|
|
20084
|
-
|
|
20138
|
+
/**
|
|
20139
|
+
* The media row's OWN id — the rowid SQLite assigned it (D482).
|
|
20140
|
+
*
|
|
20141
|
+
* It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
|
|
20142
|
+
* [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
|
|
20143
|
+
* per-table rowid aliases, so `object:101314` and `motion:101314` are two
|
|
20144
|
+
* different rows that spell the same number, and a track whose
|
|
20145
|
+
* `bestEventId` was an object event was served a motion event's snapshot —
|
|
20146
|
+
* a night-time thumbnail on an afternoon track, with no error anywhere. A
|
|
20147
|
+
* surrogate id cannot name the wrong row's owner, because it names no owner
|
|
20148
|
+
* at all.
|
|
20149
|
+
*/
|
|
20150
|
+
mediaId: number().int(),
|
|
20085
20151
|
kind: MediaFileKindEnum,
|
|
20086
20152
|
sizeBytes: number(),
|
|
20087
20153
|
timestamp: number()
|
|
@@ -20189,7 +20255,7 @@ var RetrainTrackSchema = object({
|
|
|
20189
20255
|
});
|
|
20190
20256
|
/** A frame the picker may offer — an index row, no blob was read to produce it. */
|
|
20191
20257
|
var RetrainFrameCandidateSchema = object({
|
|
20192
|
-
|
|
20258
|
+
mediaId: number().int(),
|
|
20193
20259
|
kind: MediaFileKindEnum,
|
|
20194
20260
|
timestamp: number(),
|
|
20195
20261
|
sizeBytes: number().int(),
|
|
@@ -20203,7 +20269,7 @@ var RetrainFrameSchema = object({
|
|
|
20203
20269
|
deviceId: number(),
|
|
20204
20270
|
trackId: string(),
|
|
20205
20271
|
/** Provenance only. It may already point at nothing — that is expected. */
|
|
20206
|
-
|
|
20272
|
+
sourceMediaId: number().int(),
|
|
20207
20273
|
sourceKind: MediaFileKindEnum,
|
|
20208
20274
|
sizeBytes: number().int(),
|
|
20209
20275
|
width: number().int(),
|
|
@@ -20219,7 +20285,7 @@ var RetrainCopyRefusalSchema = _enum([
|
|
|
20219
20285
|
var RetrainFrameSelectionSchema = object({
|
|
20220
20286
|
copied: array(RetrainFrameSchema).readonly(),
|
|
20221
20287
|
refused: array(object({
|
|
20222
|
-
|
|
20288
|
+
sourceMediaId: number().int(),
|
|
20223
20289
|
reason: RetrainCopyRefusalSchema
|
|
20224
20290
|
})).readonly()
|
|
20225
20291
|
});
|
|
@@ -20227,7 +20293,7 @@ var RetrainFrameListSchema = object({
|
|
|
20227
20293
|
candidates: array(RetrainFrameCandidateSchema).readonly(),
|
|
20228
20294
|
copies: array(RetrainFrameSchema).readonly(),
|
|
20229
20295
|
/** What the page pre-selects — the native key frame when one survives. */
|
|
20230
|
-
|
|
20296
|
+
autoPickMediaId: number().int().optional()
|
|
20231
20297
|
});
|
|
20232
20298
|
/** What the operator asked the assist to look for. */
|
|
20233
20299
|
var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
|
|
@@ -20322,9 +20388,11 @@ var RecentTracksQueryInput = object({
|
|
|
20322
20388
|
});
|
|
20323
20389
|
/**
|
|
20324
20390
|
* A Summary (D359): the per-camera session envelope that references tracks.
|
|
20325
|
-
* `
|
|
20326
|
-
* served by the event-media plane
|
|
20327
|
-
* member visible has been materialised
|
|
20391
|
+
* `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
|
|
20392
|
+
* 'summary'`, served by the event-media plane at `/m/<id>`), null until the
|
|
20393
|
+
* first frame with a member visible has been materialised (D482 — it was the
|
|
20394
|
+
* row's composite key, which embedded the owner and could name another table's
|
|
20395
|
+
* row once event ids became per-table rowids).
|
|
20328
20396
|
*/
|
|
20329
20397
|
var SummarySchema = object({
|
|
20330
20398
|
id: string(),
|
|
@@ -20333,19 +20401,115 @@ var SummarySchema = object({
|
|
|
20333
20401
|
lastActiveAt: number(),
|
|
20334
20402
|
sealedAt: number().nullable(),
|
|
20335
20403
|
memberCount: number().int().nonnegative(),
|
|
20336
|
-
|
|
20404
|
+
groupShotMediaId: number().int().nullable()
|
|
20337
20405
|
});
|
|
20338
20406
|
var SummariesQueryInput = object({
|
|
20339
20407
|
deviceIds: array(number()).min(1),
|
|
20340
20408
|
since: number().optional(),
|
|
20341
20409
|
until: number().optional(),
|
|
20342
|
-
limit: number().int().min(1).max(200).default(50)
|
|
20410
|
+
limit: number().int().min(1).max(200).default(50),
|
|
20411
|
+
/** The same member-wise filter {@link listRecentSummaries} takes — one
|
|
20412
|
+
* meaning of "dog" on every summary surface. */
|
|
20413
|
+
classes: array(string().min(1).max(60)).max(40).optional()
|
|
20343
20414
|
});
|
|
20344
|
-
var SummariesPageSchema = object({ summaries: array(SummarySchema).readonly() });
|
|
20345
20415
|
var SummaryDetailSchema = object({
|
|
20346
20416
|
summary: SummarySchema,
|
|
20347
|
-
/**
|
|
20348
|
-
|
|
20417
|
+
/** Members in absorption order, oldest join first. */
|
|
20418
|
+
members: array(object({
|
|
20419
|
+
trackId: string(),
|
|
20420
|
+
/**
|
|
20421
|
+
* The track's class at the time it JOINED, or `null` when it was unresolved
|
|
20422
|
+
* and the track no longer exists to fill it.
|
|
20423
|
+
*
|
|
20424
|
+
* The join, not the latest opinion: class voting can re-decide a track's
|
|
20425
|
+
* class afterwards, and a group's composition is the history of who came
|
|
20426
|
+
* together. A consumer counts these to badge a thumbnail — "two people and a
|
|
20427
|
+
* dog" — rather than being handed a second, denormalised tally that would
|
|
20428
|
+
* drift from the members it claims to describe.
|
|
20429
|
+
*/
|
|
20430
|
+
className: string().nullable(),
|
|
20431
|
+
/** `primary` is the one member that carries the group's identity. */
|
|
20432
|
+
role: _enum([
|
|
20433
|
+
"primary",
|
|
20434
|
+
"sibling",
|
|
20435
|
+
"child"
|
|
20436
|
+
]).nullable(),
|
|
20437
|
+
joinedAt: number(),
|
|
20438
|
+
/** Tier 1 — the sub-class (`dog`, `van`), resolved from the member's track
|
|
20439
|
+
* at read time. Absent when nothing resolved, never an empty string. */
|
|
20440
|
+
label: string().optional(),
|
|
20441
|
+
/** Tier 2 — the instance: a person's name, a plate. Absent when the pipeline
|
|
20442
|
+
* recognised nobody, and absent for a member whose track has been pruned —
|
|
20443
|
+
* a thumbnail that names the wrong person is worse than one naming nobody. */
|
|
20444
|
+
subLabel: string().optional()
|
|
20445
|
+
})).readonly()
|
|
20446
|
+
});
|
|
20447
|
+
/**
|
|
20448
|
+
* What a LIST of groups carries: the envelope plus what it is MADE OF.
|
|
20449
|
+
*
|
|
20450
|
+
* Coarse on purpose — the operator's rule is "only the rough data on the list,
|
|
20451
|
+
* we extend when we notice we need more". Enough to draw the card ("two people
|
|
20452
|
+
* and a dog") and no more. The MEMBERS, their names and the per-member links
|
|
20453
|
+
* are on {@link getSummary}: shipping every member of every group so a client
|
|
20454
|
+
* can count them turns a page of two hundred groups into a thousand records to
|
|
20455
|
+
* draw two hundred badges.
|
|
20456
|
+
*/
|
|
20457
|
+
var SummaryListItemSchema = object({
|
|
20458
|
+
summary: SummarySchema,
|
|
20459
|
+
/** Class counts, most numerous first; `className: null` is a member whose
|
|
20460
|
+
* class never resolved, counted so the counts add up to `memberCount`. */
|
|
20461
|
+
classes: array(object({
|
|
20462
|
+
className: string().nullable(),
|
|
20463
|
+
count: number().int().positive()
|
|
20464
|
+
})).readonly()
|
|
20465
|
+
});
|
|
20466
|
+
var SummariesPageSchema = object({ summaries: array(SummaryListItemSchema).readonly() });
|
|
20467
|
+
/**
|
|
20468
|
+
* The paged feed, deliberately the SAME shape as {@link RecentTracksQueryInput}.
|
|
20469
|
+
*
|
|
20470
|
+
* The reel on the cameras page and the Events gallery both ride a cursor, so a
|
|
20471
|
+
* summaries feed that could only answer "the last N for these cameras"
|
|
20472
|
+
* (`listSummaries`) would make groups available in the timeline and nowhere
|
|
20473
|
+
* else. Two feeds with different ordering contracts would be two ideas of what
|
|
20474
|
+
* "newest" means, on one screen.
|
|
20475
|
+
*/
|
|
20476
|
+
var RecentSummariesQueryInput = object({
|
|
20477
|
+
/** Devices to merge. An empty array yields an empty page. */
|
|
20478
|
+
deviceIds: array(number()),
|
|
20479
|
+
/** Window lower bound on `lastActiveAt` (inclusive). */
|
|
20480
|
+
since: number().optional(),
|
|
20481
|
+
/** Window upper bound on `lastActiveAt` (inclusive). */
|
|
20482
|
+
until: number().optional(),
|
|
20483
|
+
limit: number().int().min(1).max(500).default(100),
|
|
20484
|
+
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
20485
|
+
cursor: string().optional(),
|
|
20486
|
+
/**
|
|
20487
|
+
* Restrict to these classes — THE SAME FIELD `listRecentTracks` takes, and
|
|
20488
|
+
* deliberately the same name: the events filter tree emits one list of ticked
|
|
20489
|
+
* taxonomy nodes, and a summaries feed that called it something else would
|
|
20490
|
+
* make the operator's one filter component produce two shapes.
|
|
20491
|
+
*
|
|
20492
|
+
* A question about the MEMBERS: a group matches when ANY of them does. "Show
|
|
20493
|
+
* me the arrivals with a dog" has to return the group of four people who had
|
|
20494
|
+
* one with them; a filter on the group's own fields could only ever answer
|
|
20495
|
+
* about its primary.
|
|
20496
|
+
*
|
|
20497
|
+
* Matched against all THREE tiers of a member — the class (`animal`), the
|
|
20498
|
+
* sub-class (`dog`) and the instance (a name, a plate) — because which tier a
|
|
20499
|
+
* ticked node lives on is the taxonomy's business, not the caller's. `dog` is
|
|
20500
|
+
* an event kind in the tree and a tier-1 label on an `animal` track; a filter
|
|
20501
|
+
* that read only the class would answer "animal" and never "dog".
|
|
20502
|
+
*
|
|
20503
|
+
* ABSENT or EMPTY means no filter — absent is not a selection of none.
|
|
20504
|
+
*/
|
|
20505
|
+
classes: array(string().min(1).max(60)).max(40).optional()
|
|
20506
|
+
});
|
|
20507
|
+
var RecentSummariesPageSchema = object({
|
|
20508
|
+
/** Ordered by (`lastActiveAt` DESC, id DESC). Same light item as
|
|
20509
|
+
* {@link listSummaries} — one list shape, so a card renders the same
|
|
20510
|
+
* whichever feed drew it. */
|
|
20511
|
+
summaries: array(SummaryListItemSchema).readonly(),
|
|
20512
|
+
nextCursor: string().nullable()
|
|
20349
20513
|
});
|
|
20350
20514
|
var RecentTracksPageSchema = object({
|
|
20351
20515
|
/** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
|
|
@@ -20759,7 +20923,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20759
20923
|
classes: array(string()).optional(),
|
|
20760
20924
|
/** See {@link ExcludeSourcesDoc}. */
|
|
20761
20925
|
excludeSources: array(TrackSourceSchema).optional()
|
|
20762
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(SummariesQueryInput, SummariesPageSchema), method(object({ id: string() }), SummaryDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
20926
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(SummariesQueryInput, SummariesPageSchema), method(RecentSummariesQueryInput, RecentSummariesPageSchema), method(object({ id: string() }), SummaryDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
20763
20927
|
kind: "mutation",
|
|
20764
20928
|
auth: "admin"
|
|
20765
20929
|
}), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({ deviceId: number() }), array(EventKindDescriptorSchema).readonly()), method(object({ deviceIds: array(number()).min(1).max(200) }), array(EventKindsForDeviceSchema).readonly()), method(object({
|
|
@@ -20887,7 +21051,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20887
21051
|
}), method(object({
|
|
20888
21052
|
deviceId: number(),
|
|
20889
21053
|
trackId: string(),
|
|
20890
|
-
|
|
21054
|
+
mediaIds: array(number().int()).min(1)
|
|
20891
21055
|
}), RetrainFrameSelectionSchema, {
|
|
20892
21056
|
kind: "mutation",
|
|
20893
21057
|
auth: "admin"
|
|
@@ -20955,7 +21119,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20955
21119
|
kind: "query",
|
|
20956
21120
|
auth: "admin"
|
|
20957
21121
|
}), method(object({
|
|
20958
|
-
|
|
21122
|
+
/** Which of the three event tables owns the row. */
|
|
21123
|
+
ownerType: EventOwnerTypeSchema,
|
|
21124
|
+
/** The event's rowid in that table (D474: an event id is a number). */
|
|
21125
|
+
eventId: number().int(),
|
|
20959
21126
|
kind: MediaFileKindEnum.optional(),
|
|
20960
21127
|
deviceId: number()
|
|
20961
21128
|
}), array(MediaFileSchema).readonly()), method(object({
|
|
@@ -20966,7 +21133,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20966
21133
|
trackId: string(),
|
|
20967
21134
|
deviceId: number()
|
|
20968
21135
|
}), array(MediaFileInfoSchema).readonly()), method(object({
|
|
20969
|
-
|
|
21136
|
+
ownerType: EventOwnerTypeSchema,
|
|
21137
|
+
eventId: number().int(),
|
|
20970
21138
|
deviceId: number()
|
|
20971
21139
|
}), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
|
|
20972
21140
|
kind: "mutation",
|
|
@@ -25429,8 +25597,8 @@ var IdentitySchema = object({
|
|
|
25429
25597
|
id: string(),
|
|
25430
25598
|
name: string(),
|
|
25431
25599
|
sampleCount: number().int().nonnegative(),
|
|
25432
|
-
|
|
25433
|
-
/** Inline base64 of the cover sample's crop, resolved from `
|
|
25600
|
+
coverMediaId: number().int().optional(),
|
|
25601
|
+
/** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
|
|
25434
25602
|
* Lets the UI render the person's face avatar instead of a placeholder icon. */
|
|
25435
25603
|
coverBase64: string().optional()
|
|
25436
25604
|
});
|
|
@@ -25456,8 +25624,8 @@ var IdentitySampleAuditRowSchema = object({
|
|
|
25456
25624
|
enrolledAt: number().int(),
|
|
25457
25625
|
deviceId: number().int().optional(),
|
|
25458
25626
|
source: _enum(["detected", "photo"]),
|
|
25459
|
-
/** The enrolled crop's media
|
|
25460
|
-
|
|
25627
|
+
/** The enrolled crop's media row id, so the panel can show the evidence. */
|
|
25628
|
+
mediaId: number().int().optional(),
|
|
25461
25629
|
/**
|
|
25462
25630
|
* False = the sample is stamped with a DIFFERENT face model, and a cosine
|
|
25463
25631
|
* across feature spaces is a well-formed float with no meaning. Every number
|
|
@@ -25526,15 +25694,15 @@ var FaceInfoSchema = object({
|
|
|
25526
25694
|
*/
|
|
25527
25695
|
cropUrl: string().optional(),
|
|
25528
25696
|
/** Design B: the face bbox (pixel space) on the key frame — lets a detail
|
|
25529
|
-
* view draw the box over the native `
|
|
25697
|
+
* view draw the box over the native `keyFrameMediaId` frame. Absent on
|
|
25530
25698
|
* legacy rows written before design B. */
|
|
25531
25699
|
faceBbox: BoundingBoxSchema.optional(),
|
|
25532
25700
|
/** Design B: MediaStore key of the track's native-resolution key frame.
|
|
25533
25701
|
* Fetch the native JPEG via the event-media data-plane
|
|
25534
|
-
* (`/addon/<addonId>/event-media/<
|
|
25702
|
+
* (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
|
|
25535
25703
|
* track produced no key frame (e.g. native/onboard source) — the UI falls
|
|
25536
25704
|
* back to the inline `base64` face crop. */
|
|
25537
|
-
|
|
25705
|
+
keyFrameMediaId: number().int().optional(),
|
|
25538
25706
|
/** Winning identity-match cosine (0..1) for this face's track, when an
|
|
25539
25707
|
* identity was auto-confirmed. Lets the UI surface WHY a face was assigned
|
|
25540
25708
|
* (confidence badge / low-confidence audit). Absent on legacy rows and on
|
|
@@ -25603,11 +25771,14 @@ var FaceClusterSchema = object({
|
|
|
25603
25771
|
* `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
|
|
25604
25772
|
* dialog already rendering its key FRAME from the `event-media` plane.
|
|
25605
25773
|
*
|
|
25606
|
-
* `url` is `/addon/<addonId>/event-media/<
|
|
25607
|
-
* media
|
|
25774
|
+
* `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
|
|
25775
|
+
* resolves a media row by its own id, so this needed no new plane and no new
|
|
25776
|
+
* access decision.
|
|
25608
25777
|
*/
|
|
25609
25778
|
var MediaFileLiteSchema$1 = object({
|
|
25610
|
-
|
|
25779
|
+
/** The media row's own id — the same address `MediaFileRef.mediaId` carries
|
|
25780
|
+
* (D482). It was the row's composite key, which embedded the owner. */
|
|
25781
|
+
mediaId: number().int(),
|
|
25611
25782
|
kind: string(),
|
|
25612
25783
|
url: string(),
|
|
25613
25784
|
sizeBytes: number(),
|
|
@@ -25624,7 +25795,7 @@ method(object({
|
|
|
25624
25795
|
* covers inline, ~10 KB of base64 per row, on a query this UI mounts
|
|
25625
25796
|
* four times and the viewer holds at `staleTime: 30_000`.
|
|
25626
25797
|
*
|
|
25627
|
-
* Nothing loses its avatar: `
|
|
25798
|
+
* Nothing loses its avatar: `coverMediaId` is already on every row and
|
|
25628
25799
|
* the `event-media` plane serves that key `immutable` with an ETag.
|
|
25629
25800
|
*
|
|
25630
25801
|
* **This is an INPUT field, so it does not reach the addon until the
|
|
@@ -28092,8 +28263,8 @@ var VehicleSchema = object({
|
|
|
28092
28263
|
id: string(),
|
|
28093
28264
|
name: string(),
|
|
28094
28265
|
sampleCount: number().int().nonnegative(),
|
|
28095
|
-
|
|
28096
|
-
/** Inline base64 of the cover sample's plate crop, resolved from `
|
|
28266
|
+
coverMediaId: number().int().optional(),
|
|
28267
|
+
/** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
|
|
28097
28268
|
coverBase64: string().optional()
|
|
28098
28269
|
});
|
|
28099
28270
|
var VehicleSampleInfoSchema = object({
|
|
@@ -28126,7 +28297,7 @@ var PlateInfoSchema = object({
|
|
|
28126
28297
|
/** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
|
|
28127
28298
|
plateBbox: BoundingBoxSchema.optional(),
|
|
28128
28299
|
/** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
|
|
28129
|
-
|
|
28300
|
+
keyFrameMediaId: number().int().optional(),
|
|
28130
28301
|
base64: string().optional(),
|
|
28131
28302
|
/**
|
|
28132
28303
|
* Same crop as a data-plane URL, always present when the plate has a stored
|
|
@@ -28147,11 +28318,14 @@ var PlateInfoSchema = object({
|
|
|
28147
28318
|
* `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
|
|
28148
28319
|
* dialog already rendering its key FRAME from the `event-media` plane.
|
|
28149
28320
|
*
|
|
28150
|
-
* `url` is `/addon/<addonId>/event-media/<
|
|
28151
|
-
* media
|
|
28321
|
+
* `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
|
|
28322
|
+
* resolves a media row by its own id, so this needed no new plane and no new
|
|
28323
|
+
* access decision.
|
|
28152
28324
|
*/
|
|
28153
28325
|
var MediaFileLiteSchema = object({
|
|
28154
|
-
|
|
28326
|
+
/** The media row's own id — the same address `MediaFileRef.mediaId` carries
|
|
28327
|
+
* (D482). It was the row's composite key, which embedded the owner. */
|
|
28328
|
+
mediaId: number().int(),
|
|
28155
28329
|
kind: string(),
|
|
28156
28330
|
url: string(),
|
|
28157
28331
|
sizeBytes: number(),
|
|
@@ -28210,7 +28384,7 @@ method(object({
|
|
|
28210
28384
|
}), method(object({
|
|
28211
28385
|
/** Inline {@link VehicleSchema.coverBase64} on every row. Default
|
|
28212
28386
|
* `false` — the vehicle twin of `faceGallery.listIdentities`'s
|
|
28213
|
-
* option; `
|
|
28387
|
+
* option; `coverMediaId` + the `event-media` plane carry the picture.
|
|
28214
28388
|
* INPUT field: stripped by the hub router until the train ships, which
|
|
28215
28389
|
* resolves to `false` and is exactly the intended default. */
|
|
28216
28390
|
includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
|
|
@@ -29534,7 +29708,14 @@ var SceneReferenceSchema = object({
|
|
|
29534
29708
|
modelId: string(),
|
|
29535
29709
|
condition: SceneConditionSchema,
|
|
29536
29710
|
capturedAt: number(),
|
|
29537
|
-
|
|
29711
|
+
/**
|
|
29712
|
+
* The reference thumbnail's media ROW id (D482).
|
|
29713
|
+
*
|
|
29714
|
+
* The name already said `mediaId` while the value was the row's composite
|
|
29715
|
+
* key — a leftover that read as done and was not. It is the row's own id
|
|
29716
|
+
* now, addressed at `/addon/<addonId>/event-media/m/<id>`.
|
|
29717
|
+
*/
|
|
29718
|
+
thumbnailMediaId: number().int().optional(),
|
|
29538
29719
|
/** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
|
|
29539
29720
|
* anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
|
|
29540
29721
|
* normalized rect frame a different piece of world, and the scene would
|
|
@@ -30348,7 +30529,29 @@ var LoggingSettingsPatchSchema = object({
|
|
|
30348
30529
|
* disarmed the channels it did not mention would make the Levels page and
|
|
30349
30530
|
* the Diagnostics page fight over the same value.
|
|
30350
30531
|
*/
|
|
30351
|
-
channels: array(LogChannelWindowPatchSchema).readonly().optional()
|
|
30532
|
+
channels: array(LogChannelWindowPatchSchema).readonly().optional(),
|
|
30533
|
+
/**
|
|
30534
|
+
* How many days the analytics OPS LOG is kept — the audit trail of what
|
|
30535
|
+
* retention actually deleted.
|
|
30536
|
+
*
|
|
30537
|
+
* It lives HERE, on the logging document, and not on the analytics addon's
|
|
30538
|
+
* settings form, on the operator's instruction: every other log-ish window in
|
|
30539
|
+
* this system is configured through this one document, and a retention audit
|
|
30540
|
+
* configured somewhere else is a second place to look when the question is
|
|
30541
|
+
* "what happened to my data".
|
|
30542
|
+
*
|
|
30543
|
+
* That placement has a cost worth stating: this document ships in the
|
|
30544
|
+
* framework closure, so this knob needs a published `@camstack/server` while
|
|
30545
|
+
* the four windows beside it (D485) reach a node on `camstack deploy`.
|
|
30546
|
+
*
|
|
30547
|
+
* `retention-model.ts` argued this one must NOT follow a device window,
|
|
30548
|
+
* because the audit trail is the history of the SWEEP and not of the camera.
|
|
30549
|
+
* That argument stands and is untouched — what changes is that 30 days stops
|
|
30550
|
+
* being a constant nobody can reach. `0` keeps it forever. The floor is 1 day
|
|
30551
|
+
* rather than 0-as-delete: an audit log truncated to nothing is precisely the
|
|
30552
|
+
* state in which the next 9.5 GiB leak cannot be explained.
|
|
30553
|
+
*/
|
|
30554
|
+
opsLogRetentionDays: number().int().min(0).max(3650).optional()
|
|
30352
30555
|
});
|
|
30353
30556
|
/**
|
|
30354
30557
|
* Which LAYER of the hierarchy is addressed. Absent = the cluster layer.
|
|
@@ -30421,6 +30624,14 @@ var LoggingSettingsStateSchema = object({
|
|
|
30421
30624
|
channels: array(LogChannelDescriptorSchema).readonly(),
|
|
30422
30625
|
/** The channels ARMED right now, each with its deadline. */
|
|
30423
30626
|
activeChannels: array(LogChannelWindowStateSchema).readonly(),
|
|
30627
|
+
/**
|
|
30628
|
+
* The ops-log window in days, as it is in force. `0` = kept forever.
|
|
30629
|
+
*
|
|
30630
|
+
* Reported rather than left to the caller's memory of what it wrote: this is
|
|
30631
|
+
* the value the analytics sweep will actually use, and an operator asking how
|
|
30632
|
+
* long their audit trail lives should not have to infer it from a default.
|
|
30633
|
+
*/
|
|
30634
|
+
opsLogRetentionDays: number().int().min(0),
|
|
30424
30635
|
persisted: boolean()
|
|
30425
30636
|
});
|
|
30426
30637
|
method(_void(), FeatureManifestSchema), method(_void(), HealthStatusSchema), method(_void(), FeatureManifestSchema), method(_void(), array(NetworkAddressSchema).readonly()), method(_void(), unknown().nullable(), { auth: "admin" }), method(record(string(), unknown()), _null(), {
|
|
@@ -30982,7 +31193,7 @@ var StationaryObjectSchema = object({
|
|
|
30982
31193
|
/** Enrichment label carried from the source track (identity / plate). */
|
|
30983
31194
|
label: string().optional(),
|
|
30984
31195
|
/** Native-resolution key-frame media key for the parked object's best image. */
|
|
30985
|
-
|
|
31196
|
+
keyFrameMediaId: number().int().optional()
|
|
30986
31197
|
});
|
|
30987
31198
|
var CameraOccupancySnapshotSchema = object({
|
|
30988
31199
|
/** Frame timestamp of the inference result that produced this snapshot. */
|
|
@@ -32138,6 +32349,12 @@ Object.freeze({
|
|
|
32138
32349
|
addonId: null,
|
|
32139
32350
|
access: "create"
|
|
32140
32351
|
},
|
|
32352
|
+
"dataStoreProvider.upsert": {
|
|
32353
|
+
capName: "data-store-provider",
|
|
32354
|
+
capScope: "system",
|
|
32355
|
+
addonId: null,
|
|
32356
|
+
access: "create"
|
|
32357
|
+
},
|
|
32141
32358
|
"dayNight.getOptions": {
|
|
32142
32359
|
capName: "day-night",
|
|
32143
32360
|
capScope: "device",
|
|
@@ -34574,6 +34791,12 @@ Object.freeze({
|
|
|
34574
34791
|
addonId: null,
|
|
34575
34792
|
access: "view"
|
|
34576
34793
|
},
|
|
34794
|
+
"pipelineAnalytics.listRecentSummaries": {
|
|
34795
|
+
capName: "pipeline-analytics",
|
|
34796
|
+
capScope: "device",
|
|
34797
|
+
addonId: null,
|
|
34798
|
+
access: "view"
|
|
34799
|
+
},
|
|
34577
34800
|
"pipelineAnalytics.listRecentTracks": {
|
|
34578
34801
|
capName: "pipeline-analytics",
|
|
34579
34802
|
capScope: "device",
|
|
@@ -36002,6 +36225,12 @@ Object.freeze({
|
|
|
36002
36225
|
addonId: null,
|
|
36003
36226
|
access: "create"
|
|
36004
36227
|
},
|
|
36228
|
+
"settingsStore.upsert": {
|
|
36229
|
+
capName: "settings-store",
|
|
36230
|
+
capScope: "system",
|
|
36231
|
+
addonId: null,
|
|
36232
|
+
access: "create"
|
|
36233
|
+
},
|
|
36005
36234
|
"smtpProvider.getStatus": {
|
|
36006
36235
|
capName: "smtp-provider",
|
|
36007
36236
|
capScope: "system",
|
|
@@ -38395,6 +38624,11 @@ Object.freeze({
|
|
|
38395
38624
|
form: "single",
|
|
38396
38625
|
optional: true
|
|
38397
38626
|
}],
|
|
38627
|
+
"pipelineAnalytics.listRecentSummaries": [{
|
|
38628
|
+
name: "deviceIds",
|
|
38629
|
+
form: "array",
|
|
38630
|
+
optional: false
|
|
38631
|
+
}],
|
|
38398
38632
|
"pipelineAnalytics.listRecentTracks": [{
|
|
38399
38633
|
name: "deviceIds",
|
|
38400
38634
|
form: "array",
|