@camstack/addon-notifiers 1.2.614 → 1.2.616

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 (3) hide show
  1. package/dist/addon.js +237 -61
  2. package/dist/addon.mjs +237 -61
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -29,7 +29,7 @@ let node_fs = require("node:fs");
29
29
  let node_path = require("node:path");
30
30
  node_path = __toESM(node_path);
31
31
  let node_url = require("node:url");
32
- //#region ../types/dist/event-category-DOl51-Ij.mjs
32
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
33
33
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
34
34
  EventCategory["SystemBoot"] = "system.boot";
35
35
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -346,6 +346,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
346
346
  */
347
347
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
348
348
  /**
349
+ * A camera's motion source has fired constantly with no subject for an hour
350
+ * (motion duty or session count over the bar, zero detections) — it is not
351
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
352
+ * {@link PipelineMotionCalm}.
353
+ */
354
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
355
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
356
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
357
+ /**
349
358
  * Per-camera pipeline config was mutated by the orchestrator
350
359
  * (3-level settings change via `setAgentAddonDefaults` /
351
360
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -717,6 +726,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
717
726
  EventCategory["BackupRestored"] = "backup.restored";
718
727
  EventCategory["NotificationDispatched"] = "notification.dispatched";
719
728
  EventCategory["NotificationFailed"] = "notification.failed";
729
+ /**
730
+ * A notification rule that cannot work (D905): its stored row does not load,
731
+ * or it still names a device / delivery target the prune CONFIRMED deleted.
732
+ * One edge per rule per distinct set of reasons; never on an unanswered read.
733
+ */
734
+ EventCategory["NotificationRuleBroken"] = "notification.rule-broken";
735
+ /** The clear of {@link NotificationRuleBroken}: the rule loads and names nothing deleted. */
736
+ EventCategory["NotificationRuleRepaired"] = "notification.rule-repaired";
720
737
  EventCategory["DeviceUpdated"] = "device.updated";
721
738
  /**
722
739
  * Transport-level connectivity. Emitted by the device driver when
@@ -5577,7 +5594,7 @@ var ZodIssueCode = {
5577
5594
  var ZodFirstPartyTypeKind;
5578
5595
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5579
5596
  //#endregion
5580
- //#region ../types/dist/sleep-_sV1BE2f.mjs
5597
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5581
5598
  /**
5582
5599
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5583
5600
  * window to float samples (D455).
@@ -8169,7 +8186,7 @@ var EntryDescriptorSchema = object({
8169
8186
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
8170
8187
  fields: record(string(), unknown())
8171
8188
  }).strict();
8172
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
8189
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
8173
8190
  var RecordKindDeclarationSchema = object({
8174
8191
  database: _enum(RECORD_DATABASES).default("settings"),
8175
8192
  class: _enum(RECORD_CLASSES),
@@ -8188,14 +8205,6 @@ var RecordKindDeclarationSchema = object({
8188
8205
  secretPaths: array(string().min(1)).default([]),
8189
8206
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8190
8207
  secretArrayKeys: record(string(), string()).default({}),
8191
- /**
8192
- * RETIRED (D900): the legacy table a kind adopted from during the records
8193
- * migration. Nothing declares it any more and nothing reads it; the schema
8194
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8195
- * (an orphaned kind is never redeclared) and an addon built before the
8196
- * removal still sends it. Never set it.
8197
- */
8198
- adoptsFrom: string().min(1).optional(),
8199
8208
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8200
8209
  transactFamily: string().min(1).optional(),
8201
8210
  entry: EntryDescriptorSchema.optional()
@@ -13095,17 +13104,6 @@ object({
13095
13104
  createdAt: number(),
13096
13105
  updatedAt: number()
13097
13106
  });
13098
- object({
13099
- id: string(),
13100
- label: string(),
13101
- isAdmin: boolean().default(false),
13102
- allowedProviders: AllowedProviderSchema,
13103
- allowedDevices: AllowedDevicesSchema,
13104
- tokenHash: string(),
13105
- tokenPrefix: string(),
13106
- createdAt: number(),
13107
- lastUsedAt: number().optional()
13108
- });
13109
13107
  object({
13110
13108
  id: string(),
13111
13109
  userId: string(),
@@ -17000,16 +16998,36 @@ var RecordKindStateSchema = _enum([
17000
16998
  var DeclareKindResultSchema = object({
17001
16999
  kindId: number().int(),
17002
17000
  state: RecordKindStateSchema,
17003
- createdIndexes: array(string()),
17004
- /**
17005
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
17006
- * it stays on the wire, null, because an addon built before the removal reads
17007
- * an ABSENT field as "adoption pending" and refuses to start.
17008
- */
17009
- adoptionPending: _null()
17001
+ createdIndexes: array(string())
17010
17002
  });
17011
17003
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
17012
17004
  var SecretRefsList = array(string());
17005
+ /**
17006
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
17007
+ * All ops of one call share ONE database file and ONE `transactFamily`.
17008
+ */
17009
+ var RecordTransactOpSchema = discriminatedUnion("op", [
17010
+ object({
17011
+ op: literal("put"),
17012
+ kind: RecordKindNameSchema,
17013
+ record: RecordInputSchema,
17014
+ ifRev: number().int().min(0).optional()
17015
+ }),
17016
+ object({
17017
+ op: literal("patch"),
17018
+ kind: RecordKindNameSchema,
17019
+ id: RecordIdSchema,
17020
+ data: RecordBodySchema,
17021
+ at: number().int().nullable().optional(),
17022
+ expiresAt: number().int().nullable().optional(),
17023
+ ifRev: number().int().min(1).optional()
17024
+ }),
17025
+ object({
17026
+ op: literal("delete"),
17027
+ kind: RecordKindNameSchema,
17028
+ id: RecordIdSchema
17029
+ })
17030
+ ]);
17013
17031
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
17014
17032
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
17015
17033
  kind: "mutation",
@@ -17116,6 +17134,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
17116
17134
  }), {
17117
17135
  kind: "mutation",
17118
17136
  auth: "admin"
17137
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
17138
+ results: array(object({
17139
+ rev: number().int().nullable(),
17140
+ deleted: boolean()
17141
+ })),
17142
+ releasedRefs: SecretRefsList,
17143
+ secretRefs: SecretRefsList
17144
+ }), {
17145
+ kind: "mutation",
17146
+ auth: "admin"
17119
17147
  }), method(object({
17120
17148
  deviceId: number().int(),
17121
17149
  kinds: array(RecordKindNameSchema).optional()
@@ -42496,9 +42524,13 @@ var NcSystemEventKindSchema = _enum([
42496
42524
  "node-updating",
42497
42525
  "node-inference-unavailable",
42498
42526
  "detection-blind",
42527
+ "motion-noisy",
42528
+ "motion-calm",
42499
42529
  "recording-stalled",
42500
42530
  "recording-healthy",
42501
42531
  "recording-degraded",
42532
+ "device-attention-required",
42533
+ "device-attention-resolved",
42502
42534
  "storage-location-low",
42503
42535
  "storage-location-critical",
42504
42536
  "storage-location-ok",
@@ -42522,6 +42554,8 @@ var NcSystemEventKindSchema = _enum([
42522
42554
  "alert-critical",
42523
42555
  "alert-error",
42524
42556
  "alert-critical-resolved",
42557
+ "rule-broken",
42558
+ "rule-repaired",
42525
42559
  "camera-online",
42526
42560
  "camera-offline",
42527
42561
  "camera-disabled",
@@ -54953,6 +54987,16 @@ object({
54953
54987
  powerState: string().nullable(),
54954
54988
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
54955
54989
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
54990
+ /**
54991
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
54992
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
54993
+ * when none is reported. A cleared reminder is not an unknown one.
54994
+ */
54995
+ filterCleaningDue: boolean().nullable(),
54996
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
54997
+ machineCareDue: boolean().nullable(),
54998
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
54999
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
54956
55000
  /** Option states: null when the appliance does not expose the option or has not said. */
54957
55001
  halfLoad: boolean().nullable(),
54958
55002
  hygienePlus: boolean().nullable(),
@@ -61570,16 +61614,6 @@ var UpdateUserInputSchema = object({
61570
61614
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
61571
61615
  scopes: array(TokenScopeSchema).optional()
61572
61616
  });
61573
- var ApiKeySummarySchema = object({
61574
- id: string(),
61575
- label: string(),
61576
- isAdmin: boolean().default(false),
61577
- allowedProviders: union([array(string()), literal("*")]).optional(),
61578
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
61579
- tokenPrefix: string(),
61580
- createdAt: number(),
61581
- lastUsedAt: number().optional()
61582
- });
61583
61617
  var OauthSessionSummarySchema = object({
61584
61618
  id: string(),
61585
61619
  userId: string(),
@@ -61601,8 +61635,7 @@ var TotpStatusSchema = object({
61601
61635
  confirmedAt: number().nullable()
61602
61636
  });
61603
61637
  /**
61604
- * user-management — singleton capability for user accounts and the
61605
- * legacy API-key rows.
61638
+ * user-management — singleton capability for user accounts.
61606
61639
  *
61607
61640
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
61608
61641
  * — the subset check on `setUserScopes` is moot
@@ -61658,10 +61691,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
61658
61691
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
61659
61692
  kind: "mutation",
61660
61693
  access: "view"
61661
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
61662
- kind: "mutation",
61663
- auth: "admin",
61664
- access: "delete"
61665
61694
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
61666
61695
  kind: "mutation",
61667
61696
  auth: "admin",
@@ -69174,6 +69203,12 @@ Object.freeze({
69174
69203
  addonId: null,
69175
69204
  access: "view"
69176
69205
  },
69206
+ "records.transact": {
69207
+ capName: "records",
69208
+ capScope: "system",
69209
+ addonId: null,
69210
+ access: "create"
69211
+ },
69177
69212
  "sceneMonitor.captureReference": {
69178
69213
  capName: "scene-monitor",
69179
69214
  capScope: "device",
@@ -70506,12 +70541,6 @@ Object.freeze({
70506
70541
  addonId: null,
70507
70542
  access: "view"
70508
70543
  },
70509
- "userManagement.listApiKeys": {
70510
- capName: "user-management",
70511
- capScope: "system",
70512
- addonId: null,
70513
- access: "view"
70514
- },
70515
70544
  "userManagement.listExternalIdentities": {
70516
70545
  capName: "user-management",
70517
70546
  capScope: "system",
@@ -70566,12 +70595,6 @@ Object.freeze({
70566
70595
  addonId: null,
70567
70596
  access: "create"
70568
70597
  },
70569
- "userManagement.revokeApiKey": {
70570
- capName: "user-management",
70571
- capScope: "system",
70572
- addonId: null,
70573
- access: "delete"
70574
- },
70575
70598
  "userManagement.revokeOauthSession": {
70576
70599
  capName: "user-management",
70577
70600
  capScope: "system",
@@ -74143,9 +74166,13 @@ new Map(Object.entries({
74143
74166
  "stream-online": "device-events",
74144
74167
  "stream-offline": "device-events",
74145
74168
  "detection-blind": "device-events",
74169
+ "motion-noisy": "device-events",
74170
+ "motion-calm": "device-events",
74146
74171
  "recording-stalled": "device-events",
74147
74172
  "recording-healthy": "device-events",
74148
74173
  "recording-degraded": "device-events",
74174
+ "device-attention-required": "device-events",
74175
+ "device-attention-resolved": "device-events",
74149
74176
  "node-online": "system",
74150
74177
  "node-offline": "system",
74151
74178
  "node-restarting": "system",
@@ -74162,6 +74189,8 @@ new Map(Object.entries({
74162
74189
  "alert-critical": "system",
74163
74190
  "alert-error": "system",
74164
74191
  "alert-critical-resolved": "system",
74192
+ "rule-broken": "system",
74193
+ "rule-repaired": "system",
74165
74194
  "storage-location-low": "system",
74166
74195
  "storage-location-critical": "system",
74167
74196
  "storage-location-ok": "system",
@@ -74226,6 +74255,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
74226
74255
  label: "Detecting nothing",
74227
74256
  kinds: ["detection-blind"]
74228
74257
  },
74258
+ {
74259
+ id: "motion-noise",
74260
+ family: "device-events",
74261
+ label: "Motion without a subject",
74262
+ kinds: ["motion-noisy", "motion-calm"]
74263
+ },
74229
74264
  {
74230
74265
  id: "recording",
74231
74266
  family: "device-events",
@@ -74236,6 +74271,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
74236
74271
  "recording-degraded"
74237
74272
  ]
74238
74273
  },
74274
+ {
74275
+ id: "device-attention",
74276
+ family: "device-events",
74277
+ label: "Needs attention",
74278
+ kinds: ["device-attention-required", "device-attention-resolved"]
74279
+ },
74239
74280
  {
74240
74281
  id: "nodes",
74241
74282
  family: "system",
@@ -74296,6 +74337,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
74296
74337
  "alert-critical-resolved"
74297
74338
  ]
74298
74339
  },
74340
+ {
74341
+ id: "rule-health",
74342
+ family: "system",
74343
+ label: "Notification rules",
74344
+ kinds: ["rule-broken", "rule-repaired"]
74345
+ },
74299
74346
  {
74300
74347
  id: "alarm",
74301
74348
  family: "alarm",
@@ -74369,6 +74416,7 @@ var ALERT_EPISODE = [
74369
74416
  "alert-error",
74370
74417
  "alert-critical-resolved"
74371
74418
  ];
74419
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
74372
74420
  var UPDATES = [
74373
74421
  "addon-update-available",
74374
74422
  "server-update-available",
@@ -74398,9 +74446,12 @@ var DEVICE_EVENTS = [
74398
74446
  "stream-online",
74399
74447
  "stream-offline",
74400
74448
  "detection-blind",
74449
+ "motion-noisy",
74450
+ "motion-calm",
74401
74451
  "recording-stalled",
74402
74452
  "recording-healthy",
74403
74453
  "recording-degraded",
74454
+ ...DEVICE_ATTENTION,
74404
74455
  ...ALARM
74405
74456
  ];
74406
74457
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -74568,7 +74619,13 @@ var STATE_SUMMARY_VARS = [
74568
74619
  [...RULE_TEXT],
74569
74620
  [...RULE_TEXT],
74570
74621
  [...RULE_TEXT],
74571
- ([...RULE_TEXT], [...ALERT_EPISODE]),
74622
+ [...RULE_TEXT],
74623
+ [...RULE_TEXT],
74624
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
74625
+ [...RULE_TEXT],
74626
+ [...RULE_TEXT],
74627
+ [...RULE_TEXT],
74628
+ [...RULE_TEXT],
74572
74629
  [...RULE_TEXT],
74573
74630
  [...RULE_TEXT],
74574
74631
  [...RULE_TEXT],
@@ -74586,11 +74643,11 @@ var STATE_SUMMARY_VARS = [
74586
74643
  [...RULE_TEXT],
74587
74644
  [...RULE_TEXT],
74588
74645
  [...RULE_TEXT],
74646
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
74589
74647
  ([...RULE_TEXT], [...ALERT_EPISODE]),
74648
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
74590
74649
  ([...RULE_TEXT], [...ALERT_EPISODE]),
74591
- ([...RULE_TEXT], [...ALERT_EPISODE]),
74592
- ([...RULE_TEXT], [...ALERT_EPISODE]),
74593
- ([...RULE_TEXT], [...ALERT_EPISODE]),
74650
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
74594
74651
  [...RULE_TEXT],
74595
74652
  [...RULE_TEXT],
74596
74653
  [...RULE_TEXT],
@@ -74611,6 +74668,125 @@ var STATE_SUMMARY_VARS = [
74611
74668
  [...RULE_TEXT],
74612
74669
  ...STATE_SUMMARY_VARS
74613
74670
  ];
74671
+ new Map([
74672
+ {
74673
+ id: "device-connectivity",
74674
+ family: "device-events",
74675
+ label: "Device connectivity (offline / back online)",
74676
+ bad: ["device-offline"],
74677
+ recovery: ["device-online"],
74678
+ snapshotLabel: "Devices offline now",
74679
+ snapshotSection: "device-state"
74680
+ },
74681
+ {
74682
+ id: "device-switch",
74683
+ family: "device-events",
74684
+ label: "Device switched off / back on",
74685
+ bad: ["device-disabled"],
74686
+ recovery: ["device-enabled"],
74687
+ snapshotLabel: "Devices switched off now",
74688
+ snapshotSection: "device-state"
74689
+ },
74690
+ {
74691
+ id: "stream-connectivity",
74692
+ family: "device-events",
74693
+ label: "Stream connectivity (offline / back online)",
74694
+ bad: ["stream-offline"],
74695
+ recovery: ["stream-online"],
74696
+ snapshotLabel: "Streams offline now",
74697
+ snapshotSection: "streams"
74698
+ },
74699
+ {
74700
+ id: "battery",
74701
+ family: "device-events",
74702
+ label: "Battery (low / back to normal)",
74703
+ bad: ["device-battery-low"],
74704
+ recovery: ["device-battery-normal"],
74705
+ snapshotLabel: "Batteries low now",
74706
+ snapshotSection: "battery"
74707
+ },
74708
+ {
74709
+ id: "consumables",
74710
+ family: "device-events",
74711
+ label: "Consumables (low / replaced)",
74712
+ bad: ["device-consumable-low"],
74713
+ recovery: ["device-consumable-normal"],
74714
+ snapshotLabel: "Consumables low now",
74715
+ snapshotSection: "consumables"
74716
+ },
74717
+ {
74718
+ id: "tanks",
74719
+ family: "device-events",
74720
+ label: "Tanks (low or full / back to normal)",
74721
+ bad: ["device-tank-low", "device-tank-full"],
74722
+ recovery: ["device-tank-normal"],
74723
+ snapshotLabel: "Tanks low or full now",
74724
+ snapshotSection: "tanks"
74725
+ },
74726
+ {
74727
+ id: "motion-noise",
74728
+ family: "device-events",
74729
+ label: "Motion without a subject (constant / calm again)",
74730
+ bad: ["motion-noisy"],
74731
+ recovery: ["motion-calm"],
74732
+ snapshotLabel: "Cameras with constant motion now",
74733
+ snapshotSection: null
74734
+ },
74735
+ {
74736
+ id: "recording-health",
74737
+ family: "device-events",
74738
+ label: "Recording health (stalled or degraded / recording again)",
74739
+ bad: ["recording-stalled", "recording-degraded"],
74740
+ recovery: ["recording-healthy"],
74741
+ snapshotLabel: "Recordings stalled now",
74742
+ snapshotSection: null
74743
+ },
74744
+ {
74745
+ id: "device-attention",
74746
+ family: "device-events",
74747
+ label: "Device needs attention (raised / resolved)",
74748
+ bad: ["device-attention-required"],
74749
+ recovery: ["device-attention-resolved"],
74750
+ snapshotLabel: "Devices needing attention now",
74751
+ snapshotSection: null
74752
+ },
74753
+ {
74754
+ id: "node-connectivity",
74755
+ family: "system",
74756
+ label: "Node connectivity (offline / back online)",
74757
+ bad: ["node-offline"],
74758
+ recovery: ["node-online"],
74759
+ snapshotLabel: "Nodes offline now",
74760
+ snapshotSection: "nodes"
74761
+ },
74762
+ {
74763
+ id: "storage-space",
74764
+ family: "system",
74765
+ label: "Storage space (low or critical / ok again)",
74766
+ bad: ["storage-location-low", "storage-location-critical"],
74767
+ recovery: ["storage-location-ok"],
74768
+ snapshotLabel: "Storage locations low now",
74769
+ snapshotSection: null
74770
+ },
74771
+ {
74772
+ id: "critical-alerts",
74773
+ family: "system",
74774
+ label: "Critical alerts (raised / resolved)",
74775
+ bad: ["alert-critical"],
74776
+ recovery: ["alert-critical-resolved"],
74777
+ snapshotLabel: "Critical alerts open now",
74778
+ snapshotSection: null
74779
+ },
74780
+ {
74781
+ id: "rule-health",
74782
+ family: "system",
74783
+ label: "Rule health (broken / repaired)",
74784
+ bad: ["rule-broken"],
74785
+ recovery: ["rule-repaired"],
74786
+ snapshotLabel: "Notification rules broken now",
74787
+ snapshotSection: null
74788
+ }
74789
+ ].flatMap((spec) => [...spec.bad, ...spec.recovery].map((kind) => [kind, spec])));
74614
74790
  new Set([
74615
74791
  "disarmed",
74616
74792
  "armed_home",
package/dist/addon.mjs CHANGED
@@ -2,7 +2,7 @@ import { brotliCompressSync, deflateSync, gzipSync } from "node:zlib";
2
2
  import { readFileSync } from "node:fs";
3
3
  import path from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
- //#region ../types/dist/event-category-DOl51-Ij.mjs
5
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
6
6
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
7
7
  EventCategory["SystemBoot"] = "system.boot";
8
8
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -319,6 +319,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
319
319
  */
320
320
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
321
321
  /**
322
+ * A camera's motion source has fired constantly with no subject for an hour
323
+ * (motion duty or session count over the bar, zero detections) — it is not
324
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
325
+ * {@link PipelineMotionCalm}.
326
+ */
327
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
328
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
329
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
330
+ /**
322
331
  * Per-camera pipeline config was mutated by the orchestrator
323
332
  * (3-level settings change via `setAgentAddonDefaults` /
324
333
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -690,6 +699,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
690
699
  EventCategory["BackupRestored"] = "backup.restored";
691
700
  EventCategory["NotificationDispatched"] = "notification.dispatched";
692
701
  EventCategory["NotificationFailed"] = "notification.failed";
702
+ /**
703
+ * A notification rule that cannot work (D905): its stored row does not load,
704
+ * or it still names a device / delivery target the prune CONFIRMED deleted.
705
+ * One edge per rule per distinct set of reasons; never on an unanswered read.
706
+ */
707
+ EventCategory["NotificationRuleBroken"] = "notification.rule-broken";
708
+ /** The clear of {@link NotificationRuleBroken}: the rule loads and names nothing deleted. */
709
+ EventCategory["NotificationRuleRepaired"] = "notification.rule-repaired";
693
710
  EventCategory["DeviceUpdated"] = "device.updated";
694
711
  /**
695
712
  * Transport-level connectivity. Emitted by the device driver when
@@ -5550,7 +5567,7 @@ var ZodIssueCode = {
5550
5567
  var ZodFirstPartyTypeKind;
5551
5568
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5552
5569
  //#endregion
5553
- //#region ../types/dist/sleep-_sV1BE2f.mjs
5570
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5554
5571
  /**
5555
5572
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5556
5573
  * window to float samples (D455).
@@ -8142,7 +8159,7 @@ var EntryDescriptorSchema = object({
8142
8159
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
8143
8160
  fields: record(string(), unknown())
8144
8161
  }).strict();
8145
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
8162
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
8146
8163
  var RecordKindDeclarationSchema = object({
8147
8164
  database: _enum(RECORD_DATABASES).default("settings"),
8148
8165
  class: _enum(RECORD_CLASSES),
@@ -8161,14 +8178,6 @@ var RecordKindDeclarationSchema = object({
8161
8178
  secretPaths: array(string().min(1)).default([]),
8162
8179
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8163
8180
  secretArrayKeys: record(string(), string()).default({}),
8164
- /**
8165
- * RETIRED (D900): the legacy table a kind adopted from during the records
8166
- * migration. Nothing declares it any more and nothing reads it; the schema
8167
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8168
- * (an orphaned kind is never redeclared) and an addon built before the
8169
- * removal still sends it. Never set it.
8170
- */
8171
- adoptsFrom: string().min(1).optional(),
8172
8181
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8173
8182
  transactFamily: string().min(1).optional(),
8174
8183
  entry: EntryDescriptorSchema.optional()
@@ -13068,17 +13077,6 @@ object({
13068
13077
  createdAt: number(),
13069
13078
  updatedAt: number()
13070
13079
  });
13071
- object({
13072
- id: string(),
13073
- label: string(),
13074
- isAdmin: boolean().default(false),
13075
- allowedProviders: AllowedProviderSchema,
13076
- allowedDevices: AllowedDevicesSchema,
13077
- tokenHash: string(),
13078
- tokenPrefix: string(),
13079
- createdAt: number(),
13080
- lastUsedAt: number().optional()
13081
- });
13082
13080
  object({
13083
13081
  id: string(),
13084
13082
  userId: string(),
@@ -16973,16 +16971,36 @@ var RecordKindStateSchema = _enum([
16973
16971
  var DeclareKindResultSchema = object({
16974
16972
  kindId: number().int(),
16975
16973
  state: RecordKindStateSchema,
16976
- createdIndexes: array(string()),
16977
- /**
16978
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
16979
- * it stays on the wire, null, because an addon built before the removal reads
16980
- * an ABSENT field as "adoption pending" and refuses to start.
16981
- */
16982
- adoptionPending: _null()
16974
+ createdIndexes: array(string())
16983
16975
  });
16984
16976
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
16985
16977
  var SecretRefsList = array(string());
16978
+ /**
16979
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
16980
+ * All ops of one call share ONE database file and ONE `transactFamily`.
16981
+ */
16982
+ var RecordTransactOpSchema = discriminatedUnion("op", [
16983
+ object({
16984
+ op: literal("put"),
16985
+ kind: RecordKindNameSchema,
16986
+ record: RecordInputSchema,
16987
+ ifRev: number().int().min(0).optional()
16988
+ }),
16989
+ object({
16990
+ op: literal("patch"),
16991
+ kind: RecordKindNameSchema,
16992
+ id: RecordIdSchema,
16993
+ data: RecordBodySchema,
16994
+ at: number().int().nullable().optional(),
16995
+ expiresAt: number().int().nullable().optional(),
16996
+ ifRev: number().int().min(1).optional()
16997
+ }),
16998
+ object({
16999
+ op: literal("delete"),
17000
+ kind: RecordKindNameSchema,
17001
+ id: RecordIdSchema
17002
+ })
17003
+ ]);
16986
17004
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
16987
17005
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
16988
17006
  kind: "mutation",
@@ -17089,6 +17107,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
17089
17107
  }), {
17090
17108
  kind: "mutation",
17091
17109
  auth: "admin"
17110
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
17111
+ results: array(object({
17112
+ rev: number().int().nullable(),
17113
+ deleted: boolean()
17114
+ })),
17115
+ releasedRefs: SecretRefsList,
17116
+ secretRefs: SecretRefsList
17117
+ }), {
17118
+ kind: "mutation",
17119
+ auth: "admin"
17092
17120
  }), method(object({
17093
17121
  deviceId: number().int(),
17094
17122
  kinds: array(RecordKindNameSchema).optional()
@@ -42469,9 +42497,13 @@ var NcSystemEventKindSchema = _enum([
42469
42497
  "node-updating",
42470
42498
  "node-inference-unavailable",
42471
42499
  "detection-blind",
42500
+ "motion-noisy",
42501
+ "motion-calm",
42472
42502
  "recording-stalled",
42473
42503
  "recording-healthy",
42474
42504
  "recording-degraded",
42505
+ "device-attention-required",
42506
+ "device-attention-resolved",
42475
42507
  "storage-location-low",
42476
42508
  "storage-location-critical",
42477
42509
  "storage-location-ok",
@@ -42495,6 +42527,8 @@ var NcSystemEventKindSchema = _enum([
42495
42527
  "alert-critical",
42496
42528
  "alert-error",
42497
42529
  "alert-critical-resolved",
42530
+ "rule-broken",
42531
+ "rule-repaired",
42498
42532
  "camera-online",
42499
42533
  "camera-offline",
42500
42534
  "camera-disabled",
@@ -54926,6 +54960,16 @@ object({
54926
54960
  powerState: string().nullable(),
54927
54961
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
54928
54962
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
54963
+ /**
54964
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
54965
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
54966
+ * when none is reported. A cleared reminder is not an unknown one.
54967
+ */
54968
+ filterCleaningDue: boolean().nullable(),
54969
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
54970
+ machineCareDue: boolean().nullable(),
54971
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
54972
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
54929
54973
  /** Option states: null when the appliance does not expose the option or has not said. */
54930
54974
  halfLoad: boolean().nullable(),
54931
54975
  hygienePlus: boolean().nullable(),
@@ -61543,16 +61587,6 @@ var UpdateUserInputSchema = object({
61543
61587
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
61544
61588
  scopes: array(TokenScopeSchema).optional()
61545
61589
  });
61546
- var ApiKeySummarySchema = object({
61547
- id: string(),
61548
- label: string(),
61549
- isAdmin: boolean().default(false),
61550
- allowedProviders: union([array(string()), literal("*")]).optional(),
61551
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
61552
- tokenPrefix: string(),
61553
- createdAt: number(),
61554
- lastUsedAt: number().optional()
61555
- });
61556
61590
  var OauthSessionSummarySchema = object({
61557
61591
  id: string(),
61558
61592
  userId: string(),
@@ -61574,8 +61608,7 @@ var TotpStatusSchema = object({
61574
61608
  confirmedAt: number().nullable()
61575
61609
  });
61576
61610
  /**
61577
- * user-management — singleton capability for user accounts and the
61578
- * legacy API-key rows.
61611
+ * user-management — singleton capability for user accounts.
61579
61612
  *
61580
61613
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
61581
61614
  * — the subset check on `setUserScopes` is moot
@@ -61631,10 +61664,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
61631
61664
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
61632
61665
  kind: "mutation",
61633
61666
  access: "view"
61634
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
61635
- kind: "mutation",
61636
- auth: "admin",
61637
- access: "delete"
61638
61667
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
61639
61668
  kind: "mutation",
61640
61669
  auth: "admin",
@@ -69147,6 +69176,12 @@ Object.freeze({
69147
69176
  addonId: null,
69148
69177
  access: "view"
69149
69178
  },
69179
+ "records.transact": {
69180
+ capName: "records",
69181
+ capScope: "system",
69182
+ addonId: null,
69183
+ access: "create"
69184
+ },
69150
69185
  "sceneMonitor.captureReference": {
69151
69186
  capName: "scene-monitor",
69152
69187
  capScope: "device",
@@ -70479,12 +70514,6 @@ Object.freeze({
70479
70514
  addonId: null,
70480
70515
  access: "view"
70481
70516
  },
70482
- "userManagement.listApiKeys": {
70483
- capName: "user-management",
70484
- capScope: "system",
70485
- addonId: null,
70486
- access: "view"
70487
- },
70488
70517
  "userManagement.listExternalIdentities": {
70489
70518
  capName: "user-management",
70490
70519
  capScope: "system",
@@ -70539,12 +70568,6 @@ Object.freeze({
70539
70568
  addonId: null,
70540
70569
  access: "create"
70541
70570
  },
70542
- "userManagement.revokeApiKey": {
70543
- capName: "user-management",
70544
- capScope: "system",
70545
- addonId: null,
70546
- access: "delete"
70547
- },
70548
70571
  "userManagement.revokeOauthSession": {
70549
70572
  capName: "user-management",
70550
70573
  capScope: "system",
@@ -74116,9 +74139,13 @@ new Map(Object.entries({
74116
74139
  "stream-online": "device-events",
74117
74140
  "stream-offline": "device-events",
74118
74141
  "detection-blind": "device-events",
74142
+ "motion-noisy": "device-events",
74143
+ "motion-calm": "device-events",
74119
74144
  "recording-stalled": "device-events",
74120
74145
  "recording-healthy": "device-events",
74121
74146
  "recording-degraded": "device-events",
74147
+ "device-attention-required": "device-events",
74148
+ "device-attention-resolved": "device-events",
74122
74149
  "node-online": "system",
74123
74150
  "node-offline": "system",
74124
74151
  "node-restarting": "system",
@@ -74135,6 +74162,8 @@ new Map(Object.entries({
74135
74162
  "alert-critical": "system",
74136
74163
  "alert-error": "system",
74137
74164
  "alert-critical-resolved": "system",
74165
+ "rule-broken": "system",
74166
+ "rule-repaired": "system",
74138
74167
  "storage-location-low": "system",
74139
74168
  "storage-location-critical": "system",
74140
74169
  "storage-location-ok": "system",
@@ -74199,6 +74228,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
74199
74228
  label: "Detecting nothing",
74200
74229
  kinds: ["detection-blind"]
74201
74230
  },
74231
+ {
74232
+ id: "motion-noise",
74233
+ family: "device-events",
74234
+ label: "Motion without a subject",
74235
+ kinds: ["motion-noisy", "motion-calm"]
74236
+ },
74202
74237
  {
74203
74238
  id: "recording",
74204
74239
  family: "device-events",
@@ -74209,6 +74244,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
74209
74244
  "recording-degraded"
74210
74245
  ]
74211
74246
  },
74247
+ {
74248
+ id: "device-attention",
74249
+ family: "device-events",
74250
+ label: "Needs attention",
74251
+ kinds: ["device-attention-required", "device-attention-resolved"]
74252
+ },
74212
74253
  {
74213
74254
  id: "nodes",
74214
74255
  family: "system",
@@ -74269,6 +74310,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
74269
74310
  "alert-critical-resolved"
74270
74311
  ]
74271
74312
  },
74313
+ {
74314
+ id: "rule-health",
74315
+ family: "system",
74316
+ label: "Notification rules",
74317
+ kinds: ["rule-broken", "rule-repaired"]
74318
+ },
74272
74319
  {
74273
74320
  id: "alarm",
74274
74321
  family: "alarm",
@@ -74342,6 +74389,7 @@ var ALERT_EPISODE = [
74342
74389
  "alert-error",
74343
74390
  "alert-critical-resolved"
74344
74391
  ];
74392
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
74345
74393
  var UPDATES = [
74346
74394
  "addon-update-available",
74347
74395
  "server-update-available",
@@ -74371,9 +74419,12 @@ var DEVICE_EVENTS = [
74371
74419
  "stream-online",
74372
74420
  "stream-offline",
74373
74421
  "detection-blind",
74422
+ "motion-noisy",
74423
+ "motion-calm",
74374
74424
  "recording-stalled",
74375
74425
  "recording-healthy",
74376
74426
  "recording-degraded",
74427
+ ...DEVICE_ATTENTION,
74377
74428
  ...ALARM
74378
74429
  ];
74379
74430
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -74541,7 +74592,13 @@ var STATE_SUMMARY_VARS = [
74541
74592
  [...RULE_TEXT],
74542
74593
  [...RULE_TEXT],
74543
74594
  [...RULE_TEXT],
74544
- ([...RULE_TEXT], [...ALERT_EPISODE]),
74595
+ [...RULE_TEXT],
74596
+ [...RULE_TEXT],
74597
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
74598
+ [...RULE_TEXT],
74599
+ [...RULE_TEXT],
74600
+ [...RULE_TEXT],
74601
+ [...RULE_TEXT],
74545
74602
  [...RULE_TEXT],
74546
74603
  [...RULE_TEXT],
74547
74604
  [...RULE_TEXT],
@@ -74559,11 +74616,11 @@ var STATE_SUMMARY_VARS = [
74559
74616
  [...RULE_TEXT],
74560
74617
  [...RULE_TEXT],
74561
74618
  [...RULE_TEXT],
74619
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
74562
74620
  ([...RULE_TEXT], [...ALERT_EPISODE]),
74621
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
74563
74622
  ([...RULE_TEXT], [...ALERT_EPISODE]),
74564
- ([...RULE_TEXT], [...ALERT_EPISODE]),
74565
- ([...RULE_TEXT], [...ALERT_EPISODE]),
74566
- ([...RULE_TEXT], [...ALERT_EPISODE]),
74623
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
74567
74624
  [...RULE_TEXT],
74568
74625
  [...RULE_TEXT],
74569
74626
  [...RULE_TEXT],
@@ -74584,6 +74641,125 @@ var STATE_SUMMARY_VARS = [
74584
74641
  [...RULE_TEXT],
74585
74642
  ...STATE_SUMMARY_VARS
74586
74643
  ];
74644
+ new Map([
74645
+ {
74646
+ id: "device-connectivity",
74647
+ family: "device-events",
74648
+ label: "Device connectivity (offline / back online)",
74649
+ bad: ["device-offline"],
74650
+ recovery: ["device-online"],
74651
+ snapshotLabel: "Devices offline now",
74652
+ snapshotSection: "device-state"
74653
+ },
74654
+ {
74655
+ id: "device-switch",
74656
+ family: "device-events",
74657
+ label: "Device switched off / back on",
74658
+ bad: ["device-disabled"],
74659
+ recovery: ["device-enabled"],
74660
+ snapshotLabel: "Devices switched off now",
74661
+ snapshotSection: "device-state"
74662
+ },
74663
+ {
74664
+ id: "stream-connectivity",
74665
+ family: "device-events",
74666
+ label: "Stream connectivity (offline / back online)",
74667
+ bad: ["stream-offline"],
74668
+ recovery: ["stream-online"],
74669
+ snapshotLabel: "Streams offline now",
74670
+ snapshotSection: "streams"
74671
+ },
74672
+ {
74673
+ id: "battery",
74674
+ family: "device-events",
74675
+ label: "Battery (low / back to normal)",
74676
+ bad: ["device-battery-low"],
74677
+ recovery: ["device-battery-normal"],
74678
+ snapshotLabel: "Batteries low now",
74679
+ snapshotSection: "battery"
74680
+ },
74681
+ {
74682
+ id: "consumables",
74683
+ family: "device-events",
74684
+ label: "Consumables (low / replaced)",
74685
+ bad: ["device-consumable-low"],
74686
+ recovery: ["device-consumable-normal"],
74687
+ snapshotLabel: "Consumables low now",
74688
+ snapshotSection: "consumables"
74689
+ },
74690
+ {
74691
+ id: "tanks",
74692
+ family: "device-events",
74693
+ label: "Tanks (low or full / back to normal)",
74694
+ bad: ["device-tank-low", "device-tank-full"],
74695
+ recovery: ["device-tank-normal"],
74696
+ snapshotLabel: "Tanks low or full now",
74697
+ snapshotSection: "tanks"
74698
+ },
74699
+ {
74700
+ id: "motion-noise",
74701
+ family: "device-events",
74702
+ label: "Motion without a subject (constant / calm again)",
74703
+ bad: ["motion-noisy"],
74704
+ recovery: ["motion-calm"],
74705
+ snapshotLabel: "Cameras with constant motion now",
74706
+ snapshotSection: null
74707
+ },
74708
+ {
74709
+ id: "recording-health",
74710
+ family: "device-events",
74711
+ label: "Recording health (stalled or degraded / recording again)",
74712
+ bad: ["recording-stalled", "recording-degraded"],
74713
+ recovery: ["recording-healthy"],
74714
+ snapshotLabel: "Recordings stalled now",
74715
+ snapshotSection: null
74716
+ },
74717
+ {
74718
+ id: "device-attention",
74719
+ family: "device-events",
74720
+ label: "Device needs attention (raised / resolved)",
74721
+ bad: ["device-attention-required"],
74722
+ recovery: ["device-attention-resolved"],
74723
+ snapshotLabel: "Devices needing attention now",
74724
+ snapshotSection: null
74725
+ },
74726
+ {
74727
+ id: "node-connectivity",
74728
+ family: "system",
74729
+ label: "Node connectivity (offline / back online)",
74730
+ bad: ["node-offline"],
74731
+ recovery: ["node-online"],
74732
+ snapshotLabel: "Nodes offline now",
74733
+ snapshotSection: "nodes"
74734
+ },
74735
+ {
74736
+ id: "storage-space",
74737
+ family: "system",
74738
+ label: "Storage space (low or critical / ok again)",
74739
+ bad: ["storage-location-low", "storage-location-critical"],
74740
+ recovery: ["storage-location-ok"],
74741
+ snapshotLabel: "Storage locations low now",
74742
+ snapshotSection: null
74743
+ },
74744
+ {
74745
+ id: "critical-alerts",
74746
+ family: "system",
74747
+ label: "Critical alerts (raised / resolved)",
74748
+ bad: ["alert-critical"],
74749
+ recovery: ["alert-critical-resolved"],
74750
+ snapshotLabel: "Critical alerts open now",
74751
+ snapshotSection: null
74752
+ },
74753
+ {
74754
+ id: "rule-health",
74755
+ family: "system",
74756
+ label: "Rule health (broken / repaired)",
74757
+ bad: ["rule-broken"],
74758
+ recovery: ["rule-repaired"],
74759
+ snapshotLabel: "Notification rules broken now",
74760
+ snapshotSection: null
74761
+ }
74762
+ ].flatMap((spec) => [...spec.bad, ...spec.recovery].map((kind) => [kind, spec])));
74587
74763
  new Set([
74588
74764
  "disarmed",
74589
74765
  "armed_home",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-notifiers",
3
- "version": "1.2.614",
3
+ "version": "1.2.616",
4
4
  "description": "System notifiers addon for CamStack — a `notification-output` collection provider hosting per-kind notifier adapters (ntfy, pushover, gotify, telegram, discord, webhook, zentik).",
5
5
  "keywords": [
6
6
  "camstack",