@camstack/addon-post-analysis 1.2.372 → 1.2.374

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.
Files changed (15) hide show
  1. package/dist/{clip-model-registry-YcxOhKAs.mjs → clip-model-registry-BIJ0ZD7t.mjs} +816 -90
  2. package/dist/{clip-model-registry-CJMlelSr.js → clip-model-registry-BRzN2GzR.js} +816 -90
  3. package/dist/embedding-encoder/index.js +1 -1
  4. package/dist/embedding-encoder/index.mjs +1 -1
  5. package/dist/pipeline-analytics/_stub.js +2 -2
  6. package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-jrYcQzE9.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-BYu-s1rf.mjs} +2 -2
  7. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-Ds_wGoAi.mjs +26 -0
  8. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BjCURGur.mjs +26 -0
  9. package/dist/pipeline-analytics/{hostInit-D3mojFCX.mjs → hostInit-DEl2xA0o.mjs} +2 -2
  10. package/dist/pipeline-analytics/index.js +55 -206
  11. package/dist/pipeline-analytics/index.mjs +55 -206
  12. package/dist/pipeline-analytics/remoteEntry.js +1 -1
  13. package/package.json +1 -1
  14. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BrZNQ-qA.mjs +0 -26
  15. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-XFjQPo0r.mjs +0 -26
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_clip_model_registry = require("../clip-model-registry-CJMlelSr.js");
5
+ const require_clip_model_registry = require("../clip-model-registry-BRzN2GzR.js");
6
6
  let node_fs = require("node:fs");
7
7
  node_fs = require_clip_model_registry.__toESM(node_fs, 1);
8
8
  let node_path = require("node:path");
@@ -13051,6 +13051,19 @@ function recordField(data, key) {
13051
13051
  * with it — which is why the number is named on both sides.
13052
13052
  */
13053
13053
  var NC_STREAM_OFFLINE_REASON = "stale-timeout";
13054
+ /**
13055
+ * The BATTERY outage reasons (D883). A battery camera's sleep is not an
13056
+ * outage and the broker no longer emits one; what it does emit is a failure it
13057
+ * has already named — a demanded wake that delivered nothing, a connection
13058
+ * error while the camera is awake, silence past the battery refresh window.
13059
+ * The 120 s window above is the stale window those share; the extra reasons
13060
+ * are only the broker saying WHICH failure, so they pass the same gate.
13061
+ */
13062
+ var NC_STREAM_BATTERY_OFFLINE_REASONS = [
13063
+ "wake-timeout",
13064
+ "connection-error",
13065
+ "battery-unreachable"
13066
+ ];
13054
13067
  /** The recovery that answers a {@link NC_STREAM_OFFLINE_REASON} outage. */
13055
13068
  var NC_STREAM_ONLINE_REASON = "recovered";
13056
13069
  /**
@@ -13111,7 +13124,7 @@ function discardedAccessoryLiveness(event, lookup) {
13111
13124
  }
13112
13125
  /** Is this stream-health flip the one the operator asked to hear about? */
13113
13126
  function streamHealthAccepted(category, reason) {
13114
- return category === "stream.online" ? reason === NC_STREAM_ONLINE_REASON : reason === NC_STREAM_OFFLINE_REASON;
13127
+ return category === "stream.online" ? reason === NC_STREAM_ONLINE_REASON : reason === NC_STREAM_OFFLINE_REASON || reason !== void 0 && NC_STREAM_BATTERY_OFFLINE_REASONS.includes(reason);
13115
13128
  }
13116
13129
  /**
13117
13130
  * Describe a system event the intake's GATE dropped, or `null` when the event
@@ -13459,15 +13472,14 @@ function incomingFromSystemEvent(event, lookup) {
13459
13472
  case "stream.offline": {
13460
13473
  if (!streamHealthAccepted(event.category, stringField(data, "reason"))) return null;
13461
13474
  const deviceId = numberField(data, "deviceId");
13462
- const camStreamId = stringField(data, "camStreamId");
13463
- if (deviceId === void 0 || camStreamId === void 0) return null;
13475
+ if (deviceId === void 0) return null;
13464
13476
  const online = event.category === "stream.online";
13465
- const profile = stringField(data, "profile");
13477
+ const profile = stringList(data, "camStreamIds").length > 1 ? void 0 : stringField(data, "profile");
13466
13478
  const kind = online ? "stream-online" : "stream-offline";
13467
13479
  return systemSubject({
13468
13480
  facts,
13469
13481
  kind,
13470
- subject: `stream:${camStreamId}`,
13482
+ subject: `stream:${String(deviceId)}`,
13471
13483
  titleKey: `system.${kind}.title`,
13472
13484
  bodyKey: profile !== void 0 ? `system.${kind}.body.profiled` : `system.${kind}.body`,
13473
13485
  textParams: {
@@ -16895,10 +16907,22 @@ function updateStateKey(target, nodeId, packageName) {
16895
16907
  return `update:${target}:${nodeId ?? HUB_NODE}:${packageName}`;
16896
16908
  }
16897
16909
  var CRASH_SUBJECT_PREFIX = "addon-crash:";
16910
+ /** The current stream-row key: one per device (D883). */
16911
+ var DEVICE_STREAM_KEY = /^stream:\d+$/;
16898
16912
  var NcSystemStateLedger = class {
16899
16913
  deps;
16900
16914
  constructor(deps) {
16901
16915
  this.deps = deps;
16916
+ this.closeLegacyStreamKeys();
16917
+ }
16918
+ /**
16919
+ * One-time migration of state keys (D883): a stream row used to be keyed by
16920
+ * `stream:<camStreamId>`; it is now `stream:<deviceId>`. A row still open
16921
+ * under the old shape would never meet its `stream.online`, so it is closed
16922
+ * now and against the loaded rows. Nothing else is touched.
16923
+ */
16924
+ closeLegacyStreamKeys() {
16925
+ this.closeWhere("legacy-stream-keys", (row) => row.key.startsWith("stream:") && !DEVICE_STREAM_KEY.test(row.key), "legacy-stream-key");
16902
16926
  }
16903
16927
  /** The open rows, or `null` while the store has never answered. */
16904
16928
  openRows() {
@@ -16969,8 +16993,9 @@ var NcSystemStateLedger = class {
16969
16993
  * drops a `first-packet` online — a recreated broker's — because it is not
16970
16994
  * a recovery worth a notification; it is still proof the stream is up.
16971
16995
  */
16972
- observeStreamOnline(camStreamId) {
16973
- this.close(`stream:${camStreamId}`, "stream-online");
16996
+ observeStreamOnline(deviceId) {
16997
+ const key = `stream:${String(deviceId)}`;
16998
+ this.closeWhere(key, (row) => row.key === key || row.deviceId === deviceId && row.key.startsWith("stream:") && !DEVICE_STREAM_KEY.test(row.key), "stream-online");
16974
16999
  }
16975
17000
  /** One `update.available` list: REPLACE the rows of every node it names. */
16976
17001
  observeUpdateList(list, atMs) {
@@ -38337,8 +38362,8 @@ var NcStateSummaryService = class {
38337
38362
  observeRawEvent(category, data, atMs, sourceNodeId) {
38338
38363
  switch (category) {
38339
38364
  case "stream.online": {
38340
- const camStreamId = stringOf(data, "camStreamId");
38341
- if (camStreamId !== void 0) this.ledger.observeStreamOnline(camStreamId);
38365
+ const deviceId = data["deviceId"];
38366
+ if (typeof deviceId === "number") this.ledger.observeStreamOnline(deviceId);
38342
38367
  return;
38343
38368
  }
38344
38369
  case "update.available": {
@@ -41764,6 +41789,10 @@ var NotificationCenter = class {
41764
41789
  const system = incoming.subject.systemEvent;
41765
41790
  if (system !== void 0) this.stateSummary.observeSystem(system, this.now());
41766
41791
  if (system !== void 0) this.updateLandings.observe(system, this.now());
41792
+ if (system !== void 0 && system.kind === "addon-crash-loop") {
41793
+ this.logger.debug("addon-crash-loop is pushed by the hub alert centre, not by a rule", { meta: { subject: system.subject } });
41794
+ return;
41795
+ }
41767
41796
  const observation = system !== void 0 ? ledgeredLiveness(system) : null;
41768
41797
  if (observation !== null) {
41769
41798
  const previous = this.liveness.stateOf(observation.subject);
@@ -76389,10 +76418,8 @@ function describeTapeStatus(input) {
76389
76418
  * retention="none — a row goes only when its owner deletes it"
76390
76419
  *
76391
76420
  * Renamed from the bare `viewer-settings-snapshots` on 2026-08-19: an addon
76392
- * collection carries its owner's prefix, and the bare name sat in the same flat
76393
- * namespace as the kernel's `users` / `system-settings`. Rows already written
76394
- * under the old name are adopted at boot by
76395
- * `viewer-settings-legacy-adoption.ts`.
76421
+ * collection carries its owner's prefix. The drained bare table is dropped by
76422
+ * `scripts/hub/drop-dead-tables.ts` (records plan phase 0).
76396
76423
  */
76397
76424
  var VIEWER_SETTINGS_SNAPSHOTS_COLLECTION = "pipeline-analytics:viewer-settings-snapshots";
76398
76425
  var COLUMNS = [
@@ -76594,183 +76621,6 @@ function makeViewerSettingsActionHandlers(store) {
76594
76621
  };
76595
76622
  }
76596
76623
  //#endregion
76597
- //#region src/pipeline-analytics/viewer-settings-legacy-adoption.ts
76598
- /**
76599
- * @durable class=config owner=pipeline-analytics
76600
- * write="NOTHING writes it any more — it is the pre-2026-08-19 bare name of
76601
- * `pipeline-analytics:viewer-settings-snapshots`, declared here only so its
76602
- * surviving rows can be READ once and moved"
76603
- * retention="drained, not pruned: a row goes as soon as the successor is
76604
- * confirmed to hold the same id. The table is empty and inert once every
76605
- * hub has booted this addon; it is then dropped through the kernel's
76606
- * `RETIRED_COLLECTIONS` and this module deleted."
76607
- *
76608
- * Bare, and therefore a namespacing violation — hence the single
76609
- * `ALLOWED_BARE` entry in `scripts/check-collection-namespacing.ts`, which
76610
- * names this file and the condition for removing both.
76611
- */
76612
- var LEGACY_VIEWER_SETTINGS_SNAPSHOTS_COLLECTION = "viewer-settings-snapshots";
76613
- /**
76614
- * The ORIGINAL column list, byte-for-byte.
76615
- *
76616
- * Do not "tidy" this to reference the successor's constant: they are allowed to
76617
- * diverge, and the day they do, a shared constant would silently rebuild the
76618
- * legacy table and destroy the rows.
76619
- */
76620
- var LEGACY_COLUMNS = [
76621
- {
76622
- name: "id",
76623
- type: "TEXT",
76624
- primaryKey: true,
76625
- notNull: true
76626
- },
76627
- {
76628
- name: "name",
76629
- type: "TEXT",
76630
- notNull: true
76631
- },
76632
- {
76633
- name: "ownerUserId",
76634
- type: "TEXT",
76635
- notNull: true
76636
- },
76637
- {
76638
- name: "ownerUsername",
76639
- type: "TEXT",
76640
- notNull: true
76641
- },
76642
- {
76643
- name: "createdAt",
76644
- type: "INTEGER",
76645
- notNull: true
76646
- },
76647
- {
76648
- name: "updatedAt",
76649
- type: "INTEGER",
76650
- notNull: true
76651
- },
76652
- {
76653
- name: "blob",
76654
- type: "JSON",
76655
- notNull: true
76656
- }
76657
- ];
76658
- /** Bounded read: this table held 1 row on the reference hub. */
76659
- var LEGACY_READ_LIMIT = 500;
76660
- function errText(err) {
76661
- return err instanceof Error ? err.message : String(err);
76662
- }
76663
- function asRows(raw) {
76664
- if (!Array.isArray(raw)) return [];
76665
- const out = [];
76666
- for (const item of raw) {
76667
- if (typeof item !== "object" || item === null) continue;
76668
- const id = Reflect.get(item, "id");
76669
- const data = Reflect.get(item, "data");
76670
- if (typeof id !== "string" || typeof data !== "object" || data === null) continue;
76671
- out.push({
76672
- id,
76673
- data
76674
- });
76675
- }
76676
- return out;
76677
- }
76678
- /**
76679
- * Move every legacy row into the successor and clear the legacy table.
76680
- *
76681
- * Returns the number of legacy rows RETIRED — the completion metric, not the
76682
- * number written. A row copied but not yet verified counts as zero and is
76683
- * retried on the next boot, which is the safe direction.
76684
- */
76685
- async function adoptLegacyViewerSettingsSnapshots(deps) {
76686
- await deps.store.declareCollection.mutate({
76687
- collection: LEGACY_VIEWER_SETTINGS_SNAPSHOTS_COLLECTION,
76688
- columns: LEGACY_COLUMNS
76689
- });
76690
- let legacy;
76691
- try {
76692
- legacy = asRows(await deps.store.query.query({
76693
- collection: LEGACY_VIEWER_SETTINGS_SNAPSHOTS_COLLECTION,
76694
- filter: { limit: LEGACY_READ_LIMIT }
76695
- }));
76696
- } catch (err) {
76697
- deps.logger.warn("viewer-settings legacy adoption skipped — legacy read failed", { meta: {
76698
- collection: LEGACY_VIEWER_SETTINGS_SNAPSHOTS_COLLECTION,
76699
- error: errText(err)
76700
- } });
76701
- return 0;
76702
- }
76703
- if (legacy.length === 0) return 0;
76704
- let existing;
76705
- try {
76706
- existing = new Set(asRows(await deps.store.query.query({
76707
- collection: VIEWER_SETTINGS_SNAPSHOTS_COLLECTION,
76708
- filter: { limit: LEGACY_READ_LIMIT }
76709
- })).map((r) => r.id));
76710
- } catch (err) {
76711
- deps.logger.warn("viewer-settings legacy adoption skipped — successor read failed", { meta: {
76712
- collection: VIEWER_SETTINGS_SNAPSHOTS_COLLECTION,
76713
- error: errText(err)
76714
- } });
76715
- return 0;
76716
- }
76717
- let written = 0;
76718
- for (const row of legacy) {
76719
- if (existing.has(row.id)) continue;
76720
- try {
76721
- await deps.store.set.mutate({
76722
- collection: VIEWER_SETTINGS_SNAPSHOTS_COLLECTION,
76723
- key: row.id,
76724
- value: row.data
76725
- });
76726
- written += 1;
76727
- } catch (err) {
76728
- deps.logger.warn("viewer-settings legacy adoption — one row failed to write", { meta: {
76729
- snapshotId: row.id,
76730
- error: errText(err)
76731
- } });
76732
- }
76733
- }
76734
- let landed;
76735
- try {
76736
- landed = new Set(asRows(await deps.store.query.query({
76737
- collection: VIEWER_SETTINGS_SNAPSHOTS_COLLECTION,
76738
- filter: { limit: LEGACY_READ_LIMIT }
76739
- })).map((r) => r.id));
76740
- } catch (err) {
76741
- deps.logger.warn("viewer-settings legacy adoption — verification read failed, legacy rows kept", { meta: {
76742
- written,
76743
- error: errText(err)
76744
- } });
76745
- return 0;
76746
- }
76747
- let retired = 0;
76748
- for (const row of legacy) {
76749
- if (!landed.has(row.id)) continue;
76750
- try {
76751
- await deps.store.delete.mutate({
76752
- collection: LEGACY_VIEWER_SETTINGS_SNAPSHOTS_COLLECTION,
76753
- key: row.id
76754
- });
76755
- retired += 1;
76756
- } catch (err) {
76757
- deps.logger.warn("viewer-settings legacy adoption — one legacy row failed to delete", { meta: {
76758
- snapshotId: row.id,
76759
- error: errText(err)
76760
- } });
76761
- }
76762
- }
76763
- deps.logger.warn("viewer-settings snapshots adopted from the legacy bare collection", { meta: {
76764
- from: LEGACY_VIEWER_SETTINGS_SNAPSHOTS_COLLECTION,
76765
- to: VIEWER_SETTINGS_SNAPSHOTS_COLLECTION,
76766
- found: legacy.length,
76767
- written,
76768
- retired,
76769
- kept: legacy.length - retired
76770
- } });
76771
- return retired;
76772
- }
76773
- //#endregion
76774
76624
  //#region src/notification-center/event-media/event-media-service.ts
76775
76625
  /**
76776
76626
  * Long side of the gif.
@@ -101454,13 +101304,6 @@ var ANALYTICS_COLLECTIONS = [
101454
101304
  why: "a hub user's named snapshot of their own viewer layout. It is not analytics data — it happens to live in this addon because the actions ride `addons.custom`. Owned by the user who saved it and deleted only by them; no track, device or event can orphan it, and no age applies."
101455
101305
  }
101456
101306
  },
101457
- {
101458
- collection: LEGACY_VIEWER_SETTINGS_SNAPSHOTS_COLLECTION,
101459
- classification: {
101460
- kind: "never-orphaned",
101461
- why: "the drained predecessor of the row above, declared only so its rows can be read once and moved (`viewer-settings-legacy-adoption.ts`). Retention must never touch it: its rows go one way only, to the successor, gated on a re-read that confirms they landed. Delete this entry together with that module."
101462
- }
101463
- },
101464
101307
  {
101465
101308
  collection: DEBUG_NOTE_ARCHIVE_COLLECTION,
101466
101309
  classification: {
@@ -106071,7 +105914,9 @@ Object.freeze({
106071
105914
  },
106072
105915
  "setDeviceConfig": { "config": { "__nested__": { "bands": [] } } }
106073
105916
  },
105917
+ "records": { "query": { "limit": 100 } },
106074
105918
  "storage": { "upsertLocation": { "isSystem": false } },
105919
+ "storage-admin": { "readRecords": { "limit": 100 } },
106075
105920
  "storage-provider": {
106076
105921
  "beginDownload": { "location": { "__nested__": { "isSystem": false } } },
106077
105922
  "beginUpload": { "location": { "__nested__": { "isSystem": false } } },
@@ -106507,6 +106352,18 @@ Object.freeze({
106507
106352
  {
106508
106353
  "path": "swingHorizontal",
106509
106354
  "valueType": "boolean"
106355
+ },
106356
+ {
106357
+ "path": "minTemp",
106358
+ "valueType": "number"
106359
+ },
106360
+ {
106361
+ "path": "maxTemp",
106362
+ "valueType": "number"
106363
+ },
106364
+ {
106365
+ "path": "tempStep",
106366
+ "valueType": "number"
106510
106367
  }
106511
106368
  ],
106512
106369
  "color": [
@@ -114684,14 +114541,6 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends require_clip_m
114684
114541
  logger: this.ctx.logger.child("SweepCursors")
114685
114542
  });
114686
114543
  this.viewerSettingsSnapshots = new ViewerSettingsSnapshotStore(api.settingsStore);
114687
- try {
114688
- await adoptLegacyViewerSettingsSnapshots({
114689
- store: api.settingsStore,
114690
- logger: this.ctx.logger.child("viewer-settings")
114691
- });
114692
- } catch (err) {
114693
- this.ctx.logger.warn("viewer-settings legacy adoption threw", { meta: { error: require_clip_model_registry.errMsg(err) } });
114694
- }
114695
114544
  runLabelTierMigration({
114696
114545
  store: api.settingsStore,
114697
114546
  logger: this.ctx.logger,