@camstack/addon-pipeline 1.2.155 → 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.
Files changed (36) hide show
  1. package/dist/audio-analyzer/index.js +2 -2
  2. package/dist/audio-analyzer/index.mjs +2 -2
  3. package/dist/detection-pipeline/index.js +5 -5
  4. package/dist/detection-pipeline/index.mjs +4 -4
  5. package/dist/{dist-CmrtJ8RB.js → dist-bBqjZ7fo.js} +233 -7
  6. package/dist/{dist-CBRky_dz.mjs → dist-p8ruahJy.mjs} +233 -7
  7. package/dist/{lazy-sharp-BODx7w1t.js → lazy-sharp-Ct1Ow2zO.js} +1 -1
  8. package/dist/{local-frame-registry-BRG0GTmK.js → local-frame-registry-Bua7Qg7A.js} +1 -1
  9. package/dist/{local-frame-registry-ByKcWWPU.mjs → local-frame-registry-Ce3h-QcZ.mjs} +1 -1
  10. package/dist/motion-wasm/index.js +2 -2
  11. package/dist/motion-wasm/index.mjs +1 -1
  12. package/dist/{node-BSeMUwxJ.js → node-DRc0Vqkz.js} +1 -1
  13. package/dist/{node-CQzPpwIR.mjs → node-kVYpLOax.mjs} +1 -1
  14. package/dist/pipeline-runner/index.js +5 -5
  15. package/dist/pipeline-runner/index.mjs +4 -4
  16. package/dist/{process-memory-DVmHBraW.js → process-memory-B4Id9YAE.js} +1 -1
  17. package/dist/{process-memory-DQX-DbHx.mjs → process-memory-D9s145SO.mjs} +1 -1
  18. package/dist/recorder/index.js +536 -27
  19. package/dist/recorder/index.mjs +533 -29
  20. package/dist/{segment-demux-js-DmqnujVx.js → segment-demux-js-DAgunuXf.js} +1 -1
  21. package/dist/{segment-demux-js-DGX1iGLL.mjs → segment-demux-js-VrM03R0O.mjs} +1 -1
  22. package/dist/session-decode/decode-worker-child.js +2 -2
  23. package/dist/session-decode/decode-worker-child.mjs +1 -1
  24. package/dist/stream-broker/_stub.js +2 -2
  25. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-DvfM0ofY.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-B-FG8Phz.mjs} +2 -2
  26. package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-lMPlG5w5.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-OnimCf2v.mjs} +1 -1
  27. package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CSNuIp4J.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-_e_Px_mR.mjs} +1 -1
  28. package/dist/stream-broker/demux-worker-child.js +1 -1
  29. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  30. package/dist/stream-broker/{hostInit-DQGeMfoN.mjs → hostInit-DePWOWOH.mjs} +2 -2
  31. package/dist/stream-broker/index.js +3 -3
  32. package/dist/stream-broker/index.mjs +3 -3
  33. package/dist/stream-broker/remoteEntry.js +1 -1
  34. package/dist/{worker-protocol-C7jOjCsc.mjs → worker-protocol-BN0Q-eeu.mjs} +1 -1
  35. package/dist/{worker-protocol-S2nAdf6B.js → worker-protocol-CjWhvUMn.js} +1 -1
  36. package/package.json +1 -1
@@ -2,8 +2,8 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-CmrtJ8RB.js");
6
- const require_process_memory = require("../process-memory-DVmHBraW.js");
5
+ const require_dist = require("../dist-bBqjZ7fo.js");
6
+ const require_process_memory = require("../process-memory-B4Id9YAE.js");
7
7
  let node_fs = require("node:fs");
8
8
  node_fs = require_dist.__toESM(node_fs);
9
9
  let node_path = require("node:path");
@@ -1,6 +1,6 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { A as audioAnalysisCapability, It as hydrateSchema, S as PoolMemoryWatchdog, _t as resolvePoolMemoryPolicy, j as audioAnalyzerCapability, jt as BaseAddon, n as AUDIO_BACKEND_CHOICES, nt as mapAudioLabelToMacro, s as DEFAULT_AUDIO_ANALYZER_CONFIG, v as HF_BASE_URL, wt as errMsg } from "../dist-CBRky_dz.mjs";
3
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-DQX-DbHx.mjs";
2
+ import { A as audioAnalysisCapability, It as hydrateSchema, S as PoolMemoryWatchdog, _t as resolvePoolMemoryPolicy, j as audioAnalyzerCapability, jt as BaseAddon, n as AUDIO_BACKEND_CHOICES, nt as mapAudioLabelToMacro, s as DEFAULT_AUDIO_ANALYZER_CONFIG, v as HF_BASE_URL, wt as errMsg } from "../dist-p8ruahJy.mjs";
3
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-D9s145SO.mjs";
4
4
  import * as fs from "node:fs";
5
5
  import * as path$1 from "node:path";
6
6
  import { downloadFile } from "@camstack/system/addon-utils";
@@ -2,12 +2,12 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-CmrtJ8RB.js");
6
- const require_node = require("../node-BSeMUwxJ.js");
7
- const require_local_frame_registry = require("../local-frame-registry-BRG0GTmK.js");
8
- const require_lazy_sharp = require("../lazy-sharp-BODx7w1t.js");
5
+ const require_dist = require("../dist-bBqjZ7fo.js");
6
+ const require_node = require("../node-DRc0Vqkz.js");
7
+ const require_local_frame_registry = require("../local-frame-registry-Bua7Qg7A.js");
8
+ const require_lazy_sharp = require("../lazy-sharp-Ct1Ow2zO.js");
9
9
  const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-DaUBcb13.js");
10
- const require_process_memory = require("../process-memory-DVmHBraW.js");
10
+ const require_process_memory = require("../process-memory-B4Id9YAE.js");
11
11
  let node_fs = require("node:fs");
12
12
  node_fs = require_dist.__toESM(node_fs);
13
13
  let node_path = require("node:path");
@@ -1,10 +1,10 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { Bt as nodePin, Ft as createEvent, It as hydrateSchema, Kt as array, O as YAMNET_TO_MACRO, Q as inferModelProvider, Qt as object, S as PoolMemoryWatchdog, St as supportedRuntimes$1, Vt as parseJsonUnknown, W as detectionPipelineCapability, Wt as sleep, Y as evaluateZoneRules, _t as resolvePoolMemoryPolicy, at as overlayClusterStepSettings, c as DEFAULT_CLUSTER_STEP_MODELS, ct as pickClusterStepSettings, dt as pipelineExecutorCapability, en as string, et as loadContributionCapability, ht as resolveClusterStepModelId, jt as BaseAddon, l as DEFAULT_CLUSTER_STEP_SETTINGS, m as DEVICE_BACKEND_TO_FORMAT, nn as EventCategory, q as enumerateInferenceDevices, st as pickClusterStepModels, t as APPLE_SA_TO_MACRO, tn as union, wt as errMsg, yt as runtimeDevices$1, z as defaultDeviceFor$1 } from "../dist-CBRky_dz.mjs";
3
- import { a as readProcessCost } from "../node-CQzPpwIR.mjs";
4
- import { a as getDefaultModelForFormat, c as getStepDefinition, i as ALL_STEPS, l as resolveModelForFormat, o as getDefaultModelForFormatFromDef, r as ALL_PIPELINE_STEPS, s as getStep, t as localFrameRegistry, u as landmarkPrecisionVerdict } from "../local-frame-registry-ByKcWWPU.mjs";
2
+ import { Bt as nodePin, Ft as createEvent, It as hydrateSchema, Kt as array, O as YAMNET_TO_MACRO, Q as inferModelProvider, Qt as object, S as PoolMemoryWatchdog, St as supportedRuntimes$1, Vt as parseJsonUnknown, W as detectionPipelineCapability, Wt as sleep, Y as evaluateZoneRules, _t as resolvePoolMemoryPolicy, at as overlayClusterStepSettings, c as DEFAULT_CLUSTER_STEP_MODELS, ct as pickClusterStepSettings, dt as pipelineExecutorCapability, en as string, et as loadContributionCapability, ht as resolveClusterStepModelId, jt as BaseAddon, l as DEFAULT_CLUSTER_STEP_SETTINGS, m as DEVICE_BACKEND_TO_FORMAT, nn as EventCategory, q as enumerateInferenceDevices, st as pickClusterStepModels, t as APPLE_SA_TO_MACRO, tn as union, wt as errMsg, yt as runtimeDevices$1, z as defaultDeviceFor$1 } from "../dist-p8ruahJy.mjs";
3
+ import { a as readProcessCost } from "../node-kVYpLOax.mjs";
4
+ import { a as getDefaultModelForFormat, c as getStepDefinition, i as ALL_STEPS, l as resolveModelForFormat, o as getDefaultModelForFormatFromDef, r as ALL_PIPELINE_STEPS, s as getStep, t as localFrameRegistry, u as landmarkPrecisionVerdict } from "../local-frame-registry-Ce3h-QcZ.mjs";
5
5
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
6
6
  import { n as startEventLoopStallMonitor } from "../event-loop-stall-monitor-DXLNBMkY.mjs";
7
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-DQX-DbHx.mjs";
7
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-D9s145SO.mjs";
8
8
  import * as fs from "node:fs";
9
9
  import * as path$1 from "node:path";
10
10
  import { spawn } from "node:child_process";
@@ -9431,6 +9431,13 @@ var MediaRelocateModeSchema = _enum([
9431
9431
  ]);
9432
9432
  var RelocateMediaInputSchema = object({
9433
9433
  toLocationId: string(),
9434
+ /**
9435
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
9436
+ * every row that is not already on `toLocationId` (the historical
9437
+ * behaviour). A named source is what a from→to migration needs: without it
9438
+ * "move events off disk 2" also emptied disk 1.
9439
+ */
9440
+ fromLocationId: string().optional(),
9434
9441
  throttleMbps: number().min(1).max(1e3).optional(),
9435
9442
  /** Omitted = `move`, the pre-existing behaviour. */
9436
9443
  mode: MediaRelocateModeSchema.optional()
@@ -9498,6 +9505,19 @@ var StorageMigrationDestinationsSchema = object({
9498
9505
  galleryMedia: string().min(1).optional()
9499
9506
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
9500
9507
  /**
9508
+ * Optional named source per class. Omitted = the class's current default
9509
+ * (the historical behaviour). A named source that is NOT the default is a
9510
+ * drain of that disk: bytes move, the default stays, and the source is
9511
+ * disabled when the move finishes.
9512
+ */
9513
+ var StorageMigrationSourcesSchema = object({
9514
+ recordings: string().min(1).optional(),
9515
+ recordingsLow: string().min(1).optional(),
9516
+ eventMedia: string().min(1).optional(),
9517
+ backups: string().min(1).optional(),
9518
+ galleryMedia: string().min(1).optional()
9519
+ }).optional();
9520
+ /**
9501
9521
  * How a migration sequences the cutover against the byte move.
9502
9522
  *
9503
9523
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -9519,6 +9539,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
9519
9539
  /** Shared input for planning and starting an orchestrated storage migration. */
9520
9540
  var StorageMigrationInputSchema = object({
9521
9541
  destinations: StorageMigrationDestinationsSchema,
9542
+ /** Omitted = each class's current default. */
9543
+ sources: StorageMigrationSourcesSchema,
9522
9544
  throttleMbps: number().min(1).max(1e3).optional(),
9523
9545
  /** Omitted = `blocking`, which stays the default. */
9524
9546
  mode: StorageMigrationModeSchema.optional()
@@ -9598,6 +9620,13 @@ var StorageMigrationMoveSchema = object({
9598
9620
  storageClass: StorageMigrationClassSchema,
9599
9621
  fromLocationId: string(),
9600
9622
  toLocationId: string(),
9623
+ /**
9624
+ * True when `from` was NOT the class default at plan time. The move still
9625
+ * copies bytes, but the default is left alone and the source is disabled
9626
+ * once the copy verifies. Absent on jobs planned before this field existed
9627
+ * — those jobs always repointed, which is `false`.
9628
+ */
9629
+ freezeSource: boolean().optional(),
9601
9630
  moverJobId: string().nullable(),
9602
9631
  state: RelocateJobStateSchema.nullable(),
9603
9632
  error: string().nullable(),
@@ -9611,6 +9640,7 @@ var StorageMigrationJobSchema = object({
9611
9640
  * can tell a seconds-long cutover from a thirty-hour one. */
9612
9641
  mode: StorageMigrationModeSchema,
9613
9642
  destinations: StorageMigrationDestinationsSchema,
9643
+ sources: StorageMigrationSourcesSchema,
9614
9644
  throttleMbps: number(),
9615
9645
  moves: array(StorageMigrationMoveSchema),
9616
9646
  pauseLeaseId: string().nullable(),
@@ -9636,6 +9666,7 @@ var StorageMigrationFindingSchema = object({
9636
9666
  });
9637
9667
  var StorageMigrationPlanSchema = object({
9638
9668
  destinations: StorageMigrationDestinationsSchema,
9669
+ sources: StorageMigrationSourcesSchema,
9639
9670
  /** The mode this plan was built for. A plan is only valid for its mode: the
9640
9671
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
9641
9672
  * it. */
@@ -9643,7 +9674,8 @@ var StorageMigrationPlanSchema = object({
9643
9674
  moves: array(object({
9644
9675
  storageClass: StorageMigrationClassSchema,
9645
9676
  fromLocationId: string(),
9646
- toLocationId: string()
9677
+ toLocationId: string(),
9678
+ freezeSource: boolean().optional()
9647
9679
  })),
9648
9680
  findings: array(StorageMigrationFindingSchema)
9649
9681
  });
@@ -9821,10 +9853,51 @@ var LedgerWalkReportSchema = object({
9821
9853
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
9822
9854
  var RelocatableMediaCountInputSchema = object({
9823
9855
  toLocationId: string().min(1),
9856
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
9857
+ fromLocationId: string().optional(),
9824
9858
  /** Omitted = `move`. */
9825
9859
  mode: MediaRelocateModeSchema.optional()
9826
9860
  });
9827
9861
  /**
9862
+ * Operator cleanup of leftover analytics rows, optional debug media, and
9863
+ * ghost ledger entries on frozen footage locations.
9864
+ *
9865
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
9866
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
9867
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
9868
+ * with no operator-visible status.
9869
+ */
9870
+ var StorageCleanupPhaseSchema = _enum([
9871
+ "orphans",
9872
+ "debug-media",
9873
+ "ghost-ledger",
9874
+ "done",
9875
+ "failed",
9876
+ "cancelled"
9877
+ ]);
9878
+ var StorageCleanupInputSchema = object({
9879
+ /** Also walk motion stills / track filmstrips. Off by default. */
9880
+ includeDebugMedia: boolean().optional() });
9881
+ var StorageCleanupJobSchema = object({
9882
+ jobId: string(),
9883
+ phase: StorageCleanupPhaseSchema,
9884
+ includeDebugMedia: boolean(),
9885
+ orphansReclaimed: number().int().nonnegative(),
9886
+ orphanBytesReclaimed: number().int().nonnegative(),
9887
+ debugMediaReclaimed: number().int().nonnegative(),
9888
+ debugMediaBytesReclaimed: number().int().nonnegative(),
9889
+ ghostsForgotten: number().int().nonnegative(),
9890
+ ghostBytesForgotten: number().int().nonnegative(),
9891
+ /** Short operator-facing line: current collection, pass, or location. */
9892
+ detail: string().nullable(),
9893
+ cancelRequested: boolean(),
9894
+ startedAt: number(),
9895
+ updatedAt: number(),
9896
+ finishedAt: number().nullable(),
9897
+ error: string().nullable()
9898
+ });
9899
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
9900
+ /**
9828
9901
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
9829
9902
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
9830
9903
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -9852,11 +9925,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
9852
9925
  * The default location for a type uses `id === <type>:default` by
9853
9926
  * convention (the bare type ref like `'backups'` resolves to it).
9854
9927
  *
9855
- * `isSystem: true` marks a location as orchestrator-seeded and
9856
- * undeletable. The bootstrap-installed defaults (one per type) carry
9857
- * this flag; operator-added locations don't. Editing the config of
9858
- * a system location is allowed (path migration, provider swap) but
9859
- * deleting it is rejected at the cap level.
9928
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
9929
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
9930
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
9931
+ * / last-enabled, not on this bit.
9860
9932
  */
9861
9933
  var StorageLocationSchema = object({
9862
9934
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -21525,6 +21597,47 @@ var RebuildStatusSchema = object({
21525
21597
  /** Present when the pass ended by throwing. */
21526
21598
  error: string().nullable()
21527
21599
  });
21600
+ /**
21601
+ * Acknowledgement that a debug-media reclaim STARTED.
21602
+ *
21603
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
21604
+ * it runs detached and this returns immediately. Awaiting it is how the
21605
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
21606
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
21607
+ */
21608
+ var MediaReclaimStartResultSchema = object({
21609
+ started: boolean(),
21610
+ /** True when a pass was already running; the new request is ignored. */
21611
+ alreadyRunning: boolean()
21612
+ });
21613
+ var MediaReclaimInputSchema = object({
21614
+ mode: _enum(["report", "reclaim"]).default("report"),
21615
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
21616
+ deviceIds: array(number().int()).min(1).optional(),
21617
+ restart: boolean().optional(),
21618
+ pageSize: number().int().min(50).max(5e3).optional(),
21619
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
21620
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
21621
+ maxBytesPerRun: number().int().min(1).optional(),
21622
+ budgetMinutes: number().int().min(1).max(720).optional(),
21623
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
21624
+ graceMinutes: number().int().min(1).max(10080).optional()
21625
+ });
21626
+ var MediaReclaimStatusSchema = object({
21627
+ running: boolean(),
21628
+ mode: _enum(["report", "reclaim"]).nullable(),
21629
+ totalExamined: number(),
21630
+ totalEligible: number(),
21631
+ totalReclaimed: number(),
21632
+ totalBytesReclaimed: number(),
21633
+ totalRefused: number(),
21634
+ /** Device+scope windows finished in this pass. */
21635
+ devicesDone: number(),
21636
+ complete: boolean().nullable(),
21637
+ startedAtMs: number().nullable(),
21638
+ finishedAtMs: number().nullable(),
21639
+ error: string().nullable()
21640
+ });
21528
21641
  var ReplayFrameInputSchema = object({
21529
21642
  timestamp: number(),
21530
21643
  frame: PipelineRunResultBridge
@@ -21666,6 +21779,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21666
21779
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
21667
21780
  kind: "query",
21668
21781
  auth: "admin"
21782
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
21783
+ kind: "mutation",
21784
+ auth: "admin"
21785
+ }), method(object({}), MediaReclaimStatusSchema, {
21786
+ kind: "query",
21787
+ auth: "admin"
21669
21788
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
21670
21789
  kind: "query",
21671
21790
  auth: "admin"
@@ -23800,7 +23919,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
23800
23919
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
23801
23920
  kind: "mutation",
23802
23921
  auth: "admin"
23803
- });
23922
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
23923
+ kind: "mutation",
23924
+ auth: "admin"
23925
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
23926
+ kind: "mutation",
23927
+ auth: "admin"
23928
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
23804
23929
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
23805
23930
  providerId: string().min(1),
23806
23931
  displayName: string().min(1),
@@ -29325,6 +29450,33 @@ var RecordingRebalanceInputSchema = object({
29325
29450
  minMoveGb: number().min(0).optional()
29326
29451
  });
29327
29452
  /**
29453
+ * Operator-facing placement of one camera onto a recordings location.
29454
+ *
29455
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
29456
+ * Auto (the planner may move this camera). `locationId` is where high/mid
29457
+ * currently write — the plan, which may disagree with the pin when Auto.
29458
+ */
29459
+ var RecordingDevicePlacementSchema = object({
29460
+ deviceId: number().int(),
29461
+ profile: string(),
29462
+ locationId: string()
29463
+ });
29464
+ var RecordingDevicePinSchema = object({
29465
+ deviceId: number().int(),
29466
+ /** Recordings-class location this camera is pinned to. */
29467
+ locationId: string()
29468
+ });
29469
+ var RecordingPlacementViewSchema = object({
29470
+ assignments: array(RecordingDevicePlacementSchema),
29471
+ pins: array(RecordingDevicePinSchema),
29472
+ defaultLocations: record(string(), string())
29473
+ });
29474
+ var RecordingSetDevicePlacementInputSchema = object({
29475
+ deviceId: number().int(),
29476
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
29477
+ locationId: string().nullable()
29478
+ });
29479
+ /**
29328
29480
  * Result of locating footage at a wall-clock instant for one device/profile.
29329
29481
  * `segment` carries the covering segment's window; `gap` reports the forward
29330
29482
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -29677,6 +29829,22 @@ var recordingCapability = {
29677
29829
  startStorageRebalance: method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
29678
29830
  kind: "mutation",
29679
29831
  auth: "admin"
29832
+ }),
29833
+ /**
29834
+ * The placement plan in force plus operator pins. Drives the Locations
29835
+ * admin page: Auto vs a named recordings location, per camera.
29836
+ */
29837
+ getPlacement: method(object({}), RecordingPlacementViewSchema, {
29838
+ kind: "query",
29839
+ auth: "admin"
29840
+ }),
29841
+ /**
29842
+ * Pin a camera to a recordings location, or clear the pin (Auto). High and
29843
+ * mid follow the pin; low stays with the recordingsLow planner.
29844
+ */
29845
+ setDevicePlacement: method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29846
+ kind: "mutation",
29847
+ auth: "admin"
29680
29848
  })
29681
29849
  }
29682
29850
  };
@@ -34973,6 +35141,12 @@ Object.freeze({
34973
35141
  addonId: null,
34974
35142
  access: "view"
34975
35143
  },
35144
+ "pipelineAnalytics.getMediaReclaimStatus": {
35145
+ capName: "pipeline-analytics",
35146
+ capScope: "device",
35147
+ addonId: null,
35148
+ access: "view"
35149
+ },
34976
35150
  "pipelineAnalytics.getMotionEvents": {
34977
35151
  capName: "pipeline-analytics",
34978
35152
  capScope: "device",
@@ -35147,6 +35321,12 @@ Object.freeze({
35147
35321
  addonId: null,
35148
35322
  access: "create"
35149
35323
  },
35324
+ "pipelineAnalytics.reclaimDebugMedia": {
35325
+ capName: "pipeline-analytics",
35326
+ capScope: "device",
35327
+ addonId: null,
35328
+ access: "create"
35329
+ },
35150
35330
  "pipelineAnalytics.reconcileFromDisk": {
35151
35331
  capName: "pipeline-analytics",
35152
35332
  capScope: "device",
@@ -36071,6 +36251,12 @@ Object.freeze({
36071
36251
  addonId: null,
36072
36252
  access: "view"
36073
36253
  },
36254
+ "recording.getPlacement": {
36255
+ capName: "recording",
36256
+ capScope: "system",
36257
+ addonId: null,
36258
+ access: "view"
36259
+ },
36074
36260
  "recording.getPlaybackManifest": {
36075
36261
  capName: "recording",
36076
36262
  capScope: "system",
@@ -36197,6 +36383,12 @@ Object.freeze({
36197
36383
  addonId: null,
36198
36384
  access: "create"
36199
36385
  },
36386
+ "recording.setDevicePlacement": {
36387
+ capName: "recording",
36388
+ capScope: "system",
36389
+ addonId: null,
36390
+ access: "create"
36391
+ },
36200
36392
  "recording.startStorageMigrationMove": {
36201
36393
  capName: "recording",
36202
36394
  capScope: "system",
@@ -36641,12 +36833,36 @@ Object.freeze({
36641
36833
  addonId: null,
36642
36834
  access: "create"
36643
36835
  },
36836
+ "storageMigration.cleanupCancel": {
36837
+ capName: "storage-migration",
36838
+ capScope: "system",
36839
+ addonId: null,
36840
+ access: "create"
36841
+ },
36842
+ "storageMigration.cleanupStart": {
36843
+ capName: "storage-migration",
36844
+ capScope: "system",
36845
+ addonId: null,
36846
+ access: "create"
36847
+ },
36848
+ "storageMigration.cleanupStatus": {
36849
+ capName: "storage-migration",
36850
+ capScope: "system",
36851
+ addonId: null,
36852
+ access: "view"
36853
+ },
36644
36854
  "storageMigration.drain": {
36645
36855
  capName: "storage-migration",
36646
36856
  capScope: "system",
36647
36857
  addonId: null,
36648
36858
  access: "create"
36649
36859
  },
36860
+ "storageMigration.history": {
36861
+ capName: "storage-migration",
36862
+ capScope: "system",
36863
+ addonId: null,
36864
+ access: "view"
36865
+ },
36650
36866
  "storageMigration.movers": {
36651
36867
  capName: "storage-migration",
36652
36868
  capScope: "system",
@@ -38763,6 +38979,11 @@ Object.freeze({
38763
38979
  form: "single",
38764
38980
  optional: true
38765
38981
  }],
38982
+ "pipelineAnalytics.reclaimDebugMedia": [{
38983
+ name: "deviceIds",
38984
+ form: "array",
38985
+ optional: true
38986
+ }],
38766
38987
  "pipelineAnalytics.reconcileFromDisk": [{
38767
38988
  name: "deviceId",
38768
38989
  form: "single",
@@ -39128,6 +39349,11 @@ Object.freeze({
39128
39349
  form: "single",
39129
39350
  optional: false
39130
39351
  }],
39352
+ "recording.setDevicePlacement": [{
39353
+ name: "deviceId",
39354
+ form: "single",
39355
+ optional: false
39356
+ }],
39131
39357
  "recording.startStorageMigrationMove": [{
39132
39358
  name: "deviceId",
39133
39359
  form: "single",