@camstack/addon-provider-wyze 0.2.53 → 0.2.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/addon.js +236 -73
  2. package/dist/addon.mjs +236 -73
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -8128,6 +8128,13 @@ var MediaRelocateModeSchema = _enum([
8128
8128
  ]);
8129
8129
  var RelocateMediaInputSchema = object({
8130
8130
  toLocationId: string(),
8131
+ /**
8132
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8133
+ * every row that is not already on `toLocationId` (the historical
8134
+ * behaviour). A named source is what a from→to migration needs: without it
8135
+ * "move events off disk 2" also emptied disk 1.
8136
+ */
8137
+ fromLocationId: string().optional(),
8131
8138
  throttleMbps: number().min(1).max(1e3).optional(),
8132
8139
  /** Omitted = `move`, the pre-existing behaviour. */
8133
8140
  mode: MediaRelocateModeSchema.optional()
@@ -8195,6 +8202,19 @@ var StorageMigrationDestinationsSchema = object({
8195
8202
  galleryMedia: string().min(1).optional()
8196
8203
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8197
8204
  /**
8205
+ * Optional named source per class. Omitted = the class's current default
8206
+ * (the historical behaviour). A named source that is NOT the default is a
8207
+ * drain of that disk: bytes move, the default stays, and the source is
8208
+ * disabled when the move finishes.
8209
+ */
8210
+ var StorageMigrationSourcesSchema = object({
8211
+ recordings: string().min(1).optional(),
8212
+ recordingsLow: string().min(1).optional(),
8213
+ eventMedia: string().min(1).optional(),
8214
+ backups: string().min(1).optional(),
8215
+ galleryMedia: string().min(1).optional()
8216
+ }).optional();
8217
+ /**
8198
8218
  * How a migration sequences the cutover against the byte move.
8199
8219
  *
8200
8220
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8216,6 +8236,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8216
8236
  /** Shared input for planning and starting an orchestrated storage migration. */
8217
8237
  var StorageMigrationInputSchema = object({
8218
8238
  destinations: StorageMigrationDestinationsSchema,
8239
+ /** Omitted = each class's current default. */
8240
+ sources: StorageMigrationSourcesSchema,
8219
8241
  throttleMbps: number().min(1).max(1e3).optional(),
8220
8242
  /** Omitted = `blocking`, which stays the default. */
8221
8243
  mode: StorageMigrationModeSchema.optional()
@@ -8295,6 +8317,13 @@ var StorageMigrationMoveSchema = object({
8295
8317
  storageClass: StorageMigrationClassSchema,
8296
8318
  fromLocationId: string(),
8297
8319
  toLocationId: string(),
8320
+ /**
8321
+ * True when `from` was NOT the class default at plan time. The move still
8322
+ * copies bytes, but the default is left alone and the source is disabled
8323
+ * once the copy verifies. Absent on jobs planned before this field existed
8324
+ * — those jobs always repointed, which is `false`.
8325
+ */
8326
+ freezeSource: boolean().optional(),
8298
8327
  moverJobId: string().nullable(),
8299
8328
  state: RelocateJobStateSchema.nullable(),
8300
8329
  error: string().nullable(),
@@ -8308,6 +8337,7 @@ var StorageMigrationJobSchema = object({
8308
8337
  * can tell a seconds-long cutover from a thirty-hour one. */
8309
8338
  mode: StorageMigrationModeSchema,
8310
8339
  destinations: StorageMigrationDestinationsSchema,
8340
+ sources: StorageMigrationSourcesSchema,
8311
8341
  throttleMbps: number(),
8312
8342
  moves: array(StorageMigrationMoveSchema),
8313
8343
  pauseLeaseId: string().nullable(),
@@ -8333,6 +8363,7 @@ var StorageMigrationFindingSchema = object({
8333
8363
  });
8334
8364
  var StorageMigrationPlanSchema = object({
8335
8365
  destinations: StorageMigrationDestinationsSchema,
8366
+ sources: StorageMigrationSourcesSchema,
8336
8367
  /** The mode this plan was built for. A plan is only valid for its mode: the
8337
8368
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8338
8369
  * it. */
@@ -8340,7 +8371,8 @@ var StorageMigrationPlanSchema = object({
8340
8371
  moves: array(object({
8341
8372
  storageClass: StorageMigrationClassSchema,
8342
8373
  fromLocationId: string(),
8343
- toLocationId: string()
8374
+ toLocationId: string(),
8375
+ freezeSource: boolean().optional()
8344
8376
  })),
8345
8377
  findings: array(StorageMigrationFindingSchema)
8346
8378
  });
@@ -8518,10 +8550,51 @@ var LedgerWalkReportSchema = object({
8518
8550
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8519
8551
  var RelocatableMediaCountInputSchema = object({
8520
8552
  toLocationId: string().min(1),
8553
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8554
+ fromLocationId: string().optional(),
8521
8555
  /** Omitted = `move`. */
8522
8556
  mode: MediaRelocateModeSchema.optional()
8523
8557
  });
8524
8558
  /**
8559
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8560
+ * ghost ledger entries on frozen footage locations.
8561
+ *
8562
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8563
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8564
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8565
+ * with no operator-visible status.
8566
+ */
8567
+ var StorageCleanupPhaseSchema = _enum([
8568
+ "orphans",
8569
+ "debug-media",
8570
+ "ghost-ledger",
8571
+ "done",
8572
+ "failed",
8573
+ "cancelled"
8574
+ ]);
8575
+ var StorageCleanupInputSchema = object({
8576
+ /** Also walk motion stills / track filmstrips. Off by default. */
8577
+ includeDebugMedia: boolean().optional() });
8578
+ var StorageCleanupJobSchema = object({
8579
+ jobId: string(),
8580
+ phase: StorageCleanupPhaseSchema,
8581
+ includeDebugMedia: boolean(),
8582
+ orphansReclaimed: number().int().nonnegative(),
8583
+ orphanBytesReclaimed: number().int().nonnegative(),
8584
+ debugMediaReclaimed: number().int().nonnegative(),
8585
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8586
+ ghostsForgotten: number().int().nonnegative(),
8587
+ ghostBytesForgotten: number().int().nonnegative(),
8588
+ /** Short operator-facing line: current collection, pass, or location. */
8589
+ detail: string().nullable(),
8590
+ cancelRequested: boolean(),
8591
+ startedAt: number(),
8592
+ updatedAt: number(),
8593
+ finishedAt: number().nullable(),
8594
+ error: string().nullable()
8595
+ });
8596
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8597
+ /**
8525
8598
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8526
8599
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8527
8600
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8549,11 +8622,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8549
8622
  * The default location for a type uses `id === <type>:default` by
8550
8623
  * convention (the bare type ref like `'backups'` resolves to it).
8551
8624
  *
8552
- * `isSystem: true` marks a location as orchestrator-seeded and
8553
- * undeletable. The bootstrap-installed defaults (one per type) carry
8554
- * this flag; operator-added locations don't. Editing the config of
8555
- * a system location is allowed (path migration, provider swap) but
8556
- * deleting it is rejected at the cap level.
8625
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8626
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8627
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8628
+ * / last-enabled, not on this bit.
8557
8629
  */
8558
8630
  var StorageLocationSchema = object({
8559
8631
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13096,6 +13168,12 @@ method(object({
13096
13168
  }), _void(), {
13097
13169
  kind: "mutation",
13098
13170
  auth: "admin"
13171
+ }), method(object({
13172
+ from: string(),
13173
+ to: string()
13174
+ }), object({ moved: number() }), {
13175
+ kind: "mutation",
13176
+ auth: "admin"
13099
13177
  }), method(object({
13100
13178
  deviceId: number(),
13101
13179
  disabled: boolean()
@@ -15846,6 +15924,8 @@ var NcSystemEventKindSchema = _enum([
15846
15924
  "device-offline",
15847
15925
  "device-disabled",
15848
15926
  "device-enabled",
15927
+ "device-battery-low",
15928
+ "device-battery-normal",
15849
15929
  "stream-online",
15850
15930
  "stream-offline",
15851
15931
  "node-online",
@@ -19104,46 +19184,6 @@ var RecentTracksPageSchema = object({
19104
19184
  /** Cursor for the next page, or null when this page is the last. */
19105
19185
  nextCursor: string().nullable()
19106
19186
  });
19107
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19108
- var LIST_GROUPS_MAX_LIMIT = 100;
19109
- var AnalyticsGroupRecordSchema = object({
19110
- id: string(),
19111
- deviceId: number().int(),
19112
- openedAt: number().int(),
19113
- closedAt: number().int(),
19114
- timestamp: number().int(),
19115
- memberCount: number().int(),
19116
- memberTrackIds: array(string()).readonly(),
19117
- className: string(),
19118
- classes: array(string()).readonly(),
19119
- /** Relative event-media path, or null when the group has no picture yet. */
19120
- mediaUrl: string().nullable(),
19121
- singleton: boolean()
19122
- });
19123
- var AnalyticsGroupMemberSchema = object({
19124
- trackId: string(),
19125
- deviceId: number().int(),
19126
- className: string(),
19127
- firstSeen: number().int(),
19128
- lastSeen: number().int(),
19129
- mediaUrl: string().nullable()
19130
- });
19131
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19132
- var ListGroupsQueryInput = object({
19133
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19134
- deviceIds: array(number()),
19135
- /** Window lower bound on `closedAt` (inclusive). */
19136
- since: number().optional(),
19137
- /** Window upper bound on `openedAt` (inclusive). */
19138
- until: number().optional(),
19139
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19140
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19141
- cursor: string().optional()
19142
- });
19143
- var ListGroupsPageSchema = object({
19144
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19145
- nextCursor: string().nullable()
19146
- });
19147
19187
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19148
19188
  var KEY_EVENTS_MAX_LIMIT = 200;
19149
19189
  var KeyEventQueryInput = object({
@@ -19247,9 +19287,7 @@ var TrackCascadeCountsSchema = object({
19247
19287
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19248
19288
  plates: number().int(),
19249
19289
  /** Per-track CLIP search vectors removed (best-effort). */
19250
- embeddings: number().int(),
19251
- /** Group membership + group rows removed with their last member (best-effort). */
19252
- groups: number().int()
19290
+ embeddings: number().int()
19253
19291
  });
19254
19292
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19255
19293
  var DiskReconcileCountsSchema = object({
@@ -19419,6 +19457,47 @@ var RebuildStatusSchema = object({
19419
19457
  /** Present when the pass ended by throwing. */
19420
19458
  error: string().nullable()
19421
19459
  });
19460
+ /**
19461
+ * Acknowledgement that a debug-media reclaim STARTED.
19462
+ *
19463
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19464
+ * it runs detached and this returns immediately. Awaiting it is how the
19465
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19466
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19467
+ */
19468
+ var MediaReclaimStartResultSchema = object({
19469
+ started: boolean(),
19470
+ /** True when a pass was already running; the new request is ignored. */
19471
+ alreadyRunning: boolean()
19472
+ });
19473
+ var MediaReclaimInputSchema = object({
19474
+ mode: _enum(["report", "reclaim"]).default("report"),
19475
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19476
+ deviceIds: array(number().int()).min(1).optional(),
19477
+ restart: boolean().optional(),
19478
+ pageSize: number().int().min(50).max(5e3).optional(),
19479
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19480
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19481
+ maxBytesPerRun: number().int().min(1).optional(),
19482
+ budgetMinutes: number().int().min(1).max(720).optional(),
19483
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19484
+ graceMinutes: number().int().min(1).max(10080).optional()
19485
+ });
19486
+ var MediaReclaimStatusSchema = object({
19487
+ running: boolean(),
19488
+ mode: _enum(["report", "reclaim"]).nullable(),
19489
+ totalExamined: number(),
19490
+ totalEligible: number(),
19491
+ totalReclaimed: number(),
19492
+ totalBytesReclaimed: number(),
19493
+ totalRefused: number(),
19494
+ /** Device+scope windows finished in this pass. */
19495
+ devicesDone: number(),
19496
+ complete: boolean().nullable(),
19497
+ startedAtMs: number().nullable(),
19498
+ finishedAtMs: number().nullable(),
19499
+ error: string().nullable()
19500
+ });
19422
19501
  var ReplayFrameInputSchema = object({
19423
19502
  timestamp: number(),
19424
19503
  frame: PipelineRunResultBridge
@@ -19457,10 +19536,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19457
19536
  * stationary registry). Default false: the timeline lists passages,
19458
19537
  * not parking records (operator decision, 2026-08-15). */
19459
19538
  includeStationary: boolean().optional()
19460
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19461
- deviceId: number(),
19462
- groupId: string().min(1)
19463
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19539
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19464
19540
  kind: "mutation",
19465
19541
  auth: "admin"
19466
19542
  }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({ deviceId: number() }), array(EventKindDescriptorSchema).readonly()), method(object({ deviceIds: array(number()).min(1).max(200) }), array(EventKindsForDeviceSchema).readonly()), method(object({
@@ -19560,6 +19636,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19560
19636
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19561
19637
  kind: "query",
19562
19638
  auth: "admin"
19639
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19640
+ kind: "mutation",
19641
+ auth: "admin"
19642
+ }), method(object({}), MediaReclaimStatusSchema, {
19643
+ kind: "query",
19644
+ auth: "admin"
19563
19645
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19564
19646
  kind: "query",
19565
19647
  auth: "admin"
@@ -21634,7 +21716,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21634
21716
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21635
21717
  kind: "mutation",
21636
21718
  auth: "admin"
21637
- });
21719
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21720
+ kind: "mutation",
21721
+ auth: "admin"
21722
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21723
+ kind: "mutation",
21724
+ auth: "admin"
21725
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21638
21726
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21639
21727
  providerId: string().min(1),
21640
21728
  displayName: string().min(1),
@@ -28735,6 +28823,33 @@ var RecordingRebalanceInputSchema = object({
28735
28823
  minMoveGb: number().min(0).optional()
28736
28824
  });
28737
28825
  /**
28826
+ * Operator-facing placement of one camera onto a recordings location.
28827
+ *
28828
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28829
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28830
+ * currently write — the plan, which may disagree with the pin when Auto.
28831
+ */
28832
+ var RecordingDevicePlacementSchema = object({
28833
+ deviceId: number().int(),
28834
+ profile: string(),
28835
+ locationId: string()
28836
+ });
28837
+ var RecordingDevicePinSchema = object({
28838
+ deviceId: number().int(),
28839
+ /** Recordings-class location this camera is pinned to. */
28840
+ locationId: string()
28841
+ });
28842
+ var RecordingPlacementViewSchema = object({
28843
+ assignments: array(RecordingDevicePlacementSchema),
28844
+ pins: array(RecordingDevicePinSchema),
28845
+ defaultLocations: record(string(), string())
28846
+ });
28847
+ var RecordingSetDevicePlacementInputSchema = object({
28848
+ deviceId: number().int(),
28849
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28850
+ locationId: string().nullable()
28851
+ });
28852
+ /**
28738
28853
  * Result of locating footage at a wall-clock instant for one device/profile.
28739
28854
  * `segment` carries the covering segment's window; `gap` reports the forward
28740
28855
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -28960,6 +29075,12 @@ method(object({
28960
29075
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
28961
29076
  kind: "mutation",
28962
29077
  auth: "admin"
29078
+ }), method(object({}), RecordingPlacementViewSchema, {
29079
+ kind: "query",
29080
+ auth: "admin"
29081
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29082
+ kind: "mutation",
29083
+ auth: "admin"
28963
29084
  });
28964
29085
  /**
28965
29086
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34029,6 +34150,12 @@ Object.freeze({
34029
34150
  addonId: null,
34030
34151
  access: "delete"
34031
34152
  },
34153
+ "deviceManager.renameLocation": {
34154
+ capName: "device-manager",
34155
+ capScope: "system",
34156
+ addonId: null,
34157
+ access: "create"
34158
+ },
34032
34159
  "deviceManager.runDeviceAction": {
34033
34160
  capName: "device-manager",
34034
34161
  capScope: "system",
@@ -35721,19 +35848,19 @@ Object.freeze({
35721
35848
  addonId: null,
35722
35849
  access: "view"
35723
35850
  },
35724
- "pipelineAnalytics.getGroup": {
35851
+ "pipelineAnalytics.getKeyEvents": {
35725
35852
  capName: "pipeline-analytics",
35726
35853
  capScope: "device",
35727
35854
  addonId: null,
35728
35855
  access: "view"
35729
35856
  },
35730
- "pipelineAnalytics.getKeyEvents": {
35857
+ "pipelineAnalytics.getKeyEventsBatch": {
35731
35858
  capName: "pipeline-analytics",
35732
35859
  capScope: "device",
35733
35860
  addonId: null,
35734
35861
  access: "view"
35735
35862
  },
35736
- "pipelineAnalytics.getKeyEventsBatch": {
35863
+ "pipelineAnalytics.getMediaReclaimStatus": {
35737
35864
  capName: "pipeline-analytics",
35738
35865
  capScope: "device",
35739
35866
  addonId: null,
@@ -35823,12 +35950,6 @@ Object.freeze({
35823
35950
  addonId: null,
35824
35951
  access: "view"
35825
35952
  },
35826
- "pipelineAnalytics.listGroups": {
35827
- capName: "pipeline-analytics",
35828
- capScope: "device",
35829
- addonId: null,
35830
- access: "view"
35831
- },
35832
35953
  "pipelineAnalytics.listOpsLog": {
35833
35954
  capName: "pipeline-analytics",
35834
35955
  capScope: "device",
@@ -35913,6 +36034,12 @@ Object.freeze({
35913
36034
  addonId: null,
35914
36035
  access: "create"
35915
36036
  },
36037
+ "pipelineAnalytics.reclaimDebugMedia": {
36038
+ capName: "pipeline-analytics",
36039
+ capScope: "device",
36040
+ addonId: null,
36041
+ access: "create"
36042
+ },
35916
36043
  "pipelineAnalytics.reconcileFromDisk": {
35917
36044
  capName: "pipeline-analytics",
35918
36045
  capScope: "device",
@@ -36837,6 +36964,12 @@ Object.freeze({
36837
36964
  addonId: null,
36838
36965
  access: "view"
36839
36966
  },
36967
+ "recording.getPlacement": {
36968
+ capName: "recording",
36969
+ capScope: "system",
36970
+ addonId: null,
36971
+ access: "view"
36972
+ },
36840
36973
  "recording.getPlaybackManifest": {
36841
36974
  capName: "recording",
36842
36975
  capScope: "system",
@@ -36963,6 +37096,12 @@ Object.freeze({
36963
37096
  addonId: null,
36964
37097
  access: "create"
36965
37098
  },
37099
+ "recording.setDevicePlacement": {
37100
+ capName: "recording",
37101
+ capScope: "system",
37102
+ addonId: null,
37103
+ access: "create"
37104
+ },
36966
37105
  "recording.startStorageMigrationMove": {
36967
37106
  capName: "recording",
36968
37107
  capScope: "system",
@@ -37407,12 +37546,36 @@ Object.freeze({
37407
37546
  addonId: null,
37408
37547
  access: "create"
37409
37548
  },
37549
+ "storageMigration.cleanupCancel": {
37550
+ capName: "storage-migration",
37551
+ capScope: "system",
37552
+ addonId: null,
37553
+ access: "create"
37554
+ },
37555
+ "storageMigration.cleanupStart": {
37556
+ capName: "storage-migration",
37557
+ capScope: "system",
37558
+ addonId: null,
37559
+ access: "create"
37560
+ },
37561
+ "storageMigration.cleanupStatus": {
37562
+ capName: "storage-migration",
37563
+ capScope: "system",
37564
+ addonId: null,
37565
+ access: "view"
37566
+ },
37410
37567
  "storageMigration.drain": {
37411
37568
  capName: "storage-migration",
37412
37569
  capScope: "system",
37413
37570
  addonId: null,
37414
37571
  access: "create"
37415
37572
  },
37573
+ "storageMigration.history": {
37574
+ capName: "storage-migration",
37575
+ capScope: "system",
37576
+ addonId: null,
37577
+ access: "view"
37578
+ },
37416
37579
  "storageMigration.movers": {
37417
37580
  capName: "storage-migration",
37418
37581
  capScope: "system",
@@ -39409,11 +39572,6 @@ Object.freeze({
39409
39572
  form: "single",
39410
39573
  optional: true
39411
39574
  }],
39412
- "pipelineAnalytics.getGroup": [{
39413
- name: "deviceId",
39414
- form: "single",
39415
- optional: false
39416
- }],
39417
39575
  "pipelineAnalytics.getKeyEvents": [{
39418
39576
  name: "deviceId",
39419
39577
  form: "single",
@@ -39479,11 +39637,6 @@ Object.freeze({
39479
39637
  form: "single",
39480
39638
  optional: false
39481
39639
  }],
39482
- "pipelineAnalytics.listGroups": [{
39483
- name: "deviceIds",
39484
- form: "array",
39485
- optional: false
39486
- }],
39487
39640
  "pipelineAnalytics.listOpsLog": [{
39488
39641
  name: "deviceId",
39489
39642
  form: "single",
@@ -39529,6 +39682,11 @@ Object.freeze({
39529
39682
  form: "single",
39530
39683
  optional: true
39531
39684
  }],
39685
+ "pipelineAnalytics.reclaimDebugMedia": [{
39686
+ name: "deviceIds",
39687
+ form: "array",
39688
+ optional: true
39689
+ }],
39532
39690
  "pipelineAnalytics.reconcileFromDisk": [{
39533
39691
  name: "deviceId",
39534
39692
  form: "single",
@@ -39894,6 +40052,11 @@ Object.freeze({
39894
40052
  form: "single",
39895
40053
  optional: false
39896
40054
  }],
40055
+ "recording.setDevicePlacement": [{
40056
+ name: "deviceId",
40057
+ form: "single",
40058
+ optional: false
40059
+ }],
39897
40060
  "recording.startStorageMigrationMove": [{
39898
40061
  name: "deviceId",
39899
40062
  form: "single",
package/dist/addon.mjs CHANGED
@@ -8107,6 +8107,13 @@ var MediaRelocateModeSchema = _enum([
8107
8107
  ]);
8108
8108
  var RelocateMediaInputSchema = object({
8109
8109
  toLocationId: string(),
8110
+ /**
8111
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8112
+ * every row that is not already on `toLocationId` (the historical
8113
+ * behaviour). A named source is what a from→to migration needs: without it
8114
+ * "move events off disk 2" also emptied disk 1.
8115
+ */
8116
+ fromLocationId: string().optional(),
8110
8117
  throttleMbps: number().min(1).max(1e3).optional(),
8111
8118
  /** Omitted = `move`, the pre-existing behaviour. */
8112
8119
  mode: MediaRelocateModeSchema.optional()
@@ -8174,6 +8181,19 @@ var StorageMigrationDestinationsSchema = object({
8174
8181
  galleryMedia: string().min(1).optional()
8175
8182
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8176
8183
  /**
8184
+ * Optional named source per class. Omitted = the class's current default
8185
+ * (the historical behaviour). A named source that is NOT the default is a
8186
+ * drain of that disk: bytes move, the default stays, and the source is
8187
+ * disabled when the move finishes.
8188
+ */
8189
+ var StorageMigrationSourcesSchema = object({
8190
+ recordings: string().min(1).optional(),
8191
+ recordingsLow: string().min(1).optional(),
8192
+ eventMedia: string().min(1).optional(),
8193
+ backups: string().min(1).optional(),
8194
+ galleryMedia: string().min(1).optional()
8195
+ }).optional();
8196
+ /**
8177
8197
  * How a migration sequences the cutover against the byte move.
8178
8198
  *
8179
8199
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8195,6 +8215,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8195
8215
  /** Shared input for planning and starting an orchestrated storage migration. */
8196
8216
  var StorageMigrationInputSchema = object({
8197
8217
  destinations: StorageMigrationDestinationsSchema,
8218
+ /** Omitted = each class's current default. */
8219
+ sources: StorageMigrationSourcesSchema,
8198
8220
  throttleMbps: number().min(1).max(1e3).optional(),
8199
8221
  /** Omitted = `blocking`, which stays the default. */
8200
8222
  mode: StorageMigrationModeSchema.optional()
@@ -8274,6 +8296,13 @@ var StorageMigrationMoveSchema = object({
8274
8296
  storageClass: StorageMigrationClassSchema,
8275
8297
  fromLocationId: string(),
8276
8298
  toLocationId: string(),
8299
+ /**
8300
+ * True when `from` was NOT the class default at plan time. The move still
8301
+ * copies bytes, but the default is left alone and the source is disabled
8302
+ * once the copy verifies. Absent on jobs planned before this field existed
8303
+ * — those jobs always repointed, which is `false`.
8304
+ */
8305
+ freezeSource: boolean().optional(),
8277
8306
  moverJobId: string().nullable(),
8278
8307
  state: RelocateJobStateSchema.nullable(),
8279
8308
  error: string().nullable(),
@@ -8287,6 +8316,7 @@ var StorageMigrationJobSchema = object({
8287
8316
  * can tell a seconds-long cutover from a thirty-hour one. */
8288
8317
  mode: StorageMigrationModeSchema,
8289
8318
  destinations: StorageMigrationDestinationsSchema,
8319
+ sources: StorageMigrationSourcesSchema,
8290
8320
  throttleMbps: number(),
8291
8321
  moves: array(StorageMigrationMoveSchema),
8292
8322
  pauseLeaseId: string().nullable(),
@@ -8312,6 +8342,7 @@ var StorageMigrationFindingSchema = object({
8312
8342
  });
8313
8343
  var StorageMigrationPlanSchema = object({
8314
8344
  destinations: StorageMigrationDestinationsSchema,
8345
+ sources: StorageMigrationSourcesSchema,
8315
8346
  /** The mode this plan was built for. A plan is only valid for its mode: the
8316
8347
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8317
8348
  * it. */
@@ -8319,7 +8350,8 @@ var StorageMigrationPlanSchema = object({
8319
8350
  moves: array(object({
8320
8351
  storageClass: StorageMigrationClassSchema,
8321
8352
  fromLocationId: string(),
8322
- toLocationId: string()
8353
+ toLocationId: string(),
8354
+ freezeSource: boolean().optional()
8323
8355
  })),
8324
8356
  findings: array(StorageMigrationFindingSchema)
8325
8357
  });
@@ -8497,10 +8529,51 @@ var LedgerWalkReportSchema = object({
8497
8529
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8498
8530
  var RelocatableMediaCountInputSchema = object({
8499
8531
  toLocationId: string().min(1),
8532
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8533
+ fromLocationId: string().optional(),
8500
8534
  /** Omitted = `move`. */
8501
8535
  mode: MediaRelocateModeSchema.optional()
8502
8536
  });
8503
8537
  /**
8538
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8539
+ * ghost ledger entries on frozen footage locations.
8540
+ *
8541
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8542
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8543
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8544
+ * with no operator-visible status.
8545
+ */
8546
+ var StorageCleanupPhaseSchema = _enum([
8547
+ "orphans",
8548
+ "debug-media",
8549
+ "ghost-ledger",
8550
+ "done",
8551
+ "failed",
8552
+ "cancelled"
8553
+ ]);
8554
+ var StorageCleanupInputSchema = object({
8555
+ /** Also walk motion stills / track filmstrips. Off by default. */
8556
+ includeDebugMedia: boolean().optional() });
8557
+ var StorageCleanupJobSchema = object({
8558
+ jobId: string(),
8559
+ phase: StorageCleanupPhaseSchema,
8560
+ includeDebugMedia: boolean(),
8561
+ orphansReclaimed: number().int().nonnegative(),
8562
+ orphanBytesReclaimed: number().int().nonnegative(),
8563
+ debugMediaReclaimed: number().int().nonnegative(),
8564
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8565
+ ghostsForgotten: number().int().nonnegative(),
8566
+ ghostBytesForgotten: number().int().nonnegative(),
8567
+ /** Short operator-facing line: current collection, pass, or location. */
8568
+ detail: string().nullable(),
8569
+ cancelRequested: boolean(),
8570
+ startedAt: number(),
8571
+ updatedAt: number(),
8572
+ finishedAt: number().nullable(),
8573
+ error: string().nullable()
8574
+ });
8575
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8576
+ /**
8504
8577
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8505
8578
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8506
8579
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8528,11 +8601,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8528
8601
  * The default location for a type uses `id === <type>:default` by
8529
8602
  * convention (the bare type ref like `'backups'` resolves to it).
8530
8603
  *
8531
- * `isSystem: true` marks a location as orchestrator-seeded and
8532
- * undeletable. The bootstrap-installed defaults (one per type) carry
8533
- * this flag; operator-added locations don't. Editing the config of
8534
- * a system location is allowed (path migration, provider swap) but
8535
- * deleting it is rejected at the cap level.
8604
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8605
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8606
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8607
+ * / last-enabled, not on this bit.
8536
8608
  */
8537
8609
  var StorageLocationSchema = object({
8538
8610
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13075,6 +13147,12 @@ method(object({
13075
13147
  }), _void(), {
13076
13148
  kind: "mutation",
13077
13149
  auth: "admin"
13150
+ }), method(object({
13151
+ from: string(),
13152
+ to: string()
13153
+ }), object({ moved: number() }), {
13154
+ kind: "mutation",
13155
+ auth: "admin"
13078
13156
  }), method(object({
13079
13157
  deviceId: number(),
13080
13158
  disabled: boolean()
@@ -15825,6 +15903,8 @@ var NcSystemEventKindSchema = _enum([
15825
15903
  "device-offline",
15826
15904
  "device-disabled",
15827
15905
  "device-enabled",
15906
+ "device-battery-low",
15907
+ "device-battery-normal",
15828
15908
  "stream-online",
15829
15909
  "stream-offline",
15830
15910
  "node-online",
@@ -19083,46 +19163,6 @@ var RecentTracksPageSchema = object({
19083
19163
  /** Cursor for the next page, or null when this page is the last. */
19084
19164
  nextCursor: string().nullable()
19085
19165
  });
19086
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19087
- var LIST_GROUPS_MAX_LIMIT = 100;
19088
- var AnalyticsGroupRecordSchema = object({
19089
- id: string(),
19090
- deviceId: number().int(),
19091
- openedAt: number().int(),
19092
- closedAt: number().int(),
19093
- timestamp: number().int(),
19094
- memberCount: number().int(),
19095
- memberTrackIds: array(string()).readonly(),
19096
- className: string(),
19097
- classes: array(string()).readonly(),
19098
- /** Relative event-media path, or null when the group has no picture yet. */
19099
- mediaUrl: string().nullable(),
19100
- singleton: boolean()
19101
- });
19102
- var AnalyticsGroupMemberSchema = object({
19103
- trackId: string(),
19104
- deviceId: number().int(),
19105
- className: string(),
19106
- firstSeen: number().int(),
19107
- lastSeen: number().int(),
19108
- mediaUrl: string().nullable()
19109
- });
19110
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19111
- var ListGroupsQueryInput = object({
19112
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19113
- deviceIds: array(number()),
19114
- /** Window lower bound on `closedAt` (inclusive). */
19115
- since: number().optional(),
19116
- /** Window upper bound on `openedAt` (inclusive). */
19117
- until: number().optional(),
19118
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19119
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19120
- cursor: string().optional()
19121
- });
19122
- var ListGroupsPageSchema = object({
19123
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19124
- nextCursor: string().nullable()
19125
- });
19126
19166
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19127
19167
  var KEY_EVENTS_MAX_LIMIT = 200;
19128
19168
  var KeyEventQueryInput = object({
@@ -19226,9 +19266,7 @@ var TrackCascadeCountsSchema = object({
19226
19266
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19227
19267
  plates: number().int(),
19228
19268
  /** Per-track CLIP search vectors removed (best-effort). */
19229
- embeddings: number().int(),
19230
- /** Group membership + group rows removed with their last member (best-effort). */
19231
- groups: number().int()
19269
+ embeddings: number().int()
19232
19270
  });
19233
19271
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19234
19272
  var DiskReconcileCountsSchema = object({
@@ -19398,6 +19436,47 @@ var RebuildStatusSchema = object({
19398
19436
  /** Present when the pass ended by throwing. */
19399
19437
  error: string().nullable()
19400
19438
  });
19439
+ /**
19440
+ * Acknowledgement that a debug-media reclaim STARTED.
19441
+ *
19442
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19443
+ * it runs detached and this returns immediately. Awaiting it is how the
19444
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19445
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19446
+ */
19447
+ var MediaReclaimStartResultSchema = object({
19448
+ started: boolean(),
19449
+ /** True when a pass was already running; the new request is ignored. */
19450
+ alreadyRunning: boolean()
19451
+ });
19452
+ var MediaReclaimInputSchema = object({
19453
+ mode: _enum(["report", "reclaim"]).default("report"),
19454
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19455
+ deviceIds: array(number().int()).min(1).optional(),
19456
+ restart: boolean().optional(),
19457
+ pageSize: number().int().min(50).max(5e3).optional(),
19458
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19459
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19460
+ maxBytesPerRun: number().int().min(1).optional(),
19461
+ budgetMinutes: number().int().min(1).max(720).optional(),
19462
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19463
+ graceMinutes: number().int().min(1).max(10080).optional()
19464
+ });
19465
+ var MediaReclaimStatusSchema = object({
19466
+ running: boolean(),
19467
+ mode: _enum(["report", "reclaim"]).nullable(),
19468
+ totalExamined: number(),
19469
+ totalEligible: number(),
19470
+ totalReclaimed: number(),
19471
+ totalBytesReclaimed: number(),
19472
+ totalRefused: number(),
19473
+ /** Device+scope windows finished in this pass. */
19474
+ devicesDone: number(),
19475
+ complete: boolean().nullable(),
19476
+ startedAtMs: number().nullable(),
19477
+ finishedAtMs: number().nullable(),
19478
+ error: string().nullable()
19479
+ });
19401
19480
  var ReplayFrameInputSchema = object({
19402
19481
  timestamp: number(),
19403
19482
  frame: PipelineRunResultBridge
@@ -19436,10 +19515,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19436
19515
  * stationary registry). Default false: the timeline lists passages,
19437
19516
  * not parking records (operator decision, 2026-08-15). */
19438
19517
  includeStationary: boolean().optional()
19439
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19440
- deviceId: number(),
19441
- groupId: string().min(1)
19442
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19518
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19443
19519
  kind: "mutation",
19444
19520
  auth: "admin"
19445
19521
  }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({ deviceId: number() }), array(EventKindDescriptorSchema).readonly()), method(object({ deviceIds: array(number()).min(1).max(200) }), array(EventKindsForDeviceSchema).readonly()), method(object({
@@ -19539,6 +19615,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19539
19615
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19540
19616
  kind: "query",
19541
19617
  auth: "admin"
19618
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19619
+ kind: "mutation",
19620
+ auth: "admin"
19621
+ }), method(object({}), MediaReclaimStatusSchema, {
19622
+ kind: "query",
19623
+ auth: "admin"
19542
19624
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19543
19625
  kind: "query",
19544
19626
  auth: "admin"
@@ -21613,7 +21695,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21613
21695
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21614
21696
  kind: "mutation",
21615
21697
  auth: "admin"
21616
- });
21698
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21699
+ kind: "mutation",
21700
+ auth: "admin"
21701
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21702
+ kind: "mutation",
21703
+ auth: "admin"
21704
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21617
21705
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21618
21706
  providerId: string().min(1),
21619
21707
  displayName: string().min(1),
@@ -28714,6 +28802,33 @@ var RecordingRebalanceInputSchema = object({
28714
28802
  minMoveGb: number().min(0).optional()
28715
28803
  });
28716
28804
  /**
28805
+ * Operator-facing placement of one camera onto a recordings location.
28806
+ *
28807
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28808
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28809
+ * currently write — the plan, which may disagree with the pin when Auto.
28810
+ */
28811
+ var RecordingDevicePlacementSchema = object({
28812
+ deviceId: number().int(),
28813
+ profile: string(),
28814
+ locationId: string()
28815
+ });
28816
+ var RecordingDevicePinSchema = object({
28817
+ deviceId: number().int(),
28818
+ /** Recordings-class location this camera is pinned to. */
28819
+ locationId: string()
28820
+ });
28821
+ var RecordingPlacementViewSchema = object({
28822
+ assignments: array(RecordingDevicePlacementSchema),
28823
+ pins: array(RecordingDevicePinSchema),
28824
+ defaultLocations: record(string(), string())
28825
+ });
28826
+ var RecordingSetDevicePlacementInputSchema = object({
28827
+ deviceId: number().int(),
28828
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28829
+ locationId: string().nullable()
28830
+ });
28831
+ /**
28717
28832
  * Result of locating footage at a wall-clock instant for one device/profile.
28718
28833
  * `segment` carries the covering segment's window; `gap` reports the forward
28719
28834
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -28939,6 +29054,12 @@ method(object({
28939
29054
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
28940
29055
  kind: "mutation",
28941
29056
  auth: "admin"
29057
+ }), method(object({}), RecordingPlacementViewSchema, {
29058
+ kind: "query",
29059
+ auth: "admin"
29060
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29061
+ kind: "mutation",
29062
+ auth: "admin"
28942
29063
  });
28943
29064
  /**
28944
29065
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34008,6 +34129,12 @@ Object.freeze({
34008
34129
  addonId: null,
34009
34130
  access: "delete"
34010
34131
  },
34132
+ "deviceManager.renameLocation": {
34133
+ capName: "device-manager",
34134
+ capScope: "system",
34135
+ addonId: null,
34136
+ access: "create"
34137
+ },
34011
34138
  "deviceManager.runDeviceAction": {
34012
34139
  capName: "device-manager",
34013
34140
  capScope: "system",
@@ -35700,19 +35827,19 @@ Object.freeze({
35700
35827
  addonId: null,
35701
35828
  access: "view"
35702
35829
  },
35703
- "pipelineAnalytics.getGroup": {
35830
+ "pipelineAnalytics.getKeyEvents": {
35704
35831
  capName: "pipeline-analytics",
35705
35832
  capScope: "device",
35706
35833
  addonId: null,
35707
35834
  access: "view"
35708
35835
  },
35709
- "pipelineAnalytics.getKeyEvents": {
35836
+ "pipelineAnalytics.getKeyEventsBatch": {
35710
35837
  capName: "pipeline-analytics",
35711
35838
  capScope: "device",
35712
35839
  addonId: null,
35713
35840
  access: "view"
35714
35841
  },
35715
- "pipelineAnalytics.getKeyEventsBatch": {
35842
+ "pipelineAnalytics.getMediaReclaimStatus": {
35716
35843
  capName: "pipeline-analytics",
35717
35844
  capScope: "device",
35718
35845
  addonId: null,
@@ -35802,12 +35929,6 @@ Object.freeze({
35802
35929
  addonId: null,
35803
35930
  access: "view"
35804
35931
  },
35805
- "pipelineAnalytics.listGroups": {
35806
- capName: "pipeline-analytics",
35807
- capScope: "device",
35808
- addonId: null,
35809
- access: "view"
35810
- },
35811
35932
  "pipelineAnalytics.listOpsLog": {
35812
35933
  capName: "pipeline-analytics",
35813
35934
  capScope: "device",
@@ -35892,6 +36013,12 @@ Object.freeze({
35892
36013
  addonId: null,
35893
36014
  access: "create"
35894
36015
  },
36016
+ "pipelineAnalytics.reclaimDebugMedia": {
36017
+ capName: "pipeline-analytics",
36018
+ capScope: "device",
36019
+ addonId: null,
36020
+ access: "create"
36021
+ },
35895
36022
  "pipelineAnalytics.reconcileFromDisk": {
35896
36023
  capName: "pipeline-analytics",
35897
36024
  capScope: "device",
@@ -36816,6 +36943,12 @@ Object.freeze({
36816
36943
  addonId: null,
36817
36944
  access: "view"
36818
36945
  },
36946
+ "recording.getPlacement": {
36947
+ capName: "recording",
36948
+ capScope: "system",
36949
+ addonId: null,
36950
+ access: "view"
36951
+ },
36819
36952
  "recording.getPlaybackManifest": {
36820
36953
  capName: "recording",
36821
36954
  capScope: "system",
@@ -36942,6 +37075,12 @@ Object.freeze({
36942
37075
  addonId: null,
36943
37076
  access: "create"
36944
37077
  },
37078
+ "recording.setDevicePlacement": {
37079
+ capName: "recording",
37080
+ capScope: "system",
37081
+ addonId: null,
37082
+ access: "create"
37083
+ },
36945
37084
  "recording.startStorageMigrationMove": {
36946
37085
  capName: "recording",
36947
37086
  capScope: "system",
@@ -37386,12 +37525,36 @@ Object.freeze({
37386
37525
  addonId: null,
37387
37526
  access: "create"
37388
37527
  },
37528
+ "storageMigration.cleanupCancel": {
37529
+ capName: "storage-migration",
37530
+ capScope: "system",
37531
+ addonId: null,
37532
+ access: "create"
37533
+ },
37534
+ "storageMigration.cleanupStart": {
37535
+ capName: "storage-migration",
37536
+ capScope: "system",
37537
+ addonId: null,
37538
+ access: "create"
37539
+ },
37540
+ "storageMigration.cleanupStatus": {
37541
+ capName: "storage-migration",
37542
+ capScope: "system",
37543
+ addonId: null,
37544
+ access: "view"
37545
+ },
37389
37546
  "storageMigration.drain": {
37390
37547
  capName: "storage-migration",
37391
37548
  capScope: "system",
37392
37549
  addonId: null,
37393
37550
  access: "create"
37394
37551
  },
37552
+ "storageMigration.history": {
37553
+ capName: "storage-migration",
37554
+ capScope: "system",
37555
+ addonId: null,
37556
+ access: "view"
37557
+ },
37395
37558
  "storageMigration.movers": {
37396
37559
  capName: "storage-migration",
37397
37560
  capScope: "system",
@@ -39388,11 +39551,6 @@ Object.freeze({
39388
39551
  form: "single",
39389
39552
  optional: true
39390
39553
  }],
39391
- "pipelineAnalytics.getGroup": [{
39392
- name: "deviceId",
39393
- form: "single",
39394
- optional: false
39395
- }],
39396
39554
  "pipelineAnalytics.getKeyEvents": [{
39397
39555
  name: "deviceId",
39398
39556
  form: "single",
@@ -39458,11 +39616,6 @@ Object.freeze({
39458
39616
  form: "single",
39459
39617
  optional: false
39460
39618
  }],
39461
- "pipelineAnalytics.listGroups": [{
39462
- name: "deviceIds",
39463
- form: "array",
39464
- optional: false
39465
- }],
39466
39619
  "pipelineAnalytics.listOpsLog": [{
39467
39620
  name: "deviceId",
39468
39621
  form: "single",
@@ -39508,6 +39661,11 @@ Object.freeze({
39508
39661
  form: "single",
39509
39662
  optional: true
39510
39663
  }],
39664
+ "pipelineAnalytics.reclaimDebugMedia": [{
39665
+ name: "deviceIds",
39666
+ form: "array",
39667
+ optional: true
39668
+ }],
39511
39669
  "pipelineAnalytics.reconcileFromDisk": [{
39512
39670
  name: "deviceId",
39513
39671
  form: "single",
@@ -39873,6 +40031,11 @@ Object.freeze({
39873
40031
  form: "single",
39874
40032
  optional: false
39875
40033
  }],
40034
+ "recording.setDevicePlacement": [{
40035
+ name: "deviceId",
40036
+ form: "single",
40037
+ optional: false
40038
+ }],
39876
40039
  "recording.startStorageMigrationMove": [{
39877
40040
  name: "deviceId",
39878
40041
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-wyze",
3
- "version": "0.2.53",
3
+ "version": "0.2.55",
4
4
  "description": "Wyze camera device-provider addon for CamStack — wraps the @apocaliss92/wyze-bridge-js P2P/DTLS client, feeding the stream-broker via the pull-rfc4571 lazy-publish path (a structural twin of addon-provider-reolink)",
5
5
  "keywords": [
6
6
  "camstack",