@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.
@@ -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-CFZs3jI4.mjs
4665
4673
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4666
4674
  EventCategory["SystemBoot"] = "system.boot";
4667
4675
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5071,10 +5079,51 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5071
5079
  EventCategory["EnrichmentEmbeddingStored"] = "enrichment.embedding.stored";
5072
5080
  EventCategory["EnrichmentSceneStateChanged"] = "enrichment.scene.state-changed";
5073
5081
  EventCategory["EnrichmentActivitySummary"] = "enrichment.activity.summary";
5082
+ /**
5083
+ * Unified track-lifecycle event: ONE category carrying `phase:
5084
+ * 'start' | 'update' | 'end'` with a rich, typed
5085
+ * `PipelineAnalyticsTrackLifecyclePayload`. Supersedes the thin
5086
+ * `PipelineAnalyticsTrackStarted` / `PipelineAnalyticsTrackEnded`
5087
+ * pair — a consumer subscribes once and branches on `phase`.
5088
+ */
5089
+ EventCategory["PipelineAnalyticsTrackLifecycle"] = "pipeline-analytics.track-lifecycle";
5090
+ /**
5091
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
5092
+ * (`phase:'start'`). Kept as a soft alias — no known subscribers.
5093
+ */
5074
5094
  EventCategory["PipelineAnalyticsTrackStarted"] = "pipeline-analytics.track-started";
5095
+ /**
5096
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
5097
+ * (`phase:'end'`). Kept as a soft alias — no known subscribers.
5098
+ */
5075
5099
  EventCategory["PipelineAnalyticsTrackEnded"] = "pipeline-analytics.track-ended";
5076
5100
  EventCategory["PipelineAnalyticsDetectionEvent"] = "pipeline-analytics.detection-event";
5077
5101
  EventCategory["PipelineAnalyticsFrameTracked"] = "pipeline-analytics.frame-tracked";
5102
+ /**
5103
+ * Fired by `addon-post-analysis` when a parked (stationary) object appears
5104
+ * (a track was promoted to a stationary-registry entry) or departs (the
5105
+ * object moved / was removed). Telemetry (D8): lossy, drives a UI refresh of
5106
+ * the dedicated "Stationary" section — never the live event feed. Payload:
5107
+ * `{ deviceId, entryId, className, phase:'appeared'|'departed', timestamp }`.
5108
+ */
5109
+ EventCategory["PipelineAnalyticsStationaryChanged"] = "pipeline-analytics.stationary-changed";
5110
+ /**
5111
+ * Fired by `addon-post-analysis` whenever a gallery face row changes:
5112
+ * `kind:'buffered'` a new detected face was persisted, `'assigned'` /
5113
+ * `'unassigned'` its identity link changed, `'deleted'` the row was
5114
+ * removed. Telemetry semantics (D8): a lost event only delays a refresh,
5115
+ * never a correctness issue. Payload `PipelineAnalyticsFaceGalleryChangedPayload`.
5116
+ */
5117
+ EventCategory["PipelineAnalyticsFaceGalleryChanged"] = "pipeline-analytics.face-gallery-changed";
5118
+ /**
5119
+ * Fired by `addon-post-analysis` whenever a gallery plate row changes:
5120
+ * `kind:'buffered'` a new read was persisted (`PlateRecognizer.onTrackEnd`),
5121
+ * `'assigned'` / `'unassigned'` its vehicle link changed
5122
+ * (`PlateGalleryProvider`), `'deleted'` the row was removed. Telemetry
5123
+ * semantics (D8): a lost event only delays a refresh, never a correctness
5124
+ * issue. Payload `PipelineAnalyticsPlateGalleryChangedPayload`.
5125
+ */
5126
+ EventCategory["PipelineAnalyticsPlateGalleryChanged"] = "pipeline-analytics.plate-gallery-changed";
5078
5127
  EventCategory["FrigateLiveEvent"] = "frigate.live-event";
5079
5128
  EventCategory["CameraStreamsProfileSlotsChanged"] = "camera-streams.onProfileSlotsChanged";
5080
5129
  /**
@@ -6903,7 +6952,8 @@ var MODEL_FORMATS = [
6903
6952
  "coreml",
6904
6953
  "openvino",
6905
6954
  "tflite",
6906
- "pt"
6955
+ "pt",
6956
+ "gguf"
6907
6957
  ];
6908
6958
  /**
6909
6959
  * Multi-file format payload.
@@ -6947,7 +6997,8 @@ var ModelFormatsSchema = object({
6947
6997
  coreml: ModelFormatEntrySchema.optional(),
6948
6998
  openvino: ModelFormatEntrySchema.optional(),
6949
6999
  tflite: ModelFormatEntrySchema.optional(),
6950
- pt: ModelFormatEntrySchema.optional()
7000
+ pt: ModelFormatEntrySchema.optional(),
7001
+ gguf: ModelFormatEntrySchema.optional()
6951
7002
  });
6952
7003
  /**
6953
7004
  * Variant-selector grouping axes. Shared by the full `ModelCatalogEntry` and by
@@ -6988,6 +7039,15 @@ var ModelCatalogEntrySchema = object({
6988
7039
  width: number(),
6989
7040
  height: number()
6990
7041
  }),
7042
+ /**
7043
+ * Channel count of the model input tensor. Omit ⇒ 3 (RGB), the default for
7044
+ * every detector / classifier / embedder. Set to 1 for a grayscale CTC text
7045
+ * recognizer (EasyOCR VGG plate-OCR: input `[N,1,H,W]`) so the preprocess
7046
+ * feeds a single-channel, EasyOCR-normalized tensor instead of the default
7047
+ * 3-channel RGB one. Threaded through `PoolModelConfig.inputChannels` to the
7048
+ * Python inference pool.
7049
+ */
7050
+ inputChannels: number().int().positive().optional(),
6991
7051
  labels: array(LabelDefinitionSchema).readonly(),
6992
7052
  inputLayout: _enum(["nchw", "nhwc"]).optional(),
6993
7053
  inputNormalization: _enum([
@@ -6997,6 +7057,16 @@ var ModelCatalogEntrySchema = object({
6997
7057
  ]).optional(),
6998
7058
  preprocessMode: _enum(["letterbox", "resize"]).optional(),
6999
7059
  /**
7060
+ * Per-MODEL postprocessor override. Absent ⇒ the step's own
7061
+ * `StepDefinition.postprocessor` applies (the normal case — every model in a
7062
+ * step shares its decode). Set it when a step hosts models with DIFFERENT raw
7063
+ * output layouts under one slot: e.g. object-detection is `'yolo'` by default,
7064
+ * but a Coral SSD MobileNet build emits the `TFLite_Detection_PostProcess`
7065
+ * 4-tensor layout and needs `'ssd'`. Threaded into `PoolModelConfig.postprocessor`
7066
+ * by the engine factory (`modelEntry.postprocessor ?? def.postprocessor`).
7067
+ */
7068
+ postprocessor: custom().optional(),
7069
+ /**
7000
7070
  * When true, the executor produces a landmark-aligned crop (similarity warp
7001
7071
  * onto the canonical template) before this step runs, instead of a plain
7002
7072
  * axis-aligned bbox crop. Required for face-recognition embedders (ArcFace):
@@ -10473,7 +10543,8 @@ var ModelFormatSchema$1 = _enum([
10473
10543
  "coreml",
10474
10544
  "openvino",
10475
10545
  "tflite",
10476
- "pt"
10546
+ "pt",
10547
+ "gguf"
10477
10548
  ]);
10478
10549
  var PipelineSlotSchema = _enum([
10479
10550
  "detector",
@@ -10567,7 +10638,8 @@ var EngineProvisioningSchema = object({
10567
10638
  runtimeId: _enum([
10568
10639
  "onnx",
10569
10640
  "openvino",
10570
- "coreml"
10641
+ "coreml",
10642
+ "edgetpu"
10571
10643
  ]).nullable(),
10572
10644
  device: string().nullable(),
10573
10645
  state: _enum([
@@ -11779,6 +11851,140 @@ DeviceType.Camera, method(object({ deviceId: number() }), PtzAutotrackStatusSche
11779
11851
  deviceId: number(),
11780
11852
  status: PtzAutotrackStatusSchema
11781
11853
  });
11854
+ /**
11855
+ * scene-monitor — device-scoped reference-region state cap. An operator marks
11856
+ * a rect ROI on a camera frame and names one or more states; the engine
11857
+ * (pipeline-analytics, designated post-processing node) reports which state is
11858
+ * active on an ongoing basis. Two operator-selectable check modes share every-
11859
+ * thing except the comparator: `similarity` (CLIP cosine at the same ROI coords
11860
+ * vs condition-tagged references) and `llm` (vision-LLM judgment over the crop).
11861
+ *
11862
+ * D14 device-config archetype (`deviceConfig.ui.kind:'widget'`) — the framework
11863
+ * derives the device-detail contribution; the provider carries NO hand-written
11864
+ * settings-contribution methods. `status.kind:'push'` — the engine pushes on
11865
+ * every hysteresis flip / availability change; consumers never poll.
11866
+ */
11867
+ /** Extensible condition tag. Seeded 'day' | 'night'; open by design so more can
11868
+ * be added without a wire break (matching falls back to any-condition refs). */
11869
+ var SceneConditionSchema = string();
11870
+ /** One captured reference — condition-tagged, model-version-gated. `embedding`
11871
+ * is `number[]` (Float32Array does NOT survive MsgPack/UDS). */
11872
+ var SceneReferenceSchema = object({
11873
+ embedding: array(number()),
11874
+ modelId: string(),
11875
+ condition: SceneConditionSchema,
11876
+ capturedAt: number(),
11877
+ thumbnailMediaId: string().optional()
11878
+ });
11879
+ var SceneMonitorStateSchema = object({
11880
+ id: string(),
11881
+ label: string(),
11882
+ references: array(SceneReferenceSchema),
11883
+ textPrompts: array(string()).optional(),
11884
+ referenceCount: number(),
11885
+ currentlyMatched: boolean()
11886
+ });
11887
+ /** Per-mode comparator params in a discriminated union so an `llm` scene never
11888
+ * carries similarity knobs and vice-versa. */
11889
+ var SceneCheckSchema = discriminatedUnion("mode", [object({
11890
+ mode: literal("similarity"),
11891
+ threshold: number().min(0).max(1),
11892
+ hysteresisCount: number().int().positive()
11893
+ }), object({
11894
+ mode: literal("llm"),
11895
+ prompt: string(),
11896
+ profileId: string().optional(),
11897
+ hysteresisCount: number().int().positive()
11898
+ })]);
11899
+ var SceneMonitorSchema = object({
11900
+ id: string(),
11901
+ label: string(),
11902
+ roi: MaskRectShapeSchema,
11903
+ enabled: boolean(),
11904
+ triggerMode: _enum([
11905
+ "periodic",
11906
+ "on-motion",
11907
+ "both"
11908
+ ]),
11909
+ checkIntervalSec: number().optional(),
11910
+ check: SceneCheckSchema,
11911
+ states: array(SceneMonitorStateSchema),
11912
+ currentStateId: string().nullable(),
11913
+ lastCheckedAt: number().nullable(),
11914
+ lastConfidence: number().nullable(),
11915
+ currentCondition: SceneConditionSchema.nullable(),
11916
+ availability: _enum(["ok", "unavailable"]),
11917
+ unavailableReason: string().nullable()
11918
+ });
11919
+ var SceneMonitorStatusSchema = object({
11920
+ monitors: array(SceneMonitorSchema),
11921
+ lastFetchedAt: number()
11922
+ });
11923
+ DeviceType.Camera, method(object({ deviceId: number() }), SceneMonitorStatusSchema), method(object({
11924
+ deviceId: number(),
11925
+ label: string(),
11926
+ roi: MaskRectShapeSchema,
11927
+ check: SceneCheckSchema,
11928
+ triggerMode: _enum([
11929
+ "periodic",
11930
+ "on-motion",
11931
+ "both"
11932
+ ]).optional(),
11933
+ checkIntervalSec: number().optional()
11934
+ }), SceneMonitorSchema, {
11935
+ kind: "mutation",
11936
+ auth: "admin"
11937
+ }), method(object({
11938
+ deviceId: number(),
11939
+ monitorId: string(),
11940
+ patch: object({
11941
+ label: string().optional(),
11942
+ roi: MaskRectShapeSchema.optional(),
11943
+ enabled: boolean().optional(),
11944
+ triggerMode: _enum([
11945
+ "periodic",
11946
+ "on-motion",
11947
+ "both"
11948
+ ]).optional(),
11949
+ checkIntervalSec: number().optional(),
11950
+ check: SceneCheckSchema.optional()
11951
+ })
11952
+ }), _void(), {
11953
+ kind: "mutation",
11954
+ auth: "admin"
11955
+ }), method(object({
11956
+ deviceId: number(),
11957
+ monitorId: string()
11958
+ }), _void(), {
11959
+ kind: "mutation",
11960
+ auth: "admin"
11961
+ }), method(object({
11962
+ deviceId: number(),
11963
+ monitorId: string(),
11964
+ stateId: string().optional(),
11965
+ label: string().optional(),
11966
+ condition: SceneConditionSchema.optional()
11967
+ }), object({
11968
+ stateId: string(),
11969
+ referenceCount: number()
11970
+ }), {
11971
+ kind: "mutation",
11972
+ auth: "admin"
11973
+ }), method(object({
11974
+ deviceId: number(),
11975
+ monitorId: string(),
11976
+ stateId: string(),
11977
+ index: number()
11978
+ }), _void(), {
11979
+ kind: "mutation",
11980
+ auth: "admin"
11981
+ }), method(object({
11982
+ deviceId: number(),
11983
+ monitorId: string()
11984
+ }), _void(), {
11985
+ kind: "mutation",
11986
+ auth: "admin"
11987
+ });
11782
11988
  object({
11783
11989
  /** Whether the script is currently executing. */
11784
11990
  isRunning: boolean(),
@@ -12186,6 +12392,36 @@ var ZoneScopeBreakdownSchema = PerScopeBreakdownSchema.extend({
12186
12392
  * with the per-track detail panel and live overlay. */
12187
12393
  trackIds: array(string()).readonly()
12188
12394
  });
12395
+ /**
12396
+ * A parked ("stationary") object surfaced alongside occupancy — an object that
12397
+ * settled and stopped moving. It is NO LONGER a tracked object (the tracker was
12398
+ * told to forget it so it stops re-spawning tracks/events), but it IS still
12399
+ * physically present, so it keeps counting toward `frame` occupancy and is
12400
+ * listed here so the UI can show it in a dedicated "Stationary" section instead
12401
+ * of flooding the live event feed.
12402
+ */
12403
+ var StationaryObjectSchema = object({
12404
+ id: string(),
12405
+ className: string(),
12406
+ bbox: object({
12407
+ x: number(),
12408
+ y: number(),
12409
+ w: number(),
12410
+ h: number()
12411
+ }),
12412
+ frameWidth: number().int().nonnegative(),
12413
+ frameHeight: number().int().nonnegative(),
12414
+ /** When the source track was first seen. */
12415
+ firstSeenAt: number().int(),
12416
+ /** When the object was recognised as parked (promotion time). */
12417
+ becameStationaryAt: number().int(),
12418
+ /** Last frame a detection confirmed the object is still there. */
12419
+ lastConfirmedAt: number().int(),
12420
+ /** Enrichment label carried from the source track (identity / plate). */
12421
+ label: string().optional(),
12422
+ /** Native-resolution key-frame media key for the parked object's best image. */
12423
+ keyFrameMediaKey: string().optional()
12424
+ });
12189
12425
  var CameraOccupancySnapshotSchema = object({
12190
12426
  /** Frame timestamp of the inference result that produced this snapshot. */
12191
12427
  ts: number().int(),
@@ -12194,10 +12430,15 @@ var CameraOccupancySnapshotSchema = object({
12194
12430
  frameHeight: number().int().nonnegative(),
12195
12431
  /** Per-zone breakdown — one entry per defined zone (user + onboard). */
12196
12432
  zones: array(ZoneScopeBreakdownSchema).readonly(),
12197
- /** Frame-wide aggregate (everywhere, regardless of zone membership). */
12433
+ /** Frame-wide aggregate (everywhere, regardless of zone membership).
12434
+ * INCLUDES currently-confirmed stationary objects (they are still present). */
12198
12435
  frame: PerScopeBreakdownSchema,
12199
12436
  /** Detections that landed outside every zone. Empty when no zones defined. */
12200
- unzoned: PerScopeBreakdownSchema
12437
+ unzoned: PerScopeBreakdownSchema,
12438
+ /** Parked objects on this camera (additive — absent on legacy snapshots).
12439
+ * Surfaced separately so the UI shows them in a dedicated section rather
12440
+ * than as repeated tracks/events. */
12441
+ stationaryObjects: array(StationaryObjectSchema).readonly().optional()
12201
12442
  });
12202
12443
  /**
12203
12444
  * Time-series resolution. The history methods return one bucket per
@@ -12806,7 +13047,12 @@ var NotificationRuleConditionsSchema = object({
12806
13047
  clipDescription: object({
12807
13048
  text: string().min(1),
12808
13049
  minSimilarity: number().min(0).max(1)
12809
- }).optional()
13050
+ }).optional(),
13051
+ /** Match events whose recognized-entity label (face identity name or plate
13052
+ * vehicle name, propagated onto `event.data.label`) is one of these values.
13053
+ * Empty/absent → unaffected (back-compat). Enables "notify me when <named
13054
+ * vehicle/person> is seen". */
13055
+ labels: array(string()).readonly().optional()
12810
13056
  });
12811
13057
  var NotificationRuleTemplateSchema = object({
12812
13058
  title: string(),
@@ -13064,11 +13310,19 @@ method(object({
13064
13310
  * login page needs NO change.
13065
13311
  *
13066
13312
  * - `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`.
13313
+ * `loadRemoteBundle`) for an in-page ceremony. `auth.listLoginMethods`
13314
+ * stamps a public `bundleUrl` from `addonId` + `bundle`. Generic
13315
+ * mechanism kept for future use; no shipped addon uses it on the login
13316
+ * page (the passkey ceremony below runs natively in the shell instead).
13317
+ *
13318
+ * - `passkey` — a declarative WebAuthn ceremony the shell renders
13319
+ * natively (`@simplewebauthn/browser` lives in `addon-admin-ui`, not in
13320
+ * a remotely-loaded bundle). Carries the addon's effective `rpId` /
13321
+ * `origin` (from its `resolveRpID()` / `resolveOrigin()`) so the shell
13322
+ * can gate visibility (IP-literal origin, hostname/rpId mismatch) WITHOUT
13323
+ * fetching any remote code pre-auth. Contribution stays unconditional —
13324
+ * enrollment state is never leaked pre-auth; visibility is a shell
13325
+ * decision.
13072
13326
  *
13073
13327
  * Every contribution carries a `stage`:
13074
13328
  * - `primary` — shown on the first credentials screen (OIDC /
@@ -13082,30 +13336,45 @@ method(object({
13082
13336
  */
13083
13337
  /** When a login method renders in the two-phase login flow. */
13084
13338
  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
- })]);
13339
+ /** One login-method contribution — redirect button, pre-auth widget, or native passkey ceremony. */
13340
+ var LoginMethodContributionSchema = discriminatedUnion("kind", [
13341
+ object({
13342
+ kind: literal("redirect"),
13343
+ /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
13344
+ id: string(),
13345
+ /** Operator-facing button label. */
13346
+ label: string(),
13347
+ /** lucide-react icon name. */
13348
+ icon: string().optional(),
13349
+ /** Addon-owned HTTP route the button navigates to (GET). */
13350
+ startUrl: string(),
13351
+ stage: LoginStageEnum
13352
+ }),
13353
+ object({
13354
+ kind: literal("widget"),
13355
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
13356
+ id: string(),
13357
+ /** Owning addon id — drives the public bundle URL + the MF namespace. */
13358
+ addonId: string(),
13359
+ /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
13360
+ bundle: string(),
13361
+ /** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
13362
+ remote: WidgetRemoteSchema,
13363
+ stage: LoginStageEnum
13364
+ }),
13365
+ object({
13366
+ kind: literal("passkey"),
13367
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-direct-login`). */
13368
+ id: string(),
13369
+ /** Operator-facing button label. */
13370
+ label: string(),
13371
+ stage: LoginStageEnum,
13372
+ /** Effective WebAuthn RP ID (`resolveRpID()`) — the shell gates visibility on it. */
13373
+ rpId: string(),
13374
+ /** Effective expected origin (`resolveOrigin()`), null when unconfigured. */
13375
+ origin: string().nullable()
13376
+ })
13377
+ ]);
13109
13378
  method(_void(), array(LoginMethodContributionSchema).readonly());
13110
13379
  /**
13111
13380
  * Orchestrator-side destination metadata. The orchestrator computes
@@ -14966,14 +15235,14 @@ var TargetKindCapsSchema = object({
14966
15235
  * the union is large and not meant for runtime validation here; the exported
14967
15236
  * `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
14968
15237
  */
14969
- var ConfigSchemaPassthrough = unknown();
15238
+ var ConfigSchemaPassthrough$1 = unknown();
14970
15239
  var TargetKindSchema = object({
14971
15240
  kind: string(),
14972
15241
  label: string(),
14973
15242
  icon: string(),
14974
15243
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
14975
15244
  addonId: string(),
14976
- configSchema: ConfigSchemaPassthrough,
15245
+ configSchema: ConfigSchemaPassthrough$1,
14977
15246
  supportsDiscovery: boolean(),
14978
15247
  caps: TargetKindCapsSchema
14979
15248
  });
@@ -15026,6 +15295,298 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
15026
15295
  enabled: boolean()
15027
15296
  }), _void(), { kind: "mutation" });
15028
15297
  /**
15298
+ * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
15299
+ * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
15300
+ * caps stay wire-compatible without a circular cap→cap import.
15301
+ *
15302
+ * Errors are a discriminated-union RESULT, never thrown: the shape survives
15303
+ * every transport tier structurally, and failed calls still write usage rows.
15304
+ * Token counts only in v1 — no costUsd (operator decision, 2026-07-15).
15305
+ */
15306
+ var LlmUsageSchema = object({
15307
+ inputTokens: number(),
15308
+ outputTokens: number()
15309
+ });
15310
+ var LlmErrorCodeSchema = _enum([
15311
+ "timeout",
15312
+ "rate-limited",
15313
+ "auth",
15314
+ "refusal",
15315
+ "bad-request",
15316
+ "unavailable",
15317
+ "no-profile",
15318
+ "budget-exceeded",
15319
+ "adapter-error"
15320
+ ]);
15321
+ var LlmGenerateResultSchema = discriminatedUnion("ok", [object({
15322
+ ok: literal(true),
15323
+ text: string(),
15324
+ model: string(),
15325
+ usage: LlmUsageSchema,
15326
+ truncated: boolean(),
15327
+ latencyMs: number()
15328
+ }), object({
15329
+ ok: literal(false),
15330
+ code: LlmErrorCodeSchema,
15331
+ message: string(),
15332
+ retryAfterMs: number().optional()
15333
+ })]);
15334
+ /**
15335
+ * `Uint8Array` is the sanctioned binary convention — superjson + the UDS
15336
+ * MsgPack channel round-trip typed arrays (embedding-encoder.cap.ts:29,
15337
+ * notification-output.cap.ts:27-31 precedents).
15338
+ */
15339
+ var LlmImageSchema = object({
15340
+ bytes: _instanceof(Uint8Array),
15341
+ mimeType: string()
15342
+ });
15343
+ var LlmGenerateBaseInputSchema = object({
15344
+ /** Collection routing (the notification-output posture). */
15345
+ addonId: string().optional(),
15346
+ /** Explicit profile; else the resolution chain (spec §3). */
15347
+ profileId: string().optional(),
15348
+ /** MANDATORY usage tag: 'ai-summary', 'notifier-rules', 'adhoc-ui', … */
15349
+ consumer: string(),
15350
+ system: string().optional(),
15351
+ /** v1: single-turn. `messages[]` is a v2 additive field. */
15352
+ prompt: string(),
15353
+ /** Structured output — adapter-mapped (response_format / forced tool / responseSchema). */
15354
+ jsonSchema: record(string(), unknown()).optional(),
15355
+ /** Per-call override of the profile default. */
15356
+ maxTokens: number().int().positive().optional(),
15357
+ temperature: number().optional()
15358
+ });
15359
+ /**
15360
+ * `llm-runtime` — node-side managed llama.cpp executor (spec §4). Registered
15361
+ * on EVERY node where `addon-ai` is installed; the hub `llm` provider reaches
15362
+ * a specific node's runtime with `nodePin(profile.runtime.nodeId)` — normal
15363
+ * cap routing, zero bespoke plumbing. `internal: true`: the operator reaches
15364
+ * this only through the `llm` cap's methods.
15365
+ *
15366
+ * One running llama-server child per node in v1 (models are RAM-heavy).
15367
+ * Resource ceiling = llama-server flags + idleStopMinutes ONLY (no RSS
15368
+ * watchdog — operator decision #3).
15369
+ */
15370
+ var ManagedModelRefSchema = discriminatedUnion("kind", [
15371
+ object({
15372
+ kind: literal("catalog"),
15373
+ catalogId: string()
15374
+ }),
15375
+ object({
15376
+ kind: literal("url"),
15377
+ url: string(),
15378
+ sha256: string().optional()
15379
+ }),
15380
+ object({
15381
+ kind: literal("path"),
15382
+ path: string()
15383
+ })
15384
+ ]);
15385
+ var ManagedRuntimeConfigSchema = object({
15386
+ /** WHERE the runtime lives — hub or any agent. */
15387
+ nodeId: string(),
15388
+ /** Closed for v1; 'ollama' is a v2 candidate. */
15389
+ engine: _enum(["llama-cpp"]),
15390
+ model: ManagedModelRefSchema,
15391
+ contextSize: number().int().default(4096),
15392
+ /** 0 = CPU-only. */
15393
+ gpuLayers: number().int().default(0),
15394
+ /** Default: cpus-2, clamped ≥1 (resolved node-side). */
15395
+ threads: number().int().optional(),
15396
+ /** Concurrent slots. */
15397
+ parallel: number().int().default(1),
15398
+ /** Else lazy: first generate boots it. */
15399
+ autoStart: boolean().default(false),
15400
+ /** 0 = never; frees RAM after quiet periods. */
15401
+ idleStopMinutes: number().int().default(30)
15402
+ });
15403
+ var LlmRuntimeStatusSchema = object({
15404
+ /** Status is ALWAYS node-qualified. */
15405
+ nodeId: string(),
15406
+ state: _enum([
15407
+ "stopped",
15408
+ "downloading",
15409
+ "starting",
15410
+ "ready",
15411
+ "crashed",
15412
+ "failed"
15413
+ ]),
15414
+ pid: number().optional(),
15415
+ port: number().optional(),
15416
+ modelPath: string().optional(),
15417
+ modelId: string().optional(),
15418
+ downloadProgress: number().min(0).max(1).optional(),
15419
+ lastError: string().optional(),
15420
+ crashesInWindow: number(),
15421
+ /** Child RSS (sampled best-effort). */
15422
+ memoryBytes: number().optional(),
15423
+ vramBytes: number().optional()
15424
+ });
15425
+ var LlmNodeModelSchema = object({
15426
+ file: string(),
15427
+ sizeBytes: number(),
15428
+ catalogId: string().optional(),
15429
+ installedAt: number().optional()
15430
+ });
15431
+ var LlmRuntimeDiskUsageSchema = object({
15432
+ nodeId: string(),
15433
+ modelsBytes: number(),
15434
+ freeBytes: number().optional()
15435
+ });
15436
+ method(LlmGenerateBaseInputSchema.extend({
15437
+ images: array(LlmImageSchema).optional(),
15438
+ runtime: ManagedRuntimeConfigSchema,
15439
+ /** The managed profile's timeout, threaded by the hub provider. */
15440
+ timeoutMs: number().int().positive().optional()
15441
+ }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
15442
+ kind: "mutation",
15443
+ auth: "admin"
15444
+ }), method(object({}), _void(), {
15445
+ kind: "mutation",
15446
+ auth: "admin"
15447
+ }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
15448
+ kind: "mutation",
15449
+ auth: "admin"
15450
+ }), method(object({ file: string() }), _void(), {
15451
+ kind: "mutation",
15452
+ auth: "admin"
15453
+ }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
15454
+ /**
15455
+ * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
15456
+ * methods concat-fan across providers; single-row methods route to ONE
15457
+ * provider by the `addonId` in the call input (the notification-output
15458
+ * posture, notification-output.cap.ts:215-250). Provided by `addon-ai`
15459
+ * (hub-placed); the cap stays open for future providers.
15460
+ *
15461
+ * Profiles are ROWS (data), not addons: one row = one usable model endpoint.
15462
+ * `apiKey` is a password field — providers REDACT it on read and merge on
15463
+ * write; a stored key NEVER round-trips to a client.
15464
+ */
15465
+ var LlmProfileKindSchema = _enum([
15466
+ "openai-compatible",
15467
+ "openai",
15468
+ "anthropic",
15469
+ "google",
15470
+ "managed-local"
15471
+ ]);
15472
+ var LlmProfileSchema = object({
15473
+ id: string(),
15474
+ name: string(),
15475
+ kind: LlmProfileKindSchema,
15476
+ /** Stamped by the provider — keeps the fanned catalog routable. */
15477
+ addonId: string(),
15478
+ enabled: boolean(),
15479
+ /** Vendor model id, or the managed runtime's loaded model. */
15480
+ model: string(),
15481
+ /** Required for openai-compatible; override for cloud kinds. */
15482
+ baseUrl: string().optional(),
15483
+ /** ConfigUISchema type:'password' — never round-trips (spec §5). */
15484
+ apiKey: string().optional(),
15485
+ supportsVision: boolean(),
15486
+ temperature: number().min(0).max(2).optional(),
15487
+ maxTokens: number().int().positive().optional(),
15488
+ timeoutMs: number().int().positive().default(6e4),
15489
+ extraHeaders: record(string(), string()).optional(),
15490
+ /** kind === 'managed-local' only (spec §4). */
15491
+ runtime: ManagedRuntimeConfigSchema.optional()
15492
+ });
15493
+ /** ConfigUISchema tree passed through untyped on the wire (the
15494
+ * notification-output `ConfigSchemaPassthrough` precedent at
15495
+ * notification-output.cap.ts:151); the exported TS type re-tightens it. */
15496
+ var ConfigSchemaPassthrough = unknown();
15497
+ var LlmProfileKindDescriptorSchema = object({
15498
+ kind: LlmProfileKindSchema,
15499
+ label: string(),
15500
+ icon: string(),
15501
+ /** Stamped by each provider so the concat-fanned catalog stays routable. */
15502
+ addonId: string(),
15503
+ configSchema: ConfigSchemaPassthrough
15504
+ });
15505
+ var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
15506
+ var LlmDefaultSchema = object({
15507
+ selector: LlmDefaultSelectorSchema,
15508
+ profileId: string()
15509
+ });
15510
+ /** Server-side rollup row — getUsage never dumps raw call rows (spec §6). */
15511
+ var LlmUsageRollupSchema = object({
15512
+ day: string(),
15513
+ consumer: string(),
15514
+ profileId: string(),
15515
+ calls: number(),
15516
+ okCalls: number(),
15517
+ errorCalls: number(),
15518
+ inputTokens: number(),
15519
+ outputTokens: number(),
15520
+ avgLatencyMs: number()
15521
+ });
15522
+ /** LLM-facing view over the reused ModelCatalogEntry mechanism (spec §4.2). */
15523
+ var ManagedModelCatalogEntrySchema = object({
15524
+ id: string(),
15525
+ label: string(),
15526
+ family: string(),
15527
+ purpose: _enum(["text", "vision"]),
15528
+ url: string(),
15529
+ sha256: string(),
15530
+ sizeBytes: number(),
15531
+ quantization: string(),
15532
+ /** Load-time guidance shown in the picker. */
15533
+ minRamBytes: number(),
15534
+ contextSizeDefault: number().int(),
15535
+ /** Vision models: companion projector file. */
15536
+ mmprojUrl: string().optional()
15537
+ });
15538
+ var LlmRuntimeNodeSchema = object({
15539
+ nodeId: string(),
15540
+ reachable: boolean(),
15541
+ status: LlmRuntimeStatusSchema.optional(),
15542
+ disk: LlmRuntimeDiskUsageSchema.optional(),
15543
+ error: string().optional()
15544
+ });
15545
+ var GenerateVisionInputSchema = LlmGenerateBaseInputSchema.extend({ images: array(LlmImageSchema).min(1) });
15546
+ var ProfileRefInputSchema = object({
15547
+ addonId: string(),
15548
+ profileId: string()
15549
+ });
15550
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
15551
+ kind: "mutation",
15552
+ auth: "admin"
15553
+ }), method(ProfileRefInputSchema, _void(), {
15554
+ kind: "mutation",
15555
+ auth: "admin"
15556
+ }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
15557
+ kind: "mutation",
15558
+ auth: "admin"
15559
+ }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
15560
+ selector: LlmDefaultSelectorSchema,
15561
+ profileId: string().nullable()
15562
+ }), _void(), {
15563
+ kind: "mutation",
15564
+ auth: "admin"
15565
+ }), method(object({
15566
+ since: number().optional(),
15567
+ until: number().optional(),
15568
+ consumer: string().optional(),
15569
+ profileId: string().optional()
15570
+ }), array(LlmUsageRollupSchema)), method(object({}), array(ManagedModelCatalogEntrySchema)), method(object({}), array(LlmRuntimeNodeSchema)), method(object({ nodeId: string() }), array(LlmNodeModelSchema)), method(object({
15571
+ nodeId: string(),
15572
+ model: ManagedModelRefSchema
15573
+ }), _void(), {
15574
+ kind: "mutation",
15575
+ auth: "admin"
15576
+ }), method(object({
15577
+ nodeId: string(),
15578
+ file: string()
15579
+ }), _void(), {
15580
+ kind: "mutation",
15581
+ auth: "admin"
15582
+ }), method(ProfileRefInputSchema, LlmRuntimeStatusSchema), method(ProfileRefInputSchema, LlmRuntimeStatusSchema, {
15583
+ kind: "mutation",
15584
+ auth: "admin"
15585
+ }), method(ProfileRefInputSchema, _void(), {
15586
+ kind: "mutation",
15587
+ auth: "admin"
15588
+ });
15589
+ /**
15029
15590
  * Zod schemas for persisted record types.
15030
15591
  *
15031
15592
  * These schemas serve as the single source of truth for types that are
@@ -15227,6 +15788,22 @@ var TrackSnapshotSchema = object({
15227
15788
  /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
15228
15789
  mediaKey: string()
15229
15790
  });
15791
+ /**
15792
+ * One audio-classification label heard on the track's camera while the
15793
+ * track was alive, aggregated per label. An "episode" is one persisted
15794
+ * audio event (the confident-classification path: score ≥ the device's
15795
+ * `classificationMinScore`, class-change-or-heartbeat coalesced) — NOT
15796
+ * one 32 ms inference chunk, so counts stay human-scaled.
15797
+ */
15798
+ var TrackAudioLabelSchema = object({
15799
+ label: string(),
15800
+ /** Highest classification score observed across the label's episodes. */
15801
+ peakScore: number(),
15802
+ /** Number of coalesced audio-event episodes carrying this label. */
15803
+ count: number(),
15804
+ firstAt: number(),
15805
+ lastAt: number()
15806
+ });
15230
15807
  var TrackSchema = object({
15231
15808
  trackId: string(),
15232
15809
  deviceId: number(),
@@ -15241,6 +15818,10 @@ var TrackSchema = object({
15241
15818
  snapshots: array(TrackSnapshotSchema).readonly(),
15242
15819
  /** Deduplicated zones the track has entered at least once. */
15243
15820
  zonesVisited: array(string()).readonly(),
15821
+ /** Deduplicated set of detector classes observed for this track over its
15822
+ * life (a track may be reclassified, e.g. person→vehicle). Absent on
15823
+ * legacy rows written before class accumulation shipped. */
15824
+ classes: array(string()).readonly().optional(),
15244
15825
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
15245
15826
  totalDistance: number(),
15246
15827
  state: TrackStateSchema,
@@ -15254,7 +15835,11 @@ var TrackSchema = object({
15254
15835
  bestEventId: string().optional(),
15255
15836
  /** Tag of the importance sub-signal that dominated the score
15256
15837
  * (identity|dwell|proximity|class|confidence|travel|zone). */
15257
- importanceReason: string().optional()
15838
+ importanceReason: string().optional(),
15839
+ /** Audio-classification labels heard on the camera during the track's
15840
+ * life (score ≥ device `classificationMinScore`), aggregated per label.
15841
+ * Absent on legacy rows / tracks with no confident audio. */
15842
+ audioLabels: array(TrackAudioLabelSchema).readonly().optional()
15258
15843
  });
15259
15844
  var BaseEventFields = {
15260
15845
  id: string(),
@@ -15402,7 +15987,7 @@ var KeyEventSchema = object({
15402
15987
  /** Track lifetime in ms (lastSeen - firstSeen). */
15403
15988
  windowMs: number().optional()
15404
15989
  });
15405
- var TrackedDetectionSchema = object({
15990
+ object({
15406
15991
  trackId: string(),
15407
15992
  className: string(),
15408
15993
  confidence: number(),
@@ -15410,6 +15995,23 @@ var TrackedDetectionSchema = object({
15410
15995
  zones: array(string()).readonly(),
15411
15996
  state: TrackStateSchema
15412
15997
  });
15998
+ var OverlayDetectionSchema = looseObject({
15999
+ id: string(),
16000
+ kind: _enum(["first-level", "detail"]),
16001
+ macroClass: string(),
16002
+ score: number(),
16003
+ bbox: object({
16004
+ x: number(),
16005
+ y: number(),
16006
+ width: number(),
16007
+ height: number()
16008
+ }),
16009
+ labels: array(looseObject({
16010
+ label: string(),
16011
+ score: number()
16012
+ })).readonly(),
16013
+ parentId: string().optional()
16014
+ });
15413
16015
  var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: number() });
15414
16016
  var SearchObjectEventsInput = object({
15415
16017
  text: string(),
@@ -15420,6 +16022,20 @@ var SearchObjectEventsInput = object({
15420
16022
  limit: number().default(50),
15421
16023
  minScore: number().min(0).max(1).default(.2)
15422
16024
  });
16025
+ var TrackCascadeCountsSchema = object({
16026
+ /** Persisted track roots deleted (authoritative). */
16027
+ tracks: number().int(),
16028
+ /** Object events removed with their tracks (best-effort; see note above). */
16029
+ events: number().int(),
16030
+ /** Track/face/plate-owned media removed (best-effort). Never identity media. */
16031
+ media: number().int(),
16032
+ /** Unassigned (non-enrolled) face reads removed (best-effort). */
16033
+ faces: number().int(),
16034
+ /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
16035
+ plates: number().int(),
16036
+ /** Per-track CLIP search vectors removed (best-effort). */
16037
+ embeddings: number().int()
16038
+ });
15423
16039
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
15424
16040
  deviceId: number(),
15425
16041
  trackId: string()
@@ -15451,6 +16067,24 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
15451
16067
  }), {
15452
16068
  kind: "mutation",
15453
16069
  auth: "admin"
16070
+ }), method(object({
16071
+ deviceId: number(),
16072
+ cutoffMs: number()
16073
+ }), TrackCascadeCountsSchema, {
16074
+ kind: "mutation",
16075
+ auth: "admin"
16076
+ }), method(object({ deviceId: number() }), TrackCascadeCountsSchema, {
16077
+ kind: "mutation",
16078
+ auth: "admin"
16079
+ }), method(object({
16080
+ deviceId: number(),
16081
+ trackIds: array(string()).min(1)
16082
+ }), object({
16083
+ deleted: number().int(),
16084
+ failed: array(string()).readonly()
16085
+ }), {
16086
+ kind: "mutation",
16087
+ auth: "admin"
15454
16088
  }), method(object({
15455
16089
  eventId: string(),
15456
16090
  kind: MediaFileKindEnum.optional()
@@ -15459,7 +16093,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
15459
16093
  timestamp: number(),
15460
16094
  frameWidth: number(),
15461
16095
  frameHeight: number(),
15462
- detections: array(TrackedDetectionSchema).readonly()
16096
+ detections: array(OverlayDetectionSchema).readonly()
15463
16097
  }), object({
15464
16098
  deviceId: number(),
15465
16099
  trackId: string(),
@@ -16775,7 +17409,15 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
16775
17409
  */
16776
17410
  disableIpv6: boolean().optional(),
16777
17411
  /** Subscriber attribution. See `createSession` for the contract. */
16778
- consumerAttribution: BrokerConsumerAttributionSchema.optional()
17412
+ consumerAttribution: BrokerConsumerAttributionSchema.optional(),
17413
+ /**
17414
+ * Client-side stream hints (viewport, downlink) — same contract as
17415
+ * `createSession.hints`. Client-offer viewers (the RN viewer's
17416
+ * `WebrtcLiveSession`) negotiate via `handleOffer`, so without this
17417
+ * field their hints were silently stripped by the schema and the
17418
+ * adaptive ladder started blind on the client's display size.
17419
+ */
17420
+ hints: webrtcClientHintsSchema.optional()
16779
17421
  }), object({
16780
17422
  sessionId: string(),
16781
17423
  sdpAnswer: string()
@@ -18228,6 +18870,24 @@ DeviceType.Camera, method(object({
18228
18870
  deviceId: number(),
18229
18871
  status: OsdStatusSchema
18230
18872
  });
18873
+ var VehicleSchema = object({
18874
+ id: string(),
18875
+ name: string(),
18876
+ sampleCount: number().int().nonnegative(),
18877
+ coverMediaKey: string().optional(),
18878
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
18879
+ coverBase64: string().optional()
18880
+ });
18881
+ var VehicleSampleInfoSchema = object({
18882
+ id: string(),
18883
+ /** The plate text this sample enrolled (self-labeling — no embedding). */
18884
+ text: string(),
18885
+ /** OCR confidence of the enrolled read (0..1). */
18886
+ score: number(),
18887
+ addedAt: number().int(),
18888
+ deviceId: number().int().optional(),
18889
+ base64: string().optional()
18890
+ });
18231
18891
  var PlateInfoSchema = object({
18232
18892
  plateId: string(),
18233
18893
  deviceId: number().int(),
@@ -18239,6 +18899,16 @@ var PlateInfoSchema = object({
18239
18899
  score: number(),
18240
18900
  /** True when the text was manually corrected (exempt from retention). */
18241
18901
  corrected: boolean(),
18902
+ /** Recognized vehicle id when a matcher lookup named this read (SQL NULL → absent). */
18903
+ recognizedVehicleId: string().optional(),
18904
+ /** Resolved vehicle name for `recognizedVehicleId` (UI convenience). */
18905
+ vehicleName: string().optional(),
18906
+ /** True once the read was assigned to a vehicle (enrolled as a sample). */
18907
+ assigned: boolean(),
18908
+ /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
18909
+ plateBbox: BoundingBoxSchema.optional(),
18910
+ /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
18911
+ keyFrameMediaKey: string().optional(),
18242
18912
  base64: string().optional()
18243
18913
  });
18244
18914
  var MediaFileLiteSchema = object({
@@ -18278,6 +18948,48 @@ method(object({
18278
18948
  }), method(object({ plateId: string() }), _void(), {
18279
18949
  kind: "mutation",
18280
18950
  auth: "admin"
18951
+ }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
18952
+ kind: "mutation",
18953
+ auth: "admin"
18954
+ }), method(object({
18955
+ id: string(),
18956
+ name: string().min(1)
18957
+ }), _void(), {
18958
+ kind: "mutation",
18959
+ auth: "admin"
18960
+ }), method(object({ id: string() }), _void(), {
18961
+ kind: "mutation",
18962
+ auth: "admin"
18963
+ }), method(object({ vehicleId: string() }), array(VehicleSampleInfoSchema).readonly()), method(object({
18964
+ vehicleId: string(),
18965
+ sampleId: string()
18966
+ }), _void(), {
18967
+ kind: "mutation",
18968
+ auth: "admin"
18969
+ }), method(object({
18970
+ plateId: string(),
18971
+ vehicleId: string()
18972
+ }), _void(), {
18973
+ kind: "mutation",
18974
+ auth: "admin"
18975
+ }), method(object({ plateId: string() }), _void(), {
18976
+ kind: "mutation",
18977
+ auth: "admin"
18978
+ }), method(object({
18979
+ plateIds: array(string()).min(1),
18980
+ vehicleId: string()
18981
+ }), object({
18982
+ assigned: number().int(),
18983
+ failed: array(string()).readonly()
18984
+ }), {
18985
+ kind: "mutation",
18986
+ auth: "admin"
18987
+ }), method(object({ plateIds: array(string()).min(1) }), object({
18988
+ unassigned: number().int(),
18989
+ failed: array(string()).readonly()
18990
+ }), {
18991
+ kind: "mutation",
18992
+ auth: "admin"
18281
18993
  });
18282
18994
  var ModelFormatSchema = _enum(MODEL_FORMATS);
18283
18995
  var HwAccelBackendInputSchema = _enum([
@@ -18356,6 +19068,10 @@ var GpuInfoSchema = object({
18356
19068
  memoryMB: number().optional()
18357
19069
  });
18358
19070
  var NpuInfoSchema = object({ type: _enum(["apple-ane", "intel-npu"]) });
19071
+ var CoralInfoSchema = object({
19072
+ type: literal("coral-edgetpu"),
19073
+ bus: string().optional()
19074
+ });
18359
19075
  var HardwareInfoSchema = object({
18360
19076
  platform: HardwarePlatformSchema,
18361
19077
  arch: HardwareArchSchema,
@@ -18364,7 +19080,8 @@ var HardwareInfoSchema = object({
18364
19080
  totalRAM_MB: number(),
18365
19081
  availableRAM_MB: number(),
18366
19082
  gpu: GpuInfoSchema.nullable(),
18367
- npu: NpuInfoSchema.nullable()
19083
+ npu: NpuInfoSchema.nullable(),
19084
+ coral: CoralInfoSchema.nullable().optional()
18368
19085
  });
18369
19086
  var PlatformScoreSchema = object({
18370
19087
  runtime: _enum(["node", "python"]),
@@ -20823,6 +21540,168 @@ Object.freeze({
20823
21540
  addonId: null,
20824
21541
  access: "create"
20825
21542
  },
21543
+ "llm.deleteModel": {
21544
+ capName: "llm",
21545
+ capScope: "system",
21546
+ addonId: null,
21547
+ access: "delete"
21548
+ },
21549
+ "llm.deleteProfile": {
21550
+ capName: "llm",
21551
+ capScope: "system",
21552
+ addonId: null,
21553
+ access: "delete"
21554
+ },
21555
+ "llm.generate": {
21556
+ capName: "llm",
21557
+ capScope: "system",
21558
+ addonId: null,
21559
+ access: "create"
21560
+ },
21561
+ "llm.generateVision": {
21562
+ capName: "llm",
21563
+ capScope: "system",
21564
+ addonId: null,
21565
+ access: "create"
21566
+ },
21567
+ "llm.getDefaults": {
21568
+ capName: "llm",
21569
+ capScope: "system",
21570
+ addonId: null,
21571
+ access: "view"
21572
+ },
21573
+ "llm.getRuntimeStatus": {
21574
+ capName: "llm",
21575
+ capScope: "system",
21576
+ addonId: null,
21577
+ access: "view"
21578
+ },
21579
+ "llm.getUsage": {
21580
+ capName: "llm",
21581
+ capScope: "system",
21582
+ addonId: null,
21583
+ access: "view"
21584
+ },
21585
+ "llm.installModel": {
21586
+ capName: "llm",
21587
+ capScope: "system",
21588
+ addonId: null,
21589
+ access: "create"
21590
+ },
21591
+ "llm.listModelCatalog": {
21592
+ capName: "llm",
21593
+ capScope: "system",
21594
+ addonId: null,
21595
+ access: "view"
21596
+ },
21597
+ "llm.listModels": {
21598
+ capName: "llm",
21599
+ capScope: "system",
21600
+ addonId: null,
21601
+ access: "view"
21602
+ },
21603
+ "llm.listNodeModels": {
21604
+ capName: "llm",
21605
+ capScope: "system",
21606
+ addonId: null,
21607
+ access: "view"
21608
+ },
21609
+ "llm.listProfileKinds": {
21610
+ capName: "llm",
21611
+ capScope: "system",
21612
+ addonId: null,
21613
+ access: "view"
21614
+ },
21615
+ "llm.listProfiles": {
21616
+ capName: "llm",
21617
+ capScope: "system",
21618
+ addonId: null,
21619
+ access: "view"
21620
+ },
21621
+ "llm.listRuntimeNodes": {
21622
+ capName: "llm",
21623
+ capScope: "system",
21624
+ addonId: null,
21625
+ access: "view"
21626
+ },
21627
+ "llm.setDefault": {
21628
+ capName: "llm",
21629
+ capScope: "system",
21630
+ addonId: null,
21631
+ access: "create"
21632
+ },
21633
+ "llm.startRuntime": {
21634
+ capName: "llm",
21635
+ capScope: "system",
21636
+ addonId: null,
21637
+ access: "create"
21638
+ },
21639
+ "llm.stopRuntime": {
21640
+ capName: "llm",
21641
+ capScope: "system",
21642
+ addonId: null,
21643
+ access: "create"
21644
+ },
21645
+ "llm.testProfile": {
21646
+ capName: "llm",
21647
+ capScope: "system",
21648
+ addonId: null,
21649
+ access: "create"
21650
+ },
21651
+ "llm.upsertProfile": {
21652
+ capName: "llm",
21653
+ capScope: "system",
21654
+ addonId: null,
21655
+ access: "create"
21656
+ },
21657
+ "llmRuntime.complete": {
21658
+ capName: "llm-runtime",
21659
+ capScope: "system",
21660
+ addonId: null,
21661
+ access: "create"
21662
+ },
21663
+ "llmRuntime.deleteModel": {
21664
+ capName: "llm-runtime",
21665
+ capScope: "system",
21666
+ addonId: null,
21667
+ access: "delete"
21668
+ },
21669
+ "llmRuntime.ensureStarted": {
21670
+ capName: "llm-runtime",
21671
+ capScope: "system",
21672
+ addonId: null,
21673
+ access: "create"
21674
+ },
21675
+ "llmRuntime.getDiskUsage": {
21676
+ capName: "llm-runtime",
21677
+ capScope: "system",
21678
+ addonId: null,
21679
+ access: "view"
21680
+ },
21681
+ "llmRuntime.installModel": {
21682
+ capName: "llm-runtime",
21683
+ capScope: "system",
21684
+ addonId: null,
21685
+ access: "create"
21686
+ },
21687
+ "llmRuntime.listLocalModels": {
21688
+ capName: "llm-runtime",
21689
+ capScope: "system",
21690
+ addonId: null,
21691
+ access: "view"
21692
+ },
21693
+ "llmRuntime.status": {
21694
+ capName: "llm-runtime",
21695
+ capScope: "system",
21696
+ addonId: null,
21697
+ access: "view"
21698
+ },
21699
+ "llmRuntime.stop": {
21700
+ capName: "llm-runtime",
21701
+ capScope: "system",
21702
+ addonId: null,
21703
+ access: "create"
21704
+ },
20826
21705
  "localNetwork.getAllowedAddresses": {
20827
21706
  capName: "local-network",
20828
21707
  capScope: "system",
@@ -21453,6 +22332,12 @@ Object.freeze({
21453
22332
  addonId: null,
21454
22333
  access: "delete"
21455
22334
  },
22335
+ "pipelineAnalytics.deleteTracks": {
22336
+ capName: "pipeline-analytics",
22337
+ capScope: "device",
22338
+ addonId: null,
22339
+ access: "delete"
22340
+ },
21456
22341
  "pipelineAnalytics.getActiveTracks": {
21457
22342
  capName: "pipeline-analytics",
21458
22343
  capScope: "device",
@@ -21519,12 +22404,24 @@ Object.freeze({
21519
22404
  addonId: null,
21520
22405
  access: "create"
21521
22406
  },
22407
+ "pipelineAnalytics.pruneTracksBefore": {
22408
+ capName: "pipeline-analytics",
22409
+ capScope: "device",
22410
+ addonId: null,
22411
+ access: "create"
22412
+ },
21522
22413
  "pipelineAnalytics.searchObjectEvents": {
21523
22414
  capName: "pipeline-analytics",
21524
22415
  capScope: "device",
21525
22416
  addonId: null,
21526
22417
  access: "view"
21527
22418
  },
22419
+ "pipelineAnalytics.wipeAllAnalytics": {
22420
+ capName: "pipeline-analytics",
22421
+ capScope: "device",
22422
+ addonId: null,
22423
+ access: "delete"
22424
+ },
21528
22425
  "pipelineExecutor.cacheFrameInPool": {
21529
22426
  capName: "pipeline-executor",
21530
22427
  capScope: "system",
@@ -22029,18 +22926,42 @@ Object.freeze({
22029
22926
  addonId: null,
22030
22927
  access: "create"
22031
22928
  },
22929
+ "plateGallery.assignPlate": {
22930
+ capName: "plate-gallery",
22931
+ capScope: "system",
22932
+ addonId: null,
22933
+ access: "create"
22934
+ },
22935
+ "plateGallery.assignPlates": {
22936
+ capName: "plate-gallery",
22937
+ capScope: "system",
22938
+ addonId: null,
22939
+ access: "create"
22940
+ },
22032
22941
  "plateGallery.correctPlateText": {
22033
22942
  capName: "plate-gallery",
22034
22943
  capScope: "system",
22035
22944
  addonId: null,
22036
22945
  access: "create"
22037
22946
  },
22947
+ "plateGallery.createVehicle": {
22948
+ capName: "plate-gallery",
22949
+ capScope: "system",
22950
+ addonId: null,
22951
+ access: "create"
22952
+ },
22038
22953
  "plateGallery.deletePlate": {
22039
22954
  capName: "plate-gallery",
22040
22955
  capScope: "system",
22041
22956
  addonId: null,
22042
22957
  access: "delete"
22043
22958
  },
22959
+ "plateGallery.deleteVehicle": {
22960
+ capName: "plate-gallery",
22961
+ capScope: "system",
22962
+ addonId: null,
22963
+ access: "delete"
22964
+ },
22044
22965
  "plateGallery.getPlateByTrack": {
22045
22966
  capName: "plate-gallery",
22046
22967
  capScope: "system",
@@ -22059,6 +22980,30 @@ Object.freeze({
22059
22980
  addonId: null,
22060
22981
  access: "view"
22061
22982
  },
22983
+ "plateGallery.listVehicles": {
22984
+ capName: "plate-gallery",
22985
+ capScope: "system",
22986
+ addonId: null,
22987
+ access: "view"
22988
+ },
22989
+ "plateGallery.listVehicleSamples": {
22990
+ capName: "plate-gallery",
22991
+ capScope: "system",
22992
+ addonId: null,
22993
+ access: "view"
22994
+ },
22995
+ "plateGallery.removeVehicleSample": {
22996
+ capName: "plate-gallery",
22997
+ capScope: "system",
22998
+ addonId: null,
22999
+ access: "delete"
23000
+ },
23001
+ "plateGallery.renameVehicle": {
23002
+ capName: "plate-gallery",
23003
+ capScope: "system",
23004
+ addonId: null,
23005
+ access: "create"
23006
+ },
22062
23007
  "plateGallery.searchPlates": {
22063
23008
  capName: "plate-gallery",
22064
23009
  capScope: "system",
@@ -22071,6 +23016,18 @@ Object.freeze({
22071
23016
  addonId: null,
22072
23017
  access: "view"
22073
23018
  },
23019
+ "plateGallery.unassignPlate": {
23020
+ capName: "plate-gallery",
23021
+ capScope: "system",
23022
+ addonId: null,
23023
+ access: "create"
23024
+ },
23025
+ "plateGallery.unassignPlates": {
23026
+ capName: "plate-gallery",
23027
+ capScope: "system",
23028
+ addonId: null,
23029
+ access: "create"
23030
+ },
22074
23031
  "platformProbe.getCapabilities": {
22075
23032
  capName: "platform-probe",
22076
23033
  capScope: "system",
@@ -22263,6 +23220,48 @@ Object.freeze({
22263
23220
  addonId: null,
22264
23221
  access: "create"
22265
23222
  },
23223
+ "sceneMonitor.captureReference": {
23224
+ capName: "scene-monitor",
23225
+ capScope: "device",
23226
+ addonId: null,
23227
+ access: "create"
23228
+ },
23229
+ "sceneMonitor.createScene": {
23230
+ capName: "scene-monitor",
23231
+ capScope: "device",
23232
+ addonId: null,
23233
+ access: "create"
23234
+ },
23235
+ "sceneMonitor.deleteReference": {
23236
+ capName: "scene-monitor",
23237
+ capScope: "device",
23238
+ addonId: null,
23239
+ access: "delete"
23240
+ },
23241
+ "sceneMonitor.deleteScene": {
23242
+ capName: "scene-monitor",
23243
+ capScope: "device",
23244
+ addonId: null,
23245
+ access: "delete"
23246
+ },
23247
+ "sceneMonitor.listScenes": {
23248
+ capName: "scene-monitor",
23249
+ capScope: "device",
23250
+ addonId: null,
23251
+ access: "view"
23252
+ },
23253
+ "sceneMonitor.recheckNow": {
23254
+ capName: "scene-monitor",
23255
+ capScope: "device",
23256
+ addonId: null,
23257
+ access: "create"
23258
+ },
23259
+ "sceneMonitor.updateScene": {
23260
+ capName: "scene-monitor",
23261
+ capScope: "device",
23262
+ addonId: null,
23263
+ access: "create"
23264
+ },
22266
23265
  "scriptRunner.run": {
22267
23266
  capName: "script-runner",
22268
23267
  capScope: "device",
@@ -23347,6 +24346,7 @@ Object.freeze({
23347
24346
  Object.freeze({
23348
24347
  "broker": "broker",
23349
24348
  "device-export": "device-export",
24349
+ "llm": "ai",
23350
24350
  "mesh-network": "mesh",
23351
24351
  "mqtt-broker": "broker",
23352
24352
  "network-access": "ingress",