@camstack/addon-provider-onvif 1.2.48 → 1.2.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/addon.js +236 -73
  2. package/dist/addon.mjs +236 -73
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -8095,6 +8095,13 @@ var MediaRelocateModeSchema = _enum([
8095
8095
  ]);
8096
8096
  var RelocateMediaInputSchema = object({
8097
8097
  toLocationId: string(),
8098
+ /**
8099
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8100
+ * every row that is not already on `toLocationId` (the historical
8101
+ * behaviour). A named source is what a from→to migration needs: without it
8102
+ * "move events off disk 2" also emptied disk 1.
8103
+ */
8104
+ fromLocationId: string().optional(),
8098
8105
  throttleMbps: number().min(1).max(1e3).optional(),
8099
8106
  /** Omitted = `move`, the pre-existing behaviour. */
8100
8107
  mode: MediaRelocateModeSchema.optional()
@@ -8162,6 +8169,19 @@ var StorageMigrationDestinationsSchema = object({
8162
8169
  galleryMedia: string().min(1).optional()
8163
8170
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8164
8171
  /**
8172
+ * Optional named source per class. Omitted = the class's current default
8173
+ * (the historical behaviour). A named source that is NOT the default is a
8174
+ * drain of that disk: bytes move, the default stays, and the source is
8175
+ * disabled when the move finishes.
8176
+ */
8177
+ var StorageMigrationSourcesSchema = object({
8178
+ recordings: string().min(1).optional(),
8179
+ recordingsLow: string().min(1).optional(),
8180
+ eventMedia: string().min(1).optional(),
8181
+ backups: string().min(1).optional(),
8182
+ galleryMedia: string().min(1).optional()
8183
+ }).optional();
8184
+ /**
8165
8185
  * How a migration sequences the cutover against the byte move.
8166
8186
  *
8167
8187
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8183,6 +8203,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8183
8203
  /** Shared input for planning and starting an orchestrated storage migration. */
8184
8204
  var StorageMigrationInputSchema = object({
8185
8205
  destinations: StorageMigrationDestinationsSchema,
8206
+ /** Omitted = each class's current default. */
8207
+ sources: StorageMigrationSourcesSchema,
8186
8208
  throttleMbps: number().min(1).max(1e3).optional(),
8187
8209
  /** Omitted = `blocking`, which stays the default. */
8188
8210
  mode: StorageMigrationModeSchema.optional()
@@ -8262,6 +8284,13 @@ var StorageMigrationMoveSchema = object({
8262
8284
  storageClass: StorageMigrationClassSchema,
8263
8285
  fromLocationId: string(),
8264
8286
  toLocationId: string(),
8287
+ /**
8288
+ * True when `from` was NOT the class default at plan time. The move still
8289
+ * copies bytes, but the default is left alone and the source is disabled
8290
+ * once the copy verifies. Absent on jobs planned before this field existed
8291
+ * — those jobs always repointed, which is `false`.
8292
+ */
8293
+ freezeSource: boolean().optional(),
8265
8294
  moverJobId: string().nullable(),
8266
8295
  state: RelocateJobStateSchema.nullable(),
8267
8296
  error: string().nullable(),
@@ -8275,6 +8304,7 @@ var StorageMigrationJobSchema = object({
8275
8304
  * can tell a seconds-long cutover from a thirty-hour one. */
8276
8305
  mode: StorageMigrationModeSchema,
8277
8306
  destinations: StorageMigrationDestinationsSchema,
8307
+ sources: StorageMigrationSourcesSchema,
8278
8308
  throttleMbps: number(),
8279
8309
  moves: array(StorageMigrationMoveSchema),
8280
8310
  pauseLeaseId: string().nullable(),
@@ -8300,6 +8330,7 @@ var StorageMigrationFindingSchema = object({
8300
8330
  });
8301
8331
  var StorageMigrationPlanSchema = object({
8302
8332
  destinations: StorageMigrationDestinationsSchema,
8333
+ sources: StorageMigrationSourcesSchema,
8303
8334
  /** The mode this plan was built for. A plan is only valid for its mode: the
8304
8335
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8305
8336
  * it. */
@@ -8307,7 +8338,8 @@ var StorageMigrationPlanSchema = object({
8307
8338
  moves: array(object({
8308
8339
  storageClass: StorageMigrationClassSchema,
8309
8340
  fromLocationId: string(),
8310
- toLocationId: string()
8341
+ toLocationId: string(),
8342
+ freezeSource: boolean().optional()
8311
8343
  })),
8312
8344
  findings: array(StorageMigrationFindingSchema)
8313
8345
  });
@@ -8485,10 +8517,51 @@ var LedgerWalkReportSchema = object({
8485
8517
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8486
8518
  var RelocatableMediaCountInputSchema = object({
8487
8519
  toLocationId: string().min(1),
8520
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8521
+ fromLocationId: string().optional(),
8488
8522
  /** Omitted = `move`. */
8489
8523
  mode: MediaRelocateModeSchema.optional()
8490
8524
  });
8491
8525
  /**
8526
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8527
+ * ghost ledger entries on frozen footage locations.
8528
+ *
8529
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8530
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8531
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8532
+ * with no operator-visible status.
8533
+ */
8534
+ var StorageCleanupPhaseSchema = _enum([
8535
+ "orphans",
8536
+ "debug-media",
8537
+ "ghost-ledger",
8538
+ "done",
8539
+ "failed",
8540
+ "cancelled"
8541
+ ]);
8542
+ var StorageCleanupInputSchema = object({
8543
+ /** Also walk motion stills / track filmstrips. Off by default. */
8544
+ includeDebugMedia: boolean().optional() });
8545
+ var StorageCleanupJobSchema = object({
8546
+ jobId: string(),
8547
+ phase: StorageCleanupPhaseSchema,
8548
+ includeDebugMedia: boolean(),
8549
+ orphansReclaimed: number().int().nonnegative(),
8550
+ orphanBytesReclaimed: number().int().nonnegative(),
8551
+ debugMediaReclaimed: number().int().nonnegative(),
8552
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8553
+ ghostsForgotten: number().int().nonnegative(),
8554
+ ghostBytesForgotten: number().int().nonnegative(),
8555
+ /** Short operator-facing line: current collection, pass, or location. */
8556
+ detail: string().nullable(),
8557
+ cancelRequested: boolean(),
8558
+ startedAt: number(),
8559
+ updatedAt: number(),
8560
+ finishedAt: number().nullable(),
8561
+ error: string().nullable()
8562
+ });
8563
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8564
+ /**
8492
8565
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8493
8566
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8494
8567
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8516,11 +8589,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8516
8589
  * The default location for a type uses `id === <type>:default` by
8517
8590
  * convention (the bare type ref like `'backups'` resolves to it).
8518
8591
  *
8519
- * `isSystem: true` marks a location as orchestrator-seeded and
8520
- * undeletable. The bootstrap-installed defaults (one per type) carry
8521
- * this flag; operator-added locations don't. Editing the config of
8522
- * a system location is allowed (path migration, provider swap) but
8523
- * deleting it is rejected at the cap level.
8592
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8593
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8594
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8595
+ * / last-enabled, not on this bit.
8524
8596
  */
8525
8597
  var StorageLocationSchema = object({
8526
8598
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -12837,6 +12909,12 @@ method(object({
12837
12909
  }), _void(), {
12838
12910
  kind: "mutation",
12839
12911
  auth: "admin"
12912
+ }), method(object({
12913
+ from: string(),
12914
+ to: string()
12915
+ }), object({ moved: number() }), {
12916
+ kind: "mutation",
12917
+ auth: "admin"
12840
12918
  }), method(object({
12841
12919
  deviceId: number(),
12842
12920
  disabled: boolean()
@@ -15549,6 +15627,8 @@ var NcSystemEventKindSchema = _enum([
15549
15627
  "device-offline",
15550
15628
  "device-disabled",
15551
15629
  "device-enabled",
15630
+ "device-battery-low",
15631
+ "device-battery-normal",
15552
15632
  "stream-online",
15553
15633
  "stream-offline",
15554
15634
  "node-online",
@@ -18767,46 +18847,6 @@ var RecentTracksPageSchema = object({
18767
18847
  /** Cursor for the next page, or null when this page is the last. */
18768
18848
  nextCursor: string().nullable()
18769
18849
  });
18770
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
18771
- var LIST_GROUPS_MAX_LIMIT = 100;
18772
- var AnalyticsGroupRecordSchema = object({
18773
- id: string(),
18774
- deviceId: number().int(),
18775
- openedAt: number().int(),
18776
- closedAt: number().int(),
18777
- timestamp: number().int(),
18778
- memberCount: number().int(),
18779
- memberTrackIds: array(string()).readonly(),
18780
- className: string(),
18781
- classes: array(string()).readonly(),
18782
- /** Relative event-media path, or null when the group has no picture yet. */
18783
- mediaUrl: string().nullable(),
18784
- singleton: boolean()
18785
- });
18786
- var AnalyticsGroupMemberSchema = object({
18787
- trackId: string(),
18788
- deviceId: number().int(),
18789
- className: string(),
18790
- firstSeen: number().int(),
18791
- lastSeen: number().int(),
18792
- mediaUrl: string().nullable()
18793
- });
18794
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
18795
- var ListGroupsQueryInput = object({
18796
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
18797
- deviceIds: array(number()),
18798
- /** Window lower bound on `closedAt` (inclusive). */
18799
- since: number().optional(),
18800
- /** Window upper bound on `openedAt` (inclusive). */
18801
- until: number().optional(),
18802
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
18803
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
18804
- cursor: string().optional()
18805
- });
18806
- var ListGroupsPageSchema = object({
18807
- groups: array(AnalyticsGroupRecordSchema).readonly(),
18808
- nextCursor: string().nullable()
18809
- });
18810
18850
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
18811
18851
  var KEY_EVENTS_MAX_LIMIT = 200;
18812
18852
  var KeyEventQueryInput = object({
@@ -18910,9 +18950,7 @@ var TrackCascadeCountsSchema = object({
18910
18950
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
18911
18951
  plates: number().int(),
18912
18952
  /** Per-track CLIP search vectors removed (best-effort). */
18913
- embeddings: number().int(),
18914
- /** Group membership + group rows removed with their last member (best-effort). */
18915
- groups: number().int()
18953
+ embeddings: number().int()
18916
18954
  });
18917
18955
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
18918
18956
  var DiskReconcileCountsSchema = object({
@@ -19082,6 +19120,47 @@ var RebuildStatusSchema = object({
19082
19120
  /** Present when the pass ended by throwing. */
19083
19121
  error: string().nullable()
19084
19122
  });
19123
+ /**
19124
+ * Acknowledgement that a debug-media reclaim STARTED.
19125
+ *
19126
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19127
+ * it runs detached and this returns immediately. Awaiting it is how the
19128
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19129
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19130
+ */
19131
+ var MediaReclaimStartResultSchema = object({
19132
+ started: boolean(),
19133
+ /** True when a pass was already running; the new request is ignored. */
19134
+ alreadyRunning: boolean()
19135
+ });
19136
+ var MediaReclaimInputSchema = object({
19137
+ mode: _enum(["report", "reclaim"]).default("report"),
19138
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19139
+ deviceIds: array(number().int()).min(1).optional(),
19140
+ restart: boolean().optional(),
19141
+ pageSize: number().int().min(50).max(5e3).optional(),
19142
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19143
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19144
+ maxBytesPerRun: number().int().min(1).optional(),
19145
+ budgetMinutes: number().int().min(1).max(720).optional(),
19146
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19147
+ graceMinutes: number().int().min(1).max(10080).optional()
19148
+ });
19149
+ var MediaReclaimStatusSchema = object({
19150
+ running: boolean(),
19151
+ mode: _enum(["report", "reclaim"]).nullable(),
19152
+ totalExamined: number(),
19153
+ totalEligible: number(),
19154
+ totalReclaimed: number(),
19155
+ totalBytesReclaimed: number(),
19156
+ totalRefused: number(),
19157
+ /** Device+scope windows finished in this pass. */
19158
+ devicesDone: number(),
19159
+ complete: boolean().nullable(),
19160
+ startedAtMs: number().nullable(),
19161
+ finishedAtMs: number().nullable(),
19162
+ error: string().nullable()
19163
+ });
19085
19164
  var ReplayFrameInputSchema = object({
19086
19165
  timestamp: number(),
19087
19166
  frame: PipelineRunResultBridge
@@ -19120,10 +19199,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19120
19199
  * stationary registry). Default false: the timeline lists passages,
19121
19200
  * not parking records (operator decision, 2026-08-15). */
19122
19201
  includeStationary: boolean().optional()
19123
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19124
- deviceId: number(),
19125
- groupId: string().min(1)
19126
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19202
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19127
19203
  kind: "mutation",
19128
19204
  auth: "admin"
19129
19205
  }), 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({
@@ -19223,6 +19299,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19223
19299
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19224
19300
  kind: "query",
19225
19301
  auth: "admin"
19302
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19303
+ kind: "mutation",
19304
+ auth: "admin"
19305
+ }), method(object({}), MediaReclaimStatusSchema, {
19306
+ kind: "query",
19307
+ auth: "admin"
19226
19308
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19227
19309
  kind: "query",
19228
19310
  auth: "admin"
@@ -21297,7 +21379,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21297
21379
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21298
21380
  kind: "mutation",
21299
21381
  auth: "admin"
21300
- });
21382
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21383
+ kind: "mutation",
21384
+ auth: "admin"
21385
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21386
+ kind: "mutation",
21387
+ auth: "admin"
21388
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21301
21389
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21302
21390
  providerId: string().min(1),
21303
21391
  displayName: string().min(1),
@@ -26717,6 +26805,33 @@ var RecordingRebalanceInputSchema = object({
26717
26805
  minMoveGb: number().min(0).optional()
26718
26806
  });
26719
26807
  /**
26808
+ * Operator-facing placement of one camera onto a recordings location.
26809
+ *
26810
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
26811
+ * Auto (the planner may move this camera). `locationId` is where high/mid
26812
+ * currently write — the plan, which may disagree with the pin when Auto.
26813
+ */
26814
+ var RecordingDevicePlacementSchema = object({
26815
+ deviceId: number().int(),
26816
+ profile: string(),
26817
+ locationId: string()
26818
+ });
26819
+ var RecordingDevicePinSchema = object({
26820
+ deviceId: number().int(),
26821
+ /** Recordings-class location this camera is pinned to. */
26822
+ locationId: string()
26823
+ });
26824
+ var RecordingPlacementViewSchema = object({
26825
+ assignments: array(RecordingDevicePlacementSchema),
26826
+ pins: array(RecordingDevicePinSchema),
26827
+ defaultLocations: record(string(), string())
26828
+ });
26829
+ var RecordingSetDevicePlacementInputSchema = object({
26830
+ deviceId: number().int(),
26831
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
26832
+ locationId: string().nullable()
26833
+ });
26834
+ /**
26720
26835
  * Result of locating footage at a wall-clock instant for one device/profile.
26721
26836
  * `segment` carries the covering segment's window; `gap` reports the forward
26722
26837
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -26942,6 +27057,12 @@ method(object({
26942
27057
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
26943
27058
  kind: "mutation",
26944
27059
  auth: "admin"
27060
+ }), method(object({}), RecordingPlacementViewSchema, {
27061
+ kind: "query",
27062
+ auth: "admin"
27063
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
27064
+ kind: "mutation",
27065
+ auth: "admin"
26945
27066
  });
26946
27067
  /**
26947
27068
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30722,6 +30843,12 @@ Object.freeze({
30722
30843
  addonId: null,
30723
30844
  access: "delete"
30724
30845
  },
30846
+ "deviceManager.renameLocation": {
30847
+ capName: "device-manager",
30848
+ capScope: "system",
30849
+ addonId: null,
30850
+ access: "create"
30851
+ },
30725
30852
  "deviceManager.runDeviceAction": {
30726
30853
  capName: "device-manager",
30727
30854
  capScope: "system",
@@ -32414,19 +32541,19 @@ Object.freeze({
32414
32541
  addonId: null,
32415
32542
  access: "view"
32416
32543
  },
32417
- "pipelineAnalytics.getGroup": {
32544
+ "pipelineAnalytics.getKeyEvents": {
32418
32545
  capName: "pipeline-analytics",
32419
32546
  capScope: "device",
32420
32547
  addonId: null,
32421
32548
  access: "view"
32422
32549
  },
32423
- "pipelineAnalytics.getKeyEvents": {
32550
+ "pipelineAnalytics.getKeyEventsBatch": {
32424
32551
  capName: "pipeline-analytics",
32425
32552
  capScope: "device",
32426
32553
  addonId: null,
32427
32554
  access: "view"
32428
32555
  },
32429
- "pipelineAnalytics.getKeyEventsBatch": {
32556
+ "pipelineAnalytics.getMediaReclaimStatus": {
32430
32557
  capName: "pipeline-analytics",
32431
32558
  capScope: "device",
32432
32559
  addonId: null,
@@ -32516,12 +32643,6 @@ Object.freeze({
32516
32643
  addonId: null,
32517
32644
  access: "view"
32518
32645
  },
32519
- "pipelineAnalytics.listGroups": {
32520
- capName: "pipeline-analytics",
32521
- capScope: "device",
32522
- addonId: null,
32523
- access: "view"
32524
- },
32525
32646
  "pipelineAnalytics.listOpsLog": {
32526
32647
  capName: "pipeline-analytics",
32527
32648
  capScope: "device",
@@ -32606,6 +32727,12 @@ Object.freeze({
32606
32727
  addonId: null,
32607
32728
  access: "create"
32608
32729
  },
32730
+ "pipelineAnalytics.reclaimDebugMedia": {
32731
+ capName: "pipeline-analytics",
32732
+ capScope: "device",
32733
+ addonId: null,
32734
+ access: "create"
32735
+ },
32609
32736
  "pipelineAnalytics.reconcileFromDisk": {
32610
32737
  capName: "pipeline-analytics",
32611
32738
  capScope: "device",
@@ -33530,6 +33657,12 @@ Object.freeze({
33530
33657
  addonId: null,
33531
33658
  access: "view"
33532
33659
  },
33660
+ "recording.getPlacement": {
33661
+ capName: "recording",
33662
+ capScope: "system",
33663
+ addonId: null,
33664
+ access: "view"
33665
+ },
33533
33666
  "recording.getPlaybackManifest": {
33534
33667
  capName: "recording",
33535
33668
  capScope: "system",
@@ -33656,6 +33789,12 @@ Object.freeze({
33656
33789
  addonId: null,
33657
33790
  access: "create"
33658
33791
  },
33792
+ "recording.setDevicePlacement": {
33793
+ capName: "recording",
33794
+ capScope: "system",
33795
+ addonId: null,
33796
+ access: "create"
33797
+ },
33659
33798
  "recording.startStorageMigrationMove": {
33660
33799
  capName: "recording",
33661
33800
  capScope: "system",
@@ -34100,12 +34239,36 @@ Object.freeze({
34100
34239
  addonId: null,
34101
34240
  access: "create"
34102
34241
  },
34242
+ "storageMigration.cleanupCancel": {
34243
+ capName: "storage-migration",
34244
+ capScope: "system",
34245
+ addonId: null,
34246
+ access: "create"
34247
+ },
34248
+ "storageMigration.cleanupStart": {
34249
+ capName: "storage-migration",
34250
+ capScope: "system",
34251
+ addonId: null,
34252
+ access: "create"
34253
+ },
34254
+ "storageMigration.cleanupStatus": {
34255
+ capName: "storage-migration",
34256
+ capScope: "system",
34257
+ addonId: null,
34258
+ access: "view"
34259
+ },
34103
34260
  "storageMigration.drain": {
34104
34261
  capName: "storage-migration",
34105
34262
  capScope: "system",
34106
34263
  addonId: null,
34107
34264
  access: "create"
34108
34265
  },
34266
+ "storageMigration.history": {
34267
+ capName: "storage-migration",
34268
+ capScope: "system",
34269
+ addonId: null,
34270
+ access: "view"
34271
+ },
34109
34272
  "storageMigration.movers": {
34110
34273
  capName: "storage-migration",
34111
34274
  capScope: "system",
@@ -36102,11 +36265,6 @@ Object.freeze({
36102
36265
  form: "single",
36103
36266
  optional: true
36104
36267
  }],
36105
- "pipelineAnalytics.getGroup": [{
36106
- name: "deviceId",
36107
- form: "single",
36108
- optional: false
36109
- }],
36110
36268
  "pipelineAnalytics.getKeyEvents": [{
36111
36269
  name: "deviceId",
36112
36270
  form: "single",
@@ -36172,11 +36330,6 @@ Object.freeze({
36172
36330
  form: "single",
36173
36331
  optional: false
36174
36332
  }],
36175
- "pipelineAnalytics.listGroups": [{
36176
- name: "deviceIds",
36177
- form: "array",
36178
- optional: false
36179
- }],
36180
36333
  "pipelineAnalytics.listOpsLog": [{
36181
36334
  name: "deviceId",
36182
36335
  form: "single",
@@ -36222,6 +36375,11 @@ Object.freeze({
36222
36375
  form: "single",
36223
36376
  optional: true
36224
36377
  }],
36378
+ "pipelineAnalytics.reclaimDebugMedia": [{
36379
+ name: "deviceIds",
36380
+ form: "array",
36381
+ optional: true
36382
+ }],
36225
36383
  "pipelineAnalytics.reconcileFromDisk": [{
36226
36384
  name: "deviceId",
36227
36385
  form: "single",
@@ -36587,6 +36745,11 @@ Object.freeze({
36587
36745
  form: "single",
36588
36746
  optional: false
36589
36747
  }],
36748
+ "recording.setDevicePlacement": [{
36749
+ name: "deviceId",
36750
+ form: "single",
36751
+ optional: false
36752
+ }],
36590
36753
  "recording.startStorageMigrationMove": [{
36591
36754
  name: "deviceId",
36592
36755
  form: "single",
package/dist/addon.mjs CHANGED
@@ -8096,6 +8096,13 @@ var MediaRelocateModeSchema = _enum([
8096
8096
  ]);
8097
8097
  var RelocateMediaInputSchema = object({
8098
8098
  toLocationId: string(),
8099
+ /**
8100
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8101
+ * every row that is not already on `toLocationId` (the historical
8102
+ * behaviour). A named source is what a from→to migration needs: without it
8103
+ * "move events off disk 2" also emptied disk 1.
8104
+ */
8105
+ fromLocationId: string().optional(),
8099
8106
  throttleMbps: number().min(1).max(1e3).optional(),
8100
8107
  /** Omitted = `move`, the pre-existing behaviour. */
8101
8108
  mode: MediaRelocateModeSchema.optional()
@@ -8163,6 +8170,19 @@ var StorageMigrationDestinationsSchema = object({
8163
8170
  galleryMedia: string().min(1).optional()
8164
8171
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8165
8172
  /**
8173
+ * Optional named source per class. Omitted = the class's current default
8174
+ * (the historical behaviour). A named source that is NOT the default is a
8175
+ * drain of that disk: bytes move, the default stays, and the source is
8176
+ * disabled when the move finishes.
8177
+ */
8178
+ var StorageMigrationSourcesSchema = object({
8179
+ recordings: string().min(1).optional(),
8180
+ recordingsLow: string().min(1).optional(),
8181
+ eventMedia: string().min(1).optional(),
8182
+ backups: string().min(1).optional(),
8183
+ galleryMedia: string().min(1).optional()
8184
+ }).optional();
8185
+ /**
8166
8186
  * How a migration sequences the cutover against the byte move.
8167
8187
  *
8168
8188
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8184,6 +8204,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8184
8204
  /** Shared input for planning and starting an orchestrated storage migration. */
8185
8205
  var StorageMigrationInputSchema = object({
8186
8206
  destinations: StorageMigrationDestinationsSchema,
8207
+ /** Omitted = each class's current default. */
8208
+ sources: StorageMigrationSourcesSchema,
8187
8209
  throttleMbps: number().min(1).max(1e3).optional(),
8188
8210
  /** Omitted = `blocking`, which stays the default. */
8189
8211
  mode: StorageMigrationModeSchema.optional()
@@ -8263,6 +8285,13 @@ var StorageMigrationMoveSchema = object({
8263
8285
  storageClass: StorageMigrationClassSchema,
8264
8286
  fromLocationId: string(),
8265
8287
  toLocationId: string(),
8288
+ /**
8289
+ * True when `from` was NOT the class default at plan time. The move still
8290
+ * copies bytes, but the default is left alone and the source is disabled
8291
+ * once the copy verifies. Absent on jobs planned before this field existed
8292
+ * — those jobs always repointed, which is `false`.
8293
+ */
8294
+ freezeSource: boolean().optional(),
8266
8295
  moverJobId: string().nullable(),
8267
8296
  state: RelocateJobStateSchema.nullable(),
8268
8297
  error: string().nullable(),
@@ -8276,6 +8305,7 @@ var StorageMigrationJobSchema = object({
8276
8305
  * can tell a seconds-long cutover from a thirty-hour one. */
8277
8306
  mode: StorageMigrationModeSchema,
8278
8307
  destinations: StorageMigrationDestinationsSchema,
8308
+ sources: StorageMigrationSourcesSchema,
8279
8309
  throttleMbps: number(),
8280
8310
  moves: array(StorageMigrationMoveSchema),
8281
8311
  pauseLeaseId: string().nullable(),
@@ -8301,6 +8331,7 @@ var StorageMigrationFindingSchema = object({
8301
8331
  });
8302
8332
  var StorageMigrationPlanSchema = object({
8303
8333
  destinations: StorageMigrationDestinationsSchema,
8334
+ sources: StorageMigrationSourcesSchema,
8304
8335
  /** The mode this plan was built for. A plan is only valid for its mode: the
8305
8336
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8306
8337
  * it. */
@@ -8308,7 +8339,8 @@ var StorageMigrationPlanSchema = object({
8308
8339
  moves: array(object({
8309
8340
  storageClass: StorageMigrationClassSchema,
8310
8341
  fromLocationId: string(),
8311
- toLocationId: string()
8342
+ toLocationId: string(),
8343
+ freezeSource: boolean().optional()
8312
8344
  })),
8313
8345
  findings: array(StorageMigrationFindingSchema)
8314
8346
  });
@@ -8486,10 +8518,51 @@ var LedgerWalkReportSchema = object({
8486
8518
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8487
8519
  var RelocatableMediaCountInputSchema = object({
8488
8520
  toLocationId: string().min(1),
8521
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8522
+ fromLocationId: string().optional(),
8489
8523
  /** Omitted = `move`. */
8490
8524
  mode: MediaRelocateModeSchema.optional()
8491
8525
  });
8492
8526
  /**
8527
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8528
+ * ghost ledger entries on frozen footage locations.
8529
+ *
8530
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8531
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8532
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8533
+ * with no operator-visible status.
8534
+ */
8535
+ var StorageCleanupPhaseSchema = _enum([
8536
+ "orphans",
8537
+ "debug-media",
8538
+ "ghost-ledger",
8539
+ "done",
8540
+ "failed",
8541
+ "cancelled"
8542
+ ]);
8543
+ var StorageCleanupInputSchema = object({
8544
+ /** Also walk motion stills / track filmstrips. Off by default. */
8545
+ includeDebugMedia: boolean().optional() });
8546
+ var StorageCleanupJobSchema = object({
8547
+ jobId: string(),
8548
+ phase: StorageCleanupPhaseSchema,
8549
+ includeDebugMedia: boolean(),
8550
+ orphansReclaimed: number().int().nonnegative(),
8551
+ orphanBytesReclaimed: number().int().nonnegative(),
8552
+ debugMediaReclaimed: number().int().nonnegative(),
8553
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8554
+ ghostsForgotten: number().int().nonnegative(),
8555
+ ghostBytesForgotten: number().int().nonnegative(),
8556
+ /** Short operator-facing line: current collection, pass, or location. */
8557
+ detail: string().nullable(),
8558
+ cancelRequested: boolean(),
8559
+ startedAt: number(),
8560
+ updatedAt: number(),
8561
+ finishedAt: number().nullable(),
8562
+ error: string().nullable()
8563
+ });
8564
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8565
+ /**
8493
8566
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8494
8567
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8495
8568
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8517,11 +8590,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8517
8590
  * The default location for a type uses `id === <type>:default` by
8518
8591
  * convention (the bare type ref like `'backups'` resolves to it).
8519
8592
  *
8520
- * `isSystem: true` marks a location as orchestrator-seeded and
8521
- * undeletable. The bootstrap-installed defaults (one per type) carry
8522
- * this flag; operator-added locations don't. Editing the config of
8523
- * a system location is allowed (path migration, provider swap) but
8524
- * deleting it is rejected at the cap level.
8593
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8594
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8595
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8596
+ * / last-enabled, not on this bit.
8525
8597
  */
8526
8598
  var StorageLocationSchema = object({
8527
8599
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -12838,6 +12910,12 @@ method(object({
12838
12910
  }), _void(), {
12839
12911
  kind: "mutation",
12840
12912
  auth: "admin"
12913
+ }), method(object({
12914
+ from: string(),
12915
+ to: string()
12916
+ }), object({ moved: number() }), {
12917
+ kind: "mutation",
12918
+ auth: "admin"
12841
12919
  }), method(object({
12842
12920
  deviceId: number(),
12843
12921
  disabled: boolean()
@@ -15550,6 +15628,8 @@ var NcSystemEventKindSchema = _enum([
15550
15628
  "device-offline",
15551
15629
  "device-disabled",
15552
15630
  "device-enabled",
15631
+ "device-battery-low",
15632
+ "device-battery-normal",
15553
15633
  "stream-online",
15554
15634
  "stream-offline",
15555
15635
  "node-online",
@@ -18768,46 +18848,6 @@ var RecentTracksPageSchema = object({
18768
18848
  /** Cursor for the next page, or null when this page is the last. */
18769
18849
  nextCursor: string().nullable()
18770
18850
  });
18771
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
18772
- var LIST_GROUPS_MAX_LIMIT = 100;
18773
- var AnalyticsGroupRecordSchema = object({
18774
- id: string(),
18775
- deviceId: number().int(),
18776
- openedAt: number().int(),
18777
- closedAt: number().int(),
18778
- timestamp: number().int(),
18779
- memberCount: number().int(),
18780
- memberTrackIds: array(string()).readonly(),
18781
- className: string(),
18782
- classes: array(string()).readonly(),
18783
- /** Relative event-media path, or null when the group has no picture yet. */
18784
- mediaUrl: string().nullable(),
18785
- singleton: boolean()
18786
- });
18787
- var AnalyticsGroupMemberSchema = object({
18788
- trackId: string(),
18789
- deviceId: number().int(),
18790
- className: string(),
18791
- firstSeen: number().int(),
18792
- lastSeen: number().int(),
18793
- mediaUrl: string().nullable()
18794
- });
18795
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
18796
- var ListGroupsQueryInput = object({
18797
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
18798
- deviceIds: array(number()),
18799
- /** Window lower bound on `closedAt` (inclusive). */
18800
- since: number().optional(),
18801
- /** Window upper bound on `openedAt` (inclusive). */
18802
- until: number().optional(),
18803
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
18804
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
18805
- cursor: string().optional()
18806
- });
18807
- var ListGroupsPageSchema = object({
18808
- groups: array(AnalyticsGroupRecordSchema).readonly(),
18809
- nextCursor: string().nullable()
18810
- });
18811
18851
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
18812
18852
  var KEY_EVENTS_MAX_LIMIT = 200;
18813
18853
  var KeyEventQueryInput = object({
@@ -18911,9 +18951,7 @@ var TrackCascadeCountsSchema = object({
18911
18951
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
18912
18952
  plates: number().int(),
18913
18953
  /** Per-track CLIP search vectors removed (best-effort). */
18914
- embeddings: number().int(),
18915
- /** Group membership + group rows removed with their last member (best-effort). */
18916
- groups: number().int()
18954
+ embeddings: number().int()
18917
18955
  });
18918
18956
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
18919
18957
  var DiskReconcileCountsSchema = object({
@@ -19083,6 +19121,47 @@ var RebuildStatusSchema = object({
19083
19121
  /** Present when the pass ended by throwing. */
19084
19122
  error: string().nullable()
19085
19123
  });
19124
+ /**
19125
+ * Acknowledgement that a debug-media reclaim STARTED.
19126
+ *
19127
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19128
+ * it runs detached and this returns immediately. Awaiting it is how the
19129
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19130
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19131
+ */
19132
+ var MediaReclaimStartResultSchema = object({
19133
+ started: boolean(),
19134
+ /** True when a pass was already running; the new request is ignored. */
19135
+ alreadyRunning: boolean()
19136
+ });
19137
+ var MediaReclaimInputSchema = object({
19138
+ mode: _enum(["report", "reclaim"]).default("report"),
19139
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19140
+ deviceIds: array(number().int()).min(1).optional(),
19141
+ restart: boolean().optional(),
19142
+ pageSize: number().int().min(50).max(5e3).optional(),
19143
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19144
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19145
+ maxBytesPerRun: number().int().min(1).optional(),
19146
+ budgetMinutes: number().int().min(1).max(720).optional(),
19147
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19148
+ graceMinutes: number().int().min(1).max(10080).optional()
19149
+ });
19150
+ var MediaReclaimStatusSchema = object({
19151
+ running: boolean(),
19152
+ mode: _enum(["report", "reclaim"]).nullable(),
19153
+ totalExamined: number(),
19154
+ totalEligible: number(),
19155
+ totalReclaimed: number(),
19156
+ totalBytesReclaimed: number(),
19157
+ totalRefused: number(),
19158
+ /** Device+scope windows finished in this pass. */
19159
+ devicesDone: number(),
19160
+ complete: boolean().nullable(),
19161
+ startedAtMs: number().nullable(),
19162
+ finishedAtMs: number().nullable(),
19163
+ error: string().nullable()
19164
+ });
19086
19165
  var ReplayFrameInputSchema = object({
19087
19166
  timestamp: number(),
19088
19167
  frame: PipelineRunResultBridge
@@ -19121,10 +19200,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19121
19200
  * stationary registry). Default false: the timeline lists passages,
19122
19201
  * not parking records (operator decision, 2026-08-15). */
19123
19202
  includeStationary: boolean().optional()
19124
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19125
- deviceId: number(),
19126
- groupId: string().min(1)
19127
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19203
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19128
19204
  kind: "mutation",
19129
19205
  auth: "admin"
19130
19206
  }), 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({
@@ -19224,6 +19300,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19224
19300
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19225
19301
  kind: "query",
19226
19302
  auth: "admin"
19303
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19304
+ kind: "mutation",
19305
+ auth: "admin"
19306
+ }), method(object({}), MediaReclaimStatusSchema, {
19307
+ kind: "query",
19308
+ auth: "admin"
19227
19309
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19228
19310
  kind: "query",
19229
19311
  auth: "admin"
@@ -21298,7 +21380,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21298
21380
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21299
21381
  kind: "mutation",
21300
21382
  auth: "admin"
21301
- });
21383
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21384
+ kind: "mutation",
21385
+ auth: "admin"
21386
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21387
+ kind: "mutation",
21388
+ auth: "admin"
21389
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21302
21390
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21303
21391
  providerId: string().min(1),
21304
21392
  displayName: string().min(1),
@@ -26718,6 +26806,33 @@ var RecordingRebalanceInputSchema = object({
26718
26806
  minMoveGb: number().min(0).optional()
26719
26807
  });
26720
26808
  /**
26809
+ * Operator-facing placement of one camera onto a recordings location.
26810
+ *
26811
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
26812
+ * Auto (the planner may move this camera). `locationId` is where high/mid
26813
+ * currently write — the plan, which may disagree with the pin when Auto.
26814
+ */
26815
+ var RecordingDevicePlacementSchema = object({
26816
+ deviceId: number().int(),
26817
+ profile: string(),
26818
+ locationId: string()
26819
+ });
26820
+ var RecordingDevicePinSchema = object({
26821
+ deviceId: number().int(),
26822
+ /** Recordings-class location this camera is pinned to. */
26823
+ locationId: string()
26824
+ });
26825
+ var RecordingPlacementViewSchema = object({
26826
+ assignments: array(RecordingDevicePlacementSchema),
26827
+ pins: array(RecordingDevicePinSchema),
26828
+ defaultLocations: record(string(), string())
26829
+ });
26830
+ var RecordingSetDevicePlacementInputSchema = object({
26831
+ deviceId: number().int(),
26832
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
26833
+ locationId: string().nullable()
26834
+ });
26835
+ /**
26721
26836
  * Result of locating footage at a wall-clock instant for one device/profile.
26722
26837
  * `segment` carries the covering segment's window; `gap` reports the forward
26723
26838
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -26943,6 +27058,12 @@ method(object({
26943
27058
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
26944
27059
  kind: "mutation",
26945
27060
  auth: "admin"
27061
+ }), method(object({}), RecordingPlacementViewSchema, {
27062
+ kind: "query",
27063
+ auth: "admin"
27064
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
27065
+ kind: "mutation",
27066
+ auth: "admin"
26946
27067
  });
26947
27068
  /**
26948
27069
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30723,6 +30844,12 @@ Object.freeze({
30723
30844
  addonId: null,
30724
30845
  access: "delete"
30725
30846
  },
30847
+ "deviceManager.renameLocation": {
30848
+ capName: "device-manager",
30849
+ capScope: "system",
30850
+ addonId: null,
30851
+ access: "create"
30852
+ },
30726
30853
  "deviceManager.runDeviceAction": {
30727
30854
  capName: "device-manager",
30728
30855
  capScope: "system",
@@ -32415,19 +32542,19 @@ Object.freeze({
32415
32542
  addonId: null,
32416
32543
  access: "view"
32417
32544
  },
32418
- "pipelineAnalytics.getGroup": {
32545
+ "pipelineAnalytics.getKeyEvents": {
32419
32546
  capName: "pipeline-analytics",
32420
32547
  capScope: "device",
32421
32548
  addonId: null,
32422
32549
  access: "view"
32423
32550
  },
32424
- "pipelineAnalytics.getKeyEvents": {
32551
+ "pipelineAnalytics.getKeyEventsBatch": {
32425
32552
  capName: "pipeline-analytics",
32426
32553
  capScope: "device",
32427
32554
  addonId: null,
32428
32555
  access: "view"
32429
32556
  },
32430
- "pipelineAnalytics.getKeyEventsBatch": {
32557
+ "pipelineAnalytics.getMediaReclaimStatus": {
32431
32558
  capName: "pipeline-analytics",
32432
32559
  capScope: "device",
32433
32560
  addonId: null,
@@ -32517,12 +32644,6 @@ Object.freeze({
32517
32644
  addonId: null,
32518
32645
  access: "view"
32519
32646
  },
32520
- "pipelineAnalytics.listGroups": {
32521
- capName: "pipeline-analytics",
32522
- capScope: "device",
32523
- addonId: null,
32524
- access: "view"
32525
- },
32526
32647
  "pipelineAnalytics.listOpsLog": {
32527
32648
  capName: "pipeline-analytics",
32528
32649
  capScope: "device",
@@ -32607,6 +32728,12 @@ Object.freeze({
32607
32728
  addonId: null,
32608
32729
  access: "create"
32609
32730
  },
32731
+ "pipelineAnalytics.reclaimDebugMedia": {
32732
+ capName: "pipeline-analytics",
32733
+ capScope: "device",
32734
+ addonId: null,
32735
+ access: "create"
32736
+ },
32610
32737
  "pipelineAnalytics.reconcileFromDisk": {
32611
32738
  capName: "pipeline-analytics",
32612
32739
  capScope: "device",
@@ -33531,6 +33658,12 @@ Object.freeze({
33531
33658
  addonId: null,
33532
33659
  access: "view"
33533
33660
  },
33661
+ "recording.getPlacement": {
33662
+ capName: "recording",
33663
+ capScope: "system",
33664
+ addonId: null,
33665
+ access: "view"
33666
+ },
33534
33667
  "recording.getPlaybackManifest": {
33535
33668
  capName: "recording",
33536
33669
  capScope: "system",
@@ -33657,6 +33790,12 @@ Object.freeze({
33657
33790
  addonId: null,
33658
33791
  access: "create"
33659
33792
  },
33793
+ "recording.setDevicePlacement": {
33794
+ capName: "recording",
33795
+ capScope: "system",
33796
+ addonId: null,
33797
+ access: "create"
33798
+ },
33660
33799
  "recording.startStorageMigrationMove": {
33661
33800
  capName: "recording",
33662
33801
  capScope: "system",
@@ -34101,12 +34240,36 @@ Object.freeze({
34101
34240
  addonId: null,
34102
34241
  access: "create"
34103
34242
  },
34243
+ "storageMigration.cleanupCancel": {
34244
+ capName: "storage-migration",
34245
+ capScope: "system",
34246
+ addonId: null,
34247
+ access: "create"
34248
+ },
34249
+ "storageMigration.cleanupStart": {
34250
+ capName: "storage-migration",
34251
+ capScope: "system",
34252
+ addonId: null,
34253
+ access: "create"
34254
+ },
34255
+ "storageMigration.cleanupStatus": {
34256
+ capName: "storage-migration",
34257
+ capScope: "system",
34258
+ addonId: null,
34259
+ access: "view"
34260
+ },
34104
34261
  "storageMigration.drain": {
34105
34262
  capName: "storage-migration",
34106
34263
  capScope: "system",
34107
34264
  addonId: null,
34108
34265
  access: "create"
34109
34266
  },
34267
+ "storageMigration.history": {
34268
+ capName: "storage-migration",
34269
+ capScope: "system",
34270
+ addonId: null,
34271
+ access: "view"
34272
+ },
34110
34273
  "storageMigration.movers": {
34111
34274
  capName: "storage-migration",
34112
34275
  capScope: "system",
@@ -36103,11 +36266,6 @@ Object.freeze({
36103
36266
  form: "single",
36104
36267
  optional: true
36105
36268
  }],
36106
- "pipelineAnalytics.getGroup": [{
36107
- name: "deviceId",
36108
- form: "single",
36109
- optional: false
36110
- }],
36111
36269
  "pipelineAnalytics.getKeyEvents": [{
36112
36270
  name: "deviceId",
36113
36271
  form: "single",
@@ -36173,11 +36331,6 @@ Object.freeze({
36173
36331
  form: "single",
36174
36332
  optional: false
36175
36333
  }],
36176
- "pipelineAnalytics.listGroups": [{
36177
- name: "deviceIds",
36178
- form: "array",
36179
- optional: false
36180
- }],
36181
36334
  "pipelineAnalytics.listOpsLog": [{
36182
36335
  name: "deviceId",
36183
36336
  form: "single",
@@ -36223,6 +36376,11 @@ Object.freeze({
36223
36376
  form: "single",
36224
36377
  optional: true
36225
36378
  }],
36379
+ "pipelineAnalytics.reclaimDebugMedia": [{
36380
+ name: "deviceIds",
36381
+ form: "array",
36382
+ optional: true
36383
+ }],
36226
36384
  "pipelineAnalytics.reconcileFromDisk": [{
36227
36385
  name: "deviceId",
36228
36386
  form: "single",
@@ -36588,6 +36746,11 @@ Object.freeze({
36588
36746
  form: "single",
36589
36747
  optional: false
36590
36748
  }],
36749
+ "recording.setDevicePlacement": [{
36750
+ name: "deviceId",
36751
+ form: "single",
36752
+ optional: false
36753
+ }],
36591
36754
  "recording.startStorageMigrationMove": [{
36592
36755
  name: "deviceId",
36593
36756
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-onvif",
3
- "version": "1.2.48",
3
+ "version": "1.2.50",
4
4
  "description": "ONVIF camera device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",