@camstack/addon-mqtt-broker 1.2.49 → 1.2.51

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()
@@ -15592,6 +15670,8 @@ var NcSystemEventKindSchema = _enum([
15592
15670
  "device-offline",
15593
15671
  "device-disabled",
15594
15672
  "device-enabled",
15673
+ "device-battery-low",
15674
+ "device-battery-normal",
15595
15675
  "stream-online",
15596
15676
  "stream-offline",
15597
15677
  "node-online",
@@ -18810,46 +18890,6 @@ var RecentTracksPageSchema = object({
18810
18890
  /** Cursor for the next page, or null when this page is the last. */
18811
18891
  nextCursor: string().nullable()
18812
18892
  });
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
18893
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
18854
18894
  var KEY_EVENTS_MAX_LIMIT = 200;
18855
18895
  var KeyEventQueryInput = object({
@@ -18953,9 +18993,7 @@ var TrackCascadeCountsSchema = object({
18953
18993
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
18954
18994
  plates: number().int(),
18955
18995
  /** 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()
18996
+ embeddings: number().int()
18959
18997
  });
18960
18998
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
18961
18999
  var DiskReconcileCountsSchema = object({
@@ -19125,6 +19163,47 @@ var RebuildStatusSchema = object({
19125
19163
  /** Present when the pass ended by throwing. */
19126
19164
  error: string().nullable()
19127
19165
  });
19166
+ /**
19167
+ * Acknowledgement that a debug-media reclaim STARTED.
19168
+ *
19169
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19170
+ * it runs detached and this returns immediately. Awaiting it is how the
19171
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19172
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19173
+ */
19174
+ var MediaReclaimStartResultSchema = object({
19175
+ started: boolean(),
19176
+ /** True when a pass was already running; the new request is ignored. */
19177
+ alreadyRunning: boolean()
19178
+ });
19179
+ var MediaReclaimInputSchema = object({
19180
+ mode: _enum(["report", "reclaim"]).default("report"),
19181
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19182
+ deviceIds: array(number().int()).min(1).optional(),
19183
+ restart: boolean().optional(),
19184
+ pageSize: number().int().min(50).max(5e3).optional(),
19185
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19186
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19187
+ maxBytesPerRun: number().int().min(1).optional(),
19188
+ budgetMinutes: number().int().min(1).max(720).optional(),
19189
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19190
+ graceMinutes: number().int().min(1).max(10080).optional()
19191
+ });
19192
+ var MediaReclaimStatusSchema = object({
19193
+ running: boolean(),
19194
+ mode: _enum(["report", "reclaim"]).nullable(),
19195
+ totalExamined: number(),
19196
+ totalEligible: number(),
19197
+ totalReclaimed: number(),
19198
+ totalBytesReclaimed: number(),
19199
+ totalRefused: number(),
19200
+ /** Device+scope windows finished in this pass. */
19201
+ devicesDone: number(),
19202
+ complete: boolean().nullable(),
19203
+ startedAtMs: number().nullable(),
19204
+ finishedAtMs: number().nullable(),
19205
+ error: string().nullable()
19206
+ });
19128
19207
  var ReplayFrameInputSchema = object({
19129
19208
  timestamp: number(),
19130
19209
  frame: PipelineRunResultBridge
@@ -19163,10 +19242,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19163
19242
  * stationary registry). Default false: the timeline lists passages,
19164
19243
  * not parking records (operator decision, 2026-08-15). */
19165
19244
  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(), {
19245
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19170
19246
  kind: "mutation",
19171
19247
  auth: "admin"
19172
19248
  }), 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 +19342,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19266
19342
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19267
19343
  kind: "query",
19268
19344
  auth: "admin"
19345
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19346
+ kind: "mutation",
19347
+ auth: "admin"
19348
+ }), method(object({}), MediaReclaimStatusSchema, {
19349
+ kind: "query",
19350
+ auth: "admin"
19269
19351
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19270
19352
  kind: "query",
19271
19353
  auth: "admin"
@@ -21236,7 +21318,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21236
21318
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21237
21319
  kind: "mutation",
21238
21320
  auth: "admin"
21239
- });
21321
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21322
+ kind: "mutation",
21323
+ auth: "admin"
21324
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21325
+ kind: "mutation",
21326
+ auth: "admin"
21327
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21240
21328
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21241
21329
  providerId: string().min(1),
21242
21330
  displayName: string().min(1),
@@ -26614,6 +26702,33 @@ var RecordingRebalanceInputSchema = object({
26614
26702
  minMoveGb: number().min(0).optional()
26615
26703
  });
26616
26704
  /**
26705
+ * Operator-facing placement of one camera onto a recordings location.
26706
+ *
26707
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
26708
+ * Auto (the planner may move this camera). `locationId` is where high/mid
26709
+ * currently write — the plan, which may disagree with the pin when Auto.
26710
+ */
26711
+ var RecordingDevicePlacementSchema = object({
26712
+ deviceId: number().int(),
26713
+ profile: string(),
26714
+ locationId: string()
26715
+ });
26716
+ var RecordingDevicePinSchema = object({
26717
+ deviceId: number().int(),
26718
+ /** Recordings-class location this camera is pinned to. */
26719
+ locationId: string()
26720
+ });
26721
+ var RecordingPlacementViewSchema = object({
26722
+ assignments: array(RecordingDevicePlacementSchema),
26723
+ pins: array(RecordingDevicePinSchema),
26724
+ defaultLocations: record(string(), string())
26725
+ });
26726
+ var RecordingSetDevicePlacementInputSchema = object({
26727
+ deviceId: number().int(),
26728
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
26729
+ locationId: string().nullable()
26730
+ });
26731
+ /**
26617
26732
  * Result of locating footage at a wall-clock instant for one device/profile.
26618
26733
  * `segment` carries the covering segment's window; `gap` reports the forward
26619
26734
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -26839,6 +26954,12 @@ method(object({
26839
26954
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
26840
26955
  kind: "mutation",
26841
26956
  auth: "admin"
26957
+ }), method(object({}), RecordingPlacementViewSchema, {
26958
+ kind: "query",
26959
+ auth: "admin"
26960
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
26961
+ kind: "mutation",
26962
+ auth: "admin"
26842
26963
  });
26843
26964
  /**
26844
26965
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30209,6 +30330,12 @@ Object.freeze({
30209
30330
  addonId: null,
30210
30331
  access: "delete"
30211
30332
  },
30333
+ "deviceManager.renameLocation": {
30334
+ capName: "device-manager",
30335
+ capScope: "system",
30336
+ addonId: null,
30337
+ access: "create"
30338
+ },
30212
30339
  "deviceManager.runDeviceAction": {
30213
30340
  capName: "device-manager",
30214
30341
  capScope: "system",
@@ -31901,19 +32028,19 @@ Object.freeze({
31901
32028
  addonId: null,
31902
32029
  access: "view"
31903
32030
  },
31904
- "pipelineAnalytics.getGroup": {
32031
+ "pipelineAnalytics.getKeyEvents": {
31905
32032
  capName: "pipeline-analytics",
31906
32033
  capScope: "device",
31907
32034
  addonId: null,
31908
32035
  access: "view"
31909
32036
  },
31910
- "pipelineAnalytics.getKeyEvents": {
32037
+ "pipelineAnalytics.getKeyEventsBatch": {
31911
32038
  capName: "pipeline-analytics",
31912
32039
  capScope: "device",
31913
32040
  addonId: null,
31914
32041
  access: "view"
31915
32042
  },
31916
- "pipelineAnalytics.getKeyEventsBatch": {
32043
+ "pipelineAnalytics.getMediaReclaimStatus": {
31917
32044
  capName: "pipeline-analytics",
31918
32045
  capScope: "device",
31919
32046
  addonId: null,
@@ -32003,12 +32130,6 @@ Object.freeze({
32003
32130
  addonId: null,
32004
32131
  access: "view"
32005
32132
  },
32006
- "pipelineAnalytics.listGroups": {
32007
- capName: "pipeline-analytics",
32008
- capScope: "device",
32009
- addonId: null,
32010
- access: "view"
32011
- },
32012
32133
  "pipelineAnalytics.listOpsLog": {
32013
32134
  capName: "pipeline-analytics",
32014
32135
  capScope: "device",
@@ -32093,6 +32214,12 @@ Object.freeze({
32093
32214
  addonId: null,
32094
32215
  access: "create"
32095
32216
  },
32217
+ "pipelineAnalytics.reclaimDebugMedia": {
32218
+ capName: "pipeline-analytics",
32219
+ capScope: "device",
32220
+ addonId: null,
32221
+ access: "create"
32222
+ },
32096
32223
  "pipelineAnalytics.reconcileFromDisk": {
32097
32224
  capName: "pipeline-analytics",
32098
32225
  capScope: "device",
@@ -33017,6 +33144,12 @@ Object.freeze({
33017
33144
  addonId: null,
33018
33145
  access: "view"
33019
33146
  },
33147
+ "recording.getPlacement": {
33148
+ capName: "recording",
33149
+ capScope: "system",
33150
+ addonId: null,
33151
+ access: "view"
33152
+ },
33020
33153
  "recording.getPlaybackManifest": {
33021
33154
  capName: "recording",
33022
33155
  capScope: "system",
@@ -33143,6 +33276,12 @@ Object.freeze({
33143
33276
  addonId: null,
33144
33277
  access: "create"
33145
33278
  },
33279
+ "recording.setDevicePlacement": {
33280
+ capName: "recording",
33281
+ capScope: "system",
33282
+ addonId: null,
33283
+ access: "create"
33284
+ },
33146
33285
  "recording.startStorageMigrationMove": {
33147
33286
  capName: "recording",
33148
33287
  capScope: "system",
@@ -33587,12 +33726,36 @@ Object.freeze({
33587
33726
  addonId: null,
33588
33727
  access: "create"
33589
33728
  },
33729
+ "storageMigration.cleanupCancel": {
33730
+ capName: "storage-migration",
33731
+ capScope: "system",
33732
+ addonId: null,
33733
+ access: "create"
33734
+ },
33735
+ "storageMigration.cleanupStart": {
33736
+ capName: "storage-migration",
33737
+ capScope: "system",
33738
+ addonId: null,
33739
+ access: "create"
33740
+ },
33741
+ "storageMigration.cleanupStatus": {
33742
+ capName: "storage-migration",
33743
+ capScope: "system",
33744
+ addonId: null,
33745
+ access: "view"
33746
+ },
33590
33747
  "storageMigration.drain": {
33591
33748
  capName: "storage-migration",
33592
33749
  capScope: "system",
33593
33750
  addonId: null,
33594
33751
  access: "create"
33595
33752
  },
33753
+ "storageMigration.history": {
33754
+ capName: "storage-migration",
33755
+ capScope: "system",
33756
+ addonId: null,
33757
+ access: "view"
33758
+ },
33596
33759
  "storageMigration.movers": {
33597
33760
  capName: "storage-migration",
33598
33761
  capScope: "system",
@@ -35589,11 +35752,6 @@ Object.freeze({
35589
35752
  form: "single",
35590
35753
  optional: true
35591
35754
  }],
35592
- "pipelineAnalytics.getGroup": [{
35593
- name: "deviceId",
35594
- form: "single",
35595
- optional: false
35596
- }],
35597
35755
  "pipelineAnalytics.getKeyEvents": [{
35598
35756
  name: "deviceId",
35599
35757
  form: "single",
@@ -35659,11 +35817,6 @@ Object.freeze({
35659
35817
  form: "single",
35660
35818
  optional: false
35661
35819
  }],
35662
- "pipelineAnalytics.listGroups": [{
35663
- name: "deviceIds",
35664
- form: "array",
35665
- optional: false
35666
- }],
35667
35820
  "pipelineAnalytics.listOpsLog": [{
35668
35821
  name: "deviceId",
35669
35822
  form: "single",
@@ -35709,6 +35862,11 @@ Object.freeze({
35709
35862
  form: "single",
35710
35863
  optional: true
35711
35864
  }],
35865
+ "pipelineAnalytics.reclaimDebugMedia": [{
35866
+ name: "deviceIds",
35867
+ form: "array",
35868
+ optional: true
35869
+ }],
35712
35870
  "pipelineAnalytics.reconcileFromDisk": [{
35713
35871
  name: "deviceId",
35714
35872
  form: "single",
@@ -36074,6 +36232,11 @@ Object.freeze({
36074
36232
  form: "single",
36075
36233
  optional: false
36076
36234
  }],
36235
+ "recording.setDevicePlacement": [{
36236
+ name: "deviceId",
36237
+ form: "single",
36238
+ optional: false
36239
+ }],
36077
36240
  "recording.startStorageMigrationMove": [{
36078
36241
  name: "deviceId",
36079
36242
  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()
@@ -15587,6 +15665,8 @@ var NcSystemEventKindSchema = _enum([
15587
15665
  "device-offline",
15588
15666
  "device-disabled",
15589
15667
  "device-enabled",
15668
+ "device-battery-low",
15669
+ "device-battery-normal",
15590
15670
  "stream-online",
15591
15671
  "stream-offline",
15592
15672
  "node-online",
@@ -18805,46 +18885,6 @@ var RecentTracksPageSchema = object({
18805
18885
  /** Cursor for the next page, or null when this page is the last. */
18806
18886
  nextCursor: string().nullable()
18807
18887
  });
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
18888
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
18849
18889
  var KEY_EVENTS_MAX_LIMIT = 200;
18850
18890
  var KeyEventQueryInput = object({
@@ -18948,9 +18988,7 @@ var TrackCascadeCountsSchema = object({
18948
18988
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
18949
18989
  plates: number().int(),
18950
18990
  /** 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()
18991
+ embeddings: number().int()
18954
18992
  });
18955
18993
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
18956
18994
  var DiskReconcileCountsSchema = object({
@@ -19120,6 +19158,47 @@ var RebuildStatusSchema = object({
19120
19158
  /** Present when the pass ended by throwing. */
19121
19159
  error: string().nullable()
19122
19160
  });
19161
+ /**
19162
+ * Acknowledgement that a debug-media reclaim STARTED.
19163
+ *
19164
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19165
+ * it runs detached and this returns immediately. Awaiting it is how the
19166
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19167
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19168
+ */
19169
+ var MediaReclaimStartResultSchema = object({
19170
+ started: boolean(),
19171
+ /** True when a pass was already running; the new request is ignored. */
19172
+ alreadyRunning: boolean()
19173
+ });
19174
+ var MediaReclaimInputSchema = object({
19175
+ mode: _enum(["report", "reclaim"]).default("report"),
19176
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19177
+ deviceIds: array(number().int()).min(1).optional(),
19178
+ restart: boolean().optional(),
19179
+ pageSize: number().int().min(50).max(5e3).optional(),
19180
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19181
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19182
+ maxBytesPerRun: number().int().min(1).optional(),
19183
+ budgetMinutes: number().int().min(1).max(720).optional(),
19184
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19185
+ graceMinutes: number().int().min(1).max(10080).optional()
19186
+ });
19187
+ var MediaReclaimStatusSchema = object({
19188
+ running: boolean(),
19189
+ mode: _enum(["report", "reclaim"]).nullable(),
19190
+ totalExamined: number(),
19191
+ totalEligible: number(),
19192
+ totalReclaimed: number(),
19193
+ totalBytesReclaimed: number(),
19194
+ totalRefused: number(),
19195
+ /** Device+scope windows finished in this pass. */
19196
+ devicesDone: number(),
19197
+ complete: boolean().nullable(),
19198
+ startedAtMs: number().nullable(),
19199
+ finishedAtMs: number().nullable(),
19200
+ error: string().nullable()
19201
+ });
19123
19202
  var ReplayFrameInputSchema = object({
19124
19203
  timestamp: number(),
19125
19204
  frame: PipelineRunResultBridge
@@ -19158,10 +19237,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19158
19237
  * stationary registry). Default false: the timeline lists passages,
19159
19238
  * not parking records (operator decision, 2026-08-15). */
19160
19239
  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(), {
19240
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19165
19241
  kind: "mutation",
19166
19242
  auth: "admin"
19167
19243
  }), 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 +19337,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19261
19337
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19262
19338
  kind: "query",
19263
19339
  auth: "admin"
19340
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19341
+ kind: "mutation",
19342
+ auth: "admin"
19343
+ }), method(object({}), MediaReclaimStatusSchema, {
19344
+ kind: "query",
19345
+ auth: "admin"
19264
19346
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19265
19347
  kind: "query",
19266
19348
  auth: "admin"
@@ -21231,7 +21313,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21231
21313
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21232
21314
  kind: "mutation",
21233
21315
  auth: "admin"
21234
- });
21316
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21317
+ kind: "mutation",
21318
+ auth: "admin"
21319
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21320
+ kind: "mutation",
21321
+ auth: "admin"
21322
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21235
21323
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21236
21324
  providerId: string().min(1),
21237
21325
  displayName: string().min(1),
@@ -26609,6 +26697,33 @@ var RecordingRebalanceInputSchema = object({
26609
26697
  minMoveGb: number().min(0).optional()
26610
26698
  });
26611
26699
  /**
26700
+ * Operator-facing placement of one camera onto a recordings location.
26701
+ *
26702
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
26703
+ * Auto (the planner may move this camera). `locationId` is where high/mid
26704
+ * currently write — the plan, which may disagree with the pin when Auto.
26705
+ */
26706
+ var RecordingDevicePlacementSchema = object({
26707
+ deviceId: number().int(),
26708
+ profile: string(),
26709
+ locationId: string()
26710
+ });
26711
+ var RecordingDevicePinSchema = object({
26712
+ deviceId: number().int(),
26713
+ /** Recordings-class location this camera is pinned to. */
26714
+ locationId: string()
26715
+ });
26716
+ var RecordingPlacementViewSchema = object({
26717
+ assignments: array(RecordingDevicePlacementSchema),
26718
+ pins: array(RecordingDevicePinSchema),
26719
+ defaultLocations: record(string(), string())
26720
+ });
26721
+ var RecordingSetDevicePlacementInputSchema = object({
26722
+ deviceId: number().int(),
26723
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
26724
+ locationId: string().nullable()
26725
+ });
26726
+ /**
26612
26727
  * Result of locating footage at a wall-clock instant for one device/profile.
26613
26728
  * `segment` carries the covering segment's window; `gap` reports the forward
26614
26729
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -26834,6 +26949,12 @@ method(object({
26834
26949
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
26835
26950
  kind: "mutation",
26836
26951
  auth: "admin"
26952
+ }), method(object({}), RecordingPlacementViewSchema, {
26953
+ kind: "query",
26954
+ auth: "admin"
26955
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
26956
+ kind: "mutation",
26957
+ auth: "admin"
26837
26958
  });
26838
26959
  /**
26839
26960
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30204,6 +30325,12 @@ Object.freeze({
30204
30325
  addonId: null,
30205
30326
  access: "delete"
30206
30327
  },
30328
+ "deviceManager.renameLocation": {
30329
+ capName: "device-manager",
30330
+ capScope: "system",
30331
+ addonId: null,
30332
+ access: "create"
30333
+ },
30207
30334
  "deviceManager.runDeviceAction": {
30208
30335
  capName: "device-manager",
30209
30336
  capScope: "system",
@@ -31896,19 +32023,19 @@ Object.freeze({
31896
32023
  addonId: null,
31897
32024
  access: "view"
31898
32025
  },
31899
- "pipelineAnalytics.getGroup": {
32026
+ "pipelineAnalytics.getKeyEvents": {
31900
32027
  capName: "pipeline-analytics",
31901
32028
  capScope: "device",
31902
32029
  addonId: null,
31903
32030
  access: "view"
31904
32031
  },
31905
- "pipelineAnalytics.getKeyEvents": {
32032
+ "pipelineAnalytics.getKeyEventsBatch": {
31906
32033
  capName: "pipeline-analytics",
31907
32034
  capScope: "device",
31908
32035
  addonId: null,
31909
32036
  access: "view"
31910
32037
  },
31911
- "pipelineAnalytics.getKeyEventsBatch": {
32038
+ "pipelineAnalytics.getMediaReclaimStatus": {
31912
32039
  capName: "pipeline-analytics",
31913
32040
  capScope: "device",
31914
32041
  addonId: null,
@@ -31998,12 +32125,6 @@ Object.freeze({
31998
32125
  addonId: null,
31999
32126
  access: "view"
32000
32127
  },
32001
- "pipelineAnalytics.listGroups": {
32002
- capName: "pipeline-analytics",
32003
- capScope: "device",
32004
- addonId: null,
32005
- access: "view"
32006
- },
32007
32128
  "pipelineAnalytics.listOpsLog": {
32008
32129
  capName: "pipeline-analytics",
32009
32130
  capScope: "device",
@@ -32088,6 +32209,12 @@ Object.freeze({
32088
32209
  addonId: null,
32089
32210
  access: "create"
32090
32211
  },
32212
+ "pipelineAnalytics.reclaimDebugMedia": {
32213
+ capName: "pipeline-analytics",
32214
+ capScope: "device",
32215
+ addonId: null,
32216
+ access: "create"
32217
+ },
32091
32218
  "pipelineAnalytics.reconcileFromDisk": {
32092
32219
  capName: "pipeline-analytics",
32093
32220
  capScope: "device",
@@ -33012,6 +33139,12 @@ Object.freeze({
33012
33139
  addonId: null,
33013
33140
  access: "view"
33014
33141
  },
33142
+ "recording.getPlacement": {
33143
+ capName: "recording",
33144
+ capScope: "system",
33145
+ addonId: null,
33146
+ access: "view"
33147
+ },
33015
33148
  "recording.getPlaybackManifest": {
33016
33149
  capName: "recording",
33017
33150
  capScope: "system",
@@ -33138,6 +33271,12 @@ Object.freeze({
33138
33271
  addonId: null,
33139
33272
  access: "create"
33140
33273
  },
33274
+ "recording.setDevicePlacement": {
33275
+ capName: "recording",
33276
+ capScope: "system",
33277
+ addonId: null,
33278
+ access: "create"
33279
+ },
33141
33280
  "recording.startStorageMigrationMove": {
33142
33281
  capName: "recording",
33143
33282
  capScope: "system",
@@ -33582,12 +33721,36 @@ Object.freeze({
33582
33721
  addonId: null,
33583
33722
  access: "create"
33584
33723
  },
33724
+ "storageMigration.cleanupCancel": {
33725
+ capName: "storage-migration",
33726
+ capScope: "system",
33727
+ addonId: null,
33728
+ access: "create"
33729
+ },
33730
+ "storageMigration.cleanupStart": {
33731
+ capName: "storage-migration",
33732
+ capScope: "system",
33733
+ addonId: null,
33734
+ access: "create"
33735
+ },
33736
+ "storageMigration.cleanupStatus": {
33737
+ capName: "storage-migration",
33738
+ capScope: "system",
33739
+ addonId: null,
33740
+ access: "view"
33741
+ },
33585
33742
  "storageMigration.drain": {
33586
33743
  capName: "storage-migration",
33587
33744
  capScope: "system",
33588
33745
  addonId: null,
33589
33746
  access: "create"
33590
33747
  },
33748
+ "storageMigration.history": {
33749
+ capName: "storage-migration",
33750
+ capScope: "system",
33751
+ addonId: null,
33752
+ access: "view"
33753
+ },
33591
33754
  "storageMigration.movers": {
33592
33755
  capName: "storage-migration",
33593
33756
  capScope: "system",
@@ -35584,11 +35747,6 @@ Object.freeze({
35584
35747
  form: "single",
35585
35748
  optional: true
35586
35749
  }],
35587
- "pipelineAnalytics.getGroup": [{
35588
- name: "deviceId",
35589
- form: "single",
35590
- optional: false
35591
- }],
35592
35750
  "pipelineAnalytics.getKeyEvents": [{
35593
35751
  name: "deviceId",
35594
35752
  form: "single",
@@ -35654,11 +35812,6 @@ Object.freeze({
35654
35812
  form: "single",
35655
35813
  optional: false
35656
35814
  }],
35657
- "pipelineAnalytics.listGroups": [{
35658
- name: "deviceIds",
35659
- form: "array",
35660
- optional: false
35661
- }],
35662
35815
  "pipelineAnalytics.listOpsLog": [{
35663
35816
  name: "deviceId",
35664
35817
  form: "single",
@@ -35704,6 +35857,11 @@ Object.freeze({
35704
35857
  form: "single",
35705
35858
  optional: true
35706
35859
  }],
35860
+ "pipelineAnalytics.reclaimDebugMedia": [{
35861
+ name: "deviceIds",
35862
+ form: "array",
35863
+ optional: true
35864
+ }],
35707
35865
  "pipelineAnalytics.reconcileFromDisk": [{
35708
35866
  name: "deviceId",
35709
35867
  form: "single",
@@ -36069,6 +36227,11 @@ Object.freeze({
36069
36227
  form: "single",
36070
36228
  optional: false
36071
36229
  }],
36230
+ "recording.setDevicePlacement": [{
36231
+ name: "deviceId",
36232
+ form: "single",
36233
+ optional: false
36234
+ }],
36072
36235
  "recording.startStorageMigrationMove": [{
36073
36236
  name: "deviceId",
36074
36237
  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.51",
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",