@camstack/addon-provider-homeassistant 1.1.24 → 1.1.25

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.
Files changed (3) hide show
  1. package/dist/addon.js +970 -38
  2. package/dist/addon.mjs +970 -38
  3. package/package.json +5 -1
package/dist/addon.js CHANGED
@@ -4288,6 +4288,14 @@ function object(shape, params) {
4288
4288
  ...normalizeParams(params)
4289
4289
  });
4290
4290
  }
4291
+ function looseObject(shape, params) {
4292
+ return new ZodObject({
4293
+ type: "object",
4294
+ shape,
4295
+ catchall: unknown(),
4296
+ ...normalizeParams(params)
4297
+ });
4298
+ }
4291
4299
  var ZodUnion = /*@__PURE__*/ $constructor("ZodUnion", (inst, def) => {
4292
4300
  $ZodUnion.init(inst, def);
4293
4301
  ZodType.init(inst, def);
@@ -4629,7 +4637,7 @@ function _instanceof(cls, params = {}) {
4629
4637
  return inst;
4630
4638
  }
4631
4639
  //#endregion
4632
- //#region ../types/dist/sleep-Baang_XW.mjs
4640
+ //#region ../types/dist/sleep-DkhOVOjW.mjs
4633
4641
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4634
4642
  EventCategory["SystemBoot"] = "system.boot";
4635
4643
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5039,10 +5047,43 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5039
5047
  EventCategory["EnrichmentEmbeddingStored"] = "enrichment.embedding.stored";
5040
5048
  EventCategory["EnrichmentSceneStateChanged"] = "enrichment.scene.state-changed";
5041
5049
  EventCategory["EnrichmentActivitySummary"] = "enrichment.activity.summary";
5050
+ /**
5051
+ * Unified track-lifecycle event: ONE category carrying `phase:
5052
+ * 'start' | 'update' | 'end'` with a rich, typed
5053
+ * `PipelineAnalyticsTrackLifecyclePayload`. Supersedes the thin
5054
+ * `PipelineAnalyticsTrackStarted` / `PipelineAnalyticsTrackEnded`
5055
+ * pair — a consumer subscribes once and branches on `phase`.
5056
+ */
5057
+ EventCategory["PipelineAnalyticsTrackLifecycle"] = "pipeline-analytics.track-lifecycle";
5058
+ /**
5059
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
5060
+ * (`phase:'start'`). Kept as a soft alias — no known subscribers.
5061
+ */
5042
5062
  EventCategory["PipelineAnalyticsTrackStarted"] = "pipeline-analytics.track-started";
5063
+ /**
5064
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
5065
+ * (`phase:'end'`). Kept as a soft alias — no known subscribers.
5066
+ */
5043
5067
  EventCategory["PipelineAnalyticsTrackEnded"] = "pipeline-analytics.track-ended";
5044
5068
  EventCategory["PipelineAnalyticsDetectionEvent"] = "pipeline-analytics.detection-event";
5045
5069
  EventCategory["PipelineAnalyticsFrameTracked"] = "pipeline-analytics.frame-tracked";
5070
+ /**
5071
+ * Fired by `addon-post-analysis` whenever a gallery face row changes:
5072
+ * `kind:'buffered'` a new detected face was persisted, `'assigned'` /
5073
+ * `'unassigned'` its identity link changed, `'deleted'` the row was
5074
+ * removed. Telemetry semantics (D8): a lost event only delays a refresh,
5075
+ * never a correctness issue. Payload `PipelineAnalyticsFaceGalleryChangedPayload`.
5076
+ */
5077
+ EventCategory["PipelineAnalyticsFaceGalleryChanged"] = "pipeline-analytics.face-gallery-changed";
5078
+ /**
5079
+ * Fired by `addon-post-analysis` whenever a gallery plate row changes:
5080
+ * `kind:'buffered'` a new read was persisted (`PlateRecognizer.onTrackEnd`),
5081
+ * `'assigned'` / `'unassigned'` its vehicle link changed
5082
+ * (`PlateGalleryProvider`), `'deleted'` the row was removed. Telemetry
5083
+ * semantics (D8): a lost event only delays a refresh, never a correctness
5084
+ * issue. Payload `PipelineAnalyticsPlateGalleryChangedPayload`.
5085
+ */
5086
+ EventCategory["PipelineAnalyticsPlateGalleryChanged"] = "pipeline-analytics.plate-gallery-changed";
5046
5087
  EventCategory["FrigateLiveEvent"] = "frigate.live-event";
5047
5088
  EventCategory["CameraStreamsProfileSlotsChanged"] = "camera-streams.onProfileSlotsChanged";
5048
5089
  /**
@@ -6887,7 +6928,8 @@ var MODEL_FORMATS = [
6887
6928
  "coreml",
6888
6929
  "openvino",
6889
6930
  "tflite",
6890
- "pt"
6931
+ "pt",
6932
+ "gguf"
6891
6933
  ];
6892
6934
  /**
6893
6935
  * Multi-file format payload.
@@ -6931,7 +6973,8 @@ var ModelFormatsSchema = object({
6931
6973
  coreml: ModelFormatEntrySchema.optional(),
6932
6974
  openvino: ModelFormatEntrySchema.optional(),
6933
6975
  tflite: ModelFormatEntrySchema.optional(),
6934
- pt: ModelFormatEntrySchema.optional()
6976
+ pt: ModelFormatEntrySchema.optional(),
6977
+ gguf: ModelFormatEntrySchema.optional()
6935
6978
  });
6936
6979
  /**
6937
6980
  * Variant-selector grouping axes. Shared by the full `ModelCatalogEntry` and by
@@ -11925,7 +11968,8 @@ var ModelFormatSchema$1 = _enum([
11925
11968
  "coreml",
11926
11969
  "openvino",
11927
11970
  "tflite",
11928
- "pt"
11971
+ "pt",
11972
+ "gguf"
11929
11973
  ]);
11930
11974
  var PipelineSlotSchema = _enum([
11931
11975
  "detector",
@@ -13660,6 +13704,167 @@ var ptzAutotrackCapability = {
13660
13704
  runtimeState: PtzAutotrackRuntimeStateSchema
13661
13705
  };
13662
13706
  /**
13707
+ * scene-monitor — device-scoped reference-region state cap. An operator marks
13708
+ * a rect ROI on a camera frame and names one or more states; the engine
13709
+ * (pipeline-analytics, designated post-processing node) reports which state is
13710
+ * active on an ongoing basis. Two operator-selectable check modes share every-
13711
+ * thing except the comparator: `similarity` (CLIP cosine at the same ROI coords
13712
+ * vs condition-tagged references) and `llm` (vision-LLM judgment over the crop).
13713
+ *
13714
+ * D14 device-config archetype (`deviceConfig.ui.kind:'widget'`) — the framework
13715
+ * derives the device-detail contribution; the provider carries NO hand-written
13716
+ * settings-contribution methods. `status.kind:'push'` — the engine pushes on
13717
+ * every hysteresis flip / availability change; consumers never poll.
13718
+ */
13719
+ /** Extensible condition tag. Seeded 'day' | 'night'; open by design so more can
13720
+ * be added without a wire break (matching falls back to any-condition refs). */
13721
+ var SceneConditionSchema = string();
13722
+ /** One captured reference — condition-tagged, model-version-gated. `embedding`
13723
+ * is `number[]` (Float32Array does NOT survive MsgPack/UDS). */
13724
+ var SceneReferenceSchema = object({
13725
+ embedding: array(number()),
13726
+ modelId: string(),
13727
+ condition: SceneConditionSchema,
13728
+ capturedAt: number(),
13729
+ thumbnailMediaId: string().optional()
13730
+ });
13731
+ var SceneMonitorStateSchema = object({
13732
+ id: string(),
13733
+ label: string(),
13734
+ references: array(SceneReferenceSchema),
13735
+ textPrompts: array(string()).optional(),
13736
+ referenceCount: number(),
13737
+ currentlyMatched: boolean()
13738
+ });
13739
+ /** Per-mode comparator params in a discriminated union so an `llm` scene never
13740
+ * carries similarity knobs and vice-versa. */
13741
+ var SceneCheckSchema = discriminatedUnion("mode", [object({
13742
+ mode: literal("similarity"),
13743
+ threshold: number().min(0).max(1),
13744
+ hysteresisCount: number().int().positive()
13745
+ }), object({
13746
+ mode: literal("llm"),
13747
+ prompt: string(),
13748
+ profileId: string().optional(),
13749
+ hysteresisCount: number().int().positive()
13750
+ })]);
13751
+ var SceneMonitorSchema = object({
13752
+ id: string(),
13753
+ label: string(),
13754
+ roi: MaskRectShapeSchema,
13755
+ enabled: boolean(),
13756
+ triggerMode: _enum([
13757
+ "periodic",
13758
+ "on-motion",
13759
+ "both"
13760
+ ]),
13761
+ checkIntervalSec: number().optional(),
13762
+ check: SceneCheckSchema,
13763
+ states: array(SceneMonitorStateSchema),
13764
+ currentStateId: string().nullable(),
13765
+ lastCheckedAt: number().nullable(),
13766
+ lastConfidence: number().nullable(),
13767
+ currentCondition: SceneConditionSchema.nullable(),
13768
+ availability: _enum(["ok", "unavailable"]),
13769
+ unavailableReason: string().nullable()
13770
+ });
13771
+ var SceneMonitorStatusSchema = object({
13772
+ monitors: array(SceneMonitorSchema),
13773
+ lastFetchedAt: number()
13774
+ });
13775
+ var sceneMonitorCapability = {
13776
+ name: "scene-monitor",
13777
+ scope: "device",
13778
+ mode: "singleton",
13779
+ kind: "wrapper",
13780
+ defaultActive: true,
13781
+ deviceTypes: [DeviceType.Camera],
13782
+ deviceConfig: { ui: {
13783
+ kind: "widget",
13784
+ widgetId: "host/scene-monitor-editor",
13785
+ tab: "scenes",
13786
+ label: "Scenes"
13787
+ } },
13788
+ methods: {
13789
+ listScenes: method(object({ deviceId: number() }), SceneMonitorStatusSchema),
13790
+ createScene: method(object({
13791
+ deviceId: number(),
13792
+ label: string(),
13793
+ roi: MaskRectShapeSchema,
13794
+ check: SceneCheckSchema,
13795
+ triggerMode: _enum([
13796
+ "periodic",
13797
+ "on-motion",
13798
+ "both"
13799
+ ]).optional(),
13800
+ checkIntervalSec: number().optional()
13801
+ }), SceneMonitorSchema, {
13802
+ kind: "mutation",
13803
+ auth: "admin"
13804
+ }),
13805
+ updateScene: method(object({
13806
+ deviceId: number(),
13807
+ monitorId: string(),
13808
+ patch: object({
13809
+ label: string().optional(),
13810
+ roi: MaskRectShapeSchema.optional(),
13811
+ enabled: boolean().optional(),
13812
+ triggerMode: _enum([
13813
+ "periodic",
13814
+ "on-motion",
13815
+ "both"
13816
+ ]).optional(),
13817
+ checkIntervalSec: number().optional(),
13818
+ check: SceneCheckSchema.optional()
13819
+ })
13820
+ }), _void(), {
13821
+ kind: "mutation",
13822
+ auth: "admin"
13823
+ }),
13824
+ deleteScene: method(object({
13825
+ deviceId: number(),
13826
+ monitorId: string()
13827
+ }), _void(), {
13828
+ kind: "mutation",
13829
+ auth: "admin"
13830
+ }),
13831
+ captureReference: method(object({
13832
+ deviceId: number(),
13833
+ monitorId: string(),
13834
+ stateId: string().optional(),
13835
+ label: string().optional(),
13836
+ condition: SceneConditionSchema.optional()
13837
+ }), object({
13838
+ stateId: string(),
13839
+ referenceCount: number()
13840
+ }), {
13841
+ kind: "mutation",
13842
+ auth: "admin"
13843
+ }),
13844
+ deleteReference: method(object({
13845
+ deviceId: number(),
13846
+ monitorId: string(),
13847
+ stateId: string(),
13848
+ index: number()
13849
+ }), _void(), {
13850
+ kind: "mutation",
13851
+ auth: "admin"
13852
+ }),
13853
+ recheckNow: method(object({
13854
+ deviceId: number(),
13855
+ monitorId: string()
13856
+ }), _void(), {
13857
+ kind: "mutation",
13858
+ auth: "admin"
13859
+ })
13860
+ },
13861
+ status: {
13862
+ schema: SceneMonitorStatusSchema,
13863
+ kind: "push"
13864
+ },
13865
+ runtimeState: SceneMonitorStatusSchema
13866
+ };
13867
+ /**
13663
13868
  * Script-runner cap. Models HA `script.*` entities on
13664
13869
  * `DeviceType.Script`. A Script is a pre-recorded action sequence
13665
13870
  * that can be invoked imperatively — optionally with a variables
@@ -14637,6 +14842,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
14637
14842
  pressureSensor: pressureSensorCapability,
14638
14843
  privacyMask: privacyMaskCapability,
14639
14844
  ptzAutotrack: ptzAutotrackCapability,
14845
+ sceneMonitor: sceneMonitorCapability,
14640
14846
  scriptRunner: scriptRunnerCapability,
14641
14847
  smoke: smokeCapability,
14642
14848
  streamParams: streamParamsCapability,
@@ -15922,7 +16128,12 @@ var NotificationRuleConditionsSchema = object({
15922
16128
  clipDescription: object({
15923
16129
  text: string().min(1),
15924
16130
  minSimilarity: number().min(0).max(1)
15925
- }).optional()
16131
+ }).optional(),
16132
+ /** Match events whose recognized-entity label (face identity name or plate
16133
+ * vehicle name, propagated onto `event.data.label`) is one of these values.
16134
+ * Empty/absent → unaffected (back-compat). Enables "notify me when <named
16135
+ * vehicle/person> is seen". */
16136
+ labels: array(string()).readonly().optional()
15926
16137
  });
15927
16138
  var NotificationRuleTemplateSchema = object({
15928
16139
  title: string(),
@@ -16180,11 +16391,19 @@ method(object({
16180
16391
  * login page needs NO change.
16181
16392
  *
16182
16393
  * - `widget` — a Module-Federation widget the login page mounts (via
16183
- * `loadRemoteBundle`) for an in-page ceremony. Covers the passkey
16184
- * login ceremony, which must run `@simplewebauthn/browser` INSIDE the
16185
- * addon bundle. The referenced widget also declares `preAuth: true` in
16186
- * its `addon-widgets-source` catalog entry. `auth.listLoginMethods`
16187
- * stamps a public `bundleUrl` from `addonId` + `bundle`.
16394
+ * `loadRemoteBundle`) for an in-page ceremony. `auth.listLoginMethods`
16395
+ * stamps a public `bundleUrl` from `addonId` + `bundle`. Generic
16396
+ * mechanism kept for future use; no shipped addon uses it on the login
16397
+ * page (the passkey ceremony below runs natively in the shell instead).
16398
+ *
16399
+ * - `passkey` — a declarative WebAuthn ceremony the shell renders
16400
+ * natively (`@simplewebauthn/browser` lives in `addon-admin-ui`, not in
16401
+ * a remotely-loaded bundle). Carries the addon's effective `rpId` /
16402
+ * `origin` (from its `resolveRpID()` / `resolveOrigin()`) so the shell
16403
+ * can gate visibility (IP-literal origin, hostname/rpId mismatch) WITHOUT
16404
+ * fetching any remote code pre-auth. Contribution stays unconditional —
16405
+ * enrollment state is never leaked pre-auth; visibility is a shell
16406
+ * decision.
16188
16407
  *
16189
16408
  * Every contribution carries a `stage`:
16190
16409
  * - `primary` — shown on the first credentials screen (OIDC /
@@ -16198,30 +16417,45 @@ method(object({
16198
16417
  */
16199
16418
  /** When a login method renders in the two-phase login flow. */
16200
16419
  var LoginStageEnum = _enum(["primary", "second-factor"]);
16201
- /** One login-method contribution — redirect button OR pre-auth widget. */
16202
- var LoginMethodContributionSchema = discriminatedUnion("kind", [object({
16203
- kind: literal("redirect"),
16204
- /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
16205
- id: string(),
16206
- /** Operator-facing button label. */
16207
- label: string(),
16208
- /** lucide-react icon name. */
16209
- icon: string().optional(),
16210
- /** Addon-owned HTTP route the button navigates to (GET). */
16211
- startUrl: string(),
16212
- stage: LoginStageEnum
16213
- }), object({
16214
- kind: literal("widget"),
16215
- /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
16216
- id: string(),
16217
- /** Owning addon id drives the public bundle URL + the MF namespace. */
16218
- addonId: string(),
16219
- /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
16220
- bundle: string(),
16221
- /** MF remote descriptor `{ remoteName, exposedModule, componentKey }`. */
16222
- remote: WidgetRemoteSchema,
16223
- stage: LoginStageEnum
16224
- })]);
16420
+ /** One login-method contribution — redirect button, pre-auth widget, or native passkey ceremony. */
16421
+ var LoginMethodContributionSchema = discriminatedUnion("kind", [
16422
+ object({
16423
+ kind: literal("redirect"),
16424
+ /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
16425
+ id: string(),
16426
+ /** Operator-facing button label. */
16427
+ label: string(),
16428
+ /** lucide-react icon name. */
16429
+ icon: string().optional(),
16430
+ /** Addon-owned HTTP route the button navigates to (GET). */
16431
+ startUrl: string(),
16432
+ stage: LoginStageEnum
16433
+ }),
16434
+ object({
16435
+ kind: literal("widget"),
16436
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
16437
+ id: string(),
16438
+ /** Owning addon id — drives the public bundle URL + the MF namespace. */
16439
+ addonId: string(),
16440
+ /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
16441
+ bundle: string(),
16442
+ /** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
16443
+ remote: WidgetRemoteSchema,
16444
+ stage: LoginStageEnum
16445
+ }),
16446
+ object({
16447
+ kind: literal("passkey"),
16448
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-direct-login`). */
16449
+ id: string(),
16450
+ /** Operator-facing button label. */
16451
+ label: string(),
16452
+ stage: LoginStageEnum,
16453
+ /** Effective WebAuthn RP ID (`resolveRpID()`) — the shell gates visibility on it. */
16454
+ rpId: string(),
16455
+ /** Effective expected origin (`resolveOrigin()`), null when unconfigured. */
16456
+ origin: string().nullable()
16457
+ })
16458
+ ]);
16225
16459
  method(_void(), array(LoginMethodContributionSchema).readonly());
16226
16460
  /**
16227
16461
  * Orchestrator-side destination metadata. The orchestrator computes
@@ -18115,14 +18349,14 @@ var TargetKindCapsSchema = object({
18115
18349
  * the union is large and not meant for runtime validation here; the exported
18116
18350
  * `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
18117
18351
  */
18118
- var ConfigSchemaPassthrough = unknown();
18352
+ var ConfigSchemaPassthrough$1 = unknown();
18119
18353
  var TargetKindSchema = object({
18120
18354
  kind: string(),
18121
18355
  label: string(),
18122
18356
  icon: string(),
18123
18357
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
18124
18358
  addonId: string(),
18125
- configSchema: ConfigSchemaPassthrough,
18359
+ configSchema: ConfigSchemaPassthrough$1,
18126
18360
  supportsDiscovery: boolean(),
18127
18361
  caps: TargetKindCapsSchema
18128
18362
  });
@@ -18189,6 +18423,298 @@ var notificationOutputCapability = {
18189
18423
  }
18190
18424
  };
18191
18425
  /**
18426
+ * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
18427
+ * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
18428
+ * caps stay wire-compatible without a circular cap→cap import.
18429
+ *
18430
+ * Errors are a discriminated-union RESULT, never thrown: the shape survives
18431
+ * every transport tier structurally, and failed calls still write usage rows.
18432
+ * Token counts only in v1 — no costUsd (operator decision, 2026-07-15).
18433
+ */
18434
+ var LlmUsageSchema = object({
18435
+ inputTokens: number(),
18436
+ outputTokens: number()
18437
+ });
18438
+ var LlmErrorCodeSchema = _enum([
18439
+ "timeout",
18440
+ "rate-limited",
18441
+ "auth",
18442
+ "refusal",
18443
+ "bad-request",
18444
+ "unavailable",
18445
+ "no-profile",
18446
+ "budget-exceeded",
18447
+ "adapter-error"
18448
+ ]);
18449
+ var LlmGenerateResultSchema = discriminatedUnion("ok", [object({
18450
+ ok: literal(true),
18451
+ text: string(),
18452
+ model: string(),
18453
+ usage: LlmUsageSchema,
18454
+ truncated: boolean(),
18455
+ latencyMs: number()
18456
+ }), object({
18457
+ ok: literal(false),
18458
+ code: LlmErrorCodeSchema,
18459
+ message: string(),
18460
+ retryAfterMs: number().optional()
18461
+ })]);
18462
+ /**
18463
+ * `Uint8Array` is the sanctioned binary convention — superjson + the UDS
18464
+ * MsgPack channel round-trip typed arrays (embedding-encoder.cap.ts:29,
18465
+ * notification-output.cap.ts:27-31 precedents).
18466
+ */
18467
+ var LlmImageSchema = object({
18468
+ bytes: _instanceof(Uint8Array),
18469
+ mimeType: string()
18470
+ });
18471
+ var LlmGenerateBaseInputSchema = object({
18472
+ /** Collection routing (the notification-output posture). */
18473
+ addonId: string().optional(),
18474
+ /** Explicit profile; else the resolution chain (spec §3). */
18475
+ profileId: string().optional(),
18476
+ /** MANDATORY usage tag: 'ai-summary', 'notifier-rules', 'adhoc-ui', … */
18477
+ consumer: string(),
18478
+ system: string().optional(),
18479
+ /** v1: single-turn. `messages[]` is a v2 additive field. */
18480
+ prompt: string(),
18481
+ /** Structured output — adapter-mapped (response_format / forced tool / responseSchema). */
18482
+ jsonSchema: record(string(), unknown()).optional(),
18483
+ /** Per-call override of the profile default. */
18484
+ maxTokens: number().int().positive().optional(),
18485
+ temperature: number().optional()
18486
+ });
18487
+ /**
18488
+ * `llm-runtime` — node-side managed llama.cpp executor (spec §4). Registered
18489
+ * on EVERY node where `addon-ai` is installed; the hub `llm` provider reaches
18490
+ * a specific node's runtime with `nodePin(profile.runtime.nodeId)` — normal
18491
+ * cap routing, zero bespoke plumbing. `internal: true`: the operator reaches
18492
+ * this only through the `llm` cap's methods.
18493
+ *
18494
+ * One running llama-server child per node in v1 (models are RAM-heavy).
18495
+ * Resource ceiling = llama-server flags + idleStopMinutes ONLY (no RSS
18496
+ * watchdog — operator decision #3).
18497
+ */
18498
+ var ManagedModelRefSchema = discriminatedUnion("kind", [
18499
+ object({
18500
+ kind: literal("catalog"),
18501
+ catalogId: string()
18502
+ }),
18503
+ object({
18504
+ kind: literal("url"),
18505
+ url: string(),
18506
+ sha256: string().optional()
18507
+ }),
18508
+ object({
18509
+ kind: literal("path"),
18510
+ path: string()
18511
+ })
18512
+ ]);
18513
+ var ManagedRuntimeConfigSchema = object({
18514
+ /** WHERE the runtime lives — hub or any agent. */
18515
+ nodeId: string(),
18516
+ /** Closed for v1; 'ollama' is a v2 candidate. */
18517
+ engine: _enum(["llama-cpp"]),
18518
+ model: ManagedModelRefSchema,
18519
+ contextSize: number().int().default(4096),
18520
+ /** 0 = CPU-only. */
18521
+ gpuLayers: number().int().default(0),
18522
+ /** Default: cpus-2, clamped ≥1 (resolved node-side). */
18523
+ threads: number().int().optional(),
18524
+ /** Concurrent slots. */
18525
+ parallel: number().int().default(1),
18526
+ /** Else lazy: first generate boots it. */
18527
+ autoStart: boolean().default(false),
18528
+ /** 0 = never; frees RAM after quiet periods. */
18529
+ idleStopMinutes: number().int().default(30)
18530
+ });
18531
+ var LlmRuntimeStatusSchema = object({
18532
+ /** Status is ALWAYS node-qualified. */
18533
+ nodeId: string(),
18534
+ state: _enum([
18535
+ "stopped",
18536
+ "downloading",
18537
+ "starting",
18538
+ "ready",
18539
+ "crashed",
18540
+ "failed"
18541
+ ]),
18542
+ pid: number().optional(),
18543
+ port: number().optional(),
18544
+ modelPath: string().optional(),
18545
+ modelId: string().optional(),
18546
+ downloadProgress: number().min(0).max(1).optional(),
18547
+ lastError: string().optional(),
18548
+ crashesInWindow: number(),
18549
+ /** Child RSS (sampled best-effort). */
18550
+ memoryBytes: number().optional(),
18551
+ vramBytes: number().optional()
18552
+ });
18553
+ var LlmNodeModelSchema = object({
18554
+ file: string(),
18555
+ sizeBytes: number(),
18556
+ catalogId: string().optional(),
18557
+ installedAt: number().optional()
18558
+ });
18559
+ var LlmRuntimeDiskUsageSchema = object({
18560
+ nodeId: string(),
18561
+ modelsBytes: number(),
18562
+ freeBytes: number().optional()
18563
+ });
18564
+ method(LlmGenerateBaseInputSchema.extend({
18565
+ images: array(LlmImageSchema).optional(),
18566
+ runtime: ManagedRuntimeConfigSchema,
18567
+ /** The managed profile's timeout, threaded by the hub provider. */
18568
+ timeoutMs: number().int().positive().optional()
18569
+ }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
18570
+ kind: "mutation",
18571
+ auth: "admin"
18572
+ }), method(object({}), _void(), {
18573
+ kind: "mutation",
18574
+ auth: "admin"
18575
+ }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
18576
+ kind: "mutation",
18577
+ auth: "admin"
18578
+ }), method(object({ file: string() }), _void(), {
18579
+ kind: "mutation",
18580
+ auth: "admin"
18581
+ }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
18582
+ /**
18583
+ * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
18584
+ * methods concat-fan across providers; single-row methods route to ONE
18585
+ * provider by the `addonId` in the call input (the notification-output
18586
+ * posture, notification-output.cap.ts:215-250). Provided by `addon-ai`
18587
+ * (hub-placed); the cap stays open for future providers.
18588
+ *
18589
+ * Profiles are ROWS (data), not addons: one row = one usable model endpoint.
18590
+ * `apiKey` is a password field — providers REDACT it on read and merge on
18591
+ * write; a stored key NEVER round-trips to a client.
18592
+ */
18593
+ var LlmProfileKindSchema = _enum([
18594
+ "openai-compatible",
18595
+ "openai",
18596
+ "anthropic",
18597
+ "google",
18598
+ "managed-local"
18599
+ ]);
18600
+ var LlmProfileSchema = object({
18601
+ id: string(),
18602
+ name: string(),
18603
+ kind: LlmProfileKindSchema,
18604
+ /** Stamped by the provider — keeps the fanned catalog routable. */
18605
+ addonId: string(),
18606
+ enabled: boolean(),
18607
+ /** Vendor model id, or the managed runtime's loaded model. */
18608
+ model: string(),
18609
+ /** Required for openai-compatible; override for cloud kinds. */
18610
+ baseUrl: string().optional(),
18611
+ /** ConfigUISchema type:'password' — never round-trips (spec §5). */
18612
+ apiKey: string().optional(),
18613
+ supportsVision: boolean(),
18614
+ temperature: number().min(0).max(2).optional(),
18615
+ maxTokens: number().int().positive().optional(),
18616
+ timeoutMs: number().int().positive().default(6e4),
18617
+ extraHeaders: record(string(), string()).optional(),
18618
+ /** kind === 'managed-local' only (spec §4). */
18619
+ runtime: ManagedRuntimeConfigSchema.optional()
18620
+ });
18621
+ /** ConfigUISchema tree passed through untyped on the wire (the
18622
+ * notification-output `ConfigSchemaPassthrough` precedent at
18623
+ * notification-output.cap.ts:151); the exported TS type re-tightens it. */
18624
+ var ConfigSchemaPassthrough = unknown();
18625
+ var LlmProfileKindDescriptorSchema = object({
18626
+ kind: LlmProfileKindSchema,
18627
+ label: string(),
18628
+ icon: string(),
18629
+ /** Stamped by each provider so the concat-fanned catalog stays routable. */
18630
+ addonId: string(),
18631
+ configSchema: ConfigSchemaPassthrough
18632
+ });
18633
+ var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
18634
+ var LlmDefaultSchema = object({
18635
+ selector: LlmDefaultSelectorSchema,
18636
+ profileId: string()
18637
+ });
18638
+ /** Server-side rollup row — getUsage never dumps raw call rows (spec §6). */
18639
+ var LlmUsageRollupSchema = object({
18640
+ day: string(),
18641
+ consumer: string(),
18642
+ profileId: string(),
18643
+ calls: number(),
18644
+ okCalls: number(),
18645
+ errorCalls: number(),
18646
+ inputTokens: number(),
18647
+ outputTokens: number(),
18648
+ avgLatencyMs: number()
18649
+ });
18650
+ /** LLM-facing view over the reused ModelCatalogEntry mechanism (spec §4.2). */
18651
+ var ManagedModelCatalogEntrySchema = object({
18652
+ id: string(),
18653
+ label: string(),
18654
+ family: string(),
18655
+ purpose: _enum(["text", "vision"]),
18656
+ url: string(),
18657
+ sha256: string(),
18658
+ sizeBytes: number(),
18659
+ quantization: string(),
18660
+ /** Load-time guidance shown in the picker. */
18661
+ minRamBytes: number(),
18662
+ contextSizeDefault: number().int(),
18663
+ /** Vision models: companion projector file. */
18664
+ mmprojUrl: string().optional()
18665
+ });
18666
+ var LlmRuntimeNodeSchema = object({
18667
+ nodeId: string(),
18668
+ reachable: boolean(),
18669
+ status: LlmRuntimeStatusSchema.optional(),
18670
+ disk: LlmRuntimeDiskUsageSchema.optional(),
18671
+ error: string().optional()
18672
+ });
18673
+ var GenerateVisionInputSchema = LlmGenerateBaseInputSchema.extend({ images: array(LlmImageSchema).min(1) });
18674
+ var ProfileRefInputSchema = object({
18675
+ addonId: string(),
18676
+ profileId: string()
18677
+ });
18678
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
18679
+ kind: "mutation",
18680
+ auth: "admin"
18681
+ }), method(ProfileRefInputSchema, _void(), {
18682
+ kind: "mutation",
18683
+ auth: "admin"
18684
+ }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
18685
+ kind: "mutation",
18686
+ auth: "admin"
18687
+ }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
18688
+ selector: LlmDefaultSelectorSchema,
18689
+ profileId: string().nullable()
18690
+ }), _void(), {
18691
+ kind: "mutation",
18692
+ auth: "admin"
18693
+ }), method(object({
18694
+ since: number().optional(),
18695
+ until: number().optional(),
18696
+ consumer: string().optional(),
18697
+ profileId: string().optional()
18698
+ }), array(LlmUsageRollupSchema)), method(object({}), array(ManagedModelCatalogEntrySchema)), method(object({}), array(LlmRuntimeNodeSchema)), method(object({ nodeId: string() }), array(LlmNodeModelSchema)), method(object({
18699
+ nodeId: string(),
18700
+ model: ManagedModelRefSchema
18701
+ }), _void(), {
18702
+ kind: "mutation",
18703
+ auth: "admin"
18704
+ }), method(object({
18705
+ nodeId: string(),
18706
+ file: string()
18707
+ }), _void(), {
18708
+ kind: "mutation",
18709
+ auth: "admin"
18710
+ }), method(ProfileRefInputSchema, LlmRuntimeStatusSchema), method(ProfileRefInputSchema, LlmRuntimeStatusSchema, {
18711
+ kind: "mutation",
18712
+ auth: "admin"
18713
+ }), method(ProfileRefInputSchema, _void(), {
18714
+ kind: "mutation",
18715
+ auth: "admin"
18716
+ });
18717
+ /**
18192
18718
  * Zod schemas for persisted record types.
18193
18719
  *
18194
18720
  * These schemas serve as the single source of truth for types that are
@@ -18404,6 +18930,10 @@ var TrackSchema = object({
18404
18930
  snapshots: array(TrackSnapshotSchema).readonly(),
18405
18931
  /** Deduplicated zones the track has entered at least once. */
18406
18932
  zonesVisited: array(string()).readonly(),
18933
+ /** Deduplicated set of detector classes observed for this track over its
18934
+ * life (a track may be reclassified, e.g. person→vehicle). Absent on
18935
+ * legacy rows written before class accumulation shipped. */
18936
+ classes: array(string()).readonly().optional(),
18407
18937
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
18408
18938
  totalDistance: number(),
18409
18939
  state: TrackStateSchema,
@@ -18565,7 +19095,7 @@ var KeyEventSchema = object({
18565
19095
  /** Track lifetime in ms (lastSeen - firstSeen). */
18566
19096
  windowMs: number().optional()
18567
19097
  });
18568
- var TrackedDetectionSchema = object({
19098
+ object({
18569
19099
  trackId: string(),
18570
19100
  className: string(),
18571
19101
  confidence: number(),
@@ -18573,6 +19103,23 @@ var TrackedDetectionSchema = object({
18573
19103
  zones: array(string()).readonly(),
18574
19104
  state: TrackStateSchema
18575
19105
  });
19106
+ var OverlayDetectionSchema = looseObject({
19107
+ id: string(),
19108
+ kind: _enum(["first-level", "detail"]),
19109
+ macroClass: string(),
19110
+ score: number(),
19111
+ bbox: object({
19112
+ x: number(),
19113
+ y: number(),
19114
+ width: number(),
19115
+ height: number()
19116
+ }),
19117
+ labels: array(looseObject({
19118
+ label: string(),
19119
+ score: number()
19120
+ })).readonly(),
19121
+ parentId: string().optional()
19122
+ });
18576
19123
  var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: number() });
18577
19124
  var SearchObjectEventsInput = object({
18578
19125
  text: string(),
@@ -18583,6 +19130,20 @@ var SearchObjectEventsInput = object({
18583
19130
  limit: number().default(50),
18584
19131
  minScore: number().min(0).max(1).default(.2)
18585
19132
  });
19133
+ var TrackCascadeCountsSchema = object({
19134
+ /** Persisted track roots deleted (authoritative). */
19135
+ tracks: number().int(),
19136
+ /** Object events removed with their tracks (best-effort; see note above). */
19137
+ events: number().int(),
19138
+ /** Track/face/plate-owned media removed (best-effort). Never identity media. */
19139
+ media: number().int(),
19140
+ /** Unassigned (non-enrolled) face reads removed (best-effort). */
19141
+ faces: number().int(),
19142
+ /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19143
+ plates: number().int(),
19144
+ /** Per-track CLIP search vectors removed (best-effort). */
19145
+ embeddings: number().int()
19146
+ });
18586
19147
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
18587
19148
  deviceId: number(),
18588
19149
  trackId: string()
@@ -18614,6 +19175,24 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
18614
19175
  }), {
18615
19176
  kind: "mutation",
18616
19177
  auth: "admin"
19178
+ }), method(object({
19179
+ deviceId: number(),
19180
+ cutoffMs: number()
19181
+ }), TrackCascadeCountsSchema, {
19182
+ kind: "mutation",
19183
+ auth: "admin"
19184
+ }), method(object({ deviceId: number() }), TrackCascadeCountsSchema, {
19185
+ kind: "mutation",
19186
+ auth: "admin"
19187
+ }), method(object({
19188
+ deviceId: number(),
19189
+ trackIds: array(string()).min(1)
19190
+ }), object({
19191
+ deleted: number().int(),
19192
+ failed: array(string()).readonly()
19193
+ }), {
19194
+ kind: "mutation",
19195
+ auth: "admin"
18617
19196
  }), method(object({
18618
19197
  eventId: string(),
18619
19198
  kind: MediaFileKindEnum.optional()
@@ -18622,7 +19201,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
18622
19201
  timestamp: number(),
18623
19202
  frameWidth: number(),
18624
19203
  frameHeight: number(),
18625
- detections: array(TrackedDetectionSchema).readonly()
19204
+ detections: array(OverlayDetectionSchema).readonly()
18626
19205
  }), object({
18627
19206
  deviceId: number(),
18628
19207
  trackId: string(),
@@ -21480,6 +22059,24 @@ DeviceType.Camera, method(object({
21480
22059
  deviceId: number(),
21481
22060
  status: OsdStatusSchema
21482
22061
  });
22062
+ var VehicleSchema = object({
22063
+ id: string(),
22064
+ name: string(),
22065
+ sampleCount: number().int().nonnegative(),
22066
+ coverMediaKey: string().optional(),
22067
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
22068
+ coverBase64: string().optional()
22069
+ });
22070
+ var VehicleSampleInfoSchema = object({
22071
+ id: string(),
22072
+ /** The plate text this sample enrolled (self-labeling — no embedding). */
22073
+ text: string(),
22074
+ /** OCR confidence of the enrolled read (0..1). */
22075
+ score: number(),
22076
+ addedAt: number().int(),
22077
+ deviceId: number().int().optional(),
22078
+ base64: string().optional()
22079
+ });
21483
22080
  var PlateInfoSchema = object({
21484
22081
  plateId: string(),
21485
22082
  deviceId: number().int(),
@@ -21491,6 +22088,16 @@ var PlateInfoSchema = object({
21491
22088
  score: number(),
21492
22089
  /** True when the text was manually corrected (exempt from retention). */
21493
22090
  corrected: boolean(),
22091
+ /** Recognized vehicle id when a matcher lookup named this read (SQL NULL → absent). */
22092
+ recognizedVehicleId: string().optional(),
22093
+ /** Resolved vehicle name for `recognizedVehicleId` (UI convenience). */
22094
+ vehicleName: string().optional(),
22095
+ /** True once the read was assigned to a vehicle (enrolled as a sample). */
22096
+ assigned: boolean(),
22097
+ /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
22098
+ plateBbox: BoundingBoxSchema.optional(),
22099
+ /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
22100
+ keyFrameMediaKey: string().optional(),
21494
22101
  base64: string().optional()
21495
22102
  });
21496
22103
  var MediaFileLiteSchema = object({
@@ -21530,6 +22137,48 @@ method(object({
21530
22137
  }), method(object({ plateId: string() }), _void(), {
21531
22138
  kind: "mutation",
21532
22139
  auth: "admin"
22140
+ }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
22141
+ kind: "mutation",
22142
+ auth: "admin"
22143
+ }), method(object({
22144
+ id: string(),
22145
+ name: string().min(1)
22146
+ }), _void(), {
22147
+ kind: "mutation",
22148
+ auth: "admin"
22149
+ }), method(object({ id: string() }), _void(), {
22150
+ kind: "mutation",
22151
+ auth: "admin"
22152
+ }), method(object({ vehicleId: string() }), array(VehicleSampleInfoSchema).readonly()), method(object({
22153
+ vehicleId: string(),
22154
+ sampleId: string()
22155
+ }), _void(), {
22156
+ kind: "mutation",
22157
+ auth: "admin"
22158
+ }), method(object({
22159
+ plateId: string(),
22160
+ vehicleId: string()
22161
+ }), _void(), {
22162
+ kind: "mutation",
22163
+ auth: "admin"
22164
+ }), method(object({ plateId: string() }), _void(), {
22165
+ kind: "mutation",
22166
+ auth: "admin"
22167
+ }), method(object({
22168
+ plateIds: array(string()).min(1),
22169
+ vehicleId: string()
22170
+ }), object({
22171
+ assigned: number().int(),
22172
+ failed: array(string()).readonly()
22173
+ }), {
22174
+ kind: "mutation",
22175
+ auth: "admin"
22176
+ }), method(object({ plateIds: array(string()).min(1) }), object({
22177
+ unassigned: number().int(),
22178
+ failed: array(string()).readonly()
22179
+ }), {
22180
+ kind: "mutation",
22181
+ auth: "admin"
21533
22182
  });
21534
22183
  var ModelFormatSchema = _enum(MODEL_FORMATS);
21535
22184
  var HwAccelBackendInputSchema = _enum([
@@ -24075,6 +24724,168 @@ Object.freeze({
24075
24724
  addonId: null,
24076
24725
  access: "create"
24077
24726
  },
24727
+ "llm.deleteModel": {
24728
+ capName: "llm",
24729
+ capScope: "system",
24730
+ addonId: null,
24731
+ access: "delete"
24732
+ },
24733
+ "llm.deleteProfile": {
24734
+ capName: "llm",
24735
+ capScope: "system",
24736
+ addonId: null,
24737
+ access: "delete"
24738
+ },
24739
+ "llm.generate": {
24740
+ capName: "llm",
24741
+ capScope: "system",
24742
+ addonId: null,
24743
+ access: "create"
24744
+ },
24745
+ "llm.generateVision": {
24746
+ capName: "llm",
24747
+ capScope: "system",
24748
+ addonId: null,
24749
+ access: "create"
24750
+ },
24751
+ "llm.getDefaults": {
24752
+ capName: "llm",
24753
+ capScope: "system",
24754
+ addonId: null,
24755
+ access: "view"
24756
+ },
24757
+ "llm.getRuntimeStatus": {
24758
+ capName: "llm",
24759
+ capScope: "system",
24760
+ addonId: null,
24761
+ access: "view"
24762
+ },
24763
+ "llm.getUsage": {
24764
+ capName: "llm",
24765
+ capScope: "system",
24766
+ addonId: null,
24767
+ access: "view"
24768
+ },
24769
+ "llm.installModel": {
24770
+ capName: "llm",
24771
+ capScope: "system",
24772
+ addonId: null,
24773
+ access: "create"
24774
+ },
24775
+ "llm.listModelCatalog": {
24776
+ capName: "llm",
24777
+ capScope: "system",
24778
+ addonId: null,
24779
+ access: "view"
24780
+ },
24781
+ "llm.listModels": {
24782
+ capName: "llm",
24783
+ capScope: "system",
24784
+ addonId: null,
24785
+ access: "view"
24786
+ },
24787
+ "llm.listNodeModels": {
24788
+ capName: "llm",
24789
+ capScope: "system",
24790
+ addonId: null,
24791
+ access: "view"
24792
+ },
24793
+ "llm.listProfileKinds": {
24794
+ capName: "llm",
24795
+ capScope: "system",
24796
+ addonId: null,
24797
+ access: "view"
24798
+ },
24799
+ "llm.listProfiles": {
24800
+ capName: "llm",
24801
+ capScope: "system",
24802
+ addonId: null,
24803
+ access: "view"
24804
+ },
24805
+ "llm.listRuntimeNodes": {
24806
+ capName: "llm",
24807
+ capScope: "system",
24808
+ addonId: null,
24809
+ access: "view"
24810
+ },
24811
+ "llm.setDefault": {
24812
+ capName: "llm",
24813
+ capScope: "system",
24814
+ addonId: null,
24815
+ access: "create"
24816
+ },
24817
+ "llm.startRuntime": {
24818
+ capName: "llm",
24819
+ capScope: "system",
24820
+ addonId: null,
24821
+ access: "create"
24822
+ },
24823
+ "llm.stopRuntime": {
24824
+ capName: "llm",
24825
+ capScope: "system",
24826
+ addonId: null,
24827
+ access: "create"
24828
+ },
24829
+ "llm.testProfile": {
24830
+ capName: "llm",
24831
+ capScope: "system",
24832
+ addonId: null,
24833
+ access: "create"
24834
+ },
24835
+ "llm.upsertProfile": {
24836
+ capName: "llm",
24837
+ capScope: "system",
24838
+ addonId: null,
24839
+ access: "create"
24840
+ },
24841
+ "llmRuntime.complete": {
24842
+ capName: "llm-runtime",
24843
+ capScope: "system",
24844
+ addonId: null,
24845
+ access: "create"
24846
+ },
24847
+ "llmRuntime.deleteModel": {
24848
+ capName: "llm-runtime",
24849
+ capScope: "system",
24850
+ addonId: null,
24851
+ access: "delete"
24852
+ },
24853
+ "llmRuntime.ensureStarted": {
24854
+ capName: "llm-runtime",
24855
+ capScope: "system",
24856
+ addonId: null,
24857
+ access: "create"
24858
+ },
24859
+ "llmRuntime.getDiskUsage": {
24860
+ capName: "llm-runtime",
24861
+ capScope: "system",
24862
+ addonId: null,
24863
+ access: "view"
24864
+ },
24865
+ "llmRuntime.installModel": {
24866
+ capName: "llm-runtime",
24867
+ capScope: "system",
24868
+ addonId: null,
24869
+ access: "create"
24870
+ },
24871
+ "llmRuntime.listLocalModels": {
24872
+ capName: "llm-runtime",
24873
+ capScope: "system",
24874
+ addonId: null,
24875
+ access: "view"
24876
+ },
24877
+ "llmRuntime.status": {
24878
+ capName: "llm-runtime",
24879
+ capScope: "system",
24880
+ addonId: null,
24881
+ access: "view"
24882
+ },
24883
+ "llmRuntime.stop": {
24884
+ capName: "llm-runtime",
24885
+ capScope: "system",
24886
+ addonId: null,
24887
+ access: "create"
24888
+ },
24078
24889
  "localNetwork.getAllowedAddresses": {
24079
24890
  capName: "local-network",
24080
24891
  capScope: "system",
@@ -24705,6 +25516,12 @@ Object.freeze({
24705
25516
  addonId: null,
24706
25517
  access: "delete"
24707
25518
  },
25519
+ "pipelineAnalytics.deleteTracks": {
25520
+ capName: "pipeline-analytics",
25521
+ capScope: "device",
25522
+ addonId: null,
25523
+ access: "delete"
25524
+ },
24708
25525
  "pipelineAnalytics.getActiveTracks": {
24709
25526
  capName: "pipeline-analytics",
24710
25527
  capScope: "device",
@@ -24771,12 +25588,24 @@ Object.freeze({
24771
25588
  addonId: null,
24772
25589
  access: "create"
24773
25590
  },
25591
+ "pipelineAnalytics.pruneTracksBefore": {
25592
+ capName: "pipeline-analytics",
25593
+ capScope: "device",
25594
+ addonId: null,
25595
+ access: "create"
25596
+ },
24774
25597
  "pipelineAnalytics.searchObjectEvents": {
24775
25598
  capName: "pipeline-analytics",
24776
25599
  capScope: "device",
24777
25600
  addonId: null,
24778
25601
  access: "view"
24779
25602
  },
25603
+ "pipelineAnalytics.wipeAllAnalytics": {
25604
+ capName: "pipeline-analytics",
25605
+ capScope: "device",
25606
+ addonId: null,
25607
+ access: "delete"
25608
+ },
24780
25609
  "pipelineExecutor.cacheFrameInPool": {
24781
25610
  capName: "pipeline-executor",
24782
25611
  capScope: "system",
@@ -25281,18 +26110,42 @@ Object.freeze({
25281
26110
  addonId: null,
25282
26111
  access: "create"
25283
26112
  },
26113
+ "plateGallery.assignPlate": {
26114
+ capName: "plate-gallery",
26115
+ capScope: "system",
26116
+ addonId: null,
26117
+ access: "create"
26118
+ },
26119
+ "plateGallery.assignPlates": {
26120
+ capName: "plate-gallery",
26121
+ capScope: "system",
26122
+ addonId: null,
26123
+ access: "create"
26124
+ },
25284
26125
  "plateGallery.correctPlateText": {
25285
26126
  capName: "plate-gallery",
25286
26127
  capScope: "system",
25287
26128
  addonId: null,
25288
26129
  access: "create"
25289
26130
  },
26131
+ "plateGallery.createVehicle": {
26132
+ capName: "plate-gallery",
26133
+ capScope: "system",
26134
+ addonId: null,
26135
+ access: "create"
26136
+ },
25290
26137
  "plateGallery.deletePlate": {
25291
26138
  capName: "plate-gallery",
25292
26139
  capScope: "system",
25293
26140
  addonId: null,
25294
26141
  access: "delete"
25295
26142
  },
26143
+ "plateGallery.deleteVehicle": {
26144
+ capName: "plate-gallery",
26145
+ capScope: "system",
26146
+ addonId: null,
26147
+ access: "delete"
26148
+ },
25296
26149
  "plateGallery.getPlateByTrack": {
25297
26150
  capName: "plate-gallery",
25298
26151
  capScope: "system",
@@ -25311,6 +26164,30 @@ Object.freeze({
25311
26164
  addonId: null,
25312
26165
  access: "view"
25313
26166
  },
26167
+ "plateGallery.listVehicles": {
26168
+ capName: "plate-gallery",
26169
+ capScope: "system",
26170
+ addonId: null,
26171
+ access: "view"
26172
+ },
26173
+ "plateGallery.listVehicleSamples": {
26174
+ capName: "plate-gallery",
26175
+ capScope: "system",
26176
+ addonId: null,
26177
+ access: "view"
26178
+ },
26179
+ "plateGallery.removeVehicleSample": {
26180
+ capName: "plate-gallery",
26181
+ capScope: "system",
26182
+ addonId: null,
26183
+ access: "delete"
26184
+ },
26185
+ "plateGallery.renameVehicle": {
26186
+ capName: "plate-gallery",
26187
+ capScope: "system",
26188
+ addonId: null,
26189
+ access: "create"
26190
+ },
25314
26191
  "plateGallery.searchPlates": {
25315
26192
  capName: "plate-gallery",
25316
26193
  capScope: "system",
@@ -25323,6 +26200,18 @@ Object.freeze({
25323
26200
  addonId: null,
25324
26201
  access: "view"
25325
26202
  },
26203
+ "plateGallery.unassignPlate": {
26204
+ capName: "plate-gallery",
26205
+ capScope: "system",
26206
+ addonId: null,
26207
+ access: "create"
26208
+ },
26209
+ "plateGallery.unassignPlates": {
26210
+ capName: "plate-gallery",
26211
+ capScope: "system",
26212
+ addonId: null,
26213
+ access: "create"
26214
+ },
25326
26215
  "platformProbe.getCapabilities": {
25327
26216
  capName: "platform-probe",
25328
26217
  capScope: "system",
@@ -25515,6 +26404,48 @@ Object.freeze({
25515
26404
  addonId: null,
25516
26405
  access: "create"
25517
26406
  },
26407
+ "sceneMonitor.captureReference": {
26408
+ capName: "scene-monitor",
26409
+ capScope: "device",
26410
+ addonId: null,
26411
+ access: "create"
26412
+ },
26413
+ "sceneMonitor.createScene": {
26414
+ capName: "scene-monitor",
26415
+ capScope: "device",
26416
+ addonId: null,
26417
+ access: "create"
26418
+ },
26419
+ "sceneMonitor.deleteReference": {
26420
+ capName: "scene-monitor",
26421
+ capScope: "device",
26422
+ addonId: null,
26423
+ access: "delete"
26424
+ },
26425
+ "sceneMonitor.deleteScene": {
26426
+ capName: "scene-monitor",
26427
+ capScope: "device",
26428
+ addonId: null,
26429
+ access: "delete"
26430
+ },
26431
+ "sceneMonitor.listScenes": {
26432
+ capName: "scene-monitor",
26433
+ capScope: "device",
26434
+ addonId: null,
26435
+ access: "view"
26436
+ },
26437
+ "sceneMonitor.recheckNow": {
26438
+ capName: "scene-monitor",
26439
+ capScope: "device",
26440
+ addonId: null,
26441
+ access: "create"
26442
+ },
26443
+ "sceneMonitor.updateScene": {
26444
+ capName: "scene-monitor",
26445
+ capScope: "device",
26446
+ addonId: null,
26447
+ access: "create"
26448
+ },
25518
26449
  "scriptRunner.run": {
25519
26450
  capName: "script-runner",
25520
26451
  capScope: "device",
@@ -26599,6 +27530,7 @@ Object.freeze({
26599
27530
  Object.freeze({
26600
27531
  "broker": "broker",
26601
27532
  "device-export": "device-export",
27533
+ "llm": "ai",
26602
27534
  "mesh-network": "mesh",
26603
27535
  "mqtt-broker": "broker",
26604
27536
  "network-access": "ingress",