@camstack/addon-export-hap 1.2.60 → 1.2.62

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.
@@ -8762,6 +8762,13 @@ var MediaRelocateModeSchema = _enum([
8762
8762
  ]);
8763
8763
  var RelocateMediaInputSchema = object({
8764
8764
  toLocationId: string(),
8765
+ /**
8766
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8767
+ * every row that is not already on `toLocationId` (the historical
8768
+ * behaviour). A named source is what a from→to migration needs: without it
8769
+ * "move events off disk 2" also emptied disk 1.
8770
+ */
8771
+ fromLocationId: string().optional(),
8765
8772
  throttleMbps: number().min(1).max(1e3).optional(),
8766
8773
  /** Omitted = `move`, the pre-existing behaviour. */
8767
8774
  mode: MediaRelocateModeSchema.optional()
@@ -8829,6 +8836,19 @@ var StorageMigrationDestinationsSchema = object({
8829
8836
  galleryMedia: string().min(1).optional()
8830
8837
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8831
8838
  /**
8839
+ * Optional named source per class. Omitted = the class's current default
8840
+ * (the historical behaviour). A named source that is NOT the default is a
8841
+ * drain of that disk: bytes move, the default stays, and the source is
8842
+ * disabled when the move finishes.
8843
+ */
8844
+ var StorageMigrationSourcesSchema = object({
8845
+ recordings: string().min(1).optional(),
8846
+ recordingsLow: string().min(1).optional(),
8847
+ eventMedia: string().min(1).optional(),
8848
+ backups: string().min(1).optional(),
8849
+ galleryMedia: string().min(1).optional()
8850
+ }).optional();
8851
+ /**
8832
8852
  * How a migration sequences the cutover against the byte move.
8833
8853
  *
8834
8854
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8850,6 +8870,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8850
8870
  /** Shared input for planning and starting an orchestrated storage migration. */
8851
8871
  var StorageMigrationInputSchema = object({
8852
8872
  destinations: StorageMigrationDestinationsSchema,
8873
+ /** Omitted = each class's current default. */
8874
+ sources: StorageMigrationSourcesSchema,
8853
8875
  throttleMbps: number().min(1).max(1e3).optional(),
8854
8876
  /** Omitted = `blocking`, which stays the default. */
8855
8877
  mode: StorageMigrationModeSchema.optional()
@@ -8929,6 +8951,13 @@ var StorageMigrationMoveSchema = object({
8929
8951
  storageClass: StorageMigrationClassSchema,
8930
8952
  fromLocationId: string(),
8931
8953
  toLocationId: string(),
8954
+ /**
8955
+ * True when `from` was NOT the class default at plan time. The move still
8956
+ * copies bytes, but the default is left alone and the source is disabled
8957
+ * once the copy verifies. Absent on jobs planned before this field existed
8958
+ * — those jobs always repointed, which is `false`.
8959
+ */
8960
+ freezeSource: boolean().optional(),
8932
8961
  moverJobId: string().nullable(),
8933
8962
  state: RelocateJobStateSchema.nullable(),
8934
8963
  error: string().nullable(),
@@ -8942,6 +8971,7 @@ var StorageMigrationJobSchema = object({
8942
8971
  * can tell a seconds-long cutover from a thirty-hour one. */
8943
8972
  mode: StorageMigrationModeSchema,
8944
8973
  destinations: StorageMigrationDestinationsSchema,
8974
+ sources: StorageMigrationSourcesSchema,
8945
8975
  throttleMbps: number(),
8946
8976
  moves: array(StorageMigrationMoveSchema),
8947
8977
  pauseLeaseId: string().nullable(),
@@ -8967,6 +8997,7 @@ var StorageMigrationFindingSchema = object({
8967
8997
  });
8968
8998
  var StorageMigrationPlanSchema = object({
8969
8999
  destinations: StorageMigrationDestinationsSchema,
9000
+ sources: StorageMigrationSourcesSchema,
8970
9001
  /** The mode this plan was built for. A plan is only valid for its mode: the
8971
9002
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8972
9003
  * it. */
@@ -8974,7 +9005,8 @@ var StorageMigrationPlanSchema = object({
8974
9005
  moves: array(object({
8975
9006
  storageClass: StorageMigrationClassSchema,
8976
9007
  fromLocationId: string(),
8977
- toLocationId: string()
9008
+ toLocationId: string(),
9009
+ freezeSource: boolean().optional()
8978
9010
  })),
8979
9011
  findings: array(StorageMigrationFindingSchema)
8980
9012
  });
@@ -9152,10 +9184,51 @@ var LedgerWalkReportSchema = object({
9152
9184
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
9153
9185
  var RelocatableMediaCountInputSchema = object({
9154
9186
  toLocationId: string().min(1),
9187
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
9188
+ fromLocationId: string().optional(),
9155
9189
  /** Omitted = `move`. */
9156
9190
  mode: MediaRelocateModeSchema.optional()
9157
9191
  });
9158
9192
  /**
9193
+ * Operator cleanup of leftover analytics rows, optional debug media, and
9194
+ * ghost ledger entries on frozen footage locations.
9195
+ *
9196
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
9197
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
9198
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
9199
+ * with no operator-visible status.
9200
+ */
9201
+ var StorageCleanupPhaseSchema = _enum([
9202
+ "orphans",
9203
+ "debug-media",
9204
+ "ghost-ledger",
9205
+ "done",
9206
+ "failed",
9207
+ "cancelled"
9208
+ ]);
9209
+ var StorageCleanupInputSchema = object({
9210
+ /** Also walk motion stills / track filmstrips. Off by default. */
9211
+ includeDebugMedia: boolean().optional() });
9212
+ var StorageCleanupJobSchema = object({
9213
+ jobId: string(),
9214
+ phase: StorageCleanupPhaseSchema,
9215
+ includeDebugMedia: boolean(),
9216
+ orphansReclaimed: number().int().nonnegative(),
9217
+ orphanBytesReclaimed: number().int().nonnegative(),
9218
+ debugMediaReclaimed: number().int().nonnegative(),
9219
+ debugMediaBytesReclaimed: number().int().nonnegative(),
9220
+ ghostsForgotten: number().int().nonnegative(),
9221
+ ghostBytesForgotten: number().int().nonnegative(),
9222
+ /** Short operator-facing line: current collection, pass, or location. */
9223
+ detail: string().nullable(),
9224
+ cancelRequested: boolean(),
9225
+ startedAt: number(),
9226
+ updatedAt: number(),
9227
+ finishedAt: number().nullable(),
9228
+ error: string().nullable()
9229
+ });
9230
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
9231
+ /**
9159
9232
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
9160
9233
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
9161
9234
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -9183,11 +9256,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
9183
9256
  * The default location for a type uses `id === <type>:default` by
9184
9257
  * convention (the bare type ref like `'backups'` resolves to it).
9185
9258
  *
9186
- * `isSystem: true` marks a location as orchestrator-seeded and
9187
- * undeletable. The bootstrap-installed defaults (one per type) carry
9188
- * this flag; operator-added locations don't. Editing the config of
9189
- * a system location is allowed (path migration, provider swap) but
9190
- * deleting it is rejected at the cap level.
9259
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
9260
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
9261
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
9262
+ * / last-enabled, not on this bit.
9191
9263
  */
9192
9264
  var StorageLocationSchema = object({
9193
9265
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13584,6 +13656,12 @@ method(object({
13584
13656
  }), _void(), {
13585
13657
  kind: "mutation",
13586
13658
  auth: "admin"
13659
+ }), method(object({
13660
+ from: string(),
13661
+ to: string()
13662
+ }), object({ moved: number() }), {
13663
+ kind: "mutation",
13664
+ auth: "admin"
13587
13665
  }), method(object({
13588
13666
  deviceId: number(),
13589
13667
  disabled: boolean()
@@ -16296,6 +16374,8 @@ var NcSystemEventKindSchema = _enum([
16296
16374
  "device-offline",
16297
16375
  "device-disabled",
16298
16376
  "device-enabled",
16377
+ "device-battery-low",
16378
+ "device-battery-normal",
16299
16379
  "stream-online",
16300
16380
  "stream-offline",
16301
16381
  "node-online",
@@ -19514,46 +19594,6 @@ var RecentTracksPageSchema = object({
19514
19594
  /** Cursor for the next page, or null when this page is the last. */
19515
19595
  nextCursor: string().nullable()
19516
19596
  });
19517
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19518
- var LIST_GROUPS_MAX_LIMIT = 100;
19519
- var AnalyticsGroupRecordSchema = object({
19520
- id: string(),
19521
- deviceId: number().int(),
19522
- openedAt: number().int(),
19523
- closedAt: number().int(),
19524
- timestamp: number().int(),
19525
- memberCount: number().int(),
19526
- memberTrackIds: array(string()).readonly(),
19527
- className: string(),
19528
- classes: array(string()).readonly(),
19529
- /** Relative event-media path, or null when the group has no picture yet. */
19530
- mediaUrl: string().nullable(),
19531
- singleton: boolean()
19532
- });
19533
- var AnalyticsGroupMemberSchema = object({
19534
- trackId: string(),
19535
- deviceId: number().int(),
19536
- className: string(),
19537
- firstSeen: number().int(),
19538
- lastSeen: number().int(),
19539
- mediaUrl: string().nullable()
19540
- });
19541
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19542
- var ListGroupsQueryInput = object({
19543
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19544
- deviceIds: array(number()),
19545
- /** Window lower bound on `closedAt` (inclusive). */
19546
- since: number().optional(),
19547
- /** Window upper bound on `openedAt` (inclusive). */
19548
- until: number().optional(),
19549
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19550
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19551
- cursor: string().optional()
19552
- });
19553
- var ListGroupsPageSchema = object({
19554
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19555
- nextCursor: string().nullable()
19556
- });
19557
19597
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19558
19598
  var KEY_EVENTS_MAX_LIMIT = 200;
19559
19599
  var KeyEventQueryInput = object({
@@ -19657,9 +19697,7 @@ var TrackCascadeCountsSchema = object({
19657
19697
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19658
19698
  plates: number().int(),
19659
19699
  /** Per-track CLIP search vectors removed (best-effort). */
19660
- embeddings: number().int(),
19661
- /** Group membership + group rows removed with their last member (best-effort). */
19662
- groups: number().int()
19700
+ embeddings: number().int()
19663
19701
  });
19664
19702
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19665
19703
  var DiskReconcileCountsSchema = object({
@@ -19829,6 +19867,47 @@ var RebuildStatusSchema = object({
19829
19867
  /** Present when the pass ended by throwing. */
19830
19868
  error: string().nullable()
19831
19869
  });
19870
+ /**
19871
+ * Acknowledgement that a debug-media reclaim STARTED.
19872
+ *
19873
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19874
+ * it runs detached and this returns immediately. Awaiting it is how the
19875
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19876
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19877
+ */
19878
+ var MediaReclaimStartResultSchema = object({
19879
+ started: boolean(),
19880
+ /** True when a pass was already running; the new request is ignored. */
19881
+ alreadyRunning: boolean()
19882
+ });
19883
+ var MediaReclaimInputSchema = object({
19884
+ mode: _enum(["report", "reclaim"]).default("report"),
19885
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19886
+ deviceIds: array(number().int()).min(1).optional(),
19887
+ restart: boolean().optional(),
19888
+ pageSize: number().int().min(50).max(5e3).optional(),
19889
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19890
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19891
+ maxBytesPerRun: number().int().min(1).optional(),
19892
+ budgetMinutes: number().int().min(1).max(720).optional(),
19893
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19894
+ graceMinutes: number().int().min(1).max(10080).optional()
19895
+ });
19896
+ var MediaReclaimStatusSchema = object({
19897
+ running: boolean(),
19898
+ mode: _enum(["report", "reclaim"]).nullable(),
19899
+ totalExamined: number(),
19900
+ totalEligible: number(),
19901
+ totalReclaimed: number(),
19902
+ totalBytesReclaimed: number(),
19903
+ totalRefused: number(),
19904
+ /** Device+scope windows finished in this pass. */
19905
+ devicesDone: number(),
19906
+ complete: boolean().nullable(),
19907
+ startedAtMs: number().nullable(),
19908
+ finishedAtMs: number().nullable(),
19909
+ error: string().nullable()
19910
+ });
19832
19911
  var ReplayFrameInputSchema = object({
19833
19912
  timestamp: number(),
19834
19913
  frame: PipelineRunResultBridge
@@ -19867,10 +19946,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19867
19946
  * stationary registry). Default false: the timeline lists passages,
19868
19947
  * not parking records (operator decision, 2026-08-15). */
19869
19948
  includeStationary: boolean().optional()
19870
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19871
- deviceId: number(),
19872
- groupId: string().min(1)
19873
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19949
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19874
19950
  kind: "mutation",
19875
19951
  auth: "admin"
19876
19952
  }), 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({
@@ -19970,6 +20046,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19970
20046
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19971
20047
  kind: "query",
19972
20048
  auth: "admin"
20049
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
20050
+ kind: "mutation",
20051
+ auth: "admin"
20052
+ }), method(object({}), MediaReclaimStatusSchema, {
20053
+ kind: "query",
20054
+ auth: "admin"
19973
20055
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19974
20056
  kind: "query",
19975
20057
  auth: "admin"
@@ -21940,7 +22022,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21940
22022
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21941
22023
  kind: "mutation",
21942
22024
  auth: "admin"
21943
- });
22025
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
22026
+ kind: "mutation",
22027
+ auth: "admin"
22028
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
22029
+ kind: "mutation",
22030
+ auth: "admin"
22031
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21944
22032
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21945
22033
  providerId: string().min(1),
21946
22034
  displayName: string().min(1),
@@ -27366,6 +27454,33 @@ var RecordingRebalanceInputSchema = object({
27366
27454
  minMoveGb: number().min(0).optional()
27367
27455
  });
27368
27456
  /**
27457
+ * Operator-facing placement of one camera onto a recordings location.
27458
+ *
27459
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
27460
+ * Auto (the planner may move this camera). `locationId` is where high/mid
27461
+ * currently write — the plan, which may disagree with the pin when Auto.
27462
+ */
27463
+ var RecordingDevicePlacementSchema = object({
27464
+ deviceId: number().int(),
27465
+ profile: string(),
27466
+ locationId: string()
27467
+ });
27468
+ var RecordingDevicePinSchema = object({
27469
+ deviceId: number().int(),
27470
+ /** Recordings-class location this camera is pinned to. */
27471
+ locationId: string()
27472
+ });
27473
+ var RecordingPlacementViewSchema = object({
27474
+ assignments: array(RecordingDevicePlacementSchema),
27475
+ pins: array(RecordingDevicePinSchema),
27476
+ defaultLocations: record(string(), string())
27477
+ });
27478
+ var RecordingSetDevicePlacementInputSchema = object({
27479
+ deviceId: number().int(),
27480
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
27481
+ locationId: string().nullable()
27482
+ });
27483
+ /**
27369
27484
  * Result of locating footage at a wall-clock instant for one device/profile.
27370
27485
  * `segment` carries the covering segment's window; `gap` reports the forward
27371
27486
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -27591,6 +27706,12 @@ method(object({
27591
27706
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
27592
27707
  kind: "mutation",
27593
27708
  auth: "admin"
27709
+ }), method(object({}), RecordingPlacementViewSchema, {
27710
+ kind: "query",
27711
+ auth: "admin"
27712
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
27713
+ kind: "mutation",
27714
+ auth: "admin"
27594
27715
  });
27595
27716
  /**
27596
27717
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30986,6 +31107,12 @@ Object.freeze({
30986
31107
  addonId: null,
30987
31108
  access: "delete"
30988
31109
  },
31110
+ "deviceManager.renameLocation": {
31111
+ capName: "device-manager",
31112
+ capScope: "system",
31113
+ addonId: null,
31114
+ access: "create"
31115
+ },
30989
31116
  "deviceManager.runDeviceAction": {
30990
31117
  capName: "device-manager",
30991
31118
  capScope: "system",
@@ -32678,19 +32805,19 @@ Object.freeze({
32678
32805
  addonId: null,
32679
32806
  access: "view"
32680
32807
  },
32681
- "pipelineAnalytics.getGroup": {
32808
+ "pipelineAnalytics.getKeyEvents": {
32682
32809
  capName: "pipeline-analytics",
32683
32810
  capScope: "device",
32684
32811
  addonId: null,
32685
32812
  access: "view"
32686
32813
  },
32687
- "pipelineAnalytics.getKeyEvents": {
32814
+ "pipelineAnalytics.getKeyEventsBatch": {
32688
32815
  capName: "pipeline-analytics",
32689
32816
  capScope: "device",
32690
32817
  addonId: null,
32691
32818
  access: "view"
32692
32819
  },
32693
- "pipelineAnalytics.getKeyEventsBatch": {
32820
+ "pipelineAnalytics.getMediaReclaimStatus": {
32694
32821
  capName: "pipeline-analytics",
32695
32822
  capScope: "device",
32696
32823
  addonId: null,
@@ -32780,12 +32907,6 @@ Object.freeze({
32780
32907
  addonId: null,
32781
32908
  access: "view"
32782
32909
  },
32783
- "pipelineAnalytics.listGroups": {
32784
- capName: "pipeline-analytics",
32785
- capScope: "device",
32786
- addonId: null,
32787
- access: "view"
32788
- },
32789
32910
  "pipelineAnalytics.listOpsLog": {
32790
32911
  capName: "pipeline-analytics",
32791
32912
  capScope: "device",
@@ -32870,6 +32991,12 @@ Object.freeze({
32870
32991
  addonId: null,
32871
32992
  access: "create"
32872
32993
  },
32994
+ "pipelineAnalytics.reclaimDebugMedia": {
32995
+ capName: "pipeline-analytics",
32996
+ capScope: "device",
32997
+ addonId: null,
32998
+ access: "create"
32999
+ },
32873
33000
  "pipelineAnalytics.reconcileFromDisk": {
32874
33001
  capName: "pipeline-analytics",
32875
33002
  capScope: "device",
@@ -33794,6 +33921,12 @@ Object.freeze({
33794
33921
  addonId: null,
33795
33922
  access: "view"
33796
33923
  },
33924
+ "recording.getPlacement": {
33925
+ capName: "recording",
33926
+ capScope: "system",
33927
+ addonId: null,
33928
+ access: "view"
33929
+ },
33797
33930
  "recording.getPlaybackManifest": {
33798
33931
  capName: "recording",
33799
33932
  capScope: "system",
@@ -33920,6 +34053,12 @@ Object.freeze({
33920
34053
  addonId: null,
33921
34054
  access: "create"
33922
34055
  },
34056
+ "recording.setDevicePlacement": {
34057
+ capName: "recording",
34058
+ capScope: "system",
34059
+ addonId: null,
34060
+ access: "create"
34061
+ },
33923
34062
  "recording.startStorageMigrationMove": {
33924
34063
  capName: "recording",
33925
34064
  capScope: "system",
@@ -34364,12 +34503,36 @@ Object.freeze({
34364
34503
  addonId: null,
34365
34504
  access: "create"
34366
34505
  },
34506
+ "storageMigration.cleanupCancel": {
34507
+ capName: "storage-migration",
34508
+ capScope: "system",
34509
+ addonId: null,
34510
+ access: "create"
34511
+ },
34512
+ "storageMigration.cleanupStart": {
34513
+ capName: "storage-migration",
34514
+ capScope: "system",
34515
+ addonId: null,
34516
+ access: "create"
34517
+ },
34518
+ "storageMigration.cleanupStatus": {
34519
+ capName: "storage-migration",
34520
+ capScope: "system",
34521
+ addonId: null,
34522
+ access: "view"
34523
+ },
34367
34524
  "storageMigration.drain": {
34368
34525
  capName: "storage-migration",
34369
34526
  capScope: "system",
34370
34527
  addonId: null,
34371
34528
  access: "create"
34372
34529
  },
34530
+ "storageMigration.history": {
34531
+ capName: "storage-migration",
34532
+ capScope: "system",
34533
+ addonId: null,
34534
+ access: "view"
34535
+ },
34373
34536
  "storageMigration.movers": {
34374
34537
  capName: "storage-migration",
34375
34538
  capScope: "system",
@@ -36366,11 +36529,6 @@ Object.freeze({
36366
36529
  form: "single",
36367
36530
  optional: true
36368
36531
  }],
36369
- "pipelineAnalytics.getGroup": [{
36370
- name: "deviceId",
36371
- form: "single",
36372
- optional: false
36373
- }],
36374
36532
  "pipelineAnalytics.getKeyEvents": [{
36375
36533
  name: "deviceId",
36376
36534
  form: "single",
@@ -36436,11 +36594,6 @@ Object.freeze({
36436
36594
  form: "single",
36437
36595
  optional: false
36438
36596
  }],
36439
- "pipelineAnalytics.listGroups": [{
36440
- name: "deviceIds",
36441
- form: "array",
36442
- optional: false
36443
- }],
36444
36597
  "pipelineAnalytics.listOpsLog": [{
36445
36598
  name: "deviceId",
36446
36599
  form: "single",
@@ -36486,6 +36639,11 @@ Object.freeze({
36486
36639
  form: "single",
36487
36640
  optional: true
36488
36641
  }],
36642
+ "pipelineAnalytics.reclaimDebugMedia": [{
36643
+ name: "deviceIds",
36644
+ form: "array",
36645
+ optional: true
36646
+ }],
36489
36647
  "pipelineAnalytics.reconcileFromDisk": [{
36490
36648
  name: "deviceId",
36491
36649
  form: "single",
@@ -36851,6 +37009,11 @@ Object.freeze({
36851
37009
  form: "single",
36852
37010
  optional: false
36853
37011
  }],
37012
+ "recording.setDevicePlacement": [{
37013
+ name: "deviceId",
37014
+ form: "single",
37015
+ optional: false
37016
+ }],
36854
37017
  "recording.startStorageMigrationMove": [{
36855
37018
  name: "deviceId",
36856
37019
  form: "single",
@@ -8750,6 +8750,13 @@ var MediaRelocateModeSchema = _enum([
8750
8750
  ]);
8751
8751
  var RelocateMediaInputSchema = object({
8752
8752
  toLocationId: string(),
8753
+ /**
8754
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8755
+ * every row that is not already on `toLocationId` (the historical
8756
+ * behaviour). A named source is what a from→to migration needs: without it
8757
+ * "move events off disk 2" also emptied disk 1.
8758
+ */
8759
+ fromLocationId: string().optional(),
8753
8760
  throttleMbps: number().min(1).max(1e3).optional(),
8754
8761
  /** Omitted = `move`, the pre-existing behaviour. */
8755
8762
  mode: MediaRelocateModeSchema.optional()
@@ -8817,6 +8824,19 @@ var StorageMigrationDestinationsSchema = object({
8817
8824
  galleryMedia: string().min(1).optional()
8818
8825
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8819
8826
  /**
8827
+ * Optional named source per class. Omitted = the class's current default
8828
+ * (the historical behaviour). A named source that is NOT the default is a
8829
+ * drain of that disk: bytes move, the default stays, and the source is
8830
+ * disabled when the move finishes.
8831
+ */
8832
+ var StorageMigrationSourcesSchema = object({
8833
+ recordings: string().min(1).optional(),
8834
+ recordingsLow: string().min(1).optional(),
8835
+ eventMedia: string().min(1).optional(),
8836
+ backups: string().min(1).optional(),
8837
+ galleryMedia: string().min(1).optional()
8838
+ }).optional();
8839
+ /**
8820
8840
  * How a migration sequences the cutover against the byte move.
8821
8841
  *
8822
8842
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8838,6 +8858,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8838
8858
  /** Shared input for planning and starting an orchestrated storage migration. */
8839
8859
  var StorageMigrationInputSchema = object({
8840
8860
  destinations: StorageMigrationDestinationsSchema,
8861
+ /** Omitted = each class's current default. */
8862
+ sources: StorageMigrationSourcesSchema,
8841
8863
  throttleMbps: number().min(1).max(1e3).optional(),
8842
8864
  /** Omitted = `blocking`, which stays the default. */
8843
8865
  mode: StorageMigrationModeSchema.optional()
@@ -8917,6 +8939,13 @@ var StorageMigrationMoveSchema = object({
8917
8939
  storageClass: StorageMigrationClassSchema,
8918
8940
  fromLocationId: string(),
8919
8941
  toLocationId: string(),
8942
+ /**
8943
+ * True when `from` was NOT the class default at plan time. The move still
8944
+ * copies bytes, but the default is left alone and the source is disabled
8945
+ * once the copy verifies. Absent on jobs planned before this field existed
8946
+ * — those jobs always repointed, which is `false`.
8947
+ */
8948
+ freezeSource: boolean().optional(),
8920
8949
  moverJobId: string().nullable(),
8921
8950
  state: RelocateJobStateSchema.nullable(),
8922
8951
  error: string().nullable(),
@@ -8930,6 +8959,7 @@ var StorageMigrationJobSchema = object({
8930
8959
  * can tell a seconds-long cutover from a thirty-hour one. */
8931
8960
  mode: StorageMigrationModeSchema,
8932
8961
  destinations: StorageMigrationDestinationsSchema,
8962
+ sources: StorageMigrationSourcesSchema,
8933
8963
  throttleMbps: number(),
8934
8964
  moves: array(StorageMigrationMoveSchema),
8935
8965
  pauseLeaseId: string().nullable(),
@@ -8955,6 +8985,7 @@ var StorageMigrationFindingSchema = object({
8955
8985
  });
8956
8986
  var StorageMigrationPlanSchema = object({
8957
8987
  destinations: StorageMigrationDestinationsSchema,
8988
+ sources: StorageMigrationSourcesSchema,
8958
8989
  /** The mode this plan was built for. A plan is only valid for its mode: the
8959
8990
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8960
8991
  * it. */
@@ -8962,7 +8993,8 @@ var StorageMigrationPlanSchema = object({
8962
8993
  moves: array(object({
8963
8994
  storageClass: StorageMigrationClassSchema,
8964
8995
  fromLocationId: string(),
8965
- toLocationId: string()
8996
+ toLocationId: string(),
8997
+ freezeSource: boolean().optional()
8966
8998
  })),
8967
8999
  findings: array(StorageMigrationFindingSchema)
8968
9000
  });
@@ -9140,10 +9172,51 @@ var LedgerWalkReportSchema = object({
9140
9172
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
9141
9173
  var RelocatableMediaCountInputSchema = object({
9142
9174
  toLocationId: string().min(1),
9175
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
9176
+ fromLocationId: string().optional(),
9143
9177
  /** Omitted = `move`. */
9144
9178
  mode: MediaRelocateModeSchema.optional()
9145
9179
  });
9146
9180
  /**
9181
+ * Operator cleanup of leftover analytics rows, optional debug media, and
9182
+ * ghost ledger entries on frozen footage locations.
9183
+ *
9184
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
9185
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
9186
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
9187
+ * with no operator-visible status.
9188
+ */
9189
+ var StorageCleanupPhaseSchema = _enum([
9190
+ "orphans",
9191
+ "debug-media",
9192
+ "ghost-ledger",
9193
+ "done",
9194
+ "failed",
9195
+ "cancelled"
9196
+ ]);
9197
+ var StorageCleanupInputSchema = object({
9198
+ /** Also walk motion stills / track filmstrips. Off by default. */
9199
+ includeDebugMedia: boolean().optional() });
9200
+ var StorageCleanupJobSchema = object({
9201
+ jobId: string(),
9202
+ phase: StorageCleanupPhaseSchema,
9203
+ includeDebugMedia: boolean(),
9204
+ orphansReclaimed: number().int().nonnegative(),
9205
+ orphanBytesReclaimed: number().int().nonnegative(),
9206
+ debugMediaReclaimed: number().int().nonnegative(),
9207
+ debugMediaBytesReclaimed: number().int().nonnegative(),
9208
+ ghostsForgotten: number().int().nonnegative(),
9209
+ ghostBytesForgotten: number().int().nonnegative(),
9210
+ /** Short operator-facing line: current collection, pass, or location. */
9211
+ detail: string().nullable(),
9212
+ cancelRequested: boolean(),
9213
+ startedAt: number(),
9214
+ updatedAt: number(),
9215
+ finishedAt: number().nullable(),
9216
+ error: string().nullable()
9217
+ });
9218
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
9219
+ /**
9147
9220
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
9148
9221
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
9149
9222
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -9171,11 +9244,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
9171
9244
  * The default location for a type uses `id === <type>:default` by
9172
9245
  * convention (the bare type ref like `'backups'` resolves to it).
9173
9246
  *
9174
- * `isSystem: true` marks a location as orchestrator-seeded and
9175
- * undeletable. The bootstrap-installed defaults (one per type) carry
9176
- * this flag; operator-added locations don't. Editing the config of
9177
- * a system location is allowed (path migration, provider swap) but
9178
- * deleting it is rejected at the cap level.
9247
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
9248
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
9249
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
9250
+ * / last-enabled, not on this bit.
9179
9251
  */
9180
9252
  var StorageLocationSchema = object({
9181
9253
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13572,6 +13644,12 @@ method(object({
13572
13644
  }), _void(), {
13573
13645
  kind: "mutation",
13574
13646
  auth: "admin"
13647
+ }), method(object({
13648
+ from: string(),
13649
+ to: string()
13650
+ }), object({ moved: number() }), {
13651
+ kind: "mutation",
13652
+ auth: "admin"
13575
13653
  }), method(object({
13576
13654
  deviceId: number(),
13577
13655
  disabled: boolean()
@@ -16284,6 +16362,8 @@ var NcSystemEventKindSchema = _enum([
16284
16362
  "device-offline",
16285
16363
  "device-disabled",
16286
16364
  "device-enabled",
16365
+ "device-battery-low",
16366
+ "device-battery-normal",
16287
16367
  "stream-online",
16288
16368
  "stream-offline",
16289
16369
  "node-online",
@@ -19502,46 +19582,6 @@ var RecentTracksPageSchema = object({
19502
19582
  /** Cursor for the next page, or null when this page is the last. */
19503
19583
  nextCursor: string().nullable()
19504
19584
  });
19505
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19506
- var LIST_GROUPS_MAX_LIMIT = 100;
19507
- var AnalyticsGroupRecordSchema = object({
19508
- id: string(),
19509
- deviceId: number().int(),
19510
- openedAt: number().int(),
19511
- closedAt: number().int(),
19512
- timestamp: number().int(),
19513
- memberCount: number().int(),
19514
- memberTrackIds: array(string()).readonly(),
19515
- className: string(),
19516
- classes: array(string()).readonly(),
19517
- /** Relative event-media path, or null when the group has no picture yet. */
19518
- mediaUrl: string().nullable(),
19519
- singleton: boolean()
19520
- });
19521
- var AnalyticsGroupMemberSchema = object({
19522
- trackId: string(),
19523
- deviceId: number().int(),
19524
- className: string(),
19525
- firstSeen: number().int(),
19526
- lastSeen: number().int(),
19527
- mediaUrl: string().nullable()
19528
- });
19529
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19530
- var ListGroupsQueryInput = object({
19531
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19532
- deviceIds: array(number()),
19533
- /** Window lower bound on `closedAt` (inclusive). */
19534
- since: number().optional(),
19535
- /** Window upper bound on `openedAt` (inclusive). */
19536
- until: number().optional(),
19537
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19538
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19539
- cursor: string().optional()
19540
- });
19541
- var ListGroupsPageSchema = object({
19542
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19543
- nextCursor: string().nullable()
19544
- });
19545
19585
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19546
19586
  var KEY_EVENTS_MAX_LIMIT = 200;
19547
19587
  var KeyEventQueryInput = object({
@@ -19645,9 +19685,7 @@ var TrackCascadeCountsSchema = object({
19645
19685
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19646
19686
  plates: number().int(),
19647
19687
  /** Per-track CLIP search vectors removed (best-effort). */
19648
- embeddings: number().int(),
19649
- /** Group membership + group rows removed with their last member (best-effort). */
19650
- groups: number().int()
19688
+ embeddings: number().int()
19651
19689
  });
19652
19690
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19653
19691
  var DiskReconcileCountsSchema = object({
@@ -19817,6 +19855,47 @@ var RebuildStatusSchema = object({
19817
19855
  /** Present when the pass ended by throwing. */
19818
19856
  error: string().nullable()
19819
19857
  });
19858
+ /**
19859
+ * Acknowledgement that a debug-media reclaim STARTED.
19860
+ *
19861
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19862
+ * it runs detached and this returns immediately. Awaiting it is how the
19863
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19864
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19865
+ */
19866
+ var MediaReclaimStartResultSchema = object({
19867
+ started: boolean(),
19868
+ /** True when a pass was already running; the new request is ignored. */
19869
+ alreadyRunning: boolean()
19870
+ });
19871
+ var MediaReclaimInputSchema = object({
19872
+ mode: _enum(["report", "reclaim"]).default("report"),
19873
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19874
+ deviceIds: array(number().int()).min(1).optional(),
19875
+ restart: boolean().optional(),
19876
+ pageSize: number().int().min(50).max(5e3).optional(),
19877
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19878
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19879
+ maxBytesPerRun: number().int().min(1).optional(),
19880
+ budgetMinutes: number().int().min(1).max(720).optional(),
19881
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19882
+ graceMinutes: number().int().min(1).max(10080).optional()
19883
+ });
19884
+ var MediaReclaimStatusSchema = object({
19885
+ running: boolean(),
19886
+ mode: _enum(["report", "reclaim"]).nullable(),
19887
+ totalExamined: number(),
19888
+ totalEligible: number(),
19889
+ totalReclaimed: number(),
19890
+ totalBytesReclaimed: number(),
19891
+ totalRefused: number(),
19892
+ /** Device+scope windows finished in this pass. */
19893
+ devicesDone: number(),
19894
+ complete: boolean().nullable(),
19895
+ startedAtMs: number().nullable(),
19896
+ finishedAtMs: number().nullable(),
19897
+ error: string().nullable()
19898
+ });
19820
19899
  var ReplayFrameInputSchema = object({
19821
19900
  timestamp: number(),
19822
19901
  frame: PipelineRunResultBridge
@@ -19855,10 +19934,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19855
19934
  * stationary registry). Default false: the timeline lists passages,
19856
19935
  * not parking records (operator decision, 2026-08-15). */
19857
19936
  includeStationary: boolean().optional()
19858
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19859
- deviceId: number(),
19860
- groupId: string().min(1)
19861
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19937
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19862
19938
  kind: "mutation",
19863
19939
  auth: "admin"
19864
19940
  }), 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({
@@ -19958,6 +20034,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19958
20034
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19959
20035
  kind: "query",
19960
20036
  auth: "admin"
20037
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
20038
+ kind: "mutation",
20039
+ auth: "admin"
20040
+ }), method(object({}), MediaReclaimStatusSchema, {
20041
+ kind: "query",
20042
+ auth: "admin"
19961
20043
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19962
20044
  kind: "query",
19963
20045
  auth: "admin"
@@ -21928,7 +22010,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21928
22010
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21929
22011
  kind: "mutation",
21930
22012
  auth: "admin"
21931
- });
22013
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
22014
+ kind: "mutation",
22015
+ auth: "admin"
22016
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
22017
+ kind: "mutation",
22018
+ auth: "admin"
22019
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21932
22020
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21933
22021
  providerId: string().min(1),
21934
22022
  displayName: string().min(1),
@@ -27354,6 +27442,33 @@ var RecordingRebalanceInputSchema = object({
27354
27442
  minMoveGb: number().min(0).optional()
27355
27443
  });
27356
27444
  /**
27445
+ * Operator-facing placement of one camera onto a recordings location.
27446
+ *
27447
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
27448
+ * Auto (the planner may move this camera). `locationId` is where high/mid
27449
+ * currently write — the plan, which may disagree with the pin when Auto.
27450
+ */
27451
+ var RecordingDevicePlacementSchema = object({
27452
+ deviceId: number().int(),
27453
+ profile: string(),
27454
+ locationId: string()
27455
+ });
27456
+ var RecordingDevicePinSchema = object({
27457
+ deviceId: number().int(),
27458
+ /** Recordings-class location this camera is pinned to. */
27459
+ locationId: string()
27460
+ });
27461
+ var RecordingPlacementViewSchema = object({
27462
+ assignments: array(RecordingDevicePlacementSchema),
27463
+ pins: array(RecordingDevicePinSchema),
27464
+ defaultLocations: record(string(), string())
27465
+ });
27466
+ var RecordingSetDevicePlacementInputSchema = object({
27467
+ deviceId: number().int(),
27468
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
27469
+ locationId: string().nullable()
27470
+ });
27471
+ /**
27357
27472
  * Result of locating footage at a wall-clock instant for one device/profile.
27358
27473
  * `segment` carries the covering segment's window; `gap` reports the forward
27359
27474
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -27579,6 +27694,12 @@ method(object({
27579
27694
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
27580
27695
  kind: "mutation",
27581
27696
  auth: "admin"
27697
+ }), method(object({}), RecordingPlacementViewSchema, {
27698
+ kind: "query",
27699
+ auth: "admin"
27700
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
27701
+ kind: "mutation",
27702
+ auth: "admin"
27582
27703
  });
27583
27704
  /**
27584
27705
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30974,6 +31095,12 @@ Object.freeze({
30974
31095
  addonId: null,
30975
31096
  access: "delete"
30976
31097
  },
31098
+ "deviceManager.renameLocation": {
31099
+ capName: "device-manager",
31100
+ capScope: "system",
31101
+ addonId: null,
31102
+ access: "create"
31103
+ },
30977
31104
  "deviceManager.runDeviceAction": {
30978
31105
  capName: "device-manager",
30979
31106
  capScope: "system",
@@ -32666,19 +32793,19 @@ Object.freeze({
32666
32793
  addonId: null,
32667
32794
  access: "view"
32668
32795
  },
32669
- "pipelineAnalytics.getGroup": {
32796
+ "pipelineAnalytics.getKeyEvents": {
32670
32797
  capName: "pipeline-analytics",
32671
32798
  capScope: "device",
32672
32799
  addonId: null,
32673
32800
  access: "view"
32674
32801
  },
32675
- "pipelineAnalytics.getKeyEvents": {
32802
+ "pipelineAnalytics.getKeyEventsBatch": {
32676
32803
  capName: "pipeline-analytics",
32677
32804
  capScope: "device",
32678
32805
  addonId: null,
32679
32806
  access: "view"
32680
32807
  },
32681
- "pipelineAnalytics.getKeyEventsBatch": {
32808
+ "pipelineAnalytics.getMediaReclaimStatus": {
32682
32809
  capName: "pipeline-analytics",
32683
32810
  capScope: "device",
32684
32811
  addonId: null,
@@ -32768,12 +32895,6 @@ Object.freeze({
32768
32895
  addonId: null,
32769
32896
  access: "view"
32770
32897
  },
32771
- "pipelineAnalytics.listGroups": {
32772
- capName: "pipeline-analytics",
32773
- capScope: "device",
32774
- addonId: null,
32775
- access: "view"
32776
- },
32777
32898
  "pipelineAnalytics.listOpsLog": {
32778
32899
  capName: "pipeline-analytics",
32779
32900
  capScope: "device",
@@ -32858,6 +32979,12 @@ Object.freeze({
32858
32979
  addonId: null,
32859
32980
  access: "create"
32860
32981
  },
32982
+ "pipelineAnalytics.reclaimDebugMedia": {
32983
+ capName: "pipeline-analytics",
32984
+ capScope: "device",
32985
+ addonId: null,
32986
+ access: "create"
32987
+ },
32861
32988
  "pipelineAnalytics.reconcileFromDisk": {
32862
32989
  capName: "pipeline-analytics",
32863
32990
  capScope: "device",
@@ -33782,6 +33909,12 @@ Object.freeze({
33782
33909
  addonId: null,
33783
33910
  access: "view"
33784
33911
  },
33912
+ "recording.getPlacement": {
33913
+ capName: "recording",
33914
+ capScope: "system",
33915
+ addonId: null,
33916
+ access: "view"
33917
+ },
33785
33918
  "recording.getPlaybackManifest": {
33786
33919
  capName: "recording",
33787
33920
  capScope: "system",
@@ -33908,6 +34041,12 @@ Object.freeze({
33908
34041
  addonId: null,
33909
34042
  access: "create"
33910
34043
  },
34044
+ "recording.setDevicePlacement": {
34045
+ capName: "recording",
34046
+ capScope: "system",
34047
+ addonId: null,
34048
+ access: "create"
34049
+ },
33911
34050
  "recording.startStorageMigrationMove": {
33912
34051
  capName: "recording",
33913
34052
  capScope: "system",
@@ -34352,12 +34491,36 @@ Object.freeze({
34352
34491
  addonId: null,
34353
34492
  access: "create"
34354
34493
  },
34494
+ "storageMigration.cleanupCancel": {
34495
+ capName: "storage-migration",
34496
+ capScope: "system",
34497
+ addonId: null,
34498
+ access: "create"
34499
+ },
34500
+ "storageMigration.cleanupStart": {
34501
+ capName: "storage-migration",
34502
+ capScope: "system",
34503
+ addonId: null,
34504
+ access: "create"
34505
+ },
34506
+ "storageMigration.cleanupStatus": {
34507
+ capName: "storage-migration",
34508
+ capScope: "system",
34509
+ addonId: null,
34510
+ access: "view"
34511
+ },
34355
34512
  "storageMigration.drain": {
34356
34513
  capName: "storage-migration",
34357
34514
  capScope: "system",
34358
34515
  addonId: null,
34359
34516
  access: "create"
34360
34517
  },
34518
+ "storageMigration.history": {
34519
+ capName: "storage-migration",
34520
+ capScope: "system",
34521
+ addonId: null,
34522
+ access: "view"
34523
+ },
34361
34524
  "storageMigration.movers": {
34362
34525
  capName: "storage-migration",
34363
34526
  capScope: "system",
@@ -36354,11 +36517,6 @@ Object.freeze({
36354
36517
  form: "single",
36355
36518
  optional: true
36356
36519
  }],
36357
- "pipelineAnalytics.getGroup": [{
36358
- name: "deviceId",
36359
- form: "single",
36360
- optional: false
36361
- }],
36362
36520
  "pipelineAnalytics.getKeyEvents": [{
36363
36521
  name: "deviceId",
36364
36522
  form: "single",
@@ -36424,11 +36582,6 @@ Object.freeze({
36424
36582
  form: "single",
36425
36583
  optional: false
36426
36584
  }],
36427
- "pipelineAnalytics.listGroups": [{
36428
- name: "deviceIds",
36429
- form: "array",
36430
- optional: false
36431
- }],
36432
36585
  "pipelineAnalytics.listOpsLog": [{
36433
36586
  name: "deviceId",
36434
36587
  form: "single",
@@ -36474,6 +36627,11 @@ Object.freeze({
36474
36627
  form: "single",
36475
36628
  optional: true
36476
36629
  }],
36630
+ "pipelineAnalytics.reclaimDebugMedia": [{
36631
+ name: "deviceIds",
36632
+ form: "array",
36633
+ optional: true
36634
+ }],
36477
36635
  "pipelineAnalytics.reconcileFromDisk": [{
36478
36636
  name: "deviceId",
36479
36637
  form: "single",
@@ -36839,6 +36997,11 @@ Object.freeze({
36839
36997
  form: "single",
36840
36998
  optional: false
36841
36999
  }],
37000
+ "recording.setDevicePlacement": [{
37001
+ name: "deviceId",
37002
+ form: "single",
37003
+ optional: false
37004
+ }],
36842
37005
  "recording.startStorageMigrationMove": [{
36843
37006
  name: "deviceId",
36844
37007
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-hap",
3
- "version": "1.2.60",
3
+ "version": "1.2.62",
4
4
  "description": "HomeKit (HAP) exporter for CamStack devices. Publishes each exposed device as its own HomeKit accessory: cameras and doorbells with SRTP streaming, HomeKit Secure Video, motion, two-way audio, PTZ and battery; switches, lights, locks and sensors through a capability→service table.",
5
5
  "keywords": [
6
6
  "camstack",