@camstack/addon-osd-manager 0.1.42 → 0.1.43

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 (17) hide show
  1. package/dist/{MotionZonesSettings-CdyvFlWR.mjs → MotionZonesSettings-ByZQuMlB.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-CUfurhy1.mjs → PrivacyMaskSettings-1NYFcVP6.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-E_PU8Px7.mjs → SceneMonitorEditor-DYvMXsWV.mjs} +3 -3
  4. package/dist/_stub.js +10 -10
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-BmuIjiOx.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-DY3AcYMO.mjs} +3 -3
  6. package/dist/{_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BI_yNGG4.mjs → _virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B50VOT0N.mjs} +1 -1
  7. package/dist/{hostInit-Bf1t6pHC.mjs → hostInit-C3-qQFzl.mjs} +2 -2
  8. package/dist/index.js +251 -7
  9. package/dist/index.mjs +251 -7
  10. package/dist/{player-overlays-9-h959au.mjs → player-overlays-D6utOkrV.mjs} +1 -1
  11. package/dist/remoteEntry.js +1 -1
  12. package/dist/{responsive-DuPMoboD.mjs → responsive-C3oms3c6.mjs} +1 -1
  13. package/dist/{square-CbixHwGb.mjs → square-DVaU5ocy.mjs} +1 -1
  14. package/dist/{trash-2---I9LVPc.mjs → trash-2-CLc1DhEB.mjs} +1 -1
  15. package/dist/{use-device-snapshot-DtmjvvAg.mjs → use-device-snapshot-oIHpD07U.mjs} +1 -1
  16. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-B5mIR9KJ.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-Cfa0UZmk.mjs} +1 -1
  17. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -8195,6 +8195,13 @@ var MediaRelocateModeSchema = _enum([
8195
8195
  ]);
8196
8196
  var RelocateMediaInputSchema = object({
8197
8197
  toLocationId: string(),
8198
+ /**
8199
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8200
+ * every row that is not already on `toLocationId` (the historical
8201
+ * behaviour). A named source is what a from→to migration needs: without it
8202
+ * "move events off disk 2" also emptied disk 1.
8203
+ */
8204
+ fromLocationId: string().optional(),
8198
8205
  throttleMbps: number().min(1).max(1e3).optional(),
8199
8206
  /** Omitted = `move`, the pre-existing behaviour. */
8200
8207
  mode: MediaRelocateModeSchema.optional()
@@ -8262,6 +8269,19 @@ var StorageMigrationDestinationsSchema = object({
8262
8269
  galleryMedia: string().min(1).optional()
8263
8270
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8264
8271
  /**
8272
+ * Optional named source per class. Omitted = the class's current default
8273
+ * (the historical behaviour). A named source that is NOT the default is a
8274
+ * drain of that disk: bytes move, the default stays, and the source is
8275
+ * disabled when the move finishes.
8276
+ */
8277
+ var StorageMigrationSourcesSchema = object({
8278
+ recordings: string().min(1).optional(),
8279
+ recordingsLow: string().min(1).optional(),
8280
+ eventMedia: string().min(1).optional(),
8281
+ backups: string().min(1).optional(),
8282
+ galleryMedia: string().min(1).optional()
8283
+ }).optional();
8284
+ /**
8265
8285
  * How a migration sequences the cutover against the byte move.
8266
8286
  *
8267
8287
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8283,6 +8303,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8283
8303
  /** Shared input for planning and starting an orchestrated storage migration. */
8284
8304
  var StorageMigrationInputSchema = object({
8285
8305
  destinations: StorageMigrationDestinationsSchema,
8306
+ /** Omitted = each class's current default. */
8307
+ sources: StorageMigrationSourcesSchema,
8286
8308
  throttleMbps: number().min(1).max(1e3).optional(),
8287
8309
  /** Omitted = `blocking`, which stays the default. */
8288
8310
  mode: StorageMigrationModeSchema.optional()
@@ -8362,6 +8384,13 @@ var StorageMigrationMoveSchema = object({
8362
8384
  storageClass: StorageMigrationClassSchema,
8363
8385
  fromLocationId: string(),
8364
8386
  toLocationId: string(),
8387
+ /**
8388
+ * True when `from` was NOT the class default at plan time. The move still
8389
+ * copies bytes, but the default is left alone and the source is disabled
8390
+ * once the copy verifies. Absent on jobs planned before this field existed
8391
+ * — those jobs always repointed, which is `false`.
8392
+ */
8393
+ freezeSource: boolean().optional(),
8365
8394
  moverJobId: string().nullable(),
8366
8395
  state: RelocateJobStateSchema.nullable(),
8367
8396
  error: string().nullable(),
@@ -8375,6 +8404,7 @@ var StorageMigrationJobSchema = object({
8375
8404
  * can tell a seconds-long cutover from a thirty-hour one. */
8376
8405
  mode: StorageMigrationModeSchema,
8377
8406
  destinations: StorageMigrationDestinationsSchema,
8407
+ sources: StorageMigrationSourcesSchema,
8378
8408
  throttleMbps: number(),
8379
8409
  moves: array(StorageMigrationMoveSchema),
8380
8410
  pauseLeaseId: string().nullable(),
@@ -8400,6 +8430,7 @@ var StorageMigrationFindingSchema = object({
8400
8430
  });
8401
8431
  var StorageMigrationPlanSchema = object({
8402
8432
  destinations: StorageMigrationDestinationsSchema,
8433
+ sources: StorageMigrationSourcesSchema,
8403
8434
  /** The mode this plan was built for. A plan is only valid for its mode: the
8404
8435
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8405
8436
  * it. */
@@ -8407,7 +8438,8 @@ var StorageMigrationPlanSchema = object({
8407
8438
  moves: array(object({
8408
8439
  storageClass: StorageMigrationClassSchema,
8409
8440
  fromLocationId: string(),
8410
- toLocationId: string()
8441
+ toLocationId: string(),
8442
+ freezeSource: boolean().optional()
8411
8443
  })),
8412
8444
  findings: array(StorageMigrationFindingSchema)
8413
8445
  });
@@ -8585,10 +8617,51 @@ var LedgerWalkReportSchema = object({
8585
8617
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8586
8618
  var RelocatableMediaCountInputSchema = object({
8587
8619
  toLocationId: string().min(1),
8620
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8621
+ fromLocationId: string().optional(),
8588
8622
  /** Omitted = `move`. */
8589
8623
  mode: MediaRelocateModeSchema.optional()
8590
8624
  });
8591
8625
  /**
8626
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8627
+ * ghost ledger entries on frozen footage locations.
8628
+ *
8629
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8630
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8631
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8632
+ * with no operator-visible status.
8633
+ */
8634
+ var StorageCleanupPhaseSchema = _enum([
8635
+ "orphans",
8636
+ "debug-media",
8637
+ "ghost-ledger",
8638
+ "done",
8639
+ "failed",
8640
+ "cancelled"
8641
+ ]);
8642
+ var StorageCleanupInputSchema = object({
8643
+ /** Also walk motion stills / track filmstrips. Off by default. */
8644
+ includeDebugMedia: boolean().optional() });
8645
+ var StorageCleanupJobSchema = object({
8646
+ jobId: string(),
8647
+ phase: StorageCleanupPhaseSchema,
8648
+ includeDebugMedia: boolean(),
8649
+ orphansReclaimed: number().int().nonnegative(),
8650
+ orphanBytesReclaimed: number().int().nonnegative(),
8651
+ debugMediaReclaimed: number().int().nonnegative(),
8652
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8653
+ ghostsForgotten: number().int().nonnegative(),
8654
+ ghostBytesForgotten: number().int().nonnegative(),
8655
+ /** Short operator-facing line: current collection, pass, or location. */
8656
+ detail: string().nullable(),
8657
+ cancelRequested: boolean(),
8658
+ startedAt: number(),
8659
+ updatedAt: number(),
8660
+ finishedAt: number().nullable(),
8661
+ error: string().nullable()
8662
+ });
8663
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8664
+ /**
8592
8665
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8593
8666
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8594
8667
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8616,11 +8689,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8616
8689
  * The default location for a type uses `id === <type>:default` by
8617
8690
  * convention (the bare type ref like `'backups'` resolves to it).
8618
8691
  *
8619
- * `isSystem: true` marks a location as orchestrator-seeded and
8620
- * undeletable. The bootstrap-installed defaults (one per type) carry
8621
- * this flag; operator-added locations don't. Editing the config of
8622
- * a system location is allowed (path migration, provider swap) but
8623
- * deleting it is rejected at the cap level.
8692
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8693
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8694
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8695
+ * / last-enabled, not on this bit.
8624
8696
  */
8625
8697
  var StorageLocationSchema = object({
8626
8698
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -21990,6 +22062,47 @@ var RebuildStatusSchema = object({
21990
22062
  /** Present when the pass ended by throwing. */
21991
22063
  error: string().nullable()
21992
22064
  });
22065
+ /**
22066
+ * Acknowledgement that a debug-media reclaim STARTED.
22067
+ *
22068
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
22069
+ * it runs detached and this returns immediately. Awaiting it is how the
22070
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
22071
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
22072
+ */
22073
+ var MediaReclaimStartResultSchema = object({
22074
+ started: boolean(),
22075
+ /** True when a pass was already running; the new request is ignored. */
22076
+ alreadyRunning: boolean()
22077
+ });
22078
+ var MediaReclaimInputSchema = object({
22079
+ mode: _enum(["report", "reclaim"]).default("report"),
22080
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
22081
+ deviceIds: array(number().int()).min(1).optional(),
22082
+ restart: boolean().optional(),
22083
+ pageSize: number().int().min(50).max(5e3).optional(),
22084
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
22085
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
22086
+ maxBytesPerRun: number().int().min(1).optional(),
22087
+ budgetMinutes: number().int().min(1).max(720).optional(),
22088
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
22089
+ graceMinutes: number().int().min(1).max(10080).optional()
22090
+ });
22091
+ var MediaReclaimStatusSchema = object({
22092
+ running: boolean(),
22093
+ mode: _enum(["report", "reclaim"]).nullable(),
22094
+ totalExamined: number(),
22095
+ totalEligible: number(),
22096
+ totalReclaimed: number(),
22097
+ totalBytesReclaimed: number(),
22098
+ totalRefused: number(),
22099
+ /** Device+scope windows finished in this pass. */
22100
+ devicesDone: number(),
22101
+ complete: boolean().nullable(),
22102
+ startedAtMs: number().nullable(),
22103
+ finishedAtMs: number().nullable(),
22104
+ error: string().nullable()
22105
+ });
21993
22106
  var ReplayFrameInputSchema = object({
21994
22107
  timestamp: number(),
21995
22108
  frame: PipelineRunResultBridge
@@ -22412,6 +22525,20 @@ var pipelineAnalyticsCapability = {
22412
22525
  auth: "admin"
22413
22526
  }),
22414
22527
  /**
22528
+ * Reclaim the standing debug-media backlog (motion-visit stills + track
22529
+ * filmstrips). DETACHED: returns `{ started }` immediately. The pass is
22530
+ * tens of minutes; awaiting it is a timeout, not a verdict. Dry-run unless
22531
+ * `mode: 'reclaim'`. Poll `getMediaReclaimStatus`.
22532
+ */
22533
+ reclaimDebugMedia: method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
22534
+ kind: "mutation",
22535
+ auth: "admin"
22536
+ }),
22537
+ getMediaReclaimStatus: method(object({}), MediaReclaimStatusSchema, {
22538
+ kind: "query",
22539
+ auth: "admin"
22540
+ }),
22541
+ /**
22415
22542
  * The CHEAP QUESTION, asked before any media moves: how big is the dataset
22416
22543
  * the marked (`markForTrain`) tracks would produce?
22417
22544
  *
@@ -25364,7 +25491,23 @@ var storageMigrationCapability = {
25364
25491
  drain: method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
25365
25492
  kind: "mutation",
25366
25493
  auth: "admin"
25367
- })
25494
+ }),
25495
+ /**
25496
+ * One operator cleanup of leftover analytics (DB + blobs) and ghost
25497
+ * ledger rows on frozen footage locations. Optional debug-media sweep.
25498
+ * Returns immediately; poll {@link cleanupStatus}.
25499
+ */
25500
+ cleanupStart: method(StorageCleanupInputSchema, object({ jobId: string() }), {
25501
+ kind: "mutation",
25502
+ auth: "admin"
25503
+ }),
25504
+ cleanupStatus: method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }),
25505
+ cleanupCancel: method(object({ jobId: string() }), object({ cancelled: boolean() }), {
25506
+ kind: "mutation",
25507
+ auth: "admin"
25508
+ }),
25509
+ /** Recent finished migration jobs, newest first. The live job is `status`. */
25510
+ history: method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" })
25368
25511
  }
25369
25512
  };
25370
25513
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
@@ -33517,6 +33660,33 @@ var RecordingRebalanceInputSchema = object({
33517
33660
  minMoveGb: number().min(0).optional()
33518
33661
  });
33519
33662
  /**
33663
+ * Operator-facing placement of one camera onto a recordings location.
33664
+ *
33665
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
33666
+ * Auto (the planner may move this camera). `locationId` is where high/mid
33667
+ * currently write — the plan, which may disagree with the pin when Auto.
33668
+ */
33669
+ var RecordingDevicePlacementSchema = object({
33670
+ deviceId: number().int(),
33671
+ profile: string(),
33672
+ locationId: string()
33673
+ });
33674
+ var RecordingDevicePinSchema = object({
33675
+ deviceId: number().int(),
33676
+ /** Recordings-class location this camera is pinned to. */
33677
+ locationId: string()
33678
+ });
33679
+ var RecordingPlacementViewSchema = object({
33680
+ assignments: array(RecordingDevicePlacementSchema),
33681
+ pins: array(RecordingDevicePinSchema),
33682
+ defaultLocations: record(string(), string())
33683
+ });
33684
+ var RecordingSetDevicePlacementInputSchema = object({
33685
+ deviceId: number().int(),
33686
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
33687
+ locationId: string().nullable()
33688
+ });
33689
+ /**
33520
33690
  * Result of locating footage at a wall-clock instant for one device/profile.
33521
33691
  * `segment` carries the covering segment's window; `gap` reports the forward
33522
33692
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -33869,6 +34039,22 @@ var recordingCapability = {
33869
34039
  startStorageRebalance: method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
33870
34040
  kind: "mutation",
33871
34041
  auth: "admin"
34042
+ }),
34043
+ /**
34044
+ * The placement plan in force plus operator pins. Drives the Locations
34045
+ * admin page: Auto vs a named recordings location, per camera.
34046
+ */
34047
+ getPlacement: method(object({}), RecordingPlacementViewSchema, {
34048
+ kind: "query",
34049
+ auth: "admin"
34050
+ }),
34051
+ /**
34052
+ * Pin a camera to a recordings location, or clear the pin (Auto). High and
34053
+ * mid follow the pin; low stays with the recordingsLow planner.
34054
+ */
34055
+ setDevicePlacement: method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
34056
+ kind: "mutation",
34057
+ auth: "admin"
33872
34058
  })
33873
34059
  }
33874
34060
  };
@@ -40017,6 +40203,12 @@ Object.freeze({
40017
40203
  addonId: null,
40018
40204
  access: "view"
40019
40205
  },
40206
+ "pipelineAnalytics.getMediaReclaimStatus": {
40207
+ capName: "pipeline-analytics",
40208
+ capScope: "device",
40209
+ addonId: null,
40210
+ access: "view"
40211
+ },
40020
40212
  "pipelineAnalytics.getMotionEvents": {
40021
40213
  capName: "pipeline-analytics",
40022
40214
  capScope: "device",
@@ -40191,6 +40383,12 @@ Object.freeze({
40191
40383
  addonId: null,
40192
40384
  access: "create"
40193
40385
  },
40386
+ "pipelineAnalytics.reclaimDebugMedia": {
40387
+ capName: "pipeline-analytics",
40388
+ capScope: "device",
40389
+ addonId: null,
40390
+ access: "create"
40391
+ },
40194
40392
  "pipelineAnalytics.reconcileFromDisk": {
40195
40393
  capName: "pipeline-analytics",
40196
40394
  capScope: "device",
@@ -41115,6 +41313,12 @@ Object.freeze({
41115
41313
  addonId: null,
41116
41314
  access: "view"
41117
41315
  },
41316
+ "recording.getPlacement": {
41317
+ capName: "recording",
41318
+ capScope: "system",
41319
+ addonId: null,
41320
+ access: "view"
41321
+ },
41118
41322
  "recording.getPlaybackManifest": {
41119
41323
  capName: "recording",
41120
41324
  capScope: "system",
@@ -41241,6 +41445,12 @@ Object.freeze({
41241
41445
  addonId: null,
41242
41446
  access: "create"
41243
41447
  },
41448
+ "recording.setDevicePlacement": {
41449
+ capName: "recording",
41450
+ capScope: "system",
41451
+ addonId: null,
41452
+ access: "create"
41453
+ },
41244
41454
  "recording.startStorageMigrationMove": {
41245
41455
  capName: "recording",
41246
41456
  capScope: "system",
@@ -41685,12 +41895,36 @@ Object.freeze({
41685
41895
  addonId: null,
41686
41896
  access: "create"
41687
41897
  },
41898
+ "storageMigration.cleanupCancel": {
41899
+ capName: "storage-migration",
41900
+ capScope: "system",
41901
+ addonId: null,
41902
+ access: "create"
41903
+ },
41904
+ "storageMigration.cleanupStart": {
41905
+ capName: "storage-migration",
41906
+ capScope: "system",
41907
+ addonId: null,
41908
+ access: "create"
41909
+ },
41910
+ "storageMigration.cleanupStatus": {
41911
+ capName: "storage-migration",
41912
+ capScope: "system",
41913
+ addonId: null,
41914
+ access: "view"
41915
+ },
41688
41916
  "storageMigration.drain": {
41689
41917
  capName: "storage-migration",
41690
41918
  capScope: "system",
41691
41919
  addonId: null,
41692
41920
  access: "create"
41693
41921
  },
41922
+ "storageMigration.history": {
41923
+ capName: "storage-migration",
41924
+ capScope: "system",
41925
+ addonId: null,
41926
+ access: "view"
41927
+ },
41694
41928
  "storageMigration.movers": {
41695
41929
  capName: "storage-migration",
41696
41930
  capScope: "system",
@@ -43807,6 +44041,11 @@ Object.freeze({
43807
44041
  form: "single",
43808
44042
  optional: true
43809
44043
  }],
44044
+ "pipelineAnalytics.reclaimDebugMedia": [{
44045
+ name: "deviceIds",
44046
+ form: "array",
44047
+ optional: true
44048
+ }],
43810
44049
  "pipelineAnalytics.reconcileFromDisk": [{
43811
44050
  name: "deviceId",
43812
44051
  form: "single",
@@ -44172,6 +44411,11 @@ Object.freeze({
44172
44411
  form: "single",
44173
44412
  optional: false
44174
44413
  }],
44414
+ "recording.setDevicePlacement": [{
44415
+ name: "deviceId",
44416
+ form: "single",
44417
+ optional: false
44418
+ }],
44175
44419
  "recording.startStorageMigrationMove": [{
44176
44420
  name: "deviceId",
44177
44421
  form: "single",