@camstack/addon-model-studio 1.0.22 → 1.0.24
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-xXTYDtIM.mjs → MotionZonesSettings-COOdMPIf.mjs} +1 -1
- package/dist/{PrivacyMaskSettings-CUB3plKT.mjs → PrivacyMaskSettings-CjUofahv.mjs} +2 -2
- package/dist/_stub.js +55 -26
- package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-D6bE3D1g.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-C0lo-0LK.mjs} +4 -4
- package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-R5WCF0Gp.mjs +26 -0
- package/dist/addon-model-studio.css +1 -1
- package/dist/{hostInit-mBy3cfN8.mjs → hostInit-Do3PJRf0.mjs} +3 -3
- package/dist/model-studio.addon.js +1221 -57
- package/dist/model-studio.addon.mjs +1221 -57
- package/dist/{player-overlays-6JCUcHzw.mjs → player-overlays-AOOeo2bB.mjs} +1 -1
- package/dist/remoteEntry.js +1 -1
- package/dist/{trash-2-CH1_KJWF.mjs → trash-2-CSYyXlO5.mjs} +1 -1
- package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-jmSb26M_.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-C1iXLvbC.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-DGeSi8Rf.mjs +0 -26
|
@@ -4297,6 +4297,14 @@ function object(shape, params) {
|
|
|
4297
4297
|
...normalizeParams(params)
|
|
4298
4298
|
});
|
|
4299
4299
|
}
|
|
4300
|
+
function looseObject(shape, params) {
|
|
4301
|
+
return new ZodObject({
|
|
4302
|
+
type: "object",
|
|
4303
|
+
shape,
|
|
4304
|
+
catchall: unknown(),
|
|
4305
|
+
...normalizeParams(params)
|
|
4306
|
+
});
|
|
4307
|
+
}
|
|
4300
4308
|
var ZodUnion = /*@__PURE__*/ $constructor("ZodUnion", (inst, def) => {
|
|
4301
4309
|
$ZodUnion.init(inst, def);
|
|
4302
4310
|
ZodType.init(inst, def);
|
|
@@ -4638,7 +4646,7 @@ function _instanceof(cls, params = {}) {
|
|
|
4638
4646
|
return inst;
|
|
4639
4647
|
}
|
|
4640
4648
|
//#endregion
|
|
4641
|
-
//#region ../types/dist/
|
|
4649
|
+
//#region ../types/dist/event-category-H4AVePnn.mjs
|
|
4642
4650
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
4643
4651
|
EventCategory["SystemBoot"] = "system.boot";
|
|
4644
4652
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -4788,6 +4796,9 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
4788
4796
|
EventCategory["RecordingSegmentWritten"] = "recording.segment.written";
|
|
4789
4797
|
EventCategory["RecordingPolicyFallback"] = "recording.policy.fallback";
|
|
4790
4798
|
EventCategory["RecordingRetentionCompleted"] = "recording.retention.completed";
|
|
4799
|
+
/** Runner-sampled scrub thumbnail (~1/5 s/camera). Telemetry (D8): a lost
|
|
4800
|
+
* thumb is a scrub gap the recorder's keyframe backfill covers. */
|
|
4801
|
+
EventCategory["RecordingThumbSampled"] = "recording.thumb-sampled";
|
|
4791
4802
|
EventCategory["DetectionEvent"] = "detection.event";
|
|
4792
4803
|
EventCategory["SessionTrackNew"] = "session.track.new";
|
|
4793
4804
|
EventCategory["SessionTrackExpired"] = "session.track.expired";
|
|
@@ -5048,10 +5059,51 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
5048
5059
|
EventCategory["EnrichmentEmbeddingStored"] = "enrichment.embedding.stored";
|
|
5049
5060
|
EventCategory["EnrichmentSceneStateChanged"] = "enrichment.scene.state-changed";
|
|
5050
5061
|
EventCategory["EnrichmentActivitySummary"] = "enrichment.activity.summary";
|
|
5062
|
+
/**
|
|
5063
|
+
* Unified track-lifecycle event: ONE category carrying `phase:
|
|
5064
|
+
* 'start' | 'update' | 'end'` with a rich, typed
|
|
5065
|
+
* `PipelineAnalyticsTrackLifecyclePayload`. Supersedes the thin
|
|
5066
|
+
* `PipelineAnalyticsTrackStarted` / `PipelineAnalyticsTrackEnded`
|
|
5067
|
+
* pair — a consumer subscribes once and branches on `phase`.
|
|
5068
|
+
*/
|
|
5069
|
+
EventCategory["PipelineAnalyticsTrackLifecycle"] = "pipeline-analytics.track-lifecycle";
|
|
5070
|
+
/**
|
|
5071
|
+
* @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
|
|
5072
|
+
* (`phase:'start'`). Kept as a soft alias — no known subscribers.
|
|
5073
|
+
*/
|
|
5051
5074
|
EventCategory["PipelineAnalyticsTrackStarted"] = "pipeline-analytics.track-started";
|
|
5075
|
+
/**
|
|
5076
|
+
* @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
|
|
5077
|
+
* (`phase:'end'`). Kept as a soft alias — no known subscribers.
|
|
5078
|
+
*/
|
|
5052
5079
|
EventCategory["PipelineAnalyticsTrackEnded"] = "pipeline-analytics.track-ended";
|
|
5053
5080
|
EventCategory["PipelineAnalyticsDetectionEvent"] = "pipeline-analytics.detection-event";
|
|
5054
5081
|
EventCategory["PipelineAnalyticsFrameTracked"] = "pipeline-analytics.frame-tracked";
|
|
5082
|
+
/**
|
|
5083
|
+
* Fired by `addon-post-analysis` when a parked (stationary) object appears
|
|
5084
|
+
* (a track was promoted to a stationary-registry entry) or departs (the
|
|
5085
|
+
* object moved / was removed). Telemetry (D8): lossy, drives a UI refresh of
|
|
5086
|
+
* the dedicated "Stationary" section — never the live event feed. Payload:
|
|
5087
|
+
* `{ deviceId, entryId, className, phase:'appeared'|'departed', timestamp }`.
|
|
5088
|
+
*/
|
|
5089
|
+
EventCategory["PipelineAnalyticsStationaryChanged"] = "pipeline-analytics.stationary-changed";
|
|
5090
|
+
/**
|
|
5091
|
+
* Fired by `addon-post-analysis` whenever a gallery face row changes:
|
|
5092
|
+
* `kind:'buffered'` a new detected face was persisted, `'assigned'` /
|
|
5093
|
+
* `'unassigned'` its identity link changed, `'deleted'` the row was
|
|
5094
|
+
* removed. Telemetry semantics (D8): a lost event only delays a refresh,
|
|
5095
|
+
* never a correctness issue. Payload `PipelineAnalyticsFaceGalleryChangedPayload`.
|
|
5096
|
+
*/
|
|
5097
|
+
EventCategory["PipelineAnalyticsFaceGalleryChanged"] = "pipeline-analytics.face-gallery-changed";
|
|
5098
|
+
/**
|
|
5099
|
+
* Fired by `addon-post-analysis` whenever a gallery plate row changes:
|
|
5100
|
+
* `kind:'buffered'` a new read was persisted (`PlateRecognizer.onTrackEnd`),
|
|
5101
|
+
* `'assigned'` / `'unassigned'` its vehicle link changed
|
|
5102
|
+
* (`PlateGalleryProvider`), `'deleted'` the row was removed. Telemetry
|
|
5103
|
+
* semantics (D8): a lost event only delays a refresh, never a correctness
|
|
5104
|
+
* issue. Payload `PipelineAnalyticsPlateGalleryChangedPayload`.
|
|
5105
|
+
*/
|
|
5106
|
+
EventCategory["PipelineAnalyticsPlateGalleryChanged"] = "pipeline-analytics.plate-gallery-changed";
|
|
5055
5107
|
EventCategory["FrigateLiveEvent"] = "frigate.live-event";
|
|
5056
5108
|
EventCategory["CameraStreamsProfileSlotsChanged"] = "camera-streams.onProfileSlotsChanged";
|
|
5057
5109
|
/**
|
|
@@ -6880,7 +6932,8 @@ var MODEL_FORMATS = [
|
|
|
6880
6932
|
"coreml",
|
|
6881
6933
|
"openvino",
|
|
6882
6934
|
"tflite",
|
|
6883
|
-
"pt"
|
|
6935
|
+
"pt",
|
|
6936
|
+
"gguf"
|
|
6884
6937
|
];
|
|
6885
6938
|
/**
|
|
6886
6939
|
* Multi-file format payload.
|
|
@@ -6924,7 +6977,8 @@ var ModelFormatsSchema = object({
|
|
|
6924
6977
|
coreml: ModelFormatEntrySchema.optional(),
|
|
6925
6978
|
openvino: ModelFormatEntrySchema.optional(),
|
|
6926
6979
|
tflite: ModelFormatEntrySchema.optional(),
|
|
6927
|
-
pt: ModelFormatEntrySchema.optional()
|
|
6980
|
+
pt: ModelFormatEntrySchema.optional(),
|
|
6981
|
+
gguf: ModelFormatEntrySchema.optional()
|
|
6928
6982
|
});
|
|
6929
6983
|
/**
|
|
6930
6984
|
* Variant-selector grouping axes. Shared by the full `ModelCatalogEntry` and by
|
|
@@ -6965,6 +7019,15 @@ var ModelCatalogEntrySchema = object({
|
|
|
6965
7019
|
width: number(),
|
|
6966
7020
|
height: number()
|
|
6967
7021
|
}),
|
|
7022
|
+
/**
|
|
7023
|
+
* Channel count of the model input tensor. Omit ⇒ 3 (RGB), the default for
|
|
7024
|
+
* every detector / classifier / embedder. Set to 1 for a grayscale CTC text
|
|
7025
|
+
* recognizer (EasyOCR VGG plate-OCR: input `[N,1,H,W]`) so the preprocess
|
|
7026
|
+
* feeds a single-channel, EasyOCR-normalized tensor instead of the default
|
|
7027
|
+
* 3-channel RGB one. Threaded through `PoolModelConfig.inputChannels` to the
|
|
7028
|
+
* Python inference pool.
|
|
7029
|
+
*/
|
|
7030
|
+
inputChannels: number().int().positive().optional(),
|
|
6968
7031
|
labels: array(LabelDefinitionSchema).readonly(),
|
|
6969
7032
|
inputLayout: _enum(["nchw", "nhwc"]).optional(),
|
|
6970
7033
|
inputNormalization: _enum([
|
|
@@ -6974,6 +7037,16 @@ var ModelCatalogEntrySchema = object({
|
|
|
6974
7037
|
]).optional(),
|
|
6975
7038
|
preprocessMode: _enum(["letterbox", "resize"]).optional(),
|
|
6976
7039
|
/**
|
|
7040
|
+
* Per-MODEL postprocessor override. Absent ⇒ the step's own
|
|
7041
|
+
* `StepDefinition.postprocessor` applies (the normal case — every model in a
|
|
7042
|
+
* step shares its decode). Set it when a step hosts models with DIFFERENT raw
|
|
7043
|
+
* output layouts under one slot: e.g. object-detection is `'yolo'` by default,
|
|
7044
|
+
* but a Coral SSD MobileNet build emits the `TFLite_Detection_PostProcess`
|
|
7045
|
+
* 4-tensor layout and needs `'ssd'`. Threaded into `PoolModelConfig.postprocessor`
|
|
7046
|
+
* by the engine factory (`modelEntry.postprocessor ?? def.postprocessor`).
|
|
7047
|
+
*/
|
|
7048
|
+
postprocessor: custom().optional(),
|
|
7049
|
+
/**
|
|
6977
7050
|
* When true, the executor produces a landmark-aligned crop (similarity warp
|
|
6978
7051
|
* onto the canonical template) before this step runs, instead of a plain
|
|
6979
7052
|
* axis-aligned bbox crop. Required for face-recognition embedders (ArcFace):
|
|
@@ -9784,7 +9857,7 @@ object({
|
|
|
9784
9857
|
deviceId: number(),
|
|
9785
9858
|
timestamp: number()
|
|
9786
9859
|
});
|
|
9787
|
-
DeviceType.Button;
|
|
9860
|
+
DeviceType.Button, DeviceType.Camera;
|
|
9788
9861
|
/**
|
|
9789
9862
|
* Enum-state sensor — a string value picked from a finite option set.
|
|
9790
9863
|
* Drives HA `sensor` entries with `state_class: enum` (HVAC action
|
|
@@ -10450,7 +10523,8 @@ var ModelFormatSchema$1 = _enum([
|
|
|
10450
10523
|
"coreml",
|
|
10451
10524
|
"openvino",
|
|
10452
10525
|
"tflite",
|
|
10453
|
-
"pt"
|
|
10526
|
+
"pt",
|
|
10527
|
+
"gguf"
|
|
10454
10528
|
]);
|
|
10455
10529
|
var PipelineSlotSchema = _enum([
|
|
10456
10530
|
"detector",
|
|
@@ -10544,7 +10618,8 @@ var EngineProvisioningSchema = object({
|
|
|
10544
10618
|
runtimeId: _enum([
|
|
10545
10619
|
"onnx",
|
|
10546
10620
|
"openvino",
|
|
10547
|
-
"coreml"
|
|
10621
|
+
"coreml",
|
|
10622
|
+
"edgetpu"
|
|
10548
10623
|
]).nullable(),
|
|
10549
10624
|
device: string().nullable(),
|
|
10550
10625
|
state: _enum([
|
|
@@ -11756,6 +11831,140 @@ DeviceType.Camera, method(object({ deviceId: number() }), PtzAutotrackStatusSche
|
|
|
11756
11831
|
deviceId: number(),
|
|
11757
11832
|
status: PtzAutotrackStatusSchema
|
|
11758
11833
|
});
|
|
11834
|
+
/**
|
|
11835
|
+
* scene-monitor — device-scoped reference-region state cap. An operator marks
|
|
11836
|
+
* a rect ROI on a camera frame and names one or more states; the engine
|
|
11837
|
+
* (pipeline-analytics, designated post-processing node) reports which state is
|
|
11838
|
+
* active on an ongoing basis. Two operator-selectable check modes share every-
|
|
11839
|
+
* thing except the comparator: `similarity` (CLIP cosine at the same ROI coords
|
|
11840
|
+
* vs condition-tagged references) and `llm` (vision-LLM judgment over the crop).
|
|
11841
|
+
*
|
|
11842
|
+
* D14 device-config archetype (`deviceConfig.ui.kind:'widget'`) — the framework
|
|
11843
|
+
* derives the device-detail contribution; the provider carries NO hand-written
|
|
11844
|
+
* settings-contribution methods. `status.kind:'push'` — the engine pushes on
|
|
11845
|
+
* every hysteresis flip / availability change; consumers never poll.
|
|
11846
|
+
*/
|
|
11847
|
+
/** Extensible condition tag. Seeded 'day' | 'night'; open by design so more can
|
|
11848
|
+
* be added without a wire break (matching falls back to any-condition refs). */
|
|
11849
|
+
var SceneConditionSchema = string();
|
|
11850
|
+
/** One captured reference — condition-tagged, model-version-gated. `embedding`
|
|
11851
|
+
* is `number[]` (Float32Array does NOT survive MsgPack/UDS). */
|
|
11852
|
+
var SceneReferenceSchema = object({
|
|
11853
|
+
embedding: array(number()),
|
|
11854
|
+
modelId: string(),
|
|
11855
|
+
condition: SceneConditionSchema,
|
|
11856
|
+
capturedAt: number(),
|
|
11857
|
+
thumbnailMediaId: string().optional()
|
|
11858
|
+
});
|
|
11859
|
+
var SceneMonitorStateSchema = object({
|
|
11860
|
+
id: string(),
|
|
11861
|
+
label: string(),
|
|
11862
|
+
references: array(SceneReferenceSchema),
|
|
11863
|
+
textPrompts: array(string()).optional(),
|
|
11864
|
+
referenceCount: number(),
|
|
11865
|
+
currentlyMatched: boolean()
|
|
11866
|
+
});
|
|
11867
|
+
/** Per-mode comparator params in a discriminated union so an `llm` scene never
|
|
11868
|
+
* carries similarity knobs and vice-versa. */
|
|
11869
|
+
var SceneCheckSchema = discriminatedUnion("mode", [object({
|
|
11870
|
+
mode: literal("similarity"),
|
|
11871
|
+
threshold: number().min(0).max(1),
|
|
11872
|
+
hysteresisCount: number().int().positive()
|
|
11873
|
+
}), object({
|
|
11874
|
+
mode: literal("llm"),
|
|
11875
|
+
prompt: string(),
|
|
11876
|
+
profileId: string().optional(),
|
|
11877
|
+
hysteresisCount: number().int().positive()
|
|
11878
|
+
})]);
|
|
11879
|
+
var SceneMonitorSchema = object({
|
|
11880
|
+
id: string(),
|
|
11881
|
+
label: string(),
|
|
11882
|
+
roi: MaskRectShapeSchema,
|
|
11883
|
+
enabled: boolean(),
|
|
11884
|
+
triggerMode: _enum([
|
|
11885
|
+
"periodic",
|
|
11886
|
+
"on-motion",
|
|
11887
|
+
"both"
|
|
11888
|
+
]),
|
|
11889
|
+
checkIntervalSec: number().optional(),
|
|
11890
|
+
check: SceneCheckSchema,
|
|
11891
|
+
states: array(SceneMonitorStateSchema),
|
|
11892
|
+
currentStateId: string().nullable(),
|
|
11893
|
+
lastCheckedAt: number().nullable(),
|
|
11894
|
+
lastConfidence: number().nullable(),
|
|
11895
|
+
currentCondition: SceneConditionSchema.nullable(),
|
|
11896
|
+
availability: _enum(["ok", "unavailable"]),
|
|
11897
|
+
unavailableReason: string().nullable()
|
|
11898
|
+
});
|
|
11899
|
+
var SceneMonitorStatusSchema = object({
|
|
11900
|
+
monitors: array(SceneMonitorSchema),
|
|
11901
|
+
lastFetchedAt: number()
|
|
11902
|
+
});
|
|
11903
|
+
DeviceType.Camera, method(object({ deviceId: number() }), SceneMonitorStatusSchema), method(object({
|
|
11904
|
+
deviceId: number(),
|
|
11905
|
+
label: string(),
|
|
11906
|
+
roi: MaskRectShapeSchema,
|
|
11907
|
+
check: SceneCheckSchema,
|
|
11908
|
+
triggerMode: _enum([
|
|
11909
|
+
"periodic",
|
|
11910
|
+
"on-motion",
|
|
11911
|
+
"both"
|
|
11912
|
+
]).optional(),
|
|
11913
|
+
checkIntervalSec: number().optional()
|
|
11914
|
+
}), SceneMonitorSchema, {
|
|
11915
|
+
kind: "mutation",
|
|
11916
|
+
auth: "admin"
|
|
11917
|
+
}), method(object({
|
|
11918
|
+
deviceId: number(),
|
|
11919
|
+
monitorId: string(),
|
|
11920
|
+
patch: object({
|
|
11921
|
+
label: string().optional(),
|
|
11922
|
+
roi: MaskRectShapeSchema.optional(),
|
|
11923
|
+
enabled: boolean().optional(),
|
|
11924
|
+
triggerMode: _enum([
|
|
11925
|
+
"periodic",
|
|
11926
|
+
"on-motion",
|
|
11927
|
+
"both"
|
|
11928
|
+
]).optional(),
|
|
11929
|
+
checkIntervalSec: number().optional(),
|
|
11930
|
+
check: SceneCheckSchema.optional()
|
|
11931
|
+
})
|
|
11932
|
+
}), _void(), {
|
|
11933
|
+
kind: "mutation",
|
|
11934
|
+
auth: "admin"
|
|
11935
|
+
}), method(object({
|
|
11936
|
+
deviceId: number(),
|
|
11937
|
+
monitorId: string()
|
|
11938
|
+
}), _void(), {
|
|
11939
|
+
kind: "mutation",
|
|
11940
|
+
auth: "admin"
|
|
11941
|
+
}), method(object({
|
|
11942
|
+
deviceId: number(),
|
|
11943
|
+
monitorId: string(),
|
|
11944
|
+
stateId: string().optional(),
|
|
11945
|
+
label: string().optional(),
|
|
11946
|
+
condition: SceneConditionSchema.optional()
|
|
11947
|
+
}), object({
|
|
11948
|
+
stateId: string(),
|
|
11949
|
+
referenceCount: number()
|
|
11950
|
+
}), {
|
|
11951
|
+
kind: "mutation",
|
|
11952
|
+
auth: "admin"
|
|
11953
|
+
}), method(object({
|
|
11954
|
+
deviceId: number(),
|
|
11955
|
+
monitorId: string(),
|
|
11956
|
+
stateId: string(),
|
|
11957
|
+
index: number()
|
|
11958
|
+
}), _void(), {
|
|
11959
|
+
kind: "mutation",
|
|
11960
|
+
auth: "admin"
|
|
11961
|
+
}), method(object({
|
|
11962
|
+
deviceId: number(),
|
|
11963
|
+
monitorId: string()
|
|
11964
|
+
}), _void(), {
|
|
11965
|
+
kind: "mutation",
|
|
11966
|
+
auth: "admin"
|
|
11967
|
+
});
|
|
11759
11968
|
object({
|
|
11760
11969
|
/** Whether the script is currently executing. */
|
|
11761
11970
|
isRunning: boolean(),
|
|
@@ -12163,6 +12372,36 @@ var ZoneScopeBreakdownSchema = PerScopeBreakdownSchema.extend({
|
|
|
12163
12372
|
* with the per-track detail panel and live overlay. */
|
|
12164
12373
|
trackIds: array(string()).readonly()
|
|
12165
12374
|
});
|
|
12375
|
+
/**
|
|
12376
|
+
* A parked ("stationary") object surfaced alongside occupancy — an object that
|
|
12377
|
+
* settled and stopped moving. It is NO LONGER a tracked object (the tracker was
|
|
12378
|
+
* told to forget it so it stops re-spawning tracks/events), but it IS still
|
|
12379
|
+
* physically present, so it keeps counting toward `frame` occupancy and is
|
|
12380
|
+
* listed here so the UI can show it in a dedicated "Stationary" section instead
|
|
12381
|
+
* of flooding the live event feed.
|
|
12382
|
+
*/
|
|
12383
|
+
var StationaryObjectSchema = object({
|
|
12384
|
+
id: string(),
|
|
12385
|
+
className: string(),
|
|
12386
|
+
bbox: object({
|
|
12387
|
+
x: number(),
|
|
12388
|
+
y: number(),
|
|
12389
|
+
w: number(),
|
|
12390
|
+
h: number()
|
|
12391
|
+
}),
|
|
12392
|
+
frameWidth: number().int().nonnegative(),
|
|
12393
|
+
frameHeight: number().int().nonnegative(),
|
|
12394
|
+
/** When the source track was first seen. */
|
|
12395
|
+
firstSeenAt: number().int(),
|
|
12396
|
+
/** When the object was recognised as parked (promotion time). */
|
|
12397
|
+
becameStationaryAt: number().int(),
|
|
12398
|
+
/** Last frame a detection confirmed the object is still there. */
|
|
12399
|
+
lastConfirmedAt: number().int(),
|
|
12400
|
+
/** Enrichment label carried from the source track (identity / plate). */
|
|
12401
|
+
label: string().optional(),
|
|
12402
|
+
/** Native-resolution key-frame media key for the parked object's best image. */
|
|
12403
|
+
keyFrameMediaKey: string().optional()
|
|
12404
|
+
});
|
|
12166
12405
|
var CameraOccupancySnapshotSchema = object({
|
|
12167
12406
|
/** Frame timestamp of the inference result that produced this snapshot. */
|
|
12168
12407
|
ts: number().int(),
|
|
@@ -12171,10 +12410,15 @@ var CameraOccupancySnapshotSchema = object({
|
|
|
12171
12410
|
frameHeight: number().int().nonnegative(),
|
|
12172
12411
|
/** Per-zone breakdown — one entry per defined zone (user + onboard). */
|
|
12173
12412
|
zones: array(ZoneScopeBreakdownSchema).readonly(),
|
|
12174
|
-
/** Frame-wide aggregate (everywhere, regardless of zone membership).
|
|
12413
|
+
/** Frame-wide aggregate (everywhere, regardless of zone membership).
|
|
12414
|
+
* INCLUDES currently-confirmed stationary objects (they are still present). */
|
|
12175
12415
|
frame: PerScopeBreakdownSchema,
|
|
12176
12416
|
/** Detections that landed outside every zone. Empty when no zones defined. */
|
|
12177
|
-
unzoned: PerScopeBreakdownSchema
|
|
12417
|
+
unzoned: PerScopeBreakdownSchema,
|
|
12418
|
+
/** Parked objects on this camera (additive — absent on legacy snapshots).
|
|
12419
|
+
* Surfaced separately so the UI shows them in a dedicated section rather
|
|
12420
|
+
* than as repeated tracks/events. */
|
|
12421
|
+
stationaryObjects: array(StationaryObjectSchema).readonly().optional()
|
|
12178
12422
|
});
|
|
12179
12423
|
/**
|
|
12180
12424
|
* Time-series resolution. The history methods return one bucket per
|
|
@@ -12783,7 +13027,12 @@ var NotificationRuleConditionsSchema = object({
|
|
|
12783
13027
|
clipDescription: object({
|
|
12784
13028
|
text: string().min(1),
|
|
12785
13029
|
minSimilarity: number().min(0).max(1)
|
|
12786
|
-
}).optional()
|
|
13030
|
+
}).optional(),
|
|
13031
|
+
/** Match events whose recognized-entity label (face identity name or plate
|
|
13032
|
+
* vehicle name, propagated onto `event.data.label`) is one of these values.
|
|
13033
|
+
* Empty/absent → unaffected (back-compat). Enables "notify me when <named
|
|
13034
|
+
* vehicle/person> is seen". */
|
|
13035
|
+
labels: array(string()).readonly().optional()
|
|
12787
13036
|
});
|
|
12788
13037
|
var NotificationRuleTemplateSchema = object({
|
|
12789
13038
|
title: string(),
|
|
@@ -13041,11 +13290,19 @@ method(object({
|
|
|
13041
13290
|
* login page needs NO change.
|
|
13042
13291
|
*
|
|
13043
13292
|
* - `widget` — a Module-Federation widget the login page mounts (via
|
|
13044
|
-
* `loadRemoteBundle`) for an in-page ceremony.
|
|
13045
|
-
*
|
|
13046
|
-
*
|
|
13047
|
-
*
|
|
13048
|
-
*
|
|
13293
|
+
* `loadRemoteBundle`) for an in-page ceremony. `auth.listLoginMethods`
|
|
13294
|
+
* stamps a public `bundleUrl` from `addonId` + `bundle`. Generic
|
|
13295
|
+
* mechanism kept for future use; no shipped addon uses it on the login
|
|
13296
|
+
* page (the passkey ceremony below runs natively in the shell instead).
|
|
13297
|
+
*
|
|
13298
|
+
* - `passkey` — a declarative WebAuthn ceremony the shell renders
|
|
13299
|
+
* natively (`@simplewebauthn/browser` lives in `addon-admin-ui`, not in
|
|
13300
|
+
* a remotely-loaded bundle). Carries the addon's effective `rpId` /
|
|
13301
|
+
* `origin` (from its `resolveRpID()` / `resolveOrigin()`) so the shell
|
|
13302
|
+
* can gate visibility (IP-literal origin, hostname/rpId mismatch) WITHOUT
|
|
13303
|
+
* fetching any remote code pre-auth. Contribution stays unconditional —
|
|
13304
|
+
* enrollment state is never leaked pre-auth; visibility is a shell
|
|
13305
|
+
* decision.
|
|
13049
13306
|
*
|
|
13050
13307
|
* Every contribution carries a `stage`:
|
|
13051
13308
|
* - `primary` — shown on the first credentials screen (OIDC /
|
|
@@ -13059,30 +13316,45 @@ method(object({
|
|
|
13059
13316
|
*/
|
|
13060
13317
|
/** When a login method renders in the two-phase login flow. */
|
|
13061
13318
|
var LoginStageEnum = _enum(["primary", "second-factor"]);
|
|
13062
|
-
/** One login-method contribution — redirect button
|
|
13063
|
-
var LoginMethodContributionSchema = discriminatedUnion("kind", [
|
|
13064
|
-
|
|
13065
|
-
|
|
13066
|
-
|
|
13067
|
-
|
|
13068
|
-
|
|
13069
|
-
|
|
13070
|
-
|
|
13071
|
-
|
|
13072
|
-
|
|
13073
|
-
|
|
13074
|
-
|
|
13075
|
-
|
|
13076
|
-
|
|
13077
|
-
|
|
13078
|
-
|
|
13079
|
-
|
|
13080
|
-
|
|
13081
|
-
|
|
13082
|
-
|
|
13083
|
-
|
|
13084
|
-
|
|
13085
|
-
|
|
13319
|
+
/** One login-method contribution — redirect button, pre-auth widget, or native passkey ceremony. */
|
|
13320
|
+
var LoginMethodContributionSchema = discriminatedUnion("kind", [
|
|
13321
|
+
object({
|
|
13322
|
+
kind: literal("redirect"),
|
|
13323
|
+
/** Stable id within the login-method set (e.g. `auth-oidc/google`). */
|
|
13324
|
+
id: string(),
|
|
13325
|
+
/** Operator-facing button label. */
|
|
13326
|
+
label: string(),
|
|
13327
|
+
/** lucide-react icon name. */
|
|
13328
|
+
icon: string().optional(),
|
|
13329
|
+
/** Addon-owned HTTP route the button navigates to (GET). */
|
|
13330
|
+
startUrl: string(),
|
|
13331
|
+
stage: LoginStageEnum
|
|
13332
|
+
}),
|
|
13333
|
+
object({
|
|
13334
|
+
kind: literal("widget"),
|
|
13335
|
+
/** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
|
|
13336
|
+
id: string(),
|
|
13337
|
+
/** Owning addon id — drives the public bundle URL + the MF namespace. */
|
|
13338
|
+
addonId: string(),
|
|
13339
|
+
/** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
|
|
13340
|
+
bundle: string(),
|
|
13341
|
+
/** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
|
|
13342
|
+
remote: WidgetRemoteSchema,
|
|
13343
|
+
stage: LoginStageEnum
|
|
13344
|
+
}),
|
|
13345
|
+
object({
|
|
13346
|
+
kind: literal("passkey"),
|
|
13347
|
+
/** Stable id within the login-method set (e.g. `auth-webauthn/passkey-direct-login`). */
|
|
13348
|
+
id: string(),
|
|
13349
|
+
/** Operator-facing button label. */
|
|
13350
|
+
label: string(),
|
|
13351
|
+
stage: LoginStageEnum,
|
|
13352
|
+
/** Effective WebAuthn RP ID (`resolveRpID()`) — the shell gates visibility on it. */
|
|
13353
|
+
rpId: string(),
|
|
13354
|
+
/** Effective expected origin (`resolveOrigin()`), null when unconfigured. */
|
|
13355
|
+
origin: string().nullable()
|
|
13356
|
+
})
|
|
13357
|
+
]);
|
|
13086
13358
|
method(_void(), array(LoginMethodContributionSchema).readonly());
|
|
13087
13359
|
/**
|
|
13088
13360
|
* Orchestrator-side destination metadata. The orchestrator computes
|
|
@@ -13988,6 +14260,14 @@ var ConfigEntrySchema = object({
|
|
|
13988
14260
|
value: unknown(),
|
|
13989
14261
|
description: string().optional()
|
|
13990
14262
|
});
|
|
14263
|
+
var DeviceLinkModeSchema = _enum(["auto", "manual"]);
|
|
14264
|
+
/** One resolved linked device — the compact projection consumers need. */
|
|
14265
|
+
var LinkedDeviceSchema = object({
|
|
14266
|
+
deviceId: number(),
|
|
14267
|
+
name: string(),
|
|
14268
|
+
location: string().nullable(),
|
|
14269
|
+
features: array(string())
|
|
14270
|
+
});
|
|
13991
14271
|
var SavedDeviceRowSchema = object({
|
|
13992
14272
|
/** Numeric id reserved at allocateDeviceId time. */
|
|
13993
14273
|
id: number(),
|
|
@@ -14209,7 +14489,10 @@ method(object({
|
|
|
14209
14489
|
}), _void(), {
|
|
14210
14490
|
kind: "mutation",
|
|
14211
14491
|
auth: "admin"
|
|
14212
|
-
}), method(object({ addonId: string() }), array(SavedDeviceRowSchema)), method(object({ addonId: string().optional() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }), DeviceInfoSchema.nullable()), method(object({ parentDeviceId: number() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }),
|
|
14492
|
+
}), method(object({ addonId: string() }), array(SavedDeviceRowSchema)), method(object({ addonId: string().optional() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }), DeviceInfoSchema.nullable()), method(object({ parentDeviceId: number() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }), object({
|
|
14493
|
+
mode: DeviceLinkModeSchema,
|
|
14494
|
+
devices: array(LinkedDeviceSchema)
|
|
14495
|
+
})), method(object({ deviceId: number() }), array(StreamSourceEntrySchema$1)), method(object({ deviceId: number() }), array(ConfigEntrySchema)), method(object({ deviceId: number() }), ConfigUISchemaOutput), method(object({
|
|
14213
14496
|
deviceId: number(),
|
|
14214
14497
|
values: record(string(), unknown())
|
|
14215
14498
|
}), object({ success: literal(true) }), {
|
|
@@ -14943,14 +15226,14 @@ var TargetKindCapsSchema = object({
|
|
|
14943
15226
|
* the union is large and not meant for runtime validation here; the exported
|
|
14944
15227
|
* `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
|
|
14945
15228
|
*/
|
|
14946
|
-
var ConfigSchemaPassthrough = unknown();
|
|
15229
|
+
var ConfigSchemaPassthrough$1 = unknown();
|
|
14947
15230
|
var TargetKindSchema = object({
|
|
14948
15231
|
kind: string(),
|
|
14949
15232
|
label: string(),
|
|
14950
15233
|
icon: string(),
|
|
14951
15234
|
/** Stamped by each provider so the concat-fanned catalog stays routable. */
|
|
14952
15235
|
addonId: string(),
|
|
14953
|
-
configSchema: ConfigSchemaPassthrough,
|
|
15236
|
+
configSchema: ConfigSchemaPassthrough$1,
|
|
14954
15237
|
supportsDiscovery: boolean(),
|
|
14955
15238
|
caps: TargetKindCapsSchema
|
|
14956
15239
|
});
|
|
@@ -15003,6 +15286,298 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
|
|
|
15003
15286
|
enabled: boolean()
|
|
15004
15287
|
}), _void(), { kind: "mutation" });
|
|
15005
15288
|
/**
|
|
15289
|
+
* Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
|
|
15290
|
+
* surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
|
|
15291
|
+
* caps stay wire-compatible without a circular cap→cap import.
|
|
15292
|
+
*
|
|
15293
|
+
* Errors are a discriminated-union RESULT, never thrown: the shape survives
|
|
15294
|
+
* every transport tier structurally, and failed calls still write usage rows.
|
|
15295
|
+
* Token counts only in v1 — no costUsd (operator decision, 2026-07-15).
|
|
15296
|
+
*/
|
|
15297
|
+
var LlmUsageSchema = object({
|
|
15298
|
+
inputTokens: number(),
|
|
15299
|
+
outputTokens: number()
|
|
15300
|
+
});
|
|
15301
|
+
var LlmErrorCodeSchema = _enum([
|
|
15302
|
+
"timeout",
|
|
15303
|
+
"rate-limited",
|
|
15304
|
+
"auth",
|
|
15305
|
+
"refusal",
|
|
15306
|
+
"bad-request",
|
|
15307
|
+
"unavailable",
|
|
15308
|
+
"no-profile",
|
|
15309
|
+
"budget-exceeded",
|
|
15310
|
+
"adapter-error"
|
|
15311
|
+
]);
|
|
15312
|
+
var LlmGenerateResultSchema = discriminatedUnion("ok", [object({
|
|
15313
|
+
ok: literal(true),
|
|
15314
|
+
text: string(),
|
|
15315
|
+
model: string(),
|
|
15316
|
+
usage: LlmUsageSchema,
|
|
15317
|
+
truncated: boolean(),
|
|
15318
|
+
latencyMs: number()
|
|
15319
|
+
}), object({
|
|
15320
|
+
ok: literal(false),
|
|
15321
|
+
code: LlmErrorCodeSchema,
|
|
15322
|
+
message: string(),
|
|
15323
|
+
retryAfterMs: number().optional()
|
|
15324
|
+
})]);
|
|
15325
|
+
/**
|
|
15326
|
+
* `Uint8Array` is the sanctioned binary convention — superjson + the UDS
|
|
15327
|
+
* MsgPack channel round-trip typed arrays (embedding-encoder.cap.ts:29,
|
|
15328
|
+
* notification-output.cap.ts:27-31 precedents).
|
|
15329
|
+
*/
|
|
15330
|
+
var LlmImageSchema = object({
|
|
15331
|
+
bytes: _instanceof(Uint8Array),
|
|
15332
|
+
mimeType: string()
|
|
15333
|
+
});
|
|
15334
|
+
var LlmGenerateBaseInputSchema = object({
|
|
15335
|
+
/** Collection routing (the notification-output posture). */
|
|
15336
|
+
addonId: string().optional(),
|
|
15337
|
+
/** Explicit profile; else the resolution chain (spec §3). */
|
|
15338
|
+
profileId: string().optional(),
|
|
15339
|
+
/** MANDATORY usage tag: 'ai-summary', 'notifier-rules', 'adhoc-ui', … */
|
|
15340
|
+
consumer: string(),
|
|
15341
|
+
system: string().optional(),
|
|
15342
|
+
/** v1: single-turn. `messages[]` is a v2 additive field. */
|
|
15343
|
+
prompt: string(),
|
|
15344
|
+
/** Structured output — adapter-mapped (response_format / forced tool / responseSchema). */
|
|
15345
|
+
jsonSchema: record(string(), unknown()).optional(),
|
|
15346
|
+
/** Per-call override of the profile default. */
|
|
15347
|
+
maxTokens: number().int().positive().optional(),
|
|
15348
|
+
temperature: number().optional()
|
|
15349
|
+
});
|
|
15350
|
+
/**
|
|
15351
|
+
* `llm-runtime` — node-side managed llama.cpp executor (spec §4). Registered
|
|
15352
|
+
* on EVERY node where `addon-ai` is installed; the hub `llm` provider reaches
|
|
15353
|
+
* a specific node's runtime with `nodePin(profile.runtime.nodeId)` — normal
|
|
15354
|
+
* cap routing, zero bespoke plumbing. `internal: true`: the operator reaches
|
|
15355
|
+
* this only through the `llm` cap's methods.
|
|
15356
|
+
*
|
|
15357
|
+
* One running llama-server child per node in v1 (models are RAM-heavy).
|
|
15358
|
+
* Resource ceiling = llama-server flags + idleStopMinutes ONLY (no RSS
|
|
15359
|
+
* watchdog — operator decision #3).
|
|
15360
|
+
*/
|
|
15361
|
+
var ManagedModelRefSchema = discriminatedUnion("kind", [
|
|
15362
|
+
object({
|
|
15363
|
+
kind: literal("catalog"),
|
|
15364
|
+
catalogId: string()
|
|
15365
|
+
}),
|
|
15366
|
+
object({
|
|
15367
|
+
kind: literal("url"),
|
|
15368
|
+
url: string(),
|
|
15369
|
+
sha256: string().optional()
|
|
15370
|
+
}),
|
|
15371
|
+
object({
|
|
15372
|
+
kind: literal("path"),
|
|
15373
|
+
path: string()
|
|
15374
|
+
})
|
|
15375
|
+
]);
|
|
15376
|
+
var ManagedRuntimeConfigSchema = object({
|
|
15377
|
+
/** WHERE the runtime lives — hub or any agent. */
|
|
15378
|
+
nodeId: string(),
|
|
15379
|
+
/** Closed for v1; 'ollama' is a v2 candidate. */
|
|
15380
|
+
engine: _enum(["llama-cpp"]),
|
|
15381
|
+
model: ManagedModelRefSchema,
|
|
15382
|
+
contextSize: number().int().default(4096),
|
|
15383
|
+
/** 0 = CPU-only. */
|
|
15384
|
+
gpuLayers: number().int().default(0),
|
|
15385
|
+
/** Default: cpus-2, clamped ≥1 (resolved node-side). */
|
|
15386
|
+
threads: number().int().optional(),
|
|
15387
|
+
/** Concurrent slots. */
|
|
15388
|
+
parallel: number().int().default(1),
|
|
15389
|
+
/** Else lazy: first generate boots it. */
|
|
15390
|
+
autoStart: boolean().default(false),
|
|
15391
|
+
/** 0 = never; frees RAM after quiet periods. */
|
|
15392
|
+
idleStopMinutes: number().int().default(30)
|
|
15393
|
+
});
|
|
15394
|
+
var LlmRuntimeStatusSchema = object({
|
|
15395
|
+
/** Status is ALWAYS node-qualified. */
|
|
15396
|
+
nodeId: string(),
|
|
15397
|
+
state: _enum([
|
|
15398
|
+
"stopped",
|
|
15399
|
+
"downloading",
|
|
15400
|
+
"starting",
|
|
15401
|
+
"ready",
|
|
15402
|
+
"crashed",
|
|
15403
|
+
"failed"
|
|
15404
|
+
]),
|
|
15405
|
+
pid: number().optional(),
|
|
15406
|
+
port: number().optional(),
|
|
15407
|
+
modelPath: string().optional(),
|
|
15408
|
+
modelId: string().optional(),
|
|
15409
|
+
downloadProgress: number().min(0).max(1).optional(),
|
|
15410
|
+
lastError: string().optional(),
|
|
15411
|
+
crashesInWindow: number(),
|
|
15412
|
+
/** Child RSS (sampled best-effort). */
|
|
15413
|
+
memoryBytes: number().optional(),
|
|
15414
|
+
vramBytes: number().optional()
|
|
15415
|
+
});
|
|
15416
|
+
var LlmNodeModelSchema = object({
|
|
15417
|
+
file: string(),
|
|
15418
|
+
sizeBytes: number(),
|
|
15419
|
+
catalogId: string().optional(),
|
|
15420
|
+
installedAt: number().optional()
|
|
15421
|
+
});
|
|
15422
|
+
var LlmRuntimeDiskUsageSchema = object({
|
|
15423
|
+
nodeId: string(),
|
|
15424
|
+
modelsBytes: number(),
|
|
15425
|
+
freeBytes: number().optional()
|
|
15426
|
+
});
|
|
15427
|
+
method(LlmGenerateBaseInputSchema.extend({
|
|
15428
|
+
images: array(LlmImageSchema).optional(),
|
|
15429
|
+
runtime: ManagedRuntimeConfigSchema,
|
|
15430
|
+
/** The managed profile's timeout, threaded by the hub provider. */
|
|
15431
|
+
timeoutMs: number().int().positive().optional()
|
|
15432
|
+
}), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
|
|
15433
|
+
kind: "mutation",
|
|
15434
|
+
auth: "admin"
|
|
15435
|
+
}), method(object({}), _void(), {
|
|
15436
|
+
kind: "mutation",
|
|
15437
|
+
auth: "admin"
|
|
15438
|
+
}), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
|
|
15439
|
+
kind: "mutation",
|
|
15440
|
+
auth: "admin"
|
|
15441
|
+
}), method(object({ file: string() }), _void(), {
|
|
15442
|
+
kind: "mutation",
|
|
15443
|
+
auth: "admin"
|
|
15444
|
+
}), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
|
|
15445
|
+
/**
|
|
15446
|
+
* `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
|
|
15447
|
+
* methods concat-fan across providers; single-row methods route to ONE
|
|
15448
|
+
* provider by the `addonId` in the call input (the notification-output
|
|
15449
|
+
* posture, notification-output.cap.ts:215-250). Provided by `addon-ai`
|
|
15450
|
+
* (hub-placed); the cap stays open for future providers.
|
|
15451
|
+
*
|
|
15452
|
+
* Profiles are ROWS (data), not addons: one row = one usable model endpoint.
|
|
15453
|
+
* `apiKey` is a password field — providers REDACT it on read and merge on
|
|
15454
|
+
* write; a stored key NEVER round-trips to a client.
|
|
15455
|
+
*/
|
|
15456
|
+
var LlmProfileKindSchema = _enum([
|
|
15457
|
+
"openai-compatible",
|
|
15458
|
+
"openai",
|
|
15459
|
+
"anthropic",
|
|
15460
|
+
"google",
|
|
15461
|
+
"managed-local"
|
|
15462
|
+
]);
|
|
15463
|
+
var LlmProfileSchema = object({
|
|
15464
|
+
id: string(),
|
|
15465
|
+
name: string(),
|
|
15466
|
+
kind: LlmProfileKindSchema,
|
|
15467
|
+
/** Stamped by the provider — keeps the fanned catalog routable. */
|
|
15468
|
+
addonId: string(),
|
|
15469
|
+
enabled: boolean(),
|
|
15470
|
+
/** Vendor model id, or the managed runtime's loaded model. */
|
|
15471
|
+
model: string(),
|
|
15472
|
+
/** Required for openai-compatible; override for cloud kinds. */
|
|
15473
|
+
baseUrl: string().optional(),
|
|
15474
|
+
/** ConfigUISchema type:'password' — never round-trips (spec §5). */
|
|
15475
|
+
apiKey: string().optional(),
|
|
15476
|
+
supportsVision: boolean(),
|
|
15477
|
+
temperature: number().min(0).max(2).optional(),
|
|
15478
|
+
maxTokens: number().int().positive().optional(),
|
|
15479
|
+
timeoutMs: number().int().positive().default(6e4),
|
|
15480
|
+
extraHeaders: record(string(), string()).optional(),
|
|
15481
|
+
/** kind === 'managed-local' only (spec §4). */
|
|
15482
|
+
runtime: ManagedRuntimeConfigSchema.optional()
|
|
15483
|
+
});
|
|
15484
|
+
/** ConfigUISchema tree passed through untyped on the wire (the
|
|
15485
|
+
* notification-output `ConfigSchemaPassthrough` precedent at
|
|
15486
|
+
* notification-output.cap.ts:151); the exported TS type re-tightens it. */
|
|
15487
|
+
var ConfigSchemaPassthrough = unknown();
|
|
15488
|
+
var LlmProfileKindDescriptorSchema = object({
|
|
15489
|
+
kind: LlmProfileKindSchema,
|
|
15490
|
+
label: string(),
|
|
15491
|
+
icon: string(),
|
|
15492
|
+
/** Stamped by each provider so the concat-fanned catalog stays routable. */
|
|
15493
|
+
addonId: string(),
|
|
15494
|
+
configSchema: ConfigSchemaPassthrough
|
|
15495
|
+
});
|
|
15496
|
+
var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
|
|
15497
|
+
var LlmDefaultSchema = object({
|
|
15498
|
+
selector: LlmDefaultSelectorSchema,
|
|
15499
|
+
profileId: string()
|
|
15500
|
+
});
|
|
15501
|
+
/** Server-side rollup row — getUsage never dumps raw call rows (spec §6). */
|
|
15502
|
+
var LlmUsageRollupSchema = object({
|
|
15503
|
+
day: string(),
|
|
15504
|
+
consumer: string(),
|
|
15505
|
+
profileId: string(),
|
|
15506
|
+
calls: number(),
|
|
15507
|
+
okCalls: number(),
|
|
15508
|
+
errorCalls: number(),
|
|
15509
|
+
inputTokens: number(),
|
|
15510
|
+
outputTokens: number(),
|
|
15511
|
+
avgLatencyMs: number()
|
|
15512
|
+
});
|
|
15513
|
+
/** LLM-facing view over the reused ModelCatalogEntry mechanism (spec §4.2). */
|
|
15514
|
+
var ManagedModelCatalogEntrySchema = object({
|
|
15515
|
+
id: string(),
|
|
15516
|
+
label: string(),
|
|
15517
|
+
family: string(),
|
|
15518
|
+
purpose: _enum(["text", "vision"]),
|
|
15519
|
+
url: string(),
|
|
15520
|
+
sha256: string(),
|
|
15521
|
+
sizeBytes: number(),
|
|
15522
|
+
quantization: string(),
|
|
15523
|
+
/** Load-time guidance shown in the picker. */
|
|
15524
|
+
minRamBytes: number(),
|
|
15525
|
+
contextSizeDefault: number().int(),
|
|
15526
|
+
/** Vision models: companion projector file. */
|
|
15527
|
+
mmprojUrl: string().optional()
|
|
15528
|
+
});
|
|
15529
|
+
var LlmRuntimeNodeSchema = object({
|
|
15530
|
+
nodeId: string(),
|
|
15531
|
+
reachable: boolean(),
|
|
15532
|
+
status: LlmRuntimeStatusSchema.optional(),
|
|
15533
|
+
disk: LlmRuntimeDiskUsageSchema.optional(),
|
|
15534
|
+
error: string().optional()
|
|
15535
|
+
});
|
|
15536
|
+
var GenerateVisionInputSchema = LlmGenerateBaseInputSchema.extend({ images: array(LlmImageSchema).min(1) });
|
|
15537
|
+
var ProfileRefInputSchema = object({
|
|
15538
|
+
addonId: string(),
|
|
15539
|
+
profileId: string()
|
|
15540
|
+
});
|
|
15541
|
+
method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
|
|
15542
|
+
kind: "mutation",
|
|
15543
|
+
auth: "admin"
|
|
15544
|
+
}), method(ProfileRefInputSchema, _void(), {
|
|
15545
|
+
kind: "mutation",
|
|
15546
|
+
auth: "admin"
|
|
15547
|
+
}), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
|
|
15548
|
+
kind: "mutation",
|
|
15549
|
+
auth: "admin"
|
|
15550
|
+
}), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
|
|
15551
|
+
selector: LlmDefaultSelectorSchema,
|
|
15552
|
+
profileId: string().nullable()
|
|
15553
|
+
}), _void(), {
|
|
15554
|
+
kind: "mutation",
|
|
15555
|
+
auth: "admin"
|
|
15556
|
+
}), method(object({
|
|
15557
|
+
since: number().optional(),
|
|
15558
|
+
until: number().optional(),
|
|
15559
|
+
consumer: string().optional(),
|
|
15560
|
+
profileId: string().optional()
|
|
15561
|
+
}), array(LlmUsageRollupSchema)), method(object({}), array(ManagedModelCatalogEntrySchema)), method(object({}), array(LlmRuntimeNodeSchema)), method(object({ nodeId: string() }), array(LlmNodeModelSchema)), method(object({
|
|
15562
|
+
nodeId: string(),
|
|
15563
|
+
model: ManagedModelRefSchema
|
|
15564
|
+
}), _void(), {
|
|
15565
|
+
kind: "mutation",
|
|
15566
|
+
auth: "admin"
|
|
15567
|
+
}), method(object({
|
|
15568
|
+
nodeId: string(),
|
|
15569
|
+
file: string()
|
|
15570
|
+
}), _void(), {
|
|
15571
|
+
kind: "mutation",
|
|
15572
|
+
auth: "admin"
|
|
15573
|
+
}), method(ProfileRefInputSchema, LlmRuntimeStatusSchema), method(ProfileRefInputSchema, LlmRuntimeStatusSchema, {
|
|
15574
|
+
kind: "mutation",
|
|
15575
|
+
auth: "admin"
|
|
15576
|
+
}), method(ProfileRefInputSchema, _void(), {
|
|
15577
|
+
kind: "mutation",
|
|
15578
|
+
auth: "admin"
|
|
15579
|
+
});
|
|
15580
|
+
/**
|
|
15006
15581
|
* Zod schemas for persisted record types.
|
|
15007
15582
|
*
|
|
15008
15583
|
* These schemas serve as the single source of truth for types that are
|
|
@@ -15192,6 +15767,61 @@ var EventKindSchema = _enum([
|
|
|
15192
15767
|
"object",
|
|
15193
15768
|
"audio"
|
|
15194
15769
|
]);
|
|
15770
|
+
/**
|
|
15771
|
+
* Spatial filter for `listTracks` — the rect + polygon variants of the shared
|
|
15772
|
+
* MaskShape vocabulary (see `mask-shape.ts`). Coordinates are NORMALIZED 0..1
|
|
15773
|
+
* of the camera frame (top-left origin), matching the drawing-plane editor.
|
|
15774
|
+
*/
|
|
15775
|
+
var TrackZoneFilterSchema = discriminatedUnion("kind", [MaskRectShapeSchema, MaskPolygonShapeSchema]);
|
|
15776
|
+
/** Closed icon vocabulary so clients render a known glyph per kind. */
|
|
15777
|
+
var EventKindIconSchema = _enum([
|
|
15778
|
+
"motion",
|
|
15779
|
+
"audio",
|
|
15780
|
+
"person",
|
|
15781
|
+
"vehicle",
|
|
15782
|
+
"animal",
|
|
15783
|
+
"door",
|
|
15784
|
+
"pir",
|
|
15785
|
+
"smoke",
|
|
15786
|
+
"water",
|
|
15787
|
+
"button",
|
|
15788
|
+
"generic"
|
|
15789
|
+
]);
|
|
15790
|
+
var EventKindCategorySchema = _enum([
|
|
15791
|
+
"motion",
|
|
15792
|
+
"audio",
|
|
15793
|
+
"detection",
|
|
15794
|
+
"sensor",
|
|
15795
|
+
"custom"
|
|
15796
|
+
]);
|
|
15797
|
+
var EventKindDescriptorSchema = object({
|
|
15798
|
+
/** Stable kind id (e.g. 'motion', 'person', 'contact'). */
|
|
15799
|
+
kind: string(),
|
|
15800
|
+
label: string(),
|
|
15801
|
+
/** Hex color for timeline/legend rendering. */
|
|
15802
|
+
color: string(),
|
|
15803
|
+
icon: EventKindIconSchema,
|
|
15804
|
+
category: EventKindCategorySchema,
|
|
15805
|
+
/** Which cap + device contributes this kind. For built-ins the camera
|
|
15806
|
+
* itself; for sensor kinds the LINKED source device. */
|
|
15807
|
+
source: object({
|
|
15808
|
+
capName: string(),
|
|
15809
|
+
deviceId: number()
|
|
15810
|
+
})
|
|
15811
|
+
});
|
|
15812
|
+
var SensorEventSchema = object({
|
|
15813
|
+
id: string(),
|
|
15814
|
+
/** The CAMERA the event is attributed to (a sensor linked to N cameras
|
|
15815
|
+
* yields N rows, one per camera). */
|
|
15816
|
+
deviceId: number(),
|
|
15817
|
+
/** The linked sensor device whose state changed. */
|
|
15818
|
+
sourceDeviceId: number(),
|
|
15819
|
+
/** Event kind id — matches an `EventKindDescriptor.kind`. */
|
|
15820
|
+
kind: string(),
|
|
15821
|
+
/** Snapshot of the sensor cap's runtime-state slice at the change. */
|
|
15822
|
+
value: record(string(), unknown()).nullable(),
|
|
15823
|
+
timestamp: number()
|
|
15824
|
+
});
|
|
15195
15825
|
var TrackPositionSchema = object({
|
|
15196
15826
|
x: number(),
|
|
15197
15827
|
y: number(),
|
|
@@ -15204,6 +15834,46 @@ var TrackSnapshotSchema = object({
|
|
|
15204
15834
|
/** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
|
|
15205
15835
|
mediaKey: string()
|
|
15206
15836
|
});
|
|
15837
|
+
/**
|
|
15838
|
+
* Normalized 0..1 trajectory envelope (min/max over every position bbox,
|
|
15839
|
+
* divided by the track's detection-frame dims), computed at persist time.
|
|
15840
|
+
* Absent when the frame dims were unknown when the track was persisted
|
|
15841
|
+
* (legacy rows / dims-less sources) and on active (in-RAM) tracks.
|
|
15842
|
+
*/
|
|
15843
|
+
var TrackEnvelopeSchema = object({
|
|
15844
|
+
minX: number(),
|
|
15845
|
+
minY: number(),
|
|
15846
|
+
maxX: number(),
|
|
15847
|
+
maxY: number()
|
|
15848
|
+
});
|
|
15849
|
+
/**
|
|
15850
|
+
* Row projection for track list queries. `full` (default) returns the
|
|
15851
|
+
* complete Track including the frame-rate `positions[]` history and the
|
|
15852
|
+
* `snapshots[]` references — megabytes across a page of tracks. `slim`
|
|
15853
|
+
* keeps every scalar the list surfaces actually render (ids, class(es),
|
|
15854
|
+
* label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
|
|
15855
|
+
* zonesVisited, bestEventId, envelope) and returns `positions` /
|
|
15856
|
+
* `snapshots` as EMPTY arrays — detail views re-fetch the full row via
|
|
15857
|
+
* `getTrack`. Mirrors the event-store `projection` convention
|
|
15858
|
+
* (`getObjectEvents` et al.).
|
|
15859
|
+
*/
|
|
15860
|
+
var TrackProjectionSchema = _enum(["full", "slim"]);
|
|
15861
|
+
/**
|
|
15862
|
+
* One audio-classification label heard on the track's camera while the
|
|
15863
|
+
* track was alive, aggregated per label. An "episode" is one persisted
|
|
15864
|
+
* audio event (the confident-classification path: score ≥ the device's
|
|
15865
|
+
* `classificationMinScore`, class-change-or-heartbeat coalesced) — NOT
|
|
15866
|
+
* one 32 ms inference chunk, so counts stay human-scaled.
|
|
15867
|
+
*/
|
|
15868
|
+
var TrackAudioLabelSchema = object({
|
|
15869
|
+
label: string(),
|
|
15870
|
+
/** Highest classification score observed across the label's episodes. */
|
|
15871
|
+
peakScore: number(),
|
|
15872
|
+
/** Number of coalesced audio-event episodes carrying this label. */
|
|
15873
|
+
count: number(),
|
|
15874
|
+
firstAt: number(),
|
|
15875
|
+
lastAt: number()
|
|
15876
|
+
});
|
|
15207
15877
|
var TrackSchema = object({
|
|
15208
15878
|
trackId: string(),
|
|
15209
15879
|
deviceId: number(),
|
|
@@ -15218,6 +15888,10 @@ var TrackSchema = object({
|
|
|
15218
15888
|
snapshots: array(TrackSnapshotSchema).readonly(),
|
|
15219
15889
|
/** Deduplicated zones the track has entered at least once. */
|
|
15220
15890
|
zonesVisited: array(string()).readonly(),
|
|
15891
|
+
/** Deduplicated set of detector classes observed for this track over its
|
|
15892
|
+
* life (a track may be reclassified, e.g. person→vehicle). Absent on
|
|
15893
|
+
* legacy rows written before class accumulation shipped. */
|
|
15894
|
+
classes: array(string()).readonly().optional(),
|
|
15221
15895
|
/** Cumulative normalized distance travelled (0..1 units = full frame width). */
|
|
15222
15896
|
totalDistance: number(),
|
|
15223
15897
|
state: TrackStateSchema,
|
|
@@ -15231,7 +15905,15 @@ var TrackSchema = object({
|
|
|
15231
15905
|
bestEventId: string().optional(),
|
|
15232
15906
|
/** Tag of the importance sub-signal that dominated the score
|
|
15233
15907
|
* (identity|dwell|proximity|class|confidence|travel|zone). */
|
|
15234
|
-
importanceReason: string().optional()
|
|
15908
|
+
importanceReason: string().optional(),
|
|
15909
|
+
/** Audio-classification labels heard on the camera during the track's
|
|
15910
|
+
* life (score ≥ device `classificationMinScore`), aggregated per label.
|
|
15911
|
+
* Absent on legacy rows / tracks with no confident audio. */
|
|
15912
|
+
audioLabels: array(TrackAudioLabelSchema).readonly().optional(),
|
|
15913
|
+
/** Normalized 0..1 trajectory envelope (see {@link TrackEnvelopeSchema}).
|
|
15914
|
+
* Populated from the persisted envelope columns on historical reads;
|
|
15915
|
+
* absent on legacy rows, dims-less tracks and active (in-RAM) tracks. */
|
|
15916
|
+
envelope: TrackEnvelopeSchema.optional()
|
|
15235
15917
|
});
|
|
15236
15918
|
var BaseEventFields = {
|
|
15237
15919
|
id: string(),
|
|
@@ -15341,11 +16023,13 @@ var MediaFileSchema = object({
|
|
|
15341
16023
|
sizeBytes: number(),
|
|
15342
16024
|
timestamp: number()
|
|
15343
16025
|
});
|
|
16026
|
+
var DEFAULT_EVENT_QUERY_LIMIT = 1e3;
|
|
16027
|
+
var MAX_EVENT_QUERY_LIMIT = 5e3;
|
|
15344
16028
|
var DeviceEventQueryInput = object({
|
|
15345
16029
|
deviceId: number(),
|
|
15346
16030
|
since: number().optional(),
|
|
15347
16031
|
until: number().optional(),
|
|
15348
|
-
limit: number().int().min(1).max(
|
|
16032
|
+
limit: number().int().min(1).max(MAX_EVENT_QUERY_LIMIT).default(DEFAULT_EVENT_QUERY_LIMIT),
|
|
15349
16033
|
/** `slim` drops heavy JSON fields (regions/bbox/zones) and carries an
|
|
15350
16034
|
* optional `mediaUrl` (populated by B5). `full` (default) keeps today's
|
|
15351
16035
|
* exact behaviour. Callers may omit this field — the store defaults to
|
|
@@ -15353,6 +16037,27 @@ var DeviceEventQueryInput = object({
|
|
|
15353
16037
|
projection: _enum(["full", "slim"]).optional()
|
|
15354
16038
|
});
|
|
15355
16039
|
var ObjectEventQueryInput = DeviceEventQueryInput.extend({ classFilter: string().optional() });
|
|
16040
|
+
var RecentTracksQueryInput = object({
|
|
16041
|
+
/** Devices to merge. An empty array yields `{ tracks: [], nextCursor: null }`. */
|
|
16042
|
+
deviceIds: array(number()),
|
|
16043
|
+
/** Window lower bound on `lastSeen` (inclusive). */
|
|
16044
|
+
since: number().optional(),
|
|
16045
|
+
/** Window upper bound on `lastSeen` (inclusive). */
|
|
16046
|
+
until: number().optional(),
|
|
16047
|
+
/** Page size. Default 200, max 1000. */
|
|
16048
|
+
limit: number().int().min(1).max(1e3).default(200),
|
|
16049
|
+
/** Opaque continuation cursor from a previous page's `nextCursor`.
|
|
16050
|
+
* Encodes the (lastSeen, trackId) sort position — treat as opaque. */
|
|
16051
|
+
cursor: string().optional(),
|
|
16052
|
+
/** See {@link TrackProjectionSchema}. Default `full`. */
|
|
16053
|
+
projection: TrackProjectionSchema.optional()
|
|
16054
|
+
});
|
|
16055
|
+
var RecentTracksPageSchema = object({
|
|
16056
|
+
/** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
|
|
16057
|
+
tracks: array(TrackSchema).readonly(),
|
|
16058
|
+
/** Cursor for the next page, or null when this page is the last. */
|
|
16059
|
+
nextCursor: string().nullable()
|
|
16060
|
+
});
|
|
15356
16061
|
var KeyEventQueryInput = object({
|
|
15357
16062
|
deviceId: number(),
|
|
15358
16063
|
/** Window lower bound (track firstSeen ≥ since). */
|
|
@@ -15379,7 +16084,7 @@ var KeyEventSchema = object({
|
|
|
15379
16084
|
/** Track lifetime in ms (lastSeen - firstSeen). */
|
|
15380
16085
|
windowMs: number().optional()
|
|
15381
16086
|
});
|
|
15382
|
-
|
|
16087
|
+
object({
|
|
15383
16088
|
trackId: string(),
|
|
15384
16089
|
className: string(),
|
|
15385
16090
|
confidence: number(),
|
|
@@ -15387,8 +16092,25 @@ var TrackedDetectionSchema = object({
|
|
|
15387
16092
|
zones: array(string()).readonly(),
|
|
15388
16093
|
state: TrackStateSchema
|
|
15389
16094
|
});
|
|
15390
|
-
var
|
|
15391
|
-
|
|
16095
|
+
var OverlayDetectionSchema = looseObject({
|
|
16096
|
+
id: string(),
|
|
16097
|
+
kind: _enum(["first-level", "detail"]),
|
|
16098
|
+
macroClass: string(),
|
|
16099
|
+
score: number(),
|
|
16100
|
+
bbox: object({
|
|
16101
|
+
x: number(),
|
|
16102
|
+
y: number(),
|
|
16103
|
+
width: number(),
|
|
16104
|
+
height: number()
|
|
16105
|
+
}),
|
|
16106
|
+
labels: array(looseObject({
|
|
16107
|
+
label: string(),
|
|
16108
|
+
score: number()
|
|
16109
|
+
})).readonly(),
|
|
16110
|
+
parentId: string().optional()
|
|
16111
|
+
});
|
|
16112
|
+
var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: number() });
|
|
16113
|
+
var SearchObjectEventsInput = object({
|
|
15392
16114
|
text: string(),
|
|
15393
16115
|
deviceId: number().optional(),
|
|
15394
16116
|
since: number().optional(),
|
|
@@ -15397,6 +16119,20 @@ var SearchObjectEventsInput = object({
|
|
|
15397
16119
|
limit: number().default(50),
|
|
15398
16120
|
minScore: number().min(0).max(1).default(.2)
|
|
15399
16121
|
});
|
|
16122
|
+
var TrackCascadeCountsSchema = object({
|
|
16123
|
+
/** Persisted track roots deleted (authoritative). */
|
|
16124
|
+
tracks: number().int(),
|
|
16125
|
+
/** Object events removed with their tracks (best-effort; see note above). */
|
|
16126
|
+
events: number().int(),
|
|
16127
|
+
/** Track/face/plate-owned media removed (best-effort). Never identity media. */
|
|
16128
|
+
media: number().int(),
|
|
16129
|
+
/** Unassigned (non-enrolled) face reads removed (best-effort). */
|
|
16130
|
+
faces: number().int(),
|
|
16131
|
+
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
16132
|
+
plates: number().int(),
|
|
16133
|
+
/** Per-track CLIP search vectors removed (best-effort). */
|
|
16134
|
+
embeddings: number().int()
|
|
16135
|
+
});
|
|
15400
16136
|
DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
|
|
15401
16137
|
deviceId: number(),
|
|
15402
16138
|
trackId: string()
|
|
@@ -15404,11 +16140,25 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
15404
16140
|
deviceId: number(),
|
|
15405
16141
|
since: number().optional(),
|
|
15406
16142
|
until: number().optional(),
|
|
15407
|
-
limit: number().optional()
|
|
15408
|
-
|
|
15409
|
-
|
|
15410
|
-
|
|
15411
|
-
|
|
16143
|
+
limit: number().optional(),
|
|
16144
|
+
/** Spatial filter — only tracks whose trajectory intersects the zone
|
|
16145
|
+
* (normalized 0..1 rect or polygon). SQL-prefiltered on the persisted
|
|
16146
|
+
* envelope columns, then precisely tested per position. Tracks with
|
|
16147
|
+
* an unknown envelope (no frame dims at persist time) always match. */
|
|
16148
|
+
zone: TrackZoneFilterSchema.optional(),
|
|
16149
|
+
/** See {@link TrackProjectionSchema}. Default `full` (backward
|
|
16150
|
+
* compatible — omitting the field keeps today's exact behaviour). */
|
|
16151
|
+
projection: TrackProjectionSchema.optional()
|
|
16152
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
16153
|
+
kind: "mutation",
|
|
16154
|
+
auth: "admin"
|
|
16155
|
+
}), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({ deviceId: number() }), array(EventKindDescriptorSchema).readonly()), method(object({
|
|
16156
|
+
deviceId: number(),
|
|
16157
|
+
since: number().optional(),
|
|
16158
|
+
until: number().optional(),
|
|
16159
|
+
kinds: array(string()).optional(),
|
|
16160
|
+
limit: number().int().min(1).max(MAX_EVENT_QUERY_LIMIT).default(DEFAULT_EVENT_QUERY_LIMIT)
|
|
16161
|
+
}), array(SensorEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(object({
|
|
15412
16162
|
deviceId: number(),
|
|
15413
16163
|
since: number(),
|
|
15414
16164
|
until: number(),
|
|
@@ -15428,6 +16178,24 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
15428
16178
|
}), {
|
|
15429
16179
|
kind: "mutation",
|
|
15430
16180
|
auth: "admin"
|
|
16181
|
+
}), method(object({
|
|
16182
|
+
deviceId: number(),
|
|
16183
|
+
cutoffMs: number()
|
|
16184
|
+
}), TrackCascadeCountsSchema, {
|
|
16185
|
+
kind: "mutation",
|
|
16186
|
+
auth: "admin"
|
|
16187
|
+
}), method(object({ deviceId: number() }), TrackCascadeCountsSchema, {
|
|
16188
|
+
kind: "mutation",
|
|
16189
|
+
auth: "admin"
|
|
16190
|
+
}), method(object({
|
|
16191
|
+
deviceId: number(),
|
|
16192
|
+
trackIds: array(string()).min(1)
|
|
16193
|
+
}), object({
|
|
16194
|
+
deleted: number().int(),
|
|
16195
|
+
failed: array(string()).readonly()
|
|
16196
|
+
}), {
|
|
16197
|
+
kind: "mutation",
|
|
16198
|
+
auth: "admin"
|
|
15431
16199
|
}), method(object({
|
|
15432
16200
|
eventId: string(),
|
|
15433
16201
|
kind: MediaFileKindEnum.optional()
|
|
@@ -15436,7 +16204,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
15436
16204
|
timestamp: number(),
|
|
15437
16205
|
frameWidth: number(),
|
|
15438
16206
|
frameHeight: number(),
|
|
15439
|
-
detections: array(
|
|
16207
|
+
detections: array(OverlayDetectionSchema).readonly()
|
|
15440
16208
|
}), object({
|
|
15441
16209
|
deviceId: number(),
|
|
15442
16210
|
trackId: string(),
|
|
@@ -16752,7 +17520,15 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
|
|
|
16752
17520
|
*/
|
|
16753
17521
|
disableIpv6: boolean().optional(),
|
|
16754
17522
|
/** Subscriber attribution. See `createSession` for the contract. */
|
|
16755
|
-
consumerAttribution: BrokerConsumerAttributionSchema.optional()
|
|
17523
|
+
consumerAttribution: BrokerConsumerAttributionSchema.optional(),
|
|
17524
|
+
/**
|
|
17525
|
+
* Client-side stream hints (viewport, downlink) — same contract as
|
|
17526
|
+
* `createSession.hints`. Client-offer viewers (the RN viewer's
|
|
17527
|
+
* `WebrtcLiveSession`) negotiate via `handleOffer`, so without this
|
|
17528
|
+
* field their hints were silently stripped by the schema and the
|
|
17529
|
+
* adaptive ladder started blind on the client's display size.
|
|
17530
|
+
*/
|
|
17531
|
+
hints: webrtcClientHintsSchema.optional()
|
|
16756
17532
|
}), object({
|
|
16757
17533
|
sessionId: string(),
|
|
16758
17534
|
sdpAnswer: string()
|
|
@@ -18205,6 +18981,24 @@ DeviceType.Camera, method(object({
|
|
|
18205
18981
|
deviceId: number(),
|
|
18206
18982
|
status: OsdStatusSchema
|
|
18207
18983
|
});
|
|
18984
|
+
var VehicleSchema = object({
|
|
18985
|
+
id: string(),
|
|
18986
|
+
name: string(),
|
|
18987
|
+
sampleCount: number().int().nonnegative(),
|
|
18988
|
+
coverMediaKey: string().optional(),
|
|
18989
|
+
/** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
|
|
18990
|
+
coverBase64: string().optional()
|
|
18991
|
+
});
|
|
18992
|
+
var VehicleSampleInfoSchema = object({
|
|
18993
|
+
id: string(),
|
|
18994
|
+
/** The plate text this sample enrolled (self-labeling — no embedding). */
|
|
18995
|
+
text: string(),
|
|
18996
|
+
/** OCR confidence of the enrolled read (0..1). */
|
|
18997
|
+
score: number(),
|
|
18998
|
+
addedAt: number().int(),
|
|
18999
|
+
deviceId: number().int().optional(),
|
|
19000
|
+
base64: string().optional()
|
|
19001
|
+
});
|
|
18208
19002
|
var PlateInfoSchema = object({
|
|
18209
19003
|
plateId: string(),
|
|
18210
19004
|
deviceId: number().int(),
|
|
@@ -18216,6 +19010,16 @@ var PlateInfoSchema = object({
|
|
|
18216
19010
|
score: number(),
|
|
18217
19011
|
/** True when the text was manually corrected (exempt from retention). */
|
|
18218
19012
|
corrected: boolean(),
|
|
19013
|
+
/** Recognized vehicle id when a matcher lookup named this read (SQL NULL → absent). */
|
|
19014
|
+
recognizedVehicleId: string().optional(),
|
|
19015
|
+
/** Resolved vehicle name for `recognizedVehicleId` (UI convenience). */
|
|
19016
|
+
vehicleName: string().optional(),
|
|
19017
|
+
/** True once the read was assigned to a vehicle (enrolled as a sample). */
|
|
19018
|
+
assigned: boolean(),
|
|
19019
|
+
/** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
|
|
19020
|
+
plateBbox: BoundingBoxSchema.optional(),
|
|
19021
|
+
/** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
|
|
19022
|
+
keyFrameMediaKey: string().optional(),
|
|
18219
19023
|
base64: string().optional()
|
|
18220
19024
|
});
|
|
18221
19025
|
var MediaFileLiteSchema = object({
|
|
@@ -18255,6 +19059,48 @@ method(object({
|
|
|
18255
19059
|
}), method(object({ plateId: string() }), _void(), {
|
|
18256
19060
|
kind: "mutation",
|
|
18257
19061
|
auth: "admin"
|
|
19062
|
+
}), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
|
|
19063
|
+
kind: "mutation",
|
|
19064
|
+
auth: "admin"
|
|
19065
|
+
}), method(object({
|
|
19066
|
+
id: string(),
|
|
19067
|
+
name: string().min(1)
|
|
19068
|
+
}), _void(), {
|
|
19069
|
+
kind: "mutation",
|
|
19070
|
+
auth: "admin"
|
|
19071
|
+
}), method(object({ id: string() }), _void(), {
|
|
19072
|
+
kind: "mutation",
|
|
19073
|
+
auth: "admin"
|
|
19074
|
+
}), method(object({ vehicleId: string() }), array(VehicleSampleInfoSchema).readonly()), method(object({
|
|
19075
|
+
vehicleId: string(),
|
|
19076
|
+
sampleId: string()
|
|
19077
|
+
}), _void(), {
|
|
19078
|
+
kind: "mutation",
|
|
19079
|
+
auth: "admin"
|
|
19080
|
+
}), method(object({
|
|
19081
|
+
plateId: string(),
|
|
19082
|
+
vehicleId: string()
|
|
19083
|
+
}), _void(), {
|
|
19084
|
+
kind: "mutation",
|
|
19085
|
+
auth: "admin"
|
|
19086
|
+
}), method(object({ plateId: string() }), _void(), {
|
|
19087
|
+
kind: "mutation",
|
|
19088
|
+
auth: "admin"
|
|
19089
|
+
}), method(object({
|
|
19090
|
+
plateIds: array(string()).min(1),
|
|
19091
|
+
vehicleId: string()
|
|
19092
|
+
}), object({
|
|
19093
|
+
assigned: number().int(),
|
|
19094
|
+
failed: array(string()).readonly()
|
|
19095
|
+
}), {
|
|
19096
|
+
kind: "mutation",
|
|
19097
|
+
auth: "admin"
|
|
19098
|
+
}), method(object({ plateIds: array(string()).min(1) }), object({
|
|
19099
|
+
unassigned: number().int(),
|
|
19100
|
+
failed: array(string()).readonly()
|
|
19101
|
+
}), {
|
|
19102
|
+
kind: "mutation",
|
|
19103
|
+
auth: "admin"
|
|
18258
19104
|
});
|
|
18259
19105
|
var ModelFormatSchema = _enum(MODEL_FORMATS);
|
|
18260
19106
|
var HwAccelBackendInputSchema = _enum([
|
|
@@ -18333,6 +19179,10 @@ var GpuInfoSchema = object({
|
|
|
18333
19179
|
memoryMB: number().optional()
|
|
18334
19180
|
});
|
|
18335
19181
|
var NpuInfoSchema = object({ type: _enum(["apple-ane", "intel-npu"]) });
|
|
19182
|
+
var CoralInfoSchema = object({
|
|
19183
|
+
type: literal("coral-edgetpu"),
|
|
19184
|
+
bus: string().optional()
|
|
19185
|
+
});
|
|
18336
19186
|
var HardwareInfoSchema = object({
|
|
18337
19187
|
platform: HardwarePlatformSchema,
|
|
18338
19188
|
arch: HardwareArchSchema,
|
|
@@ -18341,7 +19191,8 @@ var HardwareInfoSchema = object({
|
|
|
18341
19191
|
totalRAM_MB: number(),
|
|
18342
19192
|
availableRAM_MB: number(),
|
|
18343
19193
|
gpu: GpuInfoSchema.nullable(),
|
|
18344
|
-
npu: NpuInfoSchema.nullable()
|
|
19194
|
+
npu: NpuInfoSchema.nullable(),
|
|
19195
|
+
coral: CoralInfoSchema.nullable().optional()
|
|
18345
19196
|
});
|
|
18346
19197
|
var PlatformScoreSchema = object({
|
|
18347
19198
|
runtime: _enum(["node", "python"]),
|
|
@@ -18508,7 +19359,12 @@ var RecordingStorageUsageSchema = object({
|
|
|
18508
19359
|
/**
|
|
18509
19360
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
18510
19361
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
18511
|
-
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
19362
|
+
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
19363
|
+
* and the backward covered edge `prevEndMs` (exclusive end of the nearest
|
|
19364
|
+
* footage behind the epoch; `null` when none — optional so older providers
|
|
19365
|
+
* that omit it stay valid). `prevEndMs` lets a backward frame-step hop the
|
|
19366
|
+
* small inter-segment cracks (durMs under-covers the span to the next
|
|
19367
|
+
* startMs by ~11-17 ms) instead of no-opping at a segment head.
|
|
18512
19368
|
*/
|
|
18513
19369
|
var LocateSegmentResultSchema = discriminatedUnion("kind", [object({
|
|
18514
19370
|
kind: literal("segment"),
|
|
@@ -18517,7 +19373,8 @@ var LocateSegmentResultSchema = discriminatedUnion("kind", [object({
|
|
|
18517
19373
|
bytes: number()
|
|
18518
19374
|
}), object({
|
|
18519
19375
|
kind: literal("gap"),
|
|
18520
|
-
nearestEdgeMs: number().nullable()
|
|
19376
|
+
nearestEdgeMs: number().nullable(),
|
|
19377
|
+
prevEndMs: number().nullable().optional()
|
|
18521
19378
|
})]);
|
|
18522
19379
|
/** Raw bytes of one finalized footage segment (read off disk on the recording node). */
|
|
18523
19380
|
var ReadSegmentBytesResultSchema = object({ data: _instanceof(Uint8Array) });
|
|
@@ -20086,6 +20943,12 @@ Object.freeze({
|
|
|
20086
20943
|
addonId: null,
|
|
20087
20944
|
access: "view"
|
|
20088
20945
|
},
|
|
20946
|
+
"deviceManager.getLinkedDevices": {
|
|
20947
|
+
capName: "device-manager",
|
|
20948
|
+
capScope: "system",
|
|
20949
|
+
addonId: null,
|
|
20950
|
+
access: "view"
|
|
20951
|
+
},
|
|
20089
20952
|
"deviceManager.getRoleDisplayDefaults": {
|
|
20090
20953
|
capName: "device-manager",
|
|
20091
20954
|
capScope: "system",
|
|
@@ -20800,6 +21663,168 @@ Object.freeze({
|
|
|
20800
21663
|
addonId: null,
|
|
20801
21664
|
access: "create"
|
|
20802
21665
|
},
|
|
21666
|
+
"llm.deleteModel": {
|
|
21667
|
+
capName: "llm",
|
|
21668
|
+
capScope: "system",
|
|
21669
|
+
addonId: null,
|
|
21670
|
+
access: "delete"
|
|
21671
|
+
},
|
|
21672
|
+
"llm.deleteProfile": {
|
|
21673
|
+
capName: "llm",
|
|
21674
|
+
capScope: "system",
|
|
21675
|
+
addonId: null,
|
|
21676
|
+
access: "delete"
|
|
21677
|
+
},
|
|
21678
|
+
"llm.generate": {
|
|
21679
|
+
capName: "llm",
|
|
21680
|
+
capScope: "system",
|
|
21681
|
+
addonId: null,
|
|
21682
|
+
access: "create"
|
|
21683
|
+
},
|
|
21684
|
+
"llm.generateVision": {
|
|
21685
|
+
capName: "llm",
|
|
21686
|
+
capScope: "system",
|
|
21687
|
+
addonId: null,
|
|
21688
|
+
access: "create"
|
|
21689
|
+
},
|
|
21690
|
+
"llm.getDefaults": {
|
|
21691
|
+
capName: "llm",
|
|
21692
|
+
capScope: "system",
|
|
21693
|
+
addonId: null,
|
|
21694
|
+
access: "view"
|
|
21695
|
+
},
|
|
21696
|
+
"llm.getRuntimeStatus": {
|
|
21697
|
+
capName: "llm",
|
|
21698
|
+
capScope: "system",
|
|
21699
|
+
addonId: null,
|
|
21700
|
+
access: "view"
|
|
21701
|
+
},
|
|
21702
|
+
"llm.getUsage": {
|
|
21703
|
+
capName: "llm",
|
|
21704
|
+
capScope: "system",
|
|
21705
|
+
addonId: null,
|
|
21706
|
+
access: "view"
|
|
21707
|
+
},
|
|
21708
|
+
"llm.installModel": {
|
|
21709
|
+
capName: "llm",
|
|
21710
|
+
capScope: "system",
|
|
21711
|
+
addonId: null,
|
|
21712
|
+
access: "create"
|
|
21713
|
+
},
|
|
21714
|
+
"llm.listModelCatalog": {
|
|
21715
|
+
capName: "llm",
|
|
21716
|
+
capScope: "system",
|
|
21717
|
+
addonId: null,
|
|
21718
|
+
access: "view"
|
|
21719
|
+
},
|
|
21720
|
+
"llm.listModels": {
|
|
21721
|
+
capName: "llm",
|
|
21722
|
+
capScope: "system",
|
|
21723
|
+
addonId: null,
|
|
21724
|
+
access: "view"
|
|
21725
|
+
},
|
|
21726
|
+
"llm.listNodeModels": {
|
|
21727
|
+
capName: "llm",
|
|
21728
|
+
capScope: "system",
|
|
21729
|
+
addonId: null,
|
|
21730
|
+
access: "view"
|
|
21731
|
+
},
|
|
21732
|
+
"llm.listProfileKinds": {
|
|
21733
|
+
capName: "llm",
|
|
21734
|
+
capScope: "system",
|
|
21735
|
+
addonId: null,
|
|
21736
|
+
access: "view"
|
|
21737
|
+
},
|
|
21738
|
+
"llm.listProfiles": {
|
|
21739
|
+
capName: "llm",
|
|
21740
|
+
capScope: "system",
|
|
21741
|
+
addonId: null,
|
|
21742
|
+
access: "view"
|
|
21743
|
+
},
|
|
21744
|
+
"llm.listRuntimeNodes": {
|
|
21745
|
+
capName: "llm",
|
|
21746
|
+
capScope: "system",
|
|
21747
|
+
addonId: null,
|
|
21748
|
+
access: "view"
|
|
21749
|
+
},
|
|
21750
|
+
"llm.setDefault": {
|
|
21751
|
+
capName: "llm",
|
|
21752
|
+
capScope: "system",
|
|
21753
|
+
addonId: null,
|
|
21754
|
+
access: "create"
|
|
21755
|
+
},
|
|
21756
|
+
"llm.startRuntime": {
|
|
21757
|
+
capName: "llm",
|
|
21758
|
+
capScope: "system",
|
|
21759
|
+
addonId: null,
|
|
21760
|
+
access: "create"
|
|
21761
|
+
},
|
|
21762
|
+
"llm.stopRuntime": {
|
|
21763
|
+
capName: "llm",
|
|
21764
|
+
capScope: "system",
|
|
21765
|
+
addonId: null,
|
|
21766
|
+
access: "create"
|
|
21767
|
+
},
|
|
21768
|
+
"llm.testProfile": {
|
|
21769
|
+
capName: "llm",
|
|
21770
|
+
capScope: "system",
|
|
21771
|
+
addonId: null,
|
|
21772
|
+
access: "create"
|
|
21773
|
+
},
|
|
21774
|
+
"llm.upsertProfile": {
|
|
21775
|
+
capName: "llm",
|
|
21776
|
+
capScope: "system",
|
|
21777
|
+
addonId: null,
|
|
21778
|
+
access: "create"
|
|
21779
|
+
},
|
|
21780
|
+
"llmRuntime.complete": {
|
|
21781
|
+
capName: "llm-runtime",
|
|
21782
|
+
capScope: "system",
|
|
21783
|
+
addonId: null,
|
|
21784
|
+
access: "create"
|
|
21785
|
+
},
|
|
21786
|
+
"llmRuntime.deleteModel": {
|
|
21787
|
+
capName: "llm-runtime",
|
|
21788
|
+
capScope: "system",
|
|
21789
|
+
addonId: null,
|
|
21790
|
+
access: "delete"
|
|
21791
|
+
},
|
|
21792
|
+
"llmRuntime.ensureStarted": {
|
|
21793
|
+
capName: "llm-runtime",
|
|
21794
|
+
capScope: "system",
|
|
21795
|
+
addonId: null,
|
|
21796
|
+
access: "create"
|
|
21797
|
+
},
|
|
21798
|
+
"llmRuntime.getDiskUsage": {
|
|
21799
|
+
capName: "llm-runtime",
|
|
21800
|
+
capScope: "system",
|
|
21801
|
+
addonId: null,
|
|
21802
|
+
access: "view"
|
|
21803
|
+
},
|
|
21804
|
+
"llmRuntime.installModel": {
|
|
21805
|
+
capName: "llm-runtime",
|
|
21806
|
+
capScope: "system",
|
|
21807
|
+
addonId: null,
|
|
21808
|
+
access: "create"
|
|
21809
|
+
},
|
|
21810
|
+
"llmRuntime.listLocalModels": {
|
|
21811
|
+
capName: "llm-runtime",
|
|
21812
|
+
capScope: "system",
|
|
21813
|
+
addonId: null,
|
|
21814
|
+
access: "view"
|
|
21815
|
+
},
|
|
21816
|
+
"llmRuntime.status": {
|
|
21817
|
+
capName: "llm-runtime",
|
|
21818
|
+
capScope: "system",
|
|
21819
|
+
addonId: null,
|
|
21820
|
+
access: "view"
|
|
21821
|
+
},
|
|
21822
|
+
"llmRuntime.stop": {
|
|
21823
|
+
capName: "llm-runtime",
|
|
21824
|
+
capScope: "system",
|
|
21825
|
+
addonId: null,
|
|
21826
|
+
access: "create"
|
|
21827
|
+
},
|
|
20803
21828
|
"localNetwork.getAllowedAddresses": {
|
|
20804
21829
|
capName: "local-network",
|
|
20805
21830
|
capScope: "system",
|
|
@@ -21430,6 +22455,12 @@ Object.freeze({
|
|
|
21430
22455
|
addonId: null,
|
|
21431
22456
|
access: "delete"
|
|
21432
22457
|
},
|
|
22458
|
+
"pipelineAnalytics.deleteTracks": {
|
|
22459
|
+
capName: "pipeline-analytics",
|
|
22460
|
+
capScope: "device",
|
|
22461
|
+
addonId: null,
|
|
22462
|
+
access: "delete"
|
|
22463
|
+
},
|
|
21433
22464
|
"pipelineAnalytics.getActiveTracks": {
|
|
21434
22465
|
capName: "pipeline-analytics",
|
|
21435
22466
|
capScope: "device",
|
|
@@ -21472,6 +22503,12 @@ Object.freeze({
|
|
|
21472
22503
|
addonId: null,
|
|
21473
22504
|
access: "view"
|
|
21474
22505
|
},
|
|
22506
|
+
"pipelineAnalytics.getSensorEvents": {
|
|
22507
|
+
capName: "pipeline-analytics",
|
|
22508
|
+
capScope: "device",
|
|
22509
|
+
addonId: null,
|
|
22510
|
+
access: "view"
|
|
22511
|
+
},
|
|
21475
22512
|
"pipelineAnalytics.getTrack": {
|
|
21476
22513
|
capName: "pipeline-analytics",
|
|
21477
22514
|
capScope: "device",
|
|
@@ -21484,6 +22521,18 @@ Object.freeze({
|
|
|
21484
22521
|
addonId: null,
|
|
21485
22522
|
access: "view"
|
|
21486
22523
|
},
|
|
22524
|
+
"pipelineAnalytics.listEventKinds": {
|
|
22525
|
+
capName: "pipeline-analytics",
|
|
22526
|
+
capScope: "device",
|
|
22527
|
+
addonId: null,
|
|
22528
|
+
access: "view"
|
|
22529
|
+
},
|
|
22530
|
+
"pipelineAnalytics.listRecentTracks": {
|
|
22531
|
+
capName: "pipeline-analytics",
|
|
22532
|
+
capScope: "device",
|
|
22533
|
+
addonId: null,
|
|
22534
|
+
access: "view"
|
|
22535
|
+
},
|
|
21487
22536
|
"pipelineAnalytics.listTracks": {
|
|
21488
22537
|
capName: "pipeline-analytics",
|
|
21489
22538
|
capScope: "device",
|
|
@@ -21496,12 +22545,24 @@ Object.freeze({
|
|
|
21496
22545
|
addonId: null,
|
|
21497
22546
|
access: "create"
|
|
21498
22547
|
},
|
|
22548
|
+
"pipelineAnalytics.pruneTracksBefore": {
|
|
22549
|
+
capName: "pipeline-analytics",
|
|
22550
|
+
capScope: "device",
|
|
22551
|
+
addonId: null,
|
|
22552
|
+
access: "create"
|
|
22553
|
+
},
|
|
21499
22554
|
"pipelineAnalytics.searchObjectEvents": {
|
|
21500
22555
|
capName: "pipeline-analytics",
|
|
21501
22556
|
capScope: "device",
|
|
21502
22557
|
addonId: null,
|
|
21503
22558
|
access: "view"
|
|
21504
22559
|
},
|
|
22560
|
+
"pipelineAnalytics.wipeAllAnalytics": {
|
|
22561
|
+
capName: "pipeline-analytics",
|
|
22562
|
+
capScope: "device",
|
|
22563
|
+
addonId: null,
|
|
22564
|
+
access: "delete"
|
|
22565
|
+
},
|
|
21505
22566
|
"pipelineExecutor.cacheFrameInPool": {
|
|
21506
22567
|
capName: "pipeline-executor",
|
|
21507
22568
|
capScope: "system",
|
|
@@ -22006,18 +23067,42 @@ Object.freeze({
|
|
|
22006
23067
|
addonId: null,
|
|
22007
23068
|
access: "create"
|
|
22008
23069
|
},
|
|
23070
|
+
"plateGallery.assignPlate": {
|
|
23071
|
+
capName: "plate-gallery",
|
|
23072
|
+
capScope: "system",
|
|
23073
|
+
addonId: null,
|
|
23074
|
+
access: "create"
|
|
23075
|
+
},
|
|
23076
|
+
"plateGallery.assignPlates": {
|
|
23077
|
+
capName: "plate-gallery",
|
|
23078
|
+
capScope: "system",
|
|
23079
|
+
addonId: null,
|
|
23080
|
+
access: "create"
|
|
23081
|
+
},
|
|
22009
23082
|
"plateGallery.correctPlateText": {
|
|
22010
23083
|
capName: "plate-gallery",
|
|
22011
23084
|
capScope: "system",
|
|
22012
23085
|
addonId: null,
|
|
22013
23086
|
access: "create"
|
|
22014
23087
|
},
|
|
23088
|
+
"plateGallery.createVehicle": {
|
|
23089
|
+
capName: "plate-gallery",
|
|
23090
|
+
capScope: "system",
|
|
23091
|
+
addonId: null,
|
|
23092
|
+
access: "create"
|
|
23093
|
+
},
|
|
22015
23094
|
"plateGallery.deletePlate": {
|
|
22016
23095
|
capName: "plate-gallery",
|
|
22017
23096
|
capScope: "system",
|
|
22018
23097
|
addonId: null,
|
|
22019
23098
|
access: "delete"
|
|
22020
23099
|
},
|
|
23100
|
+
"plateGallery.deleteVehicle": {
|
|
23101
|
+
capName: "plate-gallery",
|
|
23102
|
+
capScope: "system",
|
|
23103
|
+
addonId: null,
|
|
23104
|
+
access: "delete"
|
|
23105
|
+
},
|
|
22021
23106
|
"plateGallery.getPlateByTrack": {
|
|
22022
23107
|
capName: "plate-gallery",
|
|
22023
23108
|
capScope: "system",
|
|
@@ -22036,6 +23121,30 @@ Object.freeze({
|
|
|
22036
23121
|
addonId: null,
|
|
22037
23122
|
access: "view"
|
|
22038
23123
|
},
|
|
23124
|
+
"plateGallery.listVehicles": {
|
|
23125
|
+
capName: "plate-gallery",
|
|
23126
|
+
capScope: "system",
|
|
23127
|
+
addonId: null,
|
|
23128
|
+
access: "view"
|
|
23129
|
+
},
|
|
23130
|
+
"plateGallery.listVehicleSamples": {
|
|
23131
|
+
capName: "plate-gallery",
|
|
23132
|
+
capScope: "system",
|
|
23133
|
+
addonId: null,
|
|
23134
|
+
access: "view"
|
|
23135
|
+
},
|
|
23136
|
+
"plateGallery.removeVehicleSample": {
|
|
23137
|
+
capName: "plate-gallery",
|
|
23138
|
+
capScope: "system",
|
|
23139
|
+
addonId: null,
|
|
23140
|
+
access: "delete"
|
|
23141
|
+
},
|
|
23142
|
+
"plateGallery.renameVehicle": {
|
|
23143
|
+
capName: "plate-gallery",
|
|
23144
|
+
capScope: "system",
|
|
23145
|
+
addonId: null,
|
|
23146
|
+
access: "create"
|
|
23147
|
+
},
|
|
22039
23148
|
"plateGallery.searchPlates": {
|
|
22040
23149
|
capName: "plate-gallery",
|
|
22041
23150
|
capScope: "system",
|
|
@@ -22048,6 +23157,18 @@ Object.freeze({
|
|
|
22048
23157
|
addonId: null,
|
|
22049
23158
|
access: "view"
|
|
22050
23159
|
},
|
|
23160
|
+
"plateGallery.unassignPlate": {
|
|
23161
|
+
capName: "plate-gallery",
|
|
23162
|
+
capScope: "system",
|
|
23163
|
+
addonId: null,
|
|
23164
|
+
access: "create"
|
|
23165
|
+
},
|
|
23166
|
+
"plateGallery.unassignPlates": {
|
|
23167
|
+
capName: "plate-gallery",
|
|
23168
|
+
capScope: "system",
|
|
23169
|
+
addonId: null,
|
|
23170
|
+
access: "create"
|
|
23171
|
+
},
|
|
22051
23172
|
"platformProbe.getCapabilities": {
|
|
22052
23173
|
capName: "platform-probe",
|
|
22053
23174
|
capScope: "system",
|
|
@@ -22240,6 +23361,48 @@ Object.freeze({
|
|
|
22240
23361
|
addonId: null,
|
|
22241
23362
|
access: "create"
|
|
22242
23363
|
},
|
|
23364
|
+
"sceneMonitor.captureReference": {
|
|
23365
|
+
capName: "scene-monitor",
|
|
23366
|
+
capScope: "device",
|
|
23367
|
+
addonId: null,
|
|
23368
|
+
access: "create"
|
|
23369
|
+
},
|
|
23370
|
+
"sceneMonitor.createScene": {
|
|
23371
|
+
capName: "scene-monitor",
|
|
23372
|
+
capScope: "device",
|
|
23373
|
+
addonId: null,
|
|
23374
|
+
access: "create"
|
|
23375
|
+
},
|
|
23376
|
+
"sceneMonitor.deleteReference": {
|
|
23377
|
+
capName: "scene-monitor",
|
|
23378
|
+
capScope: "device",
|
|
23379
|
+
addonId: null,
|
|
23380
|
+
access: "delete"
|
|
23381
|
+
},
|
|
23382
|
+
"sceneMonitor.deleteScene": {
|
|
23383
|
+
capName: "scene-monitor",
|
|
23384
|
+
capScope: "device",
|
|
23385
|
+
addonId: null,
|
|
23386
|
+
access: "delete"
|
|
23387
|
+
},
|
|
23388
|
+
"sceneMonitor.listScenes": {
|
|
23389
|
+
capName: "scene-monitor",
|
|
23390
|
+
capScope: "device",
|
|
23391
|
+
addonId: null,
|
|
23392
|
+
access: "view"
|
|
23393
|
+
},
|
|
23394
|
+
"sceneMonitor.recheckNow": {
|
|
23395
|
+
capName: "scene-monitor",
|
|
23396
|
+
capScope: "device",
|
|
23397
|
+
addonId: null,
|
|
23398
|
+
access: "create"
|
|
23399
|
+
},
|
|
23400
|
+
"sceneMonitor.updateScene": {
|
|
23401
|
+
capName: "scene-monitor",
|
|
23402
|
+
capScope: "device",
|
|
23403
|
+
addonId: null,
|
|
23404
|
+
access: "create"
|
|
23405
|
+
},
|
|
22243
23406
|
"scriptRunner.run": {
|
|
22244
23407
|
capName: "script-runner",
|
|
22245
23408
|
capScope: "device",
|
|
@@ -23324,6 +24487,7 @@ Object.freeze({
|
|
|
23324
24487
|
Object.freeze({
|
|
23325
24488
|
"broker": "broker",
|
|
23326
24489
|
"device-export": "device-export",
|
|
24490
|
+
"llm": "ai",
|
|
23327
24491
|
"mesh-network": "mesh",
|
|
23328
24492
|
"mqtt-broker": "broker",
|
|
23329
24493
|
"network-access": "ingress",
|
|
@@ -23356,7 +24520,7 @@ object({
|
|
|
23356
24520
|
schemaVersion: literal(1)
|
|
23357
24521
|
});
|
|
23358
24522
|
//#endregion
|
|
23359
|
-
//#region ../system/dist/model-download-service-
|
|
24523
|
+
//#region ../system/dist/model-download-service-Cp9f4dk6.mjs
|
|
23360
24524
|
/** Build fetch headers, including HF auth token for huggingface.co URLs */
|
|
23361
24525
|
function buildHeaders(url) {
|
|
23362
24526
|
const headers = { "User-Agent": "CamStack/1.0" };
|