camstack 1.2.65 → 1.2.66

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.
@@ -15772,6 +15772,21 @@ var RelocateJobSchema = external_exports.object({
15772
15772
  bytesMoved: external_exports.number().int(),
15773
15773
  /** Total files discovered up front; null while (or when) unknown. */
15774
15774
  filesTotal: external_exports.number().int().nullable(),
15775
+ /**
15776
+ * Rows this run CORRECTED while moving them — a durable mutation the move
15777
+ * made that nobody asked for, so it is reported where the operator reads the
15778
+ * job rather than only in a log line.
15779
+ *
15780
+ * A footage segment records its byte count in its own NAME, and the durable
15781
+ * hour row derives its aggregates from those names. A file that does not
15782
+ * match its name therefore makes the ledger's sums — and with them quota and
15783
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
15784
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
15785
+ *
15786
+ * Absent on lanes where the question has no meaning: a media blob's size is
15787
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
15788
+ */
15789
+ rowsReconciled: external_exports.number().int().nonnegative().optional(),
15775
15790
  startedAt: external_exports.number(),
15776
15791
  finishedAt: external_exports.number().nullable(),
15777
15792
  error: external_exports.string().nullable()
@@ -15814,11 +15829,18 @@ var RelocateMediaInputSchema = external_exports.object({
15814
15829
  /** Omitted = `move`, the pre-existing behaviour. */
15815
15830
  mode: MediaRelocateModeSchema.optional()
15816
15831
  });
15817
- var UnstampedEventMediaCountSchema = external_exports.object({
15818
- media: external_exports.number().int().nonnegative(),
15819
- retrainFrames: external_exports.number().int().nonnegative(),
15820
- total: external_exports.number().int().nonnegative()
15832
+ var UnstampedRowsSchema = external_exports.object({
15833
+ present: external_exports.boolean(),
15834
+ rows: external_exports.number().int().nonnegative().nullable()
15821
15835
  });
15836
+ var UnstampedEventMediaCountSchema = external_exports.object({
15837
+ media: UnstampedRowsSchema,
15838
+ retrainFrames: UnstampedRowsSchema,
15839
+ /** True when EITHER collection holds one. The refusal reads this. */
15840
+ anyPresent: external_exports.boolean(),
15841
+ /** Sum across both, or `null` when either lane could not be counted. */
15842
+ total: external_exports.number().int().nonnegative().nullable()
15843
+ }).nullable();
15822
15844
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: external_exports.string().min(1) });
15823
15845
  var StorageMigrationClassSchema = external_exports.enum([
15824
15846
  "recordings",
@@ -15865,6 +15887,10 @@ var StorageMigrationMoveProgressSchema = external_exports.object({
15865
15887
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
15866
15888
  filesTotal: external_exports.number().int().nonnegative().nullable(),
15867
15889
  bytesMoved: external_exports.number().int().nonnegative(),
15890
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
15891
+ * a lane that cannot reconcile. A migration that silently rewrote durable
15892
+ * rows would be the same failure as one that silently skipped them. */
15893
+ rowsReconciled: external_exports.number().int().nonnegative().optional(),
15868
15894
  /** The MOVER's start, not the migration's: a drain restarted after an addon
15869
15895
  * crash gets a new mover, and a rate computed from the migration's start
15870
15896
  * would silently average in the time nothing was running. */
@@ -20804,6 +20830,15 @@ var deviceManagerCapability = {
20804
20830
  * calls are sync. Bindings change rarely (only on wrapper toggle or
20805
20831
  * device add/remove) — clients invalidate via the
20806
20832
  * `capability.binding-changed` event.
20833
+ *
20834
+ * "A single round-trip" describes the CLIENT's side and used not to
20835
+ * describe the server's: until 2026-08-30 the resolver read the persisted
20836
+ * wrapper activations once per device, so answering this cost one
20837
+ * settings-door RPC per device — 1 020 on the live 1 019-device hub, and
20838
+ * it did not return in 240 s against `SystemMirror.init`'s 15 s budget.
20839
+ * The server side is now two reads for the whole fleet. Anything PERIODIC
20840
+ * still belongs on `getBindings` / `getBindingsBatch` (D12); this remains
20841
+ * a warm seed.
20807
20842
  */
20808
20843
  getAllBindings: method(external_exports.object({}), external_exports.array(DeviceBindingsForDeviceSchema)),
20809
20844
  /**
@@ -26784,6 +26819,17 @@ var pipelineAnalyticsCapability = {
26784
26819
  * happens to stamp it. This count is what the migration planner's
26785
26820
  * non-blocking gate reads; `relocateMedia({ mode: 'seal' })` is what drives
26786
26821
  * it to zero.
26822
+ *
26823
+ * TWO indexed statements per collection, not a walk. It used to page the
26824
+ * whole collection at 200 rows per RPC ordered by an unindexed column, so
26825
+ * on the live hub — 1 254 576 rows — it hit the 60 s RPC deadline every
26826
+ * time it was called, and the migration it gates could never start. The
26827
+ * cheap question (`present`: is there at least one) is asked first and
26828
+ * separately from the expensive one (`rows`), because only the first has
26829
+ * to be answerable for the gate to do its job.
26830
+ *
26831
+ * **`null` is "not measurable", never zero** — at either level. An
26832
+ * unreadable collection must not read as a sealed one.
26787
26833
  */
26788
26834
  countUnstampedEventMedia: method(external_exports.object({}), UnstampedEventMediaCountSchema, { auth: "admin" }),
26789
26835
  /**
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runDiscover
4
- } from "./chunk-OJ7OCZA6.js";
4
+ } from "./chunk-EJO2K6FH.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-3XCU3XJF.js");
41
+ await import("./launcher-EJVL74UN.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-3XCU3XJF.js");
86
+ await import("./launcher-EJVL74UN.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-GAZVSA4I.js");
1133
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-4BY6AQ3K.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-OJ7OCZA6.js";
8
+ } from "./chunk-EJO2K6FH.js";
9
9
  import "./chunk-LMMQX4CK.js";
10
10
  export {
11
11
  DEFAULT_HUB_HTTPS_PORT,