@camstack/addon-provider-velux 0.2.141 → 0.2.143

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.
package/dist/addon.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- //#region ../types/dist/event-category-7pZEBmVg.mjs
2
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -316,6 +316,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
316
316
  */
317
317
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
318
318
  /**
319
+ * A camera's motion source has fired constantly with no subject for an hour
320
+ * (motion duty or session count over the bar, zero detections) — it is not
321
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
322
+ * {@link PipelineMotionCalm}.
323
+ */
324
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
325
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
326
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
327
+ /**
319
328
  * Per-camera pipeline config was mutated by the orchestrator
320
329
  * (3-level settings change via `setAgentAddonDefaults` /
321
330
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -5422,7 +5431,7 @@ var ZodIssueCode = {
5422
5431
  var ZodFirstPartyTypeKind;
5423
5432
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5424
5433
  //#endregion
5425
- //#region ../types/dist/sleep-CueztlR1.mjs
5434
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5426
5435
  /**
5427
5436
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5428
5437
  * window to float samples (D455).
@@ -7951,7 +7960,7 @@ var EntryDescriptorSchema = object({
7951
7960
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
7952
7961
  fields: record(string(), unknown())
7953
7962
  }).strict();
7954
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
7963
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
7955
7964
  var RecordKindDeclarationSchema = object({
7956
7965
  database: _enum(RECORD_DATABASES).default("settings"),
7957
7966
  class: _enum(RECORD_CLASSES),
@@ -7970,14 +7979,6 @@ var RecordKindDeclarationSchema = object({
7970
7979
  secretPaths: array(string().min(1)).default([]),
7971
7980
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
7972
7981
  secretArrayKeys: record(string(), string()).default({}),
7973
- /**
7974
- * RETIRED (D900): the legacy table a kind adopted from during the records
7975
- * migration. Nothing declares it any more and nothing reads it; the schema
7976
- * still ACCEPTS it because the catalog rows the migration wrote carry it
7977
- * (an orphaned kind is never redeclared) and an addon built before the
7978
- * removal still sends it. Never set it.
7979
- */
7980
- adoptsFrom: string().min(1).optional(),
7981
7982
  /** Kinds that must agree through `transact` sit in one file under one family name. */
7982
7983
  transactFamily: string().min(1).optional(),
7983
7984
  entry: EntryDescriptorSchema.optional()
@@ -12669,17 +12670,6 @@ object({
12669
12670
  createdAt: number(),
12670
12671
  updatedAt: number()
12671
12672
  });
12672
- object({
12673
- id: string(),
12674
- label: string(),
12675
- isAdmin: boolean().default(false),
12676
- allowedProviders: AllowedProviderSchema,
12677
- allowedDevices: AllowedDevicesSchema,
12678
- tokenHash: string(),
12679
- tokenPrefix: string(),
12680
- createdAt: number(),
12681
- lastUsedAt: number().optional()
12682
- });
12683
12673
  object({
12684
12674
  id: string(),
12685
12675
  userId: string(),
@@ -16661,16 +16651,36 @@ var RecordKindStateSchema = _enum([
16661
16651
  var DeclareKindResultSchema = object({
16662
16652
  kindId: number().int(),
16663
16653
  state: RecordKindStateSchema,
16664
- createdIndexes: array(string()),
16665
- /**
16666
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
16667
- * it stays on the wire, null, because an addon built before the removal reads
16668
- * an ABSENT field as "adoption pending" and refuses to start.
16669
- */
16670
- adoptionPending: _null()
16654
+ createdIndexes: array(string())
16671
16655
  });
16672
16656
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
16673
16657
  var SecretRefsList = array(string());
16658
+ /**
16659
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
16660
+ * All ops of one call share ONE database file and ONE `transactFamily`.
16661
+ */
16662
+ var RecordTransactOpSchema = discriminatedUnion("op", [
16663
+ object({
16664
+ op: literal("put"),
16665
+ kind: RecordKindNameSchema,
16666
+ record: RecordInputSchema,
16667
+ ifRev: number().int().min(0).optional()
16668
+ }),
16669
+ object({
16670
+ op: literal("patch"),
16671
+ kind: RecordKindNameSchema,
16672
+ id: RecordIdSchema,
16673
+ data: RecordBodySchema,
16674
+ at: number().int().nullable().optional(),
16675
+ expiresAt: number().int().nullable().optional(),
16676
+ ifRev: number().int().min(1).optional()
16677
+ }),
16678
+ object({
16679
+ op: literal("delete"),
16680
+ kind: RecordKindNameSchema,
16681
+ id: RecordIdSchema
16682
+ })
16683
+ ]);
16674
16684
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
16675
16685
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
16676
16686
  kind: "mutation",
@@ -16777,6 +16787,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
16777
16787
  }), {
16778
16788
  kind: "mutation",
16779
16789
  auth: "admin"
16790
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
16791
+ results: array(object({
16792
+ rev: number().int().nullable(),
16793
+ deleted: boolean()
16794
+ })),
16795
+ releasedRefs: SecretRefsList,
16796
+ secretRefs: SecretRefsList
16797
+ }), {
16798
+ kind: "mutation",
16799
+ auth: "admin"
16780
16800
  }), method(object({
16781
16801
  deviceId: number().int(),
16782
16802
  kinds: array(RecordKindNameSchema).optional()
@@ -42484,9 +42504,13 @@ var NcSystemEventKindSchema = _enum([
42484
42504
  "node-updating",
42485
42505
  "node-inference-unavailable",
42486
42506
  "detection-blind",
42507
+ "motion-noisy",
42508
+ "motion-calm",
42487
42509
  "recording-stalled",
42488
42510
  "recording-healthy",
42489
42511
  "recording-degraded",
42512
+ "device-attention-required",
42513
+ "device-attention-resolved",
42490
42514
  "storage-location-low",
42491
42515
  "storage-location-critical",
42492
42516
  "storage-location-ok",
@@ -48047,7 +48071,6 @@ var RecommendationReasonSchema = discriminatedUnion("kind", [
48047
48071
  modelId: string()
48048
48072
  }),
48049
48073
  object({ kind: literal("cpu-device") }),
48050
- object({ kind: literal("coral-untouched") }),
48051
48074
  object({ kind: literal("device-disabled") }),
48052
48075
  object({ kind: literal("device-unavailable") }),
48053
48076
  object({ kind: literal("node-offline") }),
@@ -48145,11 +48168,6 @@ var AutoTuneWarningSchema = discriminatedUnion("kind", [
48145
48168
  kind: literal("detector-store-unreadable"),
48146
48169
  error: string()
48147
48170
  }),
48148
- object({
48149
- kind: literal("coral-enabled"),
48150
- nodeId: string(),
48151
- deviceKey: string()
48152
- }),
48153
48171
  object({
48154
48172
  kind: literal("custom-pin-kept"),
48155
48173
  nodeId: string(),
@@ -55810,6 +55828,16 @@ var DishwasherStatusSchema = object({
55810
55828
  powerState: string().nullable(),
55811
55829
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55812
55830
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55831
+ /**
55832
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55833
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
55834
+ * when none is reported. A cleared reminder is not an unknown one.
55835
+ */
55836
+ filterCleaningDue: boolean().nullable(),
55837
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
55838
+ machineCareDue: boolean().nullable(),
55839
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
55840
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
55813
55841
  /** Option states: null when the appliance does not expose the option or has not said. */
55814
55842
  halfLoad: boolean().nullable(),
55815
55843
  hygienePlus: boolean().nullable(),
@@ -64460,16 +64488,6 @@ var UpdateUserInputSchema = object({
64460
64488
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64461
64489
  scopes: array(TokenScopeSchema).optional()
64462
64490
  });
64463
- var ApiKeySummarySchema = object({
64464
- id: string(),
64465
- label: string(),
64466
- isAdmin: boolean().default(false),
64467
- allowedProviders: union([array(string()), literal("*")]).optional(),
64468
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64469
- tokenPrefix: string(),
64470
- createdAt: number(),
64471
- lastUsedAt: number().optional()
64472
- });
64473
64491
  var OauthSessionSummarySchema = object({
64474
64492
  id: string(),
64475
64493
  userId: string(),
@@ -64491,8 +64509,7 @@ var TotpStatusSchema = object({
64491
64509
  confirmedAt: number().nullable()
64492
64510
  });
64493
64511
  /**
64494
- * user-management — singleton capability for user accounts and the
64495
- * legacy API-key rows.
64512
+ * user-management — singleton capability for user accounts.
64496
64513
  *
64497
64514
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64498
64515
  * — the subset check on `setUserScopes` is moot
@@ -64548,10 +64565,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64548
64565
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
64549
64566
  kind: "mutation",
64550
64567
  access: "view"
64551
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
64552
- kind: "mutation",
64553
- auth: "admin",
64554
- access: "delete"
64555
64568
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
64556
64569
  kind: "mutation",
64557
64570
  auth: "admin",
@@ -74007,6 +74020,12 @@ Object.freeze({
74007
74020
  addonId: null,
74008
74021
  access: "view"
74009
74022
  },
74023
+ "records.transact": {
74024
+ capName: "records",
74025
+ capScope: "system",
74026
+ addonId: null,
74027
+ access: "create"
74028
+ },
74010
74029
  "sceneMonitor.captureReference": {
74011
74030
  capName: "scene-monitor",
74012
74031
  capScope: "device",
@@ -75339,12 +75358,6 @@ Object.freeze({
75339
75358
  addonId: null,
75340
75359
  access: "view"
75341
75360
  },
75342
- "userManagement.listApiKeys": {
75343
- capName: "user-management",
75344
- capScope: "system",
75345
- addonId: null,
75346
- access: "view"
75347
- },
75348
75361
  "userManagement.listExternalIdentities": {
75349
75362
  capName: "user-management",
75350
75363
  capScope: "system",
@@ -75399,12 +75412,6 @@ Object.freeze({
75399
75412
  addonId: null,
75400
75413
  access: "create"
75401
75414
  },
75402
- "userManagement.revokeApiKey": {
75403
- capName: "user-management",
75404
- capScope: "system",
75405
- addonId: null,
75406
- access: "delete"
75407
- },
75408
75415
  "userManagement.revokeOauthSession": {
75409
75416
  capName: "user-management",
75410
75417
  capScope: "system",
@@ -78769,9 +78776,13 @@ new Map(Object.entries({
78769
78776
  "stream-online": "device-events",
78770
78777
  "stream-offline": "device-events",
78771
78778
  "detection-blind": "device-events",
78779
+ "motion-noisy": "device-events",
78780
+ "motion-calm": "device-events",
78772
78781
  "recording-stalled": "device-events",
78773
78782
  "recording-healthy": "device-events",
78774
78783
  "recording-degraded": "device-events",
78784
+ "device-attention-required": "device-events",
78785
+ "device-attention-resolved": "device-events",
78775
78786
  "node-online": "system",
78776
78787
  "node-offline": "system",
78777
78788
  "node-restarting": "system",
@@ -78854,6 +78865,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78854
78865
  label: "Detecting nothing",
78855
78866
  kinds: ["detection-blind"]
78856
78867
  },
78868
+ {
78869
+ id: "motion-noise",
78870
+ family: "device-events",
78871
+ label: "Motion without a subject",
78872
+ kinds: ["motion-noisy", "motion-calm"]
78873
+ },
78857
78874
  {
78858
78875
  id: "recording",
78859
78876
  family: "device-events",
@@ -78864,6 +78881,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78864
78881
  "recording-degraded"
78865
78882
  ]
78866
78883
  },
78884
+ {
78885
+ id: "device-attention",
78886
+ family: "device-events",
78887
+ label: "Needs attention",
78888
+ kinds: ["device-attention-required", "device-attention-resolved"]
78889
+ },
78867
78890
  {
78868
78891
  id: "nodes",
78869
78892
  family: "system",
@@ -79003,6 +79026,7 @@ var ALERT_EPISODE = [
79003
79026
  "alert-error",
79004
79027
  "alert-critical-resolved"
79005
79028
  ];
79029
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79006
79030
  var UPDATES = [
79007
79031
  "addon-update-available",
79008
79032
  "server-update-available",
@@ -79032,9 +79056,12 @@ var DEVICE_EVENTS = [
79032
79056
  "stream-online",
79033
79057
  "stream-offline",
79034
79058
  "detection-blind",
79059
+ "motion-noisy",
79060
+ "motion-calm",
79035
79061
  "recording-stalled",
79036
79062
  "recording-healthy",
79037
79063
  "recording-degraded",
79064
+ ...DEVICE_ATTENTION,
79038
79065
  ...ALARM
79039
79066
  ];
79040
79067
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79202,7 +79229,9 @@ var STATE_SUMMARY_VARS = [
79202
79229
  [...RULE_TEXT],
79203
79230
  [...RULE_TEXT],
79204
79231
  [...RULE_TEXT],
79205
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79232
+ [...RULE_TEXT],
79233
+ [...RULE_TEXT],
79234
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79206
79235
  [...RULE_TEXT],
79207
79236
  [...RULE_TEXT],
79208
79237
  [...RULE_TEXT],
@@ -79224,11 +79253,11 @@ var STATE_SUMMARY_VARS = [
79224
79253
  [...RULE_TEXT],
79225
79254
  [...RULE_TEXT],
79226
79255
  [...RULE_TEXT],
79256
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79227
79257
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79258
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79228
79259
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79229
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79230
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79231
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79260
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79232
79261
  [...RULE_TEXT],
79233
79262
  [...RULE_TEXT],
79234
79263
  [...RULE_TEXT],
@@ -79304,6 +79333,15 @@ new Map([
79304
79333
  snapshotLabel: "Tanks low or full now",
79305
79334
  snapshotSection: "tanks"
79306
79335
  },
79336
+ {
79337
+ id: "motion-noise",
79338
+ family: "device-events",
79339
+ label: "Motion without a subject (constant / calm again)",
79340
+ bad: ["motion-noisy"],
79341
+ recovery: ["motion-calm"],
79342
+ snapshotLabel: "Cameras with constant motion now",
79343
+ snapshotSection: null
79344
+ },
79307
79345
  {
79308
79346
  id: "recording-health",
79309
79347
  family: "device-events",
@@ -79313,6 +79351,15 @@ new Map([
79313
79351
  snapshotLabel: "Recordings stalled now",
79314
79352
  snapshotSection: null
79315
79353
  },
79354
+ {
79355
+ id: "device-attention",
79356
+ family: "device-events",
79357
+ label: "Device needs attention (raised / resolved)",
79358
+ bad: ["device-attention-required"],
79359
+ recovery: ["device-attention-resolved"],
79360
+ snapshotLabel: "Devices needing attention now",
79361
+ snapshotSection: null
79362
+ },
79316
79363
  {
79317
79364
  id: "node-connectivity",
79318
79365
  family: "system",
@@ -79954,7 +80001,7 @@ function buildConnectionFormSchema() {
79954
80001
  id: "connection",
79955
80002
  title: "Connection",
79956
80003
  titleKey: "provider-velux:connection.s_connection.title",
79957
- description: "CamStack connects to the KLF-200 over the local network and polls its actuator nodes. The password is the WiFi/web password printed on the back of the unit.",
80004
+ description: "The password is the WiFi/web password printed on the back of the unit.",
79958
80005
  descriptionKey: "provider-velux:connection.s_connection.description",
79959
80006
  columns: 2,
79960
80007
  fields: [
package/dist/addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- //#region ../types/dist/event-category-7pZEBmVg.mjs
1
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
2
2
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
3
3
  EventCategory["SystemBoot"] = "system.boot";
4
4
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -315,6 +315,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
315
315
  */
316
316
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
317
317
  /**
318
+ * A camera's motion source has fired constantly with no subject for an hour
319
+ * (motion duty or session count over the bar, zero detections) — it is not
320
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
321
+ * {@link PipelineMotionCalm}.
322
+ */
323
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
324
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
325
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
326
+ /**
318
327
  * Per-camera pipeline config was mutated by the orchestrator
319
328
  * (3-level settings change via `setAgentAddonDefaults` /
320
329
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -5421,7 +5430,7 @@ var ZodIssueCode = {
5421
5430
  var ZodFirstPartyTypeKind;
5422
5431
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5423
5432
  //#endregion
5424
- //#region ../types/dist/sleep-CueztlR1.mjs
5433
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5425
5434
  /**
5426
5435
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5427
5436
  * window to float samples (D455).
@@ -7950,7 +7959,7 @@ var EntryDescriptorSchema = object({
7950
7959
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
7951
7960
  fields: record(string(), unknown())
7952
7961
  }).strict();
7953
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
7962
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
7954
7963
  var RecordKindDeclarationSchema = object({
7955
7964
  database: _enum(RECORD_DATABASES).default("settings"),
7956
7965
  class: _enum(RECORD_CLASSES),
@@ -7969,14 +7978,6 @@ var RecordKindDeclarationSchema = object({
7969
7978
  secretPaths: array(string().min(1)).default([]),
7970
7979
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
7971
7980
  secretArrayKeys: record(string(), string()).default({}),
7972
- /**
7973
- * RETIRED (D900): the legacy table a kind adopted from during the records
7974
- * migration. Nothing declares it any more and nothing reads it; the schema
7975
- * still ACCEPTS it because the catalog rows the migration wrote carry it
7976
- * (an orphaned kind is never redeclared) and an addon built before the
7977
- * removal still sends it. Never set it.
7978
- */
7979
- adoptsFrom: string().min(1).optional(),
7980
7981
  /** Kinds that must agree through `transact` sit in one file under one family name. */
7981
7982
  transactFamily: string().min(1).optional(),
7982
7983
  entry: EntryDescriptorSchema.optional()
@@ -12668,17 +12669,6 @@ object({
12668
12669
  createdAt: number(),
12669
12670
  updatedAt: number()
12670
12671
  });
12671
- object({
12672
- id: string(),
12673
- label: string(),
12674
- isAdmin: boolean().default(false),
12675
- allowedProviders: AllowedProviderSchema,
12676
- allowedDevices: AllowedDevicesSchema,
12677
- tokenHash: string(),
12678
- tokenPrefix: string(),
12679
- createdAt: number(),
12680
- lastUsedAt: number().optional()
12681
- });
12682
12672
  object({
12683
12673
  id: string(),
12684
12674
  userId: string(),
@@ -16660,16 +16650,36 @@ var RecordKindStateSchema = _enum([
16660
16650
  var DeclareKindResultSchema = object({
16661
16651
  kindId: number().int(),
16662
16652
  state: RecordKindStateSchema,
16663
- createdIndexes: array(string()),
16664
- /**
16665
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
16666
- * it stays on the wire, null, because an addon built before the removal reads
16667
- * an ABSENT field as "adoption pending" and refuses to start.
16668
- */
16669
- adoptionPending: _null()
16653
+ createdIndexes: array(string())
16670
16654
  });
16671
16655
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
16672
16656
  var SecretRefsList = array(string());
16657
+ /**
16658
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
16659
+ * All ops of one call share ONE database file and ONE `transactFamily`.
16660
+ */
16661
+ var RecordTransactOpSchema = discriminatedUnion("op", [
16662
+ object({
16663
+ op: literal("put"),
16664
+ kind: RecordKindNameSchema,
16665
+ record: RecordInputSchema,
16666
+ ifRev: number().int().min(0).optional()
16667
+ }),
16668
+ object({
16669
+ op: literal("patch"),
16670
+ kind: RecordKindNameSchema,
16671
+ id: RecordIdSchema,
16672
+ data: RecordBodySchema,
16673
+ at: number().int().nullable().optional(),
16674
+ expiresAt: number().int().nullable().optional(),
16675
+ ifRev: number().int().min(1).optional()
16676
+ }),
16677
+ object({
16678
+ op: literal("delete"),
16679
+ kind: RecordKindNameSchema,
16680
+ id: RecordIdSchema
16681
+ })
16682
+ ]);
16673
16683
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
16674
16684
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
16675
16685
  kind: "mutation",
@@ -16776,6 +16786,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
16776
16786
  }), {
16777
16787
  kind: "mutation",
16778
16788
  auth: "admin"
16789
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
16790
+ results: array(object({
16791
+ rev: number().int().nullable(),
16792
+ deleted: boolean()
16793
+ })),
16794
+ releasedRefs: SecretRefsList,
16795
+ secretRefs: SecretRefsList
16796
+ }), {
16797
+ kind: "mutation",
16798
+ auth: "admin"
16779
16799
  }), method(object({
16780
16800
  deviceId: number().int(),
16781
16801
  kinds: array(RecordKindNameSchema).optional()
@@ -42483,9 +42503,13 @@ var NcSystemEventKindSchema = _enum([
42483
42503
  "node-updating",
42484
42504
  "node-inference-unavailable",
42485
42505
  "detection-blind",
42506
+ "motion-noisy",
42507
+ "motion-calm",
42486
42508
  "recording-stalled",
42487
42509
  "recording-healthy",
42488
42510
  "recording-degraded",
42511
+ "device-attention-required",
42512
+ "device-attention-resolved",
42489
42513
  "storage-location-low",
42490
42514
  "storage-location-critical",
42491
42515
  "storage-location-ok",
@@ -48046,7 +48070,6 @@ var RecommendationReasonSchema = discriminatedUnion("kind", [
48046
48070
  modelId: string()
48047
48071
  }),
48048
48072
  object({ kind: literal("cpu-device") }),
48049
- object({ kind: literal("coral-untouched") }),
48050
48073
  object({ kind: literal("device-disabled") }),
48051
48074
  object({ kind: literal("device-unavailable") }),
48052
48075
  object({ kind: literal("node-offline") }),
@@ -48144,11 +48167,6 @@ var AutoTuneWarningSchema = discriminatedUnion("kind", [
48144
48167
  kind: literal("detector-store-unreadable"),
48145
48168
  error: string()
48146
48169
  }),
48147
- object({
48148
- kind: literal("coral-enabled"),
48149
- nodeId: string(),
48150
- deviceKey: string()
48151
- }),
48152
48170
  object({
48153
48171
  kind: literal("custom-pin-kept"),
48154
48172
  nodeId: string(),
@@ -55809,6 +55827,16 @@ var DishwasherStatusSchema = object({
55809
55827
  powerState: string().nullable(),
55810
55828
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55811
55829
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55830
+ /**
55831
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55832
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
55833
+ * when none is reported. A cleared reminder is not an unknown one.
55834
+ */
55835
+ filterCleaningDue: boolean().nullable(),
55836
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
55837
+ machineCareDue: boolean().nullable(),
55838
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
55839
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
55812
55840
  /** Option states: null when the appliance does not expose the option or has not said. */
55813
55841
  halfLoad: boolean().nullable(),
55814
55842
  hygienePlus: boolean().nullable(),
@@ -64459,16 +64487,6 @@ var UpdateUserInputSchema = object({
64459
64487
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64460
64488
  scopes: array(TokenScopeSchema).optional()
64461
64489
  });
64462
- var ApiKeySummarySchema = object({
64463
- id: string(),
64464
- label: string(),
64465
- isAdmin: boolean().default(false),
64466
- allowedProviders: union([array(string()), literal("*")]).optional(),
64467
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64468
- tokenPrefix: string(),
64469
- createdAt: number(),
64470
- lastUsedAt: number().optional()
64471
- });
64472
64490
  var OauthSessionSummarySchema = object({
64473
64491
  id: string(),
64474
64492
  userId: string(),
@@ -64490,8 +64508,7 @@ var TotpStatusSchema = object({
64490
64508
  confirmedAt: number().nullable()
64491
64509
  });
64492
64510
  /**
64493
- * user-management — singleton capability for user accounts and the
64494
- * legacy API-key rows.
64511
+ * user-management — singleton capability for user accounts.
64495
64512
  *
64496
64513
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64497
64514
  * — the subset check on `setUserScopes` is moot
@@ -64547,10 +64564,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64547
64564
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
64548
64565
  kind: "mutation",
64549
64566
  access: "view"
64550
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
64551
- kind: "mutation",
64552
- auth: "admin",
64553
- access: "delete"
64554
64567
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
64555
64568
  kind: "mutation",
64556
64569
  auth: "admin",
@@ -74006,6 +74019,12 @@ Object.freeze({
74006
74019
  addonId: null,
74007
74020
  access: "view"
74008
74021
  },
74022
+ "records.transact": {
74023
+ capName: "records",
74024
+ capScope: "system",
74025
+ addonId: null,
74026
+ access: "create"
74027
+ },
74009
74028
  "sceneMonitor.captureReference": {
74010
74029
  capName: "scene-monitor",
74011
74030
  capScope: "device",
@@ -75338,12 +75357,6 @@ Object.freeze({
75338
75357
  addonId: null,
75339
75358
  access: "view"
75340
75359
  },
75341
- "userManagement.listApiKeys": {
75342
- capName: "user-management",
75343
- capScope: "system",
75344
- addonId: null,
75345
- access: "view"
75346
- },
75347
75360
  "userManagement.listExternalIdentities": {
75348
75361
  capName: "user-management",
75349
75362
  capScope: "system",
@@ -75398,12 +75411,6 @@ Object.freeze({
75398
75411
  addonId: null,
75399
75412
  access: "create"
75400
75413
  },
75401
- "userManagement.revokeApiKey": {
75402
- capName: "user-management",
75403
- capScope: "system",
75404
- addonId: null,
75405
- access: "delete"
75406
- },
75407
75414
  "userManagement.revokeOauthSession": {
75408
75415
  capName: "user-management",
75409
75416
  capScope: "system",
@@ -78768,9 +78775,13 @@ new Map(Object.entries({
78768
78775
  "stream-online": "device-events",
78769
78776
  "stream-offline": "device-events",
78770
78777
  "detection-blind": "device-events",
78778
+ "motion-noisy": "device-events",
78779
+ "motion-calm": "device-events",
78771
78780
  "recording-stalled": "device-events",
78772
78781
  "recording-healthy": "device-events",
78773
78782
  "recording-degraded": "device-events",
78783
+ "device-attention-required": "device-events",
78784
+ "device-attention-resolved": "device-events",
78774
78785
  "node-online": "system",
78775
78786
  "node-offline": "system",
78776
78787
  "node-restarting": "system",
@@ -78853,6 +78864,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78853
78864
  label: "Detecting nothing",
78854
78865
  kinds: ["detection-blind"]
78855
78866
  },
78867
+ {
78868
+ id: "motion-noise",
78869
+ family: "device-events",
78870
+ label: "Motion without a subject",
78871
+ kinds: ["motion-noisy", "motion-calm"]
78872
+ },
78856
78873
  {
78857
78874
  id: "recording",
78858
78875
  family: "device-events",
@@ -78863,6 +78880,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78863
78880
  "recording-degraded"
78864
78881
  ]
78865
78882
  },
78883
+ {
78884
+ id: "device-attention",
78885
+ family: "device-events",
78886
+ label: "Needs attention",
78887
+ kinds: ["device-attention-required", "device-attention-resolved"]
78888
+ },
78866
78889
  {
78867
78890
  id: "nodes",
78868
78891
  family: "system",
@@ -79002,6 +79025,7 @@ var ALERT_EPISODE = [
79002
79025
  "alert-error",
79003
79026
  "alert-critical-resolved"
79004
79027
  ];
79028
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79005
79029
  var UPDATES = [
79006
79030
  "addon-update-available",
79007
79031
  "server-update-available",
@@ -79031,9 +79055,12 @@ var DEVICE_EVENTS = [
79031
79055
  "stream-online",
79032
79056
  "stream-offline",
79033
79057
  "detection-blind",
79058
+ "motion-noisy",
79059
+ "motion-calm",
79034
79060
  "recording-stalled",
79035
79061
  "recording-healthy",
79036
79062
  "recording-degraded",
79063
+ ...DEVICE_ATTENTION,
79037
79064
  ...ALARM
79038
79065
  ];
79039
79066
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79201,7 +79228,9 @@ var STATE_SUMMARY_VARS = [
79201
79228
  [...RULE_TEXT],
79202
79229
  [...RULE_TEXT],
79203
79230
  [...RULE_TEXT],
79204
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79231
+ [...RULE_TEXT],
79232
+ [...RULE_TEXT],
79233
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79205
79234
  [...RULE_TEXT],
79206
79235
  [...RULE_TEXT],
79207
79236
  [...RULE_TEXT],
@@ -79223,11 +79252,11 @@ var STATE_SUMMARY_VARS = [
79223
79252
  [...RULE_TEXT],
79224
79253
  [...RULE_TEXT],
79225
79254
  [...RULE_TEXT],
79255
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79226
79256
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79257
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79227
79258
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79228
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79229
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79230
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79259
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79231
79260
  [...RULE_TEXT],
79232
79261
  [...RULE_TEXT],
79233
79262
  [...RULE_TEXT],
@@ -79303,6 +79332,15 @@ new Map([
79303
79332
  snapshotLabel: "Tanks low or full now",
79304
79333
  snapshotSection: "tanks"
79305
79334
  },
79335
+ {
79336
+ id: "motion-noise",
79337
+ family: "device-events",
79338
+ label: "Motion without a subject (constant / calm again)",
79339
+ bad: ["motion-noisy"],
79340
+ recovery: ["motion-calm"],
79341
+ snapshotLabel: "Cameras with constant motion now",
79342
+ snapshotSection: null
79343
+ },
79306
79344
  {
79307
79345
  id: "recording-health",
79308
79346
  family: "device-events",
@@ -79312,6 +79350,15 @@ new Map([
79312
79350
  snapshotLabel: "Recordings stalled now",
79313
79351
  snapshotSection: null
79314
79352
  },
79353
+ {
79354
+ id: "device-attention",
79355
+ family: "device-events",
79356
+ label: "Device needs attention (raised / resolved)",
79357
+ bad: ["device-attention-required"],
79358
+ recovery: ["device-attention-resolved"],
79359
+ snapshotLabel: "Devices needing attention now",
79360
+ snapshotSection: null
79361
+ },
79315
79362
  {
79316
79363
  id: "node-connectivity",
79317
79364
  family: "system",
@@ -79953,7 +80000,7 @@ function buildConnectionFormSchema() {
79953
80000
  id: "connection",
79954
80001
  title: "Connection",
79955
80002
  titleKey: "provider-velux:connection.s_connection.title",
79956
- description: "CamStack connects to the KLF-200 over the local network and polls its actuator nodes. The password is the WiFi/web password printed on the back of the unit.",
80003
+ description: "The password is the WiFi/web password printed on the back of the unit.",
79957
80004
  descriptionKey: "provider-velux:connection.s_connection.description",
79958
80005
  columns: 2,
79959
80006
  fields: [
package/i18n/en.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "connection.s_identity.title": "Gateway",
3
3
  "connection.s_identity.name.label": "Name",
4
4
  "connection.s_connection.title": "Connection",
5
- "connection.s_connection.description": "CamStack connects to the KLF-200 over the local network and polls its actuator nodes. The password is the WiFi/web password printed on the back of the unit.",
5
+ "connection.s_connection.description": "The password is the WiFi/web password printed on the back of the unit.",
6
6
  "connection.s_connection.host.label": "Gateway host / IP",
7
7
  "connection.s_connection.password.label": "Password",
8
8
  "connection.s_connection.pollIntervalMs.label": "Poll interval (ms)"
package/i18n/it.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "connection.s_identity.title": "Gateway",
3
3
  "connection.s_identity.name.label": "Nome",
4
4
  "connection.s_connection.title": "Connessione",
5
- "connection.s_connection.description": "CamStack si collega al KLF-200 in rete locale e legge i suoi attuatori. La password è quella WiFi/web stampata sul retro del dispositivo.",
5
+ "connection.s_connection.description": "La password è quella WiFi/web stampata sul retro del dispositivo.",
6
6
  "connection.s_connection.host.label": "Host / IP del gateway",
7
7
  "connection.s_connection.password.label": "Password",
8
8
  "connection.s_connection.pollIntervalMs.label": "Intervallo di lettura (ms)"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-velux",
3
- "version": "0.2.141",
3
+ "version": "0.2.143",
4
4
  "description": "Velux KLF-200 device-provider addon for CamStack — local-gateway window + shutter covers (positional, no tilt)",
5
5
  "keywords": [
6
6
  "camstack",