@camstack/addon-provider-rademacher 0.2.48 → 0.2.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/addon.js +236 -73
  2. package/dist/addon.mjs +236 -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()
@@ -16782,6 +16860,8 @@ var NcSystemEventKindSchema = _enum([
16782
16860
  "device-offline",
16783
16861
  "device-disabled",
16784
16862
  "device-enabled",
16863
+ "device-battery-low",
16864
+ "device-battery-normal",
16785
16865
  "stream-online",
16786
16866
  "stream-offline",
16787
16867
  "node-online",
@@ -20040,46 +20120,6 @@ var RecentTracksPageSchema = object({
20040
20120
  /** Cursor for the next page, or null when this page is the last. */
20041
20121
  nextCursor: string().nullable()
20042
20122
  });
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
20123
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
20084
20124
  var KEY_EVENTS_MAX_LIMIT = 200;
20085
20125
  var KeyEventQueryInput = object({
@@ -20183,9 +20223,7 @@ var TrackCascadeCountsSchema = object({
20183
20223
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
20184
20224
  plates: number().int(),
20185
20225
  /** 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()
20226
+ embeddings: number().int()
20189
20227
  });
20190
20228
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
20191
20229
  var DiskReconcileCountsSchema = object({
@@ -20355,6 +20393,47 @@ var RebuildStatusSchema = object({
20355
20393
  /** Present when the pass ended by throwing. */
20356
20394
  error: string().nullable()
20357
20395
  });
20396
+ /**
20397
+ * Acknowledgement that a debug-media reclaim STARTED.
20398
+ *
20399
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
20400
+ * it runs detached and this returns immediately. Awaiting it is how the
20401
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
20402
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
20403
+ */
20404
+ var MediaReclaimStartResultSchema = object({
20405
+ started: boolean(),
20406
+ /** True when a pass was already running; the new request is ignored. */
20407
+ alreadyRunning: boolean()
20408
+ });
20409
+ var MediaReclaimInputSchema = object({
20410
+ mode: _enum(["report", "reclaim"]).default("report"),
20411
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
20412
+ deviceIds: array(number().int()).min(1).optional(),
20413
+ restart: boolean().optional(),
20414
+ pageSize: number().int().min(50).max(5e3).optional(),
20415
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
20416
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
20417
+ maxBytesPerRun: number().int().min(1).optional(),
20418
+ budgetMinutes: number().int().min(1).max(720).optional(),
20419
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
20420
+ graceMinutes: number().int().min(1).max(10080).optional()
20421
+ });
20422
+ var MediaReclaimStatusSchema = object({
20423
+ running: boolean(),
20424
+ mode: _enum(["report", "reclaim"]).nullable(),
20425
+ totalExamined: number(),
20426
+ totalEligible: number(),
20427
+ totalReclaimed: number(),
20428
+ totalBytesReclaimed: number(),
20429
+ totalRefused: number(),
20430
+ /** Device+scope windows finished in this pass. */
20431
+ devicesDone: number(),
20432
+ complete: boolean().nullable(),
20433
+ startedAtMs: number().nullable(),
20434
+ finishedAtMs: number().nullable(),
20435
+ error: string().nullable()
20436
+ });
20358
20437
  var ReplayFrameInputSchema = object({
20359
20438
  timestamp: number(),
20360
20439
  frame: PipelineRunResultBridge
@@ -20393,10 +20472,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20393
20472
  * stationary registry). Default false: the timeline lists passages,
20394
20473
  * not parking records (operator decision, 2026-08-15). */
20395
20474
  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(), {
20475
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
20400
20476
  kind: "mutation",
20401
20477
  auth: "admin"
20402
20478
  }), 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 +20572,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20496
20572
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
20497
20573
  kind: "query",
20498
20574
  auth: "admin"
20575
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
20576
+ kind: "mutation",
20577
+ auth: "admin"
20578
+ }), method(object({}), MediaReclaimStatusSchema, {
20579
+ kind: "query",
20580
+ auth: "admin"
20499
20581
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
20500
20582
  kind: "query",
20501
20583
  auth: "admin"
@@ -22466,7 +22548,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
22466
22548
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
22467
22549
  kind: "mutation",
22468
22550
  auth: "admin"
22469
- });
22551
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
22552
+ kind: "mutation",
22553
+ auth: "admin"
22554
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
22555
+ kind: "mutation",
22556
+ auth: "admin"
22557
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
22470
22558
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
22471
22559
  providerId: string().min(1),
22472
22560
  displayName: string().min(1),
@@ -29559,6 +29647,33 @@ var RecordingRebalanceInputSchema = object({
29559
29647
  minMoveGb: number().min(0).optional()
29560
29648
  });
29561
29649
  /**
29650
+ * Operator-facing placement of one camera onto a recordings location.
29651
+ *
29652
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
29653
+ * Auto (the planner may move this camera). `locationId` is where high/mid
29654
+ * currently write — the plan, which may disagree with the pin when Auto.
29655
+ */
29656
+ var RecordingDevicePlacementSchema = object({
29657
+ deviceId: number().int(),
29658
+ profile: string(),
29659
+ locationId: string()
29660
+ });
29661
+ var RecordingDevicePinSchema = object({
29662
+ deviceId: number().int(),
29663
+ /** Recordings-class location this camera is pinned to. */
29664
+ locationId: string()
29665
+ });
29666
+ var RecordingPlacementViewSchema = object({
29667
+ assignments: array(RecordingDevicePlacementSchema),
29668
+ pins: array(RecordingDevicePinSchema),
29669
+ defaultLocations: record(string(), string())
29670
+ });
29671
+ var RecordingSetDevicePlacementInputSchema = object({
29672
+ deviceId: number().int(),
29673
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
29674
+ locationId: string().nullable()
29675
+ });
29676
+ /**
29562
29677
  * Result of locating footage at a wall-clock instant for one device/profile.
29563
29678
  * `segment` carries the covering segment's window; `gap` reports the forward
29564
29679
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -29784,6 +29899,12 @@ method(object({
29784
29899
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
29785
29900
  kind: "mutation",
29786
29901
  auth: "admin"
29902
+ }), method(object({}), RecordingPlacementViewSchema, {
29903
+ kind: "query",
29904
+ auth: "admin"
29905
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29906
+ kind: "mutation",
29907
+ auth: "admin"
29787
29908
  });
29788
29909
  /**
29789
29910
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34853,6 +34974,12 @@ Object.freeze({
34853
34974
  addonId: null,
34854
34975
  access: "delete"
34855
34976
  },
34977
+ "deviceManager.renameLocation": {
34978
+ capName: "device-manager",
34979
+ capScope: "system",
34980
+ addonId: null,
34981
+ access: "create"
34982
+ },
34856
34983
  "deviceManager.runDeviceAction": {
34857
34984
  capName: "device-manager",
34858
34985
  capScope: "system",
@@ -36545,19 +36672,19 @@ Object.freeze({
36545
36672
  addonId: null,
36546
36673
  access: "view"
36547
36674
  },
36548
- "pipelineAnalytics.getGroup": {
36675
+ "pipelineAnalytics.getKeyEvents": {
36549
36676
  capName: "pipeline-analytics",
36550
36677
  capScope: "device",
36551
36678
  addonId: null,
36552
36679
  access: "view"
36553
36680
  },
36554
- "pipelineAnalytics.getKeyEvents": {
36681
+ "pipelineAnalytics.getKeyEventsBatch": {
36555
36682
  capName: "pipeline-analytics",
36556
36683
  capScope: "device",
36557
36684
  addonId: null,
36558
36685
  access: "view"
36559
36686
  },
36560
- "pipelineAnalytics.getKeyEventsBatch": {
36687
+ "pipelineAnalytics.getMediaReclaimStatus": {
36561
36688
  capName: "pipeline-analytics",
36562
36689
  capScope: "device",
36563
36690
  addonId: null,
@@ -36647,12 +36774,6 @@ Object.freeze({
36647
36774
  addonId: null,
36648
36775
  access: "view"
36649
36776
  },
36650
- "pipelineAnalytics.listGroups": {
36651
- capName: "pipeline-analytics",
36652
- capScope: "device",
36653
- addonId: null,
36654
- access: "view"
36655
- },
36656
36777
  "pipelineAnalytics.listOpsLog": {
36657
36778
  capName: "pipeline-analytics",
36658
36779
  capScope: "device",
@@ -36737,6 +36858,12 @@ Object.freeze({
36737
36858
  addonId: null,
36738
36859
  access: "create"
36739
36860
  },
36861
+ "pipelineAnalytics.reclaimDebugMedia": {
36862
+ capName: "pipeline-analytics",
36863
+ capScope: "device",
36864
+ addonId: null,
36865
+ access: "create"
36866
+ },
36740
36867
  "pipelineAnalytics.reconcileFromDisk": {
36741
36868
  capName: "pipeline-analytics",
36742
36869
  capScope: "device",
@@ -37661,6 +37788,12 @@ Object.freeze({
37661
37788
  addonId: null,
37662
37789
  access: "view"
37663
37790
  },
37791
+ "recording.getPlacement": {
37792
+ capName: "recording",
37793
+ capScope: "system",
37794
+ addonId: null,
37795
+ access: "view"
37796
+ },
37664
37797
  "recording.getPlaybackManifest": {
37665
37798
  capName: "recording",
37666
37799
  capScope: "system",
@@ -37787,6 +37920,12 @@ Object.freeze({
37787
37920
  addonId: null,
37788
37921
  access: "create"
37789
37922
  },
37923
+ "recording.setDevicePlacement": {
37924
+ capName: "recording",
37925
+ capScope: "system",
37926
+ addonId: null,
37927
+ access: "create"
37928
+ },
37790
37929
  "recording.startStorageMigrationMove": {
37791
37930
  capName: "recording",
37792
37931
  capScope: "system",
@@ -38231,12 +38370,36 @@ Object.freeze({
38231
38370
  addonId: null,
38232
38371
  access: "create"
38233
38372
  },
38373
+ "storageMigration.cleanupCancel": {
38374
+ capName: "storage-migration",
38375
+ capScope: "system",
38376
+ addonId: null,
38377
+ access: "create"
38378
+ },
38379
+ "storageMigration.cleanupStart": {
38380
+ capName: "storage-migration",
38381
+ capScope: "system",
38382
+ addonId: null,
38383
+ access: "create"
38384
+ },
38385
+ "storageMigration.cleanupStatus": {
38386
+ capName: "storage-migration",
38387
+ capScope: "system",
38388
+ addonId: null,
38389
+ access: "view"
38390
+ },
38234
38391
  "storageMigration.drain": {
38235
38392
  capName: "storage-migration",
38236
38393
  capScope: "system",
38237
38394
  addonId: null,
38238
38395
  access: "create"
38239
38396
  },
38397
+ "storageMigration.history": {
38398
+ capName: "storage-migration",
38399
+ capScope: "system",
38400
+ addonId: null,
38401
+ access: "view"
38402
+ },
38240
38403
  "storageMigration.movers": {
38241
38404
  capName: "storage-migration",
38242
38405
  capScope: "system",
@@ -40233,11 +40396,6 @@ Object.freeze({
40233
40396
  form: "single",
40234
40397
  optional: true
40235
40398
  }],
40236
- "pipelineAnalytics.getGroup": [{
40237
- name: "deviceId",
40238
- form: "single",
40239
- optional: false
40240
- }],
40241
40399
  "pipelineAnalytics.getKeyEvents": [{
40242
40400
  name: "deviceId",
40243
40401
  form: "single",
@@ -40303,11 +40461,6 @@ Object.freeze({
40303
40461
  form: "single",
40304
40462
  optional: false
40305
40463
  }],
40306
- "pipelineAnalytics.listGroups": [{
40307
- name: "deviceIds",
40308
- form: "array",
40309
- optional: false
40310
- }],
40311
40464
  "pipelineAnalytics.listOpsLog": [{
40312
40465
  name: "deviceId",
40313
40466
  form: "single",
@@ -40353,6 +40506,11 @@ Object.freeze({
40353
40506
  form: "single",
40354
40507
  optional: true
40355
40508
  }],
40509
+ "pipelineAnalytics.reclaimDebugMedia": [{
40510
+ name: "deviceIds",
40511
+ form: "array",
40512
+ optional: true
40513
+ }],
40356
40514
  "pipelineAnalytics.reconcileFromDisk": [{
40357
40515
  name: "deviceId",
40358
40516
  form: "single",
@@ -40718,6 +40876,11 @@ Object.freeze({
40718
40876
  form: "single",
40719
40877
  optional: false
40720
40878
  }],
40879
+ "recording.setDevicePlacement": [{
40880
+ name: "deviceId",
40881
+ form: "single",
40882
+ optional: false
40883
+ }],
40721
40884
  "recording.startStorageMigrationMove": [{
40722
40885
  name: "deviceId",
40723
40886
  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()
@@ -16781,6 +16859,8 @@ var NcSystemEventKindSchema = _enum([
16781
16859
  "device-offline",
16782
16860
  "device-disabled",
16783
16861
  "device-enabled",
16862
+ "device-battery-low",
16863
+ "device-battery-normal",
16784
16864
  "stream-online",
16785
16865
  "stream-offline",
16786
16866
  "node-online",
@@ -20039,46 +20119,6 @@ var RecentTracksPageSchema = object({
20039
20119
  /** Cursor for the next page, or null when this page is the last. */
20040
20120
  nextCursor: string().nullable()
20041
20121
  });
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
20122
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
20083
20123
  var KEY_EVENTS_MAX_LIMIT = 200;
20084
20124
  var KeyEventQueryInput = object({
@@ -20182,9 +20222,7 @@ var TrackCascadeCountsSchema = object({
20182
20222
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
20183
20223
  plates: number().int(),
20184
20224
  /** 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()
20225
+ embeddings: number().int()
20188
20226
  });
20189
20227
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
20190
20228
  var DiskReconcileCountsSchema = object({
@@ -20354,6 +20392,47 @@ var RebuildStatusSchema = object({
20354
20392
  /** Present when the pass ended by throwing. */
20355
20393
  error: string().nullable()
20356
20394
  });
20395
+ /**
20396
+ * Acknowledgement that a debug-media reclaim STARTED.
20397
+ *
20398
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
20399
+ * it runs detached and this returns immediately. Awaiting it is how the
20400
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
20401
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
20402
+ */
20403
+ var MediaReclaimStartResultSchema = object({
20404
+ started: boolean(),
20405
+ /** True when a pass was already running; the new request is ignored. */
20406
+ alreadyRunning: boolean()
20407
+ });
20408
+ var MediaReclaimInputSchema = object({
20409
+ mode: _enum(["report", "reclaim"]).default("report"),
20410
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
20411
+ deviceIds: array(number().int()).min(1).optional(),
20412
+ restart: boolean().optional(),
20413
+ pageSize: number().int().min(50).max(5e3).optional(),
20414
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
20415
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
20416
+ maxBytesPerRun: number().int().min(1).optional(),
20417
+ budgetMinutes: number().int().min(1).max(720).optional(),
20418
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
20419
+ graceMinutes: number().int().min(1).max(10080).optional()
20420
+ });
20421
+ var MediaReclaimStatusSchema = object({
20422
+ running: boolean(),
20423
+ mode: _enum(["report", "reclaim"]).nullable(),
20424
+ totalExamined: number(),
20425
+ totalEligible: number(),
20426
+ totalReclaimed: number(),
20427
+ totalBytesReclaimed: number(),
20428
+ totalRefused: number(),
20429
+ /** Device+scope windows finished in this pass. */
20430
+ devicesDone: number(),
20431
+ complete: boolean().nullable(),
20432
+ startedAtMs: number().nullable(),
20433
+ finishedAtMs: number().nullable(),
20434
+ error: string().nullable()
20435
+ });
20357
20436
  var ReplayFrameInputSchema = object({
20358
20437
  timestamp: number(),
20359
20438
  frame: PipelineRunResultBridge
@@ -20392,10 +20471,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20392
20471
  * stationary registry). Default false: the timeline lists passages,
20393
20472
  * not parking records (operator decision, 2026-08-15). */
20394
20473
  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(), {
20474
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
20399
20475
  kind: "mutation",
20400
20476
  auth: "admin"
20401
20477
  }), 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 +20571,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20495
20571
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
20496
20572
  kind: "query",
20497
20573
  auth: "admin"
20574
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
20575
+ kind: "mutation",
20576
+ auth: "admin"
20577
+ }), method(object({}), MediaReclaimStatusSchema, {
20578
+ kind: "query",
20579
+ auth: "admin"
20498
20580
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
20499
20581
  kind: "query",
20500
20582
  auth: "admin"
@@ -22465,7 +22547,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
22465
22547
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
22466
22548
  kind: "mutation",
22467
22549
  auth: "admin"
22468
- });
22550
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
22551
+ kind: "mutation",
22552
+ auth: "admin"
22553
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
22554
+ kind: "mutation",
22555
+ auth: "admin"
22556
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
22469
22557
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
22470
22558
  providerId: string().min(1),
22471
22559
  displayName: string().min(1),
@@ -29558,6 +29646,33 @@ var RecordingRebalanceInputSchema = object({
29558
29646
  minMoveGb: number().min(0).optional()
29559
29647
  });
29560
29648
  /**
29649
+ * Operator-facing placement of one camera onto a recordings location.
29650
+ *
29651
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
29652
+ * Auto (the planner may move this camera). `locationId` is where high/mid
29653
+ * currently write — the plan, which may disagree with the pin when Auto.
29654
+ */
29655
+ var RecordingDevicePlacementSchema = object({
29656
+ deviceId: number().int(),
29657
+ profile: string(),
29658
+ locationId: string()
29659
+ });
29660
+ var RecordingDevicePinSchema = object({
29661
+ deviceId: number().int(),
29662
+ /** Recordings-class location this camera is pinned to. */
29663
+ locationId: string()
29664
+ });
29665
+ var RecordingPlacementViewSchema = object({
29666
+ assignments: array(RecordingDevicePlacementSchema),
29667
+ pins: array(RecordingDevicePinSchema),
29668
+ defaultLocations: record(string(), string())
29669
+ });
29670
+ var RecordingSetDevicePlacementInputSchema = object({
29671
+ deviceId: number().int(),
29672
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
29673
+ locationId: string().nullable()
29674
+ });
29675
+ /**
29561
29676
  * Result of locating footage at a wall-clock instant for one device/profile.
29562
29677
  * `segment` carries the covering segment's window; `gap` reports the forward
29563
29678
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -29783,6 +29898,12 @@ method(object({
29783
29898
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
29784
29899
  kind: "mutation",
29785
29900
  auth: "admin"
29901
+ }), method(object({}), RecordingPlacementViewSchema, {
29902
+ kind: "query",
29903
+ auth: "admin"
29904
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29905
+ kind: "mutation",
29906
+ auth: "admin"
29786
29907
  });
29787
29908
  /**
29788
29909
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34852,6 +34973,12 @@ Object.freeze({
34852
34973
  addonId: null,
34853
34974
  access: "delete"
34854
34975
  },
34976
+ "deviceManager.renameLocation": {
34977
+ capName: "device-manager",
34978
+ capScope: "system",
34979
+ addonId: null,
34980
+ access: "create"
34981
+ },
34855
34982
  "deviceManager.runDeviceAction": {
34856
34983
  capName: "device-manager",
34857
34984
  capScope: "system",
@@ -36544,19 +36671,19 @@ Object.freeze({
36544
36671
  addonId: null,
36545
36672
  access: "view"
36546
36673
  },
36547
- "pipelineAnalytics.getGroup": {
36674
+ "pipelineAnalytics.getKeyEvents": {
36548
36675
  capName: "pipeline-analytics",
36549
36676
  capScope: "device",
36550
36677
  addonId: null,
36551
36678
  access: "view"
36552
36679
  },
36553
- "pipelineAnalytics.getKeyEvents": {
36680
+ "pipelineAnalytics.getKeyEventsBatch": {
36554
36681
  capName: "pipeline-analytics",
36555
36682
  capScope: "device",
36556
36683
  addonId: null,
36557
36684
  access: "view"
36558
36685
  },
36559
- "pipelineAnalytics.getKeyEventsBatch": {
36686
+ "pipelineAnalytics.getMediaReclaimStatus": {
36560
36687
  capName: "pipeline-analytics",
36561
36688
  capScope: "device",
36562
36689
  addonId: null,
@@ -36646,12 +36773,6 @@ Object.freeze({
36646
36773
  addonId: null,
36647
36774
  access: "view"
36648
36775
  },
36649
- "pipelineAnalytics.listGroups": {
36650
- capName: "pipeline-analytics",
36651
- capScope: "device",
36652
- addonId: null,
36653
- access: "view"
36654
- },
36655
36776
  "pipelineAnalytics.listOpsLog": {
36656
36777
  capName: "pipeline-analytics",
36657
36778
  capScope: "device",
@@ -36736,6 +36857,12 @@ Object.freeze({
36736
36857
  addonId: null,
36737
36858
  access: "create"
36738
36859
  },
36860
+ "pipelineAnalytics.reclaimDebugMedia": {
36861
+ capName: "pipeline-analytics",
36862
+ capScope: "device",
36863
+ addonId: null,
36864
+ access: "create"
36865
+ },
36739
36866
  "pipelineAnalytics.reconcileFromDisk": {
36740
36867
  capName: "pipeline-analytics",
36741
36868
  capScope: "device",
@@ -37660,6 +37787,12 @@ Object.freeze({
37660
37787
  addonId: null,
37661
37788
  access: "view"
37662
37789
  },
37790
+ "recording.getPlacement": {
37791
+ capName: "recording",
37792
+ capScope: "system",
37793
+ addonId: null,
37794
+ access: "view"
37795
+ },
37663
37796
  "recording.getPlaybackManifest": {
37664
37797
  capName: "recording",
37665
37798
  capScope: "system",
@@ -37786,6 +37919,12 @@ Object.freeze({
37786
37919
  addonId: null,
37787
37920
  access: "create"
37788
37921
  },
37922
+ "recording.setDevicePlacement": {
37923
+ capName: "recording",
37924
+ capScope: "system",
37925
+ addonId: null,
37926
+ access: "create"
37927
+ },
37789
37928
  "recording.startStorageMigrationMove": {
37790
37929
  capName: "recording",
37791
37930
  capScope: "system",
@@ -38230,12 +38369,36 @@ Object.freeze({
38230
38369
  addonId: null,
38231
38370
  access: "create"
38232
38371
  },
38372
+ "storageMigration.cleanupCancel": {
38373
+ capName: "storage-migration",
38374
+ capScope: "system",
38375
+ addonId: null,
38376
+ access: "create"
38377
+ },
38378
+ "storageMigration.cleanupStart": {
38379
+ capName: "storage-migration",
38380
+ capScope: "system",
38381
+ addonId: null,
38382
+ access: "create"
38383
+ },
38384
+ "storageMigration.cleanupStatus": {
38385
+ capName: "storage-migration",
38386
+ capScope: "system",
38387
+ addonId: null,
38388
+ access: "view"
38389
+ },
38233
38390
  "storageMigration.drain": {
38234
38391
  capName: "storage-migration",
38235
38392
  capScope: "system",
38236
38393
  addonId: null,
38237
38394
  access: "create"
38238
38395
  },
38396
+ "storageMigration.history": {
38397
+ capName: "storage-migration",
38398
+ capScope: "system",
38399
+ addonId: null,
38400
+ access: "view"
38401
+ },
38239
38402
  "storageMigration.movers": {
38240
38403
  capName: "storage-migration",
38241
38404
  capScope: "system",
@@ -40232,11 +40395,6 @@ Object.freeze({
40232
40395
  form: "single",
40233
40396
  optional: true
40234
40397
  }],
40235
- "pipelineAnalytics.getGroup": [{
40236
- name: "deviceId",
40237
- form: "single",
40238
- optional: false
40239
- }],
40240
40398
  "pipelineAnalytics.getKeyEvents": [{
40241
40399
  name: "deviceId",
40242
40400
  form: "single",
@@ -40302,11 +40460,6 @@ Object.freeze({
40302
40460
  form: "single",
40303
40461
  optional: false
40304
40462
  }],
40305
- "pipelineAnalytics.listGroups": [{
40306
- name: "deviceIds",
40307
- form: "array",
40308
- optional: false
40309
- }],
40310
40463
  "pipelineAnalytics.listOpsLog": [{
40311
40464
  name: "deviceId",
40312
40465
  form: "single",
@@ -40352,6 +40505,11 @@ Object.freeze({
40352
40505
  form: "single",
40353
40506
  optional: true
40354
40507
  }],
40508
+ "pipelineAnalytics.reclaimDebugMedia": [{
40509
+ name: "deviceIds",
40510
+ form: "array",
40511
+ optional: true
40512
+ }],
40355
40513
  "pipelineAnalytics.reconcileFromDisk": [{
40356
40514
  name: "deviceId",
40357
40515
  form: "single",
@@ -40717,6 +40875,11 @@ Object.freeze({
40717
40875
  form: "single",
40718
40876
  optional: false
40719
40877
  }],
40878
+ "recording.setDevicePlacement": [{
40879
+ name: "deviceId",
40880
+ form: "single",
40881
+ optional: false
40882
+ }],
40720
40883
  "recording.startStorageMigrationMove": [{
40721
40884
  name: "deviceId",
40722
40885
  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.50",
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",