@camstack/addon-post-analysis 1.2.156 → 1.2.159

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.
@@ -8366,6 +8366,13 @@ var MediaRelocateModeSchema = _enum([
8366
8366
  ]);
8367
8367
  var RelocateMediaInputSchema = object({
8368
8368
  toLocationId: string(),
8369
+ /**
8370
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8371
+ * every row that is not already on `toLocationId` (the historical
8372
+ * behaviour). A named source is what a from→to migration needs: without it
8373
+ * "move events off disk 2" also emptied disk 1.
8374
+ */
8375
+ fromLocationId: string().optional(),
8369
8376
  throttleMbps: number().min(1).max(1e3).optional(),
8370
8377
  /** Omitted = `move`, the pre-existing behaviour. */
8371
8378
  mode: MediaRelocateModeSchema.optional()
@@ -8433,6 +8440,19 @@ var StorageMigrationDestinationsSchema = object({
8433
8440
  galleryMedia: string().min(1).optional()
8434
8441
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8435
8442
  /**
8443
+ * Optional named source per class. Omitted = the class's current default
8444
+ * (the historical behaviour). A named source that is NOT the default is a
8445
+ * drain of that disk: bytes move, the default stays, and the source is
8446
+ * disabled when the move finishes.
8447
+ */
8448
+ var StorageMigrationSourcesSchema = object({
8449
+ recordings: string().min(1).optional(),
8450
+ recordingsLow: string().min(1).optional(),
8451
+ eventMedia: string().min(1).optional(),
8452
+ backups: string().min(1).optional(),
8453
+ galleryMedia: string().min(1).optional()
8454
+ }).optional();
8455
+ /**
8436
8456
  * How a migration sequences the cutover against the byte move.
8437
8457
  *
8438
8458
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8454,6 +8474,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8454
8474
  /** Shared input for planning and starting an orchestrated storage migration. */
8455
8475
  var StorageMigrationInputSchema = object({
8456
8476
  destinations: StorageMigrationDestinationsSchema,
8477
+ /** Omitted = each class's current default. */
8478
+ sources: StorageMigrationSourcesSchema,
8457
8479
  throttleMbps: number().min(1).max(1e3).optional(),
8458
8480
  /** Omitted = `blocking`, which stays the default. */
8459
8481
  mode: StorageMigrationModeSchema.optional()
@@ -8533,6 +8555,13 @@ var StorageMigrationMoveSchema = object({
8533
8555
  storageClass: StorageMigrationClassSchema,
8534
8556
  fromLocationId: string(),
8535
8557
  toLocationId: string(),
8558
+ /**
8559
+ * True when `from` was NOT the class default at plan time. The move still
8560
+ * copies bytes, but the default is left alone and the source is disabled
8561
+ * once the copy verifies. Absent on jobs planned before this field existed
8562
+ * — those jobs always repointed, which is `false`.
8563
+ */
8564
+ freezeSource: boolean().optional(),
8536
8565
  moverJobId: string().nullable(),
8537
8566
  state: RelocateJobStateSchema.nullable(),
8538
8567
  error: string().nullable(),
@@ -8546,6 +8575,7 @@ var StorageMigrationJobSchema = object({
8546
8575
  * can tell a seconds-long cutover from a thirty-hour one. */
8547
8576
  mode: StorageMigrationModeSchema,
8548
8577
  destinations: StorageMigrationDestinationsSchema,
8578
+ sources: StorageMigrationSourcesSchema,
8549
8579
  throttleMbps: number(),
8550
8580
  moves: array(StorageMigrationMoveSchema),
8551
8581
  pauseLeaseId: string().nullable(),
@@ -8571,6 +8601,7 @@ var StorageMigrationFindingSchema = object({
8571
8601
  });
8572
8602
  var StorageMigrationPlanSchema = object({
8573
8603
  destinations: StorageMigrationDestinationsSchema,
8604
+ sources: StorageMigrationSourcesSchema,
8574
8605
  /** The mode this plan was built for. A plan is only valid for its mode: the
8575
8606
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8576
8607
  * it. */
@@ -8578,7 +8609,8 @@ var StorageMigrationPlanSchema = object({
8578
8609
  moves: array(object({
8579
8610
  storageClass: StorageMigrationClassSchema,
8580
8611
  fromLocationId: string(),
8581
- toLocationId: string()
8612
+ toLocationId: string(),
8613
+ freezeSource: boolean().optional()
8582
8614
  })),
8583
8615
  findings: array(StorageMigrationFindingSchema)
8584
8616
  });
@@ -8756,10 +8788,51 @@ var LedgerWalkReportSchema = object({
8756
8788
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8757
8789
  var RelocatableMediaCountInputSchema = object({
8758
8790
  toLocationId: string().min(1),
8791
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8792
+ fromLocationId: string().optional(),
8759
8793
  /** Omitted = `move`. */
8760
8794
  mode: MediaRelocateModeSchema.optional()
8761
8795
  });
8762
8796
  /**
8797
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8798
+ * ghost ledger entries on frozen footage locations.
8799
+ *
8800
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8801
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8802
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8803
+ * with no operator-visible status.
8804
+ */
8805
+ var StorageCleanupPhaseSchema = _enum([
8806
+ "orphans",
8807
+ "debug-media",
8808
+ "ghost-ledger",
8809
+ "done",
8810
+ "failed",
8811
+ "cancelled"
8812
+ ]);
8813
+ var StorageCleanupInputSchema = object({
8814
+ /** Also walk motion stills / track filmstrips. Off by default. */
8815
+ includeDebugMedia: boolean().optional() });
8816
+ var StorageCleanupJobSchema = object({
8817
+ jobId: string(),
8818
+ phase: StorageCleanupPhaseSchema,
8819
+ includeDebugMedia: boolean(),
8820
+ orphansReclaimed: number().int().nonnegative(),
8821
+ orphanBytesReclaimed: number().int().nonnegative(),
8822
+ debugMediaReclaimed: number().int().nonnegative(),
8823
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8824
+ ghostsForgotten: number().int().nonnegative(),
8825
+ ghostBytesForgotten: number().int().nonnegative(),
8826
+ /** Short operator-facing line: current collection, pass, or location. */
8827
+ detail: string().nullable(),
8828
+ cancelRequested: boolean(),
8829
+ startedAt: number(),
8830
+ updatedAt: number(),
8831
+ finishedAt: number().nullable(),
8832
+ error: string().nullable()
8833
+ });
8834
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8835
+ /**
8763
8836
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8764
8837
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8765
8838
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8787,11 +8860,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8787
8860
  * The default location for a type uses `id === <type>:default` by
8788
8861
  * convention (the bare type ref like `'backups'` resolves to it).
8789
8862
  *
8790
- * `isSystem: true` marks a location as orchestrator-seeded and
8791
- * undeletable. The bootstrap-installed defaults (one per type) carry
8792
- * this flag; operator-added locations don't. Editing the config of
8793
- * a system location is allowed (path migration, provider swap) but
8794
- * deleting it is rejected at the cap level.
8863
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8864
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8865
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8866
+ * / last-enabled, not on this bit.
8795
8867
  */
8796
8868
  var StorageLocationSchema = object({
8797
8869
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -23113,7 +23185,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
23113
23185
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
23114
23186
  kind: "mutation",
23115
23187
  auth: "admin"
23116
- });
23188
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
23189
+ kind: "mutation",
23190
+ auth: "admin"
23191
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
23192
+ kind: "mutation",
23193
+ auth: "admin"
23194
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
23117
23195
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
23118
23196
  providerId: string().min(1),
23119
23197
  displayName: string().min(1),
@@ -30280,6 +30358,33 @@ var RecordingRebalanceInputSchema = object({
30280
30358
  minMoveGb: number().min(0).optional()
30281
30359
  });
30282
30360
  /**
30361
+ * Operator-facing placement of one camera onto a recordings location.
30362
+ *
30363
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
30364
+ * Auto (the planner may move this camera). `locationId` is where high/mid
30365
+ * currently write — the plan, which may disagree with the pin when Auto.
30366
+ */
30367
+ var RecordingDevicePlacementSchema = object({
30368
+ deviceId: number().int(),
30369
+ profile: string(),
30370
+ locationId: string()
30371
+ });
30372
+ var RecordingDevicePinSchema = object({
30373
+ deviceId: number().int(),
30374
+ /** Recordings-class location this camera is pinned to. */
30375
+ locationId: string()
30376
+ });
30377
+ var RecordingPlacementViewSchema = object({
30378
+ assignments: array(RecordingDevicePlacementSchema),
30379
+ pins: array(RecordingDevicePinSchema),
30380
+ defaultLocations: record(string(), string())
30381
+ });
30382
+ var RecordingSetDevicePlacementInputSchema = object({
30383
+ deviceId: number().int(),
30384
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
30385
+ locationId: string().nullable()
30386
+ });
30387
+ /**
30283
30388
  * Result of locating footage at a wall-clock instant for one device/profile.
30284
30389
  * `segment` carries the covering segment's window; `gap` reports the forward
30285
30390
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -30505,6 +30610,12 @@ method(object({
30505
30610
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
30506
30611
  kind: "mutation",
30507
30612
  auth: "admin"
30613
+ }), method(object({}), RecordingPlacementViewSchema, {
30614
+ kind: "query",
30615
+ auth: "admin"
30616
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
30617
+ kind: "mutation",
30618
+ auth: "admin"
30508
30619
  });
30509
30620
  /**
30510
30621
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -38611,6 +38722,12 @@ Object.freeze({
38611
38722
  addonId: null,
38612
38723
  access: "view"
38613
38724
  },
38725
+ "recording.getPlacement": {
38726
+ capName: "recording",
38727
+ capScope: "system",
38728
+ addonId: null,
38729
+ access: "view"
38730
+ },
38614
38731
  "recording.getPlaybackManifest": {
38615
38732
  capName: "recording",
38616
38733
  capScope: "system",
@@ -38737,6 +38854,12 @@ Object.freeze({
38737
38854
  addonId: null,
38738
38855
  access: "create"
38739
38856
  },
38857
+ "recording.setDevicePlacement": {
38858
+ capName: "recording",
38859
+ capScope: "system",
38860
+ addonId: null,
38861
+ access: "create"
38862
+ },
38740
38863
  "recording.startStorageMigrationMove": {
38741
38864
  capName: "recording",
38742
38865
  capScope: "system",
@@ -39181,12 +39304,36 @@ Object.freeze({
39181
39304
  addonId: null,
39182
39305
  access: "create"
39183
39306
  },
39307
+ "storageMigration.cleanupCancel": {
39308
+ capName: "storage-migration",
39309
+ capScope: "system",
39310
+ addonId: null,
39311
+ access: "create"
39312
+ },
39313
+ "storageMigration.cleanupStart": {
39314
+ capName: "storage-migration",
39315
+ capScope: "system",
39316
+ addonId: null,
39317
+ access: "create"
39318
+ },
39319
+ "storageMigration.cleanupStatus": {
39320
+ capName: "storage-migration",
39321
+ capScope: "system",
39322
+ addonId: null,
39323
+ access: "view"
39324
+ },
39184
39325
  "storageMigration.drain": {
39185
39326
  capName: "storage-migration",
39186
39327
  capScope: "system",
39187
39328
  addonId: null,
39188
39329
  access: "create"
39189
39330
  },
39331
+ "storageMigration.history": {
39332
+ capName: "storage-migration",
39333
+ capScope: "system",
39334
+ addonId: null,
39335
+ access: "view"
39336
+ },
39190
39337
  "storageMigration.movers": {
39191
39338
  capName: "storage-migration",
39192
39339
  capScope: "system",
@@ -41673,6 +41820,11 @@ Object.freeze({
41673
41820
  form: "single",
41674
41821
  optional: false
41675
41822
  }],
41823
+ "recording.setDevicePlacement": [{
41824
+ name: "deviceId",
41825
+ form: "single",
41826
+ optional: false
41827
+ }],
41676
41828
  "recording.startStorageMigrationMove": [{
41677
41829
  name: "deviceId",
41678
41830
  form: "single",
@@ -8335,6 +8335,13 @@ var MediaRelocateModeSchema = _enum([
8335
8335
  ]);
8336
8336
  var RelocateMediaInputSchema = object({
8337
8337
  toLocationId: string(),
8338
+ /**
8339
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8340
+ * every row that is not already on `toLocationId` (the historical
8341
+ * behaviour). A named source is what a from→to migration needs: without it
8342
+ * "move events off disk 2" also emptied disk 1.
8343
+ */
8344
+ fromLocationId: string().optional(),
8338
8345
  throttleMbps: number().min(1).max(1e3).optional(),
8339
8346
  /** Omitted = `move`, the pre-existing behaviour. */
8340
8347
  mode: MediaRelocateModeSchema.optional()
@@ -8402,6 +8409,19 @@ var StorageMigrationDestinationsSchema = object({
8402
8409
  galleryMedia: string().min(1).optional()
8403
8410
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8404
8411
  /**
8412
+ * Optional named source per class. Omitted = the class's current default
8413
+ * (the historical behaviour). A named source that is NOT the default is a
8414
+ * drain of that disk: bytes move, the default stays, and the source is
8415
+ * disabled when the move finishes.
8416
+ */
8417
+ var StorageMigrationSourcesSchema = object({
8418
+ recordings: string().min(1).optional(),
8419
+ recordingsLow: string().min(1).optional(),
8420
+ eventMedia: string().min(1).optional(),
8421
+ backups: string().min(1).optional(),
8422
+ galleryMedia: string().min(1).optional()
8423
+ }).optional();
8424
+ /**
8405
8425
  * How a migration sequences the cutover against the byte move.
8406
8426
  *
8407
8427
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8423,6 +8443,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8423
8443
  /** Shared input for planning and starting an orchestrated storage migration. */
8424
8444
  var StorageMigrationInputSchema = object({
8425
8445
  destinations: StorageMigrationDestinationsSchema,
8446
+ /** Omitted = each class's current default. */
8447
+ sources: StorageMigrationSourcesSchema,
8426
8448
  throttleMbps: number().min(1).max(1e3).optional(),
8427
8449
  /** Omitted = `blocking`, which stays the default. */
8428
8450
  mode: StorageMigrationModeSchema.optional()
@@ -8502,6 +8524,13 @@ var StorageMigrationMoveSchema = object({
8502
8524
  storageClass: StorageMigrationClassSchema,
8503
8525
  fromLocationId: string(),
8504
8526
  toLocationId: string(),
8527
+ /**
8528
+ * True when `from` was NOT the class default at plan time. The move still
8529
+ * copies bytes, but the default is left alone and the source is disabled
8530
+ * once the copy verifies. Absent on jobs planned before this field existed
8531
+ * — those jobs always repointed, which is `false`.
8532
+ */
8533
+ freezeSource: boolean().optional(),
8505
8534
  moverJobId: string().nullable(),
8506
8535
  state: RelocateJobStateSchema.nullable(),
8507
8536
  error: string().nullable(),
@@ -8515,6 +8544,7 @@ var StorageMigrationJobSchema = object({
8515
8544
  * can tell a seconds-long cutover from a thirty-hour one. */
8516
8545
  mode: StorageMigrationModeSchema,
8517
8546
  destinations: StorageMigrationDestinationsSchema,
8547
+ sources: StorageMigrationSourcesSchema,
8518
8548
  throttleMbps: number(),
8519
8549
  moves: array(StorageMigrationMoveSchema),
8520
8550
  pauseLeaseId: string().nullable(),
@@ -8540,6 +8570,7 @@ var StorageMigrationFindingSchema = object({
8540
8570
  });
8541
8571
  var StorageMigrationPlanSchema = object({
8542
8572
  destinations: StorageMigrationDestinationsSchema,
8573
+ sources: StorageMigrationSourcesSchema,
8543
8574
  /** The mode this plan was built for. A plan is only valid for its mode: the
8544
8575
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8545
8576
  * it. */
@@ -8547,7 +8578,8 @@ var StorageMigrationPlanSchema = object({
8547
8578
  moves: array(object({
8548
8579
  storageClass: StorageMigrationClassSchema,
8549
8580
  fromLocationId: string(),
8550
- toLocationId: string()
8581
+ toLocationId: string(),
8582
+ freezeSource: boolean().optional()
8551
8583
  })),
8552
8584
  findings: array(StorageMigrationFindingSchema)
8553
8585
  });
@@ -8725,10 +8757,51 @@ var LedgerWalkReportSchema = object({
8725
8757
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8726
8758
  var RelocatableMediaCountInputSchema = object({
8727
8759
  toLocationId: string().min(1),
8760
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8761
+ fromLocationId: string().optional(),
8728
8762
  /** Omitted = `move`. */
8729
8763
  mode: MediaRelocateModeSchema.optional()
8730
8764
  });
8731
8765
  /**
8766
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8767
+ * ghost ledger entries on frozen footage locations.
8768
+ *
8769
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8770
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8771
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8772
+ * with no operator-visible status.
8773
+ */
8774
+ var StorageCleanupPhaseSchema = _enum([
8775
+ "orphans",
8776
+ "debug-media",
8777
+ "ghost-ledger",
8778
+ "done",
8779
+ "failed",
8780
+ "cancelled"
8781
+ ]);
8782
+ var StorageCleanupInputSchema = object({
8783
+ /** Also walk motion stills / track filmstrips. Off by default. */
8784
+ includeDebugMedia: boolean().optional() });
8785
+ var StorageCleanupJobSchema = object({
8786
+ jobId: string(),
8787
+ phase: StorageCleanupPhaseSchema,
8788
+ includeDebugMedia: boolean(),
8789
+ orphansReclaimed: number().int().nonnegative(),
8790
+ orphanBytesReclaimed: number().int().nonnegative(),
8791
+ debugMediaReclaimed: number().int().nonnegative(),
8792
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8793
+ ghostsForgotten: number().int().nonnegative(),
8794
+ ghostBytesForgotten: number().int().nonnegative(),
8795
+ /** Short operator-facing line: current collection, pass, or location. */
8796
+ detail: string().nullable(),
8797
+ cancelRequested: boolean(),
8798
+ startedAt: number(),
8799
+ updatedAt: number(),
8800
+ finishedAt: number().nullable(),
8801
+ error: string().nullable()
8802
+ });
8803
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8804
+ /**
8732
8805
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8733
8806
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8734
8807
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8756,11 +8829,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8756
8829
  * The default location for a type uses `id === <type>:default` by
8757
8830
  * convention (the bare type ref like `'backups'` resolves to it).
8758
8831
  *
8759
- * `isSystem: true` marks a location as orchestrator-seeded and
8760
- * undeletable. The bootstrap-installed defaults (one per type) carry
8761
- * this flag; operator-added locations don't. Editing the config of
8762
- * a system location is allowed (path migration, provider swap) but
8763
- * deleting it is rejected at the cap level.
8832
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8833
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8834
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8835
+ * / last-enabled, not on this bit.
8764
8836
  */
8765
8837
  var StorageLocationSchema = object({
8766
8838
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -23082,7 +23154,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
23082
23154
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
23083
23155
  kind: "mutation",
23084
23156
  auth: "admin"
23085
- });
23157
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
23158
+ kind: "mutation",
23159
+ auth: "admin"
23160
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
23161
+ kind: "mutation",
23162
+ auth: "admin"
23163
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
23086
23164
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
23087
23165
  providerId: string().min(1),
23088
23166
  displayName: string().min(1),
@@ -30249,6 +30327,33 @@ var RecordingRebalanceInputSchema = object({
30249
30327
  minMoveGb: number().min(0).optional()
30250
30328
  });
30251
30329
  /**
30330
+ * Operator-facing placement of one camera onto a recordings location.
30331
+ *
30332
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
30333
+ * Auto (the planner may move this camera). `locationId` is where high/mid
30334
+ * currently write — the plan, which may disagree with the pin when Auto.
30335
+ */
30336
+ var RecordingDevicePlacementSchema = object({
30337
+ deviceId: number().int(),
30338
+ profile: string(),
30339
+ locationId: string()
30340
+ });
30341
+ var RecordingDevicePinSchema = object({
30342
+ deviceId: number().int(),
30343
+ /** Recordings-class location this camera is pinned to. */
30344
+ locationId: string()
30345
+ });
30346
+ var RecordingPlacementViewSchema = object({
30347
+ assignments: array(RecordingDevicePlacementSchema),
30348
+ pins: array(RecordingDevicePinSchema),
30349
+ defaultLocations: record(string(), string())
30350
+ });
30351
+ var RecordingSetDevicePlacementInputSchema = object({
30352
+ deviceId: number().int(),
30353
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
30354
+ locationId: string().nullable()
30355
+ });
30356
+ /**
30252
30357
  * Result of locating footage at a wall-clock instant for one device/profile.
30253
30358
  * `segment` carries the covering segment's window; `gap` reports the forward
30254
30359
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -30474,6 +30579,12 @@ method(object({
30474
30579
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
30475
30580
  kind: "mutation",
30476
30581
  auth: "admin"
30582
+ }), method(object({}), RecordingPlacementViewSchema, {
30583
+ kind: "query",
30584
+ auth: "admin"
30585
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
30586
+ kind: "mutation",
30587
+ auth: "admin"
30477
30588
  });
30478
30589
  /**
30479
30590
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -38580,6 +38691,12 @@ Object.freeze({
38580
38691
  addonId: null,
38581
38692
  access: "view"
38582
38693
  },
38694
+ "recording.getPlacement": {
38695
+ capName: "recording",
38696
+ capScope: "system",
38697
+ addonId: null,
38698
+ access: "view"
38699
+ },
38583
38700
  "recording.getPlaybackManifest": {
38584
38701
  capName: "recording",
38585
38702
  capScope: "system",
@@ -38706,6 +38823,12 @@ Object.freeze({
38706
38823
  addonId: null,
38707
38824
  access: "create"
38708
38825
  },
38826
+ "recording.setDevicePlacement": {
38827
+ capName: "recording",
38828
+ capScope: "system",
38829
+ addonId: null,
38830
+ access: "create"
38831
+ },
38709
38832
  "recording.startStorageMigrationMove": {
38710
38833
  capName: "recording",
38711
38834
  capScope: "system",
@@ -39150,12 +39273,36 @@ Object.freeze({
39150
39273
  addonId: null,
39151
39274
  access: "create"
39152
39275
  },
39276
+ "storageMigration.cleanupCancel": {
39277
+ capName: "storage-migration",
39278
+ capScope: "system",
39279
+ addonId: null,
39280
+ access: "create"
39281
+ },
39282
+ "storageMigration.cleanupStart": {
39283
+ capName: "storage-migration",
39284
+ capScope: "system",
39285
+ addonId: null,
39286
+ access: "create"
39287
+ },
39288
+ "storageMigration.cleanupStatus": {
39289
+ capName: "storage-migration",
39290
+ capScope: "system",
39291
+ addonId: null,
39292
+ access: "view"
39293
+ },
39153
39294
  "storageMigration.drain": {
39154
39295
  capName: "storage-migration",
39155
39296
  capScope: "system",
39156
39297
  addonId: null,
39157
39298
  access: "create"
39158
39299
  },
39300
+ "storageMigration.history": {
39301
+ capName: "storage-migration",
39302
+ capScope: "system",
39303
+ addonId: null,
39304
+ access: "view"
39305
+ },
39159
39306
  "storageMigration.movers": {
39160
39307
  capName: "storage-migration",
39161
39308
  capScope: "system",
@@ -41642,6 +41789,11 @@ Object.freeze({
41642
41789
  form: "single",
41643
41790
  optional: false
41644
41791
  }],
41792
+ "recording.setDevicePlacement": [{
41793
+ name: "deviceId",
41794
+ form: "single",
41795
+ optional: false
41796
+ }],
41645
41797
  "recording.startStorageMigrationMove": [{
41646
41798
  name: "deviceId",
41647
41799
  form: "single",
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-CXY233l4.js");
5
+ const require_dist = require("../dist-CLxPUxVN.js");
6
6
  let node_fs = require("node:fs");
7
7
  node_fs = require_dist.__toESM(node_fs);
8
8
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Ct as resolvePoolMemoryPolicy, I as PoolMemoryWatchdog, _t as parseProcStatus, dt as hfModelUrl, jt as BaseAddon, ot as embeddingEncoderCapability } from "../dist-DqNo8CCq.mjs";
1
+ import { Ct as resolvePoolMemoryPolicy, I as PoolMemoryWatchdog, _t as parseProcStatus, dt as hfModelUrl, jt as BaseAddon, ot as embeddingEncoderCapability } from "../dist-D_O7oxyS.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import * as fs from "node:fs";
4
4
  import * as path$1 from "node:path";
@@ -1,6 +1,6 @@
1
1
  import { a as e, i as t, n, o as r, r as i, t as a } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare__react__loadShare__.js-C0AuF9av.mjs";
2
2
  import { t as o } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-B3Wx5J80.mjs";
3
- import { a as s, i as c, n as l, o as u, r as d, s as f, t as p } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-C8CZ3hb-.mjs";
3
+ import { a as s, i as c, n as l, o as u, r as d, s as f, t as p } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-B0wvjNmC.mjs";
4
4
  import { n as m, r as h, t as g } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-Bm-iyjmq.mjs";
5
5
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils.js
6
6
  var _ = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), v = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), y = (e) => {
@@ -18,7 +18,7 @@ var e = {
18
18
  },
19
19
  "@camstack/types": {
20
20
  name: "@camstack/types",
21
- version: "1.2.131",
21
+ version: "1.2.132",
22
22
  scope: ["default"],
23
23
  loaded: !1,
24
24
  from: "addon_pipeline_analytics_widgets",
@@ -33,7 +33,7 @@ var e = {
33
33
  },
34
34
  "@camstack/ui-library": {
35
35
  name: "@camstack/ui-library",
36
- version: "1.2.94",
36
+ version: "1.2.97",
37
37
  scope: ["default"],
38
38
  loaded: !1,
39
39
  from: "addon_pipeline_analytics_widgets",