@camstack/addon-provider-unraid 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
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- //#region ../types/dist/event-category-7pZEBmVg.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
@@ -5422,7 +5431,7 @@ var ZodIssueCode = {
5422
5431
  var ZodFirstPartyTypeKind;
5423
5432
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5424
5433
  //#endregion
5425
- //#region ../types/dist/sleep-CueztlR1.mjs
5434
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5426
5435
  /**
5427
5436
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5428
5437
  * window to float samples (D455).
@@ -7951,7 +7960,7 @@ var EntryDescriptorSchema = object({
7951
7960
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
7952
7961
  fields: record(string(), unknown())
7953
7962
  }).strict();
7954
- /** 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. */
7955
7964
  var RecordKindDeclarationSchema = object({
7956
7965
  database: _enum(RECORD_DATABASES).default("settings"),
7957
7966
  class: _enum(RECORD_CLASSES),
@@ -7970,14 +7979,6 @@ var RecordKindDeclarationSchema = object({
7970
7979
  secretPaths: array(string().min(1)).default([]),
7971
7980
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
7972
7981
  secretArrayKeys: record(string(), string()).default({}),
7973
- /**
7974
- * RETIRED (D900): the legacy table a kind adopted from during the records
7975
- * migration. Nothing declares it any more and nothing reads it; the schema
7976
- * still ACCEPTS it because the catalog rows the migration wrote carry it
7977
- * (an orphaned kind is never redeclared) and an addon built before the
7978
- * removal still sends it. Never set it.
7979
- */
7980
- adoptsFrom: string().min(1).optional(),
7981
7982
  /** Kinds that must agree through `transact` sit in one file under one family name. */
7982
7983
  transactFamily: string().min(1).optional(),
7983
7984
  entry: EntryDescriptorSchema.optional()
@@ -12669,17 +12670,6 @@ object({
12669
12670
  createdAt: number(),
12670
12671
  updatedAt: number()
12671
12672
  });
12672
- object({
12673
- id: string(),
12674
- label: string(),
12675
- isAdmin: boolean().default(false),
12676
- allowedProviders: AllowedProviderSchema,
12677
- allowedDevices: AllowedDevicesSchema,
12678
- tokenHash: string(),
12679
- tokenPrefix: string(),
12680
- createdAt: number(),
12681
- lastUsedAt: number().optional()
12682
- });
12683
12673
  object({
12684
12674
  id: string(),
12685
12675
  userId: string(),
@@ -16661,16 +16651,36 @@ var RecordKindStateSchema = _enum([
16661
16651
  var DeclareKindResultSchema = object({
16662
16652
  kindId: number().int(),
16663
16653
  state: RecordKindStateSchema,
16664
- createdIndexes: array(string()),
16665
- /**
16666
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
16667
- * it stays on the wire, null, because an addon built before the removal reads
16668
- * an ABSENT field as "adoption pending" and refuses to start.
16669
- */
16670
- adoptionPending: _null()
16654
+ createdIndexes: array(string())
16671
16655
  });
16672
16656
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
16673
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
+ ]);
16674
16684
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
16675
16685
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
16676
16686
  kind: "mutation",
@@ -16777,6 +16787,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
16777
16787
  }), {
16778
16788
  kind: "mutation",
16779
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"
16780
16800
  }), method(object({
16781
16801
  deviceId: number().int(),
16782
16802
  kinds: array(RecordKindNameSchema).optional()
@@ -42484,9 +42504,13 @@ var NcSystemEventKindSchema = _enum([
42484
42504
  "node-updating",
42485
42505
  "node-inference-unavailable",
42486
42506
  "detection-blind",
42507
+ "motion-noisy",
42508
+ "motion-calm",
42487
42509
  "recording-stalled",
42488
42510
  "recording-healthy",
42489
42511
  "recording-degraded",
42512
+ "device-attention-required",
42513
+ "device-attention-resolved",
42490
42514
  "storage-location-low",
42491
42515
  "storage-location-critical",
42492
42516
  "storage-location-ok",
@@ -48047,7 +48071,6 @@ var RecommendationReasonSchema = discriminatedUnion("kind", [
48047
48071
  modelId: string()
48048
48072
  }),
48049
48073
  object({ kind: literal("cpu-device") }),
48050
- object({ kind: literal("coral-untouched") }),
48051
48074
  object({ kind: literal("device-disabled") }),
48052
48075
  object({ kind: literal("device-unavailable") }),
48053
48076
  object({ kind: literal("node-offline") }),
@@ -48145,11 +48168,6 @@ var AutoTuneWarningSchema = discriminatedUnion("kind", [
48145
48168
  kind: literal("detector-store-unreadable"),
48146
48169
  error: string()
48147
48170
  }),
48148
- object({
48149
- kind: literal("coral-enabled"),
48150
- nodeId: string(),
48151
- deviceKey: string()
48152
- }),
48153
48171
  object({
48154
48172
  kind: literal("custom-pin-kept"),
48155
48173
  nodeId: string(),
@@ -55827,6 +55845,16 @@ var DishwasherStatusSchema = object({
55827
55845
  powerState: string().nullable(),
55828
55846
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55829
55847
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55848
+ /**
55849
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55850
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
55851
+ * when none is reported. A cleared reminder is not an unknown one.
55852
+ */
55853
+ filterCleaningDue: boolean().nullable(),
55854
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
55855
+ machineCareDue: boolean().nullable(),
55856
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
55857
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
55830
55858
  /** Option states: null when the appliance does not expose the option or has not said. */
55831
55859
  halfLoad: boolean().nullable(),
55832
55860
  hygienePlus: boolean().nullable(),
@@ -64477,16 +64505,6 @@ var UpdateUserInputSchema = object({
64477
64505
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64478
64506
  scopes: array(TokenScopeSchema).optional()
64479
64507
  });
64480
- var ApiKeySummarySchema = object({
64481
- id: string(),
64482
- label: string(),
64483
- isAdmin: boolean().default(false),
64484
- allowedProviders: union([array(string()), literal("*")]).optional(),
64485
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64486
- tokenPrefix: string(),
64487
- createdAt: number(),
64488
- lastUsedAt: number().optional()
64489
- });
64490
64508
  var OauthSessionSummarySchema = object({
64491
64509
  id: string(),
64492
64510
  userId: string(),
@@ -64508,8 +64526,7 @@ var TotpStatusSchema = object({
64508
64526
  confirmedAt: number().nullable()
64509
64527
  });
64510
64528
  /**
64511
- * user-management — singleton capability for user accounts and the
64512
- * legacy API-key rows.
64529
+ * user-management — singleton capability for user accounts.
64513
64530
  *
64514
64531
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64515
64532
  * — the subset check on `setUserScopes` is moot
@@ -64565,10 +64582,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64565
64582
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
64566
64583
  kind: "mutation",
64567
64584
  access: "view"
64568
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
64569
- kind: "mutation",
64570
- auth: "admin",
64571
- access: "delete"
64572
64585
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
64573
64586
  kind: "mutation",
64574
64587
  auth: "admin",
@@ -74024,6 +74037,12 @@ Object.freeze({
74024
74037
  addonId: null,
74025
74038
  access: "view"
74026
74039
  },
74040
+ "records.transact": {
74041
+ capName: "records",
74042
+ capScope: "system",
74043
+ addonId: null,
74044
+ access: "create"
74045
+ },
74027
74046
  "sceneMonitor.captureReference": {
74028
74047
  capName: "scene-monitor",
74029
74048
  capScope: "device",
@@ -75356,12 +75375,6 @@ Object.freeze({
75356
75375
  addonId: null,
75357
75376
  access: "view"
75358
75377
  },
75359
- "userManagement.listApiKeys": {
75360
- capName: "user-management",
75361
- capScope: "system",
75362
- addonId: null,
75363
- access: "view"
75364
- },
75365
75378
  "userManagement.listExternalIdentities": {
75366
75379
  capName: "user-management",
75367
75380
  capScope: "system",
@@ -75416,12 +75429,6 @@ Object.freeze({
75416
75429
  addonId: null,
75417
75430
  access: "create"
75418
75431
  },
75419
- "userManagement.revokeApiKey": {
75420
- capName: "user-management",
75421
- capScope: "system",
75422
- addonId: null,
75423
- access: "delete"
75424
- },
75425
75432
  "userManagement.revokeOauthSession": {
75426
75433
  capName: "user-management",
75427
75434
  capScope: "system",
@@ -78786,9 +78793,13 @@ new Map(Object.entries({
78786
78793
  "stream-online": "device-events",
78787
78794
  "stream-offline": "device-events",
78788
78795
  "detection-blind": "device-events",
78796
+ "motion-noisy": "device-events",
78797
+ "motion-calm": "device-events",
78789
78798
  "recording-stalled": "device-events",
78790
78799
  "recording-healthy": "device-events",
78791
78800
  "recording-degraded": "device-events",
78801
+ "device-attention-required": "device-events",
78802
+ "device-attention-resolved": "device-events",
78792
78803
  "node-online": "system",
78793
78804
  "node-offline": "system",
78794
78805
  "node-restarting": "system",
@@ -78871,6 +78882,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78871
78882
  label: "Detecting nothing",
78872
78883
  kinds: ["detection-blind"]
78873
78884
  },
78885
+ {
78886
+ id: "motion-noise",
78887
+ family: "device-events",
78888
+ label: "Motion without a subject",
78889
+ kinds: ["motion-noisy", "motion-calm"]
78890
+ },
78874
78891
  {
78875
78892
  id: "recording",
78876
78893
  family: "device-events",
@@ -78881,6 +78898,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78881
78898
  "recording-degraded"
78882
78899
  ]
78883
78900
  },
78901
+ {
78902
+ id: "device-attention",
78903
+ family: "device-events",
78904
+ label: "Needs attention",
78905
+ kinds: ["device-attention-required", "device-attention-resolved"]
78906
+ },
78884
78907
  {
78885
78908
  id: "nodes",
78886
78909
  family: "system",
@@ -79020,6 +79043,7 @@ var ALERT_EPISODE = [
79020
79043
  "alert-error",
79021
79044
  "alert-critical-resolved"
79022
79045
  ];
79046
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79023
79047
  var UPDATES = [
79024
79048
  "addon-update-available",
79025
79049
  "server-update-available",
@@ -79049,9 +79073,12 @@ var DEVICE_EVENTS = [
79049
79073
  "stream-online",
79050
79074
  "stream-offline",
79051
79075
  "detection-blind",
79076
+ "motion-noisy",
79077
+ "motion-calm",
79052
79078
  "recording-stalled",
79053
79079
  "recording-healthy",
79054
79080
  "recording-degraded",
79081
+ ...DEVICE_ATTENTION,
79055
79082
  ...ALARM
79056
79083
  ];
79057
79084
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79219,7 +79246,9 @@ var STATE_SUMMARY_VARS = [
79219
79246
  [...RULE_TEXT],
79220
79247
  [...RULE_TEXT],
79221
79248
  [...RULE_TEXT],
79222
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79249
+ [...RULE_TEXT],
79250
+ [...RULE_TEXT],
79251
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79223
79252
  [...RULE_TEXT],
79224
79253
  [...RULE_TEXT],
79225
79254
  [...RULE_TEXT],
@@ -79241,11 +79270,11 @@ var STATE_SUMMARY_VARS = [
79241
79270
  [...RULE_TEXT],
79242
79271
  [...RULE_TEXT],
79243
79272
  [...RULE_TEXT],
79273
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79244
79274
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79275
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79245
79276
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79246
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79247
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79248
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79277
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79249
79278
  [...RULE_TEXT],
79250
79279
  [...RULE_TEXT],
79251
79280
  [...RULE_TEXT],
@@ -79321,6 +79350,15 @@ new Map([
79321
79350
  snapshotLabel: "Tanks low or full now",
79322
79351
  snapshotSection: "tanks"
79323
79352
  },
79353
+ {
79354
+ id: "motion-noise",
79355
+ family: "device-events",
79356
+ label: "Motion without a subject (constant / calm again)",
79357
+ bad: ["motion-noisy"],
79358
+ recovery: ["motion-calm"],
79359
+ snapshotLabel: "Cameras with constant motion now",
79360
+ snapshotSection: null
79361
+ },
79324
79362
  {
79325
79363
  id: "recording-health",
79326
79364
  family: "device-events",
@@ -79330,6 +79368,15 @@ new Map([
79330
79368
  snapshotLabel: "Recordings stalled now",
79331
79369
  snapshotSection: null
79332
79370
  },
79371
+ {
79372
+ id: "device-attention",
79373
+ family: "device-events",
79374
+ label: "Device needs attention (raised / resolved)",
79375
+ bad: ["device-attention-required"],
79376
+ recovery: ["device-attention-resolved"],
79377
+ snapshotLabel: "Devices needing attention now",
79378
+ snapshotSection: null
79379
+ },
79333
79380
  {
79334
79381
  id: "node-connectivity",
79335
79382
  family: "system",
@@ -79958,7 +80005,7 @@ function buildConnectionFormSchema() {
79958
80005
  id: "connection",
79959
80006
  title: "Connection",
79960
80007
  titleKey: "provider-unraid:connection.s_connection.title",
79961
- description: "CamStack connects to the Unraid GraphQL API and polls the array, disks, docker containers and notifications. The API key must be an ADMIN-role key created with `unraid-api apikey --create`.",
80008
+ description: "The API key must be ADMIN-role, created with `unraid-api apikey --create`.",
79962
80009
  descriptionKey: "provider-unraid:connection.s_connection.description",
79963
80010
  columns: 2,
79964
80011
  fields: [
package/dist/addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- //#region ../types/dist/event-category-7pZEBmVg.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
@@ -5421,7 +5430,7 @@ var ZodIssueCode = {
5421
5430
  var ZodFirstPartyTypeKind;
5422
5431
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5423
5432
  //#endregion
5424
- //#region ../types/dist/sleep-CueztlR1.mjs
5433
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5425
5434
  /**
5426
5435
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5427
5436
  * window to float samples (D455).
@@ -7950,7 +7959,7 @@ var EntryDescriptorSchema = object({
7950
7959
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
7951
7960
  fields: record(string(), unknown())
7952
7961
  }).strict();
7953
- /** 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. */
7954
7963
  var RecordKindDeclarationSchema = object({
7955
7964
  database: _enum(RECORD_DATABASES).default("settings"),
7956
7965
  class: _enum(RECORD_CLASSES),
@@ -7969,14 +7978,6 @@ var RecordKindDeclarationSchema = object({
7969
7978
  secretPaths: array(string().min(1)).default([]),
7970
7979
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
7971
7980
  secretArrayKeys: record(string(), string()).default({}),
7972
- /**
7973
- * RETIRED (D900): the legacy table a kind adopted from during the records
7974
- * migration. Nothing declares it any more and nothing reads it; the schema
7975
- * still ACCEPTS it because the catalog rows the migration wrote carry it
7976
- * (an orphaned kind is never redeclared) and an addon built before the
7977
- * removal still sends it. Never set it.
7978
- */
7979
- adoptsFrom: string().min(1).optional(),
7980
7981
  /** Kinds that must agree through `transact` sit in one file under one family name. */
7981
7982
  transactFamily: string().min(1).optional(),
7982
7983
  entry: EntryDescriptorSchema.optional()
@@ -12668,17 +12669,6 @@ object({
12668
12669
  createdAt: number(),
12669
12670
  updatedAt: number()
12670
12671
  });
12671
- object({
12672
- id: string(),
12673
- label: string(),
12674
- isAdmin: boolean().default(false),
12675
- allowedProviders: AllowedProviderSchema,
12676
- allowedDevices: AllowedDevicesSchema,
12677
- tokenHash: string(),
12678
- tokenPrefix: string(),
12679
- createdAt: number(),
12680
- lastUsedAt: number().optional()
12681
- });
12682
12672
  object({
12683
12673
  id: string(),
12684
12674
  userId: string(),
@@ -16660,16 +16650,36 @@ var RecordKindStateSchema = _enum([
16660
16650
  var DeclareKindResultSchema = object({
16661
16651
  kindId: number().int(),
16662
16652
  state: RecordKindStateSchema,
16663
- createdIndexes: array(string()),
16664
- /**
16665
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
16666
- * it stays on the wire, null, because an addon built before the removal reads
16667
- * an ABSENT field as "adoption pending" and refuses to start.
16668
- */
16669
- adoptionPending: _null()
16653
+ createdIndexes: array(string())
16670
16654
  });
16671
16655
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
16672
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
+ ]);
16673
16683
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
16674
16684
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
16675
16685
  kind: "mutation",
@@ -16776,6 +16786,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
16776
16786
  }), {
16777
16787
  kind: "mutation",
16778
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"
16779
16799
  }), method(object({
16780
16800
  deviceId: number().int(),
16781
16801
  kinds: array(RecordKindNameSchema).optional()
@@ -42483,9 +42503,13 @@ var NcSystemEventKindSchema = _enum([
42483
42503
  "node-updating",
42484
42504
  "node-inference-unavailable",
42485
42505
  "detection-blind",
42506
+ "motion-noisy",
42507
+ "motion-calm",
42486
42508
  "recording-stalled",
42487
42509
  "recording-healthy",
42488
42510
  "recording-degraded",
42511
+ "device-attention-required",
42512
+ "device-attention-resolved",
42489
42513
  "storage-location-low",
42490
42514
  "storage-location-critical",
42491
42515
  "storage-location-ok",
@@ -48046,7 +48070,6 @@ var RecommendationReasonSchema = discriminatedUnion("kind", [
48046
48070
  modelId: string()
48047
48071
  }),
48048
48072
  object({ kind: literal("cpu-device") }),
48049
- object({ kind: literal("coral-untouched") }),
48050
48073
  object({ kind: literal("device-disabled") }),
48051
48074
  object({ kind: literal("device-unavailable") }),
48052
48075
  object({ kind: literal("node-offline") }),
@@ -48144,11 +48167,6 @@ var AutoTuneWarningSchema = discriminatedUnion("kind", [
48144
48167
  kind: literal("detector-store-unreadable"),
48145
48168
  error: string()
48146
48169
  }),
48147
- object({
48148
- kind: literal("coral-enabled"),
48149
- nodeId: string(),
48150
- deviceKey: string()
48151
- }),
48152
48170
  object({
48153
48171
  kind: literal("custom-pin-kept"),
48154
48172
  nodeId: string(),
@@ -55826,6 +55844,16 @@ var DishwasherStatusSchema = object({
55826
55844
  powerState: string().nullable(),
55827
55845
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55828
55846
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55847
+ /**
55848
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55849
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
55850
+ * when none is reported. A cleared reminder is not an unknown one.
55851
+ */
55852
+ filterCleaningDue: boolean().nullable(),
55853
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
55854
+ machineCareDue: boolean().nullable(),
55855
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
55856
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
55829
55857
  /** Option states: null when the appliance does not expose the option or has not said. */
55830
55858
  halfLoad: boolean().nullable(),
55831
55859
  hygienePlus: boolean().nullable(),
@@ -64476,16 +64504,6 @@ var UpdateUserInputSchema = object({
64476
64504
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64477
64505
  scopes: array(TokenScopeSchema).optional()
64478
64506
  });
64479
- var ApiKeySummarySchema = object({
64480
- id: string(),
64481
- label: string(),
64482
- isAdmin: boolean().default(false),
64483
- allowedProviders: union([array(string()), literal("*")]).optional(),
64484
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64485
- tokenPrefix: string(),
64486
- createdAt: number(),
64487
- lastUsedAt: number().optional()
64488
- });
64489
64507
  var OauthSessionSummarySchema = object({
64490
64508
  id: string(),
64491
64509
  userId: string(),
@@ -64507,8 +64525,7 @@ var TotpStatusSchema = object({
64507
64525
  confirmedAt: number().nullable()
64508
64526
  });
64509
64527
  /**
64510
- * user-management — singleton capability for user accounts and the
64511
- * legacy API-key rows.
64528
+ * user-management — singleton capability for user accounts.
64512
64529
  *
64513
64530
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64514
64531
  * — the subset check on `setUserScopes` is moot
@@ -64564,10 +64581,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64564
64581
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
64565
64582
  kind: "mutation",
64566
64583
  access: "view"
64567
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
64568
- kind: "mutation",
64569
- auth: "admin",
64570
- access: "delete"
64571
64584
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
64572
64585
  kind: "mutation",
64573
64586
  auth: "admin",
@@ -74023,6 +74036,12 @@ Object.freeze({
74023
74036
  addonId: null,
74024
74037
  access: "view"
74025
74038
  },
74039
+ "records.transact": {
74040
+ capName: "records",
74041
+ capScope: "system",
74042
+ addonId: null,
74043
+ access: "create"
74044
+ },
74026
74045
  "sceneMonitor.captureReference": {
74027
74046
  capName: "scene-monitor",
74028
74047
  capScope: "device",
@@ -75355,12 +75374,6 @@ Object.freeze({
75355
75374
  addonId: null,
75356
75375
  access: "view"
75357
75376
  },
75358
- "userManagement.listApiKeys": {
75359
- capName: "user-management",
75360
- capScope: "system",
75361
- addonId: null,
75362
- access: "view"
75363
- },
75364
75377
  "userManagement.listExternalIdentities": {
75365
75378
  capName: "user-management",
75366
75379
  capScope: "system",
@@ -75415,12 +75428,6 @@ Object.freeze({
75415
75428
  addonId: null,
75416
75429
  access: "create"
75417
75430
  },
75418
- "userManagement.revokeApiKey": {
75419
- capName: "user-management",
75420
- capScope: "system",
75421
- addonId: null,
75422
- access: "delete"
75423
- },
75424
75431
  "userManagement.revokeOauthSession": {
75425
75432
  capName: "user-management",
75426
75433
  capScope: "system",
@@ -78785,9 +78792,13 @@ new Map(Object.entries({
78785
78792
  "stream-online": "device-events",
78786
78793
  "stream-offline": "device-events",
78787
78794
  "detection-blind": "device-events",
78795
+ "motion-noisy": "device-events",
78796
+ "motion-calm": "device-events",
78788
78797
  "recording-stalled": "device-events",
78789
78798
  "recording-healthy": "device-events",
78790
78799
  "recording-degraded": "device-events",
78800
+ "device-attention-required": "device-events",
78801
+ "device-attention-resolved": "device-events",
78791
78802
  "node-online": "system",
78792
78803
  "node-offline": "system",
78793
78804
  "node-restarting": "system",
@@ -78870,6 +78881,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78870
78881
  label: "Detecting nothing",
78871
78882
  kinds: ["detection-blind"]
78872
78883
  },
78884
+ {
78885
+ id: "motion-noise",
78886
+ family: "device-events",
78887
+ label: "Motion without a subject",
78888
+ kinds: ["motion-noisy", "motion-calm"]
78889
+ },
78873
78890
  {
78874
78891
  id: "recording",
78875
78892
  family: "device-events",
@@ -78880,6 +78897,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78880
78897
  "recording-degraded"
78881
78898
  ]
78882
78899
  },
78900
+ {
78901
+ id: "device-attention",
78902
+ family: "device-events",
78903
+ label: "Needs attention",
78904
+ kinds: ["device-attention-required", "device-attention-resolved"]
78905
+ },
78883
78906
  {
78884
78907
  id: "nodes",
78885
78908
  family: "system",
@@ -79019,6 +79042,7 @@ var ALERT_EPISODE = [
79019
79042
  "alert-error",
79020
79043
  "alert-critical-resolved"
79021
79044
  ];
79045
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79022
79046
  var UPDATES = [
79023
79047
  "addon-update-available",
79024
79048
  "server-update-available",
@@ -79048,9 +79072,12 @@ var DEVICE_EVENTS = [
79048
79072
  "stream-online",
79049
79073
  "stream-offline",
79050
79074
  "detection-blind",
79075
+ "motion-noisy",
79076
+ "motion-calm",
79051
79077
  "recording-stalled",
79052
79078
  "recording-healthy",
79053
79079
  "recording-degraded",
79080
+ ...DEVICE_ATTENTION,
79054
79081
  ...ALARM
79055
79082
  ];
79056
79083
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79218,7 +79245,9 @@ var STATE_SUMMARY_VARS = [
79218
79245
  [...RULE_TEXT],
79219
79246
  [...RULE_TEXT],
79220
79247
  [...RULE_TEXT],
79221
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79248
+ [...RULE_TEXT],
79249
+ [...RULE_TEXT],
79250
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79222
79251
  [...RULE_TEXT],
79223
79252
  [...RULE_TEXT],
79224
79253
  [...RULE_TEXT],
@@ -79240,11 +79269,11 @@ var STATE_SUMMARY_VARS = [
79240
79269
  [...RULE_TEXT],
79241
79270
  [...RULE_TEXT],
79242
79271
  [...RULE_TEXT],
79272
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79243
79273
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79274
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79244
79275
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79245
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79246
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79247
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79276
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79248
79277
  [...RULE_TEXT],
79249
79278
  [...RULE_TEXT],
79250
79279
  [...RULE_TEXT],
@@ -79320,6 +79349,15 @@ new Map([
79320
79349
  snapshotLabel: "Tanks low or full now",
79321
79350
  snapshotSection: "tanks"
79322
79351
  },
79352
+ {
79353
+ id: "motion-noise",
79354
+ family: "device-events",
79355
+ label: "Motion without a subject (constant / calm again)",
79356
+ bad: ["motion-noisy"],
79357
+ recovery: ["motion-calm"],
79358
+ snapshotLabel: "Cameras with constant motion now",
79359
+ snapshotSection: null
79360
+ },
79323
79361
  {
79324
79362
  id: "recording-health",
79325
79363
  family: "device-events",
@@ -79329,6 +79367,15 @@ new Map([
79329
79367
  snapshotLabel: "Recordings stalled now",
79330
79368
  snapshotSection: null
79331
79369
  },
79370
+ {
79371
+ id: "device-attention",
79372
+ family: "device-events",
79373
+ label: "Device needs attention (raised / resolved)",
79374
+ bad: ["device-attention-required"],
79375
+ recovery: ["device-attention-resolved"],
79376
+ snapshotLabel: "Devices needing attention now",
79377
+ snapshotSection: null
79378
+ },
79332
79379
  {
79333
79380
  id: "node-connectivity",
79334
79381
  family: "system",
@@ -79957,7 +80004,7 @@ function buildConnectionFormSchema() {
79957
80004
  id: "connection",
79958
80005
  title: "Connection",
79959
80006
  titleKey: "provider-unraid:connection.s_connection.title",
79960
- description: "CamStack connects to the Unraid GraphQL API and polls the array, disks, docker containers and notifications. The API key must be an ADMIN-role key created with `unraid-api apikey --create`.",
80007
+ description: "The API key must be ADMIN-role, created with `unraid-api apikey --create`.",
79961
80008
  descriptionKey: "provider-unraid:connection.s_connection.description",
79962
80009
  columns: 2,
79963
80010
  fields: [
package/i18n/en.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "connection.s_identity.title": "Unraid server",
3
3
  "connection.s_identity.name.label": "Name",
4
4
  "connection.s_connection.title": "Connection",
5
- "connection.s_connection.description": "CamStack connects to the Unraid GraphQL API and polls the array, disks, docker containers and notifications. The API key must be an ADMIN-role key created with `unraid-api apikey --create`.",
5
+ "connection.s_connection.description": "The API key must be ADMIN-role, created with `unraid-api apikey --create`.",
6
6
  "connection.s_connection.host.label": "Host / IP",
7
7
  "connection.s_connection.port.label": "Port",
8
8
  "connection.s_connection.https.label": "Use HTTPS",
package/i18n/it.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "connection.s_identity.title": "Server Unraid",
3
3
  "connection.s_identity.name.label": "Nome",
4
4
  "connection.s_connection.title": "Connessione",
5
- "connection.s_connection.description": "CamStack si collega all'API GraphQL di Unraid e legge array, dischi, container Docker e notifiche. La API key deve essere una chiave con ruolo ADMIN, creata con `unraid-api apikey --create`.",
5
+ "connection.s_connection.description": "La API key deve avere ruolo ADMIN, creata con `unraid-api apikey --create`.",
6
6
  "connection.s_connection.host.label": "Host / IP",
7
7
  "connection.s_connection.port.label": "Porta",
8
8
  "connection.s_connection.https.label": "Usa HTTPS",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-unraid",
3
- "version": "0.2.141",
3
+ "version": "0.2.143",
4
4
  "description": "Unraid device-provider addon for CamStack — one Container per Unraid instance fanning out array, disk, docker and notification entities",
5
5
  "keywords": [
6
6
  "camstack",