@camstack/addon-pipeline-orchestrator 1.1.45 → 1.1.46

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.
package/dist/index.js CHANGED
@@ -4317,6 +4317,14 @@ function object(shape, params) {
4317
4317
  ...normalizeParams(params)
4318
4318
  });
4319
4319
  }
4320
+ function looseObject(shape, params) {
4321
+ return new ZodObject({
4322
+ type: "object",
4323
+ shape,
4324
+ catchall: unknown(),
4325
+ ...normalizeParams(params)
4326
+ });
4327
+ }
4320
4328
  var ZodUnion = /*@__PURE__*/ $constructor("ZodUnion", (inst, def) => {
4321
4329
  $ZodUnion.init(inst, def);
4322
4330
  ZodType.init(inst, def);
@@ -4658,7 +4666,7 @@ function _instanceof(cls, params = {}) {
4658
4666
  return inst;
4659
4667
  }
4660
4668
  //#endregion
4661
- //#region ../types/dist/sleep-Baang_XW.mjs
4669
+ //#region ../types/dist/sleep-DkhOVOjW.mjs
4662
4670
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4663
4671
  EventCategory["SystemBoot"] = "system.boot";
4664
4672
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5068,10 +5076,43 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5068
5076
  EventCategory["EnrichmentEmbeddingStored"] = "enrichment.embedding.stored";
5069
5077
  EventCategory["EnrichmentSceneStateChanged"] = "enrichment.scene.state-changed";
5070
5078
  EventCategory["EnrichmentActivitySummary"] = "enrichment.activity.summary";
5079
+ /**
5080
+ * Unified track-lifecycle event: ONE category carrying `phase:
5081
+ * 'start' | 'update' | 'end'` with a rich, typed
5082
+ * `PipelineAnalyticsTrackLifecyclePayload`. Supersedes the thin
5083
+ * `PipelineAnalyticsTrackStarted` / `PipelineAnalyticsTrackEnded`
5084
+ * pair — a consumer subscribes once and branches on `phase`.
5085
+ */
5086
+ EventCategory["PipelineAnalyticsTrackLifecycle"] = "pipeline-analytics.track-lifecycle";
5087
+ /**
5088
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
5089
+ * (`phase:'start'`). Kept as a soft alias — no known subscribers.
5090
+ */
5071
5091
  EventCategory["PipelineAnalyticsTrackStarted"] = "pipeline-analytics.track-started";
5092
+ /**
5093
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
5094
+ * (`phase:'end'`). Kept as a soft alias — no known subscribers.
5095
+ */
5072
5096
  EventCategory["PipelineAnalyticsTrackEnded"] = "pipeline-analytics.track-ended";
5073
5097
  EventCategory["PipelineAnalyticsDetectionEvent"] = "pipeline-analytics.detection-event";
5074
5098
  EventCategory["PipelineAnalyticsFrameTracked"] = "pipeline-analytics.frame-tracked";
5099
+ /**
5100
+ * Fired by `addon-post-analysis` whenever a gallery face row changes:
5101
+ * `kind:'buffered'` a new detected face was persisted, `'assigned'` /
5102
+ * `'unassigned'` its identity link changed, `'deleted'` the row was
5103
+ * removed. Telemetry semantics (D8): a lost event only delays a refresh,
5104
+ * never a correctness issue. Payload `PipelineAnalyticsFaceGalleryChangedPayload`.
5105
+ */
5106
+ EventCategory["PipelineAnalyticsFaceGalleryChanged"] = "pipeline-analytics.face-gallery-changed";
5107
+ /**
5108
+ * Fired by `addon-post-analysis` whenever a gallery plate row changes:
5109
+ * `kind:'buffered'` a new read was persisted (`PlateRecognizer.onTrackEnd`),
5110
+ * `'assigned'` / `'unassigned'` its vehicle link changed
5111
+ * (`PlateGalleryProvider`), `'deleted'` the row was removed. Telemetry
5112
+ * semantics (D8): a lost event only delays a refresh, never a correctness
5113
+ * issue. Payload `PipelineAnalyticsPlateGalleryChangedPayload`.
5114
+ */
5115
+ EventCategory["PipelineAnalyticsPlateGalleryChanged"] = "pipeline-analytics.plate-gallery-changed";
5075
5116
  EventCategory["FrigateLiveEvent"] = "frigate.live-event";
5076
5117
  EventCategory["CameraStreamsProfileSlotsChanged"] = "camera-streams.onProfileSlotsChanged";
5077
5118
  /**
@@ -7328,7 +7369,8 @@ var MODEL_FORMATS = [
7328
7369
  "coreml",
7329
7370
  "openvino",
7330
7371
  "tflite",
7331
- "pt"
7372
+ "pt",
7373
+ "gguf"
7332
7374
  ];
7333
7375
  /**
7334
7376
  * Multi-file format payload.
@@ -7372,7 +7414,8 @@ var ModelFormatsSchema = object({
7372
7414
  coreml: ModelFormatEntrySchema.optional(),
7373
7415
  openvino: ModelFormatEntrySchema.optional(),
7374
7416
  tflite: ModelFormatEntrySchema.optional(),
7375
- pt: ModelFormatEntrySchema.optional()
7417
+ pt: ModelFormatEntrySchema.optional(),
7418
+ gguf: ModelFormatEntrySchema.optional()
7376
7419
  });
7377
7420
  /**
7378
7421
  * Variant-selector grouping axes. Shared by the full `ModelCatalogEntry` and by
@@ -10928,7 +10971,8 @@ var ModelFormatSchema$1 = _enum([
10928
10971
  "coreml",
10929
10972
  "openvino",
10930
10973
  "tflite",
10931
- "pt"
10974
+ "pt",
10975
+ "gguf"
10932
10976
  ]);
10933
10977
  var PipelineSlotSchema = _enum([
10934
10978
  "detector",
@@ -12554,6 +12598,140 @@ DeviceType.Camera, method(object({ deviceId: number() }), PtzAutotrackStatusSche
12554
12598
  deviceId: number(),
12555
12599
  status: PtzAutotrackStatusSchema
12556
12600
  });
12601
+ /**
12602
+ * scene-monitor — device-scoped reference-region state cap. An operator marks
12603
+ * a rect ROI on a camera frame and names one or more states; the engine
12604
+ * (pipeline-analytics, designated post-processing node) reports which state is
12605
+ * active on an ongoing basis. Two operator-selectable check modes share every-
12606
+ * thing except the comparator: `similarity` (CLIP cosine at the same ROI coords
12607
+ * vs condition-tagged references) and `llm` (vision-LLM judgment over the crop).
12608
+ *
12609
+ * D14 device-config archetype (`deviceConfig.ui.kind:'widget'`) — the framework
12610
+ * derives the device-detail contribution; the provider carries NO hand-written
12611
+ * settings-contribution methods. `status.kind:'push'` — the engine pushes on
12612
+ * every hysteresis flip / availability change; consumers never poll.
12613
+ */
12614
+ /** Extensible condition tag. Seeded 'day' | 'night'; open by design so more can
12615
+ * be added without a wire break (matching falls back to any-condition refs). */
12616
+ var SceneConditionSchema = string();
12617
+ /** One captured reference — condition-tagged, model-version-gated. `embedding`
12618
+ * is `number[]` (Float32Array does NOT survive MsgPack/UDS). */
12619
+ var SceneReferenceSchema = object({
12620
+ embedding: array(number()),
12621
+ modelId: string(),
12622
+ condition: SceneConditionSchema,
12623
+ capturedAt: number(),
12624
+ thumbnailMediaId: string().optional()
12625
+ });
12626
+ var SceneMonitorStateSchema = object({
12627
+ id: string(),
12628
+ label: string(),
12629
+ references: array(SceneReferenceSchema),
12630
+ textPrompts: array(string()).optional(),
12631
+ referenceCount: number(),
12632
+ currentlyMatched: boolean()
12633
+ });
12634
+ /** Per-mode comparator params in a discriminated union so an `llm` scene never
12635
+ * carries similarity knobs and vice-versa. */
12636
+ var SceneCheckSchema = discriminatedUnion("mode", [object({
12637
+ mode: literal("similarity"),
12638
+ threshold: number().min(0).max(1),
12639
+ hysteresisCount: number().int().positive()
12640
+ }), object({
12641
+ mode: literal("llm"),
12642
+ prompt: string(),
12643
+ profileId: string().optional(),
12644
+ hysteresisCount: number().int().positive()
12645
+ })]);
12646
+ var SceneMonitorSchema = object({
12647
+ id: string(),
12648
+ label: string(),
12649
+ roi: MaskRectShapeSchema,
12650
+ enabled: boolean(),
12651
+ triggerMode: _enum([
12652
+ "periodic",
12653
+ "on-motion",
12654
+ "both"
12655
+ ]),
12656
+ checkIntervalSec: number().optional(),
12657
+ check: SceneCheckSchema,
12658
+ states: array(SceneMonitorStateSchema),
12659
+ currentStateId: string().nullable(),
12660
+ lastCheckedAt: number().nullable(),
12661
+ lastConfidence: number().nullable(),
12662
+ currentCondition: SceneConditionSchema.nullable(),
12663
+ availability: _enum(["ok", "unavailable"]),
12664
+ unavailableReason: string().nullable()
12665
+ });
12666
+ var SceneMonitorStatusSchema = object({
12667
+ monitors: array(SceneMonitorSchema),
12668
+ lastFetchedAt: number()
12669
+ });
12670
+ DeviceType.Camera, method(object({ deviceId: number() }), SceneMonitorStatusSchema), method(object({
12671
+ deviceId: number(),
12672
+ label: string(),
12673
+ roi: MaskRectShapeSchema,
12674
+ check: SceneCheckSchema,
12675
+ triggerMode: _enum([
12676
+ "periodic",
12677
+ "on-motion",
12678
+ "both"
12679
+ ]).optional(),
12680
+ checkIntervalSec: number().optional()
12681
+ }), SceneMonitorSchema, {
12682
+ kind: "mutation",
12683
+ auth: "admin"
12684
+ }), method(object({
12685
+ deviceId: number(),
12686
+ monitorId: string(),
12687
+ patch: object({
12688
+ label: string().optional(),
12689
+ roi: MaskRectShapeSchema.optional(),
12690
+ enabled: boolean().optional(),
12691
+ triggerMode: _enum([
12692
+ "periodic",
12693
+ "on-motion",
12694
+ "both"
12695
+ ]).optional(),
12696
+ checkIntervalSec: number().optional(),
12697
+ check: SceneCheckSchema.optional()
12698
+ })
12699
+ }), _void(), {
12700
+ kind: "mutation",
12701
+ auth: "admin"
12702
+ }), method(object({
12703
+ deviceId: number(),
12704
+ monitorId: string()
12705
+ }), _void(), {
12706
+ kind: "mutation",
12707
+ auth: "admin"
12708
+ }), method(object({
12709
+ deviceId: number(),
12710
+ monitorId: string(),
12711
+ stateId: string().optional(),
12712
+ label: string().optional(),
12713
+ condition: SceneConditionSchema.optional()
12714
+ }), object({
12715
+ stateId: string(),
12716
+ referenceCount: number()
12717
+ }), {
12718
+ kind: "mutation",
12719
+ auth: "admin"
12720
+ }), method(object({
12721
+ deviceId: number(),
12722
+ monitorId: string(),
12723
+ stateId: string(),
12724
+ index: number()
12725
+ }), _void(), {
12726
+ kind: "mutation",
12727
+ auth: "admin"
12728
+ }), method(object({
12729
+ deviceId: number(),
12730
+ monitorId: string()
12731
+ }), _void(), {
12732
+ kind: "mutation",
12733
+ auth: "admin"
12734
+ });
12557
12735
  object({
12558
12736
  /** Whether the script is currently executing. */
12559
12737
  isRunning: boolean(),
@@ -13622,7 +13800,12 @@ var NotificationRuleConditionsSchema = object({
13622
13800
  clipDescription: object({
13623
13801
  text: string().min(1),
13624
13802
  minSimilarity: number().min(0).max(1)
13625
- }).optional()
13803
+ }).optional(),
13804
+ /** Match events whose recognized-entity label (face identity name or plate
13805
+ * vehicle name, propagated onto `event.data.label`) is one of these values.
13806
+ * Empty/absent → unaffected (back-compat). Enables "notify me when <named
13807
+ * vehicle/person> is seen". */
13808
+ labels: array(string()).readonly().optional()
13626
13809
  });
13627
13810
  var NotificationRuleTemplateSchema = object({
13628
13811
  title: string(),
@@ -13880,11 +14063,19 @@ method(object({
13880
14063
  * login page needs NO change.
13881
14064
  *
13882
14065
  * - `widget` — a Module-Federation widget the login page mounts (via
13883
- * `loadRemoteBundle`) for an in-page ceremony. Covers the passkey
13884
- * login ceremony, which must run `@simplewebauthn/browser` INSIDE the
13885
- * addon bundle. The referenced widget also declares `preAuth: true` in
13886
- * its `addon-widgets-source` catalog entry. `auth.listLoginMethods`
13887
- * stamps a public `bundleUrl` from `addonId` + `bundle`.
14066
+ * `loadRemoteBundle`) for an in-page ceremony. `auth.listLoginMethods`
14067
+ * stamps a public `bundleUrl` from `addonId` + `bundle`. Generic
14068
+ * mechanism kept for future use; no shipped addon uses it on the login
14069
+ * page (the passkey ceremony below runs natively in the shell instead).
14070
+ *
14071
+ * - `passkey` — a declarative WebAuthn ceremony the shell renders
14072
+ * natively (`@simplewebauthn/browser` lives in `addon-admin-ui`, not in
14073
+ * a remotely-loaded bundle). Carries the addon's effective `rpId` /
14074
+ * `origin` (from its `resolveRpID()` / `resolveOrigin()`) so the shell
14075
+ * can gate visibility (IP-literal origin, hostname/rpId mismatch) WITHOUT
14076
+ * fetching any remote code pre-auth. Contribution stays unconditional —
14077
+ * enrollment state is never leaked pre-auth; visibility is a shell
14078
+ * decision.
13888
14079
  *
13889
14080
  * Every contribution carries a `stage`:
13890
14081
  * - `primary` — shown on the first credentials screen (OIDC /
@@ -13898,30 +14089,45 @@ method(object({
13898
14089
  */
13899
14090
  /** When a login method renders in the two-phase login flow. */
13900
14091
  var LoginStageEnum = _enum(["primary", "second-factor"]);
13901
- /** One login-method contribution — redirect button OR pre-auth widget. */
13902
- var LoginMethodContributionSchema = discriminatedUnion("kind", [object({
13903
- kind: literal("redirect"),
13904
- /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
13905
- id: string(),
13906
- /** Operator-facing button label. */
13907
- label: string(),
13908
- /** lucide-react icon name. */
13909
- icon: string().optional(),
13910
- /** Addon-owned HTTP route the button navigates to (GET). */
13911
- startUrl: string(),
13912
- stage: LoginStageEnum
13913
- }), object({
13914
- kind: literal("widget"),
13915
- /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
13916
- id: string(),
13917
- /** Owning addon id drives the public bundle URL + the MF namespace. */
13918
- addonId: string(),
13919
- /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
13920
- bundle: string(),
13921
- /** MF remote descriptor `{ remoteName, exposedModule, componentKey }`. */
13922
- remote: WidgetRemoteSchema,
13923
- stage: LoginStageEnum
13924
- })]);
14092
+ /** One login-method contribution — redirect button, pre-auth widget, or native passkey ceremony. */
14093
+ var LoginMethodContributionSchema = discriminatedUnion("kind", [
14094
+ object({
14095
+ kind: literal("redirect"),
14096
+ /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
14097
+ id: string(),
14098
+ /** Operator-facing button label. */
14099
+ label: string(),
14100
+ /** lucide-react icon name. */
14101
+ icon: string().optional(),
14102
+ /** Addon-owned HTTP route the button navigates to (GET). */
14103
+ startUrl: string(),
14104
+ stage: LoginStageEnum
14105
+ }),
14106
+ object({
14107
+ kind: literal("widget"),
14108
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
14109
+ id: string(),
14110
+ /** Owning addon id — drives the public bundle URL + the MF namespace. */
14111
+ addonId: string(),
14112
+ /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
14113
+ bundle: string(),
14114
+ /** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
14115
+ remote: WidgetRemoteSchema,
14116
+ stage: LoginStageEnum
14117
+ }),
14118
+ object({
14119
+ kind: literal("passkey"),
14120
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-direct-login`). */
14121
+ id: string(),
14122
+ /** Operator-facing button label. */
14123
+ label: string(),
14124
+ stage: LoginStageEnum,
14125
+ /** Effective WebAuthn RP ID (`resolveRpID()`) — the shell gates visibility on it. */
14126
+ rpId: string(),
14127
+ /** Effective expected origin (`resolveOrigin()`), null when unconfigured. */
14128
+ origin: string().nullable()
14129
+ })
14130
+ ]);
13925
14131
  method(_void(), array(LoginMethodContributionSchema).readonly());
13926
14132
  /**
13927
14133
  * Orchestrator-side destination metadata. The orchestrator computes
@@ -15808,14 +16014,14 @@ var TargetKindCapsSchema = object({
15808
16014
  * the union is large and not meant for runtime validation here; the exported
15809
16015
  * `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
15810
16016
  */
15811
- var ConfigSchemaPassthrough = unknown();
16017
+ var ConfigSchemaPassthrough$1 = unknown();
15812
16018
  var TargetKindSchema = object({
15813
16019
  kind: string(),
15814
16020
  label: string(),
15815
16021
  icon: string(),
15816
16022
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
15817
16023
  addonId: string(),
15818
- configSchema: ConfigSchemaPassthrough,
16024
+ configSchema: ConfigSchemaPassthrough$1,
15819
16025
  supportsDiscovery: boolean(),
15820
16026
  caps: TargetKindCapsSchema
15821
16027
  });
@@ -15868,6 +16074,298 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
15868
16074
  enabled: boolean()
15869
16075
  }), _void(), { kind: "mutation" });
15870
16076
  /**
16077
+ * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
16078
+ * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
16079
+ * caps stay wire-compatible without a circular cap→cap import.
16080
+ *
16081
+ * Errors are a discriminated-union RESULT, never thrown: the shape survives
16082
+ * every transport tier structurally, and failed calls still write usage rows.
16083
+ * Token counts only in v1 — no costUsd (operator decision, 2026-07-15).
16084
+ */
16085
+ var LlmUsageSchema = object({
16086
+ inputTokens: number(),
16087
+ outputTokens: number()
16088
+ });
16089
+ var LlmErrorCodeSchema = _enum([
16090
+ "timeout",
16091
+ "rate-limited",
16092
+ "auth",
16093
+ "refusal",
16094
+ "bad-request",
16095
+ "unavailable",
16096
+ "no-profile",
16097
+ "budget-exceeded",
16098
+ "adapter-error"
16099
+ ]);
16100
+ var LlmGenerateResultSchema = discriminatedUnion("ok", [object({
16101
+ ok: literal(true),
16102
+ text: string(),
16103
+ model: string(),
16104
+ usage: LlmUsageSchema,
16105
+ truncated: boolean(),
16106
+ latencyMs: number()
16107
+ }), object({
16108
+ ok: literal(false),
16109
+ code: LlmErrorCodeSchema,
16110
+ message: string(),
16111
+ retryAfterMs: number().optional()
16112
+ })]);
16113
+ /**
16114
+ * `Uint8Array` is the sanctioned binary convention — superjson + the UDS
16115
+ * MsgPack channel round-trip typed arrays (embedding-encoder.cap.ts:29,
16116
+ * notification-output.cap.ts:27-31 precedents).
16117
+ */
16118
+ var LlmImageSchema = object({
16119
+ bytes: _instanceof(Uint8Array),
16120
+ mimeType: string()
16121
+ });
16122
+ var LlmGenerateBaseInputSchema = object({
16123
+ /** Collection routing (the notification-output posture). */
16124
+ addonId: string().optional(),
16125
+ /** Explicit profile; else the resolution chain (spec §3). */
16126
+ profileId: string().optional(),
16127
+ /** MANDATORY usage tag: 'ai-summary', 'notifier-rules', 'adhoc-ui', … */
16128
+ consumer: string(),
16129
+ system: string().optional(),
16130
+ /** v1: single-turn. `messages[]` is a v2 additive field. */
16131
+ prompt: string(),
16132
+ /** Structured output — adapter-mapped (response_format / forced tool / responseSchema). */
16133
+ jsonSchema: record(string(), unknown()).optional(),
16134
+ /** Per-call override of the profile default. */
16135
+ maxTokens: number().int().positive().optional(),
16136
+ temperature: number().optional()
16137
+ });
16138
+ /**
16139
+ * `llm-runtime` — node-side managed llama.cpp executor (spec §4). Registered
16140
+ * on EVERY node where `addon-ai` is installed; the hub `llm` provider reaches
16141
+ * a specific node's runtime with `nodePin(profile.runtime.nodeId)` — normal
16142
+ * cap routing, zero bespoke plumbing. `internal: true`: the operator reaches
16143
+ * this only through the `llm` cap's methods.
16144
+ *
16145
+ * One running llama-server child per node in v1 (models are RAM-heavy).
16146
+ * Resource ceiling = llama-server flags + idleStopMinutes ONLY (no RSS
16147
+ * watchdog — operator decision #3).
16148
+ */
16149
+ var ManagedModelRefSchema = discriminatedUnion("kind", [
16150
+ object({
16151
+ kind: literal("catalog"),
16152
+ catalogId: string()
16153
+ }),
16154
+ object({
16155
+ kind: literal("url"),
16156
+ url: string(),
16157
+ sha256: string().optional()
16158
+ }),
16159
+ object({
16160
+ kind: literal("path"),
16161
+ path: string()
16162
+ })
16163
+ ]);
16164
+ var ManagedRuntimeConfigSchema = object({
16165
+ /** WHERE the runtime lives — hub or any agent. */
16166
+ nodeId: string(),
16167
+ /** Closed for v1; 'ollama' is a v2 candidate. */
16168
+ engine: _enum(["llama-cpp"]),
16169
+ model: ManagedModelRefSchema,
16170
+ contextSize: number().int().default(4096),
16171
+ /** 0 = CPU-only. */
16172
+ gpuLayers: number().int().default(0),
16173
+ /** Default: cpus-2, clamped ≥1 (resolved node-side). */
16174
+ threads: number().int().optional(),
16175
+ /** Concurrent slots. */
16176
+ parallel: number().int().default(1),
16177
+ /** Else lazy: first generate boots it. */
16178
+ autoStart: boolean().default(false),
16179
+ /** 0 = never; frees RAM after quiet periods. */
16180
+ idleStopMinutes: number().int().default(30)
16181
+ });
16182
+ var LlmRuntimeStatusSchema = object({
16183
+ /** Status is ALWAYS node-qualified. */
16184
+ nodeId: string(),
16185
+ state: _enum([
16186
+ "stopped",
16187
+ "downloading",
16188
+ "starting",
16189
+ "ready",
16190
+ "crashed",
16191
+ "failed"
16192
+ ]),
16193
+ pid: number().optional(),
16194
+ port: number().optional(),
16195
+ modelPath: string().optional(),
16196
+ modelId: string().optional(),
16197
+ downloadProgress: number().min(0).max(1).optional(),
16198
+ lastError: string().optional(),
16199
+ crashesInWindow: number(),
16200
+ /** Child RSS (sampled best-effort). */
16201
+ memoryBytes: number().optional(),
16202
+ vramBytes: number().optional()
16203
+ });
16204
+ var LlmNodeModelSchema = object({
16205
+ file: string(),
16206
+ sizeBytes: number(),
16207
+ catalogId: string().optional(),
16208
+ installedAt: number().optional()
16209
+ });
16210
+ var LlmRuntimeDiskUsageSchema = object({
16211
+ nodeId: string(),
16212
+ modelsBytes: number(),
16213
+ freeBytes: number().optional()
16214
+ });
16215
+ method(LlmGenerateBaseInputSchema.extend({
16216
+ images: array(LlmImageSchema).optional(),
16217
+ runtime: ManagedRuntimeConfigSchema,
16218
+ /** The managed profile's timeout, threaded by the hub provider. */
16219
+ timeoutMs: number().int().positive().optional()
16220
+ }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
16221
+ kind: "mutation",
16222
+ auth: "admin"
16223
+ }), method(object({}), _void(), {
16224
+ kind: "mutation",
16225
+ auth: "admin"
16226
+ }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
16227
+ kind: "mutation",
16228
+ auth: "admin"
16229
+ }), method(object({ file: string() }), _void(), {
16230
+ kind: "mutation",
16231
+ auth: "admin"
16232
+ }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
16233
+ /**
16234
+ * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
16235
+ * methods concat-fan across providers; single-row methods route to ONE
16236
+ * provider by the `addonId` in the call input (the notification-output
16237
+ * posture, notification-output.cap.ts:215-250). Provided by `addon-ai`
16238
+ * (hub-placed); the cap stays open for future providers.
16239
+ *
16240
+ * Profiles are ROWS (data), not addons: one row = one usable model endpoint.
16241
+ * `apiKey` is a password field — providers REDACT it on read and merge on
16242
+ * write; a stored key NEVER round-trips to a client.
16243
+ */
16244
+ var LlmProfileKindSchema = _enum([
16245
+ "openai-compatible",
16246
+ "openai",
16247
+ "anthropic",
16248
+ "google",
16249
+ "managed-local"
16250
+ ]);
16251
+ var LlmProfileSchema = object({
16252
+ id: string(),
16253
+ name: string(),
16254
+ kind: LlmProfileKindSchema,
16255
+ /** Stamped by the provider — keeps the fanned catalog routable. */
16256
+ addonId: string(),
16257
+ enabled: boolean(),
16258
+ /** Vendor model id, or the managed runtime's loaded model. */
16259
+ model: string(),
16260
+ /** Required for openai-compatible; override for cloud kinds. */
16261
+ baseUrl: string().optional(),
16262
+ /** ConfigUISchema type:'password' — never round-trips (spec §5). */
16263
+ apiKey: string().optional(),
16264
+ supportsVision: boolean(),
16265
+ temperature: number().min(0).max(2).optional(),
16266
+ maxTokens: number().int().positive().optional(),
16267
+ timeoutMs: number().int().positive().default(6e4),
16268
+ extraHeaders: record(string(), string()).optional(),
16269
+ /** kind === 'managed-local' only (spec §4). */
16270
+ runtime: ManagedRuntimeConfigSchema.optional()
16271
+ });
16272
+ /** ConfigUISchema tree passed through untyped on the wire (the
16273
+ * notification-output `ConfigSchemaPassthrough` precedent at
16274
+ * notification-output.cap.ts:151); the exported TS type re-tightens it. */
16275
+ var ConfigSchemaPassthrough = unknown();
16276
+ var LlmProfileKindDescriptorSchema = object({
16277
+ kind: LlmProfileKindSchema,
16278
+ label: string(),
16279
+ icon: string(),
16280
+ /** Stamped by each provider so the concat-fanned catalog stays routable. */
16281
+ addonId: string(),
16282
+ configSchema: ConfigSchemaPassthrough
16283
+ });
16284
+ var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
16285
+ var LlmDefaultSchema = object({
16286
+ selector: LlmDefaultSelectorSchema,
16287
+ profileId: string()
16288
+ });
16289
+ /** Server-side rollup row — getUsage never dumps raw call rows (spec §6). */
16290
+ var LlmUsageRollupSchema = object({
16291
+ day: string(),
16292
+ consumer: string(),
16293
+ profileId: string(),
16294
+ calls: number(),
16295
+ okCalls: number(),
16296
+ errorCalls: number(),
16297
+ inputTokens: number(),
16298
+ outputTokens: number(),
16299
+ avgLatencyMs: number()
16300
+ });
16301
+ /** LLM-facing view over the reused ModelCatalogEntry mechanism (spec §4.2). */
16302
+ var ManagedModelCatalogEntrySchema = object({
16303
+ id: string(),
16304
+ label: string(),
16305
+ family: string(),
16306
+ purpose: _enum(["text", "vision"]),
16307
+ url: string(),
16308
+ sha256: string(),
16309
+ sizeBytes: number(),
16310
+ quantization: string(),
16311
+ /** Load-time guidance shown in the picker. */
16312
+ minRamBytes: number(),
16313
+ contextSizeDefault: number().int(),
16314
+ /** Vision models: companion projector file. */
16315
+ mmprojUrl: string().optional()
16316
+ });
16317
+ var LlmRuntimeNodeSchema = object({
16318
+ nodeId: string(),
16319
+ reachable: boolean(),
16320
+ status: LlmRuntimeStatusSchema.optional(),
16321
+ disk: LlmRuntimeDiskUsageSchema.optional(),
16322
+ error: string().optional()
16323
+ });
16324
+ var GenerateVisionInputSchema = LlmGenerateBaseInputSchema.extend({ images: array(LlmImageSchema).min(1) });
16325
+ var ProfileRefInputSchema = object({
16326
+ addonId: string(),
16327
+ profileId: string()
16328
+ });
16329
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
16330
+ kind: "mutation",
16331
+ auth: "admin"
16332
+ }), method(ProfileRefInputSchema, _void(), {
16333
+ kind: "mutation",
16334
+ auth: "admin"
16335
+ }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
16336
+ kind: "mutation",
16337
+ auth: "admin"
16338
+ }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
16339
+ selector: LlmDefaultSelectorSchema,
16340
+ profileId: string().nullable()
16341
+ }), _void(), {
16342
+ kind: "mutation",
16343
+ auth: "admin"
16344
+ }), method(object({
16345
+ since: number().optional(),
16346
+ until: number().optional(),
16347
+ consumer: string().optional(),
16348
+ profileId: string().optional()
16349
+ }), array(LlmUsageRollupSchema)), method(object({}), array(ManagedModelCatalogEntrySchema)), method(object({}), array(LlmRuntimeNodeSchema)), method(object({ nodeId: string() }), array(LlmNodeModelSchema)), method(object({
16350
+ nodeId: string(),
16351
+ model: ManagedModelRefSchema
16352
+ }), _void(), {
16353
+ kind: "mutation",
16354
+ auth: "admin"
16355
+ }), method(object({
16356
+ nodeId: string(),
16357
+ file: string()
16358
+ }), _void(), {
16359
+ kind: "mutation",
16360
+ auth: "admin"
16361
+ }), method(ProfileRefInputSchema, LlmRuntimeStatusSchema), method(ProfileRefInputSchema, LlmRuntimeStatusSchema, {
16362
+ kind: "mutation",
16363
+ auth: "admin"
16364
+ }), method(ProfileRefInputSchema, _void(), {
16365
+ kind: "mutation",
16366
+ auth: "admin"
16367
+ });
16368
+ /**
15871
16369
  * Zod schemas for persisted record types.
15872
16370
  *
15873
16371
  * These schemas serve as the single source of truth for types that are
@@ -16083,6 +16581,10 @@ var TrackSchema = object({
16083
16581
  snapshots: array(TrackSnapshotSchema).readonly(),
16084
16582
  /** Deduplicated zones the track has entered at least once. */
16085
16583
  zonesVisited: array(string()).readonly(),
16584
+ /** Deduplicated set of detector classes observed for this track over its
16585
+ * life (a track may be reclassified, e.g. person→vehicle). Absent on
16586
+ * legacy rows written before class accumulation shipped. */
16587
+ classes: array(string()).readonly().optional(),
16086
16588
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
16087
16589
  totalDistance: number(),
16088
16590
  state: TrackStateSchema,
@@ -16244,7 +16746,7 @@ var KeyEventSchema = object({
16244
16746
  /** Track lifetime in ms (lastSeen - firstSeen). */
16245
16747
  windowMs: number().optional()
16246
16748
  });
16247
- var TrackedDetectionSchema = object({
16749
+ object({
16248
16750
  trackId: string(),
16249
16751
  className: string(),
16250
16752
  confidence: number(),
@@ -16252,6 +16754,23 @@ var TrackedDetectionSchema = object({
16252
16754
  zones: array(string()).readonly(),
16253
16755
  state: TrackStateSchema
16254
16756
  });
16757
+ var OverlayDetectionSchema = looseObject({
16758
+ id: string(),
16759
+ kind: _enum(["first-level", "detail"]),
16760
+ macroClass: string(),
16761
+ score: number(),
16762
+ bbox: object({
16763
+ x: number(),
16764
+ y: number(),
16765
+ width: number(),
16766
+ height: number()
16767
+ }),
16768
+ labels: array(looseObject({
16769
+ label: string(),
16770
+ score: number()
16771
+ })).readonly(),
16772
+ parentId: string().optional()
16773
+ });
16255
16774
  var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: number() });
16256
16775
  var SearchObjectEventsInput = object({
16257
16776
  text: string(),
@@ -16262,6 +16781,20 @@ var SearchObjectEventsInput = object({
16262
16781
  limit: number().default(50),
16263
16782
  minScore: number().min(0).max(1).default(.2)
16264
16783
  });
16784
+ var TrackCascadeCountsSchema = object({
16785
+ /** Persisted track roots deleted (authoritative). */
16786
+ tracks: number().int(),
16787
+ /** Object events removed with their tracks (best-effort; see note above). */
16788
+ events: number().int(),
16789
+ /** Track/face/plate-owned media removed (best-effort). Never identity media. */
16790
+ media: number().int(),
16791
+ /** Unassigned (non-enrolled) face reads removed (best-effort). */
16792
+ faces: number().int(),
16793
+ /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
16794
+ plates: number().int(),
16795
+ /** Per-track CLIP search vectors removed (best-effort). */
16796
+ embeddings: number().int()
16797
+ });
16265
16798
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
16266
16799
  deviceId: number(),
16267
16800
  trackId: string()
@@ -16293,6 +16826,24 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
16293
16826
  }), {
16294
16827
  kind: "mutation",
16295
16828
  auth: "admin"
16829
+ }), method(object({
16830
+ deviceId: number(),
16831
+ cutoffMs: number()
16832
+ }), TrackCascadeCountsSchema, {
16833
+ kind: "mutation",
16834
+ auth: "admin"
16835
+ }), method(object({ deviceId: number() }), TrackCascadeCountsSchema, {
16836
+ kind: "mutation",
16837
+ auth: "admin"
16838
+ }), method(object({
16839
+ deviceId: number(),
16840
+ trackIds: array(string()).min(1)
16841
+ }), object({
16842
+ deleted: number().int(),
16843
+ failed: array(string()).readonly()
16844
+ }), {
16845
+ kind: "mutation",
16846
+ auth: "admin"
16296
16847
  }), method(object({
16297
16848
  eventId: string(),
16298
16849
  kind: MediaFileKindEnum.optional()
@@ -16301,7 +16852,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
16301
16852
  timestamp: number(),
16302
16853
  frameWidth: number(),
16303
16854
  frameHeight: number(),
16304
- detections: array(TrackedDetectionSchema).readonly()
16855
+ detections: array(OverlayDetectionSchema).readonly()
16305
16856
  }), object({
16306
16857
  deviceId: number(),
16307
16858
  trackId: string(),
@@ -19281,6 +19832,24 @@ DeviceType.Camera, method(object({
19281
19832
  deviceId: number(),
19282
19833
  status: OsdStatusSchema
19283
19834
  });
19835
+ var VehicleSchema = object({
19836
+ id: string(),
19837
+ name: string(),
19838
+ sampleCount: number().int().nonnegative(),
19839
+ coverMediaKey: string().optional(),
19840
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
19841
+ coverBase64: string().optional()
19842
+ });
19843
+ var VehicleSampleInfoSchema = object({
19844
+ id: string(),
19845
+ /** The plate text this sample enrolled (self-labeling — no embedding). */
19846
+ text: string(),
19847
+ /** OCR confidence of the enrolled read (0..1). */
19848
+ score: number(),
19849
+ addedAt: number().int(),
19850
+ deviceId: number().int().optional(),
19851
+ base64: string().optional()
19852
+ });
19284
19853
  var PlateInfoSchema = object({
19285
19854
  plateId: string(),
19286
19855
  deviceId: number().int(),
@@ -19292,6 +19861,16 @@ var PlateInfoSchema = object({
19292
19861
  score: number(),
19293
19862
  /** True when the text was manually corrected (exempt from retention). */
19294
19863
  corrected: boolean(),
19864
+ /** Recognized vehicle id when a matcher lookup named this read (SQL NULL → absent). */
19865
+ recognizedVehicleId: string().optional(),
19866
+ /** Resolved vehicle name for `recognizedVehicleId` (UI convenience). */
19867
+ vehicleName: string().optional(),
19868
+ /** True once the read was assigned to a vehicle (enrolled as a sample). */
19869
+ assigned: boolean(),
19870
+ /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
19871
+ plateBbox: BoundingBoxSchema.optional(),
19872
+ /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
19873
+ keyFrameMediaKey: string().optional(),
19295
19874
  base64: string().optional()
19296
19875
  });
19297
19876
  var MediaFileLiteSchema = object({
@@ -19331,6 +19910,48 @@ method(object({
19331
19910
  }), method(object({ plateId: string() }), _void(), {
19332
19911
  kind: "mutation",
19333
19912
  auth: "admin"
19913
+ }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
19914
+ kind: "mutation",
19915
+ auth: "admin"
19916
+ }), method(object({
19917
+ id: string(),
19918
+ name: string().min(1)
19919
+ }), _void(), {
19920
+ kind: "mutation",
19921
+ auth: "admin"
19922
+ }), method(object({ id: string() }), _void(), {
19923
+ kind: "mutation",
19924
+ auth: "admin"
19925
+ }), method(object({ vehicleId: string() }), array(VehicleSampleInfoSchema).readonly()), method(object({
19926
+ vehicleId: string(),
19927
+ sampleId: string()
19928
+ }), _void(), {
19929
+ kind: "mutation",
19930
+ auth: "admin"
19931
+ }), method(object({
19932
+ plateId: string(),
19933
+ vehicleId: string()
19934
+ }), _void(), {
19935
+ kind: "mutation",
19936
+ auth: "admin"
19937
+ }), method(object({ plateId: string() }), _void(), {
19938
+ kind: "mutation",
19939
+ auth: "admin"
19940
+ }), method(object({
19941
+ plateIds: array(string()).min(1),
19942
+ vehicleId: string()
19943
+ }), object({
19944
+ assigned: number().int(),
19945
+ failed: array(string()).readonly()
19946
+ }), {
19947
+ kind: "mutation",
19948
+ auth: "admin"
19949
+ }), method(object({ plateIds: array(string()).min(1) }), object({
19950
+ unassigned: number().int(),
19951
+ failed: array(string()).readonly()
19952
+ }), {
19953
+ kind: "mutation",
19954
+ auth: "admin"
19334
19955
  });
19335
19956
  var ModelFormatSchema = _enum(MODEL_FORMATS);
19336
19957
  var HwAccelBackendInputSchema = _enum([
@@ -21876,6 +22497,168 @@ Object.freeze({
21876
22497
  addonId: null,
21877
22498
  access: "create"
21878
22499
  },
22500
+ "llm.deleteModel": {
22501
+ capName: "llm",
22502
+ capScope: "system",
22503
+ addonId: null,
22504
+ access: "delete"
22505
+ },
22506
+ "llm.deleteProfile": {
22507
+ capName: "llm",
22508
+ capScope: "system",
22509
+ addonId: null,
22510
+ access: "delete"
22511
+ },
22512
+ "llm.generate": {
22513
+ capName: "llm",
22514
+ capScope: "system",
22515
+ addonId: null,
22516
+ access: "create"
22517
+ },
22518
+ "llm.generateVision": {
22519
+ capName: "llm",
22520
+ capScope: "system",
22521
+ addonId: null,
22522
+ access: "create"
22523
+ },
22524
+ "llm.getDefaults": {
22525
+ capName: "llm",
22526
+ capScope: "system",
22527
+ addonId: null,
22528
+ access: "view"
22529
+ },
22530
+ "llm.getRuntimeStatus": {
22531
+ capName: "llm",
22532
+ capScope: "system",
22533
+ addonId: null,
22534
+ access: "view"
22535
+ },
22536
+ "llm.getUsage": {
22537
+ capName: "llm",
22538
+ capScope: "system",
22539
+ addonId: null,
22540
+ access: "view"
22541
+ },
22542
+ "llm.installModel": {
22543
+ capName: "llm",
22544
+ capScope: "system",
22545
+ addonId: null,
22546
+ access: "create"
22547
+ },
22548
+ "llm.listModelCatalog": {
22549
+ capName: "llm",
22550
+ capScope: "system",
22551
+ addonId: null,
22552
+ access: "view"
22553
+ },
22554
+ "llm.listModels": {
22555
+ capName: "llm",
22556
+ capScope: "system",
22557
+ addonId: null,
22558
+ access: "view"
22559
+ },
22560
+ "llm.listNodeModels": {
22561
+ capName: "llm",
22562
+ capScope: "system",
22563
+ addonId: null,
22564
+ access: "view"
22565
+ },
22566
+ "llm.listProfileKinds": {
22567
+ capName: "llm",
22568
+ capScope: "system",
22569
+ addonId: null,
22570
+ access: "view"
22571
+ },
22572
+ "llm.listProfiles": {
22573
+ capName: "llm",
22574
+ capScope: "system",
22575
+ addonId: null,
22576
+ access: "view"
22577
+ },
22578
+ "llm.listRuntimeNodes": {
22579
+ capName: "llm",
22580
+ capScope: "system",
22581
+ addonId: null,
22582
+ access: "view"
22583
+ },
22584
+ "llm.setDefault": {
22585
+ capName: "llm",
22586
+ capScope: "system",
22587
+ addonId: null,
22588
+ access: "create"
22589
+ },
22590
+ "llm.startRuntime": {
22591
+ capName: "llm",
22592
+ capScope: "system",
22593
+ addonId: null,
22594
+ access: "create"
22595
+ },
22596
+ "llm.stopRuntime": {
22597
+ capName: "llm",
22598
+ capScope: "system",
22599
+ addonId: null,
22600
+ access: "create"
22601
+ },
22602
+ "llm.testProfile": {
22603
+ capName: "llm",
22604
+ capScope: "system",
22605
+ addonId: null,
22606
+ access: "create"
22607
+ },
22608
+ "llm.upsertProfile": {
22609
+ capName: "llm",
22610
+ capScope: "system",
22611
+ addonId: null,
22612
+ access: "create"
22613
+ },
22614
+ "llmRuntime.complete": {
22615
+ capName: "llm-runtime",
22616
+ capScope: "system",
22617
+ addonId: null,
22618
+ access: "create"
22619
+ },
22620
+ "llmRuntime.deleteModel": {
22621
+ capName: "llm-runtime",
22622
+ capScope: "system",
22623
+ addonId: null,
22624
+ access: "delete"
22625
+ },
22626
+ "llmRuntime.ensureStarted": {
22627
+ capName: "llm-runtime",
22628
+ capScope: "system",
22629
+ addonId: null,
22630
+ access: "create"
22631
+ },
22632
+ "llmRuntime.getDiskUsage": {
22633
+ capName: "llm-runtime",
22634
+ capScope: "system",
22635
+ addonId: null,
22636
+ access: "view"
22637
+ },
22638
+ "llmRuntime.installModel": {
22639
+ capName: "llm-runtime",
22640
+ capScope: "system",
22641
+ addonId: null,
22642
+ access: "create"
22643
+ },
22644
+ "llmRuntime.listLocalModels": {
22645
+ capName: "llm-runtime",
22646
+ capScope: "system",
22647
+ addonId: null,
22648
+ access: "view"
22649
+ },
22650
+ "llmRuntime.status": {
22651
+ capName: "llm-runtime",
22652
+ capScope: "system",
22653
+ addonId: null,
22654
+ access: "view"
22655
+ },
22656
+ "llmRuntime.stop": {
22657
+ capName: "llm-runtime",
22658
+ capScope: "system",
22659
+ addonId: null,
22660
+ access: "create"
22661
+ },
21879
22662
  "localNetwork.getAllowedAddresses": {
21880
22663
  capName: "local-network",
21881
22664
  capScope: "system",
@@ -22506,6 +23289,12 @@ Object.freeze({
22506
23289
  addonId: null,
22507
23290
  access: "delete"
22508
23291
  },
23292
+ "pipelineAnalytics.deleteTracks": {
23293
+ capName: "pipeline-analytics",
23294
+ capScope: "device",
23295
+ addonId: null,
23296
+ access: "delete"
23297
+ },
22509
23298
  "pipelineAnalytics.getActiveTracks": {
22510
23299
  capName: "pipeline-analytics",
22511
23300
  capScope: "device",
@@ -22572,12 +23361,24 @@ Object.freeze({
22572
23361
  addonId: null,
22573
23362
  access: "create"
22574
23363
  },
23364
+ "pipelineAnalytics.pruneTracksBefore": {
23365
+ capName: "pipeline-analytics",
23366
+ capScope: "device",
23367
+ addonId: null,
23368
+ access: "create"
23369
+ },
22575
23370
  "pipelineAnalytics.searchObjectEvents": {
22576
23371
  capName: "pipeline-analytics",
22577
23372
  capScope: "device",
22578
23373
  addonId: null,
22579
23374
  access: "view"
22580
23375
  },
23376
+ "pipelineAnalytics.wipeAllAnalytics": {
23377
+ capName: "pipeline-analytics",
23378
+ capScope: "device",
23379
+ addonId: null,
23380
+ access: "delete"
23381
+ },
22581
23382
  "pipelineExecutor.cacheFrameInPool": {
22582
23383
  capName: "pipeline-executor",
22583
23384
  capScope: "system",
@@ -23082,18 +23883,42 @@ Object.freeze({
23082
23883
  addonId: null,
23083
23884
  access: "create"
23084
23885
  },
23886
+ "plateGallery.assignPlate": {
23887
+ capName: "plate-gallery",
23888
+ capScope: "system",
23889
+ addonId: null,
23890
+ access: "create"
23891
+ },
23892
+ "plateGallery.assignPlates": {
23893
+ capName: "plate-gallery",
23894
+ capScope: "system",
23895
+ addonId: null,
23896
+ access: "create"
23897
+ },
23085
23898
  "plateGallery.correctPlateText": {
23086
23899
  capName: "plate-gallery",
23087
23900
  capScope: "system",
23088
23901
  addonId: null,
23089
23902
  access: "create"
23090
23903
  },
23904
+ "plateGallery.createVehicle": {
23905
+ capName: "plate-gallery",
23906
+ capScope: "system",
23907
+ addonId: null,
23908
+ access: "create"
23909
+ },
23091
23910
  "plateGallery.deletePlate": {
23092
23911
  capName: "plate-gallery",
23093
23912
  capScope: "system",
23094
23913
  addonId: null,
23095
23914
  access: "delete"
23096
23915
  },
23916
+ "plateGallery.deleteVehicle": {
23917
+ capName: "plate-gallery",
23918
+ capScope: "system",
23919
+ addonId: null,
23920
+ access: "delete"
23921
+ },
23097
23922
  "plateGallery.getPlateByTrack": {
23098
23923
  capName: "plate-gallery",
23099
23924
  capScope: "system",
@@ -23112,6 +23937,30 @@ Object.freeze({
23112
23937
  addonId: null,
23113
23938
  access: "view"
23114
23939
  },
23940
+ "plateGallery.listVehicles": {
23941
+ capName: "plate-gallery",
23942
+ capScope: "system",
23943
+ addonId: null,
23944
+ access: "view"
23945
+ },
23946
+ "plateGallery.listVehicleSamples": {
23947
+ capName: "plate-gallery",
23948
+ capScope: "system",
23949
+ addonId: null,
23950
+ access: "view"
23951
+ },
23952
+ "plateGallery.removeVehicleSample": {
23953
+ capName: "plate-gallery",
23954
+ capScope: "system",
23955
+ addonId: null,
23956
+ access: "delete"
23957
+ },
23958
+ "plateGallery.renameVehicle": {
23959
+ capName: "plate-gallery",
23960
+ capScope: "system",
23961
+ addonId: null,
23962
+ access: "create"
23963
+ },
23115
23964
  "plateGallery.searchPlates": {
23116
23965
  capName: "plate-gallery",
23117
23966
  capScope: "system",
@@ -23124,6 +23973,18 @@ Object.freeze({
23124
23973
  addonId: null,
23125
23974
  access: "view"
23126
23975
  },
23976
+ "plateGallery.unassignPlate": {
23977
+ capName: "plate-gallery",
23978
+ capScope: "system",
23979
+ addonId: null,
23980
+ access: "create"
23981
+ },
23982
+ "plateGallery.unassignPlates": {
23983
+ capName: "plate-gallery",
23984
+ capScope: "system",
23985
+ addonId: null,
23986
+ access: "create"
23987
+ },
23127
23988
  "platformProbe.getCapabilities": {
23128
23989
  capName: "platform-probe",
23129
23990
  capScope: "system",
@@ -23316,6 +24177,48 @@ Object.freeze({
23316
24177
  addonId: null,
23317
24178
  access: "create"
23318
24179
  },
24180
+ "sceneMonitor.captureReference": {
24181
+ capName: "scene-monitor",
24182
+ capScope: "device",
24183
+ addonId: null,
24184
+ access: "create"
24185
+ },
24186
+ "sceneMonitor.createScene": {
24187
+ capName: "scene-monitor",
24188
+ capScope: "device",
24189
+ addonId: null,
24190
+ access: "create"
24191
+ },
24192
+ "sceneMonitor.deleteReference": {
24193
+ capName: "scene-monitor",
24194
+ capScope: "device",
24195
+ addonId: null,
24196
+ access: "delete"
24197
+ },
24198
+ "sceneMonitor.deleteScene": {
24199
+ capName: "scene-monitor",
24200
+ capScope: "device",
24201
+ addonId: null,
24202
+ access: "delete"
24203
+ },
24204
+ "sceneMonitor.listScenes": {
24205
+ capName: "scene-monitor",
24206
+ capScope: "device",
24207
+ addonId: null,
24208
+ access: "view"
24209
+ },
24210
+ "sceneMonitor.recheckNow": {
24211
+ capName: "scene-monitor",
24212
+ capScope: "device",
24213
+ addonId: null,
24214
+ access: "create"
24215
+ },
24216
+ "sceneMonitor.updateScene": {
24217
+ capName: "scene-monitor",
24218
+ capScope: "device",
24219
+ addonId: null,
24220
+ access: "create"
24221
+ },
23319
24222
  "scriptRunner.run": {
23320
24223
  capName: "script-runner",
23321
24224
  capScope: "device",
@@ -24400,6 +25303,7 @@ Object.freeze({
24400
25303
  Object.freeze({
24401
25304
  "broker": "broker",
24402
25305
  "device-export": "device-export",
25306
+ "llm": "ai",
24403
25307
  "mesh-network": "mesh",
24404
25308
  "mqtt-broker": "broker",
24405
25309
  "network-access": "ingress",