@camstack/system 1.2.464 → 1.2.466

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 (92) hide show
  1. package/dist/addon-runner.js +1 -0
  2. package/dist/addon-runner.mjs +1 -0
  3. package/dist/addon-utils.mjs +1 -1
  4. package/dist/{agent-https-B9gbXoJI.mjs → agent-https-DDzIuZY_.mjs} +1 -1
  5. package/dist/{agent-https-DhFIbEwN.js → agent-https-OIvfjiTx.js} +1 -1
  6. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  7. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +4 -4
  8. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  9. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +5 -5
  10. package/dist/builtins/alerts/alerts.addon.d.ts +7 -0
  11. package/dist/builtins/alerts/alerts.addon.js +65 -2
  12. package/dist/builtins/alerts/alerts.addon.mjs +65 -2
  13. package/dist/builtins/autotrack/index.js +1 -1
  14. package/dist/builtins/autotrack/index.mjs +1 -1
  15. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +2 -2
  16. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +5 -5
  17. package/dist/builtins/calendars/calendars.addon.js +1 -1
  18. package/dist/builtins/calendars/calendars.addon.mjs +1 -1
  19. package/dist/builtins/camera-grid/index.js +1 -1
  20. package/dist/builtins/camera-grid/index.mjs +1 -1
  21. package/dist/builtins/composer/composer.addon.js +2 -2
  22. package/dist/builtins/composer/composer.addon.mjs +2 -2
  23. package/dist/builtins/console-logging/index.js +1 -1
  24. package/dist/builtins/console-logging/index.mjs +1 -1
  25. package/dist/builtins/core-blocks/core-blocks.addon.js +2 -2
  26. package/dist/builtins/core-blocks/core-blocks.addon.mjs +2 -2
  27. package/dist/builtins/device-history/device-history.addon.js +1 -1
  28. package/dist/builtins/device-history/device-history.addon.mjs +1 -1
  29. package/dist/builtins/device-manager/device-manager.addon.js +1 -1
  30. package/dist/builtins/device-manager/device-manager.addon.mjs +1 -1
  31. package/dist/builtins/hub-forwarder/index.js +1 -1
  32. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  33. package/dist/builtins/keychain/index.js +3 -3
  34. package/dist/builtins/keychain/index.mjs +3 -3
  35. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  36. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  37. package/dist/builtins/local-auth/auth-schema.d.ts +0 -2
  38. package/dist/builtins/local-auth/local-auth.addon.d.ts +0 -1
  39. package/dist/builtins/local-auth/local-auth.addon.js +23 -178
  40. package/dist/builtins/local-auth/local-auth.addon.mjs +27 -181
  41. package/dist/builtins/local-auth/record-kinds.d.ts +1 -6
  42. package/dist/builtins/local-network/local-network.addon.js +2 -2
  43. package/dist/builtins/local-network/local-network.addon.mjs +2 -2
  44. package/dist/builtins/loki-logging/index.js +1 -1
  45. package/dist/builtins/loki-logging/index.mjs +1 -1
  46. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  47. package/dist/builtins/native-metrics/native-metrics.addon.mjs +10 -10
  48. package/dist/builtins/platform-probe/index.js +1 -1
  49. package/dist/builtins/platform-probe/index.mjs +8 -8
  50. package/dist/builtins/record-entries/index.js +1 -1
  51. package/dist/builtins/record-entries/index.mjs +1 -1
  52. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  53. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  54. package/dist/builtins/snapshot/index.js +1 -1
  55. package/dist/builtins/snapshot/index.mjs +1 -1
  56. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  57. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +20 -20
  58. package/dist/builtins/sqlite-storage/index.js +1 -1
  59. package/dist/builtins/sqlite-storage/index.mjs +1 -1
  60. package/dist/builtins/sqlite-storage/records/records-engine.d.ts +11 -0
  61. package/dist/builtins/sqlite-storage/records/records-provider.d.ts +7 -2
  62. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +25 -15
  63. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +25 -15
  64. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  65. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  66. package/dist/builtins/system-config/system-config.addon.js +3 -3
  67. package/dist/builtins/system-config/system-config.addon.mjs +115 -115
  68. package/dist/builtins/winston-logging/index.js +1 -1
  69. package/dist/builtins/winston-logging/index.mjs +1 -1
  70. package/dist/{composition-sources-oXvmbMHX.js → composition-sources-DqHwltDV.js} +1 -1
  71. package/dist/{composition-sources-CGtooHSL.mjs → composition-sources-f74jlgRO.mjs} +1 -1
  72. package/dist/{constants-5mrGZxwS.js → constants-CdgJF4V6.js} +1 -1
  73. package/dist/{constants-CdutnpL9.mjs → constants-Dknv37yZ.mjs} +1 -1
  74. package/dist/{coral-accelerators-D_S1Fo5h.mjs → coral-accelerators-Qhn5TOYZ.mjs} +5 -5
  75. package/dist/{custom-action-registry-BGYDjTqY.mjs → custom-action-registry-DZSCLBuT.mjs} +37 -37
  76. package/dist/{device-ca-DZHKlZlD.mjs → device-ca-B16Mr3EY.mjs} +1 -1
  77. package/dist/{device-ca-B3xUzps7.js → device-ca-DpvQ5wrb.js} +1 -1
  78. package/dist/{dist-C2OBCa-A.mjs → dist-CfjkLTZV.mjs} +281 -66
  79. package/dist/{dist-D9aw_d0G.js → dist-QyW9hVO2.js} +298 -71
  80. package/dist/file-host-worker.js +1 -1
  81. package/dist/file-host-worker.mjs +1 -1
  82. package/dist/{hub-mdns-ciao-CFlhVKK6.js → hub-mdns-ciao-CWkX17zX.js} +2 -2
  83. package/dist/{hub-mdns-ciao-Bm09NrMS.mjs → hub-mdns-ciao-CtHQEnb3.mjs} +2 -2
  84. package/dist/index.d.ts +0 -2
  85. package/dist/index.js +8 -8
  86. package/dist/index.mjs +228 -227
  87. package/dist/{restore-archive-D6sS7Gt2.mjs → restore-archive-BmHNBgte.mjs} +94 -94
  88. package/dist/{restore-archive-6zkRREHO.js → restore-archive-DMgpNgX5.js} +1 -1
  89. package/dist/{wal-maintenance-jXcOxm2T.js → wal-maintenance-BIpPCYDi.js} +0 -0
  90. package/dist/{wal-maintenance-Dg6IzSgz.mjs → wal-maintenance-Bs_X-di6.mjs} +0 -0
  91. package/package.json +1 -1
  92. package/dist/auth/api-key-manager.d.ts +0 -19
@@ -1,6 +1,6 @@
1
1
  let zod = require("zod");
2
2
  require("node:crypto");
3
- //#region ../types/dist/event-category-DOl51-Ij.mjs
3
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
4
4
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
5
5
  EventCategory["SystemBoot"] = "system.boot";
6
6
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -317,6 +317,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
317
317
  */
318
318
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
319
319
  /**
320
+ * A camera's motion source has fired constantly with no subject for an hour
321
+ * (motion duty or session count over the bar, zero detections) — it is not
322
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
323
+ * {@link PipelineMotionCalm}.
324
+ */
325
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
326
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
327
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
328
+ /**
320
329
  * Per-camera pipeline config was mutated by the orchestrator
321
330
  * (3-level settings change via `setAgentAddonDefaults` /
322
331
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -688,6 +697,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
688
697
  EventCategory["BackupRestored"] = "backup.restored";
689
698
  EventCategory["NotificationDispatched"] = "notification.dispatched";
690
699
  EventCategory["NotificationFailed"] = "notification.failed";
700
+ /**
701
+ * A notification rule that cannot work (D905): its stored row does not load,
702
+ * or it still names a device / delivery target the prune CONFIRMED deleted.
703
+ * One edge per rule per distinct set of reasons; never on an unanswered read.
704
+ */
705
+ EventCategory["NotificationRuleBroken"] = "notification.rule-broken";
706
+ /** The clear of {@link NotificationRuleBroken}: the rule loads and names nothing deleted. */
707
+ EventCategory["NotificationRuleRepaired"] = "notification.rule-repaired";
691
708
  EventCategory["DeviceUpdated"] = "device.updated";
692
709
  /**
693
710
  * Transport-level connectivity. Emitted by the device driver when
@@ -745,7 +762,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
745
762
  return EventCategory;
746
763
  }({});
747
764
  //#endregion
748
- //#region ../types/dist/sleep-_sV1BE2f.mjs
765
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
749
766
  /**
750
767
  * The audio chunk plane's byte format, and the ONE expansion from a coded
751
768
  * window to float samples (D455).
@@ -3404,6 +3421,17 @@ var BatchTooLargeError = class extends RecordsError {
3404
3421
  this.name = "BatchTooLargeError";
3405
3422
  }
3406
3423
  };
3424
+ /**
3425
+ * A `transact` the engine refuses before touching a row: an op on a kind the
3426
+ * caller did not declare in ONE file and ONE `transactFamily`. The detail names
3427
+ * which rule (`cross-file`, `cross-family`, `no-family`); it is never a silent split.
3428
+ */
3429
+ var TransactRefusedError = class extends RecordsError {
3430
+ constructor(detail) {
3431
+ super("transact-refused", detail);
3432
+ this.name = "TransactRefusedError";
3433
+ }
3434
+ };
3407
3435
  function defOf(schema) {
3408
3436
  const zodBag = Reflect.get(schema, "_zod");
3409
3437
  if (typeof zodBag !== "object" || zodBag === null) return {};
@@ -3638,8 +3666,7 @@ var EntryDescriptorSchema = zod.z.object({
3638
3666
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
3639
3667
  fields: zod.z.record(zod.z.string(), zod.z.unknown())
3640
3668
  }).strict();
3641
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
3642
- var RecordKindDeclarationSchema = zod.z.object({
3669
+ var RecordKindDeclarationShape = zod.z.object({
3643
3670
  database: zod.z.enum(RECORD_DATABASES).default("settings"),
3644
3671
  class: zod.z.enum(RECORD_CLASSES),
3645
3672
  writeTrigger: zod.z.string().min(1),
@@ -3657,18 +3684,18 @@ var RecordKindDeclarationSchema = zod.z.object({
3657
3684
  secretPaths: zod.z.array(zod.z.string().min(1)).default([]),
3658
3685
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
3659
3686
  secretArrayKeys: zod.z.record(zod.z.string(), zod.z.string()).default({}),
3660
- /**
3661
- * RETIRED (D900): the legacy table a kind adopted from during the records
3662
- * migration. Nothing declares it any more and nothing reads it; the schema
3663
- * still ACCEPTS it because the catalog rows the migration wrote carry it
3664
- * (an orphaned kind is never redeclared) and an addon built before the
3665
- * removal still sends it. Never set it.
3666
- */
3667
- adoptsFrom: zod.z.string().min(1).optional(),
3668
3687
  /** Kinds that must agree through `transact` sit in one file under one family name. */
3669
3688
  transactFamily: zod.z.string().min(1).optional(),
3670
3689
  entry: EntryDescriptorSchema.optional()
3671
- }).strict();
3690
+ });
3691
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
3692
+ var RecordKindDeclarationSchema = RecordKindDeclarationShape.strict();
3693
+ /**
3694
+ * A declaration as the engine's catalog stored it: an unknown key is DROPPED,
3695
+ * because a row written by an older engine must never stop records from
3696
+ * starting. Only for rows read back from the catalog, never for input.
3697
+ */
3698
+ var StoredRecordKindDeclarationSchema = RecordKindDeclarationShape;
3672
3699
  /** The kind names: lower-case, dash separated, short enough for an index name. */
3673
3700
  var RecordKindNameSchema = zod.z.string().regex(/^[a-z][a-z0-9-]{0,47}$/);
3674
3701
  /** Cross-field rules a declaration must satisfy. Throws {@link DeclarationRefusedError}. */
@@ -3754,6 +3781,23 @@ function defineRecordKinds(specs) {
3754
3781
  }
3755
3782
  return out;
3756
3783
  }
3784
+ /**
3785
+ * The scope rule of `transact`, shared by the engine, the provider and the
3786
+ * in-memory records so they cannot disagree: every op's kind sits in ONE
3787
+ * database file, and when more than one kind is involved they all name the
3788
+ * SAME `transactFamily`. A refusal names the rule; nothing is split silently.
3789
+ */
3790
+ /** Throws {@link TransactRefusedError} unless the kinds may share one transaction. */
3791
+ function assertTransactScope(members) {
3792
+ const byKind = /* @__PURE__ */ new Map();
3793
+ for (const m of members) byKind.set(m.kind, m);
3794
+ const kinds = [...byKind.values()];
3795
+ if (new Set(kinds.map((m) => m.declaration.database)).size > 1) throw new TransactRefusedError(`cross-file: the ops span more than one database file (${kinds.map((m) => `${m.kind}@${m.declaration.database}`).join(", ")}); a transaction lives in ONE file`);
3796
+ if (kinds.length <= 1) return;
3797
+ const missing = kinds.filter((m) => m.declaration.transactFamily === void 0);
3798
+ if (missing.length > 0) throw new TransactRefusedError(`no-family: ${missing.map((m) => m.kind).join(", ")} declare no transactFamily; kinds that must agree through transact share one`);
3799
+ if (new Set(kinds.map((m) => m.declaration.transactFamily)).size > 1) throw new TransactRefusedError(`cross-family: the ops span more than one transactFamily (${kinds.map((m) => `${m.kind}=${String(m.declaration.transactFamily)}`).join(", ")})`);
3800
+ }
3757
3801
  /** Shared Zod schemas used across streaming capabilities. */
3758
3802
  var CamProfileSchema = zod.z.enum([
3759
3803
  "high",
@@ -10553,17 +10597,6 @@ var UserRecordSchema = zod.z.object({
10553
10597
  createdAt: zod.z.number(),
10554
10598
  updatedAt: zod.z.number()
10555
10599
  });
10556
- var ApiKeyRecordSchema = zod.z.object({
10557
- id: zod.z.string(),
10558
- label: zod.z.string(),
10559
- isAdmin: zod.z.boolean().default(false),
10560
- allowedProviders: AllowedProviderSchema,
10561
- allowedDevices: AllowedDevicesSchema,
10562
- tokenHash: zod.z.string(),
10563
- tokenPrefix: zod.z.string(),
10564
- createdAt: zod.z.number(),
10565
- lastUsedAt: zod.z.number().optional()
10566
- });
10567
10600
  var ScopedTokenSchema = zod.z.object({
10568
10601
  id: zod.z.string(),
10569
10602
  userId: zod.z.string(),
@@ -17207,16 +17240,36 @@ var RecordKindStateSchema = zod.z.enum([
17207
17240
  var DeclareKindResultSchema = zod.z.object({
17208
17241
  kindId: zod.z.number().int(),
17209
17242
  state: RecordKindStateSchema,
17210
- createdIndexes: zod.z.array(zod.z.string()),
17211
- /**
17212
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
17213
- * it stays on the wire, null, because an addon built before the removal reads
17214
- * an ABSENT field as "adoption pending" and refuses to start.
17215
- */
17216
- adoptionPending: zod.z.null()
17243
+ createdIndexes: zod.z.array(zod.z.string())
17217
17244
  });
17218
17245
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
17219
17246
  var SecretRefsList = zod.z.array(zod.z.string());
17247
+ /**
17248
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
17249
+ * All ops of one call share ONE database file and ONE `transactFamily`.
17250
+ */
17251
+ var RecordTransactOpSchema = zod.z.discriminatedUnion("op", [
17252
+ zod.z.object({
17253
+ op: zod.z.literal("put"),
17254
+ kind: RecordKindNameSchema,
17255
+ record: RecordInputSchema,
17256
+ ifRev: zod.z.number().int().min(0).optional()
17257
+ }),
17258
+ zod.z.object({
17259
+ op: zod.z.literal("patch"),
17260
+ kind: RecordKindNameSchema,
17261
+ id: RecordIdSchema,
17262
+ data: RecordBodySchema,
17263
+ at: zod.z.number().int().nullable().optional(),
17264
+ expiresAt: zod.z.number().int().nullable().optional(),
17265
+ ifRev: zod.z.number().int().min(1).optional()
17266
+ }),
17267
+ zod.z.object({
17268
+ op: zod.z.literal("delete"),
17269
+ kind: RecordKindNameSchema,
17270
+ id: RecordIdSchema
17271
+ })
17272
+ ]);
17220
17273
  var RecordSecretRefsSchema = zod.z.record(zod.z.string(), zod.z.record(zod.z.string(), zod.z.string()));
17221
17274
  var recordsCapability = {
17222
17275
  name: "records",
@@ -17348,6 +17401,22 @@ var recordsCapability = {
17348
17401
  kind: "mutation",
17349
17402
  auth: "admin"
17350
17403
  }),
17404
+ /**
17405
+ * Several single-row writes (put / patch / delete) in ONE SQLite transaction:
17406
+ * all land or none does. Every op's kind must sit in one file and share one
17407
+ * `transactFamily` (`records/transact-refused` otherwise). Results are in op order.
17408
+ */
17409
+ transact: method(zod.z.object({ ops: zod.z.array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), zod.z.object({
17410
+ results: zod.z.array(zod.z.object({
17411
+ rev: zod.z.number().int().nullable(),
17412
+ deleted: zod.z.boolean()
17413
+ })),
17414
+ releasedRefs: SecretRefsList,
17415
+ secretRefs: SecretRefsList
17416
+ }), {
17417
+ kind: "mutation",
17418
+ auth: "admin"
17419
+ }),
17351
17420
  /** The D865 hook body: every kind of this addon declared `deviceRemoval: 'delete'`. */
17352
17421
  deleteDevice: method(zod.z.object({
17353
17422
  deviceId: zod.z.number().int(),
@@ -44982,9 +45051,13 @@ var NcSystemEventKindSchema = zod.z.enum([
44982
45051
  "node-updating",
44983
45052
  "node-inference-unavailable",
44984
45053
  "detection-blind",
45054
+ "motion-noisy",
45055
+ "motion-calm",
44985
45056
  "recording-stalled",
44986
45057
  "recording-healthy",
44987
45058
  "recording-degraded",
45059
+ "device-attention-required",
45060
+ "device-attention-resolved",
44988
45061
  "storage-location-low",
44989
45062
  "storage-location-critical",
44990
45063
  "storage-location-ok",
@@ -45008,6 +45081,8 @@ var NcSystemEventKindSchema = zod.z.enum([
45008
45081
  "alert-critical",
45009
45082
  "alert-error",
45010
45083
  "alert-critical-resolved",
45084
+ "rule-broken",
45085
+ "rule-repaired",
45011
45086
  "camera-online",
45012
45087
  "camera-offline",
45013
45088
  "camera-disabled",
@@ -61560,6 +61635,16 @@ var DishwasherStatusSchema = zod.z.object({
61560
61635
  powerState: zod.z.string().nullable(),
61561
61636
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
61562
61637
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
61638
+ /**
61639
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
61640
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
61641
+ * when none is reported. A cleared reminder is not an unknown one.
61642
+ */
61643
+ filterCleaningDue: zod.z.boolean().nullable(),
61644
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
61645
+ machineCareDue: zod.z.boolean().nullable(),
61646
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
61647
+ machineCareRemainingRuns: zod.z.number().int().nonnegative().nullable(),
61563
61648
  /** Option states: null when the appliance does not expose the option or has not said. */
61564
61649
  halfLoad: zod.z.boolean().nullable(),
61565
61650
  hygienePlus: zod.z.boolean().nullable(),
@@ -71702,16 +71787,6 @@ var UpdateUserInputSchema = zod.z.object({
71702
71787
  allowedDevices: zod.z.record(zod.z.string(), zod.z.union([zod.z.array(zod.z.string()), zod.z.literal("*")])).optional(),
71703
71788
  scopes: zod.z.array(TokenScopeSchema).optional()
71704
71789
  });
71705
- var ApiKeySummarySchema = zod.z.object({
71706
- id: zod.z.string(),
71707
- label: zod.z.string(),
71708
- isAdmin: zod.z.boolean().default(false),
71709
- allowedProviders: zod.z.union([zod.z.array(zod.z.string()), zod.z.literal("*")]).optional(),
71710
- allowedDevices: zod.z.record(zod.z.string(), zod.z.union([zod.z.array(zod.z.string()), zod.z.literal("*")])).optional(),
71711
- tokenPrefix: zod.z.string(),
71712
- createdAt: zod.z.number(),
71713
- lastUsedAt: zod.z.number().optional()
71714
- });
71715
71790
  var OauthSessionSummarySchema = zod.z.object({
71716
71791
  id: zod.z.string(),
71717
71792
  userId: zod.z.string(),
@@ -71733,8 +71808,7 @@ var TotpStatusSchema = zod.z.object({
71733
71808
  confirmedAt: zod.z.number().nullable()
71734
71809
  });
71735
71810
  /**
71736
- * user-management — singleton capability for user accounts and the
71737
- * legacy API-key rows.
71811
+ * user-management — singleton capability for user accounts.
71738
71812
  *
71739
71813
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
71740
71814
  * — the subset check on `setUserScopes` is moot
@@ -71802,12 +71876,6 @@ var userManagementCapability = {
71802
71876
  kind: "mutation",
71803
71877
  access: "view"
71804
71878
  }),
71805
- listApiKeys: method(zod.z.void(), zod.z.array(ApiKeySummarySchema), { auth: "admin" }),
71806
- revokeApiKey: method(zod.z.object({ id: zod.z.string() }), zod.z.object({ success: zod.z.literal(true) }), {
71807
- kind: "mutation",
71808
- auth: "admin",
71809
- access: "delete"
71810
- }),
71811
71879
  setupTotp: method(zod.z.object({ userId: zod.z.string() }), TotpSetupResultSchema, {
71812
71880
  kind: "mutation",
71813
71881
  auth: "admin",
@@ -81661,6 +81729,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
81661
81729
  addonId: null,
81662
81730
  access: "view"
81663
81731
  },
81732
+ "records.transact": {
81733
+ capName: "records",
81734
+ capScope: "system",
81735
+ addonId: null,
81736
+ access: "create"
81737
+ },
81664
81738
  "sceneMonitor.captureReference": {
81665
81739
  capName: "scene-monitor",
81666
81740
  capScope: "device",
@@ -82993,12 +83067,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
82993
83067
  addonId: null,
82994
83068
  access: "view"
82995
83069
  },
82996
- "userManagement.listApiKeys": {
82997
- capName: "user-management",
82998
- capScope: "system",
82999
- addonId: null,
83000
- access: "view"
83001
- },
83002
83070
  "userManagement.listExternalIdentities": {
83003
83071
  capName: "user-management",
83004
83072
  capScope: "system",
@@ -83053,12 +83121,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
83053
83121
  addonId: null,
83054
83122
  access: "create"
83055
83123
  },
83056
- "userManagement.revokeApiKey": {
83057
- capName: "user-management",
83058
- capScope: "system",
83059
- addonId: null,
83060
- access: "delete"
83061
- },
83062
83124
  "userManagement.revokeOauthSession": {
83063
83125
  capName: "user-management",
83064
83126
  capScope: "system",
@@ -87374,9 +87436,13 @@ new Map(Object.entries({
87374
87436
  "stream-online": "device-events",
87375
87437
  "stream-offline": "device-events",
87376
87438
  "detection-blind": "device-events",
87439
+ "motion-noisy": "device-events",
87440
+ "motion-calm": "device-events",
87377
87441
  "recording-stalled": "device-events",
87378
87442
  "recording-healthy": "device-events",
87379
87443
  "recording-degraded": "device-events",
87444
+ "device-attention-required": "device-events",
87445
+ "device-attention-resolved": "device-events",
87380
87446
  "node-online": "system",
87381
87447
  "node-offline": "system",
87382
87448
  "node-restarting": "system",
@@ -87393,6 +87459,8 @@ new Map(Object.entries({
87393
87459
  "alert-critical": "system",
87394
87460
  "alert-error": "system",
87395
87461
  "alert-critical-resolved": "system",
87462
+ "rule-broken": "system",
87463
+ "rule-repaired": "system",
87396
87464
  "storage-location-low": "system",
87397
87465
  "storage-location-critical": "system",
87398
87466
  "storage-location-ok": "system",
@@ -87457,6 +87525,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
87457
87525
  label: "Detecting nothing",
87458
87526
  kinds: ["detection-blind"]
87459
87527
  },
87528
+ {
87529
+ id: "motion-noise",
87530
+ family: "device-events",
87531
+ label: "Motion without a subject",
87532
+ kinds: ["motion-noisy", "motion-calm"]
87533
+ },
87460
87534
  {
87461
87535
  id: "recording",
87462
87536
  family: "device-events",
@@ -87467,6 +87541,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
87467
87541
  "recording-degraded"
87468
87542
  ]
87469
87543
  },
87544
+ {
87545
+ id: "device-attention",
87546
+ family: "device-events",
87547
+ label: "Needs attention",
87548
+ kinds: ["device-attention-required", "device-attention-resolved"]
87549
+ },
87470
87550
  {
87471
87551
  id: "nodes",
87472
87552
  family: "system",
@@ -87527,6 +87607,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
87527
87607
  "alert-critical-resolved"
87528
87608
  ]
87529
87609
  },
87610
+ {
87611
+ id: "rule-health",
87612
+ family: "system",
87613
+ label: "Notification rules",
87614
+ kinds: ["rule-broken", "rule-repaired"]
87615
+ },
87530
87616
  {
87531
87617
  id: "alarm",
87532
87618
  family: "alarm",
@@ -87642,6 +87728,7 @@ var ALERT_EPISODE = [
87642
87728
  "alert-error",
87643
87729
  "alert-critical-resolved"
87644
87730
  ];
87731
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
87645
87732
  var UPDATES = [
87646
87733
  "addon-update-available",
87647
87734
  "server-update-available",
@@ -87671,9 +87758,12 @@ var DEVICE_EVENTS = [
87671
87758
  "stream-online",
87672
87759
  "stream-offline",
87673
87760
  "detection-blind",
87761
+ "motion-noisy",
87762
+ "motion-calm",
87674
87763
  "recording-stalled",
87675
87764
  "recording-healthy",
87676
87765
  "recording-degraded",
87766
+ ...DEVICE_ATTENTION,
87677
87767
  ...ALARM
87678
87768
  ];
87679
87769
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -87841,7 +87931,13 @@ var STATE_SUMMARY_VARS = [
87841
87931
  [...RULE_TEXT],
87842
87932
  [...RULE_TEXT],
87843
87933
  [...RULE_TEXT],
87844
- ([...RULE_TEXT], [...ALERT_EPISODE]),
87934
+ [...RULE_TEXT],
87935
+ [...RULE_TEXT],
87936
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
87937
+ [...RULE_TEXT],
87938
+ [...RULE_TEXT],
87939
+ [...RULE_TEXT],
87940
+ [...RULE_TEXT],
87845
87941
  [...RULE_TEXT],
87846
87942
  [...RULE_TEXT],
87847
87943
  [...RULE_TEXT],
@@ -87859,11 +87955,11 @@ var STATE_SUMMARY_VARS = [
87859
87955
  [...RULE_TEXT],
87860
87956
  [...RULE_TEXT],
87861
87957
  [...RULE_TEXT],
87958
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
87862
87959
  ([...RULE_TEXT], [...ALERT_EPISODE]),
87960
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
87863
87961
  ([...RULE_TEXT], [...ALERT_EPISODE]),
87864
- ([...RULE_TEXT], [...ALERT_EPISODE]),
87865
- ([...RULE_TEXT], [...ALERT_EPISODE]),
87866
- ([...RULE_TEXT], [...ALERT_EPISODE]),
87962
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
87867
87963
  [...RULE_TEXT],
87868
87964
  [...RULE_TEXT],
87869
87965
  [...RULE_TEXT],
@@ -87884,6 +87980,125 @@ var STATE_SUMMARY_VARS = [
87884
87980
  [...RULE_TEXT],
87885
87981
  ...STATE_SUMMARY_VARS
87886
87982
  ];
87983
+ new Map([
87984
+ {
87985
+ id: "device-connectivity",
87986
+ family: "device-events",
87987
+ label: "Device connectivity (offline / back online)",
87988
+ bad: ["device-offline"],
87989
+ recovery: ["device-online"],
87990
+ snapshotLabel: "Devices offline now",
87991
+ snapshotSection: "device-state"
87992
+ },
87993
+ {
87994
+ id: "device-switch",
87995
+ family: "device-events",
87996
+ label: "Device switched off / back on",
87997
+ bad: ["device-disabled"],
87998
+ recovery: ["device-enabled"],
87999
+ snapshotLabel: "Devices switched off now",
88000
+ snapshotSection: "device-state"
88001
+ },
88002
+ {
88003
+ id: "stream-connectivity",
88004
+ family: "device-events",
88005
+ label: "Stream connectivity (offline / back online)",
88006
+ bad: ["stream-offline"],
88007
+ recovery: ["stream-online"],
88008
+ snapshotLabel: "Streams offline now",
88009
+ snapshotSection: "streams"
88010
+ },
88011
+ {
88012
+ id: "battery",
88013
+ family: "device-events",
88014
+ label: "Battery (low / back to normal)",
88015
+ bad: ["device-battery-low"],
88016
+ recovery: ["device-battery-normal"],
88017
+ snapshotLabel: "Batteries low now",
88018
+ snapshotSection: "battery"
88019
+ },
88020
+ {
88021
+ id: "consumables",
88022
+ family: "device-events",
88023
+ label: "Consumables (low / replaced)",
88024
+ bad: ["device-consumable-low"],
88025
+ recovery: ["device-consumable-normal"],
88026
+ snapshotLabel: "Consumables low now",
88027
+ snapshotSection: "consumables"
88028
+ },
88029
+ {
88030
+ id: "tanks",
88031
+ family: "device-events",
88032
+ label: "Tanks (low or full / back to normal)",
88033
+ bad: ["device-tank-low", "device-tank-full"],
88034
+ recovery: ["device-tank-normal"],
88035
+ snapshotLabel: "Tanks low or full now",
88036
+ snapshotSection: "tanks"
88037
+ },
88038
+ {
88039
+ id: "motion-noise",
88040
+ family: "device-events",
88041
+ label: "Motion without a subject (constant / calm again)",
88042
+ bad: ["motion-noisy"],
88043
+ recovery: ["motion-calm"],
88044
+ snapshotLabel: "Cameras with constant motion now",
88045
+ snapshotSection: null
88046
+ },
88047
+ {
88048
+ id: "recording-health",
88049
+ family: "device-events",
88050
+ label: "Recording health (stalled or degraded / recording again)",
88051
+ bad: ["recording-stalled", "recording-degraded"],
88052
+ recovery: ["recording-healthy"],
88053
+ snapshotLabel: "Recordings stalled now",
88054
+ snapshotSection: null
88055
+ },
88056
+ {
88057
+ id: "device-attention",
88058
+ family: "device-events",
88059
+ label: "Device needs attention (raised / resolved)",
88060
+ bad: ["device-attention-required"],
88061
+ recovery: ["device-attention-resolved"],
88062
+ snapshotLabel: "Devices needing attention now",
88063
+ snapshotSection: null
88064
+ },
88065
+ {
88066
+ id: "node-connectivity",
88067
+ family: "system",
88068
+ label: "Node connectivity (offline / back online)",
88069
+ bad: ["node-offline"],
88070
+ recovery: ["node-online"],
88071
+ snapshotLabel: "Nodes offline now",
88072
+ snapshotSection: "nodes"
88073
+ },
88074
+ {
88075
+ id: "storage-space",
88076
+ family: "system",
88077
+ label: "Storage space (low or critical / ok again)",
88078
+ bad: ["storage-location-low", "storage-location-critical"],
88079
+ recovery: ["storage-location-ok"],
88080
+ snapshotLabel: "Storage locations low now",
88081
+ snapshotSection: null
88082
+ },
88083
+ {
88084
+ id: "critical-alerts",
88085
+ family: "system",
88086
+ label: "Critical alerts (raised / resolved)",
88087
+ bad: ["alert-critical"],
88088
+ recovery: ["alert-critical-resolved"],
88089
+ snapshotLabel: "Critical alerts open now",
88090
+ snapshotSection: null
88091
+ },
88092
+ {
88093
+ id: "rule-health",
88094
+ family: "system",
88095
+ label: "Rule health (broken / repaired)",
88096
+ bad: ["rule-broken"],
88097
+ recovery: ["rule-repaired"],
88098
+ snapshotLabel: "Notification rules broken now",
88099
+ snapshotSection: null
88100
+ }
88101
+ ].flatMap((spec) => [...spec.bad, ...spec.recovery].map((kind) => [kind, spec])));
87887
88102
  new Set([
87888
88103
  "disarmed",
87889
88104
  "armed_home",
@@ -88822,12 +89037,6 @@ Object.defineProperty(exports, "AlertSchema", {
88822
89037
  return AlertSchema;
88823
89038
  }
88824
89039
  });
88825
- Object.defineProperty(exports, "ApiKeyRecordSchema", {
88826
- enumerable: true,
88827
- get: function() {
88828
- return ApiKeyRecordSchema;
88829
- }
88830
- });
88831
89040
  Object.defineProperty(exports, "BaseAddon", {
88832
89041
  enumerable: true,
88833
89042
  get: function() {
@@ -89398,12 +89607,24 @@ Object.defineProperty(exports, "StorageMigrationJobSchema", {
89398
89607
  return StorageMigrationJobSchema;
89399
89608
  }
89400
89609
  });
89610
+ Object.defineProperty(exports, "StoredRecordKindDeclarationSchema", {
89611
+ enumerable: true,
89612
+ get: function() {
89613
+ return StoredRecordKindDeclarationSchema;
89614
+ }
89615
+ });
89401
89616
  Object.defineProperty(exports, "TokenScopeSchema", {
89402
89617
  enumerable: true,
89403
89618
  get: function() {
89404
89619
  return TokenScopeSchema;
89405
89620
  }
89406
89621
  });
89622
+ Object.defineProperty(exports, "TransactRefusedError", {
89623
+ enumerable: true,
89624
+ get: function() {
89625
+ return TransactRefusedError;
89626
+ }
89627
+ });
89407
89628
  Object.defineProperty(exports, "UNATTRIBUTED_BUCKET_KEY", {
89408
89629
  enumerable: true,
89409
89630
  get: function() {
@@ -89494,6 +89715,12 @@ Object.defineProperty(exports, "asString", {
89494
89715
  return asString$1;
89495
89716
  }
89496
89717
  });
89718
+ Object.defineProperty(exports, "assertTransactScope", {
89719
+ enumerable: true,
89720
+ get: function() {
89721
+ return assertTransactScope;
89722
+ }
89723
+ });
89497
89724
  Object.defineProperty(exports, "assertValidDeclaration", {
89498
89725
  enumerable: true,
89499
89726
  get: function() {
@@ -1,5 +1,5 @@
1
1
  require("./chunk-Cek0wNdY.js");
2
- const require_wal_maintenance = require("./wal-maintenance-jXcOxm2T.js");
2
+ const require_wal_maintenance = require("./wal-maintenance-BIpPCYDi.js");
3
3
  let node_worker_threads = require("node:worker_threads");
4
4
  //#region src/builtins/sqlite-storage/file-host-worker.ts
5
5
  /**
@@ -1,4 +1,4 @@
1
- import { C as RecordsEngine, D as callVector, E as callRecords, O as controlTargetOf, T as callData, _ as collectTransferables, a as WalMaintenance, b as isFileHostWorkerData, h as serializeError, l as SqliteSettingsBackend, o as createVectorIndex, s as vectorProviderOf, w as callControl, x as trustInput, y as isFileHostRequest } from "./wal-maintenance-Dg6IzSgz.mjs";
1
+ import { C as RecordsEngine, D as callVector, E as callRecords, O as controlTargetOf, T as callData, _ as collectTransferables, a as WalMaintenance, b as isFileHostWorkerData, h as serializeError, l as SqliteSettingsBackend, o as createVectorIndex, s as vectorProviderOf, w as callControl, x as trustInput, y as isFileHostRequest } from "./wal-maintenance-Bs_X-di6.mjs";
2
2
  import { parentPort, threadId, workerData } from "node:worker_threads";
3
3
  //#region src/builtins/sqlite-storage/file-host-worker.ts
4
4
  /**
@@ -1,7 +1,7 @@
1
1
  const require_chunk = require("./chunk-Cek0wNdY.js");
2
- const require_dist = require("./dist-D9aw_d0G.js");
2
+ const require_dist = require("./dist-QyW9hVO2.js");
3
3
  const require_x509_es = require("./x509.es-C4cOo48M.js");
4
- const require_agent_https = require("./agent-https-DhFIbEwN.js");
4
+ const require_agent_https = require("./agent-https-OIvfjiTx.js");
5
5
  let node_crypto = require("node:crypto");
6
6
  let _camstack_types_node = require("@camstack/types/node");
7
7
  let node_fs_promises = require("node:fs/promises");
@@ -1,7 +1,7 @@
1
1
  import { o as __toESM } from "./chunk-CNf5ZN-e.mjs";
2
- import { xa as userError } from "./dist-C2OBCa-A.mjs";
2
+ import { Ca as userError } from "./dist-CfjkLTZV.mjs";
3
3
  import { f as X509Certificate$1 } from "./x509.es-DK__ETIe.mjs";
4
- import { D as reasonRequiresNewCa, E as evaluateExistingCert, F as readNameConstraints, N as permitsIdentity, _ as issueLeaf, b as collectCertIdentity, g as generateCa, j as isConstrainedCa, v as loadCa, y as localCaCommonName } from "./agent-https-B9gbXoJI.mjs";
4
+ import { D as reasonRequiresNewCa, E as evaluateExistingCert, F as readNameConstraints, N as permitsIdentity, _ as issueLeaf, b as collectCertIdentity, g as generateCa, j as isConstrainedCa, v as loadCa, y as localCaCommonName } from "./agent-https-DDzIuZY_.mjs";
5
5
  import { X509Certificate, createPrivateKey } from "node:crypto";
6
6
  import { writeOwnerOnlyFileSync } from "@camstack/types/node";
7
7
  import { mkdir, writeFile } from "node:fs/promises";
package/dist/index.d.ts CHANGED
@@ -4,8 +4,6 @@ export { buildBinaryPath, downloadBinary, ensureBinary, ensureFfmpeg, ensurePyth
4
4
  export type { DirectCallerOptions } from "./addon/addon-api-factory.js";
5
5
  export { AddonApiFactory } from "./addon/addon-api-factory.js";
6
6
  export { AddonRouteRegistry } from "./addon-routes/addon-route-registry.js";
7
- export type { ApiKeyRecord, ApiKeyStorageAccess } from "./auth/api-key-manager.js";
8
- export { ApiKeyManager } from "./auth/api-key-manager.js";
9
7
  export type { AuthConfigReader, ReauthClaims, TokenPayload } from "./auth/auth-manager.js";
10
8
  export { AuthManager } from "./auth/auth-manager.js";
11
9
  export { scopesAllowAddon, scopesAllowDeviceCap } from "./auth/scope-matcher.js";