camstack 1.2.126 → 1.2.127

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-Bd-Y4RUt.mjs
14525
+ // ../types/dist/sleep-uGNYCvYp.mjs
14526
14526
  var WELL_KNOWN_TABS = [
14527
14527
  {
14528
14528
  id: "overview",
@@ -15582,6 +15582,32 @@ var CameraSwitchGroupSchema = external_exports.object({
15582
15582
  /** Unix ms when the group was composed server-side. */
15583
15583
  fetchedAt: external_exports.number()
15584
15584
  });
15585
+ var ArchivedDebugNoteSchema = external_exports.object({
15586
+ /** Archive row id. Derived from `(sourceTrackId, note)`, so re-archiving the
15587
+ * same sentence about the same track lands on the row already there. */
15588
+ id: external_exports.string(),
15589
+ /** The operator's own words, verbatim. */
15590
+ note: external_exports.string(),
15591
+ /** The camera. Required — every question here is asked per-camera. */
15592
+ deviceId: external_exports.number().int(),
15593
+ /** The track the note was written on. PROVENANCE, not ownership: the track
15594
+ * is expected to be gone, and this row is not a reference to it. */
15595
+ sourceTrackId: external_exports.string(),
15596
+ /** Epoch ms the note was moved here, i.e. when the operator reviewed it. */
15597
+ archivedAt: external_exports.number().int(),
15598
+ /** The track's `firstSeen`, when the row still knew it; `null` otherwise. */
15599
+ trackStartedAt: external_exports.number().int().nullable(),
15600
+ /** The track's detector class (`person`, `car`, …); `null` when unknown. */
15601
+ trackClass: external_exports.string().nullable(),
15602
+ /** The track's display label at review time; `null` when it had none. */
15603
+ trackLabel: external_exports.string().nullable()
15604
+ });
15605
+ var ArchivedDebugNoteQueryInputSchema = external_exports.object({
15606
+ /** Restrict to a single camera; omit for every row. */
15607
+ deviceId: external_exports.number().int().optional(),
15608
+ /** Max rows returned, newest-first. */
15609
+ limit: external_exports.number().int().min(1).max(1e3).optional()
15610
+ });
15585
15611
  var OpsLogDomainSchema = external_exports.enum(["recording", "events"]);
15586
15612
  var OpsLogOpSchema = external_exports.enum([
15587
15613
  "prune",
@@ -27431,6 +27457,31 @@ var pipelineAnalyticsCapability = {
27431
27457
  flags: TrackFlagsPatchSchema
27432
27458
  }), TrackFlagsSchema, { kind: "mutation" }),
27433
27459
  /**
27460
+ * The archived debug notes, newest first — the corpus of what operators
27461
+ * have asked to be checked, across tracks that no longer exist (D405).
27462
+ *
27463
+ * `setTrackFlags` writes it: a patch carrying `debug: false` still clears
27464
+ * the note off the track row in the same statement (D353's invariant is
27465
+ * untouched), but the note is APPENDED here first. That is the whole point
27466
+ * — before D405, finishing a review destroyed every note written during it,
27467
+ * and the ones that survived aged out with their tracks. This method is the
27468
+ * only way to read what was kept.
27469
+ *
27470
+ * `auth: 'protected'`, matching `setTrackFlags` next door and for the same
27471
+ * reason: the notes are written from the viewer, by an authenticated
27472
+ * non-admin session, and a corpus only an admin can read is a corpus the
27473
+ * person who wrote it cannot use. It carries operator prose about cameras
27474
+ * and nothing else — no media, no paths, no identities beyond a track's
27475
+ * own display label.
27476
+ *
27477
+ * Newest-first, capped by `limit` (default
27478
+ * {@link ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT}), optionally one camera. The
27479
+ * table itself is bounded by row count, not by age — see
27480
+ * {@link MAX_ARCHIVED_DEBUG_NOTES} for why an age clock would be the wrong
27481
+ * bound for exactly this data.
27482
+ */
27483
+ listArchivedDebugNotes: method(ArchivedDebugNoteQueryInputSchema, external_exports.array(ArchivedDebugNoteSchema).readonly(), { kind: "query" }),
27484
+ /**
27434
27485
  * Durable event-store footprint for the management UI: event rows
27435
27486
  * (motion + object + audio) counted per camera + total, plus the
27436
27487
  * event-owned media bytes on disk per camera + total. Stat/count-based,
@@ -43500,6 +43551,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
43500
43551
  addonId: null,
43501
43552
  access: "view"
43502
43553
  },
43554
+ "pipelineAnalytics.listArchivedDebugNotes": {
43555
+ capName: "pipeline-analytics",
43556
+ capScope: "device",
43557
+ addonId: null,
43558
+ access: "view"
43559
+ },
43503
43560
  "pipelineAnalytics.listEventKinds": {
43504
43561
  capName: "pipeline-analytics",
43505
43562
  capScope: "device",
@@ -47287,6 +47344,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
47287
47344
  form: "array",
47288
47345
  optional: true
47289
47346
  }],
47347
+ "pipelineAnalytics.listArchivedDebugNotes": [{
47348
+ name: "deviceId",
47349
+ form: "single",
47350
+ optional: true
47351
+ }],
47290
47352
  "pipelineAnalytics.listEventKinds": [{
47291
47353
  name: "deviceId",
47292
47354
  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-36TIDBRZ.js";
4
+ } from "./chunk-5NJCDSOQ.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-6KZS6MDM.js");
41
+ await import("./launcher-BSFU3OHE.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-6KZS6MDM.js");
86
+ await import("./launcher-BSFU3OHE.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-YU5RJAP7.js");
1133
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-7JKBAMMQ.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-36TIDBRZ.js";
8
+ } from "./chunk-5NJCDSOQ.js";
9
9
  import "./chunk-LMMQX4CK.js";
10
10
  export {
11
11
  DEFAULT_HUB_HTTPS_PORT,
@@ -23633,9 +23633,9 @@ var require_zod = __commonJS({
23633
23633
  }
23634
23634
  });
23635
23635
 
23636
- // ../system/dist/dist-C_WvDOQ9.js
23637
- var require_dist_C_WvDOQ9 = __commonJS({
23638
- "../system/dist/dist-C_WvDOQ9.js"(exports) {
23636
+ // ../system/dist/dist-C5xJy-uL.js
23637
+ var require_dist_C5xJy_uL = __commonJS({
23638
+ "../system/dist/dist-C5xJy-uL.js"(exports) {
23639
23639
  "use strict";
23640
23640
  var zod = require_zod();
23641
23641
  var EventCategory = /* @__PURE__ */ (function(EventCategory2) {
@@ -26065,6 +26065,32 @@ var require_dist_C_WvDOQ9 = __commonJS({
26065
26065
  for (const tab of tabs) for (const child of fieldsOf(tab)) walkField(child, out);
26066
26066
  }
26067
26067
  }
26068
+ var ArchivedDebugNoteSchema = zod.z.object({
26069
+ /** Archive row id. Derived from `(sourceTrackId, note)`, so re-archiving the
26070
+ * same sentence about the same track lands on the row already there. */
26071
+ id: zod.z.string(),
26072
+ /** The operator's own words, verbatim. */
26073
+ note: zod.z.string(),
26074
+ /** The camera. Required — every question here is asked per-camera. */
26075
+ deviceId: zod.z.number().int(),
26076
+ /** The track the note was written on. PROVENANCE, not ownership: the track
26077
+ * is expected to be gone, and this row is not a reference to it. */
26078
+ sourceTrackId: zod.z.string(),
26079
+ /** Epoch ms the note was moved here, i.e. when the operator reviewed it. */
26080
+ archivedAt: zod.z.number().int(),
26081
+ /** The track's `firstSeen`, when the row still knew it; `null` otherwise. */
26082
+ trackStartedAt: zod.z.number().int().nullable(),
26083
+ /** The track's detector class (`person`, `car`, …); `null` when unknown. */
26084
+ trackClass: zod.z.string().nullable(),
26085
+ /** The track's display label at review time; `null` when it had none. */
26086
+ trackLabel: zod.z.string().nullable()
26087
+ });
26088
+ var ArchivedDebugNoteQueryInputSchema = zod.z.object({
26089
+ /** Restrict to a single camera; omit for every row. */
26090
+ deviceId: zod.z.number().int().optional(),
26091
+ /** Max rows returned, newest-first. */
26092
+ limit: zod.z.number().int().min(1).max(1e3).optional()
26093
+ });
26068
26094
  var STREAM_QUALITY_LABELS = {
26069
26095
  high: "High",
26070
26096
  mid: "Mid",
@@ -38200,6 +38226,31 @@ var require_dist_C_WvDOQ9 = __commonJS({
38200
38226
  flags: TrackFlagsPatchSchema
38201
38227
  }), TrackFlagsSchema, { kind: "mutation" }),
38202
38228
  /**
38229
+ * The archived debug notes, newest first — the corpus of what operators
38230
+ * have asked to be checked, across tracks that no longer exist (D405).
38231
+ *
38232
+ * `setTrackFlags` writes it: a patch carrying `debug: false` still clears
38233
+ * the note off the track row in the same statement (D353's invariant is
38234
+ * untouched), but the note is APPENDED here first. That is the whole point
38235
+ * — before D405, finishing a review destroyed every note written during it,
38236
+ * and the ones that survived aged out with their tracks. This method is the
38237
+ * only way to read what was kept.
38238
+ *
38239
+ * `auth: 'protected'`, matching `setTrackFlags` next door and for the same
38240
+ * reason: the notes are written from the viewer, by an authenticated
38241
+ * non-admin session, and a corpus only an admin can read is a corpus the
38242
+ * person who wrote it cannot use. It carries operator prose about cameras
38243
+ * and nothing else — no media, no paths, no identities beyond a track's
38244
+ * own display label.
38245
+ *
38246
+ * Newest-first, capped by `limit` (default
38247
+ * {@link ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT}), optionally one camera. The
38248
+ * table itself is bounded by row count, not by age — see
38249
+ * {@link MAX_ARCHIVED_DEBUG_NOTES} for why an age clock would be the wrong
38250
+ * bound for exactly this data.
38251
+ */
38252
+ listArchivedDebugNotes: method(ArchivedDebugNoteQueryInputSchema, zod.z.array(ArchivedDebugNoteSchema).readonly(), { kind: "query" }),
38253
+ /**
38203
38254
  * Durable event-store footprint for the management UI: event rows
38204
38255
  * (motion + object + audio) counted per camera + total, plus the
38205
38256
  * event-owned media bytes on disk per camera + total. Stat/count-based,
@@ -54944,6 +54995,12 @@ var require_dist_C_WvDOQ9 = __commonJS({
54944
54995
  addonId: null,
54945
54996
  access: "view"
54946
54997
  },
54998
+ "pipelineAnalytics.listArchivedDebugNotes": {
54999
+ capName: "pipeline-analytics",
55000
+ capScope: "device",
55001
+ addonId: null,
55002
+ access: "view"
55003
+ },
54947
55004
  "pipelineAnalytics.listEventKinds": {
54948
55005
  capName: "pipeline-analytics",
54949
55006
  capScope: "device",
@@ -58731,6 +58788,11 @@ var require_dist_C_WvDOQ9 = __commonJS({
58731
58788
  form: "array",
58732
58789
  optional: true
58733
58790
  }],
58791
+ "pipelineAnalytics.listArchivedDebugNotes": [{
58792
+ name: "deviceId",
58793
+ form: "single",
58794
+ optional: true
58795
+ }],
58734
58796
  "pipelineAnalytics.listEventKinds": [{
58735
58797
  name: "deviceId",
58736
58798
  form: "single",
@@ -61043,7 +61105,7 @@ var require_alerts_addon = __commonJS({
61043
61105
  [Symbol.toStringTag]: { value: "Module" }
61044
61106
  });
61045
61107
  require_chunk_Cek0wNdY();
61046
- var require_dist10 = require_dist_C_WvDOQ9();
61108
+ var require_dist10 = require_dist_C5xJy_uL();
61047
61109
  function selectExpired(alerts, cutoffMs) {
61048
61110
  return alerts.filter((a) => a.createdAt < cutoffMs).sort((a, b) => a.createdAt - b.createdAt).map((a) => a.id);
61049
61111
  }
@@ -61862,7 +61924,7 @@ var require_console_logging = __commonJS({
61862
61924
  [Symbol.toStringTag]: { value: "Module" }
61863
61925
  });
61864
61926
  require_chunk_Cek0wNdY();
61865
- var require_dist10 = require_dist_C_WvDOQ9();
61927
+ var require_dist10 = require_dist_C5xJy_uL();
61866
61928
  var require_formatter = require_formatter_DqAKDlvN();
61867
61929
  var LEVEL_RANK = {
61868
61930
  debug: 0,
@@ -61956,7 +62018,7 @@ var require_core_blocks_addon = __commonJS({
61956
62018
  "use strict";
61957
62019
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
61958
62020
  var require_chunk = require_chunk_Cek0wNdY();
61959
- var require_dist10 = require_dist_C_WvDOQ9();
62021
+ var require_dist10 = require_dist_C5xJy_uL();
61960
62022
  var node_crypto = __require("crypto");
61961
62023
  var node_fs_promises = __require("fs/promises");
61962
62024
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -62853,11 +62915,11 @@ var require_core_blocks = __commonJS({
62853
62915
  }
62854
62916
  });
62855
62917
 
62856
- // ../system/dist/retired-settings-keys-BpasSgff.js
62857
- var require_retired_settings_keys_BpasSgff = __commonJS({
62858
- "../system/dist/retired-settings-keys-BpasSgff.js"(exports) {
62918
+ // ../system/dist/retired-settings-keys-CONISA8J.js
62919
+ var require_retired_settings_keys_CONISA8J = __commonJS({
62920
+ "../system/dist/retired-settings-keys-CONISA8J.js"(exports) {
62859
62921
  "use strict";
62860
- var require_dist10 = require_dist_C_WvDOQ9();
62922
+ var require_dist10 = require_dist_C5xJy_uL();
62861
62923
  function settingsStoreIsAuthoritativeHere(env) {
62862
62924
  const raw = (env["CAMSTACK_ROLE"] ?? "").trim().toLowerCase();
62863
62925
  return raw === "" || raw === "hub";
@@ -65092,8 +65154,8 @@ var require_device_manager_addon = __commonJS({
65092
65154
  [Symbol.toStringTag]: { value: "Module" }
65093
65155
  });
65094
65156
  require_chunk_Cek0wNdY();
65095
- var require_dist10 = require_dist_C_WvDOQ9();
65096
- var require_retired_settings_keys = require_retired_settings_keys_BpasSgff();
65157
+ var require_dist10 = require_dist_C5xJy_uL();
65158
+ var require_retired_settings_keys = require_retired_settings_keys_CONISA8J();
65097
65159
  var node_crypto = __require("crypto");
65098
65160
  var _camstack_types_node = require_node();
65099
65161
  var JOB_HISTORY = 20;
@@ -70718,7 +70780,7 @@ var require_hub_forwarder = __commonJS({
70718
70780
  [Symbol.toStringTag]: { value: "Module" }
70719
70781
  });
70720
70782
  require_chunk_Cek0wNdY();
70721
- var require_dist10 = require_dist_C_WvDOQ9();
70783
+ var require_dist10 = require_dist_C5xJy_uL();
70722
70784
  var require_formatter = require_formatter_DqAKDlvN();
70723
70785
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
70724
70786
  var HubForwarderDestination = class {
@@ -70855,7 +70917,7 @@ var require_liveness_monitor_addon = __commonJS({
70855
70917
  "use strict";
70856
70918
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
70857
70919
  require_chunk_Cek0wNdY();
70858
- var require_dist10 = require_dist_C_WvDOQ9();
70920
+ var require_dist10 = require_dist_C5xJy_uL();
70859
70921
  var NO_DEVICES = "liveness:no-devices";
70860
70922
  var ALL_OFFLINE = "liveness:all-devices-offline";
70861
70923
  var NO_FOOTAGE_PREFIX = "liveness:no-footage:";
@@ -71051,7 +71113,7 @@ var require_local_auth_addon = __commonJS({
71051
71113
  [Symbol.toStringTag]: { value: "Module" }
71052
71114
  });
71053
71115
  var require_chunk = require_chunk_Cek0wNdY();
71054
- var require_dist10 = require_dist_C_WvDOQ9();
71116
+ var require_dist10 = require_dist_C5xJy_uL();
71055
71117
  var node_crypto = __require("crypto");
71056
71118
  node_crypto = require_chunk.__toESM(node_crypto);
71057
71119
  var crypto$1 = __require("crypto");
@@ -78864,7 +78926,7 @@ var require_loki_logging = __commonJS({
78864
78926
  [Symbol.toStringTag]: { value: "Module" }
78865
78927
  });
78866
78928
  require_chunk_Cek0wNdY();
78867
- var require_dist10 = require_dist_C_WvDOQ9();
78929
+ var require_dist10 = require_dist_C5xJy_uL();
78868
78930
  function sanitizeLabelName(raw) {
78869
78931
  const replaced = raw.replaceAll(/[^a-zA-Z0-9_]/g, "_");
78870
78932
  return /^[a-zA-Z_]/.test(replaced) ? replaced : `_${replaced}`;
@@ -79429,7 +79491,7 @@ var require_native_metrics_addon = __commonJS({
79429
79491
  [Symbol.toStringTag]: { value: "Module" }
79430
79492
  });
79431
79493
  var require_chunk = require_chunk_Cek0wNdY();
79432
- var require_dist10 = require_dist_C_WvDOQ9();
79494
+ var require_dist10 = require_dist_C5xJy_uL();
79433
79495
  var node_fs_promises = __require("fs/promises");
79434
79496
  var node_child_process = __require("child_process");
79435
79497
  var node_util = __require("util");
@@ -82013,7 +82075,7 @@ var require_filesystem_storage_addon = __commonJS({
82013
82075
  [Symbol.toStringTag]: { value: "Module" }
82014
82076
  });
82015
82077
  var require_chunk = require_chunk_Cek0wNdY();
82016
- var require_dist10 = require_dist_C_WvDOQ9();
82078
+ var require_dist10 = require_dist_C5xJy_uL();
82017
82079
  var node_crypto = __require("crypto");
82018
82080
  var node_fs_promises = __require("fs/promises");
82019
82081
  var node_path = __require("path");
@@ -83129,8 +83191,8 @@ var require_sqlite_settings_addon = __commonJS({
83129
83191
  [Symbol.toStringTag]: { value: "Module" }
83130
83192
  });
83131
83193
  var require_chunk = require_chunk_Cek0wNdY();
83132
- var require_dist10 = require_dist_C_WvDOQ9();
83133
- var require_retired_settings_keys = require_retired_settings_keys_BpasSgff();
83194
+ var require_dist10 = require_dist_C5xJy_uL();
83195
+ var require_retired_settings_keys = require_retired_settings_keys_CONISA8J();
83134
83196
  var node_crypto = __require("crypto");
83135
83197
  var node_fs = __require("fs");
83136
83198
  var node_module = __require("module");
@@ -85634,7 +85696,7 @@ var require_storage_orchestrator_addon = __commonJS({
85634
85696
  [Symbol.toStringTag]: { value: "Module" }
85635
85697
  });
85636
85698
  var require_chunk = require_chunk_Cek0wNdY();
85637
- var require_dist10 = require_dist_C_WvDOQ9();
85699
+ var require_dist10 = require_dist_C5xJy_uL();
85638
85700
  var require_hub_cap_forward = require_hub_cap_forward_DmHNjbB0();
85639
85701
  var zod = require_zod();
85640
85702
  var node_crypto = __require("crypto");
@@ -89284,7 +89346,7 @@ var require_system_config_addon = __commonJS({
89284
89346
  [Symbol.toStringTag]: { value: "Module" }
89285
89347
  });
89286
89348
  require_chunk_Cek0wNdY();
89287
- var require_dist10 = require_dist_C_WvDOQ9();
89349
+ var require_dist10 = require_dist_C5xJy_uL();
89288
89350
  var SECTION_TITLES = {
89289
89351
  server: "Server",
89290
89352
  auth: "Authentication"
@@ -107345,7 +107407,7 @@ var require_winston_logging = __commonJS({
107345
107407
  [Symbol.toStringTag]: { value: "Module" }
107346
107408
  });
107347
107409
  var require_chunk = require_chunk_Cek0wNdY();
107348
- var require_dist10 = require_dist_C_WvDOQ9();
107410
+ var require_dist10 = require_dist_C5xJy_uL();
107349
107411
  var require_formatter = require_formatter_DqAKDlvN();
107350
107412
  var node_path = __require("path");
107351
107413
  node_path = require_chunk.__toESM(node_path);
@@ -109290,9 +109352,9 @@ var require_event_category_BVo6ta6 = __commonJS({
109290
109352
  }
109291
109353
  });
109292
109354
 
109293
- // ../types/dist/sleep-BZtO-eFY.js
109294
- var require_sleep_BZtO_eFY = __commonJS({
109295
- "../types/dist/sleep-BZtO-eFY.js"(exports) {
109355
+ // ../types/dist/sleep-IjLtwkO5.js
109356
+ var require_sleep_IjLtwkO5 = __commonJS({
109357
+ "../types/dist/sleep-IjLtwkO5.js"(exports) {
109296
109358
  "use strict";
109297
109359
  var require_event_category = require_event_category_BVo6ta6();
109298
109360
  var zod = require_zod();
@@ -112024,6 +112086,7 @@ var require_sleep_BZtO_eFY = __commonJS({
112024
112086
  reconcileFromDisk: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "reconcileFromDisk", "mutation", input),
112025
112087
  deleteTracks: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "deleteTracks", "mutation", input),
112026
112088
  setTrackFlags: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "setTrackFlags", "mutation", input),
112089
+ listArchivedDebugNotes: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "listArchivedDebugNotes", "query", input),
112027
112090
  getEventStoreFootprint: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getEventStoreFootprint", "query", input),
112028
112091
  getEventMediaFootprintByKind: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getEventMediaFootprintByKind", "query", input),
112029
112092
  pruneEvents: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "pruneEvents", "mutation", input),
@@ -113024,7 +113087,7 @@ var require_addon = __commonJS({
113024
113087
  "use strict";
113025
113088
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
113026
113089
  var require_event_category = require_event_category_BVo6ta6();
113027
- var require_sleep = require_sleep_BZtO_eFY();
113090
+ var require_sleep = require_sleep_IjLtwkO5();
113028
113091
  var require_err_msg = require_err_msg_COpsHMw2();
113029
113092
  var CAP_INPUT_DEFAULTS = Object.freeze({
113030
113093
  "addons": { "getLogs": { "limit": 100 } },
@@ -131955,7 +132018,7 @@ var require_dist3 = __commonJS({
131955
132018
  "use strict";
131956
132019
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
131957
132020
  var require_chunk = require_chunk_Cek0wNdY();
131958
- var require_dist10 = require_dist_C_WvDOQ9();
132021
+ var require_dist10 = require_dist_C5xJy_uL();
131959
132022
  var require_builtins_alerts_alerts_addon = require_alerts_addon();
131960
132023
  require_alerts();
131961
132024
  var require_formatter = require_formatter_DqAKDlvN();
@@ -213072,7 +213135,7 @@ var require_dist4 = __commonJS({
213072
213135
  "use strict";
213073
213136
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
213074
213137
  var require_event_category = require_event_category_BVo6ta6();
213075
- var require_sleep = require_sleep_BZtO_eFY();
213138
+ var require_sleep = require_sleep_IjLtwkO5();
213076
213139
  var require_canonical_hash = require_canonical_hash_DNV8S5ET();
213077
213140
  var require_enums2 = require_enums();
213078
213141
  var require_err_msg = require_err_msg_COpsHMw2();
@@ -213825,6 +213888,34 @@ var require_dist4 = __commonJS({
213825
213888
  for (const tab of tabs) for (const child of fieldsOf(tab)) walkField(child, out);
213826
213889
  }
213827
213890
  }
213891
+ var MAX_ARCHIVED_DEBUG_NOTES = 5e3;
213892
+ var ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT = 200;
213893
+ var ArchivedDebugNoteSchema = zod.z.object({
213894
+ /** Archive row id. Derived from `(sourceTrackId, note)`, so re-archiving the
213895
+ * same sentence about the same track lands on the row already there. */
213896
+ id: zod.z.string(),
213897
+ /** The operator's own words, verbatim. */
213898
+ note: zod.z.string(),
213899
+ /** The camera. Required — every question here is asked per-camera. */
213900
+ deviceId: zod.z.number().int(),
213901
+ /** The track the note was written on. PROVENANCE, not ownership: the track
213902
+ * is expected to be gone, and this row is not a reference to it. */
213903
+ sourceTrackId: zod.z.string(),
213904
+ /** Epoch ms the note was moved here, i.e. when the operator reviewed it. */
213905
+ archivedAt: zod.z.number().int(),
213906
+ /** The track's `firstSeen`, when the row still knew it; `null` otherwise. */
213907
+ trackStartedAt: zod.z.number().int().nullable(),
213908
+ /** The track's detector class (`person`, `car`, …); `null` when unknown. */
213909
+ trackClass: zod.z.string().nullable(),
213910
+ /** The track's display label at review time; `null` when it had none. */
213911
+ trackLabel: zod.z.string().nullable()
213912
+ });
213913
+ var ArchivedDebugNoteQueryInputSchema = zod.z.object({
213914
+ /** Restrict to a single camera; omit for every row. */
213915
+ deviceId: zod.z.number().int().optional(),
213916
+ /** Max rows returned, newest-first. */
213917
+ limit: zod.z.number().int().min(1).max(1e3).optional()
213918
+ });
213828
213919
  var STREAM_QUALITY_LABELS = {
213829
213920
  high: "High",
213830
213921
  mid: "Mid",
@@ -228380,6 +228471,31 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
228380
228471
  flags: TrackFlagsPatchSchema
228381
228472
  }), TrackFlagsSchema, { kind: "mutation" }),
228382
228473
  /**
228474
+ * The archived debug notes, newest first — the corpus of what operators
228475
+ * have asked to be checked, across tracks that no longer exist (D405).
228476
+ *
228477
+ * `setTrackFlags` writes it: a patch carrying `debug: false` still clears
228478
+ * the note off the track row in the same statement (D353's invariant is
228479
+ * untouched), but the note is APPENDED here first. That is the whole point
228480
+ * — before D405, finishing a review destroyed every note written during it,
228481
+ * and the ones that survived aged out with their tracks. This method is the
228482
+ * only way to read what was kept.
228483
+ *
228484
+ * `auth: 'protected'`, matching `setTrackFlags` next door and for the same
228485
+ * reason: the notes are written from the viewer, by an authenticated
228486
+ * non-admin session, and a corpus only an admin can read is a corpus the
228487
+ * person who wrote it cannot use. It carries operator prose about cameras
228488
+ * and nothing else — no media, no paths, no identities beyond a track's
228489
+ * own display label.
228490
+ *
228491
+ * Newest-first, capped by `limit` (default
228492
+ * {@link ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT}), optionally one camera. The
228493
+ * table itself is bounded by row count, not by age — see
228494
+ * {@link MAX_ARCHIVED_DEBUG_NOTES} for why an age clock would be the wrong
228495
+ * bound for exactly this data.
228496
+ */
228497
+ listArchivedDebugNotes: require_sleep.method(ArchivedDebugNoteQueryInputSchema, zod.z.array(ArchivedDebugNoteSchema).readonly(), { kind: "query" }),
228498
+ /**
228383
228499
  * Durable event-store footprint for the management UI: event rows
228384
228500
  * (motion + object + audio) counted per camera + total, plus the
228385
228501
  * event-owned media bytes on disk per camera + total. Stat/count-based,
@@ -248811,6 +248927,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
248811
248927
  addonId: null,
248812
248928
  access: "view"
248813
248929
  },
248930
+ "pipelineAnalytics.listArchivedDebugNotes": {
248931
+ capName: "pipeline-analytics",
248932
+ capScope: "device",
248933
+ addonId: null,
248934
+ access: "view"
248935
+ },
248814
248936
  "pipelineAnalytics.listEventKinds": {
248815
248937
  capName: "pipeline-analytics",
248816
248938
  capScope: "device",
@@ -252862,6 +252984,11 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
252862
252984
  form: "array",
252863
252985
  optional: true
252864
252986
  }],
252987
+ "pipelineAnalytics.listArchivedDebugNotes": [{
252988
+ name: "deviceId",
252989
+ form: "single",
252990
+ optional: true
252991
+ }],
252865
252992
  "pipelineAnalytics.listEventKinds": [{
252866
252993
  name: "deviceId",
252867
252994
  form: "single",
@@ -257521,6 +257648,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
257521
257648
  exports.ALEXA_EGRESS_PROFILE = ALEXA_EGRESS_PROFILE;
257522
257649
  exports.ALL_CAPABILITY_DEFINITIONS = ALL_CAPABILITY_DEFINITIONS;
257523
257650
  exports.APPLE_SA_TO_MACRO = APPLE_SA_TO_MACRO;
257651
+ exports.ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT = ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT;
257524
257652
  exports.AUDIO_ANALYSIS_CAP_NAME = AUDIO_ANALYSIS_CAP_NAME;
257525
257653
  exports.AUDIO_BACKEND_CHOICES = AUDIO_BACKEND_CHOICES;
257526
257654
  exports.AUDIO_MACRO_LABELS = AUDIO_MACRO_LABELS;
@@ -257558,6 +257686,8 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
257558
257686
  exports.ApiKeySummarySchema = ApiKeySummarySchema;
257559
257687
  exports.ArchiveEntrySchema = ArchiveEntrySchema;
257560
257688
  exports.ArchiveManifestSchema = ArchiveManifestSchema;
257689
+ exports.ArchivedDebugNoteQueryInputSchema = ArchivedDebugNoteQueryInputSchema;
257690
+ exports.ArchivedDebugNoteSchema = ArchivedDebugNoteSchema;
257561
257691
  exports.AttachmentMediaTypeSchema = AttachmentMediaTypeSchema;
257562
257692
  exports.AttachmentSchema = AttachmentSchema;
257563
257693
  exports.AudioAnalysisResultSchema = AudioAnalysisResultSchema;
@@ -257978,6 +258108,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
257978
258108
  exports.LoginMethodContributionSchema = LoginMethodContributionSchema;
257979
258109
  exports.LoginStageEnum = LoginStageEnum;
257980
258110
  exports.MACRO_LABELS = MACRO_LABELS;
258111
+ exports.MAX_ARCHIVED_DEBUG_NOTES = MAX_ARCHIVED_DEBUG_NOTES;
257981
258112
  exports.MAX_CLIP_EVENT_IDS = MAX_CLIP_EVENT_IDS;
257982
258113
  exports.MAX_CLIP_LABELS = MAX_CLIP_LABELS;
257983
258114
  exports.MAX_CONDITION_DEPTH = MAX_CONDITION_DEPTH;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "camstack",
3
- "version": "1.2.126",
3
+ "version": "1.2.127",
4
4
  "description": "CLI tool for managing and running CamStack server",
5
5
  "keywords": [
6
6
  "camstack",