@camstack/addon-advanced-notifier 1.1.22 → 1.1.24

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