camstack 1.2.52 → 1.2.54

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-Dolp38qx.mjs
14525
+ // ../types/dist/sleep-C9C8EoK8.mjs
14526
14526
  var WELL_KNOWN_TABS = [
14527
14527
  {
14528
14528
  id: "overview",
@@ -17070,6 +17070,10 @@ var addonSettingsCapability = {
17070
17070
  kind: "mutation",
17071
17071
  auth: "admin"
17072
17072
  }),
17073
+ getIntegrationSettings: method(external_exports.object({
17074
+ addonId: external_exports.string(),
17075
+ nodeId: external_exports.string().optional()
17076
+ }), SettingsSchemaWithValuesSchema.nullable()),
17073
17077
  getDeviceSettings: method(external_exports.object({
17074
17078
  addonId: external_exports.string(),
17075
17079
  deviceId: external_exports.number(),
@@ -21683,6 +21687,80 @@ var logDestinationCapability = {
21683
21687
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
21684
21688
  mount: { kind: "skip" }
21685
21689
  };
21690
+ var FailureReasonCountSchema = external_exports.object({
21691
+ /**
21692
+ * Why the attempt did not land, in the contributor's own vocabulary —
21693
+ * `worker-lease-gone`, `queue-overflow`, `timeout`, `empty-read`. The same
21694
+ * strings that already appear in this repo's logs and, where one exists, the
21695
+ * same string the per-track `previewMissReason` records (D276): a second
21696
+ * vocabulary for the same loss would make the row and the counter
21697
+ * un-joinable.
21698
+ */
21699
+ reason: external_exports.string(),
21700
+ count: external_exports.number().int().nonnegative()
21701
+ });
21702
+ var FailureContributionSchema = external_exports.object({
21703
+ /**
21704
+ * The failing path — `enrichment-crop`, `inference`, `plate-ocr`,
21705
+ * `person-over-vehicle`. Free text, for the reason `load-contribution` keeps
21706
+ * `unit` free: the families are owned by different addons and a shared enum
21707
+ * is a central list that rots invisibly.
21708
+ */
21709
+ family: external_exports.string(),
21710
+ /**
21711
+ * The NUMERIC device id — the same value every log line carries as
21712
+ * `tags.deviceId`. Never nullable and never absent: a contributor that
21713
+ * cannot name the camera must not emit the entry, because a fleet total
21714
+ * cannot answer the only question anybody asks of this surface.
21715
+ */
21716
+ deviceId: external_exports.number().int().positive(),
21717
+ /**
21718
+ * A second dimension inside the family: the model / step id for an inference
21719
+ * timeout, so "which camera AND which model" is one read. Absent when the
21720
+ * family has a single variant.
21721
+ */
21722
+ variant: external_exports.string().optional(),
21723
+ /**
21724
+ * Epoch ms this counter started — the INCARNATION MARKER. A consumer
21725
+ * differencing two reads must drop the interval when it changes, because the
21726
+ * counter restarted from zero in a respawned runner. Same discipline as
21727
+ * `LoadContribution.startedAtMs`.
21728
+ */
21729
+ sinceMs: external_exports.number(),
21730
+ /** Epoch ms it was read. `atMs - sinceMs` is the interval this covers. */
21731
+ atMs: external_exports.number(),
21732
+ /**
21733
+ * THE DENOMINATOR — every attempt on this path for this camera in the
21734
+ * window. A failure count published without it is the mistake this schema
21735
+ * exists to make impossible.
21736
+ */
21737
+ attempts: external_exports.number().int().nonnegative(),
21738
+ /** Attempts that landed. `attempts - succeeded` is the loss. */
21739
+ succeeded: external_exports.number().int().nonnegative(),
21740
+ /** The loss, partitioned. Sums to `attempts - succeeded`. */
21741
+ reasons: external_exports.array(FailureReasonCountSchema).readonly()
21742
+ });
21743
+ var failureContributionCapability = {
21744
+ name: "failure-contribution",
21745
+ scope: "system",
21746
+ mode: "collection",
21747
+ internal: true,
21748
+ methods: {
21749
+ /**
21750
+ * This addon's per-camera failure counters, read live from bounded in-RAM
21751
+ * state it already keeps. Inert: no persistence, no sampling, no timer.
21752
+ *
21753
+ * READING NEVER RESETS. The counters are CUMULATIVE since `sinceMs`, and a
21754
+ * consumer that wants a rate differences two reads. A draining read would
21755
+ * make two operators with the page open each destroy half of the other's
21756
+ * numbers, and `load-contribution` already settled the same question the
21757
+ * same way for `cpuSeconds`.
21758
+ */
21759
+ list: method(external_exports.void(), external_exports.array(FailureContributionSchema).readonly())
21760
+ },
21761
+ /** In-process only — enumerated through `addons.listCapabilityProviders`. */
21762
+ mount: { kind: "skip" }
21763
+ };
21686
21764
  var LOAD_CONTRIBUTION_ROLES = [
21687
21765
  "decode",
21688
21766
  "transcode",
@@ -25675,6 +25753,20 @@ var TrackSchema = external_exports.object({
25675
25753
  * `=== true` and render nothing otherwise — never infer "no rider".
25676
25754
  */
25677
25755
  hasRider: external_exports.boolean().optional(),
25756
+ /**
25757
+ * WHY this track ended without a NATIVE best-shot tile
25758
+ * ([D276](../decisions/adr-0276-a-stand-in-tile-is-provisional-and-a-close-says-why.md)) —
25759
+ * a composed token line (`no-key-frame capture=keyframe:native-missx4`,
25760
+ * `derive-returned-null tile=standin`, …) written at close and CLEARED by
25761
+ * the late-keyFrame upgrade when a native tile lands after all. The
25762
+ * operator-facing answer to "perché manca l'immagine?" on a track whose
25763
+ * tile is a face/plate stand-in, a raster crop, or an icon.
25764
+ *
25765
+ * **Absent ≠ "missed silently"**: a row written before the column, a hub
25766
+ * that predates the field, and every track whose tile landed native all
25767
+ * omit it. Render nothing when absent.
25768
+ */
25769
+ previewMissReason: external_exports.string().optional(),
25678
25770
  ...TrackFlagFields,
25679
25771
  ...TrackRetrainFields
25680
25772
  });
@@ -37174,6 +37266,7 @@ var LoggingSettingsPatchSchema = external_exports.object({
37174
37266
  channels: external_exports.array(LogChannelWindowPatchSchema).readonly().optional()
37175
37267
  });
37176
37268
  var ReportedLoadContributionSchema = LoadContributionSchema.extend({ addonId: external_exports.string() });
37269
+ var ReportedFailureContributionSchema = FailureContributionSchema.extend({ addonId: external_exports.string() });
37177
37270
  var GetLoggingSettingsInputSchema = external_exports.object({
37178
37271
  scopeNodeId: external_exports.string().optional(),
37179
37272
  /**
@@ -37283,6 +37376,28 @@ var systemCapability = {
37283
37376
  */
37284
37377
  getLoadContributions: method(external_exports.void(), external_exports.array(ReportedLoadContributionSchema).readonly(), { auth: "admin" }),
37285
37378
  /**
37379
+ * Every `failure-contribution` an addon on this cluster reports — per
37380
+ * camera, per reason, **with the denominator attached**.
37381
+ *
37382
+ * This is the surface the operator asked for on 2026-08-28 (*"possiamo
37383
+ * armare questi errori intanto? Così al prossimo giro ricontrolliamo tutti
37384
+ * questi punti"*). Before it, four live failure modes could only be counted
37385
+ * by grepping Loki and hand-correlating timestamps, which is exactly how a
37386
+ * 22% thumbnail gap and a 3-hour media blackout were diagnosed — twice.
37387
+ *
37388
+ * Read it as a RATIO, never as a count. `attempts` is on every entry
37389
+ * because the count on its own lies: `enrichment crop native miss` read as
37390
+ * "35x worse than yesterday" and was flat across twelve hours once divided
37391
+ * by the successes on the same path.
37392
+ *
37393
+ * The counters are CUMULATIVE since each entry's `sinceMs`. Reading does
37394
+ * not reset them, and `sinceMs` changing means the reporting runner
37395
+ * respawned — a consumer differencing two reads drops that interval.
37396
+ *
37397
+ * Admin-only: the rows name cameras and the paths that fail on them.
37398
+ */
37399
+ getFailureContributions: method(external_exports.void(), external_exports.array(ReportedFailureContributionSchema).readonly(), { auth: "admin" }),
37400
+ /**
37286
37401
  * The logging settings document — levels and armed diagnostics — resolved
37287
37402
  * for `nodeId`, or for the cluster when `nodeId` is absent.
37288
37403
  *
@@ -38487,6 +38602,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
38487
38602
  addonId: null,
38488
38603
  access: "view"
38489
38604
  },
38605
+ "addonSettings.getIntegrationSettings": {
38606
+ capName: "addon-settings",
38607
+ capScope: "system",
38608
+ addonId: null,
38609
+ access: "view"
38610
+ },
38490
38611
  "addonSettings.updateDeviceSettings": {
38491
38612
  capName: "addon-settings",
38492
38613
  capScope: "system",
@@ -40149,6 +40270,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
40149
40270
  addonId: null,
40150
40271
  access: "create"
40151
40272
  },
40273
+ "failureContribution.list": {
40274
+ capName: "failure-contribution",
40275
+ capScope: "system",
40276
+ addonId: null,
40277
+ access: "view"
40278
+ },
40152
40279
  "fanControl.setDirection": {
40153
40280
  capName: "fan-control",
40154
40281
  capScope: "device",
@@ -43455,6 +43582,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
43455
43582
  addonId: null,
43456
43583
  access: "create"
43457
43584
  },
43585
+ "system.getFailureContributions": {
43586
+ capName: "system",
43587
+ capScope: "system",
43588
+ addonId: null,
43589
+ access: "view"
43590
+ },
43458
43591
  "system.getLoadContributions": {
43459
43592
  capName: "system",
43460
43593
  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-YVH2KSTL.js";
4
+ } from "./chunk-NEA5DJLZ.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-7T4UUMOZ.js");
41
+ await import("./launcher-QLUF66FQ.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-7T4UUMOZ.js");
86
+ await import("./launcher-QLUF66FQ.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-7QG523MP.js");
1133
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-2O7WGGRD.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-YVH2KSTL.js";
8
+ } from "./chunk-NEA5DJLZ.js";
9
9
  import "./chunk-LMMQX4CK.js";
10
10
  export {
11
11
  DEFAULT_HUB_HTTPS_PORT,