@camstack/addon-provider-ecowitt 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
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  let http = require("http");
3
3
  let events = require("events");
4
4
  let dgram = require("dgram");
5
- //#region ../types/dist/event-category-7pZEBmVg.mjs
5
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
6
6
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
7
7
  EventCategory["SystemBoot"] = "system.boot";
8
8
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -319,6 +319,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
319
319
  */
320
320
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
321
321
  /**
322
+ * A camera's motion source has fired constantly with no subject for an hour
323
+ * (motion duty or session count over the bar, zero detections) — it is not
324
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
325
+ * {@link PipelineMotionCalm}.
326
+ */
327
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
328
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
329
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
330
+ /**
322
331
  * Per-camera pipeline config was mutated by the orchestrator
323
332
  * (3-level settings change via `setAgentAddonDefaults` /
324
333
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -5425,7 +5434,7 @@ var ZodIssueCode$1 = {
5425
5434
  var ZodFirstPartyTypeKind$1;
5426
5435
  ZodFirstPartyTypeKind$1 || (ZodFirstPartyTypeKind$1 = {});
5427
5436
  //#endregion
5428
- //#region ../types/dist/sleep-CueztlR1.mjs
5437
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5429
5438
  /**
5430
5439
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5431
5440
  * window to float samples (D455).
@@ -7954,7 +7963,7 @@ var EntryDescriptorSchema = object({
7954
7963
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
7955
7964
  fields: record(string(), unknown())
7956
7965
  }).strict();
7957
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
7966
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
7958
7967
  var RecordKindDeclarationSchema = object({
7959
7968
  database: _enum(RECORD_DATABASES).default("settings"),
7960
7969
  class: _enum(RECORD_CLASSES),
@@ -7973,14 +7982,6 @@ var RecordKindDeclarationSchema = object({
7973
7982
  secretPaths: array(string().min(1)).default([]),
7974
7983
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
7975
7984
  secretArrayKeys: record(string(), string()).default({}),
7976
- /**
7977
- * RETIRED (D900): the legacy table a kind adopted from during the records
7978
- * migration. Nothing declares it any more and nothing reads it; the schema
7979
- * still ACCEPTS it because the catalog rows the migration wrote carry it
7980
- * (an orphaned kind is never redeclared) and an addon built before the
7981
- * removal still sends it. Never set it.
7982
- */
7983
- adoptsFrom: string().min(1).optional(),
7984
7985
  /** Kinds that must agree through `transact` sit in one file under one family name. */
7985
7986
  transactFamily: string().min(1).optional(),
7986
7987
  entry: EntryDescriptorSchema.optional()
@@ -12672,17 +12673,6 @@ object({
12672
12673
  createdAt: number(),
12673
12674
  updatedAt: number()
12674
12675
  });
12675
- object({
12676
- id: string(),
12677
- label: string(),
12678
- isAdmin: boolean().default(false),
12679
- allowedProviders: AllowedProviderSchema,
12680
- allowedDevices: AllowedDevicesSchema,
12681
- tokenHash: string(),
12682
- tokenPrefix: string(),
12683
- createdAt: number(),
12684
- lastUsedAt: number().optional()
12685
- });
12686
12676
  object({
12687
12677
  id: string(),
12688
12678
  userId: string(),
@@ -16664,16 +16654,36 @@ var RecordKindStateSchema = _enum([
16664
16654
  var DeclareKindResultSchema = object({
16665
16655
  kindId: number().int(),
16666
16656
  state: RecordKindStateSchema,
16667
- createdIndexes: array(string()),
16668
- /**
16669
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
16670
- * it stays on the wire, null, because an addon built before the removal reads
16671
- * an ABSENT field as "adoption pending" and refuses to start.
16672
- */
16673
- adoptionPending: _null()
16657
+ createdIndexes: array(string())
16674
16658
  });
16675
16659
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
16676
16660
  var SecretRefsList = array(string());
16661
+ /**
16662
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
16663
+ * All ops of one call share ONE database file and ONE `transactFamily`.
16664
+ */
16665
+ var RecordTransactOpSchema = discriminatedUnion("op", [
16666
+ object({
16667
+ op: literal("put"),
16668
+ kind: RecordKindNameSchema,
16669
+ record: RecordInputSchema,
16670
+ ifRev: number().int().min(0).optional()
16671
+ }),
16672
+ object({
16673
+ op: literal("patch"),
16674
+ kind: RecordKindNameSchema,
16675
+ id: RecordIdSchema,
16676
+ data: RecordBodySchema,
16677
+ at: number().int().nullable().optional(),
16678
+ expiresAt: number().int().nullable().optional(),
16679
+ ifRev: number().int().min(1).optional()
16680
+ }),
16681
+ object({
16682
+ op: literal("delete"),
16683
+ kind: RecordKindNameSchema,
16684
+ id: RecordIdSchema
16685
+ })
16686
+ ]);
16677
16687
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
16678
16688
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
16679
16689
  kind: "mutation",
@@ -16780,6 +16790,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
16780
16790
  }), {
16781
16791
  kind: "mutation",
16782
16792
  auth: "admin"
16793
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
16794
+ results: array(object({
16795
+ rev: number().int().nullable(),
16796
+ deleted: boolean()
16797
+ })),
16798
+ releasedRefs: SecretRefsList,
16799
+ secretRefs: SecretRefsList
16800
+ }), {
16801
+ kind: "mutation",
16802
+ auth: "admin"
16783
16803
  }), method(object({
16784
16804
  deviceId: number().int(),
16785
16805
  kinds: array(RecordKindNameSchema).optional()
@@ -42487,9 +42507,13 @@ var NcSystemEventKindSchema = _enum([
42487
42507
  "node-updating",
42488
42508
  "node-inference-unavailable",
42489
42509
  "detection-blind",
42510
+ "motion-noisy",
42511
+ "motion-calm",
42490
42512
  "recording-stalled",
42491
42513
  "recording-healthy",
42492
42514
  "recording-degraded",
42515
+ "device-attention-required",
42516
+ "device-attention-resolved",
42493
42517
  "storage-location-low",
42494
42518
  "storage-location-critical",
42495
42519
  "storage-location-ok",
@@ -55813,6 +55837,16 @@ var DishwasherStatusSchema = object({
55813
55837
  powerState: string().nullable(),
55814
55838
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55815
55839
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55840
+ /**
55841
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55842
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
55843
+ * when none is reported. A cleared reminder is not an unknown one.
55844
+ */
55845
+ filterCleaningDue: boolean().nullable(),
55846
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
55847
+ machineCareDue: boolean().nullable(),
55848
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
55849
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
55816
55850
  /** Option states: null when the appliance does not expose the option or has not said. */
55817
55851
  halfLoad: boolean().nullable(),
55818
55852
  hygienePlus: boolean().nullable(),
@@ -64463,16 +64497,6 @@ var UpdateUserInputSchema = object({
64463
64497
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64464
64498
  scopes: array(TokenScopeSchema).optional()
64465
64499
  });
64466
- var ApiKeySummarySchema = object({
64467
- id: string(),
64468
- label: string(),
64469
- isAdmin: boolean().default(false),
64470
- allowedProviders: union([array(string()), literal("*")]).optional(),
64471
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64472
- tokenPrefix: string(),
64473
- createdAt: number(),
64474
- lastUsedAt: number().optional()
64475
- });
64476
64500
  var OauthSessionSummarySchema = object({
64477
64501
  id: string(),
64478
64502
  userId: string(),
@@ -64494,8 +64518,7 @@ var TotpStatusSchema = object({
64494
64518
  confirmedAt: number().nullable()
64495
64519
  });
64496
64520
  /**
64497
- * user-management — singleton capability for user accounts and the
64498
- * legacy API-key rows.
64521
+ * user-management — singleton capability for user accounts.
64499
64522
  *
64500
64523
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64501
64524
  * — the subset check on `setUserScopes` is moot
@@ -64551,10 +64574,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64551
64574
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
64552
64575
  kind: "mutation",
64553
64576
  access: "view"
64554
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
64555
- kind: "mutation",
64556
- auth: "admin",
64557
- access: "delete"
64558
64577
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
64559
64578
  kind: "mutation",
64560
64579
  auth: "admin",
@@ -74010,6 +74029,12 @@ Object.freeze({
74010
74029
  addonId: null,
74011
74030
  access: "view"
74012
74031
  },
74032
+ "records.transact": {
74033
+ capName: "records",
74034
+ capScope: "system",
74035
+ addonId: null,
74036
+ access: "create"
74037
+ },
74013
74038
  "sceneMonitor.captureReference": {
74014
74039
  capName: "scene-monitor",
74015
74040
  capScope: "device",
@@ -75342,12 +75367,6 @@ Object.freeze({
75342
75367
  addonId: null,
75343
75368
  access: "view"
75344
75369
  },
75345
- "userManagement.listApiKeys": {
75346
- capName: "user-management",
75347
- capScope: "system",
75348
- addonId: null,
75349
- access: "view"
75350
- },
75351
75370
  "userManagement.listExternalIdentities": {
75352
75371
  capName: "user-management",
75353
75372
  capScope: "system",
@@ -75402,12 +75421,6 @@ Object.freeze({
75402
75421
  addonId: null,
75403
75422
  access: "create"
75404
75423
  },
75405
- "userManagement.revokeApiKey": {
75406
- capName: "user-management",
75407
- capScope: "system",
75408
- addonId: null,
75409
- access: "delete"
75410
- },
75411
75424
  "userManagement.revokeOauthSession": {
75412
75425
  capName: "user-management",
75413
75426
  capScope: "system",
@@ -78772,9 +78785,13 @@ new Map(Object.entries({
78772
78785
  "stream-online": "device-events",
78773
78786
  "stream-offline": "device-events",
78774
78787
  "detection-blind": "device-events",
78788
+ "motion-noisy": "device-events",
78789
+ "motion-calm": "device-events",
78775
78790
  "recording-stalled": "device-events",
78776
78791
  "recording-healthy": "device-events",
78777
78792
  "recording-degraded": "device-events",
78793
+ "device-attention-required": "device-events",
78794
+ "device-attention-resolved": "device-events",
78778
78795
  "node-online": "system",
78779
78796
  "node-offline": "system",
78780
78797
  "node-restarting": "system",
@@ -78857,6 +78874,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78857
78874
  label: "Detecting nothing",
78858
78875
  kinds: ["detection-blind"]
78859
78876
  },
78877
+ {
78878
+ id: "motion-noise",
78879
+ family: "device-events",
78880
+ label: "Motion without a subject",
78881
+ kinds: ["motion-noisy", "motion-calm"]
78882
+ },
78860
78883
  {
78861
78884
  id: "recording",
78862
78885
  family: "device-events",
@@ -78867,6 +78890,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78867
78890
  "recording-degraded"
78868
78891
  ]
78869
78892
  },
78893
+ {
78894
+ id: "device-attention",
78895
+ family: "device-events",
78896
+ label: "Needs attention",
78897
+ kinds: ["device-attention-required", "device-attention-resolved"]
78898
+ },
78870
78899
  {
78871
78900
  id: "nodes",
78872
78901
  family: "system",
@@ -79006,6 +79035,7 @@ var ALERT_EPISODE = [
79006
79035
  "alert-error",
79007
79036
  "alert-critical-resolved"
79008
79037
  ];
79038
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79009
79039
  var UPDATES = [
79010
79040
  "addon-update-available",
79011
79041
  "server-update-available",
@@ -79035,9 +79065,12 @@ var DEVICE_EVENTS = [
79035
79065
  "stream-online",
79036
79066
  "stream-offline",
79037
79067
  "detection-blind",
79068
+ "motion-noisy",
79069
+ "motion-calm",
79038
79070
  "recording-stalled",
79039
79071
  "recording-healthy",
79040
79072
  "recording-degraded",
79073
+ ...DEVICE_ATTENTION,
79041
79074
  ...ALARM
79042
79075
  ];
79043
79076
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79205,7 +79238,9 @@ var STATE_SUMMARY_VARS = [
79205
79238
  [...RULE_TEXT],
79206
79239
  [...RULE_TEXT],
79207
79240
  [...RULE_TEXT],
79208
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79241
+ [...RULE_TEXT],
79242
+ [...RULE_TEXT],
79243
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79209
79244
  [...RULE_TEXT],
79210
79245
  [...RULE_TEXT],
79211
79246
  [...RULE_TEXT],
@@ -79227,11 +79262,11 @@ var STATE_SUMMARY_VARS = [
79227
79262
  [...RULE_TEXT],
79228
79263
  [...RULE_TEXT],
79229
79264
  [...RULE_TEXT],
79265
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79230
79266
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79267
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79231
79268
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79232
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79233
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79234
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79269
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79235
79270
  [...RULE_TEXT],
79236
79271
  [...RULE_TEXT],
79237
79272
  [...RULE_TEXT],
@@ -79307,6 +79342,15 @@ new Map([
79307
79342
  snapshotLabel: "Tanks low or full now",
79308
79343
  snapshotSection: "tanks"
79309
79344
  },
79345
+ {
79346
+ id: "motion-noise",
79347
+ family: "device-events",
79348
+ label: "Motion without a subject (constant / calm again)",
79349
+ bad: ["motion-noisy"],
79350
+ recovery: ["motion-calm"],
79351
+ snapshotLabel: "Cameras with constant motion now",
79352
+ snapshotSection: null
79353
+ },
79310
79354
  {
79311
79355
  id: "recording-health",
79312
79356
  family: "device-events",
@@ -79316,6 +79360,15 @@ new Map([
79316
79360
  snapshotLabel: "Recordings stalled now",
79317
79361
  snapshotSection: null
79318
79362
  },
79363
+ {
79364
+ id: "device-attention",
79365
+ family: "device-events",
79366
+ label: "Device needs attention (raised / resolved)",
79367
+ bad: ["device-attention-required"],
79368
+ recovery: ["device-attention-resolved"],
79369
+ snapshotLabel: "Devices needing attention now",
79370
+ snapshotSection: null
79371
+ },
79319
79372
  {
79320
79373
  id: "node-connectivity",
79321
79374
  family: "system",
@@ -85758,7 +85811,7 @@ function buildConnectionFormSchema() {
85758
85811
  id: "transport",
85759
85812
  title: "Transport",
85760
85813
  titleKey: "provider-ecowitt:connection.s_transport.title",
85761
- description: "Choose how CamStack reads the gateway. Local poll connects out to the gateway (recommended). Push listener runs a server the gateway uploads to — configure the gateway \"Customized\" upload to point at this hub.",
85814
+ description: "Local poll connects out to the gateway (recommended). Push listener needs the gateway \"Customized\" upload pointed at this hub.",
85762
85815
  descriptionKey: "provider-ecowitt:connection.s_transport.description",
85763
85816
  columns: 1,
85764
85817
  fields: [{
@@ -85885,7 +85938,7 @@ function buildDiscoveryParamsFormSchema() {
85885
85938
  id: "scan",
85886
85939
  title: "Scan options",
85887
85940
  titleKey: "provider-ecowitt:discoveryParams.s_scan.title",
85888
- description: "Leave empty to scan the local subnet. To scan other subnets, list their broadcast addresses (e.g. 192.168.20.255), gateway IPs (e.g. 192.168.20.181), or CIDRs (e.g. 192.168.20.0/24) — comma or newline separated. Each subnet is swept independently and unreachable ones are skipped.",
85941
+ description: "Leave empty to scan the local subnet; otherwise list broadcast addresses, gateway IPs or CIDRs, comma or newline separated.",
85889
85942
  descriptionKey: "provider-ecowitt:discoveryParams.s_scan.description",
85890
85943
  columns: 1,
85891
85944
  fields: [{
package/dist/addon.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { createServer } from "http";
2
2
  import { EventEmitter } from "events";
3
3
  import { createSocket } from "dgram";
4
- //#region ../types/dist/event-category-7pZEBmVg.mjs
4
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
5
5
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
6
6
  EventCategory["SystemBoot"] = "system.boot";
7
7
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -318,6 +318,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
318
318
  */
319
319
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
320
320
  /**
321
+ * A camera's motion source has fired constantly with no subject for an hour
322
+ * (motion duty or session count over the bar, zero detections) — it is not
323
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
324
+ * {@link PipelineMotionCalm}.
325
+ */
326
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
327
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
328
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
329
+ /**
321
330
  * Per-camera pipeline config was mutated by the orchestrator
322
331
  * (3-level settings change via `setAgentAddonDefaults` /
323
332
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -5424,7 +5433,7 @@ var ZodIssueCode$1 = {
5424
5433
  var ZodFirstPartyTypeKind$1;
5425
5434
  ZodFirstPartyTypeKind$1 || (ZodFirstPartyTypeKind$1 = {});
5426
5435
  //#endregion
5427
- //#region ../types/dist/sleep-CueztlR1.mjs
5436
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5428
5437
  /**
5429
5438
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5430
5439
  * window to float samples (D455).
@@ -7953,7 +7962,7 @@ var EntryDescriptorSchema = object({
7953
7962
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
7954
7963
  fields: record(string(), unknown())
7955
7964
  }).strict();
7956
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
7965
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
7957
7966
  var RecordKindDeclarationSchema = object({
7958
7967
  database: _enum(RECORD_DATABASES).default("settings"),
7959
7968
  class: _enum(RECORD_CLASSES),
@@ -7972,14 +7981,6 @@ var RecordKindDeclarationSchema = object({
7972
7981
  secretPaths: array(string().min(1)).default([]),
7973
7982
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
7974
7983
  secretArrayKeys: record(string(), string()).default({}),
7975
- /**
7976
- * RETIRED (D900): the legacy table a kind adopted from during the records
7977
- * migration. Nothing declares it any more and nothing reads it; the schema
7978
- * still ACCEPTS it because the catalog rows the migration wrote carry it
7979
- * (an orphaned kind is never redeclared) and an addon built before the
7980
- * removal still sends it. Never set it.
7981
- */
7982
- adoptsFrom: string().min(1).optional(),
7983
7984
  /** Kinds that must agree through `transact` sit in one file under one family name. */
7984
7985
  transactFamily: string().min(1).optional(),
7985
7986
  entry: EntryDescriptorSchema.optional()
@@ -12671,17 +12672,6 @@ object({
12671
12672
  createdAt: number(),
12672
12673
  updatedAt: number()
12673
12674
  });
12674
- object({
12675
- id: string(),
12676
- label: string(),
12677
- isAdmin: boolean().default(false),
12678
- allowedProviders: AllowedProviderSchema,
12679
- allowedDevices: AllowedDevicesSchema,
12680
- tokenHash: string(),
12681
- tokenPrefix: string(),
12682
- createdAt: number(),
12683
- lastUsedAt: number().optional()
12684
- });
12685
12675
  object({
12686
12676
  id: string(),
12687
12677
  userId: string(),
@@ -16663,16 +16653,36 @@ var RecordKindStateSchema = _enum([
16663
16653
  var DeclareKindResultSchema = object({
16664
16654
  kindId: number().int(),
16665
16655
  state: RecordKindStateSchema,
16666
- createdIndexes: array(string()),
16667
- /**
16668
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
16669
- * it stays on the wire, null, because an addon built before the removal reads
16670
- * an ABSENT field as "adoption pending" and refuses to start.
16671
- */
16672
- adoptionPending: _null()
16656
+ createdIndexes: array(string())
16673
16657
  });
16674
16658
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
16675
16659
  var SecretRefsList = array(string());
16660
+ /**
16661
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
16662
+ * All ops of one call share ONE database file and ONE `transactFamily`.
16663
+ */
16664
+ var RecordTransactOpSchema = discriminatedUnion("op", [
16665
+ object({
16666
+ op: literal("put"),
16667
+ kind: RecordKindNameSchema,
16668
+ record: RecordInputSchema,
16669
+ ifRev: number().int().min(0).optional()
16670
+ }),
16671
+ object({
16672
+ op: literal("patch"),
16673
+ kind: RecordKindNameSchema,
16674
+ id: RecordIdSchema,
16675
+ data: RecordBodySchema,
16676
+ at: number().int().nullable().optional(),
16677
+ expiresAt: number().int().nullable().optional(),
16678
+ ifRev: number().int().min(1).optional()
16679
+ }),
16680
+ object({
16681
+ op: literal("delete"),
16682
+ kind: RecordKindNameSchema,
16683
+ id: RecordIdSchema
16684
+ })
16685
+ ]);
16676
16686
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
16677
16687
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
16678
16688
  kind: "mutation",
@@ -16779,6 +16789,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
16779
16789
  }), {
16780
16790
  kind: "mutation",
16781
16791
  auth: "admin"
16792
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
16793
+ results: array(object({
16794
+ rev: number().int().nullable(),
16795
+ deleted: boolean()
16796
+ })),
16797
+ releasedRefs: SecretRefsList,
16798
+ secretRefs: SecretRefsList
16799
+ }), {
16800
+ kind: "mutation",
16801
+ auth: "admin"
16782
16802
  }), method(object({
16783
16803
  deviceId: number().int(),
16784
16804
  kinds: array(RecordKindNameSchema).optional()
@@ -42486,9 +42506,13 @@ var NcSystemEventKindSchema = _enum([
42486
42506
  "node-updating",
42487
42507
  "node-inference-unavailable",
42488
42508
  "detection-blind",
42509
+ "motion-noisy",
42510
+ "motion-calm",
42489
42511
  "recording-stalled",
42490
42512
  "recording-healthy",
42491
42513
  "recording-degraded",
42514
+ "device-attention-required",
42515
+ "device-attention-resolved",
42492
42516
  "storage-location-low",
42493
42517
  "storage-location-critical",
42494
42518
  "storage-location-ok",
@@ -55812,6 +55836,16 @@ var DishwasherStatusSchema = object({
55812
55836
  powerState: string().nullable(),
55813
55837
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55814
55838
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55839
+ /**
55840
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55841
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
55842
+ * when none is reported. A cleared reminder is not an unknown one.
55843
+ */
55844
+ filterCleaningDue: boolean().nullable(),
55845
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
55846
+ machineCareDue: boolean().nullable(),
55847
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
55848
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
55815
55849
  /** Option states: null when the appliance does not expose the option or has not said. */
55816
55850
  halfLoad: boolean().nullable(),
55817
55851
  hygienePlus: boolean().nullable(),
@@ -64462,16 +64496,6 @@ var UpdateUserInputSchema = object({
64462
64496
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64463
64497
  scopes: array(TokenScopeSchema).optional()
64464
64498
  });
64465
- var ApiKeySummarySchema = object({
64466
- id: string(),
64467
- label: string(),
64468
- isAdmin: boolean().default(false),
64469
- allowedProviders: union([array(string()), literal("*")]).optional(),
64470
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64471
- tokenPrefix: string(),
64472
- createdAt: number(),
64473
- lastUsedAt: number().optional()
64474
- });
64475
64499
  var OauthSessionSummarySchema = object({
64476
64500
  id: string(),
64477
64501
  userId: string(),
@@ -64493,8 +64517,7 @@ var TotpStatusSchema = object({
64493
64517
  confirmedAt: number().nullable()
64494
64518
  });
64495
64519
  /**
64496
- * user-management — singleton capability for user accounts and the
64497
- * legacy API-key rows.
64520
+ * user-management — singleton capability for user accounts.
64498
64521
  *
64499
64522
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64500
64523
  * — the subset check on `setUserScopes` is moot
@@ -64550,10 +64573,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64550
64573
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
64551
64574
  kind: "mutation",
64552
64575
  access: "view"
64553
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
64554
- kind: "mutation",
64555
- auth: "admin",
64556
- access: "delete"
64557
64576
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
64558
64577
  kind: "mutation",
64559
64578
  auth: "admin",
@@ -74009,6 +74028,12 @@ Object.freeze({
74009
74028
  addonId: null,
74010
74029
  access: "view"
74011
74030
  },
74031
+ "records.transact": {
74032
+ capName: "records",
74033
+ capScope: "system",
74034
+ addonId: null,
74035
+ access: "create"
74036
+ },
74012
74037
  "sceneMonitor.captureReference": {
74013
74038
  capName: "scene-monitor",
74014
74039
  capScope: "device",
@@ -75341,12 +75366,6 @@ Object.freeze({
75341
75366
  addonId: null,
75342
75367
  access: "view"
75343
75368
  },
75344
- "userManagement.listApiKeys": {
75345
- capName: "user-management",
75346
- capScope: "system",
75347
- addonId: null,
75348
- access: "view"
75349
- },
75350
75369
  "userManagement.listExternalIdentities": {
75351
75370
  capName: "user-management",
75352
75371
  capScope: "system",
@@ -75401,12 +75420,6 @@ Object.freeze({
75401
75420
  addonId: null,
75402
75421
  access: "create"
75403
75422
  },
75404
- "userManagement.revokeApiKey": {
75405
- capName: "user-management",
75406
- capScope: "system",
75407
- addonId: null,
75408
- access: "delete"
75409
- },
75410
75423
  "userManagement.revokeOauthSession": {
75411
75424
  capName: "user-management",
75412
75425
  capScope: "system",
@@ -78771,9 +78784,13 @@ new Map(Object.entries({
78771
78784
  "stream-online": "device-events",
78772
78785
  "stream-offline": "device-events",
78773
78786
  "detection-blind": "device-events",
78787
+ "motion-noisy": "device-events",
78788
+ "motion-calm": "device-events",
78774
78789
  "recording-stalled": "device-events",
78775
78790
  "recording-healthy": "device-events",
78776
78791
  "recording-degraded": "device-events",
78792
+ "device-attention-required": "device-events",
78793
+ "device-attention-resolved": "device-events",
78777
78794
  "node-online": "system",
78778
78795
  "node-offline": "system",
78779
78796
  "node-restarting": "system",
@@ -78856,6 +78873,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78856
78873
  label: "Detecting nothing",
78857
78874
  kinds: ["detection-blind"]
78858
78875
  },
78876
+ {
78877
+ id: "motion-noise",
78878
+ family: "device-events",
78879
+ label: "Motion without a subject",
78880
+ kinds: ["motion-noisy", "motion-calm"]
78881
+ },
78859
78882
  {
78860
78883
  id: "recording",
78861
78884
  family: "device-events",
@@ -78866,6 +78889,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78866
78889
  "recording-degraded"
78867
78890
  ]
78868
78891
  },
78892
+ {
78893
+ id: "device-attention",
78894
+ family: "device-events",
78895
+ label: "Needs attention",
78896
+ kinds: ["device-attention-required", "device-attention-resolved"]
78897
+ },
78869
78898
  {
78870
78899
  id: "nodes",
78871
78900
  family: "system",
@@ -79005,6 +79034,7 @@ var ALERT_EPISODE = [
79005
79034
  "alert-error",
79006
79035
  "alert-critical-resolved"
79007
79036
  ];
79037
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79008
79038
  var UPDATES = [
79009
79039
  "addon-update-available",
79010
79040
  "server-update-available",
@@ -79034,9 +79064,12 @@ var DEVICE_EVENTS = [
79034
79064
  "stream-online",
79035
79065
  "stream-offline",
79036
79066
  "detection-blind",
79067
+ "motion-noisy",
79068
+ "motion-calm",
79037
79069
  "recording-stalled",
79038
79070
  "recording-healthy",
79039
79071
  "recording-degraded",
79072
+ ...DEVICE_ATTENTION,
79040
79073
  ...ALARM
79041
79074
  ];
79042
79075
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79204,7 +79237,9 @@ var STATE_SUMMARY_VARS = [
79204
79237
  [...RULE_TEXT],
79205
79238
  [...RULE_TEXT],
79206
79239
  [...RULE_TEXT],
79207
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79240
+ [...RULE_TEXT],
79241
+ [...RULE_TEXT],
79242
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79208
79243
  [...RULE_TEXT],
79209
79244
  [...RULE_TEXT],
79210
79245
  [...RULE_TEXT],
@@ -79226,11 +79261,11 @@ var STATE_SUMMARY_VARS = [
79226
79261
  [...RULE_TEXT],
79227
79262
  [...RULE_TEXT],
79228
79263
  [...RULE_TEXT],
79264
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79229
79265
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79266
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79230
79267
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79231
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79232
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79233
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79268
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79234
79269
  [...RULE_TEXT],
79235
79270
  [...RULE_TEXT],
79236
79271
  [...RULE_TEXT],
@@ -79306,6 +79341,15 @@ new Map([
79306
79341
  snapshotLabel: "Tanks low or full now",
79307
79342
  snapshotSection: "tanks"
79308
79343
  },
79344
+ {
79345
+ id: "motion-noise",
79346
+ family: "device-events",
79347
+ label: "Motion without a subject (constant / calm again)",
79348
+ bad: ["motion-noisy"],
79349
+ recovery: ["motion-calm"],
79350
+ snapshotLabel: "Cameras with constant motion now",
79351
+ snapshotSection: null
79352
+ },
79309
79353
  {
79310
79354
  id: "recording-health",
79311
79355
  family: "device-events",
@@ -79315,6 +79359,15 @@ new Map([
79315
79359
  snapshotLabel: "Recordings stalled now",
79316
79360
  snapshotSection: null
79317
79361
  },
79362
+ {
79363
+ id: "device-attention",
79364
+ family: "device-events",
79365
+ label: "Device needs attention (raised / resolved)",
79366
+ bad: ["device-attention-required"],
79367
+ recovery: ["device-attention-resolved"],
79368
+ snapshotLabel: "Devices needing attention now",
79369
+ snapshotSection: null
79370
+ },
79318
79371
  {
79319
79372
  id: "node-connectivity",
79320
79373
  family: "system",
@@ -85757,7 +85810,7 @@ function buildConnectionFormSchema() {
85757
85810
  id: "transport",
85758
85811
  title: "Transport",
85759
85812
  titleKey: "provider-ecowitt:connection.s_transport.title",
85760
- description: "Choose how CamStack reads the gateway. Local poll connects out to the gateway (recommended). Push listener runs a server the gateway uploads to — configure the gateway \"Customized\" upload to point at this hub.",
85813
+ description: "Local poll connects out to the gateway (recommended). Push listener needs the gateway \"Customized\" upload pointed at this hub.",
85761
85814
  descriptionKey: "provider-ecowitt:connection.s_transport.description",
85762
85815
  columns: 1,
85763
85816
  fields: [{
@@ -85884,7 +85937,7 @@ function buildDiscoveryParamsFormSchema() {
85884
85937
  id: "scan",
85885
85938
  title: "Scan options",
85886
85939
  titleKey: "provider-ecowitt:discoveryParams.s_scan.title",
85887
- description: "Leave empty to scan the local subnet. To scan other subnets, list their broadcast addresses (e.g. 192.168.20.255), gateway IPs (e.g. 192.168.20.181), or CIDRs (e.g. 192.168.20.0/24) — comma or newline separated. Each subnet is swept independently and unreachable ones are skipped.",
85940
+ description: "Leave empty to scan the local subnet; otherwise list broadcast addresses, gateway IPs or CIDRs, comma or newline separated.",
85888
85941
  descriptionKey: "provider-ecowitt:discoveryParams.s_scan.description",
85889
85942
  columns: 1,
85890
85943
  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_transport.title": "Transport",
5
- "connection.s_transport.description": "Choose how CamStack reads the gateway. Local poll connects out to the gateway (recommended). Push listener runs a server the gateway uploads to — configure the gateway \"Customized\" upload to point at this hub.",
5
+ "connection.s_transport.description": "Local poll connects out to the gateway (recommended). Push listener needs the gateway \"Customized\" upload pointed at this hub.",
6
6
  "connection.s_transport.transport.label": "Transport",
7
7
  "connection.s_transport.transport.o_local.label": "Local poll (recommended)",
8
8
  "connection.s_transport.transport.o_listener.label": "Push listener",
@@ -15,7 +15,7 @@
15
15
  "connection.s_listener.listenPort.label": "Listen port",
16
16
  "connection.s_listener.listenHost.label": "Bind host (optional)",
17
17
  "discoveryParams.s_scan.title": "Scan options",
18
- "discoveryParams.s_scan.description": "Leave empty to scan the local subnet. To scan other subnets, list their broadcast addresses (e.g. 192.168.20.255), gateway IPs (e.g. 192.168.20.181), or CIDRs (e.g. 192.168.20.0/24) — comma or newline separated. Each subnet is swept independently and unreachable ones are skipped.",
18
+ "discoveryParams.s_scan.description": "Leave empty to scan the local subnet; otherwise list broadcast addresses, gateway IPs or CIDRs, comma or newline separated.",
19
19
  "discoveryParams.s_scan.broadcastAddress.label": "Broadcast addresses / gateway IPs / CIDRs",
20
20
  "discoveryParams.s_scan.timeoutMs.label": "UDP timeout (ms)"
21
21
  }
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_transport.title": "Trasporto",
5
- "connection.s_transport.description": "Scegli come CamStack legge il gateway. La lettura locale si collega al gateway (consigliato). Il listener push avvia un server a cui il gateway invia i dati: configura il caricamento \"Personalizzato\" del gateway per puntare a questo hub.",
5
+ "connection.s_transport.description": "Il polling locale si connette al gateway (consigliato). Il listener push richiede che l'upload \"Customized\" del gateway punti a questo hub.",
6
6
  "connection.s_transport.transport.label": "Trasporto",
7
7
  "connection.s_transport.transport.o_local.label": "Lettura locale (consigliato)",
8
8
  "connection.s_transport.transport.o_listener.label": "Listener push",
@@ -15,7 +15,7 @@
15
15
  "connection.s_listener.listenPort.label": "Porta di ascolto",
16
16
  "connection.s_listener.listenHost.label": "Host di ascolto (facoltativo)",
17
17
  "discoveryParams.s_scan.title": "Opzioni di scansione",
18
- "discoveryParams.s_scan.description": "Lascia vuoto per scansionare la sottorete locale. Per scansionare altre sottoreti, inserisci i loro indirizzi di broadcast (ad es. 192.168.20.255), gli IP dei gateway (ad es. 192.168.20.181) o i CIDR (ad es. 192.168.20.0/24), separati da virgola o a capo. Ogni sottorete viene scansionata in modo indipendente e quelle irraggiungibili vengono saltate.",
18
+ "discoveryParams.s_scan.description": "Lascia vuoto per scansionare la subnet locale; altrimenti elenca indirizzi broadcast, IP dei gateway o CIDR, separati da virgola o a capo.",
19
19
  "discoveryParams.s_scan.broadcastAddress.label": "Indirizzi di broadcast / IP dei gateway / CIDR",
20
20
  "discoveryParams.s_scan.timeoutMs.label": "Timeout UDP (ms)"
21
21
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-ecowitt",
3
- "version": "0.2.141",
3
+ "version": "0.2.142",
4
4
  "description": "Ecowitt weather-station device-provider addon for CamStack — wraps the @apocaliss92/nodewitt local-poll / push client",
5
5
  "keywords": [
6
6
  "camstack",