@camstack/addon-mqtt-broker 1.2.49 → 1.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.
@@ -8125,6 +8125,13 @@ var MediaRelocateModeSchema = _enum([
8125
8125
  ]);
8126
8126
  var RelocateMediaInputSchema = object({
8127
8127
  toLocationId: string(),
8128
+ /**
8129
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8130
+ * every row that is not already on `toLocationId` (the historical
8131
+ * behaviour). A named source is what a from→to migration needs: without it
8132
+ * "move events off disk 2" also emptied disk 1.
8133
+ */
8134
+ fromLocationId: string().optional(),
8128
8135
  throttleMbps: number().min(1).max(1e3).optional(),
8129
8136
  /** Omitted = `move`, the pre-existing behaviour. */
8130
8137
  mode: MediaRelocateModeSchema.optional()
@@ -8192,6 +8199,19 @@ var StorageMigrationDestinationsSchema = object({
8192
8199
  galleryMedia: string().min(1).optional()
8193
8200
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8194
8201
  /**
8202
+ * Optional named source per class. Omitted = the class's current default
8203
+ * (the historical behaviour). A named source that is NOT the default is a
8204
+ * drain of that disk: bytes move, the default stays, and the source is
8205
+ * disabled when the move finishes.
8206
+ */
8207
+ var StorageMigrationSourcesSchema = object({
8208
+ recordings: string().min(1).optional(),
8209
+ recordingsLow: string().min(1).optional(),
8210
+ eventMedia: string().min(1).optional(),
8211
+ backups: string().min(1).optional(),
8212
+ galleryMedia: string().min(1).optional()
8213
+ }).optional();
8214
+ /**
8195
8215
  * How a migration sequences the cutover against the byte move.
8196
8216
  *
8197
8217
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8213,6 +8233,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8213
8233
  /** Shared input for planning and starting an orchestrated storage migration. */
8214
8234
  var StorageMigrationInputSchema = object({
8215
8235
  destinations: StorageMigrationDestinationsSchema,
8236
+ /** Omitted = each class's current default. */
8237
+ sources: StorageMigrationSourcesSchema,
8216
8238
  throttleMbps: number().min(1).max(1e3).optional(),
8217
8239
  /** Omitted = `blocking`, which stays the default. */
8218
8240
  mode: StorageMigrationModeSchema.optional()
@@ -8292,6 +8314,13 @@ var StorageMigrationMoveSchema = object({
8292
8314
  storageClass: StorageMigrationClassSchema,
8293
8315
  fromLocationId: string(),
8294
8316
  toLocationId: string(),
8317
+ /**
8318
+ * True when `from` was NOT the class default at plan time. The move still
8319
+ * copies bytes, but the default is left alone and the source is disabled
8320
+ * once the copy verifies. Absent on jobs planned before this field existed
8321
+ * — those jobs always repointed, which is `false`.
8322
+ */
8323
+ freezeSource: boolean().optional(),
8295
8324
  moverJobId: string().nullable(),
8296
8325
  state: RelocateJobStateSchema.nullable(),
8297
8326
  error: string().nullable(),
@@ -8305,6 +8334,7 @@ var StorageMigrationJobSchema = object({
8305
8334
  * can tell a seconds-long cutover from a thirty-hour one. */
8306
8335
  mode: StorageMigrationModeSchema,
8307
8336
  destinations: StorageMigrationDestinationsSchema,
8337
+ sources: StorageMigrationSourcesSchema,
8308
8338
  throttleMbps: number(),
8309
8339
  moves: array(StorageMigrationMoveSchema),
8310
8340
  pauseLeaseId: string().nullable(),
@@ -8330,6 +8360,7 @@ var StorageMigrationFindingSchema = object({
8330
8360
  });
8331
8361
  var StorageMigrationPlanSchema = object({
8332
8362
  destinations: StorageMigrationDestinationsSchema,
8363
+ sources: StorageMigrationSourcesSchema,
8333
8364
  /** The mode this plan was built for. A plan is only valid for its mode: the
8334
8365
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8335
8366
  * it. */
@@ -8337,7 +8368,8 @@ var StorageMigrationPlanSchema = object({
8337
8368
  moves: array(object({
8338
8369
  storageClass: StorageMigrationClassSchema,
8339
8370
  fromLocationId: string(),
8340
- toLocationId: string()
8371
+ toLocationId: string(),
8372
+ freezeSource: boolean().optional()
8341
8373
  })),
8342
8374
  findings: array(StorageMigrationFindingSchema)
8343
8375
  });
@@ -8515,10 +8547,51 @@ var LedgerWalkReportSchema = object({
8515
8547
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8516
8548
  var RelocatableMediaCountInputSchema = object({
8517
8549
  toLocationId: string().min(1),
8550
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8551
+ fromLocationId: string().optional(),
8518
8552
  /** Omitted = `move`. */
8519
8553
  mode: MediaRelocateModeSchema.optional()
8520
8554
  });
8521
8555
  /**
8556
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8557
+ * ghost ledger entries on frozen footage locations.
8558
+ *
8559
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8560
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8561
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8562
+ * with no operator-visible status.
8563
+ */
8564
+ var StorageCleanupPhaseSchema = _enum([
8565
+ "orphans",
8566
+ "debug-media",
8567
+ "ghost-ledger",
8568
+ "done",
8569
+ "failed",
8570
+ "cancelled"
8571
+ ]);
8572
+ var StorageCleanupInputSchema = object({
8573
+ /** Also walk motion stills / track filmstrips. Off by default. */
8574
+ includeDebugMedia: boolean().optional() });
8575
+ var StorageCleanupJobSchema = object({
8576
+ jobId: string(),
8577
+ phase: StorageCleanupPhaseSchema,
8578
+ includeDebugMedia: boolean(),
8579
+ orphansReclaimed: number().int().nonnegative(),
8580
+ orphanBytesReclaimed: number().int().nonnegative(),
8581
+ debugMediaReclaimed: number().int().nonnegative(),
8582
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8583
+ ghostsForgotten: number().int().nonnegative(),
8584
+ ghostBytesForgotten: number().int().nonnegative(),
8585
+ /** Short operator-facing line: current collection, pass, or location. */
8586
+ detail: string().nullable(),
8587
+ cancelRequested: boolean(),
8588
+ startedAt: number(),
8589
+ updatedAt: number(),
8590
+ finishedAt: number().nullable(),
8591
+ error: string().nullable()
8592
+ });
8593
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8594
+ /**
8522
8595
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8523
8596
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8524
8597
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8546,11 +8619,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8546
8619
  * The default location for a type uses `id === <type>:default` by
8547
8620
  * convention (the bare type ref like `'backups'` resolves to it).
8548
8621
  *
8549
- * `isSystem: true` marks a location as orchestrator-seeded and
8550
- * undeletable. The bootstrap-installed defaults (one per type) carry
8551
- * this flag; operator-added locations don't. Editing the config of
8552
- * a system location is allowed (path migration, provider swap) but
8553
- * deleting it is rejected at the cap level.
8622
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8623
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8624
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8625
+ * / last-enabled, not on this bit.
8554
8626
  */
8555
8627
  var StorageLocationSchema = object({
8556
8628
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -12861,6 +12933,12 @@ method(object({
12861
12933
  }), _void(), {
12862
12934
  kind: "mutation",
12863
12935
  auth: "admin"
12936
+ }), method(object({
12937
+ from: string(),
12938
+ to: string()
12939
+ }), object({ moved: number() }), {
12940
+ kind: "mutation",
12941
+ auth: "admin"
12864
12942
  }), method(object({
12865
12943
  deviceId: number(),
12866
12944
  disabled: boolean()
@@ -18810,46 +18888,6 @@ var RecentTracksPageSchema = object({
18810
18888
  /** Cursor for the next page, or null when this page is the last. */
18811
18889
  nextCursor: string().nullable()
18812
18890
  });
18813
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
18814
- var LIST_GROUPS_MAX_LIMIT = 100;
18815
- var AnalyticsGroupRecordSchema = object({
18816
- id: string(),
18817
- deviceId: number().int(),
18818
- openedAt: number().int(),
18819
- closedAt: number().int(),
18820
- timestamp: number().int(),
18821
- memberCount: number().int(),
18822
- memberTrackIds: array(string()).readonly(),
18823
- className: string(),
18824
- classes: array(string()).readonly(),
18825
- /** Relative event-media path, or null when the group has no picture yet. */
18826
- mediaUrl: string().nullable(),
18827
- singleton: boolean()
18828
- });
18829
- var AnalyticsGroupMemberSchema = object({
18830
- trackId: string(),
18831
- deviceId: number().int(),
18832
- className: string(),
18833
- firstSeen: number().int(),
18834
- lastSeen: number().int(),
18835
- mediaUrl: string().nullable()
18836
- });
18837
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
18838
- var ListGroupsQueryInput = object({
18839
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
18840
- deviceIds: array(number()),
18841
- /** Window lower bound on `closedAt` (inclusive). */
18842
- since: number().optional(),
18843
- /** Window upper bound on `openedAt` (inclusive). */
18844
- until: number().optional(),
18845
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
18846
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
18847
- cursor: string().optional()
18848
- });
18849
- var ListGroupsPageSchema = object({
18850
- groups: array(AnalyticsGroupRecordSchema).readonly(),
18851
- nextCursor: string().nullable()
18852
- });
18853
18891
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
18854
18892
  var KEY_EVENTS_MAX_LIMIT = 200;
18855
18893
  var KeyEventQueryInput = object({
@@ -18953,9 +18991,7 @@ var TrackCascadeCountsSchema = object({
18953
18991
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
18954
18992
  plates: number().int(),
18955
18993
  /** Per-track CLIP search vectors removed (best-effort). */
18956
- embeddings: number().int(),
18957
- /** Group membership + group rows removed with their last member (best-effort). */
18958
- groups: number().int()
18994
+ embeddings: number().int()
18959
18995
  });
18960
18996
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
18961
18997
  var DiskReconcileCountsSchema = object({
@@ -19125,6 +19161,47 @@ var RebuildStatusSchema = object({
19125
19161
  /** Present when the pass ended by throwing. */
19126
19162
  error: string().nullable()
19127
19163
  });
19164
+ /**
19165
+ * Acknowledgement that a debug-media reclaim STARTED.
19166
+ *
19167
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19168
+ * it runs detached and this returns immediately. Awaiting it is how the
19169
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19170
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19171
+ */
19172
+ var MediaReclaimStartResultSchema = object({
19173
+ started: boolean(),
19174
+ /** True when a pass was already running; the new request is ignored. */
19175
+ alreadyRunning: boolean()
19176
+ });
19177
+ var MediaReclaimInputSchema = object({
19178
+ mode: _enum(["report", "reclaim"]).default("report"),
19179
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19180
+ deviceIds: array(number().int()).min(1).optional(),
19181
+ restart: boolean().optional(),
19182
+ pageSize: number().int().min(50).max(5e3).optional(),
19183
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19184
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19185
+ maxBytesPerRun: number().int().min(1).optional(),
19186
+ budgetMinutes: number().int().min(1).max(720).optional(),
19187
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19188
+ graceMinutes: number().int().min(1).max(10080).optional()
19189
+ });
19190
+ var MediaReclaimStatusSchema = object({
19191
+ running: boolean(),
19192
+ mode: _enum(["report", "reclaim"]).nullable(),
19193
+ totalExamined: number(),
19194
+ totalEligible: number(),
19195
+ totalReclaimed: number(),
19196
+ totalBytesReclaimed: number(),
19197
+ totalRefused: number(),
19198
+ /** Device+scope windows finished in this pass. */
19199
+ devicesDone: number(),
19200
+ complete: boolean().nullable(),
19201
+ startedAtMs: number().nullable(),
19202
+ finishedAtMs: number().nullable(),
19203
+ error: string().nullable()
19204
+ });
19128
19205
  var ReplayFrameInputSchema = object({
19129
19206
  timestamp: number(),
19130
19207
  frame: PipelineRunResultBridge
@@ -19163,10 +19240,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19163
19240
  * stationary registry). Default false: the timeline lists passages,
19164
19241
  * not parking records (operator decision, 2026-08-15). */
19165
19242
  includeStationary: boolean().optional()
19166
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19167
- deviceId: number(),
19168
- groupId: string().min(1)
19169
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19243
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19170
19244
  kind: "mutation",
19171
19245
  auth: "admin"
19172
19246
  }), 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({
@@ -19266,6 +19340,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19266
19340
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19267
19341
  kind: "query",
19268
19342
  auth: "admin"
19343
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19344
+ kind: "mutation",
19345
+ auth: "admin"
19346
+ }), method(object({}), MediaReclaimStatusSchema, {
19347
+ kind: "query",
19348
+ auth: "admin"
19269
19349
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19270
19350
  kind: "query",
19271
19351
  auth: "admin"
@@ -21236,7 +21316,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21236
21316
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21237
21317
  kind: "mutation",
21238
21318
  auth: "admin"
21239
- });
21319
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21320
+ kind: "mutation",
21321
+ auth: "admin"
21322
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21323
+ kind: "mutation",
21324
+ auth: "admin"
21325
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21240
21326
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21241
21327
  providerId: string().min(1),
21242
21328
  displayName: string().min(1),
@@ -26614,6 +26700,33 @@ var RecordingRebalanceInputSchema = object({
26614
26700
  minMoveGb: number().min(0).optional()
26615
26701
  });
26616
26702
  /**
26703
+ * Operator-facing placement of one camera onto a recordings location.
26704
+ *
26705
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
26706
+ * Auto (the planner may move this camera). `locationId` is where high/mid
26707
+ * currently write — the plan, which may disagree with the pin when Auto.
26708
+ */
26709
+ var RecordingDevicePlacementSchema = object({
26710
+ deviceId: number().int(),
26711
+ profile: string(),
26712
+ locationId: string()
26713
+ });
26714
+ var RecordingDevicePinSchema = object({
26715
+ deviceId: number().int(),
26716
+ /** Recordings-class location this camera is pinned to. */
26717
+ locationId: string()
26718
+ });
26719
+ var RecordingPlacementViewSchema = object({
26720
+ assignments: array(RecordingDevicePlacementSchema),
26721
+ pins: array(RecordingDevicePinSchema),
26722
+ defaultLocations: record(string(), string())
26723
+ });
26724
+ var RecordingSetDevicePlacementInputSchema = object({
26725
+ deviceId: number().int(),
26726
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
26727
+ locationId: string().nullable()
26728
+ });
26729
+ /**
26617
26730
  * Result of locating footage at a wall-clock instant for one device/profile.
26618
26731
  * `segment` carries the covering segment's window; `gap` reports the forward
26619
26732
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -26839,6 +26952,12 @@ method(object({
26839
26952
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
26840
26953
  kind: "mutation",
26841
26954
  auth: "admin"
26955
+ }), method(object({}), RecordingPlacementViewSchema, {
26956
+ kind: "query",
26957
+ auth: "admin"
26958
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
26959
+ kind: "mutation",
26960
+ auth: "admin"
26842
26961
  });
26843
26962
  /**
26844
26963
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30209,6 +30328,12 @@ Object.freeze({
30209
30328
  addonId: null,
30210
30329
  access: "delete"
30211
30330
  },
30331
+ "deviceManager.renameLocation": {
30332
+ capName: "device-manager",
30333
+ capScope: "system",
30334
+ addonId: null,
30335
+ access: "create"
30336
+ },
30212
30337
  "deviceManager.runDeviceAction": {
30213
30338
  capName: "device-manager",
30214
30339
  capScope: "system",
@@ -31901,19 +32026,19 @@ Object.freeze({
31901
32026
  addonId: null,
31902
32027
  access: "view"
31903
32028
  },
31904
- "pipelineAnalytics.getGroup": {
32029
+ "pipelineAnalytics.getKeyEvents": {
31905
32030
  capName: "pipeline-analytics",
31906
32031
  capScope: "device",
31907
32032
  addonId: null,
31908
32033
  access: "view"
31909
32034
  },
31910
- "pipelineAnalytics.getKeyEvents": {
32035
+ "pipelineAnalytics.getKeyEventsBatch": {
31911
32036
  capName: "pipeline-analytics",
31912
32037
  capScope: "device",
31913
32038
  addonId: null,
31914
32039
  access: "view"
31915
32040
  },
31916
- "pipelineAnalytics.getKeyEventsBatch": {
32041
+ "pipelineAnalytics.getMediaReclaimStatus": {
31917
32042
  capName: "pipeline-analytics",
31918
32043
  capScope: "device",
31919
32044
  addonId: null,
@@ -32003,12 +32128,6 @@ Object.freeze({
32003
32128
  addonId: null,
32004
32129
  access: "view"
32005
32130
  },
32006
- "pipelineAnalytics.listGroups": {
32007
- capName: "pipeline-analytics",
32008
- capScope: "device",
32009
- addonId: null,
32010
- access: "view"
32011
- },
32012
32131
  "pipelineAnalytics.listOpsLog": {
32013
32132
  capName: "pipeline-analytics",
32014
32133
  capScope: "device",
@@ -32093,6 +32212,12 @@ Object.freeze({
32093
32212
  addonId: null,
32094
32213
  access: "create"
32095
32214
  },
32215
+ "pipelineAnalytics.reclaimDebugMedia": {
32216
+ capName: "pipeline-analytics",
32217
+ capScope: "device",
32218
+ addonId: null,
32219
+ access: "create"
32220
+ },
32096
32221
  "pipelineAnalytics.reconcileFromDisk": {
32097
32222
  capName: "pipeline-analytics",
32098
32223
  capScope: "device",
@@ -33017,6 +33142,12 @@ Object.freeze({
33017
33142
  addonId: null,
33018
33143
  access: "view"
33019
33144
  },
33145
+ "recording.getPlacement": {
33146
+ capName: "recording",
33147
+ capScope: "system",
33148
+ addonId: null,
33149
+ access: "view"
33150
+ },
33020
33151
  "recording.getPlaybackManifest": {
33021
33152
  capName: "recording",
33022
33153
  capScope: "system",
@@ -33143,6 +33274,12 @@ Object.freeze({
33143
33274
  addonId: null,
33144
33275
  access: "create"
33145
33276
  },
33277
+ "recording.setDevicePlacement": {
33278
+ capName: "recording",
33279
+ capScope: "system",
33280
+ addonId: null,
33281
+ access: "create"
33282
+ },
33146
33283
  "recording.startStorageMigrationMove": {
33147
33284
  capName: "recording",
33148
33285
  capScope: "system",
@@ -33587,12 +33724,36 @@ Object.freeze({
33587
33724
  addonId: null,
33588
33725
  access: "create"
33589
33726
  },
33727
+ "storageMigration.cleanupCancel": {
33728
+ capName: "storage-migration",
33729
+ capScope: "system",
33730
+ addonId: null,
33731
+ access: "create"
33732
+ },
33733
+ "storageMigration.cleanupStart": {
33734
+ capName: "storage-migration",
33735
+ capScope: "system",
33736
+ addonId: null,
33737
+ access: "create"
33738
+ },
33739
+ "storageMigration.cleanupStatus": {
33740
+ capName: "storage-migration",
33741
+ capScope: "system",
33742
+ addonId: null,
33743
+ access: "view"
33744
+ },
33590
33745
  "storageMigration.drain": {
33591
33746
  capName: "storage-migration",
33592
33747
  capScope: "system",
33593
33748
  addonId: null,
33594
33749
  access: "create"
33595
33750
  },
33751
+ "storageMigration.history": {
33752
+ capName: "storage-migration",
33753
+ capScope: "system",
33754
+ addonId: null,
33755
+ access: "view"
33756
+ },
33596
33757
  "storageMigration.movers": {
33597
33758
  capName: "storage-migration",
33598
33759
  capScope: "system",
@@ -35589,11 +35750,6 @@ Object.freeze({
35589
35750
  form: "single",
35590
35751
  optional: true
35591
35752
  }],
35592
- "pipelineAnalytics.getGroup": [{
35593
- name: "deviceId",
35594
- form: "single",
35595
- optional: false
35596
- }],
35597
35753
  "pipelineAnalytics.getKeyEvents": [{
35598
35754
  name: "deviceId",
35599
35755
  form: "single",
@@ -35659,11 +35815,6 @@ Object.freeze({
35659
35815
  form: "single",
35660
35816
  optional: false
35661
35817
  }],
35662
- "pipelineAnalytics.listGroups": [{
35663
- name: "deviceIds",
35664
- form: "array",
35665
- optional: false
35666
- }],
35667
35818
  "pipelineAnalytics.listOpsLog": [{
35668
35819
  name: "deviceId",
35669
35820
  form: "single",
@@ -35709,6 +35860,11 @@ Object.freeze({
35709
35860
  form: "single",
35710
35861
  optional: true
35711
35862
  }],
35863
+ "pipelineAnalytics.reclaimDebugMedia": [{
35864
+ name: "deviceIds",
35865
+ form: "array",
35866
+ optional: true
35867
+ }],
35712
35868
  "pipelineAnalytics.reconcileFromDisk": [{
35713
35869
  name: "deviceId",
35714
35870
  form: "single",
@@ -36074,6 +36230,11 @@ Object.freeze({
36074
36230
  form: "single",
36075
36231
  optional: false
36076
36232
  }],
36233
+ "recording.setDevicePlacement": [{
36234
+ name: "deviceId",
36235
+ form: "single",
36236
+ optional: false
36237
+ }],
36077
36238
  "recording.startStorageMigrationMove": [{
36078
36239
  name: "deviceId",
36079
36240
  form: "single",
@@ -8120,6 +8120,13 @@ var MediaRelocateModeSchema = _enum([
8120
8120
  ]);
8121
8121
  var RelocateMediaInputSchema = object({
8122
8122
  toLocationId: string(),
8123
+ /**
8124
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8125
+ * every row that is not already on `toLocationId` (the historical
8126
+ * behaviour). A named source is what a from→to migration needs: without it
8127
+ * "move events off disk 2" also emptied disk 1.
8128
+ */
8129
+ fromLocationId: string().optional(),
8123
8130
  throttleMbps: number().min(1).max(1e3).optional(),
8124
8131
  /** Omitted = `move`, the pre-existing behaviour. */
8125
8132
  mode: MediaRelocateModeSchema.optional()
@@ -8187,6 +8194,19 @@ var StorageMigrationDestinationsSchema = object({
8187
8194
  galleryMedia: string().min(1).optional()
8188
8195
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8189
8196
  /**
8197
+ * Optional named source per class. Omitted = the class's current default
8198
+ * (the historical behaviour). A named source that is NOT the default is a
8199
+ * drain of that disk: bytes move, the default stays, and the source is
8200
+ * disabled when the move finishes.
8201
+ */
8202
+ var StorageMigrationSourcesSchema = object({
8203
+ recordings: string().min(1).optional(),
8204
+ recordingsLow: string().min(1).optional(),
8205
+ eventMedia: string().min(1).optional(),
8206
+ backups: string().min(1).optional(),
8207
+ galleryMedia: string().min(1).optional()
8208
+ }).optional();
8209
+ /**
8190
8210
  * How a migration sequences the cutover against the byte move.
8191
8211
  *
8192
8212
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8208,6 +8228,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8208
8228
  /** Shared input for planning and starting an orchestrated storage migration. */
8209
8229
  var StorageMigrationInputSchema = object({
8210
8230
  destinations: StorageMigrationDestinationsSchema,
8231
+ /** Omitted = each class's current default. */
8232
+ sources: StorageMigrationSourcesSchema,
8211
8233
  throttleMbps: number().min(1).max(1e3).optional(),
8212
8234
  /** Omitted = `blocking`, which stays the default. */
8213
8235
  mode: StorageMigrationModeSchema.optional()
@@ -8287,6 +8309,13 @@ var StorageMigrationMoveSchema = object({
8287
8309
  storageClass: StorageMigrationClassSchema,
8288
8310
  fromLocationId: string(),
8289
8311
  toLocationId: string(),
8312
+ /**
8313
+ * True when `from` was NOT the class default at plan time. The move still
8314
+ * copies bytes, but the default is left alone and the source is disabled
8315
+ * once the copy verifies. Absent on jobs planned before this field existed
8316
+ * — those jobs always repointed, which is `false`.
8317
+ */
8318
+ freezeSource: boolean().optional(),
8290
8319
  moverJobId: string().nullable(),
8291
8320
  state: RelocateJobStateSchema.nullable(),
8292
8321
  error: string().nullable(),
@@ -8300,6 +8329,7 @@ var StorageMigrationJobSchema = object({
8300
8329
  * can tell a seconds-long cutover from a thirty-hour one. */
8301
8330
  mode: StorageMigrationModeSchema,
8302
8331
  destinations: StorageMigrationDestinationsSchema,
8332
+ sources: StorageMigrationSourcesSchema,
8303
8333
  throttleMbps: number(),
8304
8334
  moves: array(StorageMigrationMoveSchema),
8305
8335
  pauseLeaseId: string().nullable(),
@@ -8325,6 +8355,7 @@ var StorageMigrationFindingSchema = object({
8325
8355
  });
8326
8356
  var StorageMigrationPlanSchema = object({
8327
8357
  destinations: StorageMigrationDestinationsSchema,
8358
+ sources: StorageMigrationSourcesSchema,
8328
8359
  /** The mode this plan was built for. A plan is only valid for its mode: the
8329
8360
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8330
8361
  * it. */
@@ -8332,7 +8363,8 @@ var StorageMigrationPlanSchema = object({
8332
8363
  moves: array(object({
8333
8364
  storageClass: StorageMigrationClassSchema,
8334
8365
  fromLocationId: string(),
8335
- toLocationId: string()
8366
+ toLocationId: string(),
8367
+ freezeSource: boolean().optional()
8336
8368
  })),
8337
8369
  findings: array(StorageMigrationFindingSchema)
8338
8370
  });
@@ -8510,10 +8542,51 @@ var LedgerWalkReportSchema = object({
8510
8542
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8511
8543
  var RelocatableMediaCountInputSchema = object({
8512
8544
  toLocationId: string().min(1),
8545
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8546
+ fromLocationId: string().optional(),
8513
8547
  /** Omitted = `move`. */
8514
8548
  mode: MediaRelocateModeSchema.optional()
8515
8549
  });
8516
8550
  /**
8551
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8552
+ * ghost ledger entries on frozen footage locations.
8553
+ *
8554
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8555
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8556
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8557
+ * with no operator-visible status.
8558
+ */
8559
+ var StorageCleanupPhaseSchema = _enum([
8560
+ "orphans",
8561
+ "debug-media",
8562
+ "ghost-ledger",
8563
+ "done",
8564
+ "failed",
8565
+ "cancelled"
8566
+ ]);
8567
+ var StorageCleanupInputSchema = object({
8568
+ /** Also walk motion stills / track filmstrips. Off by default. */
8569
+ includeDebugMedia: boolean().optional() });
8570
+ var StorageCleanupJobSchema = object({
8571
+ jobId: string(),
8572
+ phase: StorageCleanupPhaseSchema,
8573
+ includeDebugMedia: boolean(),
8574
+ orphansReclaimed: number().int().nonnegative(),
8575
+ orphanBytesReclaimed: number().int().nonnegative(),
8576
+ debugMediaReclaimed: number().int().nonnegative(),
8577
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8578
+ ghostsForgotten: number().int().nonnegative(),
8579
+ ghostBytesForgotten: number().int().nonnegative(),
8580
+ /** Short operator-facing line: current collection, pass, or location. */
8581
+ detail: string().nullable(),
8582
+ cancelRequested: boolean(),
8583
+ startedAt: number(),
8584
+ updatedAt: number(),
8585
+ finishedAt: number().nullable(),
8586
+ error: string().nullable()
8587
+ });
8588
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8589
+ /**
8517
8590
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8518
8591
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8519
8592
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8541,11 +8614,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8541
8614
  * The default location for a type uses `id === <type>:default` by
8542
8615
  * convention (the bare type ref like `'backups'` resolves to it).
8543
8616
  *
8544
- * `isSystem: true` marks a location as orchestrator-seeded and
8545
- * undeletable. The bootstrap-installed defaults (one per type) carry
8546
- * this flag; operator-added locations don't. Editing the config of
8547
- * a system location is allowed (path migration, provider swap) but
8548
- * deleting it is rejected at the cap level.
8617
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8618
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8619
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8620
+ * / last-enabled, not on this bit.
8549
8621
  */
8550
8622
  var StorageLocationSchema = object({
8551
8623
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -12856,6 +12928,12 @@ method(object({
12856
12928
  }), _void(), {
12857
12929
  kind: "mutation",
12858
12930
  auth: "admin"
12931
+ }), method(object({
12932
+ from: string(),
12933
+ to: string()
12934
+ }), object({ moved: number() }), {
12935
+ kind: "mutation",
12936
+ auth: "admin"
12859
12937
  }), method(object({
12860
12938
  deviceId: number(),
12861
12939
  disabled: boolean()
@@ -18805,46 +18883,6 @@ var RecentTracksPageSchema = object({
18805
18883
  /** Cursor for the next page, or null when this page is the last. */
18806
18884
  nextCursor: string().nullable()
18807
18885
  });
18808
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
18809
- var LIST_GROUPS_MAX_LIMIT = 100;
18810
- var AnalyticsGroupRecordSchema = object({
18811
- id: string(),
18812
- deviceId: number().int(),
18813
- openedAt: number().int(),
18814
- closedAt: number().int(),
18815
- timestamp: number().int(),
18816
- memberCount: number().int(),
18817
- memberTrackIds: array(string()).readonly(),
18818
- className: string(),
18819
- classes: array(string()).readonly(),
18820
- /** Relative event-media path, or null when the group has no picture yet. */
18821
- mediaUrl: string().nullable(),
18822
- singleton: boolean()
18823
- });
18824
- var AnalyticsGroupMemberSchema = object({
18825
- trackId: string(),
18826
- deviceId: number().int(),
18827
- className: string(),
18828
- firstSeen: number().int(),
18829
- lastSeen: number().int(),
18830
- mediaUrl: string().nullable()
18831
- });
18832
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
18833
- var ListGroupsQueryInput = object({
18834
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
18835
- deviceIds: array(number()),
18836
- /** Window lower bound on `closedAt` (inclusive). */
18837
- since: number().optional(),
18838
- /** Window upper bound on `openedAt` (inclusive). */
18839
- until: number().optional(),
18840
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
18841
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
18842
- cursor: string().optional()
18843
- });
18844
- var ListGroupsPageSchema = object({
18845
- groups: array(AnalyticsGroupRecordSchema).readonly(),
18846
- nextCursor: string().nullable()
18847
- });
18848
18886
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
18849
18887
  var KEY_EVENTS_MAX_LIMIT = 200;
18850
18888
  var KeyEventQueryInput = object({
@@ -18948,9 +18986,7 @@ var TrackCascadeCountsSchema = object({
18948
18986
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
18949
18987
  plates: number().int(),
18950
18988
  /** Per-track CLIP search vectors removed (best-effort). */
18951
- embeddings: number().int(),
18952
- /** Group membership + group rows removed with their last member (best-effort). */
18953
- groups: number().int()
18989
+ embeddings: number().int()
18954
18990
  });
18955
18991
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
18956
18992
  var DiskReconcileCountsSchema = object({
@@ -19120,6 +19156,47 @@ var RebuildStatusSchema = object({
19120
19156
  /** Present when the pass ended by throwing. */
19121
19157
  error: string().nullable()
19122
19158
  });
19159
+ /**
19160
+ * Acknowledgement that a debug-media reclaim STARTED.
19161
+ *
19162
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19163
+ * it runs detached and this returns immediately. Awaiting it is how the
19164
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19165
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19166
+ */
19167
+ var MediaReclaimStartResultSchema = object({
19168
+ started: boolean(),
19169
+ /** True when a pass was already running; the new request is ignored. */
19170
+ alreadyRunning: boolean()
19171
+ });
19172
+ var MediaReclaimInputSchema = object({
19173
+ mode: _enum(["report", "reclaim"]).default("report"),
19174
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19175
+ deviceIds: array(number().int()).min(1).optional(),
19176
+ restart: boolean().optional(),
19177
+ pageSize: number().int().min(50).max(5e3).optional(),
19178
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19179
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19180
+ maxBytesPerRun: number().int().min(1).optional(),
19181
+ budgetMinutes: number().int().min(1).max(720).optional(),
19182
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19183
+ graceMinutes: number().int().min(1).max(10080).optional()
19184
+ });
19185
+ var MediaReclaimStatusSchema = object({
19186
+ running: boolean(),
19187
+ mode: _enum(["report", "reclaim"]).nullable(),
19188
+ totalExamined: number(),
19189
+ totalEligible: number(),
19190
+ totalReclaimed: number(),
19191
+ totalBytesReclaimed: number(),
19192
+ totalRefused: number(),
19193
+ /** Device+scope windows finished in this pass. */
19194
+ devicesDone: number(),
19195
+ complete: boolean().nullable(),
19196
+ startedAtMs: number().nullable(),
19197
+ finishedAtMs: number().nullable(),
19198
+ error: string().nullable()
19199
+ });
19123
19200
  var ReplayFrameInputSchema = object({
19124
19201
  timestamp: number(),
19125
19202
  frame: PipelineRunResultBridge
@@ -19158,10 +19235,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19158
19235
  * stationary registry). Default false: the timeline lists passages,
19159
19236
  * not parking records (operator decision, 2026-08-15). */
19160
19237
  includeStationary: boolean().optional()
19161
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19162
- deviceId: number(),
19163
- groupId: string().min(1)
19164
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19238
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19165
19239
  kind: "mutation",
19166
19240
  auth: "admin"
19167
19241
  }), 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({
@@ -19261,6 +19335,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19261
19335
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19262
19336
  kind: "query",
19263
19337
  auth: "admin"
19338
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19339
+ kind: "mutation",
19340
+ auth: "admin"
19341
+ }), method(object({}), MediaReclaimStatusSchema, {
19342
+ kind: "query",
19343
+ auth: "admin"
19264
19344
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19265
19345
  kind: "query",
19266
19346
  auth: "admin"
@@ -21231,7 +21311,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21231
21311
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21232
21312
  kind: "mutation",
21233
21313
  auth: "admin"
21234
- });
21314
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21315
+ kind: "mutation",
21316
+ auth: "admin"
21317
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21318
+ kind: "mutation",
21319
+ auth: "admin"
21320
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21235
21321
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21236
21322
  providerId: string().min(1),
21237
21323
  displayName: string().min(1),
@@ -26609,6 +26695,33 @@ var RecordingRebalanceInputSchema = object({
26609
26695
  minMoveGb: number().min(0).optional()
26610
26696
  });
26611
26697
  /**
26698
+ * Operator-facing placement of one camera onto a recordings location.
26699
+ *
26700
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
26701
+ * Auto (the planner may move this camera). `locationId` is where high/mid
26702
+ * currently write — the plan, which may disagree with the pin when Auto.
26703
+ */
26704
+ var RecordingDevicePlacementSchema = object({
26705
+ deviceId: number().int(),
26706
+ profile: string(),
26707
+ locationId: string()
26708
+ });
26709
+ var RecordingDevicePinSchema = object({
26710
+ deviceId: number().int(),
26711
+ /** Recordings-class location this camera is pinned to. */
26712
+ locationId: string()
26713
+ });
26714
+ var RecordingPlacementViewSchema = object({
26715
+ assignments: array(RecordingDevicePlacementSchema),
26716
+ pins: array(RecordingDevicePinSchema),
26717
+ defaultLocations: record(string(), string())
26718
+ });
26719
+ var RecordingSetDevicePlacementInputSchema = object({
26720
+ deviceId: number().int(),
26721
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
26722
+ locationId: string().nullable()
26723
+ });
26724
+ /**
26612
26725
  * Result of locating footage at a wall-clock instant for one device/profile.
26613
26726
  * `segment` carries the covering segment's window; `gap` reports the forward
26614
26727
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -26834,6 +26947,12 @@ method(object({
26834
26947
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
26835
26948
  kind: "mutation",
26836
26949
  auth: "admin"
26950
+ }), method(object({}), RecordingPlacementViewSchema, {
26951
+ kind: "query",
26952
+ auth: "admin"
26953
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
26954
+ kind: "mutation",
26955
+ auth: "admin"
26837
26956
  });
26838
26957
  /**
26839
26958
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30204,6 +30323,12 @@ Object.freeze({
30204
30323
  addonId: null,
30205
30324
  access: "delete"
30206
30325
  },
30326
+ "deviceManager.renameLocation": {
30327
+ capName: "device-manager",
30328
+ capScope: "system",
30329
+ addonId: null,
30330
+ access: "create"
30331
+ },
30207
30332
  "deviceManager.runDeviceAction": {
30208
30333
  capName: "device-manager",
30209
30334
  capScope: "system",
@@ -31896,19 +32021,19 @@ Object.freeze({
31896
32021
  addonId: null,
31897
32022
  access: "view"
31898
32023
  },
31899
- "pipelineAnalytics.getGroup": {
32024
+ "pipelineAnalytics.getKeyEvents": {
31900
32025
  capName: "pipeline-analytics",
31901
32026
  capScope: "device",
31902
32027
  addonId: null,
31903
32028
  access: "view"
31904
32029
  },
31905
- "pipelineAnalytics.getKeyEvents": {
32030
+ "pipelineAnalytics.getKeyEventsBatch": {
31906
32031
  capName: "pipeline-analytics",
31907
32032
  capScope: "device",
31908
32033
  addonId: null,
31909
32034
  access: "view"
31910
32035
  },
31911
- "pipelineAnalytics.getKeyEventsBatch": {
32036
+ "pipelineAnalytics.getMediaReclaimStatus": {
31912
32037
  capName: "pipeline-analytics",
31913
32038
  capScope: "device",
31914
32039
  addonId: null,
@@ -31998,12 +32123,6 @@ Object.freeze({
31998
32123
  addonId: null,
31999
32124
  access: "view"
32000
32125
  },
32001
- "pipelineAnalytics.listGroups": {
32002
- capName: "pipeline-analytics",
32003
- capScope: "device",
32004
- addonId: null,
32005
- access: "view"
32006
- },
32007
32126
  "pipelineAnalytics.listOpsLog": {
32008
32127
  capName: "pipeline-analytics",
32009
32128
  capScope: "device",
@@ -32088,6 +32207,12 @@ Object.freeze({
32088
32207
  addonId: null,
32089
32208
  access: "create"
32090
32209
  },
32210
+ "pipelineAnalytics.reclaimDebugMedia": {
32211
+ capName: "pipeline-analytics",
32212
+ capScope: "device",
32213
+ addonId: null,
32214
+ access: "create"
32215
+ },
32091
32216
  "pipelineAnalytics.reconcileFromDisk": {
32092
32217
  capName: "pipeline-analytics",
32093
32218
  capScope: "device",
@@ -33012,6 +33137,12 @@ Object.freeze({
33012
33137
  addonId: null,
33013
33138
  access: "view"
33014
33139
  },
33140
+ "recording.getPlacement": {
33141
+ capName: "recording",
33142
+ capScope: "system",
33143
+ addonId: null,
33144
+ access: "view"
33145
+ },
33015
33146
  "recording.getPlaybackManifest": {
33016
33147
  capName: "recording",
33017
33148
  capScope: "system",
@@ -33138,6 +33269,12 @@ Object.freeze({
33138
33269
  addonId: null,
33139
33270
  access: "create"
33140
33271
  },
33272
+ "recording.setDevicePlacement": {
33273
+ capName: "recording",
33274
+ capScope: "system",
33275
+ addonId: null,
33276
+ access: "create"
33277
+ },
33141
33278
  "recording.startStorageMigrationMove": {
33142
33279
  capName: "recording",
33143
33280
  capScope: "system",
@@ -33582,12 +33719,36 @@ Object.freeze({
33582
33719
  addonId: null,
33583
33720
  access: "create"
33584
33721
  },
33722
+ "storageMigration.cleanupCancel": {
33723
+ capName: "storage-migration",
33724
+ capScope: "system",
33725
+ addonId: null,
33726
+ access: "create"
33727
+ },
33728
+ "storageMigration.cleanupStart": {
33729
+ capName: "storage-migration",
33730
+ capScope: "system",
33731
+ addonId: null,
33732
+ access: "create"
33733
+ },
33734
+ "storageMigration.cleanupStatus": {
33735
+ capName: "storage-migration",
33736
+ capScope: "system",
33737
+ addonId: null,
33738
+ access: "view"
33739
+ },
33585
33740
  "storageMigration.drain": {
33586
33741
  capName: "storage-migration",
33587
33742
  capScope: "system",
33588
33743
  addonId: null,
33589
33744
  access: "create"
33590
33745
  },
33746
+ "storageMigration.history": {
33747
+ capName: "storage-migration",
33748
+ capScope: "system",
33749
+ addonId: null,
33750
+ access: "view"
33751
+ },
33591
33752
  "storageMigration.movers": {
33592
33753
  capName: "storage-migration",
33593
33754
  capScope: "system",
@@ -35584,11 +35745,6 @@ Object.freeze({
35584
35745
  form: "single",
35585
35746
  optional: true
35586
35747
  }],
35587
- "pipelineAnalytics.getGroup": [{
35588
- name: "deviceId",
35589
- form: "single",
35590
- optional: false
35591
- }],
35592
35748
  "pipelineAnalytics.getKeyEvents": [{
35593
35749
  name: "deviceId",
35594
35750
  form: "single",
@@ -35654,11 +35810,6 @@ Object.freeze({
35654
35810
  form: "single",
35655
35811
  optional: false
35656
35812
  }],
35657
- "pipelineAnalytics.listGroups": [{
35658
- name: "deviceIds",
35659
- form: "array",
35660
- optional: false
35661
- }],
35662
35813
  "pipelineAnalytics.listOpsLog": [{
35663
35814
  name: "deviceId",
35664
35815
  form: "single",
@@ -35704,6 +35855,11 @@ Object.freeze({
35704
35855
  form: "single",
35705
35856
  optional: true
35706
35857
  }],
35858
+ "pipelineAnalytics.reclaimDebugMedia": [{
35859
+ name: "deviceIds",
35860
+ form: "array",
35861
+ optional: true
35862
+ }],
35707
35863
  "pipelineAnalytics.reconcileFromDisk": [{
35708
35864
  name: "deviceId",
35709
35865
  form: "single",
@@ -36069,6 +36225,11 @@ Object.freeze({
36069
36225
  form: "single",
36070
36226
  optional: false
36071
36227
  }],
36228
+ "recording.setDevicePlacement": [{
36229
+ name: "deviceId",
36230
+ form: "single",
36231
+ optional: false
36232
+ }],
36072
36233
  "recording.startStorageMigrationMove": [{
36073
36234
  name: "deviceId",
36074
36235
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-mqtt-broker",
3
- "version": "1.2.49",
3
+ "version": "1.2.50",
4
4
  "description": "MQTT broker registry addon for CamStack — manages external broker entries + an optional embedded aedes broker. Consumers spin up their own `mqtt.js` clients via the `mqtt-broker` cap.",
5
5
  "keywords": [
6
6
  "camstack",