camstack 1.2.69 → 1.2.71

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.
@@ -14522,7 +14522,7 @@ function date4(params) {
14522
14522
  // ../../node_modules/zod/v4/classic/external.js
14523
14523
  config(en_default());
14524
14524
 
14525
- // ../types/dist/sleep-DcA-CgqX.mjs
14525
+ // ../types/dist/sleep-BBI0PDUc.mjs
14526
14526
  var WELL_KNOWN_TABS = [
14527
14527
  {
14528
14528
  id: "overview",
@@ -15839,6 +15839,13 @@ var MediaRelocateModeSchema = external_exports.enum([
15839
15839
  ]);
15840
15840
  var RelocateMediaInputSchema = external_exports.object({
15841
15841
  toLocationId: external_exports.string(),
15842
+ /**
15843
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
15844
+ * every row that is not already on `toLocationId` (the historical
15845
+ * behaviour). A named source is what a from→to migration needs: without it
15846
+ * "move events off disk 2" also emptied disk 1.
15847
+ */
15848
+ fromLocationId: external_exports.string().optional(),
15842
15849
  throttleMbps: external_exports.number().min(1).max(1e3).optional(),
15843
15850
  /** Omitted = `move`, the pre-existing behaviour. */
15844
15851
  mode: MediaRelocateModeSchema.optional()
@@ -15870,9 +15877,18 @@ var StorageMigrationDestinationsSchema = external_exports.object({
15870
15877
  backups: external_exports.string().min(1).optional(),
15871
15878
  galleryMedia: external_exports.string().min(1).optional()
15872
15879
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
15880
+ var StorageMigrationSourcesSchema = external_exports.object({
15881
+ recordings: external_exports.string().min(1).optional(),
15882
+ recordingsLow: external_exports.string().min(1).optional(),
15883
+ eventMedia: external_exports.string().min(1).optional(),
15884
+ backups: external_exports.string().min(1).optional(),
15885
+ galleryMedia: external_exports.string().min(1).optional()
15886
+ }).optional();
15873
15887
  var StorageMigrationModeSchema = external_exports.enum(["blocking", "nonBlocking"]);
15874
15888
  var StorageMigrationInputSchema = external_exports.object({
15875
15889
  destinations: StorageMigrationDestinationsSchema,
15890
+ /** Omitted = each class's current default. */
15891
+ sources: StorageMigrationSourcesSchema,
15876
15892
  throttleMbps: external_exports.number().min(1).max(1e3).optional(),
15877
15893
  /** Omitted = `blocking`, which stays the default. */
15878
15894
  mode: StorageMigrationModeSchema.optional()
@@ -15918,6 +15934,13 @@ var StorageMigrationMoveSchema = external_exports.object({
15918
15934
  storageClass: StorageMigrationClassSchema,
15919
15935
  fromLocationId: external_exports.string(),
15920
15936
  toLocationId: external_exports.string(),
15937
+ /**
15938
+ * True when `from` was NOT the class default at plan time. The move still
15939
+ * copies bytes, but the default is left alone and the source is disabled
15940
+ * once the copy verifies. Absent on jobs planned before this field existed
15941
+ * — those jobs always repointed, which is `false`.
15942
+ */
15943
+ freezeSource: external_exports.boolean().optional(),
15921
15944
  moverJobId: external_exports.string().nullable(),
15922
15945
  state: RelocateJobStateSchema.nullable(),
15923
15946
  error: external_exports.string().nullable(),
@@ -15931,6 +15954,7 @@ var StorageMigrationJobSchema = external_exports.object({
15931
15954
  * can tell a seconds-long cutover from a thirty-hour one. */
15932
15955
  mode: StorageMigrationModeSchema,
15933
15956
  destinations: StorageMigrationDestinationsSchema,
15957
+ sources: StorageMigrationSourcesSchema,
15934
15958
  throttleMbps: external_exports.number(),
15935
15959
  moves: external_exports.array(StorageMigrationMoveSchema),
15936
15960
  pauseLeaseId: external_exports.string().nullable(),
@@ -15957,6 +15981,7 @@ var StorageMigrationFindingSchema = external_exports.object({
15957
15981
  });
15958
15982
  var StorageMigrationPlanSchema = external_exports.object({
15959
15983
  destinations: StorageMigrationDestinationsSchema,
15984
+ sources: StorageMigrationSourcesSchema,
15960
15985
  /** The mode this plan was built for. A plan is only valid for its mode: the
15961
15986
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
15962
15987
  * it. */
@@ -15964,7 +15989,8 @@ var StorageMigrationPlanSchema = external_exports.object({
15964
15989
  moves: external_exports.array(external_exports.object({
15965
15990
  storageClass: StorageMigrationClassSchema,
15966
15991
  fromLocationId: external_exports.string(),
15967
- toLocationId: external_exports.string()
15992
+ toLocationId: external_exports.string(),
15993
+ freezeSource: external_exports.boolean().optional()
15968
15994
  })),
15969
15995
  findings: external_exports.array(StorageMigrationFindingSchema)
15970
15996
  });
@@ -16076,9 +16102,42 @@ var LedgerWalkReportSchema = external_exports.object({
16076
16102
  var RelocatableMediaCountSchema = external_exports.object({ rows: external_exports.number().int().nonnegative() }).nullable();
16077
16103
  var RelocatableMediaCountInputSchema = external_exports.object({
16078
16104
  toLocationId: external_exports.string().min(1),
16105
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
16106
+ fromLocationId: external_exports.string().optional(),
16079
16107
  /** Omitted = `move`. */
16080
16108
  mode: MediaRelocateModeSchema.optional()
16081
16109
  });
16110
+ var StorageCleanupPhaseSchema = external_exports.enum([
16111
+ "orphans",
16112
+ "debug-media",
16113
+ "ghost-ledger",
16114
+ "done",
16115
+ "failed",
16116
+ "cancelled"
16117
+ ]);
16118
+ var StorageCleanupInputSchema = external_exports.object({
16119
+ /** Also walk motion stills / track filmstrips. Off by default. */
16120
+ includeDebugMedia: external_exports.boolean().optional()
16121
+ });
16122
+ var StorageCleanupJobSchema = external_exports.object({
16123
+ jobId: external_exports.string(),
16124
+ phase: StorageCleanupPhaseSchema,
16125
+ includeDebugMedia: external_exports.boolean(),
16126
+ orphansReclaimed: external_exports.number().int().nonnegative(),
16127
+ orphanBytesReclaimed: external_exports.number().int().nonnegative(),
16128
+ debugMediaReclaimed: external_exports.number().int().nonnegative(),
16129
+ debugMediaBytesReclaimed: external_exports.number().int().nonnegative(),
16130
+ ghostsForgotten: external_exports.number().int().nonnegative(),
16131
+ ghostBytesForgotten: external_exports.number().int().nonnegative(),
16132
+ /** Short operator-facing line: current collection, pass, or location. */
16133
+ detail: external_exports.string().nullable(),
16134
+ cancelRequested: external_exports.boolean(),
16135
+ startedAt: external_exports.number(),
16136
+ updatedAt: external_exports.number(),
16137
+ finishedAt: external_exports.number().nullable(),
16138
+ error: external_exports.string().nullable()
16139
+ });
16140
+ var StorageCleanupStatusInputSchema = external_exports.object({ jobId: external_exports.string().optional() });
16082
16141
  var StorageLocationTypeSchema = external_exports.string().regex(/^[a-z][a-zA-Z0-9-]*$/);
16083
16142
  var StorageLocationSchema = external_exports.object({
16084
16143
  id: external_exports.string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -26591,6 +26650,39 @@ var RebuildStatusSchema = external_exports.object({
26591
26650
  /** Present when the pass ended by throwing. */
26592
26651
  error: external_exports.string().nullable()
26593
26652
  });
26653
+ var MediaReclaimStartResultSchema = external_exports.object({
26654
+ started: external_exports.boolean(),
26655
+ /** True when a pass was already running; the new request is ignored. */
26656
+ alreadyRunning: external_exports.boolean()
26657
+ });
26658
+ var MediaReclaimInputSchema = external_exports.object({
26659
+ mode: external_exports.enum(["report", "reclaim"]).default("report"),
26660
+ scopes: external_exports.array(external_exports.enum(["motion-still", "track-filmstrip"])).min(1).optional(),
26661
+ deviceIds: external_exports.array(external_exports.number().int()).min(1).optional(),
26662
+ restart: external_exports.boolean().optional(),
26663
+ pageSize: external_exports.number().int().min(50).max(5e3).optional(),
26664
+ maxRowsPerDevice: external_exports.number().int().min(1).max(5e5).optional(),
26665
+ maxReclaimPerDevice: external_exports.number().int().min(1).max(5e5).optional(),
26666
+ maxBytesPerRun: external_exports.number().int().min(1).optional(),
26667
+ budgetMinutes: external_exports.number().int().min(1).max(720).optional(),
26668
+ throttleBytesPerSec: external_exports.number().int().min(64 * 1024).optional(),
26669
+ graceMinutes: external_exports.number().int().min(1).max(10080).optional()
26670
+ });
26671
+ var MediaReclaimStatusSchema = external_exports.object({
26672
+ running: external_exports.boolean(),
26673
+ mode: external_exports.enum(["report", "reclaim"]).nullable(),
26674
+ totalExamined: external_exports.number(),
26675
+ totalEligible: external_exports.number(),
26676
+ totalReclaimed: external_exports.number(),
26677
+ totalBytesReclaimed: external_exports.number(),
26678
+ totalRefused: external_exports.number(),
26679
+ /** Device+scope windows finished in this pass. */
26680
+ devicesDone: external_exports.number(),
26681
+ complete: external_exports.boolean().nullable(),
26682
+ startedAtMs: external_exports.number().nullable(),
26683
+ finishedAtMs: external_exports.number().nullable(),
26684
+ error: external_exports.string().nullable()
26685
+ });
26594
26686
  var ReplayFrameInputSchema = external_exports.object({
26595
26687
  timestamp: external_exports.number(),
26596
26688
  frame: PipelineRunResultBridge
@@ -27014,6 +27106,20 @@ var pipelineAnalyticsCapability = {
27014
27106
  auth: "admin"
27015
27107
  }),
27016
27108
  /**
27109
+ * Reclaim the standing debug-media backlog (motion-visit stills + track
27110
+ * filmstrips). DETACHED: returns `{ started }` immediately. The pass is
27111
+ * tens of minutes; awaiting it is a timeout, not a verdict. Dry-run unless
27112
+ * `mode: 'reclaim'`. Poll `getMediaReclaimStatus`.
27113
+ */
27114
+ reclaimDebugMedia: method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
27115
+ kind: "mutation",
27116
+ auth: "admin"
27117
+ }),
27118
+ getMediaReclaimStatus: method(external_exports.object({}), MediaReclaimStatusSchema, {
27119
+ kind: "query",
27120
+ auth: "admin"
27121
+ }),
27122
+ /**
27017
27123
  * The CHEAP QUESTION, asked before any media moves: how big is the dataset
27018
27124
  * the marked (`markForTrain`) tracks would produce?
27019
27125
  *
@@ -29746,7 +29852,23 @@ var storageMigrationCapability = {
29746
29852
  drain: method(StorageMigrationDrainInputSchema, external_exports.object({ jobId: external_exports.string() }), {
29747
29853
  kind: "mutation",
29748
29854
  auth: "admin"
29749
- })
29855
+ }),
29856
+ /**
29857
+ * One operator cleanup of leftover analytics (DB + blobs) and ghost
29858
+ * ledger rows on frozen footage locations. Optional debug-media sweep.
29859
+ * Returns immediately; poll {@link cleanupStatus}.
29860
+ */
29861
+ cleanupStart: method(StorageCleanupInputSchema, external_exports.object({ jobId: external_exports.string() }), {
29862
+ kind: "mutation",
29863
+ auth: "admin"
29864
+ }),
29865
+ cleanupStatus: method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }),
29866
+ cleanupCancel: method(external_exports.object({ jobId: external_exports.string() }), external_exports.object({ cancelled: external_exports.boolean() }), {
29867
+ kind: "mutation",
29868
+ auth: "admin"
29869
+ }),
29870
+ /** Recent finished migration jobs, newest first. The live job is `status`. */
29871
+ history: method(external_exports.object({}), external_exports.array(StorageMigrationJobSchema).readonly(), { auth: "admin" })
29750
29872
  }
29751
29873
  };
29752
29874
  var ProviderInfoSchema = external_exports.discriminatedUnion("shouldSaveDiskSpace", [external_exports.object({
@@ -36538,6 +36660,26 @@ var RecordingRebalanceInputSchema = external_exports.object({
36538
36660
  /** Ignore piles smaller than this (default 1 GB). */
36539
36661
  minMoveGb: external_exports.number().min(0).optional()
36540
36662
  });
36663
+ var RecordingDevicePlacementSchema = external_exports.object({
36664
+ deviceId: external_exports.number().int(),
36665
+ profile: external_exports.string(),
36666
+ locationId: external_exports.string()
36667
+ });
36668
+ var RecordingDevicePinSchema = external_exports.object({
36669
+ deviceId: external_exports.number().int(),
36670
+ /** Recordings-class location this camera is pinned to. */
36671
+ locationId: external_exports.string()
36672
+ });
36673
+ var RecordingPlacementViewSchema = external_exports.object({
36674
+ assignments: external_exports.array(RecordingDevicePlacementSchema),
36675
+ pins: external_exports.array(RecordingDevicePinSchema),
36676
+ defaultLocations: external_exports.record(external_exports.string(), external_exports.string())
36677
+ });
36678
+ var RecordingSetDevicePlacementInputSchema = external_exports.object({
36679
+ deviceId: external_exports.number().int(),
36680
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
36681
+ locationId: external_exports.string().nullable()
36682
+ });
36541
36683
  var LocateSegmentResultSchema = external_exports.discriminatedUnion("kind", [external_exports.object({
36542
36684
  kind: external_exports.literal("segment"),
36543
36685
  startMs: external_exports.number(),
@@ -36856,6 +36998,22 @@ var recordingCapability = {
36856
36998
  startStorageRebalance: method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
36857
36999
  kind: "mutation",
36858
37000
  auth: "admin"
37001
+ }),
37002
+ /**
37003
+ * The placement plan in force plus operator pins. Drives the Locations
37004
+ * admin page: Auto vs a named recordings location, per camera.
37005
+ */
37006
+ getPlacement: method(external_exports.object({}), RecordingPlacementViewSchema, {
37007
+ kind: "query",
37008
+ auth: "admin"
37009
+ }),
37010
+ /**
37011
+ * Pin a camera to a recordings location, or clear the pin (Auto). High and
37012
+ * mid follow the pin; low stays with the recordingsLow planner.
37013
+ */
37014
+ setDevicePlacement: method(RecordingSetDevicePlacementInputSchema, external_exports.object({ ok: external_exports.literal(true) }), {
37015
+ kind: "mutation",
37016
+ auth: "admin"
36859
37017
  })
36860
37018
  }
36861
37019
  };
@@ -42203,6 +42361,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
42203
42361
  addonId: null,
42204
42362
  access: "view"
42205
42363
  },
42364
+ "pipelineAnalytics.getMediaReclaimStatus": {
42365
+ capName: "pipeline-analytics",
42366
+ capScope: "device",
42367
+ addonId: null,
42368
+ access: "view"
42369
+ },
42206
42370
  "pipelineAnalytics.getMotionEvents": {
42207
42371
  capName: "pipeline-analytics",
42208
42372
  capScope: "device",
@@ -42377,6 +42541,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
42377
42541
  addonId: null,
42378
42542
  access: "create"
42379
42543
  },
42544
+ "pipelineAnalytics.reclaimDebugMedia": {
42545
+ capName: "pipeline-analytics",
42546
+ capScope: "device",
42547
+ addonId: null,
42548
+ access: "create"
42549
+ },
42380
42550
  "pipelineAnalytics.reconcileFromDisk": {
42381
42551
  capName: "pipeline-analytics",
42382
42552
  capScope: "device",
@@ -43301,6 +43471,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
43301
43471
  addonId: null,
43302
43472
  access: "view"
43303
43473
  },
43474
+ "recording.getPlacement": {
43475
+ capName: "recording",
43476
+ capScope: "system",
43477
+ addonId: null,
43478
+ access: "view"
43479
+ },
43304
43480
  "recording.getPlaybackManifest": {
43305
43481
  capName: "recording",
43306
43482
  capScope: "system",
@@ -43427,6 +43603,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
43427
43603
  addonId: null,
43428
43604
  access: "create"
43429
43605
  },
43606
+ "recording.setDevicePlacement": {
43607
+ capName: "recording",
43608
+ capScope: "system",
43609
+ addonId: null,
43610
+ access: "create"
43611
+ },
43430
43612
  "recording.startStorageMigrationMove": {
43431
43613
  capName: "recording",
43432
43614
  capScope: "system",
@@ -43871,12 +44053,36 @@ var METHOD_ACCESS_MAP = Object.freeze({
43871
44053
  addonId: null,
43872
44054
  access: "create"
43873
44055
  },
44056
+ "storageMigration.cleanupCancel": {
44057
+ capName: "storage-migration",
44058
+ capScope: "system",
44059
+ addonId: null,
44060
+ access: "create"
44061
+ },
44062
+ "storageMigration.cleanupStart": {
44063
+ capName: "storage-migration",
44064
+ capScope: "system",
44065
+ addonId: null,
44066
+ access: "create"
44067
+ },
44068
+ "storageMigration.cleanupStatus": {
44069
+ capName: "storage-migration",
44070
+ capScope: "system",
44071
+ addonId: null,
44072
+ access: "view"
44073
+ },
43874
44074
  "storageMigration.drain": {
43875
44075
  capName: "storage-migration",
43876
44076
  capScope: "system",
43877
44077
  addonId: null,
43878
44078
  access: "create"
43879
44079
  },
44080
+ "storageMigration.history": {
44081
+ capName: "storage-migration",
44082
+ capScope: "system",
44083
+ addonId: null,
44084
+ access: "view"
44085
+ },
43880
44086
  "storageMigration.movers": {
43881
44087
  capName: "storage-migration",
43882
44088
  capScope: "system",
@@ -45993,6 +46199,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
45993
46199
  form: "single",
45994
46200
  optional: true
45995
46201
  }],
46202
+ "pipelineAnalytics.reclaimDebugMedia": [{
46203
+ name: "deviceIds",
46204
+ form: "array",
46205
+ optional: true
46206
+ }],
45996
46207
  "pipelineAnalytics.reconcileFromDisk": [{
45997
46208
  name: "deviceId",
45998
46209
  form: "single",
@@ -46358,6 +46569,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
46358
46569
  form: "single",
46359
46570
  optional: false
46360
46571
  }],
46572
+ "recording.setDevicePlacement": [{
46573
+ name: "deviceId",
46574
+ form: "single",
46575
+ optional: false
46576
+ }],
46361
46577
  "recording.startStorageMigrationMove": [{
46362
46578
  name: "deviceId",
46363
46579
  form: "single",
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runDiscover
4
- } from "./chunk-VBTD2AIS.js";
4
+ } from "./chunk-TAXPJ53T.js";
5
5
  import "./chunk-LMMQX4CK.js";
6
6
 
7
7
  // src/cli.ts
@@ -38,7 +38,7 @@ async function runServe(args) {
38
38
  ...typeof values.data === "string" ? { data: values.data } : {}
39
39
  };
40
40
  Object.assign(process.env, buildServeEnv(opts));
41
- await import("./launcher-INC5TETK.js");
41
+ await import("./launcher-4QRZCB6O.js");
42
42
  }
43
43
 
44
44
  // src/commands/agent.ts
@@ -83,7 +83,7 @@ async function runAgent(args) {
83
83
  ...typeof values.port === "string" ? { port: values.port } : {}
84
84
  };
85
85
  Object.assign(process.env, buildAgentEnv(opts));
86
- await import("./launcher-INC5TETK.js");
86
+ await import("./launcher-4QRZCB6O.js");
87
87
  }
88
88
 
89
89
  // src/commands/setup.ts
@@ -1130,7 +1130,7 @@ function isUnknown(_value) {
1130
1130
  return true;
1131
1131
  }
1132
1132
  async function resolveServerInteractive(presetNamespace) {
1133
- const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-4S4WTMPM.js");
1133
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-TJE5IRDV.js");
1134
1134
  if (presetNamespace) {
1135
1135
  const spinner4 = clack.spinner();
1136
1136
  spinner4.start(`Discovering hub on LAN (namespace "${presetNamespace}")`);
@@ -5,7 +5,7 @@ import {
5
5
  filterHubNodes,
6
6
  resolveHubFromDiscovered,
7
7
  runDiscover
8
- } from "./chunk-VBTD2AIS.js";
8
+ } from "./chunk-TAXPJ53T.js";
9
9
  import "./chunk-LMMQX4CK.js";
10
10
  export {
11
11
  DEFAULT_HUB_HTTPS_PORT,