@camstack/addon-provider-ecowitt 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
@@ -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",
@@ -48050,7 +48074,6 @@ var RecommendationReasonSchema = discriminatedUnion("kind", [
48050
48074
  modelId: string()
48051
48075
  }),
48052
48076
  object({ kind: literal("cpu-device") }),
48053
- object({ kind: literal("coral-untouched") }),
48054
48077
  object({ kind: literal("device-disabled") }),
48055
48078
  object({ kind: literal("device-unavailable") }),
48056
48079
  object({ kind: literal("node-offline") }),
@@ -48148,11 +48171,6 @@ var AutoTuneWarningSchema = discriminatedUnion("kind", [
48148
48171
  kind: literal("detector-store-unreadable"),
48149
48172
  error: string()
48150
48173
  }),
48151
- object({
48152
- kind: literal("coral-enabled"),
48153
- nodeId: string(),
48154
- deviceKey: string()
48155
- }),
48156
48174
  object({
48157
48175
  kind: literal("custom-pin-kept"),
48158
48176
  nodeId: string(),
@@ -55813,6 +55831,16 @@ var DishwasherStatusSchema = object({
55813
55831
  powerState: string().nullable(),
55814
55832
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55815
55833
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55834
+ /**
55835
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55836
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
55837
+ * when none is reported. A cleared reminder is not an unknown one.
55838
+ */
55839
+ filterCleaningDue: boolean().nullable(),
55840
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
55841
+ machineCareDue: boolean().nullable(),
55842
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
55843
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
55816
55844
  /** Option states: null when the appliance does not expose the option or has not said. */
55817
55845
  halfLoad: boolean().nullable(),
55818
55846
  hygienePlus: boolean().nullable(),
@@ -64463,16 +64491,6 @@ var UpdateUserInputSchema = object({
64463
64491
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64464
64492
  scopes: array(TokenScopeSchema).optional()
64465
64493
  });
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
64494
  var OauthSessionSummarySchema = object({
64477
64495
  id: string(),
64478
64496
  userId: string(),
@@ -64494,8 +64512,7 @@ var TotpStatusSchema = object({
64494
64512
  confirmedAt: number().nullable()
64495
64513
  });
64496
64514
  /**
64497
- * user-management — singleton capability for user accounts and the
64498
- * legacy API-key rows.
64515
+ * user-management — singleton capability for user accounts.
64499
64516
  *
64500
64517
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64501
64518
  * — the subset check on `setUserScopes` is moot
@@ -64551,10 +64568,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64551
64568
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
64552
64569
  kind: "mutation",
64553
64570
  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
64571
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
64559
64572
  kind: "mutation",
64560
64573
  auth: "admin",
@@ -74010,6 +74023,12 @@ Object.freeze({
74010
74023
  addonId: null,
74011
74024
  access: "view"
74012
74025
  },
74026
+ "records.transact": {
74027
+ capName: "records",
74028
+ capScope: "system",
74029
+ addonId: null,
74030
+ access: "create"
74031
+ },
74013
74032
  "sceneMonitor.captureReference": {
74014
74033
  capName: "scene-monitor",
74015
74034
  capScope: "device",
@@ -75342,12 +75361,6 @@ Object.freeze({
75342
75361
  addonId: null,
75343
75362
  access: "view"
75344
75363
  },
75345
- "userManagement.listApiKeys": {
75346
- capName: "user-management",
75347
- capScope: "system",
75348
- addonId: null,
75349
- access: "view"
75350
- },
75351
75364
  "userManagement.listExternalIdentities": {
75352
75365
  capName: "user-management",
75353
75366
  capScope: "system",
@@ -75402,12 +75415,6 @@ Object.freeze({
75402
75415
  addonId: null,
75403
75416
  access: "create"
75404
75417
  },
75405
- "userManagement.revokeApiKey": {
75406
- capName: "user-management",
75407
- capScope: "system",
75408
- addonId: null,
75409
- access: "delete"
75410
- },
75411
75418
  "userManagement.revokeOauthSession": {
75412
75419
  capName: "user-management",
75413
75420
  capScope: "system",
@@ -78772,9 +78779,13 @@ new Map(Object.entries({
78772
78779
  "stream-online": "device-events",
78773
78780
  "stream-offline": "device-events",
78774
78781
  "detection-blind": "device-events",
78782
+ "motion-noisy": "device-events",
78783
+ "motion-calm": "device-events",
78775
78784
  "recording-stalled": "device-events",
78776
78785
  "recording-healthy": "device-events",
78777
78786
  "recording-degraded": "device-events",
78787
+ "device-attention-required": "device-events",
78788
+ "device-attention-resolved": "device-events",
78778
78789
  "node-online": "system",
78779
78790
  "node-offline": "system",
78780
78791
  "node-restarting": "system",
@@ -78857,6 +78868,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78857
78868
  label: "Detecting nothing",
78858
78869
  kinds: ["detection-blind"]
78859
78870
  },
78871
+ {
78872
+ id: "motion-noise",
78873
+ family: "device-events",
78874
+ label: "Motion without a subject",
78875
+ kinds: ["motion-noisy", "motion-calm"]
78876
+ },
78860
78877
  {
78861
78878
  id: "recording",
78862
78879
  family: "device-events",
@@ -78867,6 +78884,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78867
78884
  "recording-degraded"
78868
78885
  ]
78869
78886
  },
78887
+ {
78888
+ id: "device-attention",
78889
+ family: "device-events",
78890
+ label: "Needs attention",
78891
+ kinds: ["device-attention-required", "device-attention-resolved"]
78892
+ },
78870
78893
  {
78871
78894
  id: "nodes",
78872
78895
  family: "system",
@@ -79006,6 +79029,7 @@ var ALERT_EPISODE = [
79006
79029
  "alert-error",
79007
79030
  "alert-critical-resolved"
79008
79031
  ];
79032
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79009
79033
  var UPDATES = [
79010
79034
  "addon-update-available",
79011
79035
  "server-update-available",
@@ -79035,9 +79059,12 @@ var DEVICE_EVENTS = [
79035
79059
  "stream-online",
79036
79060
  "stream-offline",
79037
79061
  "detection-blind",
79062
+ "motion-noisy",
79063
+ "motion-calm",
79038
79064
  "recording-stalled",
79039
79065
  "recording-healthy",
79040
79066
  "recording-degraded",
79067
+ ...DEVICE_ATTENTION,
79041
79068
  ...ALARM
79042
79069
  ];
79043
79070
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79205,7 +79232,9 @@ var STATE_SUMMARY_VARS = [
79205
79232
  [...RULE_TEXT],
79206
79233
  [...RULE_TEXT],
79207
79234
  [...RULE_TEXT],
79208
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79235
+ [...RULE_TEXT],
79236
+ [...RULE_TEXT],
79237
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79209
79238
  [...RULE_TEXT],
79210
79239
  [...RULE_TEXT],
79211
79240
  [...RULE_TEXT],
@@ -79227,11 +79256,11 @@ var STATE_SUMMARY_VARS = [
79227
79256
  [...RULE_TEXT],
79228
79257
  [...RULE_TEXT],
79229
79258
  [...RULE_TEXT],
79259
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79230
79260
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79261
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79231
79262
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79232
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79233
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79234
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79263
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79235
79264
  [...RULE_TEXT],
79236
79265
  [...RULE_TEXT],
79237
79266
  [...RULE_TEXT],
@@ -79307,6 +79336,15 @@ new Map([
79307
79336
  snapshotLabel: "Tanks low or full now",
79308
79337
  snapshotSection: "tanks"
79309
79338
  },
79339
+ {
79340
+ id: "motion-noise",
79341
+ family: "device-events",
79342
+ label: "Motion without a subject (constant / calm again)",
79343
+ bad: ["motion-noisy"],
79344
+ recovery: ["motion-calm"],
79345
+ snapshotLabel: "Cameras with constant motion now",
79346
+ snapshotSection: null
79347
+ },
79310
79348
  {
79311
79349
  id: "recording-health",
79312
79350
  family: "device-events",
@@ -79316,6 +79354,15 @@ new Map([
79316
79354
  snapshotLabel: "Recordings stalled now",
79317
79355
  snapshotSection: null
79318
79356
  },
79357
+ {
79358
+ id: "device-attention",
79359
+ family: "device-events",
79360
+ label: "Device needs attention (raised / resolved)",
79361
+ bad: ["device-attention-required"],
79362
+ recovery: ["device-attention-resolved"],
79363
+ snapshotLabel: "Devices needing attention now",
79364
+ snapshotSection: null
79365
+ },
79319
79366
  {
79320
79367
  id: "node-connectivity",
79321
79368
  family: "system",
@@ -85758,7 +85805,7 @@ function buildConnectionFormSchema() {
85758
85805
  id: "transport",
85759
85806
  title: "Transport",
85760
85807
  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.",
85808
+ description: "Local poll connects out to the gateway (recommended). Push listener needs the gateway \"Customized\" upload pointed at this hub.",
85762
85809
  descriptionKey: "provider-ecowitt:connection.s_transport.description",
85763
85810
  columns: 1,
85764
85811
  fields: [{
@@ -85885,7 +85932,7 @@ function buildDiscoveryParamsFormSchema() {
85885
85932
  id: "scan",
85886
85933
  title: "Scan options",
85887
85934
  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.",
85935
+ description: "Leave empty to scan the local subnet; otherwise list broadcast addresses, gateway IPs or CIDRs, comma or newline separated.",
85889
85936
  descriptionKey: "provider-ecowitt:discoveryParams.s_scan.description",
85890
85937
  columns: 1,
85891
85938
  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",
@@ -48049,7 +48073,6 @@ var RecommendationReasonSchema = discriminatedUnion("kind", [
48049
48073
  modelId: string()
48050
48074
  }),
48051
48075
  object({ kind: literal("cpu-device") }),
48052
- object({ kind: literal("coral-untouched") }),
48053
48076
  object({ kind: literal("device-disabled") }),
48054
48077
  object({ kind: literal("device-unavailable") }),
48055
48078
  object({ kind: literal("node-offline") }),
@@ -48147,11 +48170,6 @@ var AutoTuneWarningSchema = discriminatedUnion("kind", [
48147
48170
  kind: literal("detector-store-unreadable"),
48148
48171
  error: string()
48149
48172
  }),
48150
- object({
48151
- kind: literal("coral-enabled"),
48152
- nodeId: string(),
48153
- deviceKey: string()
48154
- }),
48155
48173
  object({
48156
48174
  kind: literal("custom-pin-kept"),
48157
48175
  nodeId: string(),
@@ -55812,6 +55830,16 @@ var DishwasherStatusSchema = object({
55812
55830
  powerState: string().nullable(),
55813
55831
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55814
55832
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55833
+ /**
55834
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55835
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
55836
+ * when none is reported. A cleared reminder is not an unknown one.
55837
+ */
55838
+ filterCleaningDue: boolean().nullable(),
55839
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
55840
+ machineCareDue: boolean().nullable(),
55841
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
55842
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
55815
55843
  /** Option states: null when the appliance does not expose the option or has not said. */
55816
55844
  halfLoad: boolean().nullable(),
55817
55845
  hygienePlus: boolean().nullable(),
@@ -64462,16 +64490,6 @@ var UpdateUserInputSchema = object({
64462
64490
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64463
64491
  scopes: array(TokenScopeSchema).optional()
64464
64492
  });
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
64493
  var OauthSessionSummarySchema = object({
64476
64494
  id: string(),
64477
64495
  userId: string(),
@@ -64493,8 +64511,7 @@ var TotpStatusSchema = object({
64493
64511
  confirmedAt: number().nullable()
64494
64512
  });
64495
64513
  /**
64496
- * user-management — singleton capability for user accounts and the
64497
- * legacy API-key rows.
64514
+ * user-management — singleton capability for user accounts.
64498
64515
  *
64499
64516
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64500
64517
  * — the subset check on `setUserScopes` is moot
@@ -64550,10 +64567,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64550
64567
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
64551
64568
  kind: "mutation",
64552
64569
  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
64570
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
64558
64571
  kind: "mutation",
64559
64572
  auth: "admin",
@@ -74009,6 +74022,12 @@ Object.freeze({
74009
74022
  addonId: null,
74010
74023
  access: "view"
74011
74024
  },
74025
+ "records.transact": {
74026
+ capName: "records",
74027
+ capScope: "system",
74028
+ addonId: null,
74029
+ access: "create"
74030
+ },
74012
74031
  "sceneMonitor.captureReference": {
74013
74032
  capName: "scene-monitor",
74014
74033
  capScope: "device",
@@ -75341,12 +75360,6 @@ Object.freeze({
75341
75360
  addonId: null,
75342
75361
  access: "view"
75343
75362
  },
75344
- "userManagement.listApiKeys": {
75345
- capName: "user-management",
75346
- capScope: "system",
75347
- addonId: null,
75348
- access: "view"
75349
- },
75350
75363
  "userManagement.listExternalIdentities": {
75351
75364
  capName: "user-management",
75352
75365
  capScope: "system",
@@ -75401,12 +75414,6 @@ Object.freeze({
75401
75414
  addonId: null,
75402
75415
  access: "create"
75403
75416
  },
75404
- "userManagement.revokeApiKey": {
75405
- capName: "user-management",
75406
- capScope: "system",
75407
- addonId: null,
75408
- access: "delete"
75409
- },
75410
75417
  "userManagement.revokeOauthSession": {
75411
75418
  capName: "user-management",
75412
75419
  capScope: "system",
@@ -78771,9 +78778,13 @@ new Map(Object.entries({
78771
78778
  "stream-online": "device-events",
78772
78779
  "stream-offline": "device-events",
78773
78780
  "detection-blind": "device-events",
78781
+ "motion-noisy": "device-events",
78782
+ "motion-calm": "device-events",
78774
78783
  "recording-stalled": "device-events",
78775
78784
  "recording-healthy": "device-events",
78776
78785
  "recording-degraded": "device-events",
78786
+ "device-attention-required": "device-events",
78787
+ "device-attention-resolved": "device-events",
78777
78788
  "node-online": "system",
78778
78789
  "node-offline": "system",
78779
78790
  "node-restarting": "system",
@@ -78856,6 +78867,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78856
78867
  label: "Detecting nothing",
78857
78868
  kinds: ["detection-blind"]
78858
78869
  },
78870
+ {
78871
+ id: "motion-noise",
78872
+ family: "device-events",
78873
+ label: "Motion without a subject",
78874
+ kinds: ["motion-noisy", "motion-calm"]
78875
+ },
78859
78876
  {
78860
78877
  id: "recording",
78861
78878
  family: "device-events",
@@ -78866,6 +78883,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78866
78883
  "recording-degraded"
78867
78884
  ]
78868
78885
  },
78886
+ {
78887
+ id: "device-attention",
78888
+ family: "device-events",
78889
+ label: "Needs attention",
78890
+ kinds: ["device-attention-required", "device-attention-resolved"]
78891
+ },
78869
78892
  {
78870
78893
  id: "nodes",
78871
78894
  family: "system",
@@ -79005,6 +79028,7 @@ var ALERT_EPISODE = [
79005
79028
  "alert-error",
79006
79029
  "alert-critical-resolved"
79007
79030
  ];
79031
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79008
79032
  var UPDATES = [
79009
79033
  "addon-update-available",
79010
79034
  "server-update-available",
@@ -79034,9 +79058,12 @@ var DEVICE_EVENTS = [
79034
79058
  "stream-online",
79035
79059
  "stream-offline",
79036
79060
  "detection-blind",
79061
+ "motion-noisy",
79062
+ "motion-calm",
79037
79063
  "recording-stalled",
79038
79064
  "recording-healthy",
79039
79065
  "recording-degraded",
79066
+ ...DEVICE_ATTENTION,
79040
79067
  ...ALARM
79041
79068
  ];
79042
79069
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79204,7 +79231,9 @@ var STATE_SUMMARY_VARS = [
79204
79231
  [...RULE_TEXT],
79205
79232
  [...RULE_TEXT],
79206
79233
  [...RULE_TEXT],
79207
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79234
+ [...RULE_TEXT],
79235
+ [...RULE_TEXT],
79236
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79208
79237
  [...RULE_TEXT],
79209
79238
  [...RULE_TEXT],
79210
79239
  [...RULE_TEXT],
@@ -79226,11 +79255,11 @@ var STATE_SUMMARY_VARS = [
79226
79255
  [...RULE_TEXT],
79227
79256
  [...RULE_TEXT],
79228
79257
  [...RULE_TEXT],
79258
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79229
79259
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79260
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79230
79261
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79231
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79232
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79233
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79262
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79234
79263
  [...RULE_TEXT],
79235
79264
  [...RULE_TEXT],
79236
79265
  [...RULE_TEXT],
@@ -79306,6 +79335,15 @@ new Map([
79306
79335
  snapshotLabel: "Tanks low or full now",
79307
79336
  snapshotSection: "tanks"
79308
79337
  },
79338
+ {
79339
+ id: "motion-noise",
79340
+ family: "device-events",
79341
+ label: "Motion without a subject (constant / calm again)",
79342
+ bad: ["motion-noisy"],
79343
+ recovery: ["motion-calm"],
79344
+ snapshotLabel: "Cameras with constant motion now",
79345
+ snapshotSection: null
79346
+ },
79309
79347
  {
79310
79348
  id: "recording-health",
79311
79349
  family: "device-events",
@@ -79315,6 +79353,15 @@ new Map([
79315
79353
  snapshotLabel: "Recordings stalled now",
79316
79354
  snapshotSection: null
79317
79355
  },
79356
+ {
79357
+ id: "device-attention",
79358
+ family: "device-events",
79359
+ label: "Device needs attention (raised / resolved)",
79360
+ bad: ["device-attention-required"],
79361
+ recovery: ["device-attention-resolved"],
79362
+ snapshotLabel: "Devices needing attention now",
79363
+ snapshotSection: null
79364
+ },
79318
79365
  {
79319
79366
  id: "node-connectivity",
79320
79367
  family: "system",
@@ -85757,7 +85804,7 @@ function buildConnectionFormSchema() {
85757
85804
  id: "transport",
85758
85805
  title: "Transport",
85759
85806
  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.",
85807
+ description: "Local poll connects out to the gateway (recommended). Push listener needs the gateway \"Customized\" upload pointed at this hub.",
85761
85808
  descriptionKey: "provider-ecowitt:connection.s_transport.description",
85762
85809
  columns: 1,
85763
85810
  fields: [{
@@ -85884,7 +85931,7 @@ function buildDiscoveryParamsFormSchema() {
85884
85931
  id: "scan",
85885
85932
  title: "Scan options",
85886
85933
  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.",
85934
+ description: "Leave empty to scan the local subnet; otherwise list broadcast addresses, gateway IPs or CIDRs, comma or newline separated.",
85888
85935
  descriptionKey: "provider-ecowitt:discoveryParams.s_scan.description",
85889
85936
  columns: 1,
85890
85937
  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.143",
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",