@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.
@@ -4320,6 +4320,14 @@ function object(shape, params) {
4320
4320
  ...normalizeParams(params)
4321
4321
  });
4322
4322
  }
4323
+ function looseObject(shape, params) {
4324
+ return new ZodObject({
4325
+ type: "object",
4326
+ shape,
4327
+ catchall: unknown(),
4328
+ ...normalizeParams(params)
4329
+ });
4330
+ }
4323
4331
  var ZodUnion = /*@__PURE__*/ $constructor("ZodUnion", (inst, def) => {
4324
4332
  $ZodUnion.init(inst, def);
4325
4333
  ZodType.init(inst, def);
@@ -4661,7 +4669,7 @@ function _instanceof(cls, params = {}) {
4661
4669
  return inst;
4662
4670
  }
4663
4671
  //#endregion
4664
- //#region ../types/dist/sleep-Baang_XW.mjs
4672
+ //#region ../types/dist/event-category-H4AVePnn.mjs
4665
4673
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4666
4674
  EventCategory["SystemBoot"] = "system.boot";
4667
4675
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -4811,6 +4819,9 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
4811
4819
  EventCategory["RecordingSegmentWritten"] = "recording.segment.written";
4812
4820
  EventCategory["RecordingPolicyFallback"] = "recording.policy.fallback";
4813
4821
  EventCategory["RecordingRetentionCompleted"] = "recording.retention.completed";
4822
+ /** Runner-sampled scrub thumbnail (~1/5 s/camera). Telemetry (D8): a lost
4823
+ * thumb is a scrub gap the recorder's keyframe backfill covers. */
4824
+ EventCategory["RecordingThumbSampled"] = "recording.thumb-sampled";
4814
4825
  EventCategory["DetectionEvent"] = "detection.event";
4815
4826
  EventCategory["SessionTrackNew"] = "session.track.new";
4816
4827
  EventCategory["SessionTrackExpired"] = "session.track.expired";
@@ -5071,10 +5082,51 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5071
5082
  EventCategory["EnrichmentEmbeddingStored"] = "enrichment.embedding.stored";
5072
5083
  EventCategory["EnrichmentSceneStateChanged"] = "enrichment.scene.state-changed";
5073
5084
  EventCategory["EnrichmentActivitySummary"] = "enrichment.activity.summary";
5085
+ /**
5086
+ * Unified track-lifecycle event: ONE category carrying `phase:
5087
+ * 'start' | 'update' | 'end'` with a rich, typed
5088
+ * `PipelineAnalyticsTrackLifecyclePayload`. Supersedes the thin
5089
+ * `PipelineAnalyticsTrackStarted` / `PipelineAnalyticsTrackEnded`
5090
+ * pair — a consumer subscribes once and branches on `phase`.
5091
+ */
5092
+ EventCategory["PipelineAnalyticsTrackLifecycle"] = "pipeline-analytics.track-lifecycle";
5093
+ /**
5094
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
5095
+ * (`phase:'start'`). Kept as a soft alias — no known subscribers.
5096
+ */
5074
5097
  EventCategory["PipelineAnalyticsTrackStarted"] = "pipeline-analytics.track-started";
5098
+ /**
5099
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
5100
+ * (`phase:'end'`). Kept as a soft alias — no known subscribers.
5101
+ */
5075
5102
  EventCategory["PipelineAnalyticsTrackEnded"] = "pipeline-analytics.track-ended";
5076
5103
  EventCategory["PipelineAnalyticsDetectionEvent"] = "pipeline-analytics.detection-event";
5077
5104
  EventCategory["PipelineAnalyticsFrameTracked"] = "pipeline-analytics.frame-tracked";
5105
+ /**
5106
+ * Fired by `addon-post-analysis` when a parked (stationary) object appears
5107
+ * (a track was promoted to a stationary-registry entry) or departs (the
5108
+ * object moved / was removed). Telemetry (D8): lossy, drives a UI refresh of
5109
+ * the dedicated "Stationary" section — never the live event feed. Payload:
5110
+ * `{ deviceId, entryId, className, phase:'appeared'|'departed', timestamp }`.
5111
+ */
5112
+ EventCategory["PipelineAnalyticsStationaryChanged"] = "pipeline-analytics.stationary-changed";
5113
+ /**
5114
+ * Fired by `addon-post-analysis` whenever a gallery face row changes:
5115
+ * `kind:'buffered'` a new detected face was persisted, `'assigned'` /
5116
+ * `'unassigned'` its identity link changed, `'deleted'` the row was
5117
+ * removed. Telemetry semantics (D8): a lost event only delays a refresh,
5118
+ * never a correctness issue. Payload `PipelineAnalyticsFaceGalleryChangedPayload`.
5119
+ */
5120
+ EventCategory["PipelineAnalyticsFaceGalleryChanged"] = "pipeline-analytics.face-gallery-changed";
5121
+ /**
5122
+ * Fired by `addon-post-analysis` whenever a gallery plate row changes:
5123
+ * `kind:'buffered'` a new read was persisted (`PlateRecognizer.onTrackEnd`),
5124
+ * `'assigned'` / `'unassigned'` its vehicle link changed
5125
+ * (`PlateGalleryProvider`), `'deleted'` the row was removed. Telemetry
5126
+ * semantics (D8): a lost event only delays a refresh, never a correctness
5127
+ * issue. Payload `PipelineAnalyticsPlateGalleryChangedPayload`.
5128
+ */
5129
+ EventCategory["PipelineAnalyticsPlateGalleryChanged"] = "pipeline-analytics.plate-gallery-changed";
5078
5130
  EventCategory["FrigateLiveEvent"] = "frigate.live-event";
5079
5131
  EventCategory["CameraStreamsProfileSlotsChanged"] = "camera-streams.onProfileSlotsChanged";
5080
5132
  /**
@@ -6903,7 +6955,8 @@ var MODEL_FORMATS = [
6903
6955
  "coreml",
6904
6956
  "openvino",
6905
6957
  "tflite",
6906
- "pt"
6958
+ "pt",
6959
+ "gguf"
6907
6960
  ];
6908
6961
  /**
6909
6962
  * Multi-file format payload.
@@ -6947,7 +7000,8 @@ var ModelFormatsSchema = object({
6947
7000
  coreml: ModelFormatEntrySchema.optional(),
6948
7001
  openvino: ModelFormatEntrySchema.optional(),
6949
7002
  tflite: ModelFormatEntrySchema.optional(),
6950
- pt: ModelFormatEntrySchema.optional()
7003
+ pt: ModelFormatEntrySchema.optional(),
7004
+ gguf: ModelFormatEntrySchema.optional()
6951
7005
  });
6952
7006
  /**
6953
7007
  * Variant-selector grouping axes. Shared by the full `ModelCatalogEntry` and by
@@ -6988,6 +7042,15 @@ var ModelCatalogEntrySchema = object({
6988
7042
  width: number(),
6989
7043
  height: number()
6990
7044
  }),
7045
+ /**
7046
+ * Channel count of the model input tensor. Omit ⇒ 3 (RGB), the default for
7047
+ * every detector / classifier / embedder. Set to 1 for a grayscale CTC text
7048
+ * recognizer (EasyOCR VGG plate-OCR: input `[N,1,H,W]`) so the preprocess
7049
+ * feeds a single-channel, EasyOCR-normalized tensor instead of the default
7050
+ * 3-channel RGB one. Threaded through `PoolModelConfig.inputChannels` to the
7051
+ * Python inference pool.
7052
+ */
7053
+ inputChannels: number().int().positive().optional(),
6991
7054
  labels: array(LabelDefinitionSchema).readonly(),
6992
7055
  inputLayout: _enum(["nchw", "nhwc"]).optional(),
6993
7056
  inputNormalization: _enum([
@@ -6997,6 +7060,16 @@ var ModelCatalogEntrySchema = object({
6997
7060
  ]).optional(),
6998
7061
  preprocessMode: _enum(["letterbox", "resize"]).optional(),
6999
7062
  /**
7063
+ * Per-MODEL postprocessor override. Absent ⇒ the step's own
7064
+ * `StepDefinition.postprocessor` applies (the normal case — every model in a
7065
+ * step shares its decode). Set it when a step hosts models with DIFFERENT raw
7066
+ * output layouts under one slot: e.g. object-detection is `'yolo'` by default,
7067
+ * but a Coral SSD MobileNet build emits the `TFLite_Detection_PostProcess`
7068
+ * 4-tensor layout and needs `'ssd'`. Threaded into `PoolModelConfig.postprocessor`
7069
+ * by the engine factory (`modelEntry.postprocessor ?? def.postprocessor`).
7070
+ */
7071
+ postprocessor: custom().optional(),
7072
+ /**
7000
7073
  * When true, the executor produces a landmark-aligned crop (similarity warp
7001
7074
  * onto the canonical template) before this step runs, instead of a plain
7002
7075
  * axis-aligned bbox crop. Required for face-recognition embedders (ArcFace):
@@ -9807,7 +9880,7 @@ object({
9807
9880
  deviceId: number(),
9808
9881
  timestamp: number()
9809
9882
  });
9810
- DeviceType.Button;
9883
+ DeviceType.Button, DeviceType.Camera;
9811
9884
  /**
9812
9885
  * Enum-state sensor — a string value picked from a finite option set.
9813
9886
  * Drives HA `sensor` entries with `state_class: enum` (HVAC action
@@ -10473,7 +10546,8 @@ var ModelFormatSchema$1 = _enum([
10473
10546
  "coreml",
10474
10547
  "openvino",
10475
10548
  "tflite",
10476
- "pt"
10549
+ "pt",
10550
+ "gguf"
10477
10551
  ]);
10478
10552
  var PipelineSlotSchema = _enum([
10479
10553
  "detector",
@@ -10567,7 +10641,8 @@ var EngineProvisioningSchema = object({
10567
10641
  runtimeId: _enum([
10568
10642
  "onnx",
10569
10643
  "openvino",
10570
- "coreml"
10644
+ "coreml",
10645
+ "edgetpu"
10571
10646
  ]).nullable(),
10572
10647
  device: string().nullable(),
10573
10648
  state: _enum([
@@ -11779,6 +11854,140 @@ DeviceType.Camera, method(object({ deviceId: number() }), PtzAutotrackStatusSche
11779
11854
  deviceId: number(),
11780
11855
  status: PtzAutotrackStatusSchema
11781
11856
  });
11857
+ /**
11858
+ * scene-monitor — device-scoped reference-region state cap. An operator marks
11859
+ * a rect ROI on a camera frame and names one or more states; the engine
11860
+ * (pipeline-analytics, designated post-processing node) reports which state is
11861
+ * active on an ongoing basis. Two operator-selectable check modes share every-
11862
+ * thing except the comparator: `similarity` (CLIP cosine at the same ROI coords
11863
+ * vs condition-tagged references) and `llm` (vision-LLM judgment over the crop).
11864
+ *
11865
+ * D14 device-config archetype (`deviceConfig.ui.kind:'widget'`) — the framework
11866
+ * derives the device-detail contribution; the provider carries NO hand-written
11867
+ * settings-contribution methods. `status.kind:'push'` — the engine pushes on
11868
+ * every hysteresis flip / availability change; consumers never poll.
11869
+ */
11870
+ /** Extensible condition tag. Seeded 'day' | 'night'; open by design so more can
11871
+ * be added without a wire break (matching falls back to any-condition refs). */
11872
+ var SceneConditionSchema = string();
11873
+ /** One captured reference — condition-tagged, model-version-gated. `embedding`
11874
+ * is `number[]` (Float32Array does NOT survive MsgPack/UDS). */
11875
+ var SceneReferenceSchema = object({
11876
+ embedding: array(number()),
11877
+ modelId: string(),
11878
+ condition: SceneConditionSchema,
11879
+ capturedAt: number(),
11880
+ thumbnailMediaId: string().optional()
11881
+ });
11882
+ var SceneMonitorStateSchema = object({
11883
+ id: string(),
11884
+ label: string(),
11885
+ references: array(SceneReferenceSchema),
11886
+ textPrompts: array(string()).optional(),
11887
+ referenceCount: number(),
11888
+ currentlyMatched: boolean()
11889
+ });
11890
+ /** Per-mode comparator params in a discriminated union so an `llm` scene never
11891
+ * carries similarity knobs and vice-versa. */
11892
+ var SceneCheckSchema = discriminatedUnion("mode", [object({
11893
+ mode: literal("similarity"),
11894
+ threshold: number().min(0).max(1),
11895
+ hysteresisCount: number().int().positive()
11896
+ }), object({
11897
+ mode: literal("llm"),
11898
+ prompt: string(),
11899
+ profileId: string().optional(),
11900
+ hysteresisCount: number().int().positive()
11901
+ })]);
11902
+ var SceneMonitorSchema = object({
11903
+ id: string(),
11904
+ label: string(),
11905
+ roi: MaskRectShapeSchema,
11906
+ enabled: boolean(),
11907
+ triggerMode: _enum([
11908
+ "periodic",
11909
+ "on-motion",
11910
+ "both"
11911
+ ]),
11912
+ checkIntervalSec: number().optional(),
11913
+ check: SceneCheckSchema,
11914
+ states: array(SceneMonitorStateSchema),
11915
+ currentStateId: string().nullable(),
11916
+ lastCheckedAt: number().nullable(),
11917
+ lastConfidence: number().nullable(),
11918
+ currentCondition: SceneConditionSchema.nullable(),
11919
+ availability: _enum(["ok", "unavailable"]),
11920
+ unavailableReason: string().nullable()
11921
+ });
11922
+ var SceneMonitorStatusSchema = object({
11923
+ monitors: array(SceneMonitorSchema),
11924
+ lastFetchedAt: number()
11925
+ });
11926
+ DeviceType.Camera, method(object({ deviceId: number() }), SceneMonitorStatusSchema), method(object({
11927
+ deviceId: number(),
11928
+ label: string(),
11929
+ roi: MaskRectShapeSchema,
11930
+ check: SceneCheckSchema,
11931
+ triggerMode: _enum([
11932
+ "periodic",
11933
+ "on-motion",
11934
+ "both"
11935
+ ]).optional(),
11936
+ checkIntervalSec: number().optional()
11937
+ }), SceneMonitorSchema, {
11938
+ kind: "mutation",
11939
+ auth: "admin"
11940
+ }), method(object({
11941
+ deviceId: number(),
11942
+ monitorId: string(),
11943
+ patch: object({
11944
+ label: string().optional(),
11945
+ roi: MaskRectShapeSchema.optional(),
11946
+ enabled: boolean().optional(),
11947
+ triggerMode: _enum([
11948
+ "periodic",
11949
+ "on-motion",
11950
+ "both"
11951
+ ]).optional(),
11952
+ checkIntervalSec: number().optional(),
11953
+ check: SceneCheckSchema.optional()
11954
+ })
11955
+ }), _void(), {
11956
+ kind: "mutation",
11957
+ auth: "admin"
11958
+ }), method(object({
11959
+ deviceId: number(),
11960
+ monitorId: string()
11961
+ }), _void(), {
11962
+ kind: "mutation",
11963
+ auth: "admin"
11964
+ }), method(object({
11965
+ deviceId: number(),
11966
+ monitorId: string(),
11967
+ stateId: string().optional(),
11968
+ label: string().optional(),
11969
+ condition: SceneConditionSchema.optional()
11970
+ }), object({
11971
+ stateId: string(),
11972
+ referenceCount: number()
11973
+ }), {
11974
+ kind: "mutation",
11975
+ auth: "admin"
11976
+ }), method(object({
11977
+ deviceId: number(),
11978
+ monitorId: string(),
11979
+ stateId: string(),
11980
+ index: number()
11981
+ }), _void(), {
11982
+ kind: "mutation",
11983
+ auth: "admin"
11984
+ }), method(object({
11985
+ deviceId: number(),
11986
+ monitorId: string()
11987
+ }), _void(), {
11988
+ kind: "mutation",
11989
+ auth: "admin"
11990
+ });
11782
11991
  object({
11783
11992
  /** Whether the script is currently executing. */
11784
11993
  isRunning: boolean(),
@@ -12186,6 +12395,36 @@ var ZoneScopeBreakdownSchema = PerScopeBreakdownSchema.extend({
12186
12395
  * with the per-track detail panel and live overlay. */
12187
12396
  trackIds: array(string()).readonly()
12188
12397
  });
12398
+ /**
12399
+ * A parked ("stationary") object surfaced alongside occupancy — an object that
12400
+ * settled and stopped moving. It is NO LONGER a tracked object (the tracker was
12401
+ * told to forget it so it stops re-spawning tracks/events), but it IS still
12402
+ * physically present, so it keeps counting toward `frame` occupancy and is
12403
+ * listed here so the UI can show it in a dedicated "Stationary" section instead
12404
+ * of flooding the live event feed.
12405
+ */
12406
+ var StationaryObjectSchema = object({
12407
+ id: string(),
12408
+ className: string(),
12409
+ bbox: object({
12410
+ x: number(),
12411
+ y: number(),
12412
+ w: number(),
12413
+ h: number()
12414
+ }),
12415
+ frameWidth: number().int().nonnegative(),
12416
+ frameHeight: number().int().nonnegative(),
12417
+ /** When the source track was first seen. */
12418
+ firstSeenAt: number().int(),
12419
+ /** When the object was recognised as parked (promotion time). */
12420
+ becameStationaryAt: number().int(),
12421
+ /** Last frame a detection confirmed the object is still there. */
12422
+ lastConfirmedAt: number().int(),
12423
+ /** Enrichment label carried from the source track (identity / plate). */
12424
+ label: string().optional(),
12425
+ /** Native-resolution key-frame media key for the parked object's best image. */
12426
+ keyFrameMediaKey: string().optional()
12427
+ });
12189
12428
  var CameraOccupancySnapshotSchema = object({
12190
12429
  /** Frame timestamp of the inference result that produced this snapshot. */
12191
12430
  ts: number().int(),
@@ -12194,10 +12433,15 @@ var CameraOccupancySnapshotSchema = object({
12194
12433
  frameHeight: number().int().nonnegative(),
12195
12434
  /** Per-zone breakdown — one entry per defined zone (user + onboard). */
12196
12435
  zones: array(ZoneScopeBreakdownSchema).readonly(),
12197
- /** Frame-wide aggregate (everywhere, regardless of zone membership). */
12436
+ /** Frame-wide aggregate (everywhere, regardless of zone membership).
12437
+ * INCLUDES currently-confirmed stationary objects (they are still present). */
12198
12438
  frame: PerScopeBreakdownSchema,
12199
12439
  /** Detections that landed outside every zone. Empty when no zones defined. */
12200
- unzoned: PerScopeBreakdownSchema
12440
+ unzoned: PerScopeBreakdownSchema,
12441
+ /** Parked objects on this camera (additive — absent on legacy snapshots).
12442
+ * Surfaced separately so the UI shows them in a dedicated section rather
12443
+ * than as repeated tracks/events. */
12444
+ stationaryObjects: array(StationaryObjectSchema).readonly().optional()
12201
12445
  });
12202
12446
  /**
12203
12447
  * Time-series resolution. The history methods return one bucket per
@@ -12806,7 +13050,12 @@ var NotificationRuleConditionsSchema = object({
12806
13050
  clipDescription: object({
12807
13051
  text: string().min(1),
12808
13052
  minSimilarity: number().min(0).max(1)
12809
- }).optional()
13053
+ }).optional(),
13054
+ /** Match events whose recognized-entity label (face identity name or plate
13055
+ * vehicle name, propagated onto `event.data.label`) is one of these values.
13056
+ * Empty/absent → unaffected (back-compat). Enables "notify me when <named
13057
+ * vehicle/person> is seen". */
13058
+ labels: array(string()).readonly().optional()
12810
13059
  });
12811
13060
  var NotificationRuleTemplateSchema = object({
12812
13061
  title: string(),
@@ -13064,11 +13313,19 @@ method(object({
13064
13313
  * login page needs NO change.
13065
13314
  *
13066
13315
  * - `widget` — a Module-Federation widget the login page mounts (via
13067
- * `loadRemoteBundle`) for an in-page ceremony. Covers the passkey
13068
- * login ceremony, which must run `@simplewebauthn/browser` INSIDE the
13069
- * addon bundle. The referenced widget also declares `preAuth: true` in
13070
- * its `addon-widgets-source` catalog entry. `auth.listLoginMethods`
13071
- * stamps a public `bundleUrl` from `addonId` + `bundle`.
13316
+ * `loadRemoteBundle`) for an in-page ceremony. `auth.listLoginMethods`
13317
+ * stamps a public `bundleUrl` from `addonId` + `bundle`. Generic
13318
+ * mechanism kept for future use; no shipped addon uses it on the login
13319
+ * page (the passkey ceremony below runs natively in the shell instead).
13320
+ *
13321
+ * - `passkey` — a declarative WebAuthn ceremony the shell renders
13322
+ * natively (`@simplewebauthn/browser` lives in `addon-admin-ui`, not in
13323
+ * a remotely-loaded bundle). Carries the addon's effective `rpId` /
13324
+ * `origin` (from its `resolveRpID()` / `resolveOrigin()`) so the shell
13325
+ * can gate visibility (IP-literal origin, hostname/rpId mismatch) WITHOUT
13326
+ * fetching any remote code pre-auth. Contribution stays unconditional —
13327
+ * enrollment state is never leaked pre-auth; visibility is a shell
13328
+ * decision.
13072
13329
  *
13073
13330
  * Every contribution carries a `stage`:
13074
13331
  * - `primary` — shown on the first credentials screen (OIDC /
@@ -13082,30 +13339,45 @@ method(object({
13082
13339
  */
13083
13340
  /** When a login method renders in the two-phase login flow. */
13084
13341
  var LoginStageEnum = _enum(["primary", "second-factor"]);
13085
- /** One login-method contribution — redirect button OR pre-auth widget. */
13086
- var LoginMethodContributionSchema = discriminatedUnion("kind", [object({
13087
- kind: literal("redirect"),
13088
- /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
13089
- id: string(),
13090
- /** Operator-facing button label. */
13091
- label: string(),
13092
- /** lucide-react icon name. */
13093
- icon: string().optional(),
13094
- /** Addon-owned HTTP route the button navigates to (GET). */
13095
- startUrl: string(),
13096
- stage: LoginStageEnum
13097
- }), object({
13098
- kind: literal("widget"),
13099
- /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
13100
- id: string(),
13101
- /** Owning addon id drives the public bundle URL + the MF namespace. */
13102
- addonId: string(),
13103
- /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
13104
- bundle: string(),
13105
- /** MF remote descriptor `{ remoteName, exposedModule, componentKey }`. */
13106
- remote: WidgetRemoteSchema,
13107
- stage: LoginStageEnum
13108
- })]);
13342
+ /** One login-method contribution — redirect button, pre-auth widget, or native passkey ceremony. */
13343
+ var LoginMethodContributionSchema = discriminatedUnion("kind", [
13344
+ object({
13345
+ kind: literal("redirect"),
13346
+ /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
13347
+ id: string(),
13348
+ /** Operator-facing button label. */
13349
+ label: string(),
13350
+ /** lucide-react icon name. */
13351
+ icon: string().optional(),
13352
+ /** Addon-owned HTTP route the button navigates to (GET). */
13353
+ startUrl: string(),
13354
+ stage: LoginStageEnum
13355
+ }),
13356
+ object({
13357
+ kind: literal("widget"),
13358
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
13359
+ id: string(),
13360
+ /** Owning addon id — drives the public bundle URL + the MF namespace. */
13361
+ addonId: string(),
13362
+ /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
13363
+ bundle: string(),
13364
+ /** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
13365
+ remote: WidgetRemoteSchema,
13366
+ stage: LoginStageEnum
13367
+ }),
13368
+ object({
13369
+ kind: literal("passkey"),
13370
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-direct-login`). */
13371
+ id: string(),
13372
+ /** Operator-facing button label. */
13373
+ label: string(),
13374
+ stage: LoginStageEnum,
13375
+ /** Effective WebAuthn RP ID (`resolveRpID()`) — the shell gates visibility on it. */
13376
+ rpId: string(),
13377
+ /** Effective expected origin (`resolveOrigin()`), null when unconfigured. */
13378
+ origin: string().nullable()
13379
+ })
13380
+ ]);
13109
13381
  method(_void(), array(LoginMethodContributionSchema).readonly());
13110
13382
  /**
13111
13383
  * Orchestrator-side destination metadata. The orchestrator computes
@@ -14011,6 +14283,14 @@ var ConfigEntrySchema = object({
14011
14283
  value: unknown(),
14012
14284
  description: string().optional()
14013
14285
  });
14286
+ var DeviceLinkModeSchema = _enum(["auto", "manual"]);
14287
+ /** One resolved linked device — the compact projection consumers need. */
14288
+ var LinkedDeviceSchema = object({
14289
+ deviceId: number(),
14290
+ name: string(),
14291
+ location: string().nullable(),
14292
+ features: array(string())
14293
+ });
14014
14294
  var SavedDeviceRowSchema = object({
14015
14295
  /** Numeric id reserved at allocateDeviceId time. */
14016
14296
  id: number(),
@@ -14232,7 +14512,10 @@ method(object({
14232
14512
  }), _void(), {
14233
14513
  kind: "mutation",
14234
14514
  auth: "admin"
14235
- }), 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() }), array(StreamSourceEntrySchema$1)), method(object({ deviceId: number() }), array(ConfigEntrySchema)), method(object({ deviceId: number() }), ConfigUISchemaOutput), method(object({
14515
+ }), 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({
14516
+ mode: DeviceLinkModeSchema,
14517
+ devices: array(LinkedDeviceSchema)
14518
+ })), method(object({ deviceId: number() }), array(StreamSourceEntrySchema$1)), method(object({ deviceId: number() }), array(ConfigEntrySchema)), method(object({ deviceId: number() }), ConfigUISchemaOutput), method(object({
14236
14519
  deviceId: number(),
14237
14520
  values: record(string(), unknown())
14238
14521
  }), object({ success: literal(true) }), {
@@ -14966,14 +15249,14 @@ var TargetKindCapsSchema = object({
14966
15249
  * the union is large and not meant for runtime validation here; the exported
14967
15250
  * `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
14968
15251
  */
14969
- var ConfigSchemaPassthrough = unknown();
15252
+ var ConfigSchemaPassthrough$1 = unknown();
14970
15253
  var TargetKindSchema = object({
14971
15254
  kind: string(),
14972
15255
  label: string(),
14973
15256
  icon: string(),
14974
15257
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
14975
15258
  addonId: string(),
14976
- configSchema: ConfigSchemaPassthrough,
15259
+ configSchema: ConfigSchemaPassthrough$1,
14977
15260
  supportsDiscovery: boolean(),
14978
15261
  caps: TargetKindCapsSchema
14979
15262
  });
@@ -15026,6 +15309,298 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
15026
15309
  enabled: boolean()
15027
15310
  }), _void(), { kind: "mutation" });
15028
15311
  /**
15312
+ * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
15313
+ * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
15314
+ * caps stay wire-compatible without a circular cap→cap import.
15315
+ *
15316
+ * Errors are a discriminated-union RESULT, never thrown: the shape survives
15317
+ * every transport tier structurally, and failed calls still write usage rows.
15318
+ * Token counts only in v1 — no costUsd (operator decision, 2026-07-15).
15319
+ */
15320
+ var LlmUsageSchema = object({
15321
+ inputTokens: number(),
15322
+ outputTokens: number()
15323
+ });
15324
+ var LlmErrorCodeSchema = _enum([
15325
+ "timeout",
15326
+ "rate-limited",
15327
+ "auth",
15328
+ "refusal",
15329
+ "bad-request",
15330
+ "unavailable",
15331
+ "no-profile",
15332
+ "budget-exceeded",
15333
+ "adapter-error"
15334
+ ]);
15335
+ var LlmGenerateResultSchema = discriminatedUnion("ok", [object({
15336
+ ok: literal(true),
15337
+ text: string(),
15338
+ model: string(),
15339
+ usage: LlmUsageSchema,
15340
+ truncated: boolean(),
15341
+ latencyMs: number()
15342
+ }), object({
15343
+ ok: literal(false),
15344
+ code: LlmErrorCodeSchema,
15345
+ message: string(),
15346
+ retryAfterMs: number().optional()
15347
+ })]);
15348
+ /**
15349
+ * `Uint8Array` is the sanctioned binary convention — superjson + the UDS
15350
+ * MsgPack channel round-trip typed arrays (embedding-encoder.cap.ts:29,
15351
+ * notification-output.cap.ts:27-31 precedents).
15352
+ */
15353
+ var LlmImageSchema = object({
15354
+ bytes: _instanceof(Uint8Array),
15355
+ mimeType: string()
15356
+ });
15357
+ var LlmGenerateBaseInputSchema = object({
15358
+ /** Collection routing (the notification-output posture). */
15359
+ addonId: string().optional(),
15360
+ /** Explicit profile; else the resolution chain (spec §3). */
15361
+ profileId: string().optional(),
15362
+ /** MANDATORY usage tag: 'ai-summary', 'notifier-rules', 'adhoc-ui', … */
15363
+ consumer: string(),
15364
+ system: string().optional(),
15365
+ /** v1: single-turn. `messages[]` is a v2 additive field. */
15366
+ prompt: string(),
15367
+ /** Structured output — adapter-mapped (response_format / forced tool / responseSchema). */
15368
+ jsonSchema: record(string(), unknown()).optional(),
15369
+ /** Per-call override of the profile default. */
15370
+ maxTokens: number().int().positive().optional(),
15371
+ temperature: number().optional()
15372
+ });
15373
+ /**
15374
+ * `llm-runtime` — node-side managed llama.cpp executor (spec §4). Registered
15375
+ * on EVERY node where `addon-ai` is installed; the hub `llm` provider reaches
15376
+ * a specific node's runtime with `nodePin(profile.runtime.nodeId)` — normal
15377
+ * cap routing, zero bespoke plumbing. `internal: true`: the operator reaches
15378
+ * this only through the `llm` cap's methods.
15379
+ *
15380
+ * One running llama-server child per node in v1 (models are RAM-heavy).
15381
+ * Resource ceiling = llama-server flags + idleStopMinutes ONLY (no RSS
15382
+ * watchdog — operator decision #3).
15383
+ */
15384
+ var ManagedModelRefSchema = discriminatedUnion("kind", [
15385
+ object({
15386
+ kind: literal("catalog"),
15387
+ catalogId: string()
15388
+ }),
15389
+ object({
15390
+ kind: literal("url"),
15391
+ url: string(),
15392
+ sha256: string().optional()
15393
+ }),
15394
+ object({
15395
+ kind: literal("path"),
15396
+ path: string()
15397
+ })
15398
+ ]);
15399
+ var ManagedRuntimeConfigSchema = object({
15400
+ /** WHERE the runtime lives — hub or any agent. */
15401
+ nodeId: string(),
15402
+ /** Closed for v1; 'ollama' is a v2 candidate. */
15403
+ engine: _enum(["llama-cpp"]),
15404
+ model: ManagedModelRefSchema,
15405
+ contextSize: number().int().default(4096),
15406
+ /** 0 = CPU-only. */
15407
+ gpuLayers: number().int().default(0),
15408
+ /** Default: cpus-2, clamped ≥1 (resolved node-side). */
15409
+ threads: number().int().optional(),
15410
+ /** Concurrent slots. */
15411
+ parallel: number().int().default(1),
15412
+ /** Else lazy: first generate boots it. */
15413
+ autoStart: boolean().default(false),
15414
+ /** 0 = never; frees RAM after quiet periods. */
15415
+ idleStopMinutes: number().int().default(30)
15416
+ });
15417
+ var LlmRuntimeStatusSchema = object({
15418
+ /** Status is ALWAYS node-qualified. */
15419
+ nodeId: string(),
15420
+ state: _enum([
15421
+ "stopped",
15422
+ "downloading",
15423
+ "starting",
15424
+ "ready",
15425
+ "crashed",
15426
+ "failed"
15427
+ ]),
15428
+ pid: number().optional(),
15429
+ port: number().optional(),
15430
+ modelPath: string().optional(),
15431
+ modelId: string().optional(),
15432
+ downloadProgress: number().min(0).max(1).optional(),
15433
+ lastError: string().optional(),
15434
+ crashesInWindow: number(),
15435
+ /** Child RSS (sampled best-effort). */
15436
+ memoryBytes: number().optional(),
15437
+ vramBytes: number().optional()
15438
+ });
15439
+ var LlmNodeModelSchema = object({
15440
+ file: string(),
15441
+ sizeBytes: number(),
15442
+ catalogId: string().optional(),
15443
+ installedAt: number().optional()
15444
+ });
15445
+ var LlmRuntimeDiskUsageSchema = object({
15446
+ nodeId: string(),
15447
+ modelsBytes: number(),
15448
+ freeBytes: number().optional()
15449
+ });
15450
+ method(LlmGenerateBaseInputSchema.extend({
15451
+ images: array(LlmImageSchema).optional(),
15452
+ runtime: ManagedRuntimeConfigSchema,
15453
+ /** The managed profile's timeout, threaded by the hub provider. */
15454
+ timeoutMs: number().int().positive().optional()
15455
+ }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
15456
+ kind: "mutation",
15457
+ auth: "admin"
15458
+ }), method(object({}), _void(), {
15459
+ kind: "mutation",
15460
+ auth: "admin"
15461
+ }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
15462
+ kind: "mutation",
15463
+ auth: "admin"
15464
+ }), method(object({ file: string() }), _void(), {
15465
+ kind: "mutation",
15466
+ auth: "admin"
15467
+ }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
15468
+ /**
15469
+ * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
15470
+ * methods concat-fan across providers; single-row methods route to ONE
15471
+ * provider by the `addonId` in the call input (the notification-output
15472
+ * posture, notification-output.cap.ts:215-250). Provided by `addon-ai`
15473
+ * (hub-placed); the cap stays open for future providers.
15474
+ *
15475
+ * Profiles are ROWS (data), not addons: one row = one usable model endpoint.
15476
+ * `apiKey` is a password field — providers REDACT it on read and merge on
15477
+ * write; a stored key NEVER round-trips to a client.
15478
+ */
15479
+ var LlmProfileKindSchema = _enum([
15480
+ "openai-compatible",
15481
+ "openai",
15482
+ "anthropic",
15483
+ "google",
15484
+ "managed-local"
15485
+ ]);
15486
+ var LlmProfileSchema = object({
15487
+ id: string(),
15488
+ name: string(),
15489
+ kind: LlmProfileKindSchema,
15490
+ /** Stamped by the provider — keeps the fanned catalog routable. */
15491
+ addonId: string(),
15492
+ enabled: boolean(),
15493
+ /** Vendor model id, or the managed runtime's loaded model. */
15494
+ model: string(),
15495
+ /** Required for openai-compatible; override for cloud kinds. */
15496
+ baseUrl: string().optional(),
15497
+ /** ConfigUISchema type:'password' — never round-trips (spec §5). */
15498
+ apiKey: string().optional(),
15499
+ supportsVision: boolean(),
15500
+ temperature: number().min(0).max(2).optional(),
15501
+ maxTokens: number().int().positive().optional(),
15502
+ timeoutMs: number().int().positive().default(6e4),
15503
+ extraHeaders: record(string(), string()).optional(),
15504
+ /** kind === 'managed-local' only (spec §4). */
15505
+ runtime: ManagedRuntimeConfigSchema.optional()
15506
+ });
15507
+ /** ConfigUISchema tree passed through untyped on the wire (the
15508
+ * notification-output `ConfigSchemaPassthrough` precedent at
15509
+ * notification-output.cap.ts:151); the exported TS type re-tightens it. */
15510
+ var ConfigSchemaPassthrough = unknown();
15511
+ var LlmProfileKindDescriptorSchema = object({
15512
+ kind: LlmProfileKindSchema,
15513
+ label: string(),
15514
+ icon: string(),
15515
+ /** Stamped by each provider so the concat-fanned catalog stays routable. */
15516
+ addonId: string(),
15517
+ configSchema: ConfigSchemaPassthrough
15518
+ });
15519
+ var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
15520
+ var LlmDefaultSchema = object({
15521
+ selector: LlmDefaultSelectorSchema,
15522
+ profileId: string()
15523
+ });
15524
+ /** Server-side rollup row — getUsage never dumps raw call rows (spec §6). */
15525
+ var LlmUsageRollupSchema = object({
15526
+ day: string(),
15527
+ consumer: string(),
15528
+ profileId: string(),
15529
+ calls: number(),
15530
+ okCalls: number(),
15531
+ errorCalls: number(),
15532
+ inputTokens: number(),
15533
+ outputTokens: number(),
15534
+ avgLatencyMs: number()
15535
+ });
15536
+ /** LLM-facing view over the reused ModelCatalogEntry mechanism (spec §4.2). */
15537
+ var ManagedModelCatalogEntrySchema = object({
15538
+ id: string(),
15539
+ label: string(),
15540
+ family: string(),
15541
+ purpose: _enum(["text", "vision"]),
15542
+ url: string(),
15543
+ sha256: string(),
15544
+ sizeBytes: number(),
15545
+ quantization: string(),
15546
+ /** Load-time guidance shown in the picker. */
15547
+ minRamBytes: number(),
15548
+ contextSizeDefault: number().int(),
15549
+ /** Vision models: companion projector file. */
15550
+ mmprojUrl: string().optional()
15551
+ });
15552
+ var LlmRuntimeNodeSchema = object({
15553
+ nodeId: string(),
15554
+ reachable: boolean(),
15555
+ status: LlmRuntimeStatusSchema.optional(),
15556
+ disk: LlmRuntimeDiskUsageSchema.optional(),
15557
+ error: string().optional()
15558
+ });
15559
+ var GenerateVisionInputSchema = LlmGenerateBaseInputSchema.extend({ images: array(LlmImageSchema).min(1) });
15560
+ var ProfileRefInputSchema = object({
15561
+ addonId: string(),
15562
+ profileId: string()
15563
+ });
15564
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
15565
+ kind: "mutation",
15566
+ auth: "admin"
15567
+ }), method(ProfileRefInputSchema, _void(), {
15568
+ kind: "mutation",
15569
+ auth: "admin"
15570
+ }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
15571
+ kind: "mutation",
15572
+ auth: "admin"
15573
+ }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
15574
+ selector: LlmDefaultSelectorSchema,
15575
+ profileId: string().nullable()
15576
+ }), _void(), {
15577
+ kind: "mutation",
15578
+ auth: "admin"
15579
+ }), method(object({
15580
+ since: number().optional(),
15581
+ until: number().optional(),
15582
+ consumer: string().optional(),
15583
+ profileId: string().optional()
15584
+ }), array(LlmUsageRollupSchema)), method(object({}), array(ManagedModelCatalogEntrySchema)), method(object({}), array(LlmRuntimeNodeSchema)), method(object({ nodeId: string() }), array(LlmNodeModelSchema)), method(object({
15585
+ nodeId: string(),
15586
+ model: ManagedModelRefSchema
15587
+ }), _void(), {
15588
+ kind: "mutation",
15589
+ auth: "admin"
15590
+ }), method(object({
15591
+ nodeId: string(),
15592
+ file: string()
15593
+ }), _void(), {
15594
+ kind: "mutation",
15595
+ auth: "admin"
15596
+ }), method(ProfileRefInputSchema, LlmRuntimeStatusSchema), method(ProfileRefInputSchema, LlmRuntimeStatusSchema, {
15597
+ kind: "mutation",
15598
+ auth: "admin"
15599
+ }), method(ProfileRefInputSchema, _void(), {
15600
+ kind: "mutation",
15601
+ auth: "admin"
15602
+ });
15603
+ /**
15029
15604
  * Zod schemas for persisted record types.
15030
15605
  *
15031
15606
  * These schemas serve as the single source of truth for types that are
@@ -15215,6 +15790,61 @@ var EventKindSchema = _enum([
15215
15790
  "object",
15216
15791
  "audio"
15217
15792
  ]);
15793
+ /**
15794
+ * Spatial filter for `listTracks` — the rect + polygon variants of the shared
15795
+ * MaskShape vocabulary (see `mask-shape.ts`). Coordinates are NORMALIZED 0..1
15796
+ * of the camera frame (top-left origin), matching the drawing-plane editor.
15797
+ */
15798
+ var TrackZoneFilterSchema = discriminatedUnion("kind", [MaskRectShapeSchema, MaskPolygonShapeSchema]);
15799
+ /** Closed icon vocabulary so clients render a known glyph per kind. */
15800
+ var EventKindIconSchema = _enum([
15801
+ "motion",
15802
+ "audio",
15803
+ "person",
15804
+ "vehicle",
15805
+ "animal",
15806
+ "door",
15807
+ "pir",
15808
+ "smoke",
15809
+ "water",
15810
+ "button",
15811
+ "generic"
15812
+ ]);
15813
+ var EventKindCategorySchema = _enum([
15814
+ "motion",
15815
+ "audio",
15816
+ "detection",
15817
+ "sensor",
15818
+ "custom"
15819
+ ]);
15820
+ var EventKindDescriptorSchema = object({
15821
+ /** Stable kind id (e.g. 'motion', 'person', 'contact'). */
15822
+ kind: string(),
15823
+ label: string(),
15824
+ /** Hex color for timeline/legend rendering. */
15825
+ color: string(),
15826
+ icon: EventKindIconSchema,
15827
+ category: EventKindCategorySchema,
15828
+ /** Which cap + device contributes this kind. For built-ins the camera
15829
+ * itself; for sensor kinds the LINKED source device. */
15830
+ source: object({
15831
+ capName: string(),
15832
+ deviceId: number()
15833
+ })
15834
+ });
15835
+ var SensorEventSchema = object({
15836
+ id: string(),
15837
+ /** The CAMERA the event is attributed to (a sensor linked to N cameras
15838
+ * yields N rows, one per camera). */
15839
+ deviceId: number(),
15840
+ /** The linked sensor device whose state changed. */
15841
+ sourceDeviceId: number(),
15842
+ /** Event kind id — matches an `EventKindDescriptor.kind`. */
15843
+ kind: string(),
15844
+ /** Snapshot of the sensor cap's runtime-state slice at the change. */
15845
+ value: record(string(), unknown()).nullable(),
15846
+ timestamp: number()
15847
+ });
15218
15848
  var TrackPositionSchema = object({
15219
15849
  x: number(),
15220
15850
  y: number(),
@@ -15227,6 +15857,46 @@ var TrackSnapshotSchema = object({
15227
15857
  /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
15228
15858
  mediaKey: string()
15229
15859
  });
15860
+ /**
15861
+ * Normalized 0..1 trajectory envelope (min/max over every position bbox,
15862
+ * divided by the track's detection-frame dims), computed at persist time.
15863
+ * Absent when the frame dims were unknown when the track was persisted
15864
+ * (legacy rows / dims-less sources) and on active (in-RAM) tracks.
15865
+ */
15866
+ var TrackEnvelopeSchema = object({
15867
+ minX: number(),
15868
+ minY: number(),
15869
+ maxX: number(),
15870
+ maxY: number()
15871
+ });
15872
+ /**
15873
+ * Row projection for track list queries. `full` (default) returns the
15874
+ * complete Track including the frame-rate `positions[]` history and the
15875
+ * `snapshots[]` references — megabytes across a page of tracks. `slim`
15876
+ * keeps every scalar the list surfaces actually render (ids, class(es),
15877
+ * label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
15878
+ * zonesVisited, bestEventId, envelope) and returns `positions` /
15879
+ * `snapshots` as EMPTY arrays — detail views re-fetch the full row via
15880
+ * `getTrack`. Mirrors the event-store `projection` convention
15881
+ * (`getObjectEvents` et al.).
15882
+ */
15883
+ var TrackProjectionSchema = _enum(["full", "slim"]);
15884
+ /**
15885
+ * One audio-classification label heard on the track's camera while the
15886
+ * track was alive, aggregated per label. An "episode" is one persisted
15887
+ * audio event (the confident-classification path: score ≥ the device's
15888
+ * `classificationMinScore`, class-change-or-heartbeat coalesced) — NOT
15889
+ * one 32 ms inference chunk, so counts stay human-scaled.
15890
+ */
15891
+ var TrackAudioLabelSchema = object({
15892
+ label: string(),
15893
+ /** Highest classification score observed across the label's episodes. */
15894
+ peakScore: number(),
15895
+ /** Number of coalesced audio-event episodes carrying this label. */
15896
+ count: number(),
15897
+ firstAt: number(),
15898
+ lastAt: number()
15899
+ });
15230
15900
  var TrackSchema = object({
15231
15901
  trackId: string(),
15232
15902
  deviceId: number(),
@@ -15241,6 +15911,10 @@ var TrackSchema = object({
15241
15911
  snapshots: array(TrackSnapshotSchema).readonly(),
15242
15912
  /** Deduplicated zones the track has entered at least once. */
15243
15913
  zonesVisited: array(string()).readonly(),
15914
+ /** Deduplicated set of detector classes observed for this track over its
15915
+ * life (a track may be reclassified, e.g. person→vehicle). Absent on
15916
+ * legacy rows written before class accumulation shipped. */
15917
+ classes: array(string()).readonly().optional(),
15244
15918
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
15245
15919
  totalDistance: number(),
15246
15920
  state: TrackStateSchema,
@@ -15254,7 +15928,15 @@ var TrackSchema = object({
15254
15928
  bestEventId: string().optional(),
15255
15929
  /** Tag of the importance sub-signal that dominated the score
15256
15930
  * (identity|dwell|proximity|class|confidence|travel|zone). */
15257
- importanceReason: string().optional()
15931
+ importanceReason: string().optional(),
15932
+ /** Audio-classification labels heard on the camera during the track's
15933
+ * life (score ≥ device `classificationMinScore`), aggregated per label.
15934
+ * Absent on legacy rows / tracks with no confident audio. */
15935
+ audioLabels: array(TrackAudioLabelSchema).readonly().optional(),
15936
+ /** Normalized 0..1 trajectory envelope (see {@link TrackEnvelopeSchema}).
15937
+ * Populated from the persisted envelope columns on historical reads;
15938
+ * absent on legacy rows, dims-less tracks and active (in-RAM) tracks. */
15939
+ envelope: TrackEnvelopeSchema.optional()
15258
15940
  });
15259
15941
  var BaseEventFields = {
15260
15942
  id: string(),
@@ -15364,11 +16046,13 @@ var MediaFileSchema = object({
15364
16046
  sizeBytes: number(),
15365
16047
  timestamp: number()
15366
16048
  });
16049
+ var DEFAULT_EVENT_QUERY_LIMIT = 1e3;
16050
+ var MAX_EVENT_QUERY_LIMIT = 5e3;
15367
16051
  var DeviceEventQueryInput = object({
15368
16052
  deviceId: number(),
15369
16053
  since: number().optional(),
15370
16054
  until: number().optional(),
15371
- limit: number().int().min(1).max(5e3).default(1e3),
16055
+ limit: number().int().min(1).max(MAX_EVENT_QUERY_LIMIT).default(DEFAULT_EVENT_QUERY_LIMIT),
15372
16056
  /** `slim` drops heavy JSON fields (regions/bbox/zones) and carries an
15373
16057
  * optional `mediaUrl` (populated by B5). `full` (default) keeps today's
15374
16058
  * exact behaviour. Callers may omit this field — the store defaults to
@@ -15376,6 +16060,27 @@ var DeviceEventQueryInput = object({
15376
16060
  projection: _enum(["full", "slim"]).optional()
15377
16061
  });
15378
16062
  var ObjectEventQueryInput = DeviceEventQueryInput.extend({ classFilter: string().optional() });
16063
+ var RecentTracksQueryInput = object({
16064
+ /** Devices to merge. An empty array yields `{ tracks: [], nextCursor: null }`. */
16065
+ deviceIds: array(number()),
16066
+ /** Window lower bound on `lastSeen` (inclusive). */
16067
+ since: number().optional(),
16068
+ /** Window upper bound on `lastSeen` (inclusive). */
16069
+ until: number().optional(),
16070
+ /** Page size. Default 200, max 1000. */
16071
+ limit: number().int().min(1).max(1e3).default(200),
16072
+ /** Opaque continuation cursor from a previous page's `nextCursor`.
16073
+ * Encodes the (lastSeen, trackId) sort position — treat as opaque. */
16074
+ cursor: string().optional(),
16075
+ /** See {@link TrackProjectionSchema}. Default `full`. */
16076
+ projection: TrackProjectionSchema.optional()
16077
+ });
16078
+ var RecentTracksPageSchema = object({
16079
+ /** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
16080
+ tracks: array(TrackSchema).readonly(),
16081
+ /** Cursor for the next page, or null when this page is the last. */
16082
+ nextCursor: string().nullable()
16083
+ });
15379
16084
  var KeyEventQueryInput = object({
15380
16085
  deviceId: number(),
15381
16086
  /** Window lower bound (track firstSeen ≥ since). */
@@ -15402,7 +16107,7 @@ var KeyEventSchema = object({
15402
16107
  /** Track lifetime in ms (lastSeen - firstSeen). */
15403
16108
  windowMs: number().optional()
15404
16109
  });
15405
- var TrackedDetectionSchema = object({
16110
+ object({
15406
16111
  trackId: string(),
15407
16112
  className: string(),
15408
16113
  confidence: number(),
@@ -15410,8 +16115,25 @@ var TrackedDetectionSchema = object({
15410
16115
  zones: array(string()).readonly(),
15411
16116
  state: TrackStateSchema
15412
16117
  });
15413
- var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: number() });
15414
- var SearchObjectEventsInput = object({
16118
+ var OverlayDetectionSchema = looseObject({
16119
+ id: string(),
16120
+ kind: _enum(["first-level", "detail"]),
16121
+ macroClass: string(),
16122
+ score: number(),
16123
+ bbox: object({
16124
+ x: number(),
16125
+ y: number(),
16126
+ width: number(),
16127
+ height: number()
16128
+ }),
16129
+ labels: array(looseObject({
16130
+ label: string(),
16131
+ score: number()
16132
+ })).readonly(),
16133
+ parentId: string().optional()
16134
+ });
16135
+ var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: number() });
16136
+ var SearchObjectEventsInput = object({
15415
16137
  text: string(),
15416
16138
  deviceId: number().optional(),
15417
16139
  since: number().optional(),
@@ -15420,6 +16142,20 @@ var SearchObjectEventsInput = object({
15420
16142
  limit: number().default(50),
15421
16143
  minScore: number().min(0).max(1).default(.2)
15422
16144
  });
16145
+ var TrackCascadeCountsSchema = object({
16146
+ /** Persisted track roots deleted (authoritative). */
16147
+ tracks: number().int(),
16148
+ /** Object events removed with their tracks (best-effort; see note above). */
16149
+ events: number().int(),
16150
+ /** Track/face/plate-owned media removed (best-effort). Never identity media. */
16151
+ media: number().int(),
16152
+ /** Unassigned (non-enrolled) face reads removed (best-effort). */
16153
+ faces: number().int(),
16154
+ /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
16155
+ plates: number().int(),
16156
+ /** Per-track CLIP search vectors removed (best-effort). */
16157
+ embeddings: number().int()
16158
+ });
15423
16159
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
15424
16160
  deviceId: number(),
15425
16161
  trackId: string()
@@ -15427,11 +16163,25 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
15427
16163
  deviceId: number(),
15428
16164
  since: number().optional(),
15429
16165
  until: number().optional(),
15430
- limit: number().optional()
15431
- }), array(TrackSchema).readonly()), method(object({ deviceId: number() }), _void(), {
15432
- kind: "mutation",
15433
- auth: "admin"
15434
- }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(object({
16166
+ limit: number().optional(),
16167
+ /** Spatial filter only tracks whose trajectory intersects the zone
16168
+ * (normalized 0..1 rect or polygon). SQL-prefiltered on the persisted
16169
+ * envelope columns, then precisely tested per position. Tracks with
16170
+ * an unknown envelope (no frame dims at persist time) always match. */
16171
+ zone: TrackZoneFilterSchema.optional(),
16172
+ /** See {@link TrackProjectionSchema}. Default `full` (backward
16173
+ * compatible — omitting the field keeps today's exact behaviour). */
16174
+ projection: TrackProjectionSchema.optional()
16175
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
16176
+ kind: "mutation",
16177
+ auth: "admin"
16178
+ }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({ deviceId: number() }), array(EventKindDescriptorSchema).readonly()), method(object({
16179
+ deviceId: number(),
16180
+ since: number().optional(),
16181
+ until: number().optional(),
16182
+ kinds: array(string()).optional(),
16183
+ limit: number().int().min(1).max(MAX_EVENT_QUERY_LIMIT).default(DEFAULT_EVENT_QUERY_LIMIT)
16184
+ }), array(SensorEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(object({
15435
16185
  deviceId: number(),
15436
16186
  since: number(),
15437
16187
  until: number(),
@@ -15451,6 +16201,24 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
15451
16201
  }), {
15452
16202
  kind: "mutation",
15453
16203
  auth: "admin"
16204
+ }), method(object({
16205
+ deviceId: number(),
16206
+ cutoffMs: number()
16207
+ }), TrackCascadeCountsSchema, {
16208
+ kind: "mutation",
16209
+ auth: "admin"
16210
+ }), method(object({ deviceId: number() }), TrackCascadeCountsSchema, {
16211
+ kind: "mutation",
16212
+ auth: "admin"
16213
+ }), method(object({
16214
+ deviceId: number(),
16215
+ trackIds: array(string()).min(1)
16216
+ }), object({
16217
+ deleted: number().int(),
16218
+ failed: array(string()).readonly()
16219
+ }), {
16220
+ kind: "mutation",
16221
+ auth: "admin"
15454
16222
  }), method(object({
15455
16223
  eventId: string(),
15456
16224
  kind: MediaFileKindEnum.optional()
@@ -15459,7 +16227,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
15459
16227
  timestamp: number(),
15460
16228
  frameWidth: number(),
15461
16229
  frameHeight: number(),
15462
- detections: array(TrackedDetectionSchema).readonly()
16230
+ detections: array(OverlayDetectionSchema).readonly()
15463
16231
  }), object({
15464
16232
  deviceId: number(),
15465
16233
  trackId: string(),
@@ -16775,7 +17543,15 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
16775
17543
  */
16776
17544
  disableIpv6: boolean().optional(),
16777
17545
  /** Subscriber attribution. See `createSession` for the contract. */
16778
- consumerAttribution: BrokerConsumerAttributionSchema.optional()
17546
+ consumerAttribution: BrokerConsumerAttributionSchema.optional(),
17547
+ /**
17548
+ * Client-side stream hints (viewport, downlink) — same contract as
17549
+ * `createSession.hints`. Client-offer viewers (the RN viewer's
17550
+ * `WebrtcLiveSession`) negotiate via `handleOffer`, so without this
17551
+ * field their hints were silently stripped by the schema and the
17552
+ * adaptive ladder started blind on the client's display size.
17553
+ */
17554
+ hints: webrtcClientHintsSchema.optional()
16779
17555
  }), object({
16780
17556
  sessionId: string(),
16781
17557
  sdpAnswer: string()
@@ -18228,6 +19004,24 @@ DeviceType.Camera, method(object({
18228
19004
  deviceId: number(),
18229
19005
  status: OsdStatusSchema
18230
19006
  });
19007
+ var VehicleSchema = object({
19008
+ id: string(),
19009
+ name: string(),
19010
+ sampleCount: number().int().nonnegative(),
19011
+ coverMediaKey: string().optional(),
19012
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
19013
+ coverBase64: string().optional()
19014
+ });
19015
+ var VehicleSampleInfoSchema = object({
19016
+ id: string(),
19017
+ /** The plate text this sample enrolled (self-labeling — no embedding). */
19018
+ text: string(),
19019
+ /** OCR confidence of the enrolled read (0..1). */
19020
+ score: number(),
19021
+ addedAt: number().int(),
19022
+ deviceId: number().int().optional(),
19023
+ base64: string().optional()
19024
+ });
18231
19025
  var PlateInfoSchema = object({
18232
19026
  plateId: string(),
18233
19027
  deviceId: number().int(),
@@ -18239,6 +19033,16 @@ var PlateInfoSchema = object({
18239
19033
  score: number(),
18240
19034
  /** True when the text was manually corrected (exempt from retention). */
18241
19035
  corrected: boolean(),
19036
+ /** Recognized vehicle id when a matcher lookup named this read (SQL NULL → absent). */
19037
+ recognizedVehicleId: string().optional(),
19038
+ /** Resolved vehicle name for `recognizedVehicleId` (UI convenience). */
19039
+ vehicleName: string().optional(),
19040
+ /** True once the read was assigned to a vehicle (enrolled as a sample). */
19041
+ assigned: boolean(),
19042
+ /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
19043
+ plateBbox: BoundingBoxSchema.optional(),
19044
+ /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
19045
+ keyFrameMediaKey: string().optional(),
18242
19046
  base64: string().optional()
18243
19047
  });
18244
19048
  var MediaFileLiteSchema = object({
@@ -18278,6 +19082,48 @@ method(object({
18278
19082
  }), method(object({ plateId: string() }), _void(), {
18279
19083
  kind: "mutation",
18280
19084
  auth: "admin"
19085
+ }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
19086
+ kind: "mutation",
19087
+ auth: "admin"
19088
+ }), method(object({
19089
+ id: string(),
19090
+ name: string().min(1)
19091
+ }), _void(), {
19092
+ kind: "mutation",
19093
+ auth: "admin"
19094
+ }), method(object({ id: string() }), _void(), {
19095
+ kind: "mutation",
19096
+ auth: "admin"
19097
+ }), method(object({ vehicleId: string() }), array(VehicleSampleInfoSchema).readonly()), method(object({
19098
+ vehicleId: string(),
19099
+ sampleId: string()
19100
+ }), _void(), {
19101
+ kind: "mutation",
19102
+ auth: "admin"
19103
+ }), method(object({
19104
+ plateId: string(),
19105
+ vehicleId: string()
19106
+ }), _void(), {
19107
+ kind: "mutation",
19108
+ auth: "admin"
19109
+ }), method(object({ plateId: string() }), _void(), {
19110
+ kind: "mutation",
19111
+ auth: "admin"
19112
+ }), method(object({
19113
+ plateIds: array(string()).min(1),
19114
+ vehicleId: string()
19115
+ }), object({
19116
+ assigned: number().int(),
19117
+ failed: array(string()).readonly()
19118
+ }), {
19119
+ kind: "mutation",
19120
+ auth: "admin"
19121
+ }), method(object({ plateIds: array(string()).min(1) }), object({
19122
+ unassigned: number().int(),
19123
+ failed: array(string()).readonly()
19124
+ }), {
19125
+ kind: "mutation",
19126
+ auth: "admin"
18281
19127
  });
18282
19128
  var ModelFormatSchema = _enum(MODEL_FORMATS);
18283
19129
  var HwAccelBackendInputSchema = _enum([
@@ -18356,6 +19202,10 @@ var GpuInfoSchema = object({
18356
19202
  memoryMB: number().optional()
18357
19203
  });
18358
19204
  var NpuInfoSchema = object({ type: _enum(["apple-ane", "intel-npu"]) });
19205
+ var CoralInfoSchema = object({
19206
+ type: literal("coral-edgetpu"),
19207
+ bus: string().optional()
19208
+ });
18359
19209
  var HardwareInfoSchema = object({
18360
19210
  platform: HardwarePlatformSchema,
18361
19211
  arch: HardwareArchSchema,
@@ -18364,7 +19214,8 @@ var HardwareInfoSchema = object({
18364
19214
  totalRAM_MB: number(),
18365
19215
  availableRAM_MB: number(),
18366
19216
  gpu: GpuInfoSchema.nullable(),
18367
- npu: NpuInfoSchema.nullable()
19217
+ npu: NpuInfoSchema.nullable(),
19218
+ coral: CoralInfoSchema.nullable().optional()
18368
19219
  });
18369
19220
  var PlatformScoreSchema = object({
18370
19221
  runtime: _enum(["node", "python"]),
@@ -18531,7 +19382,12 @@ var RecordingStorageUsageSchema = object({
18531
19382
  /**
18532
19383
  * Result of locating footage at a wall-clock instant for one device/profile.
18533
19384
  * `segment` carries the covering segment's window; `gap` reports the forward
18534
- * nearest covered edge (`null` past the end of footage / when none exists).
19385
+ * nearest covered edge (`null` past the end of footage / when none exists)
19386
+ * and the backward covered edge `prevEndMs` (exclusive end of the nearest
19387
+ * footage behind the epoch; `null` when none — optional so older providers
19388
+ * that omit it stay valid). `prevEndMs` lets a backward frame-step hop the
19389
+ * small inter-segment cracks (durMs under-covers the span to the next
19390
+ * startMs by ~11-17 ms) instead of no-opping at a segment head.
18535
19391
  */
18536
19392
  var LocateSegmentResultSchema = discriminatedUnion("kind", [object({
18537
19393
  kind: literal("segment"),
@@ -18540,7 +19396,8 @@ var LocateSegmentResultSchema = discriminatedUnion("kind", [object({
18540
19396
  bytes: number()
18541
19397
  }), object({
18542
19398
  kind: literal("gap"),
18543
- nearestEdgeMs: number().nullable()
19399
+ nearestEdgeMs: number().nullable(),
19400
+ prevEndMs: number().nullable().optional()
18544
19401
  })]);
18545
19402
  /** Raw bytes of one finalized footage segment (read off disk on the recording node). */
18546
19403
  var ReadSegmentBytesResultSchema = object({ data: _instanceof(Uint8Array) });
@@ -20109,6 +20966,12 @@ Object.freeze({
20109
20966
  addonId: null,
20110
20967
  access: "view"
20111
20968
  },
20969
+ "deviceManager.getLinkedDevices": {
20970
+ capName: "device-manager",
20971
+ capScope: "system",
20972
+ addonId: null,
20973
+ access: "view"
20974
+ },
20112
20975
  "deviceManager.getRoleDisplayDefaults": {
20113
20976
  capName: "device-manager",
20114
20977
  capScope: "system",
@@ -20823,6 +21686,168 @@ Object.freeze({
20823
21686
  addonId: null,
20824
21687
  access: "create"
20825
21688
  },
21689
+ "llm.deleteModel": {
21690
+ capName: "llm",
21691
+ capScope: "system",
21692
+ addonId: null,
21693
+ access: "delete"
21694
+ },
21695
+ "llm.deleteProfile": {
21696
+ capName: "llm",
21697
+ capScope: "system",
21698
+ addonId: null,
21699
+ access: "delete"
21700
+ },
21701
+ "llm.generate": {
21702
+ capName: "llm",
21703
+ capScope: "system",
21704
+ addonId: null,
21705
+ access: "create"
21706
+ },
21707
+ "llm.generateVision": {
21708
+ capName: "llm",
21709
+ capScope: "system",
21710
+ addonId: null,
21711
+ access: "create"
21712
+ },
21713
+ "llm.getDefaults": {
21714
+ capName: "llm",
21715
+ capScope: "system",
21716
+ addonId: null,
21717
+ access: "view"
21718
+ },
21719
+ "llm.getRuntimeStatus": {
21720
+ capName: "llm",
21721
+ capScope: "system",
21722
+ addonId: null,
21723
+ access: "view"
21724
+ },
21725
+ "llm.getUsage": {
21726
+ capName: "llm",
21727
+ capScope: "system",
21728
+ addonId: null,
21729
+ access: "view"
21730
+ },
21731
+ "llm.installModel": {
21732
+ capName: "llm",
21733
+ capScope: "system",
21734
+ addonId: null,
21735
+ access: "create"
21736
+ },
21737
+ "llm.listModelCatalog": {
21738
+ capName: "llm",
21739
+ capScope: "system",
21740
+ addonId: null,
21741
+ access: "view"
21742
+ },
21743
+ "llm.listModels": {
21744
+ capName: "llm",
21745
+ capScope: "system",
21746
+ addonId: null,
21747
+ access: "view"
21748
+ },
21749
+ "llm.listNodeModels": {
21750
+ capName: "llm",
21751
+ capScope: "system",
21752
+ addonId: null,
21753
+ access: "view"
21754
+ },
21755
+ "llm.listProfileKinds": {
21756
+ capName: "llm",
21757
+ capScope: "system",
21758
+ addonId: null,
21759
+ access: "view"
21760
+ },
21761
+ "llm.listProfiles": {
21762
+ capName: "llm",
21763
+ capScope: "system",
21764
+ addonId: null,
21765
+ access: "view"
21766
+ },
21767
+ "llm.listRuntimeNodes": {
21768
+ capName: "llm",
21769
+ capScope: "system",
21770
+ addonId: null,
21771
+ access: "view"
21772
+ },
21773
+ "llm.setDefault": {
21774
+ capName: "llm",
21775
+ capScope: "system",
21776
+ addonId: null,
21777
+ access: "create"
21778
+ },
21779
+ "llm.startRuntime": {
21780
+ capName: "llm",
21781
+ capScope: "system",
21782
+ addonId: null,
21783
+ access: "create"
21784
+ },
21785
+ "llm.stopRuntime": {
21786
+ capName: "llm",
21787
+ capScope: "system",
21788
+ addonId: null,
21789
+ access: "create"
21790
+ },
21791
+ "llm.testProfile": {
21792
+ capName: "llm",
21793
+ capScope: "system",
21794
+ addonId: null,
21795
+ access: "create"
21796
+ },
21797
+ "llm.upsertProfile": {
21798
+ capName: "llm",
21799
+ capScope: "system",
21800
+ addonId: null,
21801
+ access: "create"
21802
+ },
21803
+ "llmRuntime.complete": {
21804
+ capName: "llm-runtime",
21805
+ capScope: "system",
21806
+ addonId: null,
21807
+ access: "create"
21808
+ },
21809
+ "llmRuntime.deleteModel": {
21810
+ capName: "llm-runtime",
21811
+ capScope: "system",
21812
+ addonId: null,
21813
+ access: "delete"
21814
+ },
21815
+ "llmRuntime.ensureStarted": {
21816
+ capName: "llm-runtime",
21817
+ capScope: "system",
21818
+ addonId: null,
21819
+ access: "create"
21820
+ },
21821
+ "llmRuntime.getDiskUsage": {
21822
+ capName: "llm-runtime",
21823
+ capScope: "system",
21824
+ addonId: null,
21825
+ access: "view"
21826
+ },
21827
+ "llmRuntime.installModel": {
21828
+ capName: "llm-runtime",
21829
+ capScope: "system",
21830
+ addonId: null,
21831
+ access: "create"
21832
+ },
21833
+ "llmRuntime.listLocalModels": {
21834
+ capName: "llm-runtime",
21835
+ capScope: "system",
21836
+ addonId: null,
21837
+ access: "view"
21838
+ },
21839
+ "llmRuntime.status": {
21840
+ capName: "llm-runtime",
21841
+ capScope: "system",
21842
+ addonId: null,
21843
+ access: "view"
21844
+ },
21845
+ "llmRuntime.stop": {
21846
+ capName: "llm-runtime",
21847
+ capScope: "system",
21848
+ addonId: null,
21849
+ access: "create"
21850
+ },
20826
21851
  "localNetwork.getAllowedAddresses": {
20827
21852
  capName: "local-network",
20828
21853
  capScope: "system",
@@ -21453,6 +22478,12 @@ Object.freeze({
21453
22478
  addonId: null,
21454
22479
  access: "delete"
21455
22480
  },
22481
+ "pipelineAnalytics.deleteTracks": {
22482
+ capName: "pipeline-analytics",
22483
+ capScope: "device",
22484
+ addonId: null,
22485
+ access: "delete"
22486
+ },
21456
22487
  "pipelineAnalytics.getActiveTracks": {
21457
22488
  capName: "pipeline-analytics",
21458
22489
  capScope: "device",
@@ -21495,6 +22526,12 @@ Object.freeze({
21495
22526
  addonId: null,
21496
22527
  access: "view"
21497
22528
  },
22529
+ "pipelineAnalytics.getSensorEvents": {
22530
+ capName: "pipeline-analytics",
22531
+ capScope: "device",
22532
+ addonId: null,
22533
+ access: "view"
22534
+ },
21498
22535
  "pipelineAnalytics.getTrack": {
21499
22536
  capName: "pipeline-analytics",
21500
22537
  capScope: "device",
@@ -21507,6 +22544,18 @@ Object.freeze({
21507
22544
  addonId: null,
21508
22545
  access: "view"
21509
22546
  },
22547
+ "pipelineAnalytics.listEventKinds": {
22548
+ capName: "pipeline-analytics",
22549
+ capScope: "device",
22550
+ addonId: null,
22551
+ access: "view"
22552
+ },
22553
+ "pipelineAnalytics.listRecentTracks": {
22554
+ capName: "pipeline-analytics",
22555
+ capScope: "device",
22556
+ addonId: null,
22557
+ access: "view"
22558
+ },
21510
22559
  "pipelineAnalytics.listTracks": {
21511
22560
  capName: "pipeline-analytics",
21512
22561
  capScope: "device",
@@ -21519,12 +22568,24 @@ Object.freeze({
21519
22568
  addonId: null,
21520
22569
  access: "create"
21521
22570
  },
22571
+ "pipelineAnalytics.pruneTracksBefore": {
22572
+ capName: "pipeline-analytics",
22573
+ capScope: "device",
22574
+ addonId: null,
22575
+ access: "create"
22576
+ },
21522
22577
  "pipelineAnalytics.searchObjectEvents": {
21523
22578
  capName: "pipeline-analytics",
21524
22579
  capScope: "device",
21525
22580
  addonId: null,
21526
22581
  access: "view"
21527
22582
  },
22583
+ "pipelineAnalytics.wipeAllAnalytics": {
22584
+ capName: "pipeline-analytics",
22585
+ capScope: "device",
22586
+ addonId: null,
22587
+ access: "delete"
22588
+ },
21528
22589
  "pipelineExecutor.cacheFrameInPool": {
21529
22590
  capName: "pipeline-executor",
21530
22591
  capScope: "system",
@@ -22029,18 +23090,42 @@ Object.freeze({
22029
23090
  addonId: null,
22030
23091
  access: "create"
22031
23092
  },
23093
+ "plateGallery.assignPlate": {
23094
+ capName: "plate-gallery",
23095
+ capScope: "system",
23096
+ addonId: null,
23097
+ access: "create"
23098
+ },
23099
+ "plateGallery.assignPlates": {
23100
+ capName: "plate-gallery",
23101
+ capScope: "system",
23102
+ addonId: null,
23103
+ access: "create"
23104
+ },
22032
23105
  "plateGallery.correctPlateText": {
22033
23106
  capName: "plate-gallery",
22034
23107
  capScope: "system",
22035
23108
  addonId: null,
22036
23109
  access: "create"
22037
23110
  },
23111
+ "plateGallery.createVehicle": {
23112
+ capName: "plate-gallery",
23113
+ capScope: "system",
23114
+ addonId: null,
23115
+ access: "create"
23116
+ },
22038
23117
  "plateGallery.deletePlate": {
22039
23118
  capName: "plate-gallery",
22040
23119
  capScope: "system",
22041
23120
  addonId: null,
22042
23121
  access: "delete"
22043
23122
  },
23123
+ "plateGallery.deleteVehicle": {
23124
+ capName: "plate-gallery",
23125
+ capScope: "system",
23126
+ addonId: null,
23127
+ access: "delete"
23128
+ },
22044
23129
  "plateGallery.getPlateByTrack": {
22045
23130
  capName: "plate-gallery",
22046
23131
  capScope: "system",
@@ -22059,6 +23144,30 @@ Object.freeze({
22059
23144
  addonId: null,
22060
23145
  access: "view"
22061
23146
  },
23147
+ "plateGallery.listVehicles": {
23148
+ capName: "plate-gallery",
23149
+ capScope: "system",
23150
+ addonId: null,
23151
+ access: "view"
23152
+ },
23153
+ "plateGallery.listVehicleSamples": {
23154
+ capName: "plate-gallery",
23155
+ capScope: "system",
23156
+ addonId: null,
23157
+ access: "view"
23158
+ },
23159
+ "plateGallery.removeVehicleSample": {
23160
+ capName: "plate-gallery",
23161
+ capScope: "system",
23162
+ addonId: null,
23163
+ access: "delete"
23164
+ },
23165
+ "plateGallery.renameVehicle": {
23166
+ capName: "plate-gallery",
23167
+ capScope: "system",
23168
+ addonId: null,
23169
+ access: "create"
23170
+ },
22062
23171
  "plateGallery.searchPlates": {
22063
23172
  capName: "plate-gallery",
22064
23173
  capScope: "system",
@@ -22071,6 +23180,18 @@ Object.freeze({
22071
23180
  addonId: null,
22072
23181
  access: "view"
22073
23182
  },
23183
+ "plateGallery.unassignPlate": {
23184
+ capName: "plate-gallery",
23185
+ capScope: "system",
23186
+ addonId: null,
23187
+ access: "create"
23188
+ },
23189
+ "plateGallery.unassignPlates": {
23190
+ capName: "plate-gallery",
23191
+ capScope: "system",
23192
+ addonId: null,
23193
+ access: "create"
23194
+ },
22074
23195
  "platformProbe.getCapabilities": {
22075
23196
  capName: "platform-probe",
22076
23197
  capScope: "system",
@@ -22263,6 +23384,48 @@ Object.freeze({
22263
23384
  addonId: null,
22264
23385
  access: "create"
22265
23386
  },
23387
+ "sceneMonitor.captureReference": {
23388
+ capName: "scene-monitor",
23389
+ capScope: "device",
23390
+ addonId: null,
23391
+ access: "create"
23392
+ },
23393
+ "sceneMonitor.createScene": {
23394
+ capName: "scene-monitor",
23395
+ capScope: "device",
23396
+ addonId: null,
23397
+ access: "create"
23398
+ },
23399
+ "sceneMonitor.deleteReference": {
23400
+ capName: "scene-monitor",
23401
+ capScope: "device",
23402
+ addonId: null,
23403
+ access: "delete"
23404
+ },
23405
+ "sceneMonitor.deleteScene": {
23406
+ capName: "scene-monitor",
23407
+ capScope: "device",
23408
+ addonId: null,
23409
+ access: "delete"
23410
+ },
23411
+ "sceneMonitor.listScenes": {
23412
+ capName: "scene-monitor",
23413
+ capScope: "device",
23414
+ addonId: null,
23415
+ access: "view"
23416
+ },
23417
+ "sceneMonitor.recheckNow": {
23418
+ capName: "scene-monitor",
23419
+ capScope: "device",
23420
+ addonId: null,
23421
+ access: "create"
23422
+ },
23423
+ "sceneMonitor.updateScene": {
23424
+ capName: "scene-monitor",
23425
+ capScope: "device",
23426
+ addonId: null,
23427
+ access: "create"
23428
+ },
22266
23429
  "scriptRunner.run": {
22267
23430
  capName: "script-runner",
22268
23431
  capScope: "device",
@@ -23347,6 +24510,7 @@ Object.freeze({
23347
24510
  Object.freeze({
23348
24511
  "broker": "broker",
23349
24512
  "device-export": "device-export",
24513
+ "llm": "ai",
23350
24514
  "mesh-network": "mesh",
23351
24515
  "mqtt-broker": "broker",
23352
24516
  "network-access": "ingress",
@@ -23379,7 +24543,7 @@ object({
23379
24543
  schemaVersion: literal(1)
23380
24544
  });
23381
24545
  //#endregion
23382
- //#region ../system/dist/model-download-service-C-IHWnXx.mjs
24546
+ //#region ../system/dist/model-download-service-Cp9f4dk6.mjs
23383
24547
  /** Build fetch headers, including HF auth token for huggingface.co URLs */
23384
24548
  function buildHeaders(url) {
23385
24549
  const headers = { "User-Agent": "CamStack/1.0" };