camstack 1.2.45 → 1.2.46

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-DJlqY62B.mjs
14525
+ // ../types/dist/sleep-CdbM8ge4.mjs
14526
14526
  var WELL_KNOWN_TABS = [
14527
14527
  {
14528
14528
  id: "overview",
@@ -23694,7 +23694,23 @@ var NcHistoryEntrySchema = external_exports.object({
23694
23694
  updatedAt: external_exports.number(),
23695
23695
  /** Failure detail — present on a `dead` row. */
23696
23696
  error: external_exports.string().optional(),
23697
- subject: NcHistorySubjectSchema
23697
+ subject: NcHistorySubjectSchema,
23698
+ /**
23699
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
23700
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
23701
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
23702
+ * every delivery attempt). Absent on a row still pending/dead, a row
23703
+ * delivered before this field shipped, or a wiring with no artefact index.
23704
+ *
23705
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
23706
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
23707
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
23708
+ * also answers `null` for an id whose artefact has since expired past the
23709
+ * retained shelf's own age bound — the degrade a caller (the Home
23710
+ * Assistant export) must render as "no image right now", never as a
23711
+ * broken link.
23712
+ */
23713
+ artifactIds: external_exports.array(external_exports.string().min(1)).optional()
23698
23714
  });
23699
23715
  var NcHistoryFilterSchema = external_exports.object({
23700
23716
  ruleId: external_exports.string().optional(),
@@ -23940,6 +23956,20 @@ var notificationRulesCapability = {
23940
23956
  */
23941
23957
  getHistory: method(external_exports.object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), external_exports.object({ entries: external_exports.array(NcHistoryEntrySchema) }), { auth: "admin" }),
23942
23958
  /**
23959
+ * Mint a fresh, externally-reachable URL for one artefact a history row
23960
+ * named in {@link NcHistoryEntrySchema.shape.artifactIds} — the SAME
23961
+ * signed-link mechanism the dispatcher uses to attach media to an
23962
+ * outgoing notification (one derivation; this never re-implements it).
23963
+ *
23964
+ * `url: null` on THREE causes a caller must treat identically ("no image
23965
+ * right now", never a broken link): the id is unknown, its artefact has
23966
+ * expired past the retained shelf's own age bound, or this install has no
23967
+ * externally-reachable base URL. A caller that received a URL on a
23968
+ * previous call and now gets `null` must stop showing it — a link that
23969
+ * worked five minutes ago is not proof it works now.
23970
+ */
23971
+ resolveArtifactUrl: method(external_exports.object({ artifactId: external_exports.string().min(1) }), external_exports.object({ url: external_exports.string().nullable() }), { auth: "admin" }),
23972
+ /**
23943
23973
  * Snooze windows currently in effect, plus any whose digest has not yet
23944
23974
  * gone out. `caller: 'required'`: a user sees their OWN windows and the
23945
23975
  * global ones that silence them, never another person's private silence.
@@ -35381,6 +35411,23 @@ var ReadGopBytesResultSchema = external_exports.object({
35381
35411
  /** Media ms the returned fragment covers. */
35382
35412
  gopDurMs: external_exports.number()
35383
35413
  });
35414
+ var ReadWindowBytesResultSchema = external_exports.discriminatedUnion("kind", [external_exports.object({
35415
+ kind: external_exports.literal("ok"),
35416
+ data: external_exports.instanceof(Uint8Array),
35417
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
35418
+ * the requested `fromMs` (anchored on the nearest keyframe). */
35419
+ gopStartMs: external_exports.number(),
35420
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
35421
+ gopDurMs: external_exports.number(),
35422
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
35423
+ * the requested `toMs`; the caller got fewer frames than asked for. */
35424
+ reachesRequestedEnd: external_exports.boolean()
35425
+ }), external_exports.object({
35426
+ kind: external_exports.literal("spans-multiple-segments"),
35427
+ /** Where the covering segment's own footage runs out — informational,
35428
+ * not a retry hint (retrying the same window would refuse again). */
35429
+ segmentEndMs: external_exports.number()
35430
+ })]);
35384
35431
  var recordingCapability = {
35385
35432
  name: "recording",
35386
35433
  scope: "system",
@@ -35460,6 +35507,21 @@ var recordingCapability = {
35460
35507
  kind: "query",
35461
35508
  auth: "admin"
35462
35509
  }),
35510
+ /** Read a WINDOW `[fromMs, toMs)` of segment `startMs`, by mfra byte
35511
+ * range — the multi-GOP twin of `readGopBytes`. Refuses (does not
35512
+ * degrade) when the window runs past the covering segment. Used by the
35513
+ * replay clip's `recording` source to fetch several seconds of native
35514
+ * footage for its single ffmpeg decode pass. */
35515
+ readWindowBytes: method(external_exports.object({
35516
+ deviceId: external_exports.number(),
35517
+ profile: external_exports.string(),
35518
+ startMs: external_exports.number(),
35519
+ fromMs: external_exports.number(),
35520
+ toMs: external_exports.number()
35521
+ }), ReadWindowBytesResultSchema, {
35522
+ kind: "query",
35523
+ auth: "admin"
35524
+ }),
35463
35525
  setDeviceConfig: method(external_exports.object({
35464
35526
  deviceId: external_exports.number(),
35465
35527
  config: RecordingConfigSchema
@@ -40278,6 +40340,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
40278
40340
  addonId: null,
40279
40341
  access: "view"
40280
40342
  },
40343
+ "notificationRules.resolveArtifactUrl": {
40344
+ capName: "notification-rules",
40345
+ capScope: "system",
40346
+ addonId: null,
40347
+ access: "view"
40348
+ },
40281
40349
  "notificationRules.setAlarmConfig": {
40282
40350
  capName: "notification-rules",
40283
40351
  capScope: "system",
@@ -41682,6 +41750,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
41682
41750
  addonId: null,
41683
41751
  access: "view"
41684
41752
  },
41753
+ "recording.readWindowBytes": {
41754
+ capName: "recording",
41755
+ capScope: "system",
41756
+ addonId: null,
41757
+ access: "view"
41758
+ },
41685
41759
  "recording.refreshStorageLocationsForMigration": {
41686
41760
  capName: "recording",
41687
41761
  capScope: "system",
@@ -44512,6 +44586,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
44512
44586
  form: "single",
44513
44587
  optional: false
44514
44588
  }],
44589
+ "recording.readWindowBytes": [{
44590
+ name: "deviceId",
44591
+ form: "single",
44592
+ optional: false
44593
+ }],
44515
44594
  "recording.relocateFootage": [{
44516
44595
  name: "deviceId",
44517
44596
  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-3WS4SP46.js";
4
+ } from "./chunk-HAO7UL6U.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-ENSEYM5A.js");
41
+ await import("./launcher-Y5I6QU24.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-ENSEYM5A.js");
86
+ await import("./launcher-Y5I6QU24.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-6BMNE6PK.js");
1133
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-27QPK6P7.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-3WS4SP46.js";
8
+ } from "./chunk-HAO7UL6U.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-BNhvXrQk.js
23637
- var require_dist_BNhvXrQk = __commonJS({
23638
- "../system/dist/dist-BNhvXrQk.js"(exports) {
23636
+ // ../system/dist/dist-jRSrzoXr.js
23637
+ var require_dist_jRSrzoXr = __commonJS({
23638
+ "../system/dist/dist-jRSrzoXr.js"(exports) {
23639
23639
  "use strict";
23640
23640
  var zod = require_zod();
23641
23641
  var EventCategory = /* @__PURE__ */ (function(EventCategory2) {
@@ -34136,7 +34136,23 @@ var require_dist_BNhvXrQk = __commonJS({
34136
34136
  updatedAt: zod.z.number(),
34137
34137
  /** Failure detail — present on a `dead` row. */
34138
34138
  error: zod.z.string().optional(),
34139
- subject: NcHistorySubjectSchema
34139
+ subject: NcHistorySubjectSchema,
34140
+ /**
34141
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
34142
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
34143
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
34144
+ * every delivery attempt). Absent on a row still pending/dead, a row
34145
+ * delivered before this field shipped, or a wiring with no artefact index.
34146
+ *
34147
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
34148
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
34149
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
34150
+ * also answers `null` for an id whose artefact has since expired past the
34151
+ * retained shelf's own age bound — the degrade a caller (the Home
34152
+ * Assistant export) must render as "no image right now", never as a
34153
+ * broken link.
34154
+ */
34155
+ artifactIds: zod.z.array(zod.z.string().min(1)).optional()
34140
34156
  });
34141
34157
  var NcHistoryFilterSchema = zod.z.object({
34142
34158
  ruleId: zod.z.string().optional(),
@@ -34382,6 +34398,20 @@ var require_dist_BNhvXrQk = __commonJS({
34382
34398
  */
34383
34399
  getHistory: method(zod.z.object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), zod.z.object({ entries: zod.z.array(NcHistoryEntrySchema) }), { auth: "admin" }),
34384
34400
  /**
34401
+ * Mint a fresh, externally-reachable URL for one artefact a history row
34402
+ * named in {@link NcHistoryEntrySchema.shape.artifactIds} — the SAME
34403
+ * signed-link mechanism the dispatcher uses to attach media to an
34404
+ * outgoing notification (one derivation; this never re-implements it).
34405
+ *
34406
+ * `url: null` on THREE causes a caller must treat identically ("no image
34407
+ * right now", never a broken link): the id is unknown, its artefact has
34408
+ * expired past the retained shelf's own age bound, or this install has no
34409
+ * externally-reachable base URL. A caller that received a URL on a
34410
+ * previous call and now gets `null` must stop showing it — a link that
34411
+ * worked five minutes ago is not proof it works now.
34412
+ */
34413
+ resolveArtifactUrl: method(zod.z.object({ artifactId: zod.z.string().min(1) }), zod.z.object({ url: zod.z.string().nullable() }), { auth: "admin" }),
34414
+ /**
34385
34415
  * Snooze windows currently in effect, plus any whose digest has not yet
34386
34416
  * gone out. `caller: 'required'`: a user sees their OWN windows and the
34387
34417
  * global ones that silence them, never another person's private silence.
@@ -45678,6 +45708,23 @@ var require_dist_BNhvXrQk = __commonJS({
45678
45708
  /** Media ms the returned fragment covers. */
45679
45709
  gopDurMs: zod.z.number()
45680
45710
  });
45711
+ var ReadWindowBytesResultSchema = zod.z.discriminatedUnion("kind", [zod.z.object({
45712
+ kind: zod.z.literal("ok"),
45713
+ data: zod.z.instanceof(Uint8Array),
45714
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
45715
+ * the requested `fromMs` (anchored on the nearest keyframe). */
45716
+ gopStartMs: zod.z.number(),
45717
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
45718
+ gopDurMs: zod.z.number(),
45719
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
45720
+ * the requested `toMs`; the caller got fewer frames than asked for. */
45721
+ reachesRequestedEnd: zod.z.boolean()
45722
+ }), zod.z.object({
45723
+ kind: zod.z.literal("spans-multiple-segments"),
45724
+ /** Where the covering segment's own footage runs out — informational,
45725
+ * not a retry hint (retrying the same window would refuse again). */
45726
+ segmentEndMs: zod.z.number()
45727
+ })]);
45681
45728
  var recordingCapability = {
45682
45729
  name: "recording",
45683
45730
  scope: "system",
@@ -45757,6 +45804,21 @@ var require_dist_BNhvXrQk = __commonJS({
45757
45804
  kind: "query",
45758
45805
  auth: "admin"
45759
45806
  }),
45807
+ /** Read a WINDOW `[fromMs, toMs)` of segment `startMs`, by mfra byte
45808
+ * range — the multi-GOP twin of `readGopBytes`. Refuses (does not
45809
+ * degrade) when the window runs past the covering segment. Used by the
45810
+ * replay clip's `recording` source to fetch several seconds of native
45811
+ * footage for its single ffmpeg decode pass. */
45812
+ readWindowBytes: method(zod.z.object({
45813
+ deviceId: zod.z.number(),
45814
+ profile: zod.z.string(),
45815
+ startMs: zod.z.number(),
45816
+ fromMs: zod.z.number(),
45817
+ toMs: zod.z.number()
45818
+ }), ReadWindowBytesResultSchema, {
45819
+ kind: "query",
45820
+ auth: "admin"
45821
+ }),
45760
45822
  setDeviceConfig: method(zod.z.object({
45761
45823
  deviceId: zod.z.number(),
45762
45824
  config: RecordingConfigSchema
@@ -51265,6 +51327,12 @@ var require_dist_BNhvXrQk = __commonJS({
51265
51327
  addonId: null,
51266
51328
  access: "view"
51267
51329
  },
51330
+ "notificationRules.resolveArtifactUrl": {
51331
+ capName: "notification-rules",
51332
+ capScope: "system",
51333
+ addonId: null,
51334
+ access: "view"
51335
+ },
51268
51336
  "notificationRules.setAlarmConfig": {
51269
51337
  capName: "notification-rules",
51270
51338
  capScope: "system",
@@ -52669,6 +52737,12 @@ var require_dist_BNhvXrQk = __commonJS({
52669
52737
  addonId: null,
52670
52738
  access: "view"
52671
52739
  },
52740
+ "recording.readWindowBytes": {
52741
+ capName: "recording",
52742
+ capScope: "system",
52743
+ addonId: null,
52744
+ access: "view"
52745
+ },
52672
52746
  "recording.refreshStorageLocationsForMigration": {
52673
52747
  capName: "recording",
52674
52748
  capScope: "system",
@@ -55499,6 +55573,11 @@ var require_dist_BNhvXrQk = __commonJS({
55499
55573
  form: "single",
55500
55574
  optional: false
55501
55575
  }],
55576
+ "recording.readWindowBytes": [{
55577
+ name: "deviceId",
55578
+ form: "single",
55579
+ optional: false
55580
+ }],
55502
55581
  "recording.relocateFootage": [{
55503
55582
  name: "deviceId",
55504
55583
  form: "single",
@@ -57153,7 +57232,7 @@ var require_alerts_addon = __commonJS({
57153
57232
  [Symbol.toStringTag]: { value: "Module" }
57154
57233
  });
57155
57234
  require_chunk_Cek0wNdY();
57156
- var require_dist10 = require_dist_BNhvXrQk();
57235
+ var require_dist10 = require_dist_jRSrzoXr();
57157
57236
  function selectExpired(alerts, cutoffMs) {
57158
57237
  return alerts.filter((a) => a.createdAt < cutoffMs).sort((a, b) => a.createdAt - b.createdAt).map((a) => a.id);
57159
57238
  }
@@ -57972,7 +58051,7 @@ var require_console_logging = __commonJS({
57972
58051
  [Symbol.toStringTag]: { value: "Module" }
57973
58052
  });
57974
58053
  require_chunk_Cek0wNdY();
57975
- var require_dist10 = require_dist_BNhvXrQk();
58054
+ var require_dist10 = require_dist_jRSrzoXr();
57976
58055
  var require_formatter = require_formatter_DqAKDlvN();
57977
58056
  var LEVEL_RANK = {
57978
58057
  debug: 0,
@@ -58066,7 +58145,7 @@ var require_core_blocks_addon = __commonJS({
58066
58145
  "use strict";
58067
58146
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
58068
58147
  var require_chunk = require_chunk_Cek0wNdY();
58069
- var require_dist10 = require_dist_BNhvXrQk();
58148
+ var require_dist10 = require_dist_jRSrzoXr();
58070
58149
  var node_crypto = __require("crypto");
58071
58150
  var node_fs_promises = __require("fs/promises");
58072
58151
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -58963,11 +59042,11 @@ var require_core_blocks = __commonJS({
58963
59042
  }
58964
59043
  });
58965
59044
 
58966
- // ../system/dist/retired-settings-keys-DVgdWTd7.js
58967
- var require_retired_settings_keys_DVgdWTd7 = __commonJS({
58968
- "../system/dist/retired-settings-keys-DVgdWTd7.js"(exports) {
59045
+ // ../system/dist/retired-settings-keys-ovd_DQzc.js
59046
+ var require_retired_settings_keys_ovd_DQzc = __commonJS({
59047
+ "../system/dist/retired-settings-keys-ovd_DQzc.js"(exports) {
58969
59048
  "use strict";
58970
- var require_dist10 = require_dist_BNhvXrQk();
59049
+ var require_dist10 = require_dist_jRSrzoXr();
58971
59050
  function settingsStoreIsAuthoritativeHere(env) {
58972
59051
  const raw = (env["CAMSTACK_ROLE"] ?? "").trim().toLowerCase();
58973
59052
  return raw === "" || raw === "hub";
@@ -61010,8 +61089,8 @@ var require_device_manager_addon = __commonJS({
61010
61089
  [Symbol.toStringTag]: { value: "Module" }
61011
61090
  });
61012
61091
  require_chunk_Cek0wNdY();
61013
- var require_dist10 = require_dist_BNhvXrQk();
61014
- var require_retired_settings_keys = require_retired_settings_keys_DVgdWTd7();
61092
+ var require_dist10 = require_dist_jRSrzoXr();
61093
+ var require_retired_settings_keys = require_retired_settings_keys_ovd_DQzc();
61015
61094
  var node_crypto = __require("crypto");
61016
61095
  var _camstack_types_node = require_node();
61017
61096
  var JOB_HISTORY = 20;
@@ -65680,7 +65759,7 @@ var require_hub_forwarder = __commonJS({
65680
65759
  [Symbol.toStringTag]: { value: "Module" }
65681
65760
  });
65682
65761
  require_chunk_Cek0wNdY();
65683
- var require_dist10 = require_dist_BNhvXrQk();
65762
+ var require_dist10 = require_dist_jRSrzoXr();
65684
65763
  var require_formatter = require_formatter_DqAKDlvN();
65685
65764
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
65686
65765
  var HubForwarderDestination = class {
@@ -65817,7 +65896,7 @@ var require_liveness_monitor_addon = __commonJS({
65817
65896
  "use strict";
65818
65897
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
65819
65898
  require_chunk_Cek0wNdY();
65820
- var require_dist10 = require_dist_BNhvXrQk();
65899
+ var require_dist10 = require_dist_jRSrzoXr();
65821
65900
  var NO_DEVICES = "liveness:no-devices";
65822
65901
  var ALL_OFFLINE = "liveness:all-devices-offline";
65823
65902
  var NO_FOOTAGE_PREFIX = "liveness:no-footage:";
@@ -66007,7 +66086,7 @@ var require_local_auth_addon = __commonJS({
66007
66086
  [Symbol.toStringTag]: { value: "Module" }
66008
66087
  });
66009
66088
  var require_chunk = require_chunk_Cek0wNdY();
66010
- var require_dist10 = require_dist_BNhvXrQk();
66089
+ var require_dist10 = require_dist_jRSrzoXr();
66011
66090
  var node_crypto = __require("crypto");
66012
66091
  node_crypto = require_chunk.__toESM(node_crypto);
66013
66092
  var crypto$1 = __require("crypto");
@@ -73691,7 +73770,7 @@ var require_loki_logging = __commonJS({
73691
73770
  [Symbol.toStringTag]: { value: "Module" }
73692
73771
  });
73693
73772
  require_chunk_Cek0wNdY();
73694
- var require_dist10 = require_dist_BNhvXrQk();
73773
+ var require_dist10 = require_dist_jRSrzoXr();
73695
73774
  function sanitizeLabelName(raw) {
73696
73775
  const replaced = raw.replaceAll(/[^a-zA-Z0-9_]/g, "_");
73697
73776
  return /^[a-zA-Z_]/.test(replaced) ? replaced : `_${replaced}`;
@@ -74256,7 +74335,7 @@ var require_native_metrics_addon = __commonJS({
74256
74335
  [Symbol.toStringTag]: { value: "Module" }
74257
74336
  });
74258
74337
  var require_chunk = require_chunk_Cek0wNdY();
74259
- var require_dist10 = require_dist_BNhvXrQk();
74338
+ var require_dist10 = require_dist_jRSrzoXr();
74260
74339
  var node_child_process = __require("child_process");
74261
74340
  var node_util = __require("util");
74262
74341
  var node_os = __require("os");
@@ -75198,7 +75277,7 @@ var require_filesystem_storage_addon = __commonJS({
75198
75277
  [Symbol.toStringTag]: { value: "Module" }
75199
75278
  });
75200
75279
  var require_chunk = require_chunk_Cek0wNdY();
75201
- var require_dist10 = require_dist_BNhvXrQk();
75280
+ var require_dist10 = require_dist_jRSrzoXr();
75202
75281
  var node_crypto = __require("crypto");
75203
75282
  var node_fs_promises = __require("fs/promises");
75204
75283
  var node_path = __require("path");
@@ -76314,8 +76393,8 @@ var require_sqlite_settings_addon = __commonJS({
76314
76393
  [Symbol.toStringTag]: { value: "Module" }
76315
76394
  });
76316
76395
  var require_chunk = require_chunk_Cek0wNdY();
76317
- var require_dist10 = require_dist_BNhvXrQk();
76318
- var require_retired_settings_keys = require_retired_settings_keys_DVgdWTd7();
76396
+ var require_dist10 = require_dist_jRSrzoXr();
76397
+ var require_retired_settings_keys = require_retired_settings_keys_ovd_DQzc();
76319
76398
  var node_crypto = __require("crypto");
76320
76399
  var node_fs = __require("fs");
76321
76400
  var node_module = __require("module");
@@ -78509,7 +78588,7 @@ var require_storage_orchestrator_addon = __commonJS({
78509
78588
  [Symbol.toStringTag]: { value: "Module" }
78510
78589
  });
78511
78590
  var require_chunk = require_chunk_Cek0wNdY();
78512
- var require_dist10 = require_dist_BNhvXrQk();
78591
+ var require_dist10 = require_dist_jRSrzoXr();
78513
78592
  var node_crypto = __require("crypto");
78514
78593
  var node_fs_promises = __require("fs/promises");
78515
78594
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -80388,7 +80467,7 @@ var require_system_config_addon = __commonJS({
80388
80467
  [Symbol.toStringTag]: { value: "Module" }
80389
80468
  });
80390
80469
  require_chunk_Cek0wNdY();
80391
- var require_dist10 = require_dist_BNhvXrQk();
80470
+ var require_dist10 = require_dist_jRSrzoXr();
80392
80471
  var SECTION_TITLES = {
80393
80472
  server: "Server",
80394
80473
  auth: "Authentication"
@@ -98449,7 +98528,7 @@ var require_winston_logging = __commonJS({
98449
98528
  [Symbol.toStringTag]: { value: "Module" }
98450
98529
  });
98451
98530
  var require_chunk = require_chunk_Cek0wNdY();
98452
- var require_dist10 = require_dist_BNhvXrQk();
98531
+ var require_dist10 = require_dist_jRSrzoXr();
98453
98532
  var require_formatter = require_formatter_DqAKDlvN();
98454
98533
  var node_path = __require("path");
98455
98534
  node_path = require_chunk.__toESM(node_path);
@@ -100392,9 +100471,9 @@ var require_event_category_EY0GNjV9 = __commonJS({
100392
100471
  }
100393
100472
  });
100394
100473
 
100395
- // ../types/dist/sleep-BCRrMlni.js
100396
- var require_sleep_BCRrMlni = __commonJS({
100397
- "../types/dist/sleep-BCRrMlni.js"(exports) {
100474
+ // ../types/dist/sleep-CSodb2vQ.js
100475
+ var require_sleep_CSodb2vQ = __commonJS({
100476
+ "../types/dist/sleep-CSodb2vQ.js"(exports) {
100398
100477
  "use strict";
100399
100478
  var require_event_category = require_event_category_EY0GNjV9();
100400
100479
  var zod = require_zod();
@@ -102922,6 +103001,7 @@ var require_sleep_BCRrMlni = __commonJS({
102922
103001
  testRule: (input) => dispatch("notification-rules", "notificationRules", "testRule", "mutation", input),
102923
103002
  getConditionCatalog: (input) => dispatch("notification-rules", "notificationRules", "getConditionCatalog", "query", input),
102924
103003
  getHistory: (input) => dispatch("notification-rules", "notificationRules", "getHistory", "query", input),
103004
+ resolveArtifactUrl: (input) => dispatch("notification-rules", "notificationRules", "resolveArtifactUrl", "query", input),
102925
103005
  listSnoozes: (input) => dispatch("notification-rules", "notificationRules", "listSnoozes", "query", input),
102926
103006
  createSnooze: (input) => dispatch("notification-rules", "notificationRules", "createSnooze", "mutation", input),
102927
103007
  cancelSnooze: (input) => dispatch("notification-rules", "notificationRules", "cancelSnooze", "mutation", input),
@@ -103265,6 +103345,7 @@ var require_sleep_BCRrMlni = __commonJS({
103265
103345
  locateSegment: (input) => dispatchSystem("recording", "locateSegment", "query", input),
103266
103346
  readSegmentBytes: (input) => dispatchSystem("recording", "readSegmentBytes", "query", input),
103267
103347
  readGopBytes: (input) => dispatchSystem("recording", "readGopBytes", "query", input),
103348
+ readWindowBytes: (input) => dispatchSystem("recording", "readWindowBytes", "query", input),
103268
103349
  setDeviceConfig: (input) => dispatchSystem("recording", "setDeviceConfig", "mutation", input),
103269
103350
  rescanStorage: (input) => dispatchSystem("recording", "rescanStorage", "mutation", input),
103270
103351
  pruneFootage: (input) => dispatchSystem("recording", "pruneFootage", "mutation", input),
@@ -103946,7 +104027,7 @@ var require_addon = __commonJS({
103946
104027
  "use strict";
103947
104028
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
103948
104029
  var require_event_category = require_event_category_EY0GNjV9();
103949
- var require_sleep = require_sleep_BCRrMlni();
104030
+ var require_sleep = require_sleep_CSodb2vQ();
103950
104031
  var require_err_msg = require_err_msg_COpsHMw2();
103951
104032
  var CAP_INPUT_DEFAULTS = Object.freeze({
103952
104033
  "addons": { "getLogs": { "limit": 100 } },
@@ -121685,7 +121766,7 @@ var require_dist3 = __commonJS({
121685
121766
  "use strict";
121686
121767
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
121687
121768
  var require_chunk = require_chunk_Cek0wNdY();
121688
- var require_dist10 = require_dist_BNhvXrQk();
121769
+ var require_dist10 = require_dist_jRSrzoXr();
121689
121770
  var require_builtins_alerts_alerts_addon = require_alerts_addon();
121690
121771
  require_alerts();
121691
121772
  var require_formatter = require_formatter_DqAKDlvN();
@@ -202333,7 +202414,7 @@ var require_dist4 = __commonJS({
202333
202414
  "use strict";
202334
202415
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
202335
202416
  var require_event_category = require_event_category_EY0GNjV9();
202336
- var require_sleep = require_sleep_BCRrMlni();
202417
+ var require_sleep = require_sleep_CSodb2vQ();
202337
202418
  var require_canonical_hash = require_canonical_hash_DNV8S5ET();
202338
202419
  var require_enums2 = require_enums();
202339
202420
  var require_err_msg = require_err_msg_COpsHMw2();
@@ -213320,7 +213401,23 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
213320
213401
  updatedAt: zod.z.number(),
213321
213402
  /** Failure detail — present on a `dead` row. */
213322
213403
  error: zod.z.string().optional(),
213323
- subject: NcHistorySubjectSchema
213404
+ subject: NcHistorySubjectSchema,
213405
+ /**
213406
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
213407
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
213408
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
213409
+ * every delivery attempt). Absent on a row still pending/dead, a row
213410
+ * delivered before this field shipped, or a wiring with no artefact index.
213411
+ *
213412
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
213413
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
213414
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
213415
+ * also answers `null` for an id whose artefact has since expired past the
213416
+ * retained shelf's own age bound — the degrade a caller (the Home
213417
+ * Assistant export) must render as "no image right now", never as a
213418
+ * broken link.
213419
+ */
213420
+ artifactIds: zod.z.array(zod.z.string().min(1)).optional()
213324
213421
  });
213325
213422
  var NC_HISTORY_LIMIT_DEFAULT = 100;
213326
213423
  var NC_HISTORY_LIMIT_MAX = 500;
@@ -213568,6 +213665,20 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
213568
213665
  */
213569
213666
  getHistory: require_sleep.method(zod.z.object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), zod.z.object({ entries: zod.z.array(NcHistoryEntrySchema) }), { auth: "admin" }),
213570
213667
  /**
213668
+ * Mint a fresh, externally-reachable URL for one artefact a history row
213669
+ * named in {@link NcHistoryEntrySchema.shape.artifactIds} — the SAME
213670
+ * signed-link mechanism the dispatcher uses to attach media to an
213671
+ * outgoing notification (one derivation; this never re-implements it).
213672
+ *
213673
+ * `url: null` on THREE causes a caller must treat identically ("no image
213674
+ * right now", never a broken link): the id is unknown, its artefact has
213675
+ * expired past the retained shelf's own age bound, or this install has no
213676
+ * externally-reachable base URL. A caller that received a URL on a
213677
+ * previous call and now gets `null` must stop showing it — a link that
213678
+ * worked five minutes ago is not proof it works now.
213679
+ */
213680
+ resolveArtifactUrl: require_sleep.method(zod.z.object({ artifactId: zod.z.string().min(1) }), zod.z.object({ url: zod.z.string().nullable() }), { auth: "admin" }),
213681
+ /**
213571
213682
  * Snooze windows currently in effect, plus any whose digest has not yet
213572
213683
  * gone out. `caller: 'required'`: a user sees their OWN windows and the
213573
213684
  * global ones that silence them, never another person's private silence.
@@ -225037,6 +225148,23 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
225037
225148
  /** Media ms the returned fragment covers. */
225038
225149
  gopDurMs: zod.z.number()
225039
225150
  });
225151
+ var ReadWindowBytesResultSchema = zod.z.discriminatedUnion("kind", [zod.z.object({
225152
+ kind: zod.z.literal("ok"),
225153
+ data: zod.z.instanceof(Uint8Array),
225154
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
225155
+ * the requested `fromMs` (anchored on the nearest keyframe). */
225156
+ gopStartMs: zod.z.number(),
225157
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
225158
+ gopDurMs: zod.z.number(),
225159
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
225160
+ * the requested `toMs`; the caller got fewer frames than asked for. */
225161
+ reachesRequestedEnd: zod.z.boolean()
225162
+ }), zod.z.object({
225163
+ kind: zod.z.literal("spans-multiple-segments"),
225164
+ /** Where the covering segment's own footage runs out — informational,
225165
+ * not a retry hint (retrying the same window would refuse again). */
225166
+ segmentEndMs: zod.z.number()
225167
+ })]);
225040
225168
  var recordingCapability = {
225041
225169
  name: "recording",
225042
225170
  scope: "system",
@@ -225116,6 +225244,21 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
225116
225244
  kind: "query",
225117
225245
  auth: "admin"
225118
225246
  }),
225247
+ /** Read a WINDOW `[fromMs, toMs)` of segment `startMs`, by mfra byte
225248
+ * range — the multi-GOP twin of `readGopBytes`. Refuses (does not
225249
+ * degrade) when the window runs past the covering segment. Used by the
225250
+ * replay clip's `recording` source to fetch several seconds of native
225251
+ * footage for its single ffmpeg decode pass. */
225252
+ readWindowBytes: require_sleep.method(zod.z.object({
225253
+ deviceId: zod.z.number(),
225254
+ profile: zod.z.string(),
225255
+ startMs: zod.z.number(),
225256
+ fromMs: zod.z.number(),
225257
+ toMs: zod.z.number()
225258
+ }), ReadWindowBytesResultSchema, {
225259
+ kind: "query",
225260
+ auth: "admin"
225261
+ }),
225119
225262
  setDeviceConfig: require_sleep.method(zod.z.object({
225120
225263
  deviceId: zod.z.number(),
225121
225264
  config: RecordingConfigSchema
@@ -233543,6 +233686,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
233543
233686
  addonId: null,
233544
233687
  access: "view"
233545
233688
  },
233689
+ "notificationRules.resolveArtifactUrl": {
233690
+ capName: "notification-rules",
233691
+ capScope: "system",
233692
+ addonId: null,
233693
+ access: "view"
233694
+ },
233546
233695
  "notificationRules.setAlarmConfig": {
233547
233696
  capName: "notification-rules",
233548
233697
  capScope: "system",
@@ -234947,6 +235096,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
234947
235096
  addonId: null,
234948
235097
  access: "view"
234949
235098
  },
235099
+ "recording.readWindowBytes": {
235100
+ capName: "recording",
235101
+ capScope: "system",
235102
+ addonId: null,
235103
+ access: "view"
235104
+ },
234950
235105
  "recording.refreshStorageLocationsForMigration": {
234951
235106
  capName: "recording",
234952
235107
  capScope: "system",
@@ -238029,6 +238184,11 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
238029
238184
  form: "single",
238030
238185
  optional: false
238031
238186
  }],
238187
+ "recording.readWindowBytes": [{
238188
+ name: "deviceId",
238189
+ form: "single",
238190
+ optional: false
238191
+ }],
238032
238192
  "recording.relocateFootage": [{
238033
238193
  name: "deviceId",
238034
238194
  form: "single",
@@ -238505,6 +238665,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
238505
238665
  "recording.pruneFootage",
238506
238666
  "recording.readGopBytes",
238507
238667
  "recording.readSegmentBytes",
238668
+ "recording.readWindowBytes",
238508
238669
  "recording.relocateFootage",
238509
238670
  "recording.renderClip",
238510
238671
  "recording.renderGif",
@@ -242826,6 +242987,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
242826
242987
  exports.RawStateResultSchema = require_sleep.RawStateResultSchema;
242827
242988
  exports.ReadGopBytesResultSchema = ReadGopBytesResultSchema;
242828
242989
  exports.ReadSegmentBytesResultSchema = ReadSegmentBytesResultSchema;
242990
+ exports.ReadWindowBytesResultSchema = ReadWindowBytesResultSchema;
242829
242991
  exports.ReadinessRegistry = require_sleep.ReadinessRegistry;
242830
242992
  exports.ReadinessTimeoutError = require_sleep.ReadinessTimeoutError;
242831
242993
  exports.RecentTracksPageSchema = RecentTracksPageSchema;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "camstack",
3
- "version": "1.2.45",
3
+ "version": "1.2.46",
4
4
  "description": "CLI tool for managing and running CamStack server",
5
5
  "keywords": [
6
6
  "camstack",