@camstack/addon-provider-dreame 0.2.49 → 0.2.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/addon.js +234 -73
  2. package/dist/addon.mjs +234 -73
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -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()
@@ -69577,46 +69655,6 @@ var RecentTracksPageSchema = object({
69577
69655
  /** Cursor for the next page, or null when this page is the last. */
69578
69656
  nextCursor: string().nullable()
69579
69657
  });
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
69658
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
69621
69659
  var KEY_EVENTS_MAX_LIMIT = 200;
69622
69660
  var KeyEventQueryInput = object({
@@ -69720,9 +69758,7 @@ var TrackCascadeCountsSchema = object({
69720
69758
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
69721
69759
  plates: number().int(),
69722
69760
  /** 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()
69761
+ embeddings: number().int()
69726
69762
  });
69727
69763
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
69728
69764
  var DiskReconcileCountsSchema = object({
@@ -69892,6 +69928,47 @@ var RebuildStatusSchema = object({
69892
69928
  /** Present when the pass ended by throwing. */
69893
69929
  error: string().nullable()
69894
69930
  });
69931
+ /**
69932
+ * Acknowledgement that a debug-media reclaim STARTED.
69933
+ *
69934
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
69935
+ * it runs detached and this returns immediately. Awaiting it is how the
69936
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
69937
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
69938
+ */
69939
+ var MediaReclaimStartResultSchema = object({
69940
+ started: boolean(),
69941
+ /** True when a pass was already running; the new request is ignored. */
69942
+ alreadyRunning: boolean()
69943
+ });
69944
+ var MediaReclaimInputSchema = object({
69945
+ mode: _enum(["report", "reclaim"]).default("report"),
69946
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
69947
+ deviceIds: array(number().int()).min(1).optional(),
69948
+ restart: boolean().optional(),
69949
+ pageSize: number().int().min(50).max(5e3).optional(),
69950
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
69951
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
69952
+ maxBytesPerRun: number().int().min(1).optional(),
69953
+ budgetMinutes: number().int().min(1).max(720).optional(),
69954
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
69955
+ graceMinutes: number().int().min(1).max(10080).optional()
69956
+ });
69957
+ var MediaReclaimStatusSchema = object({
69958
+ running: boolean(),
69959
+ mode: _enum(["report", "reclaim"]).nullable(),
69960
+ totalExamined: number(),
69961
+ totalEligible: number(),
69962
+ totalReclaimed: number(),
69963
+ totalBytesReclaimed: number(),
69964
+ totalRefused: number(),
69965
+ /** Device+scope windows finished in this pass. */
69966
+ devicesDone: number(),
69967
+ complete: boolean().nullable(),
69968
+ startedAtMs: number().nullable(),
69969
+ finishedAtMs: number().nullable(),
69970
+ error: string().nullable()
69971
+ });
69895
69972
  var ReplayFrameInputSchema = object({
69896
69973
  timestamp: number(),
69897
69974
  frame: PipelineRunResultBridge
@@ -69930,10 +70007,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
69930
70007
  * stationary registry). Default false: the timeline lists passages,
69931
70008
  * not parking records (operator decision, 2026-08-15). */
69932
70009
  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(), {
70010
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
69937
70011
  kind: "mutation",
69938
70012
  auth: "admin"
69939
70013
  }), 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 +70107,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
70033
70107
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
70034
70108
  kind: "query",
70035
70109
  auth: "admin"
70110
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
70111
+ kind: "mutation",
70112
+ auth: "admin"
70113
+ }), method(object({}), MediaReclaimStatusSchema, {
70114
+ kind: "query",
70115
+ auth: "admin"
70036
70116
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
70037
70117
  kind: "query",
70038
70118
  auth: "admin"
@@ -72003,7 +72083,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
72003
72083
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
72004
72084
  kind: "mutation",
72005
72085
  auth: "admin"
72006
- });
72086
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
72087
+ kind: "mutation",
72088
+ auth: "admin"
72089
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
72090
+ kind: "mutation",
72091
+ auth: "admin"
72092
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
72007
72093
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
72008
72094
  providerId: string().min(1),
72009
72095
  displayName: string().min(1),
@@ -79121,6 +79207,33 @@ var RecordingRebalanceInputSchema = object({
79121
79207
  minMoveGb: number().min(0).optional()
79122
79208
  });
79123
79209
  /**
79210
+ * Operator-facing placement of one camera onto a recordings location.
79211
+ *
79212
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
79213
+ * Auto (the planner may move this camera). `locationId` is where high/mid
79214
+ * currently write — the plan, which may disagree with the pin when Auto.
79215
+ */
79216
+ var RecordingDevicePlacementSchema = object({
79217
+ deviceId: number().int(),
79218
+ profile: string(),
79219
+ locationId: string()
79220
+ });
79221
+ var RecordingDevicePinSchema = object({
79222
+ deviceId: number().int(),
79223
+ /** Recordings-class location this camera is pinned to. */
79224
+ locationId: string()
79225
+ });
79226
+ var RecordingPlacementViewSchema = object({
79227
+ assignments: array(RecordingDevicePlacementSchema),
79228
+ pins: array(RecordingDevicePinSchema),
79229
+ defaultLocations: record(string(), string())
79230
+ });
79231
+ var RecordingSetDevicePlacementInputSchema = object({
79232
+ deviceId: number().int(),
79233
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
79234
+ locationId: string().nullable()
79235
+ });
79236
+ /**
79124
79237
  * Result of locating footage at a wall-clock instant for one device/profile.
79125
79238
  * `segment` carries the covering segment's window; `gap` reports the forward
79126
79239
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -79346,6 +79459,12 @@ method(object({
79346
79459
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
79347
79460
  kind: "mutation",
79348
79461
  auth: "admin"
79462
+ }), method(object({}), RecordingPlacementViewSchema, {
79463
+ kind: "query",
79464
+ auth: "admin"
79465
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
79466
+ kind: "mutation",
79467
+ auth: "admin"
79349
79468
  });
79350
79469
  /**
79351
79470
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -84415,6 +84534,12 @@ Object.freeze({
84415
84534
  addonId: null,
84416
84535
  access: "delete"
84417
84536
  },
84537
+ "deviceManager.renameLocation": {
84538
+ capName: "device-manager",
84539
+ capScope: "system",
84540
+ addonId: null,
84541
+ access: "create"
84542
+ },
84418
84543
  "deviceManager.runDeviceAction": {
84419
84544
  capName: "device-manager",
84420
84545
  capScope: "system",
@@ -86107,19 +86232,19 @@ Object.freeze({
86107
86232
  addonId: null,
86108
86233
  access: "view"
86109
86234
  },
86110
- "pipelineAnalytics.getGroup": {
86235
+ "pipelineAnalytics.getKeyEvents": {
86111
86236
  capName: "pipeline-analytics",
86112
86237
  capScope: "device",
86113
86238
  addonId: null,
86114
86239
  access: "view"
86115
86240
  },
86116
- "pipelineAnalytics.getKeyEvents": {
86241
+ "pipelineAnalytics.getKeyEventsBatch": {
86117
86242
  capName: "pipeline-analytics",
86118
86243
  capScope: "device",
86119
86244
  addonId: null,
86120
86245
  access: "view"
86121
86246
  },
86122
- "pipelineAnalytics.getKeyEventsBatch": {
86247
+ "pipelineAnalytics.getMediaReclaimStatus": {
86123
86248
  capName: "pipeline-analytics",
86124
86249
  capScope: "device",
86125
86250
  addonId: null,
@@ -86209,12 +86334,6 @@ Object.freeze({
86209
86334
  addonId: null,
86210
86335
  access: "view"
86211
86336
  },
86212
- "pipelineAnalytics.listGroups": {
86213
- capName: "pipeline-analytics",
86214
- capScope: "device",
86215
- addonId: null,
86216
- access: "view"
86217
- },
86218
86337
  "pipelineAnalytics.listOpsLog": {
86219
86338
  capName: "pipeline-analytics",
86220
86339
  capScope: "device",
@@ -86299,6 +86418,12 @@ Object.freeze({
86299
86418
  addonId: null,
86300
86419
  access: "create"
86301
86420
  },
86421
+ "pipelineAnalytics.reclaimDebugMedia": {
86422
+ capName: "pipeline-analytics",
86423
+ capScope: "device",
86424
+ addonId: null,
86425
+ access: "create"
86426
+ },
86302
86427
  "pipelineAnalytics.reconcileFromDisk": {
86303
86428
  capName: "pipeline-analytics",
86304
86429
  capScope: "device",
@@ -87223,6 +87348,12 @@ Object.freeze({
87223
87348
  addonId: null,
87224
87349
  access: "view"
87225
87350
  },
87351
+ "recording.getPlacement": {
87352
+ capName: "recording",
87353
+ capScope: "system",
87354
+ addonId: null,
87355
+ access: "view"
87356
+ },
87226
87357
  "recording.getPlaybackManifest": {
87227
87358
  capName: "recording",
87228
87359
  capScope: "system",
@@ -87349,6 +87480,12 @@ Object.freeze({
87349
87480
  addonId: null,
87350
87481
  access: "create"
87351
87482
  },
87483
+ "recording.setDevicePlacement": {
87484
+ capName: "recording",
87485
+ capScope: "system",
87486
+ addonId: null,
87487
+ access: "create"
87488
+ },
87352
87489
  "recording.startStorageMigrationMove": {
87353
87490
  capName: "recording",
87354
87491
  capScope: "system",
@@ -87793,12 +87930,36 @@ Object.freeze({
87793
87930
  addonId: null,
87794
87931
  access: "create"
87795
87932
  },
87933
+ "storageMigration.cleanupCancel": {
87934
+ capName: "storage-migration",
87935
+ capScope: "system",
87936
+ addonId: null,
87937
+ access: "create"
87938
+ },
87939
+ "storageMigration.cleanupStart": {
87940
+ capName: "storage-migration",
87941
+ capScope: "system",
87942
+ addonId: null,
87943
+ access: "create"
87944
+ },
87945
+ "storageMigration.cleanupStatus": {
87946
+ capName: "storage-migration",
87947
+ capScope: "system",
87948
+ addonId: null,
87949
+ access: "view"
87950
+ },
87796
87951
  "storageMigration.drain": {
87797
87952
  capName: "storage-migration",
87798
87953
  capScope: "system",
87799
87954
  addonId: null,
87800
87955
  access: "create"
87801
87956
  },
87957
+ "storageMigration.history": {
87958
+ capName: "storage-migration",
87959
+ capScope: "system",
87960
+ addonId: null,
87961
+ access: "view"
87962
+ },
87802
87963
  "storageMigration.movers": {
87803
87964
  capName: "storage-migration",
87804
87965
  capScope: "system",
@@ -89795,11 +89956,6 @@ Object.freeze({
89795
89956
  form: "single",
89796
89957
  optional: true
89797
89958
  }],
89798
- "pipelineAnalytics.getGroup": [{
89799
- name: "deviceId",
89800
- form: "single",
89801
- optional: false
89802
- }],
89803
89959
  "pipelineAnalytics.getKeyEvents": [{
89804
89960
  name: "deviceId",
89805
89961
  form: "single",
@@ -89865,11 +90021,6 @@ Object.freeze({
89865
90021
  form: "single",
89866
90022
  optional: false
89867
90023
  }],
89868
- "pipelineAnalytics.listGroups": [{
89869
- name: "deviceIds",
89870
- form: "array",
89871
- optional: false
89872
- }],
89873
90024
  "pipelineAnalytics.listOpsLog": [{
89874
90025
  name: "deviceId",
89875
90026
  form: "single",
@@ -89915,6 +90066,11 @@ Object.freeze({
89915
90066
  form: "single",
89916
90067
  optional: true
89917
90068
  }],
90069
+ "pipelineAnalytics.reclaimDebugMedia": [{
90070
+ name: "deviceIds",
90071
+ form: "array",
90072
+ optional: true
90073
+ }],
89918
90074
  "pipelineAnalytics.reconcileFromDisk": [{
89919
90075
  name: "deviceId",
89920
90076
  form: "single",
@@ -90280,6 +90436,11 @@ Object.freeze({
90280
90436
  form: "single",
90281
90437
  optional: false
90282
90438
  }],
90439
+ "recording.setDevicePlacement": [{
90440
+ name: "deviceId",
90441
+ form: "single",
90442
+ optional: false
90443
+ }],
90283
90444
  "recording.startStorageMigrationMove": [{
90284
90445
  name: "deviceId",
90285
90446
  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()
@@ -69577,46 +69655,6 @@ var RecentTracksPageSchema = object({
69577
69655
  /** Cursor for the next page, or null when this page is the last. */
69578
69656
  nextCursor: string().nullable()
69579
69657
  });
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
69658
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
69621
69659
  var KEY_EVENTS_MAX_LIMIT = 200;
69622
69660
  var KeyEventQueryInput = object({
@@ -69720,9 +69758,7 @@ var TrackCascadeCountsSchema = object({
69720
69758
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
69721
69759
  plates: number().int(),
69722
69760
  /** 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()
69761
+ embeddings: number().int()
69726
69762
  });
69727
69763
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
69728
69764
  var DiskReconcileCountsSchema = object({
@@ -69892,6 +69928,47 @@ var RebuildStatusSchema = object({
69892
69928
  /** Present when the pass ended by throwing. */
69893
69929
  error: string().nullable()
69894
69930
  });
69931
+ /**
69932
+ * Acknowledgement that a debug-media reclaim STARTED.
69933
+ *
69934
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
69935
+ * it runs detached and this returns immediately. Awaiting it is how the
69936
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
69937
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
69938
+ */
69939
+ var MediaReclaimStartResultSchema = object({
69940
+ started: boolean(),
69941
+ /** True when a pass was already running; the new request is ignored. */
69942
+ alreadyRunning: boolean()
69943
+ });
69944
+ var MediaReclaimInputSchema = object({
69945
+ mode: _enum(["report", "reclaim"]).default("report"),
69946
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
69947
+ deviceIds: array(number().int()).min(1).optional(),
69948
+ restart: boolean().optional(),
69949
+ pageSize: number().int().min(50).max(5e3).optional(),
69950
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
69951
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
69952
+ maxBytesPerRun: number().int().min(1).optional(),
69953
+ budgetMinutes: number().int().min(1).max(720).optional(),
69954
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
69955
+ graceMinutes: number().int().min(1).max(10080).optional()
69956
+ });
69957
+ var MediaReclaimStatusSchema = object({
69958
+ running: boolean(),
69959
+ mode: _enum(["report", "reclaim"]).nullable(),
69960
+ totalExamined: number(),
69961
+ totalEligible: number(),
69962
+ totalReclaimed: number(),
69963
+ totalBytesReclaimed: number(),
69964
+ totalRefused: number(),
69965
+ /** Device+scope windows finished in this pass. */
69966
+ devicesDone: number(),
69967
+ complete: boolean().nullable(),
69968
+ startedAtMs: number().nullable(),
69969
+ finishedAtMs: number().nullable(),
69970
+ error: string().nullable()
69971
+ });
69895
69972
  var ReplayFrameInputSchema = object({
69896
69973
  timestamp: number(),
69897
69974
  frame: PipelineRunResultBridge
@@ -69930,10 +70007,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
69930
70007
  * stationary registry). Default false: the timeline lists passages,
69931
70008
  * not parking records (operator decision, 2026-08-15). */
69932
70009
  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(), {
70010
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
69937
70011
  kind: "mutation",
69938
70012
  auth: "admin"
69939
70013
  }), 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 +70107,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
70033
70107
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
70034
70108
  kind: "query",
70035
70109
  auth: "admin"
70110
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
70111
+ kind: "mutation",
70112
+ auth: "admin"
70113
+ }), method(object({}), MediaReclaimStatusSchema, {
70114
+ kind: "query",
70115
+ auth: "admin"
70036
70116
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
70037
70117
  kind: "query",
70038
70118
  auth: "admin"
@@ -72003,7 +72083,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
72003
72083
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
72004
72084
  kind: "mutation",
72005
72085
  auth: "admin"
72006
- });
72086
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
72087
+ kind: "mutation",
72088
+ auth: "admin"
72089
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
72090
+ kind: "mutation",
72091
+ auth: "admin"
72092
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
72007
72093
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
72008
72094
  providerId: string().min(1),
72009
72095
  displayName: string().min(1),
@@ -79121,6 +79207,33 @@ var RecordingRebalanceInputSchema = object({
79121
79207
  minMoveGb: number().min(0).optional()
79122
79208
  });
79123
79209
  /**
79210
+ * Operator-facing placement of one camera onto a recordings location.
79211
+ *
79212
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
79213
+ * Auto (the planner may move this camera). `locationId` is where high/mid
79214
+ * currently write — the plan, which may disagree with the pin when Auto.
79215
+ */
79216
+ var RecordingDevicePlacementSchema = object({
79217
+ deviceId: number().int(),
79218
+ profile: string(),
79219
+ locationId: string()
79220
+ });
79221
+ var RecordingDevicePinSchema = object({
79222
+ deviceId: number().int(),
79223
+ /** Recordings-class location this camera is pinned to. */
79224
+ locationId: string()
79225
+ });
79226
+ var RecordingPlacementViewSchema = object({
79227
+ assignments: array(RecordingDevicePlacementSchema),
79228
+ pins: array(RecordingDevicePinSchema),
79229
+ defaultLocations: record(string(), string())
79230
+ });
79231
+ var RecordingSetDevicePlacementInputSchema = object({
79232
+ deviceId: number().int(),
79233
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
79234
+ locationId: string().nullable()
79235
+ });
79236
+ /**
79124
79237
  * Result of locating footage at a wall-clock instant for one device/profile.
79125
79238
  * `segment` carries the covering segment's window; `gap` reports the forward
79126
79239
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -79346,6 +79459,12 @@ method(object({
79346
79459
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
79347
79460
  kind: "mutation",
79348
79461
  auth: "admin"
79462
+ }), method(object({}), RecordingPlacementViewSchema, {
79463
+ kind: "query",
79464
+ auth: "admin"
79465
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
79466
+ kind: "mutation",
79467
+ auth: "admin"
79349
79468
  });
79350
79469
  /**
79351
79470
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -84415,6 +84534,12 @@ Object.freeze({
84415
84534
  addonId: null,
84416
84535
  access: "delete"
84417
84536
  },
84537
+ "deviceManager.renameLocation": {
84538
+ capName: "device-manager",
84539
+ capScope: "system",
84540
+ addonId: null,
84541
+ access: "create"
84542
+ },
84418
84543
  "deviceManager.runDeviceAction": {
84419
84544
  capName: "device-manager",
84420
84545
  capScope: "system",
@@ -86107,19 +86232,19 @@ Object.freeze({
86107
86232
  addonId: null,
86108
86233
  access: "view"
86109
86234
  },
86110
- "pipelineAnalytics.getGroup": {
86235
+ "pipelineAnalytics.getKeyEvents": {
86111
86236
  capName: "pipeline-analytics",
86112
86237
  capScope: "device",
86113
86238
  addonId: null,
86114
86239
  access: "view"
86115
86240
  },
86116
- "pipelineAnalytics.getKeyEvents": {
86241
+ "pipelineAnalytics.getKeyEventsBatch": {
86117
86242
  capName: "pipeline-analytics",
86118
86243
  capScope: "device",
86119
86244
  addonId: null,
86120
86245
  access: "view"
86121
86246
  },
86122
- "pipelineAnalytics.getKeyEventsBatch": {
86247
+ "pipelineAnalytics.getMediaReclaimStatus": {
86123
86248
  capName: "pipeline-analytics",
86124
86249
  capScope: "device",
86125
86250
  addonId: null,
@@ -86209,12 +86334,6 @@ Object.freeze({
86209
86334
  addonId: null,
86210
86335
  access: "view"
86211
86336
  },
86212
- "pipelineAnalytics.listGroups": {
86213
- capName: "pipeline-analytics",
86214
- capScope: "device",
86215
- addonId: null,
86216
- access: "view"
86217
- },
86218
86337
  "pipelineAnalytics.listOpsLog": {
86219
86338
  capName: "pipeline-analytics",
86220
86339
  capScope: "device",
@@ -86299,6 +86418,12 @@ Object.freeze({
86299
86418
  addonId: null,
86300
86419
  access: "create"
86301
86420
  },
86421
+ "pipelineAnalytics.reclaimDebugMedia": {
86422
+ capName: "pipeline-analytics",
86423
+ capScope: "device",
86424
+ addonId: null,
86425
+ access: "create"
86426
+ },
86302
86427
  "pipelineAnalytics.reconcileFromDisk": {
86303
86428
  capName: "pipeline-analytics",
86304
86429
  capScope: "device",
@@ -87223,6 +87348,12 @@ Object.freeze({
87223
87348
  addonId: null,
87224
87349
  access: "view"
87225
87350
  },
87351
+ "recording.getPlacement": {
87352
+ capName: "recording",
87353
+ capScope: "system",
87354
+ addonId: null,
87355
+ access: "view"
87356
+ },
87226
87357
  "recording.getPlaybackManifest": {
87227
87358
  capName: "recording",
87228
87359
  capScope: "system",
@@ -87349,6 +87480,12 @@ Object.freeze({
87349
87480
  addonId: null,
87350
87481
  access: "create"
87351
87482
  },
87483
+ "recording.setDevicePlacement": {
87484
+ capName: "recording",
87485
+ capScope: "system",
87486
+ addonId: null,
87487
+ access: "create"
87488
+ },
87352
87489
  "recording.startStorageMigrationMove": {
87353
87490
  capName: "recording",
87354
87491
  capScope: "system",
@@ -87793,12 +87930,36 @@ Object.freeze({
87793
87930
  addonId: null,
87794
87931
  access: "create"
87795
87932
  },
87933
+ "storageMigration.cleanupCancel": {
87934
+ capName: "storage-migration",
87935
+ capScope: "system",
87936
+ addonId: null,
87937
+ access: "create"
87938
+ },
87939
+ "storageMigration.cleanupStart": {
87940
+ capName: "storage-migration",
87941
+ capScope: "system",
87942
+ addonId: null,
87943
+ access: "create"
87944
+ },
87945
+ "storageMigration.cleanupStatus": {
87946
+ capName: "storage-migration",
87947
+ capScope: "system",
87948
+ addonId: null,
87949
+ access: "view"
87950
+ },
87796
87951
  "storageMigration.drain": {
87797
87952
  capName: "storage-migration",
87798
87953
  capScope: "system",
87799
87954
  addonId: null,
87800
87955
  access: "create"
87801
87956
  },
87957
+ "storageMigration.history": {
87958
+ capName: "storage-migration",
87959
+ capScope: "system",
87960
+ addonId: null,
87961
+ access: "view"
87962
+ },
87802
87963
  "storageMigration.movers": {
87803
87964
  capName: "storage-migration",
87804
87965
  capScope: "system",
@@ -89795,11 +89956,6 @@ Object.freeze({
89795
89956
  form: "single",
89796
89957
  optional: true
89797
89958
  }],
89798
- "pipelineAnalytics.getGroup": [{
89799
- name: "deviceId",
89800
- form: "single",
89801
- optional: false
89802
- }],
89803
89959
  "pipelineAnalytics.getKeyEvents": [{
89804
89960
  name: "deviceId",
89805
89961
  form: "single",
@@ -89865,11 +90021,6 @@ Object.freeze({
89865
90021
  form: "single",
89866
90022
  optional: false
89867
90023
  }],
89868
- "pipelineAnalytics.listGroups": [{
89869
- name: "deviceIds",
89870
- form: "array",
89871
- optional: false
89872
- }],
89873
90024
  "pipelineAnalytics.listOpsLog": [{
89874
90025
  name: "deviceId",
89875
90026
  form: "single",
@@ -89915,6 +90066,11 @@ Object.freeze({
89915
90066
  form: "single",
89916
90067
  optional: true
89917
90068
  }],
90069
+ "pipelineAnalytics.reclaimDebugMedia": [{
90070
+ name: "deviceIds",
90071
+ form: "array",
90072
+ optional: true
90073
+ }],
89918
90074
  "pipelineAnalytics.reconcileFromDisk": [{
89919
90075
  name: "deviceId",
89920
90076
  form: "single",
@@ -90280,6 +90436,11 @@ Object.freeze({
90280
90436
  form: "single",
90281
90437
  optional: false
90282
90438
  }],
90439
+ "recording.setDevicePlacement": [{
90440
+ name: "deviceId",
90441
+ form: "single",
90442
+ optional: false
90443
+ }],
90283
90444
  "recording.startStorageMigrationMove": [{
90284
90445
  name: "deviceId",
90285
90446
  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.50",
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",