@camstack/addon-model-studio 1.0.22 → 1.0.23

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.
@@ -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/sleep-Baang_XW.mjs
4649
+ //#region ../types/dist/event-category-CFZs3jI4.mjs
4642
4650
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4643
4651
  EventCategory["SystemBoot"] = "system.boot";
4644
4652
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5048,10 +5056,51 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5048
5056
  EventCategory["EnrichmentEmbeddingStored"] = "enrichment.embedding.stored";
5049
5057
  EventCategory["EnrichmentSceneStateChanged"] = "enrichment.scene.state-changed";
5050
5058
  EventCategory["EnrichmentActivitySummary"] = "enrichment.activity.summary";
5059
+ /**
5060
+ * Unified track-lifecycle event: ONE category carrying `phase:
5061
+ * 'start' | 'update' | 'end'` with a rich, typed
5062
+ * `PipelineAnalyticsTrackLifecyclePayload`. Supersedes the thin
5063
+ * `PipelineAnalyticsTrackStarted` / `PipelineAnalyticsTrackEnded`
5064
+ * pair — a consumer subscribes once and branches on `phase`.
5065
+ */
5066
+ EventCategory["PipelineAnalyticsTrackLifecycle"] = "pipeline-analytics.track-lifecycle";
5067
+ /**
5068
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
5069
+ * (`phase:'start'`). Kept as a soft alias — no known subscribers.
5070
+ */
5051
5071
  EventCategory["PipelineAnalyticsTrackStarted"] = "pipeline-analytics.track-started";
5072
+ /**
5073
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
5074
+ * (`phase:'end'`). Kept as a soft alias — no known subscribers.
5075
+ */
5052
5076
  EventCategory["PipelineAnalyticsTrackEnded"] = "pipeline-analytics.track-ended";
5053
5077
  EventCategory["PipelineAnalyticsDetectionEvent"] = "pipeline-analytics.detection-event";
5054
5078
  EventCategory["PipelineAnalyticsFrameTracked"] = "pipeline-analytics.frame-tracked";
5079
+ /**
5080
+ * Fired by `addon-post-analysis` when a parked (stationary) object appears
5081
+ * (a track was promoted to a stationary-registry entry) or departs (the
5082
+ * object moved / was removed). Telemetry (D8): lossy, drives a UI refresh of
5083
+ * the dedicated "Stationary" section — never the live event feed. Payload:
5084
+ * `{ deviceId, entryId, className, phase:'appeared'|'departed', timestamp }`.
5085
+ */
5086
+ EventCategory["PipelineAnalyticsStationaryChanged"] = "pipeline-analytics.stationary-changed";
5087
+ /**
5088
+ * Fired by `addon-post-analysis` whenever a gallery face row changes:
5089
+ * `kind:'buffered'` a new detected face was persisted, `'assigned'` /
5090
+ * `'unassigned'` its identity link changed, `'deleted'` the row was
5091
+ * removed. Telemetry semantics (D8): a lost event only delays a refresh,
5092
+ * never a correctness issue. Payload `PipelineAnalyticsFaceGalleryChangedPayload`.
5093
+ */
5094
+ EventCategory["PipelineAnalyticsFaceGalleryChanged"] = "pipeline-analytics.face-gallery-changed";
5095
+ /**
5096
+ * Fired by `addon-post-analysis` whenever a gallery plate row changes:
5097
+ * `kind:'buffered'` a new read was persisted (`PlateRecognizer.onTrackEnd`),
5098
+ * `'assigned'` / `'unassigned'` its vehicle link changed
5099
+ * (`PlateGalleryProvider`), `'deleted'` the row was removed. Telemetry
5100
+ * semantics (D8): a lost event only delays a refresh, never a correctness
5101
+ * issue. Payload `PipelineAnalyticsPlateGalleryChangedPayload`.
5102
+ */
5103
+ EventCategory["PipelineAnalyticsPlateGalleryChanged"] = "pipeline-analytics.plate-gallery-changed";
5055
5104
  EventCategory["FrigateLiveEvent"] = "frigate.live-event";
5056
5105
  EventCategory["CameraStreamsProfileSlotsChanged"] = "camera-streams.onProfileSlotsChanged";
5057
5106
  /**
@@ -6880,7 +6929,8 @@ var MODEL_FORMATS = [
6880
6929
  "coreml",
6881
6930
  "openvino",
6882
6931
  "tflite",
6883
- "pt"
6932
+ "pt",
6933
+ "gguf"
6884
6934
  ];
6885
6935
  /**
6886
6936
  * Multi-file format payload.
@@ -6924,7 +6974,8 @@ var ModelFormatsSchema = object({
6924
6974
  coreml: ModelFormatEntrySchema.optional(),
6925
6975
  openvino: ModelFormatEntrySchema.optional(),
6926
6976
  tflite: ModelFormatEntrySchema.optional(),
6927
- pt: ModelFormatEntrySchema.optional()
6977
+ pt: ModelFormatEntrySchema.optional(),
6978
+ gguf: ModelFormatEntrySchema.optional()
6928
6979
  });
6929
6980
  /**
6930
6981
  * Variant-selector grouping axes. Shared by the full `ModelCatalogEntry` and by
@@ -6965,6 +7016,15 @@ var ModelCatalogEntrySchema = object({
6965
7016
  width: number(),
6966
7017
  height: number()
6967
7018
  }),
7019
+ /**
7020
+ * Channel count of the model input tensor. Omit ⇒ 3 (RGB), the default for
7021
+ * every detector / classifier / embedder. Set to 1 for a grayscale CTC text
7022
+ * recognizer (EasyOCR VGG plate-OCR: input `[N,1,H,W]`) so the preprocess
7023
+ * feeds a single-channel, EasyOCR-normalized tensor instead of the default
7024
+ * 3-channel RGB one. Threaded through `PoolModelConfig.inputChannels` to the
7025
+ * Python inference pool.
7026
+ */
7027
+ inputChannels: number().int().positive().optional(),
6968
7028
  labels: array(LabelDefinitionSchema).readonly(),
6969
7029
  inputLayout: _enum(["nchw", "nhwc"]).optional(),
6970
7030
  inputNormalization: _enum([
@@ -6974,6 +7034,16 @@ var ModelCatalogEntrySchema = object({
6974
7034
  ]).optional(),
6975
7035
  preprocessMode: _enum(["letterbox", "resize"]).optional(),
6976
7036
  /**
7037
+ * Per-MODEL postprocessor override. Absent ⇒ the step's own
7038
+ * `StepDefinition.postprocessor` applies (the normal case — every model in a
7039
+ * step shares its decode). Set it when a step hosts models with DIFFERENT raw
7040
+ * output layouts under one slot: e.g. object-detection is `'yolo'` by default,
7041
+ * but a Coral SSD MobileNet build emits the `TFLite_Detection_PostProcess`
7042
+ * 4-tensor layout and needs `'ssd'`. Threaded into `PoolModelConfig.postprocessor`
7043
+ * by the engine factory (`modelEntry.postprocessor ?? def.postprocessor`).
7044
+ */
7045
+ postprocessor: custom().optional(),
7046
+ /**
6977
7047
  * When true, the executor produces a landmark-aligned crop (similarity warp
6978
7048
  * onto the canonical template) before this step runs, instead of a plain
6979
7049
  * axis-aligned bbox crop. Required for face-recognition embedders (ArcFace):
@@ -10450,7 +10520,8 @@ var ModelFormatSchema$1 = _enum([
10450
10520
  "coreml",
10451
10521
  "openvino",
10452
10522
  "tflite",
10453
- "pt"
10523
+ "pt",
10524
+ "gguf"
10454
10525
  ]);
10455
10526
  var PipelineSlotSchema = _enum([
10456
10527
  "detector",
@@ -10544,7 +10615,8 @@ var EngineProvisioningSchema = object({
10544
10615
  runtimeId: _enum([
10545
10616
  "onnx",
10546
10617
  "openvino",
10547
- "coreml"
10618
+ "coreml",
10619
+ "edgetpu"
10548
10620
  ]).nullable(),
10549
10621
  device: string().nullable(),
10550
10622
  state: _enum([
@@ -11756,6 +11828,140 @@ DeviceType.Camera, method(object({ deviceId: number() }), PtzAutotrackStatusSche
11756
11828
  deviceId: number(),
11757
11829
  status: PtzAutotrackStatusSchema
11758
11830
  });
11831
+ /**
11832
+ * scene-monitor — device-scoped reference-region state cap. An operator marks
11833
+ * a rect ROI on a camera frame and names one or more states; the engine
11834
+ * (pipeline-analytics, designated post-processing node) reports which state is
11835
+ * active on an ongoing basis. Two operator-selectable check modes share every-
11836
+ * thing except the comparator: `similarity` (CLIP cosine at the same ROI coords
11837
+ * vs condition-tagged references) and `llm` (vision-LLM judgment over the crop).
11838
+ *
11839
+ * D14 device-config archetype (`deviceConfig.ui.kind:'widget'`) — the framework
11840
+ * derives the device-detail contribution; the provider carries NO hand-written
11841
+ * settings-contribution methods. `status.kind:'push'` — the engine pushes on
11842
+ * every hysteresis flip / availability change; consumers never poll.
11843
+ */
11844
+ /** Extensible condition tag. Seeded 'day' | 'night'; open by design so more can
11845
+ * be added without a wire break (matching falls back to any-condition refs). */
11846
+ var SceneConditionSchema = string();
11847
+ /** One captured reference — condition-tagged, model-version-gated. `embedding`
11848
+ * is `number[]` (Float32Array does NOT survive MsgPack/UDS). */
11849
+ var SceneReferenceSchema = object({
11850
+ embedding: array(number()),
11851
+ modelId: string(),
11852
+ condition: SceneConditionSchema,
11853
+ capturedAt: number(),
11854
+ thumbnailMediaId: string().optional()
11855
+ });
11856
+ var SceneMonitorStateSchema = object({
11857
+ id: string(),
11858
+ label: string(),
11859
+ references: array(SceneReferenceSchema),
11860
+ textPrompts: array(string()).optional(),
11861
+ referenceCount: number(),
11862
+ currentlyMatched: boolean()
11863
+ });
11864
+ /** Per-mode comparator params in a discriminated union so an `llm` scene never
11865
+ * carries similarity knobs and vice-versa. */
11866
+ var SceneCheckSchema = discriminatedUnion("mode", [object({
11867
+ mode: literal("similarity"),
11868
+ threshold: number().min(0).max(1),
11869
+ hysteresisCount: number().int().positive()
11870
+ }), object({
11871
+ mode: literal("llm"),
11872
+ prompt: string(),
11873
+ profileId: string().optional(),
11874
+ hysteresisCount: number().int().positive()
11875
+ })]);
11876
+ var SceneMonitorSchema = object({
11877
+ id: string(),
11878
+ label: string(),
11879
+ roi: MaskRectShapeSchema,
11880
+ enabled: boolean(),
11881
+ triggerMode: _enum([
11882
+ "periodic",
11883
+ "on-motion",
11884
+ "both"
11885
+ ]),
11886
+ checkIntervalSec: number().optional(),
11887
+ check: SceneCheckSchema,
11888
+ states: array(SceneMonitorStateSchema),
11889
+ currentStateId: string().nullable(),
11890
+ lastCheckedAt: number().nullable(),
11891
+ lastConfidence: number().nullable(),
11892
+ currentCondition: SceneConditionSchema.nullable(),
11893
+ availability: _enum(["ok", "unavailable"]),
11894
+ unavailableReason: string().nullable()
11895
+ });
11896
+ var SceneMonitorStatusSchema = object({
11897
+ monitors: array(SceneMonitorSchema),
11898
+ lastFetchedAt: number()
11899
+ });
11900
+ DeviceType.Camera, method(object({ deviceId: number() }), SceneMonitorStatusSchema), method(object({
11901
+ deviceId: number(),
11902
+ label: string(),
11903
+ roi: MaskRectShapeSchema,
11904
+ check: SceneCheckSchema,
11905
+ triggerMode: _enum([
11906
+ "periodic",
11907
+ "on-motion",
11908
+ "both"
11909
+ ]).optional(),
11910
+ checkIntervalSec: number().optional()
11911
+ }), SceneMonitorSchema, {
11912
+ kind: "mutation",
11913
+ auth: "admin"
11914
+ }), method(object({
11915
+ deviceId: number(),
11916
+ monitorId: string(),
11917
+ patch: object({
11918
+ label: string().optional(),
11919
+ roi: MaskRectShapeSchema.optional(),
11920
+ enabled: boolean().optional(),
11921
+ triggerMode: _enum([
11922
+ "periodic",
11923
+ "on-motion",
11924
+ "both"
11925
+ ]).optional(),
11926
+ checkIntervalSec: number().optional(),
11927
+ check: SceneCheckSchema.optional()
11928
+ })
11929
+ }), _void(), {
11930
+ kind: "mutation",
11931
+ auth: "admin"
11932
+ }), method(object({
11933
+ deviceId: number(),
11934
+ monitorId: string()
11935
+ }), _void(), {
11936
+ kind: "mutation",
11937
+ auth: "admin"
11938
+ }), method(object({
11939
+ deviceId: number(),
11940
+ monitorId: string(),
11941
+ stateId: string().optional(),
11942
+ label: string().optional(),
11943
+ condition: SceneConditionSchema.optional()
11944
+ }), object({
11945
+ stateId: string(),
11946
+ referenceCount: number()
11947
+ }), {
11948
+ kind: "mutation",
11949
+ auth: "admin"
11950
+ }), method(object({
11951
+ deviceId: number(),
11952
+ monitorId: string(),
11953
+ stateId: string(),
11954
+ index: number()
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
+ });
11759
11965
  object({
11760
11966
  /** Whether the script is currently executing. */
11761
11967
  isRunning: boolean(),
@@ -12163,6 +12369,36 @@ var ZoneScopeBreakdownSchema = PerScopeBreakdownSchema.extend({
12163
12369
  * with the per-track detail panel and live overlay. */
12164
12370
  trackIds: array(string()).readonly()
12165
12371
  });
12372
+ /**
12373
+ * A parked ("stationary") object surfaced alongside occupancy — an object that
12374
+ * settled and stopped moving. It is NO LONGER a tracked object (the tracker was
12375
+ * told to forget it so it stops re-spawning tracks/events), but it IS still
12376
+ * physically present, so it keeps counting toward `frame` occupancy and is
12377
+ * listed here so the UI can show it in a dedicated "Stationary" section instead
12378
+ * of flooding the live event feed.
12379
+ */
12380
+ var StationaryObjectSchema = object({
12381
+ id: string(),
12382
+ className: string(),
12383
+ bbox: object({
12384
+ x: number(),
12385
+ y: number(),
12386
+ w: number(),
12387
+ h: number()
12388
+ }),
12389
+ frameWidth: number().int().nonnegative(),
12390
+ frameHeight: number().int().nonnegative(),
12391
+ /** When the source track was first seen. */
12392
+ firstSeenAt: number().int(),
12393
+ /** When the object was recognised as parked (promotion time). */
12394
+ becameStationaryAt: number().int(),
12395
+ /** Last frame a detection confirmed the object is still there. */
12396
+ lastConfirmedAt: number().int(),
12397
+ /** Enrichment label carried from the source track (identity / plate). */
12398
+ label: string().optional(),
12399
+ /** Native-resolution key-frame media key for the parked object's best image. */
12400
+ keyFrameMediaKey: string().optional()
12401
+ });
12166
12402
  var CameraOccupancySnapshotSchema = object({
12167
12403
  /** Frame timestamp of the inference result that produced this snapshot. */
12168
12404
  ts: number().int(),
@@ -12171,10 +12407,15 @@ var CameraOccupancySnapshotSchema = object({
12171
12407
  frameHeight: number().int().nonnegative(),
12172
12408
  /** Per-zone breakdown — one entry per defined zone (user + onboard). */
12173
12409
  zones: array(ZoneScopeBreakdownSchema).readonly(),
12174
- /** Frame-wide aggregate (everywhere, regardless of zone membership). */
12410
+ /** Frame-wide aggregate (everywhere, regardless of zone membership).
12411
+ * INCLUDES currently-confirmed stationary objects (they are still present). */
12175
12412
  frame: PerScopeBreakdownSchema,
12176
12413
  /** Detections that landed outside every zone. Empty when no zones defined. */
12177
- unzoned: PerScopeBreakdownSchema
12414
+ unzoned: PerScopeBreakdownSchema,
12415
+ /** Parked objects on this camera (additive — absent on legacy snapshots).
12416
+ * Surfaced separately so the UI shows them in a dedicated section rather
12417
+ * than as repeated tracks/events. */
12418
+ stationaryObjects: array(StationaryObjectSchema).readonly().optional()
12178
12419
  });
12179
12420
  /**
12180
12421
  * Time-series resolution. The history methods return one bucket per
@@ -12783,7 +13024,12 @@ var NotificationRuleConditionsSchema = object({
12783
13024
  clipDescription: object({
12784
13025
  text: string().min(1),
12785
13026
  minSimilarity: number().min(0).max(1)
12786
- }).optional()
13027
+ }).optional(),
13028
+ /** Match events whose recognized-entity label (face identity name or plate
13029
+ * vehicle name, propagated onto `event.data.label`) is one of these values.
13030
+ * Empty/absent → unaffected (back-compat). Enables "notify me when <named
13031
+ * vehicle/person> is seen". */
13032
+ labels: array(string()).readonly().optional()
12787
13033
  });
12788
13034
  var NotificationRuleTemplateSchema = object({
12789
13035
  title: string(),
@@ -13041,11 +13287,19 @@ method(object({
13041
13287
  * login page needs NO change.
13042
13288
  *
13043
13289
  * - `widget` — a Module-Federation widget the login page mounts (via
13044
- * `loadRemoteBundle`) for an in-page ceremony. Covers the passkey
13045
- * login ceremony, which must run `@simplewebauthn/browser` INSIDE the
13046
- * addon bundle. The referenced widget also declares `preAuth: true` in
13047
- * its `addon-widgets-source` catalog entry. `auth.listLoginMethods`
13048
- * stamps a public `bundleUrl` from `addonId` + `bundle`.
13290
+ * `loadRemoteBundle`) for an in-page ceremony. `auth.listLoginMethods`
13291
+ * stamps a public `bundleUrl` from `addonId` + `bundle`. Generic
13292
+ * mechanism kept for future use; no shipped addon uses it on the login
13293
+ * page (the passkey ceremony below runs natively in the shell instead).
13294
+ *
13295
+ * - `passkey` — a declarative WebAuthn ceremony the shell renders
13296
+ * natively (`@simplewebauthn/browser` lives in `addon-admin-ui`, not in
13297
+ * a remotely-loaded bundle). Carries the addon's effective `rpId` /
13298
+ * `origin` (from its `resolveRpID()` / `resolveOrigin()`) so the shell
13299
+ * can gate visibility (IP-literal origin, hostname/rpId mismatch) WITHOUT
13300
+ * fetching any remote code pre-auth. Contribution stays unconditional —
13301
+ * enrollment state is never leaked pre-auth; visibility is a shell
13302
+ * decision.
13049
13303
  *
13050
13304
  * Every contribution carries a `stage`:
13051
13305
  * - `primary` — shown on the first credentials screen (OIDC /
@@ -13059,30 +13313,45 @@ method(object({
13059
13313
  */
13060
13314
  /** When a login method renders in the two-phase login flow. */
13061
13315
  var LoginStageEnum = _enum(["primary", "second-factor"]);
13062
- /** One login-method contribution — redirect button OR pre-auth widget. */
13063
- var LoginMethodContributionSchema = discriminatedUnion("kind", [object({
13064
- kind: literal("redirect"),
13065
- /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
13066
- id: string(),
13067
- /** Operator-facing button label. */
13068
- label: string(),
13069
- /** lucide-react icon name. */
13070
- icon: string().optional(),
13071
- /** Addon-owned HTTP route the button navigates to (GET). */
13072
- startUrl: string(),
13073
- stage: LoginStageEnum
13074
- }), object({
13075
- kind: literal("widget"),
13076
- /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
13077
- id: string(),
13078
- /** Owning addon id drives the public bundle URL + the MF namespace. */
13079
- addonId: string(),
13080
- /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
13081
- bundle: string(),
13082
- /** MF remote descriptor `{ remoteName, exposedModule, componentKey }`. */
13083
- remote: WidgetRemoteSchema,
13084
- stage: LoginStageEnum
13085
- })]);
13316
+ /** One login-method contribution — redirect button, pre-auth widget, or native passkey ceremony. */
13317
+ var LoginMethodContributionSchema = discriminatedUnion("kind", [
13318
+ object({
13319
+ kind: literal("redirect"),
13320
+ /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
13321
+ id: string(),
13322
+ /** Operator-facing button label. */
13323
+ label: string(),
13324
+ /** lucide-react icon name. */
13325
+ icon: string().optional(),
13326
+ /** Addon-owned HTTP route the button navigates to (GET). */
13327
+ startUrl: string(),
13328
+ stage: LoginStageEnum
13329
+ }),
13330
+ object({
13331
+ kind: literal("widget"),
13332
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
13333
+ id: string(),
13334
+ /** Owning addon id — drives the public bundle URL + the MF namespace. */
13335
+ addonId: string(),
13336
+ /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
13337
+ bundle: string(),
13338
+ /** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
13339
+ remote: WidgetRemoteSchema,
13340
+ stage: LoginStageEnum
13341
+ }),
13342
+ object({
13343
+ kind: literal("passkey"),
13344
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-direct-login`). */
13345
+ id: string(),
13346
+ /** Operator-facing button label. */
13347
+ label: string(),
13348
+ stage: LoginStageEnum,
13349
+ /** Effective WebAuthn RP ID (`resolveRpID()`) — the shell gates visibility on it. */
13350
+ rpId: string(),
13351
+ /** Effective expected origin (`resolveOrigin()`), null when unconfigured. */
13352
+ origin: string().nullable()
13353
+ })
13354
+ ]);
13086
13355
  method(_void(), array(LoginMethodContributionSchema).readonly());
13087
13356
  /**
13088
13357
  * Orchestrator-side destination metadata. The orchestrator computes
@@ -14943,14 +15212,14 @@ var TargetKindCapsSchema = object({
14943
15212
  * the union is large and not meant for runtime validation here; the exported
14944
15213
  * `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
14945
15214
  */
14946
- var ConfigSchemaPassthrough = unknown();
15215
+ var ConfigSchemaPassthrough$1 = unknown();
14947
15216
  var TargetKindSchema = object({
14948
15217
  kind: string(),
14949
15218
  label: string(),
14950
15219
  icon: string(),
14951
15220
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
14952
15221
  addonId: string(),
14953
- configSchema: ConfigSchemaPassthrough,
15222
+ configSchema: ConfigSchemaPassthrough$1,
14954
15223
  supportsDiscovery: boolean(),
14955
15224
  caps: TargetKindCapsSchema
14956
15225
  });
@@ -15003,6 +15272,298 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
15003
15272
  enabled: boolean()
15004
15273
  }), _void(), { kind: "mutation" });
15005
15274
  /**
15275
+ * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
15276
+ * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
15277
+ * caps stay wire-compatible without a circular cap→cap import.
15278
+ *
15279
+ * Errors are a discriminated-union RESULT, never thrown: the shape survives
15280
+ * every transport tier structurally, and failed calls still write usage rows.
15281
+ * Token counts only in v1 — no costUsd (operator decision, 2026-07-15).
15282
+ */
15283
+ var LlmUsageSchema = object({
15284
+ inputTokens: number(),
15285
+ outputTokens: number()
15286
+ });
15287
+ var LlmErrorCodeSchema = _enum([
15288
+ "timeout",
15289
+ "rate-limited",
15290
+ "auth",
15291
+ "refusal",
15292
+ "bad-request",
15293
+ "unavailable",
15294
+ "no-profile",
15295
+ "budget-exceeded",
15296
+ "adapter-error"
15297
+ ]);
15298
+ var LlmGenerateResultSchema = discriminatedUnion("ok", [object({
15299
+ ok: literal(true),
15300
+ text: string(),
15301
+ model: string(),
15302
+ usage: LlmUsageSchema,
15303
+ truncated: boolean(),
15304
+ latencyMs: number()
15305
+ }), object({
15306
+ ok: literal(false),
15307
+ code: LlmErrorCodeSchema,
15308
+ message: string(),
15309
+ retryAfterMs: number().optional()
15310
+ })]);
15311
+ /**
15312
+ * `Uint8Array` is the sanctioned binary convention — superjson + the UDS
15313
+ * MsgPack channel round-trip typed arrays (embedding-encoder.cap.ts:29,
15314
+ * notification-output.cap.ts:27-31 precedents).
15315
+ */
15316
+ var LlmImageSchema = object({
15317
+ bytes: _instanceof(Uint8Array),
15318
+ mimeType: string()
15319
+ });
15320
+ var LlmGenerateBaseInputSchema = object({
15321
+ /** Collection routing (the notification-output posture). */
15322
+ addonId: string().optional(),
15323
+ /** Explicit profile; else the resolution chain (spec §3). */
15324
+ profileId: string().optional(),
15325
+ /** MANDATORY usage tag: 'ai-summary', 'notifier-rules', 'adhoc-ui', … */
15326
+ consumer: string(),
15327
+ system: string().optional(),
15328
+ /** v1: single-turn. `messages[]` is a v2 additive field. */
15329
+ prompt: string(),
15330
+ /** Structured output — adapter-mapped (response_format / forced tool / responseSchema). */
15331
+ jsonSchema: record(string(), unknown()).optional(),
15332
+ /** Per-call override of the profile default. */
15333
+ maxTokens: number().int().positive().optional(),
15334
+ temperature: number().optional()
15335
+ });
15336
+ /**
15337
+ * `llm-runtime` — node-side managed llama.cpp executor (spec §4). Registered
15338
+ * on EVERY node where `addon-ai` is installed; the hub `llm` provider reaches
15339
+ * a specific node's runtime with `nodePin(profile.runtime.nodeId)` — normal
15340
+ * cap routing, zero bespoke plumbing. `internal: true`: the operator reaches
15341
+ * this only through the `llm` cap's methods.
15342
+ *
15343
+ * One running llama-server child per node in v1 (models are RAM-heavy).
15344
+ * Resource ceiling = llama-server flags + idleStopMinutes ONLY (no RSS
15345
+ * watchdog — operator decision #3).
15346
+ */
15347
+ var ManagedModelRefSchema = discriminatedUnion("kind", [
15348
+ object({
15349
+ kind: literal("catalog"),
15350
+ catalogId: string()
15351
+ }),
15352
+ object({
15353
+ kind: literal("url"),
15354
+ url: string(),
15355
+ sha256: string().optional()
15356
+ }),
15357
+ object({
15358
+ kind: literal("path"),
15359
+ path: string()
15360
+ })
15361
+ ]);
15362
+ var ManagedRuntimeConfigSchema = object({
15363
+ /** WHERE the runtime lives — hub or any agent. */
15364
+ nodeId: string(),
15365
+ /** Closed for v1; 'ollama' is a v2 candidate. */
15366
+ engine: _enum(["llama-cpp"]),
15367
+ model: ManagedModelRefSchema,
15368
+ contextSize: number().int().default(4096),
15369
+ /** 0 = CPU-only. */
15370
+ gpuLayers: number().int().default(0),
15371
+ /** Default: cpus-2, clamped ≥1 (resolved node-side). */
15372
+ threads: number().int().optional(),
15373
+ /** Concurrent slots. */
15374
+ parallel: number().int().default(1),
15375
+ /** Else lazy: first generate boots it. */
15376
+ autoStart: boolean().default(false),
15377
+ /** 0 = never; frees RAM after quiet periods. */
15378
+ idleStopMinutes: number().int().default(30)
15379
+ });
15380
+ var LlmRuntimeStatusSchema = object({
15381
+ /** Status is ALWAYS node-qualified. */
15382
+ nodeId: string(),
15383
+ state: _enum([
15384
+ "stopped",
15385
+ "downloading",
15386
+ "starting",
15387
+ "ready",
15388
+ "crashed",
15389
+ "failed"
15390
+ ]),
15391
+ pid: number().optional(),
15392
+ port: number().optional(),
15393
+ modelPath: string().optional(),
15394
+ modelId: string().optional(),
15395
+ downloadProgress: number().min(0).max(1).optional(),
15396
+ lastError: string().optional(),
15397
+ crashesInWindow: number(),
15398
+ /** Child RSS (sampled best-effort). */
15399
+ memoryBytes: number().optional(),
15400
+ vramBytes: number().optional()
15401
+ });
15402
+ var LlmNodeModelSchema = object({
15403
+ file: string(),
15404
+ sizeBytes: number(),
15405
+ catalogId: string().optional(),
15406
+ installedAt: number().optional()
15407
+ });
15408
+ var LlmRuntimeDiskUsageSchema = object({
15409
+ nodeId: string(),
15410
+ modelsBytes: number(),
15411
+ freeBytes: number().optional()
15412
+ });
15413
+ method(LlmGenerateBaseInputSchema.extend({
15414
+ images: array(LlmImageSchema).optional(),
15415
+ runtime: ManagedRuntimeConfigSchema,
15416
+ /** The managed profile's timeout, threaded by the hub provider. */
15417
+ timeoutMs: number().int().positive().optional()
15418
+ }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
15419
+ kind: "mutation",
15420
+ auth: "admin"
15421
+ }), method(object({}), _void(), {
15422
+ kind: "mutation",
15423
+ auth: "admin"
15424
+ }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
15425
+ kind: "mutation",
15426
+ auth: "admin"
15427
+ }), method(object({ file: string() }), _void(), {
15428
+ kind: "mutation",
15429
+ auth: "admin"
15430
+ }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
15431
+ /**
15432
+ * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
15433
+ * methods concat-fan across providers; single-row methods route to ONE
15434
+ * provider by the `addonId` in the call input (the notification-output
15435
+ * posture, notification-output.cap.ts:215-250). Provided by `addon-ai`
15436
+ * (hub-placed); the cap stays open for future providers.
15437
+ *
15438
+ * Profiles are ROWS (data), not addons: one row = one usable model endpoint.
15439
+ * `apiKey` is a password field — providers REDACT it on read and merge on
15440
+ * write; a stored key NEVER round-trips to a client.
15441
+ */
15442
+ var LlmProfileKindSchema = _enum([
15443
+ "openai-compatible",
15444
+ "openai",
15445
+ "anthropic",
15446
+ "google",
15447
+ "managed-local"
15448
+ ]);
15449
+ var LlmProfileSchema = object({
15450
+ id: string(),
15451
+ name: string(),
15452
+ kind: LlmProfileKindSchema,
15453
+ /** Stamped by the provider — keeps the fanned catalog routable. */
15454
+ addonId: string(),
15455
+ enabled: boolean(),
15456
+ /** Vendor model id, or the managed runtime's loaded model. */
15457
+ model: string(),
15458
+ /** Required for openai-compatible; override for cloud kinds. */
15459
+ baseUrl: string().optional(),
15460
+ /** ConfigUISchema type:'password' — never round-trips (spec §5). */
15461
+ apiKey: string().optional(),
15462
+ supportsVision: boolean(),
15463
+ temperature: number().min(0).max(2).optional(),
15464
+ maxTokens: number().int().positive().optional(),
15465
+ timeoutMs: number().int().positive().default(6e4),
15466
+ extraHeaders: record(string(), string()).optional(),
15467
+ /** kind === 'managed-local' only (spec §4). */
15468
+ runtime: ManagedRuntimeConfigSchema.optional()
15469
+ });
15470
+ /** ConfigUISchema tree passed through untyped on the wire (the
15471
+ * notification-output `ConfigSchemaPassthrough` precedent at
15472
+ * notification-output.cap.ts:151); the exported TS type re-tightens it. */
15473
+ var ConfigSchemaPassthrough = unknown();
15474
+ var LlmProfileKindDescriptorSchema = object({
15475
+ kind: LlmProfileKindSchema,
15476
+ label: string(),
15477
+ icon: string(),
15478
+ /** Stamped by each provider so the concat-fanned catalog stays routable. */
15479
+ addonId: string(),
15480
+ configSchema: ConfigSchemaPassthrough
15481
+ });
15482
+ var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
15483
+ var LlmDefaultSchema = object({
15484
+ selector: LlmDefaultSelectorSchema,
15485
+ profileId: string()
15486
+ });
15487
+ /** Server-side rollup row — getUsage never dumps raw call rows (spec §6). */
15488
+ var LlmUsageRollupSchema = object({
15489
+ day: string(),
15490
+ consumer: string(),
15491
+ profileId: string(),
15492
+ calls: number(),
15493
+ okCalls: number(),
15494
+ errorCalls: number(),
15495
+ inputTokens: number(),
15496
+ outputTokens: number(),
15497
+ avgLatencyMs: number()
15498
+ });
15499
+ /** LLM-facing view over the reused ModelCatalogEntry mechanism (spec §4.2). */
15500
+ var ManagedModelCatalogEntrySchema = object({
15501
+ id: string(),
15502
+ label: string(),
15503
+ family: string(),
15504
+ purpose: _enum(["text", "vision"]),
15505
+ url: string(),
15506
+ sha256: string(),
15507
+ sizeBytes: number(),
15508
+ quantization: string(),
15509
+ /** Load-time guidance shown in the picker. */
15510
+ minRamBytes: number(),
15511
+ contextSizeDefault: number().int(),
15512
+ /** Vision models: companion projector file. */
15513
+ mmprojUrl: string().optional()
15514
+ });
15515
+ var LlmRuntimeNodeSchema = object({
15516
+ nodeId: string(),
15517
+ reachable: boolean(),
15518
+ status: LlmRuntimeStatusSchema.optional(),
15519
+ disk: LlmRuntimeDiskUsageSchema.optional(),
15520
+ error: string().optional()
15521
+ });
15522
+ var GenerateVisionInputSchema = LlmGenerateBaseInputSchema.extend({ images: array(LlmImageSchema).min(1) });
15523
+ var ProfileRefInputSchema = object({
15524
+ addonId: string(),
15525
+ profileId: string()
15526
+ });
15527
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
15528
+ kind: "mutation",
15529
+ auth: "admin"
15530
+ }), method(ProfileRefInputSchema, _void(), {
15531
+ kind: "mutation",
15532
+ auth: "admin"
15533
+ }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
15534
+ kind: "mutation",
15535
+ auth: "admin"
15536
+ }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
15537
+ selector: LlmDefaultSelectorSchema,
15538
+ profileId: string().nullable()
15539
+ }), _void(), {
15540
+ kind: "mutation",
15541
+ auth: "admin"
15542
+ }), method(object({
15543
+ since: number().optional(),
15544
+ until: number().optional(),
15545
+ consumer: string().optional(),
15546
+ profileId: string().optional()
15547
+ }), array(LlmUsageRollupSchema)), method(object({}), array(ManagedModelCatalogEntrySchema)), method(object({}), array(LlmRuntimeNodeSchema)), method(object({ nodeId: string() }), array(LlmNodeModelSchema)), method(object({
15548
+ nodeId: string(),
15549
+ model: ManagedModelRefSchema
15550
+ }), _void(), {
15551
+ kind: "mutation",
15552
+ auth: "admin"
15553
+ }), method(object({
15554
+ nodeId: string(),
15555
+ file: string()
15556
+ }), _void(), {
15557
+ kind: "mutation",
15558
+ auth: "admin"
15559
+ }), method(ProfileRefInputSchema, LlmRuntimeStatusSchema), method(ProfileRefInputSchema, LlmRuntimeStatusSchema, {
15560
+ kind: "mutation",
15561
+ auth: "admin"
15562
+ }), method(ProfileRefInputSchema, _void(), {
15563
+ kind: "mutation",
15564
+ auth: "admin"
15565
+ });
15566
+ /**
15006
15567
  * Zod schemas for persisted record types.
15007
15568
  *
15008
15569
  * These schemas serve as the single source of truth for types that are
@@ -15204,6 +15765,22 @@ var TrackSnapshotSchema = object({
15204
15765
  /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
15205
15766
  mediaKey: string()
15206
15767
  });
15768
+ /**
15769
+ * One audio-classification label heard on the track's camera while the
15770
+ * track was alive, aggregated per label. An "episode" is one persisted
15771
+ * audio event (the confident-classification path: score ≥ the device's
15772
+ * `classificationMinScore`, class-change-or-heartbeat coalesced) — NOT
15773
+ * one 32 ms inference chunk, so counts stay human-scaled.
15774
+ */
15775
+ var TrackAudioLabelSchema = object({
15776
+ label: string(),
15777
+ /** Highest classification score observed across the label's episodes. */
15778
+ peakScore: number(),
15779
+ /** Number of coalesced audio-event episodes carrying this label. */
15780
+ count: number(),
15781
+ firstAt: number(),
15782
+ lastAt: number()
15783
+ });
15207
15784
  var TrackSchema = object({
15208
15785
  trackId: string(),
15209
15786
  deviceId: number(),
@@ -15218,6 +15795,10 @@ var TrackSchema = object({
15218
15795
  snapshots: array(TrackSnapshotSchema).readonly(),
15219
15796
  /** Deduplicated zones the track has entered at least once. */
15220
15797
  zonesVisited: array(string()).readonly(),
15798
+ /** Deduplicated set of detector classes observed for this track over its
15799
+ * life (a track may be reclassified, e.g. person→vehicle). Absent on
15800
+ * legacy rows written before class accumulation shipped. */
15801
+ classes: array(string()).readonly().optional(),
15221
15802
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
15222
15803
  totalDistance: number(),
15223
15804
  state: TrackStateSchema,
@@ -15231,7 +15812,11 @@ var TrackSchema = object({
15231
15812
  bestEventId: string().optional(),
15232
15813
  /** Tag of the importance sub-signal that dominated the score
15233
15814
  * (identity|dwell|proximity|class|confidence|travel|zone). */
15234
- importanceReason: string().optional()
15815
+ importanceReason: string().optional(),
15816
+ /** Audio-classification labels heard on the camera during the track's
15817
+ * life (score ≥ device `classificationMinScore`), aggregated per label.
15818
+ * Absent on legacy rows / tracks with no confident audio. */
15819
+ audioLabels: array(TrackAudioLabelSchema).readonly().optional()
15235
15820
  });
15236
15821
  var BaseEventFields = {
15237
15822
  id: string(),
@@ -15379,7 +15964,7 @@ var KeyEventSchema = object({
15379
15964
  /** Track lifetime in ms (lastSeen - firstSeen). */
15380
15965
  windowMs: number().optional()
15381
15966
  });
15382
- var TrackedDetectionSchema = object({
15967
+ object({
15383
15968
  trackId: string(),
15384
15969
  className: string(),
15385
15970
  confidence: number(),
@@ -15387,6 +15972,23 @@ var TrackedDetectionSchema = object({
15387
15972
  zones: array(string()).readonly(),
15388
15973
  state: TrackStateSchema
15389
15974
  });
15975
+ var OverlayDetectionSchema = looseObject({
15976
+ id: string(),
15977
+ kind: _enum(["first-level", "detail"]),
15978
+ macroClass: string(),
15979
+ score: number(),
15980
+ bbox: object({
15981
+ x: number(),
15982
+ y: number(),
15983
+ width: number(),
15984
+ height: number()
15985
+ }),
15986
+ labels: array(looseObject({
15987
+ label: string(),
15988
+ score: number()
15989
+ })).readonly(),
15990
+ parentId: string().optional()
15991
+ });
15390
15992
  var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: number() });
15391
15993
  var SearchObjectEventsInput = object({
15392
15994
  text: string(),
@@ -15397,6 +15999,20 @@ var SearchObjectEventsInput = object({
15397
15999
  limit: number().default(50),
15398
16000
  minScore: number().min(0).max(1).default(.2)
15399
16001
  });
16002
+ var TrackCascadeCountsSchema = object({
16003
+ /** Persisted track roots deleted (authoritative). */
16004
+ tracks: number().int(),
16005
+ /** Object events removed with their tracks (best-effort; see note above). */
16006
+ events: number().int(),
16007
+ /** Track/face/plate-owned media removed (best-effort). Never identity media. */
16008
+ media: number().int(),
16009
+ /** Unassigned (non-enrolled) face reads removed (best-effort). */
16010
+ faces: number().int(),
16011
+ /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
16012
+ plates: number().int(),
16013
+ /** Per-track CLIP search vectors removed (best-effort). */
16014
+ embeddings: number().int()
16015
+ });
15400
16016
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
15401
16017
  deviceId: number(),
15402
16018
  trackId: string()
@@ -15428,6 +16044,24 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
15428
16044
  }), {
15429
16045
  kind: "mutation",
15430
16046
  auth: "admin"
16047
+ }), method(object({
16048
+ deviceId: number(),
16049
+ cutoffMs: number()
16050
+ }), TrackCascadeCountsSchema, {
16051
+ kind: "mutation",
16052
+ auth: "admin"
16053
+ }), method(object({ deviceId: number() }), TrackCascadeCountsSchema, {
16054
+ kind: "mutation",
16055
+ auth: "admin"
16056
+ }), method(object({
16057
+ deviceId: number(),
16058
+ trackIds: array(string()).min(1)
16059
+ }), object({
16060
+ deleted: number().int(),
16061
+ failed: array(string()).readonly()
16062
+ }), {
16063
+ kind: "mutation",
16064
+ auth: "admin"
15431
16065
  }), method(object({
15432
16066
  eventId: string(),
15433
16067
  kind: MediaFileKindEnum.optional()
@@ -15436,7 +16070,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
15436
16070
  timestamp: number(),
15437
16071
  frameWidth: number(),
15438
16072
  frameHeight: number(),
15439
- detections: array(TrackedDetectionSchema).readonly()
16073
+ detections: array(OverlayDetectionSchema).readonly()
15440
16074
  }), object({
15441
16075
  deviceId: number(),
15442
16076
  trackId: string(),
@@ -16752,7 +17386,15 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
16752
17386
  */
16753
17387
  disableIpv6: boolean().optional(),
16754
17388
  /** Subscriber attribution. See `createSession` for the contract. */
16755
- consumerAttribution: BrokerConsumerAttributionSchema.optional()
17389
+ consumerAttribution: BrokerConsumerAttributionSchema.optional(),
17390
+ /**
17391
+ * Client-side stream hints (viewport, downlink) — same contract as
17392
+ * `createSession.hints`. Client-offer viewers (the RN viewer's
17393
+ * `WebrtcLiveSession`) negotiate via `handleOffer`, so without this
17394
+ * field their hints were silently stripped by the schema and the
17395
+ * adaptive ladder started blind on the client's display size.
17396
+ */
17397
+ hints: webrtcClientHintsSchema.optional()
16756
17398
  }), object({
16757
17399
  sessionId: string(),
16758
17400
  sdpAnswer: string()
@@ -18205,6 +18847,24 @@ DeviceType.Camera, method(object({
18205
18847
  deviceId: number(),
18206
18848
  status: OsdStatusSchema
18207
18849
  });
18850
+ var VehicleSchema = object({
18851
+ id: string(),
18852
+ name: string(),
18853
+ sampleCount: number().int().nonnegative(),
18854
+ coverMediaKey: string().optional(),
18855
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
18856
+ coverBase64: string().optional()
18857
+ });
18858
+ var VehicleSampleInfoSchema = object({
18859
+ id: string(),
18860
+ /** The plate text this sample enrolled (self-labeling — no embedding). */
18861
+ text: string(),
18862
+ /** OCR confidence of the enrolled read (0..1). */
18863
+ score: number(),
18864
+ addedAt: number().int(),
18865
+ deviceId: number().int().optional(),
18866
+ base64: string().optional()
18867
+ });
18208
18868
  var PlateInfoSchema = object({
18209
18869
  plateId: string(),
18210
18870
  deviceId: number().int(),
@@ -18216,6 +18876,16 @@ var PlateInfoSchema = object({
18216
18876
  score: number(),
18217
18877
  /** True when the text was manually corrected (exempt from retention). */
18218
18878
  corrected: boolean(),
18879
+ /** Recognized vehicle id when a matcher lookup named this read (SQL NULL → absent). */
18880
+ recognizedVehicleId: string().optional(),
18881
+ /** Resolved vehicle name for `recognizedVehicleId` (UI convenience). */
18882
+ vehicleName: string().optional(),
18883
+ /** True once the read was assigned to a vehicle (enrolled as a sample). */
18884
+ assigned: boolean(),
18885
+ /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
18886
+ plateBbox: BoundingBoxSchema.optional(),
18887
+ /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
18888
+ keyFrameMediaKey: string().optional(),
18219
18889
  base64: string().optional()
18220
18890
  });
18221
18891
  var MediaFileLiteSchema = object({
@@ -18255,6 +18925,48 @@ method(object({
18255
18925
  }), method(object({ plateId: string() }), _void(), {
18256
18926
  kind: "mutation",
18257
18927
  auth: "admin"
18928
+ }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
18929
+ kind: "mutation",
18930
+ auth: "admin"
18931
+ }), method(object({
18932
+ id: string(),
18933
+ name: string().min(1)
18934
+ }), _void(), {
18935
+ kind: "mutation",
18936
+ auth: "admin"
18937
+ }), method(object({ id: string() }), _void(), {
18938
+ kind: "mutation",
18939
+ auth: "admin"
18940
+ }), method(object({ vehicleId: string() }), array(VehicleSampleInfoSchema).readonly()), method(object({
18941
+ vehicleId: string(),
18942
+ sampleId: string()
18943
+ }), _void(), {
18944
+ kind: "mutation",
18945
+ auth: "admin"
18946
+ }), method(object({
18947
+ plateId: string(),
18948
+ vehicleId: string()
18949
+ }), _void(), {
18950
+ kind: "mutation",
18951
+ auth: "admin"
18952
+ }), method(object({ plateId: string() }), _void(), {
18953
+ kind: "mutation",
18954
+ auth: "admin"
18955
+ }), method(object({
18956
+ plateIds: array(string()).min(1),
18957
+ vehicleId: string()
18958
+ }), object({
18959
+ assigned: number().int(),
18960
+ failed: array(string()).readonly()
18961
+ }), {
18962
+ kind: "mutation",
18963
+ auth: "admin"
18964
+ }), method(object({ plateIds: array(string()).min(1) }), object({
18965
+ unassigned: number().int(),
18966
+ failed: array(string()).readonly()
18967
+ }), {
18968
+ kind: "mutation",
18969
+ auth: "admin"
18258
18970
  });
18259
18971
  var ModelFormatSchema = _enum(MODEL_FORMATS);
18260
18972
  var HwAccelBackendInputSchema = _enum([
@@ -18333,6 +19045,10 @@ var GpuInfoSchema = object({
18333
19045
  memoryMB: number().optional()
18334
19046
  });
18335
19047
  var NpuInfoSchema = object({ type: _enum(["apple-ane", "intel-npu"]) });
19048
+ var CoralInfoSchema = object({
19049
+ type: literal("coral-edgetpu"),
19050
+ bus: string().optional()
19051
+ });
18336
19052
  var HardwareInfoSchema = object({
18337
19053
  platform: HardwarePlatformSchema,
18338
19054
  arch: HardwareArchSchema,
@@ -18341,7 +19057,8 @@ var HardwareInfoSchema = object({
18341
19057
  totalRAM_MB: number(),
18342
19058
  availableRAM_MB: number(),
18343
19059
  gpu: GpuInfoSchema.nullable(),
18344
- npu: NpuInfoSchema.nullable()
19060
+ npu: NpuInfoSchema.nullable(),
19061
+ coral: CoralInfoSchema.nullable().optional()
18345
19062
  });
18346
19063
  var PlatformScoreSchema = object({
18347
19064
  runtime: _enum(["node", "python"]),
@@ -20800,6 +21517,168 @@ Object.freeze({
20800
21517
  addonId: null,
20801
21518
  access: "create"
20802
21519
  },
21520
+ "llm.deleteModel": {
21521
+ capName: "llm",
21522
+ capScope: "system",
21523
+ addonId: null,
21524
+ access: "delete"
21525
+ },
21526
+ "llm.deleteProfile": {
21527
+ capName: "llm",
21528
+ capScope: "system",
21529
+ addonId: null,
21530
+ access: "delete"
21531
+ },
21532
+ "llm.generate": {
21533
+ capName: "llm",
21534
+ capScope: "system",
21535
+ addonId: null,
21536
+ access: "create"
21537
+ },
21538
+ "llm.generateVision": {
21539
+ capName: "llm",
21540
+ capScope: "system",
21541
+ addonId: null,
21542
+ access: "create"
21543
+ },
21544
+ "llm.getDefaults": {
21545
+ capName: "llm",
21546
+ capScope: "system",
21547
+ addonId: null,
21548
+ access: "view"
21549
+ },
21550
+ "llm.getRuntimeStatus": {
21551
+ capName: "llm",
21552
+ capScope: "system",
21553
+ addonId: null,
21554
+ access: "view"
21555
+ },
21556
+ "llm.getUsage": {
21557
+ capName: "llm",
21558
+ capScope: "system",
21559
+ addonId: null,
21560
+ access: "view"
21561
+ },
21562
+ "llm.installModel": {
21563
+ capName: "llm",
21564
+ capScope: "system",
21565
+ addonId: null,
21566
+ access: "create"
21567
+ },
21568
+ "llm.listModelCatalog": {
21569
+ capName: "llm",
21570
+ capScope: "system",
21571
+ addonId: null,
21572
+ access: "view"
21573
+ },
21574
+ "llm.listModels": {
21575
+ capName: "llm",
21576
+ capScope: "system",
21577
+ addonId: null,
21578
+ access: "view"
21579
+ },
21580
+ "llm.listNodeModels": {
21581
+ capName: "llm",
21582
+ capScope: "system",
21583
+ addonId: null,
21584
+ access: "view"
21585
+ },
21586
+ "llm.listProfileKinds": {
21587
+ capName: "llm",
21588
+ capScope: "system",
21589
+ addonId: null,
21590
+ access: "view"
21591
+ },
21592
+ "llm.listProfiles": {
21593
+ capName: "llm",
21594
+ capScope: "system",
21595
+ addonId: null,
21596
+ access: "view"
21597
+ },
21598
+ "llm.listRuntimeNodes": {
21599
+ capName: "llm",
21600
+ capScope: "system",
21601
+ addonId: null,
21602
+ access: "view"
21603
+ },
21604
+ "llm.setDefault": {
21605
+ capName: "llm",
21606
+ capScope: "system",
21607
+ addonId: null,
21608
+ access: "create"
21609
+ },
21610
+ "llm.startRuntime": {
21611
+ capName: "llm",
21612
+ capScope: "system",
21613
+ addonId: null,
21614
+ access: "create"
21615
+ },
21616
+ "llm.stopRuntime": {
21617
+ capName: "llm",
21618
+ capScope: "system",
21619
+ addonId: null,
21620
+ access: "create"
21621
+ },
21622
+ "llm.testProfile": {
21623
+ capName: "llm",
21624
+ capScope: "system",
21625
+ addonId: null,
21626
+ access: "create"
21627
+ },
21628
+ "llm.upsertProfile": {
21629
+ capName: "llm",
21630
+ capScope: "system",
21631
+ addonId: null,
21632
+ access: "create"
21633
+ },
21634
+ "llmRuntime.complete": {
21635
+ capName: "llm-runtime",
21636
+ capScope: "system",
21637
+ addonId: null,
21638
+ access: "create"
21639
+ },
21640
+ "llmRuntime.deleteModel": {
21641
+ capName: "llm-runtime",
21642
+ capScope: "system",
21643
+ addonId: null,
21644
+ access: "delete"
21645
+ },
21646
+ "llmRuntime.ensureStarted": {
21647
+ capName: "llm-runtime",
21648
+ capScope: "system",
21649
+ addonId: null,
21650
+ access: "create"
21651
+ },
21652
+ "llmRuntime.getDiskUsage": {
21653
+ capName: "llm-runtime",
21654
+ capScope: "system",
21655
+ addonId: null,
21656
+ access: "view"
21657
+ },
21658
+ "llmRuntime.installModel": {
21659
+ capName: "llm-runtime",
21660
+ capScope: "system",
21661
+ addonId: null,
21662
+ access: "create"
21663
+ },
21664
+ "llmRuntime.listLocalModels": {
21665
+ capName: "llm-runtime",
21666
+ capScope: "system",
21667
+ addonId: null,
21668
+ access: "view"
21669
+ },
21670
+ "llmRuntime.status": {
21671
+ capName: "llm-runtime",
21672
+ capScope: "system",
21673
+ addonId: null,
21674
+ access: "view"
21675
+ },
21676
+ "llmRuntime.stop": {
21677
+ capName: "llm-runtime",
21678
+ capScope: "system",
21679
+ addonId: null,
21680
+ access: "create"
21681
+ },
20803
21682
  "localNetwork.getAllowedAddresses": {
20804
21683
  capName: "local-network",
20805
21684
  capScope: "system",
@@ -21430,6 +22309,12 @@ Object.freeze({
21430
22309
  addonId: null,
21431
22310
  access: "delete"
21432
22311
  },
22312
+ "pipelineAnalytics.deleteTracks": {
22313
+ capName: "pipeline-analytics",
22314
+ capScope: "device",
22315
+ addonId: null,
22316
+ access: "delete"
22317
+ },
21433
22318
  "pipelineAnalytics.getActiveTracks": {
21434
22319
  capName: "pipeline-analytics",
21435
22320
  capScope: "device",
@@ -21496,12 +22381,24 @@ Object.freeze({
21496
22381
  addonId: null,
21497
22382
  access: "create"
21498
22383
  },
22384
+ "pipelineAnalytics.pruneTracksBefore": {
22385
+ capName: "pipeline-analytics",
22386
+ capScope: "device",
22387
+ addonId: null,
22388
+ access: "create"
22389
+ },
21499
22390
  "pipelineAnalytics.searchObjectEvents": {
21500
22391
  capName: "pipeline-analytics",
21501
22392
  capScope: "device",
21502
22393
  addonId: null,
21503
22394
  access: "view"
21504
22395
  },
22396
+ "pipelineAnalytics.wipeAllAnalytics": {
22397
+ capName: "pipeline-analytics",
22398
+ capScope: "device",
22399
+ addonId: null,
22400
+ access: "delete"
22401
+ },
21505
22402
  "pipelineExecutor.cacheFrameInPool": {
21506
22403
  capName: "pipeline-executor",
21507
22404
  capScope: "system",
@@ -22006,18 +22903,42 @@ Object.freeze({
22006
22903
  addonId: null,
22007
22904
  access: "create"
22008
22905
  },
22906
+ "plateGallery.assignPlate": {
22907
+ capName: "plate-gallery",
22908
+ capScope: "system",
22909
+ addonId: null,
22910
+ access: "create"
22911
+ },
22912
+ "plateGallery.assignPlates": {
22913
+ capName: "plate-gallery",
22914
+ capScope: "system",
22915
+ addonId: null,
22916
+ access: "create"
22917
+ },
22009
22918
  "plateGallery.correctPlateText": {
22010
22919
  capName: "plate-gallery",
22011
22920
  capScope: "system",
22012
22921
  addonId: null,
22013
22922
  access: "create"
22014
22923
  },
22924
+ "plateGallery.createVehicle": {
22925
+ capName: "plate-gallery",
22926
+ capScope: "system",
22927
+ addonId: null,
22928
+ access: "create"
22929
+ },
22015
22930
  "plateGallery.deletePlate": {
22016
22931
  capName: "plate-gallery",
22017
22932
  capScope: "system",
22018
22933
  addonId: null,
22019
22934
  access: "delete"
22020
22935
  },
22936
+ "plateGallery.deleteVehicle": {
22937
+ capName: "plate-gallery",
22938
+ capScope: "system",
22939
+ addonId: null,
22940
+ access: "delete"
22941
+ },
22021
22942
  "plateGallery.getPlateByTrack": {
22022
22943
  capName: "plate-gallery",
22023
22944
  capScope: "system",
@@ -22036,6 +22957,30 @@ Object.freeze({
22036
22957
  addonId: null,
22037
22958
  access: "view"
22038
22959
  },
22960
+ "plateGallery.listVehicles": {
22961
+ capName: "plate-gallery",
22962
+ capScope: "system",
22963
+ addonId: null,
22964
+ access: "view"
22965
+ },
22966
+ "plateGallery.listVehicleSamples": {
22967
+ capName: "plate-gallery",
22968
+ capScope: "system",
22969
+ addonId: null,
22970
+ access: "view"
22971
+ },
22972
+ "plateGallery.removeVehicleSample": {
22973
+ capName: "plate-gallery",
22974
+ capScope: "system",
22975
+ addonId: null,
22976
+ access: "delete"
22977
+ },
22978
+ "plateGallery.renameVehicle": {
22979
+ capName: "plate-gallery",
22980
+ capScope: "system",
22981
+ addonId: null,
22982
+ access: "create"
22983
+ },
22039
22984
  "plateGallery.searchPlates": {
22040
22985
  capName: "plate-gallery",
22041
22986
  capScope: "system",
@@ -22048,6 +22993,18 @@ Object.freeze({
22048
22993
  addonId: null,
22049
22994
  access: "view"
22050
22995
  },
22996
+ "plateGallery.unassignPlate": {
22997
+ capName: "plate-gallery",
22998
+ capScope: "system",
22999
+ addonId: null,
23000
+ access: "create"
23001
+ },
23002
+ "plateGallery.unassignPlates": {
23003
+ capName: "plate-gallery",
23004
+ capScope: "system",
23005
+ addonId: null,
23006
+ access: "create"
23007
+ },
22051
23008
  "platformProbe.getCapabilities": {
22052
23009
  capName: "platform-probe",
22053
23010
  capScope: "system",
@@ -22240,6 +23197,48 @@ Object.freeze({
22240
23197
  addonId: null,
22241
23198
  access: "create"
22242
23199
  },
23200
+ "sceneMonitor.captureReference": {
23201
+ capName: "scene-monitor",
23202
+ capScope: "device",
23203
+ addonId: null,
23204
+ access: "create"
23205
+ },
23206
+ "sceneMonitor.createScene": {
23207
+ capName: "scene-monitor",
23208
+ capScope: "device",
23209
+ addonId: null,
23210
+ access: "create"
23211
+ },
23212
+ "sceneMonitor.deleteReference": {
23213
+ capName: "scene-monitor",
23214
+ capScope: "device",
23215
+ addonId: null,
23216
+ access: "delete"
23217
+ },
23218
+ "sceneMonitor.deleteScene": {
23219
+ capName: "scene-monitor",
23220
+ capScope: "device",
23221
+ addonId: null,
23222
+ access: "delete"
23223
+ },
23224
+ "sceneMonitor.listScenes": {
23225
+ capName: "scene-monitor",
23226
+ capScope: "device",
23227
+ addonId: null,
23228
+ access: "view"
23229
+ },
23230
+ "sceneMonitor.recheckNow": {
23231
+ capName: "scene-monitor",
23232
+ capScope: "device",
23233
+ addonId: null,
23234
+ access: "create"
23235
+ },
23236
+ "sceneMonitor.updateScene": {
23237
+ capName: "scene-monitor",
23238
+ capScope: "device",
23239
+ addonId: null,
23240
+ access: "create"
23241
+ },
22243
23242
  "scriptRunner.run": {
22244
23243
  capName: "script-runner",
22245
23244
  capScope: "device",
@@ -23324,6 +24323,7 @@ Object.freeze({
23324
24323
  Object.freeze({
23325
24324
  "broker": "broker",
23326
24325
  "device-export": "device-export",
24326
+ "llm": "ai",
23327
24327
  "mesh-network": "mesh",
23328
24328
  "mqtt-broker": "broker",
23329
24329
  "network-access": "ingress",