@camstack/addon-provider-wyze 0.2.53 → 0.2.54

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 +234 -73
  2. package/dist/addon.mjs +234 -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()
@@ -19104,46 +19182,6 @@ var RecentTracksPageSchema = object({
19104
19182
  /** Cursor for the next page, or null when this page is the last. */
19105
19183
  nextCursor: string().nullable()
19106
19184
  });
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
19185
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19148
19186
  var KEY_EVENTS_MAX_LIMIT = 200;
19149
19187
  var KeyEventQueryInput = object({
@@ -19247,9 +19285,7 @@ var TrackCascadeCountsSchema = object({
19247
19285
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19248
19286
  plates: number().int(),
19249
19287
  /** 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()
19288
+ embeddings: number().int()
19253
19289
  });
19254
19290
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19255
19291
  var DiskReconcileCountsSchema = object({
@@ -19419,6 +19455,47 @@ var RebuildStatusSchema = object({
19419
19455
  /** Present when the pass ended by throwing. */
19420
19456
  error: string().nullable()
19421
19457
  });
19458
+ /**
19459
+ * Acknowledgement that a debug-media reclaim STARTED.
19460
+ *
19461
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19462
+ * it runs detached and this returns immediately. Awaiting it is how the
19463
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19464
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19465
+ */
19466
+ var MediaReclaimStartResultSchema = object({
19467
+ started: boolean(),
19468
+ /** True when a pass was already running; the new request is ignored. */
19469
+ alreadyRunning: boolean()
19470
+ });
19471
+ var MediaReclaimInputSchema = object({
19472
+ mode: _enum(["report", "reclaim"]).default("report"),
19473
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19474
+ deviceIds: array(number().int()).min(1).optional(),
19475
+ restart: boolean().optional(),
19476
+ pageSize: number().int().min(50).max(5e3).optional(),
19477
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19478
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19479
+ maxBytesPerRun: number().int().min(1).optional(),
19480
+ budgetMinutes: number().int().min(1).max(720).optional(),
19481
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19482
+ graceMinutes: number().int().min(1).max(10080).optional()
19483
+ });
19484
+ var MediaReclaimStatusSchema = object({
19485
+ running: boolean(),
19486
+ mode: _enum(["report", "reclaim"]).nullable(),
19487
+ totalExamined: number(),
19488
+ totalEligible: number(),
19489
+ totalReclaimed: number(),
19490
+ totalBytesReclaimed: number(),
19491
+ totalRefused: number(),
19492
+ /** Device+scope windows finished in this pass. */
19493
+ devicesDone: number(),
19494
+ complete: boolean().nullable(),
19495
+ startedAtMs: number().nullable(),
19496
+ finishedAtMs: number().nullable(),
19497
+ error: string().nullable()
19498
+ });
19422
19499
  var ReplayFrameInputSchema = object({
19423
19500
  timestamp: number(),
19424
19501
  frame: PipelineRunResultBridge
@@ -19457,10 +19534,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19457
19534
  * stationary registry). Default false: the timeline lists passages,
19458
19535
  * not parking records (operator decision, 2026-08-15). */
19459
19536
  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(), {
19537
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19464
19538
  kind: "mutation",
19465
19539
  auth: "admin"
19466
19540
  }), 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 +19634,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19560
19634
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19561
19635
  kind: "query",
19562
19636
  auth: "admin"
19637
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19638
+ kind: "mutation",
19639
+ auth: "admin"
19640
+ }), method(object({}), MediaReclaimStatusSchema, {
19641
+ kind: "query",
19642
+ auth: "admin"
19563
19643
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19564
19644
  kind: "query",
19565
19645
  auth: "admin"
@@ -21634,7 +21714,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21634
21714
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21635
21715
  kind: "mutation",
21636
21716
  auth: "admin"
21637
- });
21717
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21718
+ kind: "mutation",
21719
+ auth: "admin"
21720
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21721
+ kind: "mutation",
21722
+ auth: "admin"
21723
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21638
21724
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21639
21725
  providerId: string().min(1),
21640
21726
  displayName: string().min(1),
@@ -28735,6 +28821,33 @@ var RecordingRebalanceInputSchema = object({
28735
28821
  minMoveGb: number().min(0).optional()
28736
28822
  });
28737
28823
  /**
28824
+ * Operator-facing placement of one camera onto a recordings location.
28825
+ *
28826
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28827
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28828
+ * currently write — the plan, which may disagree with the pin when Auto.
28829
+ */
28830
+ var RecordingDevicePlacementSchema = object({
28831
+ deviceId: number().int(),
28832
+ profile: string(),
28833
+ locationId: string()
28834
+ });
28835
+ var RecordingDevicePinSchema = object({
28836
+ deviceId: number().int(),
28837
+ /** Recordings-class location this camera is pinned to. */
28838
+ locationId: string()
28839
+ });
28840
+ var RecordingPlacementViewSchema = object({
28841
+ assignments: array(RecordingDevicePlacementSchema),
28842
+ pins: array(RecordingDevicePinSchema),
28843
+ defaultLocations: record(string(), string())
28844
+ });
28845
+ var RecordingSetDevicePlacementInputSchema = object({
28846
+ deviceId: number().int(),
28847
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28848
+ locationId: string().nullable()
28849
+ });
28850
+ /**
28738
28851
  * Result of locating footage at a wall-clock instant for one device/profile.
28739
28852
  * `segment` carries the covering segment's window; `gap` reports the forward
28740
28853
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -28960,6 +29073,12 @@ method(object({
28960
29073
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
28961
29074
  kind: "mutation",
28962
29075
  auth: "admin"
29076
+ }), method(object({}), RecordingPlacementViewSchema, {
29077
+ kind: "query",
29078
+ auth: "admin"
29079
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29080
+ kind: "mutation",
29081
+ auth: "admin"
28963
29082
  });
28964
29083
  /**
28965
29084
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34029,6 +34148,12 @@ Object.freeze({
34029
34148
  addonId: null,
34030
34149
  access: "delete"
34031
34150
  },
34151
+ "deviceManager.renameLocation": {
34152
+ capName: "device-manager",
34153
+ capScope: "system",
34154
+ addonId: null,
34155
+ access: "create"
34156
+ },
34032
34157
  "deviceManager.runDeviceAction": {
34033
34158
  capName: "device-manager",
34034
34159
  capScope: "system",
@@ -35721,19 +35846,19 @@ Object.freeze({
35721
35846
  addonId: null,
35722
35847
  access: "view"
35723
35848
  },
35724
- "pipelineAnalytics.getGroup": {
35849
+ "pipelineAnalytics.getKeyEvents": {
35725
35850
  capName: "pipeline-analytics",
35726
35851
  capScope: "device",
35727
35852
  addonId: null,
35728
35853
  access: "view"
35729
35854
  },
35730
- "pipelineAnalytics.getKeyEvents": {
35855
+ "pipelineAnalytics.getKeyEventsBatch": {
35731
35856
  capName: "pipeline-analytics",
35732
35857
  capScope: "device",
35733
35858
  addonId: null,
35734
35859
  access: "view"
35735
35860
  },
35736
- "pipelineAnalytics.getKeyEventsBatch": {
35861
+ "pipelineAnalytics.getMediaReclaimStatus": {
35737
35862
  capName: "pipeline-analytics",
35738
35863
  capScope: "device",
35739
35864
  addonId: null,
@@ -35823,12 +35948,6 @@ Object.freeze({
35823
35948
  addonId: null,
35824
35949
  access: "view"
35825
35950
  },
35826
- "pipelineAnalytics.listGroups": {
35827
- capName: "pipeline-analytics",
35828
- capScope: "device",
35829
- addonId: null,
35830
- access: "view"
35831
- },
35832
35951
  "pipelineAnalytics.listOpsLog": {
35833
35952
  capName: "pipeline-analytics",
35834
35953
  capScope: "device",
@@ -35913,6 +36032,12 @@ Object.freeze({
35913
36032
  addonId: null,
35914
36033
  access: "create"
35915
36034
  },
36035
+ "pipelineAnalytics.reclaimDebugMedia": {
36036
+ capName: "pipeline-analytics",
36037
+ capScope: "device",
36038
+ addonId: null,
36039
+ access: "create"
36040
+ },
35916
36041
  "pipelineAnalytics.reconcileFromDisk": {
35917
36042
  capName: "pipeline-analytics",
35918
36043
  capScope: "device",
@@ -36837,6 +36962,12 @@ Object.freeze({
36837
36962
  addonId: null,
36838
36963
  access: "view"
36839
36964
  },
36965
+ "recording.getPlacement": {
36966
+ capName: "recording",
36967
+ capScope: "system",
36968
+ addonId: null,
36969
+ access: "view"
36970
+ },
36840
36971
  "recording.getPlaybackManifest": {
36841
36972
  capName: "recording",
36842
36973
  capScope: "system",
@@ -36963,6 +37094,12 @@ Object.freeze({
36963
37094
  addonId: null,
36964
37095
  access: "create"
36965
37096
  },
37097
+ "recording.setDevicePlacement": {
37098
+ capName: "recording",
37099
+ capScope: "system",
37100
+ addonId: null,
37101
+ access: "create"
37102
+ },
36966
37103
  "recording.startStorageMigrationMove": {
36967
37104
  capName: "recording",
36968
37105
  capScope: "system",
@@ -37407,12 +37544,36 @@ Object.freeze({
37407
37544
  addonId: null,
37408
37545
  access: "create"
37409
37546
  },
37547
+ "storageMigration.cleanupCancel": {
37548
+ capName: "storage-migration",
37549
+ capScope: "system",
37550
+ addonId: null,
37551
+ access: "create"
37552
+ },
37553
+ "storageMigration.cleanupStart": {
37554
+ capName: "storage-migration",
37555
+ capScope: "system",
37556
+ addonId: null,
37557
+ access: "create"
37558
+ },
37559
+ "storageMigration.cleanupStatus": {
37560
+ capName: "storage-migration",
37561
+ capScope: "system",
37562
+ addonId: null,
37563
+ access: "view"
37564
+ },
37410
37565
  "storageMigration.drain": {
37411
37566
  capName: "storage-migration",
37412
37567
  capScope: "system",
37413
37568
  addonId: null,
37414
37569
  access: "create"
37415
37570
  },
37571
+ "storageMigration.history": {
37572
+ capName: "storage-migration",
37573
+ capScope: "system",
37574
+ addonId: null,
37575
+ access: "view"
37576
+ },
37416
37577
  "storageMigration.movers": {
37417
37578
  capName: "storage-migration",
37418
37579
  capScope: "system",
@@ -39409,11 +39570,6 @@ Object.freeze({
39409
39570
  form: "single",
39410
39571
  optional: true
39411
39572
  }],
39412
- "pipelineAnalytics.getGroup": [{
39413
- name: "deviceId",
39414
- form: "single",
39415
- optional: false
39416
- }],
39417
39573
  "pipelineAnalytics.getKeyEvents": [{
39418
39574
  name: "deviceId",
39419
39575
  form: "single",
@@ -39479,11 +39635,6 @@ Object.freeze({
39479
39635
  form: "single",
39480
39636
  optional: false
39481
39637
  }],
39482
- "pipelineAnalytics.listGroups": [{
39483
- name: "deviceIds",
39484
- form: "array",
39485
- optional: false
39486
- }],
39487
39638
  "pipelineAnalytics.listOpsLog": [{
39488
39639
  name: "deviceId",
39489
39640
  form: "single",
@@ -39529,6 +39680,11 @@ Object.freeze({
39529
39680
  form: "single",
39530
39681
  optional: true
39531
39682
  }],
39683
+ "pipelineAnalytics.reclaimDebugMedia": [{
39684
+ name: "deviceIds",
39685
+ form: "array",
39686
+ optional: true
39687
+ }],
39532
39688
  "pipelineAnalytics.reconcileFromDisk": [{
39533
39689
  name: "deviceId",
39534
39690
  form: "single",
@@ -39894,6 +40050,11 @@ Object.freeze({
39894
40050
  form: "single",
39895
40051
  optional: false
39896
40052
  }],
40053
+ "recording.setDevicePlacement": [{
40054
+ name: "deviceId",
40055
+ form: "single",
40056
+ optional: false
40057
+ }],
39897
40058
  "recording.startStorageMigrationMove": [{
39898
40059
  name: "deviceId",
39899
40060
  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()
@@ -19083,46 +19161,6 @@ var RecentTracksPageSchema = object({
19083
19161
  /** Cursor for the next page, or null when this page is the last. */
19084
19162
  nextCursor: string().nullable()
19085
19163
  });
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
19164
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19127
19165
  var KEY_EVENTS_MAX_LIMIT = 200;
19128
19166
  var KeyEventQueryInput = object({
@@ -19226,9 +19264,7 @@ var TrackCascadeCountsSchema = object({
19226
19264
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19227
19265
  plates: number().int(),
19228
19266
  /** 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()
19267
+ embeddings: number().int()
19232
19268
  });
19233
19269
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19234
19270
  var DiskReconcileCountsSchema = object({
@@ -19398,6 +19434,47 @@ var RebuildStatusSchema = object({
19398
19434
  /** Present when the pass ended by throwing. */
19399
19435
  error: string().nullable()
19400
19436
  });
19437
+ /**
19438
+ * Acknowledgement that a debug-media reclaim STARTED.
19439
+ *
19440
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19441
+ * it runs detached and this returns immediately. Awaiting it is how the
19442
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19443
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19444
+ */
19445
+ var MediaReclaimStartResultSchema = object({
19446
+ started: boolean(),
19447
+ /** True when a pass was already running; the new request is ignored. */
19448
+ alreadyRunning: boolean()
19449
+ });
19450
+ var MediaReclaimInputSchema = object({
19451
+ mode: _enum(["report", "reclaim"]).default("report"),
19452
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19453
+ deviceIds: array(number().int()).min(1).optional(),
19454
+ restart: boolean().optional(),
19455
+ pageSize: number().int().min(50).max(5e3).optional(),
19456
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19457
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19458
+ maxBytesPerRun: number().int().min(1).optional(),
19459
+ budgetMinutes: number().int().min(1).max(720).optional(),
19460
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19461
+ graceMinutes: number().int().min(1).max(10080).optional()
19462
+ });
19463
+ var MediaReclaimStatusSchema = object({
19464
+ running: boolean(),
19465
+ mode: _enum(["report", "reclaim"]).nullable(),
19466
+ totalExamined: number(),
19467
+ totalEligible: number(),
19468
+ totalReclaimed: number(),
19469
+ totalBytesReclaimed: number(),
19470
+ totalRefused: number(),
19471
+ /** Device+scope windows finished in this pass. */
19472
+ devicesDone: number(),
19473
+ complete: boolean().nullable(),
19474
+ startedAtMs: number().nullable(),
19475
+ finishedAtMs: number().nullable(),
19476
+ error: string().nullable()
19477
+ });
19401
19478
  var ReplayFrameInputSchema = object({
19402
19479
  timestamp: number(),
19403
19480
  frame: PipelineRunResultBridge
@@ -19436,10 +19513,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19436
19513
  * stationary registry). Default false: the timeline lists passages,
19437
19514
  * not parking records (operator decision, 2026-08-15). */
19438
19515
  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(), {
19516
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19443
19517
  kind: "mutation",
19444
19518
  auth: "admin"
19445
19519
  }), 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 +19613,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19539
19613
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19540
19614
  kind: "query",
19541
19615
  auth: "admin"
19616
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19617
+ kind: "mutation",
19618
+ auth: "admin"
19619
+ }), method(object({}), MediaReclaimStatusSchema, {
19620
+ kind: "query",
19621
+ auth: "admin"
19542
19622
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19543
19623
  kind: "query",
19544
19624
  auth: "admin"
@@ -21613,7 +21693,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21613
21693
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21614
21694
  kind: "mutation",
21615
21695
  auth: "admin"
21616
- });
21696
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21697
+ kind: "mutation",
21698
+ auth: "admin"
21699
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21700
+ kind: "mutation",
21701
+ auth: "admin"
21702
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21617
21703
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21618
21704
  providerId: string().min(1),
21619
21705
  displayName: string().min(1),
@@ -28714,6 +28800,33 @@ var RecordingRebalanceInputSchema = object({
28714
28800
  minMoveGb: number().min(0).optional()
28715
28801
  });
28716
28802
  /**
28803
+ * Operator-facing placement of one camera onto a recordings location.
28804
+ *
28805
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28806
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28807
+ * currently write — the plan, which may disagree with the pin when Auto.
28808
+ */
28809
+ var RecordingDevicePlacementSchema = object({
28810
+ deviceId: number().int(),
28811
+ profile: string(),
28812
+ locationId: string()
28813
+ });
28814
+ var RecordingDevicePinSchema = object({
28815
+ deviceId: number().int(),
28816
+ /** Recordings-class location this camera is pinned to. */
28817
+ locationId: string()
28818
+ });
28819
+ var RecordingPlacementViewSchema = object({
28820
+ assignments: array(RecordingDevicePlacementSchema),
28821
+ pins: array(RecordingDevicePinSchema),
28822
+ defaultLocations: record(string(), string())
28823
+ });
28824
+ var RecordingSetDevicePlacementInputSchema = object({
28825
+ deviceId: number().int(),
28826
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28827
+ locationId: string().nullable()
28828
+ });
28829
+ /**
28717
28830
  * Result of locating footage at a wall-clock instant for one device/profile.
28718
28831
  * `segment` carries the covering segment's window; `gap` reports the forward
28719
28832
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -28939,6 +29052,12 @@ method(object({
28939
29052
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
28940
29053
  kind: "mutation",
28941
29054
  auth: "admin"
29055
+ }), method(object({}), RecordingPlacementViewSchema, {
29056
+ kind: "query",
29057
+ auth: "admin"
29058
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29059
+ kind: "mutation",
29060
+ auth: "admin"
28942
29061
  });
28943
29062
  /**
28944
29063
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34008,6 +34127,12 @@ Object.freeze({
34008
34127
  addonId: null,
34009
34128
  access: "delete"
34010
34129
  },
34130
+ "deviceManager.renameLocation": {
34131
+ capName: "device-manager",
34132
+ capScope: "system",
34133
+ addonId: null,
34134
+ access: "create"
34135
+ },
34011
34136
  "deviceManager.runDeviceAction": {
34012
34137
  capName: "device-manager",
34013
34138
  capScope: "system",
@@ -35700,19 +35825,19 @@ Object.freeze({
35700
35825
  addonId: null,
35701
35826
  access: "view"
35702
35827
  },
35703
- "pipelineAnalytics.getGroup": {
35828
+ "pipelineAnalytics.getKeyEvents": {
35704
35829
  capName: "pipeline-analytics",
35705
35830
  capScope: "device",
35706
35831
  addonId: null,
35707
35832
  access: "view"
35708
35833
  },
35709
- "pipelineAnalytics.getKeyEvents": {
35834
+ "pipelineAnalytics.getKeyEventsBatch": {
35710
35835
  capName: "pipeline-analytics",
35711
35836
  capScope: "device",
35712
35837
  addonId: null,
35713
35838
  access: "view"
35714
35839
  },
35715
- "pipelineAnalytics.getKeyEventsBatch": {
35840
+ "pipelineAnalytics.getMediaReclaimStatus": {
35716
35841
  capName: "pipeline-analytics",
35717
35842
  capScope: "device",
35718
35843
  addonId: null,
@@ -35802,12 +35927,6 @@ Object.freeze({
35802
35927
  addonId: null,
35803
35928
  access: "view"
35804
35929
  },
35805
- "pipelineAnalytics.listGroups": {
35806
- capName: "pipeline-analytics",
35807
- capScope: "device",
35808
- addonId: null,
35809
- access: "view"
35810
- },
35811
35930
  "pipelineAnalytics.listOpsLog": {
35812
35931
  capName: "pipeline-analytics",
35813
35932
  capScope: "device",
@@ -35892,6 +36011,12 @@ Object.freeze({
35892
36011
  addonId: null,
35893
36012
  access: "create"
35894
36013
  },
36014
+ "pipelineAnalytics.reclaimDebugMedia": {
36015
+ capName: "pipeline-analytics",
36016
+ capScope: "device",
36017
+ addonId: null,
36018
+ access: "create"
36019
+ },
35895
36020
  "pipelineAnalytics.reconcileFromDisk": {
35896
36021
  capName: "pipeline-analytics",
35897
36022
  capScope: "device",
@@ -36816,6 +36941,12 @@ Object.freeze({
36816
36941
  addonId: null,
36817
36942
  access: "view"
36818
36943
  },
36944
+ "recording.getPlacement": {
36945
+ capName: "recording",
36946
+ capScope: "system",
36947
+ addonId: null,
36948
+ access: "view"
36949
+ },
36819
36950
  "recording.getPlaybackManifest": {
36820
36951
  capName: "recording",
36821
36952
  capScope: "system",
@@ -36942,6 +37073,12 @@ Object.freeze({
36942
37073
  addonId: null,
36943
37074
  access: "create"
36944
37075
  },
37076
+ "recording.setDevicePlacement": {
37077
+ capName: "recording",
37078
+ capScope: "system",
37079
+ addonId: null,
37080
+ access: "create"
37081
+ },
36945
37082
  "recording.startStorageMigrationMove": {
36946
37083
  capName: "recording",
36947
37084
  capScope: "system",
@@ -37386,12 +37523,36 @@ Object.freeze({
37386
37523
  addonId: null,
37387
37524
  access: "create"
37388
37525
  },
37526
+ "storageMigration.cleanupCancel": {
37527
+ capName: "storage-migration",
37528
+ capScope: "system",
37529
+ addonId: null,
37530
+ access: "create"
37531
+ },
37532
+ "storageMigration.cleanupStart": {
37533
+ capName: "storage-migration",
37534
+ capScope: "system",
37535
+ addonId: null,
37536
+ access: "create"
37537
+ },
37538
+ "storageMigration.cleanupStatus": {
37539
+ capName: "storage-migration",
37540
+ capScope: "system",
37541
+ addonId: null,
37542
+ access: "view"
37543
+ },
37389
37544
  "storageMigration.drain": {
37390
37545
  capName: "storage-migration",
37391
37546
  capScope: "system",
37392
37547
  addonId: null,
37393
37548
  access: "create"
37394
37549
  },
37550
+ "storageMigration.history": {
37551
+ capName: "storage-migration",
37552
+ capScope: "system",
37553
+ addonId: null,
37554
+ access: "view"
37555
+ },
37395
37556
  "storageMigration.movers": {
37396
37557
  capName: "storage-migration",
37397
37558
  capScope: "system",
@@ -39388,11 +39549,6 @@ Object.freeze({
39388
39549
  form: "single",
39389
39550
  optional: true
39390
39551
  }],
39391
- "pipelineAnalytics.getGroup": [{
39392
- name: "deviceId",
39393
- form: "single",
39394
- optional: false
39395
- }],
39396
39552
  "pipelineAnalytics.getKeyEvents": [{
39397
39553
  name: "deviceId",
39398
39554
  form: "single",
@@ -39458,11 +39614,6 @@ Object.freeze({
39458
39614
  form: "single",
39459
39615
  optional: false
39460
39616
  }],
39461
- "pipelineAnalytics.listGroups": [{
39462
- name: "deviceIds",
39463
- form: "array",
39464
- optional: false
39465
- }],
39466
39617
  "pipelineAnalytics.listOpsLog": [{
39467
39618
  name: "deviceId",
39468
39619
  form: "single",
@@ -39508,6 +39659,11 @@ Object.freeze({
39508
39659
  form: "single",
39509
39660
  optional: true
39510
39661
  }],
39662
+ "pipelineAnalytics.reclaimDebugMedia": [{
39663
+ name: "deviceIds",
39664
+ form: "array",
39665
+ optional: true
39666
+ }],
39511
39667
  "pipelineAnalytics.reconcileFromDisk": [{
39512
39668
  name: "deviceId",
39513
39669
  form: "single",
@@ -39873,6 +40029,11 @@ Object.freeze({
39873
40029
  form: "single",
39874
40030
  optional: false
39875
40031
  }],
40032
+ "recording.setDevicePlacement": [{
40033
+ name: "deviceId",
40034
+ form: "single",
40035
+ optional: false
40036
+ }],
39876
40037
  "recording.startStorageMigrationMove": [{
39877
40038
  name: "deviceId",
39878
40039
  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.54",
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",