@camstack/addon-pipeline 1.2.146 → 1.2.148

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 (37) 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 +8 -6
  4. package/dist/detection-pipeline/index.mjs +7 -5
  5. package/dist/{dist-DML3mpn9.js → dist-DLy_uz82.js} +121 -13
  6. package/dist/{dist-cZopp8Xm.mjs → dist-DjplinYP.mjs} +121 -13
  7. package/dist/{lazy-sharp-BzXIjfN8.js → lazy-sharp-BI4LsfMM.js} +1 -1
  8. package/dist/{local-frame-registry-Ctv_TzmF.mjs → local-frame-registry-77FL9ua_.mjs} +1 -1
  9. package/dist/{local-frame-registry-DO8-LuSo.js → local-frame-registry-Dr_U_xCG.js} +1 -1
  10. package/dist/motion-wasm/index.js +2 -2
  11. package/dist/motion-wasm/index.mjs +1 -1
  12. package/dist/{node-OvVqe9eh.js → node-BHFLhfkh.js} +1 -1
  13. package/dist/{node-Br6p9KvD.mjs → node-D7uxWSXD.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-DX25Z60Q.mjs → process-memory-B2tApNua.mjs} +1 -1
  17. package/dist/{process-memory-NWKrKfmi.js → process-memory-M8WiR3qj.js} +1 -1
  18. package/dist/recorder/index.js +619 -381
  19. package/dist/recorder/index.mjs +619 -381
  20. package/dist/{segment-demux-js-DGmFQ1Zj.mjs → segment-demux-js-3niBZUpJ.mjs} +1 -1
  21. package/dist/{segment-demux-js-CerfMroc.js → segment-demux-js-Cc_If7C_.js} +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-DQNgiTjz.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-QfvsYvjB.mjs} +3 -3
  26. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DXrU11Bz.mjs +26 -0
  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-bjYJYwAq.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CgIcw5Wl.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-NShcJE25.mjs → hostInit-Dd2CEvDK.mjs} +3 -3
  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-CUCQ1IPR.mjs → worker-protocol-Cvln9GmS.mjs} +1 -1
  35. package/dist/{worker-protocol-Dt3zWCQY.js → worker-protocol-basMNc_q.js} +1 -1
  36. package/package.json +1 -1
  37. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D4-thZGg.mjs +0 -26
@@ -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-DML3mpn9.js");
6
- const require_process_memory = require("../process-memory-NWKrKfmi.js");
5
+ const require_dist = require("../dist-DLy_uz82.js");
6
+ const require_process_memory = require("../process-memory-M8WiR3qj.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-cZopp8Xm.mjs";
3
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-DX25Z60Q.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-DjplinYP.mjs";
3
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-B2tApNua.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-DML3mpn9.js");
6
- const require_node = require("../node-OvVqe9eh.js");
7
- const require_local_frame_registry = require("../local-frame-registry-DO8-LuSo.js");
8
- const require_lazy_sharp = require("../lazy-sharp-BzXIjfN8.js");
5
+ const require_dist = require("../dist-DLy_uz82.js");
6
+ const require_node = require("../node-BHFLhfkh.js");
7
+ const require_local_frame_registry = require("../local-frame-registry-Dr_U_xCG.js");
8
+ const require_lazy_sharp = require("../lazy-sharp-BI4LsfMM.js");
9
9
  const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-DaUBcb13.js");
10
- const require_process_memory = require("../process-memory-NWKrKfmi.js");
10
+ const require_process_memory = require("../process-memory-M8WiR3qj.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");
@@ -7496,8 +7496,11 @@ var DetectionPipelineProvider = class DetectionPipelineProvider {
7496
7496
  await this.clusterModels.refresh(this.addonCtx?.api);
7497
7497
  const nodeId = this.addonCtx?.kernel?.localNodeId ?? "hub";
7498
7498
  const sessionId = input.sessionId ?? `run-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
7499
+ const isRuntime = Boolean(input.frame || input.frameRef);
7500
+ const progressToBus = !isRuntime || input.sessionId !== void 0;
7499
7501
  const emit = (message, extra) => {
7500
7502
  onProgress?.(message);
7503
+ if (!progressToBus) return;
7501
7504
  this.eventBus?.emit(require_dist.createEvent(require_dist.EventCategory.PipelineProgress, {
7502
7505
  type: "pipeline",
7503
7506
  id: "pipeline-test"
@@ -7753,7 +7756,6 @@ var DetectionPipelineProvider = class DetectionPipelineProvider {
7753
7756
  emit("Running inference...");
7754
7757
  const tree = buildExecutableTree(benchmarkSteps, (stepId) => dispatchFactory.getEngine(stepId), this.customModelResolver);
7755
7758
  setupMs = performance.now() - wallT0 - decodeMs;
7756
- const isRuntime = Boolean(runtimeFrame || runtimeFrameRef);
7757
7759
  const effectiveDeviceId = input.deviceId ?? 0;
7758
7760
  const deviceOverrides = effectiveDeviceId > 0 ? await this.deviceOverrides.resolve(effectiveDeviceId) : {};
7759
7761
  const effectiveTree = Object.keys(deviceOverrides).length > 0 ? applyDeviceOverridesToTree(tree, "object-detection", deviceOverrides) : tree;
@@ -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-cZopp8Xm.mjs";
3
- import { a as readProcessCost } from "../node-Br6p9KvD.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-Ctv_TzmF.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-DjplinYP.mjs";
3
+ import { a as readProcessCost } from "../node-D7uxWSXD.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-77FL9ua_.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-DX25Z60Q.mjs";
7
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-B2tApNua.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";
@@ -7489,8 +7489,11 @@ var DetectionPipelineProvider = class DetectionPipelineProvider {
7489
7489
  await this.clusterModels.refresh(this.addonCtx?.api);
7490
7490
  const nodeId = this.addonCtx?.kernel?.localNodeId ?? "hub";
7491
7491
  const sessionId = input.sessionId ?? `run-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
7492
+ const isRuntime = Boolean(input.frame || input.frameRef);
7493
+ const progressToBus = !isRuntime || input.sessionId !== void 0;
7492
7494
  const emit = (message, extra) => {
7493
7495
  onProgress?.(message);
7496
+ if (!progressToBus) return;
7494
7497
  this.eventBus?.emit(createEvent(EventCategory.PipelineProgress, {
7495
7498
  type: "pipeline",
7496
7499
  id: "pipeline-test"
@@ -7746,7 +7749,6 @@ var DetectionPipelineProvider = class DetectionPipelineProvider {
7746
7749
  emit("Running inference...");
7747
7750
  const tree = buildExecutableTree(benchmarkSteps, (stepId) => dispatchFactory.getEngine(stepId), this.customModelResolver);
7748
7751
  setupMs = performance.now() - wallT0 - decodeMs;
7749
- const isRuntime = Boolean(runtimeFrame || runtimeFrameRef);
7750
7752
  const effectiveDeviceId = input.deviceId ?? 0;
7751
7753
  const deviceOverrides = effectiveDeviceId > 0 ? await this.deviceOverrides.resolve(effectiveDeviceId) : {};
7752
7754
  const effectiveTree = Object.keys(deviceOverrides).length > 0 ? applyDeviceOverridesToTree(tree, "object-detection", deviceOverrides) : tree;
@@ -9374,18 +9374,61 @@ var RelocateFootageInputSchema = object({
9374
9374
  * `RecordingConfig.enabled` or camera wrapper bindings. */
9375
9375
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
9376
9376
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
9377
+ /**
9378
+ * What a `relocateMedia` pass DOES. One engine, three passes — never a second
9379
+ * mover (the engine already walks both collections with a timestamp cursor and
9380
+ * already has a stamp-without-copy path).
9381
+ *
9382
+ * - `move` — the default and the historical behaviour: event-media and
9383
+ * retrain blobs move to `toLocationId` and their rows are
9384
+ * stamped. The enrolled gallery is skipped (D197).
9385
+ * - `seal` — ROWS ONLY, no bytes. Every row whose `locationId` is NULL is
9386
+ * stamped with `toLocationId`. `toLocationId` here is the id the
9387
+ * bytes ALREADY sit on — today's `eventMedia` default — because
9388
+ * a NULL row means "wherever `eventMedia` points *now*", and the
9389
+ * instant a repoint moves that pointer the row reads from the
9390
+ * new disk while its bytes are on the old one.
9391
+ * - `gallery` — the inverse selection of `move`: ONLY the retention-exempt
9392
+ * (enrolled-gallery) rows, which `move` deliberately skips.
9393
+ * `galleryMedia` is `cardinality: 'single'`, so this pass can
9394
+ * never run beside a live second location: it is stop-the-world
9395
+ * by construction, which is acceptable only because the gallery
9396
+ * is a few KB per enrolled sample.
9397
+ */
9398
+ var MediaRelocateModeSchema = _enum([
9399
+ "move",
9400
+ "seal",
9401
+ "gallery"
9402
+ ]);
9377
9403
  var RelocateMediaInputSchema = object({
9378
9404
  toLocationId: string(),
9379
- throttleMbps: number().min(1).max(1e3).optional()
9405
+ throttleMbps: number().min(1).max(1e3).optional(),
9406
+ /** Omitted = `move`, the pre-existing behaviour. */
9407
+ mode: MediaRelocateModeSchema.optional()
9408
+ });
9409
+ /** How many rows still carry NO `locationId` — the population a repoint would
9410
+ * silently re-aim at a disk that does not hold their bytes. Zero is the only
9411
+ * value that permits a non-blocking `eventMedia` cutover. */
9412
+ var UnstampedEventMediaCountSchema = object({
9413
+ media: number().int().nonnegative(),
9414
+ retrainFrames: number().int().nonnegative(),
9415
+ total: number().int().nonnegative()
9380
9416
  });
9381
9417
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
9382
- /** The independently selectable logical storage classes. `recordings`
9383
- * encompasses the high and mid segment profiles; `recordingsLow` is low
9384
- * segments; `eventMedia` is post-analysis blobs. */
9418
+ /** The independently selectable logical storage classes — every class
9419
+ * `storage.listLocationDeclarations` reports, so an operator never meets a
9420
+ * Zod enum error where they should meet an explanation.
9421
+ *
9422
+ * `recordings` encompasses the high and mid segment profiles; `recordingsLow`
9423
+ * is low segments; `eventMedia` is post-analysis blobs; `galleryMedia` is the
9424
+ * enrolled gallery; `backups` is the system backup archive. The last two have
9425
+ * their own rules — see {@link StorageMigrationFindingCodeSchema}. */
9385
9426
  var StorageMigrationClassSchema = _enum([
9386
9427
  "recordings",
9387
9428
  "recordingsLow",
9388
- "eventMedia"
9429
+ "eventMedia",
9430
+ "backups",
9431
+ "galleryMedia"
9389
9432
  ]);
9390
9433
  /** A destination is always an existing, fully-qualified location id. The
9391
9434
  * migration API intentionally never changes a source location's `basePath`:
@@ -9393,20 +9436,56 @@ var StorageMigrationClassSchema = _enum([
9393
9436
  var StorageMigrationDestinationsSchema = object({
9394
9437
  recordings: string().min(1).optional(),
9395
9438
  recordingsLow: string().min(1).optional(),
9396
- eventMedia: string().min(1).optional()
9439
+ eventMedia: string().min(1).optional(),
9440
+ backups: string().min(1).optional(),
9441
+ galleryMedia: string().min(1).optional()
9397
9442
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
9443
+ /**
9444
+ * How a migration sequences the cutover against the byte move.
9445
+ *
9446
+ * - `blocking` — the historical order: pause, move every byte, repoint,
9447
+ * resume. Recording is stopped for the whole move. Right
9448
+ * for a small or a cold class, and the only legal mode for
9449
+ * a `cardinality: 'single'` class.
9450
+ * - `nonBlocking` — repoint FIRST, drain behind: seal, pause, repoint,
9451
+ * refresh, resume, then move the past with everything
9452
+ * running. The pause is three bounded instants (a detach +
9453
+ * attach round, a write-gate drain, a lease) instead of one
9454
+ * bounded by bytes. 1.09 TB at 7–14 MB/s is thirty hours of
9455
+ * stopped recording under `blocking`; the same move is
9456
+ * seconds of stopped recording under `nonBlocking`.
9457
+ *
9458
+ * The mode is on the JOB, not only on the input, because `status` is where an
9459
+ * operator finds out which one is running.
9460
+ */
9461
+ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
9398
9462
  /** Shared input for planning and starting an orchestrated storage migration. */
9399
9463
  var StorageMigrationInputSchema = object({
9400
9464
  destinations: StorageMigrationDestinationsSchema,
9401
- throttleMbps: number().min(1).max(1e3).optional()
9465
+ throttleMbps: number().min(1).max(1e3).optional(),
9466
+ /** Omitted = `blocking`, which stays the default. */
9467
+ mode: StorageMigrationModeSchema.optional()
9402
9468
  });
9403
- /** The durable coordinator state machine. The only phase that changes default
9404
- * locations is `repointing`, after every selected mover has completed and been
9405
- * verified. */
9469
+ /**
9470
+ * The durable coordinator state machine.
9471
+ *
9472
+ * `blocking`:
9473
+ * planning → pausing → moving → verifying → repointing → refreshing → resuming → done
9474
+ *
9475
+ * `nonBlocking`:
9476
+ * planning → sealing → pausing → repointing → refreshing → resuming → draining → verifying → done
9477
+ *
9478
+ * Same phases, different order plus two new ones — not a second mover.
9479
+ * `sealing` closes the `eventMedia` NULL-row hole BEFORE anything is paused;
9480
+ * `draining` runs the same movers UNLEASED, after every writer is back up.
9481
+ * `repointing` is still the only phase that changes a default location.
9482
+ */
9406
9483
  var StorageMigrationPhaseSchema = _enum([
9407
9484
  "planning",
9485
+ "sealing",
9408
9486
  "pausing",
9409
9487
  "moving",
9488
+ "draining",
9410
9489
  "verifying",
9411
9490
  "repointing",
9412
9491
  "refreshing",
@@ -9431,6 +9510,9 @@ var StorageMigrationMoveSchema = object({
9431
9510
  var StorageMigrationJobSchema = object({
9432
9511
  jobId: string(),
9433
9512
  phase: StorageMigrationPhaseSchema,
9513
+ /** Which order this job is running. `status` is the only place an operator
9514
+ * can tell a seconds-long cutover from a thirty-hour one. */
9515
+ mode: StorageMigrationModeSchema,
9434
9516
  destinations: StorageMigrationDestinationsSchema,
9435
9517
  throttleMbps: number(),
9436
9518
  moves: array(StorageMigrationMoveSchema),
@@ -9443,13 +9525,30 @@ var StorageMigrationJobSchema = object({
9443
9525
  finishedAt: number().nullable(),
9444
9526
  error: string().nullable()
9445
9527
  });
9528
+ var StorageMigrationFindingSchema = object({
9529
+ code: _enum([
9530
+ "sharesDeviceWithSource",
9531
+ "deviceIdentityUnknown",
9532
+ "unstampedEventMediaRows",
9533
+ "blockingOnly",
9534
+ "noMover"
9535
+ ]),
9536
+ storageClass: StorageMigrationClassSchema,
9537
+ /** Human-readable, already carrying the ids and counts. */
9538
+ message: string()
9539
+ });
9446
9540
  var StorageMigrationPlanSchema = object({
9447
9541
  destinations: StorageMigrationDestinationsSchema,
9542
+ /** The mode this plan was built for. A plan is only valid for its mode: the
9543
+ * `eventMedia` seal gate and the single-cardinality refusal both depend on
9544
+ * it. */
9545
+ mode: StorageMigrationModeSchema,
9448
9546
  moves: array(object({
9449
9547
  storageClass: StorageMigrationClassSchema,
9450
9548
  fromLocationId: string(),
9451
9549
  toLocationId: string()
9452
- }))
9550
+ })),
9551
+ findings: array(StorageMigrationFindingSchema)
9453
9552
  });
9454
9553
  /**
9455
9554
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
@@ -21122,7 +21221,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21122
21221
  }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
21123
21222
  kind: "mutation",
21124
21223
  auth: "admin"
21125
- }), method(object({}), array(RelocateJobSchema).readonly(), {
21224
+ }), method(object({}), UnstampedEventMediaCountSchema, { auth: "admin" }), method(object({}), array(RelocateJobSchema).readonly(), {
21126
21225
  kind: "query",
21127
21226
  auth: "admin"
21128
21227
  }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
@@ -23171,7 +23270,10 @@ method(object({
23171
23270
  }), StorageLocationSchema, {
23172
23271
  kind: "mutation",
23173
23272
  auth: "admin"
23174
- }), method(object({ id: string() }), _void(), {
23273
+ }), method(object({
23274
+ id: string(),
23275
+ force: boolean().optional()
23276
+ }), _void(), {
23175
23277
  kind: "mutation",
23176
23278
  auth: "admin"
23177
23279
  }), method(object({ id: string() }), object({
@@ -34131,6 +34233,12 @@ Object.freeze({
34131
34233
  addonId: null,
34132
34234
  access: "create"
34133
34235
  },
34236
+ "pipelineAnalytics.countUnstampedEventMedia": {
34237
+ capName: "pipeline-analytics",
34238
+ capScope: "device",
34239
+ addonId: null,
34240
+ access: "view"
34241
+ },
34134
34242
  "pipelineAnalytics.deleteDeviceEvents": {
34135
34243
  capName: "pipeline-analytics",
34136
34244
  capScope: "device",
@@ -9351,18 +9351,61 @@ var RelocateFootageInputSchema = object({
9351
9351
  * `RecordingConfig.enabled` or camera wrapper bindings. */
9352
9352
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
9353
9353
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
9354
+ /**
9355
+ * What a `relocateMedia` pass DOES. One engine, three passes — never a second
9356
+ * mover (the engine already walks both collections with a timestamp cursor and
9357
+ * already has a stamp-without-copy path).
9358
+ *
9359
+ * - `move` — the default and the historical behaviour: event-media and
9360
+ * retrain blobs move to `toLocationId` and their rows are
9361
+ * stamped. The enrolled gallery is skipped (D197).
9362
+ * - `seal` — ROWS ONLY, no bytes. Every row whose `locationId` is NULL is
9363
+ * stamped with `toLocationId`. `toLocationId` here is the id the
9364
+ * bytes ALREADY sit on — today's `eventMedia` default — because
9365
+ * a NULL row means "wherever `eventMedia` points *now*", and the
9366
+ * instant a repoint moves that pointer the row reads from the
9367
+ * new disk while its bytes are on the old one.
9368
+ * - `gallery` — the inverse selection of `move`: ONLY the retention-exempt
9369
+ * (enrolled-gallery) rows, which `move` deliberately skips.
9370
+ * `galleryMedia` is `cardinality: 'single'`, so this pass can
9371
+ * never run beside a live second location: it is stop-the-world
9372
+ * by construction, which is acceptable only because the gallery
9373
+ * is a few KB per enrolled sample.
9374
+ */
9375
+ var MediaRelocateModeSchema = _enum([
9376
+ "move",
9377
+ "seal",
9378
+ "gallery"
9379
+ ]);
9354
9380
  var RelocateMediaInputSchema = object({
9355
9381
  toLocationId: string(),
9356
- throttleMbps: number().min(1).max(1e3).optional()
9382
+ throttleMbps: number().min(1).max(1e3).optional(),
9383
+ /** Omitted = `move`, the pre-existing behaviour. */
9384
+ mode: MediaRelocateModeSchema.optional()
9385
+ });
9386
+ /** How many rows still carry NO `locationId` — the population a repoint would
9387
+ * silently re-aim at a disk that does not hold their bytes. Zero is the only
9388
+ * value that permits a non-blocking `eventMedia` cutover. */
9389
+ var UnstampedEventMediaCountSchema = object({
9390
+ media: number().int().nonnegative(),
9391
+ retrainFrames: number().int().nonnegative(),
9392
+ total: number().int().nonnegative()
9357
9393
  });
9358
9394
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
9359
- /** The independently selectable logical storage classes. `recordings`
9360
- * encompasses the high and mid segment profiles; `recordingsLow` is low
9361
- * segments; `eventMedia` is post-analysis blobs. */
9395
+ /** The independently selectable logical storage classes — every class
9396
+ * `storage.listLocationDeclarations` reports, so an operator never meets a
9397
+ * Zod enum error where they should meet an explanation.
9398
+ *
9399
+ * `recordings` encompasses the high and mid segment profiles; `recordingsLow`
9400
+ * is low segments; `eventMedia` is post-analysis blobs; `galleryMedia` is the
9401
+ * enrolled gallery; `backups` is the system backup archive. The last two have
9402
+ * their own rules — see {@link StorageMigrationFindingCodeSchema}. */
9362
9403
  var StorageMigrationClassSchema = _enum([
9363
9404
  "recordings",
9364
9405
  "recordingsLow",
9365
- "eventMedia"
9406
+ "eventMedia",
9407
+ "backups",
9408
+ "galleryMedia"
9366
9409
  ]);
9367
9410
  /** A destination is always an existing, fully-qualified location id. The
9368
9411
  * migration API intentionally never changes a source location's `basePath`:
@@ -9370,20 +9413,56 @@ var StorageMigrationClassSchema = _enum([
9370
9413
  var StorageMigrationDestinationsSchema = object({
9371
9414
  recordings: string().min(1).optional(),
9372
9415
  recordingsLow: string().min(1).optional(),
9373
- eventMedia: string().min(1).optional()
9416
+ eventMedia: string().min(1).optional(),
9417
+ backups: string().min(1).optional(),
9418
+ galleryMedia: string().min(1).optional()
9374
9419
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
9420
+ /**
9421
+ * How a migration sequences the cutover against the byte move.
9422
+ *
9423
+ * - `blocking` — the historical order: pause, move every byte, repoint,
9424
+ * resume. Recording is stopped for the whole move. Right
9425
+ * for a small or a cold class, and the only legal mode for
9426
+ * a `cardinality: 'single'` class.
9427
+ * - `nonBlocking` — repoint FIRST, drain behind: seal, pause, repoint,
9428
+ * refresh, resume, then move the past with everything
9429
+ * running. The pause is three bounded instants (a detach +
9430
+ * attach round, a write-gate drain, a lease) instead of one
9431
+ * bounded by bytes. 1.09 TB at 7–14 MB/s is thirty hours of
9432
+ * stopped recording under `blocking`; the same move is
9433
+ * seconds of stopped recording under `nonBlocking`.
9434
+ *
9435
+ * The mode is on the JOB, not only on the input, because `status` is where an
9436
+ * operator finds out which one is running.
9437
+ */
9438
+ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
9375
9439
  /** Shared input for planning and starting an orchestrated storage migration. */
9376
9440
  var StorageMigrationInputSchema = object({
9377
9441
  destinations: StorageMigrationDestinationsSchema,
9378
- throttleMbps: number().min(1).max(1e3).optional()
9442
+ throttleMbps: number().min(1).max(1e3).optional(),
9443
+ /** Omitted = `blocking`, which stays the default. */
9444
+ mode: StorageMigrationModeSchema.optional()
9379
9445
  });
9380
- /** The durable coordinator state machine. The only phase that changes default
9381
- * locations is `repointing`, after every selected mover has completed and been
9382
- * verified. */
9446
+ /**
9447
+ * The durable coordinator state machine.
9448
+ *
9449
+ * `blocking`:
9450
+ * planning → pausing → moving → verifying → repointing → refreshing → resuming → done
9451
+ *
9452
+ * `nonBlocking`:
9453
+ * planning → sealing → pausing → repointing → refreshing → resuming → draining → verifying → done
9454
+ *
9455
+ * Same phases, different order plus two new ones — not a second mover.
9456
+ * `sealing` closes the `eventMedia` NULL-row hole BEFORE anything is paused;
9457
+ * `draining` runs the same movers UNLEASED, after every writer is back up.
9458
+ * `repointing` is still the only phase that changes a default location.
9459
+ */
9383
9460
  var StorageMigrationPhaseSchema = _enum([
9384
9461
  "planning",
9462
+ "sealing",
9385
9463
  "pausing",
9386
9464
  "moving",
9465
+ "draining",
9387
9466
  "verifying",
9388
9467
  "repointing",
9389
9468
  "refreshing",
@@ -9408,6 +9487,9 @@ var StorageMigrationMoveSchema = object({
9408
9487
  var StorageMigrationJobSchema = object({
9409
9488
  jobId: string(),
9410
9489
  phase: StorageMigrationPhaseSchema,
9490
+ /** Which order this job is running. `status` is the only place an operator
9491
+ * can tell a seconds-long cutover from a thirty-hour one. */
9492
+ mode: StorageMigrationModeSchema,
9411
9493
  destinations: StorageMigrationDestinationsSchema,
9412
9494
  throttleMbps: number(),
9413
9495
  moves: array(StorageMigrationMoveSchema),
@@ -9420,13 +9502,30 @@ var StorageMigrationJobSchema = object({
9420
9502
  finishedAt: number().nullable(),
9421
9503
  error: string().nullable()
9422
9504
  });
9505
+ var StorageMigrationFindingSchema = object({
9506
+ code: _enum([
9507
+ "sharesDeviceWithSource",
9508
+ "deviceIdentityUnknown",
9509
+ "unstampedEventMediaRows",
9510
+ "blockingOnly",
9511
+ "noMover"
9512
+ ]),
9513
+ storageClass: StorageMigrationClassSchema,
9514
+ /** Human-readable, already carrying the ids and counts. */
9515
+ message: string()
9516
+ });
9423
9517
  var StorageMigrationPlanSchema = object({
9424
9518
  destinations: StorageMigrationDestinationsSchema,
9519
+ /** The mode this plan was built for. A plan is only valid for its mode: the
9520
+ * `eventMedia` seal gate and the single-cardinality refusal both depend on
9521
+ * it. */
9522
+ mode: StorageMigrationModeSchema,
9425
9523
  moves: array(object({
9426
9524
  storageClass: StorageMigrationClassSchema,
9427
9525
  fromLocationId: string(),
9428
9526
  toLocationId: string()
9429
- }))
9527
+ })),
9528
+ findings: array(StorageMigrationFindingSchema)
9430
9529
  });
9431
9530
  /**
9432
9531
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
@@ -21099,7 +21198,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21099
21198
  }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
21100
21199
  kind: "mutation",
21101
21200
  auth: "admin"
21102
- }), method(object({}), array(RelocateJobSchema).readonly(), {
21201
+ }), method(object({}), UnstampedEventMediaCountSchema, { auth: "admin" }), method(object({}), array(RelocateJobSchema).readonly(), {
21103
21202
  kind: "query",
21104
21203
  auth: "admin"
21105
21204
  }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
@@ -23148,7 +23247,10 @@ method(object({
23148
23247
  }), StorageLocationSchema, {
23149
23248
  kind: "mutation",
23150
23249
  auth: "admin"
23151
- }), method(object({ id: string() }), _void(), {
23250
+ }), method(object({
23251
+ id: string(),
23252
+ force: boolean().optional()
23253
+ }), _void(), {
23152
23254
  kind: "mutation",
23153
23255
  auth: "admin"
23154
23256
  }), method(object({ id: string() }), object({
@@ -34108,6 +34210,12 @@ Object.freeze({
34108
34210
  addonId: null,
34109
34211
  access: "create"
34110
34212
  },
34213
+ "pipelineAnalytics.countUnstampedEventMedia": {
34214
+ capName: "pipeline-analytics",
34215
+ capScope: "device",
34216
+ addonId: null,
34217
+ access: "view"
34218
+ },
34111
34219
  "pipelineAnalytics.deleteDeviceEvents": {
34112
34220
  capName: "pipeline-analytics",
34113
34221
  capScope: "device",
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-DML3mpn9.js");
1
+ const require_dist = require("./dist-DLy_uz82.js");
2
2
  let node_path = require("node:path");
3
3
  node_path = require_dist.__toESM(node_path);
4
4
  let node_url = require("node:url");
@@ -1,4 +1,4 @@
1
- import { M as audioKindId, Z as hfModelUrl, a as COCO_80_LABELS, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS } from "./dist-cZopp8Xm.mjs";
1
+ import { M as audioKindId, Z as hfModelUrl, a as COCO_80_LABELS, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS } from "./dist-DjplinYP.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  //#region src/detection-pipeline/registry/model-catalogs.ts
4
4
  var HF_REPO = "camstack/camstack-models";
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-DML3mpn9.js");
1
+ const require_dist = require("./dist-DLy_uz82.js");
2
2
  let node_crypto = require("node:crypto");
3
3
  //#region src/detection-pipeline/registry/model-catalogs.ts
4
4
  var HF_REPO = "camstack/camstack-models";
@@ -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-DML3mpn9.js");
6
- const require_lazy_sharp = require("../lazy-sharp-BzXIjfN8.js");
5
+ const require_dist = require("../dist-DLy_uz82.js");
6
+ const require_lazy_sharp = require("../lazy-sharp-BI4LsfMM.js");
7
7
  let node_fs = require("node:fs");
8
8
  let node_path = require("node:path");
9
9
  //#region src/motion-wasm/wasm-motion-detector.ts
@@ -1,4 +1,4 @@
1
- import { It as hydrateSchema, Pt as DeviceType, Y as evaluateZoneRules, it as motionDetectionCapability, jt as BaseAddon } from "../dist-cZopp8Xm.mjs";
1
+ import { It as hydrateSchema, Pt as DeviceType, Y as evaluateZoneRules, it as motionDetectionCapability, jt as BaseAddon } from "../dist-DjplinYP.mjs";
2
2
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { join } from "node:path";
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-DML3mpn9.js");
1
+ const require_dist = require("./dist-DLy_uz82.js");
2
2
  let node_crypto = require("node:crypto");
3
3
  let node_fs = require("node:fs");
4
4
  node_fs = require_dist.__toESM(node_fs, 1);
@@ -1,4 +1,4 @@
1
- import { Dt as buildFfmpegArgs, Et as Fmp4BoxSplitter, kt as isSoftwareDecode, wt as errMsg } from "./dist-cZopp8Xm.mjs";
1
+ import { Dt as buildFfmpegArgs, Et as Fmp4BoxSplitter, kt as isSoftwareDecode, wt as errMsg } from "./dist-DjplinYP.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import "node:fs";
4
4
  import "node:path";
@@ -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-DML3mpn9.js");
6
- const require_node = require("../node-OvVqe9eh.js");
7
- const require_local_frame_registry = require("../local-frame-registry-DO8-LuSo.js");
8
- const require_worker_protocol = require("../worker-protocol-Dt3zWCQY.js");
5
+ const require_dist = require("../dist-DLy_uz82.js");
6
+ const require_node = require("../node-BHFLhfkh.js");
7
+ const require_local_frame_registry = require("../local-frame-registry-Dr_U_xCG.js");
8
+ const require_worker_protocol = require("../worker-protocol-basMNc_q.js");
9
9
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
10
- const require_lazy_sharp = require("../lazy-sharp-BzXIjfN8.js");
10
+ const require_lazy_sharp = require("../lazy-sharp-BI4LsfMM.js");
11
11
  const require_restream_intent = require("../restream-intent-Cv9x3jmu.js");
12
12
  const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-DaUBcb13.js");
13
13
  const require_remote_restream = require("../remote-restream-CO36Sr30.js");
@@ -1,7 +1,7 @@
1
- import { B as defineCustomActions, Bt as nodePin, Ft as createEvent, Gt as _enum, H as deriveDetailCropRect, Kt as array, L as customAction, Qt as object, X as failureContributionCapability, Xt as literal, Yt as lazy, Zt as number, _ as FailureCounters, en as string, et as loadContributionCapability, ft as pipelineRunnerCapability, jt as BaseAddon, lt as pickDetailCropConvention, m as DEVICE_BACKEND_TO_FORMAT, nn as EventCategory, p as DEFAULT_NATIVE_LEASE_SETTINGS, qt as boolean, u as DEFAULT_DETAIL_CROP_CONVENTION, ut as pickNativeLeaseOverride, wt as errMsg } from "../dist-cZopp8Xm.mjs";
2
- import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-Br6p9KvD.mjs";
3
- import { c as getStepDefinition, n as resolveFrameViewGeometry, t as localFrameRegistry } from "../local-frame-registry-Ctv_TzmF.mjs";
4
- import { a as nativeLeaseSettingEnv, t as isWorkerReply } from "../worker-protocol-CUCQ1IPR.mjs";
1
+ import { B as defineCustomActions, Bt as nodePin, Ft as createEvent, Gt as _enum, H as deriveDetailCropRect, Kt as array, L as customAction, Qt as object, X as failureContributionCapability, Xt as literal, Yt as lazy, Zt as number, _ as FailureCounters, en as string, et as loadContributionCapability, ft as pipelineRunnerCapability, jt as BaseAddon, lt as pickDetailCropConvention, m as DEVICE_BACKEND_TO_FORMAT, nn as EventCategory, p as DEFAULT_NATIVE_LEASE_SETTINGS, qt as boolean, u as DEFAULT_DETAIL_CROP_CONVENTION, ut as pickNativeLeaseOverride, wt as errMsg } from "../dist-DjplinYP.mjs";
2
+ import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-D7uxWSXD.mjs";
3
+ import { c as getStepDefinition, n as resolveFrameViewGeometry, t as localFrameRegistry } from "../local-frame-registry-77FL9ua_.mjs";
4
+ import { a as nativeLeaseSettingEnv, t as isWorkerReply } from "../worker-protocol-Cvln9GmS.mjs";
5
5
  import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
6
6
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
7
7
  import { n as withDetectionIntent } from "../restream-intent-B4BXZra7.mjs";
@@ -1,4 +1,4 @@
1
- import { ot as parseProcStatus } from "./dist-cZopp8Xm.mjs";
1
+ import { ot as parseProcStatus } from "./dist-DjplinYP.mjs";
2
2
  import * as fs from "node:fs";
3
3
  import { execFile } from "node:child_process";
4
4
  //#region src/shared/node-topology-platform.ts
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-DML3mpn9.js");
1
+ const require_dist = require("./dist-DLy_uz82.js");
2
2
  let node_fs = require("node:fs");
3
3
  node_fs = require_dist.__toESM(node_fs);
4
4
  let node_child_process = require("node:child_process");