@camstack/types 1.2.184 → 1.2.186

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,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_sleep = require("./sleep-CfDqEZrs.js");
2
+ const require_sleep = require("./sleep-DXsYD0RX.js");
3
3
  const require_event_category = require("./event-category-yW4s1MGD.js");
4
4
  const require_err_msg = require("./err-msg-COpsHMw2.js");
5
5
  //#region src/generated/cap-input-defaults.ts
@@ -16,7 +16,7 @@ const require_err_msg = require("./err-msg-COpsHMw2.js");
16
16
  * Plain data, zero Zod: a forked runner must not import the schema barrel
17
17
  * (~144MB RSS per runner — D28).
18
18
  *
19
- * Coverage: 24 caps, 57 methods with defaults.
19
+ * Coverage: 24 caps, 58 methods with defaults.
20
20
  */
21
21
  var CAP_INPUT_DEFAULTS = Object.freeze({
22
22
  "addons": { "getLogs": { "limit": 100 } },
@@ -136,6 +136,7 @@ var CAP_INPUT_DEFAULTS = Object.freeze({
136
136
  "getMotionEvents": { "limit": 1e3 },
137
137
  "getObjectEvents": { "limit": 1e3 },
138
138
  "getSensorEvents": { "limit": 1e3 },
139
+ "listRecentSummaries": { "limit": 100 },
139
140
  "listRecentTracks": { "limit": 200 },
140
141
  "listSummaries": { "limit": 50 },
141
142
  "reclaimDebugMedia": { "mode": "report" },
package/dist/addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { D as adminUiCapability, E as DeviceType, G as scopeKey, H as ReadinessTimeoutError, M as expandCapMethods, R as nodePin, S as DEVICE_CHILDREN_BATCH_MAX, St as normalizeAddonInitResult, Tt as emitReadiness, V as ReadinessRegistry, a as asJsonObject, b as deviceOpsCapability, bt as DisposerChain, d as BOOT_RECOVERY_BACKOFF_MS, f as DEVICE_SCOPED_CAPS, h as createEventBusSliceSource, m as createDeviceProxy, p as isDeviceScopedCap, s as asString, t as sleep, u as parseJsonUnknown, vt as DATAPLANE_SECRET_HEADER, x as viewerUiCapability, xt as BaseAddon, z as readNodePin } from "./sleep-CnLyvg3w.mjs";
1
+ import { D as adminUiCapability, E as DeviceType, G as scopeKey, H as ReadinessTimeoutError, M as expandCapMethods, R as nodePin, S as DEVICE_CHILDREN_BATCH_MAX, St as normalizeAddonInitResult, Tt as emitReadiness, V as ReadinessRegistry, a as asJsonObject, b as deviceOpsCapability, bt as DisposerChain, d as BOOT_RECOVERY_BACKOFF_MS, f as DEVICE_SCOPED_CAPS, h as createEventBusSliceSource, m as createDeviceProxy, p as isDeviceScopedCap, s as asString, t as sleep, u as parseJsonUnknown, vt as DATAPLANE_SECRET_HEADER, x as viewerUiCapability, xt as BaseAddon, z as readNodePin } from "./sleep-DBKu2-U5.mjs";
2
2
  import { t as EventCategory } from "./event-category-ZyX6jcse.mjs";
3
3
  import { t as errMsg } from "./err-msg-IQTHeDzc.mjs";
4
4
  //#region src/generated/cap-input-defaults.ts
@@ -15,7 +15,7 @@ import { t as errMsg } from "./err-msg-IQTHeDzc.mjs";
15
15
  * Plain data, zero Zod: a forked runner must not import the schema barrel
16
16
  * (~144MB RSS per runner — D28).
17
17
  *
18
- * Coverage: 24 caps, 57 methods with defaults.
18
+ * Coverage: 24 caps, 58 methods with defaults.
19
19
  */
20
20
  var CAP_INPUT_DEFAULTS = Object.freeze({
21
21
  "addons": { "getLogs": { "limit": 100 } },
@@ -135,6 +135,7 @@ var CAP_INPUT_DEFAULTS = Object.freeze({
135
135
  "getMotionEvents": { "limit": 1e3 },
136
136
  "getObjectEvents": { "limit": 1e3 },
137
137
  "getSensorEvents": { "limit": 1e3 },
138
+ "listRecentSummaries": { "limit": 100 },
138
139
  "listRecentTracks": { "limit": 200 },
139
140
  "listSummaries": { "limit": 50 },
140
141
  "reclaimDebugMedia": { "mode": "report" },
@@ -82,7 +82,7 @@ export { NetworkAccessStatusSchema, NetworkEndpointSchema, networkAccessCapabili
82
82
  export { type Attachment, type AttachmentMediaType, AttachmentMediaTypeSchema, AttachmentSchema, type DiscoveredTarget, DiscoveredTargetSchema, type INotificationOutputProvider, type NotificationAction, type NotificationActionIcon, NotificationActionIconSchema, NotificationActionSchema, type NotificationFormat, NotificationFormatSchema, NotificationSchema, notificationOutputCapability, type RenderedAs, RenderedAsSchema, type SendResult, SendResultSchema, type Target, type TargetKind, type TargetKindCaps, TargetKindCapsSchema, type TargetKindLevel, TargetKindLevelSchema, TargetKindSchema, TargetSchema, type TestResult, TestResultSchema, } from './notification-output.cap.js';
83
83
  export { type INotificationRulesProvider, NC_ALARM_SYSTEM_EVENT_KINDS, NC_AUDIO_DBFS_FLOOR, NC_AUTHORABLE_SYSTEM_EVENT_KINDS, NC_CONDITION_CATALOG, NC_CONFIRM_DEFAULT_MAX_IMAGE_PX, NC_CONFIRM_DEFAULT_TIMEOUT_MS, NC_CONFIRM_MAX_TIMEOUT_MS, NC_CONFIRM_MIN_TIMEOUT_MS, NC_DEFAULT_SNOOZE_MINUTES, NC_HISTORY_LIMIT_DEFAULT, NC_HISTORY_LIMIT_MAX, NC_MAX_PER_TRACK_IMMEDIATE, NC_SNOOZE_MAX_MINUTES, type NcAlarmConfig, NcAlarmConfigSchema, type NcAlarmModeCoverage, NcAlarmModeCoverageSchema, type NcAlarmSettings, type NcAlarmSettingsPatch, NcAlarmSettingsPatchSchema, NcAlarmSettingsSchema, type NcAlarmSkippedDevice, NcAlarmSkippedDeviceSchema, type NcAlarmSkipReason, NcAlarmSkipReasonSchema, type NcAudioCondition, NcAudioConditionSchema, type NcConditionDescriptor, NcConditionDescriptorSchema, type NcConditions, NcConditionsSchema, type NcConfirm, type NcConfirmExpect, NcConfirmExpectSchema, NcConfirmSchema, type NcCrossing, NcCrossingSchema, type NcDelivery, NcDeliverySchema, type NcDeviceStateCondition, NcDeviceStateConditionSchema, type NcHistoryEntry, NcHistoryEntrySchema, type NcHistoryFilter, NcHistoryFilterSchema, type NcHistoryRecordKind, NcHistoryRecordKindSchema, type NcHistoryStatus, NcHistoryStatusSchema, type NcHistorySubject, NcHistorySubjectSchema, type NcMediaFrame, NcMediaFrameSchema, type NcMediaPolicy, NcMediaPolicySchema, type NcOccupancyCondition, NcOccupancyConditionSchema, type NcPlateMatcher, NcPlateMatcherSchema, type NcRule, type NcRuleAction, NcRuleActionSchema, type NcRuleActionSequence, NcRuleActionSequenceSchema, type NcRuleActions, NcRuleActionsSchema, type NcRuleInput, NcRuleInputSchema, type NcRuleNotificationButton, NcRuleNotificationButtonSchema, type NcRulePatch, NcRulePatchSchema, NcRuleSchema, type NcRuleTarget, NcRuleTargetSchema, type NcSceneCondition, NcSceneConditionSchema, type NcSchedule, NcScheduleSchema, type NcScheduleWindow, NcScheduleWindowSchema, type NcSnooze, type NcSnoozeInput, NcSnoozeInputSchema, NcSnoozeSchema, type NcSnoozeScope, NcSnoozeScopeSchema, type NcSnoozeSuppressed, NcSnoozeSuppressedSchema, type NcSystemEventCondition, NcSystemEventConditionSchema, type NcSystemEventKind, NcSystemEventKindSchema, type NcTestResult, NcTestResultSchema, type NcThrottle, type NcThrottleGranularity, NcThrottleGranularitySchema, NcThrottleSchema, type NcZoneCondition, NcZoneConditionSchema, notificationRulesCapability, } from './notification-rules.cap.js';
84
84
  export { type IOauthIntegrationProvider, type OauthIntegrationDescriptor, OauthIntegrationDescriptorSchema, oauthIntegrationCapability, } from './oauth-integration.cap.js';
85
- export { type AudioEvent, type AudioEventDraft, AudioEventSchema, type DetectionSource, DetectionSourceSchema, EVENT_DENSITY_BATCH_MAX, type EventDensityBucket, EventDensityBucketSchema, type EventDensityForDevice, EventDensityForDeviceSchema, type EventKind, type EventKindCategory, EventKindCategorySchema, type EventKindDescriptor, EventKindDescriptorSchema, type EventKindIcon, EventKindIconSchema, EventKindSchema, type EventKindsForDevice, EventKindsForDeviceSchema, type EventMediaKindBreakdown, type EventMediaKindFootprint, type EventPruneCounts, type EventStoreDeviceFootprint, type EventStoreFootprint, type IPipelineAnalyticsProvider, type KeyEvent, KeyEventSchema, type KeyEventsForDevice, type LabelAttribution, LabelAttributionSchema, type LabelTier, LabelTierSchema, MAX_TRACK_DEBUG_NOTE_LEN, type MediaFile, type MediaFileBytes, type MediaFileInfo, MediaFileInfoSchema, type MediaFileKind, MediaFileKindEnum, type MediaFileRef, MediaFileRefSchema, MediaFileSchema, type MotionEvent, type MotionEventDraft, MotionEventSchema, type ObjectEvent, type ObjectEventDraft, ObjectEventSchema, pipelineAnalyticsCapability, type RecentTracksPage, RecentTracksPageSchema, type RecentTracksQuery, RecentTracksQueryInput, type RetrainAnnotation, type RetrainAnnotationDraft, RetrainAnnotationDraftSchema, RetrainAnnotationKindSchema, RetrainAnnotationSchema, RetrainAnnotationSourceSchema, type RetrainAssistResult, RetrainAssistResultSchema, RetrainAssistSubjectSchema, RetrainCopyRefusalSchema, type RetrainFrame, type RetrainFrameCandidate, RetrainFrameCandidateSchema, type RetrainFrameList, RetrainFrameListSchema, RetrainFrameSchema, type RetrainFrameSelection, RetrainFrameSelectionSchema, type RetrainMacroClass, RetrainMacroClassSchema, type RetrainStatus, RetrainStatusSchema, type RetrainTrack, RetrainTrackSchema, type RetrainTransitionResult, RetrainTransitionResultSchema, type ScoredObjectEvent, ScoredObjectEventSchema, type SensorEvent, SensorEventSchema, SUMMARIES_DEFAULT_LIMIT, SUMMARIES_MAX_LIMIT, type SummariesPage, type Summary, type SummaryDetail, SummarySchema, type Track, type TrackCascadeCounts, TrackCascadeCountsSchema, type TrackEnvelope, TrackEnvelopeSchema, TrackedDetectionSchema, type TrackFlags, type TrackFlagsPatch, TrackFlagsPatchSchema, TrackFlagsSchema, type TrackProjection, TrackProjectionSchema, TrackSchema, type TrackSource, TrackSourceSchema, type TrackState, TrackStateSchema, type TrackZoneFilter, TrackZoneFilterSchema, type TrainingExportDeviceTotals, TrainingExportDeviceTotalsSchema, type TrainingExportSummary, TrainingExportSummarySchema, type ZoneCrossing, type ZoneCrossingDirection, ZoneCrossingDirectionSchema, ZoneCrossingSchema, } from './pipeline-analytics.cap.js';
85
+ export { type AudioEvent, type AudioEventDraft, AudioEventSchema, type DetectionSource, DetectionSourceSchema, EVENT_DENSITY_BATCH_MAX, type EventDensityBucket, EventDensityBucketSchema, type EventDensityForDevice, EventDensityForDeviceSchema, type EventKind, type EventKindCategory, EventKindCategorySchema, type EventKindDescriptor, EventKindDescriptorSchema, type EventKindIcon, EventKindIconSchema, EventKindSchema, type EventKindsForDevice, EventKindsForDeviceSchema, type EventMediaKindBreakdown, type EventMediaKindFootprint, type EventPruneCounts, type EventStoreDeviceFootprint, type EventStoreFootprint, type IPipelineAnalyticsProvider, type KeyEvent, KeyEventSchema, type KeyEventsForDevice, type LabelAttribution, LabelAttributionSchema, type LabelTier, LabelTierSchema, MAX_TRACK_DEBUG_NOTE_LEN, type MediaFile, type MediaFileBytes, type MediaFileInfo, MediaFileInfoSchema, type MediaFileKind, MediaFileKindEnum, type MediaFileRef, MediaFileRefSchema, MediaFileSchema, type MotionEvent, type MotionEventDraft, MotionEventSchema, type ObjectEvent, type ObjectEventDraft, ObjectEventSchema, pipelineAnalyticsCapability, type RecentTracksPage, RecentTracksPageSchema, type RecentTracksQuery, RecentTracksQueryInput, type RetrainAnnotation, type RetrainAnnotationDraft, RetrainAnnotationDraftSchema, RetrainAnnotationKindSchema, RetrainAnnotationSchema, RetrainAnnotationSourceSchema, type RetrainAssistResult, RetrainAssistResultSchema, RetrainAssistSubjectSchema, RetrainCopyRefusalSchema, type RetrainFrame, type RetrainFrameCandidate, RetrainFrameCandidateSchema, type RetrainFrameList, RetrainFrameListSchema, RetrainFrameSchema, type RetrainFrameSelection, RetrainFrameSelectionSchema, type RetrainMacroClass, RetrainMacroClassSchema, type RetrainStatus, RetrainStatusSchema, type RetrainTrack, RetrainTrackSchema, type RetrainTransitionResult, RetrainTransitionResultSchema, type ScoredObjectEvent, ScoredObjectEventSchema, type SensorEvent, SensorEventSchema, SUMMARIES_DEFAULT_LIMIT, SUMMARIES_MAX_LIMIT, type SummariesPage, type Summary, type SummaryDetail, type SummaryListItem, SummarySchema, type Track, type TrackCascadeCounts, TrackCascadeCountsSchema, type TrackEnvelope, TrackEnvelopeSchema, TrackedDetectionSchema, type TrackFlags, type TrackFlagsPatch, TrackFlagsPatchSchema, TrackFlagsSchema, type TrackProjection, TrackProjectionSchema, TrackSchema, type TrackSource, TrackSourceSchema, type TrackState, TrackStateSchema, type TrackZoneFilter, TrackZoneFilterSchema, type TrainingExportDeviceTotals, TrainingExportDeviceTotalsSchema, type TrainingExportSummary, TrainingExportSummarySchema, type ZoneCrossing, type ZoneCrossingDirection, ZoneCrossingDirectionSchema, ZoneCrossingSchema, } from './pipeline-analytics.cap.js';
86
86
  export type { NativeCropRef, PipelineStepInputOutput, PipelineValidationIssue, PipelineValidationResult, } from './pipeline-executor.cap.js';
87
87
  export { ModelSubstitutionSchema, NativeCropRefSchema, PipelineDefaultStepSchema, PipelineEngineChoiceSchema, PipelineRunResultBridge, PipelineStepInputSchema, PipelineValidationIssueSchema, PipelineValidationResultSchema, pipelineExecutorCapability, } from './pipeline-executor.cap.js';
88
88
  export type { CameraAssignmentStatus, CameraAudioStatus, CameraBrokerProfile, CameraBrokerStatus, CameraDecoderShm, CameraDecoderStatus, CameraDetectionPhase, CameraDetectionProvisioning, CameraDetectionProvisioningState, CameraDetectionStatus, CameraMotionStatus, CameraRecordingMode, CameraRecordingStatus, CameraSourceStatus, CameraSourceStream, CameraStatus, CameraStatusDegradation, CameraStatusDegradationReason, CameraStatusStage, DiskReconcileJob, InferenceDeviceExclusionReason, IngestOwner, NodeInferenceDevice, NodeInferenceDevices, } from './pipeline-orchestrator.cap.js';
@@ -92,7 +92,7 @@ export { FrameLazyCountersSchema, FrameLazyMetricsSchema, MotionSourceEnum, Moti
92
92
  export { AudioChunkInputSchema, AudioClassificationLabelSchema, AudioLevelSchema, BoundingBoxSchema, FrameInputSchema, SpatialDetectionSchema, } from './schemas/detection-shared.js';
93
93
  export { CameraMetricsSchema, CameraMetricsWithDeviceIdSchema, OrchestratorMetricsSchema, } from './schemas/orchestrator-metrics.js';
94
94
  export type { CameraStream, CamProfile, CamStreamKind, DecodedAudioChunkWire, FrameHandleFormat, ProfileRtspEntry, ProfileSlot, ProfileSlotStatus, SubscribeAudioChunksInput, SubscribeAudioChunksResult, SubscribeFramesInput, SubscribeFramesResult, } from './schemas/streaming-shared.js';
95
- export { BrokerStatsSchema, BrokerStatusSchema, CAM_PROFILE_ORDER, CameraStreamSchema, CamProfileSchema, CamStreamKindSchema, CamStreamResolutionSchema, AudioChunkFormatSchema, DecodedAudioChunkSchema, DecodedFrameSchema, EncodedPacketSchema, FrameHandleFormatSchema, FrameHandleSchema, makeProfileBrokerId, makeSourceBrokerId, ProfileRtspEntrySchema, ProfileSlotSchema, ProfileSlotStatusSchema, parseProfileBrokerId, StreamSourceEntrySchema, StreamSourceSchema, SubscribeAudioChunksInputSchema, SubscribeAudioChunksResultSchema, SubscribeFramesInputSchema, SubscribeFramesResultSchema, selectAssignedProfileSlots, } from './schemas/streaming-shared.js';
95
+ export { AudioChunkFormatSchema, BrokerStatsSchema, BrokerStatusSchema, CAM_PROFILE_ORDER, CameraStreamSchema, CamProfileSchema, CamStreamKindSchema, CamStreamResolutionSchema, DecodedAudioChunkSchema, DecodedFrameSchema, EncodedPacketSchema, FrameHandleFormatSchema, FrameHandleSchema, makeProfileBrokerId, makeSourceBrokerId, ProfileRtspEntrySchema, ProfileSlotSchema, ProfileSlotStatusSchema, parseProfileBrokerId, StreamSourceEntrySchema, StreamSourceSchema, SubscribeAudioChunksInputSchema, SubscribeAudioChunksResultSchema, SubscribeFramesInputSchema, SubscribeFramesResultSchema, selectAssignedProfileSlots, } from './schemas/streaming-shared.js';
96
96
  export { buildEventKindDescriptor, EVENT_KIND_BY_CAP, EVENTFUL_CAP_NAMES, type SensorEventKindDescriptor, } from './sensor-event-kinds.js';
97
97
  export { type ImageContract, ImageContractSchema, type ImageContractState, ImageContractStateSchema, type IServerManagementProvider, type ServerBootMode, ServerBootModeSchema, type ServerPackageStatus, ServerPackageStatusSchema, type ServerRollbackInfo, ServerRollbackInfoSchema, type ServerUpdateActionResult, ServerUpdateActionResultSchema, type ServerUpdateCheckResult, ServerUpdateCheckResultSchema, type ServerUpdateState, ServerUpdateStateSchema, serverManagementCapability, type WrapperEvidence, WrapperEvidenceSchema, type WrapperIdentity, WrapperIdentitySchema, type WrapperKind, WrapperKindSchema, } from './server-management.cap.js';
98
98
  export { type BulkRecord, BulkRecordSchema, type CollectionColumn, CollectionColumnSchema, type CollectionIndex, CollectionIndexSchema, type ISettingsStoreProvider, type MutationFilter, MutationFilterSchema, QueryFilterSchema, SettingsRecordSchema, type SettingsStoreClient, settingsStoreCapability, } from './settings-store.cap.js';
@@ -1231,8 +1231,30 @@ export declare const SummarySchema: z.ZodObject<{
1231
1231
  export type Summary = z.infer<typeof SummarySchema>;
1232
1232
  export declare const SUMMARIES_MAX_LIMIT = 200;
1233
1233
  export declare const SUMMARIES_DEFAULT_LIMIT = 50;
1234
- declare const SummariesPageSchema: z.ZodObject<{
1235
- summaries: z.ZodReadonly<z.ZodArray<z.ZodObject<{
1234
+ /**
1235
+ * One member of a group, as a reader needs it.
1236
+ *
1237
+ * The class and the role travel WITH the id because every consumer that shows
1238
+ * a group has to say what it was made of — "two people and a dog" — and asking
1239
+ * `getTrack` per member to find that out turns one card into `memberCount`
1240
+ * round trips. The member row already holds both (they are written at the
1241
+ * join), so this costs the reader nothing.
1242
+ */
1243
+ declare const SummaryMemberSchema: z.ZodObject<{
1244
+ trackId: z.ZodString;
1245
+ className: z.ZodNullable<z.ZodString>;
1246
+ role: z.ZodNullable<z.ZodEnum<{
1247
+ primary: "primary";
1248
+ sibling: "sibling";
1249
+ child: "child";
1250
+ }>>;
1251
+ joinedAt: z.ZodNumber;
1252
+ label: z.ZodOptional<z.ZodString>;
1253
+ subLabel: z.ZodOptional<z.ZodString>;
1254
+ }, z.core.$strip>;
1255
+ export type SummaryMemberOut = z.infer<typeof SummaryMemberSchema>;
1256
+ declare const SummaryDetailSchema: z.ZodObject<{
1257
+ summary: z.ZodObject<{
1236
1258
  id: z.ZodString;
1237
1259
  deviceId: z.ZodNumber;
1238
1260
  openedAt: z.ZodNumber;
@@ -1240,10 +1262,31 @@ declare const SummariesPageSchema: z.ZodObject<{
1240
1262
  sealedAt: z.ZodNullable<z.ZodNumber>;
1241
1263
  memberCount: z.ZodNumber;
1242
1264
  groupShotMediaId: z.ZodNullable<z.ZodNumber>;
1265
+ }, z.core.$strip>;
1266
+ members: z.ZodReadonly<z.ZodArray<z.ZodObject<{
1267
+ trackId: z.ZodString;
1268
+ className: z.ZodNullable<z.ZodString>;
1269
+ role: z.ZodNullable<z.ZodEnum<{
1270
+ primary: "primary";
1271
+ sibling: "sibling";
1272
+ child: "child";
1273
+ }>>;
1274
+ joinedAt: z.ZodNumber;
1275
+ label: z.ZodOptional<z.ZodString>;
1276
+ subLabel: z.ZodOptional<z.ZodString>;
1243
1277
  }, z.core.$strip>>>;
1244
1278
  }, z.core.$strip>;
1245
- export type SummariesPage = z.infer<typeof SummariesPageSchema>;
1246
- declare const SummaryDetailSchema: z.ZodObject<{
1279
+ /**
1280
+ * What a LIST of groups carries: the envelope plus what it is MADE OF.
1281
+ *
1282
+ * Coarse on purpose — the operator's rule is "only the rough data on the list,
1283
+ * we extend when we notice we need more". Enough to draw the card ("two people
1284
+ * and a dog") and no more. The MEMBERS, their names and the per-member links
1285
+ * are on {@link getSummary}: shipping every member of every group so a client
1286
+ * can count them turns a page of two hundred groups into a thousand records to
1287
+ * draw two hundred badges.
1288
+ */
1289
+ declare const SummaryListItemSchema: z.ZodObject<{
1247
1290
  summary: z.ZodObject<{
1248
1291
  id: z.ZodString;
1249
1292
  deviceId: z.ZodNumber;
@@ -1253,8 +1296,30 @@ declare const SummaryDetailSchema: z.ZodObject<{
1253
1296
  memberCount: z.ZodNumber;
1254
1297
  groupShotMediaId: z.ZodNullable<z.ZodNumber>;
1255
1298
  }, z.core.$strip>;
1256
- trackIds: z.ZodReadonly<z.ZodArray<z.ZodString>>;
1299
+ classes: z.ZodReadonly<z.ZodArray<z.ZodObject<{
1300
+ className: z.ZodNullable<z.ZodString>;
1301
+ count: z.ZodNumber;
1302
+ }, z.core.$strip>>>;
1257
1303
  }, z.core.$strip>;
1304
+ export type SummaryListItem = z.infer<typeof SummaryListItemSchema>;
1305
+ declare const SummariesPageSchema: z.ZodObject<{
1306
+ summaries: z.ZodReadonly<z.ZodArray<z.ZodObject<{
1307
+ summary: z.ZodObject<{
1308
+ id: z.ZodString;
1309
+ deviceId: z.ZodNumber;
1310
+ openedAt: z.ZodNumber;
1311
+ lastActiveAt: z.ZodNumber;
1312
+ sealedAt: z.ZodNullable<z.ZodNumber>;
1313
+ memberCount: z.ZodNumber;
1314
+ groupShotMediaId: z.ZodNullable<z.ZodNumber>;
1315
+ }, z.core.$strip>;
1316
+ classes: z.ZodReadonly<z.ZodArray<z.ZodObject<{
1317
+ className: z.ZodNullable<z.ZodString>;
1318
+ count: z.ZodNumber;
1319
+ }, z.core.$strip>>>;
1320
+ }, z.core.$strip>>>;
1321
+ }, z.core.$strip>;
1322
+ export type SummariesPage = z.infer<typeof SummariesPageSchema>;
1258
1323
  export type SummaryDetail = z.infer<typeof SummaryDetailSchema>;
1259
1324
  declare const RecentTracksPageSchema: z.ZodObject<{
1260
1325
  tracks: z.ZodReadonly<z.ZodArray<z.ZodObject<{
@@ -2236,16 +2301,52 @@ export declare const pipelineAnalyticsCapability: {
2236
2301
  since: z.ZodOptional<z.ZodNumber>;
2237
2302
  until: z.ZodOptional<z.ZodNumber>;
2238
2303
  limit: z.ZodDefault<z.ZodNumber>;
2304
+ classes: z.ZodOptional<z.ZodArray<z.ZodString>>;
2305
+ }, z.core.$strip>, z.ZodObject<{
2306
+ summaries: z.ZodReadonly<z.ZodArray<z.ZodObject<{
2307
+ summary: z.ZodObject<{
2308
+ id: z.ZodString;
2309
+ deviceId: z.ZodNumber;
2310
+ openedAt: z.ZodNumber;
2311
+ lastActiveAt: z.ZodNumber;
2312
+ sealedAt: z.ZodNullable<z.ZodNumber>;
2313
+ memberCount: z.ZodNumber;
2314
+ groupShotMediaId: z.ZodNullable<z.ZodNumber>;
2315
+ }, z.core.$strip>;
2316
+ classes: z.ZodReadonly<z.ZodArray<z.ZodObject<{
2317
+ className: z.ZodNullable<z.ZodString>;
2318
+ count: z.ZodNumber;
2319
+ }, z.core.$strip>>>;
2320
+ }, z.core.$strip>>>;
2321
+ }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
2322
+ /**
2323
+ * The PAGED feed — the reel and the Events gallery. Same cursor contract as
2324
+ * {@link listRecentTracks}, so one screen cannot hold two ideas of newest.
2325
+ */
2326
+ readonly listRecentSummaries: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
2327
+ deviceIds: z.ZodArray<z.ZodNumber>;
2328
+ since: z.ZodOptional<z.ZodNumber>;
2329
+ until: z.ZodOptional<z.ZodNumber>;
2330
+ limit: z.ZodDefault<z.ZodNumber>;
2331
+ cursor: z.ZodOptional<z.ZodString>;
2332
+ classes: z.ZodOptional<z.ZodArray<z.ZodString>>;
2239
2333
  }, z.core.$strip>, z.ZodObject<{
2240
2334
  summaries: z.ZodReadonly<z.ZodArray<z.ZodObject<{
2241
- id: z.ZodString;
2242
- deviceId: z.ZodNumber;
2243
- openedAt: z.ZodNumber;
2244
- lastActiveAt: z.ZodNumber;
2245
- sealedAt: z.ZodNullable<z.ZodNumber>;
2246
- memberCount: z.ZodNumber;
2247
- groupShotMediaId: z.ZodNullable<z.ZodNumber>;
2335
+ summary: z.ZodObject<{
2336
+ id: z.ZodString;
2337
+ deviceId: z.ZodNumber;
2338
+ openedAt: z.ZodNumber;
2339
+ lastActiveAt: z.ZodNumber;
2340
+ sealedAt: z.ZodNullable<z.ZodNumber>;
2341
+ memberCount: z.ZodNumber;
2342
+ groupShotMediaId: z.ZodNullable<z.ZodNumber>;
2343
+ }, z.core.$strip>;
2344
+ classes: z.ZodReadonly<z.ZodArray<z.ZodObject<{
2345
+ className: z.ZodNullable<z.ZodString>;
2346
+ count: z.ZodNumber;
2347
+ }, z.core.$strip>>>;
2248
2348
  }, z.core.$strip>>>;
2349
+ nextCursor: z.ZodNullable<z.ZodString>;
2249
2350
  }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
2250
2351
  /** One summary with its member track ids; `null` for an id nobody wrote. */
2251
2352
  readonly getSummary: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
@@ -2260,7 +2361,18 @@ export declare const pipelineAnalyticsCapability: {
2260
2361
  memberCount: z.ZodNumber;
2261
2362
  groupShotMediaId: z.ZodNullable<z.ZodNumber>;
2262
2363
  }, z.core.$strip>;
2263
- trackIds: z.ZodReadonly<z.ZodArray<z.ZodString>>;
2364
+ members: z.ZodReadonly<z.ZodArray<z.ZodObject<{
2365
+ trackId: z.ZodString;
2366
+ className: z.ZodNullable<z.ZodString>;
2367
+ role: z.ZodNullable<z.ZodEnum<{
2368
+ primary: "primary";
2369
+ sibling: "sibling";
2370
+ child: "child";
2371
+ }>>;
2372
+ joinedAt: z.ZodNumber;
2373
+ label: z.ZodOptional<z.ZodString>;
2374
+ subLabel: z.ZodOptional<z.ZodString>;
2375
+ }, z.core.$strip>>>;
2264
2376
  }, z.core.$strip>>, import("./capability-definition.js").CapabilityMethodKind>;
2265
2377
  readonly clearTracks: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
2266
2378
  deviceId: z.ZodNumber;
@@ -5096,6 +5096,13 @@ export type AppRouter = TrpcCoreRouter<{
5096
5096
  output: z.infer<typeof pipelineAnalyticsCapability.methods.listSummaries.output>;
5097
5097
  meta: object;
5098
5098
  }>;
5099
+ listRecentSummaries: TRPCQueryProcedure<{
5100
+ input: {
5101
+ [x: string]: unknown;
5102
+ } & z.input<typeof pipelineAnalyticsCapability.methods.listRecentSummaries.input>;
5103
+ output: z.infer<typeof pipelineAnalyticsCapability.methods.listRecentSummaries.output>;
5104
+ meta: object;
5105
+ }>;
5099
5106
  getSummary: TRPCQueryProcedure<{
5100
5107
  input: {
5101
5108
  [x: string]: unknown;
@@ -11,7 +11,7 @@
11
11
  * Plain data, zero Zod: a forked runner must not import the schema barrel
12
12
  * (~144MB RSS per runner — D28).
13
13
  *
14
- * Coverage: 24 caps, 57 methods with defaults.
14
+ * Coverage: 24 caps, 58 methods with defaults.
15
15
  */
16
16
  export declare const CAP_INPUT_DEFAULTS: Readonly<Record<string, Readonly<Record<string, Readonly<Record<string, unknown>>>>>>;
17
17
  /**
@@ -6,7 +6,7 @@
6
6
  * scope+access check inside `protectedProcedure` (see
7
7
  * `server/backend/src/api/trpc/trpc.middleware.ts`).
8
8
  *
9
- * Coverage: 1031 method paths across 129 capabilities.
9
+ * Coverage: 1032 method paths across 129 capabilities.
10
10
  */
11
11
  import type { CapabilityMethodAccess } from '../capabilities/capability-definition.js';
12
12
  export interface MethodAccessRecord {
@@ -6,7 +6,7 @@
6
6
  * system-scope cap that takes a deviceId was previously never device-filtered
7
7
  * — see the generator header).
8
8
  *
9
- * Coverage: 374 methods carry a device reference, of which
9
+ * Coverage: 375 methods carry a device reference, of which
10
10
  * 139 are on SYSTEM-scope caps.
11
11
  *
12
12
  * Top-level fields, number arrays, and one-level arrays of objects carrying
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_sleep = require("./sleep-CfDqEZrs.js");
2
+ const require_sleep = require("./sleep-DXsYD0RX.js");
3
3
  const require_event_category = require("./event-category-yW4s1MGD.js");
4
4
  const require_canonical_hash = require("./canonical-hash-DNV8S5ET.js");
5
5
  const require_enums = require("./enums.js");
@@ -20249,13 +20249,119 @@ var SummariesQueryInput = zod.z.object({
20249
20249
  deviceIds: zod.z.array(zod.z.number()).min(1),
20250
20250
  since: zod.z.number().optional(),
20251
20251
  until: zod.z.number().optional(),
20252
- limit: zod.z.number().int().min(1).max(200).default(50)
20252
+ limit: zod.z.number().int().min(1).max(200).default(50),
20253
+ /** The same member-wise filter {@link listRecentSummaries} takes — one
20254
+ * meaning of "dog" on every summary surface. */
20255
+ classes: zod.z.array(zod.z.string().min(1).max(60)).max(40).optional()
20256
+ });
20257
+ /**
20258
+ * One member of a group, as a reader needs it.
20259
+ *
20260
+ * The class and the role travel WITH the id because every consumer that shows
20261
+ * a group has to say what it was made of — "two people and a dog" — and asking
20262
+ * `getTrack` per member to find that out turns one card into `memberCount`
20263
+ * round trips. The member row already holds both (they are written at the
20264
+ * join), so this costs the reader nothing.
20265
+ */
20266
+ var SummaryMemberSchema = zod.z.object({
20267
+ trackId: zod.z.string(),
20268
+ /**
20269
+ * The track's class at the time it JOINED, or `null` when it was unresolved
20270
+ * and the track no longer exists to fill it.
20271
+ *
20272
+ * The join, not the latest opinion: class voting can re-decide a track's
20273
+ * class afterwards, and a group's composition is the history of who came
20274
+ * together. A consumer counts these to badge a thumbnail — "two people and a
20275
+ * dog" — rather than being handed a second, denormalised tally that would
20276
+ * drift from the members it claims to describe.
20277
+ */
20278
+ className: zod.z.string().nullable(),
20279
+ /** `primary` is the one member that carries the group's identity. */
20280
+ role: zod.z.enum([
20281
+ "primary",
20282
+ "sibling",
20283
+ "child"
20284
+ ]).nullable(),
20285
+ joinedAt: zod.z.number(),
20286
+ /** Tier 1 — the sub-class (`dog`, `van`), resolved from the member's track
20287
+ * at read time. Absent when nothing resolved, never an empty string. */
20288
+ label: zod.z.string().optional(),
20289
+ /** Tier 2 — the instance: a person's name, a plate. Absent when the pipeline
20290
+ * recognised nobody, and absent for a member whose track has been pruned —
20291
+ * a thumbnail that names the wrong person is worse than one naming nobody. */
20292
+ subLabel: zod.z.string().optional()
20253
20293
  });
20254
- var SummariesPageSchema = zod.z.object({ summaries: zod.z.array(SummarySchema).readonly() });
20255
20294
  var SummaryDetailSchema = zod.z.object({
20256
20295
  summary: SummarySchema,
20257
- /** Member track ids, in absorption order. */
20258
- trackIds: zod.z.array(zod.z.string()).readonly()
20296
+ /** Members in absorption order, oldest join first. */
20297
+ members: zod.z.array(SummaryMemberSchema).readonly()
20298
+ });
20299
+ /**
20300
+ * What a LIST of groups carries: the envelope plus what it is MADE OF.
20301
+ *
20302
+ * Coarse on purpose — the operator's rule is "only the rough data on the list,
20303
+ * we extend when we notice we need more". Enough to draw the card ("two people
20304
+ * and a dog") and no more. The MEMBERS, their names and the per-member links
20305
+ * are on {@link getSummary}: shipping every member of every group so a client
20306
+ * can count them turns a page of two hundred groups into a thousand records to
20307
+ * draw two hundred badges.
20308
+ */
20309
+ var SummaryListItemSchema = zod.z.object({
20310
+ summary: SummarySchema,
20311
+ /** Class counts, most numerous first; `className: null` is a member whose
20312
+ * class never resolved, counted so the counts add up to `memberCount`. */
20313
+ classes: zod.z.array(zod.z.object({
20314
+ className: zod.z.string().nullable(),
20315
+ count: zod.z.number().int().positive()
20316
+ })).readonly()
20317
+ });
20318
+ var SummariesPageSchema = zod.z.object({ summaries: zod.z.array(SummaryListItemSchema).readonly() });
20319
+ /**
20320
+ * The paged feed, deliberately the SAME shape as {@link RecentTracksQueryInput}.
20321
+ *
20322
+ * The reel on the cameras page and the Events gallery both ride a cursor, so a
20323
+ * summaries feed that could only answer "the last N for these cameras"
20324
+ * (`listSummaries`) would make groups available in the timeline and nowhere
20325
+ * else. Two feeds with different ordering contracts would be two ideas of what
20326
+ * "newest" means, on one screen.
20327
+ */
20328
+ var RecentSummariesQueryInput = zod.z.object({
20329
+ /** Devices to merge. An empty array yields an empty page. */
20330
+ deviceIds: zod.z.array(zod.z.number()),
20331
+ /** Window lower bound on `lastActiveAt` (inclusive). */
20332
+ since: zod.z.number().optional(),
20333
+ /** Window upper bound on `lastActiveAt` (inclusive). */
20334
+ until: zod.z.number().optional(),
20335
+ limit: zod.z.number().int().min(1).max(500).default(100),
20336
+ /** Opaque continuation cursor from a previous page's `nextCursor`. */
20337
+ cursor: zod.z.string().optional(),
20338
+ /**
20339
+ * Restrict to these classes — THE SAME FIELD `listRecentTracks` takes, and
20340
+ * deliberately the same name: the events filter tree emits one list of ticked
20341
+ * taxonomy nodes, and a summaries feed that called it something else would
20342
+ * make the operator's one filter component produce two shapes.
20343
+ *
20344
+ * A question about the MEMBERS: a group matches when ANY of them does. "Show
20345
+ * me the arrivals with a dog" has to return the group of four people who had
20346
+ * one with them; a filter on the group's own fields could only ever answer
20347
+ * about its primary.
20348
+ *
20349
+ * Matched against all THREE tiers of a member — the class (`animal`), the
20350
+ * sub-class (`dog`) and the instance (a name, a plate) — because which tier a
20351
+ * ticked node lives on is the taxonomy's business, not the caller's. `dog` is
20352
+ * an event kind in the tree and a tier-1 label on an `animal` track; a filter
20353
+ * that read only the class would answer "animal" and never "dog".
20354
+ *
20355
+ * ABSENT or EMPTY means no filter — absent is not a selection of none.
20356
+ */
20357
+ classes: zod.z.array(zod.z.string().min(1).max(60)).max(40).optional()
20358
+ });
20359
+ var RecentSummariesPageSchema = zod.z.object({
20360
+ /** Ordered by (`lastActiveAt` DESC, id DESC). Same light item as
20361
+ * {@link listSummaries} — one list shape, so a card renders the same
20362
+ * whichever feed drew it. */
20363
+ summaries: zod.z.array(SummaryListItemSchema).readonly(),
20364
+ nextCursor: zod.z.string().nullable()
20259
20365
  });
20260
20366
  var RecentTracksPageSchema = zod.z.object({
20261
20367
  /** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
@@ -20713,6 +20819,11 @@ var pipelineAnalyticsCapability = {
20713
20819
  listRecentTracks: require_sleep.method(RecentTracksQueryInput, RecentTracksPageSchema),
20714
20820
  /** Newest first by `openedAt`, for a camera set, inside an optional window. */
20715
20821
  listSummaries: require_sleep.method(SummariesQueryInput, SummariesPageSchema),
20822
+ /**
20823
+ * The PAGED feed — the reel and the Events gallery. Same cursor contract as
20824
+ * {@link listRecentTracks}, so one screen cannot hold two ideas of newest.
20825
+ */
20826
+ listRecentSummaries: require_sleep.method(RecentSummariesQueryInput, RecentSummariesPageSchema),
20716
20827
  /** One summary with its member track ids; `null` for an id nobody wrote. */
20717
20828
  getSummary: require_sleep.method(zod.z.object({ id: zod.z.string() }), SummaryDetailSchema.nullable()),
20718
20829
  clearTracks: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), zod.z.void(), {
@@ -45935,6 +46046,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
45935
46046
  addonId: null,
45936
46047
  access: "view"
45937
46048
  },
46049
+ "pipelineAnalytics.listRecentSummaries": {
46050
+ capName: "pipeline-analytics",
46051
+ capScope: "device",
46052
+ addonId: null,
46053
+ access: "view"
46054
+ },
45938
46055
  "pipelineAnalytics.listRecentTracks": {
45939
46056
  capName: "pipeline-analytics",
45940
46057
  capScope: "device",
@@ -50031,6 +50148,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
50031
50148
  form: "single",
50032
50149
  optional: true
50033
50150
  }],
50151
+ "pipelineAnalytics.listRecentSummaries": [{
50152
+ name: "deviceIds",
50153
+ form: "array",
50154
+ optional: false
50155
+ }],
50034
50156
  "pipelineAnalytics.listRecentTracks": [{
50035
50157
  name: "deviceIds",
50036
50158
  form: "array",
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as CameraStreamSchema, A as DEVICE_STATUS_METHOD, At as collectHydratedFieldValues, B as toNodeId, C as ChargingStatus, Ct as createDurableState, D as adminUiCapability, Dt as WELL_KNOWN_TABS, E as DeviceType, Et as isEvent, F as resolveCapMount, Ft as expandAudioChunkToF32le, G as scopeKey, H as ReadinessTimeoutError, I as systemMethod, It as isAudioChunkFormat, J as BrokerStatusSchema, K as AudioChunkFormatSchema, L as CAP_NODE_PIN_CONTEXT_KEY, M as expandCapMethods, Mt as resolveHydratedFieldValue, N as isDeviceConfigCap, Nt as AUDIO_CHUNK_FORMATS, O as DEFAULT_RUNTIME_STATE_DURABILITY, Ot as WELL_KNOWN_TAB_MAP, P as method, Pt as audioChunkBytesPerSample, Q as CamStreamResolutionSchema, R as nodePin, S as DEVICE_CHILDREN_BATCH_MAX, St as normalizeAddonInitResult, T as DeviceRole, Tt as emitReadiness, U as emitDownForOwnedCaps, V as ReadinessRegistry, W as readinessKey, X as CamProfileSchema, Y as CAM_PROFILE_ORDER, Z as CamStreamKindSchema, _ as createMirrorSource, _t as selectAssignedProfileSlots, a as asJsonObject, at as ProfileRtspEntrySchema, b as deviceOpsCapability, bt as DisposerChain, c as parseJsonArray, ct as StreamSourceEntrySchema, d as BOOT_RECOVERY_BACKOFF_MS, dt as SubscribeAudioChunksResultSchema, et as DecodedAudioChunkSchema, f as DEVICE_SCOPED_CAPS, ft as SubscribeFramesInputSchema, g as createLazyTrpcSource, gt as parseProfileBrokerId, h as createEventBusSliceSource, ht as makeSourceBrokerId, i as asJsonArray, it as FrameHandleSchema, j as event, jt as hydrateSchema, k as DEVICE_SETTINGS_CONTRIBUTION_METHODS, kt as collectHydratedFieldEntries, l as parseJsonObject, lt as StreamSourceSchema, m as createDeviceProxy, mt as makeProfileBrokerId, n as sleepCancellable, nt as EncodedPacketSchema, o as asNumber, ot as ProfileSlotSchema, p as isDeviceScopedCap, pt as SubscribeFramesResultSchema, q as BrokerStatsSchema, r as asBoolean, rt as FrameHandleFormatSchema, s as asString, st as ProfileSlotStatusSchema, t as sleep, tt as DecodedFrameSchema, u as parseJsonUnknown, ut as SubscribeAudioChunksInputSchema, v as createSliceHandle, vt as DATAPLANE_SECRET_HEADER, w as DeviceFeature, wt as createEvent, x as viewerUiCapability, xt as BaseAddon, y as RawStateResultSchema, yt as SHARE_VIEW_KINDS, z as readNodePin } from "./sleep-CnLyvg3w.mjs";
1
+ import { $ as CameraStreamSchema, A as DEVICE_STATUS_METHOD, At as collectHydratedFieldValues, B as toNodeId, C as ChargingStatus, Ct as createDurableState, D as adminUiCapability, Dt as WELL_KNOWN_TABS, E as DeviceType, Et as isEvent, F as resolveCapMount, Ft as expandAudioChunkToF32le, G as scopeKey, H as ReadinessTimeoutError, I as systemMethod, It as isAudioChunkFormat, J as BrokerStatusSchema, K as AudioChunkFormatSchema, L as CAP_NODE_PIN_CONTEXT_KEY, M as expandCapMethods, Mt as resolveHydratedFieldValue, N as isDeviceConfigCap, Nt as AUDIO_CHUNK_FORMATS, O as DEFAULT_RUNTIME_STATE_DURABILITY, Ot as WELL_KNOWN_TAB_MAP, P as method, Pt as audioChunkBytesPerSample, Q as CamStreamResolutionSchema, R as nodePin, S as DEVICE_CHILDREN_BATCH_MAX, St as normalizeAddonInitResult, T as DeviceRole, Tt as emitReadiness, U as emitDownForOwnedCaps, V as ReadinessRegistry, W as readinessKey, X as CamProfileSchema, Y as CAM_PROFILE_ORDER, Z as CamStreamKindSchema, _ as createMirrorSource, _t as selectAssignedProfileSlots, a as asJsonObject, at as ProfileRtspEntrySchema, b as deviceOpsCapability, bt as DisposerChain, c as parseJsonArray, ct as StreamSourceEntrySchema, d as BOOT_RECOVERY_BACKOFF_MS, dt as SubscribeAudioChunksResultSchema, et as DecodedAudioChunkSchema, f as DEVICE_SCOPED_CAPS, ft as SubscribeFramesInputSchema, g as createLazyTrpcSource, gt as parseProfileBrokerId, h as createEventBusSliceSource, ht as makeSourceBrokerId, i as asJsonArray, it as FrameHandleSchema, j as event, jt as hydrateSchema, k as DEVICE_SETTINGS_CONTRIBUTION_METHODS, kt as collectHydratedFieldEntries, l as parseJsonObject, lt as StreamSourceSchema, m as createDeviceProxy, mt as makeProfileBrokerId, n as sleepCancellable, nt as EncodedPacketSchema, o as asNumber, ot as ProfileSlotSchema, p as isDeviceScopedCap, pt as SubscribeFramesResultSchema, q as BrokerStatsSchema, r as asBoolean, rt as FrameHandleFormatSchema, s as asString, st as ProfileSlotStatusSchema, t as sleep, tt as DecodedFrameSchema, u as parseJsonUnknown, ut as SubscribeAudioChunksInputSchema, v as createSliceHandle, vt as DATAPLANE_SECRET_HEADER, w as DeviceFeature, wt as createEvent, x as viewerUiCapability, xt as BaseAddon, y as RawStateResultSchema, yt as SHARE_VIEW_KINDS, z as readNodePin } from "./sleep-DBKu2-U5.mjs";
2
2
  import { t as EventCategory } from "./event-category-ZyX6jcse.mjs";
3
3
  import { a as buildAudioArgs, c as buildVideoArgs, d as logBannerArgs, f as pickVideoEncoder, i as audioPlanFromEncodeProfile, l as invocationFromEncodeProfile, n as Fmp4BoxSplitter, o as buildFfmpegArgs, r as AUDIO_PRESETS, s as buildInputArgs, t as canonicalHash, u as isSoftwareDecode } from "./canonical-hash-rO1sRmEK.mjs";
4
4
  import { EventSourceType } from "./enums.mjs";
@@ -20248,13 +20248,119 @@ var SummariesQueryInput = z.object({
20248
20248
  deviceIds: z.array(z.number()).min(1),
20249
20249
  since: z.number().optional(),
20250
20250
  until: z.number().optional(),
20251
- limit: z.number().int().min(1).max(200).default(50)
20251
+ limit: z.number().int().min(1).max(200).default(50),
20252
+ /** The same member-wise filter {@link listRecentSummaries} takes — one
20253
+ * meaning of "dog" on every summary surface. */
20254
+ classes: z.array(z.string().min(1).max(60)).max(40).optional()
20255
+ });
20256
+ /**
20257
+ * One member of a group, as a reader needs it.
20258
+ *
20259
+ * The class and the role travel WITH the id because every consumer that shows
20260
+ * a group has to say what it was made of — "two people and a dog" — and asking
20261
+ * `getTrack` per member to find that out turns one card into `memberCount`
20262
+ * round trips. The member row already holds both (they are written at the
20263
+ * join), so this costs the reader nothing.
20264
+ */
20265
+ var SummaryMemberSchema = z.object({
20266
+ trackId: z.string(),
20267
+ /**
20268
+ * The track's class at the time it JOINED, or `null` when it was unresolved
20269
+ * and the track no longer exists to fill it.
20270
+ *
20271
+ * The join, not the latest opinion: class voting can re-decide a track's
20272
+ * class afterwards, and a group's composition is the history of who came
20273
+ * together. A consumer counts these to badge a thumbnail — "two people and a
20274
+ * dog" — rather than being handed a second, denormalised tally that would
20275
+ * drift from the members it claims to describe.
20276
+ */
20277
+ className: z.string().nullable(),
20278
+ /** `primary` is the one member that carries the group's identity. */
20279
+ role: z.enum([
20280
+ "primary",
20281
+ "sibling",
20282
+ "child"
20283
+ ]).nullable(),
20284
+ joinedAt: z.number(),
20285
+ /** Tier 1 — the sub-class (`dog`, `van`), resolved from the member's track
20286
+ * at read time. Absent when nothing resolved, never an empty string. */
20287
+ label: z.string().optional(),
20288
+ /** Tier 2 — the instance: a person's name, a plate. Absent when the pipeline
20289
+ * recognised nobody, and absent for a member whose track has been pruned —
20290
+ * a thumbnail that names the wrong person is worse than one naming nobody. */
20291
+ subLabel: z.string().optional()
20252
20292
  });
20253
- var SummariesPageSchema = z.object({ summaries: z.array(SummarySchema).readonly() });
20254
20293
  var SummaryDetailSchema = z.object({
20255
20294
  summary: SummarySchema,
20256
- /** Member track ids, in absorption order. */
20257
- trackIds: z.array(z.string()).readonly()
20295
+ /** Members in absorption order, oldest join first. */
20296
+ members: z.array(SummaryMemberSchema).readonly()
20297
+ });
20298
+ /**
20299
+ * What a LIST of groups carries: the envelope plus what it is MADE OF.
20300
+ *
20301
+ * Coarse on purpose — the operator's rule is "only the rough data on the list,
20302
+ * we extend when we notice we need more". Enough to draw the card ("two people
20303
+ * and a dog") and no more. The MEMBERS, their names and the per-member links
20304
+ * are on {@link getSummary}: shipping every member of every group so a client
20305
+ * can count them turns a page of two hundred groups into a thousand records to
20306
+ * draw two hundred badges.
20307
+ */
20308
+ var SummaryListItemSchema = z.object({
20309
+ summary: SummarySchema,
20310
+ /** Class counts, most numerous first; `className: null` is a member whose
20311
+ * class never resolved, counted so the counts add up to `memberCount`. */
20312
+ classes: z.array(z.object({
20313
+ className: z.string().nullable(),
20314
+ count: z.number().int().positive()
20315
+ })).readonly()
20316
+ });
20317
+ var SummariesPageSchema = z.object({ summaries: z.array(SummaryListItemSchema).readonly() });
20318
+ /**
20319
+ * The paged feed, deliberately the SAME shape as {@link RecentTracksQueryInput}.
20320
+ *
20321
+ * The reel on the cameras page and the Events gallery both ride a cursor, so a
20322
+ * summaries feed that could only answer "the last N for these cameras"
20323
+ * (`listSummaries`) would make groups available in the timeline and nowhere
20324
+ * else. Two feeds with different ordering contracts would be two ideas of what
20325
+ * "newest" means, on one screen.
20326
+ */
20327
+ var RecentSummariesQueryInput = z.object({
20328
+ /** Devices to merge. An empty array yields an empty page. */
20329
+ deviceIds: z.array(z.number()),
20330
+ /** Window lower bound on `lastActiveAt` (inclusive). */
20331
+ since: z.number().optional(),
20332
+ /** Window upper bound on `lastActiveAt` (inclusive). */
20333
+ until: z.number().optional(),
20334
+ limit: z.number().int().min(1).max(500).default(100),
20335
+ /** Opaque continuation cursor from a previous page's `nextCursor`. */
20336
+ cursor: z.string().optional(),
20337
+ /**
20338
+ * Restrict to these classes — THE SAME FIELD `listRecentTracks` takes, and
20339
+ * deliberately the same name: the events filter tree emits one list of ticked
20340
+ * taxonomy nodes, and a summaries feed that called it something else would
20341
+ * make the operator's one filter component produce two shapes.
20342
+ *
20343
+ * A question about the MEMBERS: a group matches when ANY of them does. "Show
20344
+ * me the arrivals with a dog" has to return the group of four people who had
20345
+ * one with them; a filter on the group's own fields could only ever answer
20346
+ * about its primary.
20347
+ *
20348
+ * Matched against all THREE tiers of a member — the class (`animal`), the
20349
+ * sub-class (`dog`) and the instance (a name, a plate) — because which tier a
20350
+ * ticked node lives on is the taxonomy's business, not the caller's. `dog` is
20351
+ * an event kind in the tree and a tier-1 label on an `animal` track; a filter
20352
+ * that read only the class would answer "animal" and never "dog".
20353
+ *
20354
+ * ABSENT or EMPTY means no filter — absent is not a selection of none.
20355
+ */
20356
+ classes: z.array(z.string().min(1).max(60)).max(40).optional()
20357
+ });
20358
+ var RecentSummariesPageSchema = z.object({
20359
+ /** Ordered by (`lastActiveAt` DESC, id DESC). Same light item as
20360
+ * {@link listSummaries} — one list shape, so a card renders the same
20361
+ * whichever feed drew it. */
20362
+ summaries: z.array(SummaryListItemSchema).readonly(),
20363
+ nextCursor: z.string().nullable()
20258
20364
  });
20259
20365
  var RecentTracksPageSchema = z.object({
20260
20366
  /** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
@@ -20712,6 +20818,11 @@ var pipelineAnalyticsCapability = {
20712
20818
  listRecentTracks: method(RecentTracksQueryInput, RecentTracksPageSchema),
20713
20819
  /** Newest first by `openedAt`, for a camera set, inside an optional window. */
20714
20820
  listSummaries: method(SummariesQueryInput, SummariesPageSchema),
20821
+ /**
20822
+ * The PAGED feed — the reel and the Events gallery. Same cursor contract as
20823
+ * {@link listRecentTracks}, so one screen cannot hold two ideas of newest.
20824
+ */
20825
+ listRecentSummaries: method(RecentSummariesQueryInput, RecentSummariesPageSchema),
20715
20826
  /** One summary with its member track ids; `null` for an id nobody wrote. */
20716
20827
  getSummary: method(z.object({ id: z.string() }), SummaryDetailSchema.nullable()),
20717
20828
  clearTracks: method(z.object({ deviceId: z.number() }), z.void(), {
@@ -45927,6 +46038,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
45927
46038
  addonId: null,
45928
46039
  access: "view"
45929
46040
  },
46041
+ "pipelineAnalytics.listRecentSummaries": {
46042
+ capName: "pipeline-analytics",
46043
+ capScope: "device",
46044
+ addonId: null,
46045
+ access: "view"
46046
+ },
45930
46047
  "pipelineAnalytics.listRecentTracks": {
45931
46048
  capName: "pipeline-analytics",
45932
46049
  capScope: "device",
@@ -50023,6 +50140,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
50023
50140
  form: "single",
50024
50141
  optional: true
50025
50142
  }],
50143
+ "pipelineAnalytics.listRecentSummaries": [{
50144
+ name: "deviceIds",
50145
+ form: "array",
50146
+ optional: false
50147
+ }],
50026
50148
  "pipelineAnalytics.listRecentTracks": [{
50027
50149
  name: "deviceIds",
50028
50150
  form: "array",
@@ -3636,6 +3636,7 @@ function createDeviceProxy(api, binding, opts) {
3636
3636
  listTracks: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "listTracks", "query", input),
3637
3637
  listRecentTracks: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "listRecentTracks", "query", input),
3638
3638
  listSummaries: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "listSummaries", "query", input),
3639
+ listRecentSummaries: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "listRecentSummaries", "query", input),
3639
3640
  getSummary: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getSummary", "query", input),
3640
3641
  clearTracks: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "clearTracks", "mutation", input),
3641
3642
  getMotionEvents: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getMotionEvents", "query", input),
@@ -3636,6 +3636,7 @@ function createDeviceProxy(api, binding, opts) {
3636
3636
  listTracks: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "listTracks", "query", input),
3637
3637
  listRecentTracks: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "listRecentTracks", "query", input),
3638
3638
  listSummaries: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "listSummaries", "query", input),
3639
+ listRecentSummaries: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "listRecentSummaries", "query", input),
3639
3640
  getSummary: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getSummary", "query", input),
3640
3641
  clearTracks: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "clearTracks", "mutation", input),
3641
3642
  getMotionEvents: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getMotionEvents", "query", input),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/types",
3
- "version": "1.2.184",
3
+ "version": "1.2.186",
4
4
  "description": "Shared types, interfaces, and model catalogs for the CamStack detection ecosystem",
5
5
  "keywords": [
6
6
  "camstack",