@camstack/addon-admin-ui 1.1.56 → 1.1.58
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/assets/{AddLocationWizard-BS_sw-yb.js → AddLocationWizard-CVNjYxtc.js} +1 -1
- package/dist/assets/{AddonCollectionPage-B83rtm_P.js → AddonCollectionPage-ocTXpvOZ.js} +1 -1
- package/dist/assets/Addons-7Vjs9zfK.js +1 -0
- package/dist/assets/{AdminTabs-CGgxIyjn.js → AdminTabs-ti8-1m5K.js} +1 -1
- package/dist/assets/{AiProfiles-BiwHduY5.js → AiProfiles-CrEp6OFD.js} +1 -1
- package/dist/assets/{BrokerForm-Ce54Djz4.js → BrokerForm-DtpQ8uTP.js} +1 -1
- package/dist/assets/{Capabilities-B5IxdwuN.js → Capabilities-t4Kv7n1W.js} +1 -1
- package/dist/assets/{CapabilityBadges-3XeZhtSI.js → CapabilityBadges-mdL66YzR.js} +1 -1
- package/dist/assets/{Cluster-D8rUWJST.js → Cluster-Cm9cMLcE.js} +1 -1
- package/dist/assets/{ClusterRecordingTab-DX9aLngj.js → ClusterRecordingTab-CaOKHEeI.js} +1 -1
- package/dist/assets/{Dashboard-BblDjLKn.js → Dashboard-CpYJcmr_.js} +1 -1
- package/dist/assets/{Data-CdLaMkIJ.js → Data-4IVm8wg4.js} +1 -1
- package/dist/assets/{DetectionIntelligence-D6i0W6kk.js → DetectionIntelligence-BdB98iCp.js} +1 -1
- package/dist/assets/DeviceDetail-CQyDvbFg.js +2 -0
- package/dist/assets/{Devices-x_UPdIGK.js → Devices-C_6aVGD7.js} +1 -1
- package/dist/assets/{EmbedPlayerPage-Buxyv9Ar.js → EmbedPlayerPage-CcGFTaVD.js} +1 -1
- package/dist/assets/Events-DaR_UKkQ.js +1 -0
- package/dist/assets/{FormBuilder-iTpxBqBc.js → FormBuilder-Dc0ym63B.js} +1 -1
- package/dist/assets/Identity-DJyNRncE.js +1 -0
- package/dist/assets/IntegrationDetail-BM--jjoS.js +1 -0
- package/dist/assets/{Integrations-BDJ1xxLY.js → Integrations-Cf9xW5df.js} +1 -1
- package/dist/assets/{Integrations-CV1KBLOI.js → Integrations-DzxZVoSV.js} +1 -1
- package/dist/assets/{Logs-ErbjBqie.js → Logs-CcOsniV2.js} +1 -1
- package/dist/assets/{MotionZonesSettings-BMPiTO3l.js → MotionZonesSettings-CokOBQSP.js} +1 -1
- package/dist/assets/{MyAccess-DTt40JO0.js → MyAccess-CX_ow6J1.js} +1 -1
- package/dist/assets/Network-DUc2RoeT.js +1 -0
- package/dist/assets/{NodeAddonsSettingsPanel-CFXh9ESA.js → NodeAddonsSettingsPanel-9-LKLy9X.js} +1 -1
- package/dist/assets/{NotificationTargets-Dgs05HjS.js → NotificationTargets-BhtcVTrY.js} +1 -1
- package/dist/assets/Pipeline-DovdUqqp.js +1 -0
- package/dist/assets/{Plates-B_BVouJR.js → Plates-CGw20xsK.js} +1 -1
- package/dist/assets/{PrivacyMaskSettings-DSSEqXHi.js → PrivacyMaskSettings-6vOAMZvp.js} +1 -1
- package/dist/assets/{ProviderIcon-BeZnXEB7.js → ProviderIcon-B3eTSPH9.js} +1 -1
- package/dist/assets/Recordings-B_jTro7W.js +1 -0
- package/dist/assets/{ScanNetworkModal-C_pd8W_5.js → ScanNetworkModal-BXLlQxmE.js} +1 -1
- package/dist/assets/{Settings-Cg4clEYW.js → Settings-ciNE8s7I.js} +1 -1
- package/dist/assets/{Showroom-DQuD1mwE.js → Showroom-DZhEfAVz.js} +1 -1
- package/dist/assets/{_virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-DqSIGxiA.js → _virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-WPoOdk8K.js} +1 -1
- package/dist/assets/{build-cluster-graph-D36_rlRB.js → build-cluster-graph-DF6vXFuz.js} +2 -2
- package/dist/assets/circle-check-big-CpW47sKH.js +1 -0
- package/dist/assets/clock-B2DLn9V8.js +1 -0
- package/dist/assets/{copy-DAnlpNmN.js → copy-CTAB7ETk.js} +1 -1
- package/dist/assets/{debounced-invalidate-DkqNPsSh.js → debounced-invalidate-BO1jeGCV.js} +1 -1
- package/dist/assets/{dist-Ck-SkmF_.js → dist-DfX3QEHj.js} +1 -1
- package/dist/assets/dist-hBxf_PpM.js +7 -0
- package/dist/assets/{download-CTO2YqfN.js → download-BUxKBqKH.js} +1 -1
- package/dist/assets/{face-bbox-Ctmu8UoI.js → face-bbox-CMdVS6x4.js} +1 -1
- package/dist/assets/{hostInit-DRnXHdHY.js → hostInit-YBm54NBK.js} +1 -1
- package/dist/assets/index-bh7u7Hyq.js +4 -0
- package/dist/assets/{key-round-DY-W0ctm.js → key-round-uhUyoLEA.js} +1 -1
- package/dist/assets/{mf-entry-bootstrap-0-64545043.js → mf-entry-bootstrap-0-d890d3a5.js} +2 -2
- package/dist/assets/{pencil-fohpLhWe.js → pencil-DvE-pDJv.js} +1 -1
- package/dist/assets/{player-overlays-CDSEY_-X.js → player-overlays-Xmuz6PYc.js} +1 -1
- package/dist/assets/plus-ZqwElRGO.js +1 -0
- package/dist/assets/{radio-CCbXLtig.js → radio-Bb4Ca-oO.js} +1 -1
- package/dist/assets/{refresh-cw-7j7eJ_7S.js → refresh-cw-wdTE-h5_.js} +1 -1
- package/dist/assets/remoteEntry-DaFl2uRt.js +1 -0
- package/dist/assets/{rotate-ccw-DVTmMtl2.js → rotate-ccw-BQvhpDZw.js} +1 -1
- package/dist/assets/rotate-cw-D3gOk0zM.js +1 -0
- package/dist/assets/search-DfF0SYZN.js +1 -0
- package/dist/assets/{send-CyaRM2HU.js → send-QP1-cyTt.js} +1 -1
- package/dist/assets/{server-BxecI2el.js → server-DduF17Ok.js} +1 -1
- package/dist/assets/square-Bj4oAYL4.js +1 -0
- package/dist/assets/{square-check-big-BsYa2Tzh.js → square-check-big-dYbuq7N5.js} +1 -1
- package/dist/assets/src-BXsSzH8t.js +67 -0
- package/dist/assets/src-Cghq8X9g.js +7 -0
- package/dist/assets/{upload-CYB5H427.js → upload-CBWYeFKA.js} +1 -1
- package/dist/assets/useDevice-CPjIwHzA.js +1 -0
- package/dist/assets/{useEventInvalidation-DtNYz-2H.js → useEventInvalidation-DyNr0T5f.js} +1 -1
- package/dist/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-DtiKhSUE.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-BXXE9AlJ.js} +2 -2
- package/dist/assets/{wifi-D9-_VL0_.js → wifi-BGDzRUYW.js} +1 -1
- package/dist/assets/{zap-WiUYl_aC.js → zap-IAmUubjw.js} +1 -1
- package/dist/index.html +5 -5
- package/dist/server/addon.js +512 -3
- package/package.json +1 -1
- package/dist/assets/Addons-CVIk8bKA.js +0 -1
- package/dist/assets/DeviceDetail-BYfQe_30.js +0 -2
- package/dist/assets/Events-CDDnJ01Z.js +0 -1
- package/dist/assets/Identity-DH41lSfX.js +0 -1
- package/dist/assets/IntegrationDetail-CR5AD5vO.js +0 -1
- package/dist/assets/Network-CyPbysr8.js +0 -1
- package/dist/assets/Pipeline-Dsx-nB1p.js +0 -1
- package/dist/assets/Recordings-H8TXnxuf.js +0 -1
- package/dist/assets/circle-check-big-DOCODmhZ.js +0 -1
- package/dist/assets/clock-D2H-Andr.js +0 -1
- package/dist/assets/dist-DZmXEoJH.js +0 -7
- package/dist/assets/index-BVO5AjpN.js +0 -4
- package/dist/assets/plus-CWmuK222.js +0 -1
- package/dist/assets/remoteEntry-BB2jugOV.js +0 -1
- package/dist/assets/rotate-cw-Dl9N7lTh.js +0 -1
- package/dist/assets/search-DvkKd5B0.js +0 -1
- package/dist/assets/square-CzYy8xOt.js +0 -1
- package/dist/assets/src-DNVzx9ag.js +0 -7
- package/dist/assets/src-P2A2VEVG.js +0 -67
- package/dist/assets/useDevice-BskeVR-e.js +0 -1
package/dist/server/addon.js
CHANGED
|
@@ -7338,6 +7338,62 @@ var RecordingConfigSchema = object({
|
|
|
7338
7338
|
scrubThumbnails: ScrubThumbnailPresetSchema.optional()
|
|
7339
7339
|
});
|
|
7340
7340
|
/**
|
|
7341
|
+
* Ops-log — the durable, append-only operations audit shared by the
|
|
7342
|
+
* recordings and events management surfaces.
|
|
7343
|
+
*
|
|
7344
|
+
* ONE row shape is reused for both domains so a single "Activity" view can
|
|
7345
|
+
* merge the recorder's DurableState ring (recordings ops-log) and the
|
|
7346
|
+
* pipeline-analytics SQLite collection (events ops-log). Each row records a
|
|
7347
|
+
* management operation, WHY it ran (reason), and its measurable effect
|
|
7348
|
+
* (itemsAffected + bytesReclaimed). Writes are best-effort — a failed log must
|
|
7349
|
+
* never fail the operation it records.
|
|
7350
|
+
*/
|
|
7351
|
+
/** Which management domain the operation belongs to. */
|
|
7352
|
+
var OpsLogDomainSchema = _enum(["recording", "events"]);
|
|
7353
|
+
/** The kind of management operation performed. */
|
|
7354
|
+
var OpsLogOpSchema = _enum([
|
|
7355
|
+
"prune",
|
|
7356
|
+
"manual-delete",
|
|
7357
|
+
"rescan",
|
|
7358
|
+
"retention-run"
|
|
7359
|
+
]);
|
|
7360
|
+
/** Why the operation ran. */
|
|
7361
|
+
var OpsLogReasonSchema = _enum([
|
|
7362
|
+
"retention",
|
|
7363
|
+
"quota",
|
|
7364
|
+
"manual",
|
|
7365
|
+
"operator"
|
|
7366
|
+
]);
|
|
7367
|
+
/** One audit row, shared verbatim by both domains. */
|
|
7368
|
+
var OpsLogEntrySchema = object({
|
|
7369
|
+
/** Unique row id. */
|
|
7370
|
+
id: string(),
|
|
7371
|
+
/** Epoch ms the operation completed. */
|
|
7372
|
+
at: number(),
|
|
7373
|
+
domain: OpsLogDomainSchema,
|
|
7374
|
+
op: OpsLogOpSchema,
|
|
7375
|
+
reason: OpsLogReasonSchema,
|
|
7376
|
+
/** The camera the op targeted; null for a cluster/global op. */
|
|
7377
|
+
deviceId: number().nullable(),
|
|
7378
|
+
/** Node that performed the op (the log carries nodeId — no cross-node aggregation). */
|
|
7379
|
+
nodeId: string(),
|
|
7380
|
+
/** Buckets / rows deleted (op-specific unit). */
|
|
7381
|
+
itemsAffected: number(),
|
|
7382
|
+
/** Bytes reclaimed by the op (0 when not measurable). */
|
|
7383
|
+
bytesReclaimed: number(),
|
|
7384
|
+
/** Free-text detail (e.g. "floor moved to <ts>"); null when none. */
|
|
7385
|
+
detail: string().nullable(),
|
|
7386
|
+
/** Who/what triggered the op. */
|
|
7387
|
+
actor: string()
|
|
7388
|
+
});
|
|
7389
|
+
/** Shared query input for the per-domain `listOpsLog` cap methods. */
|
|
7390
|
+
var OpsLogQueryInputSchema = object({
|
|
7391
|
+
/** Restrict to a single camera; omit for every row. */
|
|
7392
|
+
deviceId: number().optional(),
|
|
7393
|
+
/** Max rows returned, newest-first. */
|
|
7394
|
+
limit: number().int().min(1).max(1e3).optional()
|
|
7395
|
+
});
|
|
7396
|
+
/**
|
|
7341
7397
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
7342
7398
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
7343
7399
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -7581,6 +7637,160 @@ var EncodeProfileSchema = object({
|
|
|
7581
7637
|
*/
|
|
7582
7638
|
outputArgs: array(string()).optional()
|
|
7583
7639
|
});
|
|
7640
|
+
var COCO_TO_MACRO = {
|
|
7641
|
+
mapping: {
|
|
7642
|
+
person: "person",
|
|
7643
|
+
bicycle: "vehicle",
|
|
7644
|
+
car: "vehicle",
|
|
7645
|
+
motorcycle: "vehicle",
|
|
7646
|
+
airplane: "vehicle",
|
|
7647
|
+
bus: "vehicle",
|
|
7648
|
+
train: "vehicle",
|
|
7649
|
+
truck: "vehicle",
|
|
7650
|
+
boat: "vehicle",
|
|
7651
|
+
bird: "animal",
|
|
7652
|
+
cat: "animal",
|
|
7653
|
+
dog: "animal",
|
|
7654
|
+
horse: "animal",
|
|
7655
|
+
sheep: "animal",
|
|
7656
|
+
cow: "animal",
|
|
7657
|
+
elephant: "animal",
|
|
7658
|
+
bear: "animal",
|
|
7659
|
+
zebra: "animal",
|
|
7660
|
+
giraffe: "animal",
|
|
7661
|
+
suitcase: "package",
|
|
7662
|
+
backpack: "package",
|
|
7663
|
+
handbag: "package"
|
|
7664
|
+
},
|
|
7665
|
+
preserveOriginal: false
|
|
7666
|
+
};
|
|
7667
|
+
var AUDIO_MACRO_LABELS = [
|
|
7668
|
+
{
|
|
7669
|
+
id: "speech",
|
|
7670
|
+
name: "Speech",
|
|
7671
|
+
icon: "🗣️"
|
|
7672
|
+
},
|
|
7673
|
+
{
|
|
7674
|
+
id: "scream",
|
|
7675
|
+
name: "Scream / Shout",
|
|
7676
|
+
icon: "😱"
|
|
7677
|
+
},
|
|
7678
|
+
{
|
|
7679
|
+
id: "crying",
|
|
7680
|
+
name: "Crying / Baby",
|
|
7681
|
+
icon: "😢"
|
|
7682
|
+
},
|
|
7683
|
+
{
|
|
7684
|
+
id: "laughter",
|
|
7685
|
+
name: "Laughter",
|
|
7686
|
+
icon: "😂"
|
|
7687
|
+
},
|
|
7688
|
+
{
|
|
7689
|
+
id: "music",
|
|
7690
|
+
name: "Music",
|
|
7691
|
+
icon: "🎵"
|
|
7692
|
+
},
|
|
7693
|
+
{
|
|
7694
|
+
id: "dog",
|
|
7695
|
+
name: "Dog",
|
|
7696
|
+
icon: "🐕"
|
|
7697
|
+
},
|
|
7698
|
+
{
|
|
7699
|
+
id: "cat",
|
|
7700
|
+
name: "Cat",
|
|
7701
|
+
icon: "🐈"
|
|
7702
|
+
},
|
|
7703
|
+
{
|
|
7704
|
+
id: "bird",
|
|
7705
|
+
name: "Bird",
|
|
7706
|
+
icon: "🐦"
|
|
7707
|
+
},
|
|
7708
|
+
{
|
|
7709
|
+
id: "animal",
|
|
7710
|
+
name: "Animal (other)",
|
|
7711
|
+
icon: "🐾"
|
|
7712
|
+
},
|
|
7713
|
+
{
|
|
7714
|
+
id: "alarm",
|
|
7715
|
+
name: "Alarm / Siren",
|
|
7716
|
+
icon: "🚨"
|
|
7717
|
+
},
|
|
7718
|
+
{
|
|
7719
|
+
id: "doorbell",
|
|
7720
|
+
name: "Doorbell / Knock",
|
|
7721
|
+
icon: "🔔"
|
|
7722
|
+
},
|
|
7723
|
+
{
|
|
7724
|
+
id: "glass_breaking",
|
|
7725
|
+
name: "Glass Breaking",
|
|
7726
|
+
icon: "💥"
|
|
7727
|
+
},
|
|
7728
|
+
{
|
|
7729
|
+
id: "gunshot",
|
|
7730
|
+
name: "Gunshot / Explosion",
|
|
7731
|
+
icon: "💣"
|
|
7732
|
+
},
|
|
7733
|
+
{
|
|
7734
|
+
id: "vehicle",
|
|
7735
|
+
name: "Vehicle",
|
|
7736
|
+
icon: "🚗"
|
|
7737
|
+
},
|
|
7738
|
+
{
|
|
7739
|
+
id: "siren",
|
|
7740
|
+
name: "Emergency Siren",
|
|
7741
|
+
icon: "🚑"
|
|
7742
|
+
},
|
|
7743
|
+
{
|
|
7744
|
+
id: "fire",
|
|
7745
|
+
name: "Fire / Smoke",
|
|
7746
|
+
icon: "🔥"
|
|
7747
|
+
},
|
|
7748
|
+
{
|
|
7749
|
+
id: "water",
|
|
7750
|
+
name: "Water",
|
|
7751
|
+
icon: "💧"
|
|
7752
|
+
},
|
|
7753
|
+
{
|
|
7754
|
+
id: "wind",
|
|
7755
|
+
name: "Wind / Weather",
|
|
7756
|
+
icon: "🌬️"
|
|
7757
|
+
},
|
|
7758
|
+
{
|
|
7759
|
+
id: "door",
|
|
7760
|
+
name: "Door",
|
|
7761
|
+
icon: "🚪"
|
|
7762
|
+
},
|
|
7763
|
+
{
|
|
7764
|
+
id: "footsteps",
|
|
7765
|
+
name: "Footsteps",
|
|
7766
|
+
icon: "👣"
|
|
7767
|
+
},
|
|
7768
|
+
{
|
|
7769
|
+
id: "crowd",
|
|
7770
|
+
name: "Crowd / Chatter",
|
|
7771
|
+
icon: "👥"
|
|
7772
|
+
},
|
|
7773
|
+
{
|
|
7774
|
+
id: "telephone",
|
|
7775
|
+
name: "Telephone",
|
|
7776
|
+
icon: "📞"
|
|
7777
|
+
},
|
|
7778
|
+
{
|
|
7779
|
+
id: "engine",
|
|
7780
|
+
name: "Engine / Motor",
|
|
7781
|
+
icon: "⚙️"
|
|
7782
|
+
},
|
|
7783
|
+
{
|
|
7784
|
+
id: "tools",
|
|
7785
|
+
name: "Tools / Construction",
|
|
7786
|
+
icon: "🔨"
|
|
7787
|
+
},
|
|
7788
|
+
{
|
|
7789
|
+
id: "silence",
|
|
7790
|
+
name: "Silence",
|
|
7791
|
+
icon: "🤫"
|
|
7792
|
+
}
|
|
7793
|
+
];
|
|
7584
7794
|
var YAMNET_TO_MACRO = {
|
|
7585
7795
|
mapping: {
|
|
7586
7796
|
Speech: "speech",
|
|
@@ -7847,6 +8057,125 @@ var _macroLookup = /* @__PURE__ */ new Map();
|
|
|
7847
8057
|
for (const [k, v] of Object.entries(YAMNET_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
|
|
7848
8058
|
for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
|
|
7849
8059
|
/**
|
|
8060
|
+
* Unified event-kind taxonomy — THE single source of truth for
|
|
8061
|
+
* `kind → { parentKind, category, level, color, iconId, labelKey, label,
|
|
8062
|
+
* icon }`.
|
|
8063
|
+
*
|
|
8064
|
+
* This dictionary folds together what used to be scattered across four
|
|
8065
|
+
* copies:
|
|
8066
|
+
* - `capabilities/sensor-event-kinds.ts` (sensor cap colors)
|
|
8067
|
+
* - `addon-post-analysis/.../services/event-kinds.ts`
|
|
8068
|
+
* (MOTION/PERSON/VEHICLE… _COLOR constants)
|
|
8069
|
+
* - `ui-library/composites/detection-colors.ts` (CLASS_COLORS)
|
|
8070
|
+
* - `addon-post-analysis/shared/frame/box-drawer.ts` (DEFAULT_COLOR)
|
|
8071
|
+
* - the COCO / audio class maps (macro ↔ sub relationships)
|
|
8072
|
+
*
|
|
8073
|
+
* The DATA (serializable — color/iconId/labelKey/parentKind) lives here in
|
|
8074
|
+
* `@camstack/types`. The UI-side mapping `iconId → lucide component` and
|
|
8075
|
+
* `labelKey → t()` lives in `@camstack/ui-library`. UIs never hardcode a
|
|
8076
|
+
* color or an icon: they read this dictionary (server descriptors carry the
|
|
8077
|
+
* fields inline; the client resolves color/icon/label from `iconId`/`kind`).
|
|
8078
|
+
*
|
|
8079
|
+
* Two levels only (v1 YAGNI): macro → sub. `person` is a leaf macro.
|
|
8080
|
+
*/
|
|
8081
|
+
var TAXONOMY_COLORS = {
|
|
8082
|
+
motion: "#f59e0b",
|
|
8083
|
+
audio: "#06b6d4",
|
|
8084
|
+
person: "#22c55e",
|
|
8085
|
+
vehicle: "#3b82f6",
|
|
8086
|
+
animal: "#f97316",
|
|
8087
|
+
package: "#a855f7",
|
|
8088
|
+
sensor: "#8b5cf6",
|
|
8089
|
+
control: "#10b981",
|
|
8090
|
+
genericDetection: "#64748b"
|
|
8091
|
+
};
|
|
8092
|
+
var DETECTION_SUB_COLORS = {
|
|
8093
|
+
car: "#f59e0b",
|
|
8094
|
+
truck: "#d97706",
|
|
8095
|
+
bus: "#b45309",
|
|
8096
|
+
motorcycle: "#eab308",
|
|
8097
|
+
bicycle: "#ca8a04",
|
|
8098
|
+
airplane: "#60a5fa",
|
|
8099
|
+
boat: "#2563eb",
|
|
8100
|
+
train: "#1d4ed8",
|
|
8101
|
+
bird: "#14b8a6",
|
|
8102
|
+
dog: "#84cc16",
|
|
8103
|
+
cat: "#f97316",
|
|
8104
|
+
horse: "#a16207",
|
|
8105
|
+
sheep: "#a3a3a3",
|
|
8106
|
+
cow: "#78716c",
|
|
8107
|
+
elephant: "#6b7280",
|
|
8108
|
+
bear: "#7c2d12",
|
|
8109
|
+
zebra: "#404040",
|
|
8110
|
+
giraffe: "#d4a373"
|
|
8111
|
+
};
|
|
8112
|
+
function titleCase(id) {
|
|
8113
|
+
return id.split(/[-_ ]/).filter((p) => p.length > 0).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join(" ");
|
|
8114
|
+
}
|
|
8115
|
+
var entries = /* @__PURE__ */ new Map();
|
|
8116
|
+
function macro(kind, category, color, iconId, label) {
|
|
8117
|
+
entries.set(kind, {
|
|
8118
|
+
kind,
|
|
8119
|
+
parentKind: null,
|
|
8120
|
+
level: "macro",
|
|
8121
|
+
category,
|
|
8122
|
+
color,
|
|
8123
|
+
iconId,
|
|
8124
|
+
labelKey: `eventKind.${kind}`,
|
|
8125
|
+
label
|
|
8126
|
+
});
|
|
8127
|
+
}
|
|
8128
|
+
function sub(kind, parentKind, category, color, iconId, label) {
|
|
8129
|
+
entries.set(kind, {
|
|
8130
|
+
kind,
|
|
8131
|
+
parentKind,
|
|
8132
|
+
level: "sub",
|
|
8133
|
+
category,
|
|
8134
|
+
color,
|
|
8135
|
+
iconId,
|
|
8136
|
+
labelKey: `eventKind.${kind}`,
|
|
8137
|
+
label
|
|
8138
|
+
});
|
|
8139
|
+
}
|
|
8140
|
+
macro("motion", "motion", TAXONOMY_COLORS.motion, "motion", "Motion");
|
|
8141
|
+
macro("audio", "audio", TAXONOMY_COLORS.audio, "audio", "Audio");
|
|
8142
|
+
macro("person", "detection", TAXONOMY_COLORS.person, "person", "Person");
|
|
8143
|
+
macro("vehicle", "detection", TAXONOMY_COLORS.vehicle, "vehicle", "Vehicle");
|
|
8144
|
+
macro("animal", "detection", TAXONOMY_COLORS.animal, "animal", "Animal");
|
|
8145
|
+
macro("package", "package", TAXONOMY_COLORS.package, "package", "Package");
|
|
8146
|
+
macro("sensor", "sensor", TAXONOMY_COLORS.sensor, "sensor", "Sensor");
|
|
8147
|
+
macro("control", "control", TAXONOMY_COLORS.control, "control", "Control");
|
|
8148
|
+
for (const [cocoClass, macroClass] of Object.entries(COCO_TO_MACRO.mapping)) {
|
|
8149
|
+
if (macroClass !== "vehicle" && macroClass !== "animal") continue;
|
|
8150
|
+
if (entries.has(cocoClass)) continue;
|
|
8151
|
+
sub(cocoClass, macroClass, "detection", DETECTION_SUB_COLORS[cocoClass] ?? TAXONOMY_COLORS.genericDetection, cocoClass, titleCase(cocoClass));
|
|
8152
|
+
}
|
|
8153
|
+
sub("package-delivered", "package", "package", TAXONOMY_COLORS.package, "package", "Package delivered");
|
|
8154
|
+
sub("package-picked-up", "package", "package", TAXONOMY_COLORS.package, "package", "Package picked up");
|
|
8155
|
+
sub("contact", "sensor", "sensor", "#f59e0b", "door", "Contact");
|
|
8156
|
+
sub("motion-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "pir", "Motion sensor");
|
|
8157
|
+
sub("smoke", "sensor", "sensor", "#ef4444", "smoke", "Smoke");
|
|
8158
|
+
sub("flood", "sensor", "sensor", "#3b82f6", "water", "Water leak");
|
|
8159
|
+
sub("gas", "sensor", "sensor", "#ef4444", "gas", "Gas");
|
|
8160
|
+
sub("carbon-monoxide", "sensor", "sensor", "#dc2626", "smoke", "Carbon monoxide");
|
|
8161
|
+
sub("vibration", "sensor", "sensor", "#eab308", "vibration", "Vibration");
|
|
8162
|
+
sub("tamper", "sensor", "sensor", "#f97316", "tamper", "Tamper");
|
|
8163
|
+
sub("presence", "sensor", "sensor", "#22c55e", "presence", "Presence");
|
|
8164
|
+
sub("enum-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "generic", "Sensor state");
|
|
8165
|
+
sub("device-event", "sensor", "sensor", "#10b981", "button", "Device event");
|
|
8166
|
+
sub("lock", "control", "control", "#0ea5e9", "lock", "Lock");
|
|
8167
|
+
sub("switch", "control", "control", TAXONOMY_COLORS.control, "switch", "Switch");
|
|
8168
|
+
sub("siren", "control", "control", "#dc2626", "siren", "Siren");
|
|
8169
|
+
sub("button", "control", "control", "#10b981", "button", "Button");
|
|
8170
|
+
sub("doorbell", "control", "control", "#a855f7", "doorbell", "Doorbell");
|
|
8171
|
+
for (const l of AUDIO_MACRO_LABELS) {
|
|
8172
|
+
const kind = `audio-${l.id}`;
|
|
8173
|
+
if (entries.has(kind)) continue;
|
|
8174
|
+
sub(kind, "audio", "audio", TAXONOMY_COLORS.audio, kind, l.name);
|
|
8175
|
+
}
|
|
8176
|
+
/** The complete taxonomy dictionary, keyed by kind. */
|
|
8177
|
+
var EVENT_TAXONOMY = Object.freeze(Object.fromEntries(entries));
|
|
8178
|
+
/**
|
|
7850
8179
|
* Error types for the safe expression engine. Two distinct classes so callers
|
|
7851
8180
|
* can tell a compile-time (grammar) failure from a runtime (evaluation)
|
|
7852
8181
|
* failure — both are non-fatal to the host: read paths degrade to "skip link".
|
|
@@ -15796,17 +16125,30 @@ var EventKindCategorySchema = _enum([
|
|
|
15796
16125
|
"audio",
|
|
15797
16126
|
"detection",
|
|
15798
16127
|
"sensor",
|
|
16128
|
+
"control",
|
|
15799
16129
|
"custom",
|
|
15800
16130
|
"package"
|
|
15801
16131
|
]);
|
|
16132
|
+
/** Taxonomy level — macro (timeline lane) vs sub (events-page leaf). */
|
|
16133
|
+
var EventKindLevelSchema = _enum(["macro", "sub"]);
|
|
15802
16134
|
var EventKindDescriptorSchema = object({
|
|
15803
|
-
/** Stable kind id (e.g. 'motion', '
|
|
16135
|
+
/** Stable kind id (e.g. 'motion', 'vehicle', 'car', 'lock'). */
|
|
15804
16136
|
kind: string(),
|
|
16137
|
+
/** i18n key resolved on the UI side; `label` is the English fallback. */
|
|
16138
|
+
labelKey: string(),
|
|
16139
|
+
/** English fallback label (kept for clients that don't translate). */
|
|
15805
16140
|
label: string(),
|
|
15806
16141
|
/** Hex color for timeline/legend rendering. */
|
|
15807
16142
|
color: string(),
|
|
16143
|
+
/** Dictionary id → lucide component on the UI side. */
|
|
16144
|
+
iconId: string(),
|
|
16145
|
+
/** Legacy closed-vocab glyph — fallback for `iconId`. */
|
|
15808
16146
|
icon: EventKindIconSchema,
|
|
15809
16147
|
category: EventKindCategorySchema,
|
|
16148
|
+
/** Macro parent for this kind ('car' → 'vehicle'); null for a macro. */
|
|
16149
|
+
parentKind: string().nullable(),
|
|
16150
|
+
/** Derived from `parentKind`, explicit for the client tree. */
|
|
16151
|
+
level: EventKindLevelSchema,
|
|
15810
16152
|
/** Which cap + device contributes this kind. For built-ins the camera
|
|
15811
16153
|
* itself; for sensor kinds the LINKED source device. */
|
|
15812
16154
|
source: object({
|
|
@@ -15879,11 +16221,21 @@ var TrackAudioLabelSchema = object({
|
|
|
15879
16221
|
firstAt: number(),
|
|
15880
16222
|
lastAt: number()
|
|
15881
16223
|
});
|
|
16224
|
+
/**
|
|
16225
|
+
* How a track was produced. `pipeline` (default / absent) = the spatial
|
|
16226
|
+
* detection+tracking pipeline. `sensor` = a SYNTHETIC track projected from a
|
|
16227
|
+
* linked sensor/control state change (no positions; carries a snapshot). The
|
|
16228
|
+
* spatial subsystems (tracker association, occupancy count, re-id/embedding,
|
|
16229
|
+
* resurrection) MUST skip `sensor` tracks — they have no bbox trajectory.
|
|
16230
|
+
*/
|
|
16231
|
+
var TrackSourceSchema = _enum(["pipeline", "sensor"]);
|
|
15882
16232
|
var TrackSchema = object({
|
|
15883
16233
|
trackId: string(),
|
|
15884
16234
|
deviceId: number(),
|
|
15885
16235
|
className: string(),
|
|
15886
16236
|
label: string().optional(),
|
|
16237
|
+
/** Track provenance. Absent ⇒ `pipeline` (legacy rows). */
|
|
16238
|
+
source: TrackSourceSchema.optional(),
|
|
15887
16239
|
firstSeen: number(),
|
|
15888
16240
|
lastSeen: number(),
|
|
15889
16241
|
/** Frame-rate position history (subject to maxPositionHistory cap). */
|
|
@@ -16138,6 +16490,26 @@ var TrackCascadeCountsSchema = object({
|
|
|
16138
16490
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
16139
16491
|
embeddings: number().int()
|
|
16140
16492
|
});
|
|
16493
|
+
/** Event-store footprint for one camera. */
|
|
16494
|
+
var EventStoreDeviceFootprintSchema = object({
|
|
16495
|
+
deviceId: number(),
|
|
16496
|
+
/** Persisted event rows (motion + object + audio) for the camera. */
|
|
16497
|
+
rows: number().int(),
|
|
16498
|
+
/** Event-owned media bytes on disk for the camera. */
|
|
16499
|
+
bytes: number().int()
|
|
16500
|
+
});
|
|
16501
|
+
/** Aggregate event-store footprint: global totals + per-camera breakdown. */
|
|
16502
|
+
var EventStoreFootprintSchema = object({
|
|
16503
|
+
totalRows: number().int(),
|
|
16504
|
+
totalBytes: number().int(),
|
|
16505
|
+
devices: array(EventStoreDeviceFootprintSchema).readonly()
|
|
16506
|
+
});
|
|
16507
|
+
/** Per-kind counts returned by the event-prune / device-delete mutations. */
|
|
16508
|
+
var EventPruneCountsSchema = object({
|
|
16509
|
+
motion: number().int(),
|
|
16510
|
+
object: number().int(),
|
|
16511
|
+
audio: number().int()
|
|
16512
|
+
});
|
|
16141
16513
|
DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
|
|
16142
16514
|
deviceId: number(),
|
|
16143
16515
|
trackId: string()
|
|
@@ -16201,6 +16573,21 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
16201
16573
|
}), {
|
|
16202
16574
|
kind: "mutation",
|
|
16203
16575
|
auth: "admin"
|
|
16576
|
+
}), method(object({}), EventStoreFootprintSchema, {
|
|
16577
|
+
kind: "query",
|
|
16578
|
+
auth: "admin"
|
|
16579
|
+
}), method(object({
|
|
16580
|
+
olderThanMs: number(),
|
|
16581
|
+
reason: OpsLogReasonSchema.optional()
|
|
16582
|
+
}), EventPruneCountsSchema, {
|
|
16583
|
+
kind: "mutation",
|
|
16584
|
+
auth: "admin"
|
|
16585
|
+
}), method(object({ deviceId: number() }), EventPruneCountsSchema, {
|
|
16586
|
+
kind: "mutation",
|
|
16587
|
+
auth: "admin"
|
|
16588
|
+
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
16589
|
+
kind: "query",
|
|
16590
|
+
auth: "admin"
|
|
16204
16591
|
}), method(object({
|
|
16205
16592
|
eventId: string(),
|
|
16206
16593
|
kind: MediaFileKindEnum.optional()
|
|
@@ -16225,6 +16612,76 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
16225
16612
|
eventId: string(),
|
|
16226
16613
|
timestamp: number()
|
|
16227
16614
|
});
|
|
16615
|
+
/**
|
|
16616
|
+
* Cap → event-kind mapping for the SENSOR / CONTROL cap families — the table
|
|
16617
|
+
* `pipeline-analytics.listEventKinds` uses to turn a linked device's bound
|
|
16618
|
+
* caps into per-camera event-kind descriptors.
|
|
16619
|
+
*
|
|
16620
|
+
* The descriptor DATA (color / iconId / labelKey / parentKind / category)
|
|
16621
|
+
* is NOT duplicated here — every entry is derived from the single
|
|
16622
|
+
* `EVENT_TAXONOMY` dictionary (`catalogs/event-taxonomy.ts`). This file owns
|
|
16623
|
+
* ONLY the cap-name → taxonomy-kind mapping. Adding a new eventful sensor /
|
|
16624
|
+
* control cap means adding one line here (and a taxonomy entry); the anti-
|
|
16625
|
+
* drift guard `scripts/check-event-kind-coverage.ts` fails the build if an
|
|
16626
|
+
* eventful cap is missing.
|
|
16627
|
+
*/
|
|
16628
|
+
/** Map a taxonomy `iconId` onto the legacy closed `EventKindIcon` enum. */
|
|
16629
|
+
var LEGACY_ICON = {
|
|
16630
|
+
motion: "motion",
|
|
16631
|
+
audio: "audio",
|
|
16632
|
+
person: "person",
|
|
16633
|
+
vehicle: "vehicle",
|
|
16634
|
+
animal: "animal",
|
|
16635
|
+
package: "package",
|
|
16636
|
+
door: "door",
|
|
16637
|
+
pir: "pir",
|
|
16638
|
+
smoke: "smoke",
|
|
16639
|
+
water: "water",
|
|
16640
|
+
button: "button",
|
|
16641
|
+
generic: "generic",
|
|
16642
|
+
gas: "smoke",
|
|
16643
|
+
vibration: "generic",
|
|
16644
|
+
tamper: "generic",
|
|
16645
|
+
presence: "person",
|
|
16646
|
+
lock: "generic",
|
|
16647
|
+
siren: "generic",
|
|
16648
|
+
switch: "generic",
|
|
16649
|
+
doorbell: "button"
|
|
16650
|
+
};
|
|
16651
|
+
function legacyIcon(iconId) {
|
|
16652
|
+
return LEGACY_ICON[iconId] ?? "generic";
|
|
16653
|
+
}
|
|
16654
|
+
/**
|
|
16655
|
+
* Cap name → taxonomy kind id. Covers EVERY eventful sensor / control cap.
|
|
16656
|
+
* The anti-drift guard cross-checks this against the eventful caps declared
|
|
16657
|
+
* in `packages/types/src/capabilities/*.cap.ts`.
|
|
16658
|
+
*/
|
|
16659
|
+
var CAP_TO_KIND = {
|
|
16660
|
+
contact: "contact",
|
|
16661
|
+
motion: "motion-sensor",
|
|
16662
|
+
smoke: "smoke",
|
|
16663
|
+
flood: "flood",
|
|
16664
|
+
gas: "gas",
|
|
16665
|
+
"carbon-monoxide": "carbon-monoxide",
|
|
16666
|
+
vibration: "vibration",
|
|
16667
|
+
tamper: "tamper",
|
|
16668
|
+
presence: "presence",
|
|
16669
|
+
"enum-sensor": "enum-sensor",
|
|
16670
|
+
"event-emitter": "device-event",
|
|
16671
|
+
"lock-control": "lock",
|
|
16672
|
+
switch: "switch",
|
|
16673
|
+
button: "button",
|
|
16674
|
+
doorbell: "doorbell"
|
|
16675
|
+
};
|
|
16676
|
+
function buildDescriptor(capName, kind) {
|
|
16677
|
+
const t = EVENT_TAXONOMY[kind];
|
|
16678
|
+
if (t === void 0) throw new Error(`EVENT_KIND_BY_CAP: cap '${capName}' maps to unknown taxonomy kind '${kind}'`);
|
|
16679
|
+
return {
|
|
16680
|
+
...t,
|
|
16681
|
+
icon: legacyIcon(t.iconId)
|
|
16682
|
+
};
|
|
16683
|
+
}
|
|
16684
|
+
Object.freeze(Object.fromEntries(Object.entries(CAP_TO_KIND).map(([capName, kind]) => [capName, buildDescriptor(capName, kind)])));
|
|
16228
16685
|
var CameraPipelineConfigSchema = object({
|
|
16229
16686
|
engine: PipelineEngineChoiceSchema.optional(),
|
|
16230
16687
|
steps: array(PipelineStepInputSchema).readonly(),
|
|
@@ -19434,13 +19891,29 @@ method(object({
|
|
|
19434
19891
|
}), method(object({ deviceId: number() }), RecordingStatusSchema, {
|
|
19435
19892
|
kind: "mutation",
|
|
19436
19893
|
auth: "admin"
|
|
19437
|
-
}), method(object({
|
|
19894
|
+
}), method(object({
|
|
19895
|
+
deviceId: number(),
|
|
19896
|
+
reason: OpsLogReasonSchema.optional()
|
|
19897
|
+
}), object({
|
|
19438
19898
|
floorMs: number().nullable(),
|
|
19439
19899
|
deletedBuckets: number().int(),
|
|
19440
19900
|
reclaimedBytes: number().int()
|
|
19441
19901
|
}), {
|
|
19442
19902
|
kind: "mutation",
|
|
19443
19903
|
auth: "admin"
|
|
19904
|
+
}), method(object({
|
|
19905
|
+
deviceId: number(),
|
|
19906
|
+
fromMs: number().optional(),
|
|
19907
|
+
toMs: number().optional()
|
|
19908
|
+
}), object({
|
|
19909
|
+
deletedBuckets: number().int(),
|
|
19910
|
+
reclaimedBytes: number().int()
|
|
19911
|
+
}), {
|
|
19912
|
+
kind: "mutation",
|
|
19913
|
+
auth: "admin"
|
|
19914
|
+
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19915
|
+
kind: "query",
|
|
19916
|
+
auth: "admin"
|
|
19444
19917
|
});
|
|
19445
19918
|
/**
|
|
19446
19919
|
* `recordingExport` cap — render a footage time range into a single downloadable
|
|
@@ -22562,6 +23035,12 @@ Object.freeze({
|
|
|
22562
23035
|
addonId: null,
|
|
22563
23036
|
access: "delete"
|
|
22564
23037
|
},
|
|
23038
|
+
"pipelineAnalytics.deleteDeviceEvents": {
|
|
23039
|
+
capName: "pipeline-analytics",
|
|
23040
|
+
capScope: "device",
|
|
23041
|
+
addonId: null,
|
|
23042
|
+
access: "delete"
|
|
23043
|
+
},
|
|
22565
23044
|
"pipelineAnalytics.deleteTracks": {
|
|
22566
23045
|
capName: "pipeline-analytics",
|
|
22567
23046
|
capScope: "device",
|
|
@@ -22592,6 +23071,12 @@ Object.freeze({
|
|
|
22592
23071
|
addonId: null,
|
|
22593
23072
|
access: "view"
|
|
22594
23073
|
},
|
|
23074
|
+
"pipelineAnalytics.getEventStoreFootprint": {
|
|
23075
|
+
capName: "pipeline-analytics",
|
|
23076
|
+
capScope: "device",
|
|
23077
|
+
addonId: null,
|
|
23078
|
+
access: "view"
|
|
23079
|
+
},
|
|
22595
23080
|
"pipelineAnalytics.getKeyEvents": {
|
|
22596
23081
|
capName: "pipeline-analytics",
|
|
22597
23082
|
capScope: "device",
|
|
@@ -22634,6 +23119,12 @@ Object.freeze({
|
|
|
22634
23119
|
addonId: null,
|
|
22635
23120
|
access: "view"
|
|
22636
23121
|
},
|
|
23122
|
+
"pipelineAnalytics.listOpsLog": {
|
|
23123
|
+
capName: "pipeline-analytics",
|
|
23124
|
+
capScope: "device",
|
|
23125
|
+
addonId: null,
|
|
23126
|
+
access: "view"
|
|
23127
|
+
},
|
|
22637
23128
|
"pipelineAnalytics.listRecentTracks": {
|
|
22638
23129
|
capName: "pipeline-analytics",
|
|
22639
23130
|
capScope: "device",
|
|
@@ -22646,6 +23137,12 @@ Object.freeze({
|
|
|
22646
23137
|
addonId: null,
|
|
22647
23138
|
access: "view"
|
|
22648
23139
|
},
|
|
23140
|
+
"pipelineAnalytics.pruneEvents": {
|
|
23141
|
+
capName: "pipeline-analytics",
|
|
23142
|
+
capScope: "device",
|
|
23143
|
+
addonId: null,
|
|
23144
|
+
access: "create"
|
|
23145
|
+
},
|
|
22649
23146
|
"pipelineAnalytics.pruneEventsBefore": {
|
|
22650
23147
|
capName: "pipeline-analytics",
|
|
22651
23148
|
capScope: "device",
|
|
@@ -23408,6 +23905,12 @@ Object.freeze({
|
|
|
23408
23905
|
addonId: null,
|
|
23409
23906
|
access: "create"
|
|
23410
23907
|
},
|
|
23908
|
+
"recording.deleteFootprint": {
|
|
23909
|
+
capName: "recording",
|
|
23910
|
+
capScope: "system",
|
|
23911
|
+
addonId: null,
|
|
23912
|
+
access: "delete"
|
|
23913
|
+
},
|
|
23411
23914
|
"recording.getAvailability": {
|
|
23412
23915
|
capName: "recording",
|
|
23413
23916
|
capScope: "system",
|
|
@@ -23438,6 +23941,12 @@ Object.freeze({
|
|
|
23438
23941
|
addonId: null,
|
|
23439
23942
|
access: "view"
|
|
23440
23943
|
},
|
|
23944
|
+
"recording.listOpsLog": {
|
|
23945
|
+
capName: "recording",
|
|
23946
|
+
capScope: "system",
|
|
23947
|
+
addonId: null,
|
|
23948
|
+
access: "view"
|
|
23949
|
+
},
|
|
23441
23950
|
"recording.locateSegment": {
|
|
23442
23951
|
capName: "recording",
|
|
23443
23952
|
capScope: "system",
|
|
@@ -24681,7 +25190,7 @@ var AdminUIAddon = class extends BaseAddon {
|
|
|
24681
25190
|
capability: adminUiCapability,
|
|
24682
25191
|
provider: {
|
|
24683
25192
|
getStaticDir: async () => ({ staticDir: resolveAdminUiDistDir() }),
|
|
24684
|
-
getVersion: async () => ({ version: "1.1.
|
|
25193
|
+
getVersion: async () => ({ version: "1.1.58" })
|
|
24685
25194
|
}
|
|
24686
25195
|
}];
|
|
24687
25196
|
}
|