@camstack/addon-provider-rademacher 0.2.141 → 0.2.142

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",
@@ -56781,6 +56805,16 @@ var DishwasherStatusSchema = object({
56781
56805
  powerState: string().nullable(),
56782
56806
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56783
56807
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56808
+ /**
56809
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56810
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
56811
+ * when none is reported. A cleared reminder is not an unknown one.
56812
+ */
56813
+ filterCleaningDue: boolean().nullable(),
56814
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
56815
+ machineCareDue: boolean().nullable(),
56816
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
56817
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
56784
56818
  /** Option states: null when the appliance does not expose the option or has not said. */
56785
56819
  halfLoad: boolean().nullable(),
56786
56820
  hygienePlus: boolean().nullable(),
@@ -65431,16 +65465,6 @@ var UpdateUserInputSchema = object({
65431
65465
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65432
65466
  scopes: array(TokenScopeSchema).optional()
65433
65467
  });
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
65468
  var OauthSessionSummarySchema = object({
65445
65469
  id: string(),
65446
65470
  userId: string(),
@@ -65462,8 +65486,7 @@ var TotpStatusSchema = object({
65462
65486
  confirmedAt: number().nullable()
65463
65487
  });
65464
65488
  /**
65465
- * user-management — singleton capability for user accounts and the
65466
- * legacy API-key rows.
65489
+ * user-management — singleton capability for user accounts.
65467
65490
  *
65468
65491
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
65469
65492
  * — the subset check on `setUserScopes` is moot
@@ -65519,10 +65542,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65519
65542
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
65520
65543
  kind: "mutation",
65521
65544
  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
65545
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
65527
65546
  kind: "mutation",
65528
65547
  auth: "admin",
@@ -74978,6 +74997,12 @@ Object.freeze({
74978
74997
  addonId: null,
74979
74998
  access: "view"
74980
74999
  },
75000
+ "records.transact": {
75001
+ capName: "records",
75002
+ capScope: "system",
75003
+ addonId: null,
75004
+ access: "create"
75005
+ },
74981
75006
  "sceneMonitor.captureReference": {
74982
75007
  capName: "scene-monitor",
74983
75008
  capScope: "device",
@@ -76310,12 +76335,6 @@ Object.freeze({
76310
76335
  addonId: null,
76311
76336
  access: "view"
76312
76337
  },
76313
- "userManagement.listApiKeys": {
76314
- capName: "user-management",
76315
- capScope: "system",
76316
- addonId: null,
76317
- access: "view"
76318
- },
76319
76338
  "userManagement.listExternalIdentities": {
76320
76339
  capName: "user-management",
76321
76340
  capScope: "system",
@@ -76370,12 +76389,6 @@ Object.freeze({
76370
76389
  addonId: null,
76371
76390
  access: "create"
76372
76391
  },
76373
- "userManagement.revokeApiKey": {
76374
- capName: "user-management",
76375
- capScope: "system",
76376
- addonId: null,
76377
- access: "delete"
76378
- },
76379
76392
  "userManagement.revokeOauthSession": {
76380
76393
  capName: "user-management",
76381
76394
  capScope: "system",
@@ -79740,9 +79753,13 @@ new Map(Object.entries({
79740
79753
  "stream-online": "device-events",
79741
79754
  "stream-offline": "device-events",
79742
79755
  "detection-blind": "device-events",
79756
+ "motion-noisy": "device-events",
79757
+ "motion-calm": "device-events",
79743
79758
  "recording-stalled": "device-events",
79744
79759
  "recording-healthy": "device-events",
79745
79760
  "recording-degraded": "device-events",
79761
+ "device-attention-required": "device-events",
79762
+ "device-attention-resolved": "device-events",
79746
79763
  "node-online": "system",
79747
79764
  "node-offline": "system",
79748
79765
  "node-restarting": "system",
@@ -79825,6 +79842,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79825
79842
  label: "Detecting nothing",
79826
79843
  kinds: ["detection-blind"]
79827
79844
  },
79845
+ {
79846
+ id: "motion-noise",
79847
+ family: "device-events",
79848
+ label: "Motion without a subject",
79849
+ kinds: ["motion-noisy", "motion-calm"]
79850
+ },
79828
79851
  {
79829
79852
  id: "recording",
79830
79853
  family: "device-events",
@@ -79835,6 +79858,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79835
79858
  "recording-degraded"
79836
79859
  ]
79837
79860
  },
79861
+ {
79862
+ id: "device-attention",
79863
+ family: "device-events",
79864
+ label: "Needs attention",
79865
+ kinds: ["device-attention-required", "device-attention-resolved"]
79866
+ },
79838
79867
  {
79839
79868
  id: "nodes",
79840
79869
  family: "system",
@@ -79974,6 +80003,7 @@ var ALERT_EPISODE = [
79974
80003
  "alert-error",
79975
80004
  "alert-critical-resolved"
79976
80005
  ];
80006
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79977
80007
  var UPDATES = [
79978
80008
  "addon-update-available",
79979
80009
  "server-update-available",
@@ -80003,9 +80033,12 @@ var DEVICE_EVENTS = [
80003
80033
  "stream-online",
80004
80034
  "stream-offline",
80005
80035
  "detection-blind",
80036
+ "motion-noisy",
80037
+ "motion-calm",
80006
80038
  "recording-stalled",
80007
80039
  "recording-healthy",
80008
80040
  "recording-degraded",
80041
+ ...DEVICE_ATTENTION,
80009
80042
  ...ALARM
80010
80043
  ];
80011
80044
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -80173,7 +80206,9 @@ var STATE_SUMMARY_VARS = [
80173
80206
  [...RULE_TEXT],
80174
80207
  [...RULE_TEXT],
80175
80208
  [...RULE_TEXT],
80176
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80209
+ [...RULE_TEXT],
80210
+ [...RULE_TEXT],
80211
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80177
80212
  [...RULE_TEXT],
80178
80213
  [...RULE_TEXT],
80179
80214
  [...RULE_TEXT],
@@ -80195,11 +80230,11 @@ var STATE_SUMMARY_VARS = [
80195
80230
  [...RULE_TEXT],
80196
80231
  [...RULE_TEXT],
80197
80232
  [...RULE_TEXT],
80233
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80198
80234
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80235
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80199
80236
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80200
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80201
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80202
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80237
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80203
80238
  [...RULE_TEXT],
80204
80239
  [...RULE_TEXT],
80205
80240
  [...RULE_TEXT],
@@ -80275,6 +80310,15 @@ new Map([
80275
80310
  snapshotLabel: "Tanks low or full now",
80276
80311
  snapshotSection: "tanks"
80277
80312
  },
80313
+ {
80314
+ id: "motion-noise",
80315
+ family: "device-events",
80316
+ label: "Motion without a subject (constant / calm again)",
80317
+ bad: ["motion-noisy"],
80318
+ recovery: ["motion-calm"],
80319
+ snapshotLabel: "Cameras with constant motion now",
80320
+ snapshotSection: null
80321
+ },
80278
80322
  {
80279
80323
  id: "recording-health",
80280
80324
  family: "device-events",
@@ -80284,6 +80328,15 @@ new Map([
80284
80328
  snapshotLabel: "Recordings stalled now",
80285
80329
  snapshotSection: null
80286
80330
  },
80331
+ {
80332
+ id: "device-attention",
80333
+ family: "device-events",
80334
+ label: "Device needs attention (raised / resolved)",
80335
+ bad: ["device-attention-required"],
80336
+ recovery: ["device-attention-resolved"],
80337
+ snapshotLabel: "Devices needing attention now",
80338
+ snapshotSection: null
80339
+ },
80287
80340
  {
80288
80341
  id: "node-connectivity",
80289
80342
  family: "system",
@@ -80928,7 +80981,7 @@ function buildConnectionFormSchema() {
80928
80981
  id: "connection",
80929
80982
  title: "Connection",
80930
80983
  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.",
80984
+ description: "Leave the password blank for an unprotected hub.",
80932
80985
  descriptionKey: "provider-rademacher:connection.s_connection.description",
80933
80986
  columns: 2,
80934
80987
  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",
@@ -56780,6 +56804,16 @@ var DishwasherStatusSchema = object({
56780
56804
  powerState: string().nullable(),
56781
56805
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56782
56806
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56807
+ /**
56808
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56809
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
56810
+ * when none is reported. A cleared reminder is not an unknown one.
56811
+ */
56812
+ filterCleaningDue: boolean().nullable(),
56813
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
56814
+ machineCareDue: boolean().nullable(),
56815
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
56816
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
56783
56817
  /** Option states: null when the appliance does not expose the option or has not said. */
56784
56818
  halfLoad: boolean().nullable(),
56785
56819
  hygienePlus: boolean().nullable(),
@@ -65430,16 +65464,6 @@ var UpdateUserInputSchema = object({
65430
65464
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65431
65465
  scopes: array(TokenScopeSchema).optional()
65432
65466
  });
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
65467
  var OauthSessionSummarySchema = object({
65444
65468
  id: string(),
65445
65469
  userId: string(),
@@ -65461,8 +65485,7 @@ var TotpStatusSchema = object({
65461
65485
  confirmedAt: number().nullable()
65462
65486
  });
65463
65487
  /**
65464
- * user-management — singleton capability for user accounts and the
65465
- * legacy API-key rows.
65488
+ * user-management — singleton capability for user accounts.
65466
65489
  *
65467
65490
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
65468
65491
  * — the subset check on `setUserScopes` is moot
@@ -65518,10 +65541,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65518
65541
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
65519
65542
  kind: "mutation",
65520
65543
  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
65544
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
65526
65545
  kind: "mutation",
65527
65546
  auth: "admin",
@@ -74977,6 +74996,12 @@ Object.freeze({
74977
74996
  addonId: null,
74978
74997
  access: "view"
74979
74998
  },
74999
+ "records.transact": {
75000
+ capName: "records",
75001
+ capScope: "system",
75002
+ addonId: null,
75003
+ access: "create"
75004
+ },
74980
75005
  "sceneMonitor.captureReference": {
74981
75006
  capName: "scene-monitor",
74982
75007
  capScope: "device",
@@ -76309,12 +76334,6 @@ Object.freeze({
76309
76334
  addonId: null,
76310
76335
  access: "view"
76311
76336
  },
76312
- "userManagement.listApiKeys": {
76313
- capName: "user-management",
76314
- capScope: "system",
76315
- addonId: null,
76316
- access: "view"
76317
- },
76318
76337
  "userManagement.listExternalIdentities": {
76319
76338
  capName: "user-management",
76320
76339
  capScope: "system",
@@ -76369,12 +76388,6 @@ Object.freeze({
76369
76388
  addonId: null,
76370
76389
  access: "create"
76371
76390
  },
76372
- "userManagement.revokeApiKey": {
76373
- capName: "user-management",
76374
- capScope: "system",
76375
- addonId: null,
76376
- access: "delete"
76377
- },
76378
76391
  "userManagement.revokeOauthSession": {
76379
76392
  capName: "user-management",
76380
76393
  capScope: "system",
@@ -79739,9 +79752,13 @@ new Map(Object.entries({
79739
79752
  "stream-online": "device-events",
79740
79753
  "stream-offline": "device-events",
79741
79754
  "detection-blind": "device-events",
79755
+ "motion-noisy": "device-events",
79756
+ "motion-calm": "device-events",
79742
79757
  "recording-stalled": "device-events",
79743
79758
  "recording-healthy": "device-events",
79744
79759
  "recording-degraded": "device-events",
79760
+ "device-attention-required": "device-events",
79761
+ "device-attention-resolved": "device-events",
79745
79762
  "node-online": "system",
79746
79763
  "node-offline": "system",
79747
79764
  "node-restarting": "system",
@@ -79824,6 +79841,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79824
79841
  label: "Detecting nothing",
79825
79842
  kinds: ["detection-blind"]
79826
79843
  },
79844
+ {
79845
+ id: "motion-noise",
79846
+ family: "device-events",
79847
+ label: "Motion without a subject",
79848
+ kinds: ["motion-noisy", "motion-calm"]
79849
+ },
79827
79850
  {
79828
79851
  id: "recording",
79829
79852
  family: "device-events",
@@ -79834,6 +79857,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79834
79857
  "recording-degraded"
79835
79858
  ]
79836
79859
  },
79860
+ {
79861
+ id: "device-attention",
79862
+ family: "device-events",
79863
+ label: "Needs attention",
79864
+ kinds: ["device-attention-required", "device-attention-resolved"]
79865
+ },
79837
79866
  {
79838
79867
  id: "nodes",
79839
79868
  family: "system",
@@ -79973,6 +80002,7 @@ var ALERT_EPISODE = [
79973
80002
  "alert-error",
79974
80003
  "alert-critical-resolved"
79975
80004
  ];
80005
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79976
80006
  var UPDATES = [
79977
80007
  "addon-update-available",
79978
80008
  "server-update-available",
@@ -80002,9 +80032,12 @@ var DEVICE_EVENTS = [
80002
80032
  "stream-online",
80003
80033
  "stream-offline",
80004
80034
  "detection-blind",
80035
+ "motion-noisy",
80036
+ "motion-calm",
80005
80037
  "recording-stalled",
80006
80038
  "recording-healthy",
80007
80039
  "recording-degraded",
80040
+ ...DEVICE_ATTENTION,
80008
80041
  ...ALARM
80009
80042
  ];
80010
80043
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -80172,7 +80205,9 @@ var STATE_SUMMARY_VARS = [
80172
80205
  [...RULE_TEXT],
80173
80206
  [...RULE_TEXT],
80174
80207
  [...RULE_TEXT],
80175
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80208
+ [...RULE_TEXT],
80209
+ [...RULE_TEXT],
80210
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80176
80211
  [...RULE_TEXT],
80177
80212
  [...RULE_TEXT],
80178
80213
  [...RULE_TEXT],
@@ -80194,11 +80229,11 @@ var STATE_SUMMARY_VARS = [
80194
80229
  [...RULE_TEXT],
80195
80230
  [...RULE_TEXT],
80196
80231
  [...RULE_TEXT],
80232
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80197
80233
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80234
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80198
80235
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80199
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80200
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80201
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80236
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80202
80237
  [...RULE_TEXT],
80203
80238
  [...RULE_TEXT],
80204
80239
  [...RULE_TEXT],
@@ -80274,6 +80309,15 @@ new Map([
80274
80309
  snapshotLabel: "Tanks low or full now",
80275
80310
  snapshotSection: "tanks"
80276
80311
  },
80312
+ {
80313
+ id: "motion-noise",
80314
+ family: "device-events",
80315
+ label: "Motion without a subject (constant / calm again)",
80316
+ bad: ["motion-noisy"],
80317
+ recovery: ["motion-calm"],
80318
+ snapshotLabel: "Cameras with constant motion now",
80319
+ snapshotSection: null
80320
+ },
80277
80321
  {
80278
80322
  id: "recording-health",
80279
80323
  family: "device-events",
@@ -80283,6 +80327,15 @@ new Map([
80283
80327
  snapshotLabel: "Recordings stalled now",
80284
80328
  snapshotSection: null
80285
80329
  },
80330
+ {
80331
+ id: "device-attention",
80332
+ family: "device-events",
80333
+ label: "Device needs attention (raised / resolved)",
80334
+ bad: ["device-attention-required"],
80335
+ recovery: ["device-attention-resolved"],
80336
+ snapshotLabel: "Devices needing attention now",
80337
+ snapshotSection: null
80338
+ },
80286
80339
  {
80287
80340
  id: "node-connectivity",
80288
80341
  family: "system",
@@ -80927,7 +80980,7 @@ function buildConnectionFormSchema() {
80927
80980
  id: "connection",
80928
80981
  title: "Connection",
80929
80982
  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.",
80983
+ description: "Leave the password blank for an unprotected hub.",
80931
80984
  descriptionKey: "provider-rademacher:connection.s_connection.description",
80932
80985
  columns: 2,
80933
80986
  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.142",
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",