camstack 1.2.63 → 1.2.65

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-L5-bG_a_.mjs
14525
+ // ../types/dist/sleep-bm0x6zZF.mjs
14526
14526
  var WELL_KNOWN_TABS = [
14527
14527
  {
14528
14528
  id: "overview",
@@ -15860,13 +15860,29 @@ var StorageMigrationParticipantSchema = external_exports.enum([
15860
15860
  "recorder",
15861
15861
  "analytics"
15862
15862
  ]);
15863
+ var StorageMigrationMoveProgressSchema = external_exports.object({
15864
+ filesMoved: external_exports.number().int().nonnegative(),
15865
+ /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
15866
+ filesTotal: external_exports.number().int().nonnegative().nullable(),
15867
+ bytesMoved: external_exports.number().int().nonnegative(),
15868
+ /** The MOVER's start, not the migration's: a drain restarted after an addon
15869
+ * crash gets a new mover, and a rate computed from the migration's start
15870
+ * would silently average in the time nothing was running. */
15871
+ startedAt: external_exports.number(),
15872
+ /** When the coordinator last read these numbers. Paired with `startedAt` it
15873
+ * is the only honest rate: both clocks are the hub's, so a UI never has to
15874
+ * subtract its own. */
15875
+ observedAt: external_exports.number()
15876
+ });
15863
15877
  var StorageMigrationMoveSchema = external_exports.object({
15864
15878
  storageClass: StorageMigrationClassSchema,
15865
15879
  fromLocationId: external_exports.string(),
15866
15880
  toLocationId: external_exports.string(),
15867
15881
  moverJobId: external_exports.string().nullable(),
15868
15882
  state: RelocateJobStateSchema.nullable(),
15869
- error: external_exports.string().nullable()
15883
+ error: external_exports.string().nullable(),
15884
+ /** Last observed mover counters; `null` until the mover has been polled once. */
15885
+ progress: StorageMigrationMoveProgressSchema.nullable()
15870
15886
  });
15871
15887
  var StorageMigrationJobSchema = external_exports.object({
15872
15888
  jobId: external_exports.string(),
@@ -15912,6 +15928,52 @@ var StorageMigrationPlanSchema = external_exports.object({
15912
15928
  })),
15913
15929
  findings: external_exports.array(StorageMigrationFindingSchema)
15914
15930
  });
15931
+ var StorageMigrationLaneSchema = external_exports.enum(["footage", "media"]);
15932
+ var StorageMigrationMoverSchema = external_exports.object({
15933
+ lane: StorageMigrationLaneSchema,
15934
+ job: RelocateJobSchema,
15935
+ /** The coordinator job that armed this mover, or `null` for a mover armed
15936
+ * directly against the owning addon. */
15937
+ migrationJobId: external_exports.string().nullable(),
15938
+ /** When the hub read these counters. Stamped here so a rate is `bytesMoved`
15939
+ * over (`observedAt` − `job.startedAt`) with BOTH ends on the hub's clock —
15940
+ * a browser subtracting its own `Date.now()` from a server `startedAt` is a
15941
+ * rate made of two different clocks. */
15942
+ observedAt: external_exports.number()
15943
+ });
15944
+ var StorageMigrationResidueSchema = external_exports.object({
15945
+ storageClass: StorageMigrationClassSchema,
15946
+ /** The location still holding the data. `'*'` for the media lane, whose rows
15947
+ * move from wherever they are rather than from one named source. */
15948
+ fromLocationId: external_exports.string(),
15949
+ /** Where a drain would move it — the class's CURRENT default. */
15950
+ toLocationId: external_exports.string(),
15951
+ /** Segments (footage lane) or rows (media lane) still on the source. */
15952
+ items: external_exports.number().int().nonnegative().nullable(),
15953
+ /** Bytes on the source; `null` when the lane counts rows rather than bytes. */
15954
+ bytes: external_exports.number().int().nonnegative().nullable()
15955
+ });
15956
+ var StorageMigrationDrainInputSchema = external_exports.object({
15957
+ /** The classes to drain. Each must appear in `storageMigration.residue`, so
15958
+ * a class whose source is already empty is refused rather than started. */
15959
+ classes: external_exports.array(StorageMigrationClassSchema).min(1),
15960
+ throttleMbps: external_exports.number().min(1).max(1e3).optional()
15961
+ });
15962
+ var RelocateResidueInputSchema = external_exports.object({
15963
+ fromLocationId: external_exports.string().min(1),
15964
+ /** Narrow to one logical class; omit for every profile on the location. */
15965
+ footageClass: RelocateFootageClassSchema.optional()
15966
+ });
15967
+ var RelocateResidueSchema = external_exports.object({
15968
+ segments: external_exports.number().int().nonnegative(),
15969
+ bytes: external_exports.number().int().nonnegative()
15970
+ }).nullable();
15971
+ var RelocatableMediaCountSchema = external_exports.object({ rows: external_exports.number().int().nonnegative() }).nullable();
15972
+ var RelocatableMediaCountInputSchema = external_exports.object({
15973
+ toLocationId: external_exports.string().min(1),
15974
+ /** Omitted = `move`. */
15975
+ mode: MediaRelocateModeSchema.optional()
15976
+ });
15915
15977
  var StorageLocationTypeSchema = external_exports.string().regex(/^[a-z][a-zA-Z0-9-]*$/);
15916
15978
  var StorageLocationSchema = external_exports.object({
15917
15979
  id: external_exports.string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -15955,6 +16017,7 @@ var StorageLocationSchema = external_exports.object({
15955
16017
  updatedAt: external_exports.number()
15956
16018
  });
15957
16019
  var StorageLocationRefSchema = external_exports.union([StorageLocationTypeSchema, external_exports.string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/)]);
16020
+ var StorageAccessSchema = external_exports.enum(["local-path", "cap-mediated"]);
15958
16021
  var StorageLocationDeclarationSchema = external_exports.object({
15959
16022
  /**
15960
16023
  * Global location identifier, e.g. `recordings` or `recordingsLow`.
@@ -15974,6 +16037,19 @@ var StorageLocationDeclarationSchema = external_exports.object({
15974
16037
  */
15975
16038
  cardinality: external_exports.enum(["single", "multi"]),
15976
16039
  /**
16040
+ * HOW the declaring service reaches the bytes — and therefore WHICH
16041
+ * providers may back a location of this kind. See {@link StorageAccessSchema}
16042
+ * and {@link STORAGE_ACCESS_FALLBACK}.
16043
+ *
16044
+ * Absent means `'local-path'`. That default is FAIL-CLOSED on purpose: it
16045
+ * can only over-restrict (refuse a remote provider for a kind that might
16046
+ * have coped) and never under-restrict. Declaring `'cap-mediated'` is the
16047
+ * permissive direction and is therefore never inferred — a repo guard
16048
+ * (`scripts/check-storage-access-declarations.ts`) refuses to let it be
16049
+ * reached by omission.
16050
+ */
16051
+ access: StorageAccessSchema.optional(),
16052
+ /**
15977
16053
  * When set, the default instance for this location inherits its resolved
15978
16054
  * root from the named location's default instance. Useful for derivative
15979
16055
  * slots (e.g. `recordingsLow` → `recordings`) so operators only need to
@@ -25724,8 +25800,10 @@ var TrackSchema = external_exports.object({
25724
25800
  lastSeen: external_exports.number(),
25725
25801
  /** Frame-rate position history (subject to maxPositionHistory cap). */
25726
25802
  positions: external_exports.array(TrackPositionSchema).readonly(),
25727
- /** Periodic snapshots at snapshotIntervalMs cadence (subject to
25728
- * saveThumbnails policy). */
25803
+ /** Periodic snapshots at snapshotIntervalMs cadence DEBUG media, produced
25804
+ * only while `MediaSettings.debugMediaEnabled` is on for the camera (D299;
25805
+ * the retired `saveThumbnails` used to gate this and the rolling
25806
+ * `lastFrame` together). Empty is the healthy default, not a capture gap. */
25729
25807
  snapshots: external_exports.array(TrackSnapshotSchema).readonly(),
25730
25808
  /** Deduplicated zones the track has entered at least once. Zone IDS. */
25731
25809
  zonesVisited: external_exports.array(external_exports.string()).readonly(),
@@ -26708,6 +26786,21 @@ var pipelineAnalyticsCapability = {
26708
26786
  * it to zero.
26709
26787
  */
26710
26788
  countUnstampedEventMedia: method(external_exports.object({}), UnstampedEventMediaCountSchema, { auth: "admin" }),
26789
+ /**
26790
+ * How many rows a pass would STILL act on against `toLocationId`.
26791
+ *
26792
+ * One derivation, two consumers: it is the media lane's denominator (the
26793
+ * **M** the footage lane gets from the ledger census — D295) and it is the
26794
+ * residue behind "drain remaining". Deriving them separately is how "N of M"
26795
+ * ends up comparing two different populations.
26796
+ *
26797
+ * `null` means the count could not be taken; it is never zero-filled,
26798
+ * because a zero here reads as "nothing left to move".
26799
+ */
26800
+ countRelocatableMedia: method(RelocatableMediaCountInputSchema, RelocatableMediaCountSchema, {
26801
+ kind: "query",
26802
+ auth: "admin"
26803
+ }),
26711
26804
  /** Every relocate job this addon knows about, newest first (in RAM: the
26712
26805
  * move is resumable, so a lost list costs nothing but the display). */
26713
26806
  listRelocateMediaJobs: method(external_exports.object({}), external_exports.array(RelocateJobSchema).readonly(), {
@@ -29393,6 +29486,35 @@ var storageMigrationCapability = {
29393
29486
  cancel: method(external_exports.object({ jobId: external_exports.string() }), external_exports.object({ cancelled: external_exports.boolean() }), {
29394
29487
  kind: "mutation",
29395
29488
  auth: "admin"
29489
+ }),
29490
+ /**
29491
+ * Every mover running RIGHT NOW, in both lanes, with its counters.
29492
+ *
29493
+ * `status` covers a migration's own moves — the coordinator folds their
29494
+ * progress onto the durable job record it is already polling. This covers
29495
+ * the other case, and it is not hypothetical: a drain armed straight against
29496
+ * `recording.relocateFootage` (the only path that existed before
29497
+ * {@link drain}) has no job to fold into and would otherwise be invisible.
29498
+ */
29499
+ movers: method(external_exports.object({}), external_exports.array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }),
29500
+ /**
29501
+ * What each class's SOURCE still holds, from the archive — never from the
29502
+ * resident index (D295). Only classes with something left (or something
29503
+ * unknown) are listed, so an empty list means there is nothing to drain and
29504
+ * the UI has no honest button to offer.
29505
+ */
29506
+ residue: method(external_exports.object({}), external_exports.array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }),
29507
+ /**
29508
+ * Run the drain half alone, on a class whose default has ALREADY moved.
29509
+ *
29510
+ * It never repoints anything, which is what lets `start` keep refusing a
29511
+ * destination that is already the default: the two verbs cannot be confused
29512
+ * for one another, and no operator can re-repoint a migrated class through
29513
+ * this door.
29514
+ */
29515
+ drain: method(StorageMigrationDrainInputSchema, external_exports.object({ jobId: external_exports.string() }), {
29516
+ kind: "mutation",
29517
+ auth: "admin"
29396
29518
  })
29397
29519
  }
29398
29520
  };
@@ -29902,7 +30024,20 @@ var VectorQueryResultSchema = external_exports.object({
29902
30024
  */
29903
30025
  scanned: external_exports.number(),
29904
30026
  /** True when the backend could not consider every row that passed the filter. */
29905
- truncated: external_exports.boolean()
30027
+ truncated: external_exports.boolean(),
30028
+ /**
30029
+ * The `topK` the backend actually ran with.
30030
+ *
30031
+ * Every backend has a ceiling — sqlite-vec's is 4,096 — and a caller asking
30032
+ * past it used to learn nothing but a boolean, from a WARN in the provider's
30033
+ * own log rather than in its answer. That is how an audit asking for 20,000
30034
+ * consumed 4,096 and reported `examined: 4096` as if it had walked the index,
30035
+ * for weeks. `truncated` says THAT the answer was short; this says BY HOW
30036
+ * MUCH, in the return value, where the caller cannot fail to see it.
30037
+ *
30038
+ * Equals the requested `topK` whenever nothing was lowered.
30039
+ */
30040
+ effectiveTopK: external_exports.number().int().positive()
29906
30041
  });
29907
30042
  var VectorDeleteInputSchema = external_exports.object({
29908
30043
  index: external_exports.string(),
@@ -29921,6 +30056,35 @@ var VectorGetResultSchema = external_exports.object({ items: external_exports.ar
29921
30056
  id: external_exports.string(),
29922
30057
  metadata: VectorMetadataSchema
29923
30058
  })) });
30059
+ var VectorFetchInputSchema = external_exports.object({
30060
+ index: external_exports.string(),
30061
+ ids: external_exports.array(external_exports.string())
30062
+ });
30063
+ var VectorFetchResultSchema = external_exports.object({ items: external_exports.array(external_exports.object({
30064
+ id: external_exports.string(),
30065
+ /** base64 Float32LE — the same wire form `upsert` accepts. */
30066
+ vector: external_exports.string(),
30067
+ metadata: VectorMetadataSchema
30068
+ })) });
30069
+ var VectorScanInputSchema = external_exports.object({
30070
+ index: external_exports.string(),
30071
+ /** Opaque resume point. `0` starts at the top; pass back `nextCursor`. */
30072
+ cursor: external_exports.number().int().nonnegative().default(0),
30073
+ limit: external_exports.number().int().positive()
30074
+ });
30075
+ var VectorScanResultSchema = external_exports.object({
30076
+ items: external_exports.array(external_exports.object({
30077
+ id: external_exports.string(),
30078
+ metadata: VectorMetadataSchema
30079
+ })),
30080
+ /**
30081
+ * Where the next page starts, or `null` when the walk reached the end.
30082
+ *
30083
+ * `null` is the ONLY end-of-index signal. A caller must not infer the end
30084
+ * from a short page: a backend is free to return fewer rows than asked.
30085
+ */
30086
+ nextCursor: external_exports.number().int().nonnegative().nullable()
30087
+ });
29924
30088
  var VectorStatsInputSchema = external_exports.object({ index: external_exports.string() });
29925
30089
  var VectorStatsResultSchema = external_exports.object({
29926
30090
  /** Provider id, so an operator can tell brute force from an ANN index. */
@@ -29951,6 +30115,10 @@ var vectorStoreCapability = {
29951
30115
  query: method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }),
29952
30116
  /** Metadata by id, no vectors — see {@link VectorGetResultSchema}. */
29953
30117
  getByIds: method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }),
30118
+ /** Metadata AND vectors, by named id — see {@link VectorFetchInputSchema}. */
30119
+ fetchByIds: method(VectorFetchInputSchema, VectorFetchResultSchema, { auth: "admin" }),
30120
+ /** One page of the whole index, unranked — see {@link VectorScanInputSchema}. */
30121
+ scan: method(VectorScanInputSchema, VectorScanResultSchema, { auth: "admin" }),
29954
30122
  deleteByIds: method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
29955
30123
  kind: "mutation",
29956
30124
  auth: "admin"
@@ -36412,6 +36580,20 @@ var recordingCapability = {
36412
36580
  kind: "query",
36413
36581
  auth: "admin"
36414
36582
  }),
36583
+ /**
36584
+ * What a location STILL holds, asked of the durable hour ledger.
36585
+ *
36586
+ * The number behind "drain remaining": segments and bytes that would still
36587
+ * have to move off `fromLocationId`. It is a ledger aggregate — the archive
36588
+ * — because the resident index is not the archive (D295), and a drain sized
36589
+ * off the index is exactly what reported `done` over 80.3 GB on 2026-08-29.
36590
+ * `null` means the archive could not be asked (no ledger on this node, or
36591
+ * the aggregate failed) and is never conflated with an empty source.
36592
+ */
36593
+ getRelocateResidue: method(RelocateResidueInputSchema, RelocateResidueSchema, {
36594
+ kind: "query",
36595
+ auth: "admin"
36596
+ }),
36415
36597
  /** Cancel a running or queued relocate job. A queued job never runs. */
36416
36598
  cancelRelocateJob: method(external_exports.object({ jobId: external_exports.string() }), external_exports.object({ cancelled: external_exports.boolean() }), {
36417
36599
  kind: "mutation",
@@ -41650,6 +41832,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
41650
41832
  addonId: null,
41651
41833
  access: "create"
41652
41834
  },
41835
+ "pipelineAnalytics.countRelocatableMedia": {
41836
+ capName: "pipeline-analytics",
41837
+ capScope: "device",
41838
+ addonId: null,
41839
+ access: "view"
41840
+ },
41653
41841
  "pipelineAnalytics.countUnstampedEventMedia": {
41654
41842
  capName: "pipeline-analytics",
41655
41843
  capScope: "device",
@@ -42814,6 +43002,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
42814
43002
  addonId: null,
42815
43003
  access: "view"
42816
43004
  },
43005
+ "recording.getRelocateResidue": {
43006
+ capName: "recording",
43007
+ capScope: "system",
43008
+ addonId: null,
43009
+ access: "view"
43010
+ },
42817
43011
  "recording.getStorageMigrationMoveStatus": {
42818
43012
  capName: "recording",
42819
43013
  capScope: "system",
@@ -43360,12 +43554,30 @@ var METHOD_ACCESS_MAP = Object.freeze({
43360
43554
  addonId: null,
43361
43555
  access: "create"
43362
43556
  },
43557
+ "storageMigration.drain": {
43558
+ capName: "storage-migration",
43559
+ capScope: "system",
43560
+ addonId: null,
43561
+ access: "create"
43562
+ },
43563
+ "storageMigration.movers": {
43564
+ capName: "storage-migration",
43565
+ capScope: "system",
43566
+ addonId: null,
43567
+ access: "view"
43568
+ },
43363
43569
  "storageMigration.plan": {
43364
43570
  capName: "storage-migration",
43365
43571
  capScope: "system",
43366
43572
  addonId: null,
43367
43573
  access: "view"
43368
43574
  },
43575
+ "storageMigration.residue": {
43576
+ capName: "storage-migration",
43577
+ capScope: "system",
43578
+ addonId: null,
43579
+ access: "view"
43580
+ },
43369
43581
  "storageMigration.start": {
43370
43582
  capName: "storage-migration",
43371
43583
  capScope: "system",
@@ -44200,6 +44412,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
44200
44412
  addonId: null,
44201
44413
  access: "delete"
44202
44414
  },
44415
+ "vectorStore.fetchByIds": {
44416
+ capName: "vector-store",
44417
+ capScope: "system",
44418
+ addonId: null,
44419
+ access: "view"
44420
+ },
44203
44421
  "vectorStore.getByIds": {
44204
44422
  capName: "vector-store",
44205
44423
  capScope: "system",
@@ -44212,6 +44430,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
44212
44430
  addonId: null,
44213
44431
  access: "view"
44214
44432
  },
44433
+ "vectorStore.scan": {
44434
+ capName: "vector-store",
44435
+ capScope: "system",
44436
+ addonId: null,
44437
+ access: "view"
44438
+ },
44215
44439
  "vectorStore.stats": {
44216
44440
  capName: "vector-store",
44217
44441
  capScope: "system",
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runDiscover
4
- } from "./chunk-SEHB4NXH.js";
4
+ } from "./chunk-OJ7OCZA6.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-RA6HGFNQ.js");
41
+ await import("./launcher-3XCU3XJF.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-RA6HGFNQ.js");
86
+ await import("./launcher-3XCU3XJF.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-LCFHENJ3.js");
1133
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-GAZVSA4I.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-SEHB4NXH.js";
8
+ } from "./chunk-OJ7OCZA6.js";
9
9
  import "./chunk-LMMQX4CK.js";
10
10
  export {
11
11
  DEFAULT_HUB_HTTPS_PORT,