@camstack/addon-provider-rademacher 0.2.48 → 0.2.49

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
@@ -9081,6 +9081,13 @@ var MediaRelocateModeSchema = _enum([
9081
9081
  ]);
9082
9082
  var RelocateMediaInputSchema = object({
9083
9083
  toLocationId: string(),
9084
+ /**
9085
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
9086
+ * every row that is not already on `toLocationId` (the historical
9087
+ * behaviour). A named source is what a from→to migration needs: without it
9088
+ * "move events off disk 2" also emptied disk 1.
9089
+ */
9090
+ fromLocationId: string().optional(),
9084
9091
  throttleMbps: number().min(1).max(1e3).optional(),
9085
9092
  /** Omitted = `move`, the pre-existing behaviour. */
9086
9093
  mode: MediaRelocateModeSchema.optional()
@@ -9148,6 +9155,19 @@ var StorageMigrationDestinationsSchema = object({
9148
9155
  galleryMedia: string().min(1).optional()
9149
9156
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
9150
9157
  /**
9158
+ * Optional named source per class. Omitted = the class's current default
9159
+ * (the historical behaviour). A named source that is NOT the default is a
9160
+ * drain of that disk: bytes move, the default stays, and the source is
9161
+ * disabled when the move finishes.
9162
+ */
9163
+ var StorageMigrationSourcesSchema = object({
9164
+ recordings: string().min(1).optional(),
9165
+ recordingsLow: string().min(1).optional(),
9166
+ eventMedia: string().min(1).optional(),
9167
+ backups: string().min(1).optional(),
9168
+ galleryMedia: string().min(1).optional()
9169
+ }).optional();
9170
+ /**
9151
9171
  * How a migration sequences the cutover against the byte move.
9152
9172
  *
9153
9173
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -9169,6 +9189,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
9169
9189
  /** Shared input for planning and starting an orchestrated storage migration. */
9170
9190
  var StorageMigrationInputSchema = object({
9171
9191
  destinations: StorageMigrationDestinationsSchema,
9192
+ /** Omitted = each class's current default. */
9193
+ sources: StorageMigrationSourcesSchema,
9172
9194
  throttleMbps: number().min(1).max(1e3).optional(),
9173
9195
  /** Omitted = `blocking`, which stays the default. */
9174
9196
  mode: StorageMigrationModeSchema.optional()
@@ -9248,6 +9270,13 @@ var StorageMigrationMoveSchema = object({
9248
9270
  storageClass: StorageMigrationClassSchema,
9249
9271
  fromLocationId: string(),
9250
9272
  toLocationId: string(),
9273
+ /**
9274
+ * True when `from` was NOT the class default at plan time. The move still
9275
+ * copies bytes, but the default is left alone and the source is disabled
9276
+ * once the copy verifies. Absent on jobs planned before this field existed
9277
+ * — those jobs always repointed, which is `false`.
9278
+ */
9279
+ freezeSource: boolean().optional(),
9251
9280
  moverJobId: string().nullable(),
9252
9281
  state: RelocateJobStateSchema.nullable(),
9253
9282
  error: string().nullable(),
@@ -9261,6 +9290,7 @@ var StorageMigrationJobSchema = object({
9261
9290
  * can tell a seconds-long cutover from a thirty-hour one. */
9262
9291
  mode: StorageMigrationModeSchema,
9263
9292
  destinations: StorageMigrationDestinationsSchema,
9293
+ sources: StorageMigrationSourcesSchema,
9264
9294
  throttleMbps: number(),
9265
9295
  moves: array(StorageMigrationMoveSchema),
9266
9296
  pauseLeaseId: string().nullable(),
@@ -9286,6 +9316,7 @@ var StorageMigrationFindingSchema = object({
9286
9316
  });
9287
9317
  var StorageMigrationPlanSchema = object({
9288
9318
  destinations: StorageMigrationDestinationsSchema,
9319
+ sources: StorageMigrationSourcesSchema,
9289
9320
  /** The mode this plan was built for. A plan is only valid for its mode: the
9290
9321
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
9291
9322
  * it. */
@@ -9293,7 +9324,8 @@ var StorageMigrationPlanSchema = object({
9293
9324
  moves: array(object({
9294
9325
  storageClass: StorageMigrationClassSchema,
9295
9326
  fromLocationId: string(),
9296
- toLocationId: string()
9327
+ toLocationId: string(),
9328
+ freezeSource: boolean().optional()
9297
9329
  })),
9298
9330
  findings: array(StorageMigrationFindingSchema)
9299
9331
  });
@@ -9471,10 +9503,51 @@ var LedgerWalkReportSchema = object({
9471
9503
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
9472
9504
  var RelocatableMediaCountInputSchema = object({
9473
9505
  toLocationId: string().min(1),
9506
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
9507
+ fromLocationId: string().optional(),
9474
9508
  /** Omitted = `move`. */
9475
9509
  mode: MediaRelocateModeSchema.optional()
9476
9510
  });
9477
9511
  /**
9512
+ * Operator cleanup of leftover analytics rows, optional debug media, and
9513
+ * ghost ledger entries on frozen footage locations.
9514
+ *
9515
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
9516
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
9517
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
9518
+ * with no operator-visible status.
9519
+ */
9520
+ var StorageCleanupPhaseSchema = _enum([
9521
+ "orphans",
9522
+ "debug-media",
9523
+ "ghost-ledger",
9524
+ "done",
9525
+ "failed",
9526
+ "cancelled"
9527
+ ]);
9528
+ var StorageCleanupInputSchema = object({
9529
+ /** Also walk motion stills / track filmstrips. Off by default. */
9530
+ includeDebugMedia: boolean().optional() });
9531
+ var StorageCleanupJobSchema = object({
9532
+ jobId: string(),
9533
+ phase: StorageCleanupPhaseSchema,
9534
+ includeDebugMedia: boolean(),
9535
+ orphansReclaimed: number().int().nonnegative(),
9536
+ orphanBytesReclaimed: number().int().nonnegative(),
9537
+ debugMediaReclaimed: number().int().nonnegative(),
9538
+ debugMediaBytesReclaimed: number().int().nonnegative(),
9539
+ ghostsForgotten: number().int().nonnegative(),
9540
+ ghostBytesForgotten: number().int().nonnegative(),
9541
+ /** Short operator-facing line: current collection, pass, or location. */
9542
+ detail: string().nullable(),
9543
+ cancelRequested: boolean(),
9544
+ startedAt: number(),
9545
+ updatedAt: number(),
9546
+ finishedAt: number().nullable(),
9547
+ error: string().nullable()
9548
+ });
9549
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
9550
+ /**
9478
9551
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
9479
9552
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
9480
9553
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -9502,11 +9575,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
9502
9575
  * The default location for a type uses `id === <type>:default` by
9503
9576
  * convention (the bare type ref like `'backups'` resolves to it).
9504
9577
  *
9505
- * `isSystem: true` marks a location as orchestrator-seeded and
9506
- * undeletable. The bootstrap-installed defaults (one per type) carry
9507
- * this flag; operator-added locations don't. Editing the config of
9508
- * a system location is allowed (path migration, provider swap) but
9509
- * deleting it is rejected at the cap level.
9578
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
9579
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
9580
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
9581
+ * / last-enabled, not on this bit.
9510
9582
  */
9511
9583
  var StorageLocationSchema = object({
9512
9584
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -14032,6 +14104,12 @@ method(object({
14032
14104
  }), _void(), {
14033
14105
  kind: "mutation",
14034
14106
  auth: "admin"
14107
+ }), method(object({
14108
+ from: string(),
14109
+ to: string()
14110
+ }), object({ moved: number() }), {
14111
+ kind: "mutation",
14112
+ auth: "admin"
14035
14113
  }), method(object({
14036
14114
  deviceId: number(),
14037
14115
  disabled: boolean()
@@ -20040,46 +20118,6 @@ var RecentTracksPageSchema = object({
20040
20118
  /** Cursor for the next page, or null when this page is the last. */
20041
20119
  nextCursor: string().nullable()
20042
20120
  });
20043
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
20044
- var LIST_GROUPS_MAX_LIMIT = 100;
20045
- var AnalyticsGroupRecordSchema = object({
20046
- id: string(),
20047
- deviceId: number().int(),
20048
- openedAt: number().int(),
20049
- closedAt: number().int(),
20050
- timestamp: number().int(),
20051
- memberCount: number().int(),
20052
- memberTrackIds: array(string()).readonly(),
20053
- className: string(),
20054
- classes: array(string()).readonly(),
20055
- /** Relative event-media path, or null when the group has no picture yet. */
20056
- mediaUrl: string().nullable(),
20057
- singleton: boolean()
20058
- });
20059
- var AnalyticsGroupMemberSchema = object({
20060
- trackId: string(),
20061
- deviceId: number().int(),
20062
- className: string(),
20063
- firstSeen: number().int(),
20064
- lastSeen: number().int(),
20065
- mediaUrl: string().nullable()
20066
- });
20067
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
20068
- var ListGroupsQueryInput = object({
20069
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
20070
- deviceIds: array(number()),
20071
- /** Window lower bound on `closedAt` (inclusive). */
20072
- since: number().optional(),
20073
- /** Window upper bound on `openedAt` (inclusive). */
20074
- until: number().optional(),
20075
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
20076
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
20077
- cursor: string().optional()
20078
- });
20079
- var ListGroupsPageSchema = object({
20080
- groups: array(AnalyticsGroupRecordSchema).readonly(),
20081
- nextCursor: string().nullable()
20082
- });
20083
20121
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
20084
20122
  var KEY_EVENTS_MAX_LIMIT = 200;
20085
20123
  var KeyEventQueryInput = object({
@@ -20183,9 +20221,7 @@ var TrackCascadeCountsSchema = object({
20183
20221
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
20184
20222
  plates: number().int(),
20185
20223
  /** Per-track CLIP search vectors removed (best-effort). */
20186
- embeddings: number().int(),
20187
- /** Group membership + group rows removed with their last member (best-effort). */
20188
- groups: number().int()
20224
+ embeddings: number().int()
20189
20225
  });
20190
20226
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
20191
20227
  var DiskReconcileCountsSchema = object({
@@ -20355,6 +20391,47 @@ var RebuildStatusSchema = object({
20355
20391
  /** Present when the pass ended by throwing. */
20356
20392
  error: string().nullable()
20357
20393
  });
20394
+ /**
20395
+ * Acknowledgement that a debug-media reclaim STARTED.
20396
+ *
20397
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
20398
+ * it runs detached and this returns immediately. Awaiting it is how the
20399
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
20400
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
20401
+ */
20402
+ var MediaReclaimStartResultSchema = object({
20403
+ started: boolean(),
20404
+ /** True when a pass was already running; the new request is ignored. */
20405
+ alreadyRunning: boolean()
20406
+ });
20407
+ var MediaReclaimInputSchema = object({
20408
+ mode: _enum(["report", "reclaim"]).default("report"),
20409
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
20410
+ deviceIds: array(number().int()).min(1).optional(),
20411
+ restart: boolean().optional(),
20412
+ pageSize: number().int().min(50).max(5e3).optional(),
20413
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
20414
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
20415
+ maxBytesPerRun: number().int().min(1).optional(),
20416
+ budgetMinutes: number().int().min(1).max(720).optional(),
20417
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
20418
+ graceMinutes: number().int().min(1).max(10080).optional()
20419
+ });
20420
+ var MediaReclaimStatusSchema = object({
20421
+ running: boolean(),
20422
+ mode: _enum(["report", "reclaim"]).nullable(),
20423
+ totalExamined: number(),
20424
+ totalEligible: number(),
20425
+ totalReclaimed: number(),
20426
+ totalBytesReclaimed: number(),
20427
+ totalRefused: number(),
20428
+ /** Device+scope windows finished in this pass. */
20429
+ devicesDone: number(),
20430
+ complete: boolean().nullable(),
20431
+ startedAtMs: number().nullable(),
20432
+ finishedAtMs: number().nullable(),
20433
+ error: string().nullable()
20434
+ });
20358
20435
  var ReplayFrameInputSchema = object({
20359
20436
  timestamp: number(),
20360
20437
  frame: PipelineRunResultBridge
@@ -20393,10 +20470,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20393
20470
  * stationary registry). Default false: the timeline lists passages,
20394
20471
  * not parking records (operator decision, 2026-08-15). */
20395
20472
  includeStationary: boolean().optional()
20396
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
20397
- deviceId: number(),
20398
- groupId: string().min(1)
20399
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
20473
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
20400
20474
  kind: "mutation",
20401
20475
  auth: "admin"
20402
20476
  }), 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({
@@ -20496,6 +20570,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20496
20570
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
20497
20571
  kind: "query",
20498
20572
  auth: "admin"
20573
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
20574
+ kind: "mutation",
20575
+ auth: "admin"
20576
+ }), method(object({}), MediaReclaimStatusSchema, {
20577
+ kind: "query",
20578
+ auth: "admin"
20499
20579
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
20500
20580
  kind: "query",
20501
20581
  auth: "admin"
@@ -22466,7 +22546,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
22466
22546
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
22467
22547
  kind: "mutation",
22468
22548
  auth: "admin"
22469
- });
22549
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
22550
+ kind: "mutation",
22551
+ auth: "admin"
22552
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
22553
+ kind: "mutation",
22554
+ auth: "admin"
22555
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
22470
22556
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
22471
22557
  providerId: string().min(1),
22472
22558
  displayName: string().min(1),
@@ -29559,6 +29645,33 @@ var RecordingRebalanceInputSchema = object({
29559
29645
  minMoveGb: number().min(0).optional()
29560
29646
  });
29561
29647
  /**
29648
+ * Operator-facing placement of one camera onto a recordings location.
29649
+ *
29650
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
29651
+ * Auto (the planner may move this camera). `locationId` is where high/mid
29652
+ * currently write — the plan, which may disagree with the pin when Auto.
29653
+ */
29654
+ var RecordingDevicePlacementSchema = object({
29655
+ deviceId: number().int(),
29656
+ profile: string(),
29657
+ locationId: string()
29658
+ });
29659
+ var RecordingDevicePinSchema = object({
29660
+ deviceId: number().int(),
29661
+ /** Recordings-class location this camera is pinned to. */
29662
+ locationId: string()
29663
+ });
29664
+ var RecordingPlacementViewSchema = object({
29665
+ assignments: array(RecordingDevicePlacementSchema),
29666
+ pins: array(RecordingDevicePinSchema),
29667
+ defaultLocations: record(string(), string())
29668
+ });
29669
+ var RecordingSetDevicePlacementInputSchema = object({
29670
+ deviceId: number().int(),
29671
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
29672
+ locationId: string().nullable()
29673
+ });
29674
+ /**
29562
29675
  * Result of locating footage at a wall-clock instant for one device/profile.
29563
29676
  * `segment` carries the covering segment's window; `gap` reports the forward
29564
29677
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -29784,6 +29897,12 @@ method(object({
29784
29897
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
29785
29898
  kind: "mutation",
29786
29899
  auth: "admin"
29900
+ }), method(object({}), RecordingPlacementViewSchema, {
29901
+ kind: "query",
29902
+ auth: "admin"
29903
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29904
+ kind: "mutation",
29905
+ auth: "admin"
29787
29906
  });
29788
29907
  /**
29789
29908
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34853,6 +34972,12 @@ Object.freeze({
34853
34972
  addonId: null,
34854
34973
  access: "delete"
34855
34974
  },
34975
+ "deviceManager.renameLocation": {
34976
+ capName: "device-manager",
34977
+ capScope: "system",
34978
+ addonId: null,
34979
+ access: "create"
34980
+ },
34856
34981
  "deviceManager.runDeviceAction": {
34857
34982
  capName: "device-manager",
34858
34983
  capScope: "system",
@@ -36545,19 +36670,19 @@ Object.freeze({
36545
36670
  addonId: null,
36546
36671
  access: "view"
36547
36672
  },
36548
- "pipelineAnalytics.getGroup": {
36673
+ "pipelineAnalytics.getKeyEvents": {
36549
36674
  capName: "pipeline-analytics",
36550
36675
  capScope: "device",
36551
36676
  addonId: null,
36552
36677
  access: "view"
36553
36678
  },
36554
- "pipelineAnalytics.getKeyEvents": {
36679
+ "pipelineAnalytics.getKeyEventsBatch": {
36555
36680
  capName: "pipeline-analytics",
36556
36681
  capScope: "device",
36557
36682
  addonId: null,
36558
36683
  access: "view"
36559
36684
  },
36560
- "pipelineAnalytics.getKeyEventsBatch": {
36685
+ "pipelineAnalytics.getMediaReclaimStatus": {
36561
36686
  capName: "pipeline-analytics",
36562
36687
  capScope: "device",
36563
36688
  addonId: null,
@@ -36647,12 +36772,6 @@ Object.freeze({
36647
36772
  addonId: null,
36648
36773
  access: "view"
36649
36774
  },
36650
- "pipelineAnalytics.listGroups": {
36651
- capName: "pipeline-analytics",
36652
- capScope: "device",
36653
- addonId: null,
36654
- access: "view"
36655
- },
36656
36775
  "pipelineAnalytics.listOpsLog": {
36657
36776
  capName: "pipeline-analytics",
36658
36777
  capScope: "device",
@@ -36737,6 +36856,12 @@ Object.freeze({
36737
36856
  addonId: null,
36738
36857
  access: "create"
36739
36858
  },
36859
+ "pipelineAnalytics.reclaimDebugMedia": {
36860
+ capName: "pipeline-analytics",
36861
+ capScope: "device",
36862
+ addonId: null,
36863
+ access: "create"
36864
+ },
36740
36865
  "pipelineAnalytics.reconcileFromDisk": {
36741
36866
  capName: "pipeline-analytics",
36742
36867
  capScope: "device",
@@ -37661,6 +37786,12 @@ Object.freeze({
37661
37786
  addonId: null,
37662
37787
  access: "view"
37663
37788
  },
37789
+ "recording.getPlacement": {
37790
+ capName: "recording",
37791
+ capScope: "system",
37792
+ addonId: null,
37793
+ access: "view"
37794
+ },
37664
37795
  "recording.getPlaybackManifest": {
37665
37796
  capName: "recording",
37666
37797
  capScope: "system",
@@ -37787,6 +37918,12 @@ Object.freeze({
37787
37918
  addonId: null,
37788
37919
  access: "create"
37789
37920
  },
37921
+ "recording.setDevicePlacement": {
37922
+ capName: "recording",
37923
+ capScope: "system",
37924
+ addonId: null,
37925
+ access: "create"
37926
+ },
37790
37927
  "recording.startStorageMigrationMove": {
37791
37928
  capName: "recording",
37792
37929
  capScope: "system",
@@ -38231,12 +38368,36 @@ Object.freeze({
38231
38368
  addonId: null,
38232
38369
  access: "create"
38233
38370
  },
38371
+ "storageMigration.cleanupCancel": {
38372
+ capName: "storage-migration",
38373
+ capScope: "system",
38374
+ addonId: null,
38375
+ access: "create"
38376
+ },
38377
+ "storageMigration.cleanupStart": {
38378
+ capName: "storage-migration",
38379
+ capScope: "system",
38380
+ addonId: null,
38381
+ access: "create"
38382
+ },
38383
+ "storageMigration.cleanupStatus": {
38384
+ capName: "storage-migration",
38385
+ capScope: "system",
38386
+ addonId: null,
38387
+ access: "view"
38388
+ },
38234
38389
  "storageMigration.drain": {
38235
38390
  capName: "storage-migration",
38236
38391
  capScope: "system",
38237
38392
  addonId: null,
38238
38393
  access: "create"
38239
38394
  },
38395
+ "storageMigration.history": {
38396
+ capName: "storage-migration",
38397
+ capScope: "system",
38398
+ addonId: null,
38399
+ access: "view"
38400
+ },
38240
38401
  "storageMigration.movers": {
38241
38402
  capName: "storage-migration",
38242
38403
  capScope: "system",
@@ -40233,11 +40394,6 @@ Object.freeze({
40233
40394
  form: "single",
40234
40395
  optional: true
40235
40396
  }],
40236
- "pipelineAnalytics.getGroup": [{
40237
- name: "deviceId",
40238
- form: "single",
40239
- optional: false
40240
- }],
40241
40397
  "pipelineAnalytics.getKeyEvents": [{
40242
40398
  name: "deviceId",
40243
40399
  form: "single",
@@ -40303,11 +40459,6 @@ Object.freeze({
40303
40459
  form: "single",
40304
40460
  optional: false
40305
40461
  }],
40306
- "pipelineAnalytics.listGroups": [{
40307
- name: "deviceIds",
40308
- form: "array",
40309
- optional: false
40310
- }],
40311
40462
  "pipelineAnalytics.listOpsLog": [{
40312
40463
  name: "deviceId",
40313
40464
  form: "single",
@@ -40353,6 +40504,11 @@ Object.freeze({
40353
40504
  form: "single",
40354
40505
  optional: true
40355
40506
  }],
40507
+ "pipelineAnalytics.reclaimDebugMedia": [{
40508
+ name: "deviceIds",
40509
+ form: "array",
40510
+ optional: true
40511
+ }],
40356
40512
  "pipelineAnalytics.reconcileFromDisk": [{
40357
40513
  name: "deviceId",
40358
40514
  form: "single",
@@ -40718,6 +40874,11 @@ Object.freeze({
40718
40874
  form: "single",
40719
40875
  optional: false
40720
40876
  }],
40877
+ "recording.setDevicePlacement": [{
40878
+ name: "deviceId",
40879
+ form: "single",
40880
+ optional: false
40881
+ }],
40721
40882
  "recording.startStorageMigrationMove": [{
40722
40883
  name: "deviceId",
40723
40884
  form: "single",
package/dist/addon.mjs CHANGED
@@ -9080,6 +9080,13 @@ var MediaRelocateModeSchema = _enum([
9080
9080
  ]);
9081
9081
  var RelocateMediaInputSchema = object({
9082
9082
  toLocationId: string(),
9083
+ /**
9084
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
9085
+ * every row that is not already on `toLocationId` (the historical
9086
+ * behaviour). A named source is what a from→to migration needs: without it
9087
+ * "move events off disk 2" also emptied disk 1.
9088
+ */
9089
+ fromLocationId: string().optional(),
9083
9090
  throttleMbps: number().min(1).max(1e3).optional(),
9084
9091
  /** Omitted = `move`, the pre-existing behaviour. */
9085
9092
  mode: MediaRelocateModeSchema.optional()
@@ -9147,6 +9154,19 @@ var StorageMigrationDestinationsSchema = object({
9147
9154
  galleryMedia: string().min(1).optional()
9148
9155
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
9149
9156
  /**
9157
+ * Optional named source per class. Omitted = the class's current default
9158
+ * (the historical behaviour). A named source that is NOT the default is a
9159
+ * drain of that disk: bytes move, the default stays, and the source is
9160
+ * disabled when the move finishes.
9161
+ */
9162
+ var StorageMigrationSourcesSchema = object({
9163
+ recordings: string().min(1).optional(),
9164
+ recordingsLow: string().min(1).optional(),
9165
+ eventMedia: string().min(1).optional(),
9166
+ backups: string().min(1).optional(),
9167
+ galleryMedia: string().min(1).optional()
9168
+ }).optional();
9169
+ /**
9150
9170
  * How a migration sequences the cutover against the byte move.
9151
9171
  *
9152
9172
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -9168,6 +9188,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
9168
9188
  /** Shared input for planning and starting an orchestrated storage migration. */
9169
9189
  var StorageMigrationInputSchema = object({
9170
9190
  destinations: StorageMigrationDestinationsSchema,
9191
+ /** Omitted = each class's current default. */
9192
+ sources: StorageMigrationSourcesSchema,
9171
9193
  throttleMbps: number().min(1).max(1e3).optional(),
9172
9194
  /** Omitted = `blocking`, which stays the default. */
9173
9195
  mode: StorageMigrationModeSchema.optional()
@@ -9247,6 +9269,13 @@ var StorageMigrationMoveSchema = object({
9247
9269
  storageClass: StorageMigrationClassSchema,
9248
9270
  fromLocationId: string(),
9249
9271
  toLocationId: string(),
9272
+ /**
9273
+ * True when `from` was NOT the class default at plan time. The move still
9274
+ * copies bytes, but the default is left alone and the source is disabled
9275
+ * once the copy verifies. Absent on jobs planned before this field existed
9276
+ * — those jobs always repointed, which is `false`.
9277
+ */
9278
+ freezeSource: boolean().optional(),
9250
9279
  moverJobId: string().nullable(),
9251
9280
  state: RelocateJobStateSchema.nullable(),
9252
9281
  error: string().nullable(),
@@ -9260,6 +9289,7 @@ var StorageMigrationJobSchema = object({
9260
9289
  * can tell a seconds-long cutover from a thirty-hour one. */
9261
9290
  mode: StorageMigrationModeSchema,
9262
9291
  destinations: StorageMigrationDestinationsSchema,
9292
+ sources: StorageMigrationSourcesSchema,
9263
9293
  throttleMbps: number(),
9264
9294
  moves: array(StorageMigrationMoveSchema),
9265
9295
  pauseLeaseId: string().nullable(),
@@ -9285,6 +9315,7 @@ var StorageMigrationFindingSchema = object({
9285
9315
  });
9286
9316
  var StorageMigrationPlanSchema = object({
9287
9317
  destinations: StorageMigrationDestinationsSchema,
9318
+ sources: StorageMigrationSourcesSchema,
9288
9319
  /** The mode this plan was built for. A plan is only valid for its mode: the
9289
9320
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
9290
9321
  * it. */
@@ -9292,7 +9323,8 @@ var StorageMigrationPlanSchema = object({
9292
9323
  moves: array(object({
9293
9324
  storageClass: StorageMigrationClassSchema,
9294
9325
  fromLocationId: string(),
9295
- toLocationId: string()
9326
+ toLocationId: string(),
9327
+ freezeSource: boolean().optional()
9296
9328
  })),
9297
9329
  findings: array(StorageMigrationFindingSchema)
9298
9330
  });
@@ -9470,10 +9502,51 @@ var LedgerWalkReportSchema = object({
9470
9502
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
9471
9503
  var RelocatableMediaCountInputSchema = object({
9472
9504
  toLocationId: string().min(1),
9505
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
9506
+ fromLocationId: string().optional(),
9473
9507
  /** Omitted = `move`. */
9474
9508
  mode: MediaRelocateModeSchema.optional()
9475
9509
  });
9476
9510
  /**
9511
+ * Operator cleanup of leftover analytics rows, optional debug media, and
9512
+ * ghost ledger entries on frozen footage locations.
9513
+ *
9514
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
9515
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
9516
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
9517
+ * with no operator-visible status.
9518
+ */
9519
+ var StorageCleanupPhaseSchema = _enum([
9520
+ "orphans",
9521
+ "debug-media",
9522
+ "ghost-ledger",
9523
+ "done",
9524
+ "failed",
9525
+ "cancelled"
9526
+ ]);
9527
+ var StorageCleanupInputSchema = object({
9528
+ /** Also walk motion stills / track filmstrips. Off by default. */
9529
+ includeDebugMedia: boolean().optional() });
9530
+ var StorageCleanupJobSchema = object({
9531
+ jobId: string(),
9532
+ phase: StorageCleanupPhaseSchema,
9533
+ includeDebugMedia: boolean(),
9534
+ orphansReclaimed: number().int().nonnegative(),
9535
+ orphanBytesReclaimed: number().int().nonnegative(),
9536
+ debugMediaReclaimed: number().int().nonnegative(),
9537
+ debugMediaBytesReclaimed: number().int().nonnegative(),
9538
+ ghostsForgotten: number().int().nonnegative(),
9539
+ ghostBytesForgotten: number().int().nonnegative(),
9540
+ /** Short operator-facing line: current collection, pass, or location. */
9541
+ detail: string().nullable(),
9542
+ cancelRequested: boolean(),
9543
+ startedAt: number(),
9544
+ updatedAt: number(),
9545
+ finishedAt: number().nullable(),
9546
+ error: string().nullable()
9547
+ });
9548
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
9549
+ /**
9477
9550
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
9478
9551
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
9479
9552
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -9501,11 +9574,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
9501
9574
  * The default location for a type uses `id === <type>:default` by
9502
9575
  * convention (the bare type ref like `'backups'` resolves to it).
9503
9576
  *
9504
- * `isSystem: true` marks a location as orchestrator-seeded and
9505
- * undeletable. The bootstrap-installed defaults (one per type) carry
9506
- * this flag; operator-added locations don't. Editing the config of
9507
- * a system location is allowed (path migration, provider swap) but
9508
- * deleting it is rejected at the cap level.
9577
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
9578
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
9579
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
9580
+ * / last-enabled, not on this bit.
9509
9581
  */
9510
9582
  var StorageLocationSchema = object({
9511
9583
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -14031,6 +14103,12 @@ method(object({
14031
14103
  }), _void(), {
14032
14104
  kind: "mutation",
14033
14105
  auth: "admin"
14106
+ }), method(object({
14107
+ from: string(),
14108
+ to: string()
14109
+ }), object({ moved: number() }), {
14110
+ kind: "mutation",
14111
+ auth: "admin"
14034
14112
  }), method(object({
14035
14113
  deviceId: number(),
14036
14114
  disabled: boolean()
@@ -20039,46 +20117,6 @@ var RecentTracksPageSchema = object({
20039
20117
  /** Cursor for the next page, or null when this page is the last. */
20040
20118
  nextCursor: string().nullable()
20041
20119
  });
20042
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
20043
- var LIST_GROUPS_MAX_LIMIT = 100;
20044
- var AnalyticsGroupRecordSchema = object({
20045
- id: string(),
20046
- deviceId: number().int(),
20047
- openedAt: number().int(),
20048
- closedAt: number().int(),
20049
- timestamp: number().int(),
20050
- memberCount: number().int(),
20051
- memberTrackIds: array(string()).readonly(),
20052
- className: string(),
20053
- classes: array(string()).readonly(),
20054
- /** Relative event-media path, or null when the group has no picture yet. */
20055
- mediaUrl: string().nullable(),
20056
- singleton: boolean()
20057
- });
20058
- var AnalyticsGroupMemberSchema = object({
20059
- trackId: string(),
20060
- deviceId: number().int(),
20061
- className: string(),
20062
- firstSeen: number().int(),
20063
- lastSeen: number().int(),
20064
- mediaUrl: string().nullable()
20065
- });
20066
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
20067
- var ListGroupsQueryInput = object({
20068
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
20069
- deviceIds: array(number()),
20070
- /** Window lower bound on `closedAt` (inclusive). */
20071
- since: number().optional(),
20072
- /** Window upper bound on `openedAt` (inclusive). */
20073
- until: number().optional(),
20074
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
20075
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
20076
- cursor: string().optional()
20077
- });
20078
- var ListGroupsPageSchema = object({
20079
- groups: array(AnalyticsGroupRecordSchema).readonly(),
20080
- nextCursor: string().nullable()
20081
- });
20082
20120
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
20083
20121
  var KEY_EVENTS_MAX_LIMIT = 200;
20084
20122
  var KeyEventQueryInput = object({
@@ -20182,9 +20220,7 @@ var TrackCascadeCountsSchema = object({
20182
20220
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
20183
20221
  plates: number().int(),
20184
20222
  /** Per-track CLIP search vectors removed (best-effort). */
20185
- embeddings: number().int(),
20186
- /** Group membership + group rows removed with their last member (best-effort). */
20187
- groups: number().int()
20223
+ embeddings: number().int()
20188
20224
  });
20189
20225
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
20190
20226
  var DiskReconcileCountsSchema = object({
@@ -20354,6 +20390,47 @@ var RebuildStatusSchema = object({
20354
20390
  /** Present when the pass ended by throwing. */
20355
20391
  error: string().nullable()
20356
20392
  });
20393
+ /**
20394
+ * Acknowledgement that a debug-media reclaim STARTED.
20395
+ *
20396
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
20397
+ * it runs detached and this returns immediately. Awaiting it is how the
20398
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
20399
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
20400
+ */
20401
+ var MediaReclaimStartResultSchema = object({
20402
+ started: boolean(),
20403
+ /** True when a pass was already running; the new request is ignored. */
20404
+ alreadyRunning: boolean()
20405
+ });
20406
+ var MediaReclaimInputSchema = object({
20407
+ mode: _enum(["report", "reclaim"]).default("report"),
20408
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
20409
+ deviceIds: array(number().int()).min(1).optional(),
20410
+ restart: boolean().optional(),
20411
+ pageSize: number().int().min(50).max(5e3).optional(),
20412
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
20413
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
20414
+ maxBytesPerRun: number().int().min(1).optional(),
20415
+ budgetMinutes: number().int().min(1).max(720).optional(),
20416
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
20417
+ graceMinutes: number().int().min(1).max(10080).optional()
20418
+ });
20419
+ var MediaReclaimStatusSchema = object({
20420
+ running: boolean(),
20421
+ mode: _enum(["report", "reclaim"]).nullable(),
20422
+ totalExamined: number(),
20423
+ totalEligible: number(),
20424
+ totalReclaimed: number(),
20425
+ totalBytesReclaimed: number(),
20426
+ totalRefused: number(),
20427
+ /** Device+scope windows finished in this pass. */
20428
+ devicesDone: number(),
20429
+ complete: boolean().nullable(),
20430
+ startedAtMs: number().nullable(),
20431
+ finishedAtMs: number().nullable(),
20432
+ error: string().nullable()
20433
+ });
20357
20434
  var ReplayFrameInputSchema = object({
20358
20435
  timestamp: number(),
20359
20436
  frame: PipelineRunResultBridge
@@ -20392,10 +20469,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20392
20469
  * stationary registry). Default false: the timeline lists passages,
20393
20470
  * not parking records (operator decision, 2026-08-15). */
20394
20471
  includeStationary: boolean().optional()
20395
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
20396
- deviceId: number(),
20397
- groupId: string().min(1)
20398
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
20472
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
20399
20473
  kind: "mutation",
20400
20474
  auth: "admin"
20401
20475
  }), 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({
@@ -20495,6 +20569,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20495
20569
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
20496
20570
  kind: "query",
20497
20571
  auth: "admin"
20572
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
20573
+ kind: "mutation",
20574
+ auth: "admin"
20575
+ }), method(object({}), MediaReclaimStatusSchema, {
20576
+ kind: "query",
20577
+ auth: "admin"
20498
20578
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
20499
20579
  kind: "query",
20500
20580
  auth: "admin"
@@ -22465,7 +22545,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
22465
22545
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
22466
22546
  kind: "mutation",
22467
22547
  auth: "admin"
22468
- });
22548
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
22549
+ kind: "mutation",
22550
+ auth: "admin"
22551
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
22552
+ kind: "mutation",
22553
+ auth: "admin"
22554
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
22469
22555
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
22470
22556
  providerId: string().min(1),
22471
22557
  displayName: string().min(1),
@@ -29558,6 +29644,33 @@ var RecordingRebalanceInputSchema = object({
29558
29644
  minMoveGb: number().min(0).optional()
29559
29645
  });
29560
29646
  /**
29647
+ * Operator-facing placement of one camera onto a recordings location.
29648
+ *
29649
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
29650
+ * Auto (the planner may move this camera). `locationId` is where high/mid
29651
+ * currently write — the plan, which may disagree with the pin when Auto.
29652
+ */
29653
+ var RecordingDevicePlacementSchema = object({
29654
+ deviceId: number().int(),
29655
+ profile: string(),
29656
+ locationId: string()
29657
+ });
29658
+ var RecordingDevicePinSchema = object({
29659
+ deviceId: number().int(),
29660
+ /** Recordings-class location this camera is pinned to. */
29661
+ locationId: string()
29662
+ });
29663
+ var RecordingPlacementViewSchema = object({
29664
+ assignments: array(RecordingDevicePlacementSchema),
29665
+ pins: array(RecordingDevicePinSchema),
29666
+ defaultLocations: record(string(), string())
29667
+ });
29668
+ var RecordingSetDevicePlacementInputSchema = object({
29669
+ deviceId: number().int(),
29670
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
29671
+ locationId: string().nullable()
29672
+ });
29673
+ /**
29561
29674
  * Result of locating footage at a wall-clock instant for one device/profile.
29562
29675
  * `segment` carries the covering segment's window; `gap` reports the forward
29563
29676
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -29783,6 +29896,12 @@ method(object({
29783
29896
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
29784
29897
  kind: "mutation",
29785
29898
  auth: "admin"
29899
+ }), method(object({}), RecordingPlacementViewSchema, {
29900
+ kind: "query",
29901
+ auth: "admin"
29902
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29903
+ kind: "mutation",
29904
+ auth: "admin"
29786
29905
  });
29787
29906
  /**
29788
29907
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34852,6 +34971,12 @@ Object.freeze({
34852
34971
  addonId: null,
34853
34972
  access: "delete"
34854
34973
  },
34974
+ "deviceManager.renameLocation": {
34975
+ capName: "device-manager",
34976
+ capScope: "system",
34977
+ addonId: null,
34978
+ access: "create"
34979
+ },
34855
34980
  "deviceManager.runDeviceAction": {
34856
34981
  capName: "device-manager",
34857
34982
  capScope: "system",
@@ -36544,19 +36669,19 @@ Object.freeze({
36544
36669
  addonId: null,
36545
36670
  access: "view"
36546
36671
  },
36547
- "pipelineAnalytics.getGroup": {
36672
+ "pipelineAnalytics.getKeyEvents": {
36548
36673
  capName: "pipeline-analytics",
36549
36674
  capScope: "device",
36550
36675
  addonId: null,
36551
36676
  access: "view"
36552
36677
  },
36553
- "pipelineAnalytics.getKeyEvents": {
36678
+ "pipelineAnalytics.getKeyEventsBatch": {
36554
36679
  capName: "pipeline-analytics",
36555
36680
  capScope: "device",
36556
36681
  addonId: null,
36557
36682
  access: "view"
36558
36683
  },
36559
- "pipelineAnalytics.getKeyEventsBatch": {
36684
+ "pipelineAnalytics.getMediaReclaimStatus": {
36560
36685
  capName: "pipeline-analytics",
36561
36686
  capScope: "device",
36562
36687
  addonId: null,
@@ -36646,12 +36771,6 @@ Object.freeze({
36646
36771
  addonId: null,
36647
36772
  access: "view"
36648
36773
  },
36649
- "pipelineAnalytics.listGroups": {
36650
- capName: "pipeline-analytics",
36651
- capScope: "device",
36652
- addonId: null,
36653
- access: "view"
36654
- },
36655
36774
  "pipelineAnalytics.listOpsLog": {
36656
36775
  capName: "pipeline-analytics",
36657
36776
  capScope: "device",
@@ -36736,6 +36855,12 @@ Object.freeze({
36736
36855
  addonId: null,
36737
36856
  access: "create"
36738
36857
  },
36858
+ "pipelineAnalytics.reclaimDebugMedia": {
36859
+ capName: "pipeline-analytics",
36860
+ capScope: "device",
36861
+ addonId: null,
36862
+ access: "create"
36863
+ },
36739
36864
  "pipelineAnalytics.reconcileFromDisk": {
36740
36865
  capName: "pipeline-analytics",
36741
36866
  capScope: "device",
@@ -37660,6 +37785,12 @@ Object.freeze({
37660
37785
  addonId: null,
37661
37786
  access: "view"
37662
37787
  },
37788
+ "recording.getPlacement": {
37789
+ capName: "recording",
37790
+ capScope: "system",
37791
+ addonId: null,
37792
+ access: "view"
37793
+ },
37663
37794
  "recording.getPlaybackManifest": {
37664
37795
  capName: "recording",
37665
37796
  capScope: "system",
@@ -37786,6 +37917,12 @@ Object.freeze({
37786
37917
  addonId: null,
37787
37918
  access: "create"
37788
37919
  },
37920
+ "recording.setDevicePlacement": {
37921
+ capName: "recording",
37922
+ capScope: "system",
37923
+ addonId: null,
37924
+ access: "create"
37925
+ },
37789
37926
  "recording.startStorageMigrationMove": {
37790
37927
  capName: "recording",
37791
37928
  capScope: "system",
@@ -38230,12 +38367,36 @@ Object.freeze({
38230
38367
  addonId: null,
38231
38368
  access: "create"
38232
38369
  },
38370
+ "storageMigration.cleanupCancel": {
38371
+ capName: "storage-migration",
38372
+ capScope: "system",
38373
+ addonId: null,
38374
+ access: "create"
38375
+ },
38376
+ "storageMigration.cleanupStart": {
38377
+ capName: "storage-migration",
38378
+ capScope: "system",
38379
+ addonId: null,
38380
+ access: "create"
38381
+ },
38382
+ "storageMigration.cleanupStatus": {
38383
+ capName: "storage-migration",
38384
+ capScope: "system",
38385
+ addonId: null,
38386
+ access: "view"
38387
+ },
38233
38388
  "storageMigration.drain": {
38234
38389
  capName: "storage-migration",
38235
38390
  capScope: "system",
38236
38391
  addonId: null,
38237
38392
  access: "create"
38238
38393
  },
38394
+ "storageMigration.history": {
38395
+ capName: "storage-migration",
38396
+ capScope: "system",
38397
+ addonId: null,
38398
+ access: "view"
38399
+ },
38239
38400
  "storageMigration.movers": {
38240
38401
  capName: "storage-migration",
38241
38402
  capScope: "system",
@@ -40232,11 +40393,6 @@ Object.freeze({
40232
40393
  form: "single",
40233
40394
  optional: true
40234
40395
  }],
40235
- "pipelineAnalytics.getGroup": [{
40236
- name: "deviceId",
40237
- form: "single",
40238
- optional: false
40239
- }],
40240
40396
  "pipelineAnalytics.getKeyEvents": [{
40241
40397
  name: "deviceId",
40242
40398
  form: "single",
@@ -40302,11 +40458,6 @@ Object.freeze({
40302
40458
  form: "single",
40303
40459
  optional: false
40304
40460
  }],
40305
- "pipelineAnalytics.listGroups": [{
40306
- name: "deviceIds",
40307
- form: "array",
40308
- optional: false
40309
- }],
40310
40461
  "pipelineAnalytics.listOpsLog": [{
40311
40462
  name: "deviceId",
40312
40463
  form: "single",
@@ -40352,6 +40503,11 @@ Object.freeze({
40352
40503
  form: "single",
40353
40504
  optional: true
40354
40505
  }],
40506
+ "pipelineAnalytics.reclaimDebugMedia": [{
40507
+ name: "deviceIds",
40508
+ form: "array",
40509
+ optional: true
40510
+ }],
40355
40511
  "pipelineAnalytics.reconcileFromDisk": [{
40356
40512
  name: "deviceId",
40357
40513
  form: "single",
@@ -40717,6 +40873,11 @@ Object.freeze({
40717
40873
  form: "single",
40718
40874
  optional: false
40719
40875
  }],
40876
+ "recording.setDevicePlacement": [{
40877
+ name: "deviceId",
40878
+ form: "single",
40879
+ optional: false
40880
+ }],
40720
40881
  "recording.startStorageMigrationMove": [{
40721
40882
  name: "deviceId",
40722
40883
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-rademacher",
3
- "version": "0.2.48",
3
+ "version": "0.2.49",
4
4
  "description": "Rademacher HomePilot device-provider addon for CamStack — wraps the @apocaliss92/noderademacher local-hub client (roller shutters over the cover cap)",
5
5
  "keywords": [
6
6
  "camstack",