@camstack/types 1.1.46 → 1.1.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/addon.js CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_sleep = require("./sleep-Vh_bux78.js");
3
- const require_event_category = require("./event-category-BXd6yeJi.js");
2
+ const require_sleep = require("./sleep-BkhAiFKX.js");
3
+ const require_event_category = require("./event-category-AkBNxg_X.js");
4
4
  const require_err_msg = require("./err-msg-COpsHMw2.js");
5
5
  exports.BaseAddon = require_sleep.BaseAddon;
6
6
  exports.DATAPLANE_SECRET_HEADER = require_sleep.DATAPLANE_SECRET_HEADER;
package/dist/addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { A as parseJsonUnknown, D as asString, I as scopeKey, M as ReadinessRegistry, N as ReadinessTimeoutError, S as DeviceType, T as asJsonObject, a as viewerUiCapability, bt as DisposerChain, ct as BaseAddon, ft as emitReadiness, i as deviceOpsCapability, j as DATAPLANE_SECRET_HEADER, lt as normalizeAddonInitResult, m as expandCapMethods, o as adminUiCapability, s as createDeviceProxy, t as sleep } from "./sleep-Br7r_3fq.mjs";
2
- import { t as EventCategory } from "./event-category-CFZs3jI4.mjs";
1
+ import { A as parseJsonUnknown, D as asString, I as scopeKey, M as ReadinessRegistry, N as ReadinessTimeoutError, S as DeviceType, T as asJsonObject, a as viewerUiCapability, bt as DisposerChain, ct as BaseAddon, ft as emitReadiness, i as deviceOpsCapability, j as DATAPLANE_SECRET_HEADER, lt as normalizeAddonInitResult, m as expandCapMethods, o as adminUiCapability, s as createDeviceProxy, t as sleep } from "./sleep-CK899CTS.mjs";
2
+ import { t as EventCategory } from "./event-category-H4AVePnn.mjs";
3
3
  import { t as errMsg } from "./err-msg-IQTHeDzc.mjs";
4
4
  export { BaseAddon, DATAPLANE_SECRET_HEADER, DeviceType, DisposerChain, EventCategory, ReadinessRegistry, ReadinessTimeoutError, adminUiCapability, asJsonObject, asString, createDeviceProxy, deviceOpsCapability, emitReadiness, errMsg, expandCapMethods, normalizeAddonInitResult, parseJsonUnknown, scopeKey, sleep, viewerUiCapability };
@@ -202,6 +202,19 @@ export declare const ConfigEntrySchema: z.ZodObject<{
202
202
  value: z.ZodUnknown;
203
203
  description: z.ZodOptional<z.ZodString>;
204
204
  }, z.core.$strip>;
205
+ export declare const DeviceLinkModeSchema: z.ZodEnum<{
206
+ manual: "manual";
207
+ auto: "auto";
208
+ }>;
209
+ export type DeviceLinkMode = z.infer<typeof DeviceLinkModeSchema>;
210
+ /** One resolved linked device — the compact projection consumers need. */
211
+ export declare const LinkedDeviceSchema: z.ZodObject<{
212
+ deviceId: z.ZodNumber;
213
+ name: z.ZodString;
214
+ location: z.ZodNullable<z.ZodString>;
215
+ features: z.ZodArray<z.ZodString>;
216
+ }, z.core.$strip>;
217
+ export type LinkedDevice = z.infer<typeof LinkedDeviceSchema>;
205
218
  export { StreamSourceEntrySchema };
206
219
  export declare const SavedDeviceRowSchema: z.ZodObject<{
207
220
  id: z.ZodNumber;
@@ -331,6 +344,7 @@ export declare const deviceManagerCapability: {
331
344
  readonly name: "device-manager";
332
345
  readonly scope: "system";
333
346
  readonly mode: "singleton";
347
+ readonly exposesDeviceSettings: true;
334
348
  readonly methods: {
335
349
  /** Reserve (or re-resolve) a progressive numeric id for `(addonId, stableId)`.
336
350
  * Idempotent: returns the existing id if one is already persisted for the
@@ -1024,6 +1038,29 @@ export declare const deviceManagerCapability: {
1024
1038
  }, z.core.$strip>>>;
1025
1039
  }, z.core.$strip>>;
1026
1040
  }, z.core.$strip>>, import("./capability-definition.js").CapabilityMethodKind>;
1041
+ /**
1042
+ * Resolve the devices LINKED to a camera — the single policy authority
1043
+ * both consumers call (viewer devices panel + pipeline-analytics event
1044
+ * kinds/ingest). Device-tree children are ALWAYS included; mode 'auto'
1045
+ * (default) adds every device sharing the camera's non-null `location`,
1046
+ * mode 'manual' adds the persisted manual list instead. Excludes the
1047
+ * camera itself; deduped. Configuration is standard per-device settings
1048
+ * (see the module docblock) — there are no bespoke link mutations.
1049
+ */
1050
+ readonly getLinkedDevices: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
1051
+ deviceId: z.ZodNumber;
1052
+ }, z.core.$strip>, z.ZodObject<{
1053
+ mode: z.ZodEnum<{
1054
+ manual: "manual";
1055
+ auto: "auto";
1056
+ }>;
1057
+ devices: z.ZodArray<z.ZodObject<{
1058
+ deviceId: z.ZodNumber;
1059
+ name: z.ZodString;
1060
+ location: z.ZodNullable<z.ZodString>;
1061
+ features: z.ZodArray<z.ZodString>;
1062
+ }, z.core.$strip>>;
1063
+ }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
1027
1064
  /** Get stream sources for a camera device. */
1028
1065
  readonly getStreamSources: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
1029
1066
  deviceId: z.ZodNumber;
@@ -2,10 +2,23 @@ import { z } from 'zod';
2
2
  import { type InferProvider } from './capability-definition.js';
3
3
  import { DeviceType } from '../device/device-type.js';
4
4
  /**
5
- * Doorbell button cap. Installed on a `DeviceType.Button` accessory
6
- * with `role: DeviceRole.Doorbell`. Emits an `onPressed` event every
7
- * time the firmware pushes a ring; status tracks the last press and
8
- * a pressCount since start (diagnostic).
5
+ * Doorbell button cap. Two kinds of providers coexist behind this cap
6
+ * name (same pattern as `snapshot`):
7
+ *
8
+ * - **Native** providers: registered per-device by device-driver
9
+ * addons via `ctx.registerNativeCap` — either on a
10
+ * `DeviceType.Button` accessory with `role: DeviceRole.Doorbell`,
11
+ * or directly on the camera (Reolink registers at camera level).
12
+ * Emits an `onPressed` event every time the firmware pushes a
13
+ * ring; status tracks the last press and a pressCount since start
14
+ * (diagnostic).
15
+ *
16
+ * - **Wrapper** provider: the `virtual-doorbell` system builtin
17
+ * (`@camstack/system/builtins/doorbell`). Turns ANY binary-ish
18
+ * device (contact / switch / event-emitter …) into a doorbell for
19
+ * a camera. `defaultActive: false` — the operator explicitly binds
20
+ * it per camera in the device-bindings UI, then picks the source
21
+ * device + trigger in the per-device settings.
9
22
  *
10
23
  * The DeviceEventPropagator re-emits `onPressed` on the camera parent
11
24
  * — subscribers listening at the camera level receive ring events
@@ -26,7 +39,10 @@ export declare const doorbellCapability: {
26
39
  readonly scope: "device";
27
40
  readonly deviceNative: true;
28
41
  readonly mode: "singleton";
29
- readonly deviceTypes: readonly [DeviceType.Button];
42
+ readonly kind: "wrapper";
43
+ readonly defaultActive: false;
44
+ readonly deviceTypes: readonly [DeviceType.Button, DeviceType.Camera];
45
+ readonly exposesDeviceSettings: true;
30
46
  readonly methods: {};
31
47
  readonly events: {
32
48
  /**
@@ -54,7 +54,7 @@ export { AdoptInputSchema as AdoptionAdoptInputSchema, type AdoptionFilter, Adop
54
54
  export type { IDeviceExportProvider } from './device-export.cap.js';
55
55
  export { DeviceExportStatusSchema, deviceExportCapability, ExportSetupFieldSchema, ExportSetupSchema, ExposedDeviceSchema, ExposeInputSchema as DeviceExportExposeInputSchema, UnexposeInputSchema as DeviceExportUnexposeInputSchema, } from './device-export.cap.js';
56
56
  export type { DeviceInfo, DeviceManagerApplyInitialMetaInput } from './device-manager.cap.js';
57
- export { ConfigEntrySchema, DeviceInfoSchema, deviceManagerCapability, type IDeviceManagerProvider, } from './device-manager.cap.js';
57
+ export { ConfigEntrySchema, DeviceInfoSchema, type DeviceLinkMode, DeviceLinkModeSchema, deviceManagerCapability, type IDeviceManagerProvider, type LinkedDevice, LinkedDeviceSchema, } from './device-manager.cap.js';
58
58
  export { DiscoveredDeviceSchema, deviceProviderCapability, ProviderStatusSchema, } from './device-provider.cap.js';
59
59
  export { deviceStateCapability } from './device-state.cap.js';
60
60
  export type { IEmbeddingEncoderProvider } from './embedding-encoder.cap.js';
@@ -77,7 +77,8 @@ export { type ILlmProvider, type LlmDefault, type LlmDefaultSelector, LlmDefault
77
77
  export { type ILlmRuntimeProvider, llmRuntimeCapability, type LlmNodeModel, LlmNodeModelSchema, type LlmRuntimeCompleteInput, LlmRuntimeCompleteInputSchema, type LlmRuntimeDiskUsage, LlmRuntimeDiskUsageSchema, type LlmRuntimeStatus, LlmRuntimeStatusSchema, type ManagedModelRef, ManagedModelRefSchema, type ManagedRuntimeConfig, ManagedRuntimeConfigSchema, } from './llm-runtime.cap.js';
78
78
  export { type LlmErrorCode, LlmErrorCodeSchema, type LlmGenerateBaseInput, LlmGenerateBaseInputSchema, type LlmGenerateErr, LlmGenerateErrSchema, type LlmGenerateOk, LlmGenerateOkSchema, type LlmGenerateResult, LlmGenerateResultSchema, type LlmImage, LlmImageSchema, type LlmUsage, LlmUsageSchema, } from './llm-shared.js';
79
79
  export { type IOauthIntegrationProvider, type OauthIntegrationDescriptor, OauthIntegrationDescriptorSchema, oauthIntegrationCapability, } from './oauth-integration.cap.js';
80
- export { type AudioEvent, AudioEventSchema, type DetectionSource, DetectionSourceSchema, type EventKind, EventKindSchema, type IPipelineAnalyticsProvider, type KeyEvent, KeyEventSchema, type MediaFile, type MediaFileKind, MediaFileSchema, type MotionEvent, MotionEventSchema, type ObjectEvent, ObjectEventSchema, pipelineAnalyticsCapability, type ScoredObjectEvent, ScoredObjectEventSchema, type Track, type TrackCascadeCounts, TrackCascadeCountsSchema, TrackedDetectionSchema, TrackSchema, type TrackState, TrackStateSchema, } from './pipeline-analytics.cap.js';
80
+ export { type AudioEvent, AudioEventSchema, type DetectionSource, DetectionSourceSchema, type EventKind, type EventKindCategory, EventKindCategorySchema, type EventKindDescriptor, EventKindDescriptorSchema, type EventKindIcon, EventKindIconSchema, EventKindSchema, type IPipelineAnalyticsProvider, type KeyEvent, KeyEventSchema, type MediaFile, type MediaFileKind, MediaFileSchema, type MotionEvent, MotionEventSchema, type ObjectEvent, ObjectEventSchema, pipelineAnalyticsCapability, type RecentTracksPage, RecentTracksPageSchema, type RecentTracksQuery, RecentTracksQueryInput, type ScoredObjectEvent, ScoredObjectEventSchema, type SensorEvent, SensorEventSchema, type Track, type TrackCascadeCounts, TrackCascadeCountsSchema, TrackedDetectionSchema, type TrackEnvelope, TrackEnvelopeSchema, type TrackProjection, TrackProjectionSchema, TrackSchema, type TrackState, TrackStateSchema, type TrackZoneFilter, TrackZoneFilterSchema, } from './pipeline-analytics.cap.js';
81
+ export { EVENT_KIND_BY_CAP, type SensorEventKindDescriptor } from './sensor-event-kinds.js';
81
82
  export type { PipelineStepInputOutput, PipelineValidationIssue, PipelineValidationResult, } from './pipeline-executor.cap.js';
82
83
  export { ModelSubstitutionSchema, PipelineDefaultStepSchema, PipelineEngineChoiceSchema, PipelineRunResultBridge, PipelineStepInputSchema, PipelineValidationIssueSchema, PipelineValidationResultSchema, pipelineExecutorCapability, } from './pipeline-executor.cap.js';
83
84
  export type { CameraAssignmentStatus, CameraAudioStatus, CameraBrokerProfile, CameraBrokerStatus, CameraDecoderShm, CameraDecoderStatus, CameraDetectionPhase, CameraDetectionProvisioning, CameraDetectionProvisioningState, CameraDetectionStatus, CameraMotionStatus, CameraRecordingMode, CameraRecordingStatus, CameraSourceStatus, CameraSourceStream, CameraStatus, IngestOwner, } from './pipeline-orchestrator.cap.js';
@@ -39,6 +39,116 @@ declare const EventKindSchema: z.ZodEnum<{
39
39
  motion: "motion";
40
40
  }>;
41
41
  export type EventKind = z.infer<typeof EventKindSchema>;
42
+ /**
43
+ * Spatial filter for `listTracks` — the rect + polygon variants of the shared
44
+ * MaskShape vocabulary (see `mask-shape.ts`). Coordinates are NORMALIZED 0..1
45
+ * of the camera frame (top-left origin), matching the drawing-plane editor.
46
+ */
47
+ declare const TrackZoneFilterSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
48
+ kind: z.ZodLiteral<"rect">;
49
+ x: z.ZodNumber;
50
+ y: z.ZodNumber;
51
+ width: z.ZodNumber;
52
+ height: z.ZodNumber;
53
+ }, z.core.$strip>, z.ZodObject<{
54
+ kind: z.ZodLiteral<"polygon">;
55
+ points: z.ZodArray<z.ZodObject<{
56
+ x: z.ZodNumber;
57
+ y: z.ZodNumber;
58
+ }, z.core.$strip>>;
59
+ }, z.core.$strip>], "kind">;
60
+ export type TrackZoneFilter = z.infer<typeof TrackZoneFilterSchema>;
61
+ /** Closed icon vocabulary so clients render a known glyph per kind. */
62
+ export declare const EventKindIconSchema: z.ZodEnum<{
63
+ button: "button";
64
+ generic: "generic";
65
+ audio: "audio";
66
+ person: "person";
67
+ vehicle: "vehicle";
68
+ animal: "animal";
69
+ motion: "motion";
70
+ door: "door";
71
+ pir: "pir";
72
+ smoke: "smoke";
73
+ water: "water";
74
+ }>;
75
+ export type EventKindIcon = z.infer<typeof EventKindIconSchema>;
76
+ export declare const EventKindCategorySchema: z.ZodEnum<{
77
+ sensor: "sensor";
78
+ audio: "audio";
79
+ custom: "custom";
80
+ motion: "motion";
81
+ detection: "detection";
82
+ }>;
83
+ export type EventKindCategory = z.infer<typeof EventKindCategorySchema>;
84
+ declare const EventKindDescriptorSchema: z.ZodObject<{
85
+ kind: z.ZodString;
86
+ label: z.ZodString;
87
+ color: z.ZodString;
88
+ icon: z.ZodEnum<{
89
+ button: "button";
90
+ generic: "generic";
91
+ audio: "audio";
92
+ person: "person";
93
+ vehicle: "vehicle";
94
+ animal: "animal";
95
+ motion: "motion";
96
+ door: "door";
97
+ pir: "pir";
98
+ smoke: "smoke";
99
+ water: "water";
100
+ }>;
101
+ category: z.ZodEnum<{
102
+ sensor: "sensor";
103
+ audio: "audio";
104
+ custom: "custom";
105
+ motion: "motion";
106
+ detection: "detection";
107
+ }>;
108
+ source: z.ZodObject<{
109
+ capName: z.ZodString;
110
+ deviceId: z.ZodNumber;
111
+ }, z.core.$strip>;
112
+ }, z.core.$strip>;
113
+ export type EventKindDescriptor = z.infer<typeof EventKindDescriptorSchema>;
114
+ declare const SensorEventSchema: z.ZodObject<{
115
+ id: z.ZodString;
116
+ deviceId: z.ZodNumber;
117
+ sourceDeviceId: z.ZodNumber;
118
+ kind: z.ZodString;
119
+ value: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
120
+ timestamp: z.ZodNumber;
121
+ }, z.core.$strip>;
122
+ export type SensorEvent = z.infer<typeof SensorEventSchema>;
123
+ /**
124
+ * Normalized 0..1 trajectory envelope (min/max over every position bbox,
125
+ * divided by the track's detection-frame dims), computed at persist time.
126
+ * Absent when the frame dims were unknown when the track was persisted
127
+ * (legacy rows / dims-less sources) and on active (in-RAM) tracks.
128
+ */
129
+ declare const TrackEnvelopeSchema: z.ZodObject<{
130
+ minX: z.ZodNumber;
131
+ minY: z.ZodNumber;
132
+ maxX: z.ZodNumber;
133
+ maxY: z.ZodNumber;
134
+ }, z.core.$strip>;
135
+ export type TrackEnvelope = z.infer<typeof TrackEnvelopeSchema>;
136
+ /**
137
+ * Row projection for track list queries. `full` (default) returns the
138
+ * complete Track including the frame-rate `positions[]` history and the
139
+ * `snapshots[]` references — megabytes across a page of tracks. `slim`
140
+ * keeps every scalar the list surfaces actually render (ids, class(es),
141
+ * label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
142
+ * zonesVisited, bestEventId, envelope) and returns `positions` /
143
+ * `snapshots` as EMPTY arrays — detail views re-fetch the full row via
144
+ * `getTrack`. Mirrors the event-store `projection` convention
145
+ * (`getObjectEvents` et al.).
146
+ */
147
+ declare const TrackProjectionSchema: z.ZodEnum<{
148
+ full: "full";
149
+ slim: "slim";
150
+ }>;
151
+ export type TrackProjection = z.infer<typeof TrackProjectionSchema>;
42
152
  /**
43
153
  * One audio-classification label heard on the track's camera while the
44
154
  * track was alive, aggregated per label. An "episode" is one persisted
@@ -108,6 +218,12 @@ declare const TrackSchema: z.ZodObject<{
108
218
  firstAt: z.ZodNumber;
109
219
  lastAt: z.ZodNumber;
110
220
  }, z.core.$strip>>>>;
221
+ envelope: z.ZodOptional<z.ZodObject<{
222
+ minX: z.ZodNumber;
223
+ minY: z.ZodNumber;
224
+ maxX: z.ZodNumber;
225
+ maxY: z.ZodNumber;
226
+ }, z.core.$strip>>;
111
227
  }, z.core.$strip>;
112
228
  export type Track = z.infer<typeof TrackSchema>;
113
229
  declare const MotionEventSchema: z.ZodObject<{
@@ -227,6 +343,83 @@ declare const MediaFileSchema: z.ZodObject<{
227
343
  timestamp: z.ZodNumber;
228
344
  }, z.core.$strip>;
229
345
  export type MediaFile = z.infer<typeof MediaFileSchema>;
346
+ declare const RecentTracksQueryInput: z.ZodObject<{
347
+ deviceIds: z.ZodArray<z.ZodNumber>;
348
+ since: z.ZodOptional<z.ZodNumber>;
349
+ until: z.ZodOptional<z.ZodNumber>;
350
+ limit: z.ZodDefault<z.ZodNumber>;
351
+ cursor: z.ZodOptional<z.ZodString>;
352
+ projection: z.ZodOptional<z.ZodEnum<{
353
+ full: "full";
354
+ slim: "slim";
355
+ }>>;
356
+ }, z.core.$strip>;
357
+ export type RecentTracksQuery = z.infer<typeof RecentTracksQueryInput>;
358
+ declare const RecentTracksPageSchema: z.ZodObject<{
359
+ tracks: z.ZodReadonly<z.ZodArray<z.ZodObject<{
360
+ trackId: z.ZodString;
361
+ deviceId: z.ZodNumber;
362
+ className: z.ZodString;
363
+ label: z.ZodOptional<z.ZodString>;
364
+ firstSeen: z.ZodNumber;
365
+ lastSeen: z.ZodNumber;
366
+ positions: z.ZodReadonly<z.ZodArray<z.ZodObject<{
367
+ x: z.ZodNumber;
368
+ y: z.ZodNumber;
369
+ timestamp: z.ZodNumber;
370
+ bbox: z.ZodObject<{
371
+ x: z.ZodNumber;
372
+ y: z.ZodNumber;
373
+ w: z.ZodNumber;
374
+ h: z.ZodNumber;
375
+ }, z.core.$strip>;
376
+ }, z.core.$strip>>>;
377
+ snapshots: z.ZodReadonly<z.ZodArray<z.ZodObject<{
378
+ timestamp: z.ZodNumber;
379
+ position: z.ZodObject<{
380
+ x: z.ZodNumber;
381
+ y: z.ZodNumber;
382
+ timestamp: z.ZodNumber;
383
+ bbox: z.ZodObject<{
384
+ x: z.ZodNumber;
385
+ y: z.ZodNumber;
386
+ w: z.ZodNumber;
387
+ h: z.ZodNumber;
388
+ }, z.core.$strip>;
389
+ }, z.core.$strip>;
390
+ mediaKey: z.ZodString;
391
+ }, z.core.$strip>>>;
392
+ zonesVisited: z.ZodReadonly<z.ZodArray<z.ZodString>>;
393
+ classes: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodString>>>;
394
+ totalDistance: z.ZodNumber;
395
+ state: z.ZodEnum<{
396
+ moving: "moving";
397
+ left: "left";
398
+ idle: "idle";
399
+ new: "new";
400
+ entered: "entered";
401
+ }>;
402
+ active: z.ZodBoolean;
403
+ importance: z.ZodOptional<z.ZodNumber>;
404
+ bestEventId: z.ZodOptional<z.ZodString>;
405
+ importanceReason: z.ZodOptional<z.ZodString>;
406
+ audioLabels: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodObject<{
407
+ label: z.ZodString;
408
+ peakScore: z.ZodNumber;
409
+ count: z.ZodNumber;
410
+ firstAt: z.ZodNumber;
411
+ lastAt: z.ZodNumber;
412
+ }, z.core.$strip>>>>;
413
+ envelope: z.ZodOptional<z.ZodObject<{
414
+ minX: z.ZodNumber;
415
+ minY: z.ZodNumber;
416
+ maxX: z.ZodNumber;
417
+ maxY: z.ZodNumber;
418
+ }, z.core.$strip>>;
419
+ }, z.core.$strip>>>;
420
+ nextCursor: z.ZodNullable<z.ZodString>;
421
+ }, z.core.$strip>;
422
+ export type RecentTracksPage = z.infer<typeof RecentTracksPageSchema>;
230
423
  declare const KeyEventSchema: z.ZodObject<{
231
424
  id: z.ZodString;
232
425
  trackId: z.ZodString;
@@ -368,6 +561,12 @@ export declare const pipelineAnalyticsCapability: {
368
561
  firstAt: z.ZodNumber;
369
562
  lastAt: z.ZodNumber;
370
563
  }, z.core.$strip>>>>;
564
+ envelope: z.ZodOptional<z.ZodObject<{
565
+ minX: z.ZodNumber;
566
+ minY: z.ZodNumber;
567
+ maxX: z.ZodNumber;
568
+ maxY: z.ZodNumber;
569
+ }, z.core.$strip>>;
371
570
  }, z.core.$strip>>>, import("./capability-definition.js").CapabilityMethodKind>;
372
571
  readonly getTrack: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
373
572
  deviceId: z.ZodNumber;
@@ -426,6 +625,12 @@ export declare const pipelineAnalyticsCapability: {
426
625
  firstAt: z.ZodNumber;
427
626
  lastAt: z.ZodNumber;
428
627
  }, z.core.$strip>>>>;
628
+ envelope: z.ZodOptional<z.ZodObject<{
629
+ minX: z.ZodNumber;
630
+ minY: z.ZodNumber;
631
+ maxX: z.ZodNumber;
632
+ maxY: z.ZodNumber;
633
+ }, z.core.$strip>>;
429
634
  }, z.core.$strip>>, import("./capability-definition.js").CapabilityMethodKind>;
430
635
  /** Historical completed tracks for a device. Queried from the
431
636
  * persisted `pipeline-analytics:tracks` collection; active tracks
@@ -435,6 +640,23 @@ export declare const pipelineAnalyticsCapability: {
435
640
  since: z.ZodOptional<z.ZodNumber>;
436
641
  until: z.ZodOptional<z.ZodNumber>;
437
642
  limit: z.ZodOptional<z.ZodNumber>;
643
+ zone: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
644
+ kind: z.ZodLiteral<"rect">;
645
+ x: z.ZodNumber;
646
+ y: z.ZodNumber;
647
+ width: z.ZodNumber;
648
+ height: z.ZodNumber;
649
+ }, z.core.$strip>, z.ZodObject<{
650
+ kind: z.ZodLiteral<"polygon">;
651
+ points: z.ZodArray<z.ZodObject<{
652
+ x: z.ZodNumber;
653
+ y: z.ZodNumber;
654
+ }, z.core.$strip>>;
655
+ }, z.core.$strip>], "kind">>;
656
+ projection: z.ZodOptional<z.ZodEnum<{
657
+ full: "full";
658
+ slim: "slim";
659
+ }>>;
438
660
  }, z.core.$strip>, z.ZodReadonly<z.ZodArray<z.ZodObject<{
439
661
  trackId: z.ZodString;
440
662
  deviceId: z.ZodNumber;
@@ -489,7 +711,97 @@ export declare const pipelineAnalyticsCapability: {
489
711
  firstAt: z.ZodNumber;
490
712
  lastAt: z.ZodNumber;
491
713
  }, z.core.$strip>>>>;
714
+ envelope: z.ZodOptional<z.ZodObject<{
715
+ minX: z.ZodNumber;
716
+ minY: z.ZodNumber;
717
+ maxX: z.ZodNumber;
718
+ maxY: z.ZodNumber;
719
+ }, z.core.$strip>>;
492
720
  }, z.core.$strip>>>, import("./capability-definition.js").CapabilityMethodKind>;
721
+ /**
722
+ * Batched cluster-wide track listing — ONE call for the events page /
723
+ * reel first paint instead of a per-camera `listTracks` fan-out. Merges
724
+ * the persisted completed tracks of every requested device, sorted by
725
+ * `lastSeen` DESC with a stable (lastSeen, trackId) cursor. Per-device
726
+ * indexed pages (`idx_tracks_device_lastSeen`) are k-way merged
727
+ * provider-side; `projection: 'slim'` drops the heavy `positions[]` /
728
+ * `snapshots[]` JSON (returned as empty arrays). Active in-RAM tracks
729
+ * are not included (same contract as `listTracks`).
730
+ */
731
+ readonly listRecentTracks: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
732
+ deviceIds: z.ZodArray<z.ZodNumber>;
733
+ since: z.ZodOptional<z.ZodNumber>;
734
+ until: z.ZodOptional<z.ZodNumber>;
735
+ limit: z.ZodDefault<z.ZodNumber>;
736
+ cursor: z.ZodOptional<z.ZodString>;
737
+ projection: z.ZodOptional<z.ZodEnum<{
738
+ full: "full";
739
+ slim: "slim";
740
+ }>>;
741
+ }, z.core.$strip>, z.ZodObject<{
742
+ tracks: z.ZodReadonly<z.ZodArray<z.ZodObject<{
743
+ trackId: z.ZodString;
744
+ deviceId: z.ZodNumber;
745
+ className: z.ZodString;
746
+ label: z.ZodOptional<z.ZodString>;
747
+ firstSeen: z.ZodNumber;
748
+ lastSeen: z.ZodNumber;
749
+ positions: z.ZodReadonly<z.ZodArray<z.ZodObject<{
750
+ x: z.ZodNumber;
751
+ y: z.ZodNumber;
752
+ timestamp: z.ZodNumber;
753
+ bbox: z.ZodObject<{
754
+ x: z.ZodNumber;
755
+ y: z.ZodNumber;
756
+ w: z.ZodNumber;
757
+ h: z.ZodNumber;
758
+ }, z.core.$strip>;
759
+ }, z.core.$strip>>>;
760
+ snapshots: z.ZodReadonly<z.ZodArray<z.ZodObject<{
761
+ timestamp: z.ZodNumber;
762
+ position: z.ZodObject<{
763
+ x: z.ZodNumber;
764
+ y: z.ZodNumber;
765
+ timestamp: z.ZodNumber;
766
+ bbox: z.ZodObject<{
767
+ x: z.ZodNumber;
768
+ y: z.ZodNumber;
769
+ w: z.ZodNumber;
770
+ h: z.ZodNumber;
771
+ }, z.core.$strip>;
772
+ }, z.core.$strip>;
773
+ mediaKey: z.ZodString;
774
+ }, z.core.$strip>>>;
775
+ zonesVisited: z.ZodReadonly<z.ZodArray<z.ZodString>>;
776
+ classes: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodString>>>;
777
+ totalDistance: z.ZodNumber;
778
+ state: z.ZodEnum<{
779
+ moving: "moving";
780
+ left: "left";
781
+ idle: "idle";
782
+ new: "new";
783
+ entered: "entered";
784
+ }>;
785
+ active: z.ZodBoolean;
786
+ importance: z.ZodOptional<z.ZodNumber>;
787
+ bestEventId: z.ZodOptional<z.ZodString>;
788
+ importanceReason: z.ZodOptional<z.ZodString>;
789
+ audioLabels: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodObject<{
790
+ label: z.ZodString;
791
+ peakScore: z.ZodNumber;
792
+ count: z.ZodNumber;
793
+ firstAt: z.ZodNumber;
794
+ lastAt: z.ZodNumber;
795
+ }, z.core.$strip>>>>;
796
+ envelope: z.ZodOptional<z.ZodObject<{
797
+ minX: z.ZodNumber;
798
+ minY: z.ZodNumber;
799
+ maxX: z.ZodNumber;
800
+ maxY: z.ZodNumber;
801
+ }, z.core.$strip>>;
802
+ }, z.core.$strip>>>;
803
+ nextCursor: z.ZodNullable<z.ZodString>;
804
+ }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
493
805
  readonly clearTracks: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
494
806
  deviceId: z.ZodNumber;
495
807
  }, z.core.$strip>, z.ZodVoid, "mutation">;
@@ -590,6 +902,63 @@ export declare const pipelineAnalyticsCapability: {
590
902
  deviceId: z.ZodNumber;
591
903
  timestamp: z.ZodNumber;
592
904
  }, z.core.$strip>>>, import("./capability-definition.js").CapabilityMethodKind>;
905
+ /**
906
+ * Every event kind the device can produce: built-ins (motion + audio),
907
+ * detection classes actually observed for the device (from the track
908
+ * history), and sensor kinds contributed by LINKED devices (resolved via
909
+ * `device-manager.getLinkedDevices`, mapped through `EVENT_KIND_BY_CAP`).
910
+ */
911
+ readonly listEventKinds: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
912
+ deviceId: z.ZodNumber;
913
+ }, z.core.$strip>, z.ZodReadonly<z.ZodArray<z.ZodObject<{
914
+ kind: z.ZodString;
915
+ label: z.ZodString;
916
+ color: z.ZodString;
917
+ icon: z.ZodEnum<{
918
+ button: "button";
919
+ generic: "generic";
920
+ audio: "audio";
921
+ person: "person";
922
+ vehicle: "vehicle";
923
+ animal: "animal";
924
+ motion: "motion";
925
+ door: "door";
926
+ pir: "pir";
927
+ smoke: "smoke";
928
+ water: "water";
929
+ }>;
930
+ category: z.ZodEnum<{
931
+ sensor: "sensor";
932
+ audio: "audio";
933
+ custom: "custom";
934
+ motion: "motion";
935
+ detection: "detection";
936
+ }>;
937
+ source: z.ZodObject<{
938
+ capName: z.ZodString;
939
+ deviceId: z.ZodNumber;
940
+ }, z.core.$strip>;
941
+ }, z.core.$strip>>>, import("./capability-definition.js").CapabilityMethodKind>;
942
+ /**
943
+ * Sensor-event history for a camera: state changes of LINKED sensor
944
+ * devices, attributed to the camera at ingest time (one row per linked
945
+ * camera). Mirrors `getAudioEvents` query semantics; `kinds` narrows to
946
+ * a kind subset.
947
+ */
948
+ readonly getSensorEvents: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
949
+ deviceId: z.ZodNumber;
950
+ since: z.ZodOptional<z.ZodNumber>;
951
+ until: z.ZodOptional<z.ZodNumber>;
952
+ kinds: z.ZodOptional<z.ZodArray<z.ZodString>>;
953
+ limit: z.ZodDefault<z.ZodNumber>;
954
+ }, z.core.$strip>, z.ZodReadonly<z.ZodArray<z.ZodObject<{
955
+ id: z.ZodString;
956
+ deviceId: z.ZodNumber;
957
+ sourceDeviceId: z.ZodNumber;
958
+ kind: z.ZodString;
959
+ value: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
960
+ timestamp: z.ZodNumber;
961
+ }, z.core.$strip>>>, import("./capability-definition.js").CapabilityMethodKind>;
593
962
  /**
594
963
  * Importance-ranked highlights for a device+window. Queries completed
595
964
  * tracks by (deviceId, firstSeen ∈ [since,until]), scores each (or reuses
@@ -877,6 +1246,6 @@ export declare const pipelineAnalyticsCapability: {
877
1246
  };
878
1247
  };
879
1248
  export type IPipelineAnalyticsProvider = InferProvider<typeof pipelineAnalyticsCapability>;
880
- export { TrackStateSchema, EventKindSchema, TrackSchema, TrackAudioLabelSchema, TrackCascadeCountsSchema, KeyEventSchema, MotionEventSchema, ObjectEventSchema, AudioEventSchema, MediaFileKindEnum, MediaFileSchema,
1249
+ export { TrackStateSchema, EventKindSchema, TrackSchema, TrackEnvelopeSchema, TrackProjectionSchema, RecentTracksQueryInput, RecentTracksPageSchema, TrackAudioLabelSchema, TrackCascadeCountsSchema, TrackZoneFilterSchema, EventKindDescriptorSchema, SensorEventSchema, KeyEventSchema, MotionEventSchema, ObjectEventSchema, AudioEventSchema, MediaFileKindEnum, MediaFileSchema,
881
1250
  /** No longer carried on onFrameTracked (two-plane re-injection) — kept for compat. */
882
1251
  TrackedDetectionSchema, };
@@ -84,7 +84,12 @@ export type RecordingStorageUsage = z.infer<typeof RecordingStorageUsageSchema>;
84
84
  /**
85
85
  * Result of locating footage at a wall-clock instant for one device/profile.
86
86
  * `segment` carries the covering segment's window; `gap` reports the forward
87
- * nearest covered edge (`null` past the end of footage / when none exists).
87
+ * nearest covered edge (`null` past the end of footage / when none exists)
88
+ * and the backward covered edge `prevEndMs` (exclusive end of the nearest
89
+ * footage behind the epoch; `null` when none — optional so older providers
90
+ * that omit it stay valid). `prevEndMs` lets a backward frame-step hop the
91
+ * small inter-segment cracks (durMs under-covers the span to the next
92
+ * startMs by ~11-17 ms) instead of no-opping at a segment head.
88
93
  */
89
94
  export declare const LocateSegmentResultSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
90
95
  kind: z.ZodLiteral<"segment">;
@@ -94,6 +99,7 @@ export declare const LocateSegmentResultSchema: z.ZodDiscriminatedUnion<[z.ZodOb
94
99
  }, z.core.$strip>, z.ZodObject<{
95
100
  kind: z.ZodLiteral<"gap">;
96
101
  nearestEdgeMs: z.ZodNullable<z.ZodNumber>;
102
+ prevEndMs: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
97
103
  }, z.core.$strip>], "kind">;
98
104
  export type LocateSegmentResult = z.infer<typeof LocateSegmentResultSchema>;
99
105
  /** Raw bytes of one finalized footage segment (read off disk on the recording node). */
@@ -260,6 +266,7 @@ export declare const recordingCapability: {
260
266
  }, z.core.$strip>, z.ZodObject<{
261
267
  kind: z.ZodLiteral<"gap">;
262
268
  nearestEdgeMs: z.ZodNullable<z.ZodNumber>;
269
+ prevEndMs: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
263
270
  }, z.core.$strip>], "kind">, "query">;
264
271
  /** Read one finalized segment's raw bytes by its exact `startMs`. Used by a
265
272
  * feeder running in another addon process to pull recorded footage over tRPC. */
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Static event-kind descriptors for the SENSOR cap family — the mapping
3
+ * `pipeline-analytics.listEventKinds` uses to turn a linked device's bound
4
+ * sensor caps (contact / flood / gas / carbon-monoxide / enum-sensor /
5
+ * event-emitter) into per-camera event-kind entries.
6
+ *
7
+ * Lives beside the sensor cap definitions so adding a new sensor cap and its
8
+ * event-kind descriptor happens in one place. The `source` field of the full
9
+ * `EventKindDescriptor` is stamped at compose time (per linked device) — this
10
+ * map carries only the static half.
11
+ */
12
+ import type { EventKindCategory, EventKindIcon } from './pipeline-analytics.cap.js';
13
+ /** The static half of an `EventKindDescriptor` (no per-device `source`). */
14
+ export interface SensorEventKindDescriptor {
15
+ readonly kind: string;
16
+ readonly label: string;
17
+ readonly color: string;
18
+ readonly icon: EventKindIcon;
19
+ readonly category: EventKindCategory;
20
+ }
21
+ /**
22
+ * Sensor cap name → static event-kind descriptor. A linked device
23
+ * contributes one entry per bound cap present in this map.
24
+ */
25
+ export declare const EVENT_KIND_BY_CAP: Readonly<Record<string, SensorEventKindDescriptor>>;
@@ -147,6 +147,9 @@ export declare enum EventCategory {
147
147
  RecordingSegmentWritten = "recording.segment.written",
148
148
  RecordingPolicyFallback = "recording.policy.fallback",
149
149
  RecordingRetentionCompleted = "recording.retention.completed",
150
+ /** Runner-sampled scrub thumbnail (~1/5 s/camera). Telemetry (D8): a lost
151
+ * thumb is a scrub gap the recorder's keyframe backfill covers. */
152
+ RecordingThumbSampled = "recording.thumb-sampled",
150
153
  DetectionEvent = "detection.event",
151
154
  SessionTrackNew = "session.track.new",
152
155
  SessionTrackExpired = "session.track.expired",
package/dist/enums.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_event_category = require("./event-category-BXd6yeJi.js");
2
+ const require_event_category = require("./event-category-AkBNxg_X.js");
3
3
  //#region src/enums/event-source-type.ts
4
4
  var EventSourceType = /* @__PURE__ */ function(EventSourceType) {
5
5
  EventSourceType["Addon"] = "addon";
package/dist/enums.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { t as EventCategory } from "./event-category-CFZs3jI4.mjs";
1
+ import { t as EventCategory } from "./event-category-H4AVePnn.mjs";
2
2
  //#region src/enums/event-source-type.ts
3
3
  var EventSourceType = /* @__PURE__ */ function(EventSourceType) {
4
4
  EventSourceType["Addon"] = "addon";