@camstack/addon-provider-unifi 0.2.140 → 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
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- //#region ../types/dist/event-category-DOl51-Ij.mjs
2
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -316,6 +316,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
316
316
  */
317
317
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
318
318
  /**
319
+ * A camera's motion source has fired constantly with no subject for an hour
320
+ * (motion duty or session count over the bar, zero detections) — it is not
321
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
322
+ * {@link PipelineMotionCalm}.
323
+ */
324
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
325
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
326
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
327
+ /**
319
328
  * Per-camera pipeline config was mutated by the orchestrator
320
329
  * (3-level settings change via `setAgentAddonDefaults` /
321
330
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -687,6 +696,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
687
696
  EventCategory["BackupRestored"] = "backup.restored";
688
697
  EventCategory["NotificationDispatched"] = "notification.dispatched";
689
698
  EventCategory["NotificationFailed"] = "notification.failed";
699
+ /**
700
+ * A notification rule that cannot work (D905): its stored row does not load,
701
+ * or it still names a device / delivery target the prune CONFIRMED deleted.
702
+ * One edge per rule per distinct set of reasons; never on an unanswered read.
703
+ */
704
+ EventCategory["NotificationRuleBroken"] = "notification.rule-broken";
705
+ /** The clear of {@link NotificationRuleBroken}: the rule loads and names nothing deleted. */
706
+ EventCategory["NotificationRuleRepaired"] = "notification.rule-repaired";
690
707
  EventCategory["DeviceUpdated"] = "device.updated";
691
708
  /**
692
709
  * Transport-level connectivity. Emitted by the device driver when
@@ -5414,7 +5431,7 @@ var ZodIssueCode = {
5414
5431
  var ZodFirstPartyTypeKind;
5415
5432
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5416
5433
  //#endregion
5417
- //#region ../types/dist/sleep-_sV1BE2f.mjs
5434
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5418
5435
  /**
5419
5436
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5420
5437
  * window to float samples (D455).
@@ -7943,7 +7960,7 @@ var EntryDescriptorSchema = object({
7943
7960
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
7944
7961
  fields: record(string(), unknown())
7945
7962
  }).strict();
7946
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
7963
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
7947
7964
  var RecordKindDeclarationSchema = object({
7948
7965
  database: _enum(RECORD_DATABASES).default("settings"),
7949
7966
  class: _enum(RECORD_CLASSES),
@@ -7962,14 +7979,6 @@ var RecordKindDeclarationSchema = object({
7962
7979
  secretPaths: array(string().min(1)).default([]),
7963
7980
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
7964
7981
  secretArrayKeys: record(string(), string()).default({}),
7965
- /**
7966
- * RETIRED (D900): the legacy table a kind adopted from during the records
7967
- * migration. Nothing declares it any more and nothing reads it; the schema
7968
- * still ACCEPTS it because the catalog rows the migration wrote carry it
7969
- * (an orphaned kind is never redeclared) and an addon built before the
7970
- * removal still sends it. Never set it.
7971
- */
7972
- adoptsFrom: string().min(1).optional(),
7973
7982
  /** Kinds that must agree through `transact` sit in one file under one family name. */
7974
7983
  transactFamily: string().min(1).optional(),
7975
7984
  entry: EntryDescriptorSchema.optional()
@@ -12661,17 +12670,6 @@ object({
12661
12670
  createdAt: number(),
12662
12671
  updatedAt: number()
12663
12672
  });
12664
- object({
12665
- id: string(),
12666
- label: string(),
12667
- isAdmin: boolean().default(false),
12668
- allowedProviders: AllowedProviderSchema,
12669
- allowedDevices: AllowedDevicesSchema,
12670
- tokenHash: string(),
12671
- tokenPrefix: string(),
12672
- createdAt: number(),
12673
- lastUsedAt: number().optional()
12674
- });
12675
12673
  object({
12676
12674
  id: string(),
12677
12675
  userId: string(),
@@ -16653,16 +16651,36 @@ var RecordKindStateSchema = _enum([
16653
16651
  var DeclareKindResultSchema = object({
16654
16652
  kindId: number().int(),
16655
16653
  state: RecordKindStateSchema,
16656
- createdIndexes: array(string()),
16657
- /**
16658
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
16659
- * it stays on the wire, null, because an addon built before the removal reads
16660
- * an ABSENT field as "adoption pending" and refuses to start.
16661
- */
16662
- adoptionPending: _null()
16654
+ createdIndexes: array(string())
16663
16655
  });
16664
16656
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
16665
16657
  var SecretRefsList = array(string());
16658
+ /**
16659
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
16660
+ * All ops of one call share ONE database file and ONE `transactFamily`.
16661
+ */
16662
+ var RecordTransactOpSchema = discriminatedUnion("op", [
16663
+ object({
16664
+ op: literal("put"),
16665
+ kind: RecordKindNameSchema,
16666
+ record: RecordInputSchema,
16667
+ ifRev: number().int().min(0).optional()
16668
+ }),
16669
+ object({
16670
+ op: literal("patch"),
16671
+ kind: RecordKindNameSchema,
16672
+ id: RecordIdSchema,
16673
+ data: RecordBodySchema,
16674
+ at: number().int().nullable().optional(),
16675
+ expiresAt: number().int().nullable().optional(),
16676
+ ifRev: number().int().min(1).optional()
16677
+ }),
16678
+ object({
16679
+ op: literal("delete"),
16680
+ kind: RecordKindNameSchema,
16681
+ id: RecordIdSchema
16682
+ })
16683
+ ]);
16666
16684
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
16667
16685
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
16668
16686
  kind: "mutation",
@@ -16769,6 +16787,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
16769
16787
  }), {
16770
16788
  kind: "mutation",
16771
16789
  auth: "admin"
16790
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
16791
+ results: array(object({
16792
+ rev: number().int().nullable(),
16793
+ deleted: boolean()
16794
+ })),
16795
+ releasedRefs: SecretRefsList,
16796
+ secretRefs: SecretRefsList
16797
+ }), {
16798
+ kind: "mutation",
16799
+ auth: "admin"
16772
16800
  }), method(object({
16773
16801
  deviceId: number().int(),
16774
16802
  kinds: array(RecordKindNameSchema).optional()
@@ -42476,9 +42504,13 @@ var NcSystemEventKindSchema = _enum([
42476
42504
  "node-updating",
42477
42505
  "node-inference-unavailable",
42478
42506
  "detection-blind",
42507
+ "motion-noisy",
42508
+ "motion-calm",
42479
42509
  "recording-stalled",
42480
42510
  "recording-healthy",
42481
42511
  "recording-degraded",
42512
+ "device-attention-required",
42513
+ "device-attention-resolved",
42482
42514
  "storage-location-low",
42483
42515
  "storage-location-critical",
42484
42516
  "storage-location-ok",
@@ -42502,6 +42534,8 @@ var NcSystemEventKindSchema = _enum([
42502
42534
  "alert-critical",
42503
42535
  "alert-error",
42504
42536
  "alert-critical-resolved",
42537
+ "rule-broken",
42538
+ "rule-repaired",
42505
42539
  "camera-online",
42506
42540
  "camera-offline",
42507
42541
  "camera-disabled",
@@ -55817,6 +55851,16 @@ var DishwasherStatusSchema = object({
55817
55851
  powerState: string().nullable(),
55818
55852
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55819
55853
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55854
+ /**
55855
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55856
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
55857
+ * when none is reported. A cleared reminder is not an unknown one.
55858
+ */
55859
+ filterCleaningDue: boolean().nullable(),
55860
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
55861
+ machineCareDue: boolean().nullable(),
55862
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
55863
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
55820
55864
  /** Option states: null when the appliance does not expose the option or has not said. */
55821
55865
  halfLoad: boolean().nullable(),
55822
55866
  hygienePlus: boolean().nullable(),
@@ -64467,16 +64511,6 @@ var UpdateUserInputSchema = object({
64467
64511
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64468
64512
  scopes: array(TokenScopeSchema).optional()
64469
64513
  });
64470
- var ApiKeySummarySchema = object({
64471
- id: string(),
64472
- label: string(),
64473
- isAdmin: boolean().default(false),
64474
- allowedProviders: union([array(string()), literal("*")]).optional(),
64475
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64476
- tokenPrefix: string(),
64477
- createdAt: number(),
64478
- lastUsedAt: number().optional()
64479
- });
64480
64514
  var OauthSessionSummarySchema = object({
64481
64515
  id: string(),
64482
64516
  userId: string(),
@@ -64498,8 +64532,7 @@ var TotpStatusSchema = object({
64498
64532
  confirmedAt: number().nullable()
64499
64533
  });
64500
64534
  /**
64501
- * user-management — singleton capability for user accounts and the
64502
- * legacy API-key rows.
64535
+ * user-management — singleton capability for user accounts.
64503
64536
  *
64504
64537
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64505
64538
  * — the subset check on `setUserScopes` is moot
@@ -64555,10 +64588,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64555
64588
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
64556
64589
  kind: "mutation",
64557
64590
  access: "view"
64558
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
64559
- kind: "mutation",
64560
- auth: "admin",
64561
- access: "delete"
64562
64591
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
64563
64592
  kind: "mutation",
64564
64593
  auth: "admin",
@@ -74014,6 +74043,12 @@ Object.freeze({
74014
74043
  addonId: null,
74015
74044
  access: "view"
74016
74045
  },
74046
+ "records.transact": {
74047
+ capName: "records",
74048
+ capScope: "system",
74049
+ addonId: null,
74050
+ access: "create"
74051
+ },
74017
74052
  "sceneMonitor.captureReference": {
74018
74053
  capName: "scene-monitor",
74019
74054
  capScope: "device",
@@ -75346,12 +75381,6 @@ Object.freeze({
75346
75381
  addonId: null,
75347
75382
  access: "view"
75348
75383
  },
75349
- "userManagement.listApiKeys": {
75350
- capName: "user-management",
75351
- capScope: "system",
75352
- addonId: null,
75353
- access: "view"
75354
- },
75355
75384
  "userManagement.listExternalIdentities": {
75356
75385
  capName: "user-management",
75357
75386
  capScope: "system",
@@ -75406,12 +75435,6 @@ Object.freeze({
75406
75435
  addonId: null,
75407
75436
  access: "create"
75408
75437
  },
75409
- "userManagement.revokeApiKey": {
75410
- capName: "user-management",
75411
- capScope: "system",
75412
- addonId: null,
75413
- access: "delete"
75414
- },
75415
75438
  "userManagement.revokeOauthSession": {
75416
75439
  capName: "user-management",
75417
75440
  capScope: "system",
@@ -78776,9 +78799,13 @@ new Map(Object.entries({
78776
78799
  "stream-online": "device-events",
78777
78800
  "stream-offline": "device-events",
78778
78801
  "detection-blind": "device-events",
78802
+ "motion-noisy": "device-events",
78803
+ "motion-calm": "device-events",
78779
78804
  "recording-stalled": "device-events",
78780
78805
  "recording-healthy": "device-events",
78781
78806
  "recording-degraded": "device-events",
78807
+ "device-attention-required": "device-events",
78808
+ "device-attention-resolved": "device-events",
78782
78809
  "node-online": "system",
78783
78810
  "node-offline": "system",
78784
78811
  "node-restarting": "system",
@@ -78795,6 +78822,8 @@ new Map(Object.entries({
78795
78822
  "alert-critical": "system",
78796
78823
  "alert-error": "system",
78797
78824
  "alert-critical-resolved": "system",
78825
+ "rule-broken": "system",
78826
+ "rule-repaired": "system",
78798
78827
  "storage-location-low": "system",
78799
78828
  "storage-location-critical": "system",
78800
78829
  "storage-location-ok": "system",
@@ -78859,6 +78888,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78859
78888
  label: "Detecting nothing",
78860
78889
  kinds: ["detection-blind"]
78861
78890
  },
78891
+ {
78892
+ id: "motion-noise",
78893
+ family: "device-events",
78894
+ label: "Motion without a subject",
78895
+ kinds: ["motion-noisy", "motion-calm"]
78896
+ },
78862
78897
  {
78863
78898
  id: "recording",
78864
78899
  family: "device-events",
@@ -78869,6 +78904,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78869
78904
  "recording-degraded"
78870
78905
  ]
78871
78906
  },
78907
+ {
78908
+ id: "device-attention",
78909
+ family: "device-events",
78910
+ label: "Needs attention",
78911
+ kinds: ["device-attention-required", "device-attention-resolved"]
78912
+ },
78872
78913
  {
78873
78914
  id: "nodes",
78874
78915
  family: "system",
@@ -78929,6 +78970,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78929
78970
  "alert-critical-resolved"
78930
78971
  ]
78931
78972
  },
78973
+ {
78974
+ id: "rule-health",
78975
+ family: "system",
78976
+ label: "Notification rules",
78977
+ kinds: ["rule-broken", "rule-repaired"]
78978
+ },
78932
78979
  {
78933
78980
  id: "alarm",
78934
78981
  family: "alarm",
@@ -79002,6 +79049,7 @@ var ALERT_EPISODE = [
79002
79049
  "alert-error",
79003
79050
  "alert-critical-resolved"
79004
79051
  ];
79052
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79005
79053
  var UPDATES = [
79006
79054
  "addon-update-available",
79007
79055
  "server-update-available",
@@ -79031,9 +79079,12 @@ var DEVICE_EVENTS = [
79031
79079
  "stream-online",
79032
79080
  "stream-offline",
79033
79081
  "detection-blind",
79082
+ "motion-noisy",
79083
+ "motion-calm",
79034
79084
  "recording-stalled",
79035
79085
  "recording-healthy",
79036
79086
  "recording-degraded",
79087
+ ...DEVICE_ATTENTION,
79037
79088
  ...ALARM
79038
79089
  ];
79039
79090
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79201,7 +79252,13 @@ var STATE_SUMMARY_VARS = [
79201
79252
  [...RULE_TEXT],
79202
79253
  [...RULE_TEXT],
79203
79254
  [...RULE_TEXT],
79204
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79255
+ [...RULE_TEXT],
79256
+ [...RULE_TEXT],
79257
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79258
+ [...RULE_TEXT],
79259
+ [...RULE_TEXT],
79260
+ [...RULE_TEXT],
79261
+ [...RULE_TEXT],
79205
79262
  [...RULE_TEXT],
79206
79263
  [...RULE_TEXT],
79207
79264
  [...RULE_TEXT],
@@ -79219,11 +79276,11 @@ var STATE_SUMMARY_VARS = [
79219
79276
  [...RULE_TEXT],
79220
79277
  [...RULE_TEXT],
79221
79278
  [...RULE_TEXT],
79279
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79222
79280
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79281
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79223
79282
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79224
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79225
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79226
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79283
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79227
79284
  [...RULE_TEXT],
79228
79285
  [...RULE_TEXT],
79229
79286
  [...RULE_TEXT],
@@ -79244,6 +79301,125 @@ var STATE_SUMMARY_VARS = [
79244
79301
  [...RULE_TEXT],
79245
79302
  ...STATE_SUMMARY_VARS
79246
79303
  ];
79304
+ new Map([
79305
+ {
79306
+ id: "device-connectivity",
79307
+ family: "device-events",
79308
+ label: "Device connectivity (offline / back online)",
79309
+ bad: ["device-offline"],
79310
+ recovery: ["device-online"],
79311
+ snapshotLabel: "Devices offline now",
79312
+ snapshotSection: "device-state"
79313
+ },
79314
+ {
79315
+ id: "device-switch",
79316
+ family: "device-events",
79317
+ label: "Device switched off / back on",
79318
+ bad: ["device-disabled"],
79319
+ recovery: ["device-enabled"],
79320
+ snapshotLabel: "Devices switched off now",
79321
+ snapshotSection: "device-state"
79322
+ },
79323
+ {
79324
+ id: "stream-connectivity",
79325
+ family: "device-events",
79326
+ label: "Stream connectivity (offline / back online)",
79327
+ bad: ["stream-offline"],
79328
+ recovery: ["stream-online"],
79329
+ snapshotLabel: "Streams offline now",
79330
+ snapshotSection: "streams"
79331
+ },
79332
+ {
79333
+ id: "battery",
79334
+ family: "device-events",
79335
+ label: "Battery (low / back to normal)",
79336
+ bad: ["device-battery-low"],
79337
+ recovery: ["device-battery-normal"],
79338
+ snapshotLabel: "Batteries low now",
79339
+ snapshotSection: "battery"
79340
+ },
79341
+ {
79342
+ id: "consumables",
79343
+ family: "device-events",
79344
+ label: "Consumables (low / replaced)",
79345
+ bad: ["device-consumable-low"],
79346
+ recovery: ["device-consumable-normal"],
79347
+ snapshotLabel: "Consumables low now",
79348
+ snapshotSection: "consumables"
79349
+ },
79350
+ {
79351
+ id: "tanks",
79352
+ family: "device-events",
79353
+ label: "Tanks (low or full / back to normal)",
79354
+ bad: ["device-tank-low", "device-tank-full"],
79355
+ recovery: ["device-tank-normal"],
79356
+ snapshotLabel: "Tanks low or full now",
79357
+ snapshotSection: "tanks"
79358
+ },
79359
+ {
79360
+ id: "motion-noise",
79361
+ family: "device-events",
79362
+ label: "Motion without a subject (constant / calm again)",
79363
+ bad: ["motion-noisy"],
79364
+ recovery: ["motion-calm"],
79365
+ snapshotLabel: "Cameras with constant motion now",
79366
+ snapshotSection: null
79367
+ },
79368
+ {
79369
+ id: "recording-health",
79370
+ family: "device-events",
79371
+ label: "Recording health (stalled or degraded / recording again)",
79372
+ bad: ["recording-stalled", "recording-degraded"],
79373
+ recovery: ["recording-healthy"],
79374
+ snapshotLabel: "Recordings stalled now",
79375
+ snapshotSection: null
79376
+ },
79377
+ {
79378
+ id: "device-attention",
79379
+ family: "device-events",
79380
+ label: "Device needs attention (raised / resolved)",
79381
+ bad: ["device-attention-required"],
79382
+ recovery: ["device-attention-resolved"],
79383
+ snapshotLabel: "Devices needing attention now",
79384
+ snapshotSection: null
79385
+ },
79386
+ {
79387
+ id: "node-connectivity",
79388
+ family: "system",
79389
+ label: "Node connectivity (offline / back online)",
79390
+ bad: ["node-offline"],
79391
+ recovery: ["node-online"],
79392
+ snapshotLabel: "Nodes offline now",
79393
+ snapshotSection: "nodes"
79394
+ },
79395
+ {
79396
+ id: "storage-space",
79397
+ family: "system",
79398
+ label: "Storage space (low or critical / ok again)",
79399
+ bad: ["storage-location-low", "storage-location-critical"],
79400
+ recovery: ["storage-location-ok"],
79401
+ snapshotLabel: "Storage locations low now",
79402
+ snapshotSection: null
79403
+ },
79404
+ {
79405
+ id: "critical-alerts",
79406
+ family: "system",
79407
+ label: "Critical alerts (raised / resolved)",
79408
+ bad: ["alert-critical"],
79409
+ recovery: ["alert-critical-resolved"],
79410
+ snapshotLabel: "Critical alerts open now",
79411
+ snapshotSection: null
79412
+ },
79413
+ {
79414
+ id: "rule-health",
79415
+ family: "system",
79416
+ label: "Rule health (broken / repaired)",
79417
+ bad: ["rule-broken"],
79418
+ recovery: ["rule-repaired"],
79419
+ snapshotLabel: "Notification rules broken now",
79420
+ snapshotSection: null
79421
+ }
79422
+ ].flatMap((spec) => [...spec.bad, ...spec.recovery].map((kind) => [kind, spec])));
79247
79423
  new Set([
79248
79424
  "disarmed",
79249
79425
  "armed_home",
@@ -79921,7 +80097,7 @@ function buildControllerFormSchema() {
79921
80097
  id: "connection",
79922
80098
  title: "Connection",
79923
80099
  titleKey: "provider-unifi:controller.s_connection.title",
79924
- description: "CamStack connects to the UniFi Network controller over the local network and polls its infra devices + network clients. Authenticate with a UniFi OS API key (preferred) or a local admin username + password. Cameras / Protect are not accessed.",
80100
+ description: "Authenticate with a UniFi OS API key (preferred) or a local admin username and password.",
79925
80101
  descriptionKey: "provider-unifi:controller.s_connection.description",
79926
80102
  columns: 2,
79927
80103
  fields: [
package/dist/addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- //#region ../types/dist/event-category-DOl51-Ij.mjs
1
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
2
2
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
3
3
  EventCategory["SystemBoot"] = "system.boot";
4
4
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -315,6 +315,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
315
315
  */
316
316
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
317
317
  /**
318
+ * A camera's motion source has fired constantly with no subject for an hour
319
+ * (motion duty or session count over the bar, zero detections) — it is not
320
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
321
+ * {@link PipelineMotionCalm}.
322
+ */
323
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
324
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
325
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
326
+ /**
318
327
  * Per-camera pipeline config was mutated by the orchestrator
319
328
  * (3-level settings change via `setAgentAddonDefaults` /
320
329
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -686,6 +695,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
686
695
  EventCategory["BackupRestored"] = "backup.restored";
687
696
  EventCategory["NotificationDispatched"] = "notification.dispatched";
688
697
  EventCategory["NotificationFailed"] = "notification.failed";
698
+ /**
699
+ * A notification rule that cannot work (D905): its stored row does not load,
700
+ * or it still names a device / delivery target the prune CONFIRMED deleted.
701
+ * One edge per rule per distinct set of reasons; never on an unanswered read.
702
+ */
703
+ EventCategory["NotificationRuleBroken"] = "notification.rule-broken";
704
+ /** The clear of {@link NotificationRuleBroken}: the rule loads and names nothing deleted. */
705
+ EventCategory["NotificationRuleRepaired"] = "notification.rule-repaired";
689
706
  EventCategory["DeviceUpdated"] = "device.updated";
690
707
  /**
691
708
  * Transport-level connectivity. Emitted by the device driver when
@@ -5413,7 +5430,7 @@ var ZodIssueCode = {
5413
5430
  var ZodFirstPartyTypeKind;
5414
5431
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5415
5432
  //#endregion
5416
- //#region ../types/dist/sleep-_sV1BE2f.mjs
5433
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5417
5434
  /**
5418
5435
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5419
5436
  * window to float samples (D455).
@@ -7942,7 +7959,7 @@ var EntryDescriptorSchema = object({
7942
7959
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
7943
7960
  fields: record(string(), unknown())
7944
7961
  }).strict();
7945
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
7962
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
7946
7963
  var RecordKindDeclarationSchema = object({
7947
7964
  database: _enum(RECORD_DATABASES).default("settings"),
7948
7965
  class: _enum(RECORD_CLASSES),
@@ -7961,14 +7978,6 @@ var RecordKindDeclarationSchema = object({
7961
7978
  secretPaths: array(string().min(1)).default([]),
7962
7979
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
7963
7980
  secretArrayKeys: record(string(), string()).default({}),
7964
- /**
7965
- * RETIRED (D900): the legacy table a kind adopted from during the records
7966
- * migration. Nothing declares it any more and nothing reads it; the schema
7967
- * still ACCEPTS it because the catalog rows the migration wrote carry it
7968
- * (an orphaned kind is never redeclared) and an addon built before the
7969
- * removal still sends it. Never set it.
7970
- */
7971
- adoptsFrom: string().min(1).optional(),
7972
7981
  /** Kinds that must agree through `transact` sit in one file under one family name. */
7973
7982
  transactFamily: string().min(1).optional(),
7974
7983
  entry: EntryDescriptorSchema.optional()
@@ -12660,17 +12669,6 @@ object({
12660
12669
  createdAt: number(),
12661
12670
  updatedAt: number()
12662
12671
  });
12663
- object({
12664
- id: string(),
12665
- label: string(),
12666
- isAdmin: boolean().default(false),
12667
- allowedProviders: AllowedProviderSchema,
12668
- allowedDevices: AllowedDevicesSchema,
12669
- tokenHash: string(),
12670
- tokenPrefix: string(),
12671
- createdAt: number(),
12672
- lastUsedAt: number().optional()
12673
- });
12674
12672
  object({
12675
12673
  id: string(),
12676
12674
  userId: string(),
@@ -16652,16 +16650,36 @@ var RecordKindStateSchema = _enum([
16652
16650
  var DeclareKindResultSchema = object({
16653
16651
  kindId: number().int(),
16654
16652
  state: RecordKindStateSchema,
16655
- createdIndexes: array(string()),
16656
- /**
16657
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
16658
- * it stays on the wire, null, because an addon built before the removal reads
16659
- * an ABSENT field as "adoption pending" and refuses to start.
16660
- */
16661
- adoptionPending: _null()
16653
+ createdIndexes: array(string())
16662
16654
  });
16663
16655
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
16664
16656
  var SecretRefsList = array(string());
16657
+ /**
16658
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
16659
+ * All ops of one call share ONE database file and ONE `transactFamily`.
16660
+ */
16661
+ var RecordTransactOpSchema = discriminatedUnion("op", [
16662
+ object({
16663
+ op: literal("put"),
16664
+ kind: RecordKindNameSchema,
16665
+ record: RecordInputSchema,
16666
+ ifRev: number().int().min(0).optional()
16667
+ }),
16668
+ object({
16669
+ op: literal("patch"),
16670
+ kind: RecordKindNameSchema,
16671
+ id: RecordIdSchema,
16672
+ data: RecordBodySchema,
16673
+ at: number().int().nullable().optional(),
16674
+ expiresAt: number().int().nullable().optional(),
16675
+ ifRev: number().int().min(1).optional()
16676
+ }),
16677
+ object({
16678
+ op: literal("delete"),
16679
+ kind: RecordKindNameSchema,
16680
+ id: RecordIdSchema
16681
+ })
16682
+ ]);
16665
16683
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
16666
16684
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
16667
16685
  kind: "mutation",
@@ -16768,6 +16786,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
16768
16786
  }), {
16769
16787
  kind: "mutation",
16770
16788
  auth: "admin"
16789
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
16790
+ results: array(object({
16791
+ rev: number().int().nullable(),
16792
+ deleted: boolean()
16793
+ })),
16794
+ releasedRefs: SecretRefsList,
16795
+ secretRefs: SecretRefsList
16796
+ }), {
16797
+ kind: "mutation",
16798
+ auth: "admin"
16771
16799
  }), method(object({
16772
16800
  deviceId: number().int(),
16773
16801
  kinds: array(RecordKindNameSchema).optional()
@@ -42475,9 +42503,13 @@ var NcSystemEventKindSchema = _enum([
42475
42503
  "node-updating",
42476
42504
  "node-inference-unavailable",
42477
42505
  "detection-blind",
42506
+ "motion-noisy",
42507
+ "motion-calm",
42478
42508
  "recording-stalled",
42479
42509
  "recording-healthy",
42480
42510
  "recording-degraded",
42511
+ "device-attention-required",
42512
+ "device-attention-resolved",
42481
42513
  "storage-location-low",
42482
42514
  "storage-location-critical",
42483
42515
  "storage-location-ok",
@@ -42501,6 +42533,8 @@ var NcSystemEventKindSchema = _enum([
42501
42533
  "alert-critical",
42502
42534
  "alert-error",
42503
42535
  "alert-critical-resolved",
42536
+ "rule-broken",
42537
+ "rule-repaired",
42504
42538
  "camera-online",
42505
42539
  "camera-offline",
42506
42540
  "camera-disabled",
@@ -55816,6 +55850,16 @@ var DishwasherStatusSchema = object({
55816
55850
  powerState: string().nullable(),
55817
55851
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55818
55852
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55853
+ /**
55854
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55855
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
55856
+ * when none is reported. A cleared reminder is not an unknown one.
55857
+ */
55858
+ filterCleaningDue: boolean().nullable(),
55859
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
55860
+ machineCareDue: boolean().nullable(),
55861
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
55862
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
55819
55863
  /** Option states: null when the appliance does not expose the option or has not said. */
55820
55864
  halfLoad: boolean().nullable(),
55821
55865
  hygienePlus: boolean().nullable(),
@@ -64466,16 +64510,6 @@ var UpdateUserInputSchema = object({
64466
64510
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64467
64511
  scopes: array(TokenScopeSchema).optional()
64468
64512
  });
64469
- var ApiKeySummarySchema = object({
64470
- id: string(),
64471
- label: string(),
64472
- isAdmin: boolean().default(false),
64473
- allowedProviders: union([array(string()), literal("*")]).optional(),
64474
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64475
- tokenPrefix: string(),
64476
- createdAt: number(),
64477
- lastUsedAt: number().optional()
64478
- });
64479
64513
  var OauthSessionSummarySchema = object({
64480
64514
  id: string(),
64481
64515
  userId: string(),
@@ -64497,8 +64531,7 @@ var TotpStatusSchema = object({
64497
64531
  confirmedAt: number().nullable()
64498
64532
  });
64499
64533
  /**
64500
- * user-management — singleton capability for user accounts and the
64501
- * legacy API-key rows.
64534
+ * user-management — singleton capability for user accounts.
64502
64535
  *
64503
64536
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64504
64537
  * — the subset check on `setUserScopes` is moot
@@ -64554,10 +64587,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64554
64587
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
64555
64588
  kind: "mutation",
64556
64589
  access: "view"
64557
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
64558
- kind: "mutation",
64559
- auth: "admin",
64560
- access: "delete"
64561
64590
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
64562
64591
  kind: "mutation",
64563
64592
  auth: "admin",
@@ -74013,6 +74042,12 @@ Object.freeze({
74013
74042
  addonId: null,
74014
74043
  access: "view"
74015
74044
  },
74045
+ "records.transact": {
74046
+ capName: "records",
74047
+ capScope: "system",
74048
+ addonId: null,
74049
+ access: "create"
74050
+ },
74016
74051
  "sceneMonitor.captureReference": {
74017
74052
  capName: "scene-monitor",
74018
74053
  capScope: "device",
@@ -75345,12 +75380,6 @@ Object.freeze({
75345
75380
  addonId: null,
75346
75381
  access: "view"
75347
75382
  },
75348
- "userManagement.listApiKeys": {
75349
- capName: "user-management",
75350
- capScope: "system",
75351
- addonId: null,
75352
- access: "view"
75353
- },
75354
75383
  "userManagement.listExternalIdentities": {
75355
75384
  capName: "user-management",
75356
75385
  capScope: "system",
@@ -75405,12 +75434,6 @@ Object.freeze({
75405
75434
  addonId: null,
75406
75435
  access: "create"
75407
75436
  },
75408
- "userManagement.revokeApiKey": {
75409
- capName: "user-management",
75410
- capScope: "system",
75411
- addonId: null,
75412
- access: "delete"
75413
- },
75414
75437
  "userManagement.revokeOauthSession": {
75415
75438
  capName: "user-management",
75416
75439
  capScope: "system",
@@ -78775,9 +78798,13 @@ new Map(Object.entries({
78775
78798
  "stream-online": "device-events",
78776
78799
  "stream-offline": "device-events",
78777
78800
  "detection-blind": "device-events",
78801
+ "motion-noisy": "device-events",
78802
+ "motion-calm": "device-events",
78778
78803
  "recording-stalled": "device-events",
78779
78804
  "recording-healthy": "device-events",
78780
78805
  "recording-degraded": "device-events",
78806
+ "device-attention-required": "device-events",
78807
+ "device-attention-resolved": "device-events",
78781
78808
  "node-online": "system",
78782
78809
  "node-offline": "system",
78783
78810
  "node-restarting": "system",
@@ -78794,6 +78821,8 @@ new Map(Object.entries({
78794
78821
  "alert-critical": "system",
78795
78822
  "alert-error": "system",
78796
78823
  "alert-critical-resolved": "system",
78824
+ "rule-broken": "system",
78825
+ "rule-repaired": "system",
78797
78826
  "storage-location-low": "system",
78798
78827
  "storage-location-critical": "system",
78799
78828
  "storage-location-ok": "system",
@@ -78858,6 +78887,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78858
78887
  label: "Detecting nothing",
78859
78888
  kinds: ["detection-blind"]
78860
78889
  },
78890
+ {
78891
+ id: "motion-noise",
78892
+ family: "device-events",
78893
+ label: "Motion without a subject",
78894
+ kinds: ["motion-noisy", "motion-calm"]
78895
+ },
78861
78896
  {
78862
78897
  id: "recording",
78863
78898
  family: "device-events",
@@ -78868,6 +78903,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78868
78903
  "recording-degraded"
78869
78904
  ]
78870
78905
  },
78906
+ {
78907
+ id: "device-attention",
78908
+ family: "device-events",
78909
+ label: "Needs attention",
78910
+ kinds: ["device-attention-required", "device-attention-resolved"]
78911
+ },
78871
78912
  {
78872
78913
  id: "nodes",
78873
78914
  family: "system",
@@ -78928,6 +78969,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78928
78969
  "alert-critical-resolved"
78929
78970
  ]
78930
78971
  },
78972
+ {
78973
+ id: "rule-health",
78974
+ family: "system",
78975
+ label: "Notification rules",
78976
+ kinds: ["rule-broken", "rule-repaired"]
78977
+ },
78931
78978
  {
78932
78979
  id: "alarm",
78933
78980
  family: "alarm",
@@ -79001,6 +79048,7 @@ var ALERT_EPISODE = [
79001
79048
  "alert-error",
79002
79049
  "alert-critical-resolved"
79003
79050
  ];
79051
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79004
79052
  var UPDATES = [
79005
79053
  "addon-update-available",
79006
79054
  "server-update-available",
@@ -79030,9 +79078,12 @@ var DEVICE_EVENTS = [
79030
79078
  "stream-online",
79031
79079
  "stream-offline",
79032
79080
  "detection-blind",
79081
+ "motion-noisy",
79082
+ "motion-calm",
79033
79083
  "recording-stalled",
79034
79084
  "recording-healthy",
79035
79085
  "recording-degraded",
79086
+ ...DEVICE_ATTENTION,
79036
79087
  ...ALARM
79037
79088
  ];
79038
79089
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79200,7 +79251,13 @@ var STATE_SUMMARY_VARS = [
79200
79251
  [...RULE_TEXT],
79201
79252
  [...RULE_TEXT],
79202
79253
  [...RULE_TEXT],
79203
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79254
+ [...RULE_TEXT],
79255
+ [...RULE_TEXT],
79256
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79257
+ [...RULE_TEXT],
79258
+ [...RULE_TEXT],
79259
+ [...RULE_TEXT],
79260
+ [...RULE_TEXT],
79204
79261
  [...RULE_TEXT],
79205
79262
  [...RULE_TEXT],
79206
79263
  [...RULE_TEXT],
@@ -79218,11 +79275,11 @@ var STATE_SUMMARY_VARS = [
79218
79275
  [...RULE_TEXT],
79219
79276
  [...RULE_TEXT],
79220
79277
  [...RULE_TEXT],
79278
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79221
79279
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79280
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79222
79281
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79223
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79224
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79225
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79282
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79226
79283
  [...RULE_TEXT],
79227
79284
  [...RULE_TEXT],
79228
79285
  [...RULE_TEXT],
@@ -79243,6 +79300,125 @@ var STATE_SUMMARY_VARS = [
79243
79300
  [...RULE_TEXT],
79244
79301
  ...STATE_SUMMARY_VARS
79245
79302
  ];
79303
+ new Map([
79304
+ {
79305
+ id: "device-connectivity",
79306
+ family: "device-events",
79307
+ label: "Device connectivity (offline / back online)",
79308
+ bad: ["device-offline"],
79309
+ recovery: ["device-online"],
79310
+ snapshotLabel: "Devices offline now",
79311
+ snapshotSection: "device-state"
79312
+ },
79313
+ {
79314
+ id: "device-switch",
79315
+ family: "device-events",
79316
+ label: "Device switched off / back on",
79317
+ bad: ["device-disabled"],
79318
+ recovery: ["device-enabled"],
79319
+ snapshotLabel: "Devices switched off now",
79320
+ snapshotSection: "device-state"
79321
+ },
79322
+ {
79323
+ id: "stream-connectivity",
79324
+ family: "device-events",
79325
+ label: "Stream connectivity (offline / back online)",
79326
+ bad: ["stream-offline"],
79327
+ recovery: ["stream-online"],
79328
+ snapshotLabel: "Streams offline now",
79329
+ snapshotSection: "streams"
79330
+ },
79331
+ {
79332
+ id: "battery",
79333
+ family: "device-events",
79334
+ label: "Battery (low / back to normal)",
79335
+ bad: ["device-battery-low"],
79336
+ recovery: ["device-battery-normal"],
79337
+ snapshotLabel: "Batteries low now",
79338
+ snapshotSection: "battery"
79339
+ },
79340
+ {
79341
+ id: "consumables",
79342
+ family: "device-events",
79343
+ label: "Consumables (low / replaced)",
79344
+ bad: ["device-consumable-low"],
79345
+ recovery: ["device-consumable-normal"],
79346
+ snapshotLabel: "Consumables low now",
79347
+ snapshotSection: "consumables"
79348
+ },
79349
+ {
79350
+ id: "tanks",
79351
+ family: "device-events",
79352
+ label: "Tanks (low or full / back to normal)",
79353
+ bad: ["device-tank-low", "device-tank-full"],
79354
+ recovery: ["device-tank-normal"],
79355
+ snapshotLabel: "Tanks low or full now",
79356
+ snapshotSection: "tanks"
79357
+ },
79358
+ {
79359
+ id: "motion-noise",
79360
+ family: "device-events",
79361
+ label: "Motion without a subject (constant / calm again)",
79362
+ bad: ["motion-noisy"],
79363
+ recovery: ["motion-calm"],
79364
+ snapshotLabel: "Cameras with constant motion now",
79365
+ snapshotSection: null
79366
+ },
79367
+ {
79368
+ id: "recording-health",
79369
+ family: "device-events",
79370
+ label: "Recording health (stalled or degraded / recording again)",
79371
+ bad: ["recording-stalled", "recording-degraded"],
79372
+ recovery: ["recording-healthy"],
79373
+ snapshotLabel: "Recordings stalled now",
79374
+ snapshotSection: null
79375
+ },
79376
+ {
79377
+ id: "device-attention",
79378
+ family: "device-events",
79379
+ label: "Device needs attention (raised / resolved)",
79380
+ bad: ["device-attention-required"],
79381
+ recovery: ["device-attention-resolved"],
79382
+ snapshotLabel: "Devices needing attention now",
79383
+ snapshotSection: null
79384
+ },
79385
+ {
79386
+ id: "node-connectivity",
79387
+ family: "system",
79388
+ label: "Node connectivity (offline / back online)",
79389
+ bad: ["node-offline"],
79390
+ recovery: ["node-online"],
79391
+ snapshotLabel: "Nodes offline now",
79392
+ snapshotSection: "nodes"
79393
+ },
79394
+ {
79395
+ id: "storage-space",
79396
+ family: "system",
79397
+ label: "Storage space (low or critical / ok again)",
79398
+ bad: ["storage-location-low", "storage-location-critical"],
79399
+ recovery: ["storage-location-ok"],
79400
+ snapshotLabel: "Storage locations low now",
79401
+ snapshotSection: null
79402
+ },
79403
+ {
79404
+ id: "critical-alerts",
79405
+ family: "system",
79406
+ label: "Critical alerts (raised / resolved)",
79407
+ bad: ["alert-critical"],
79408
+ recovery: ["alert-critical-resolved"],
79409
+ snapshotLabel: "Critical alerts open now",
79410
+ snapshotSection: null
79411
+ },
79412
+ {
79413
+ id: "rule-health",
79414
+ family: "system",
79415
+ label: "Rule health (broken / repaired)",
79416
+ bad: ["rule-broken"],
79417
+ recovery: ["rule-repaired"],
79418
+ snapshotLabel: "Notification rules broken now",
79419
+ snapshotSection: null
79420
+ }
79421
+ ].flatMap((spec) => [...spec.bad, ...spec.recovery].map((kind) => [kind, spec])));
79246
79422
  new Set([
79247
79423
  "disarmed",
79248
79424
  "armed_home",
@@ -79920,7 +80096,7 @@ function buildControllerFormSchema() {
79920
80096
  id: "connection",
79921
80097
  title: "Connection",
79922
80098
  titleKey: "provider-unifi:controller.s_connection.title",
79923
- description: "CamStack connects to the UniFi Network controller over the local network and polls its infra devices + network clients. Authenticate with a UniFi OS API key (preferred) or a local admin username + password. Cameras / Protect are not accessed.",
80099
+ description: "Authenticate with a UniFi OS API key (preferred) or a local admin username and password.",
79924
80100
  descriptionKey: "provider-unifi:controller.s_connection.description",
79925
80101
  columns: 2,
79926
80102
  fields: [
package/i18n/en.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "controller.s_identity.title": "Controller",
3
3
  "controller.s_identity.name.label": "Name",
4
4
  "controller.s_connection.title": "Connection",
5
- "controller.s_connection.description": "CamStack connects to the UniFi Network controller over the local network and polls its infra devices + network clients. Authenticate with a UniFi OS API key (preferred) or a local admin username + password. Cameras / Protect are not accessed.",
5
+ "controller.s_connection.description": "Authenticate with a UniFi OS API key (preferred) or a local admin username and password.",
6
6
  "controller.s_connection.host.label": "Controller host / IP",
7
7
  "controller.s_connection.port.label": "HTTPS port",
8
8
  "controller.s_connection.apiKey.label": "API key",
package/i18n/it.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "controller.s_identity.title": "Controller",
3
3
  "controller.s_identity.name.label": "Nome",
4
4
  "controller.s_connection.title": "Connessione",
5
- "controller.s_connection.description": "CamStack si collega al controller UniFi Network in rete locale e legge i dispositivi di rete e i client. Autenticati con una API key UniFi OS (preferita) oppure con nome utente e password di un amministratore locale. Telecamere e Protect non vengono usati.",
5
+ "controller.s_connection.description": "Autenticati con una API key UniFi OS (consigliata) o con utente e password di un admin locale.",
6
6
  "controller.s_connection.host.label": "Host / IP del controller",
7
7
  "controller.s_connection.port.label": "Porta HTTPS",
8
8
  "controller.s_connection.apiKey.label": "API key",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-unifi",
3
- "version": "0.2.140",
3
+ "version": "0.2.142",
4
4
  "description": "UniFi Network controller device-provider addon for CamStack — local-controller infra switches/APs (as containers) + network-client presence. NO cameras/Protect.",
5
5
  "keywords": [
6
6
  "camstack",