@camstack/addon-advanced-notifier 1.1.23 → 1.1.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/addon.js +942 -38
  2. package/dist/addon.mjs +942 -38
  3. package/package.json +5 -1
package/dist/addon.js CHANGED
@@ -4291,6 +4291,14 @@ function object(shape, params) {
4291
4291
  ...normalizeParams(params)
4292
4292
  });
4293
4293
  }
4294
+ function looseObject(shape, params) {
4295
+ return new ZodObject({
4296
+ type: "object",
4297
+ shape,
4298
+ catchall: unknown(),
4299
+ ...normalizeParams(params)
4300
+ });
4301
+ }
4294
4302
  var ZodUnion = /*@__PURE__*/ $constructor("ZodUnion", (inst, def) => {
4295
4303
  $ZodUnion.init(inst, def);
4296
4304
  ZodType.init(inst, def);
@@ -4632,7 +4640,7 @@ function _instanceof(cls, params = {}) {
4632
4640
  return inst;
4633
4641
  }
4634
4642
  //#endregion
4635
- //#region ../types/dist/sleep-Baang_XW.mjs
4643
+ //#region ../types/dist/sleep-DkhOVOjW.mjs
4636
4644
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4637
4645
  EventCategory["SystemBoot"] = "system.boot";
4638
4646
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5042,10 +5050,43 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5042
5050
  EventCategory["EnrichmentEmbeddingStored"] = "enrichment.embedding.stored";
5043
5051
  EventCategory["EnrichmentSceneStateChanged"] = "enrichment.scene.state-changed";
5044
5052
  EventCategory["EnrichmentActivitySummary"] = "enrichment.activity.summary";
5053
+ /**
5054
+ * Unified track-lifecycle event: ONE category carrying `phase:
5055
+ * 'start' | 'update' | 'end'` with a rich, typed
5056
+ * `PipelineAnalyticsTrackLifecyclePayload`. Supersedes the thin
5057
+ * `PipelineAnalyticsTrackStarted` / `PipelineAnalyticsTrackEnded`
5058
+ * pair — a consumer subscribes once and branches on `phase`.
5059
+ */
5060
+ EventCategory["PipelineAnalyticsTrackLifecycle"] = "pipeline-analytics.track-lifecycle";
5061
+ /**
5062
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
5063
+ * (`phase:'start'`). Kept as a soft alias — no known subscribers.
5064
+ */
5045
5065
  EventCategory["PipelineAnalyticsTrackStarted"] = "pipeline-analytics.track-started";
5066
+ /**
5067
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
5068
+ * (`phase:'end'`). Kept as a soft alias — no known subscribers.
5069
+ */
5046
5070
  EventCategory["PipelineAnalyticsTrackEnded"] = "pipeline-analytics.track-ended";
5047
5071
  EventCategory["PipelineAnalyticsDetectionEvent"] = "pipeline-analytics.detection-event";
5048
5072
  EventCategory["PipelineAnalyticsFrameTracked"] = "pipeline-analytics.frame-tracked";
5073
+ /**
5074
+ * Fired by `addon-post-analysis` whenever a gallery face row changes:
5075
+ * `kind:'buffered'` a new detected face was persisted, `'assigned'` /
5076
+ * `'unassigned'` its identity link changed, `'deleted'` the row was
5077
+ * removed. Telemetry semantics (D8): a lost event only delays a refresh,
5078
+ * never a correctness issue. Payload `PipelineAnalyticsFaceGalleryChangedPayload`.
5079
+ */
5080
+ EventCategory["PipelineAnalyticsFaceGalleryChanged"] = "pipeline-analytics.face-gallery-changed";
5081
+ /**
5082
+ * Fired by `addon-post-analysis` whenever a gallery plate row changes:
5083
+ * `kind:'buffered'` a new read was persisted (`PlateRecognizer.onTrackEnd`),
5084
+ * `'assigned'` / `'unassigned'` its vehicle link changed
5085
+ * (`PlateGalleryProvider`), `'deleted'` the row was removed. Telemetry
5086
+ * semantics (D8): a lost event only delays a refresh, never a correctness
5087
+ * issue. Payload `PipelineAnalyticsPlateGalleryChangedPayload`.
5088
+ */
5089
+ EventCategory["PipelineAnalyticsPlateGalleryChanged"] = "pipeline-analytics.plate-gallery-changed";
5049
5090
  EventCategory["FrigateLiveEvent"] = "frigate.live-event";
5050
5091
  EventCategory["CameraStreamsProfileSlotsChanged"] = "camera-streams.onProfileSlotsChanged";
5051
5092
  /**
@@ -6874,7 +6915,8 @@ var MODEL_FORMATS = [
6874
6915
  "coreml",
6875
6916
  "openvino",
6876
6917
  "tflite",
6877
- "pt"
6918
+ "pt",
6919
+ "gguf"
6878
6920
  ];
6879
6921
  /**
6880
6922
  * Multi-file format payload.
@@ -6918,7 +6960,8 @@ var ModelFormatsSchema = object({
6918
6960
  coreml: ModelFormatEntrySchema.optional(),
6919
6961
  openvino: ModelFormatEntrySchema.optional(),
6920
6962
  tflite: ModelFormatEntrySchema.optional(),
6921
- pt: ModelFormatEntrySchema.optional()
6963
+ pt: ModelFormatEntrySchema.optional(),
6964
+ gguf: ModelFormatEntrySchema.optional()
6922
6965
  });
6923
6966
  /**
6924
6967
  * Variant-selector grouping axes. Shared by the full `ModelCatalogEntry` and by
@@ -10427,7 +10470,8 @@ var ModelFormatSchema$1 = _enum([
10427
10470
  "coreml",
10428
10471
  "openvino",
10429
10472
  "tflite",
10430
- "pt"
10473
+ "pt",
10474
+ "gguf"
10431
10475
  ]);
10432
10476
  var PipelineSlotSchema = _enum([
10433
10477
  "detector",
@@ -11733,6 +11777,140 @@ DeviceType.Camera, method(object({ deviceId: number() }), PtzAutotrackStatusSche
11733
11777
  deviceId: number(),
11734
11778
  status: PtzAutotrackStatusSchema
11735
11779
  });
11780
+ /**
11781
+ * scene-monitor — device-scoped reference-region state cap. An operator marks
11782
+ * a rect ROI on a camera frame and names one or more states; the engine
11783
+ * (pipeline-analytics, designated post-processing node) reports which state is
11784
+ * active on an ongoing basis. Two operator-selectable check modes share every-
11785
+ * thing except the comparator: `similarity` (CLIP cosine at the same ROI coords
11786
+ * vs condition-tagged references) and `llm` (vision-LLM judgment over the crop).
11787
+ *
11788
+ * D14 device-config archetype (`deviceConfig.ui.kind:'widget'`) — the framework
11789
+ * derives the device-detail contribution; the provider carries NO hand-written
11790
+ * settings-contribution methods. `status.kind:'push'` — the engine pushes on
11791
+ * every hysteresis flip / availability change; consumers never poll.
11792
+ */
11793
+ /** Extensible condition tag. Seeded 'day' | 'night'; open by design so more can
11794
+ * be added without a wire break (matching falls back to any-condition refs). */
11795
+ var SceneConditionSchema = string();
11796
+ /** One captured reference — condition-tagged, model-version-gated. `embedding`
11797
+ * is `number[]` (Float32Array does NOT survive MsgPack/UDS). */
11798
+ var SceneReferenceSchema = object({
11799
+ embedding: array(number()),
11800
+ modelId: string(),
11801
+ condition: SceneConditionSchema,
11802
+ capturedAt: number(),
11803
+ thumbnailMediaId: string().optional()
11804
+ });
11805
+ var SceneMonitorStateSchema = object({
11806
+ id: string(),
11807
+ label: string(),
11808
+ references: array(SceneReferenceSchema),
11809
+ textPrompts: array(string()).optional(),
11810
+ referenceCount: number(),
11811
+ currentlyMatched: boolean()
11812
+ });
11813
+ /** Per-mode comparator params in a discriminated union so an `llm` scene never
11814
+ * carries similarity knobs and vice-versa. */
11815
+ var SceneCheckSchema = discriminatedUnion("mode", [object({
11816
+ mode: literal("similarity"),
11817
+ threshold: number().min(0).max(1),
11818
+ hysteresisCount: number().int().positive()
11819
+ }), object({
11820
+ mode: literal("llm"),
11821
+ prompt: string(),
11822
+ profileId: string().optional(),
11823
+ hysteresisCount: number().int().positive()
11824
+ })]);
11825
+ var SceneMonitorSchema = object({
11826
+ id: string(),
11827
+ label: string(),
11828
+ roi: MaskRectShapeSchema,
11829
+ enabled: boolean(),
11830
+ triggerMode: _enum([
11831
+ "periodic",
11832
+ "on-motion",
11833
+ "both"
11834
+ ]),
11835
+ checkIntervalSec: number().optional(),
11836
+ check: SceneCheckSchema,
11837
+ states: array(SceneMonitorStateSchema),
11838
+ currentStateId: string().nullable(),
11839
+ lastCheckedAt: number().nullable(),
11840
+ lastConfidence: number().nullable(),
11841
+ currentCondition: SceneConditionSchema.nullable(),
11842
+ availability: _enum(["ok", "unavailable"]),
11843
+ unavailableReason: string().nullable()
11844
+ });
11845
+ var SceneMonitorStatusSchema = object({
11846
+ monitors: array(SceneMonitorSchema),
11847
+ lastFetchedAt: number()
11848
+ });
11849
+ DeviceType.Camera, method(object({ deviceId: number() }), SceneMonitorStatusSchema), method(object({
11850
+ deviceId: number(),
11851
+ label: string(),
11852
+ roi: MaskRectShapeSchema,
11853
+ check: SceneCheckSchema,
11854
+ triggerMode: _enum([
11855
+ "periodic",
11856
+ "on-motion",
11857
+ "both"
11858
+ ]).optional(),
11859
+ checkIntervalSec: number().optional()
11860
+ }), SceneMonitorSchema, {
11861
+ kind: "mutation",
11862
+ auth: "admin"
11863
+ }), method(object({
11864
+ deviceId: number(),
11865
+ monitorId: string(),
11866
+ patch: object({
11867
+ label: string().optional(),
11868
+ roi: MaskRectShapeSchema.optional(),
11869
+ enabled: boolean().optional(),
11870
+ triggerMode: _enum([
11871
+ "periodic",
11872
+ "on-motion",
11873
+ "both"
11874
+ ]).optional(),
11875
+ checkIntervalSec: number().optional(),
11876
+ check: SceneCheckSchema.optional()
11877
+ })
11878
+ }), _void(), {
11879
+ kind: "mutation",
11880
+ auth: "admin"
11881
+ }), method(object({
11882
+ deviceId: number(),
11883
+ monitorId: string()
11884
+ }), _void(), {
11885
+ kind: "mutation",
11886
+ auth: "admin"
11887
+ }), method(object({
11888
+ deviceId: number(),
11889
+ monitorId: string(),
11890
+ stateId: string().optional(),
11891
+ label: string().optional(),
11892
+ condition: SceneConditionSchema.optional()
11893
+ }), object({
11894
+ stateId: string(),
11895
+ referenceCount: number()
11896
+ }), {
11897
+ kind: "mutation",
11898
+ auth: "admin"
11899
+ }), method(object({
11900
+ deviceId: number(),
11901
+ monitorId: string(),
11902
+ stateId: string(),
11903
+ index: number()
11904
+ }), _void(), {
11905
+ kind: "mutation",
11906
+ auth: "admin"
11907
+ }), method(object({
11908
+ deviceId: number(),
11909
+ monitorId: string()
11910
+ }), _void(), {
11911
+ kind: "mutation",
11912
+ auth: "admin"
11913
+ });
11736
11914
  object({
11737
11915
  /** Whether the script is currently executing. */
11738
11916
  isRunning: boolean(),
@@ -12754,7 +12932,12 @@ var NotificationRuleConditionsSchema = object({
12754
12932
  clipDescription: object({
12755
12933
  text: string().min(1),
12756
12934
  minSimilarity: number().min(0).max(1)
12757
- }).optional()
12935
+ }).optional(),
12936
+ /** Match events whose recognized-entity label (face identity name or plate
12937
+ * vehicle name, propagated onto `event.data.label`) is one of these values.
12938
+ * Empty/absent → unaffected (back-compat). Enables "notify me when <named
12939
+ * vehicle/person> is seen". */
12940
+ labels: array(string()).readonly().optional()
12758
12941
  });
12759
12942
  var NotificationRuleTemplateSchema = object({
12760
12943
  title: string(),
@@ -13024,11 +13207,19 @@ method(object({
13024
13207
  * login page needs NO change.
13025
13208
  *
13026
13209
  * - `widget` — a Module-Federation widget the login page mounts (via
13027
- * `loadRemoteBundle`) for an in-page ceremony. Covers the passkey
13028
- * login ceremony, which must run `@simplewebauthn/browser` INSIDE the
13029
- * addon bundle. The referenced widget also declares `preAuth: true` in
13030
- * its `addon-widgets-source` catalog entry. `auth.listLoginMethods`
13031
- * stamps a public `bundleUrl` from `addonId` + `bundle`.
13210
+ * `loadRemoteBundle`) for an in-page ceremony. `auth.listLoginMethods`
13211
+ * stamps a public `bundleUrl` from `addonId` + `bundle`. Generic
13212
+ * mechanism kept for future use; no shipped addon uses it on the login
13213
+ * page (the passkey ceremony below runs natively in the shell instead).
13214
+ *
13215
+ * - `passkey` — a declarative WebAuthn ceremony the shell renders
13216
+ * natively (`@simplewebauthn/browser` lives in `addon-admin-ui`, not in
13217
+ * a remotely-loaded bundle). Carries the addon's effective `rpId` /
13218
+ * `origin` (from its `resolveRpID()` / `resolveOrigin()`) so the shell
13219
+ * can gate visibility (IP-literal origin, hostname/rpId mismatch) WITHOUT
13220
+ * fetching any remote code pre-auth. Contribution stays unconditional —
13221
+ * enrollment state is never leaked pre-auth; visibility is a shell
13222
+ * decision.
13032
13223
  *
13033
13224
  * Every contribution carries a `stage`:
13034
13225
  * - `primary` — shown on the first credentials screen (OIDC /
@@ -13042,30 +13233,45 @@ method(object({
13042
13233
  */
13043
13234
  /** When a login method renders in the two-phase login flow. */
13044
13235
  var LoginStageEnum = _enum(["primary", "second-factor"]);
13045
- /** One login-method contribution — redirect button OR pre-auth widget. */
13046
- var LoginMethodContributionSchema = discriminatedUnion("kind", [object({
13047
- kind: literal("redirect"),
13048
- /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
13049
- id: string(),
13050
- /** Operator-facing button label. */
13051
- label: string(),
13052
- /** lucide-react icon name. */
13053
- icon: string().optional(),
13054
- /** Addon-owned HTTP route the button navigates to (GET). */
13055
- startUrl: string(),
13056
- stage: LoginStageEnum
13057
- }), object({
13058
- kind: literal("widget"),
13059
- /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
13060
- id: string(),
13061
- /** Owning addon id drives the public bundle URL + the MF namespace. */
13062
- addonId: string(),
13063
- /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
13064
- bundle: string(),
13065
- /** MF remote descriptor `{ remoteName, exposedModule, componentKey }`. */
13066
- remote: WidgetRemoteSchema,
13067
- stage: LoginStageEnum
13068
- })]);
13236
+ /** One login-method contribution — redirect button, pre-auth widget, or native passkey ceremony. */
13237
+ var LoginMethodContributionSchema = discriminatedUnion("kind", [
13238
+ object({
13239
+ kind: literal("redirect"),
13240
+ /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
13241
+ id: string(),
13242
+ /** Operator-facing button label. */
13243
+ label: string(),
13244
+ /** lucide-react icon name. */
13245
+ icon: string().optional(),
13246
+ /** Addon-owned HTTP route the button navigates to (GET). */
13247
+ startUrl: string(),
13248
+ stage: LoginStageEnum
13249
+ }),
13250
+ object({
13251
+ kind: literal("widget"),
13252
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
13253
+ id: string(),
13254
+ /** Owning addon id — drives the public bundle URL + the MF namespace. */
13255
+ addonId: string(),
13256
+ /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
13257
+ bundle: string(),
13258
+ /** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
13259
+ remote: WidgetRemoteSchema,
13260
+ stage: LoginStageEnum
13261
+ }),
13262
+ object({
13263
+ kind: literal("passkey"),
13264
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-direct-login`). */
13265
+ id: string(),
13266
+ /** Operator-facing button label. */
13267
+ label: string(),
13268
+ stage: LoginStageEnum,
13269
+ /** Effective WebAuthn RP ID (`resolveRpID()`) — the shell gates visibility on it. */
13270
+ rpId: string(),
13271
+ /** Effective expected origin (`resolveOrigin()`), null when unconfigured. */
13272
+ origin: string().nullable()
13273
+ })
13274
+ ]);
13069
13275
  method(_void(), array(LoginMethodContributionSchema).readonly());
13070
13276
  /**
13071
13277
  * Orchestrator-side destination metadata. The orchestrator computes
@@ -14893,14 +15099,14 @@ var TargetKindCapsSchema = object({
14893
15099
  * the union is large and not meant for runtime validation here; the exported
14894
15100
  * `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
14895
15101
  */
14896
- var ConfigSchemaPassthrough = unknown();
15102
+ var ConfigSchemaPassthrough$1 = unknown();
14897
15103
  var TargetKindSchema = object({
14898
15104
  kind: string(),
14899
15105
  label: string(),
14900
15106
  icon: string(),
14901
15107
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
14902
15108
  addonId: string(),
14903
- configSchema: ConfigSchemaPassthrough,
15109
+ configSchema: ConfigSchemaPassthrough$1,
14904
15110
  supportsDiscovery: boolean(),
14905
15111
  caps: TargetKindCapsSchema
14906
15112
  });
@@ -14967,6 +15173,298 @@ var notificationOutputCapability = {
14967
15173
  }
14968
15174
  };
14969
15175
  /**
15176
+ * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
15177
+ * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
15178
+ * caps stay wire-compatible without a circular cap→cap import.
15179
+ *
15180
+ * Errors are a discriminated-union RESULT, never thrown: the shape survives
15181
+ * every transport tier structurally, and failed calls still write usage rows.
15182
+ * Token counts only in v1 — no costUsd (operator decision, 2026-07-15).
15183
+ */
15184
+ var LlmUsageSchema = object({
15185
+ inputTokens: number(),
15186
+ outputTokens: number()
15187
+ });
15188
+ var LlmErrorCodeSchema = _enum([
15189
+ "timeout",
15190
+ "rate-limited",
15191
+ "auth",
15192
+ "refusal",
15193
+ "bad-request",
15194
+ "unavailable",
15195
+ "no-profile",
15196
+ "budget-exceeded",
15197
+ "adapter-error"
15198
+ ]);
15199
+ var LlmGenerateResultSchema = discriminatedUnion("ok", [object({
15200
+ ok: literal(true),
15201
+ text: string(),
15202
+ model: string(),
15203
+ usage: LlmUsageSchema,
15204
+ truncated: boolean(),
15205
+ latencyMs: number()
15206
+ }), object({
15207
+ ok: literal(false),
15208
+ code: LlmErrorCodeSchema,
15209
+ message: string(),
15210
+ retryAfterMs: number().optional()
15211
+ })]);
15212
+ /**
15213
+ * `Uint8Array` is the sanctioned binary convention — superjson + the UDS
15214
+ * MsgPack channel round-trip typed arrays (embedding-encoder.cap.ts:29,
15215
+ * notification-output.cap.ts:27-31 precedents).
15216
+ */
15217
+ var LlmImageSchema = object({
15218
+ bytes: _instanceof(Uint8Array),
15219
+ mimeType: string()
15220
+ });
15221
+ var LlmGenerateBaseInputSchema = object({
15222
+ /** Collection routing (the notification-output posture). */
15223
+ addonId: string().optional(),
15224
+ /** Explicit profile; else the resolution chain (spec §3). */
15225
+ profileId: string().optional(),
15226
+ /** MANDATORY usage tag: 'ai-summary', 'notifier-rules', 'adhoc-ui', … */
15227
+ consumer: string(),
15228
+ system: string().optional(),
15229
+ /** v1: single-turn. `messages[]` is a v2 additive field. */
15230
+ prompt: string(),
15231
+ /** Structured output — adapter-mapped (response_format / forced tool / responseSchema). */
15232
+ jsonSchema: record(string(), unknown()).optional(),
15233
+ /** Per-call override of the profile default. */
15234
+ maxTokens: number().int().positive().optional(),
15235
+ temperature: number().optional()
15236
+ });
15237
+ /**
15238
+ * `llm-runtime` — node-side managed llama.cpp executor (spec §4). Registered
15239
+ * on EVERY node where `addon-ai` is installed; the hub `llm` provider reaches
15240
+ * a specific node's runtime with `nodePin(profile.runtime.nodeId)` — normal
15241
+ * cap routing, zero bespoke plumbing. `internal: true`: the operator reaches
15242
+ * this only through the `llm` cap's methods.
15243
+ *
15244
+ * One running llama-server child per node in v1 (models are RAM-heavy).
15245
+ * Resource ceiling = llama-server flags + idleStopMinutes ONLY (no RSS
15246
+ * watchdog — operator decision #3).
15247
+ */
15248
+ var ManagedModelRefSchema = discriminatedUnion("kind", [
15249
+ object({
15250
+ kind: literal("catalog"),
15251
+ catalogId: string()
15252
+ }),
15253
+ object({
15254
+ kind: literal("url"),
15255
+ url: string(),
15256
+ sha256: string().optional()
15257
+ }),
15258
+ object({
15259
+ kind: literal("path"),
15260
+ path: string()
15261
+ })
15262
+ ]);
15263
+ var ManagedRuntimeConfigSchema = object({
15264
+ /** WHERE the runtime lives — hub or any agent. */
15265
+ nodeId: string(),
15266
+ /** Closed for v1; 'ollama' is a v2 candidate. */
15267
+ engine: _enum(["llama-cpp"]),
15268
+ model: ManagedModelRefSchema,
15269
+ contextSize: number().int().default(4096),
15270
+ /** 0 = CPU-only. */
15271
+ gpuLayers: number().int().default(0),
15272
+ /** Default: cpus-2, clamped ≥1 (resolved node-side). */
15273
+ threads: number().int().optional(),
15274
+ /** Concurrent slots. */
15275
+ parallel: number().int().default(1),
15276
+ /** Else lazy: first generate boots it. */
15277
+ autoStart: boolean().default(false),
15278
+ /** 0 = never; frees RAM after quiet periods. */
15279
+ idleStopMinutes: number().int().default(30)
15280
+ });
15281
+ var LlmRuntimeStatusSchema = object({
15282
+ /** Status is ALWAYS node-qualified. */
15283
+ nodeId: string(),
15284
+ state: _enum([
15285
+ "stopped",
15286
+ "downloading",
15287
+ "starting",
15288
+ "ready",
15289
+ "crashed",
15290
+ "failed"
15291
+ ]),
15292
+ pid: number().optional(),
15293
+ port: number().optional(),
15294
+ modelPath: string().optional(),
15295
+ modelId: string().optional(),
15296
+ downloadProgress: number().min(0).max(1).optional(),
15297
+ lastError: string().optional(),
15298
+ crashesInWindow: number(),
15299
+ /** Child RSS (sampled best-effort). */
15300
+ memoryBytes: number().optional(),
15301
+ vramBytes: number().optional()
15302
+ });
15303
+ var LlmNodeModelSchema = object({
15304
+ file: string(),
15305
+ sizeBytes: number(),
15306
+ catalogId: string().optional(),
15307
+ installedAt: number().optional()
15308
+ });
15309
+ var LlmRuntimeDiskUsageSchema = object({
15310
+ nodeId: string(),
15311
+ modelsBytes: number(),
15312
+ freeBytes: number().optional()
15313
+ });
15314
+ method(LlmGenerateBaseInputSchema.extend({
15315
+ images: array(LlmImageSchema).optional(),
15316
+ runtime: ManagedRuntimeConfigSchema,
15317
+ /** The managed profile's timeout, threaded by the hub provider. */
15318
+ timeoutMs: number().int().positive().optional()
15319
+ }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
15320
+ kind: "mutation",
15321
+ auth: "admin"
15322
+ }), method(object({}), _void(), {
15323
+ kind: "mutation",
15324
+ auth: "admin"
15325
+ }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
15326
+ kind: "mutation",
15327
+ auth: "admin"
15328
+ }), method(object({ file: string() }), _void(), {
15329
+ kind: "mutation",
15330
+ auth: "admin"
15331
+ }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
15332
+ /**
15333
+ * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
15334
+ * methods concat-fan across providers; single-row methods route to ONE
15335
+ * provider by the `addonId` in the call input (the notification-output
15336
+ * posture, notification-output.cap.ts:215-250). Provided by `addon-ai`
15337
+ * (hub-placed); the cap stays open for future providers.
15338
+ *
15339
+ * Profiles are ROWS (data), not addons: one row = one usable model endpoint.
15340
+ * `apiKey` is a password field — providers REDACT it on read and merge on
15341
+ * write; a stored key NEVER round-trips to a client.
15342
+ */
15343
+ var LlmProfileKindSchema = _enum([
15344
+ "openai-compatible",
15345
+ "openai",
15346
+ "anthropic",
15347
+ "google",
15348
+ "managed-local"
15349
+ ]);
15350
+ var LlmProfileSchema = object({
15351
+ id: string(),
15352
+ name: string(),
15353
+ kind: LlmProfileKindSchema,
15354
+ /** Stamped by the provider — keeps the fanned catalog routable. */
15355
+ addonId: string(),
15356
+ enabled: boolean(),
15357
+ /** Vendor model id, or the managed runtime's loaded model. */
15358
+ model: string(),
15359
+ /** Required for openai-compatible; override for cloud kinds. */
15360
+ baseUrl: string().optional(),
15361
+ /** ConfigUISchema type:'password' — never round-trips (spec §5). */
15362
+ apiKey: string().optional(),
15363
+ supportsVision: boolean(),
15364
+ temperature: number().min(0).max(2).optional(),
15365
+ maxTokens: number().int().positive().optional(),
15366
+ timeoutMs: number().int().positive().default(6e4),
15367
+ extraHeaders: record(string(), string()).optional(),
15368
+ /** kind === 'managed-local' only (spec §4). */
15369
+ runtime: ManagedRuntimeConfigSchema.optional()
15370
+ });
15371
+ /** ConfigUISchema tree passed through untyped on the wire (the
15372
+ * notification-output `ConfigSchemaPassthrough` precedent at
15373
+ * notification-output.cap.ts:151); the exported TS type re-tightens it. */
15374
+ var ConfigSchemaPassthrough = unknown();
15375
+ var LlmProfileKindDescriptorSchema = object({
15376
+ kind: LlmProfileKindSchema,
15377
+ label: string(),
15378
+ icon: string(),
15379
+ /** Stamped by each provider so the concat-fanned catalog stays routable. */
15380
+ addonId: string(),
15381
+ configSchema: ConfigSchemaPassthrough
15382
+ });
15383
+ var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
15384
+ var LlmDefaultSchema = object({
15385
+ selector: LlmDefaultSelectorSchema,
15386
+ profileId: string()
15387
+ });
15388
+ /** Server-side rollup row — getUsage never dumps raw call rows (spec §6). */
15389
+ var LlmUsageRollupSchema = object({
15390
+ day: string(),
15391
+ consumer: string(),
15392
+ profileId: string(),
15393
+ calls: number(),
15394
+ okCalls: number(),
15395
+ errorCalls: number(),
15396
+ inputTokens: number(),
15397
+ outputTokens: number(),
15398
+ avgLatencyMs: number()
15399
+ });
15400
+ /** LLM-facing view over the reused ModelCatalogEntry mechanism (spec §4.2). */
15401
+ var ManagedModelCatalogEntrySchema = object({
15402
+ id: string(),
15403
+ label: string(),
15404
+ family: string(),
15405
+ purpose: _enum(["text", "vision"]),
15406
+ url: string(),
15407
+ sha256: string(),
15408
+ sizeBytes: number(),
15409
+ quantization: string(),
15410
+ /** Load-time guidance shown in the picker. */
15411
+ minRamBytes: number(),
15412
+ contextSizeDefault: number().int(),
15413
+ /** Vision models: companion projector file. */
15414
+ mmprojUrl: string().optional()
15415
+ });
15416
+ var LlmRuntimeNodeSchema = object({
15417
+ nodeId: string(),
15418
+ reachable: boolean(),
15419
+ status: LlmRuntimeStatusSchema.optional(),
15420
+ disk: LlmRuntimeDiskUsageSchema.optional(),
15421
+ error: string().optional()
15422
+ });
15423
+ var GenerateVisionInputSchema = LlmGenerateBaseInputSchema.extend({ images: array(LlmImageSchema).min(1) });
15424
+ var ProfileRefInputSchema = object({
15425
+ addonId: string(),
15426
+ profileId: string()
15427
+ });
15428
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
15429
+ kind: "mutation",
15430
+ auth: "admin"
15431
+ }), method(ProfileRefInputSchema, _void(), {
15432
+ kind: "mutation",
15433
+ auth: "admin"
15434
+ }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
15435
+ kind: "mutation",
15436
+ auth: "admin"
15437
+ }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
15438
+ selector: LlmDefaultSelectorSchema,
15439
+ profileId: string().nullable()
15440
+ }), _void(), {
15441
+ kind: "mutation",
15442
+ auth: "admin"
15443
+ }), method(object({
15444
+ since: number().optional(),
15445
+ until: number().optional(),
15446
+ consumer: string().optional(),
15447
+ profileId: string().optional()
15448
+ }), array(LlmUsageRollupSchema)), method(object({}), array(ManagedModelCatalogEntrySchema)), method(object({}), array(LlmRuntimeNodeSchema)), method(object({ nodeId: string() }), array(LlmNodeModelSchema)), method(object({
15449
+ nodeId: string(),
15450
+ model: ManagedModelRefSchema
15451
+ }), _void(), {
15452
+ kind: "mutation",
15453
+ auth: "admin"
15454
+ }), method(object({
15455
+ nodeId: string(),
15456
+ file: string()
15457
+ }), _void(), {
15458
+ kind: "mutation",
15459
+ auth: "admin"
15460
+ }), method(ProfileRefInputSchema, LlmRuntimeStatusSchema), method(ProfileRefInputSchema, LlmRuntimeStatusSchema, {
15461
+ kind: "mutation",
15462
+ auth: "admin"
15463
+ }), method(ProfileRefInputSchema, _void(), {
15464
+ kind: "mutation",
15465
+ auth: "admin"
15466
+ });
15467
+ /**
14970
15468
  * Zod schemas for persisted record types.
14971
15469
  *
14972
15470
  * These schemas serve as the single source of truth for types that are
@@ -15182,6 +15680,10 @@ var TrackSchema = object({
15182
15680
  snapshots: array(TrackSnapshotSchema).readonly(),
15183
15681
  /** Deduplicated zones the track has entered at least once. */
15184
15682
  zonesVisited: array(string()).readonly(),
15683
+ /** Deduplicated set of detector classes observed for this track over its
15684
+ * life (a track may be reclassified, e.g. person→vehicle). Absent on
15685
+ * legacy rows written before class accumulation shipped. */
15686
+ classes: array(string()).readonly().optional(),
15185
15687
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
15186
15688
  totalDistance: number(),
15187
15689
  state: TrackStateSchema,
@@ -15343,7 +15845,7 @@ var KeyEventSchema = object({
15343
15845
  /** Track lifetime in ms (lastSeen - firstSeen). */
15344
15846
  windowMs: number().optional()
15345
15847
  });
15346
- var TrackedDetectionSchema = object({
15848
+ object({
15347
15849
  trackId: string(),
15348
15850
  className: string(),
15349
15851
  confidence: number(),
@@ -15351,6 +15853,23 @@ var TrackedDetectionSchema = object({
15351
15853
  zones: array(string()).readonly(),
15352
15854
  state: TrackStateSchema
15353
15855
  });
15856
+ var OverlayDetectionSchema = looseObject({
15857
+ id: string(),
15858
+ kind: _enum(["first-level", "detail"]),
15859
+ macroClass: string(),
15860
+ score: number(),
15861
+ bbox: object({
15862
+ x: number(),
15863
+ y: number(),
15864
+ width: number(),
15865
+ height: number()
15866
+ }),
15867
+ labels: array(looseObject({
15868
+ label: string(),
15869
+ score: number()
15870
+ })).readonly(),
15871
+ parentId: string().optional()
15872
+ });
15354
15873
  var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: number() });
15355
15874
  var SearchObjectEventsInput = object({
15356
15875
  text: string(),
@@ -15361,6 +15880,20 @@ var SearchObjectEventsInput = object({
15361
15880
  limit: number().default(50),
15362
15881
  minScore: number().min(0).max(1).default(.2)
15363
15882
  });
15883
+ var TrackCascadeCountsSchema = object({
15884
+ /** Persisted track roots deleted (authoritative). */
15885
+ tracks: number().int(),
15886
+ /** Object events removed with their tracks (best-effort; see note above). */
15887
+ events: number().int(),
15888
+ /** Track/face/plate-owned media removed (best-effort). Never identity media. */
15889
+ media: number().int(),
15890
+ /** Unassigned (non-enrolled) face reads removed (best-effort). */
15891
+ faces: number().int(),
15892
+ /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
15893
+ plates: number().int(),
15894
+ /** Per-track CLIP search vectors removed (best-effort). */
15895
+ embeddings: number().int()
15896
+ });
15364
15897
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
15365
15898
  deviceId: number(),
15366
15899
  trackId: string()
@@ -15392,6 +15925,24 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
15392
15925
  }), {
15393
15926
  kind: "mutation",
15394
15927
  auth: "admin"
15928
+ }), method(object({
15929
+ deviceId: number(),
15930
+ cutoffMs: number()
15931
+ }), TrackCascadeCountsSchema, {
15932
+ kind: "mutation",
15933
+ auth: "admin"
15934
+ }), method(object({ deviceId: number() }), TrackCascadeCountsSchema, {
15935
+ kind: "mutation",
15936
+ auth: "admin"
15937
+ }), method(object({
15938
+ deviceId: number(),
15939
+ trackIds: array(string()).min(1)
15940
+ }), object({
15941
+ deleted: number().int(),
15942
+ failed: array(string()).readonly()
15943
+ }), {
15944
+ kind: "mutation",
15945
+ auth: "admin"
15395
15946
  }), method(object({
15396
15947
  eventId: string(),
15397
15948
  kind: MediaFileKindEnum.optional()
@@ -15400,7 +15951,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
15400
15951
  timestamp: number(),
15401
15952
  frameWidth: number(),
15402
15953
  frameHeight: number(),
15403
- detections: array(TrackedDetectionSchema).readonly()
15954
+ detections: array(OverlayDetectionSchema).readonly()
15404
15955
  }), object({
15405
15956
  deviceId: number(),
15406
15957
  trackId: string(),
@@ -18169,6 +18720,24 @@ DeviceType.Camera, method(object({
18169
18720
  deviceId: number(),
18170
18721
  status: OsdStatusSchema
18171
18722
  });
18723
+ var VehicleSchema = object({
18724
+ id: string(),
18725
+ name: string(),
18726
+ sampleCount: number().int().nonnegative(),
18727
+ coverMediaKey: string().optional(),
18728
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
18729
+ coverBase64: string().optional()
18730
+ });
18731
+ var VehicleSampleInfoSchema = object({
18732
+ id: string(),
18733
+ /** The plate text this sample enrolled (self-labeling — no embedding). */
18734
+ text: string(),
18735
+ /** OCR confidence of the enrolled read (0..1). */
18736
+ score: number(),
18737
+ addedAt: number().int(),
18738
+ deviceId: number().int().optional(),
18739
+ base64: string().optional()
18740
+ });
18172
18741
  var PlateInfoSchema = object({
18173
18742
  plateId: string(),
18174
18743
  deviceId: number().int(),
@@ -18180,6 +18749,16 @@ var PlateInfoSchema = object({
18180
18749
  score: number(),
18181
18750
  /** True when the text was manually corrected (exempt from retention). */
18182
18751
  corrected: boolean(),
18752
+ /** Recognized vehicle id when a matcher lookup named this read (SQL NULL → absent). */
18753
+ recognizedVehicleId: string().optional(),
18754
+ /** Resolved vehicle name for `recognizedVehicleId` (UI convenience). */
18755
+ vehicleName: string().optional(),
18756
+ /** True once the read was assigned to a vehicle (enrolled as a sample). */
18757
+ assigned: boolean(),
18758
+ /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
18759
+ plateBbox: BoundingBoxSchema.optional(),
18760
+ /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
18761
+ keyFrameMediaKey: string().optional(),
18183
18762
  base64: string().optional()
18184
18763
  });
18185
18764
  var MediaFileLiteSchema = object({
@@ -18219,6 +18798,48 @@ method(object({
18219
18798
  }), method(object({ plateId: string() }), _void(), {
18220
18799
  kind: "mutation",
18221
18800
  auth: "admin"
18801
+ }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
18802
+ kind: "mutation",
18803
+ auth: "admin"
18804
+ }), method(object({
18805
+ id: string(),
18806
+ name: string().min(1)
18807
+ }), _void(), {
18808
+ kind: "mutation",
18809
+ auth: "admin"
18810
+ }), method(object({ id: string() }), _void(), {
18811
+ kind: "mutation",
18812
+ auth: "admin"
18813
+ }), method(object({ vehicleId: string() }), array(VehicleSampleInfoSchema).readonly()), method(object({
18814
+ vehicleId: string(),
18815
+ sampleId: string()
18816
+ }), _void(), {
18817
+ kind: "mutation",
18818
+ auth: "admin"
18819
+ }), method(object({
18820
+ plateId: string(),
18821
+ vehicleId: string()
18822
+ }), _void(), {
18823
+ kind: "mutation",
18824
+ auth: "admin"
18825
+ }), method(object({ plateId: string() }), _void(), {
18826
+ kind: "mutation",
18827
+ auth: "admin"
18828
+ }), method(object({
18829
+ plateIds: array(string()).min(1),
18830
+ vehicleId: string()
18831
+ }), object({
18832
+ assigned: number().int(),
18833
+ failed: array(string()).readonly()
18834
+ }), {
18835
+ kind: "mutation",
18836
+ auth: "admin"
18837
+ }), method(object({ plateIds: array(string()).min(1) }), object({
18838
+ unassigned: number().int(),
18839
+ failed: array(string()).readonly()
18840
+ }), {
18841
+ kind: "mutation",
18842
+ auth: "admin"
18222
18843
  });
18223
18844
  var ModelFormatSchema = _enum(MODEL_FORMATS);
18224
18845
  var HwAccelBackendInputSchema = _enum([
@@ -20764,6 +21385,168 @@ Object.freeze({
20764
21385
  addonId: null,
20765
21386
  access: "create"
20766
21387
  },
21388
+ "llm.deleteModel": {
21389
+ capName: "llm",
21390
+ capScope: "system",
21391
+ addonId: null,
21392
+ access: "delete"
21393
+ },
21394
+ "llm.deleteProfile": {
21395
+ capName: "llm",
21396
+ capScope: "system",
21397
+ addonId: null,
21398
+ access: "delete"
21399
+ },
21400
+ "llm.generate": {
21401
+ capName: "llm",
21402
+ capScope: "system",
21403
+ addonId: null,
21404
+ access: "create"
21405
+ },
21406
+ "llm.generateVision": {
21407
+ capName: "llm",
21408
+ capScope: "system",
21409
+ addonId: null,
21410
+ access: "create"
21411
+ },
21412
+ "llm.getDefaults": {
21413
+ capName: "llm",
21414
+ capScope: "system",
21415
+ addonId: null,
21416
+ access: "view"
21417
+ },
21418
+ "llm.getRuntimeStatus": {
21419
+ capName: "llm",
21420
+ capScope: "system",
21421
+ addonId: null,
21422
+ access: "view"
21423
+ },
21424
+ "llm.getUsage": {
21425
+ capName: "llm",
21426
+ capScope: "system",
21427
+ addonId: null,
21428
+ access: "view"
21429
+ },
21430
+ "llm.installModel": {
21431
+ capName: "llm",
21432
+ capScope: "system",
21433
+ addonId: null,
21434
+ access: "create"
21435
+ },
21436
+ "llm.listModelCatalog": {
21437
+ capName: "llm",
21438
+ capScope: "system",
21439
+ addonId: null,
21440
+ access: "view"
21441
+ },
21442
+ "llm.listModels": {
21443
+ capName: "llm",
21444
+ capScope: "system",
21445
+ addonId: null,
21446
+ access: "view"
21447
+ },
21448
+ "llm.listNodeModels": {
21449
+ capName: "llm",
21450
+ capScope: "system",
21451
+ addonId: null,
21452
+ access: "view"
21453
+ },
21454
+ "llm.listProfileKinds": {
21455
+ capName: "llm",
21456
+ capScope: "system",
21457
+ addonId: null,
21458
+ access: "view"
21459
+ },
21460
+ "llm.listProfiles": {
21461
+ capName: "llm",
21462
+ capScope: "system",
21463
+ addonId: null,
21464
+ access: "view"
21465
+ },
21466
+ "llm.listRuntimeNodes": {
21467
+ capName: "llm",
21468
+ capScope: "system",
21469
+ addonId: null,
21470
+ access: "view"
21471
+ },
21472
+ "llm.setDefault": {
21473
+ capName: "llm",
21474
+ capScope: "system",
21475
+ addonId: null,
21476
+ access: "create"
21477
+ },
21478
+ "llm.startRuntime": {
21479
+ capName: "llm",
21480
+ capScope: "system",
21481
+ addonId: null,
21482
+ access: "create"
21483
+ },
21484
+ "llm.stopRuntime": {
21485
+ capName: "llm",
21486
+ capScope: "system",
21487
+ addonId: null,
21488
+ access: "create"
21489
+ },
21490
+ "llm.testProfile": {
21491
+ capName: "llm",
21492
+ capScope: "system",
21493
+ addonId: null,
21494
+ access: "create"
21495
+ },
21496
+ "llm.upsertProfile": {
21497
+ capName: "llm",
21498
+ capScope: "system",
21499
+ addonId: null,
21500
+ access: "create"
21501
+ },
21502
+ "llmRuntime.complete": {
21503
+ capName: "llm-runtime",
21504
+ capScope: "system",
21505
+ addonId: null,
21506
+ access: "create"
21507
+ },
21508
+ "llmRuntime.deleteModel": {
21509
+ capName: "llm-runtime",
21510
+ capScope: "system",
21511
+ addonId: null,
21512
+ access: "delete"
21513
+ },
21514
+ "llmRuntime.ensureStarted": {
21515
+ capName: "llm-runtime",
21516
+ capScope: "system",
21517
+ addonId: null,
21518
+ access: "create"
21519
+ },
21520
+ "llmRuntime.getDiskUsage": {
21521
+ capName: "llm-runtime",
21522
+ capScope: "system",
21523
+ addonId: null,
21524
+ access: "view"
21525
+ },
21526
+ "llmRuntime.installModel": {
21527
+ capName: "llm-runtime",
21528
+ capScope: "system",
21529
+ addonId: null,
21530
+ access: "create"
21531
+ },
21532
+ "llmRuntime.listLocalModels": {
21533
+ capName: "llm-runtime",
21534
+ capScope: "system",
21535
+ addonId: null,
21536
+ access: "view"
21537
+ },
21538
+ "llmRuntime.status": {
21539
+ capName: "llm-runtime",
21540
+ capScope: "system",
21541
+ addonId: null,
21542
+ access: "view"
21543
+ },
21544
+ "llmRuntime.stop": {
21545
+ capName: "llm-runtime",
21546
+ capScope: "system",
21547
+ addonId: null,
21548
+ access: "create"
21549
+ },
20767
21550
  "localNetwork.getAllowedAddresses": {
20768
21551
  capName: "local-network",
20769
21552
  capScope: "system",
@@ -21394,6 +22177,12 @@ Object.freeze({
21394
22177
  addonId: null,
21395
22178
  access: "delete"
21396
22179
  },
22180
+ "pipelineAnalytics.deleteTracks": {
22181
+ capName: "pipeline-analytics",
22182
+ capScope: "device",
22183
+ addonId: null,
22184
+ access: "delete"
22185
+ },
21397
22186
  "pipelineAnalytics.getActiveTracks": {
21398
22187
  capName: "pipeline-analytics",
21399
22188
  capScope: "device",
@@ -21460,12 +22249,24 @@ Object.freeze({
21460
22249
  addonId: null,
21461
22250
  access: "create"
21462
22251
  },
22252
+ "pipelineAnalytics.pruneTracksBefore": {
22253
+ capName: "pipeline-analytics",
22254
+ capScope: "device",
22255
+ addonId: null,
22256
+ access: "create"
22257
+ },
21463
22258
  "pipelineAnalytics.searchObjectEvents": {
21464
22259
  capName: "pipeline-analytics",
21465
22260
  capScope: "device",
21466
22261
  addonId: null,
21467
22262
  access: "view"
21468
22263
  },
22264
+ "pipelineAnalytics.wipeAllAnalytics": {
22265
+ capName: "pipeline-analytics",
22266
+ capScope: "device",
22267
+ addonId: null,
22268
+ access: "delete"
22269
+ },
21469
22270
  "pipelineExecutor.cacheFrameInPool": {
21470
22271
  capName: "pipeline-executor",
21471
22272
  capScope: "system",
@@ -21970,18 +22771,42 @@ Object.freeze({
21970
22771
  addonId: null,
21971
22772
  access: "create"
21972
22773
  },
22774
+ "plateGallery.assignPlate": {
22775
+ capName: "plate-gallery",
22776
+ capScope: "system",
22777
+ addonId: null,
22778
+ access: "create"
22779
+ },
22780
+ "plateGallery.assignPlates": {
22781
+ capName: "plate-gallery",
22782
+ capScope: "system",
22783
+ addonId: null,
22784
+ access: "create"
22785
+ },
21973
22786
  "plateGallery.correctPlateText": {
21974
22787
  capName: "plate-gallery",
21975
22788
  capScope: "system",
21976
22789
  addonId: null,
21977
22790
  access: "create"
21978
22791
  },
22792
+ "plateGallery.createVehicle": {
22793
+ capName: "plate-gallery",
22794
+ capScope: "system",
22795
+ addonId: null,
22796
+ access: "create"
22797
+ },
21979
22798
  "plateGallery.deletePlate": {
21980
22799
  capName: "plate-gallery",
21981
22800
  capScope: "system",
21982
22801
  addonId: null,
21983
22802
  access: "delete"
21984
22803
  },
22804
+ "plateGallery.deleteVehicle": {
22805
+ capName: "plate-gallery",
22806
+ capScope: "system",
22807
+ addonId: null,
22808
+ access: "delete"
22809
+ },
21985
22810
  "plateGallery.getPlateByTrack": {
21986
22811
  capName: "plate-gallery",
21987
22812
  capScope: "system",
@@ -22000,6 +22825,30 @@ Object.freeze({
22000
22825
  addonId: null,
22001
22826
  access: "view"
22002
22827
  },
22828
+ "plateGallery.listVehicles": {
22829
+ capName: "plate-gallery",
22830
+ capScope: "system",
22831
+ addonId: null,
22832
+ access: "view"
22833
+ },
22834
+ "plateGallery.listVehicleSamples": {
22835
+ capName: "plate-gallery",
22836
+ capScope: "system",
22837
+ addonId: null,
22838
+ access: "view"
22839
+ },
22840
+ "plateGallery.removeVehicleSample": {
22841
+ capName: "plate-gallery",
22842
+ capScope: "system",
22843
+ addonId: null,
22844
+ access: "delete"
22845
+ },
22846
+ "plateGallery.renameVehicle": {
22847
+ capName: "plate-gallery",
22848
+ capScope: "system",
22849
+ addonId: null,
22850
+ access: "create"
22851
+ },
22003
22852
  "plateGallery.searchPlates": {
22004
22853
  capName: "plate-gallery",
22005
22854
  capScope: "system",
@@ -22012,6 +22861,18 @@ Object.freeze({
22012
22861
  addonId: null,
22013
22862
  access: "view"
22014
22863
  },
22864
+ "plateGallery.unassignPlate": {
22865
+ capName: "plate-gallery",
22866
+ capScope: "system",
22867
+ addonId: null,
22868
+ access: "create"
22869
+ },
22870
+ "plateGallery.unassignPlates": {
22871
+ capName: "plate-gallery",
22872
+ capScope: "system",
22873
+ addonId: null,
22874
+ access: "create"
22875
+ },
22015
22876
  "platformProbe.getCapabilities": {
22016
22877
  capName: "platform-probe",
22017
22878
  capScope: "system",
@@ -22204,6 +23065,48 @@ Object.freeze({
22204
23065
  addonId: null,
22205
23066
  access: "create"
22206
23067
  },
23068
+ "sceneMonitor.captureReference": {
23069
+ capName: "scene-monitor",
23070
+ capScope: "device",
23071
+ addonId: null,
23072
+ access: "create"
23073
+ },
23074
+ "sceneMonitor.createScene": {
23075
+ capName: "scene-monitor",
23076
+ capScope: "device",
23077
+ addonId: null,
23078
+ access: "create"
23079
+ },
23080
+ "sceneMonitor.deleteReference": {
23081
+ capName: "scene-monitor",
23082
+ capScope: "device",
23083
+ addonId: null,
23084
+ access: "delete"
23085
+ },
23086
+ "sceneMonitor.deleteScene": {
23087
+ capName: "scene-monitor",
23088
+ capScope: "device",
23089
+ addonId: null,
23090
+ access: "delete"
23091
+ },
23092
+ "sceneMonitor.listScenes": {
23093
+ capName: "scene-monitor",
23094
+ capScope: "device",
23095
+ addonId: null,
23096
+ access: "view"
23097
+ },
23098
+ "sceneMonitor.recheckNow": {
23099
+ capName: "scene-monitor",
23100
+ capScope: "device",
23101
+ addonId: null,
23102
+ access: "create"
23103
+ },
23104
+ "sceneMonitor.updateScene": {
23105
+ capName: "scene-monitor",
23106
+ capScope: "device",
23107
+ addonId: null,
23108
+ access: "create"
23109
+ },
22207
23110
  "scriptRunner.run": {
22208
23111
  capName: "script-runner",
22209
23112
  capScope: "device",
@@ -23288,6 +24191,7 @@ Object.freeze({
23288
24191
  Object.freeze({
23289
24192
  "broker": "broker",
23290
24193
  "device-export": "device-export",
24194
+ "llm": "ai",
23291
24195
  "mesh-network": "mesh",
23292
24196
  "mqtt-broker": "broker",
23293
24197
  "network-access": "ingress",