@camstack/addon-provider-homematic 1.2.128 → 1.2.129

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
@@ -5379,7 +5379,7 @@ var ZodIssueCode = {
5379
5379
  var ZodFirstPartyTypeKind;
5380
5380
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5381
5381
  //#endregion
5382
- //#region ../types/dist/sleep-BNeXenvr.mjs
5382
+ //#region ../types/dist/sleep-B0JG7-_F.mjs
5383
5383
  /**
5384
5384
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5385
5385
  * window to float samples (D455).
@@ -15267,6 +15267,10 @@ var DeviceInfoSchema = object({
15267
15267
  isCamera: boolean(),
15268
15268
  /** Current config values — serializable snapshot */
15269
15269
  config: record(string(), unknown()),
15270
+ /** Paths inside `config` the device's schema declares secret (D783) —
15271
+ * what the non-admin redaction withholds. Paths, never values. Absent
15272
+ * when the owning runner has not reported them. */
15273
+ secretConfigPaths: array(string()).optional(),
15270
15274
  /** Hardware + identity blob (manufacturer / model / firmware / sn /
15271
15275
  * uid / mac / …). Populated by drivers; editable via setMetadata. */
15272
15276
  metadata: record(string(), unknown()).nullable().optional(),
@@ -15472,7 +15476,13 @@ var DeviceRegisterPayloadSchema = object({
15472
15476
  * call (workers re-register on init), so probe-driven updates
15473
15477
  * (e.g. PTZ flag flipping after the abilities probe) propagate. */
15474
15478
  features: array(string()).optional(),
15475
- config: record(string(), unknown())
15479
+ config: record(string(), unknown()),
15480
+ /** Config paths the device's own schema DECLARES secret
15481
+ * (`.meta({ secret: true })` — dotted, `[]` for array items, e.g.
15482
+ * `connection.password`). Re-published on every register; the non-admin
15483
+ * redaction withholds them at any depth (D783). Optional: an older runner
15484
+ * omits it and the keyword backstop applies. */
15485
+ secretConfigPaths: array(string()).optional()
15476
15486
  });
15477
15487
  var DeviceRemovePayloadSchema = object({ deviceId: number() });
15478
15488
  var DevicePersistConfigPayloadSchema = object({
@@ -17131,7 +17141,14 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
17131
17141
  icon: string().optional(),
17132
17142
  /** Addon-owned HTTP route the button navigates to (GET). */
17133
17143
  startUrl: string(),
17134
- stage: LoginStageEnum
17144
+ stage: LoginStageEnum,
17145
+ /**
17146
+ * The provider names an external identity a signed-in user can link to
17147
+ * their own account (D782): `auth.listLinkableProviders` /
17148
+ * `beginExternalLink` offer exactly the redirect methods that set this,
17149
+ * whatever their id. Absent / false — a login button only (magic-link).
17150
+ */
17151
+ linkable: boolean().optional()
17135
17152
  }),
17136
17153
  object({
17137
17154
  kind: literal("widget"),
@@ -22566,7 +22583,13 @@ var RetrainFrameSchema = object({
22566
22583
  sizeBytes: number().int(),
22567
22584
  width: number().int(),
22568
22585
  height: number().int(),
22569
- copiedAt: number()
22586
+ copiedAt: number(),
22587
+ /** When the CAMERA captured the frame. Absent on a copy taken before D785. */
22588
+ capturedAt: number().optional(),
22589
+ /** The operator's "every subject in this frame is boxed". Detector
22590
+ * evaluation keeps only complete frames: an unboxed subject would count as
22591
+ * a false positive. */
22592
+ complete: boolean()
22570
22593
  });
22571
22594
  /** Why a copy-on-select could not be honoured — named, never a silent skip. */
22572
22595
  var RetrainCopyRefusalSchema = _enum([
@@ -22587,6 +22610,51 @@ var RetrainFrameListSchema = object({
22587
22610
  /** What the page pre-selects — the native key frame when one survives. */
22588
22611
  autoPickMediaId: number().int().optional()
22589
22612
  });
22613
+ /**
22614
+ * Which frames an annotated export carries. Every field narrows; an empty
22615
+ * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
22616
+ * list owned by whoever trains (the training orchestrator), so `frameIds` is
22617
+ * the primitive a version export uses; `batchId` re-selects what an earlier
22618
+ * export carried (`exportedInBatch`).
22619
+ */
22620
+ var RetrainExportFilterSchema = object({
22621
+ deviceIds: array(number()).optional(),
22622
+ frameIds: array(string()).max(2e4).optional(),
22623
+ batchId: string().optional(),
22624
+ /** Only frames the operator marked complete (all subjects boxed). */
22625
+ completeOnly: boolean().optional()
22626
+ });
22627
+ /**
22628
+ * `frames`: the full frame copies, boxes in `annotations.json`.
22629
+ * `crops`: additionally one JPEG per subject, cut with the runtime detail-crop
22630
+ * convention — the classifier layout.
22631
+ */
22632
+ var RetrainExportLayoutSchema = _enum(["frames", "crops"]);
22633
+ /**
22634
+ * Where `writeRetrainArchive` streams the tar: one HTTP request whose body is
22635
+ * the archive, sent chunk by chunk. Covers a presigned PUT and a provider
22636
+ * addon's data-plane upload route alike. Headers are sent verbatim and never
22637
+ * logged.
22638
+ */
22639
+ var RetrainArchiveTargetSchema = object({
22640
+ kind: literal("http"),
22641
+ method: _enum(["PUT", "POST"]),
22642
+ url: string().url(),
22643
+ headers: record(string(), string()).optional()
22644
+ });
22645
+ var RetrainArchiveResultSchema = object({
22646
+ batchId: string(),
22647
+ frames: number().int(),
22648
+ crops: number().int(),
22649
+ annotations: number().int(),
22650
+ /** Frames planned but not shipped (unreadable copy, path too long). */
22651
+ missing: number().int(),
22652
+ bytes: number().int(),
22653
+ /** sha256 of the exact bytes sent. */
22654
+ sha256: string(),
22655
+ /** The target's HTTP status. */
22656
+ status: number().int()
22657
+ });
22590
22658
  /** What the operator asked the assist to look for. */
22591
22659
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
22592
22660
  kind: literal("package"),
@@ -23381,9 +23449,25 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
23381
23449
  }), RetrainTransitionResultSchema, {
23382
23450
  kind: "mutation",
23383
23451
  auth: "admin"
23384
- }), method(object({ deviceIds: array(number()).optional() }), object({ url: string() }), {
23452
+ }), method(RetrainExportFilterSchema.extend({ layout: RetrainExportLayoutSchema.optional() }), object({ url: string() }), {
23385
23453
  kind: "query",
23386
23454
  auth: "admin"
23455
+ }), method(object({
23456
+ deviceId: number(),
23457
+ trackId: string(),
23458
+ frameId: string(),
23459
+ complete: boolean()
23460
+ }), RetrainFrameSchema, {
23461
+ kind: "mutation",
23462
+ auth: "admin"
23463
+ }), method(object({
23464
+ filter: RetrainExportFilterSchema,
23465
+ layout: RetrainExportLayoutSchema,
23466
+ target: RetrainArchiveTargetSchema
23467
+ }), RetrainArchiveResultSchema, {
23468
+ kind: "mutation",
23469
+ auth: "admin",
23470
+ timeoutMs: 60 * 6e4
23387
23471
  }), method(object({
23388
23472
  /** Which of the three event tables owns the row. */
23389
23473
  ownerType: EventOwnerTypeSchema,
@@ -26713,7 +26797,19 @@ var SsoBridgeClaimsSchema = object({
26713
26797
  * editing a descriptor must not retroactively extend or shorten a link the
26714
26798
  * operator already consented to.
26715
26799
  */
26716
- refreshTtl: union([number().int().positive(), literal("never")]).optional()
26800
+ refreshTtl: union([number().int().positive(), literal("never")]).optional(),
26801
+ /**
26802
+ * Opaque handle of a hub-side LINK intent (D782). Set by an OIDC callback
26803
+ * that was started from a signed-in user's "Link" button: the finish then
26804
+ * links this identity to the intent's user instead of signing anyone in.
26805
+ * The handle carries no user id — the hub resolves it, single-use.
26806
+ */
26807
+ linkIntent: string().optional(),
26808
+ /**
26809
+ * Verified `iss` of the id_token behind an OIDC login bridge (D782). A
26810
+ * subject is unique only per issuer, so a link is bound to it.
26811
+ */
26812
+ issuer: string().optional()
26717
26813
  });
26718
26814
  method(object({
26719
26815
  claims: SsoBridgeClaimsSchema,
@@ -28648,7 +28744,22 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
28648
28744
  * field their hints were silently stripped by the schema and the
28649
28745
  * adaptive ladder started blind on the client's display size.
28650
28746
  */
28651
- hints: webrtcClientHintsSchema.optional()
28747
+ hints: webrtcClientHintsSchema.optional(),
28748
+ /**
28749
+ * Talk-back (D771): relay the PEER's audio to the device's speaker
28750
+ * through the `intercom` cap's push-talk triple. When `true` and the
28751
+ * offer lets the peer send audio, the answer's audio is `sendrecv`
28752
+ * and every inbound frame goes to `intercom.pushTalkAudio` for this
28753
+ * `deviceId`; absent/false answers `sendonly`, as for every viewer.
28754
+ *
28755
+ * TRUSTED-CALLER ONLY. Set by the Alexa export for an Echo on a camera
28756
+ * with `intercom`, when the linked user may control that camera. The
28757
+ * hub STRIPS it from every request-bound call (a browser), exactly as
28758
+ * it overwrites `relayOnly` — a viewer's talk permission is the
28759
+ * intercom cap's own surface (share tokens gate it there), and this
28760
+ * flag must not become a second door to the camera's speaker.
28761
+ */
28762
+ talkback: boolean().optional()
28652
28763
  }), object({
28653
28764
  sessionId: string(),
28654
28765
  sdpAnswer: string()
@@ -39002,6 +39113,32 @@ var TotpStatusSchema = object({
39002
39113
  /** Null when no row exists OR the row is still pending confirmation. */
39003
39114
  confirmedAt: number().nullable()
39004
39115
  });
39116
+ /**
39117
+ * user-management — singleton capability for user accounts, API keys,
39118
+ * and scoped tokens.
39119
+ *
39120
+ * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
39121
+ * — the subset check on `setUserScopes` / `createScopedToken` is moot
39122
+ * because non-admins never reach these. If/when we open non-admin
39123
+ * delegation, structural caller-scope subset check goes inside the
39124
+ * provider.
39125
+ */
39126
+ var ExternalIdentitySchema = object({
39127
+ /** Login-method id of the provider instance, e.g. `auth-oidc/authentik`. */
39128
+ provider: string(),
39129
+ /** The IdP's stable subject (`sub`) for this account. */
39130
+ subject: string(),
39131
+ /** The verified `iss` of the IdP the identity was linked under — `sub` is unique only per issuer. */
39132
+ issuer: string(),
39133
+ userId: string(),
39134
+ /** What the IdP called the account at link time (username / email) — display only. */
39135
+ label: string().optional(),
39136
+ linkedAt: number()
39137
+ });
39138
+ var ExternalIdentityKeySchema = object({
39139
+ provider: string().min(1),
39140
+ subject: string().min(1)
39141
+ });
39005
39142
  method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserInputSchema, UserSummarySchema, {
39006
39143
  kind: "mutation",
39007
39144
  auth: "admin",
@@ -39115,7 +39252,22 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
39115
39252
  userId: string(),
39116
39253
  username: string(),
39117
39254
  scopes: array(TokenScopeSchema)
39118
- }).nullable(), { access: "view" }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
39255
+ }).nullable(), { access: "view" }), method(object({ userId: string() }), array(ExternalIdentitySchema), { auth: "admin" }), method(ExternalIdentityKeySchema, object({
39256
+ userId: string(),
39257
+ issuer: string()
39258
+ }).nullable(), { auth: "admin" }), method(ExternalIdentityKeySchema.extend({
39259
+ userId: string(),
39260
+ issuer: string().min(1),
39261
+ label: string().optional()
39262
+ }), object({ success: literal(true) }), {
39263
+ kind: "mutation",
39264
+ auth: "admin",
39265
+ access: "create"
39266
+ }), method(ExternalIdentityKeySchema.extend({ userId: string() }), object({ success: boolean() }), {
39267
+ kind: "mutation",
39268
+ auth: "admin",
39269
+ access: "delete"
39270
+ }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
39119
39271
  kind: "mutation",
39120
39272
  auth: "admin",
39121
39273
  access: "delete"
@@ -45755,6 +45907,12 @@ Object.freeze({
45755
45907
  addonId: null,
45756
45908
  access: "create"
45757
45909
  },
45910
+ "pipelineAnalytics.setRetrainFrameComplete": {
45911
+ capName: "pipeline-analytics",
45912
+ capScope: "device",
45913
+ addonId: null,
45914
+ access: "create"
45915
+ },
45758
45916
  "pipelineAnalytics.setTrackFlags": {
45759
45917
  capName: "pipeline-analytics",
45760
45918
  capScope: "device",
@@ -45791,6 +45949,12 @@ Object.freeze({
45791
45949
  addonId: null,
45792
45950
  access: "delete"
45793
45951
  },
45952
+ "pipelineAnalytics.writeRetrainArchive": {
45953
+ capName: "pipeline-analytics",
45954
+ capScope: "device",
45955
+ addonId: null,
45956
+ access: "create"
45957
+ },
45794
45958
  "pipelineExecutor.cacheFrameInPool": {
45795
45959
  capName: "pipeline-executor",
45796
45960
  capScope: "system",
@@ -48143,18 +48307,36 @@ Object.freeze({
48143
48307
  addonId: null,
48144
48308
  access: "delete"
48145
48309
  },
48310
+ "userManagement.findUserByExternalIdentity": {
48311
+ capName: "user-management",
48312
+ capScope: "system",
48313
+ addonId: null,
48314
+ access: "view"
48315
+ },
48146
48316
  "userManagement.getTotpStatus": {
48147
48317
  capName: "user-management",
48148
48318
  capScope: "system",
48149
48319
  addonId: null,
48150
48320
  access: "view"
48151
48321
  },
48322
+ "userManagement.linkExternalIdentity": {
48323
+ capName: "user-management",
48324
+ capScope: "system",
48325
+ addonId: null,
48326
+ access: "create"
48327
+ },
48152
48328
  "userManagement.listApiKeys": {
48153
48329
  capName: "user-management",
48154
48330
  capScope: "system",
48155
48331
  addonId: null,
48156
48332
  access: "view"
48157
48333
  },
48334
+ "userManagement.listExternalIdentities": {
48335
+ capName: "user-management",
48336
+ capScope: "system",
48337
+ addonId: null,
48338
+ access: "view"
48339
+ },
48158
48340
  "userManagement.listOauthSessions": {
48159
48341
  capName: "user-management",
48160
48342
  capScope: "system",
@@ -48233,6 +48415,12 @@ Object.freeze({
48233
48415
  addonId: null,
48234
48416
  access: "create"
48235
48417
  },
48418
+ "userManagement.unlinkExternalIdentity": {
48419
+ capName: "user-management",
48420
+ capScope: "system",
48421
+ addonId: null,
48422
+ access: "delete"
48423
+ },
48236
48424
  "userManagement.updateUser": {
48237
48425
  capName: "user-management",
48238
48426
  capScope: "system",
@@ -51572,6 +51760,11 @@ Object.freeze({
51572
51760
  form: "single",
51573
51761
  optional: false
51574
51762
  }],
51763
+ "pipelineAnalytics.setRetrainFrameComplete": [{
51764
+ name: "deviceId",
51765
+ form: "single",
51766
+ optional: false
51767
+ }],
51575
51768
  "pipelineAnalytics.setTrackFlags": [{
51576
51769
  name: "deviceId",
51577
51770
  form: "single",
@@ -53723,7 +53916,7 @@ var homematicConfigSchema = object({
53723
53916
  enableGroups: boolean().default(true).describe("Enable groups (heating groups / VirtualDevices)"),
53724
53917
  enableBidcosWired: boolean().default(false).describe("Enable BidCos-Wired (HM-Wired)"),
53725
53918
  username: string().default("").describe("WebUI username (optional — enables names / rooms / sysvars)"),
53726
- password: string().default("").describe("WebUI password (optional)"),
53919
+ password: string().default("").describe("WebUI password (optional)").meta({ secret: true }),
53727
53920
  callbackHost: string().default("").describe("Address the CCU calls back to for event push (this hub LAN IP)"),
53728
53921
  callbackPort: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(1).max(65535).default(2128)).describe("Local XML-RPC callback server port"),
53729
53922
  tls: boolean().default(false).describe("Use TLS for the CCU transport")
package/dist/addon.mjs CHANGED
@@ -5380,7 +5380,7 @@ var ZodIssueCode = {
5380
5380
  var ZodFirstPartyTypeKind;
5381
5381
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5382
5382
  //#endregion
5383
- //#region ../types/dist/sleep-BNeXenvr.mjs
5383
+ //#region ../types/dist/sleep-B0JG7-_F.mjs
5384
5384
  /**
5385
5385
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5386
5386
  * window to float samples (D455).
@@ -15268,6 +15268,10 @@ var DeviceInfoSchema = object({
15268
15268
  isCamera: boolean(),
15269
15269
  /** Current config values — serializable snapshot */
15270
15270
  config: record(string(), unknown()),
15271
+ /** Paths inside `config` the device's schema declares secret (D783) —
15272
+ * what the non-admin redaction withholds. Paths, never values. Absent
15273
+ * when the owning runner has not reported them. */
15274
+ secretConfigPaths: array(string()).optional(),
15271
15275
  /** Hardware + identity blob (manufacturer / model / firmware / sn /
15272
15276
  * uid / mac / …). Populated by drivers; editable via setMetadata. */
15273
15277
  metadata: record(string(), unknown()).nullable().optional(),
@@ -15473,7 +15477,13 @@ var DeviceRegisterPayloadSchema = object({
15473
15477
  * call (workers re-register on init), so probe-driven updates
15474
15478
  * (e.g. PTZ flag flipping after the abilities probe) propagate. */
15475
15479
  features: array(string()).optional(),
15476
- config: record(string(), unknown())
15480
+ config: record(string(), unknown()),
15481
+ /** Config paths the device's own schema DECLARES secret
15482
+ * (`.meta({ secret: true })` — dotted, `[]` for array items, e.g.
15483
+ * `connection.password`). Re-published on every register; the non-admin
15484
+ * redaction withholds them at any depth (D783). Optional: an older runner
15485
+ * omits it and the keyword backstop applies. */
15486
+ secretConfigPaths: array(string()).optional()
15477
15487
  });
15478
15488
  var DeviceRemovePayloadSchema = object({ deviceId: number() });
15479
15489
  var DevicePersistConfigPayloadSchema = object({
@@ -17132,7 +17142,14 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
17132
17142
  icon: string().optional(),
17133
17143
  /** Addon-owned HTTP route the button navigates to (GET). */
17134
17144
  startUrl: string(),
17135
- stage: LoginStageEnum
17145
+ stage: LoginStageEnum,
17146
+ /**
17147
+ * The provider names an external identity a signed-in user can link to
17148
+ * their own account (D782): `auth.listLinkableProviders` /
17149
+ * `beginExternalLink` offer exactly the redirect methods that set this,
17150
+ * whatever their id. Absent / false — a login button only (magic-link).
17151
+ */
17152
+ linkable: boolean().optional()
17136
17153
  }),
17137
17154
  object({
17138
17155
  kind: literal("widget"),
@@ -22567,7 +22584,13 @@ var RetrainFrameSchema = object({
22567
22584
  sizeBytes: number().int(),
22568
22585
  width: number().int(),
22569
22586
  height: number().int(),
22570
- copiedAt: number()
22587
+ copiedAt: number(),
22588
+ /** When the CAMERA captured the frame. Absent on a copy taken before D785. */
22589
+ capturedAt: number().optional(),
22590
+ /** The operator's "every subject in this frame is boxed". Detector
22591
+ * evaluation keeps only complete frames: an unboxed subject would count as
22592
+ * a false positive. */
22593
+ complete: boolean()
22571
22594
  });
22572
22595
  /** Why a copy-on-select could not be honoured — named, never a silent skip. */
22573
22596
  var RetrainCopyRefusalSchema = _enum([
@@ -22588,6 +22611,51 @@ var RetrainFrameListSchema = object({
22588
22611
  /** What the page pre-selects — the native key frame when one survives. */
22589
22612
  autoPickMediaId: number().int().optional()
22590
22613
  });
22614
+ /**
22615
+ * Which frames an annotated export carries. Every field narrows; an empty
22616
+ * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
22617
+ * list owned by whoever trains (the training orchestrator), so `frameIds` is
22618
+ * the primitive a version export uses; `batchId` re-selects what an earlier
22619
+ * export carried (`exportedInBatch`).
22620
+ */
22621
+ var RetrainExportFilterSchema = object({
22622
+ deviceIds: array(number()).optional(),
22623
+ frameIds: array(string()).max(2e4).optional(),
22624
+ batchId: string().optional(),
22625
+ /** Only frames the operator marked complete (all subjects boxed). */
22626
+ completeOnly: boolean().optional()
22627
+ });
22628
+ /**
22629
+ * `frames`: the full frame copies, boxes in `annotations.json`.
22630
+ * `crops`: additionally one JPEG per subject, cut with the runtime detail-crop
22631
+ * convention — the classifier layout.
22632
+ */
22633
+ var RetrainExportLayoutSchema = _enum(["frames", "crops"]);
22634
+ /**
22635
+ * Where `writeRetrainArchive` streams the tar: one HTTP request whose body is
22636
+ * the archive, sent chunk by chunk. Covers a presigned PUT and a provider
22637
+ * addon's data-plane upload route alike. Headers are sent verbatim and never
22638
+ * logged.
22639
+ */
22640
+ var RetrainArchiveTargetSchema = object({
22641
+ kind: literal("http"),
22642
+ method: _enum(["PUT", "POST"]),
22643
+ url: string().url(),
22644
+ headers: record(string(), string()).optional()
22645
+ });
22646
+ var RetrainArchiveResultSchema = object({
22647
+ batchId: string(),
22648
+ frames: number().int(),
22649
+ crops: number().int(),
22650
+ annotations: number().int(),
22651
+ /** Frames planned but not shipped (unreadable copy, path too long). */
22652
+ missing: number().int(),
22653
+ bytes: number().int(),
22654
+ /** sha256 of the exact bytes sent. */
22655
+ sha256: string(),
22656
+ /** The target's HTTP status. */
22657
+ status: number().int()
22658
+ });
22591
22659
  /** What the operator asked the assist to look for. */
22592
22660
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
22593
22661
  kind: literal("package"),
@@ -23382,9 +23450,25 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
23382
23450
  }), RetrainTransitionResultSchema, {
23383
23451
  kind: "mutation",
23384
23452
  auth: "admin"
23385
- }), method(object({ deviceIds: array(number()).optional() }), object({ url: string() }), {
23453
+ }), method(RetrainExportFilterSchema.extend({ layout: RetrainExportLayoutSchema.optional() }), object({ url: string() }), {
23386
23454
  kind: "query",
23387
23455
  auth: "admin"
23456
+ }), method(object({
23457
+ deviceId: number(),
23458
+ trackId: string(),
23459
+ frameId: string(),
23460
+ complete: boolean()
23461
+ }), RetrainFrameSchema, {
23462
+ kind: "mutation",
23463
+ auth: "admin"
23464
+ }), method(object({
23465
+ filter: RetrainExportFilterSchema,
23466
+ layout: RetrainExportLayoutSchema,
23467
+ target: RetrainArchiveTargetSchema
23468
+ }), RetrainArchiveResultSchema, {
23469
+ kind: "mutation",
23470
+ auth: "admin",
23471
+ timeoutMs: 60 * 6e4
23388
23472
  }), method(object({
23389
23473
  /** Which of the three event tables owns the row. */
23390
23474
  ownerType: EventOwnerTypeSchema,
@@ -26714,7 +26798,19 @@ var SsoBridgeClaimsSchema = object({
26714
26798
  * editing a descriptor must not retroactively extend or shorten a link the
26715
26799
  * operator already consented to.
26716
26800
  */
26717
- refreshTtl: union([number().int().positive(), literal("never")]).optional()
26801
+ refreshTtl: union([number().int().positive(), literal("never")]).optional(),
26802
+ /**
26803
+ * Opaque handle of a hub-side LINK intent (D782). Set by an OIDC callback
26804
+ * that was started from a signed-in user's "Link" button: the finish then
26805
+ * links this identity to the intent's user instead of signing anyone in.
26806
+ * The handle carries no user id — the hub resolves it, single-use.
26807
+ */
26808
+ linkIntent: string().optional(),
26809
+ /**
26810
+ * Verified `iss` of the id_token behind an OIDC login bridge (D782). A
26811
+ * subject is unique only per issuer, so a link is bound to it.
26812
+ */
26813
+ issuer: string().optional()
26718
26814
  });
26719
26815
  method(object({
26720
26816
  claims: SsoBridgeClaimsSchema,
@@ -28649,7 +28745,22 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
28649
28745
  * field their hints were silently stripped by the schema and the
28650
28746
  * adaptive ladder started blind on the client's display size.
28651
28747
  */
28652
- hints: webrtcClientHintsSchema.optional()
28748
+ hints: webrtcClientHintsSchema.optional(),
28749
+ /**
28750
+ * Talk-back (D771): relay the PEER's audio to the device's speaker
28751
+ * through the `intercom` cap's push-talk triple. When `true` and the
28752
+ * offer lets the peer send audio, the answer's audio is `sendrecv`
28753
+ * and every inbound frame goes to `intercom.pushTalkAudio` for this
28754
+ * `deviceId`; absent/false answers `sendonly`, as for every viewer.
28755
+ *
28756
+ * TRUSTED-CALLER ONLY. Set by the Alexa export for an Echo on a camera
28757
+ * with `intercom`, when the linked user may control that camera. The
28758
+ * hub STRIPS it from every request-bound call (a browser), exactly as
28759
+ * it overwrites `relayOnly` — a viewer's talk permission is the
28760
+ * intercom cap's own surface (share tokens gate it there), and this
28761
+ * flag must not become a second door to the camera's speaker.
28762
+ */
28763
+ talkback: boolean().optional()
28653
28764
  }), object({
28654
28765
  sessionId: string(),
28655
28766
  sdpAnswer: string()
@@ -39003,6 +39114,32 @@ var TotpStatusSchema = object({
39003
39114
  /** Null when no row exists OR the row is still pending confirmation. */
39004
39115
  confirmedAt: number().nullable()
39005
39116
  });
39117
+ /**
39118
+ * user-management — singleton capability for user accounts, API keys,
39119
+ * and scoped tokens.
39120
+ *
39121
+ * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
39122
+ * — the subset check on `setUserScopes` / `createScopedToken` is moot
39123
+ * because non-admins never reach these. If/when we open non-admin
39124
+ * delegation, structural caller-scope subset check goes inside the
39125
+ * provider.
39126
+ */
39127
+ var ExternalIdentitySchema = object({
39128
+ /** Login-method id of the provider instance, e.g. `auth-oidc/authentik`. */
39129
+ provider: string(),
39130
+ /** The IdP's stable subject (`sub`) for this account. */
39131
+ subject: string(),
39132
+ /** The verified `iss` of the IdP the identity was linked under — `sub` is unique only per issuer. */
39133
+ issuer: string(),
39134
+ userId: string(),
39135
+ /** What the IdP called the account at link time (username / email) — display only. */
39136
+ label: string().optional(),
39137
+ linkedAt: number()
39138
+ });
39139
+ var ExternalIdentityKeySchema = object({
39140
+ provider: string().min(1),
39141
+ subject: string().min(1)
39142
+ });
39006
39143
  method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserInputSchema, UserSummarySchema, {
39007
39144
  kind: "mutation",
39008
39145
  auth: "admin",
@@ -39116,7 +39253,22 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
39116
39253
  userId: string(),
39117
39254
  username: string(),
39118
39255
  scopes: array(TokenScopeSchema)
39119
- }).nullable(), { access: "view" }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
39256
+ }).nullable(), { access: "view" }), method(object({ userId: string() }), array(ExternalIdentitySchema), { auth: "admin" }), method(ExternalIdentityKeySchema, object({
39257
+ userId: string(),
39258
+ issuer: string()
39259
+ }).nullable(), { auth: "admin" }), method(ExternalIdentityKeySchema.extend({
39260
+ userId: string(),
39261
+ issuer: string().min(1),
39262
+ label: string().optional()
39263
+ }), object({ success: literal(true) }), {
39264
+ kind: "mutation",
39265
+ auth: "admin",
39266
+ access: "create"
39267
+ }), method(ExternalIdentityKeySchema.extend({ userId: string() }), object({ success: boolean() }), {
39268
+ kind: "mutation",
39269
+ auth: "admin",
39270
+ access: "delete"
39271
+ }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
39120
39272
  kind: "mutation",
39121
39273
  auth: "admin",
39122
39274
  access: "delete"
@@ -45756,6 +45908,12 @@ Object.freeze({
45756
45908
  addonId: null,
45757
45909
  access: "create"
45758
45910
  },
45911
+ "pipelineAnalytics.setRetrainFrameComplete": {
45912
+ capName: "pipeline-analytics",
45913
+ capScope: "device",
45914
+ addonId: null,
45915
+ access: "create"
45916
+ },
45759
45917
  "pipelineAnalytics.setTrackFlags": {
45760
45918
  capName: "pipeline-analytics",
45761
45919
  capScope: "device",
@@ -45792,6 +45950,12 @@ Object.freeze({
45792
45950
  addonId: null,
45793
45951
  access: "delete"
45794
45952
  },
45953
+ "pipelineAnalytics.writeRetrainArchive": {
45954
+ capName: "pipeline-analytics",
45955
+ capScope: "device",
45956
+ addonId: null,
45957
+ access: "create"
45958
+ },
45795
45959
  "pipelineExecutor.cacheFrameInPool": {
45796
45960
  capName: "pipeline-executor",
45797
45961
  capScope: "system",
@@ -48144,18 +48308,36 @@ Object.freeze({
48144
48308
  addonId: null,
48145
48309
  access: "delete"
48146
48310
  },
48311
+ "userManagement.findUserByExternalIdentity": {
48312
+ capName: "user-management",
48313
+ capScope: "system",
48314
+ addonId: null,
48315
+ access: "view"
48316
+ },
48147
48317
  "userManagement.getTotpStatus": {
48148
48318
  capName: "user-management",
48149
48319
  capScope: "system",
48150
48320
  addonId: null,
48151
48321
  access: "view"
48152
48322
  },
48323
+ "userManagement.linkExternalIdentity": {
48324
+ capName: "user-management",
48325
+ capScope: "system",
48326
+ addonId: null,
48327
+ access: "create"
48328
+ },
48153
48329
  "userManagement.listApiKeys": {
48154
48330
  capName: "user-management",
48155
48331
  capScope: "system",
48156
48332
  addonId: null,
48157
48333
  access: "view"
48158
48334
  },
48335
+ "userManagement.listExternalIdentities": {
48336
+ capName: "user-management",
48337
+ capScope: "system",
48338
+ addonId: null,
48339
+ access: "view"
48340
+ },
48159
48341
  "userManagement.listOauthSessions": {
48160
48342
  capName: "user-management",
48161
48343
  capScope: "system",
@@ -48234,6 +48416,12 @@ Object.freeze({
48234
48416
  addonId: null,
48235
48417
  access: "create"
48236
48418
  },
48419
+ "userManagement.unlinkExternalIdentity": {
48420
+ capName: "user-management",
48421
+ capScope: "system",
48422
+ addonId: null,
48423
+ access: "delete"
48424
+ },
48237
48425
  "userManagement.updateUser": {
48238
48426
  capName: "user-management",
48239
48427
  capScope: "system",
@@ -51573,6 +51761,11 @@ Object.freeze({
51573
51761
  form: "single",
51574
51762
  optional: false
51575
51763
  }],
51764
+ "pipelineAnalytics.setRetrainFrameComplete": [{
51765
+ name: "deviceId",
51766
+ form: "single",
51767
+ optional: false
51768
+ }],
51576
51769
  "pipelineAnalytics.setTrackFlags": [{
51577
51770
  name: "deviceId",
51578
51771
  form: "single",
@@ -53724,7 +53917,7 @@ var homematicConfigSchema = object({
53724
53917
  enableGroups: boolean().default(true).describe("Enable groups (heating groups / VirtualDevices)"),
53725
53918
  enableBidcosWired: boolean().default(false).describe("Enable BidCos-Wired (HM-Wired)"),
53726
53919
  username: string().default("").describe("WebUI username (optional — enables names / rooms / sysvars)"),
53727
- password: string().default("").describe("WebUI password (optional)"),
53920
+ password: string().default("").describe("WebUI password (optional)").meta({ secret: true }),
53728
53921
  callbackHost: string().default("").describe("Address the CCU calls back to for event push (this hub LAN IP)"),
53729
53922
  callbackPort: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(1).max(65535).default(2128)).describe("Local XML-RPC callback server port"),
53730
53923
  tls: boolean().default(false).describe("Use TLS for the CCU transport")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homematic",
3
- "version": "1.2.128",
3
+ "version": "1.2.129",
4
4
  "description": "Homematic / HomematicIP (CCU3 / RaspberryMatic) device-provider addon for CamStack — wraps the nodehomematic library",
5
5
  "keywords": [
6
6
  "camstack",