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