@camstack/addon-provider-dreame 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
@@ -58601,6 +58601,13 @@ var MediaRelocateModeSchema = _enum([
58601
58601
  ]);
58602
58602
  var RelocateMediaInputSchema = object({
58603
58603
  toLocationId: string(),
58604
+ /**
58605
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
58606
+ * every row that is not already on `toLocationId` (the historical
58607
+ * behaviour). A named source is what a from→to migration needs: without it
58608
+ * "move events off disk 2" also emptied disk 1.
58609
+ */
58610
+ fromLocationId: string().optional(),
58604
58611
  throttleMbps: number().min(1).max(1e3).optional(),
58605
58612
  /** Omitted = `move`, the pre-existing behaviour. */
58606
58613
  mode: MediaRelocateModeSchema.optional()
@@ -58668,6 +58675,19 @@ var StorageMigrationDestinationsSchema = object({
58668
58675
  galleryMedia: string().min(1).optional()
58669
58676
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
58670
58677
  /**
58678
+ * Optional named source per class. Omitted = the class's current default
58679
+ * (the historical behaviour). A named source that is NOT the default is a
58680
+ * drain of that disk: bytes move, the default stays, and the source is
58681
+ * disabled when the move finishes.
58682
+ */
58683
+ var StorageMigrationSourcesSchema = object({
58684
+ recordings: string().min(1).optional(),
58685
+ recordingsLow: string().min(1).optional(),
58686
+ eventMedia: string().min(1).optional(),
58687
+ backups: string().min(1).optional(),
58688
+ galleryMedia: string().min(1).optional()
58689
+ }).optional();
58690
+ /**
58671
58691
  * How a migration sequences the cutover against the byte move.
58672
58692
  *
58673
58693
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -58689,6 +58709,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
58689
58709
  /** Shared input for planning and starting an orchestrated storage migration. */
58690
58710
  var StorageMigrationInputSchema = object({
58691
58711
  destinations: StorageMigrationDestinationsSchema,
58712
+ /** Omitted = each class's current default. */
58713
+ sources: StorageMigrationSourcesSchema,
58692
58714
  throttleMbps: number().min(1).max(1e3).optional(),
58693
58715
  /** Omitted = `blocking`, which stays the default. */
58694
58716
  mode: StorageMigrationModeSchema.optional()
@@ -58768,6 +58790,13 @@ var StorageMigrationMoveSchema = object({
58768
58790
  storageClass: StorageMigrationClassSchema,
58769
58791
  fromLocationId: string(),
58770
58792
  toLocationId: string(),
58793
+ /**
58794
+ * True when `from` was NOT the class default at plan time. The move still
58795
+ * copies bytes, but the default is left alone and the source is disabled
58796
+ * once the copy verifies. Absent on jobs planned before this field existed
58797
+ * — those jobs always repointed, which is `false`.
58798
+ */
58799
+ freezeSource: boolean().optional(),
58771
58800
  moverJobId: string().nullable(),
58772
58801
  state: RelocateJobStateSchema.nullable(),
58773
58802
  error: string().nullable(),
@@ -58781,6 +58810,7 @@ var StorageMigrationJobSchema = object({
58781
58810
  * can tell a seconds-long cutover from a thirty-hour one. */
58782
58811
  mode: StorageMigrationModeSchema,
58783
58812
  destinations: StorageMigrationDestinationsSchema,
58813
+ sources: StorageMigrationSourcesSchema,
58784
58814
  throttleMbps: number(),
58785
58815
  moves: array(StorageMigrationMoveSchema),
58786
58816
  pauseLeaseId: string().nullable(),
@@ -58806,6 +58836,7 @@ var StorageMigrationFindingSchema = object({
58806
58836
  });
58807
58837
  var StorageMigrationPlanSchema = object({
58808
58838
  destinations: StorageMigrationDestinationsSchema,
58839
+ sources: StorageMigrationSourcesSchema,
58809
58840
  /** The mode this plan was built for. A plan is only valid for its mode: the
58810
58841
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
58811
58842
  * it. */
@@ -58813,7 +58844,8 @@ var StorageMigrationPlanSchema = object({
58813
58844
  moves: array(object({
58814
58845
  storageClass: StorageMigrationClassSchema,
58815
58846
  fromLocationId: string(),
58816
- toLocationId: string()
58847
+ toLocationId: string(),
58848
+ freezeSource: boolean().optional()
58817
58849
  })),
58818
58850
  findings: array(StorageMigrationFindingSchema)
58819
58851
  });
@@ -58991,10 +59023,51 @@ var LedgerWalkReportSchema = object({
58991
59023
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
58992
59024
  var RelocatableMediaCountInputSchema = object({
58993
59025
  toLocationId: string().min(1),
59026
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
59027
+ fromLocationId: string().optional(),
58994
59028
  /** Omitted = `move`. */
58995
59029
  mode: MediaRelocateModeSchema.optional()
58996
59030
  });
58997
59031
  /**
59032
+ * Operator cleanup of leftover analytics rows, optional debug media, and
59033
+ * ghost ledger entries on frozen footage locations.
59034
+ *
59035
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
59036
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
59037
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
59038
+ * with no operator-visible status.
59039
+ */
59040
+ var StorageCleanupPhaseSchema = _enum([
59041
+ "orphans",
59042
+ "debug-media",
59043
+ "ghost-ledger",
59044
+ "done",
59045
+ "failed",
59046
+ "cancelled"
59047
+ ]);
59048
+ var StorageCleanupInputSchema = object({
59049
+ /** Also walk motion stills / track filmstrips. Off by default. */
59050
+ includeDebugMedia: boolean().optional() });
59051
+ var StorageCleanupJobSchema = object({
59052
+ jobId: string(),
59053
+ phase: StorageCleanupPhaseSchema,
59054
+ includeDebugMedia: boolean(),
59055
+ orphansReclaimed: number().int().nonnegative(),
59056
+ orphanBytesReclaimed: number().int().nonnegative(),
59057
+ debugMediaReclaimed: number().int().nonnegative(),
59058
+ debugMediaBytesReclaimed: number().int().nonnegative(),
59059
+ ghostsForgotten: number().int().nonnegative(),
59060
+ ghostBytesForgotten: number().int().nonnegative(),
59061
+ /** Short operator-facing line: current collection, pass, or location. */
59062
+ detail: string().nullable(),
59063
+ cancelRequested: boolean(),
59064
+ startedAt: number(),
59065
+ updatedAt: number(),
59066
+ finishedAt: number().nullable(),
59067
+ error: string().nullable()
59068
+ });
59069
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
59070
+ /**
58998
59071
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
58999
59072
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
59000
59073
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -59022,11 +59095,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
59022
59095
  * The default location for a type uses `id === <type>:default` by
59023
59096
  * convention (the bare type ref like `'backups'` resolves to it).
59024
59097
  *
59025
- * `isSystem: true` marks a location as orchestrator-seeded and
59026
- * undeletable. The bootstrap-installed defaults (one per type) carry
59027
- * this flag; operator-added locations don't. Editing the config of
59028
- * a system location is allowed (path migration, provider swap) but
59029
- * deleting it is rejected at the cap level.
59098
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
59099
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
59100
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
59101
+ * / last-enabled, not on this bit.
59030
59102
  */
59031
59103
  var StorageLocationSchema = object({
59032
59104
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -63569,6 +63641,12 @@ method(object({
63569
63641
  }), _void(), {
63570
63642
  kind: "mutation",
63571
63643
  auth: "admin"
63644
+ }), method(object({
63645
+ from: string(),
63646
+ to: string()
63647
+ }), object({ moved: number() }), {
63648
+ kind: "mutation",
63649
+ auth: "admin"
63572
63650
  }), method(object({
63573
63651
  deviceId: number(),
63574
63652
  disabled: boolean()
@@ -66319,6 +66397,8 @@ var NcSystemEventKindSchema = _enum([
66319
66397
  "device-offline",
66320
66398
  "device-disabled",
66321
66399
  "device-enabled",
66400
+ "device-battery-low",
66401
+ "device-battery-normal",
66322
66402
  "stream-online",
66323
66403
  "stream-offline",
66324
66404
  "node-online",
@@ -69577,46 +69657,6 @@ var RecentTracksPageSchema = object({
69577
69657
  /** Cursor for the next page, or null when this page is the last. */
69578
69658
  nextCursor: string().nullable()
69579
69659
  });
69580
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
69581
- var LIST_GROUPS_MAX_LIMIT = 100;
69582
- var AnalyticsGroupRecordSchema = object({
69583
- id: string(),
69584
- deviceId: number().int(),
69585
- openedAt: number().int(),
69586
- closedAt: number().int(),
69587
- timestamp: number().int(),
69588
- memberCount: number().int(),
69589
- memberTrackIds: array(string()).readonly(),
69590
- className: string(),
69591
- classes: array(string()).readonly(),
69592
- /** Relative event-media path, or null when the group has no picture yet. */
69593
- mediaUrl: string().nullable(),
69594
- singleton: boolean()
69595
- });
69596
- var AnalyticsGroupMemberSchema = object({
69597
- trackId: string(),
69598
- deviceId: number().int(),
69599
- className: string(),
69600
- firstSeen: number().int(),
69601
- lastSeen: number().int(),
69602
- mediaUrl: string().nullable()
69603
- });
69604
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
69605
- var ListGroupsQueryInput = object({
69606
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
69607
- deviceIds: array(number()),
69608
- /** Window lower bound on `closedAt` (inclusive). */
69609
- since: number().optional(),
69610
- /** Window upper bound on `openedAt` (inclusive). */
69611
- until: number().optional(),
69612
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
69613
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
69614
- cursor: string().optional()
69615
- });
69616
- var ListGroupsPageSchema = object({
69617
- groups: array(AnalyticsGroupRecordSchema).readonly(),
69618
- nextCursor: string().nullable()
69619
- });
69620
69660
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
69621
69661
  var KEY_EVENTS_MAX_LIMIT = 200;
69622
69662
  var KeyEventQueryInput = object({
@@ -69720,9 +69760,7 @@ var TrackCascadeCountsSchema = object({
69720
69760
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
69721
69761
  plates: number().int(),
69722
69762
  /** Per-track CLIP search vectors removed (best-effort). */
69723
- embeddings: number().int(),
69724
- /** Group membership + group rows removed with their last member (best-effort). */
69725
- groups: number().int()
69763
+ embeddings: number().int()
69726
69764
  });
69727
69765
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
69728
69766
  var DiskReconcileCountsSchema = object({
@@ -69892,6 +69930,47 @@ var RebuildStatusSchema = object({
69892
69930
  /** Present when the pass ended by throwing. */
69893
69931
  error: string().nullable()
69894
69932
  });
69933
+ /**
69934
+ * Acknowledgement that a debug-media reclaim STARTED.
69935
+ *
69936
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
69937
+ * it runs detached and this returns immediately. Awaiting it is how the
69938
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
69939
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
69940
+ */
69941
+ var MediaReclaimStartResultSchema = object({
69942
+ started: boolean(),
69943
+ /** True when a pass was already running; the new request is ignored. */
69944
+ alreadyRunning: boolean()
69945
+ });
69946
+ var MediaReclaimInputSchema = object({
69947
+ mode: _enum(["report", "reclaim"]).default("report"),
69948
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
69949
+ deviceIds: array(number().int()).min(1).optional(),
69950
+ restart: boolean().optional(),
69951
+ pageSize: number().int().min(50).max(5e3).optional(),
69952
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
69953
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
69954
+ maxBytesPerRun: number().int().min(1).optional(),
69955
+ budgetMinutes: number().int().min(1).max(720).optional(),
69956
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
69957
+ graceMinutes: number().int().min(1).max(10080).optional()
69958
+ });
69959
+ var MediaReclaimStatusSchema = object({
69960
+ running: boolean(),
69961
+ mode: _enum(["report", "reclaim"]).nullable(),
69962
+ totalExamined: number(),
69963
+ totalEligible: number(),
69964
+ totalReclaimed: number(),
69965
+ totalBytesReclaimed: number(),
69966
+ totalRefused: number(),
69967
+ /** Device+scope windows finished in this pass. */
69968
+ devicesDone: number(),
69969
+ complete: boolean().nullable(),
69970
+ startedAtMs: number().nullable(),
69971
+ finishedAtMs: number().nullable(),
69972
+ error: string().nullable()
69973
+ });
69895
69974
  var ReplayFrameInputSchema = object({
69896
69975
  timestamp: number(),
69897
69976
  frame: PipelineRunResultBridge
@@ -69930,10 +70009,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
69930
70009
  * stationary registry). Default false: the timeline lists passages,
69931
70010
  * not parking records (operator decision, 2026-08-15). */
69932
70011
  includeStationary: boolean().optional()
69933
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
69934
- deviceId: number(),
69935
- groupId: string().min(1)
69936
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
70012
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
69937
70013
  kind: "mutation",
69938
70014
  auth: "admin"
69939
70015
  }), 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({
@@ -70033,6 +70109,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
70033
70109
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
70034
70110
  kind: "query",
70035
70111
  auth: "admin"
70112
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
70113
+ kind: "mutation",
70114
+ auth: "admin"
70115
+ }), method(object({}), MediaReclaimStatusSchema, {
70116
+ kind: "query",
70117
+ auth: "admin"
70036
70118
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
70037
70119
  kind: "query",
70038
70120
  auth: "admin"
@@ -72003,7 +72085,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
72003
72085
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
72004
72086
  kind: "mutation",
72005
72087
  auth: "admin"
72006
- });
72088
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
72089
+ kind: "mutation",
72090
+ auth: "admin"
72091
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
72092
+ kind: "mutation",
72093
+ auth: "admin"
72094
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
72007
72095
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
72008
72096
  providerId: string().min(1),
72009
72097
  displayName: string().min(1),
@@ -79121,6 +79209,33 @@ var RecordingRebalanceInputSchema = object({
79121
79209
  minMoveGb: number().min(0).optional()
79122
79210
  });
79123
79211
  /**
79212
+ * Operator-facing placement of one camera onto a recordings location.
79213
+ *
79214
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
79215
+ * Auto (the planner may move this camera). `locationId` is where high/mid
79216
+ * currently write — the plan, which may disagree with the pin when Auto.
79217
+ */
79218
+ var RecordingDevicePlacementSchema = object({
79219
+ deviceId: number().int(),
79220
+ profile: string(),
79221
+ locationId: string()
79222
+ });
79223
+ var RecordingDevicePinSchema = object({
79224
+ deviceId: number().int(),
79225
+ /** Recordings-class location this camera is pinned to. */
79226
+ locationId: string()
79227
+ });
79228
+ var RecordingPlacementViewSchema = object({
79229
+ assignments: array(RecordingDevicePlacementSchema),
79230
+ pins: array(RecordingDevicePinSchema),
79231
+ defaultLocations: record(string(), string())
79232
+ });
79233
+ var RecordingSetDevicePlacementInputSchema = object({
79234
+ deviceId: number().int(),
79235
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
79236
+ locationId: string().nullable()
79237
+ });
79238
+ /**
79124
79239
  * Result of locating footage at a wall-clock instant for one device/profile.
79125
79240
  * `segment` carries the covering segment's window; `gap` reports the forward
79126
79241
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -79346,6 +79461,12 @@ method(object({
79346
79461
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
79347
79462
  kind: "mutation",
79348
79463
  auth: "admin"
79464
+ }), method(object({}), RecordingPlacementViewSchema, {
79465
+ kind: "query",
79466
+ auth: "admin"
79467
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
79468
+ kind: "mutation",
79469
+ auth: "admin"
79349
79470
  });
79350
79471
  /**
79351
79472
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -84415,6 +84536,12 @@ Object.freeze({
84415
84536
  addonId: null,
84416
84537
  access: "delete"
84417
84538
  },
84539
+ "deviceManager.renameLocation": {
84540
+ capName: "device-manager",
84541
+ capScope: "system",
84542
+ addonId: null,
84543
+ access: "create"
84544
+ },
84418
84545
  "deviceManager.runDeviceAction": {
84419
84546
  capName: "device-manager",
84420
84547
  capScope: "system",
@@ -86107,19 +86234,19 @@ Object.freeze({
86107
86234
  addonId: null,
86108
86235
  access: "view"
86109
86236
  },
86110
- "pipelineAnalytics.getGroup": {
86237
+ "pipelineAnalytics.getKeyEvents": {
86111
86238
  capName: "pipeline-analytics",
86112
86239
  capScope: "device",
86113
86240
  addonId: null,
86114
86241
  access: "view"
86115
86242
  },
86116
- "pipelineAnalytics.getKeyEvents": {
86243
+ "pipelineAnalytics.getKeyEventsBatch": {
86117
86244
  capName: "pipeline-analytics",
86118
86245
  capScope: "device",
86119
86246
  addonId: null,
86120
86247
  access: "view"
86121
86248
  },
86122
- "pipelineAnalytics.getKeyEventsBatch": {
86249
+ "pipelineAnalytics.getMediaReclaimStatus": {
86123
86250
  capName: "pipeline-analytics",
86124
86251
  capScope: "device",
86125
86252
  addonId: null,
@@ -86209,12 +86336,6 @@ Object.freeze({
86209
86336
  addonId: null,
86210
86337
  access: "view"
86211
86338
  },
86212
- "pipelineAnalytics.listGroups": {
86213
- capName: "pipeline-analytics",
86214
- capScope: "device",
86215
- addonId: null,
86216
- access: "view"
86217
- },
86218
86339
  "pipelineAnalytics.listOpsLog": {
86219
86340
  capName: "pipeline-analytics",
86220
86341
  capScope: "device",
@@ -86299,6 +86420,12 @@ Object.freeze({
86299
86420
  addonId: null,
86300
86421
  access: "create"
86301
86422
  },
86423
+ "pipelineAnalytics.reclaimDebugMedia": {
86424
+ capName: "pipeline-analytics",
86425
+ capScope: "device",
86426
+ addonId: null,
86427
+ access: "create"
86428
+ },
86302
86429
  "pipelineAnalytics.reconcileFromDisk": {
86303
86430
  capName: "pipeline-analytics",
86304
86431
  capScope: "device",
@@ -87223,6 +87350,12 @@ Object.freeze({
87223
87350
  addonId: null,
87224
87351
  access: "view"
87225
87352
  },
87353
+ "recording.getPlacement": {
87354
+ capName: "recording",
87355
+ capScope: "system",
87356
+ addonId: null,
87357
+ access: "view"
87358
+ },
87226
87359
  "recording.getPlaybackManifest": {
87227
87360
  capName: "recording",
87228
87361
  capScope: "system",
@@ -87349,6 +87482,12 @@ Object.freeze({
87349
87482
  addonId: null,
87350
87483
  access: "create"
87351
87484
  },
87485
+ "recording.setDevicePlacement": {
87486
+ capName: "recording",
87487
+ capScope: "system",
87488
+ addonId: null,
87489
+ access: "create"
87490
+ },
87352
87491
  "recording.startStorageMigrationMove": {
87353
87492
  capName: "recording",
87354
87493
  capScope: "system",
@@ -87793,12 +87932,36 @@ Object.freeze({
87793
87932
  addonId: null,
87794
87933
  access: "create"
87795
87934
  },
87935
+ "storageMigration.cleanupCancel": {
87936
+ capName: "storage-migration",
87937
+ capScope: "system",
87938
+ addonId: null,
87939
+ access: "create"
87940
+ },
87941
+ "storageMigration.cleanupStart": {
87942
+ capName: "storage-migration",
87943
+ capScope: "system",
87944
+ addonId: null,
87945
+ access: "create"
87946
+ },
87947
+ "storageMigration.cleanupStatus": {
87948
+ capName: "storage-migration",
87949
+ capScope: "system",
87950
+ addonId: null,
87951
+ access: "view"
87952
+ },
87796
87953
  "storageMigration.drain": {
87797
87954
  capName: "storage-migration",
87798
87955
  capScope: "system",
87799
87956
  addonId: null,
87800
87957
  access: "create"
87801
87958
  },
87959
+ "storageMigration.history": {
87960
+ capName: "storage-migration",
87961
+ capScope: "system",
87962
+ addonId: null,
87963
+ access: "view"
87964
+ },
87802
87965
  "storageMigration.movers": {
87803
87966
  capName: "storage-migration",
87804
87967
  capScope: "system",
@@ -89795,11 +89958,6 @@ Object.freeze({
89795
89958
  form: "single",
89796
89959
  optional: true
89797
89960
  }],
89798
- "pipelineAnalytics.getGroup": [{
89799
- name: "deviceId",
89800
- form: "single",
89801
- optional: false
89802
- }],
89803
89961
  "pipelineAnalytics.getKeyEvents": [{
89804
89962
  name: "deviceId",
89805
89963
  form: "single",
@@ -89865,11 +90023,6 @@ Object.freeze({
89865
90023
  form: "single",
89866
90024
  optional: false
89867
90025
  }],
89868
- "pipelineAnalytics.listGroups": [{
89869
- name: "deviceIds",
89870
- form: "array",
89871
- optional: false
89872
- }],
89873
90026
  "pipelineAnalytics.listOpsLog": [{
89874
90027
  name: "deviceId",
89875
90028
  form: "single",
@@ -89915,6 +90068,11 @@ Object.freeze({
89915
90068
  form: "single",
89916
90069
  optional: true
89917
90070
  }],
90071
+ "pipelineAnalytics.reclaimDebugMedia": [{
90072
+ name: "deviceIds",
90073
+ form: "array",
90074
+ optional: true
90075
+ }],
89918
90076
  "pipelineAnalytics.reconcileFromDisk": [{
89919
90077
  name: "deviceId",
89920
90078
  form: "single",
@@ -90280,6 +90438,11 @@ Object.freeze({
90280
90438
  form: "single",
90281
90439
  optional: false
90282
90440
  }],
90441
+ "recording.setDevicePlacement": [{
90442
+ name: "deviceId",
90443
+ form: "single",
90444
+ optional: false
90445
+ }],
90283
90446
  "recording.startStorageMigrationMove": [{
90284
90447
  name: "deviceId",
90285
90448
  form: "single",
package/dist/addon.mjs CHANGED
@@ -58601,6 +58601,13 @@ var MediaRelocateModeSchema = _enum([
58601
58601
  ]);
58602
58602
  var RelocateMediaInputSchema = object({
58603
58603
  toLocationId: string(),
58604
+ /**
58605
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
58606
+ * every row that is not already on `toLocationId` (the historical
58607
+ * behaviour). A named source is what a from→to migration needs: without it
58608
+ * "move events off disk 2" also emptied disk 1.
58609
+ */
58610
+ fromLocationId: string().optional(),
58604
58611
  throttleMbps: number().min(1).max(1e3).optional(),
58605
58612
  /** Omitted = `move`, the pre-existing behaviour. */
58606
58613
  mode: MediaRelocateModeSchema.optional()
@@ -58668,6 +58675,19 @@ var StorageMigrationDestinationsSchema = object({
58668
58675
  galleryMedia: string().min(1).optional()
58669
58676
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
58670
58677
  /**
58678
+ * Optional named source per class. Omitted = the class's current default
58679
+ * (the historical behaviour). A named source that is NOT the default is a
58680
+ * drain of that disk: bytes move, the default stays, and the source is
58681
+ * disabled when the move finishes.
58682
+ */
58683
+ var StorageMigrationSourcesSchema = object({
58684
+ recordings: string().min(1).optional(),
58685
+ recordingsLow: string().min(1).optional(),
58686
+ eventMedia: string().min(1).optional(),
58687
+ backups: string().min(1).optional(),
58688
+ galleryMedia: string().min(1).optional()
58689
+ }).optional();
58690
+ /**
58671
58691
  * How a migration sequences the cutover against the byte move.
58672
58692
  *
58673
58693
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -58689,6 +58709,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
58689
58709
  /** Shared input for planning and starting an orchestrated storage migration. */
58690
58710
  var StorageMigrationInputSchema = object({
58691
58711
  destinations: StorageMigrationDestinationsSchema,
58712
+ /** Omitted = each class's current default. */
58713
+ sources: StorageMigrationSourcesSchema,
58692
58714
  throttleMbps: number().min(1).max(1e3).optional(),
58693
58715
  /** Omitted = `blocking`, which stays the default. */
58694
58716
  mode: StorageMigrationModeSchema.optional()
@@ -58768,6 +58790,13 @@ var StorageMigrationMoveSchema = object({
58768
58790
  storageClass: StorageMigrationClassSchema,
58769
58791
  fromLocationId: string(),
58770
58792
  toLocationId: string(),
58793
+ /**
58794
+ * True when `from` was NOT the class default at plan time. The move still
58795
+ * copies bytes, but the default is left alone and the source is disabled
58796
+ * once the copy verifies. Absent on jobs planned before this field existed
58797
+ * — those jobs always repointed, which is `false`.
58798
+ */
58799
+ freezeSource: boolean().optional(),
58771
58800
  moverJobId: string().nullable(),
58772
58801
  state: RelocateJobStateSchema.nullable(),
58773
58802
  error: string().nullable(),
@@ -58781,6 +58810,7 @@ var StorageMigrationJobSchema = object({
58781
58810
  * can tell a seconds-long cutover from a thirty-hour one. */
58782
58811
  mode: StorageMigrationModeSchema,
58783
58812
  destinations: StorageMigrationDestinationsSchema,
58813
+ sources: StorageMigrationSourcesSchema,
58784
58814
  throttleMbps: number(),
58785
58815
  moves: array(StorageMigrationMoveSchema),
58786
58816
  pauseLeaseId: string().nullable(),
@@ -58806,6 +58836,7 @@ var StorageMigrationFindingSchema = object({
58806
58836
  });
58807
58837
  var StorageMigrationPlanSchema = object({
58808
58838
  destinations: StorageMigrationDestinationsSchema,
58839
+ sources: StorageMigrationSourcesSchema,
58809
58840
  /** The mode this plan was built for. A plan is only valid for its mode: the
58810
58841
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
58811
58842
  * it. */
@@ -58813,7 +58844,8 @@ var StorageMigrationPlanSchema = object({
58813
58844
  moves: array(object({
58814
58845
  storageClass: StorageMigrationClassSchema,
58815
58846
  fromLocationId: string(),
58816
- toLocationId: string()
58847
+ toLocationId: string(),
58848
+ freezeSource: boolean().optional()
58817
58849
  })),
58818
58850
  findings: array(StorageMigrationFindingSchema)
58819
58851
  });
@@ -58991,10 +59023,51 @@ var LedgerWalkReportSchema = object({
58991
59023
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
58992
59024
  var RelocatableMediaCountInputSchema = object({
58993
59025
  toLocationId: string().min(1),
59026
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
59027
+ fromLocationId: string().optional(),
58994
59028
  /** Omitted = `move`. */
58995
59029
  mode: MediaRelocateModeSchema.optional()
58996
59030
  });
58997
59031
  /**
59032
+ * Operator cleanup of leftover analytics rows, optional debug media, and
59033
+ * ghost ledger entries on frozen footage locations.
59034
+ *
59035
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
59036
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
59037
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
59038
+ * with no operator-visible status.
59039
+ */
59040
+ var StorageCleanupPhaseSchema = _enum([
59041
+ "orphans",
59042
+ "debug-media",
59043
+ "ghost-ledger",
59044
+ "done",
59045
+ "failed",
59046
+ "cancelled"
59047
+ ]);
59048
+ var StorageCleanupInputSchema = object({
59049
+ /** Also walk motion stills / track filmstrips. Off by default. */
59050
+ includeDebugMedia: boolean().optional() });
59051
+ var StorageCleanupJobSchema = object({
59052
+ jobId: string(),
59053
+ phase: StorageCleanupPhaseSchema,
59054
+ includeDebugMedia: boolean(),
59055
+ orphansReclaimed: number().int().nonnegative(),
59056
+ orphanBytesReclaimed: number().int().nonnegative(),
59057
+ debugMediaReclaimed: number().int().nonnegative(),
59058
+ debugMediaBytesReclaimed: number().int().nonnegative(),
59059
+ ghostsForgotten: number().int().nonnegative(),
59060
+ ghostBytesForgotten: number().int().nonnegative(),
59061
+ /** Short operator-facing line: current collection, pass, or location. */
59062
+ detail: string().nullable(),
59063
+ cancelRequested: boolean(),
59064
+ startedAt: number(),
59065
+ updatedAt: number(),
59066
+ finishedAt: number().nullable(),
59067
+ error: string().nullable()
59068
+ });
59069
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
59070
+ /**
58998
59071
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
58999
59072
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
59000
59073
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -59022,11 +59095,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
59022
59095
  * The default location for a type uses `id === <type>:default` by
59023
59096
  * convention (the bare type ref like `'backups'` resolves to it).
59024
59097
  *
59025
- * `isSystem: true` marks a location as orchestrator-seeded and
59026
- * undeletable. The bootstrap-installed defaults (one per type) carry
59027
- * this flag; operator-added locations don't. Editing the config of
59028
- * a system location is allowed (path migration, provider swap) but
59029
- * deleting it is rejected at the cap level.
59098
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
59099
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
59100
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
59101
+ * / last-enabled, not on this bit.
59030
59102
  */
59031
59103
  var StorageLocationSchema = object({
59032
59104
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -63569,6 +63641,12 @@ method(object({
63569
63641
  }), _void(), {
63570
63642
  kind: "mutation",
63571
63643
  auth: "admin"
63644
+ }), method(object({
63645
+ from: string(),
63646
+ to: string()
63647
+ }), object({ moved: number() }), {
63648
+ kind: "mutation",
63649
+ auth: "admin"
63572
63650
  }), method(object({
63573
63651
  deviceId: number(),
63574
63652
  disabled: boolean()
@@ -66319,6 +66397,8 @@ var NcSystemEventKindSchema = _enum([
66319
66397
  "device-offline",
66320
66398
  "device-disabled",
66321
66399
  "device-enabled",
66400
+ "device-battery-low",
66401
+ "device-battery-normal",
66322
66402
  "stream-online",
66323
66403
  "stream-offline",
66324
66404
  "node-online",
@@ -69577,46 +69657,6 @@ var RecentTracksPageSchema = object({
69577
69657
  /** Cursor for the next page, or null when this page is the last. */
69578
69658
  nextCursor: string().nullable()
69579
69659
  });
69580
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
69581
- var LIST_GROUPS_MAX_LIMIT = 100;
69582
- var AnalyticsGroupRecordSchema = object({
69583
- id: string(),
69584
- deviceId: number().int(),
69585
- openedAt: number().int(),
69586
- closedAt: number().int(),
69587
- timestamp: number().int(),
69588
- memberCount: number().int(),
69589
- memberTrackIds: array(string()).readonly(),
69590
- className: string(),
69591
- classes: array(string()).readonly(),
69592
- /** Relative event-media path, or null when the group has no picture yet. */
69593
- mediaUrl: string().nullable(),
69594
- singleton: boolean()
69595
- });
69596
- var AnalyticsGroupMemberSchema = object({
69597
- trackId: string(),
69598
- deviceId: number().int(),
69599
- className: string(),
69600
- firstSeen: number().int(),
69601
- lastSeen: number().int(),
69602
- mediaUrl: string().nullable()
69603
- });
69604
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
69605
- var ListGroupsQueryInput = object({
69606
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
69607
- deviceIds: array(number()),
69608
- /** Window lower bound on `closedAt` (inclusive). */
69609
- since: number().optional(),
69610
- /** Window upper bound on `openedAt` (inclusive). */
69611
- until: number().optional(),
69612
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
69613
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
69614
- cursor: string().optional()
69615
- });
69616
- var ListGroupsPageSchema = object({
69617
- groups: array(AnalyticsGroupRecordSchema).readonly(),
69618
- nextCursor: string().nullable()
69619
- });
69620
69660
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
69621
69661
  var KEY_EVENTS_MAX_LIMIT = 200;
69622
69662
  var KeyEventQueryInput = object({
@@ -69720,9 +69760,7 @@ var TrackCascadeCountsSchema = object({
69720
69760
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
69721
69761
  plates: number().int(),
69722
69762
  /** Per-track CLIP search vectors removed (best-effort). */
69723
- embeddings: number().int(),
69724
- /** Group membership + group rows removed with their last member (best-effort). */
69725
- groups: number().int()
69763
+ embeddings: number().int()
69726
69764
  });
69727
69765
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
69728
69766
  var DiskReconcileCountsSchema = object({
@@ -69892,6 +69930,47 @@ var RebuildStatusSchema = object({
69892
69930
  /** Present when the pass ended by throwing. */
69893
69931
  error: string().nullable()
69894
69932
  });
69933
+ /**
69934
+ * Acknowledgement that a debug-media reclaim STARTED.
69935
+ *
69936
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
69937
+ * it runs detached and this returns immediately. Awaiting it is how the
69938
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
69939
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
69940
+ */
69941
+ var MediaReclaimStartResultSchema = object({
69942
+ started: boolean(),
69943
+ /** True when a pass was already running; the new request is ignored. */
69944
+ alreadyRunning: boolean()
69945
+ });
69946
+ var MediaReclaimInputSchema = object({
69947
+ mode: _enum(["report", "reclaim"]).default("report"),
69948
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
69949
+ deviceIds: array(number().int()).min(1).optional(),
69950
+ restart: boolean().optional(),
69951
+ pageSize: number().int().min(50).max(5e3).optional(),
69952
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
69953
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
69954
+ maxBytesPerRun: number().int().min(1).optional(),
69955
+ budgetMinutes: number().int().min(1).max(720).optional(),
69956
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
69957
+ graceMinutes: number().int().min(1).max(10080).optional()
69958
+ });
69959
+ var MediaReclaimStatusSchema = object({
69960
+ running: boolean(),
69961
+ mode: _enum(["report", "reclaim"]).nullable(),
69962
+ totalExamined: number(),
69963
+ totalEligible: number(),
69964
+ totalReclaimed: number(),
69965
+ totalBytesReclaimed: number(),
69966
+ totalRefused: number(),
69967
+ /** Device+scope windows finished in this pass. */
69968
+ devicesDone: number(),
69969
+ complete: boolean().nullable(),
69970
+ startedAtMs: number().nullable(),
69971
+ finishedAtMs: number().nullable(),
69972
+ error: string().nullable()
69973
+ });
69895
69974
  var ReplayFrameInputSchema = object({
69896
69975
  timestamp: number(),
69897
69976
  frame: PipelineRunResultBridge
@@ -69930,10 +70009,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
69930
70009
  * stationary registry). Default false: the timeline lists passages,
69931
70010
  * not parking records (operator decision, 2026-08-15). */
69932
70011
  includeStationary: boolean().optional()
69933
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
69934
- deviceId: number(),
69935
- groupId: string().min(1)
69936
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
70012
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
69937
70013
  kind: "mutation",
69938
70014
  auth: "admin"
69939
70015
  }), 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({
@@ -70033,6 +70109,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
70033
70109
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
70034
70110
  kind: "query",
70035
70111
  auth: "admin"
70112
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
70113
+ kind: "mutation",
70114
+ auth: "admin"
70115
+ }), method(object({}), MediaReclaimStatusSchema, {
70116
+ kind: "query",
70117
+ auth: "admin"
70036
70118
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
70037
70119
  kind: "query",
70038
70120
  auth: "admin"
@@ -72003,7 +72085,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
72003
72085
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
72004
72086
  kind: "mutation",
72005
72087
  auth: "admin"
72006
- });
72088
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
72089
+ kind: "mutation",
72090
+ auth: "admin"
72091
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
72092
+ kind: "mutation",
72093
+ auth: "admin"
72094
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
72007
72095
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
72008
72096
  providerId: string().min(1),
72009
72097
  displayName: string().min(1),
@@ -79121,6 +79209,33 @@ var RecordingRebalanceInputSchema = object({
79121
79209
  minMoveGb: number().min(0).optional()
79122
79210
  });
79123
79211
  /**
79212
+ * Operator-facing placement of one camera onto a recordings location.
79213
+ *
79214
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
79215
+ * Auto (the planner may move this camera). `locationId` is where high/mid
79216
+ * currently write — the plan, which may disagree with the pin when Auto.
79217
+ */
79218
+ var RecordingDevicePlacementSchema = object({
79219
+ deviceId: number().int(),
79220
+ profile: string(),
79221
+ locationId: string()
79222
+ });
79223
+ var RecordingDevicePinSchema = object({
79224
+ deviceId: number().int(),
79225
+ /** Recordings-class location this camera is pinned to. */
79226
+ locationId: string()
79227
+ });
79228
+ var RecordingPlacementViewSchema = object({
79229
+ assignments: array(RecordingDevicePlacementSchema),
79230
+ pins: array(RecordingDevicePinSchema),
79231
+ defaultLocations: record(string(), string())
79232
+ });
79233
+ var RecordingSetDevicePlacementInputSchema = object({
79234
+ deviceId: number().int(),
79235
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
79236
+ locationId: string().nullable()
79237
+ });
79238
+ /**
79124
79239
  * Result of locating footage at a wall-clock instant for one device/profile.
79125
79240
  * `segment` carries the covering segment's window; `gap` reports the forward
79126
79241
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -79346,6 +79461,12 @@ method(object({
79346
79461
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
79347
79462
  kind: "mutation",
79348
79463
  auth: "admin"
79464
+ }), method(object({}), RecordingPlacementViewSchema, {
79465
+ kind: "query",
79466
+ auth: "admin"
79467
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
79468
+ kind: "mutation",
79469
+ auth: "admin"
79349
79470
  });
79350
79471
  /**
79351
79472
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -84415,6 +84536,12 @@ Object.freeze({
84415
84536
  addonId: null,
84416
84537
  access: "delete"
84417
84538
  },
84539
+ "deviceManager.renameLocation": {
84540
+ capName: "device-manager",
84541
+ capScope: "system",
84542
+ addonId: null,
84543
+ access: "create"
84544
+ },
84418
84545
  "deviceManager.runDeviceAction": {
84419
84546
  capName: "device-manager",
84420
84547
  capScope: "system",
@@ -86107,19 +86234,19 @@ Object.freeze({
86107
86234
  addonId: null,
86108
86235
  access: "view"
86109
86236
  },
86110
- "pipelineAnalytics.getGroup": {
86237
+ "pipelineAnalytics.getKeyEvents": {
86111
86238
  capName: "pipeline-analytics",
86112
86239
  capScope: "device",
86113
86240
  addonId: null,
86114
86241
  access: "view"
86115
86242
  },
86116
- "pipelineAnalytics.getKeyEvents": {
86243
+ "pipelineAnalytics.getKeyEventsBatch": {
86117
86244
  capName: "pipeline-analytics",
86118
86245
  capScope: "device",
86119
86246
  addonId: null,
86120
86247
  access: "view"
86121
86248
  },
86122
- "pipelineAnalytics.getKeyEventsBatch": {
86249
+ "pipelineAnalytics.getMediaReclaimStatus": {
86123
86250
  capName: "pipeline-analytics",
86124
86251
  capScope: "device",
86125
86252
  addonId: null,
@@ -86209,12 +86336,6 @@ Object.freeze({
86209
86336
  addonId: null,
86210
86337
  access: "view"
86211
86338
  },
86212
- "pipelineAnalytics.listGroups": {
86213
- capName: "pipeline-analytics",
86214
- capScope: "device",
86215
- addonId: null,
86216
- access: "view"
86217
- },
86218
86339
  "pipelineAnalytics.listOpsLog": {
86219
86340
  capName: "pipeline-analytics",
86220
86341
  capScope: "device",
@@ -86299,6 +86420,12 @@ Object.freeze({
86299
86420
  addonId: null,
86300
86421
  access: "create"
86301
86422
  },
86423
+ "pipelineAnalytics.reclaimDebugMedia": {
86424
+ capName: "pipeline-analytics",
86425
+ capScope: "device",
86426
+ addonId: null,
86427
+ access: "create"
86428
+ },
86302
86429
  "pipelineAnalytics.reconcileFromDisk": {
86303
86430
  capName: "pipeline-analytics",
86304
86431
  capScope: "device",
@@ -87223,6 +87350,12 @@ Object.freeze({
87223
87350
  addonId: null,
87224
87351
  access: "view"
87225
87352
  },
87353
+ "recording.getPlacement": {
87354
+ capName: "recording",
87355
+ capScope: "system",
87356
+ addonId: null,
87357
+ access: "view"
87358
+ },
87226
87359
  "recording.getPlaybackManifest": {
87227
87360
  capName: "recording",
87228
87361
  capScope: "system",
@@ -87349,6 +87482,12 @@ Object.freeze({
87349
87482
  addonId: null,
87350
87483
  access: "create"
87351
87484
  },
87485
+ "recording.setDevicePlacement": {
87486
+ capName: "recording",
87487
+ capScope: "system",
87488
+ addonId: null,
87489
+ access: "create"
87490
+ },
87352
87491
  "recording.startStorageMigrationMove": {
87353
87492
  capName: "recording",
87354
87493
  capScope: "system",
@@ -87793,12 +87932,36 @@ Object.freeze({
87793
87932
  addonId: null,
87794
87933
  access: "create"
87795
87934
  },
87935
+ "storageMigration.cleanupCancel": {
87936
+ capName: "storage-migration",
87937
+ capScope: "system",
87938
+ addonId: null,
87939
+ access: "create"
87940
+ },
87941
+ "storageMigration.cleanupStart": {
87942
+ capName: "storage-migration",
87943
+ capScope: "system",
87944
+ addonId: null,
87945
+ access: "create"
87946
+ },
87947
+ "storageMigration.cleanupStatus": {
87948
+ capName: "storage-migration",
87949
+ capScope: "system",
87950
+ addonId: null,
87951
+ access: "view"
87952
+ },
87796
87953
  "storageMigration.drain": {
87797
87954
  capName: "storage-migration",
87798
87955
  capScope: "system",
87799
87956
  addonId: null,
87800
87957
  access: "create"
87801
87958
  },
87959
+ "storageMigration.history": {
87960
+ capName: "storage-migration",
87961
+ capScope: "system",
87962
+ addonId: null,
87963
+ access: "view"
87964
+ },
87802
87965
  "storageMigration.movers": {
87803
87966
  capName: "storage-migration",
87804
87967
  capScope: "system",
@@ -89795,11 +89958,6 @@ Object.freeze({
89795
89958
  form: "single",
89796
89959
  optional: true
89797
89960
  }],
89798
- "pipelineAnalytics.getGroup": [{
89799
- name: "deviceId",
89800
- form: "single",
89801
- optional: false
89802
- }],
89803
89961
  "pipelineAnalytics.getKeyEvents": [{
89804
89962
  name: "deviceId",
89805
89963
  form: "single",
@@ -89865,11 +90023,6 @@ Object.freeze({
89865
90023
  form: "single",
89866
90024
  optional: false
89867
90025
  }],
89868
- "pipelineAnalytics.listGroups": [{
89869
- name: "deviceIds",
89870
- form: "array",
89871
- optional: false
89872
- }],
89873
90026
  "pipelineAnalytics.listOpsLog": [{
89874
90027
  name: "deviceId",
89875
90028
  form: "single",
@@ -89915,6 +90068,11 @@ Object.freeze({
89915
90068
  form: "single",
89916
90069
  optional: true
89917
90070
  }],
90071
+ "pipelineAnalytics.reclaimDebugMedia": [{
90072
+ name: "deviceIds",
90073
+ form: "array",
90074
+ optional: true
90075
+ }],
89918
90076
  "pipelineAnalytics.reconcileFromDisk": [{
89919
90077
  name: "deviceId",
89920
90078
  form: "single",
@@ -90280,6 +90438,11 @@ Object.freeze({
90280
90438
  form: "single",
90281
90439
  optional: false
90282
90440
  }],
90441
+ "recording.setDevicePlacement": [{
90442
+ name: "deviceId",
90443
+ form: "single",
90444
+ optional: false
90445
+ }],
90283
90446
  "recording.startStorageMigrationMove": [{
90284
90447
  name: "deviceId",
90285
90448
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-dreame",
3
- "version": "0.2.49",
3
+ "version": "0.2.51",
4
4
  "description": "Dreame robot-vacuum / lawn-mower device-provider addon for CamStack — wraps the @apocaliss92/nodedreame Dreamehome cloud client",
5
5
  "keywords": [
6
6
  "camstack",