@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.mjs CHANGED
@@ -4289,6 +4289,14 @@ function object(shape, params) {
4289
4289
  ...normalizeParams(params)
4290
4290
  });
4291
4291
  }
4292
+ function looseObject(shape, params) {
4293
+ return new ZodObject({
4294
+ type: "object",
4295
+ shape,
4296
+ catchall: unknown(),
4297
+ ...normalizeParams(params)
4298
+ });
4299
+ }
4292
4300
  var ZodUnion = /*@__PURE__*/ $constructor("ZodUnion", (inst, def) => {
4293
4301
  $ZodUnion.init(inst, def);
4294
4302
  ZodType.init(inst, def);
@@ -4630,7 +4638,7 @@ function _instanceof(cls, params = {}) {
4630
4638
  return inst;
4631
4639
  }
4632
4640
  //#endregion
4633
- //#region ../types/dist/sleep-Baang_XW.mjs
4641
+ //#region ../types/dist/sleep-DkhOVOjW.mjs
4634
4642
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4635
4643
  EventCategory["SystemBoot"] = "system.boot";
4636
4644
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5040,10 +5048,43 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5040
5048
  EventCategory["EnrichmentEmbeddingStored"] = "enrichment.embedding.stored";
5041
5049
  EventCategory["EnrichmentSceneStateChanged"] = "enrichment.scene.state-changed";
5042
5050
  EventCategory["EnrichmentActivitySummary"] = "enrichment.activity.summary";
5051
+ /**
5052
+ * Unified track-lifecycle event: ONE category carrying `phase:
5053
+ * 'start' | 'update' | 'end'` with a rich, typed
5054
+ * `PipelineAnalyticsTrackLifecyclePayload`. Supersedes the thin
5055
+ * `PipelineAnalyticsTrackStarted` / `PipelineAnalyticsTrackEnded`
5056
+ * pair — a consumer subscribes once and branches on `phase`.
5057
+ */
5058
+ EventCategory["PipelineAnalyticsTrackLifecycle"] = "pipeline-analytics.track-lifecycle";
5059
+ /**
5060
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
5061
+ * (`phase:'start'`). Kept as a soft alias — no known subscribers.
5062
+ */
5043
5063
  EventCategory["PipelineAnalyticsTrackStarted"] = "pipeline-analytics.track-started";
5064
+ /**
5065
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
5066
+ * (`phase:'end'`). Kept as a soft alias — no known subscribers.
5067
+ */
5044
5068
  EventCategory["PipelineAnalyticsTrackEnded"] = "pipeline-analytics.track-ended";
5045
5069
  EventCategory["PipelineAnalyticsDetectionEvent"] = "pipeline-analytics.detection-event";
5046
5070
  EventCategory["PipelineAnalyticsFrameTracked"] = "pipeline-analytics.frame-tracked";
5071
+ /**
5072
+ * Fired by `addon-post-analysis` whenever a gallery face row changes:
5073
+ * `kind:'buffered'` a new detected face was persisted, `'assigned'` /
5074
+ * `'unassigned'` its identity link changed, `'deleted'` the row was
5075
+ * removed. Telemetry semantics (D8): a lost event only delays a refresh,
5076
+ * never a correctness issue. Payload `PipelineAnalyticsFaceGalleryChangedPayload`.
5077
+ */
5078
+ EventCategory["PipelineAnalyticsFaceGalleryChanged"] = "pipeline-analytics.face-gallery-changed";
5079
+ /**
5080
+ * Fired by `addon-post-analysis` whenever a gallery plate row changes:
5081
+ * `kind:'buffered'` a new read was persisted (`PlateRecognizer.onTrackEnd`),
5082
+ * `'assigned'` / `'unassigned'` its vehicle link changed
5083
+ * (`PlateGalleryProvider`), `'deleted'` the row was removed. Telemetry
5084
+ * semantics (D8): a lost event only delays a refresh, never a correctness
5085
+ * issue. Payload `PipelineAnalyticsPlateGalleryChangedPayload`.
5086
+ */
5087
+ EventCategory["PipelineAnalyticsPlateGalleryChanged"] = "pipeline-analytics.plate-gallery-changed";
5047
5088
  EventCategory["FrigateLiveEvent"] = "frigate.live-event";
5048
5089
  EventCategory["CameraStreamsProfileSlotsChanged"] = "camera-streams.onProfileSlotsChanged";
5049
5090
  /**
@@ -7300,7 +7341,8 @@ var MODEL_FORMATS = [
7300
7341
  "coreml",
7301
7342
  "openvino",
7302
7343
  "tflite",
7303
- "pt"
7344
+ "pt",
7345
+ "gguf"
7304
7346
  ];
7305
7347
  /**
7306
7348
  * Multi-file format payload.
@@ -7344,7 +7386,8 @@ var ModelFormatsSchema = object({
7344
7386
  coreml: ModelFormatEntrySchema.optional(),
7345
7387
  openvino: ModelFormatEntrySchema.optional(),
7346
7388
  tflite: ModelFormatEntrySchema.optional(),
7347
- pt: ModelFormatEntrySchema.optional()
7389
+ pt: ModelFormatEntrySchema.optional(),
7390
+ gguf: ModelFormatEntrySchema.optional()
7348
7391
  });
7349
7392
  /**
7350
7393
  * Variant-selector grouping axes. Shared by the full `ModelCatalogEntry` and by
@@ -10900,7 +10943,8 @@ var ModelFormatSchema$1 = _enum([
10900
10943
  "coreml",
10901
10944
  "openvino",
10902
10945
  "tflite",
10903
- "pt"
10946
+ "pt",
10947
+ "gguf"
10904
10948
  ]);
10905
10949
  var PipelineSlotSchema = _enum([
10906
10950
  "detector",
@@ -12526,6 +12570,140 @@ DeviceType.Camera, method(object({ deviceId: number() }), PtzAutotrackStatusSche
12526
12570
  deviceId: number(),
12527
12571
  status: PtzAutotrackStatusSchema
12528
12572
  });
12573
+ /**
12574
+ * scene-monitor — device-scoped reference-region state cap. An operator marks
12575
+ * a rect ROI on a camera frame and names one or more states; the engine
12576
+ * (pipeline-analytics, designated post-processing node) reports which state is
12577
+ * active on an ongoing basis. Two operator-selectable check modes share every-
12578
+ * thing except the comparator: `similarity` (CLIP cosine at the same ROI coords
12579
+ * vs condition-tagged references) and `llm` (vision-LLM judgment over the crop).
12580
+ *
12581
+ * D14 device-config archetype (`deviceConfig.ui.kind:'widget'`) — the framework
12582
+ * derives the device-detail contribution; the provider carries NO hand-written
12583
+ * settings-contribution methods. `status.kind:'push'` — the engine pushes on
12584
+ * every hysteresis flip / availability change; consumers never poll.
12585
+ */
12586
+ /** Extensible condition tag. Seeded 'day' | 'night'; open by design so more can
12587
+ * be added without a wire break (matching falls back to any-condition refs). */
12588
+ var SceneConditionSchema = string();
12589
+ /** One captured reference — condition-tagged, model-version-gated. `embedding`
12590
+ * is `number[]` (Float32Array does NOT survive MsgPack/UDS). */
12591
+ var SceneReferenceSchema = object({
12592
+ embedding: array(number()),
12593
+ modelId: string(),
12594
+ condition: SceneConditionSchema,
12595
+ capturedAt: number(),
12596
+ thumbnailMediaId: string().optional()
12597
+ });
12598
+ var SceneMonitorStateSchema = object({
12599
+ id: string(),
12600
+ label: string(),
12601
+ references: array(SceneReferenceSchema),
12602
+ textPrompts: array(string()).optional(),
12603
+ referenceCount: number(),
12604
+ currentlyMatched: boolean()
12605
+ });
12606
+ /** Per-mode comparator params in a discriminated union so an `llm` scene never
12607
+ * carries similarity knobs and vice-versa. */
12608
+ var SceneCheckSchema = discriminatedUnion("mode", [object({
12609
+ mode: literal("similarity"),
12610
+ threshold: number().min(0).max(1),
12611
+ hysteresisCount: number().int().positive()
12612
+ }), object({
12613
+ mode: literal("llm"),
12614
+ prompt: string(),
12615
+ profileId: string().optional(),
12616
+ hysteresisCount: number().int().positive()
12617
+ })]);
12618
+ var SceneMonitorSchema = object({
12619
+ id: string(),
12620
+ label: string(),
12621
+ roi: MaskRectShapeSchema,
12622
+ enabled: boolean(),
12623
+ triggerMode: _enum([
12624
+ "periodic",
12625
+ "on-motion",
12626
+ "both"
12627
+ ]),
12628
+ checkIntervalSec: number().optional(),
12629
+ check: SceneCheckSchema,
12630
+ states: array(SceneMonitorStateSchema),
12631
+ currentStateId: string().nullable(),
12632
+ lastCheckedAt: number().nullable(),
12633
+ lastConfidence: number().nullable(),
12634
+ currentCondition: SceneConditionSchema.nullable(),
12635
+ availability: _enum(["ok", "unavailable"]),
12636
+ unavailableReason: string().nullable()
12637
+ });
12638
+ var SceneMonitorStatusSchema = object({
12639
+ monitors: array(SceneMonitorSchema),
12640
+ lastFetchedAt: number()
12641
+ });
12642
+ DeviceType.Camera, method(object({ deviceId: number() }), SceneMonitorStatusSchema), method(object({
12643
+ deviceId: number(),
12644
+ label: string(),
12645
+ roi: MaskRectShapeSchema,
12646
+ check: SceneCheckSchema,
12647
+ triggerMode: _enum([
12648
+ "periodic",
12649
+ "on-motion",
12650
+ "both"
12651
+ ]).optional(),
12652
+ checkIntervalSec: number().optional()
12653
+ }), SceneMonitorSchema, {
12654
+ kind: "mutation",
12655
+ auth: "admin"
12656
+ }), method(object({
12657
+ deviceId: number(),
12658
+ monitorId: string(),
12659
+ patch: object({
12660
+ label: string().optional(),
12661
+ roi: MaskRectShapeSchema.optional(),
12662
+ enabled: boolean().optional(),
12663
+ triggerMode: _enum([
12664
+ "periodic",
12665
+ "on-motion",
12666
+ "both"
12667
+ ]).optional(),
12668
+ checkIntervalSec: number().optional(),
12669
+ check: SceneCheckSchema.optional()
12670
+ })
12671
+ }), _void(), {
12672
+ kind: "mutation",
12673
+ auth: "admin"
12674
+ }), method(object({
12675
+ deviceId: number(),
12676
+ monitorId: string()
12677
+ }), _void(), {
12678
+ kind: "mutation",
12679
+ auth: "admin"
12680
+ }), method(object({
12681
+ deviceId: number(),
12682
+ monitorId: string(),
12683
+ stateId: string().optional(),
12684
+ label: string().optional(),
12685
+ condition: SceneConditionSchema.optional()
12686
+ }), object({
12687
+ stateId: string(),
12688
+ referenceCount: number()
12689
+ }), {
12690
+ kind: "mutation",
12691
+ auth: "admin"
12692
+ }), method(object({
12693
+ deviceId: number(),
12694
+ monitorId: string(),
12695
+ stateId: string(),
12696
+ index: number()
12697
+ }), _void(), {
12698
+ kind: "mutation",
12699
+ auth: "admin"
12700
+ }), method(object({
12701
+ deviceId: number(),
12702
+ monitorId: string()
12703
+ }), _void(), {
12704
+ kind: "mutation",
12705
+ auth: "admin"
12706
+ });
12529
12707
  object({
12530
12708
  /** Whether the script is currently executing. */
12531
12709
  isRunning: boolean(),
@@ -13594,7 +13772,12 @@ var NotificationRuleConditionsSchema = object({
13594
13772
  clipDescription: object({
13595
13773
  text: string().min(1),
13596
13774
  minSimilarity: number().min(0).max(1)
13597
- }).optional()
13775
+ }).optional(),
13776
+ /** Match events whose recognized-entity label (face identity name or plate
13777
+ * vehicle name, propagated onto `event.data.label`) is one of these values.
13778
+ * Empty/absent → unaffected (back-compat). Enables "notify me when <named
13779
+ * vehicle/person> is seen". */
13780
+ labels: array(string()).readonly().optional()
13598
13781
  });
13599
13782
  var NotificationRuleTemplateSchema = object({
13600
13783
  title: string(),
@@ -13852,11 +14035,19 @@ method(object({
13852
14035
  * login page needs NO change.
13853
14036
  *
13854
14037
  * - `widget` — a Module-Federation widget the login page mounts (via
13855
- * `loadRemoteBundle`) for an in-page ceremony. Covers the passkey
13856
- * login ceremony, which must run `@simplewebauthn/browser` INSIDE the
13857
- * addon bundle. The referenced widget also declares `preAuth: true` in
13858
- * its `addon-widgets-source` catalog entry. `auth.listLoginMethods`
13859
- * stamps a public `bundleUrl` from `addonId` + `bundle`.
14038
+ * `loadRemoteBundle`) for an in-page ceremony. `auth.listLoginMethods`
14039
+ * stamps a public `bundleUrl` from `addonId` + `bundle`. Generic
14040
+ * mechanism kept for future use; no shipped addon uses it on the login
14041
+ * page (the passkey ceremony below runs natively in the shell instead).
14042
+ *
14043
+ * - `passkey` — a declarative WebAuthn ceremony the shell renders
14044
+ * natively (`@simplewebauthn/browser` lives in `addon-admin-ui`, not in
14045
+ * a remotely-loaded bundle). Carries the addon's effective `rpId` /
14046
+ * `origin` (from its `resolveRpID()` / `resolveOrigin()`) so the shell
14047
+ * can gate visibility (IP-literal origin, hostname/rpId mismatch) WITHOUT
14048
+ * fetching any remote code pre-auth. Contribution stays unconditional —
14049
+ * enrollment state is never leaked pre-auth; visibility is a shell
14050
+ * decision.
13860
14051
  *
13861
14052
  * Every contribution carries a `stage`:
13862
14053
  * - `primary` — shown on the first credentials screen (OIDC /
@@ -13870,30 +14061,45 @@ method(object({
13870
14061
  */
13871
14062
  /** When a login method renders in the two-phase login flow. */
13872
14063
  var LoginStageEnum = _enum(["primary", "second-factor"]);
13873
- /** One login-method contribution — redirect button OR pre-auth widget. */
13874
- var LoginMethodContributionSchema = discriminatedUnion("kind", [object({
13875
- kind: literal("redirect"),
13876
- /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
13877
- id: string(),
13878
- /** Operator-facing button label. */
13879
- label: string(),
13880
- /** lucide-react icon name. */
13881
- icon: string().optional(),
13882
- /** Addon-owned HTTP route the button navigates to (GET). */
13883
- startUrl: string(),
13884
- stage: LoginStageEnum
13885
- }), object({
13886
- kind: literal("widget"),
13887
- /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
13888
- id: string(),
13889
- /** Owning addon id drives the public bundle URL + the MF namespace. */
13890
- addonId: string(),
13891
- /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
13892
- bundle: string(),
13893
- /** MF remote descriptor `{ remoteName, exposedModule, componentKey }`. */
13894
- remote: WidgetRemoteSchema,
13895
- stage: LoginStageEnum
13896
- })]);
14064
+ /** One login-method contribution — redirect button, pre-auth widget, or native passkey ceremony. */
14065
+ var LoginMethodContributionSchema = discriminatedUnion("kind", [
14066
+ object({
14067
+ kind: literal("redirect"),
14068
+ /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
14069
+ id: string(),
14070
+ /** Operator-facing button label. */
14071
+ label: string(),
14072
+ /** lucide-react icon name. */
14073
+ icon: string().optional(),
14074
+ /** Addon-owned HTTP route the button navigates to (GET). */
14075
+ startUrl: string(),
14076
+ stage: LoginStageEnum
14077
+ }),
14078
+ object({
14079
+ kind: literal("widget"),
14080
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
14081
+ id: string(),
14082
+ /** Owning addon id — drives the public bundle URL + the MF namespace. */
14083
+ addonId: string(),
14084
+ /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
14085
+ bundle: string(),
14086
+ /** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
14087
+ remote: WidgetRemoteSchema,
14088
+ stage: LoginStageEnum
14089
+ }),
14090
+ object({
14091
+ kind: literal("passkey"),
14092
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-direct-login`). */
14093
+ id: string(),
14094
+ /** Operator-facing button label. */
14095
+ label: string(),
14096
+ stage: LoginStageEnum,
14097
+ /** Effective WebAuthn RP ID (`resolveRpID()`) — the shell gates visibility on it. */
14098
+ rpId: string(),
14099
+ /** Effective expected origin (`resolveOrigin()`), null when unconfigured. */
14100
+ origin: string().nullable()
14101
+ })
14102
+ ]);
13897
14103
  method(_void(), array(LoginMethodContributionSchema).readonly());
13898
14104
  /**
13899
14105
  * Orchestrator-side destination metadata. The orchestrator computes
@@ -15780,14 +15986,14 @@ var TargetKindCapsSchema = object({
15780
15986
  * the union is large and not meant for runtime validation here; the exported
15781
15987
  * `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
15782
15988
  */
15783
- var ConfigSchemaPassthrough = unknown();
15989
+ var ConfigSchemaPassthrough$1 = unknown();
15784
15990
  var TargetKindSchema = object({
15785
15991
  kind: string(),
15786
15992
  label: string(),
15787
15993
  icon: string(),
15788
15994
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
15789
15995
  addonId: string(),
15790
- configSchema: ConfigSchemaPassthrough,
15996
+ configSchema: ConfigSchemaPassthrough$1,
15791
15997
  supportsDiscovery: boolean(),
15792
15998
  caps: TargetKindCapsSchema
15793
15999
  });
@@ -15840,6 +16046,298 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
15840
16046
  enabled: boolean()
15841
16047
  }), _void(), { kind: "mutation" });
15842
16048
  /**
16049
+ * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
16050
+ * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
16051
+ * caps stay wire-compatible without a circular cap→cap import.
16052
+ *
16053
+ * Errors are a discriminated-union RESULT, never thrown: the shape survives
16054
+ * every transport tier structurally, and failed calls still write usage rows.
16055
+ * Token counts only in v1 — no costUsd (operator decision, 2026-07-15).
16056
+ */
16057
+ var LlmUsageSchema = object({
16058
+ inputTokens: number(),
16059
+ outputTokens: number()
16060
+ });
16061
+ var LlmErrorCodeSchema = _enum([
16062
+ "timeout",
16063
+ "rate-limited",
16064
+ "auth",
16065
+ "refusal",
16066
+ "bad-request",
16067
+ "unavailable",
16068
+ "no-profile",
16069
+ "budget-exceeded",
16070
+ "adapter-error"
16071
+ ]);
16072
+ var LlmGenerateResultSchema = discriminatedUnion("ok", [object({
16073
+ ok: literal(true),
16074
+ text: string(),
16075
+ model: string(),
16076
+ usage: LlmUsageSchema,
16077
+ truncated: boolean(),
16078
+ latencyMs: number()
16079
+ }), object({
16080
+ ok: literal(false),
16081
+ code: LlmErrorCodeSchema,
16082
+ message: string(),
16083
+ retryAfterMs: number().optional()
16084
+ })]);
16085
+ /**
16086
+ * `Uint8Array` is the sanctioned binary convention — superjson + the UDS
16087
+ * MsgPack channel round-trip typed arrays (embedding-encoder.cap.ts:29,
16088
+ * notification-output.cap.ts:27-31 precedents).
16089
+ */
16090
+ var LlmImageSchema = object({
16091
+ bytes: _instanceof(Uint8Array),
16092
+ mimeType: string()
16093
+ });
16094
+ var LlmGenerateBaseInputSchema = object({
16095
+ /** Collection routing (the notification-output posture). */
16096
+ addonId: string().optional(),
16097
+ /** Explicit profile; else the resolution chain (spec §3). */
16098
+ profileId: string().optional(),
16099
+ /** MANDATORY usage tag: 'ai-summary', 'notifier-rules', 'adhoc-ui', … */
16100
+ consumer: string(),
16101
+ system: string().optional(),
16102
+ /** v1: single-turn. `messages[]` is a v2 additive field. */
16103
+ prompt: string(),
16104
+ /** Structured output — adapter-mapped (response_format / forced tool / responseSchema). */
16105
+ jsonSchema: record(string(), unknown()).optional(),
16106
+ /** Per-call override of the profile default. */
16107
+ maxTokens: number().int().positive().optional(),
16108
+ temperature: number().optional()
16109
+ });
16110
+ /**
16111
+ * `llm-runtime` — node-side managed llama.cpp executor (spec §4). Registered
16112
+ * on EVERY node where `addon-ai` is installed; the hub `llm` provider reaches
16113
+ * a specific node's runtime with `nodePin(profile.runtime.nodeId)` — normal
16114
+ * cap routing, zero bespoke plumbing. `internal: true`: the operator reaches
16115
+ * this only through the `llm` cap's methods.
16116
+ *
16117
+ * One running llama-server child per node in v1 (models are RAM-heavy).
16118
+ * Resource ceiling = llama-server flags + idleStopMinutes ONLY (no RSS
16119
+ * watchdog — operator decision #3).
16120
+ */
16121
+ var ManagedModelRefSchema = discriminatedUnion("kind", [
16122
+ object({
16123
+ kind: literal("catalog"),
16124
+ catalogId: string()
16125
+ }),
16126
+ object({
16127
+ kind: literal("url"),
16128
+ url: string(),
16129
+ sha256: string().optional()
16130
+ }),
16131
+ object({
16132
+ kind: literal("path"),
16133
+ path: string()
16134
+ })
16135
+ ]);
16136
+ var ManagedRuntimeConfigSchema = object({
16137
+ /** WHERE the runtime lives — hub or any agent. */
16138
+ nodeId: string(),
16139
+ /** Closed for v1; 'ollama' is a v2 candidate. */
16140
+ engine: _enum(["llama-cpp"]),
16141
+ model: ManagedModelRefSchema,
16142
+ contextSize: number().int().default(4096),
16143
+ /** 0 = CPU-only. */
16144
+ gpuLayers: number().int().default(0),
16145
+ /** Default: cpus-2, clamped ≥1 (resolved node-side). */
16146
+ threads: number().int().optional(),
16147
+ /** Concurrent slots. */
16148
+ parallel: number().int().default(1),
16149
+ /** Else lazy: first generate boots it. */
16150
+ autoStart: boolean().default(false),
16151
+ /** 0 = never; frees RAM after quiet periods. */
16152
+ idleStopMinutes: number().int().default(30)
16153
+ });
16154
+ var LlmRuntimeStatusSchema = object({
16155
+ /** Status is ALWAYS node-qualified. */
16156
+ nodeId: string(),
16157
+ state: _enum([
16158
+ "stopped",
16159
+ "downloading",
16160
+ "starting",
16161
+ "ready",
16162
+ "crashed",
16163
+ "failed"
16164
+ ]),
16165
+ pid: number().optional(),
16166
+ port: number().optional(),
16167
+ modelPath: string().optional(),
16168
+ modelId: string().optional(),
16169
+ downloadProgress: number().min(0).max(1).optional(),
16170
+ lastError: string().optional(),
16171
+ crashesInWindow: number(),
16172
+ /** Child RSS (sampled best-effort). */
16173
+ memoryBytes: number().optional(),
16174
+ vramBytes: number().optional()
16175
+ });
16176
+ var LlmNodeModelSchema = object({
16177
+ file: string(),
16178
+ sizeBytes: number(),
16179
+ catalogId: string().optional(),
16180
+ installedAt: number().optional()
16181
+ });
16182
+ var LlmRuntimeDiskUsageSchema = object({
16183
+ nodeId: string(),
16184
+ modelsBytes: number(),
16185
+ freeBytes: number().optional()
16186
+ });
16187
+ method(LlmGenerateBaseInputSchema.extend({
16188
+ images: array(LlmImageSchema).optional(),
16189
+ runtime: ManagedRuntimeConfigSchema,
16190
+ /** The managed profile's timeout, threaded by the hub provider. */
16191
+ timeoutMs: number().int().positive().optional()
16192
+ }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
16193
+ kind: "mutation",
16194
+ auth: "admin"
16195
+ }), method(object({}), _void(), {
16196
+ kind: "mutation",
16197
+ auth: "admin"
16198
+ }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
16199
+ kind: "mutation",
16200
+ auth: "admin"
16201
+ }), method(object({ file: string() }), _void(), {
16202
+ kind: "mutation",
16203
+ auth: "admin"
16204
+ }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
16205
+ /**
16206
+ * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
16207
+ * methods concat-fan across providers; single-row methods route to ONE
16208
+ * provider by the `addonId` in the call input (the notification-output
16209
+ * posture, notification-output.cap.ts:215-250). Provided by `addon-ai`
16210
+ * (hub-placed); the cap stays open for future providers.
16211
+ *
16212
+ * Profiles are ROWS (data), not addons: one row = one usable model endpoint.
16213
+ * `apiKey` is a password field — providers REDACT it on read and merge on
16214
+ * write; a stored key NEVER round-trips to a client.
16215
+ */
16216
+ var LlmProfileKindSchema = _enum([
16217
+ "openai-compatible",
16218
+ "openai",
16219
+ "anthropic",
16220
+ "google",
16221
+ "managed-local"
16222
+ ]);
16223
+ var LlmProfileSchema = object({
16224
+ id: string(),
16225
+ name: string(),
16226
+ kind: LlmProfileKindSchema,
16227
+ /** Stamped by the provider — keeps the fanned catalog routable. */
16228
+ addonId: string(),
16229
+ enabled: boolean(),
16230
+ /** Vendor model id, or the managed runtime's loaded model. */
16231
+ model: string(),
16232
+ /** Required for openai-compatible; override for cloud kinds. */
16233
+ baseUrl: string().optional(),
16234
+ /** ConfigUISchema type:'password' — never round-trips (spec §5). */
16235
+ apiKey: string().optional(),
16236
+ supportsVision: boolean(),
16237
+ temperature: number().min(0).max(2).optional(),
16238
+ maxTokens: number().int().positive().optional(),
16239
+ timeoutMs: number().int().positive().default(6e4),
16240
+ extraHeaders: record(string(), string()).optional(),
16241
+ /** kind === 'managed-local' only (spec §4). */
16242
+ runtime: ManagedRuntimeConfigSchema.optional()
16243
+ });
16244
+ /** ConfigUISchema tree passed through untyped on the wire (the
16245
+ * notification-output `ConfigSchemaPassthrough` precedent at
16246
+ * notification-output.cap.ts:151); the exported TS type re-tightens it. */
16247
+ var ConfigSchemaPassthrough = unknown();
16248
+ var LlmProfileKindDescriptorSchema = object({
16249
+ kind: LlmProfileKindSchema,
16250
+ label: string(),
16251
+ icon: string(),
16252
+ /** Stamped by each provider so the concat-fanned catalog stays routable. */
16253
+ addonId: string(),
16254
+ configSchema: ConfigSchemaPassthrough
16255
+ });
16256
+ var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
16257
+ var LlmDefaultSchema = object({
16258
+ selector: LlmDefaultSelectorSchema,
16259
+ profileId: string()
16260
+ });
16261
+ /** Server-side rollup row — getUsage never dumps raw call rows (spec §6). */
16262
+ var LlmUsageRollupSchema = object({
16263
+ day: string(),
16264
+ consumer: string(),
16265
+ profileId: string(),
16266
+ calls: number(),
16267
+ okCalls: number(),
16268
+ errorCalls: number(),
16269
+ inputTokens: number(),
16270
+ outputTokens: number(),
16271
+ avgLatencyMs: number()
16272
+ });
16273
+ /** LLM-facing view over the reused ModelCatalogEntry mechanism (spec §4.2). */
16274
+ var ManagedModelCatalogEntrySchema = object({
16275
+ id: string(),
16276
+ label: string(),
16277
+ family: string(),
16278
+ purpose: _enum(["text", "vision"]),
16279
+ url: string(),
16280
+ sha256: string(),
16281
+ sizeBytes: number(),
16282
+ quantization: string(),
16283
+ /** Load-time guidance shown in the picker. */
16284
+ minRamBytes: number(),
16285
+ contextSizeDefault: number().int(),
16286
+ /** Vision models: companion projector file. */
16287
+ mmprojUrl: string().optional()
16288
+ });
16289
+ var LlmRuntimeNodeSchema = object({
16290
+ nodeId: string(),
16291
+ reachable: boolean(),
16292
+ status: LlmRuntimeStatusSchema.optional(),
16293
+ disk: LlmRuntimeDiskUsageSchema.optional(),
16294
+ error: string().optional()
16295
+ });
16296
+ var GenerateVisionInputSchema = LlmGenerateBaseInputSchema.extend({ images: array(LlmImageSchema).min(1) });
16297
+ var ProfileRefInputSchema = object({
16298
+ addonId: string(),
16299
+ profileId: string()
16300
+ });
16301
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
16302
+ kind: "mutation",
16303
+ auth: "admin"
16304
+ }), method(ProfileRefInputSchema, _void(), {
16305
+ kind: "mutation",
16306
+ auth: "admin"
16307
+ }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
16308
+ kind: "mutation",
16309
+ auth: "admin"
16310
+ }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
16311
+ selector: LlmDefaultSelectorSchema,
16312
+ profileId: string().nullable()
16313
+ }), _void(), {
16314
+ kind: "mutation",
16315
+ auth: "admin"
16316
+ }), method(object({
16317
+ since: number().optional(),
16318
+ until: number().optional(),
16319
+ consumer: string().optional(),
16320
+ profileId: string().optional()
16321
+ }), array(LlmUsageRollupSchema)), method(object({}), array(ManagedModelCatalogEntrySchema)), method(object({}), array(LlmRuntimeNodeSchema)), method(object({ nodeId: string() }), array(LlmNodeModelSchema)), method(object({
16322
+ nodeId: string(),
16323
+ model: ManagedModelRefSchema
16324
+ }), _void(), {
16325
+ kind: "mutation",
16326
+ auth: "admin"
16327
+ }), method(object({
16328
+ nodeId: string(),
16329
+ file: string()
16330
+ }), _void(), {
16331
+ kind: "mutation",
16332
+ auth: "admin"
16333
+ }), method(ProfileRefInputSchema, LlmRuntimeStatusSchema), method(ProfileRefInputSchema, LlmRuntimeStatusSchema, {
16334
+ kind: "mutation",
16335
+ auth: "admin"
16336
+ }), method(ProfileRefInputSchema, _void(), {
16337
+ kind: "mutation",
16338
+ auth: "admin"
16339
+ });
16340
+ /**
15843
16341
  * Zod schemas for persisted record types.
15844
16342
  *
15845
16343
  * These schemas serve as the single source of truth for types that are
@@ -16055,6 +16553,10 @@ var TrackSchema = object({
16055
16553
  snapshots: array(TrackSnapshotSchema).readonly(),
16056
16554
  /** Deduplicated zones the track has entered at least once. */
16057
16555
  zonesVisited: array(string()).readonly(),
16556
+ /** Deduplicated set of detector classes observed for this track over its
16557
+ * life (a track may be reclassified, e.g. person→vehicle). Absent on
16558
+ * legacy rows written before class accumulation shipped. */
16559
+ classes: array(string()).readonly().optional(),
16058
16560
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
16059
16561
  totalDistance: number(),
16060
16562
  state: TrackStateSchema,
@@ -16216,7 +16718,7 @@ var KeyEventSchema = object({
16216
16718
  /** Track lifetime in ms (lastSeen - firstSeen). */
16217
16719
  windowMs: number().optional()
16218
16720
  });
16219
- var TrackedDetectionSchema = object({
16721
+ object({
16220
16722
  trackId: string(),
16221
16723
  className: string(),
16222
16724
  confidence: number(),
@@ -16224,6 +16726,23 @@ var TrackedDetectionSchema = object({
16224
16726
  zones: array(string()).readonly(),
16225
16727
  state: TrackStateSchema
16226
16728
  });
16729
+ var OverlayDetectionSchema = looseObject({
16730
+ id: string(),
16731
+ kind: _enum(["first-level", "detail"]),
16732
+ macroClass: string(),
16733
+ score: number(),
16734
+ bbox: object({
16735
+ x: number(),
16736
+ y: number(),
16737
+ width: number(),
16738
+ height: number()
16739
+ }),
16740
+ labels: array(looseObject({
16741
+ label: string(),
16742
+ score: number()
16743
+ })).readonly(),
16744
+ parentId: string().optional()
16745
+ });
16227
16746
  var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: number() });
16228
16747
  var SearchObjectEventsInput = object({
16229
16748
  text: string(),
@@ -16234,6 +16753,20 @@ var SearchObjectEventsInput = object({
16234
16753
  limit: number().default(50),
16235
16754
  minScore: number().min(0).max(1).default(.2)
16236
16755
  });
16756
+ var TrackCascadeCountsSchema = object({
16757
+ /** Persisted track roots deleted (authoritative). */
16758
+ tracks: number().int(),
16759
+ /** Object events removed with their tracks (best-effort; see note above). */
16760
+ events: number().int(),
16761
+ /** Track/face/plate-owned media removed (best-effort). Never identity media. */
16762
+ media: number().int(),
16763
+ /** Unassigned (non-enrolled) face reads removed (best-effort). */
16764
+ faces: number().int(),
16765
+ /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
16766
+ plates: number().int(),
16767
+ /** Per-track CLIP search vectors removed (best-effort). */
16768
+ embeddings: number().int()
16769
+ });
16237
16770
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
16238
16771
  deviceId: number(),
16239
16772
  trackId: string()
@@ -16265,6 +16798,24 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
16265
16798
  }), {
16266
16799
  kind: "mutation",
16267
16800
  auth: "admin"
16801
+ }), method(object({
16802
+ deviceId: number(),
16803
+ cutoffMs: number()
16804
+ }), TrackCascadeCountsSchema, {
16805
+ kind: "mutation",
16806
+ auth: "admin"
16807
+ }), method(object({ deviceId: number() }), TrackCascadeCountsSchema, {
16808
+ kind: "mutation",
16809
+ auth: "admin"
16810
+ }), method(object({
16811
+ deviceId: number(),
16812
+ trackIds: array(string()).min(1)
16813
+ }), object({
16814
+ deleted: number().int(),
16815
+ failed: array(string()).readonly()
16816
+ }), {
16817
+ kind: "mutation",
16818
+ auth: "admin"
16268
16819
  }), method(object({
16269
16820
  eventId: string(),
16270
16821
  kind: MediaFileKindEnum.optional()
@@ -16273,7 +16824,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
16273
16824
  timestamp: number(),
16274
16825
  frameWidth: number(),
16275
16826
  frameHeight: number(),
16276
- detections: array(TrackedDetectionSchema).readonly()
16827
+ detections: array(OverlayDetectionSchema).readonly()
16277
16828
  }), object({
16278
16829
  deviceId: number(),
16279
16830
  trackId: string(),
@@ -19253,6 +19804,24 @@ DeviceType.Camera, method(object({
19253
19804
  deviceId: number(),
19254
19805
  status: OsdStatusSchema
19255
19806
  });
19807
+ var VehicleSchema = object({
19808
+ id: string(),
19809
+ name: string(),
19810
+ sampleCount: number().int().nonnegative(),
19811
+ coverMediaKey: string().optional(),
19812
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
19813
+ coverBase64: string().optional()
19814
+ });
19815
+ var VehicleSampleInfoSchema = object({
19816
+ id: string(),
19817
+ /** The plate text this sample enrolled (self-labeling — no embedding). */
19818
+ text: string(),
19819
+ /** OCR confidence of the enrolled read (0..1). */
19820
+ score: number(),
19821
+ addedAt: number().int(),
19822
+ deviceId: number().int().optional(),
19823
+ base64: string().optional()
19824
+ });
19256
19825
  var PlateInfoSchema = object({
19257
19826
  plateId: string(),
19258
19827
  deviceId: number().int(),
@@ -19264,6 +19833,16 @@ var PlateInfoSchema = object({
19264
19833
  score: number(),
19265
19834
  /** True when the text was manually corrected (exempt from retention). */
19266
19835
  corrected: boolean(),
19836
+ /** Recognized vehicle id when a matcher lookup named this read (SQL NULL → absent). */
19837
+ recognizedVehicleId: string().optional(),
19838
+ /** Resolved vehicle name for `recognizedVehicleId` (UI convenience). */
19839
+ vehicleName: string().optional(),
19840
+ /** True once the read was assigned to a vehicle (enrolled as a sample). */
19841
+ assigned: boolean(),
19842
+ /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
19843
+ plateBbox: BoundingBoxSchema.optional(),
19844
+ /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
19845
+ keyFrameMediaKey: string().optional(),
19267
19846
  base64: string().optional()
19268
19847
  });
19269
19848
  var MediaFileLiteSchema = object({
@@ -19303,6 +19882,48 @@ method(object({
19303
19882
  }), method(object({ plateId: string() }), _void(), {
19304
19883
  kind: "mutation",
19305
19884
  auth: "admin"
19885
+ }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
19886
+ kind: "mutation",
19887
+ auth: "admin"
19888
+ }), method(object({
19889
+ id: string(),
19890
+ name: string().min(1)
19891
+ }), _void(), {
19892
+ kind: "mutation",
19893
+ auth: "admin"
19894
+ }), method(object({ id: string() }), _void(), {
19895
+ kind: "mutation",
19896
+ auth: "admin"
19897
+ }), method(object({ vehicleId: string() }), array(VehicleSampleInfoSchema).readonly()), method(object({
19898
+ vehicleId: string(),
19899
+ sampleId: string()
19900
+ }), _void(), {
19901
+ kind: "mutation",
19902
+ auth: "admin"
19903
+ }), method(object({
19904
+ plateId: string(),
19905
+ vehicleId: string()
19906
+ }), _void(), {
19907
+ kind: "mutation",
19908
+ auth: "admin"
19909
+ }), method(object({ plateId: string() }), _void(), {
19910
+ kind: "mutation",
19911
+ auth: "admin"
19912
+ }), method(object({
19913
+ plateIds: array(string()).min(1),
19914
+ vehicleId: string()
19915
+ }), object({
19916
+ assigned: number().int(),
19917
+ failed: array(string()).readonly()
19918
+ }), {
19919
+ kind: "mutation",
19920
+ auth: "admin"
19921
+ }), method(object({ plateIds: array(string()).min(1) }), object({
19922
+ unassigned: number().int(),
19923
+ failed: array(string()).readonly()
19924
+ }), {
19925
+ kind: "mutation",
19926
+ auth: "admin"
19306
19927
  });
19307
19928
  var ModelFormatSchema = _enum(MODEL_FORMATS);
19308
19929
  var HwAccelBackendInputSchema = _enum([
@@ -21848,6 +22469,168 @@ Object.freeze({
21848
22469
  addonId: null,
21849
22470
  access: "create"
21850
22471
  },
22472
+ "llm.deleteModel": {
22473
+ capName: "llm",
22474
+ capScope: "system",
22475
+ addonId: null,
22476
+ access: "delete"
22477
+ },
22478
+ "llm.deleteProfile": {
22479
+ capName: "llm",
22480
+ capScope: "system",
22481
+ addonId: null,
22482
+ access: "delete"
22483
+ },
22484
+ "llm.generate": {
22485
+ capName: "llm",
22486
+ capScope: "system",
22487
+ addonId: null,
22488
+ access: "create"
22489
+ },
22490
+ "llm.generateVision": {
22491
+ capName: "llm",
22492
+ capScope: "system",
22493
+ addonId: null,
22494
+ access: "create"
22495
+ },
22496
+ "llm.getDefaults": {
22497
+ capName: "llm",
22498
+ capScope: "system",
22499
+ addonId: null,
22500
+ access: "view"
22501
+ },
22502
+ "llm.getRuntimeStatus": {
22503
+ capName: "llm",
22504
+ capScope: "system",
22505
+ addonId: null,
22506
+ access: "view"
22507
+ },
22508
+ "llm.getUsage": {
22509
+ capName: "llm",
22510
+ capScope: "system",
22511
+ addonId: null,
22512
+ access: "view"
22513
+ },
22514
+ "llm.installModel": {
22515
+ capName: "llm",
22516
+ capScope: "system",
22517
+ addonId: null,
22518
+ access: "create"
22519
+ },
22520
+ "llm.listModelCatalog": {
22521
+ capName: "llm",
22522
+ capScope: "system",
22523
+ addonId: null,
22524
+ access: "view"
22525
+ },
22526
+ "llm.listModels": {
22527
+ capName: "llm",
22528
+ capScope: "system",
22529
+ addonId: null,
22530
+ access: "view"
22531
+ },
22532
+ "llm.listNodeModels": {
22533
+ capName: "llm",
22534
+ capScope: "system",
22535
+ addonId: null,
22536
+ access: "view"
22537
+ },
22538
+ "llm.listProfileKinds": {
22539
+ capName: "llm",
22540
+ capScope: "system",
22541
+ addonId: null,
22542
+ access: "view"
22543
+ },
22544
+ "llm.listProfiles": {
22545
+ capName: "llm",
22546
+ capScope: "system",
22547
+ addonId: null,
22548
+ access: "view"
22549
+ },
22550
+ "llm.listRuntimeNodes": {
22551
+ capName: "llm",
22552
+ capScope: "system",
22553
+ addonId: null,
22554
+ access: "view"
22555
+ },
22556
+ "llm.setDefault": {
22557
+ capName: "llm",
22558
+ capScope: "system",
22559
+ addonId: null,
22560
+ access: "create"
22561
+ },
22562
+ "llm.startRuntime": {
22563
+ capName: "llm",
22564
+ capScope: "system",
22565
+ addonId: null,
22566
+ access: "create"
22567
+ },
22568
+ "llm.stopRuntime": {
22569
+ capName: "llm",
22570
+ capScope: "system",
22571
+ addonId: null,
22572
+ access: "create"
22573
+ },
22574
+ "llm.testProfile": {
22575
+ capName: "llm",
22576
+ capScope: "system",
22577
+ addonId: null,
22578
+ access: "create"
22579
+ },
22580
+ "llm.upsertProfile": {
22581
+ capName: "llm",
22582
+ capScope: "system",
22583
+ addonId: null,
22584
+ access: "create"
22585
+ },
22586
+ "llmRuntime.complete": {
22587
+ capName: "llm-runtime",
22588
+ capScope: "system",
22589
+ addonId: null,
22590
+ access: "create"
22591
+ },
22592
+ "llmRuntime.deleteModel": {
22593
+ capName: "llm-runtime",
22594
+ capScope: "system",
22595
+ addonId: null,
22596
+ access: "delete"
22597
+ },
22598
+ "llmRuntime.ensureStarted": {
22599
+ capName: "llm-runtime",
22600
+ capScope: "system",
22601
+ addonId: null,
22602
+ access: "create"
22603
+ },
22604
+ "llmRuntime.getDiskUsage": {
22605
+ capName: "llm-runtime",
22606
+ capScope: "system",
22607
+ addonId: null,
22608
+ access: "view"
22609
+ },
22610
+ "llmRuntime.installModel": {
22611
+ capName: "llm-runtime",
22612
+ capScope: "system",
22613
+ addonId: null,
22614
+ access: "create"
22615
+ },
22616
+ "llmRuntime.listLocalModels": {
22617
+ capName: "llm-runtime",
22618
+ capScope: "system",
22619
+ addonId: null,
22620
+ access: "view"
22621
+ },
22622
+ "llmRuntime.status": {
22623
+ capName: "llm-runtime",
22624
+ capScope: "system",
22625
+ addonId: null,
22626
+ access: "view"
22627
+ },
22628
+ "llmRuntime.stop": {
22629
+ capName: "llm-runtime",
22630
+ capScope: "system",
22631
+ addonId: null,
22632
+ access: "create"
22633
+ },
21851
22634
  "localNetwork.getAllowedAddresses": {
21852
22635
  capName: "local-network",
21853
22636
  capScope: "system",
@@ -22478,6 +23261,12 @@ Object.freeze({
22478
23261
  addonId: null,
22479
23262
  access: "delete"
22480
23263
  },
23264
+ "pipelineAnalytics.deleteTracks": {
23265
+ capName: "pipeline-analytics",
23266
+ capScope: "device",
23267
+ addonId: null,
23268
+ access: "delete"
23269
+ },
22481
23270
  "pipelineAnalytics.getActiveTracks": {
22482
23271
  capName: "pipeline-analytics",
22483
23272
  capScope: "device",
@@ -22544,12 +23333,24 @@ Object.freeze({
22544
23333
  addonId: null,
22545
23334
  access: "create"
22546
23335
  },
23336
+ "pipelineAnalytics.pruneTracksBefore": {
23337
+ capName: "pipeline-analytics",
23338
+ capScope: "device",
23339
+ addonId: null,
23340
+ access: "create"
23341
+ },
22547
23342
  "pipelineAnalytics.searchObjectEvents": {
22548
23343
  capName: "pipeline-analytics",
22549
23344
  capScope: "device",
22550
23345
  addonId: null,
22551
23346
  access: "view"
22552
23347
  },
23348
+ "pipelineAnalytics.wipeAllAnalytics": {
23349
+ capName: "pipeline-analytics",
23350
+ capScope: "device",
23351
+ addonId: null,
23352
+ access: "delete"
23353
+ },
22553
23354
  "pipelineExecutor.cacheFrameInPool": {
22554
23355
  capName: "pipeline-executor",
22555
23356
  capScope: "system",
@@ -23054,18 +23855,42 @@ Object.freeze({
23054
23855
  addonId: null,
23055
23856
  access: "create"
23056
23857
  },
23858
+ "plateGallery.assignPlate": {
23859
+ capName: "plate-gallery",
23860
+ capScope: "system",
23861
+ addonId: null,
23862
+ access: "create"
23863
+ },
23864
+ "plateGallery.assignPlates": {
23865
+ capName: "plate-gallery",
23866
+ capScope: "system",
23867
+ addonId: null,
23868
+ access: "create"
23869
+ },
23057
23870
  "plateGallery.correctPlateText": {
23058
23871
  capName: "plate-gallery",
23059
23872
  capScope: "system",
23060
23873
  addonId: null,
23061
23874
  access: "create"
23062
23875
  },
23876
+ "plateGallery.createVehicle": {
23877
+ capName: "plate-gallery",
23878
+ capScope: "system",
23879
+ addonId: null,
23880
+ access: "create"
23881
+ },
23063
23882
  "plateGallery.deletePlate": {
23064
23883
  capName: "plate-gallery",
23065
23884
  capScope: "system",
23066
23885
  addonId: null,
23067
23886
  access: "delete"
23068
23887
  },
23888
+ "plateGallery.deleteVehicle": {
23889
+ capName: "plate-gallery",
23890
+ capScope: "system",
23891
+ addonId: null,
23892
+ access: "delete"
23893
+ },
23069
23894
  "plateGallery.getPlateByTrack": {
23070
23895
  capName: "plate-gallery",
23071
23896
  capScope: "system",
@@ -23084,6 +23909,30 @@ Object.freeze({
23084
23909
  addonId: null,
23085
23910
  access: "view"
23086
23911
  },
23912
+ "plateGallery.listVehicles": {
23913
+ capName: "plate-gallery",
23914
+ capScope: "system",
23915
+ addonId: null,
23916
+ access: "view"
23917
+ },
23918
+ "plateGallery.listVehicleSamples": {
23919
+ capName: "plate-gallery",
23920
+ capScope: "system",
23921
+ addonId: null,
23922
+ access: "view"
23923
+ },
23924
+ "plateGallery.removeVehicleSample": {
23925
+ capName: "plate-gallery",
23926
+ capScope: "system",
23927
+ addonId: null,
23928
+ access: "delete"
23929
+ },
23930
+ "plateGallery.renameVehicle": {
23931
+ capName: "plate-gallery",
23932
+ capScope: "system",
23933
+ addonId: null,
23934
+ access: "create"
23935
+ },
23087
23936
  "plateGallery.searchPlates": {
23088
23937
  capName: "plate-gallery",
23089
23938
  capScope: "system",
@@ -23096,6 +23945,18 @@ Object.freeze({
23096
23945
  addonId: null,
23097
23946
  access: "view"
23098
23947
  },
23948
+ "plateGallery.unassignPlate": {
23949
+ capName: "plate-gallery",
23950
+ capScope: "system",
23951
+ addonId: null,
23952
+ access: "create"
23953
+ },
23954
+ "plateGallery.unassignPlates": {
23955
+ capName: "plate-gallery",
23956
+ capScope: "system",
23957
+ addonId: null,
23958
+ access: "create"
23959
+ },
23099
23960
  "platformProbe.getCapabilities": {
23100
23961
  capName: "platform-probe",
23101
23962
  capScope: "system",
@@ -23288,6 +24149,48 @@ Object.freeze({
23288
24149
  addonId: null,
23289
24150
  access: "create"
23290
24151
  },
24152
+ "sceneMonitor.captureReference": {
24153
+ capName: "scene-monitor",
24154
+ capScope: "device",
24155
+ addonId: null,
24156
+ access: "create"
24157
+ },
24158
+ "sceneMonitor.createScene": {
24159
+ capName: "scene-monitor",
24160
+ capScope: "device",
24161
+ addonId: null,
24162
+ access: "create"
24163
+ },
24164
+ "sceneMonitor.deleteReference": {
24165
+ capName: "scene-monitor",
24166
+ capScope: "device",
24167
+ addonId: null,
24168
+ access: "delete"
24169
+ },
24170
+ "sceneMonitor.deleteScene": {
24171
+ capName: "scene-monitor",
24172
+ capScope: "device",
24173
+ addonId: null,
24174
+ access: "delete"
24175
+ },
24176
+ "sceneMonitor.listScenes": {
24177
+ capName: "scene-monitor",
24178
+ capScope: "device",
24179
+ addonId: null,
24180
+ access: "view"
24181
+ },
24182
+ "sceneMonitor.recheckNow": {
24183
+ capName: "scene-monitor",
24184
+ capScope: "device",
24185
+ addonId: null,
24186
+ access: "create"
24187
+ },
24188
+ "sceneMonitor.updateScene": {
24189
+ capName: "scene-monitor",
24190
+ capScope: "device",
24191
+ addonId: null,
24192
+ access: "create"
24193
+ },
23291
24194
  "scriptRunner.run": {
23292
24195
  capName: "script-runner",
23293
24196
  capScope: "device",
@@ -24372,6 +25275,7 @@ Object.freeze({
24372
25275
  Object.freeze({
24373
25276
  "broker": "broker",
24374
25277
  "device-export": "device-export",
25278
+ "llm": "ai",
24375
25279
  "mesh-network": "mesh",
24376
25280
  "mqtt-broker": "broker",
24377
25281
  "network-access": "ingress",