@camstack/addon-admin-ui 1.2.34 → 1.2.36
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-DzP-CYOi.js → AddLocationWizard-D3WNwwzO.js} +1 -1
- package/dist/assets/{AddonCollectionPage-B5t3SHZE.js → AddonCollectionPage-D6-DslHs.js} +1 -1
- package/dist/assets/Addons-xiv8mENL.js +1 -0
- package/dist/assets/{AdminTabs-DTECFIAe.js → AdminTabs-EuBAqr82.js} +1 -1
- package/dist/assets/{AiProfiles-D0jpUF4v.js → AiProfiles-YpD0cNHK.js} +1 -1
- package/dist/assets/{Automation-BX0bNbpp.js → Automation-Bnvadu_q.js} +2 -2
- package/dist/assets/{BrokerForm-CROZPAB-.js → BrokerForm-lcZzCH84.js} +1 -1
- package/dist/assets/{Capabilities-DIGQ9fiv.js → Capabilities-BO4EdQiS.js} +1 -1
- package/dist/assets/{CapabilityBadges-B4vHw0qw.js → CapabilityBadges-DDCH_NHd.js} +1 -1
- package/dist/assets/Cluster-HqhJz5p-.js +1 -0
- package/dist/assets/{ClusterRecordingTab-BVkyOEdI.js → ClusterRecordingTab-uoQhw_ij.js} +1 -1
- package/dist/assets/{Dashboard-BlkR2NIh.js → Dashboard-BM-5S-Cj.js} +1 -1
- package/dist/assets/{Data-CECcPfPj.js → Data-DBvjn1Ul.js} +1 -1
- package/dist/assets/DetectionIntelligence-pRUA7cQB.js +1 -0
- package/dist/assets/{DeviceAggregateSection-CbCIksD2.js → DeviceAggregateSection-Cfju7u5B.js} +1 -1
- package/dist/assets/DeviceDetail-DUZkWQjP.js +2 -0
- package/dist/assets/{Devices-COMVrlGU.js → Devices-dbkRu6sh.js} +1 -1
- package/dist/assets/{EmbedPlayerPage-B4Y1MxZ9.js → EmbedPlayerPage-CCTm073s.js} +1 -1
- package/dist/assets/Events-D9bI1DWk.js +1 -0
- package/dist/assets/{FormBuilder-Cogt0U0A.js → FormBuilder-pSCqn9Pp.js} +1 -1
- package/dist/assets/Identity-EphebNT0.js +1 -0
- package/dist/assets/IntegrationDetail-vt_WT2kb.js +1 -0
- package/dist/assets/{Integrations-qNIS4emE.js → Integrations-B3fddOYM.js} +1 -1
- package/dist/assets/Integrations-D2z39cEx.js +1 -0
- package/dist/assets/{Logs-rH1aVfpt.js → Logs-xK4--bh0.js} +1 -1
- package/dist/assets/{MotionZonesSettings-DDSnsNc9.js → MotionZonesSettings-C0sxf_os.js} +1 -1
- package/dist/assets/{MyAccess-J8p1dKF3.js → MyAccess-D043-D3_.js} +1 -1
- package/dist/assets/{Network-C6bXHvxd.js → Network-DQkG5Rat.js} +1 -1
- package/dist/assets/{NodeAddonsSettingsPanel-6Dzcc5in.js → NodeAddonsSettingsPanel-CV-reVXD.js} +1 -1
- package/dist/assets/{NodeInferenceDevices-DraQNeS_.js → NodeInferenceDevices-tLptbnD4.js} +1 -1
- package/dist/assets/Notifications-DZMSKwIB.js +1 -0
- package/dist/assets/Pipeline-f6X5D5vg.js +1 -0
- package/dist/assets/Plates-Dct--YKd.js +1 -0
- package/dist/assets/{PrivacyMaskSettings-ByZ6t3aH.js → PrivacyMaskSettings-Cj47lnFx.js} +1 -1
- package/dist/assets/{ProviderIcon-9BELU-vo.js → ProviderIcon-DFIIdGww.js} +1 -1
- package/dist/assets/Recordings-Sn1cAwz6.js +1 -0
- package/dist/assets/Retrain-cSIFr_tD.js +1 -0
- package/dist/assets/{ScanNetworkModal-DGnLpsYA.js → ScanNetworkModal-DEK5U2cd.js} +1 -1
- package/dist/assets/{Settings-DhIPBQcW.js → Settings-Casus0ex.js} +1 -1
- package/dist/assets/{Showroom-C7QnFCQp.js → Showroom-f88Jp6ju.js} +1 -1
- package/dist/assets/{Terminal-DVjWHgq3.js → Terminal-M_8UHE7n.js} +2 -2
- package/dist/assets/{_virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-DkbcXBBJ.js → _virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-AQtYY37w.js} +1 -1
- package/dist/assets/{build-cluster-graph-BDFGSfk8.js → build-cluster-graph-CAb1HaUw.js} +2 -2
- package/dist/assets/circle-check-big-DG4qagl7.js +1 -0
- package/dist/assets/clock-XeL04zsb.js +1 -0
- package/dist/assets/{copy-oDpB_CYv.js → copy-BtwlORlH.js} +1 -1
- package/dist/assets/debounced-invalidate-D3Cu80c9.js +1 -0
- package/dist/assets/{dist-Dx0ACB1O.js → dist-B_UrLLw9.js} +1 -1
- package/dist/assets/dist-rfpANeiT.js +7 -0
- package/dist/assets/{download-c60BtWes.js → download-T_lOWVlB.js} +1 -1
- package/dist/assets/{face-bbox-nkg8OmFa.js → face-bbox-f3p_Yctl.js} +1 -1
- package/dist/assets/{hostInit-BpyXzSDR.js → hostInit-tEAagC07.js} +1 -1
- package/dist/assets/image-off-CxrOL9bA.js +1 -0
- package/dist/assets/index-BJkpCYtR.css +2 -0
- package/dist/assets/index-CY7HK9zV.js +4 -0
- package/dist/assets/{key-round-BlSZq_ro.js → key-round-DDU-8is6.js} +1 -1
- package/dist/assets/{mf-entry-bootstrap-0-3845b4a0.js → mf-entry-bootstrap-0-482a4da7.js} +2 -2
- package/dist/assets/{pencil-DUgcFYZU.js → pencil-DXM3cvvP.js} +1 -1
- package/dist/assets/{player-overlays-CzjKRHin.js → player-overlays-Ba-DoE5F.js} +1 -1
- package/dist/assets/plus-DrqAQeFJ.js +1 -0
- package/dist/assets/{radio-eY0YHItP.js → radio-DGfartpy.js} +1 -1
- package/dist/assets/{refresh-cw-D_fKxMIe.js → refresh-cw-NwlTy6_-.js} +1 -1
- package/dist/assets/remoteEntry-BzAN7Tig.js +1 -0
- package/dist/assets/{rotate-ccw-DU4_rBQq.js → rotate-ccw-DGfCNuX0.js} +1 -1
- package/dist/assets/rotate-cw-W4djelbj.js +1 -0
- package/dist/assets/search-DOYQxoHy.js +1 -0
- package/dist/assets/{send-B9r8Lohp.js → send-zoWD-FsL.js} +1 -1
- package/dist/assets/{server-BhdxNAPC.js → server-Bv5NUu2G.js} +1 -1
- package/dist/assets/square-CBtc15_U.js +1 -0
- package/dist/assets/{square-check-big-DMenPwwp.js → square-check-big-C_0qc0Ud.js} +1 -1
- package/dist/assets/{src-BBe6PrXe.js → src-CPanq9UB.js} +10 -10
- package/dist/assets/src-EmgPMReM.js +7 -0
- package/dist/assets/undo-2-B5eeo7kt.js +1 -0
- package/dist/assets/{upload-AwB-upJP.js → upload-B2QyA3Ml.js} +1 -1
- package/dist/assets/{useEventInvalidation-qhbuBjhg.js → useEventInvalidation-CQp2HDcf.js} +1 -1
- package/dist/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-CPcVkZQ0.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-BmbjlXvs.js} +2 -2
- package/dist/assets/{wifi-DyeEKGI-.js → wifi-DiUaWSk8.js} +1 -1
- package/dist/assets/{zap-C32Ix0E1.js → zap-y-GpHg-7.js} +1 -1
- package/dist/index.html +6 -6
- package/dist/server/addon.js +483 -4
- package/package.json +1 -1
- package/dist/assets/Addons-DCR8DMgD.js +0 -1
- package/dist/assets/Cluster-BnTT5Wsb.js +0 -1
- package/dist/assets/DetectionIntelligence-CzMadCA-.js +0 -1
- package/dist/assets/DeviceDetail-oWNRSfva.js +0 -2
- package/dist/assets/Events-BIZWrXMY.js +0 -1
- package/dist/assets/Identity-i_LhUVHo.js +0 -1
- package/dist/assets/IntegrationDetail-CPE4VRwU.js +0 -1
- package/dist/assets/Integrations-DhMaG2V3.js +0 -1
- package/dist/assets/Notifications-BL4Cp1b2.js +0 -1
- package/dist/assets/Pipeline-Bf8P_Drx.js +0 -1
- package/dist/assets/Plates-BkYxLI16.js +0 -1
- package/dist/assets/Recordings-OoJn-xbL.js +0 -1
- package/dist/assets/circle-check-big-DX7P42Tw.js +0 -1
- package/dist/assets/clock-DMJpZrGI.js +0 -1
- package/dist/assets/debounced-invalidate-CPxCM-Lt.js +0 -1
- package/dist/assets/dist-CekX4Hra.js +0 -7
- package/dist/assets/index-2QX2zxyn.js +0 -4
- package/dist/assets/index-BIqRUg3I.css +0 -2
- package/dist/assets/plus-C7qYd7DF.js +0 -1
- package/dist/assets/remoteEntry-CFMi51wk.js +0 -1
- package/dist/assets/rotate-cw-CktlNgLW.js +0 -1
- package/dist/assets/search-CY5Hv7Yv.js +0 -1
- package/dist/assets/square-S_5NH0Gl.js +0 -1
- package/dist/assets/src-DSZBcu6j.js +0 -7
package/dist/server/addon.js
CHANGED
|
@@ -8940,6 +8940,69 @@ var StreamFormatSchema = _enum([
|
|
|
8940
8940
|
"mjpeg",
|
|
8941
8941
|
"rtsp"
|
|
8942
8942
|
]);
|
|
8943
|
+
/** A container `produceEventMedia` can emit. */
|
|
8944
|
+
var EventMediaKindSchema = _enum(["mp4", "gif"]);
|
|
8945
|
+
/**
|
|
8946
|
+
* One produced artifact, referenced by HANDLE.
|
|
8947
|
+
*
|
|
8948
|
+
* Never inline bytes: a produced clip is 200 KB–5 MB and every consumer of this
|
|
8949
|
+
* method is in another runner ([D9](../../../../docs/decisions/adr-0009.md),
|
|
8950
|
+
* [D18](../../../../docs/decisions/adr-0018.md) — cross-process media is fetched
|
|
8951
|
+
* on demand, compressed, by handle). `bytes` is here so a caller can decide
|
|
8952
|
+
* whether it wants the fetch at all.
|
|
8953
|
+
*/
|
|
8954
|
+
var EventMediaArtifactSchema = object({
|
|
8955
|
+
kind: EventMediaKindSchema,
|
|
8956
|
+
/** Opaque, single-camera, short-lived. Redeem with `fetchEventMedia`. */
|
|
8957
|
+
handle: string(),
|
|
8958
|
+
/**
|
|
8959
|
+
* The node holding the bytes — the ROUTING key for `fetchEventMedia`.
|
|
8960
|
+
*
|
|
8961
|
+
* `stream-broker` is a singleton cap and an unpinned call never leaves the
|
|
8962
|
+
* hub, so a handle produced on an agent's broker would be redeemed against
|
|
8963
|
+
* the hub's store and come back `null`. Same contract, same field name and
|
|
8964
|
+
* the same reason as `FrameHandleSchema.nodeId`: the producer stamps where it
|
|
8965
|
+
* lives and the consumer pins to it.
|
|
8966
|
+
*/
|
|
8967
|
+
nodeId: string(),
|
|
8968
|
+
mime: string(),
|
|
8969
|
+
bytes: number().int(),
|
|
8970
|
+
width: number().int(),
|
|
8971
|
+
height: number().int()
|
|
8972
|
+
});
|
|
8973
|
+
/**
|
|
8974
|
+
* What a production actually covered — the answer to the only question an
|
|
8975
|
+
* operator asks about a notification clip.
|
|
8976
|
+
*
|
|
8977
|
+
* `fromTs`/`toTs` are WALL CLOCK, derived from the ring's own packet timeline,
|
|
8978
|
+
* so a caller can state "this clip starts 4.1 s before the event" instead of
|
|
8979
|
+
* inferring it from a duration. A production whose `fromTs` is later than the
|
|
8980
|
+
* event is a production with no pre-roll, and that is exactly the defect this
|
|
8981
|
+
* method exists to make visible rather than plausible.
|
|
8982
|
+
*/
|
|
8983
|
+
var EventMediaCoverageSchema = object({
|
|
8984
|
+
fromTs: number(),
|
|
8985
|
+
toTs: number(),
|
|
8986
|
+
/** Encoded packets in the muxed window. */
|
|
8987
|
+
packets: number().int()
|
|
8988
|
+
});
|
|
8989
|
+
/**
|
|
8990
|
+
* The result of ONE cut, in every container the caller asked for.
|
|
8991
|
+
*
|
|
8992
|
+
* Every artifact in `media` came out of the SAME window of the SAME rendition —
|
|
8993
|
+
* that is the whole reason this is one method rather than one call per format.
|
|
8994
|
+
* A consumer attaching a gif and a video can no longer show two different
|
|
8995
|
+
* moments, because it never chose two sources.
|
|
8996
|
+
*/
|
|
8997
|
+
var EventMediaProductionSchema = object({
|
|
8998
|
+
media: array(EventMediaArtifactSchema).readonly(),
|
|
8999
|
+
coverage: EventMediaCoverageSchema,
|
|
9000
|
+
/** The rendition actually cut from — what the default or the fallback chose. */
|
|
9001
|
+
profile: CamProfileSchema,
|
|
9002
|
+
/** `copy` = the camera's own H.264, untouched. `encode` = re-encoded (H.265
|
|
9003
|
+
* source, a downscale, or a playback rate other than 1). */
|
|
9004
|
+
video: _enum(["copy", "encode"])
|
|
9005
|
+
});
|
|
8943
9006
|
var RtspRestreamEntrySchema = object({
|
|
8944
9007
|
brokerId: string(),
|
|
8945
9008
|
url: string(),
|
|
@@ -9339,6 +9402,34 @@ method(object({
|
|
|
9339
9402
|
}), {
|
|
9340
9403
|
kind: "mutation",
|
|
9341
9404
|
auth: "admin"
|
|
9405
|
+
}), method(object({
|
|
9406
|
+
deviceId: number(),
|
|
9407
|
+
/** Absent = the largest H.264 rendition at or below 1080p, which is
|
|
9408
|
+
* also the one that can be copied. Falls back to whatever the ring
|
|
9409
|
+
* actually retained, and the answer says which. */
|
|
9410
|
+
profile: CamProfileSchema.optional(),
|
|
9411
|
+
aroundMs: number(),
|
|
9412
|
+
preSeconds: number().min(0).max(20).default(4),
|
|
9413
|
+
postSeconds: number().min(0).max(20).default(6),
|
|
9414
|
+
kinds: array(EventMediaKindSchema).min(1).default(["mp4"]),
|
|
9415
|
+
/** GIF geometry. The video keeps the source's own. */
|
|
9416
|
+
gifMaxWidth: number().int().min(120).max(1280).default(640),
|
|
9417
|
+
gifFps: number().int().min(1).max(15).default(8),
|
|
9418
|
+
/**
|
|
9419
|
+
* Playback rate, applied to EVERY container so they stay one clip.
|
|
9420
|
+
* `1` is real time and is what allows the copy branch.
|
|
9421
|
+
*/
|
|
9422
|
+
speed: number().min(1).max(8).default(1)
|
|
9423
|
+
}), EventMediaProductionSchema, {
|
|
9424
|
+
kind: "mutation",
|
|
9425
|
+
auth: "admin"
|
|
9426
|
+
}), method(object({ handle: string() }), object({
|
|
9427
|
+
base64: string(),
|
|
9428
|
+
mime: string(),
|
|
9429
|
+
bytes: number().int()
|
|
9430
|
+
}).nullable(), {
|
|
9431
|
+
kind: "mutation",
|
|
9432
|
+
auth: "admin"
|
|
9342
9433
|
}), method(_void(), array(CameraStreamSchema).readonly()), method(_void(), array(ProfileSlotSchema).readonly()), method(object({ brokerId: string() }), BrokerStatsSchema), method(object({ brokerId: string() }), object({
|
|
9343
9434
|
probed: boolean(),
|
|
9344
9435
|
summary: string()
|
|
@@ -14749,6 +14840,60 @@ var TrackFlagsSchema = object({
|
|
|
14749
14840
|
* `trained` without a re-fetch. */
|
|
14750
14841
|
retrainStatus: RetrainStatusSchema
|
|
14751
14842
|
});
|
|
14843
|
+
union([literal(1), literal(2)]);
|
|
14844
|
+
/**
|
|
14845
|
+
* WHO decided a label, and when. Carried per tier so a value can be traced to
|
|
14846
|
+
* the step and model that produced it — which is what makes the write rule
|
|
14847
|
+
* arguable after the fact ("why is 592's label `dog` and not `Canis lupus`?")
|
|
14848
|
+
* and what lets a migrated, UNATTRIBUTED value be told apart from a real one.
|
|
14849
|
+
*
|
|
14850
|
+
* `stepId` is the pipeline step id (`animal-classifier`, `bird-classifier`,
|
|
14851
|
+
* `plate-ocr`, `face-embedding`, `object-detection`), or the sentinel
|
|
14852
|
+
* `migration:4g` for a value the 4g migration moved from the single-slot era —
|
|
14853
|
+
* that value has no provenance, and the write rule lets ANY properly-attributed
|
|
14854
|
+
* write of the same tier replace it regardless of score.
|
|
14855
|
+
*/
|
|
14856
|
+
var LabelAttributionSchema = object({
|
|
14857
|
+
stepId: string(),
|
|
14858
|
+
modelId: string().optional(),
|
|
14859
|
+
decidedAt: number()
|
|
14860
|
+
});
|
|
14861
|
+
/**
|
|
14862
|
+
* The TIERED label model (roadmap 4g), spread into `TrackSchema` and
|
|
14863
|
+
* `ObjectEventSchema` from ONE place so the two surfaces cannot drift — a
|
|
14864
|
+
* track and its events always answer the same question the same way.
|
|
14865
|
+
*
|
|
14866
|
+
* Two scalar columns, not an array: every consumer wants "the coarse one" or
|
|
14867
|
+
* "the fine one", and an array made both a scan. `label` is tier 1, `subLabel`
|
|
14868
|
+
* is tier 2, and each carries its own score + attribution.
|
|
14869
|
+
*
|
|
14870
|
+
* **Reading it.** What a human should be shown is `subLabel ?? label` — the
|
|
14871
|
+
* finest thing known. Before 4g the single `label` column held the finest
|
|
14872
|
+
* value, so a consumer that has not been updated reads the tier-1 slot and
|
|
14873
|
+
* shows nothing on a species-only row; that is why the migration puts every
|
|
14874
|
+
* pre-4g value in tier 2 (it cannot regress a display that reads the fallback)
|
|
14875
|
+
* and why the read surfaces were changed in the same train.
|
|
14876
|
+
*
|
|
14877
|
+
* **Writing it.** The slots are independent, which is the whole point: a
|
|
14878
|
+
* tier-1 write (`bird`) can never overwrite a tier-2 value (`Turdus
|
|
14879
|
+
* migratorius`), so fineness cannot regress by construction. Within a tier the
|
|
14880
|
+
* higher score wins. One rule, one implementation — see
|
|
14881
|
+
* `pipeline/label-tier.ts` in addon-post-analysis.
|
|
14882
|
+
*/
|
|
14883
|
+
var TieredLabelFields = {
|
|
14884
|
+
/** Tier 1 — the sub-class. See {@link LabelTierSchema}. */
|
|
14885
|
+
label: string().optional(),
|
|
14886
|
+
/** Confidence of the tier-1 value, as reported by the deciding step. */
|
|
14887
|
+
labelScore: number().optional(),
|
|
14888
|
+
/** Provenance of the tier-1 value. See {@link LabelAttributionSchema}. */
|
|
14889
|
+
labelMeta: LabelAttributionSchema.optional(),
|
|
14890
|
+
/** Tier 2 — the instance. See {@link LabelTierSchema}. */
|
|
14891
|
+
subLabel: string().optional(),
|
|
14892
|
+
/** Confidence of the tier-2 value, as reported by the deciding step. */
|
|
14893
|
+
subLabelScore: number().optional(),
|
|
14894
|
+
/** Provenance of the tier-2 value. See {@link LabelAttributionSchema}. */
|
|
14895
|
+
subLabelMeta: LabelAttributionSchema.optional()
|
|
14896
|
+
};
|
|
14752
14897
|
/** Per-camera slice of a training-export estimate. */
|
|
14753
14898
|
var TrainingExportDeviceTotalsSchema = object({
|
|
14754
14899
|
deviceId: number(),
|
|
@@ -14773,7 +14918,7 @@ var TrackSchema = object({
|
|
|
14773
14918
|
trackId: string(),
|
|
14774
14919
|
deviceId: number(),
|
|
14775
14920
|
className: string(),
|
|
14776
|
-
|
|
14921
|
+
...TieredLabelFields,
|
|
14777
14922
|
producingDeviceName: string().optional(),
|
|
14778
14923
|
/** Track provenance. Absent ⇒ `pipeline` (legacy rows). */
|
|
14779
14924
|
source: TrackSourceSchema.optional(),
|
|
@@ -14886,7 +15031,7 @@ var ObjectEventSchema = object({
|
|
|
14886
15031
|
/** Omitted in slim projection. */
|
|
14887
15032
|
trackId: string().optional(),
|
|
14888
15033
|
className: string(),
|
|
14889
|
-
|
|
15034
|
+
...TieredLabelFields,
|
|
14890
15035
|
/** Omitted in slim projection. */
|
|
14891
15036
|
confidence: number().optional(),
|
|
14892
15037
|
/** Heavy JSON — omitted in slim projection. */
|
|
@@ -14967,6 +15112,173 @@ var MediaFileSchema = object({
|
|
|
14967
15112
|
* stored blob and a `?variant=thumb` rendering without fetching either.
|
|
14968
15113
|
*/
|
|
14969
15114
|
var MediaFileInfoSchema = MediaFileSchema.omit({ base64: true });
|
|
15115
|
+
/**
|
|
15116
|
+
* The MACRO tier of an annotation — a CLOSED set.
|
|
15117
|
+
*
|
|
15118
|
+
* This is what the exported detector predicts, so a typo here is a new class
|
|
15119
|
+
* with one example in it. `label` and `subLabel` are open strings by contrast:
|
|
15120
|
+
* the whole point of the page is teaching the model things it does not know
|
|
15121
|
+
* yet, and constraining that vocabulary would make it useless.
|
|
15122
|
+
*
|
|
15123
|
+
* A macro class is NEVER a label. The provider refuses a write whose `label` or
|
|
15124
|
+
* `subLabel` is one of these values, in any casing, because once `person`
|
|
15125
|
+
* exists in both tiers "every person box" stops being answerable without
|
|
15126
|
+
* knowing every string anyone ever typed — and the damage is retroactive.
|
|
15127
|
+
*/
|
|
15128
|
+
var RetrainMacroClassSchema = _enum([
|
|
15129
|
+
"person",
|
|
15130
|
+
"vehicle",
|
|
15131
|
+
"animal",
|
|
15132
|
+
"package",
|
|
15133
|
+
"face",
|
|
15134
|
+
"plate"
|
|
15135
|
+
]);
|
|
15136
|
+
/** A subject to learn, or a phantom to unlearn (taught by OMISSION). */
|
|
15137
|
+
var RetrainAnnotationKindSchema = _enum(["subject", "model_error"]);
|
|
15138
|
+
/** Did a human draw this box, or did the assist propose it? */
|
|
15139
|
+
var RetrainAnnotationSourceSchema = _enum(["operator", "assist"]);
|
|
15140
|
+
/** Normalised `[0,1]` rectangle against the FULL frame — the canonical form. */
|
|
15141
|
+
var RetrainBboxSchema = object({
|
|
15142
|
+
x: number(),
|
|
15143
|
+
y: number(),
|
|
15144
|
+
w: number(),
|
|
15145
|
+
h: number()
|
|
15146
|
+
});
|
|
15147
|
+
/**
|
|
15148
|
+
* One annotated subject.
|
|
15149
|
+
*
|
|
15150
|
+
* `bbox` is normalised against the full frame, ALWAYS. The per-model shapes
|
|
15151
|
+
* (letterboxed root / zone-cropped package / subject-cropped classifier) are
|
|
15152
|
+
* derived from it at export and never stored — storing them is how one feature
|
|
15153
|
+
* space ends up holding two crops of the same subject (D52).
|
|
15154
|
+
*/
|
|
15155
|
+
var RetrainAnnotationSchema = object({
|
|
15156
|
+
id: string(),
|
|
15157
|
+
trackId: string(),
|
|
15158
|
+
deviceId: number(),
|
|
15159
|
+
/** The COPY in retrain storage — never the source track's media key. */
|
|
15160
|
+
mediaKey: string(),
|
|
15161
|
+
bbox: RetrainBboxSchema,
|
|
15162
|
+
macroClass: RetrainMacroClassSchema,
|
|
15163
|
+
label: string().optional(),
|
|
15164
|
+
subLabel: string().optional(),
|
|
15165
|
+
kind: RetrainAnnotationKindSchema,
|
|
15166
|
+
source: RetrainAnnotationSourceSchema,
|
|
15167
|
+
/** Which model proposed this box — or, on a `model_error`, drew the phantom. */
|
|
15168
|
+
assistModelId: string().optional(),
|
|
15169
|
+
assistScore: number().optional(),
|
|
15170
|
+
exportedInBatch: string().optional(),
|
|
15171
|
+
createdAt: number()
|
|
15172
|
+
});
|
|
15173
|
+
/** The write form — the server owns `id`, `createdAt` and the frame binding. */
|
|
15174
|
+
var RetrainAnnotationDraftSchema = RetrainAnnotationSchema.omit({
|
|
15175
|
+
id: true,
|
|
15176
|
+
trackId: true,
|
|
15177
|
+
deviceId: true,
|
|
15178
|
+
mediaKey: true,
|
|
15179
|
+
createdAt: true,
|
|
15180
|
+
exportedInBatch: true
|
|
15181
|
+
});
|
|
15182
|
+
/** A track sitting in `staging`, with everything the worklist needs to rank it. */
|
|
15183
|
+
var RetrainTrackSchema = object({
|
|
15184
|
+
trackId: string(),
|
|
15185
|
+
deviceId: number(),
|
|
15186
|
+
className: string(),
|
|
15187
|
+
label: string().optional(),
|
|
15188
|
+
firstSeen: number(),
|
|
15189
|
+
lastSeen: number(),
|
|
15190
|
+
/** How many frames the dataset already holds from this track. */
|
|
15191
|
+
frameCount: number().int(),
|
|
15192
|
+
/** How many subjects have been annotated on those frames. `0` with
|
|
15193
|
+
* `frameCount: 0` is exactly "staging, still to work". */
|
|
15194
|
+
annotationCount: number().int()
|
|
15195
|
+
});
|
|
15196
|
+
/** A frame the picker may offer — an index row, no blob was read to produce it. */
|
|
15197
|
+
var RetrainFrameCandidateSchema = object({
|
|
15198
|
+
mediaKey: string(),
|
|
15199
|
+
kind: MediaFileKindEnum,
|
|
15200
|
+
timestamp: number(),
|
|
15201
|
+
sizeBytes: number().int(),
|
|
15202
|
+
/** A copy of this original already exists — selecting it is free and cannot
|
|
15203
|
+
* fail, whatever became of the original. */
|
|
15204
|
+
copied: boolean()
|
|
15205
|
+
});
|
|
15206
|
+
/** A frame the dataset OWNS: bytes copied at selection time. */
|
|
15207
|
+
var RetrainFrameSchema = object({
|
|
15208
|
+
frameId: string(),
|
|
15209
|
+
deviceId: number(),
|
|
15210
|
+
trackId: string(),
|
|
15211
|
+
/** Provenance only. It may already point at nothing — that is expected. */
|
|
15212
|
+
sourceMediaKey: string(),
|
|
15213
|
+
sourceKind: MediaFileKindEnum,
|
|
15214
|
+
sizeBytes: number().int(),
|
|
15215
|
+
width: number().int(),
|
|
15216
|
+
height: number().int(),
|
|
15217
|
+
copiedAt: number()
|
|
15218
|
+
});
|
|
15219
|
+
/** Why a copy-on-select could not be honoured — named, never a silent skip. */
|
|
15220
|
+
var RetrainCopyRefusalSchema = _enum([
|
|
15221
|
+
"source-missing",
|
|
15222
|
+
"unreadable-image",
|
|
15223
|
+
"write-failed"
|
|
15224
|
+
]);
|
|
15225
|
+
var RetrainFrameSelectionSchema = object({
|
|
15226
|
+
copied: array(RetrainFrameSchema).readonly(),
|
|
15227
|
+
refused: array(object({
|
|
15228
|
+
sourceMediaKey: string(),
|
|
15229
|
+
reason: RetrainCopyRefusalSchema
|
|
15230
|
+
})).readonly()
|
|
15231
|
+
});
|
|
15232
|
+
var RetrainFrameListSchema = object({
|
|
15233
|
+
candidates: array(RetrainFrameCandidateSchema).readonly(),
|
|
15234
|
+
copies: array(RetrainFrameSchema).readonly(),
|
|
15235
|
+
/** What the page pre-selects — the native key frame when one survives. */
|
|
15236
|
+
autoPickMediaKey: string().optional()
|
|
15237
|
+
});
|
|
15238
|
+
/** What the operator asked the assist to look for. */
|
|
15239
|
+
var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
|
|
15240
|
+
kind: literal("package"),
|
|
15241
|
+
zone: RetrainBboxSchema.optional()
|
|
15242
|
+
}), object({
|
|
15243
|
+
kind: literal("objects"),
|
|
15244
|
+
modelId: string(),
|
|
15245
|
+
minScore: number().optional()
|
|
15246
|
+
})]);
|
|
15247
|
+
/**
|
|
15248
|
+
* The assist's answer — a discriminated union, because "the model saw nothing"
|
|
15249
|
+
* and "this node cannot run that model" lead to different next moves and a
|
|
15250
|
+
* nullable result cannot tell them apart.
|
|
15251
|
+
*/
|
|
15252
|
+
var RetrainAssistResultSchema = discriminatedUnion("kind", [object({
|
|
15253
|
+
kind: literal("proposed"),
|
|
15254
|
+
modelId: string(),
|
|
15255
|
+
stepId: string(),
|
|
15256
|
+
minScore: number(),
|
|
15257
|
+
/** Drafts, ready to edit. `source: 'assist'` until the operator touches one. */
|
|
15258
|
+
proposals: array(RetrainAnnotationDraftSchema).readonly(),
|
|
15259
|
+
/** Returned by the runner but removed by the threshold. */
|
|
15260
|
+
belowThreshold: number().int()
|
|
15261
|
+
}), object({
|
|
15262
|
+
kind: literal("refused"),
|
|
15263
|
+
/** `no-zone` is ours; the rest are the runner's own refusal vocabulary. */
|
|
15264
|
+
reason: string(),
|
|
15265
|
+
detail: string().optional()
|
|
15266
|
+
})]);
|
|
15267
|
+
/** The outcome of a lifecycle move owned by the retrain page. */
|
|
15268
|
+
var RetrainTransitionResultSchema = object({
|
|
15269
|
+
trackId: string(),
|
|
15270
|
+
/** Where the track ended up, whatever happened. */
|
|
15271
|
+
retrainStatus: RetrainStatusSchema,
|
|
15272
|
+
/** `false` ⇒ the move was refused or was a no-op; `reason` says which. */
|
|
15273
|
+
changed: boolean(),
|
|
15274
|
+
reason: _enum([
|
|
15275
|
+
"unknown-track",
|
|
15276
|
+
"no-frames-copied",
|
|
15277
|
+
"not-staging",
|
|
15278
|
+
"not-trained",
|
|
15279
|
+
"unchanged"
|
|
15280
|
+
]).optional()
|
|
15281
|
+
});
|
|
14970
15282
|
var DEFAULT_EVENT_QUERY_LIMIT = 1e3;
|
|
14971
15283
|
var MAX_EVENT_QUERY_LIMIT = 5e3;
|
|
14972
15284
|
var DeviceEventQueryInput = object({
|
|
@@ -15021,7 +15333,7 @@ var KeyEventSchema = object({
|
|
|
15021
15333
|
/** Track start time (firstSeen). */
|
|
15022
15334
|
timestamp: number(),
|
|
15023
15335
|
className: string(),
|
|
15024
|
-
|
|
15336
|
+
...TieredLabelFields,
|
|
15025
15337
|
importance: number(),
|
|
15026
15338
|
/** Highest-confidence ObjectEvent id for the track (empty when none). */
|
|
15027
15339
|
bestEventId: string(),
|
|
@@ -15295,6 +15607,79 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
15295
15607
|
}), method(object({ deviceIds: array(number()).optional() }), object({ url: string() }), {
|
|
15296
15608
|
kind: "query",
|
|
15297
15609
|
auth: "admin"
|
|
15610
|
+
}), method(object({
|
|
15611
|
+
/** Empty ⇒ every camera that has staging tracks. A LIST, not a single
|
|
15612
|
+
* `deviceId`, deliberately: `deviceId` would make this device-bound and
|
|
15613
|
+
* route it at one camera's owner, and "every camera" would stop being
|
|
15614
|
+
* expressible at all. */
|
|
15615
|
+
deviceIds: array(number()).optional(),
|
|
15616
|
+
limit: number().int().min(1).max(500).optional()
|
|
15617
|
+
}), array(RetrainTrackSchema).readonly(), {
|
|
15618
|
+
kind: "query",
|
|
15619
|
+
auth: "admin"
|
|
15620
|
+
}), method(object({ trackId: string() }), RetrainFrameListSchema, {
|
|
15621
|
+
kind: "query",
|
|
15622
|
+
auth: "admin"
|
|
15623
|
+
}), method(object({
|
|
15624
|
+
deviceId: number(),
|
|
15625
|
+
trackId: string(),
|
|
15626
|
+
mediaKeys: array(string()).min(1)
|
|
15627
|
+
}), RetrainFrameSelectionSchema, {
|
|
15628
|
+
kind: "mutation",
|
|
15629
|
+
auth: "admin"
|
|
15630
|
+
}), method(object({
|
|
15631
|
+
deviceId: number(),
|
|
15632
|
+
trackId: string(),
|
|
15633
|
+
frameId: string()
|
|
15634
|
+
}), object({
|
|
15635
|
+
removed: boolean(),
|
|
15636
|
+
removedAnnotations: number().int()
|
|
15637
|
+
}), {
|
|
15638
|
+
kind: "mutation",
|
|
15639
|
+
auth: "admin"
|
|
15640
|
+
}), method(object({ frameId: string() }), object({
|
|
15641
|
+
base64: string(),
|
|
15642
|
+
width: number().int(),
|
|
15643
|
+
height: number().int()
|
|
15644
|
+
}), {
|
|
15645
|
+
kind: "query",
|
|
15646
|
+
auth: "admin"
|
|
15647
|
+
}), method(object({
|
|
15648
|
+
deviceId: number(),
|
|
15649
|
+
trackId: string(),
|
|
15650
|
+
frameId: string(),
|
|
15651
|
+
subject: RetrainAssistSubjectSchema,
|
|
15652
|
+
/** Which node runs it. Absent ⇒ wherever an unowned call lands. */
|
|
15653
|
+
nodeId: string().optional()
|
|
15654
|
+
}), RetrainAssistResultSchema, {
|
|
15655
|
+
kind: "mutation",
|
|
15656
|
+
auth: "admin"
|
|
15657
|
+
}), method(object({ trackId: string() }), array(RetrainAnnotationSchema).readonly(), {
|
|
15658
|
+
kind: "query",
|
|
15659
|
+
auth: "admin"
|
|
15660
|
+
}), method(object({
|
|
15661
|
+
deviceId: number(),
|
|
15662
|
+
trackId: string(),
|
|
15663
|
+
frameId: string(),
|
|
15664
|
+
annotations: array(RetrainAnnotationDraftSchema)
|
|
15665
|
+
}), array(RetrainAnnotationSchema).readonly(), {
|
|
15666
|
+
kind: "mutation",
|
|
15667
|
+
auth: "admin"
|
|
15668
|
+
}), method(object({
|
|
15669
|
+
deviceId: number(),
|
|
15670
|
+
trackId: string()
|
|
15671
|
+
}), RetrainTransitionResultSchema, {
|
|
15672
|
+
kind: "mutation",
|
|
15673
|
+
auth: "admin"
|
|
15674
|
+
}), method(object({
|
|
15675
|
+
deviceId: number(),
|
|
15676
|
+
trackId: string()
|
|
15677
|
+
}), RetrainTransitionResultSchema, {
|
|
15678
|
+
kind: "mutation",
|
|
15679
|
+
auth: "admin"
|
|
15680
|
+
}), method(object({ deviceIds: array(number()).optional() }), object({ url: string() }), {
|
|
15681
|
+
kind: "query",
|
|
15682
|
+
auth: "admin"
|
|
15298
15683
|
}), method(object({
|
|
15299
15684
|
eventId: string(),
|
|
15300
15685
|
kind: MediaFileKindEnum.optional()
|
|
@@ -15874,6 +16259,22 @@ var DetailResultSchema = object({
|
|
|
15874
16259
|
bbox: NativeCropBboxSchema.optional(),
|
|
15875
16260
|
embedding: string().optional(),
|
|
15876
16261
|
label: string().optional(),
|
|
16262
|
+
/**
|
|
16263
|
+
* The tier `label` occupies, copied VERBATIM from the producing step's
|
|
16264
|
+
* `StepDefinition.labelTier` (roadmap 4g). Present only when `label` is.
|
|
16265
|
+
*
|
|
16266
|
+
* It rides the wire rather than being resolved by the consumer because the
|
|
16267
|
+
* declaration lives with the step definition, which only the executing node
|
|
16268
|
+
* has: post-analysis holds no step registry, and re-deriving the tier from
|
|
16269
|
+
* `className` there would be exactly the inference this model exists to
|
|
16270
|
+
* forbid. A `label` that arrives WITHOUT this field is refused by the write
|
|
16271
|
+
* rule and logged (`label tier undeclared`) — an older runner therefore
|
|
16272
|
+
* stops enriching rather than guessing, which is why addon-pipeline is
|
|
16273
|
+
* deployed BEFORE addon-post-analysis.
|
|
16274
|
+
*/
|
|
16275
|
+
labelTier: union([literal(1), literal(2)]).optional(),
|
|
16276
|
+
/** Model that produced `label` — carried into the tier's attribution. */
|
|
16277
|
+
labelModelId: string().optional(),
|
|
15877
16278
|
alignedCropJpeg: string().optional(),
|
|
15878
16279
|
/** Face short side (px) measured on the NATIVE crop surface. The `bbox`
|
|
15879
16280
|
* above is detection-frame px (≈6× smaller on a 4K camera) — min-face-size
|
|
@@ -26191,6 +26592,12 @@ Object.freeze({
|
|
|
26191
26592
|
addonId: null,
|
|
26192
26593
|
access: "delete"
|
|
26193
26594
|
},
|
|
26595
|
+
"pipelineAnalytics.completeRetrainTrack": {
|
|
26596
|
+
capName: "pipeline-analytics",
|
|
26597
|
+
capScope: "device",
|
|
26598
|
+
addonId: null,
|
|
26599
|
+
access: "create"
|
|
26600
|
+
},
|
|
26194
26601
|
"pipelineAnalytics.deleteDeviceEvents": {
|
|
26195
26602
|
capName: "pipeline-analytics",
|
|
26196
26603
|
capScope: "device",
|
|
@@ -26203,6 +26610,12 @@ Object.freeze({
|
|
|
26203
26610
|
addonId: null,
|
|
26204
26611
|
access: "delete"
|
|
26205
26612
|
},
|
|
26613
|
+
"pipelineAnalytics.deselectRetrainFrame": {
|
|
26614
|
+
capName: "pipeline-analytics",
|
|
26615
|
+
capScope: "device",
|
|
26616
|
+
addonId: null,
|
|
26617
|
+
access: "create"
|
|
26618
|
+
},
|
|
26206
26619
|
"pipelineAnalytics.getActiveTracks": {
|
|
26207
26620
|
capName: "pipeline-analytics",
|
|
26208
26621
|
capScope: "device",
|
|
@@ -26263,6 +26676,18 @@ Object.freeze({
|
|
|
26263
26676
|
addonId: null,
|
|
26264
26677
|
access: "view"
|
|
26265
26678
|
},
|
|
26679
|
+
"pipelineAnalytics.getRetrainExportUrl": {
|
|
26680
|
+
capName: "pipeline-analytics",
|
|
26681
|
+
capScope: "device",
|
|
26682
|
+
addonId: null,
|
|
26683
|
+
access: "view"
|
|
26684
|
+
},
|
|
26685
|
+
"pipelineAnalytics.getRetrainFrameImage": {
|
|
26686
|
+
capName: "pipeline-analytics",
|
|
26687
|
+
capScope: "device",
|
|
26688
|
+
addonId: null,
|
|
26689
|
+
access: "view"
|
|
26690
|
+
},
|
|
26266
26691
|
"pipelineAnalytics.getSensorEvents": {
|
|
26267
26692
|
capName: "pipeline-analytics",
|
|
26268
26693
|
capScope: "device",
|
|
@@ -26317,6 +26742,24 @@ Object.freeze({
|
|
|
26317
26742
|
addonId: null,
|
|
26318
26743
|
access: "view"
|
|
26319
26744
|
},
|
|
26745
|
+
"pipelineAnalytics.listRetrainAnnotations": {
|
|
26746
|
+
capName: "pipeline-analytics",
|
|
26747
|
+
capScope: "device",
|
|
26748
|
+
addonId: null,
|
|
26749
|
+
access: "view"
|
|
26750
|
+
},
|
|
26751
|
+
"pipelineAnalytics.listRetrainFrames": {
|
|
26752
|
+
capName: "pipeline-analytics",
|
|
26753
|
+
capScope: "device",
|
|
26754
|
+
addonId: null,
|
|
26755
|
+
access: "view"
|
|
26756
|
+
},
|
|
26757
|
+
"pipelineAnalytics.listRetrainStaging": {
|
|
26758
|
+
capName: "pipeline-analytics",
|
|
26759
|
+
capScope: "device",
|
|
26760
|
+
addonId: null,
|
|
26761
|
+
access: "view"
|
|
26762
|
+
},
|
|
26320
26763
|
"pipelineAnalytics.listTrackMedia": {
|
|
26321
26764
|
capName: "pipeline-analytics",
|
|
26322
26765
|
capScope: "device",
|
|
@@ -26329,6 +26772,12 @@ Object.freeze({
|
|
|
26329
26772
|
addonId: null,
|
|
26330
26773
|
access: "view"
|
|
26331
26774
|
},
|
|
26775
|
+
"pipelineAnalytics.proposeRetrainAnnotations": {
|
|
26776
|
+
capName: "pipeline-analytics",
|
|
26777
|
+
capScope: "device",
|
|
26778
|
+
addonId: null,
|
|
26779
|
+
access: "create"
|
|
26780
|
+
},
|
|
26332
26781
|
"pipelineAnalytics.pruneEvents": {
|
|
26333
26782
|
capName: "pipeline-analytics",
|
|
26334
26783
|
capScope: "device",
|
|
@@ -26359,12 +26808,30 @@ Object.freeze({
|
|
|
26359
26808
|
addonId: null,
|
|
26360
26809
|
access: "create"
|
|
26361
26810
|
},
|
|
26811
|
+
"pipelineAnalytics.restageRetrainTrack": {
|
|
26812
|
+
capName: "pipeline-analytics",
|
|
26813
|
+
capScope: "device",
|
|
26814
|
+
addonId: null,
|
|
26815
|
+
access: "create"
|
|
26816
|
+
},
|
|
26817
|
+
"pipelineAnalytics.saveRetrainAnnotations": {
|
|
26818
|
+
capName: "pipeline-analytics",
|
|
26819
|
+
capScope: "device",
|
|
26820
|
+
addonId: null,
|
|
26821
|
+
access: "create"
|
|
26822
|
+
},
|
|
26362
26823
|
"pipelineAnalytics.searchObjectEvents": {
|
|
26363
26824
|
capName: "pipeline-analytics",
|
|
26364
26825
|
capScope: "device",
|
|
26365
26826
|
addonId: null,
|
|
26366
26827
|
access: "view"
|
|
26367
26828
|
},
|
|
26829
|
+
"pipelineAnalytics.selectRetrainFrames": {
|
|
26830
|
+
capName: "pipeline-analytics",
|
|
26831
|
+
capScope: "device",
|
|
26832
|
+
addonId: null,
|
|
26833
|
+
access: "create"
|
|
26834
|
+
},
|
|
26368
26835
|
"pipelineAnalytics.setTrackFlags": {
|
|
26369
26836
|
capName: "pipeline-analytics",
|
|
26370
26837
|
capScope: "device",
|
|
@@ -27757,6 +28224,12 @@ Object.freeze({
|
|
|
27757
28224
|
addonId: null,
|
|
27758
28225
|
access: "create"
|
|
27759
28226
|
},
|
|
28227
|
+
"streamBroker.fetchEventMedia": {
|
|
28228
|
+
capName: "stream-broker",
|
|
28229
|
+
capScope: "system",
|
|
28230
|
+
addonId: null,
|
|
28231
|
+
access: "create"
|
|
28232
|
+
},
|
|
27760
28233
|
"streamBroker.getAllRtspEntries": {
|
|
27761
28234
|
capName: "stream-broker",
|
|
27762
28235
|
capScope: "system",
|
|
@@ -27841,6 +28314,12 @@ Object.freeze({
|
|
|
27841
28314
|
addonId: null,
|
|
27842
28315
|
access: "create"
|
|
27843
28316
|
},
|
|
28317
|
+
"streamBroker.produceEventMedia": {
|
|
28318
|
+
capName: "stream-broker",
|
|
28319
|
+
capScope: "system",
|
|
28320
|
+
addonId: null,
|
|
28321
|
+
access: "create"
|
|
28322
|
+
},
|
|
27844
28323
|
"streamBroker.publishCameraStream": {
|
|
27845
28324
|
capName: "stream-broker",
|
|
27846
28325
|
capScope: "system",
|
|
@@ -28762,7 +29241,7 @@ var AdminUIAddon = class extends BaseAddon {
|
|
|
28762
29241
|
capability: adminUiCapability,
|
|
28763
29242
|
provider: {
|
|
28764
29243
|
getStaticDir: async () => ({ staticDir: resolveAdminUiDistDir() }),
|
|
28765
|
-
getVersion: async () => ({ version: "1.2.
|
|
29244
|
+
getVersion: async () => ({ version: "1.2.36" })
|
|
28766
29245
|
}
|
|
28767
29246
|
}];
|
|
28768
29247
|
}
|