@camstack/addon-provider-reolink 1.2.72 → 1.2.73

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
@@ -8386,6 +8386,13 @@ var MediaRelocateModeSchema = _enum([
8386
8386
  ]);
8387
8387
  var RelocateMediaInputSchema = object({
8388
8388
  toLocationId: string(),
8389
+ /**
8390
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8391
+ * every row that is not already on `toLocationId` (the historical
8392
+ * behaviour). A named source is what a from→to migration needs: without it
8393
+ * "move events off disk 2" also emptied disk 1.
8394
+ */
8395
+ fromLocationId: string().optional(),
8389
8396
  throttleMbps: number().min(1).max(1e3).optional(),
8390
8397
  /** Omitted = `move`, the pre-existing behaviour. */
8391
8398
  mode: MediaRelocateModeSchema.optional()
@@ -8453,6 +8460,19 @@ var StorageMigrationDestinationsSchema = object({
8453
8460
  galleryMedia: string().min(1).optional()
8454
8461
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8455
8462
  /**
8463
+ * Optional named source per class. Omitted = the class's current default
8464
+ * (the historical behaviour). A named source that is NOT the default is a
8465
+ * drain of that disk: bytes move, the default stays, and the source is
8466
+ * disabled when the move finishes.
8467
+ */
8468
+ var StorageMigrationSourcesSchema = object({
8469
+ recordings: string().min(1).optional(),
8470
+ recordingsLow: string().min(1).optional(),
8471
+ eventMedia: string().min(1).optional(),
8472
+ backups: string().min(1).optional(),
8473
+ galleryMedia: string().min(1).optional()
8474
+ }).optional();
8475
+ /**
8456
8476
  * How a migration sequences the cutover against the byte move.
8457
8477
  *
8458
8478
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8474,6 +8494,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8474
8494
  /** Shared input for planning and starting an orchestrated storage migration. */
8475
8495
  var StorageMigrationInputSchema = object({
8476
8496
  destinations: StorageMigrationDestinationsSchema,
8497
+ /** Omitted = each class's current default. */
8498
+ sources: StorageMigrationSourcesSchema,
8477
8499
  throttleMbps: number().min(1).max(1e3).optional(),
8478
8500
  /** Omitted = `blocking`, which stays the default. */
8479
8501
  mode: StorageMigrationModeSchema.optional()
@@ -8553,6 +8575,13 @@ var StorageMigrationMoveSchema = object({
8553
8575
  storageClass: StorageMigrationClassSchema,
8554
8576
  fromLocationId: string(),
8555
8577
  toLocationId: string(),
8578
+ /**
8579
+ * True when `from` was NOT the class default at plan time. The move still
8580
+ * copies bytes, but the default is left alone and the source is disabled
8581
+ * once the copy verifies. Absent on jobs planned before this field existed
8582
+ * — those jobs always repointed, which is `false`.
8583
+ */
8584
+ freezeSource: boolean().optional(),
8556
8585
  moverJobId: string().nullable(),
8557
8586
  state: RelocateJobStateSchema.nullable(),
8558
8587
  error: string().nullable(),
@@ -8566,6 +8595,7 @@ var StorageMigrationJobSchema = object({
8566
8595
  * can tell a seconds-long cutover from a thirty-hour one. */
8567
8596
  mode: StorageMigrationModeSchema,
8568
8597
  destinations: StorageMigrationDestinationsSchema,
8598
+ sources: StorageMigrationSourcesSchema,
8569
8599
  throttleMbps: number(),
8570
8600
  moves: array(StorageMigrationMoveSchema),
8571
8601
  pauseLeaseId: string().nullable(),
@@ -8591,6 +8621,7 @@ var StorageMigrationFindingSchema = object({
8591
8621
  });
8592
8622
  var StorageMigrationPlanSchema = object({
8593
8623
  destinations: StorageMigrationDestinationsSchema,
8624
+ sources: StorageMigrationSourcesSchema,
8594
8625
  /** The mode this plan was built for. A plan is only valid for its mode: the
8595
8626
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8596
8627
  * it. */
@@ -8598,7 +8629,8 @@ var StorageMigrationPlanSchema = object({
8598
8629
  moves: array(object({
8599
8630
  storageClass: StorageMigrationClassSchema,
8600
8631
  fromLocationId: string(),
8601
- toLocationId: string()
8632
+ toLocationId: string(),
8633
+ freezeSource: boolean().optional()
8602
8634
  })),
8603
8635
  findings: array(StorageMigrationFindingSchema)
8604
8636
  });
@@ -8776,10 +8808,51 @@ var LedgerWalkReportSchema = object({
8776
8808
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8777
8809
  var RelocatableMediaCountInputSchema = object({
8778
8810
  toLocationId: string().min(1),
8811
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8812
+ fromLocationId: string().optional(),
8779
8813
  /** Omitted = `move`. */
8780
8814
  mode: MediaRelocateModeSchema.optional()
8781
8815
  });
8782
8816
  /**
8817
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8818
+ * ghost ledger entries on frozen footage locations.
8819
+ *
8820
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8821
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8822
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8823
+ * with no operator-visible status.
8824
+ */
8825
+ var StorageCleanupPhaseSchema = _enum([
8826
+ "orphans",
8827
+ "debug-media",
8828
+ "ghost-ledger",
8829
+ "done",
8830
+ "failed",
8831
+ "cancelled"
8832
+ ]);
8833
+ var StorageCleanupInputSchema = object({
8834
+ /** Also walk motion stills / track filmstrips. Off by default. */
8835
+ includeDebugMedia: boolean().optional() });
8836
+ var StorageCleanupJobSchema = object({
8837
+ jobId: string(),
8838
+ phase: StorageCleanupPhaseSchema,
8839
+ includeDebugMedia: boolean(),
8840
+ orphansReclaimed: number().int().nonnegative(),
8841
+ orphanBytesReclaimed: number().int().nonnegative(),
8842
+ debugMediaReclaimed: number().int().nonnegative(),
8843
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8844
+ ghostsForgotten: number().int().nonnegative(),
8845
+ ghostBytesForgotten: number().int().nonnegative(),
8846
+ /** Short operator-facing line: current collection, pass, or location. */
8847
+ detail: string().nullable(),
8848
+ cancelRequested: boolean(),
8849
+ startedAt: number(),
8850
+ updatedAt: number(),
8851
+ finishedAt: number().nullable(),
8852
+ error: string().nullable()
8853
+ });
8854
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8855
+ /**
8783
8856
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8784
8857
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8785
8858
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8807,11 +8880,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8807
8880
  * The default location for a type uses `id === <type>:default` by
8808
8881
  * convention (the bare type ref like `'backups'` resolves to it).
8809
8882
  *
8810
- * `isSystem: true` marks a location as orchestrator-seeded and
8811
- * undeletable. The bootstrap-installed defaults (one per type) carry
8812
- * this flag; operator-added locations don't. Editing the config of
8813
- * a system location is allowed (path migration, provider swap) but
8814
- * deleting it is rejected at the cap level.
8883
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8884
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8885
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8886
+ * / last-enabled, not on this bit.
8815
8887
  */
8816
8888
  var StorageLocationSchema = object({
8817
8889
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13630,6 +13702,12 @@ method(object({
13630
13702
  }), _void(), {
13631
13703
  kind: "mutation",
13632
13704
  auth: "admin"
13705
+ }), method(object({
13706
+ from: string(),
13707
+ to: string()
13708
+ }), object({ moved: number() }), {
13709
+ kind: "mutation",
13710
+ auth: "admin"
13633
13711
  }), method(object({
13634
13712
  deviceId: number(),
13635
13713
  disabled: boolean()
@@ -19678,46 +19756,6 @@ var RecentTracksPageSchema = object({
19678
19756
  /** Cursor for the next page, or null when this page is the last. */
19679
19757
  nextCursor: string().nullable()
19680
19758
  });
19681
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19682
- var LIST_GROUPS_MAX_LIMIT = 100;
19683
- var AnalyticsGroupRecordSchema = object({
19684
- id: string(),
19685
- deviceId: number().int(),
19686
- openedAt: number().int(),
19687
- closedAt: number().int(),
19688
- timestamp: number().int(),
19689
- memberCount: number().int(),
19690
- memberTrackIds: array(string()).readonly(),
19691
- className: string(),
19692
- classes: array(string()).readonly(),
19693
- /** Relative event-media path, or null when the group has no picture yet. */
19694
- mediaUrl: string().nullable(),
19695
- singleton: boolean()
19696
- });
19697
- var AnalyticsGroupMemberSchema = object({
19698
- trackId: string(),
19699
- deviceId: number().int(),
19700
- className: string(),
19701
- firstSeen: number().int(),
19702
- lastSeen: number().int(),
19703
- mediaUrl: string().nullable()
19704
- });
19705
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19706
- var ListGroupsQueryInput = object({
19707
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19708
- deviceIds: array(number()),
19709
- /** Window lower bound on `closedAt` (inclusive). */
19710
- since: number().optional(),
19711
- /** Window upper bound on `openedAt` (inclusive). */
19712
- until: number().optional(),
19713
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19714
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19715
- cursor: string().optional()
19716
- });
19717
- var ListGroupsPageSchema = object({
19718
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19719
- nextCursor: string().nullable()
19720
- });
19721
19759
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19722
19760
  var KEY_EVENTS_MAX_LIMIT = 200;
19723
19761
  var KeyEventQueryInput = object({
@@ -19821,9 +19859,7 @@ var TrackCascadeCountsSchema = object({
19821
19859
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19822
19860
  plates: number().int(),
19823
19861
  /** Per-track CLIP search vectors removed (best-effort). */
19824
- embeddings: number().int(),
19825
- /** Group membership + group rows removed with their last member (best-effort). */
19826
- groups: number().int()
19862
+ embeddings: number().int()
19827
19863
  });
19828
19864
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19829
19865
  var DiskReconcileCountsSchema = object({
@@ -19993,6 +20029,47 @@ var RebuildStatusSchema = object({
19993
20029
  /** Present when the pass ended by throwing. */
19994
20030
  error: string().nullable()
19995
20031
  });
20032
+ /**
20033
+ * Acknowledgement that a debug-media reclaim STARTED.
20034
+ *
20035
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
20036
+ * it runs detached and this returns immediately. Awaiting it is how the
20037
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
20038
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
20039
+ */
20040
+ var MediaReclaimStartResultSchema = object({
20041
+ started: boolean(),
20042
+ /** True when a pass was already running; the new request is ignored. */
20043
+ alreadyRunning: boolean()
20044
+ });
20045
+ var MediaReclaimInputSchema = object({
20046
+ mode: _enum(["report", "reclaim"]).default("report"),
20047
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
20048
+ deviceIds: array(number().int()).min(1).optional(),
20049
+ restart: boolean().optional(),
20050
+ pageSize: number().int().min(50).max(5e3).optional(),
20051
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
20052
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
20053
+ maxBytesPerRun: number().int().min(1).optional(),
20054
+ budgetMinutes: number().int().min(1).max(720).optional(),
20055
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
20056
+ graceMinutes: number().int().min(1).max(10080).optional()
20057
+ });
20058
+ var MediaReclaimStatusSchema = object({
20059
+ running: boolean(),
20060
+ mode: _enum(["report", "reclaim"]).nullable(),
20061
+ totalExamined: number(),
20062
+ totalEligible: number(),
20063
+ totalReclaimed: number(),
20064
+ totalBytesReclaimed: number(),
20065
+ totalRefused: number(),
20066
+ /** Device+scope windows finished in this pass. */
20067
+ devicesDone: number(),
20068
+ complete: boolean().nullable(),
20069
+ startedAtMs: number().nullable(),
20070
+ finishedAtMs: number().nullable(),
20071
+ error: string().nullable()
20072
+ });
19996
20073
  var ReplayFrameInputSchema = object({
19997
20074
  timestamp: number(),
19998
20075
  frame: PipelineRunResultBridge
@@ -20031,10 +20108,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20031
20108
  * stationary registry). Default false: the timeline lists passages,
20032
20109
  * not parking records (operator decision, 2026-08-15). */
20033
20110
  includeStationary: boolean().optional()
20034
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
20035
- deviceId: number(),
20036
- groupId: string().min(1)
20037
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
20111
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
20038
20112
  kind: "mutation",
20039
20113
  auth: "admin"
20040
20114
  }), 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({
@@ -20134,6 +20208,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20134
20208
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
20135
20209
  kind: "query",
20136
20210
  auth: "admin"
20211
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
20212
+ kind: "mutation",
20213
+ auth: "admin"
20214
+ }), method(object({}), MediaReclaimStatusSchema, {
20215
+ kind: "query",
20216
+ auth: "admin"
20137
20217
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
20138
20218
  kind: "query",
20139
20219
  auth: "admin"
@@ -22208,7 +22288,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
22208
22288
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
22209
22289
  kind: "mutation",
22210
22290
  auth: "admin"
22211
- });
22291
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
22292
+ kind: "mutation",
22293
+ auth: "admin"
22294
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
22295
+ kind: "mutation",
22296
+ auth: "admin"
22297
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
22212
22298
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
22213
22299
  providerId: string().min(1),
22214
22300
  displayName: string().min(1),
@@ -29388,6 +29474,33 @@ var RecordingRebalanceInputSchema = object({
29388
29474
  minMoveGb: number().min(0).optional()
29389
29475
  });
29390
29476
  /**
29477
+ * Operator-facing placement of one camera onto a recordings location.
29478
+ *
29479
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
29480
+ * Auto (the planner may move this camera). `locationId` is where high/mid
29481
+ * currently write — the plan, which may disagree with the pin when Auto.
29482
+ */
29483
+ var RecordingDevicePlacementSchema = object({
29484
+ deviceId: number().int(),
29485
+ profile: string(),
29486
+ locationId: string()
29487
+ });
29488
+ var RecordingDevicePinSchema = object({
29489
+ deviceId: number().int(),
29490
+ /** Recordings-class location this camera is pinned to. */
29491
+ locationId: string()
29492
+ });
29493
+ var RecordingPlacementViewSchema = object({
29494
+ assignments: array(RecordingDevicePlacementSchema),
29495
+ pins: array(RecordingDevicePinSchema),
29496
+ defaultLocations: record(string(), string())
29497
+ });
29498
+ var RecordingSetDevicePlacementInputSchema = object({
29499
+ deviceId: number().int(),
29500
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
29501
+ locationId: string().nullable()
29502
+ });
29503
+ /**
29391
29504
  * Result of locating footage at a wall-clock instant for one device/profile.
29392
29505
  * `segment` carries the covering segment's window; `gap` reports the forward
29393
29506
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -29613,6 +29726,12 @@ method(object({
29613
29726
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
29614
29727
  kind: "mutation",
29615
29728
  auth: "admin"
29729
+ }), method(object({}), RecordingPlacementViewSchema, {
29730
+ kind: "query",
29731
+ auth: "admin"
29732
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29733
+ kind: "mutation",
29734
+ auth: "admin"
29616
29735
  });
29617
29736
  /**
29618
29737
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -35047,6 +35166,12 @@ Object.freeze({
35047
35166
  addonId: null,
35048
35167
  access: "delete"
35049
35168
  },
35169
+ "deviceManager.renameLocation": {
35170
+ capName: "device-manager",
35171
+ capScope: "system",
35172
+ addonId: null,
35173
+ access: "create"
35174
+ },
35050
35175
  "deviceManager.runDeviceAction": {
35051
35176
  capName: "device-manager",
35052
35177
  capScope: "system",
@@ -36739,19 +36864,19 @@ Object.freeze({
36739
36864
  addonId: null,
36740
36865
  access: "view"
36741
36866
  },
36742
- "pipelineAnalytics.getGroup": {
36867
+ "pipelineAnalytics.getKeyEvents": {
36743
36868
  capName: "pipeline-analytics",
36744
36869
  capScope: "device",
36745
36870
  addonId: null,
36746
36871
  access: "view"
36747
36872
  },
36748
- "pipelineAnalytics.getKeyEvents": {
36873
+ "pipelineAnalytics.getKeyEventsBatch": {
36749
36874
  capName: "pipeline-analytics",
36750
36875
  capScope: "device",
36751
36876
  addonId: null,
36752
36877
  access: "view"
36753
36878
  },
36754
- "pipelineAnalytics.getKeyEventsBatch": {
36879
+ "pipelineAnalytics.getMediaReclaimStatus": {
36755
36880
  capName: "pipeline-analytics",
36756
36881
  capScope: "device",
36757
36882
  addonId: null,
@@ -36841,12 +36966,6 @@ Object.freeze({
36841
36966
  addonId: null,
36842
36967
  access: "view"
36843
36968
  },
36844
- "pipelineAnalytics.listGroups": {
36845
- capName: "pipeline-analytics",
36846
- capScope: "device",
36847
- addonId: null,
36848
- access: "view"
36849
- },
36850
36969
  "pipelineAnalytics.listOpsLog": {
36851
36970
  capName: "pipeline-analytics",
36852
36971
  capScope: "device",
@@ -36931,6 +37050,12 @@ Object.freeze({
36931
37050
  addonId: null,
36932
37051
  access: "create"
36933
37052
  },
37053
+ "pipelineAnalytics.reclaimDebugMedia": {
37054
+ capName: "pipeline-analytics",
37055
+ capScope: "device",
37056
+ addonId: null,
37057
+ access: "create"
37058
+ },
36934
37059
  "pipelineAnalytics.reconcileFromDisk": {
36935
37060
  capName: "pipeline-analytics",
36936
37061
  capScope: "device",
@@ -37855,6 +37980,12 @@ Object.freeze({
37855
37980
  addonId: null,
37856
37981
  access: "view"
37857
37982
  },
37983
+ "recording.getPlacement": {
37984
+ capName: "recording",
37985
+ capScope: "system",
37986
+ addonId: null,
37987
+ access: "view"
37988
+ },
37858
37989
  "recording.getPlaybackManifest": {
37859
37990
  capName: "recording",
37860
37991
  capScope: "system",
@@ -37981,6 +38112,12 @@ Object.freeze({
37981
38112
  addonId: null,
37982
38113
  access: "create"
37983
38114
  },
38115
+ "recording.setDevicePlacement": {
38116
+ capName: "recording",
38117
+ capScope: "system",
38118
+ addonId: null,
38119
+ access: "create"
38120
+ },
37984
38121
  "recording.startStorageMigrationMove": {
37985
38122
  capName: "recording",
37986
38123
  capScope: "system",
@@ -38425,12 +38562,36 @@ Object.freeze({
38425
38562
  addonId: null,
38426
38563
  access: "create"
38427
38564
  },
38565
+ "storageMigration.cleanupCancel": {
38566
+ capName: "storage-migration",
38567
+ capScope: "system",
38568
+ addonId: null,
38569
+ access: "create"
38570
+ },
38571
+ "storageMigration.cleanupStart": {
38572
+ capName: "storage-migration",
38573
+ capScope: "system",
38574
+ addonId: null,
38575
+ access: "create"
38576
+ },
38577
+ "storageMigration.cleanupStatus": {
38578
+ capName: "storage-migration",
38579
+ capScope: "system",
38580
+ addonId: null,
38581
+ access: "view"
38582
+ },
38428
38583
  "storageMigration.drain": {
38429
38584
  capName: "storage-migration",
38430
38585
  capScope: "system",
38431
38586
  addonId: null,
38432
38587
  access: "create"
38433
38588
  },
38589
+ "storageMigration.history": {
38590
+ capName: "storage-migration",
38591
+ capScope: "system",
38592
+ addonId: null,
38593
+ access: "view"
38594
+ },
38434
38595
  "storageMigration.movers": {
38435
38596
  capName: "storage-migration",
38436
38597
  capScope: "system",
@@ -40427,11 +40588,6 @@ Object.freeze({
40427
40588
  form: "single",
40428
40589
  optional: true
40429
40590
  }],
40430
- "pipelineAnalytics.getGroup": [{
40431
- name: "deviceId",
40432
- form: "single",
40433
- optional: false
40434
- }],
40435
40591
  "pipelineAnalytics.getKeyEvents": [{
40436
40592
  name: "deviceId",
40437
40593
  form: "single",
@@ -40497,11 +40653,6 @@ Object.freeze({
40497
40653
  form: "single",
40498
40654
  optional: false
40499
40655
  }],
40500
- "pipelineAnalytics.listGroups": [{
40501
- name: "deviceIds",
40502
- form: "array",
40503
- optional: false
40504
- }],
40505
40656
  "pipelineAnalytics.listOpsLog": [{
40506
40657
  name: "deviceId",
40507
40658
  form: "single",
@@ -40547,6 +40698,11 @@ Object.freeze({
40547
40698
  form: "single",
40548
40699
  optional: true
40549
40700
  }],
40701
+ "pipelineAnalytics.reclaimDebugMedia": [{
40702
+ name: "deviceIds",
40703
+ form: "array",
40704
+ optional: true
40705
+ }],
40550
40706
  "pipelineAnalytics.reconcileFromDisk": [{
40551
40707
  name: "deviceId",
40552
40708
  form: "single",
@@ -40912,6 +41068,11 @@ Object.freeze({
40912
41068
  form: "single",
40913
41069
  optional: false
40914
41070
  }],
41071
+ "recording.setDevicePlacement": [{
41072
+ name: "deviceId",
41073
+ form: "single",
41074
+ optional: false
41075
+ }],
40915
41076
  "recording.startStorageMigrationMove": [{
40916
41077
  name: "deviceId",
40917
41078
  form: "single",
package/dist/addon.mjs CHANGED
@@ -8381,6 +8381,13 @@ var MediaRelocateModeSchema = _enum([
8381
8381
  ]);
8382
8382
  var RelocateMediaInputSchema = object({
8383
8383
  toLocationId: string(),
8384
+ /**
8385
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8386
+ * every row that is not already on `toLocationId` (the historical
8387
+ * behaviour). A named source is what a from→to migration needs: without it
8388
+ * "move events off disk 2" also emptied disk 1.
8389
+ */
8390
+ fromLocationId: string().optional(),
8384
8391
  throttleMbps: number().min(1).max(1e3).optional(),
8385
8392
  /** Omitted = `move`, the pre-existing behaviour. */
8386
8393
  mode: MediaRelocateModeSchema.optional()
@@ -8448,6 +8455,19 @@ var StorageMigrationDestinationsSchema = object({
8448
8455
  galleryMedia: string().min(1).optional()
8449
8456
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8450
8457
  /**
8458
+ * Optional named source per class. Omitted = the class's current default
8459
+ * (the historical behaviour). A named source that is NOT the default is a
8460
+ * drain of that disk: bytes move, the default stays, and the source is
8461
+ * disabled when the move finishes.
8462
+ */
8463
+ var StorageMigrationSourcesSchema = object({
8464
+ recordings: string().min(1).optional(),
8465
+ recordingsLow: string().min(1).optional(),
8466
+ eventMedia: string().min(1).optional(),
8467
+ backups: string().min(1).optional(),
8468
+ galleryMedia: string().min(1).optional()
8469
+ }).optional();
8470
+ /**
8451
8471
  * How a migration sequences the cutover against the byte move.
8452
8472
  *
8453
8473
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8469,6 +8489,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8469
8489
  /** Shared input for planning and starting an orchestrated storage migration. */
8470
8490
  var StorageMigrationInputSchema = object({
8471
8491
  destinations: StorageMigrationDestinationsSchema,
8492
+ /** Omitted = each class's current default. */
8493
+ sources: StorageMigrationSourcesSchema,
8472
8494
  throttleMbps: number().min(1).max(1e3).optional(),
8473
8495
  /** Omitted = `blocking`, which stays the default. */
8474
8496
  mode: StorageMigrationModeSchema.optional()
@@ -8548,6 +8570,13 @@ var StorageMigrationMoveSchema = object({
8548
8570
  storageClass: StorageMigrationClassSchema,
8549
8571
  fromLocationId: string(),
8550
8572
  toLocationId: string(),
8573
+ /**
8574
+ * True when `from` was NOT the class default at plan time. The move still
8575
+ * copies bytes, but the default is left alone and the source is disabled
8576
+ * once the copy verifies. Absent on jobs planned before this field existed
8577
+ * — those jobs always repointed, which is `false`.
8578
+ */
8579
+ freezeSource: boolean().optional(),
8551
8580
  moverJobId: string().nullable(),
8552
8581
  state: RelocateJobStateSchema.nullable(),
8553
8582
  error: string().nullable(),
@@ -8561,6 +8590,7 @@ var StorageMigrationJobSchema = object({
8561
8590
  * can tell a seconds-long cutover from a thirty-hour one. */
8562
8591
  mode: StorageMigrationModeSchema,
8563
8592
  destinations: StorageMigrationDestinationsSchema,
8593
+ sources: StorageMigrationSourcesSchema,
8564
8594
  throttleMbps: number(),
8565
8595
  moves: array(StorageMigrationMoveSchema),
8566
8596
  pauseLeaseId: string().nullable(),
@@ -8586,6 +8616,7 @@ var StorageMigrationFindingSchema = object({
8586
8616
  });
8587
8617
  var StorageMigrationPlanSchema = object({
8588
8618
  destinations: StorageMigrationDestinationsSchema,
8619
+ sources: StorageMigrationSourcesSchema,
8589
8620
  /** The mode this plan was built for. A plan is only valid for its mode: the
8590
8621
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8591
8622
  * it. */
@@ -8593,7 +8624,8 @@ var StorageMigrationPlanSchema = object({
8593
8624
  moves: array(object({
8594
8625
  storageClass: StorageMigrationClassSchema,
8595
8626
  fromLocationId: string(),
8596
- toLocationId: string()
8627
+ toLocationId: string(),
8628
+ freezeSource: boolean().optional()
8597
8629
  })),
8598
8630
  findings: array(StorageMigrationFindingSchema)
8599
8631
  });
@@ -8771,10 +8803,51 @@ var LedgerWalkReportSchema = object({
8771
8803
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8772
8804
  var RelocatableMediaCountInputSchema = object({
8773
8805
  toLocationId: string().min(1),
8806
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8807
+ fromLocationId: string().optional(),
8774
8808
  /** Omitted = `move`. */
8775
8809
  mode: MediaRelocateModeSchema.optional()
8776
8810
  });
8777
8811
  /**
8812
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8813
+ * ghost ledger entries on frozen footage locations.
8814
+ *
8815
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8816
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8817
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8818
+ * with no operator-visible status.
8819
+ */
8820
+ var StorageCleanupPhaseSchema = _enum([
8821
+ "orphans",
8822
+ "debug-media",
8823
+ "ghost-ledger",
8824
+ "done",
8825
+ "failed",
8826
+ "cancelled"
8827
+ ]);
8828
+ var StorageCleanupInputSchema = object({
8829
+ /** Also walk motion stills / track filmstrips. Off by default. */
8830
+ includeDebugMedia: boolean().optional() });
8831
+ var StorageCleanupJobSchema = object({
8832
+ jobId: string(),
8833
+ phase: StorageCleanupPhaseSchema,
8834
+ includeDebugMedia: boolean(),
8835
+ orphansReclaimed: number().int().nonnegative(),
8836
+ orphanBytesReclaimed: number().int().nonnegative(),
8837
+ debugMediaReclaimed: number().int().nonnegative(),
8838
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8839
+ ghostsForgotten: number().int().nonnegative(),
8840
+ ghostBytesForgotten: number().int().nonnegative(),
8841
+ /** Short operator-facing line: current collection, pass, or location. */
8842
+ detail: string().nullable(),
8843
+ cancelRequested: boolean(),
8844
+ startedAt: number(),
8845
+ updatedAt: number(),
8846
+ finishedAt: number().nullable(),
8847
+ error: string().nullable()
8848
+ });
8849
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8850
+ /**
8778
8851
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8779
8852
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8780
8853
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8802,11 +8875,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8802
8875
  * The default location for a type uses `id === <type>:default` by
8803
8876
  * convention (the bare type ref like `'backups'` resolves to it).
8804
8877
  *
8805
- * `isSystem: true` marks a location as orchestrator-seeded and
8806
- * undeletable. The bootstrap-installed defaults (one per type) carry
8807
- * this flag; operator-added locations don't. Editing the config of
8808
- * a system location is allowed (path migration, provider swap) but
8809
- * deleting it is rejected at the cap level.
8878
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8879
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8880
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8881
+ * / last-enabled, not on this bit.
8810
8882
  */
8811
8883
  var StorageLocationSchema = object({
8812
8884
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13625,6 +13697,12 @@ method(object({
13625
13697
  }), _void(), {
13626
13698
  kind: "mutation",
13627
13699
  auth: "admin"
13700
+ }), method(object({
13701
+ from: string(),
13702
+ to: string()
13703
+ }), object({ moved: number() }), {
13704
+ kind: "mutation",
13705
+ auth: "admin"
13628
13706
  }), method(object({
13629
13707
  deviceId: number(),
13630
13708
  disabled: boolean()
@@ -19673,46 +19751,6 @@ var RecentTracksPageSchema = object({
19673
19751
  /** Cursor for the next page, or null when this page is the last. */
19674
19752
  nextCursor: string().nullable()
19675
19753
  });
19676
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19677
- var LIST_GROUPS_MAX_LIMIT = 100;
19678
- var AnalyticsGroupRecordSchema = object({
19679
- id: string(),
19680
- deviceId: number().int(),
19681
- openedAt: number().int(),
19682
- closedAt: number().int(),
19683
- timestamp: number().int(),
19684
- memberCount: number().int(),
19685
- memberTrackIds: array(string()).readonly(),
19686
- className: string(),
19687
- classes: array(string()).readonly(),
19688
- /** Relative event-media path, or null when the group has no picture yet. */
19689
- mediaUrl: string().nullable(),
19690
- singleton: boolean()
19691
- });
19692
- var AnalyticsGroupMemberSchema = object({
19693
- trackId: string(),
19694
- deviceId: number().int(),
19695
- className: string(),
19696
- firstSeen: number().int(),
19697
- lastSeen: number().int(),
19698
- mediaUrl: string().nullable()
19699
- });
19700
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19701
- var ListGroupsQueryInput = object({
19702
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19703
- deviceIds: array(number()),
19704
- /** Window lower bound on `closedAt` (inclusive). */
19705
- since: number().optional(),
19706
- /** Window upper bound on `openedAt` (inclusive). */
19707
- until: number().optional(),
19708
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19709
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19710
- cursor: string().optional()
19711
- });
19712
- var ListGroupsPageSchema = object({
19713
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19714
- nextCursor: string().nullable()
19715
- });
19716
19754
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19717
19755
  var KEY_EVENTS_MAX_LIMIT = 200;
19718
19756
  var KeyEventQueryInput = object({
@@ -19816,9 +19854,7 @@ var TrackCascadeCountsSchema = object({
19816
19854
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19817
19855
  plates: number().int(),
19818
19856
  /** Per-track CLIP search vectors removed (best-effort). */
19819
- embeddings: number().int(),
19820
- /** Group membership + group rows removed with their last member (best-effort). */
19821
- groups: number().int()
19857
+ embeddings: number().int()
19822
19858
  });
19823
19859
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19824
19860
  var DiskReconcileCountsSchema = object({
@@ -19988,6 +20024,47 @@ var RebuildStatusSchema = object({
19988
20024
  /** Present when the pass ended by throwing. */
19989
20025
  error: string().nullable()
19990
20026
  });
20027
+ /**
20028
+ * Acknowledgement that a debug-media reclaim STARTED.
20029
+ *
20030
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
20031
+ * it runs detached and this returns immediately. Awaiting it is how the
20032
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
20033
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
20034
+ */
20035
+ var MediaReclaimStartResultSchema = object({
20036
+ started: boolean(),
20037
+ /** True when a pass was already running; the new request is ignored. */
20038
+ alreadyRunning: boolean()
20039
+ });
20040
+ var MediaReclaimInputSchema = object({
20041
+ mode: _enum(["report", "reclaim"]).default("report"),
20042
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
20043
+ deviceIds: array(number().int()).min(1).optional(),
20044
+ restart: boolean().optional(),
20045
+ pageSize: number().int().min(50).max(5e3).optional(),
20046
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
20047
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
20048
+ maxBytesPerRun: number().int().min(1).optional(),
20049
+ budgetMinutes: number().int().min(1).max(720).optional(),
20050
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
20051
+ graceMinutes: number().int().min(1).max(10080).optional()
20052
+ });
20053
+ var MediaReclaimStatusSchema = object({
20054
+ running: boolean(),
20055
+ mode: _enum(["report", "reclaim"]).nullable(),
20056
+ totalExamined: number(),
20057
+ totalEligible: number(),
20058
+ totalReclaimed: number(),
20059
+ totalBytesReclaimed: number(),
20060
+ totalRefused: number(),
20061
+ /** Device+scope windows finished in this pass. */
20062
+ devicesDone: number(),
20063
+ complete: boolean().nullable(),
20064
+ startedAtMs: number().nullable(),
20065
+ finishedAtMs: number().nullable(),
20066
+ error: string().nullable()
20067
+ });
19991
20068
  var ReplayFrameInputSchema = object({
19992
20069
  timestamp: number(),
19993
20070
  frame: PipelineRunResultBridge
@@ -20026,10 +20103,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20026
20103
  * stationary registry). Default false: the timeline lists passages,
20027
20104
  * not parking records (operator decision, 2026-08-15). */
20028
20105
  includeStationary: boolean().optional()
20029
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
20030
- deviceId: number(),
20031
- groupId: string().min(1)
20032
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
20106
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
20033
20107
  kind: "mutation",
20034
20108
  auth: "admin"
20035
20109
  }), 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({
@@ -20129,6 +20203,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20129
20203
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
20130
20204
  kind: "query",
20131
20205
  auth: "admin"
20206
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
20207
+ kind: "mutation",
20208
+ auth: "admin"
20209
+ }), method(object({}), MediaReclaimStatusSchema, {
20210
+ kind: "query",
20211
+ auth: "admin"
20132
20212
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
20133
20213
  kind: "query",
20134
20214
  auth: "admin"
@@ -22203,7 +22283,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
22203
22283
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
22204
22284
  kind: "mutation",
22205
22285
  auth: "admin"
22206
- });
22286
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
22287
+ kind: "mutation",
22288
+ auth: "admin"
22289
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
22290
+ kind: "mutation",
22291
+ auth: "admin"
22292
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
22207
22293
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
22208
22294
  providerId: string().min(1),
22209
22295
  displayName: string().min(1),
@@ -29383,6 +29469,33 @@ var RecordingRebalanceInputSchema = object({
29383
29469
  minMoveGb: number().min(0).optional()
29384
29470
  });
29385
29471
  /**
29472
+ * Operator-facing placement of one camera onto a recordings location.
29473
+ *
29474
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
29475
+ * Auto (the planner may move this camera). `locationId` is where high/mid
29476
+ * currently write — the plan, which may disagree with the pin when Auto.
29477
+ */
29478
+ var RecordingDevicePlacementSchema = object({
29479
+ deviceId: number().int(),
29480
+ profile: string(),
29481
+ locationId: string()
29482
+ });
29483
+ var RecordingDevicePinSchema = object({
29484
+ deviceId: number().int(),
29485
+ /** Recordings-class location this camera is pinned to. */
29486
+ locationId: string()
29487
+ });
29488
+ var RecordingPlacementViewSchema = object({
29489
+ assignments: array(RecordingDevicePlacementSchema),
29490
+ pins: array(RecordingDevicePinSchema),
29491
+ defaultLocations: record(string(), string())
29492
+ });
29493
+ var RecordingSetDevicePlacementInputSchema = object({
29494
+ deviceId: number().int(),
29495
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
29496
+ locationId: string().nullable()
29497
+ });
29498
+ /**
29386
29499
  * Result of locating footage at a wall-clock instant for one device/profile.
29387
29500
  * `segment` carries the covering segment's window; `gap` reports the forward
29388
29501
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -29608,6 +29721,12 @@ method(object({
29608
29721
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
29609
29722
  kind: "mutation",
29610
29723
  auth: "admin"
29724
+ }), method(object({}), RecordingPlacementViewSchema, {
29725
+ kind: "query",
29726
+ auth: "admin"
29727
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29728
+ kind: "mutation",
29729
+ auth: "admin"
29611
29730
  });
29612
29731
  /**
29613
29732
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -35042,6 +35161,12 @@ Object.freeze({
35042
35161
  addonId: null,
35043
35162
  access: "delete"
35044
35163
  },
35164
+ "deviceManager.renameLocation": {
35165
+ capName: "device-manager",
35166
+ capScope: "system",
35167
+ addonId: null,
35168
+ access: "create"
35169
+ },
35045
35170
  "deviceManager.runDeviceAction": {
35046
35171
  capName: "device-manager",
35047
35172
  capScope: "system",
@@ -36734,19 +36859,19 @@ Object.freeze({
36734
36859
  addonId: null,
36735
36860
  access: "view"
36736
36861
  },
36737
- "pipelineAnalytics.getGroup": {
36862
+ "pipelineAnalytics.getKeyEvents": {
36738
36863
  capName: "pipeline-analytics",
36739
36864
  capScope: "device",
36740
36865
  addonId: null,
36741
36866
  access: "view"
36742
36867
  },
36743
- "pipelineAnalytics.getKeyEvents": {
36868
+ "pipelineAnalytics.getKeyEventsBatch": {
36744
36869
  capName: "pipeline-analytics",
36745
36870
  capScope: "device",
36746
36871
  addonId: null,
36747
36872
  access: "view"
36748
36873
  },
36749
- "pipelineAnalytics.getKeyEventsBatch": {
36874
+ "pipelineAnalytics.getMediaReclaimStatus": {
36750
36875
  capName: "pipeline-analytics",
36751
36876
  capScope: "device",
36752
36877
  addonId: null,
@@ -36836,12 +36961,6 @@ Object.freeze({
36836
36961
  addonId: null,
36837
36962
  access: "view"
36838
36963
  },
36839
- "pipelineAnalytics.listGroups": {
36840
- capName: "pipeline-analytics",
36841
- capScope: "device",
36842
- addonId: null,
36843
- access: "view"
36844
- },
36845
36964
  "pipelineAnalytics.listOpsLog": {
36846
36965
  capName: "pipeline-analytics",
36847
36966
  capScope: "device",
@@ -36926,6 +37045,12 @@ Object.freeze({
36926
37045
  addonId: null,
36927
37046
  access: "create"
36928
37047
  },
37048
+ "pipelineAnalytics.reclaimDebugMedia": {
37049
+ capName: "pipeline-analytics",
37050
+ capScope: "device",
37051
+ addonId: null,
37052
+ access: "create"
37053
+ },
36929
37054
  "pipelineAnalytics.reconcileFromDisk": {
36930
37055
  capName: "pipeline-analytics",
36931
37056
  capScope: "device",
@@ -37850,6 +37975,12 @@ Object.freeze({
37850
37975
  addonId: null,
37851
37976
  access: "view"
37852
37977
  },
37978
+ "recording.getPlacement": {
37979
+ capName: "recording",
37980
+ capScope: "system",
37981
+ addonId: null,
37982
+ access: "view"
37983
+ },
37853
37984
  "recording.getPlaybackManifest": {
37854
37985
  capName: "recording",
37855
37986
  capScope: "system",
@@ -37976,6 +38107,12 @@ Object.freeze({
37976
38107
  addonId: null,
37977
38108
  access: "create"
37978
38109
  },
38110
+ "recording.setDevicePlacement": {
38111
+ capName: "recording",
38112
+ capScope: "system",
38113
+ addonId: null,
38114
+ access: "create"
38115
+ },
37979
38116
  "recording.startStorageMigrationMove": {
37980
38117
  capName: "recording",
37981
38118
  capScope: "system",
@@ -38420,12 +38557,36 @@ Object.freeze({
38420
38557
  addonId: null,
38421
38558
  access: "create"
38422
38559
  },
38560
+ "storageMigration.cleanupCancel": {
38561
+ capName: "storage-migration",
38562
+ capScope: "system",
38563
+ addonId: null,
38564
+ access: "create"
38565
+ },
38566
+ "storageMigration.cleanupStart": {
38567
+ capName: "storage-migration",
38568
+ capScope: "system",
38569
+ addonId: null,
38570
+ access: "create"
38571
+ },
38572
+ "storageMigration.cleanupStatus": {
38573
+ capName: "storage-migration",
38574
+ capScope: "system",
38575
+ addonId: null,
38576
+ access: "view"
38577
+ },
38423
38578
  "storageMigration.drain": {
38424
38579
  capName: "storage-migration",
38425
38580
  capScope: "system",
38426
38581
  addonId: null,
38427
38582
  access: "create"
38428
38583
  },
38584
+ "storageMigration.history": {
38585
+ capName: "storage-migration",
38586
+ capScope: "system",
38587
+ addonId: null,
38588
+ access: "view"
38589
+ },
38429
38590
  "storageMigration.movers": {
38430
38591
  capName: "storage-migration",
38431
38592
  capScope: "system",
@@ -40422,11 +40583,6 @@ Object.freeze({
40422
40583
  form: "single",
40423
40584
  optional: true
40424
40585
  }],
40425
- "pipelineAnalytics.getGroup": [{
40426
- name: "deviceId",
40427
- form: "single",
40428
- optional: false
40429
- }],
40430
40586
  "pipelineAnalytics.getKeyEvents": [{
40431
40587
  name: "deviceId",
40432
40588
  form: "single",
@@ -40492,11 +40648,6 @@ Object.freeze({
40492
40648
  form: "single",
40493
40649
  optional: false
40494
40650
  }],
40495
- "pipelineAnalytics.listGroups": [{
40496
- name: "deviceIds",
40497
- form: "array",
40498
- optional: false
40499
- }],
40500
40651
  "pipelineAnalytics.listOpsLog": [{
40501
40652
  name: "deviceId",
40502
40653
  form: "single",
@@ -40542,6 +40693,11 @@ Object.freeze({
40542
40693
  form: "single",
40543
40694
  optional: true
40544
40695
  }],
40696
+ "pipelineAnalytics.reclaimDebugMedia": [{
40697
+ name: "deviceIds",
40698
+ form: "array",
40699
+ optional: true
40700
+ }],
40545
40701
  "pipelineAnalytics.reconcileFromDisk": [{
40546
40702
  name: "deviceId",
40547
40703
  form: "single",
@@ -40907,6 +41063,11 @@ Object.freeze({
40907
41063
  form: "single",
40908
41064
  optional: false
40909
41065
  }],
41066
+ "recording.setDevicePlacement": [{
41067
+ name: "deviceId",
41068
+ form: "single",
41069
+ optional: false
41070
+ }],
40910
41071
  "recording.startStorageMigrationMove": [{
40911
41072
  name: "deviceId",
40912
41073
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-reolink",
3
- "version": "1.2.72",
3
+ "version": "1.2.73",
4
4
  "description": "Reolink camera device provider addon for CamStack — native Baichuan protocol",
5
5
  "keywords": [
6
6
  "camstack",