@camstack/system 1.1.47 → 1.1.49

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 (47) hide show
  1. package/dist/addon-runner.js +15 -3
  2. package/dist/addon-runner.mjs +15 -3
  3. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  4. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  5. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  6. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  7. package/dist/builtins/alerts/alerts.addon.js +1 -1
  8. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  9. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +1 -1
  10. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
  11. package/dist/builtins/console-logging/index.js +1 -1
  12. package/dist/builtins/console-logging/index.mjs +1 -1
  13. package/dist/builtins/device-manager/device-manager.addon.js +1 -1
  14. package/dist/builtins/device-manager/device-manager.addon.mjs +1 -1
  15. package/dist/builtins/hub-forwarder/index.js +1 -1
  16. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  17. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  18. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  19. package/dist/builtins/local-network/local-network.addon.js +1 -1
  20. package/dist/builtins/local-network/local-network.addon.mjs +1 -1
  21. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  22. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  23. package/dist/builtins/platform-probe/index.js +1 -1
  24. package/dist/builtins/platform-probe/index.mjs +1 -1
  25. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  26. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  27. package/dist/builtins/snapshot/index.js +1 -1
  28. package/dist/builtins/snapshot/index.mjs +1 -1
  29. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  30. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  31. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +1 -1
  32. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +1 -1
  33. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  34. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  35. package/dist/builtins/system-config/system-config.addon.js +1 -1
  36. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  37. package/dist/builtins/winston-logging/index.js +1 -1
  38. package/dist/builtins/winston-logging/index.mjs +1 -1
  39. package/dist/{dist-BD7BE4o6.mjs → dist-8phgmJ6b.mjs} +1131 -41
  40. package/dist/{dist-fw1in_1Q.js → dist-BDV1WKRg.js} +1142 -46
  41. package/dist/index.d.ts +1 -1
  42. package/dist/index.js +3 -2
  43. package/dist/index.mjs +3 -3
  44. package/dist/kernel/moleculer/child-cap-dispatch.d.ts +12 -0
  45. package/dist/{manifest-python-deps-Rj3f1zyf.mjs → manifest-python-deps-B09I9ems.mjs} +1 -1
  46. package/dist/{manifest-python-deps-Ciq2HL8D.js → manifest-python-deps-DAA0ULwT.js} +1 -1
  47. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  let zod = require("zod");
2
- //#region ../types/dist/sleep-BC9Yqte7.mjs
2
+ //#region ../types/dist/sleep-DkhOVOjW.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -409,10 +409,43 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
409
409
  EventCategory["EnrichmentEmbeddingStored"] = "enrichment.embedding.stored";
410
410
  EventCategory["EnrichmentSceneStateChanged"] = "enrichment.scene.state-changed";
411
411
  EventCategory["EnrichmentActivitySummary"] = "enrichment.activity.summary";
412
+ /**
413
+ * Unified track-lifecycle event: ONE category carrying `phase:
414
+ * 'start' | 'update' | 'end'` with a rich, typed
415
+ * `PipelineAnalyticsTrackLifecyclePayload`. Supersedes the thin
416
+ * `PipelineAnalyticsTrackStarted` / `PipelineAnalyticsTrackEnded`
417
+ * pair — a consumer subscribes once and branches on `phase`.
418
+ */
419
+ EventCategory["PipelineAnalyticsTrackLifecycle"] = "pipeline-analytics.track-lifecycle";
420
+ /**
421
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
422
+ * (`phase:'start'`). Kept as a soft alias — no known subscribers.
423
+ */
412
424
  EventCategory["PipelineAnalyticsTrackStarted"] = "pipeline-analytics.track-started";
425
+ /**
426
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
427
+ * (`phase:'end'`). Kept as a soft alias — no known subscribers.
428
+ */
413
429
  EventCategory["PipelineAnalyticsTrackEnded"] = "pipeline-analytics.track-ended";
414
430
  EventCategory["PipelineAnalyticsDetectionEvent"] = "pipeline-analytics.detection-event";
415
431
  EventCategory["PipelineAnalyticsFrameTracked"] = "pipeline-analytics.frame-tracked";
432
+ /**
433
+ * Fired by `addon-post-analysis` whenever a gallery face row changes:
434
+ * `kind:'buffered'` a new detected face was persisted, `'assigned'` /
435
+ * `'unassigned'` its identity link changed, `'deleted'` the row was
436
+ * removed. Telemetry semantics (D8): a lost event only delays a refresh,
437
+ * never a correctness issue. Payload `PipelineAnalyticsFaceGalleryChangedPayload`.
438
+ */
439
+ EventCategory["PipelineAnalyticsFaceGalleryChanged"] = "pipeline-analytics.face-gallery-changed";
440
+ /**
441
+ * Fired by `addon-post-analysis` whenever a gallery plate row changes:
442
+ * `kind:'buffered'` a new read was persisted (`PlateRecognizer.onTrackEnd`),
443
+ * `'assigned'` / `'unassigned'` its vehicle link changed
444
+ * (`PlateGalleryProvider`), `'deleted'` the row was removed. Telemetry
445
+ * semantics (D8): a lost event only delays a refresh, never a correctness
446
+ * issue. Payload `PipelineAnalyticsPlateGalleryChangedPayload`.
447
+ */
448
+ EventCategory["PipelineAnalyticsPlateGalleryChanged"] = "pipeline-analytics.plate-gallery-changed";
416
449
  EventCategory["FrigateLiveEvent"] = "frigate.live-event";
417
450
  EventCategory["CameraStreamsProfileSlotsChanged"] = "camera-streams.onProfileSlotsChanged";
418
451
  /**
@@ -2860,7 +2893,8 @@ var MODEL_FORMATS = [
2860
2893
  "coreml",
2861
2894
  "openvino",
2862
2895
  "tflite",
2863
- "pt"
2896
+ "pt",
2897
+ "gguf"
2864
2898
  ];
2865
2899
  /**
2866
2900
  * Multi-file format payload.
@@ -2904,7 +2938,8 @@ var ModelFormatsSchema = zod.z.object({
2904
2938
  coreml: ModelFormatEntrySchema.optional(),
2905
2939
  openvino: ModelFormatEntrySchema.optional(),
2906
2940
  tflite: ModelFormatEntrySchema.optional(),
2907
- pt: ModelFormatEntrySchema.optional()
2941
+ pt: ModelFormatEntrySchema.optional(),
2942
+ gguf: ModelFormatEntrySchema.optional()
2908
2943
  });
2909
2944
  /**
2910
2945
  * Variant-selector grouping axes. Shared by the full `ModelCatalogEntry` and by
@@ -7849,7 +7884,8 @@ var ModelFormatSchema$1 = zod.z.enum([
7849
7884
  "coreml",
7850
7885
  "openvino",
7851
7886
  "tflite",
7852
- "pt"
7887
+ "pt",
7888
+ "gguf"
7853
7889
  ]);
7854
7890
  var PipelineSlotSchema = zod.z.enum([
7855
7891
  "detector",
@@ -8214,7 +8250,15 @@ var pipelineExecutorCapability = {
8214
8250
  image: zod.z.instanceof(Uint8Array).optional(),
8215
8251
  referenceImage: zod.z.string().optional(),
8216
8252
  deviceId: zod.z.number().optional(),
8217
- sessionId: zod.z.string().optional()
8253
+ sessionId: zod.z.string().optional(),
8254
+ /**
8255
+ * Execution plane. 'full' (default) runs the whole tree — benchmark,
8256
+ * reference-image, and detail-subtree calls. 'frame' is the live
8257
+ * per-frame dispatch: ONLY root-plane steps run; crop children
8258
+ * (inputClasses ≠ null) are skipped and served per-track via
8259
+ * pipelineRunner.runDetailSubtree (two-plane design).
8260
+ */
8261
+ plane: zod.z.enum(["full", "frame"]).optional()
8218
8262
  }), PipelineRunResultBridge, { kind: "mutation" }),
8219
8263
  /**
8220
8264
  * Batched run — N raw frames packed into one cap call. The provider
@@ -8444,6 +8488,28 @@ var NativeCropResultSchema = zod.z.object({
8444
8488
  width: zod.z.number().int().positive(),
8445
8489
  height: zod.z.number().int().positive()
8446
8490
  });
8491
+ /** Parent detection context passed to `runDetailSubtree` — the crop's
8492
+ * originating detection, in FRAME-space coordinates. Reuses
8493
+ * `NativeCropBboxSchema`'s `{x,y,w,h}` shape (same numeric fields; here
8494
+ * the coordinates are frame-space rather than getNativeCrop's
8495
+ * normalized [0,1] convention). */
8496
+ var DetailParentSchema = zod.z.object({
8497
+ bbox: NativeCropBboxSchema,
8498
+ className: zod.z.string()
8499
+ });
8500
+ /** One child-step result from `runDetailSubtree` — an embedding, label,
8501
+ * or refined detection produced by running the crop-subtree on a
8502
+ * single tracked detection. */
8503
+ var DetailResultSchema = zod.z.object({
8504
+ stepId: zod.z.string(),
8505
+ className: zod.z.string(),
8506
+ score: zod.z.number(),
8507
+ /** FRAME-space bbox (already mapped back from crop space). */
8508
+ bbox: NativeCropBboxSchema.optional(),
8509
+ embedding: zod.z.string().optional(),
8510
+ label: zod.z.string().optional(),
8511
+ alignedCropJpeg: zod.z.string().optional()
8512
+ });
8447
8513
  /**
8448
8514
  * Per-camera tunable ranges + defaults. Single source of truth used
8449
8515
  * by both the Zod data schema (validation + default fallback) and
@@ -8763,7 +8829,27 @@ var pipelineRunnerCapability = {
8763
8829
  handle: FrameHandleSchema,
8764
8830
  bbox: NativeCropBboxSchema,
8765
8831
  maxWidth: zod.z.number().int().positive().optional()
8766
- }), NativeCropResultSchema.nullable())
8832
+ }), NativeCropResultSchema.nullable()),
8833
+ /**
8834
+ * Two-plane design: run the DETAIL subtree (crop children —
8835
+ * embedding, classifier, refiner steps whose `inputClasses ≠ null`)
8836
+ * for a single tracked detection. The per-frame plane (`runPipeline`
8837
+ * with `plane: 'frame'`) skips crop children entirely; a track-level
8838
+ * caller invokes this per-track, on its own cadence, instead of on
8839
+ * every frame. Takes either a `frameHandle` (shm lease/session —
8840
+ * preferred, zero-copy) or a `cropJpeg` fallback when the lease/
8841
+ * session backing the frame is already gone. `steps` narrows which
8842
+ * configured children to run (default: all configured children for
8843
+ * `parent.className`). Returns `null` when neither frame source is
8844
+ * resolvable (handle evicted and no cropJpeg fallback supplied).
8845
+ */
8846
+ runDetailSubtree: method(zod.z.object({
8847
+ deviceId: zod.z.number(),
8848
+ frameHandle: FrameHandleSchema.optional(),
8849
+ cropJpeg: zod.z.string().optional(),
8850
+ parent: DetailParentSchema,
8851
+ steps: zod.z.array(zod.z.string()).optional()
8852
+ }), zod.z.object({ details: zod.z.array(DetailResultSchema) }).nullable(), { kind: "mutation" })
8767
8853
  }
8768
8854
  };
8769
8855
  /**
@@ -9810,6 +9896,167 @@ var ptzAutotrackCapability = {
9810
9896
  runtimeState: PtzAutotrackRuntimeStateSchema
9811
9897
  };
9812
9898
  /**
9899
+ * scene-monitor — device-scoped reference-region state cap. An operator marks
9900
+ * a rect ROI on a camera frame and names one or more states; the engine
9901
+ * (pipeline-analytics, designated post-processing node) reports which state is
9902
+ * active on an ongoing basis. Two operator-selectable check modes share every-
9903
+ * thing except the comparator: `similarity` (CLIP cosine at the same ROI coords
9904
+ * vs condition-tagged references) and `llm` (vision-LLM judgment over the crop).
9905
+ *
9906
+ * D14 device-config archetype (`deviceConfig.ui.kind:'widget'`) — the framework
9907
+ * derives the device-detail contribution; the provider carries NO hand-written
9908
+ * settings-contribution methods. `status.kind:'push'` — the engine pushes on
9909
+ * every hysteresis flip / availability change; consumers never poll.
9910
+ */
9911
+ /** Extensible condition tag. Seeded 'day' | 'night'; open by design so more can
9912
+ * be added without a wire break (matching falls back to any-condition refs). */
9913
+ var SceneConditionSchema = zod.z.string();
9914
+ /** One captured reference — condition-tagged, model-version-gated. `embedding`
9915
+ * is `number[]` (Float32Array does NOT survive MsgPack/UDS). */
9916
+ var SceneReferenceSchema = zod.z.object({
9917
+ embedding: zod.z.array(zod.z.number()),
9918
+ modelId: zod.z.string(),
9919
+ condition: SceneConditionSchema,
9920
+ capturedAt: zod.z.number(),
9921
+ thumbnailMediaId: zod.z.string().optional()
9922
+ });
9923
+ var SceneMonitorStateSchema = zod.z.object({
9924
+ id: zod.z.string(),
9925
+ label: zod.z.string(),
9926
+ references: zod.z.array(SceneReferenceSchema),
9927
+ textPrompts: zod.z.array(zod.z.string()).optional(),
9928
+ referenceCount: zod.z.number(),
9929
+ currentlyMatched: zod.z.boolean()
9930
+ });
9931
+ /** Per-mode comparator params in a discriminated union so an `llm` scene never
9932
+ * carries similarity knobs and vice-versa. */
9933
+ var SceneCheckSchema = zod.z.discriminatedUnion("mode", [zod.z.object({
9934
+ mode: zod.z.literal("similarity"),
9935
+ threshold: zod.z.number().min(0).max(1),
9936
+ hysteresisCount: zod.z.number().int().positive()
9937
+ }), zod.z.object({
9938
+ mode: zod.z.literal("llm"),
9939
+ prompt: zod.z.string(),
9940
+ profileId: zod.z.string().optional(),
9941
+ hysteresisCount: zod.z.number().int().positive()
9942
+ })]);
9943
+ var SceneMonitorSchema = zod.z.object({
9944
+ id: zod.z.string(),
9945
+ label: zod.z.string(),
9946
+ roi: MaskRectShapeSchema,
9947
+ enabled: zod.z.boolean(),
9948
+ triggerMode: zod.z.enum([
9949
+ "periodic",
9950
+ "on-motion",
9951
+ "both"
9952
+ ]),
9953
+ checkIntervalSec: zod.z.number().optional(),
9954
+ check: SceneCheckSchema,
9955
+ states: zod.z.array(SceneMonitorStateSchema),
9956
+ currentStateId: zod.z.string().nullable(),
9957
+ lastCheckedAt: zod.z.number().nullable(),
9958
+ lastConfidence: zod.z.number().nullable(),
9959
+ currentCondition: SceneConditionSchema.nullable(),
9960
+ availability: zod.z.enum(["ok", "unavailable"]),
9961
+ unavailableReason: zod.z.string().nullable()
9962
+ });
9963
+ var SceneMonitorStatusSchema = zod.z.object({
9964
+ monitors: zod.z.array(SceneMonitorSchema),
9965
+ lastFetchedAt: zod.z.number()
9966
+ });
9967
+ var sceneMonitorCapability = {
9968
+ name: "scene-monitor",
9969
+ scope: "device",
9970
+ mode: "singleton",
9971
+ kind: "wrapper",
9972
+ defaultActive: true,
9973
+ deviceTypes: [DeviceType.Camera],
9974
+ deviceConfig: { ui: {
9975
+ kind: "widget",
9976
+ widgetId: "host/scene-monitor-editor",
9977
+ tab: "scenes",
9978
+ label: "Scenes"
9979
+ } },
9980
+ methods: {
9981
+ listScenes: method(zod.z.object({ deviceId: zod.z.number() }), SceneMonitorStatusSchema),
9982
+ createScene: method(zod.z.object({
9983
+ deviceId: zod.z.number(),
9984
+ label: zod.z.string(),
9985
+ roi: MaskRectShapeSchema,
9986
+ check: SceneCheckSchema,
9987
+ triggerMode: zod.z.enum([
9988
+ "periodic",
9989
+ "on-motion",
9990
+ "both"
9991
+ ]).optional(),
9992
+ checkIntervalSec: zod.z.number().optional()
9993
+ }), SceneMonitorSchema, {
9994
+ kind: "mutation",
9995
+ auth: "admin"
9996
+ }),
9997
+ updateScene: method(zod.z.object({
9998
+ deviceId: zod.z.number(),
9999
+ monitorId: zod.z.string(),
10000
+ patch: zod.z.object({
10001
+ label: zod.z.string().optional(),
10002
+ roi: MaskRectShapeSchema.optional(),
10003
+ enabled: zod.z.boolean().optional(),
10004
+ triggerMode: zod.z.enum([
10005
+ "periodic",
10006
+ "on-motion",
10007
+ "both"
10008
+ ]).optional(),
10009
+ checkIntervalSec: zod.z.number().optional(),
10010
+ check: SceneCheckSchema.optional()
10011
+ })
10012
+ }), zod.z.void(), {
10013
+ kind: "mutation",
10014
+ auth: "admin"
10015
+ }),
10016
+ deleteScene: method(zod.z.object({
10017
+ deviceId: zod.z.number(),
10018
+ monitorId: zod.z.string()
10019
+ }), zod.z.void(), {
10020
+ kind: "mutation",
10021
+ auth: "admin"
10022
+ }),
10023
+ captureReference: method(zod.z.object({
10024
+ deviceId: zod.z.number(),
10025
+ monitorId: zod.z.string(),
10026
+ stateId: zod.z.string().optional(),
10027
+ label: zod.z.string().optional(),
10028
+ condition: SceneConditionSchema.optional()
10029
+ }), zod.z.object({
10030
+ stateId: zod.z.string(),
10031
+ referenceCount: zod.z.number()
10032
+ }), {
10033
+ kind: "mutation",
10034
+ auth: "admin"
10035
+ }),
10036
+ deleteReference: method(zod.z.object({
10037
+ deviceId: zod.z.number(),
10038
+ monitorId: zod.z.string(),
10039
+ stateId: zod.z.string(),
10040
+ index: zod.z.number()
10041
+ }), zod.z.void(), {
10042
+ kind: "mutation",
10043
+ auth: "admin"
10044
+ }),
10045
+ recheckNow: method(zod.z.object({
10046
+ deviceId: zod.z.number(),
10047
+ monitorId: zod.z.string()
10048
+ }), zod.z.void(), {
10049
+ kind: "mutation",
10050
+ auth: "admin"
10051
+ })
10052
+ },
10053
+ status: {
10054
+ schema: SceneMonitorStatusSchema,
10055
+ kind: "push"
10056
+ },
10057
+ runtimeState: SceneMonitorStatusSchema
10058
+ };
10059
+ /**
9813
10060
  * Script-runner cap. Models HA `script.*` entities on
9814
10061
  * `DeviceType.Script`. A Script is a pre-recorded action sequence
9815
10062
  * that can be invoked imperatively — optionally with a variables
@@ -11510,7 +11757,12 @@ var NotificationRuleConditionsSchema = zod.z.object({
11510
11757
  clipDescription: zod.z.object({
11511
11758
  text: zod.z.string().min(1),
11512
11759
  minSimilarity: zod.z.number().min(0).max(1)
11513
- }).optional()
11760
+ }).optional(),
11761
+ /** Match events whose recognized-entity label (face identity name or plate
11762
+ * vehicle name, propagated onto `event.data.label`) is one of these values.
11763
+ * Empty/absent → unaffected (back-compat). Enables "notify me when <named
11764
+ * vehicle/person> is seen". */
11765
+ labels: zod.z.array(zod.z.string()).readonly().optional()
11514
11766
  });
11515
11767
  var NotificationRuleTemplateSchema = zod.z.object({
11516
11768
  title: zod.z.string(),
@@ -11894,11 +12146,19 @@ var authProviderCapability = {
11894
12146
  * login page needs NO change.
11895
12147
  *
11896
12148
  * - `widget` — a Module-Federation widget the login page mounts (via
11897
- * `loadRemoteBundle`) for an in-page ceremony. Covers the passkey
11898
- * login ceremony, which must run `@simplewebauthn/browser` INSIDE the
11899
- * addon bundle. The referenced widget also declares `preAuth: true` in
11900
- * its `addon-widgets-source` catalog entry. `auth.listLoginMethods`
11901
- * stamps a public `bundleUrl` from `addonId` + `bundle`.
12149
+ * `loadRemoteBundle`) for an in-page ceremony. `auth.listLoginMethods`
12150
+ * stamps a public `bundleUrl` from `addonId` + `bundle`. Generic
12151
+ * mechanism kept for future use; no shipped addon uses it on the login
12152
+ * page (the passkey ceremony below runs natively in the shell instead).
12153
+ *
12154
+ * - `passkey` — a declarative WebAuthn ceremony the shell renders
12155
+ * natively (`@simplewebauthn/browser` lives in `addon-admin-ui`, not in
12156
+ * a remotely-loaded bundle). Carries the addon's effective `rpId` /
12157
+ * `origin` (from its `resolveRpID()` / `resolveOrigin()`) so the shell
12158
+ * can gate visibility (IP-literal origin, hostname/rpId mismatch) WITHOUT
12159
+ * fetching any remote code pre-auth. Contribution stays unconditional —
12160
+ * enrollment state is never leaked pre-auth; visibility is a shell
12161
+ * decision.
11902
12162
  *
11903
12163
  * Every contribution carries a `stage`:
11904
12164
  * - `primary` — shown on the first credentials screen (OIDC /
@@ -11947,8 +12207,30 @@ var WidgetLoginMethodSchema = zod.z.object({
11947
12207
  remote: WidgetRemoteSchema,
11948
12208
  stage: LoginStageEnum
11949
12209
  });
11950
- /** One login-method contribution — redirect button OR pre-auth widget. */
11951
- var LoginMethodContributionSchema = zod.z.discriminatedUnion("kind", [RedirectLoginMethodSchema, WidgetLoginMethodSchema]);
12210
+ /**
12211
+ * A declarative WebAuthn ceremony the shell renders natively (no remote
12212
+ * code). Carries the addon's EFFECTIVE `rpId`/`origin` so the shell can
12213
+ * gate visibility (IP-literal origin, hostname/rpId mismatch) before ever
12214
+ * showing the button — the contribution itself stays unconditional.
12215
+ */
12216
+ var PasskeyLoginMethodSchema = zod.z.object({
12217
+ kind: zod.z.literal("passkey"),
12218
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-direct-login`). */
12219
+ id: zod.z.string(),
12220
+ /** Operator-facing button label. */
12221
+ label: zod.z.string(),
12222
+ stage: LoginStageEnum,
12223
+ /** Effective WebAuthn RP ID (`resolveRpID()`) — the shell gates visibility on it. */
12224
+ rpId: zod.z.string(),
12225
+ /** Effective expected origin (`resolveOrigin()`), null when unconfigured. */
12226
+ origin: zod.z.string().nullable()
12227
+ });
12228
+ /** One login-method contribution — redirect button, pre-auth widget, or native passkey ceremony. */
12229
+ var LoginMethodContributionSchema = zod.z.discriminatedUnion("kind", [
12230
+ RedirectLoginMethodSchema,
12231
+ WidgetLoginMethodSchema,
12232
+ PasskeyLoginMethodSchema
12233
+ ]);
11952
12234
  var loginMethodCapability = {
11953
12235
  name: "login-method",
11954
12236
  scope: "system",
@@ -12464,18 +12746,6 @@ var cameraPipelineConfigCapability = {
12464
12746
  exposesDeviceSettings: true,
12465
12747
  methods: {}
12466
12748
  };
12467
- /**
12468
- * Shared cap-router predicates — the SINGLE source for the structural Zod-shape
12469
- * checks + naming used by BOTH the runtime cap-router builder
12470
- * (`@camstack/system` `cap-router-builder.ts` + the server's
12471
- * `cap-router-runtime.ts`) AND the codegen scripts (`scripts/generate-cap-*.ts`).
12472
- *
12473
- * These used to be independently reimplemented on each side, held in sync only
12474
- * by "must stay byte-identical" comments — a live drift risk. Consolidating them
12475
- * here (next to `resolveCapMount` / `expandCapMethods`, the other shared model)
12476
- * makes the two paths provably agree. Each predicate accepts both Zod 4
12477
- * (`_def.type`) and legacy Zod 3 (`_def.typeName` / `constructor.name`) shapes.
12478
- */
12479
12749
  /** `z.void()` — input carries no data. */
12480
12750
  function isVoidInput(schema) {
12481
12751
  const def = schema._def;
@@ -12503,6 +12773,26 @@ function isArrayOutputSchema(schema) {
12503
12773
  return false;
12504
12774
  }
12505
12775
  /**
12776
+ * True when `method` on cap `def` is a COLLECTION cap's array-returning
12777
+ * (non-subscription) method — the methods whose contract is "union the result
12778
+ * across every registered provider" (`listTargets`, `listTargetKinds`,
12779
+ * `discoverTargets`, `listEndpoints`, …).
12780
+ *
12781
+ * Such a method is aggregated at the hub via `concatCollection` / the runtime
12782
+ * `concatArrayMethod`, both of which SKIP a provider that doesn't implement it
12783
+ * (contributes `[]`). That local skip is invisible across the UDS boundary — a
12784
+ * hub-side per-provider proxy fabricates a callable for every property, so the
12785
+ * call reaches the child's real (possibly partial) provider. This predicate lets
12786
+ * the child-side dispatcher reproduce the same graceful skip: a missing method
12787
+ * here yields `[]`, not a "method not found" error. Singleton caps and non-array
12788
+ * methods return `false` so a genuinely missing method still surfaces as a bug.
12789
+ */
12790
+ function isCollectionArrayMethod(def, method) {
12791
+ if (def === void 0 || def.mode !== "collection") return false;
12792
+ const m = expandCapMethods(def)[method];
12793
+ return m !== void 0 && m.kind !== "subscription" && isArrayOutputSchema(m.output);
12794
+ }
12795
+ /**
12506
12796
  * Apply `.loose()` to an object input schema when available (Zod 4) so the
12507
12797
  * router accepts the out-of-band `nodeId`/`addonId` selector keys without
12508
12798
  * stripping them. Falls back to the schema unchanged when `.loose()` is absent.
@@ -14621,14 +14911,14 @@ var TargetKindCapsSchema = zod.z.object({
14621
14911
  * the union is large and not meant for runtime validation here; the exported
14622
14912
  * `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
14623
14913
  */
14624
- var ConfigSchemaPassthrough = zod.z.unknown();
14914
+ var ConfigSchemaPassthrough$1 = zod.z.unknown();
14625
14915
  var TargetKindSchema = zod.z.object({
14626
14916
  kind: zod.z.string(),
14627
14917
  label: zod.z.string(),
14628
14918
  icon: zod.z.string(),
14629
14919
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
14630
14920
  addonId: zod.z.string(),
14631
- configSchema: ConfigSchemaPassthrough,
14921
+ configSchema: ConfigSchemaPassthrough$1,
14632
14922
  supportsDiscovery: zod.z.boolean(),
14633
14923
  caps: TargetKindCapsSchema
14634
14924
  });
@@ -14695,6 +14985,345 @@ var notificationOutputCapability = {
14695
14985
  }
14696
14986
  };
14697
14987
  /**
14988
+ * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
14989
+ * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
14990
+ * caps stay wire-compatible without a circular cap→cap import.
14991
+ *
14992
+ * Errors are a discriminated-union RESULT, never thrown: the shape survives
14993
+ * every transport tier structurally, and failed calls still write usage rows.
14994
+ * Token counts only in v1 — no costUsd (operator decision, 2026-07-15).
14995
+ */
14996
+ var LlmUsageSchema = zod.z.object({
14997
+ inputTokens: zod.z.number(),
14998
+ outputTokens: zod.z.number()
14999
+ });
15000
+ var LlmErrorCodeSchema = zod.z.enum([
15001
+ "timeout",
15002
+ "rate-limited",
15003
+ "auth",
15004
+ "refusal",
15005
+ "bad-request",
15006
+ "unavailable",
15007
+ "no-profile",
15008
+ "budget-exceeded",
15009
+ "adapter-error"
15010
+ ]);
15011
+ var LlmGenerateOkSchema = zod.z.object({
15012
+ ok: zod.z.literal(true),
15013
+ text: zod.z.string(),
15014
+ model: zod.z.string(),
15015
+ usage: LlmUsageSchema,
15016
+ truncated: zod.z.boolean(),
15017
+ latencyMs: zod.z.number()
15018
+ });
15019
+ var LlmGenerateErrSchema = zod.z.object({
15020
+ ok: zod.z.literal(false),
15021
+ code: LlmErrorCodeSchema,
15022
+ message: zod.z.string(),
15023
+ retryAfterMs: zod.z.number().optional()
15024
+ });
15025
+ var LlmGenerateResultSchema = zod.z.discriminatedUnion("ok", [LlmGenerateOkSchema, LlmGenerateErrSchema]);
15026
+ /**
15027
+ * `Uint8Array` is the sanctioned binary convention — superjson + the UDS
15028
+ * MsgPack channel round-trip typed arrays (embedding-encoder.cap.ts:29,
15029
+ * notification-output.cap.ts:27-31 precedents).
15030
+ */
15031
+ var LlmImageSchema = zod.z.object({
15032
+ bytes: zod.z.instanceof(Uint8Array),
15033
+ mimeType: zod.z.string()
15034
+ });
15035
+ var LlmGenerateBaseInputSchema = zod.z.object({
15036
+ /** Collection routing (the notification-output posture). */
15037
+ addonId: zod.z.string().optional(),
15038
+ /** Explicit profile; else the resolution chain (spec §3). */
15039
+ profileId: zod.z.string().optional(),
15040
+ /** MANDATORY usage tag: 'ai-summary', 'notifier-rules', 'adhoc-ui', … */
15041
+ consumer: zod.z.string(),
15042
+ system: zod.z.string().optional(),
15043
+ /** v1: single-turn. `messages[]` is a v2 additive field. */
15044
+ prompt: zod.z.string(),
15045
+ /** Structured output — adapter-mapped (response_format / forced tool / responseSchema). */
15046
+ jsonSchema: zod.z.record(zod.z.string(), zod.z.unknown()).optional(),
15047
+ /** Per-call override of the profile default. */
15048
+ maxTokens: zod.z.number().int().positive().optional(),
15049
+ temperature: zod.z.number().optional()
15050
+ });
15051
+ /**
15052
+ * `llm-runtime` — node-side managed llama.cpp executor (spec §4). Registered
15053
+ * on EVERY node where `addon-ai` is installed; the hub `llm` provider reaches
15054
+ * a specific node's runtime with `nodePin(profile.runtime.nodeId)` — normal
15055
+ * cap routing, zero bespoke plumbing. `internal: true`: the operator reaches
15056
+ * this only through the `llm` cap's methods.
15057
+ *
15058
+ * One running llama-server child per node in v1 (models are RAM-heavy).
15059
+ * Resource ceiling = llama-server flags + idleStopMinutes ONLY (no RSS
15060
+ * watchdog — operator decision #3).
15061
+ */
15062
+ var ManagedModelRefSchema = zod.z.discriminatedUnion("kind", [
15063
+ zod.z.object({
15064
+ kind: zod.z.literal("catalog"),
15065
+ catalogId: zod.z.string()
15066
+ }),
15067
+ zod.z.object({
15068
+ kind: zod.z.literal("url"),
15069
+ url: zod.z.string(),
15070
+ sha256: zod.z.string().optional()
15071
+ }),
15072
+ zod.z.object({
15073
+ kind: zod.z.literal("path"),
15074
+ path: zod.z.string()
15075
+ })
15076
+ ]);
15077
+ var ManagedRuntimeConfigSchema = zod.z.object({
15078
+ /** WHERE the runtime lives — hub or any agent. */
15079
+ nodeId: zod.z.string(),
15080
+ /** Closed for v1; 'ollama' is a v2 candidate. */
15081
+ engine: zod.z.enum(["llama-cpp"]),
15082
+ model: ManagedModelRefSchema,
15083
+ contextSize: zod.z.number().int().default(4096),
15084
+ /** 0 = CPU-only. */
15085
+ gpuLayers: zod.z.number().int().default(0),
15086
+ /** Default: cpus-2, clamped ≥1 (resolved node-side). */
15087
+ threads: zod.z.number().int().optional(),
15088
+ /** Concurrent slots. */
15089
+ parallel: zod.z.number().int().default(1),
15090
+ /** Else lazy: first generate boots it. */
15091
+ autoStart: zod.z.boolean().default(false),
15092
+ /** 0 = never; frees RAM after quiet periods. */
15093
+ idleStopMinutes: zod.z.number().int().default(30)
15094
+ });
15095
+ var LlmRuntimeStatusSchema = zod.z.object({
15096
+ /** Status is ALWAYS node-qualified. */
15097
+ nodeId: zod.z.string(),
15098
+ state: zod.z.enum([
15099
+ "stopped",
15100
+ "downloading",
15101
+ "starting",
15102
+ "ready",
15103
+ "crashed",
15104
+ "failed"
15105
+ ]),
15106
+ pid: zod.z.number().optional(),
15107
+ port: zod.z.number().optional(),
15108
+ modelPath: zod.z.string().optional(),
15109
+ modelId: zod.z.string().optional(),
15110
+ downloadProgress: zod.z.number().min(0).max(1).optional(),
15111
+ lastError: zod.z.string().optional(),
15112
+ crashesInWindow: zod.z.number(),
15113
+ /** Child RSS (sampled best-effort). */
15114
+ memoryBytes: zod.z.number().optional(),
15115
+ vramBytes: zod.z.number().optional()
15116
+ });
15117
+ var LlmNodeModelSchema = zod.z.object({
15118
+ file: zod.z.string(),
15119
+ sizeBytes: zod.z.number(),
15120
+ catalogId: zod.z.string().optional(),
15121
+ installedAt: zod.z.number().optional()
15122
+ });
15123
+ var LlmRuntimeDiskUsageSchema = zod.z.object({
15124
+ nodeId: zod.z.string(),
15125
+ modelsBytes: zod.z.number(),
15126
+ freeBytes: zod.z.number().optional()
15127
+ });
15128
+ var llmRuntimeCapability = {
15129
+ name: "llm-runtime",
15130
+ scope: "system",
15131
+ mode: "singleton",
15132
+ internal: true,
15133
+ methods: {
15134
+ complete: method(LlmGenerateBaseInputSchema.extend({
15135
+ images: zod.z.array(LlmImageSchema).optional(),
15136
+ runtime: ManagedRuntimeConfigSchema,
15137
+ /** The managed profile's timeout, threaded by the hub provider. */
15138
+ timeoutMs: zod.z.number().int().positive().optional()
15139
+ }), LlmGenerateResultSchema, { kind: "mutation" }),
15140
+ ensureStarted: method(zod.z.object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
15141
+ kind: "mutation",
15142
+ auth: "admin"
15143
+ }),
15144
+ stop: method(zod.z.object({}), zod.z.void(), {
15145
+ kind: "mutation",
15146
+ auth: "admin"
15147
+ }),
15148
+ status: method(zod.z.object({}), LlmRuntimeStatusSchema),
15149
+ installModel: method(zod.z.object({ model: ManagedModelRefSchema }), zod.z.void(), {
15150
+ kind: "mutation",
15151
+ auth: "admin"
15152
+ }),
15153
+ deleteModel: method(zod.z.object({ file: zod.z.string() }), zod.z.void(), {
15154
+ kind: "mutation",
15155
+ auth: "admin"
15156
+ }),
15157
+ listLocalModels: method(zod.z.object({}), zod.z.array(LlmNodeModelSchema)),
15158
+ getDiskUsage: method(zod.z.object({}), LlmRuntimeDiskUsageSchema)
15159
+ }
15160
+ };
15161
+ /**
15162
+ * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
15163
+ * methods concat-fan across providers; single-row methods route to ONE
15164
+ * provider by the `addonId` in the call input (the notification-output
15165
+ * posture, notification-output.cap.ts:215-250). Provided by `addon-ai`
15166
+ * (hub-placed); the cap stays open for future providers.
15167
+ *
15168
+ * Profiles are ROWS (data), not addons: one row = one usable model endpoint.
15169
+ * `apiKey` is a password field — providers REDACT it on read and merge on
15170
+ * write; a stored key NEVER round-trips to a client.
15171
+ */
15172
+ var LlmProfileKindSchema = zod.z.enum([
15173
+ "openai-compatible",
15174
+ "openai",
15175
+ "anthropic",
15176
+ "google",
15177
+ "managed-local"
15178
+ ]);
15179
+ var LlmProfileSchema = zod.z.object({
15180
+ id: zod.z.string(),
15181
+ name: zod.z.string(),
15182
+ kind: LlmProfileKindSchema,
15183
+ /** Stamped by the provider — keeps the fanned catalog routable. */
15184
+ addonId: zod.z.string(),
15185
+ enabled: zod.z.boolean(),
15186
+ /** Vendor model id, or the managed runtime's loaded model. */
15187
+ model: zod.z.string(),
15188
+ /** Required for openai-compatible; override for cloud kinds. */
15189
+ baseUrl: zod.z.string().optional(),
15190
+ /** ConfigUISchema type:'password' — never round-trips (spec §5). */
15191
+ apiKey: zod.z.string().optional(),
15192
+ supportsVision: zod.z.boolean(),
15193
+ temperature: zod.z.number().min(0).max(2).optional(),
15194
+ maxTokens: zod.z.number().int().positive().optional(),
15195
+ timeoutMs: zod.z.number().int().positive().default(6e4),
15196
+ extraHeaders: zod.z.record(zod.z.string(), zod.z.string()).optional(),
15197
+ /** kind === 'managed-local' only (spec §4). */
15198
+ runtime: ManagedRuntimeConfigSchema.optional()
15199
+ });
15200
+ /** ConfigUISchema tree passed through untyped on the wire (the
15201
+ * notification-output `ConfigSchemaPassthrough` precedent at
15202
+ * notification-output.cap.ts:151); the exported TS type re-tightens it. */
15203
+ var ConfigSchemaPassthrough = zod.z.unknown();
15204
+ var LlmProfileKindDescriptorSchema = zod.z.object({
15205
+ kind: LlmProfileKindSchema,
15206
+ label: zod.z.string(),
15207
+ icon: zod.z.string(),
15208
+ /** Stamped by each provider so the concat-fanned catalog stays routable. */
15209
+ addonId: zod.z.string(),
15210
+ configSchema: ConfigSchemaPassthrough
15211
+ });
15212
+ var LlmDefaultSelectorSchema = zod.z.union([zod.z.object({ consumer: zod.z.string() }), zod.z.object({ purpose: zod.z.enum(["text", "vision"]) })]);
15213
+ var LlmDefaultSchema = zod.z.object({
15214
+ selector: LlmDefaultSelectorSchema,
15215
+ profileId: zod.z.string()
15216
+ });
15217
+ /** Server-side rollup row — getUsage never dumps raw call rows (spec §6). */
15218
+ var LlmUsageRollupSchema = zod.z.object({
15219
+ day: zod.z.string(),
15220
+ consumer: zod.z.string(),
15221
+ profileId: zod.z.string(),
15222
+ calls: zod.z.number(),
15223
+ okCalls: zod.z.number(),
15224
+ errorCalls: zod.z.number(),
15225
+ inputTokens: zod.z.number(),
15226
+ outputTokens: zod.z.number(),
15227
+ avgLatencyMs: zod.z.number()
15228
+ });
15229
+ /** LLM-facing view over the reused ModelCatalogEntry mechanism (spec §4.2). */
15230
+ var ManagedModelCatalogEntrySchema = zod.z.object({
15231
+ id: zod.z.string(),
15232
+ label: zod.z.string(),
15233
+ family: zod.z.string(),
15234
+ purpose: zod.z.enum(["text", "vision"]),
15235
+ url: zod.z.string(),
15236
+ sha256: zod.z.string(),
15237
+ sizeBytes: zod.z.number(),
15238
+ quantization: zod.z.string(),
15239
+ /** Load-time guidance shown in the picker. */
15240
+ minRamBytes: zod.z.number(),
15241
+ contextSizeDefault: zod.z.number().int(),
15242
+ /** Vision models: companion projector file. */
15243
+ mmprojUrl: zod.z.string().optional()
15244
+ });
15245
+ var LlmRuntimeNodeSchema = zod.z.object({
15246
+ nodeId: zod.z.string(),
15247
+ reachable: zod.z.boolean(),
15248
+ status: LlmRuntimeStatusSchema.optional(),
15249
+ disk: LlmRuntimeDiskUsageSchema.optional(),
15250
+ error: zod.z.string().optional()
15251
+ });
15252
+ var GenerateVisionInputSchema = LlmGenerateBaseInputSchema.extend({ images: zod.z.array(LlmImageSchema).min(1) });
15253
+ var ProfileRefInputSchema = zod.z.object({
15254
+ addonId: zod.z.string(),
15255
+ profileId: zod.z.string()
15256
+ });
15257
+ var llmCapability = {
15258
+ name: "llm",
15259
+ scope: "system",
15260
+ mode: "collection",
15261
+ internal: false,
15262
+ providerKind: "ai",
15263
+ /** `nodeId` inputs below are DATA (the hub provider pins itself), never routing. */
15264
+ nodeIdMode: "data",
15265
+ methods: {
15266
+ generate: method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }),
15267
+ generateVision: method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }),
15268
+ listProfileKinds: method(zod.z.object({}), zod.z.array(LlmProfileKindDescriptorSchema)),
15269
+ listProfiles: method(zod.z.object({}), zod.z.array(LlmProfileSchema)),
15270
+ upsertProfile: method(zod.z.object({ profile: LlmProfileSchema }), LlmProfileSchema, {
15271
+ kind: "mutation",
15272
+ auth: "admin"
15273
+ }),
15274
+ deleteProfile: method(ProfileRefInputSchema, zod.z.void(), {
15275
+ kind: "mutation",
15276
+ auth: "admin"
15277
+ }),
15278
+ testProfile: method(ProfileRefInputSchema, LlmGenerateResultSchema, {
15279
+ kind: "mutation",
15280
+ auth: "admin"
15281
+ }),
15282
+ /** Live vendor enumeration (GET /models etc.). */
15283
+ listModels: method(ProfileRefInputSchema, zod.z.array(zod.z.string())),
15284
+ getDefaults: method(zod.z.object({}), zod.z.array(LlmDefaultSchema)),
15285
+ setDefault: method(zod.z.object({
15286
+ selector: LlmDefaultSelectorSchema,
15287
+ profileId: zod.z.string().nullable()
15288
+ }), zod.z.void(), {
15289
+ kind: "mutation",
15290
+ auth: "admin"
15291
+ }),
15292
+ getUsage: method(zod.z.object({
15293
+ since: zod.z.number().optional(),
15294
+ until: zod.z.number().optional(),
15295
+ consumer: zod.z.string().optional(),
15296
+ profileId: zod.z.string().optional()
15297
+ }), zod.z.array(LlmUsageRollupSchema)),
15298
+ listModelCatalog: method(zod.z.object({}), zod.z.array(ManagedModelCatalogEntrySchema)),
15299
+ listRuntimeNodes: method(zod.z.object({}), zod.z.array(LlmRuntimeNodeSchema)),
15300
+ listNodeModels: method(zod.z.object({ nodeId: zod.z.string() }), zod.z.array(LlmNodeModelSchema)),
15301
+ installModel: method(zod.z.object({
15302
+ nodeId: zod.z.string(),
15303
+ model: ManagedModelRefSchema
15304
+ }), zod.z.void(), {
15305
+ kind: "mutation",
15306
+ auth: "admin"
15307
+ }),
15308
+ deleteModel: method(zod.z.object({
15309
+ nodeId: zod.z.string(),
15310
+ file: zod.z.string()
15311
+ }), zod.z.void(), {
15312
+ kind: "mutation",
15313
+ auth: "admin"
15314
+ }),
15315
+ getRuntimeStatus: method(ProfileRefInputSchema, LlmRuntimeStatusSchema),
15316
+ startRuntime: method(ProfileRefInputSchema, LlmRuntimeStatusSchema, {
15317
+ kind: "mutation",
15318
+ auth: "admin"
15319
+ }),
15320
+ stopRuntime: method(ProfileRefInputSchema, zod.z.void(), {
15321
+ kind: "mutation",
15322
+ auth: "admin"
15323
+ })
15324
+ }
15325
+ };
15326
+ /**
14698
15327
  * Zod schemas for persisted record types.
14699
15328
  *
14700
15329
  * These schemas serve as the single source of truth for types that are
@@ -14916,6 +15545,10 @@ var TrackSchema = zod.z.object({
14916
15545
  snapshots: zod.z.array(TrackSnapshotSchema).readonly(),
14917
15546
  /** Deduplicated zones the track has entered at least once. */
14918
15547
  zonesVisited: zod.z.array(zod.z.string()).readonly(),
15548
+ /** Deduplicated set of detector classes observed for this track over its
15549
+ * life (a track may be reclassified, e.g. person→vehicle). Absent on
15550
+ * legacy rows written before class accumulation shipped. */
15551
+ classes: zod.z.array(zod.z.string()).readonly().optional(),
14919
15552
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
14920
15553
  totalDistance: zod.z.number(),
14921
15554
  state: TrackStateSchema,
@@ -15077,7 +15710,7 @@ var KeyEventSchema = zod.z.object({
15077
15710
  /** Track lifetime in ms (lastSeen - firstSeen). */
15078
15711
  windowMs: zod.z.number().optional()
15079
15712
  });
15080
- var TrackedDetectionSchema = zod.z.object({
15713
+ zod.z.object({
15081
15714
  trackId: zod.z.string(),
15082
15715
  className: zod.z.string(),
15083
15716
  confidence: zod.z.number(),
@@ -15085,6 +15718,23 @@ var TrackedDetectionSchema = zod.z.object({
15085
15718
  zones: zod.z.array(zod.z.string()).readonly(),
15086
15719
  state: TrackStateSchema
15087
15720
  });
15721
+ var OverlayDetectionSchema = zod.z.looseObject({
15722
+ id: zod.z.string(),
15723
+ kind: zod.z.enum(["first-level", "detail"]),
15724
+ macroClass: zod.z.string(),
15725
+ score: zod.z.number(),
15726
+ bbox: zod.z.object({
15727
+ x: zod.z.number(),
15728
+ y: zod.z.number(),
15729
+ width: zod.z.number(),
15730
+ height: zod.z.number()
15731
+ }),
15732
+ labels: zod.z.array(zod.z.looseObject({
15733
+ label: zod.z.string(),
15734
+ score: zod.z.number()
15735
+ })).readonly(),
15736
+ parentId: zod.z.string().optional()
15737
+ });
15088
15738
  var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: zod.z.number() });
15089
15739
  var SearchObjectEventsInput = zod.z.object({
15090
15740
  text: zod.z.string(),
@@ -15095,6 +15745,20 @@ var SearchObjectEventsInput = zod.z.object({
15095
15745
  limit: zod.z.number().default(50),
15096
15746
  minScore: zod.z.number().min(0).max(1).default(.2)
15097
15747
  });
15748
+ var TrackCascadeCountsSchema = zod.z.object({
15749
+ /** Persisted track roots deleted (authoritative). */
15750
+ tracks: zod.z.number().int(),
15751
+ /** Object events removed with their tracks (best-effort; see note above). */
15752
+ events: zod.z.number().int(),
15753
+ /** Track/face/plate-owned media removed (best-effort). Never identity media. */
15754
+ media: zod.z.number().int(),
15755
+ /** Unassigned (non-enrolled) face reads removed (best-effort). */
15756
+ faces: zod.z.number().int(),
15757
+ /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
15758
+ plates: zod.z.number().int(),
15759
+ /** Per-track CLIP search vectors removed (best-effort). */
15760
+ embeddings: zod.z.number().int()
15761
+ });
15098
15762
  var pipelineAnalyticsCapability = {
15099
15763
  name: "pipeline-analytics",
15100
15764
  scope: "device",
@@ -15148,12 +15812,14 @@ var pipelineAnalyticsCapability = {
15148
15812
  audio: zod.z.number().int()
15149
15813
  })).readonly()),
15150
15814
  /**
15151
- * Delete all events (motion + object + audio) for the given device
15152
- * that are older than `cutoffMs` (exclusive), and delete their
15153
- * thumbnails in lockstep. Returns per-kind deleted counts.
15154
- *
15155
- * Called by Phase B3 recorder orchestration to keep event history
15156
- * aligned with available footage.
15815
+ * @deprecated Prefer `pruneTracksBefore` the track is the ROOT of the
15816
+ * analytics model and retention must cascade from it (design §5.1). This
15817
+ * event-only prune leaves orphaned tracks/faces/plates/embeddings behind.
15818
+ * Retained as a compat shim for the Phase-B3 recorder orchestration caller,
15819
+ * which prunes events to keep history aligned with available footage and
15820
+ * reads the per-kind counts. Delete all events (motion + object + audio)
15821
+ * for the given device older than `cutoffMs` (exclusive) + their thumbnails
15822
+ * in lockstep; returns per-kind deleted counts.
15157
15823
  */
15158
15824
  pruneEventsBefore: method(zod.z.object({
15159
15825
  deviceId: zod.z.number(),
@@ -15166,6 +15832,55 @@ var pipelineAnalyticsCapability = {
15166
15832
  kind: "mutation",
15167
15833
  auth: "admin"
15168
15834
  }),
15835
+ /**
15836
+ * Track-centric retention entry point (design §5.1). Selects every
15837
+ * persisted track for the device whose `lastSeen < cutoffMs` (paged) and
15838
+ * runs the extensible whole-track deletion cascade (design §3): object
15839
+ * events + their media, track/face/plate-owned media, unassigned face
15840
+ * reads, per-track CLIP embeddings, then the track root LAST. ENROLLED
15841
+ * (assigned) faces/plates and `ownerKind:'identity'` media are exempt —
15842
+ * the durable matching gallery always persists. Fires the per-track
15843
+ * live-state cleanup so a pruned track can't linger in dispatch/overlay
15844
+ * state. Returns per-family deleted counts (`tracks` authoritative).
15845
+ *
15846
+ * Replaces `pruneEventsBefore` as the correct time-based retention prune.
15847
+ */
15848
+ pruneTracksBefore: method(zod.z.object({
15849
+ deviceId: zod.z.number(),
15850
+ cutoffMs: zod.z.number()
15851
+ }), TrackCascadeCountsSchema, {
15852
+ kind: "mutation",
15853
+ auth: "admin"
15854
+ }),
15855
+ /**
15856
+ * Operator "clean slate" for a device (design §5.3): prune EVERY track for
15857
+ * the device via the same cascade as `pruneTracksBefore` with `cutoffMs =
15858
+ * now`. One call per device — no client-side track enumeration. Enrolled
15859
+ * gallery + identity media are exempt (design §4). Returns per-family
15860
+ * deleted counts.
15861
+ */
15862
+ wipeAllAnalytics: method(zod.z.object({ deviceId: zod.z.number() }), TrackCascadeCountsSchema, {
15863
+ kind: "mutation",
15864
+ auth: "admin"
15865
+ }),
15866
+ /**
15867
+ * Delete whole tracks (object events) by id for the given device,
15868
+ * cascading their media in lockstep. Returns the number of tracks
15869
+ * actually deleted plus the ids that could not be removed.
15870
+ *
15871
+ * Operator-driven from the DI Events page (batch delete). Routes through
15872
+ * the same widened track-deletion cascade (design §5.2).
15873
+ */
15874
+ deleteTracks: method(zod.z.object({
15875
+ deviceId: zod.z.number(),
15876
+ trackIds: zod.z.array(zod.z.string()).min(1)
15877
+ }), zod.z.object({
15878
+ deleted: zod.z.number().int(),
15879
+ failed: zod.z.array(zod.z.string()).readonly()
15880
+ }), {
15881
+ kind: "mutation",
15882
+ auth: "admin"
15883
+ }),
15169
15884
  getEventMedia: method(zod.z.object({
15170
15885
  eventId: zod.z.string(),
15171
15886
  kind: MediaFileKindEnum.optional()
@@ -15183,17 +15898,19 @@ var pipelineAnalyticsCapability = {
15183
15898
  },
15184
15899
  events: {
15185
15900
  /**
15186
- * Enriched frame emitted after refinement. Carries lightweight
15187
- * tracked-detection metadata (track id, class, zones, state) so
15188
- * downstream consumers (stream overlays, notifications) can
15189
- * annotate without querying full Track state.
15901
+ * Enriched frame emitted after refinement the live-overlay source of
15902
+ * truth (two-plane re-injection). Carries the frame's detections in the
15903
+ * `ObjectDetection` wire shape: first-level roots (with track info +
15904
+ * enrichment labels) plus synthesized `kind:'detail'` face/plate entries
15905
+ * re-projected from per-track detail state, so stream overlays render
15906
+ * boxes + recognized names without querying full Track state.
15190
15907
  */
15191
15908
  onFrameTracked: { data: zod.z.object({
15192
15909
  deviceId: zod.z.number(),
15193
15910
  timestamp: zod.z.number(),
15194
15911
  frameWidth: zod.z.number(),
15195
15912
  frameHeight: zod.z.number(),
15196
- detections: zod.z.array(TrackedDetectionSchema).readonly()
15913
+ detections: zod.z.array(OverlayDetectionSchema).readonly()
15197
15914
  }) },
15198
15915
  /** Track entered active state (first-seen). */
15199
15916
  onTrackStarted: { data: zod.z.object({
@@ -19189,17 +19906,45 @@ setOverlay: method(zod.z.object({
19189
19906
  }
19190
19907
  }] }
19191
19908
  };
19192
- var PlateInfoSchema = zod.z.object({
19193
- plateId: zod.z.string(),
19194
- deviceId: zod.z.number().int(),
19195
- trackId: zod.z.string(),
19196
- timestamp: zod.z.number().int(),
19197
- /** Normalized OCR text (upper, no separators), or the human-corrected value. */
19909
+ var VehicleSchema = zod.z.object({
19910
+ id: zod.z.string(),
19911
+ name: zod.z.string(),
19912
+ sampleCount: zod.z.number().int().nonnegative(),
19913
+ coverMediaKey: zod.z.string().optional(),
19914
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
19915
+ coverBase64: zod.z.string().optional()
19916
+ });
19917
+ var VehicleSampleInfoSchema = zod.z.object({
19918
+ id: zod.z.string(),
19919
+ /** The plate text this sample enrolled (self-labeling — no embedding). */
19920
+ text: zod.z.string(),
19921
+ /** OCR confidence of the enrolled read (0..1). */
19922
+ score: zod.z.number(),
19923
+ addedAt: zod.z.number().int(),
19924
+ deviceId: zod.z.number().int().optional(),
19925
+ base64: zod.z.string().optional()
19926
+ });
19927
+ var PlateInfoSchema = zod.z.object({
19928
+ plateId: zod.z.string(),
19929
+ deviceId: zod.z.number().int(),
19930
+ trackId: zod.z.string(),
19931
+ timestamp: zod.z.number().int(),
19932
+ /** Normalized OCR text (upper, no separators), or the human-corrected value. */
19198
19933
  text: zod.z.string(),
19199
19934
  /** OCR confidence of the stored read (0..1); 1 when manually corrected. */
19200
19935
  score: zod.z.number(),
19201
19936
  /** True when the text was manually corrected (exempt from retention). */
19202
19937
  corrected: zod.z.boolean(),
19938
+ /** Recognized vehicle id when a matcher lookup named this read (SQL NULL → absent). */
19939
+ recognizedVehicleId: zod.z.string().optional(),
19940
+ /** Resolved vehicle name for `recognizedVehicleId` (UI convenience). */
19941
+ vehicleName: zod.z.string().optional(),
19942
+ /** True once the read was assigned to a vehicle (enrolled as a sample). */
19943
+ assigned: zod.z.boolean(),
19944
+ /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
19945
+ plateBbox: BoundingBoxSchema.optional(),
19946
+ /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
19947
+ keyFrameMediaKey: zod.z.string().optional(),
19203
19948
  base64: zod.z.string().optional()
19204
19949
  });
19205
19950
  var MediaFileLiteSchema = zod.z.object({
@@ -19261,6 +20006,58 @@ var plateGalleryCapability = {
19261
20006
  deletePlate: method(zod.z.object({ plateId: zod.z.string() }), zod.z.void(), {
19262
20007
  kind: "mutation",
19263
20008
  auth: "admin"
20009
+ }),
20010
+ listVehicles: method(zod.z.void(), zod.z.array(VehicleSchema).readonly()),
20011
+ createVehicle: method(zod.z.object({ name: zod.z.string().min(1) }), VehicleSchema, {
20012
+ kind: "mutation",
20013
+ auth: "admin"
20014
+ }),
20015
+ renameVehicle: method(zod.z.object({
20016
+ id: zod.z.string(),
20017
+ name: zod.z.string().min(1)
20018
+ }), zod.z.void(), {
20019
+ kind: "mutation",
20020
+ auth: "admin"
20021
+ }),
20022
+ deleteVehicle: method(zod.z.object({ id: zod.z.string() }), zod.z.void(), {
20023
+ kind: "mutation",
20024
+ auth: "admin"
20025
+ }),
20026
+ listVehicleSamples: method(zod.z.object({ vehicleId: zod.z.string() }), zod.z.array(VehicleSampleInfoSchema).readonly()),
20027
+ removeVehicleSample: method(zod.z.object({
20028
+ vehicleId: zod.z.string(),
20029
+ sampleId: zod.z.string()
20030
+ }), zod.z.void(), {
20031
+ kind: "mutation",
20032
+ auth: "admin"
20033
+ }),
20034
+ assignPlate: method(zod.z.object({
20035
+ plateId: zod.z.string(),
20036
+ vehicleId: zod.z.string()
20037
+ }), zod.z.void(), {
20038
+ kind: "mutation",
20039
+ auth: "admin"
20040
+ }),
20041
+ unassignPlate: method(zod.z.object({ plateId: zod.z.string() }), zod.z.void(), {
20042
+ kind: "mutation",
20043
+ auth: "admin"
20044
+ }),
20045
+ assignPlates: method(zod.z.object({
20046
+ plateIds: zod.z.array(zod.z.string()).min(1),
20047
+ vehicleId: zod.z.string()
20048
+ }), zod.z.object({
20049
+ assigned: zod.z.number().int(),
20050
+ failed: zod.z.array(zod.z.string()).readonly()
20051
+ }), {
20052
+ kind: "mutation",
20053
+ auth: "admin"
20054
+ }),
20055
+ unassignPlates: method(zod.z.object({ plateIds: zod.z.array(zod.z.string()).min(1) }), zod.z.object({
20056
+ unassigned: zod.z.number().int(),
20057
+ failed: zod.z.array(zod.z.string()).readonly()
20058
+ }), {
20059
+ kind: "mutation",
20060
+ auth: "admin"
19264
20061
  })
19265
20062
  }
19266
20063
  };
@@ -20421,6 +21218,8 @@ var ALL_CAPABILITY_DEFINITIONS = [
20421
21218
  integrationsCapability,
20422
21219
  intercomCapability,
20423
21220
  lawnMowerControlCapability,
21221
+ llmCapability,
21222
+ llmRuntimeCapability,
20424
21223
  localNetworkCapability,
20425
21224
  lockControlCapability,
20426
21225
  logDestinationCapability,
@@ -20459,6 +21258,7 @@ var ALL_CAPABILITY_DEFINITIONS = [
20459
21258
  ptzAutotrackCapability,
20460
21259
  rebootCapability,
20461
21260
  recordingCapability,
21261
+ sceneMonitorCapability,
20462
21262
  scriptRunnerCapability,
20463
21263
  serverManagementCapability,
20464
21264
  settingsStoreCapability,
@@ -20553,6 +21353,7 @@ var CAP_NAMES_WITH_STATUS = [
20553
21353
  "ptz",
20554
21354
  "ptz-autotrack",
20555
21355
  "recording",
21356
+ "scene-monitor",
20556
21357
  "script-runner",
20557
21358
  "smoke",
20558
21359
  "snapshot",
@@ -22476,6 +23277,168 @@ var METHOD_ACCESS_MAP = Object.freeze({
22476
23277
  addonId: null,
22477
23278
  access: "create"
22478
23279
  },
23280
+ "llm.deleteModel": {
23281
+ capName: "llm",
23282
+ capScope: "system",
23283
+ addonId: null,
23284
+ access: "delete"
23285
+ },
23286
+ "llm.deleteProfile": {
23287
+ capName: "llm",
23288
+ capScope: "system",
23289
+ addonId: null,
23290
+ access: "delete"
23291
+ },
23292
+ "llm.generate": {
23293
+ capName: "llm",
23294
+ capScope: "system",
23295
+ addonId: null,
23296
+ access: "create"
23297
+ },
23298
+ "llm.generateVision": {
23299
+ capName: "llm",
23300
+ capScope: "system",
23301
+ addonId: null,
23302
+ access: "create"
23303
+ },
23304
+ "llm.getDefaults": {
23305
+ capName: "llm",
23306
+ capScope: "system",
23307
+ addonId: null,
23308
+ access: "view"
23309
+ },
23310
+ "llm.getRuntimeStatus": {
23311
+ capName: "llm",
23312
+ capScope: "system",
23313
+ addonId: null,
23314
+ access: "view"
23315
+ },
23316
+ "llm.getUsage": {
23317
+ capName: "llm",
23318
+ capScope: "system",
23319
+ addonId: null,
23320
+ access: "view"
23321
+ },
23322
+ "llm.installModel": {
23323
+ capName: "llm",
23324
+ capScope: "system",
23325
+ addonId: null,
23326
+ access: "create"
23327
+ },
23328
+ "llm.listModelCatalog": {
23329
+ capName: "llm",
23330
+ capScope: "system",
23331
+ addonId: null,
23332
+ access: "view"
23333
+ },
23334
+ "llm.listModels": {
23335
+ capName: "llm",
23336
+ capScope: "system",
23337
+ addonId: null,
23338
+ access: "view"
23339
+ },
23340
+ "llm.listNodeModels": {
23341
+ capName: "llm",
23342
+ capScope: "system",
23343
+ addonId: null,
23344
+ access: "view"
23345
+ },
23346
+ "llm.listProfileKinds": {
23347
+ capName: "llm",
23348
+ capScope: "system",
23349
+ addonId: null,
23350
+ access: "view"
23351
+ },
23352
+ "llm.listProfiles": {
23353
+ capName: "llm",
23354
+ capScope: "system",
23355
+ addonId: null,
23356
+ access: "view"
23357
+ },
23358
+ "llm.listRuntimeNodes": {
23359
+ capName: "llm",
23360
+ capScope: "system",
23361
+ addonId: null,
23362
+ access: "view"
23363
+ },
23364
+ "llm.setDefault": {
23365
+ capName: "llm",
23366
+ capScope: "system",
23367
+ addonId: null,
23368
+ access: "create"
23369
+ },
23370
+ "llm.startRuntime": {
23371
+ capName: "llm",
23372
+ capScope: "system",
23373
+ addonId: null,
23374
+ access: "create"
23375
+ },
23376
+ "llm.stopRuntime": {
23377
+ capName: "llm",
23378
+ capScope: "system",
23379
+ addonId: null,
23380
+ access: "create"
23381
+ },
23382
+ "llm.testProfile": {
23383
+ capName: "llm",
23384
+ capScope: "system",
23385
+ addonId: null,
23386
+ access: "create"
23387
+ },
23388
+ "llm.upsertProfile": {
23389
+ capName: "llm",
23390
+ capScope: "system",
23391
+ addonId: null,
23392
+ access: "create"
23393
+ },
23394
+ "llmRuntime.complete": {
23395
+ capName: "llm-runtime",
23396
+ capScope: "system",
23397
+ addonId: null,
23398
+ access: "create"
23399
+ },
23400
+ "llmRuntime.deleteModel": {
23401
+ capName: "llm-runtime",
23402
+ capScope: "system",
23403
+ addonId: null,
23404
+ access: "delete"
23405
+ },
23406
+ "llmRuntime.ensureStarted": {
23407
+ capName: "llm-runtime",
23408
+ capScope: "system",
23409
+ addonId: null,
23410
+ access: "create"
23411
+ },
23412
+ "llmRuntime.getDiskUsage": {
23413
+ capName: "llm-runtime",
23414
+ capScope: "system",
23415
+ addonId: null,
23416
+ access: "view"
23417
+ },
23418
+ "llmRuntime.installModel": {
23419
+ capName: "llm-runtime",
23420
+ capScope: "system",
23421
+ addonId: null,
23422
+ access: "create"
23423
+ },
23424
+ "llmRuntime.listLocalModels": {
23425
+ capName: "llm-runtime",
23426
+ capScope: "system",
23427
+ addonId: null,
23428
+ access: "view"
23429
+ },
23430
+ "llmRuntime.status": {
23431
+ capName: "llm-runtime",
23432
+ capScope: "system",
23433
+ addonId: null,
23434
+ access: "view"
23435
+ },
23436
+ "llmRuntime.stop": {
23437
+ capName: "llm-runtime",
23438
+ capScope: "system",
23439
+ addonId: null,
23440
+ access: "create"
23441
+ },
22479
23442
  "localNetwork.getAllowedAddresses": {
22480
23443
  capName: "local-network",
22481
23444
  capScope: "system",
@@ -23106,6 +24069,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
23106
24069
  addonId: null,
23107
24070
  access: "delete"
23108
24071
  },
24072
+ "pipelineAnalytics.deleteTracks": {
24073
+ capName: "pipeline-analytics",
24074
+ capScope: "device",
24075
+ addonId: null,
24076
+ access: "delete"
24077
+ },
23109
24078
  "pipelineAnalytics.getActiveTracks": {
23110
24079
  capName: "pipeline-analytics",
23111
24080
  capScope: "device",
@@ -23172,12 +24141,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
23172
24141
  addonId: null,
23173
24142
  access: "create"
23174
24143
  },
24144
+ "pipelineAnalytics.pruneTracksBefore": {
24145
+ capName: "pipeline-analytics",
24146
+ capScope: "device",
24147
+ addonId: null,
24148
+ access: "create"
24149
+ },
23175
24150
  "pipelineAnalytics.searchObjectEvents": {
23176
24151
  capName: "pipeline-analytics",
23177
24152
  capScope: "device",
23178
24153
  addonId: null,
23179
24154
  access: "view"
23180
24155
  },
24156
+ "pipelineAnalytics.wipeAllAnalytics": {
24157
+ capName: "pipeline-analytics",
24158
+ capScope: "device",
24159
+ addonId: null,
24160
+ access: "delete"
24161
+ },
23181
24162
  "pipelineExecutor.cacheFrameInPool": {
23182
24163
  capName: "pipeline-executor",
23183
24164
  capScope: "system",
@@ -23676,18 +24657,48 @@ var METHOD_ACCESS_MAP = Object.freeze({
23676
24657
  addonId: null,
23677
24658
  access: "create"
23678
24659
  },
24660
+ "pipelineRunner.runDetailSubtree": {
24661
+ capName: "pipeline-runner",
24662
+ capScope: "system",
24663
+ addonId: null,
24664
+ access: "create"
24665
+ },
24666
+ "plateGallery.assignPlate": {
24667
+ capName: "plate-gallery",
24668
+ capScope: "system",
24669
+ addonId: null,
24670
+ access: "create"
24671
+ },
24672
+ "plateGallery.assignPlates": {
24673
+ capName: "plate-gallery",
24674
+ capScope: "system",
24675
+ addonId: null,
24676
+ access: "create"
24677
+ },
23679
24678
  "plateGallery.correctPlateText": {
23680
24679
  capName: "plate-gallery",
23681
24680
  capScope: "system",
23682
24681
  addonId: null,
23683
24682
  access: "create"
23684
24683
  },
24684
+ "plateGallery.createVehicle": {
24685
+ capName: "plate-gallery",
24686
+ capScope: "system",
24687
+ addonId: null,
24688
+ access: "create"
24689
+ },
23685
24690
  "plateGallery.deletePlate": {
23686
24691
  capName: "plate-gallery",
23687
24692
  capScope: "system",
23688
24693
  addonId: null,
23689
24694
  access: "delete"
23690
24695
  },
24696
+ "plateGallery.deleteVehicle": {
24697
+ capName: "plate-gallery",
24698
+ capScope: "system",
24699
+ addonId: null,
24700
+ access: "delete"
24701
+ },
23691
24702
  "plateGallery.getPlateByTrack": {
23692
24703
  capName: "plate-gallery",
23693
24704
  capScope: "system",
@@ -23706,6 +24717,30 @@ var METHOD_ACCESS_MAP = Object.freeze({
23706
24717
  addonId: null,
23707
24718
  access: "view"
23708
24719
  },
24720
+ "plateGallery.listVehicles": {
24721
+ capName: "plate-gallery",
24722
+ capScope: "system",
24723
+ addonId: null,
24724
+ access: "view"
24725
+ },
24726
+ "plateGallery.listVehicleSamples": {
24727
+ capName: "plate-gallery",
24728
+ capScope: "system",
24729
+ addonId: null,
24730
+ access: "view"
24731
+ },
24732
+ "plateGallery.removeVehicleSample": {
24733
+ capName: "plate-gallery",
24734
+ capScope: "system",
24735
+ addonId: null,
24736
+ access: "delete"
24737
+ },
24738
+ "plateGallery.renameVehicle": {
24739
+ capName: "plate-gallery",
24740
+ capScope: "system",
24741
+ addonId: null,
24742
+ access: "create"
24743
+ },
23709
24744
  "plateGallery.searchPlates": {
23710
24745
  capName: "plate-gallery",
23711
24746
  capScope: "system",
@@ -23718,6 +24753,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
23718
24753
  addonId: null,
23719
24754
  access: "view"
23720
24755
  },
24756
+ "plateGallery.unassignPlate": {
24757
+ capName: "plate-gallery",
24758
+ capScope: "system",
24759
+ addonId: null,
24760
+ access: "create"
24761
+ },
24762
+ "plateGallery.unassignPlates": {
24763
+ capName: "plate-gallery",
24764
+ capScope: "system",
24765
+ addonId: null,
24766
+ access: "create"
24767
+ },
23721
24768
  "platformProbe.getCapabilities": {
23722
24769
  capName: "platform-probe",
23723
24770
  capScope: "system",
@@ -23910,6 +24957,48 @@ var METHOD_ACCESS_MAP = Object.freeze({
23910
24957
  addonId: null,
23911
24958
  access: "create"
23912
24959
  },
24960
+ "sceneMonitor.captureReference": {
24961
+ capName: "scene-monitor",
24962
+ capScope: "device",
24963
+ addonId: null,
24964
+ access: "create"
24965
+ },
24966
+ "sceneMonitor.createScene": {
24967
+ capName: "scene-monitor",
24968
+ capScope: "device",
24969
+ addonId: null,
24970
+ access: "create"
24971
+ },
24972
+ "sceneMonitor.deleteReference": {
24973
+ capName: "scene-monitor",
24974
+ capScope: "device",
24975
+ addonId: null,
24976
+ access: "delete"
24977
+ },
24978
+ "sceneMonitor.deleteScene": {
24979
+ capName: "scene-monitor",
24980
+ capScope: "device",
24981
+ addonId: null,
24982
+ access: "delete"
24983
+ },
24984
+ "sceneMonitor.listScenes": {
24985
+ capName: "scene-monitor",
24986
+ capScope: "device",
24987
+ addonId: null,
24988
+ access: "view"
24989
+ },
24990
+ "sceneMonitor.recheckNow": {
24991
+ capName: "scene-monitor",
24992
+ capScope: "device",
24993
+ addonId: null,
24994
+ access: "create"
24995
+ },
24996
+ "sceneMonitor.updateScene": {
24997
+ capName: "scene-monitor",
24998
+ capScope: "device",
24999
+ addonId: null,
25000
+ access: "create"
25001
+ },
23913
25002
  "scriptRunner.run": {
23914
25003
  capName: "script-runner",
23915
25004
  capScope: "device",
@@ -24994,6 +26083,7 @@ var METHOD_ACCESS_MAP = Object.freeze({
24994
26083
  Object.freeze({
24995
26084
  "broker": "broker",
24996
26085
  "device-export": "device-export",
26086
+ "llm": "ai",
24997
26087
  "mesh-network": "mesh",
24998
26088
  "mqtt-broker": "broker",
24999
26089
  "network-access": "ingress",
@@ -25370,6 +26460,12 @@ Object.defineProperty(exports, "isArrayOutputSchema", {
25370
26460
  return isArrayOutputSchema;
25371
26461
  }
25372
26462
  });
26463
+ Object.defineProperty(exports, "isCollectionArrayMethod", {
26464
+ enumerable: true,
26465
+ get: function() {
26466
+ return isCollectionArrayMethod;
26467
+ }
26468
+ });
25373
26469
  Object.defineProperty(exports, "isDeviceConfigCap", {
25374
26470
  enumerable: true,
25375
26471
  get: function() {