@camstack/addon-provider-rademacher 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
@@ -984,7 +984,7 @@ var Rademacher = class {
984
984
  }
985
985
  };
986
986
  //#endregion
987
- //#region ../types/dist/event-category-7pZEBmVg.mjs
987
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
988
988
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
989
989
  EventCategory["SystemBoot"] = "system.boot";
990
990
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -1301,6 +1301,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
1301
1301
  */
1302
1302
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
1303
1303
  /**
1304
+ * A camera's motion source has fired constantly with no subject for an hour
1305
+ * (motion duty or session count over the bar, zero detections) — it is not
1306
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
1307
+ * {@link PipelineMotionCalm}.
1308
+ */
1309
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
1310
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
1311
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
1312
+ /**
1304
1313
  * Per-camera pipeline config was mutated by the orchestrator
1305
1314
  * (3-level settings change via `setAgentAddonDefaults` /
1306
1315
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -6407,7 +6416,7 @@ var ZodIssueCode = {
6407
6416
  var ZodFirstPartyTypeKind;
6408
6417
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
6409
6418
  //#endregion
6410
- //#region ../types/dist/sleep-CueztlR1.mjs
6419
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
6411
6420
  /**
6412
6421
  * The audio chunk plane's byte format, and the ONE expansion from a coded
6413
6422
  * window to float samples (D455).
@@ -8936,7 +8945,7 @@ var EntryDescriptorSchema = object({
8936
8945
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
8937
8946
  fields: record(string(), unknown())
8938
8947
  }).strict();
8939
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
8948
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
8940
8949
  var RecordKindDeclarationSchema = object({
8941
8950
  database: _enum(RECORD_DATABASES).default("settings"),
8942
8951
  class: _enum(RECORD_CLASSES),
@@ -8955,14 +8964,6 @@ var RecordKindDeclarationSchema = object({
8955
8964
  secretPaths: array(string().min(1)).default([]),
8956
8965
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8957
8966
  secretArrayKeys: record(string(), string()).default({}),
8958
- /**
8959
- * RETIRED (D900): the legacy table a kind adopted from during the records
8960
- * migration. Nothing declares it any more and nothing reads it; the schema
8961
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8962
- * (an orphaned kind is never redeclared) and an addon built before the
8963
- * removal still sends it. Never set it.
8964
- */
8965
- adoptsFrom: string().min(1).optional(),
8966
8967
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8967
8968
  transactFamily: string().min(1).optional(),
8968
8969
  entry: EntryDescriptorSchema.optional()
@@ -13640,17 +13641,6 @@ object({
13640
13641
  createdAt: number(),
13641
13642
  updatedAt: number()
13642
13643
  });
13643
- object({
13644
- id: string(),
13645
- label: string(),
13646
- isAdmin: boolean().default(false),
13647
- allowedProviders: AllowedProviderSchema,
13648
- allowedDevices: AllowedDevicesSchema,
13649
- tokenHash: string(),
13650
- tokenPrefix: string(),
13651
- createdAt: number(),
13652
- lastUsedAt: number().optional()
13653
- });
13654
13644
  object({
13655
13645
  id: string(),
13656
13646
  userId: string(),
@@ -17632,16 +17622,36 @@ var RecordKindStateSchema = _enum([
17632
17622
  var DeclareKindResultSchema = object({
17633
17623
  kindId: number().int(),
17634
17624
  state: RecordKindStateSchema,
17635
- createdIndexes: array(string()),
17636
- /**
17637
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
17638
- * it stays on the wire, null, because an addon built before the removal reads
17639
- * an ABSENT field as "adoption pending" and refuses to start.
17640
- */
17641
- adoptionPending: _null()
17625
+ createdIndexes: array(string())
17642
17626
  });
17643
17627
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
17644
17628
  var SecretRefsList = array(string());
17629
+ /**
17630
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
17631
+ * All ops of one call share ONE database file and ONE `transactFamily`.
17632
+ */
17633
+ var RecordTransactOpSchema = discriminatedUnion("op", [
17634
+ object({
17635
+ op: literal("put"),
17636
+ kind: RecordKindNameSchema,
17637
+ record: RecordInputSchema,
17638
+ ifRev: number().int().min(0).optional()
17639
+ }),
17640
+ object({
17641
+ op: literal("patch"),
17642
+ kind: RecordKindNameSchema,
17643
+ id: RecordIdSchema,
17644
+ data: RecordBodySchema,
17645
+ at: number().int().nullable().optional(),
17646
+ expiresAt: number().int().nullable().optional(),
17647
+ ifRev: number().int().min(1).optional()
17648
+ }),
17649
+ object({
17650
+ op: literal("delete"),
17651
+ kind: RecordKindNameSchema,
17652
+ id: RecordIdSchema
17653
+ })
17654
+ ]);
17645
17655
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
17646
17656
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
17647
17657
  kind: "mutation",
@@ -17748,6 +17758,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
17748
17758
  }), {
17749
17759
  kind: "mutation",
17750
17760
  auth: "admin"
17761
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
17762
+ results: array(object({
17763
+ rev: number().int().nullable(),
17764
+ deleted: boolean()
17765
+ })),
17766
+ releasedRefs: SecretRefsList,
17767
+ secretRefs: SecretRefsList
17768
+ }), {
17769
+ kind: "mutation",
17770
+ auth: "admin"
17751
17771
  }), method(object({
17752
17772
  deviceId: number().int(),
17753
17773
  kinds: array(RecordKindNameSchema).optional()
@@ -43455,9 +43475,13 @@ var NcSystemEventKindSchema = _enum([
43455
43475
  "node-updating",
43456
43476
  "node-inference-unavailable",
43457
43477
  "detection-blind",
43478
+ "motion-noisy",
43479
+ "motion-calm",
43458
43480
  "recording-stalled",
43459
43481
  "recording-healthy",
43460
43482
  "recording-degraded",
43483
+ "device-attention-required",
43484
+ "device-attention-resolved",
43461
43485
  "storage-location-low",
43462
43486
  "storage-location-critical",
43463
43487
  "storage-location-ok",
@@ -49018,7 +49042,6 @@ var RecommendationReasonSchema = discriminatedUnion("kind", [
49018
49042
  modelId: string()
49019
49043
  }),
49020
49044
  object({ kind: literal("cpu-device") }),
49021
- object({ kind: literal("coral-untouched") }),
49022
49045
  object({ kind: literal("device-disabled") }),
49023
49046
  object({ kind: literal("device-unavailable") }),
49024
49047
  object({ kind: literal("node-offline") }),
@@ -49116,11 +49139,6 @@ var AutoTuneWarningSchema = discriminatedUnion("kind", [
49116
49139
  kind: literal("detector-store-unreadable"),
49117
49140
  error: string()
49118
49141
  }),
49119
- object({
49120
- kind: literal("coral-enabled"),
49121
- nodeId: string(),
49122
- deviceKey: string()
49123
- }),
49124
49142
  object({
49125
49143
  kind: literal("custom-pin-kept"),
49126
49144
  nodeId: string(),
@@ -56781,6 +56799,16 @@ var DishwasherStatusSchema = object({
56781
56799
  powerState: string().nullable(),
56782
56800
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56783
56801
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56802
+ /**
56803
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56804
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
56805
+ * when none is reported. A cleared reminder is not an unknown one.
56806
+ */
56807
+ filterCleaningDue: boolean().nullable(),
56808
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
56809
+ machineCareDue: boolean().nullable(),
56810
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
56811
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
56784
56812
  /** Option states: null when the appliance does not expose the option or has not said. */
56785
56813
  halfLoad: boolean().nullable(),
56786
56814
  hygienePlus: boolean().nullable(),
@@ -65431,16 +65459,6 @@ var UpdateUserInputSchema = object({
65431
65459
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65432
65460
  scopes: array(TokenScopeSchema).optional()
65433
65461
  });
65434
- var ApiKeySummarySchema = object({
65435
- id: string(),
65436
- label: string(),
65437
- isAdmin: boolean().default(false),
65438
- allowedProviders: union([array(string()), literal("*")]).optional(),
65439
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65440
- tokenPrefix: string(),
65441
- createdAt: number(),
65442
- lastUsedAt: number().optional()
65443
- });
65444
65462
  var OauthSessionSummarySchema = object({
65445
65463
  id: string(),
65446
65464
  userId: string(),
@@ -65462,8 +65480,7 @@ var TotpStatusSchema = object({
65462
65480
  confirmedAt: number().nullable()
65463
65481
  });
65464
65482
  /**
65465
- * user-management — singleton capability for user accounts and the
65466
- * legacy API-key rows.
65483
+ * user-management — singleton capability for user accounts.
65467
65484
  *
65468
65485
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
65469
65486
  * — the subset check on `setUserScopes` is moot
@@ -65519,10 +65536,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65519
65536
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
65520
65537
  kind: "mutation",
65521
65538
  access: "view"
65522
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
65523
- kind: "mutation",
65524
- auth: "admin",
65525
- access: "delete"
65526
65539
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
65527
65540
  kind: "mutation",
65528
65541
  auth: "admin",
@@ -74978,6 +74991,12 @@ Object.freeze({
74978
74991
  addonId: null,
74979
74992
  access: "view"
74980
74993
  },
74994
+ "records.transact": {
74995
+ capName: "records",
74996
+ capScope: "system",
74997
+ addonId: null,
74998
+ access: "create"
74999
+ },
74981
75000
  "sceneMonitor.captureReference": {
74982
75001
  capName: "scene-monitor",
74983
75002
  capScope: "device",
@@ -76310,12 +76329,6 @@ Object.freeze({
76310
76329
  addonId: null,
76311
76330
  access: "view"
76312
76331
  },
76313
- "userManagement.listApiKeys": {
76314
- capName: "user-management",
76315
- capScope: "system",
76316
- addonId: null,
76317
- access: "view"
76318
- },
76319
76332
  "userManagement.listExternalIdentities": {
76320
76333
  capName: "user-management",
76321
76334
  capScope: "system",
@@ -76370,12 +76383,6 @@ Object.freeze({
76370
76383
  addonId: null,
76371
76384
  access: "create"
76372
76385
  },
76373
- "userManagement.revokeApiKey": {
76374
- capName: "user-management",
76375
- capScope: "system",
76376
- addonId: null,
76377
- access: "delete"
76378
- },
76379
76386
  "userManagement.revokeOauthSession": {
76380
76387
  capName: "user-management",
76381
76388
  capScope: "system",
@@ -79740,9 +79747,13 @@ new Map(Object.entries({
79740
79747
  "stream-online": "device-events",
79741
79748
  "stream-offline": "device-events",
79742
79749
  "detection-blind": "device-events",
79750
+ "motion-noisy": "device-events",
79751
+ "motion-calm": "device-events",
79743
79752
  "recording-stalled": "device-events",
79744
79753
  "recording-healthy": "device-events",
79745
79754
  "recording-degraded": "device-events",
79755
+ "device-attention-required": "device-events",
79756
+ "device-attention-resolved": "device-events",
79746
79757
  "node-online": "system",
79747
79758
  "node-offline": "system",
79748
79759
  "node-restarting": "system",
@@ -79825,6 +79836,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79825
79836
  label: "Detecting nothing",
79826
79837
  kinds: ["detection-blind"]
79827
79838
  },
79839
+ {
79840
+ id: "motion-noise",
79841
+ family: "device-events",
79842
+ label: "Motion without a subject",
79843
+ kinds: ["motion-noisy", "motion-calm"]
79844
+ },
79828
79845
  {
79829
79846
  id: "recording",
79830
79847
  family: "device-events",
@@ -79835,6 +79852,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79835
79852
  "recording-degraded"
79836
79853
  ]
79837
79854
  },
79855
+ {
79856
+ id: "device-attention",
79857
+ family: "device-events",
79858
+ label: "Needs attention",
79859
+ kinds: ["device-attention-required", "device-attention-resolved"]
79860
+ },
79838
79861
  {
79839
79862
  id: "nodes",
79840
79863
  family: "system",
@@ -79974,6 +79997,7 @@ var ALERT_EPISODE = [
79974
79997
  "alert-error",
79975
79998
  "alert-critical-resolved"
79976
79999
  ];
80000
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79977
80001
  var UPDATES = [
79978
80002
  "addon-update-available",
79979
80003
  "server-update-available",
@@ -80003,9 +80027,12 @@ var DEVICE_EVENTS = [
80003
80027
  "stream-online",
80004
80028
  "stream-offline",
80005
80029
  "detection-blind",
80030
+ "motion-noisy",
80031
+ "motion-calm",
80006
80032
  "recording-stalled",
80007
80033
  "recording-healthy",
80008
80034
  "recording-degraded",
80035
+ ...DEVICE_ATTENTION,
80009
80036
  ...ALARM
80010
80037
  ];
80011
80038
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -80173,7 +80200,9 @@ var STATE_SUMMARY_VARS = [
80173
80200
  [...RULE_TEXT],
80174
80201
  [...RULE_TEXT],
80175
80202
  [...RULE_TEXT],
80176
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80203
+ [...RULE_TEXT],
80204
+ [...RULE_TEXT],
80205
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80177
80206
  [...RULE_TEXT],
80178
80207
  [...RULE_TEXT],
80179
80208
  [...RULE_TEXT],
@@ -80195,11 +80224,11 @@ var STATE_SUMMARY_VARS = [
80195
80224
  [...RULE_TEXT],
80196
80225
  [...RULE_TEXT],
80197
80226
  [...RULE_TEXT],
80227
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80198
80228
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80229
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80199
80230
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80200
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80201
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80202
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80231
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80203
80232
  [...RULE_TEXT],
80204
80233
  [...RULE_TEXT],
80205
80234
  [...RULE_TEXT],
@@ -80275,6 +80304,15 @@ new Map([
80275
80304
  snapshotLabel: "Tanks low or full now",
80276
80305
  snapshotSection: "tanks"
80277
80306
  },
80307
+ {
80308
+ id: "motion-noise",
80309
+ family: "device-events",
80310
+ label: "Motion without a subject (constant / calm again)",
80311
+ bad: ["motion-noisy"],
80312
+ recovery: ["motion-calm"],
80313
+ snapshotLabel: "Cameras with constant motion now",
80314
+ snapshotSection: null
80315
+ },
80278
80316
  {
80279
80317
  id: "recording-health",
80280
80318
  family: "device-events",
@@ -80284,6 +80322,15 @@ new Map([
80284
80322
  snapshotLabel: "Recordings stalled now",
80285
80323
  snapshotSection: null
80286
80324
  },
80325
+ {
80326
+ id: "device-attention",
80327
+ family: "device-events",
80328
+ label: "Device needs attention (raised / resolved)",
80329
+ bad: ["device-attention-required"],
80330
+ recovery: ["device-attention-resolved"],
80331
+ snapshotLabel: "Devices needing attention now",
80332
+ snapshotSection: null
80333
+ },
80287
80334
  {
80288
80335
  id: "node-connectivity",
80289
80336
  family: "system",
@@ -80928,7 +80975,7 @@ function buildConnectionFormSchema() {
80928
80975
  id: "connection",
80929
80976
  title: "Connection",
80930
80977
  titleKey: "provider-rademacher:connection.s_connection.title",
80931
- description: "CamStack polls the HomePilot / Start2Smart hub over the local network. Leave the password blank for an unprotected hub. The API base path is auto-probed unless you override it.",
80978
+ description: "Leave the password blank for an unprotected hub.",
80932
80979
  descriptionKey: "provider-rademacher:connection.s_connection.description",
80933
80980
  columns: 2,
80934
80981
  fields: [
package/dist/addon.mjs CHANGED
@@ -983,7 +983,7 @@ var Rademacher = class {
983
983
  }
984
984
  };
985
985
  //#endregion
986
- //#region ../types/dist/event-category-7pZEBmVg.mjs
986
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
987
987
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
988
988
  EventCategory["SystemBoot"] = "system.boot";
989
989
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -1300,6 +1300,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
1300
1300
  */
1301
1301
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
1302
1302
  /**
1303
+ * A camera's motion source has fired constantly with no subject for an hour
1304
+ * (motion duty or session count over the bar, zero detections) — it is not
1305
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
1306
+ * {@link PipelineMotionCalm}.
1307
+ */
1308
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
1309
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
1310
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
1311
+ /**
1303
1312
  * Per-camera pipeline config was mutated by the orchestrator
1304
1313
  * (3-level settings change via `setAgentAddonDefaults` /
1305
1314
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -6406,7 +6415,7 @@ var ZodIssueCode = {
6406
6415
  var ZodFirstPartyTypeKind;
6407
6416
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
6408
6417
  //#endregion
6409
- //#region ../types/dist/sleep-CueztlR1.mjs
6418
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
6410
6419
  /**
6411
6420
  * The audio chunk plane's byte format, and the ONE expansion from a coded
6412
6421
  * window to float samples (D455).
@@ -8935,7 +8944,7 @@ var EntryDescriptorSchema = object({
8935
8944
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
8936
8945
  fields: record(string(), unknown())
8937
8946
  }).strict();
8938
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
8947
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
8939
8948
  var RecordKindDeclarationSchema = object({
8940
8949
  database: _enum(RECORD_DATABASES).default("settings"),
8941
8950
  class: _enum(RECORD_CLASSES),
@@ -8954,14 +8963,6 @@ var RecordKindDeclarationSchema = object({
8954
8963
  secretPaths: array(string().min(1)).default([]),
8955
8964
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8956
8965
  secretArrayKeys: record(string(), string()).default({}),
8957
- /**
8958
- * RETIRED (D900): the legacy table a kind adopted from during the records
8959
- * migration. Nothing declares it any more and nothing reads it; the schema
8960
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8961
- * (an orphaned kind is never redeclared) and an addon built before the
8962
- * removal still sends it. Never set it.
8963
- */
8964
- adoptsFrom: string().min(1).optional(),
8965
8966
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8966
8967
  transactFamily: string().min(1).optional(),
8967
8968
  entry: EntryDescriptorSchema.optional()
@@ -13639,17 +13640,6 @@ object({
13639
13640
  createdAt: number(),
13640
13641
  updatedAt: number()
13641
13642
  });
13642
- object({
13643
- id: string(),
13644
- label: string(),
13645
- isAdmin: boolean().default(false),
13646
- allowedProviders: AllowedProviderSchema,
13647
- allowedDevices: AllowedDevicesSchema,
13648
- tokenHash: string(),
13649
- tokenPrefix: string(),
13650
- createdAt: number(),
13651
- lastUsedAt: number().optional()
13652
- });
13653
13643
  object({
13654
13644
  id: string(),
13655
13645
  userId: string(),
@@ -17631,16 +17621,36 @@ var RecordKindStateSchema = _enum([
17631
17621
  var DeclareKindResultSchema = object({
17632
17622
  kindId: number().int(),
17633
17623
  state: RecordKindStateSchema,
17634
- createdIndexes: array(string()),
17635
- /**
17636
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
17637
- * it stays on the wire, null, because an addon built before the removal reads
17638
- * an ABSENT field as "adoption pending" and refuses to start.
17639
- */
17640
- adoptionPending: _null()
17624
+ createdIndexes: array(string())
17641
17625
  });
17642
17626
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
17643
17627
  var SecretRefsList = array(string());
17628
+ /**
17629
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
17630
+ * All ops of one call share ONE database file and ONE `transactFamily`.
17631
+ */
17632
+ var RecordTransactOpSchema = discriminatedUnion("op", [
17633
+ object({
17634
+ op: literal("put"),
17635
+ kind: RecordKindNameSchema,
17636
+ record: RecordInputSchema,
17637
+ ifRev: number().int().min(0).optional()
17638
+ }),
17639
+ object({
17640
+ op: literal("patch"),
17641
+ kind: RecordKindNameSchema,
17642
+ id: RecordIdSchema,
17643
+ data: RecordBodySchema,
17644
+ at: number().int().nullable().optional(),
17645
+ expiresAt: number().int().nullable().optional(),
17646
+ ifRev: number().int().min(1).optional()
17647
+ }),
17648
+ object({
17649
+ op: literal("delete"),
17650
+ kind: RecordKindNameSchema,
17651
+ id: RecordIdSchema
17652
+ })
17653
+ ]);
17644
17654
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
17645
17655
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
17646
17656
  kind: "mutation",
@@ -17747,6 +17757,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
17747
17757
  }), {
17748
17758
  kind: "mutation",
17749
17759
  auth: "admin"
17760
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
17761
+ results: array(object({
17762
+ rev: number().int().nullable(),
17763
+ deleted: boolean()
17764
+ })),
17765
+ releasedRefs: SecretRefsList,
17766
+ secretRefs: SecretRefsList
17767
+ }), {
17768
+ kind: "mutation",
17769
+ auth: "admin"
17750
17770
  }), method(object({
17751
17771
  deviceId: number().int(),
17752
17772
  kinds: array(RecordKindNameSchema).optional()
@@ -43454,9 +43474,13 @@ var NcSystemEventKindSchema = _enum([
43454
43474
  "node-updating",
43455
43475
  "node-inference-unavailable",
43456
43476
  "detection-blind",
43477
+ "motion-noisy",
43478
+ "motion-calm",
43457
43479
  "recording-stalled",
43458
43480
  "recording-healthy",
43459
43481
  "recording-degraded",
43482
+ "device-attention-required",
43483
+ "device-attention-resolved",
43460
43484
  "storage-location-low",
43461
43485
  "storage-location-critical",
43462
43486
  "storage-location-ok",
@@ -49017,7 +49041,6 @@ var RecommendationReasonSchema = discriminatedUnion("kind", [
49017
49041
  modelId: string()
49018
49042
  }),
49019
49043
  object({ kind: literal("cpu-device") }),
49020
- object({ kind: literal("coral-untouched") }),
49021
49044
  object({ kind: literal("device-disabled") }),
49022
49045
  object({ kind: literal("device-unavailable") }),
49023
49046
  object({ kind: literal("node-offline") }),
@@ -49115,11 +49138,6 @@ var AutoTuneWarningSchema = discriminatedUnion("kind", [
49115
49138
  kind: literal("detector-store-unreadable"),
49116
49139
  error: string()
49117
49140
  }),
49118
- object({
49119
- kind: literal("coral-enabled"),
49120
- nodeId: string(),
49121
- deviceKey: string()
49122
- }),
49123
49141
  object({
49124
49142
  kind: literal("custom-pin-kept"),
49125
49143
  nodeId: string(),
@@ -56780,6 +56798,16 @@ var DishwasherStatusSchema = object({
56780
56798
  powerState: string().nullable(),
56781
56799
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56782
56800
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56801
+ /**
56802
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56803
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
56804
+ * when none is reported. A cleared reminder is not an unknown one.
56805
+ */
56806
+ filterCleaningDue: boolean().nullable(),
56807
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
56808
+ machineCareDue: boolean().nullable(),
56809
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
56810
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
56783
56811
  /** Option states: null when the appliance does not expose the option or has not said. */
56784
56812
  halfLoad: boolean().nullable(),
56785
56813
  hygienePlus: boolean().nullable(),
@@ -65430,16 +65458,6 @@ var UpdateUserInputSchema = object({
65430
65458
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65431
65459
  scopes: array(TokenScopeSchema).optional()
65432
65460
  });
65433
- var ApiKeySummarySchema = object({
65434
- id: string(),
65435
- label: string(),
65436
- isAdmin: boolean().default(false),
65437
- allowedProviders: union([array(string()), literal("*")]).optional(),
65438
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65439
- tokenPrefix: string(),
65440
- createdAt: number(),
65441
- lastUsedAt: number().optional()
65442
- });
65443
65461
  var OauthSessionSummarySchema = object({
65444
65462
  id: string(),
65445
65463
  userId: string(),
@@ -65461,8 +65479,7 @@ var TotpStatusSchema = object({
65461
65479
  confirmedAt: number().nullable()
65462
65480
  });
65463
65481
  /**
65464
- * user-management — singleton capability for user accounts and the
65465
- * legacy API-key rows.
65482
+ * user-management — singleton capability for user accounts.
65466
65483
  *
65467
65484
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
65468
65485
  * — the subset check on `setUserScopes` is moot
@@ -65518,10 +65535,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65518
65535
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
65519
65536
  kind: "mutation",
65520
65537
  access: "view"
65521
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
65522
- kind: "mutation",
65523
- auth: "admin",
65524
- access: "delete"
65525
65538
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
65526
65539
  kind: "mutation",
65527
65540
  auth: "admin",
@@ -74977,6 +74990,12 @@ Object.freeze({
74977
74990
  addonId: null,
74978
74991
  access: "view"
74979
74992
  },
74993
+ "records.transact": {
74994
+ capName: "records",
74995
+ capScope: "system",
74996
+ addonId: null,
74997
+ access: "create"
74998
+ },
74980
74999
  "sceneMonitor.captureReference": {
74981
75000
  capName: "scene-monitor",
74982
75001
  capScope: "device",
@@ -76309,12 +76328,6 @@ Object.freeze({
76309
76328
  addonId: null,
76310
76329
  access: "view"
76311
76330
  },
76312
- "userManagement.listApiKeys": {
76313
- capName: "user-management",
76314
- capScope: "system",
76315
- addonId: null,
76316
- access: "view"
76317
- },
76318
76331
  "userManagement.listExternalIdentities": {
76319
76332
  capName: "user-management",
76320
76333
  capScope: "system",
@@ -76369,12 +76382,6 @@ Object.freeze({
76369
76382
  addonId: null,
76370
76383
  access: "create"
76371
76384
  },
76372
- "userManagement.revokeApiKey": {
76373
- capName: "user-management",
76374
- capScope: "system",
76375
- addonId: null,
76376
- access: "delete"
76377
- },
76378
76385
  "userManagement.revokeOauthSession": {
76379
76386
  capName: "user-management",
76380
76387
  capScope: "system",
@@ -79739,9 +79746,13 @@ new Map(Object.entries({
79739
79746
  "stream-online": "device-events",
79740
79747
  "stream-offline": "device-events",
79741
79748
  "detection-blind": "device-events",
79749
+ "motion-noisy": "device-events",
79750
+ "motion-calm": "device-events",
79742
79751
  "recording-stalled": "device-events",
79743
79752
  "recording-healthy": "device-events",
79744
79753
  "recording-degraded": "device-events",
79754
+ "device-attention-required": "device-events",
79755
+ "device-attention-resolved": "device-events",
79745
79756
  "node-online": "system",
79746
79757
  "node-offline": "system",
79747
79758
  "node-restarting": "system",
@@ -79824,6 +79835,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79824
79835
  label: "Detecting nothing",
79825
79836
  kinds: ["detection-blind"]
79826
79837
  },
79838
+ {
79839
+ id: "motion-noise",
79840
+ family: "device-events",
79841
+ label: "Motion without a subject",
79842
+ kinds: ["motion-noisy", "motion-calm"]
79843
+ },
79827
79844
  {
79828
79845
  id: "recording",
79829
79846
  family: "device-events",
@@ -79834,6 +79851,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79834
79851
  "recording-degraded"
79835
79852
  ]
79836
79853
  },
79854
+ {
79855
+ id: "device-attention",
79856
+ family: "device-events",
79857
+ label: "Needs attention",
79858
+ kinds: ["device-attention-required", "device-attention-resolved"]
79859
+ },
79837
79860
  {
79838
79861
  id: "nodes",
79839
79862
  family: "system",
@@ -79973,6 +79996,7 @@ var ALERT_EPISODE = [
79973
79996
  "alert-error",
79974
79997
  "alert-critical-resolved"
79975
79998
  ];
79999
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79976
80000
  var UPDATES = [
79977
80001
  "addon-update-available",
79978
80002
  "server-update-available",
@@ -80002,9 +80026,12 @@ var DEVICE_EVENTS = [
80002
80026
  "stream-online",
80003
80027
  "stream-offline",
80004
80028
  "detection-blind",
80029
+ "motion-noisy",
80030
+ "motion-calm",
80005
80031
  "recording-stalled",
80006
80032
  "recording-healthy",
80007
80033
  "recording-degraded",
80034
+ ...DEVICE_ATTENTION,
80008
80035
  ...ALARM
80009
80036
  ];
80010
80037
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -80172,7 +80199,9 @@ var STATE_SUMMARY_VARS = [
80172
80199
  [...RULE_TEXT],
80173
80200
  [...RULE_TEXT],
80174
80201
  [...RULE_TEXT],
80175
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80202
+ [...RULE_TEXT],
80203
+ [...RULE_TEXT],
80204
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80176
80205
  [...RULE_TEXT],
80177
80206
  [...RULE_TEXT],
80178
80207
  [...RULE_TEXT],
@@ -80194,11 +80223,11 @@ var STATE_SUMMARY_VARS = [
80194
80223
  [...RULE_TEXT],
80195
80224
  [...RULE_TEXT],
80196
80225
  [...RULE_TEXT],
80226
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80197
80227
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80228
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80198
80229
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80199
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80200
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80201
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80230
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80202
80231
  [...RULE_TEXT],
80203
80232
  [...RULE_TEXT],
80204
80233
  [...RULE_TEXT],
@@ -80274,6 +80303,15 @@ new Map([
80274
80303
  snapshotLabel: "Tanks low or full now",
80275
80304
  snapshotSection: "tanks"
80276
80305
  },
80306
+ {
80307
+ id: "motion-noise",
80308
+ family: "device-events",
80309
+ label: "Motion without a subject (constant / calm again)",
80310
+ bad: ["motion-noisy"],
80311
+ recovery: ["motion-calm"],
80312
+ snapshotLabel: "Cameras with constant motion now",
80313
+ snapshotSection: null
80314
+ },
80277
80315
  {
80278
80316
  id: "recording-health",
80279
80317
  family: "device-events",
@@ -80283,6 +80321,15 @@ new Map([
80283
80321
  snapshotLabel: "Recordings stalled now",
80284
80322
  snapshotSection: null
80285
80323
  },
80324
+ {
80325
+ id: "device-attention",
80326
+ family: "device-events",
80327
+ label: "Device needs attention (raised / resolved)",
80328
+ bad: ["device-attention-required"],
80329
+ recovery: ["device-attention-resolved"],
80330
+ snapshotLabel: "Devices needing attention now",
80331
+ snapshotSection: null
80332
+ },
80286
80333
  {
80287
80334
  id: "node-connectivity",
80288
80335
  family: "system",
@@ -80927,7 +80974,7 @@ function buildConnectionFormSchema() {
80927
80974
  id: "connection",
80928
80975
  title: "Connection",
80929
80976
  titleKey: "provider-rademacher:connection.s_connection.title",
80930
- description: "CamStack polls the HomePilot / Start2Smart hub over the local network. Leave the password blank for an unprotected hub. The API base path is auto-probed unless you override it.",
80977
+ description: "Leave the password blank for an unprotected hub.",
80931
80978
  descriptionKey: "provider-rademacher:connection.s_connection.description",
80932
80979
  columns: 2,
80933
80980
  fields: [
package/i18n/en.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "connection.s_identity.title": "Hub",
3
3
  "connection.s_identity.name.label": "Name",
4
4
  "connection.s_connection.title": "Connection",
5
- "connection.s_connection.description": "CamStack polls the HomePilot / Start2Smart hub over the local network. Leave the password blank for an unprotected hub. The API base path is auto-probed unless you override it.",
5
+ "connection.s_connection.description": "Leave the password blank for an unprotected hub.",
6
6
  "connection.s_connection.host.label": "Hub host / IP",
7
7
  "connection.s_connection.password.label": "Password (optional)",
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": "Hub",
3
3
  "connection.s_identity.name.label": "Nome",
4
4
  "connection.s_connection.title": "Connessione",
5
- "connection.s_connection.description": "CamStack legge l'hub HomePilot / Start2Smart in rete locale. Lascia vuota la password per un hub senza protezione. Il percorso base dell'API viene rilevato automaticamente, salvo che tu lo imposti.",
5
+ "connection.s_connection.description": "Lascia vuota la password per un hub non protetto.",
6
6
  "connection.s_connection.host.label": "Host / IP dell'hub",
7
7
  "connection.s_connection.password.label": "Password (facoltativa)",
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-rademacher",
3
- "version": "0.2.141",
3
+ "version": "0.2.143",
4
4
  "description": "Rademacher HomePilot device-provider addon for CamStack — wraps the @apocaliss92/noderademacher local-hub client (roller shutters over the cover cap)",
5
5
  "keywords": [
6
6
  "camstack",