@camstack/addon-post-analysis 1.1.26 → 1.1.28

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.
@@ -4286,6 +4286,14 @@ function object(shape, params) {
4286
4286
  ...normalizeParams(params)
4287
4287
  });
4288
4288
  }
4289
+ function looseObject(shape, params) {
4290
+ return new ZodObject({
4291
+ type: "object",
4292
+ shape,
4293
+ catchall: unknown(),
4294
+ ...normalizeParams(params)
4295
+ });
4296
+ }
4289
4297
  var ZodUnion = /*@__PURE__*/ $constructor("ZodUnion", (inst, def) => {
4290
4298
  $ZodUnion.init(inst, def);
4291
4299
  ZodType.init(inst, def);
@@ -4627,7 +4635,7 @@ function _instanceof(cls, params = {}) {
4627
4635
  return inst;
4628
4636
  }
4629
4637
  //#endregion
4630
- //#region ../types/dist/sleep-BC9Yqte7.mjs
4638
+ //#region ../types/dist/sleep-DkhOVOjW.mjs
4631
4639
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4632
4640
  EventCategory["SystemBoot"] = "system.boot";
4633
4641
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5037,10 +5045,43 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5037
5045
  EventCategory["EnrichmentEmbeddingStored"] = "enrichment.embedding.stored";
5038
5046
  EventCategory["EnrichmentSceneStateChanged"] = "enrichment.scene.state-changed";
5039
5047
  EventCategory["EnrichmentActivitySummary"] = "enrichment.activity.summary";
5048
+ /**
5049
+ * Unified track-lifecycle event: ONE category carrying `phase:
5050
+ * 'start' | 'update' | 'end'` with a rich, typed
5051
+ * `PipelineAnalyticsTrackLifecyclePayload`. Supersedes the thin
5052
+ * `PipelineAnalyticsTrackStarted` / `PipelineAnalyticsTrackEnded`
5053
+ * pair — a consumer subscribes once and branches on `phase`.
5054
+ */
5055
+ EventCategory["PipelineAnalyticsTrackLifecycle"] = "pipeline-analytics.track-lifecycle";
5056
+ /**
5057
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
5058
+ * (`phase:'start'`). Kept as a soft alias — no known subscribers.
5059
+ */
5040
5060
  EventCategory["PipelineAnalyticsTrackStarted"] = "pipeline-analytics.track-started";
5061
+ /**
5062
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
5063
+ * (`phase:'end'`). Kept as a soft alias — no known subscribers.
5064
+ */
5041
5065
  EventCategory["PipelineAnalyticsTrackEnded"] = "pipeline-analytics.track-ended";
5042
5066
  EventCategory["PipelineAnalyticsDetectionEvent"] = "pipeline-analytics.detection-event";
5043
5067
  EventCategory["PipelineAnalyticsFrameTracked"] = "pipeline-analytics.frame-tracked";
5068
+ /**
5069
+ * Fired by `addon-post-analysis` whenever a gallery face row changes:
5070
+ * `kind:'buffered'` a new detected face was persisted, `'assigned'` /
5071
+ * `'unassigned'` its identity link changed, `'deleted'` the row was
5072
+ * removed. Telemetry semantics (D8): a lost event only delays a refresh,
5073
+ * never a correctness issue. Payload `PipelineAnalyticsFaceGalleryChangedPayload`.
5074
+ */
5075
+ EventCategory["PipelineAnalyticsFaceGalleryChanged"] = "pipeline-analytics.face-gallery-changed";
5076
+ /**
5077
+ * Fired by `addon-post-analysis` whenever a gallery plate row changes:
5078
+ * `kind:'buffered'` a new read was persisted (`PlateRecognizer.onTrackEnd`),
5079
+ * `'assigned'` / `'unassigned'` its vehicle link changed
5080
+ * (`PlateGalleryProvider`), `'deleted'` the row was removed. Telemetry
5081
+ * semantics (D8): a lost event only delays a refresh, never a correctness
5082
+ * issue. Payload `PipelineAnalyticsPlateGalleryChangedPayload`.
5083
+ */
5084
+ EventCategory["PipelineAnalyticsPlateGalleryChanged"] = "pipeline-analytics.plate-gallery-changed";
5044
5085
  EventCategory["FrigateLiveEvent"] = "frigate.live-event";
5045
5086
  EventCategory["CameraStreamsProfileSlotsChanged"] = "camera-streams.onProfileSlotsChanged";
5046
5087
  /**
@@ -6358,11 +6399,6 @@ var ProfileRtspEntrySchema = object({
6358
6399
  codec: string().optional(),
6359
6400
  resolution: CamStreamResolutionSchema.optional()
6360
6401
  });
6361
- /** Narrow an unknown value to a plain `Record<string, unknown>` or return null. */
6362
- function asJsonObject(value) {
6363
- if (value === null || typeof value !== "object" || Array.isArray(value)) return null;
6364
- return { ...value };
6365
- }
6366
6402
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6367
6403
  DeviceType["Camera"] = "camera";
6368
6404
  DeviceType["Hub"] = "hub";
@@ -6886,7 +6922,8 @@ var MODEL_FORMATS = [
6886
6922
  "coreml",
6887
6923
  "openvino",
6888
6924
  "tflite",
6889
- "pt"
6925
+ "pt",
6926
+ "gguf"
6890
6927
  ];
6891
6928
  /**
6892
6929
  * Multi-file format payload.
@@ -6930,7 +6967,8 @@ var ModelFormatsSchema = object({
6930
6967
  coreml: ModelFormatEntrySchema.optional(),
6931
6968
  openvino: ModelFormatEntrySchema.optional(),
6932
6969
  tflite: ModelFormatEntrySchema.optional(),
6933
- pt: ModelFormatEntrySchema.optional()
6970
+ pt: ModelFormatEntrySchema.optional(),
6971
+ gguf: ModelFormatEntrySchema.optional()
6934
6972
  });
6935
6973
  /**
6936
6974
  * Variant-selector grouping axes. Shared by the full `ModelCatalogEntry` and by
@@ -10520,7 +10558,8 @@ var ModelFormatSchema$1 = _enum([
10520
10558
  "coreml",
10521
10559
  "openvino",
10522
10560
  "tflite",
10523
- "pt"
10561
+ "pt",
10562
+ "gguf"
10524
10563
  ]);
10525
10564
  var PipelineSlotSchema = _enum([
10526
10565
  "detector",
@@ -10775,7 +10814,15 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
10775
10814
  image: _instanceof(Uint8Array).optional(),
10776
10815
  referenceImage: string().optional(),
10777
10816
  deviceId: number().optional(),
10778
- sessionId: string().optional()
10817
+ sessionId: string().optional(),
10818
+ /**
10819
+ * Execution plane. 'full' (default) runs the whole tree — benchmark,
10820
+ * reference-image, and detail-subtree calls. 'frame' is the live
10821
+ * per-frame dispatch: ONLY root-plane steps run; crop children
10822
+ * (inputClasses ≠ null) are skipped and served per-track via
10823
+ * pipelineRunner.runDetailSubtree (two-plane design).
10824
+ */
10825
+ plane: _enum(["full", "frame"]).optional()
10779
10826
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
10780
10827
  engine: PipelineEngineChoiceSchema.optional(),
10781
10828
  steps: array(PipelineStepInputSchema).min(1),
@@ -10918,6 +10965,28 @@ var NativeCropResultSchema = object({
10918
10965
  width: number().int().positive(),
10919
10966
  height: number().int().positive()
10920
10967
  });
10968
+ /** Parent detection context passed to `runDetailSubtree` — the crop's
10969
+ * originating detection, in FRAME-space coordinates. Reuses
10970
+ * `NativeCropBboxSchema`'s `{x,y,w,h}` shape (same numeric fields; here
10971
+ * the coordinates are frame-space rather than getNativeCrop's
10972
+ * normalized [0,1] convention). */
10973
+ var DetailParentSchema = object({
10974
+ bbox: NativeCropBboxSchema,
10975
+ className: string()
10976
+ });
10977
+ /** One child-step result from `runDetailSubtree` — an embedding, label,
10978
+ * or refined detection produced by running the crop-subtree on a
10979
+ * single tracked detection. */
10980
+ var DetailResultSchema = object({
10981
+ stepId: string(),
10982
+ className: string(),
10983
+ score: number(),
10984
+ /** FRAME-space bbox (already mapped back from crop space). */
10985
+ bbox: NativeCropBboxSchema.optional(),
10986
+ embedding: string().optional(),
10987
+ label: string().optional(),
10988
+ alignedCropJpeg: string().optional()
10989
+ });
10921
10990
  /**
10922
10991
  * Per-camera tunable ranges + defaults. Single source of truth used
10923
10992
  * by both the Zod data schema (validation + default fallback) and
@@ -11178,7 +11247,13 @@ method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mu
11178
11247
  handle: FrameHandleSchema,
11179
11248
  bbox: NativeCropBboxSchema,
11180
11249
  maxWidth: number().int().positive().optional()
11181
- }), NativeCropResultSchema.nullable());
11250
+ }), NativeCropResultSchema.nullable()), method(object({
11251
+ deviceId: number(),
11252
+ frameHandle: FrameHandleSchema.optional(),
11253
+ cropJpeg: string().optional(),
11254
+ parent: DetailParentSchema,
11255
+ steps: array(string()).optional()
11256
+ }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" });
11182
11257
  object({
11183
11258
  detected: boolean(),
11184
11259
  /** Ms epoch of the last detected-true observation. Null if never detected. */
@@ -11790,6 +11865,140 @@ DeviceType.Camera, method(object({ deviceId: number() }), PtzAutotrackStatusSche
11790
11865
  deviceId: number(),
11791
11866
  status: PtzAutotrackStatusSchema
11792
11867
  });
11868
+ /**
11869
+ * scene-monitor — device-scoped reference-region state cap. An operator marks
11870
+ * a rect ROI on a camera frame and names one or more states; the engine
11871
+ * (pipeline-analytics, designated post-processing node) reports which state is
11872
+ * active on an ongoing basis. Two operator-selectable check modes share every-
11873
+ * thing except the comparator: `similarity` (CLIP cosine at the same ROI coords
11874
+ * vs condition-tagged references) and `llm` (vision-LLM judgment over the crop).
11875
+ *
11876
+ * D14 device-config archetype (`deviceConfig.ui.kind:'widget'`) — the framework
11877
+ * derives the device-detail contribution; the provider carries NO hand-written
11878
+ * settings-contribution methods. `status.kind:'push'` — the engine pushes on
11879
+ * every hysteresis flip / availability change; consumers never poll.
11880
+ */
11881
+ /** Extensible condition tag. Seeded 'day' | 'night'; open by design so more can
11882
+ * be added without a wire break (matching falls back to any-condition refs). */
11883
+ var SceneConditionSchema = string();
11884
+ /** One captured reference — condition-tagged, model-version-gated. `embedding`
11885
+ * is `number[]` (Float32Array does NOT survive MsgPack/UDS). */
11886
+ var SceneReferenceSchema = object({
11887
+ embedding: array(number()),
11888
+ modelId: string(),
11889
+ condition: SceneConditionSchema,
11890
+ capturedAt: number(),
11891
+ thumbnailMediaId: string().optional()
11892
+ });
11893
+ var SceneMonitorStateSchema = object({
11894
+ id: string(),
11895
+ label: string(),
11896
+ references: array(SceneReferenceSchema),
11897
+ textPrompts: array(string()).optional(),
11898
+ referenceCount: number(),
11899
+ currentlyMatched: boolean()
11900
+ });
11901
+ /** Per-mode comparator params in a discriminated union so an `llm` scene never
11902
+ * carries similarity knobs and vice-versa. */
11903
+ var SceneCheckSchema = discriminatedUnion("mode", [object({
11904
+ mode: literal("similarity"),
11905
+ threshold: number().min(0).max(1),
11906
+ hysteresisCount: number().int().positive()
11907
+ }), object({
11908
+ mode: literal("llm"),
11909
+ prompt: string(),
11910
+ profileId: string().optional(),
11911
+ hysteresisCount: number().int().positive()
11912
+ })]);
11913
+ var SceneMonitorSchema = object({
11914
+ id: string(),
11915
+ label: string(),
11916
+ roi: MaskRectShapeSchema,
11917
+ enabled: boolean(),
11918
+ triggerMode: _enum([
11919
+ "periodic",
11920
+ "on-motion",
11921
+ "both"
11922
+ ]),
11923
+ checkIntervalSec: number().optional(),
11924
+ check: SceneCheckSchema,
11925
+ states: array(SceneMonitorStateSchema),
11926
+ currentStateId: string().nullable(),
11927
+ lastCheckedAt: number().nullable(),
11928
+ lastConfidence: number().nullable(),
11929
+ currentCondition: SceneConditionSchema.nullable(),
11930
+ availability: _enum(["ok", "unavailable"]),
11931
+ unavailableReason: string().nullable()
11932
+ });
11933
+ var SceneMonitorStatusSchema = object({
11934
+ monitors: array(SceneMonitorSchema),
11935
+ lastFetchedAt: number()
11936
+ });
11937
+ DeviceType.Camera, method(object({ deviceId: number() }), SceneMonitorStatusSchema), method(object({
11938
+ deviceId: number(),
11939
+ label: string(),
11940
+ roi: MaskRectShapeSchema,
11941
+ check: SceneCheckSchema,
11942
+ triggerMode: _enum([
11943
+ "periodic",
11944
+ "on-motion",
11945
+ "both"
11946
+ ]).optional(),
11947
+ checkIntervalSec: number().optional()
11948
+ }), SceneMonitorSchema, {
11949
+ kind: "mutation",
11950
+ auth: "admin"
11951
+ }), method(object({
11952
+ deviceId: number(),
11953
+ monitorId: string(),
11954
+ patch: object({
11955
+ label: string().optional(),
11956
+ roi: MaskRectShapeSchema.optional(),
11957
+ enabled: boolean().optional(),
11958
+ triggerMode: _enum([
11959
+ "periodic",
11960
+ "on-motion",
11961
+ "both"
11962
+ ]).optional(),
11963
+ checkIntervalSec: number().optional(),
11964
+ check: SceneCheckSchema.optional()
11965
+ })
11966
+ }), _void(), {
11967
+ kind: "mutation",
11968
+ auth: "admin"
11969
+ }), method(object({
11970
+ deviceId: number(),
11971
+ monitorId: string()
11972
+ }), _void(), {
11973
+ kind: "mutation",
11974
+ auth: "admin"
11975
+ }), method(object({
11976
+ deviceId: number(),
11977
+ monitorId: string(),
11978
+ stateId: string().optional(),
11979
+ label: string().optional(),
11980
+ condition: SceneConditionSchema.optional()
11981
+ }), object({
11982
+ stateId: string(),
11983
+ referenceCount: number()
11984
+ }), {
11985
+ kind: "mutation",
11986
+ auth: "admin"
11987
+ }), method(object({
11988
+ deviceId: number(),
11989
+ monitorId: string(),
11990
+ stateId: string(),
11991
+ index: number()
11992
+ }), _void(), {
11993
+ kind: "mutation",
11994
+ auth: "admin"
11995
+ }), method(object({
11996
+ deviceId: number(),
11997
+ monitorId: string()
11998
+ }), _void(), {
11999
+ kind: "mutation",
12000
+ auth: "admin"
12001
+ });
11793
12002
  object({
11794
12003
  /** Whether the script is currently executing. */
11795
12004
  isRunning: boolean(),
@@ -12866,7 +13075,12 @@ var NotificationRuleConditionsSchema = object({
12866
13075
  clipDescription: object({
12867
13076
  text: string().min(1),
12868
13077
  minSimilarity: number().min(0).max(1)
12869
- }).optional()
13078
+ }).optional(),
13079
+ /** Match events whose recognized-entity label (face identity name or plate
13080
+ * vehicle name, propagated onto `event.data.label`) is one of these values.
13081
+ * Empty/absent → unaffected (back-compat). Enables "notify me when <named
13082
+ * vehicle/person> is seen". */
13083
+ labels: array(string()).readonly().optional()
12870
13084
  });
12871
13085
  var NotificationRuleTemplateSchema = object({
12872
13086
  title: string(),
@@ -13124,11 +13338,19 @@ method(object({
13124
13338
  * login page needs NO change.
13125
13339
  *
13126
13340
  * - `widget` — a Module-Federation widget the login page mounts (via
13127
- * `loadRemoteBundle`) for an in-page ceremony. Covers the passkey
13128
- * login ceremony, which must run `@simplewebauthn/browser` INSIDE the
13129
- * addon bundle. The referenced widget also declares `preAuth: true` in
13130
- * its `addon-widgets-source` catalog entry. `auth.listLoginMethods`
13131
- * stamps a public `bundleUrl` from `addonId` + `bundle`.
13341
+ * `loadRemoteBundle`) for an in-page ceremony. `auth.listLoginMethods`
13342
+ * stamps a public `bundleUrl` from `addonId` + `bundle`. Generic
13343
+ * mechanism kept for future use; no shipped addon uses it on the login
13344
+ * page (the passkey ceremony below runs natively in the shell instead).
13345
+ *
13346
+ * - `passkey` — a declarative WebAuthn ceremony the shell renders
13347
+ * natively (`@simplewebauthn/browser` lives in `addon-admin-ui`, not in
13348
+ * a remotely-loaded bundle). Carries the addon's effective `rpId` /
13349
+ * `origin` (from its `resolveRpID()` / `resolveOrigin()`) so the shell
13350
+ * can gate visibility (IP-literal origin, hostname/rpId mismatch) WITHOUT
13351
+ * fetching any remote code pre-auth. Contribution stays unconditional —
13352
+ * enrollment state is never leaked pre-auth; visibility is a shell
13353
+ * decision.
13132
13354
  *
13133
13355
  * Every contribution carries a `stage`:
13134
13356
  * - `primary` — shown on the first credentials screen (OIDC /
@@ -13142,30 +13364,45 @@ method(object({
13142
13364
  */
13143
13365
  /** When a login method renders in the two-phase login flow. */
13144
13366
  var LoginStageEnum = _enum(["primary", "second-factor"]);
13145
- /** One login-method contribution — redirect button OR pre-auth widget. */
13146
- var LoginMethodContributionSchema = discriminatedUnion("kind", [object({
13147
- kind: literal("redirect"),
13148
- /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
13149
- id: string(),
13150
- /** Operator-facing button label. */
13151
- label: string(),
13152
- /** lucide-react icon name. */
13153
- icon: string().optional(),
13154
- /** Addon-owned HTTP route the button navigates to (GET). */
13155
- startUrl: string(),
13156
- stage: LoginStageEnum
13157
- }), object({
13158
- kind: literal("widget"),
13159
- /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
13160
- id: string(),
13161
- /** Owning addon id drives the public bundle URL + the MF namespace. */
13162
- addonId: string(),
13163
- /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
13164
- bundle: string(),
13165
- /** MF remote descriptor `{ remoteName, exposedModule, componentKey }`. */
13166
- remote: WidgetRemoteSchema,
13167
- stage: LoginStageEnum
13168
- })]);
13367
+ /** One login-method contribution — redirect button, pre-auth widget, or native passkey ceremony. */
13368
+ var LoginMethodContributionSchema = discriminatedUnion("kind", [
13369
+ object({
13370
+ kind: literal("redirect"),
13371
+ /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
13372
+ id: string(),
13373
+ /** Operator-facing button label. */
13374
+ label: string(),
13375
+ /** lucide-react icon name. */
13376
+ icon: string().optional(),
13377
+ /** Addon-owned HTTP route the button navigates to (GET). */
13378
+ startUrl: string(),
13379
+ stage: LoginStageEnum
13380
+ }),
13381
+ object({
13382
+ kind: literal("widget"),
13383
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
13384
+ id: string(),
13385
+ /** Owning addon id — drives the public bundle URL + the MF namespace. */
13386
+ addonId: string(),
13387
+ /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
13388
+ bundle: string(),
13389
+ /** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
13390
+ remote: WidgetRemoteSchema,
13391
+ stage: LoginStageEnum
13392
+ }),
13393
+ object({
13394
+ kind: literal("passkey"),
13395
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-direct-login`). */
13396
+ id: string(),
13397
+ /** Operator-facing button label. */
13398
+ label: string(),
13399
+ stage: LoginStageEnum,
13400
+ /** Effective WebAuthn RP ID (`resolveRpID()`) — the shell gates visibility on it. */
13401
+ rpId: string(),
13402
+ /** Effective expected origin (`resolveOrigin()`), null when unconfigured. */
13403
+ origin: string().nullable()
13404
+ })
13405
+ ]);
13169
13406
  method(_void(), array(LoginMethodContributionSchema).readonly());
13170
13407
  /**
13171
13408
  * Orchestrator-side destination metadata. The orchestrator computes
@@ -15003,14 +15240,14 @@ var TargetKindCapsSchema = object({
15003
15240
  * the union is large and not meant for runtime validation here; the exported
15004
15241
  * `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
15005
15242
  */
15006
- var ConfigSchemaPassthrough = unknown();
15243
+ var ConfigSchemaPassthrough$1 = unknown();
15007
15244
  var TargetKindSchema = object({
15008
15245
  kind: string(),
15009
15246
  label: string(),
15010
15247
  icon: string(),
15011
15248
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
15012
15249
  addonId: string(),
15013
- configSchema: ConfigSchemaPassthrough,
15250
+ configSchema: ConfigSchemaPassthrough$1,
15014
15251
  supportsDiscovery: boolean(),
15015
15252
  caps: TargetKindCapsSchema
15016
15253
  });
@@ -15063,6 +15300,298 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
15063
15300
  enabled: boolean()
15064
15301
  }), _void(), { kind: "mutation" });
15065
15302
  /**
15303
+ * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
15304
+ * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
15305
+ * caps stay wire-compatible without a circular cap→cap import.
15306
+ *
15307
+ * Errors are a discriminated-union RESULT, never thrown: the shape survives
15308
+ * every transport tier structurally, and failed calls still write usage rows.
15309
+ * Token counts only in v1 — no costUsd (operator decision, 2026-07-15).
15310
+ */
15311
+ var LlmUsageSchema = object({
15312
+ inputTokens: number(),
15313
+ outputTokens: number()
15314
+ });
15315
+ var LlmErrorCodeSchema = _enum([
15316
+ "timeout",
15317
+ "rate-limited",
15318
+ "auth",
15319
+ "refusal",
15320
+ "bad-request",
15321
+ "unavailable",
15322
+ "no-profile",
15323
+ "budget-exceeded",
15324
+ "adapter-error"
15325
+ ]);
15326
+ var LlmGenerateResultSchema = discriminatedUnion("ok", [object({
15327
+ ok: literal(true),
15328
+ text: string(),
15329
+ model: string(),
15330
+ usage: LlmUsageSchema,
15331
+ truncated: boolean(),
15332
+ latencyMs: number()
15333
+ }), object({
15334
+ ok: literal(false),
15335
+ code: LlmErrorCodeSchema,
15336
+ message: string(),
15337
+ retryAfterMs: number().optional()
15338
+ })]);
15339
+ /**
15340
+ * `Uint8Array` is the sanctioned binary convention — superjson + the UDS
15341
+ * MsgPack channel round-trip typed arrays (embedding-encoder.cap.ts:29,
15342
+ * notification-output.cap.ts:27-31 precedents).
15343
+ */
15344
+ var LlmImageSchema = object({
15345
+ bytes: _instanceof(Uint8Array),
15346
+ mimeType: string()
15347
+ });
15348
+ var LlmGenerateBaseInputSchema = object({
15349
+ /** Collection routing (the notification-output posture). */
15350
+ addonId: string().optional(),
15351
+ /** Explicit profile; else the resolution chain (spec §3). */
15352
+ profileId: string().optional(),
15353
+ /** MANDATORY usage tag: 'ai-summary', 'notifier-rules', 'adhoc-ui', … */
15354
+ consumer: string(),
15355
+ system: string().optional(),
15356
+ /** v1: single-turn. `messages[]` is a v2 additive field. */
15357
+ prompt: string(),
15358
+ /** Structured output — adapter-mapped (response_format / forced tool / responseSchema). */
15359
+ jsonSchema: record(string(), unknown()).optional(),
15360
+ /** Per-call override of the profile default. */
15361
+ maxTokens: number().int().positive().optional(),
15362
+ temperature: number().optional()
15363
+ });
15364
+ /**
15365
+ * `llm-runtime` — node-side managed llama.cpp executor (spec §4). Registered
15366
+ * on EVERY node where `addon-ai` is installed; the hub `llm` provider reaches
15367
+ * a specific node's runtime with `nodePin(profile.runtime.nodeId)` — normal
15368
+ * cap routing, zero bespoke plumbing. `internal: true`: the operator reaches
15369
+ * this only through the `llm` cap's methods.
15370
+ *
15371
+ * One running llama-server child per node in v1 (models are RAM-heavy).
15372
+ * Resource ceiling = llama-server flags + idleStopMinutes ONLY (no RSS
15373
+ * watchdog — operator decision #3).
15374
+ */
15375
+ var ManagedModelRefSchema = discriminatedUnion("kind", [
15376
+ object({
15377
+ kind: literal("catalog"),
15378
+ catalogId: string()
15379
+ }),
15380
+ object({
15381
+ kind: literal("url"),
15382
+ url: string(),
15383
+ sha256: string().optional()
15384
+ }),
15385
+ object({
15386
+ kind: literal("path"),
15387
+ path: string()
15388
+ })
15389
+ ]);
15390
+ var ManagedRuntimeConfigSchema = object({
15391
+ /** WHERE the runtime lives — hub or any agent. */
15392
+ nodeId: string(),
15393
+ /** Closed for v1; 'ollama' is a v2 candidate. */
15394
+ engine: _enum(["llama-cpp"]),
15395
+ model: ManagedModelRefSchema,
15396
+ contextSize: number().int().default(4096),
15397
+ /** 0 = CPU-only. */
15398
+ gpuLayers: number().int().default(0),
15399
+ /** Default: cpus-2, clamped ≥1 (resolved node-side). */
15400
+ threads: number().int().optional(),
15401
+ /** Concurrent slots. */
15402
+ parallel: number().int().default(1),
15403
+ /** Else lazy: first generate boots it. */
15404
+ autoStart: boolean().default(false),
15405
+ /** 0 = never; frees RAM after quiet periods. */
15406
+ idleStopMinutes: number().int().default(30)
15407
+ });
15408
+ var LlmRuntimeStatusSchema = object({
15409
+ /** Status is ALWAYS node-qualified. */
15410
+ nodeId: string(),
15411
+ state: _enum([
15412
+ "stopped",
15413
+ "downloading",
15414
+ "starting",
15415
+ "ready",
15416
+ "crashed",
15417
+ "failed"
15418
+ ]),
15419
+ pid: number().optional(),
15420
+ port: number().optional(),
15421
+ modelPath: string().optional(),
15422
+ modelId: string().optional(),
15423
+ downloadProgress: number().min(0).max(1).optional(),
15424
+ lastError: string().optional(),
15425
+ crashesInWindow: number(),
15426
+ /** Child RSS (sampled best-effort). */
15427
+ memoryBytes: number().optional(),
15428
+ vramBytes: number().optional()
15429
+ });
15430
+ var LlmNodeModelSchema = object({
15431
+ file: string(),
15432
+ sizeBytes: number(),
15433
+ catalogId: string().optional(),
15434
+ installedAt: number().optional()
15435
+ });
15436
+ var LlmRuntimeDiskUsageSchema = object({
15437
+ nodeId: string(),
15438
+ modelsBytes: number(),
15439
+ freeBytes: number().optional()
15440
+ });
15441
+ method(LlmGenerateBaseInputSchema.extend({
15442
+ images: array(LlmImageSchema).optional(),
15443
+ runtime: ManagedRuntimeConfigSchema,
15444
+ /** The managed profile's timeout, threaded by the hub provider. */
15445
+ timeoutMs: number().int().positive().optional()
15446
+ }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
15447
+ kind: "mutation",
15448
+ auth: "admin"
15449
+ }), method(object({}), _void(), {
15450
+ kind: "mutation",
15451
+ auth: "admin"
15452
+ }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
15453
+ kind: "mutation",
15454
+ auth: "admin"
15455
+ }), method(object({ file: string() }), _void(), {
15456
+ kind: "mutation",
15457
+ auth: "admin"
15458
+ }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
15459
+ /**
15460
+ * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
15461
+ * methods concat-fan across providers; single-row methods route to ONE
15462
+ * provider by the `addonId` in the call input (the notification-output
15463
+ * posture, notification-output.cap.ts:215-250). Provided by `addon-ai`
15464
+ * (hub-placed); the cap stays open for future providers.
15465
+ *
15466
+ * Profiles are ROWS (data), not addons: one row = one usable model endpoint.
15467
+ * `apiKey` is a password field — providers REDACT it on read and merge on
15468
+ * write; a stored key NEVER round-trips to a client.
15469
+ */
15470
+ var LlmProfileKindSchema = _enum([
15471
+ "openai-compatible",
15472
+ "openai",
15473
+ "anthropic",
15474
+ "google",
15475
+ "managed-local"
15476
+ ]);
15477
+ var LlmProfileSchema = object({
15478
+ id: string(),
15479
+ name: string(),
15480
+ kind: LlmProfileKindSchema,
15481
+ /** Stamped by the provider — keeps the fanned catalog routable. */
15482
+ addonId: string(),
15483
+ enabled: boolean(),
15484
+ /** Vendor model id, or the managed runtime's loaded model. */
15485
+ model: string(),
15486
+ /** Required for openai-compatible; override for cloud kinds. */
15487
+ baseUrl: string().optional(),
15488
+ /** ConfigUISchema type:'password' — never round-trips (spec §5). */
15489
+ apiKey: string().optional(),
15490
+ supportsVision: boolean(),
15491
+ temperature: number().min(0).max(2).optional(),
15492
+ maxTokens: number().int().positive().optional(),
15493
+ timeoutMs: number().int().positive().default(6e4),
15494
+ extraHeaders: record(string(), string()).optional(),
15495
+ /** kind === 'managed-local' only (spec §4). */
15496
+ runtime: ManagedRuntimeConfigSchema.optional()
15497
+ });
15498
+ /** ConfigUISchema tree passed through untyped on the wire (the
15499
+ * notification-output `ConfigSchemaPassthrough` precedent at
15500
+ * notification-output.cap.ts:151); the exported TS type re-tightens it. */
15501
+ var ConfigSchemaPassthrough = unknown();
15502
+ var LlmProfileKindDescriptorSchema = object({
15503
+ kind: LlmProfileKindSchema,
15504
+ label: string(),
15505
+ icon: string(),
15506
+ /** Stamped by each provider so the concat-fanned catalog stays routable. */
15507
+ addonId: string(),
15508
+ configSchema: ConfigSchemaPassthrough
15509
+ });
15510
+ var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
15511
+ var LlmDefaultSchema = object({
15512
+ selector: LlmDefaultSelectorSchema,
15513
+ profileId: string()
15514
+ });
15515
+ /** Server-side rollup row — getUsage never dumps raw call rows (spec §6). */
15516
+ var LlmUsageRollupSchema = object({
15517
+ day: string(),
15518
+ consumer: string(),
15519
+ profileId: string(),
15520
+ calls: number(),
15521
+ okCalls: number(),
15522
+ errorCalls: number(),
15523
+ inputTokens: number(),
15524
+ outputTokens: number(),
15525
+ avgLatencyMs: number()
15526
+ });
15527
+ /** LLM-facing view over the reused ModelCatalogEntry mechanism (spec §4.2). */
15528
+ var ManagedModelCatalogEntrySchema = object({
15529
+ id: string(),
15530
+ label: string(),
15531
+ family: string(),
15532
+ purpose: _enum(["text", "vision"]),
15533
+ url: string(),
15534
+ sha256: string(),
15535
+ sizeBytes: number(),
15536
+ quantization: string(),
15537
+ /** Load-time guidance shown in the picker. */
15538
+ minRamBytes: number(),
15539
+ contextSizeDefault: number().int(),
15540
+ /** Vision models: companion projector file. */
15541
+ mmprojUrl: string().optional()
15542
+ });
15543
+ var LlmRuntimeNodeSchema = object({
15544
+ nodeId: string(),
15545
+ reachable: boolean(),
15546
+ status: LlmRuntimeStatusSchema.optional(),
15547
+ disk: LlmRuntimeDiskUsageSchema.optional(),
15548
+ error: string().optional()
15549
+ });
15550
+ var GenerateVisionInputSchema = LlmGenerateBaseInputSchema.extend({ images: array(LlmImageSchema).min(1) });
15551
+ var ProfileRefInputSchema = object({
15552
+ addonId: string(),
15553
+ profileId: string()
15554
+ });
15555
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
15556
+ kind: "mutation",
15557
+ auth: "admin"
15558
+ }), method(ProfileRefInputSchema, _void(), {
15559
+ kind: "mutation",
15560
+ auth: "admin"
15561
+ }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
15562
+ kind: "mutation",
15563
+ auth: "admin"
15564
+ }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
15565
+ selector: LlmDefaultSelectorSchema,
15566
+ profileId: string().nullable()
15567
+ }), _void(), {
15568
+ kind: "mutation",
15569
+ auth: "admin"
15570
+ }), method(object({
15571
+ since: number().optional(),
15572
+ until: number().optional(),
15573
+ consumer: string().optional(),
15574
+ profileId: string().optional()
15575
+ }), array(LlmUsageRollupSchema)), method(object({}), array(ManagedModelCatalogEntrySchema)), method(object({}), array(LlmRuntimeNodeSchema)), method(object({ nodeId: string() }), array(LlmNodeModelSchema)), method(object({
15576
+ nodeId: string(),
15577
+ model: ManagedModelRefSchema
15578
+ }), _void(), {
15579
+ kind: "mutation",
15580
+ auth: "admin"
15581
+ }), method(object({
15582
+ nodeId: string(),
15583
+ file: string()
15584
+ }), _void(), {
15585
+ kind: "mutation",
15586
+ auth: "admin"
15587
+ }), method(ProfileRefInputSchema, LlmRuntimeStatusSchema), method(ProfileRefInputSchema, LlmRuntimeStatusSchema, {
15588
+ kind: "mutation",
15589
+ auth: "admin"
15590
+ }), method(ProfileRefInputSchema, _void(), {
15591
+ kind: "mutation",
15592
+ auth: "admin"
15593
+ });
15594
+ /**
15066
15595
  * Zod schemas for persisted record types.
15067
15596
  *
15068
15597
  * These schemas serve as the single source of truth for types that are
@@ -15278,6 +15807,10 @@ var TrackSchema = object({
15278
15807
  snapshots: array(TrackSnapshotSchema).readonly(),
15279
15808
  /** Deduplicated zones the track has entered at least once. */
15280
15809
  zonesVisited: array(string()).readonly(),
15810
+ /** Deduplicated set of detector classes observed for this track over its
15811
+ * life (a track may be reclassified, e.g. person→vehicle). Absent on
15812
+ * legacy rows written before class accumulation shipped. */
15813
+ classes: array(string()).readonly().optional(),
15281
15814
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
15282
15815
  totalDistance: number(),
15283
15816
  state: TrackStateSchema,
@@ -15439,7 +15972,7 @@ var KeyEventSchema = object({
15439
15972
  /** Track lifetime in ms (lastSeen - firstSeen). */
15440
15973
  windowMs: number().optional()
15441
15974
  });
15442
- var TrackedDetectionSchema = object({
15975
+ object({
15443
15976
  trackId: string(),
15444
15977
  className: string(),
15445
15978
  confidence: number(),
@@ -15447,6 +15980,23 @@ var TrackedDetectionSchema = object({
15447
15980
  zones: array(string()).readonly(),
15448
15981
  state: TrackStateSchema
15449
15982
  });
15983
+ var OverlayDetectionSchema = looseObject({
15984
+ id: string(),
15985
+ kind: _enum(["first-level", "detail"]),
15986
+ macroClass: string(),
15987
+ score: number(),
15988
+ bbox: object({
15989
+ x: number(),
15990
+ y: number(),
15991
+ width: number(),
15992
+ height: number()
15993
+ }),
15994
+ labels: array(looseObject({
15995
+ label: string(),
15996
+ score: number()
15997
+ })).readonly(),
15998
+ parentId: string().optional()
15999
+ });
15450
16000
  var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: number() });
15451
16001
  var SearchObjectEventsInput = object({
15452
16002
  text: string(),
@@ -15457,6 +16007,20 @@ var SearchObjectEventsInput = object({
15457
16007
  limit: number().default(50),
15458
16008
  minScore: number().min(0).max(1).default(.2)
15459
16009
  });
16010
+ var TrackCascadeCountsSchema = object({
16011
+ /** Persisted track roots deleted (authoritative). */
16012
+ tracks: number().int(),
16013
+ /** Object events removed with their tracks (best-effort; see note above). */
16014
+ events: number().int(),
16015
+ /** Track/face/plate-owned media removed (best-effort). Never identity media. */
16016
+ media: number().int(),
16017
+ /** Unassigned (non-enrolled) face reads removed (best-effort). */
16018
+ faces: number().int(),
16019
+ /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
16020
+ plates: number().int(),
16021
+ /** Per-track CLIP search vectors removed (best-effort). */
16022
+ embeddings: number().int()
16023
+ });
15460
16024
  var pipelineAnalyticsCapability = {
15461
16025
  name: "pipeline-analytics",
15462
16026
  scope: "device",
@@ -15510,12 +16074,14 @@ var pipelineAnalyticsCapability = {
15510
16074
  audio: number().int()
15511
16075
  })).readonly()),
15512
16076
  /**
15513
- * Delete all events (motion + object + audio) for the given device
15514
- * that are older than `cutoffMs` (exclusive), and delete their
15515
- * thumbnails in lockstep. Returns per-kind deleted counts.
15516
- *
15517
- * Called by Phase B3 recorder orchestration to keep event history
15518
- * aligned with available footage.
16077
+ * @deprecated Prefer `pruneTracksBefore` the track is the ROOT of the
16078
+ * analytics model and retention must cascade from it (design §5.1). This
16079
+ * event-only prune leaves orphaned tracks/faces/plates/embeddings behind.
16080
+ * Retained as a compat shim for the Phase-B3 recorder orchestration caller,
16081
+ * which prunes events to keep history aligned with available footage and
16082
+ * reads the per-kind counts. Delete all events (motion + object + audio)
16083
+ * for the given device older than `cutoffMs` (exclusive) + their thumbnails
16084
+ * in lockstep; returns per-kind deleted counts.
15519
16085
  */
15520
16086
  pruneEventsBefore: method(object({
15521
16087
  deviceId: number(),
@@ -15528,6 +16094,55 @@ var pipelineAnalyticsCapability = {
15528
16094
  kind: "mutation",
15529
16095
  auth: "admin"
15530
16096
  }),
16097
+ /**
16098
+ * Track-centric retention entry point (design §5.1). Selects every
16099
+ * persisted track for the device whose `lastSeen < cutoffMs` (paged) and
16100
+ * runs the extensible whole-track deletion cascade (design §3): object
16101
+ * events + their media, track/face/plate-owned media, unassigned face
16102
+ * reads, per-track CLIP embeddings, then the track root LAST. ENROLLED
16103
+ * (assigned) faces/plates and `ownerKind:'identity'` media are exempt —
16104
+ * the durable matching gallery always persists. Fires the per-track
16105
+ * live-state cleanup so a pruned track can't linger in dispatch/overlay
16106
+ * state. Returns per-family deleted counts (`tracks` authoritative).
16107
+ *
16108
+ * Replaces `pruneEventsBefore` as the correct time-based retention prune.
16109
+ */
16110
+ pruneTracksBefore: method(object({
16111
+ deviceId: number(),
16112
+ cutoffMs: number()
16113
+ }), TrackCascadeCountsSchema, {
16114
+ kind: "mutation",
16115
+ auth: "admin"
16116
+ }),
16117
+ /**
16118
+ * Operator "clean slate" for a device (design §5.3): prune EVERY track for
16119
+ * the device via the same cascade as `pruneTracksBefore` with `cutoffMs =
16120
+ * now`. One call per device — no client-side track enumeration. Enrolled
16121
+ * gallery + identity media are exempt (design §4). Returns per-family
16122
+ * deleted counts.
16123
+ */
16124
+ wipeAllAnalytics: method(object({ deviceId: number() }), TrackCascadeCountsSchema, {
16125
+ kind: "mutation",
16126
+ auth: "admin"
16127
+ }),
16128
+ /**
16129
+ * Delete whole tracks (object events) by id for the given device,
16130
+ * cascading their media in lockstep. Returns the number of tracks
16131
+ * actually deleted plus the ids that could not be removed.
16132
+ *
16133
+ * Operator-driven from the DI Events page (batch delete). Routes through
16134
+ * the same widened track-deletion cascade (design §5.2).
16135
+ */
16136
+ deleteTracks: method(object({
16137
+ deviceId: number(),
16138
+ trackIds: array(string()).min(1)
16139
+ }), object({
16140
+ deleted: number().int(),
16141
+ failed: array(string()).readonly()
16142
+ }), {
16143
+ kind: "mutation",
16144
+ auth: "admin"
16145
+ }),
15531
16146
  getEventMedia: method(object({
15532
16147
  eventId: string(),
15533
16148
  kind: MediaFileKindEnum.optional()
@@ -15545,17 +16160,19 @@ var pipelineAnalyticsCapability = {
15545
16160
  },
15546
16161
  events: {
15547
16162
  /**
15548
- * Enriched frame emitted after refinement. Carries lightweight
15549
- * tracked-detection metadata (track id, class, zones, state) so
15550
- * downstream consumers (stream overlays, notifications) can
15551
- * annotate without querying full Track state.
16163
+ * Enriched frame emitted after refinement the live-overlay source of
16164
+ * truth (two-plane re-injection). Carries the frame's detections in the
16165
+ * `ObjectDetection` wire shape: first-level roots (with track info +
16166
+ * enrichment labels) plus synthesized `kind:'detail'` face/plate entries
16167
+ * re-projected from per-track detail state, so stream overlays render
16168
+ * boxes + recognized names without querying full Track state.
15552
16169
  */
15553
16170
  onFrameTracked: { data: object({
15554
16171
  deviceId: number(),
15555
16172
  timestamp: number(),
15556
16173
  frameWidth: number(),
15557
16174
  frameHeight: number(),
15558
- detections: array(TrackedDetectionSchema).readonly()
16175
+ detections: array(OverlayDetectionSchema).readonly()
15559
16176
  }) },
15560
16177
  /** Track entered active state (first-seen). */
15561
16178
  onTrackStarted: { data: object({
@@ -18368,6 +18985,24 @@ DeviceType.Camera, method(object({
18368
18985
  deviceId: number(),
18369
18986
  status: OsdStatusSchema
18370
18987
  });
18988
+ var VehicleSchema = object({
18989
+ id: string(),
18990
+ name: string(),
18991
+ sampleCount: number().int().nonnegative(),
18992
+ coverMediaKey: string().optional(),
18993
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
18994
+ coverBase64: string().optional()
18995
+ });
18996
+ var VehicleSampleInfoSchema = object({
18997
+ id: string(),
18998
+ /** The plate text this sample enrolled (self-labeling — no embedding). */
18999
+ text: string(),
19000
+ /** OCR confidence of the enrolled read (0..1). */
19001
+ score: number(),
19002
+ addedAt: number().int(),
19003
+ deviceId: number().int().optional(),
19004
+ base64: string().optional()
19005
+ });
18371
19006
  var PlateInfoSchema = object({
18372
19007
  plateId: string(),
18373
19008
  deviceId: number().int(),
@@ -18379,6 +19014,16 @@ var PlateInfoSchema = object({
18379
19014
  score: number(),
18380
19015
  /** True when the text was manually corrected (exempt from retention). */
18381
19016
  corrected: boolean(),
19017
+ /** Recognized vehicle id when a matcher lookup named this read (SQL NULL → absent). */
19018
+ recognizedVehicleId: string().optional(),
19019
+ /** Resolved vehicle name for `recognizedVehicleId` (UI convenience). */
19020
+ vehicleName: string().optional(),
19021
+ /** True once the read was assigned to a vehicle (enrolled as a sample). */
19022
+ assigned: boolean(),
19023
+ /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
19024
+ plateBbox: BoundingBoxSchema.optional(),
19025
+ /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
19026
+ keyFrameMediaKey: string().optional(),
18382
19027
  base64: string().optional()
18383
19028
  });
18384
19029
  var MediaFileLiteSchema = object({
@@ -18440,6 +19085,58 @@ var plateGalleryCapability = {
18440
19085
  deletePlate: method(object({ plateId: string() }), _void(), {
18441
19086
  kind: "mutation",
18442
19087
  auth: "admin"
19088
+ }),
19089
+ listVehicles: method(_void(), array(VehicleSchema).readonly()),
19090
+ createVehicle: method(object({ name: string().min(1) }), VehicleSchema, {
19091
+ kind: "mutation",
19092
+ auth: "admin"
19093
+ }),
19094
+ renameVehicle: method(object({
19095
+ id: string(),
19096
+ name: string().min(1)
19097
+ }), _void(), {
19098
+ kind: "mutation",
19099
+ auth: "admin"
19100
+ }),
19101
+ deleteVehicle: method(object({ id: string() }), _void(), {
19102
+ kind: "mutation",
19103
+ auth: "admin"
19104
+ }),
19105
+ listVehicleSamples: method(object({ vehicleId: string() }), array(VehicleSampleInfoSchema).readonly()),
19106
+ removeVehicleSample: method(object({
19107
+ vehicleId: string(),
19108
+ sampleId: string()
19109
+ }), _void(), {
19110
+ kind: "mutation",
19111
+ auth: "admin"
19112
+ }),
19113
+ assignPlate: method(object({
19114
+ plateId: string(),
19115
+ vehicleId: string()
19116
+ }), _void(), {
19117
+ kind: "mutation",
19118
+ auth: "admin"
19119
+ }),
19120
+ unassignPlate: method(object({ plateId: string() }), _void(), {
19121
+ kind: "mutation",
19122
+ auth: "admin"
19123
+ }),
19124
+ assignPlates: method(object({
19125
+ plateIds: array(string()).min(1),
19126
+ vehicleId: string()
19127
+ }), object({
19128
+ assigned: number().int(),
19129
+ failed: array(string()).readonly()
19130
+ }), {
19131
+ kind: "mutation",
19132
+ auth: "admin"
19133
+ }),
19134
+ unassignPlates: method(object({ plateIds: array(string()).min(1) }), object({
19135
+ unassigned: number().int(),
19136
+ failed: array(string()).readonly()
19137
+ }), {
19138
+ kind: "mutation",
19139
+ auth: "admin"
18443
19140
  })
18444
19141
  }
18445
19142
  };
@@ -20987,6 +21684,168 @@ Object.freeze({
20987
21684
  addonId: null,
20988
21685
  access: "create"
20989
21686
  },
21687
+ "llm.deleteModel": {
21688
+ capName: "llm",
21689
+ capScope: "system",
21690
+ addonId: null,
21691
+ access: "delete"
21692
+ },
21693
+ "llm.deleteProfile": {
21694
+ capName: "llm",
21695
+ capScope: "system",
21696
+ addonId: null,
21697
+ access: "delete"
21698
+ },
21699
+ "llm.generate": {
21700
+ capName: "llm",
21701
+ capScope: "system",
21702
+ addonId: null,
21703
+ access: "create"
21704
+ },
21705
+ "llm.generateVision": {
21706
+ capName: "llm",
21707
+ capScope: "system",
21708
+ addonId: null,
21709
+ access: "create"
21710
+ },
21711
+ "llm.getDefaults": {
21712
+ capName: "llm",
21713
+ capScope: "system",
21714
+ addonId: null,
21715
+ access: "view"
21716
+ },
21717
+ "llm.getRuntimeStatus": {
21718
+ capName: "llm",
21719
+ capScope: "system",
21720
+ addonId: null,
21721
+ access: "view"
21722
+ },
21723
+ "llm.getUsage": {
21724
+ capName: "llm",
21725
+ capScope: "system",
21726
+ addonId: null,
21727
+ access: "view"
21728
+ },
21729
+ "llm.installModel": {
21730
+ capName: "llm",
21731
+ capScope: "system",
21732
+ addonId: null,
21733
+ access: "create"
21734
+ },
21735
+ "llm.listModelCatalog": {
21736
+ capName: "llm",
21737
+ capScope: "system",
21738
+ addonId: null,
21739
+ access: "view"
21740
+ },
21741
+ "llm.listModels": {
21742
+ capName: "llm",
21743
+ capScope: "system",
21744
+ addonId: null,
21745
+ access: "view"
21746
+ },
21747
+ "llm.listNodeModels": {
21748
+ capName: "llm",
21749
+ capScope: "system",
21750
+ addonId: null,
21751
+ access: "view"
21752
+ },
21753
+ "llm.listProfileKinds": {
21754
+ capName: "llm",
21755
+ capScope: "system",
21756
+ addonId: null,
21757
+ access: "view"
21758
+ },
21759
+ "llm.listProfiles": {
21760
+ capName: "llm",
21761
+ capScope: "system",
21762
+ addonId: null,
21763
+ access: "view"
21764
+ },
21765
+ "llm.listRuntimeNodes": {
21766
+ capName: "llm",
21767
+ capScope: "system",
21768
+ addonId: null,
21769
+ access: "view"
21770
+ },
21771
+ "llm.setDefault": {
21772
+ capName: "llm",
21773
+ capScope: "system",
21774
+ addonId: null,
21775
+ access: "create"
21776
+ },
21777
+ "llm.startRuntime": {
21778
+ capName: "llm",
21779
+ capScope: "system",
21780
+ addonId: null,
21781
+ access: "create"
21782
+ },
21783
+ "llm.stopRuntime": {
21784
+ capName: "llm",
21785
+ capScope: "system",
21786
+ addonId: null,
21787
+ access: "create"
21788
+ },
21789
+ "llm.testProfile": {
21790
+ capName: "llm",
21791
+ capScope: "system",
21792
+ addonId: null,
21793
+ access: "create"
21794
+ },
21795
+ "llm.upsertProfile": {
21796
+ capName: "llm",
21797
+ capScope: "system",
21798
+ addonId: null,
21799
+ access: "create"
21800
+ },
21801
+ "llmRuntime.complete": {
21802
+ capName: "llm-runtime",
21803
+ capScope: "system",
21804
+ addonId: null,
21805
+ access: "create"
21806
+ },
21807
+ "llmRuntime.deleteModel": {
21808
+ capName: "llm-runtime",
21809
+ capScope: "system",
21810
+ addonId: null,
21811
+ access: "delete"
21812
+ },
21813
+ "llmRuntime.ensureStarted": {
21814
+ capName: "llm-runtime",
21815
+ capScope: "system",
21816
+ addonId: null,
21817
+ access: "create"
21818
+ },
21819
+ "llmRuntime.getDiskUsage": {
21820
+ capName: "llm-runtime",
21821
+ capScope: "system",
21822
+ addonId: null,
21823
+ access: "view"
21824
+ },
21825
+ "llmRuntime.installModel": {
21826
+ capName: "llm-runtime",
21827
+ capScope: "system",
21828
+ addonId: null,
21829
+ access: "create"
21830
+ },
21831
+ "llmRuntime.listLocalModels": {
21832
+ capName: "llm-runtime",
21833
+ capScope: "system",
21834
+ addonId: null,
21835
+ access: "view"
21836
+ },
21837
+ "llmRuntime.status": {
21838
+ capName: "llm-runtime",
21839
+ capScope: "system",
21840
+ addonId: null,
21841
+ access: "view"
21842
+ },
21843
+ "llmRuntime.stop": {
21844
+ capName: "llm-runtime",
21845
+ capScope: "system",
21846
+ addonId: null,
21847
+ access: "create"
21848
+ },
20990
21849
  "localNetwork.getAllowedAddresses": {
20991
21850
  capName: "local-network",
20992
21851
  capScope: "system",
@@ -21617,6 +22476,12 @@ Object.freeze({
21617
22476
  addonId: null,
21618
22477
  access: "delete"
21619
22478
  },
22479
+ "pipelineAnalytics.deleteTracks": {
22480
+ capName: "pipeline-analytics",
22481
+ capScope: "device",
22482
+ addonId: null,
22483
+ access: "delete"
22484
+ },
21620
22485
  "pipelineAnalytics.getActiveTracks": {
21621
22486
  capName: "pipeline-analytics",
21622
22487
  capScope: "device",
@@ -21683,12 +22548,24 @@ Object.freeze({
21683
22548
  addonId: null,
21684
22549
  access: "create"
21685
22550
  },
22551
+ "pipelineAnalytics.pruneTracksBefore": {
22552
+ capName: "pipeline-analytics",
22553
+ capScope: "device",
22554
+ addonId: null,
22555
+ access: "create"
22556
+ },
21686
22557
  "pipelineAnalytics.searchObjectEvents": {
21687
22558
  capName: "pipeline-analytics",
21688
22559
  capScope: "device",
21689
22560
  addonId: null,
21690
22561
  access: "view"
21691
22562
  },
22563
+ "pipelineAnalytics.wipeAllAnalytics": {
22564
+ capName: "pipeline-analytics",
22565
+ capScope: "device",
22566
+ addonId: null,
22567
+ access: "delete"
22568
+ },
21692
22569
  "pipelineExecutor.cacheFrameInPool": {
21693
22570
  capName: "pipeline-executor",
21694
22571
  capScope: "system",
@@ -22187,18 +23064,48 @@ Object.freeze({
22187
23064
  addonId: null,
22188
23065
  access: "create"
22189
23066
  },
23067
+ "pipelineRunner.runDetailSubtree": {
23068
+ capName: "pipeline-runner",
23069
+ capScope: "system",
23070
+ addonId: null,
23071
+ access: "create"
23072
+ },
23073
+ "plateGallery.assignPlate": {
23074
+ capName: "plate-gallery",
23075
+ capScope: "system",
23076
+ addonId: null,
23077
+ access: "create"
23078
+ },
23079
+ "plateGallery.assignPlates": {
23080
+ capName: "plate-gallery",
23081
+ capScope: "system",
23082
+ addonId: null,
23083
+ access: "create"
23084
+ },
22190
23085
  "plateGallery.correctPlateText": {
22191
23086
  capName: "plate-gallery",
22192
23087
  capScope: "system",
22193
23088
  addonId: null,
22194
23089
  access: "create"
22195
23090
  },
23091
+ "plateGallery.createVehicle": {
23092
+ capName: "plate-gallery",
23093
+ capScope: "system",
23094
+ addonId: null,
23095
+ access: "create"
23096
+ },
22196
23097
  "plateGallery.deletePlate": {
22197
23098
  capName: "plate-gallery",
22198
23099
  capScope: "system",
22199
23100
  addonId: null,
22200
23101
  access: "delete"
22201
23102
  },
23103
+ "plateGallery.deleteVehicle": {
23104
+ capName: "plate-gallery",
23105
+ capScope: "system",
23106
+ addonId: null,
23107
+ access: "delete"
23108
+ },
22202
23109
  "plateGallery.getPlateByTrack": {
22203
23110
  capName: "plate-gallery",
22204
23111
  capScope: "system",
@@ -22217,6 +23124,30 @@ Object.freeze({
22217
23124
  addonId: null,
22218
23125
  access: "view"
22219
23126
  },
23127
+ "plateGallery.listVehicles": {
23128
+ capName: "plate-gallery",
23129
+ capScope: "system",
23130
+ addonId: null,
23131
+ access: "view"
23132
+ },
23133
+ "plateGallery.listVehicleSamples": {
23134
+ capName: "plate-gallery",
23135
+ capScope: "system",
23136
+ addonId: null,
23137
+ access: "view"
23138
+ },
23139
+ "plateGallery.removeVehicleSample": {
23140
+ capName: "plate-gallery",
23141
+ capScope: "system",
23142
+ addonId: null,
23143
+ access: "delete"
23144
+ },
23145
+ "plateGallery.renameVehicle": {
23146
+ capName: "plate-gallery",
23147
+ capScope: "system",
23148
+ addonId: null,
23149
+ access: "create"
23150
+ },
22220
23151
  "plateGallery.searchPlates": {
22221
23152
  capName: "plate-gallery",
22222
23153
  capScope: "system",
@@ -22229,6 +23160,18 @@ Object.freeze({
22229
23160
  addonId: null,
22230
23161
  access: "view"
22231
23162
  },
23163
+ "plateGallery.unassignPlate": {
23164
+ capName: "plate-gallery",
23165
+ capScope: "system",
23166
+ addonId: null,
23167
+ access: "create"
23168
+ },
23169
+ "plateGallery.unassignPlates": {
23170
+ capName: "plate-gallery",
23171
+ capScope: "system",
23172
+ addonId: null,
23173
+ access: "create"
23174
+ },
22232
23175
  "platformProbe.getCapabilities": {
22233
23176
  capName: "platform-probe",
22234
23177
  capScope: "system",
@@ -22421,6 +23364,48 @@ Object.freeze({
22421
23364
  addonId: null,
22422
23365
  access: "create"
22423
23366
  },
23367
+ "sceneMonitor.captureReference": {
23368
+ capName: "scene-monitor",
23369
+ capScope: "device",
23370
+ addonId: null,
23371
+ access: "create"
23372
+ },
23373
+ "sceneMonitor.createScene": {
23374
+ capName: "scene-monitor",
23375
+ capScope: "device",
23376
+ addonId: null,
23377
+ access: "create"
23378
+ },
23379
+ "sceneMonitor.deleteReference": {
23380
+ capName: "scene-monitor",
23381
+ capScope: "device",
23382
+ addonId: null,
23383
+ access: "delete"
23384
+ },
23385
+ "sceneMonitor.deleteScene": {
23386
+ capName: "scene-monitor",
23387
+ capScope: "device",
23388
+ addonId: null,
23389
+ access: "delete"
23390
+ },
23391
+ "sceneMonitor.listScenes": {
23392
+ capName: "scene-monitor",
23393
+ capScope: "device",
23394
+ addonId: null,
23395
+ access: "view"
23396
+ },
23397
+ "sceneMonitor.recheckNow": {
23398
+ capName: "scene-monitor",
23399
+ capScope: "device",
23400
+ addonId: null,
23401
+ access: "create"
23402
+ },
23403
+ "sceneMonitor.updateScene": {
23404
+ capName: "scene-monitor",
23405
+ capScope: "device",
23406
+ addonId: null,
23407
+ access: "create"
23408
+ },
22424
23409
  "scriptRunner.run": {
22425
23410
  capName: "script-runner",
22426
23411
  capScope: "device",
@@ -23505,6 +24490,7 @@ Object.freeze({
23505
24490
  Object.freeze({
23506
24491
  "broker": "broker",
23507
24492
  "device-export": "device-export",
24493
+ "llm": "ai",
23508
24494
  "mesh-network": "mesh",
23509
24495
  "mqtt-broker": "broker",
23510
24496
  "network-access": "ingress",
@@ -23537,4 +24523,4 @@ object({
23537
24523
  schemaVersion: literal(1)
23538
24524
  });
23539
24525
  //#endregion
23540
- export { number as C, tuple as E, boolean as S, string as T, asJsonObject as _, embeddingEncoderCapability as a, _enum as b, nodePin as c, videoclipsCapability as d, zoneAnalyticsCapability as f, EventCategory as g, DeviceType as h, cosineSimilarity as i, pipelineAnalyticsCapability as l, BaseAddon as m, addonWidgetsSourceCapability as n, faceGalleryCapability as o, errMsg as p, audioMetricsCapability as r, hfModelUrl as s, EVENT_PAD_MS as t, plateGalleryCapability as u, createEvent as v, object as w, array as x, hydrateSchema as y };
24526
+ export { string as S, createEvent as _, embeddingEncoderCapability as a, number as b, nodePin as c, videoclipsCapability as d, zoneAnalyticsCapability as f, EventCategory as g, DeviceType as h, cosineSimilarity as i, pipelineAnalyticsCapability as l, BaseAddon as m, addonWidgetsSourceCapability as n, faceGalleryCapability as o, errMsg as p, audioMetricsCapability as r, hfModelUrl as s, EVENT_PAD_MS as t, plateGalleryCapability as u, hydrateSchema as v, object as x, boolean as y };