@camstack/addon-provider-dreo 0.2.49 → 0.2.51

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
@@ -8132,6 +8132,13 @@ var MediaRelocateModeSchema = _enum([
8132
8132
  ]);
8133
8133
  var RelocateMediaInputSchema = object({
8134
8134
  toLocationId: string(),
8135
+ /**
8136
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8137
+ * every row that is not already on `toLocationId` (the historical
8138
+ * behaviour). A named source is what a from→to migration needs: without it
8139
+ * "move events off disk 2" also emptied disk 1.
8140
+ */
8141
+ fromLocationId: string().optional(),
8135
8142
  throttleMbps: number().min(1).max(1e3).optional(),
8136
8143
  /** Omitted = `move`, the pre-existing behaviour. */
8137
8144
  mode: MediaRelocateModeSchema.optional()
@@ -8199,6 +8206,19 @@ var StorageMigrationDestinationsSchema = object({
8199
8206
  galleryMedia: string().min(1).optional()
8200
8207
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8201
8208
  /**
8209
+ * Optional named source per class. Omitted = the class's current default
8210
+ * (the historical behaviour). A named source that is NOT the default is a
8211
+ * drain of that disk: bytes move, the default stays, and the source is
8212
+ * disabled when the move finishes.
8213
+ */
8214
+ var StorageMigrationSourcesSchema = object({
8215
+ recordings: string().min(1).optional(),
8216
+ recordingsLow: string().min(1).optional(),
8217
+ eventMedia: string().min(1).optional(),
8218
+ backups: string().min(1).optional(),
8219
+ galleryMedia: string().min(1).optional()
8220
+ }).optional();
8221
+ /**
8202
8222
  * How a migration sequences the cutover against the byte move.
8203
8223
  *
8204
8224
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8220,6 +8240,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8220
8240
  /** Shared input for planning and starting an orchestrated storage migration. */
8221
8241
  var StorageMigrationInputSchema = object({
8222
8242
  destinations: StorageMigrationDestinationsSchema,
8243
+ /** Omitted = each class's current default. */
8244
+ sources: StorageMigrationSourcesSchema,
8223
8245
  throttleMbps: number().min(1).max(1e3).optional(),
8224
8246
  /** Omitted = `blocking`, which stays the default. */
8225
8247
  mode: StorageMigrationModeSchema.optional()
@@ -8299,6 +8321,13 @@ var StorageMigrationMoveSchema = object({
8299
8321
  storageClass: StorageMigrationClassSchema,
8300
8322
  fromLocationId: string(),
8301
8323
  toLocationId: string(),
8324
+ /**
8325
+ * True when `from` was NOT the class default at plan time. The move still
8326
+ * copies bytes, but the default is left alone and the source is disabled
8327
+ * once the copy verifies. Absent on jobs planned before this field existed
8328
+ * — those jobs always repointed, which is `false`.
8329
+ */
8330
+ freezeSource: boolean().optional(),
8302
8331
  moverJobId: string().nullable(),
8303
8332
  state: RelocateJobStateSchema.nullable(),
8304
8333
  error: string().nullable(),
@@ -8312,6 +8341,7 @@ var StorageMigrationJobSchema = object({
8312
8341
  * can tell a seconds-long cutover from a thirty-hour one. */
8313
8342
  mode: StorageMigrationModeSchema,
8314
8343
  destinations: StorageMigrationDestinationsSchema,
8344
+ sources: StorageMigrationSourcesSchema,
8315
8345
  throttleMbps: number(),
8316
8346
  moves: array(StorageMigrationMoveSchema),
8317
8347
  pauseLeaseId: string().nullable(),
@@ -8337,6 +8367,7 @@ var StorageMigrationFindingSchema = object({
8337
8367
  });
8338
8368
  var StorageMigrationPlanSchema = object({
8339
8369
  destinations: StorageMigrationDestinationsSchema,
8370
+ sources: StorageMigrationSourcesSchema,
8340
8371
  /** The mode this plan was built for. A plan is only valid for its mode: the
8341
8372
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8342
8373
  * it. */
@@ -8344,7 +8375,8 @@ var StorageMigrationPlanSchema = object({
8344
8375
  moves: array(object({
8345
8376
  storageClass: StorageMigrationClassSchema,
8346
8377
  fromLocationId: string(),
8347
- toLocationId: string()
8378
+ toLocationId: string(),
8379
+ freezeSource: boolean().optional()
8348
8380
  })),
8349
8381
  findings: array(StorageMigrationFindingSchema)
8350
8382
  });
@@ -8522,10 +8554,51 @@ var LedgerWalkReportSchema = object({
8522
8554
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8523
8555
  var RelocatableMediaCountInputSchema = object({
8524
8556
  toLocationId: string().min(1),
8557
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8558
+ fromLocationId: string().optional(),
8525
8559
  /** Omitted = `move`. */
8526
8560
  mode: MediaRelocateModeSchema.optional()
8527
8561
  });
8528
8562
  /**
8563
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8564
+ * ghost ledger entries on frozen footage locations.
8565
+ *
8566
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8567
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8568
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8569
+ * with no operator-visible status.
8570
+ */
8571
+ var StorageCleanupPhaseSchema = _enum([
8572
+ "orphans",
8573
+ "debug-media",
8574
+ "ghost-ledger",
8575
+ "done",
8576
+ "failed",
8577
+ "cancelled"
8578
+ ]);
8579
+ var StorageCleanupInputSchema = object({
8580
+ /** Also walk motion stills / track filmstrips. Off by default. */
8581
+ includeDebugMedia: boolean().optional() });
8582
+ var StorageCleanupJobSchema = object({
8583
+ jobId: string(),
8584
+ phase: StorageCleanupPhaseSchema,
8585
+ includeDebugMedia: boolean(),
8586
+ orphansReclaimed: number().int().nonnegative(),
8587
+ orphanBytesReclaimed: number().int().nonnegative(),
8588
+ debugMediaReclaimed: number().int().nonnegative(),
8589
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8590
+ ghostsForgotten: number().int().nonnegative(),
8591
+ ghostBytesForgotten: number().int().nonnegative(),
8592
+ /** Short operator-facing line: current collection, pass, or location. */
8593
+ detail: string().nullable(),
8594
+ cancelRequested: boolean(),
8595
+ startedAt: number(),
8596
+ updatedAt: number(),
8597
+ finishedAt: number().nullable(),
8598
+ error: string().nullable()
8599
+ });
8600
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8601
+ /**
8529
8602
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8530
8603
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8531
8604
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8553,11 +8626,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8553
8626
  * The default location for a type uses `id === <type>:default` by
8554
8627
  * convention (the bare type ref like `'backups'` resolves to it).
8555
8628
  *
8556
- * `isSystem: true` marks a location as orchestrator-seeded and
8557
- * undeletable. The bootstrap-installed defaults (one per type) carry
8558
- * this flag; operator-added locations don't. Editing the config of
8559
- * a system location is allowed (path migration, provider swap) but
8560
- * deleting it is rejected at the cap level.
8629
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8630
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8631
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8632
+ * / last-enabled, not on this bit.
8561
8633
  */
8562
8634
  var StorageLocationSchema = object({
8563
8635
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13100,6 +13172,12 @@ method(object({
13100
13172
  }), _void(), {
13101
13173
  kind: "mutation",
13102
13174
  auth: "admin"
13175
+ }), method(object({
13176
+ from: string(),
13177
+ to: string()
13178
+ }), object({ moved: number() }), {
13179
+ kind: "mutation",
13180
+ auth: "admin"
13103
13181
  }), method(object({
13104
13182
  deviceId: number(),
13105
13183
  disabled: boolean()
@@ -15850,6 +15928,8 @@ var NcSystemEventKindSchema = _enum([
15850
15928
  "device-offline",
15851
15929
  "device-disabled",
15852
15930
  "device-enabled",
15931
+ "device-battery-low",
15932
+ "device-battery-normal",
15853
15933
  "stream-online",
15854
15934
  "stream-offline",
15855
15935
  "node-online",
@@ -19108,46 +19188,6 @@ var RecentTracksPageSchema = object({
19108
19188
  /** Cursor for the next page, or null when this page is the last. */
19109
19189
  nextCursor: string().nullable()
19110
19190
  });
19111
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19112
- var LIST_GROUPS_MAX_LIMIT = 100;
19113
- var AnalyticsGroupRecordSchema = object({
19114
- id: string(),
19115
- deviceId: number().int(),
19116
- openedAt: number().int(),
19117
- closedAt: number().int(),
19118
- timestamp: number().int(),
19119
- memberCount: number().int(),
19120
- memberTrackIds: array(string()).readonly(),
19121
- className: string(),
19122
- classes: array(string()).readonly(),
19123
- /** Relative event-media path, or null when the group has no picture yet. */
19124
- mediaUrl: string().nullable(),
19125
- singleton: boolean()
19126
- });
19127
- var AnalyticsGroupMemberSchema = object({
19128
- trackId: string(),
19129
- deviceId: number().int(),
19130
- className: string(),
19131
- firstSeen: number().int(),
19132
- lastSeen: number().int(),
19133
- mediaUrl: string().nullable()
19134
- });
19135
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19136
- var ListGroupsQueryInput = object({
19137
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19138
- deviceIds: array(number()),
19139
- /** Window lower bound on `closedAt` (inclusive). */
19140
- since: number().optional(),
19141
- /** Window upper bound on `openedAt` (inclusive). */
19142
- until: number().optional(),
19143
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19144
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19145
- cursor: string().optional()
19146
- });
19147
- var ListGroupsPageSchema = object({
19148
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19149
- nextCursor: string().nullable()
19150
- });
19151
19191
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19152
19192
  var KEY_EVENTS_MAX_LIMIT = 200;
19153
19193
  var KeyEventQueryInput = object({
@@ -19251,9 +19291,7 @@ var TrackCascadeCountsSchema = object({
19251
19291
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19252
19292
  plates: number().int(),
19253
19293
  /** Per-track CLIP search vectors removed (best-effort). */
19254
- embeddings: number().int(),
19255
- /** Group membership + group rows removed with their last member (best-effort). */
19256
- groups: number().int()
19294
+ embeddings: number().int()
19257
19295
  });
19258
19296
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19259
19297
  var DiskReconcileCountsSchema = object({
@@ -19423,6 +19461,47 @@ var RebuildStatusSchema = object({
19423
19461
  /** Present when the pass ended by throwing. */
19424
19462
  error: string().nullable()
19425
19463
  });
19464
+ /**
19465
+ * Acknowledgement that a debug-media reclaim STARTED.
19466
+ *
19467
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19468
+ * it runs detached and this returns immediately. Awaiting it is how the
19469
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19470
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19471
+ */
19472
+ var MediaReclaimStartResultSchema = object({
19473
+ started: boolean(),
19474
+ /** True when a pass was already running; the new request is ignored. */
19475
+ alreadyRunning: boolean()
19476
+ });
19477
+ var MediaReclaimInputSchema = object({
19478
+ mode: _enum(["report", "reclaim"]).default("report"),
19479
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19480
+ deviceIds: array(number().int()).min(1).optional(),
19481
+ restart: boolean().optional(),
19482
+ pageSize: number().int().min(50).max(5e3).optional(),
19483
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19484
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19485
+ maxBytesPerRun: number().int().min(1).optional(),
19486
+ budgetMinutes: number().int().min(1).max(720).optional(),
19487
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19488
+ graceMinutes: number().int().min(1).max(10080).optional()
19489
+ });
19490
+ var MediaReclaimStatusSchema = object({
19491
+ running: boolean(),
19492
+ mode: _enum(["report", "reclaim"]).nullable(),
19493
+ totalExamined: number(),
19494
+ totalEligible: number(),
19495
+ totalReclaimed: number(),
19496
+ totalBytesReclaimed: number(),
19497
+ totalRefused: number(),
19498
+ /** Device+scope windows finished in this pass. */
19499
+ devicesDone: number(),
19500
+ complete: boolean().nullable(),
19501
+ startedAtMs: number().nullable(),
19502
+ finishedAtMs: number().nullable(),
19503
+ error: string().nullable()
19504
+ });
19426
19505
  var ReplayFrameInputSchema = object({
19427
19506
  timestamp: number(),
19428
19507
  frame: PipelineRunResultBridge
@@ -19461,10 +19540,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19461
19540
  * stationary registry). Default false: the timeline lists passages,
19462
19541
  * not parking records (operator decision, 2026-08-15). */
19463
19542
  includeStationary: boolean().optional()
19464
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19465
- deviceId: number(),
19466
- groupId: string().min(1)
19467
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19543
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19468
19544
  kind: "mutation",
19469
19545
  auth: "admin"
19470
19546
  }), 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({
@@ -19564,6 +19640,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19564
19640
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19565
19641
  kind: "query",
19566
19642
  auth: "admin"
19643
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19644
+ kind: "mutation",
19645
+ auth: "admin"
19646
+ }), method(object({}), MediaReclaimStatusSchema, {
19647
+ kind: "query",
19648
+ auth: "admin"
19567
19649
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19568
19650
  kind: "query",
19569
19651
  auth: "admin"
@@ -21534,7 +21616,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21534
21616
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21535
21617
  kind: "mutation",
21536
21618
  auth: "admin"
21537
- });
21619
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21620
+ kind: "mutation",
21621
+ auth: "admin"
21622
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21623
+ kind: "mutation",
21624
+ auth: "admin"
21625
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21538
21626
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21539
21627
  providerId: string().min(1),
21540
21628
  displayName: string().min(1),
@@ -28635,6 +28723,33 @@ var RecordingRebalanceInputSchema = object({
28635
28723
  minMoveGb: number().min(0).optional()
28636
28724
  });
28637
28725
  /**
28726
+ * Operator-facing placement of one camera onto a recordings location.
28727
+ *
28728
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28729
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28730
+ * currently write — the plan, which may disagree with the pin when Auto.
28731
+ */
28732
+ var RecordingDevicePlacementSchema = object({
28733
+ deviceId: number().int(),
28734
+ profile: string(),
28735
+ locationId: string()
28736
+ });
28737
+ var RecordingDevicePinSchema = object({
28738
+ deviceId: number().int(),
28739
+ /** Recordings-class location this camera is pinned to. */
28740
+ locationId: string()
28741
+ });
28742
+ var RecordingPlacementViewSchema = object({
28743
+ assignments: array(RecordingDevicePlacementSchema),
28744
+ pins: array(RecordingDevicePinSchema),
28745
+ defaultLocations: record(string(), string())
28746
+ });
28747
+ var RecordingSetDevicePlacementInputSchema = object({
28748
+ deviceId: number().int(),
28749
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28750
+ locationId: string().nullable()
28751
+ });
28752
+ /**
28638
28753
  * Result of locating footage at a wall-clock instant for one device/profile.
28639
28754
  * `segment` carries the covering segment's window; `gap` reports the forward
28640
28755
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -28860,6 +28975,12 @@ method(object({
28860
28975
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
28861
28976
  kind: "mutation",
28862
28977
  auth: "admin"
28978
+ }), method(object({}), RecordingPlacementViewSchema, {
28979
+ kind: "query",
28980
+ auth: "admin"
28981
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
28982
+ kind: "mutation",
28983
+ auth: "admin"
28863
28984
  });
28864
28985
  /**
28865
28986
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -33929,6 +34050,12 @@ Object.freeze({
33929
34050
  addonId: null,
33930
34051
  access: "delete"
33931
34052
  },
34053
+ "deviceManager.renameLocation": {
34054
+ capName: "device-manager",
34055
+ capScope: "system",
34056
+ addonId: null,
34057
+ access: "create"
34058
+ },
33932
34059
  "deviceManager.runDeviceAction": {
33933
34060
  capName: "device-manager",
33934
34061
  capScope: "system",
@@ -35621,19 +35748,19 @@ Object.freeze({
35621
35748
  addonId: null,
35622
35749
  access: "view"
35623
35750
  },
35624
- "pipelineAnalytics.getGroup": {
35751
+ "pipelineAnalytics.getKeyEvents": {
35625
35752
  capName: "pipeline-analytics",
35626
35753
  capScope: "device",
35627
35754
  addonId: null,
35628
35755
  access: "view"
35629
35756
  },
35630
- "pipelineAnalytics.getKeyEvents": {
35757
+ "pipelineAnalytics.getKeyEventsBatch": {
35631
35758
  capName: "pipeline-analytics",
35632
35759
  capScope: "device",
35633
35760
  addonId: null,
35634
35761
  access: "view"
35635
35762
  },
35636
- "pipelineAnalytics.getKeyEventsBatch": {
35763
+ "pipelineAnalytics.getMediaReclaimStatus": {
35637
35764
  capName: "pipeline-analytics",
35638
35765
  capScope: "device",
35639
35766
  addonId: null,
@@ -35723,12 +35850,6 @@ Object.freeze({
35723
35850
  addonId: null,
35724
35851
  access: "view"
35725
35852
  },
35726
- "pipelineAnalytics.listGroups": {
35727
- capName: "pipeline-analytics",
35728
- capScope: "device",
35729
- addonId: null,
35730
- access: "view"
35731
- },
35732
35853
  "pipelineAnalytics.listOpsLog": {
35733
35854
  capName: "pipeline-analytics",
35734
35855
  capScope: "device",
@@ -35813,6 +35934,12 @@ Object.freeze({
35813
35934
  addonId: null,
35814
35935
  access: "create"
35815
35936
  },
35937
+ "pipelineAnalytics.reclaimDebugMedia": {
35938
+ capName: "pipeline-analytics",
35939
+ capScope: "device",
35940
+ addonId: null,
35941
+ access: "create"
35942
+ },
35816
35943
  "pipelineAnalytics.reconcileFromDisk": {
35817
35944
  capName: "pipeline-analytics",
35818
35945
  capScope: "device",
@@ -36737,6 +36864,12 @@ Object.freeze({
36737
36864
  addonId: null,
36738
36865
  access: "view"
36739
36866
  },
36867
+ "recording.getPlacement": {
36868
+ capName: "recording",
36869
+ capScope: "system",
36870
+ addonId: null,
36871
+ access: "view"
36872
+ },
36740
36873
  "recording.getPlaybackManifest": {
36741
36874
  capName: "recording",
36742
36875
  capScope: "system",
@@ -36863,6 +36996,12 @@ Object.freeze({
36863
36996
  addonId: null,
36864
36997
  access: "create"
36865
36998
  },
36999
+ "recording.setDevicePlacement": {
37000
+ capName: "recording",
37001
+ capScope: "system",
37002
+ addonId: null,
37003
+ access: "create"
37004
+ },
36866
37005
  "recording.startStorageMigrationMove": {
36867
37006
  capName: "recording",
36868
37007
  capScope: "system",
@@ -37307,12 +37446,36 @@ Object.freeze({
37307
37446
  addonId: null,
37308
37447
  access: "create"
37309
37448
  },
37449
+ "storageMigration.cleanupCancel": {
37450
+ capName: "storage-migration",
37451
+ capScope: "system",
37452
+ addonId: null,
37453
+ access: "create"
37454
+ },
37455
+ "storageMigration.cleanupStart": {
37456
+ capName: "storage-migration",
37457
+ capScope: "system",
37458
+ addonId: null,
37459
+ access: "create"
37460
+ },
37461
+ "storageMigration.cleanupStatus": {
37462
+ capName: "storage-migration",
37463
+ capScope: "system",
37464
+ addonId: null,
37465
+ access: "view"
37466
+ },
37310
37467
  "storageMigration.drain": {
37311
37468
  capName: "storage-migration",
37312
37469
  capScope: "system",
37313
37470
  addonId: null,
37314
37471
  access: "create"
37315
37472
  },
37473
+ "storageMigration.history": {
37474
+ capName: "storage-migration",
37475
+ capScope: "system",
37476
+ addonId: null,
37477
+ access: "view"
37478
+ },
37316
37479
  "storageMigration.movers": {
37317
37480
  capName: "storage-migration",
37318
37481
  capScope: "system",
@@ -39309,11 +39472,6 @@ Object.freeze({
39309
39472
  form: "single",
39310
39473
  optional: true
39311
39474
  }],
39312
- "pipelineAnalytics.getGroup": [{
39313
- name: "deviceId",
39314
- form: "single",
39315
- optional: false
39316
- }],
39317
39475
  "pipelineAnalytics.getKeyEvents": [{
39318
39476
  name: "deviceId",
39319
39477
  form: "single",
@@ -39379,11 +39537,6 @@ Object.freeze({
39379
39537
  form: "single",
39380
39538
  optional: false
39381
39539
  }],
39382
- "pipelineAnalytics.listGroups": [{
39383
- name: "deviceIds",
39384
- form: "array",
39385
- optional: false
39386
- }],
39387
39540
  "pipelineAnalytics.listOpsLog": [{
39388
39541
  name: "deviceId",
39389
39542
  form: "single",
@@ -39429,6 +39582,11 @@ Object.freeze({
39429
39582
  form: "single",
39430
39583
  optional: true
39431
39584
  }],
39585
+ "pipelineAnalytics.reclaimDebugMedia": [{
39586
+ name: "deviceIds",
39587
+ form: "array",
39588
+ optional: true
39589
+ }],
39432
39590
  "pipelineAnalytics.reconcileFromDisk": [{
39433
39591
  name: "deviceId",
39434
39592
  form: "single",
@@ -39794,6 +39952,11 @@ Object.freeze({
39794
39952
  form: "single",
39795
39953
  optional: false
39796
39954
  }],
39955
+ "recording.setDevicePlacement": [{
39956
+ name: "deviceId",
39957
+ form: "single",
39958
+ optional: false
39959
+ }],
39797
39960
  "recording.startStorageMigrationMove": [{
39798
39961
  name: "deviceId",
39799
39962
  form: "single",
package/dist/addon.mjs CHANGED
@@ -8133,6 +8133,13 @@ var MediaRelocateModeSchema = _enum([
8133
8133
  ]);
8134
8134
  var RelocateMediaInputSchema = object({
8135
8135
  toLocationId: string(),
8136
+ /**
8137
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8138
+ * every row that is not already on `toLocationId` (the historical
8139
+ * behaviour). A named source is what a from→to migration needs: without it
8140
+ * "move events off disk 2" also emptied disk 1.
8141
+ */
8142
+ fromLocationId: string().optional(),
8136
8143
  throttleMbps: number().min(1).max(1e3).optional(),
8137
8144
  /** Omitted = `move`, the pre-existing behaviour. */
8138
8145
  mode: MediaRelocateModeSchema.optional()
@@ -8200,6 +8207,19 @@ var StorageMigrationDestinationsSchema = object({
8200
8207
  galleryMedia: string().min(1).optional()
8201
8208
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8202
8209
  /**
8210
+ * Optional named source per class. Omitted = the class's current default
8211
+ * (the historical behaviour). A named source that is NOT the default is a
8212
+ * drain of that disk: bytes move, the default stays, and the source is
8213
+ * disabled when the move finishes.
8214
+ */
8215
+ var StorageMigrationSourcesSchema = object({
8216
+ recordings: string().min(1).optional(),
8217
+ recordingsLow: string().min(1).optional(),
8218
+ eventMedia: string().min(1).optional(),
8219
+ backups: string().min(1).optional(),
8220
+ galleryMedia: string().min(1).optional()
8221
+ }).optional();
8222
+ /**
8203
8223
  * How a migration sequences the cutover against the byte move.
8204
8224
  *
8205
8225
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8221,6 +8241,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8221
8241
  /** Shared input for planning and starting an orchestrated storage migration. */
8222
8242
  var StorageMigrationInputSchema = object({
8223
8243
  destinations: StorageMigrationDestinationsSchema,
8244
+ /** Omitted = each class's current default. */
8245
+ sources: StorageMigrationSourcesSchema,
8224
8246
  throttleMbps: number().min(1).max(1e3).optional(),
8225
8247
  /** Omitted = `blocking`, which stays the default. */
8226
8248
  mode: StorageMigrationModeSchema.optional()
@@ -8300,6 +8322,13 @@ var StorageMigrationMoveSchema = object({
8300
8322
  storageClass: StorageMigrationClassSchema,
8301
8323
  fromLocationId: string(),
8302
8324
  toLocationId: string(),
8325
+ /**
8326
+ * True when `from` was NOT the class default at plan time. The move still
8327
+ * copies bytes, but the default is left alone and the source is disabled
8328
+ * once the copy verifies. Absent on jobs planned before this field existed
8329
+ * — those jobs always repointed, which is `false`.
8330
+ */
8331
+ freezeSource: boolean().optional(),
8303
8332
  moverJobId: string().nullable(),
8304
8333
  state: RelocateJobStateSchema.nullable(),
8305
8334
  error: string().nullable(),
@@ -8313,6 +8342,7 @@ var StorageMigrationJobSchema = object({
8313
8342
  * can tell a seconds-long cutover from a thirty-hour one. */
8314
8343
  mode: StorageMigrationModeSchema,
8315
8344
  destinations: StorageMigrationDestinationsSchema,
8345
+ sources: StorageMigrationSourcesSchema,
8316
8346
  throttleMbps: number(),
8317
8347
  moves: array(StorageMigrationMoveSchema),
8318
8348
  pauseLeaseId: string().nullable(),
@@ -8338,6 +8368,7 @@ var StorageMigrationFindingSchema = object({
8338
8368
  });
8339
8369
  var StorageMigrationPlanSchema = object({
8340
8370
  destinations: StorageMigrationDestinationsSchema,
8371
+ sources: StorageMigrationSourcesSchema,
8341
8372
  /** The mode this plan was built for. A plan is only valid for its mode: the
8342
8373
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8343
8374
  * it. */
@@ -8345,7 +8376,8 @@ var StorageMigrationPlanSchema = object({
8345
8376
  moves: array(object({
8346
8377
  storageClass: StorageMigrationClassSchema,
8347
8378
  fromLocationId: string(),
8348
- toLocationId: string()
8379
+ toLocationId: string(),
8380
+ freezeSource: boolean().optional()
8349
8381
  })),
8350
8382
  findings: array(StorageMigrationFindingSchema)
8351
8383
  });
@@ -8523,10 +8555,51 @@ var LedgerWalkReportSchema = object({
8523
8555
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8524
8556
  var RelocatableMediaCountInputSchema = object({
8525
8557
  toLocationId: string().min(1),
8558
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8559
+ fromLocationId: string().optional(),
8526
8560
  /** Omitted = `move`. */
8527
8561
  mode: MediaRelocateModeSchema.optional()
8528
8562
  });
8529
8563
  /**
8564
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8565
+ * ghost ledger entries on frozen footage locations.
8566
+ *
8567
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8568
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8569
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8570
+ * with no operator-visible status.
8571
+ */
8572
+ var StorageCleanupPhaseSchema = _enum([
8573
+ "orphans",
8574
+ "debug-media",
8575
+ "ghost-ledger",
8576
+ "done",
8577
+ "failed",
8578
+ "cancelled"
8579
+ ]);
8580
+ var StorageCleanupInputSchema = object({
8581
+ /** Also walk motion stills / track filmstrips. Off by default. */
8582
+ includeDebugMedia: boolean().optional() });
8583
+ var StorageCleanupJobSchema = object({
8584
+ jobId: string(),
8585
+ phase: StorageCleanupPhaseSchema,
8586
+ includeDebugMedia: boolean(),
8587
+ orphansReclaimed: number().int().nonnegative(),
8588
+ orphanBytesReclaimed: number().int().nonnegative(),
8589
+ debugMediaReclaimed: number().int().nonnegative(),
8590
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8591
+ ghostsForgotten: number().int().nonnegative(),
8592
+ ghostBytesForgotten: number().int().nonnegative(),
8593
+ /** Short operator-facing line: current collection, pass, or location. */
8594
+ detail: string().nullable(),
8595
+ cancelRequested: boolean(),
8596
+ startedAt: number(),
8597
+ updatedAt: number(),
8598
+ finishedAt: number().nullable(),
8599
+ error: string().nullable()
8600
+ });
8601
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8602
+ /**
8530
8603
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8531
8604
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8532
8605
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8554,11 +8627,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8554
8627
  * The default location for a type uses `id === <type>:default` by
8555
8628
  * convention (the bare type ref like `'backups'` resolves to it).
8556
8629
  *
8557
- * `isSystem: true` marks a location as orchestrator-seeded and
8558
- * undeletable. The bootstrap-installed defaults (one per type) carry
8559
- * this flag; operator-added locations don't. Editing the config of
8560
- * a system location is allowed (path migration, provider swap) but
8561
- * deleting it is rejected at the cap level.
8630
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8631
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8632
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8633
+ * / last-enabled, not on this bit.
8562
8634
  */
8563
8635
  var StorageLocationSchema = object({
8564
8636
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13101,6 +13173,12 @@ method(object({
13101
13173
  }), _void(), {
13102
13174
  kind: "mutation",
13103
13175
  auth: "admin"
13176
+ }), method(object({
13177
+ from: string(),
13178
+ to: string()
13179
+ }), object({ moved: number() }), {
13180
+ kind: "mutation",
13181
+ auth: "admin"
13104
13182
  }), method(object({
13105
13183
  deviceId: number(),
13106
13184
  disabled: boolean()
@@ -15851,6 +15929,8 @@ var NcSystemEventKindSchema = _enum([
15851
15929
  "device-offline",
15852
15930
  "device-disabled",
15853
15931
  "device-enabled",
15932
+ "device-battery-low",
15933
+ "device-battery-normal",
15854
15934
  "stream-online",
15855
15935
  "stream-offline",
15856
15936
  "node-online",
@@ -19109,46 +19189,6 @@ var RecentTracksPageSchema = object({
19109
19189
  /** Cursor for the next page, or null when this page is the last. */
19110
19190
  nextCursor: string().nullable()
19111
19191
  });
19112
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19113
- var LIST_GROUPS_MAX_LIMIT = 100;
19114
- var AnalyticsGroupRecordSchema = object({
19115
- id: string(),
19116
- deviceId: number().int(),
19117
- openedAt: number().int(),
19118
- closedAt: number().int(),
19119
- timestamp: number().int(),
19120
- memberCount: number().int(),
19121
- memberTrackIds: array(string()).readonly(),
19122
- className: string(),
19123
- classes: array(string()).readonly(),
19124
- /** Relative event-media path, or null when the group has no picture yet. */
19125
- mediaUrl: string().nullable(),
19126
- singleton: boolean()
19127
- });
19128
- var AnalyticsGroupMemberSchema = object({
19129
- trackId: string(),
19130
- deviceId: number().int(),
19131
- className: string(),
19132
- firstSeen: number().int(),
19133
- lastSeen: number().int(),
19134
- mediaUrl: string().nullable()
19135
- });
19136
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19137
- var ListGroupsQueryInput = object({
19138
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19139
- deviceIds: array(number()),
19140
- /** Window lower bound on `closedAt` (inclusive). */
19141
- since: number().optional(),
19142
- /** Window upper bound on `openedAt` (inclusive). */
19143
- until: number().optional(),
19144
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19145
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19146
- cursor: string().optional()
19147
- });
19148
- var ListGroupsPageSchema = object({
19149
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19150
- nextCursor: string().nullable()
19151
- });
19152
19192
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19153
19193
  var KEY_EVENTS_MAX_LIMIT = 200;
19154
19194
  var KeyEventQueryInput = object({
@@ -19252,9 +19292,7 @@ var TrackCascadeCountsSchema = object({
19252
19292
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19253
19293
  plates: number().int(),
19254
19294
  /** Per-track CLIP search vectors removed (best-effort). */
19255
- embeddings: number().int(),
19256
- /** Group membership + group rows removed with their last member (best-effort). */
19257
- groups: number().int()
19295
+ embeddings: number().int()
19258
19296
  });
19259
19297
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19260
19298
  var DiskReconcileCountsSchema = object({
@@ -19424,6 +19462,47 @@ var RebuildStatusSchema = object({
19424
19462
  /** Present when the pass ended by throwing. */
19425
19463
  error: string().nullable()
19426
19464
  });
19465
+ /**
19466
+ * Acknowledgement that a debug-media reclaim STARTED.
19467
+ *
19468
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19469
+ * it runs detached and this returns immediately. Awaiting it is how the
19470
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19471
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19472
+ */
19473
+ var MediaReclaimStartResultSchema = object({
19474
+ started: boolean(),
19475
+ /** True when a pass was already running; the new request is ignored. */
19476
+ alreadyRunning: boolean()
19477
+ });
19478
+ var MediaReclaimInputSchema = object({
19479
+ mode: _enum(["report", "reclaim"]).default("report"),
19480
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19481
+ deviceIds: array(number().int()).min(1).optional(),
19482
+ restart: boolean().optional(),
19483
+ pageSize: number().int().min(50).max(5e3).optional(),
19484
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19485
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19486
+ maxBytesPerRun: number().int().min(1).optional(),
19487
+ budgetMinutes: number().int().min(1).max(720).optional(),
19488
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19489
+ graceMinutes: number().int().min(1).max(10080).optional()
19490
+ });
19491
+ var MediaReclaimStatusSchema = object({
19492
+ running: boolean(),
19493
+ mode: _enum(["report", "reclaim"]).nullable(),
19494
+ totalExamined: number(),
19495
+ totalEligible: number(),
19496
+ totalReclaimed: number(),
19497
+ totalBytesReclaimed: number(),
19498
+ totalRefused: number(),
19499
+ /** Device+scope windows finished in this pass. */
19500
+ devicesDone: number(),
19501
+ complete: boolean().nullable(),
19502
+ startedAtMs: number().nullable(),
19503
+ finishedAtMs: number().nullable(),
19504
+ error: string().nullable()
19505
+ });
19427
19506
  var ReplayFrameInputSchema = object({
19428
19507
  timestamp: number(),
19429
19508
  frame: PipelineRunResultBridge
@@ -19462,10 +19541,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19462
19541
  * stationary registry). Default false: the timeline lists passages,
19463
19542
  * not parking records (operator decision, 2026-08-15). */
19464
19543
  includeStationary: boolean().optional()
19465
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19466
- deviceId: number(),
19467
- groupId: string().min(1)
19468
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19544
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19469
19545
  kind: "mutation",
19470
19546
  auth: "admin"
19471
19547
  }), 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({
@@ -19565,6 +19641,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19565
19641
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19566
19642
  kind: "query",
19567
19643
  auth: "admin"
19644
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19645
+ kind: "mutation",
19646
+ auth: "admin"
19647
+ }), method(object({}), MediaReclaimStatusSchema, {
19648
+ kind: "query",
19649
+ auth: "admin"
19568
19650
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19569
19651
  kind: "query",
19570
19652
  auth: "admin"
@@ -21535,7 +21617,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21535
21617
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21536
21618
  kind: "mutation",
21537
21619
  auth: "admin"
21538
- });
21620
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21621
+ kind: "mutation",
21622
+ auth: "admin"
21623
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21624
+ kind: "mutation",
21625
+ auth: "admin"
21626
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21539
21627
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21540
21628
  providerId: string().min(1),
21541
21629
  displayName: string().min(1),
@@ -28636,6 +28724,33 @@ var RecordingRebalanceInputSchema = object({
28636
28724
  minMoveGb: number().min(0).optional()
28637
28725
  });
28638
28726
  /**
28727
+ * Operator-facing placement of one camera onto a recordings location.
28728
+ *
28729
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28730
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28731
+ * currently write — the plan, which may disagree with the pin when Auto.
28732
+ */
28733
+ var RecordingDevicePlacementSchema = object({
28734
+ deviceId: number().int(),
28735
+ profile: string(),
28736
+ locationId: string()
28737
+ });
28738
+ var RecordingDevicePinSchema = object({
28739
+ deviceId: number().int(),
28740
+ /** Recordings-class location this camera is pinned to. */
28741
+ locationId: string()
28742
+ });
28743
+ var RecordingPlacementViewSchema = object({
28744
+ assignments: array(RecordingDevicePlacementSchema),
28745
+ pins: array(RecordingDevicePinSchema),
28746
+ defaultLocations: record(string(), string())
28747
+ });
28748
+ var RecordingSetDevicePlacementInputSchema = object({
28749
+ deviceId: number().int(),
28750
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28751
+ locationId: string().nullable()
28752
+ });
28753
+ /**
28639
28754
  * Result of locating footage at a wall-clock instant for one device/profile.
28640
28755
  * `segment` carries the covering segment's window; `gap` reports the forward
28641
28756
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -28861,6 +28976,12 @@ method(object({
28861
28976
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
28862
28977
  kind: "mutation",
28863
28978
  auth: "admin"
28979
+ }), method(object({}), RecordingPlacementViewSchema, {
28980
+ kind: "query",
28981
+ auth: "admin"
28982
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
28983
+ kind: "mutation",
28984
+ auth: "admin"
28864
28985
  });
28865
28986
  /**
28866
28987
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -33930,6 +34051,12 @@ Object.freeze({
33930
34051
  addonId: null,
33931
34052
  access: "delete"
33932
34053
  },
34054
+ "deviceManager.renameLocation": {
34055
+ capName: "device-manager",
34056
+ capScope: "system",
34057
+ addonId: null,
34058
+ access: "create"
34059
+ },
33933
34060
  "deviceManager.runDeviceAction": {
33934
34061
  capName: "device-manager",
33935
34062
  capScope: "system",
@@ -35622,19 +35749,19 @@ Object.freeze({
35622
35749
  addonId: null,
35623
35750
  access: "view"
35624
35751
  },
35625
- "pipelineAnalytics.getGroup": {
35752
+ "pipelineAnalytics.getKeyEvents": {
35626
35753
  capName: "pipeline-analytics",
35627
35754
  capScope: "device",
35628
35755
  addonId: null,
35629
35756
  access: "view"
35630
35757
  },
35631
- "pipelineAnalytics.getKeyEvents": {
35758
+ "pipelineAnalytics.getKeyEventsBatch": {
35632
35759
  capName: "pipeline-analytics",
35633
35760
  capScope: "device",
35634
35761
  addonId: null,
35635
35762
  access: "view"
35636
35763
  },
35637
- "pipelineAnalytics.getKeyEventsBatch": {
35764
+ "pipelineAnalytics.getMediaReclaimStatus": {
35638
35765
  capName: "pipeline-analytics",
35639
35766
  capScope: "device",
35640
35767
  addonId: null,
@@ -35724,12 +35851,6 @@ Object.freeze({
35724
35851
  addonId: null,
35725
35852
  access: "view"
35726
35853
  },
35727
- "pipelineAnalytics.listGroups": {
35728
- capName: "pipeline-analytics",
35729
- capScope: "device",
35730
- addonId: null,
35731
- access: "view"
35732
- },
35733
35854
  "pipelineAnalytics.listOpsLog": {
35734
35855
  capName: "pipeline-analytics",
35735
35856
  capScope: "device",
@@ -35814,6 +35935,12 @@ Object.freeze({
35814
35935
  addonId: null,
35815
35936
  access: "create"
35816
35937
  },
35938
+ "pipelineAnalytics.reclaimDebugMedia": {
35939
+ capName: "pipeline-analytics",
35940
+ capScope: "device",
35941
+ addonId: null,
35942
+ access: "create"
35943
+ },
35817
35944
  "pipelineAnalytics.reconcileFromDisk": {
35818
35945
  capName: "pipeline-analytics",
35819
35946
  capScope: "device",
@@ -36738,6 +36865,12 @@ Object.freeze({
36738
36865
  addonId: null,
36739
36866
  access: "view"
36740
36867
  },
36868
+ "recording.getPlacement": {
36869
+ capName: "recording",
36870
+ capScope: "system",
36871
+ addonId: null,
36872
+ access: "view"
36873
+ },
36741
36874
  "recording.getPlaybackManifest": {
36742
36875
  capName: "recording",
36743
36876
  capScope: "system",
@@ -36864,6 +36997,12 @@ Object.freeze({
36864
36997
  addonId: null,
36865
36998
  access: "create"
36866
36999
  },
37000
+ "recording.setDevicePlacement": {
37001
+ capName: "recording",
37002
+ capScope: "system",
37003
+ addonId: null,
37004
+ access: "create"
37005
+ },
36867
37006
  "recording.startStorageMigrationMove": {
36868
37007
  capName: "recording",
36869
37008
  capScope: "system",
@@ -37308,12 +37447,36 @@ Object.freeze({
37308
37447
  addonId: null,
37309
37448
  access: "create"
37310
37449
  },
37450
+ "storageMigration.cleanupCancel": {
37451
+ capName: "storage-migration",
37452
+ capScope: "system",
37453
+ addonId: null,
37454
+ access: "create"
37455
+ },
37456
+ "storageMigration.cleanupStart": {
37457
+ capName: "storage-migration",
37458
+ capScope: "system",
37459
+ addonId: null,
37460
+ access: "create"
37461
+ },
37462
+ "storageMigration.cleanupStatus": {
37463
+ capName: "storage-migration",
37464
+ capScope: "system",
37465
+ addonId: null,
37466
+ access: "view"
37467
+ },
37311
37468
  "storageMigration.drain": {
37312
37469
  capName: "storage-migration",
37313
37470
  capScope: "system",
37314
37471
  addonId: null,
37315
37472
  access: "create"
37316
37473
  },
37474
+ "storageMigration.history": {
37475
+ capName: "storage-migration",
37476
+ capScope: "system",
37477
+ addonId: null,
37478
+ access: "view"
37479
+ },
37317
37480
  "storageMigration.movers": {
37318
37481
  capName: "storage-migration",
37319
37482
  capScope: "system",
@@ -39310,11 +39473,6 @@ Object.freeze({
39310
39473
  form: "single",
39311
39474
  optional: true
39312
39475
  }],
39313
- "pipelineAnalytics.getGroup": [{
39314
- name: "deviceId",
39315
- form: "single",
39316
- optional: false
39317
- }],
39318
39476
  "pipelineAnalytics.getKeyEvents": [{
39319
39477
  name: "deviceId",
39320
39478
  form: "single",
@@ -39380,11 +39538,6 @@ Object.freeze({
39380
39538
  form: "single",
39381
39539
  optional: false
39382
39540
  }],
39383
- "pipelineAnalytics.listGroups": [{
39384
- name: "deviceIds",
39385
- form: "array",
39386
- optional: false
39387
- }],
39388
39541
  "pipelineAnalytics.listOpsLog": [{
39389
39542
  name: "deviceId",
39390
39543
  form: "single",
@@ -39430,6 +39583,11 @@ Object.freeze({
39430
39583
  form: "single",
39431
39584
  optional: true
39432
39585
  }],
39586
+ "pipelineAnalytics.reclaimDebugMedia": [{
39587
+ name: "deviceIds",
39588
+ form: "array",
39589
+ optional: true
39590
+ }],
39433
39591
  "pipelineAnalytics.reconcileFromDisk": [{
39434
39592
  name: "deviceId",
39435
39593
  form: "single",
@@ -39795,6 +39953,11 @@ Object.freeze({
39795
39953
  form: "single",
39796
39954
  optional: false
39797
39955
  }],
39956
+ "recording.setDevicePlacement": [{
39957
+ name: "deviceId",
39958
+ form: "single",
39959
+ optional: false
39960
+ }],
39798
39961
  "recording.startStorageMigrationMove": [{
39799
39962
  name: "deviceId",
39800
39963
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-dreo",
3
- "version": "0.2.49",
3
+ "version": "0.2.51",
4
4
  "description": "Dreo smart-device (fan / air-circulator / purifier / heater / humidifier) device-provider addon for CamStack — wraps the @apocaliss92/nodedreo Dreo cloud client (REST + WebSocket)",
5
5
  "keywords": [
6
6
  "camstack",