@camstack/addon-provider-dreo 0.2.121 → 0.2.122

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
@@ -5406,7 +5406,7 @@ var ZodIssueCode = {
5406
5406
  var ZodFirstPartyTypeKind;
5407
5407
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5408
5408
  //#endregion
5409
- //#region ../types/dist/sleep-BNeXenvr.mjs
5409
+ //#region ../types/dist/sleep-B0JG7-_F.mjs
5410
5410
  /**
5411
5411
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5412
5412
  * window to float samples (D455).
@@ -15132,6 +15132,10 @@ var DeviceInfoSchema = object({
15132
15132
  isCamera: boolean(),
15133
15133
  /** Current config values — serializable snapshot */
15134
15134
  config: record(string(), unknown()),
15135
+ /** Paths inside `config` the device's schema declares secret (D783) —
15136
+ * what the non-admin redaction withholds. Paths, never values. Absent
15137
+ * when the owning runner has not reported them. */
15138
+ secretConfigPaths: array(string()).optional(),
15135
15139
  /** Hardware + identity blob (manufacturer / model / firmware / sn /
15136
15140
  * uid / mac / …). Populated by drivers; editable via setMetadata. */
15137
15141
  metadata: record(string(), unknown()).nullable().optional(),
@@ -15337,7 +15341,13 @@ var DeviceRegisterPayloadSchema = object({
15337
15341
  * call (workers re-register on init), so probe-driven updates
15338
15342
  * (e.g. PTZ flag flipping after the abilities probe) propagate. */
15339
15343
  features: array(string()).optional(),
15340
- config: record(string(), unknown())
15344
+ config: record(string(), unknown()),
15345
+ /** Config paths the device's own schema DECLARES secret
15346
+ * (`.meta({ secret: true })` — dotted, `[]` for array items, e.g.
15347
+ * `connection.password`). Re-published on every register; the non-admin
15348
+ * redaction withholds them at any depth (D783). Optional: an older runner
15349
+ * omits it and the keyword backstop applies. */
15350
+ secretConfigPaths: array(string()).optional()
15341
15351
  });
15342
15352
  var DeviceRemovePayloadSchema = object({ deviceId: number() });
15343
15353
  var DevicePersistConfigPayloadSchema = object({
@@ -16996,7 +17006,14 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
16996
17006
  icon: string().optional(),
16997
17007
  /** Addon-owned HTTP route the button navigates to (GET). */
16998
17008
  startUrl: string(),
16999
- stage: LoginStageEnum
17009
+ stage: LoginStageEnum,
17010
+ /**
17011
+ * The provider names an external identity a signed-in user can link to
17012
+ * their own account (D782): `auth.listLinkableProviders` /
17013
+ * `beginExternalLink` offer exactly the redirect methods that set this,
17014
+ * whatever their id. Absent / false — a login button only (magic-link).
17015
+ */
17016
+ linkable: boolean().optional()
17000
17017
  }),
17001
17018
  object({
17002
17019
  kind: literal("widget"),
@@ -22431,7 +22448,13 @@ var RetrainFrameSchema = object({
22431
22448
  sizeBytes: number().int(),
22432
22449
  width: number().int(),
22433
22450
  height: number().int(),
22434
- copiedAt: number()
22451
+ copiedAt: number(),
22452
+ /** When the CAMERA captured the frame. Absent on a copy taken before D785. */
22453
+ capturedAt: number().optional(),
22454
+ /** The operator's "every subject in this frame is boxed". Detector
22455
+ * evaluation keeps only complete frames: an unboxed subject would count as
22456
+ * a false positive. */
22457
+ complete: boolean()
22435
22458
  });
22436
22459
  /** Why a copy-on-select could not be honoured — named, never a silent skip. */
22437
22460
  var RetrainCopyRefusalSchema = _enum([
@@ -22452,6 +22475,51 @@ var RetrainFrameListSchema = object({
22452
22475
  /** What the page pre-selects — the native key frame when one survives. */
22453
22476
  autoPickMediaId: number().int().optional()
22454
22477
  });
22478
+ /**
22479
+ * Which frames an annotated export carries. Every field narrows; an empty
22480
+ * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
22481
+ * list owned by whoever trains (the training orchestrator), so `frameIds` is
22482
+ * the primitive a version export uses; `batchId` re-selects what an earlier
22483
+ * export carried (`exportedInBatch`).
22484
+ */
22485
+ var RetrainExportFilterSchema = object({
22486
+ deviceIds: array(number()).optional(),
22487
+ frameIds: array(string()).max(2e4).optional(),
22488
+ batchId: string().optional(),
22489
+ /** Only frames the operator marked complete (all subjects boxed). */
22490
+ completeOnly: boolean().optional()
22491
+ });
22492
+ /**
22493
+ * `frames`: the full frame copies, boxes in `annotations.json`.
22494
+ * `crops`: additionally one JPEG per subject, cut with the runtime detail-crop
22495
+ * convention — the classifier layout.
22496
+ */
22497
+ var RetrainExportLayoutSchema = _enum(["frames", "crops"]);
22498
+ /**
22499
+ * Where `writeRetrainArchive` streams the tar: one HTTP request whose body is
22500
+ * the archive, sent chunk by chunk. Covers a presigned PUT and a provider
22501
+ * addon's data-plane upload route alike. Headers are sent verbatim and never
22502
+ * logged.
22503
+ */
22504
+ var RetrainArchiveTargetSchema = object({
22505
+ kind: literal("http"),
22506
+ method: _enum(["PUT", "POST"]),
22507
+ url: string().url(),
22508
+ headers: record(string(), string()).optional()
22509
+ });
22510
+ var RetrainArchiveResultSchema = object({
22511
+ batchId: string(),
22512
+ frames: number().int(),
22513
+ crops: number().int(),
22514
+ annotations: number().int(),
22515
+ /** Frames planned but not shipped (unreadable copy, path too long). */
22516
+ missing: number().int(),
22517
+ bytes: number().int(),
22518
+ /** sha256 of the exact bytes sent. */
22519
+ sha256: string(),
22520
+ /** The target's HTTP status. */
22521
+ status: number().int()
22522
+ });
22455
22523
  /** What the operator asked the assist to look for. */
22456
22524
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
22457
22525
  kind: literal("package"),
@@ -23246,9 +23314,25 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
23246
23314
  }), RetrainTransitionResultSchema, {
23247
23315
  kind: "mutation",
23248
23316
  auth: "admin"
23249
- }), method(object({ deviceIds: array(number()).optional() }), object({ url: string() }), {
23317
+ }), method(RetrainExportFilterSchema.extend({ layout: RetrainExportLayoutSchema.optional() }), object({ url: string() }), {
23250
23318
  kind: "query",
23251
23319
  auth: "admin"
23320
+ }), method(object({
23321
+ deviceId: number(),
23322
+ trackId: string(),
23323
+ frameId: string(),
23324
+ complete: boolean()
23325
+ }), RetrainFrameSchema, {
23326
+ kind: "mutation",
23327
+ auth: "admin"
23328
+ }), method(object({
23329
+ filter: RetrainExportFilterSchema,
23330
+ layout: RetrainExportLayoutSchema,
23331
+ target: RetrainArchiveTargetSchema
23332
+ }), RetrainArchiveResultSchema, {
23333
+ kind: "mutation",
23334
+ auth: "admin",
23335
+ timeoutMs: 60 * 6e4
23252
23336
  }), method(object({
23253
23337
  /** Which of the three event tables owns the row. */
23254
23338
  ownerType: EventOwnerTypeSchema,
@@ -26578,7 +26662,19 @@ var SsoBridgeClaimsSchema = object({
26578
26662
  * editing a descriptor must not retroactively extend or shorten a link the
26579
26663
  * operator already consented to.
26580
26664
  */
26581
- refreshTtl: union([number().int().positive(), literal("never")]).optional()
26665
+ refreshTtl: union([number().int().positive(), literal("never")]).optional(),
26666
+ /**
26667
+ * Opaque handle of a hub-side LINK intent (D782). Set by an OIDC callback
26668
+ * that was started from a signed-in user's "Link" button: the finish then
26669
+ * links this identity to the intent's user instead of signing anyone in.
26670
+ * The handle carries no user id — the hub resolves it, single-use.
26671
+ */
26672
+ linkIntent: string().optional(),
26673
+ /**
26674
+ * Verified `iss` of the id_token behind an OIDC login bridge (D782). A
26675
+ * subject is unique only per issuer, so a link is bound to it.
26676
+ */
26677
+ issuer: string().optional()
26582
26678
  });
26583
26679
  method(object({
26584
26680
  claims: SsoBridgeClaimsSchema,
@@ -28513,7 +28609,22 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
28513
28609
  * field their hints were silently stripped by the schema and the
28514
28610
  * adaptive ladder started blind on the client's display size.
28515
28611
  */
28516
- hints: webrtcClientHintsSchema.optional()
28612
+ hints: webrtcClientHintsSchema.optional(),
28613
+ /**
28614
+ * Talk-back (D771): relay the PEER's audio to the device's speaker
28615
+ * through the `intercom` cap's push-talk triple. When `true` and the
28616
+ * offer lets the peer send audio, the answer's audio is `sendrecv`
28617
+ * and every inbound frame goes to `intercom.pushTalkAudio` for this
28618
+ * `deviceId`; absent/false answers `sendonly`, as for every viewer.
28619
+ *
28620
+ * TRUSTED-CALLER ONLY. Set by the Alexa export for an Echo on a camera
28621
+ * with `intercom`, when the linked user may control that camera. The
28622
+ * hub STRIPS it from every request-bound call (a browser), exactly as
28623
+ * it overwrites `relayOnly` — a viewer's talk permission is the
28624
+ * intercom cap's own surface (share tokens gate it there), and this
28625
+ * flag must not become a second door to the camera's speaker.
28626
+ */
28627
+ talkback: boolean().optional()
28517
28628
  }), object({
28518
28629
  sessionId: string(),
28519
28630
  sdpAnswer: string()
@@ -38875,6 +38986,32 @@ var TotpStatusSchema = object({
38875
38986
  /** Null when no row exists OR the row is still pending confirmation. */
38876
38987
  confirmedAt: number().nullable()
38877
38988
  });
38989
+ /**
38990
+ * user-management — singleton capability for user accounts, API keys,
38991
+ * and scoped tokens.
38992
+ *
38993
+ * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
38994
+ * — the subset check on `setUserScopes` / `createScopedToken` is moot
38995
+ * because non-admins never reach these. If/when we open non-admin
38996
+ * delegation, structural caller-scope subset check goes inside the
38997
+ * provider.
38998
+ */
38999
+ var ExternalIdentitySchema = object({
39000
+ /** Login-method id of the provider instance, e.g. `auth-oidc/authentik`. */
39001
+ provider: string(),
39002
+ /** The IdP's stable subject (`sub`) for this account. */
39003
+ subject: string(),
39004
+ /** The verified `iss` of the IdP the identity was linked under — `sub` is unique only per issuer. */
39005
+ issuer: string(),
39006
+ userId: string(),
39007
+ /** What the IdP called the account at link time (username / email) — display only. */
39008
+ label: string().optional(),
39009
+ linkedAt: number()
39010
+ });
39011
+ var ExternalIdentityKeySchema = object({
39012
+ provider: string().min(1),
39013
+ subject: string().min(1)
39014
+ });
38878
39015
  method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserInputSchema, UserSummarySchema, {
38879
39016
  kind: "mutation",
38880
39017
  auth: "admin",
@@ -38988,7 +39125,22 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
38988
39125
  userId: string(),
38989
39126
  username: string(),
38990
39127
  scopes: array(TokenScopeSchema)
38991
- }).nullable(), { access: "view" }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
39128
+ }).nullable(), { access: "view" }), method(object({ userId: string() }), array(ExternalIdentitySchema), { auth: "admin" }), method(ExternalIdentityKeySchema, object({
39129
+ userId: string(),
39130
+ issuer: string()
39131
+ }).nullable(), { auth: "admin" }), method(ExternalIdentityKeySchema.extend({
39132
+ userId: string(),
39133
+ issuer: string().min(1),
39134
+ label: string().optional()
39135
+ }), object({ success: literal(true) }), {
39136
+ kind: "mutation",
39137
+ auth: "admin",
39138
+ access: "create"
39139
+ }), method(ExternalIdentityKeySchema.extend({ userId: string() }), object({ success: boolean() }), {
39140
+ kind: "mutation",
39141
+ auth: "admin",
39142
+ access: "delete"
39143
+ }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
38992
39144
  kind: "mutation",
38993
39145
  auth: "admin",
38994
39146
  access: "delete"
@@ -45628,6 +45780,12 @@ Object.freeze({
45628
45780
  addonId: null,
45629
45781
  access: "create"
45630
45782
  },
45783
+ "pipelineAnalytics.setRetrainFrameComplete": {
45784
+ capName: "pipeline-analytics",
45785
+ capScope: "device",
45786
+ addonId: null,
45787
+ access: "create"
45788
+ },
45631
45789
  "pipelineAnalytics.setTrackFlags": {
45632
45790
  capName: "pipeline-analytics",
45633
45791
  capScope: "device",
@@ -45664,6 +45822,12 @@ Object.freeze({
45664
45822
  addonId: null,
45665
45823
  access: "delete"
45666
45824
  },
45825
+ "pipelineAnalytics.writeRetrainArchive": {
45826
+ capName: "pipeline-analytics",
45827
+ capScope: "device",
45828
+ addonId: null,
45829
+ access: "create"
45830
+ },
45667
45831
  "pipelineExecutor.cacheFrameInPool": {
45668
45832
  capName: "pipeline-executor",
45669
45833
  capScope: "system",
@@ -48016,18 +48180,36 @@ Object.freeze({
48016
48180
  addonId: null,
48017
48181
  access: "delete"
48018
48182
  },
48183
+ "userManagement.findUserByExternalIdentity": {
48184
+ capName: "user-management",
48185
+ capScope: "system",
48186
+ addonId: null,
48187
+ access: "view"
48188
+ },
48019
48189
  "userManagement.getTotpStatus": {
48020
48190
  capName: "user-management",
48021
48191
  capScope: "system",
48022
48192
  addonId: null,
48023
48193
  access: "view"
48024
48194
  },
48195
+ "userManagement.linkExternalIdentity": {
48196
+ capName: "user-management",
48197
+ capScope: "system",
48198
+ addonId: null,
48199
+ access: "create"
48200
+ },
48025
48201
  "userManagement.listApiKeys": {
48026
48202
  capName: "user-management",
48027
48203
  capScope: "system",
48028
48204
  addonId: null,
48029
48205
  access: "view"
48030
48206
  },
48207
+ "userManagement.listExternalIdentities": {
48208
+ capName: "user-management",
48209
+ capScope: "system",
48210
+ addonId: null,
48211
+ access: "view"
48212
+ },
48031
48213
  "userManagement.listOauthSessions": {
48032
48214
  capName: "user-management",
48033
48215
  capScope: "system",
@@ -48106,6 +48288,12 @@ Object.freeze({
48106
48288
  addonId: null,
48107
48289
  access: "create"
48108
48290
  },
48291
+ "userManagement.unlinkExternalIdentity": {
48292
+ capName: "user-management",
48293
+ capScope: "system",
48294
+ addonId: null,
48295
+ access: "delete"
48296
+ },
48109
48297
  "userManagement.updateUser": {
48110
48298
  capName: "user-management",
48111
48299
  capScope: "system",
@@ -51445,6 +51633,11 @@ Object.freeze({
51445
51633
  form: "single",
51446
51634
  optional: false
51447
51635
  }],
51636
+ "pipelineAnalytics.setRetrainFrameComplete": [{
51637
+ name: "deviceId",
51638
+ form: "single",
51639
+ optional: false
51640
+ }],
51448
51641
  "pipelineAnalytics.setTrackFlags": [{
51449
51642
  name: "deviceId",
51450
51643
  form: "single",
@@ -53512,7 +53705,7 @@ var DreoRegionSchema = _enum(DREO_REGIONS);
53512
53705
  */
53513
53706
  var dreoConfigSchema = object({
53514
53707
  email: string().min(1).describe("Dreo account email"),
53515
- password: string().min(1).describe("Dreo account password"),
53708
+ password: string().min(1).describe("Dreo account password").meta({ secret: true }),
53516
53709
  region: DreoRegionSchema.default("us").describe("Dreo cloud region")
53517
53710
  });
53518
53711
  /**
package/dist/addon.mjs CHANGED
@@ -5407,7 +5407,7 @@ var ZodIssueCode = {
5407
5407
  var ZodFirstPartyTypeKind;
5408
5408
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5409
5409
  //#endregion
5410
- //#region ../types/dist/sleep-BNeXenvr.mjs
5410
+ //#region ../types/dist/sleep-B0JG7-_F.mjs
5411
5411
  /**
5412
5412
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5413
5413
  * window to float samples (D455).
@@ -15133,6 +15133,10 @@ var DeviceInfoSchema = object({
15133
15133
  isCamera: boolean(),
15134
15134
  /** Current config values — serializable snapshot */
15135
15135
  config: record(string(), unknown()),
15136
+ /** Paths inside `config` the device's schema declares secret (D783) —
15137
+ * what the non-admin redaction withholds. Paths, never values. Absent
15138
+ * when the owning runner has not reported them. */
15139
+ secretConfigPaths: array(string()).optional(),
15136
15140
  /** Hardware + identity blob (manufacturer / model / firmware / sn /
15137
15141
  * uid / mac / …). Populated by drivers; editable via setMetadata. */
15138
15142
  metadata: record(string(), unknown()).nullable().optional(),
@@ -15338,7 +15342,13 @@ var DeviceRegisterPayloadSchema = object({
15338
15342
  * call (workers re-register on init), so probe-driven updates
15339
15343
  * (e.g. PTZ flag flipping after the abilities probe) propagate. */
15340
15344
  features: array(string()).optional(),
15341
- config: record(string(), unknown())
15345
+ config: record(string(), unknown()),
15346
+ /** Config paths the device's own schema DECLARES secret
15347
+ * (`.meta({ secret: true })` — dotted, `[]` for array items, e.g.
15348
+ * `connection.password`). Re-published on every register; the non-admin
15349
+ * redaction withholds them at any depth (D783). Optional: an older runner
15350
+ * omits it and the keyword backstop applies. */
15351
+ secretConfigPaths: array(string()).optional()
15342
15352
  });
15343
15353
  var DeviceRemovePayloadSchema = object({ deviceId: number() });
15344
15354
  var DevicePersistConfigPayloadSchema = object({
@@ -16997,7 +17007,14 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
16997
17007
  icon: string().optional(),
16998
17008
  /** Addon-owned HTTP route the button navigates to (GET). */
16999
17009
  startUrl: string(),
17000
- stage: LoginStageEnum
17010
+ stage: LoginStageEnum,
17011
+ /**
17012
+ * The provider names an external identity a signed-in user can link to
17013
+ * their own account (D782): `auth.listLinkableProviders` /
17014
+ * `beginExternalLink` offer exactly the redirect methods that set this,
17015
+ * whatever their id. Absent / false — a login button only (magic-link).
17016
+ */
17017
+ linkable: boolean().optional()
17001
17018
  }),
17002
17019
  object({
17003
17020
  kind: literal("widget"),
@@ -22432,7 +22449,13 @@ var RetrainFrameSchema = object({
22432
22449
  sizeBytes: number().int(),
22433
22450
  width: number().int(),
22434
22451
  height: number().int(),
22435
- copiedAt: number()
22452
+ copiedAt: number(),
22453
+ /** When the CAMERA captured the frame. Absent on a copy taken before D785. */
22454
+ capturedAt: number().optional(),
22455
+ /** The operator's "every subject in this frame is boxed". Detector
22456
+ * evaluation keeps only complete frames: an unboxed subject would count as
22457
+ * a false positive. */
22458
+ complete: boolean()
22436
22459
  });
22437
22460
  /** Why a copy-on-select could not be honoured — named, never a silent skip. */
22438
22461
  var RetrainCopyRefusalSchema = _enum([
@@ -22453,6 +22476,51 @@ var RetrainFrameListSchema = object({
22453
22476
  /** What the page pre-selects — the native key frame when one survives. */
22454
22477
  autoPickMediaId: number().int().optional()
22455
22478
  });
22479
+ /**
22480
+ * Which frames an annotated export carries. Every field narrows; an empty
22481
+ * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
22482
+ * list owned by whoever trains (the training orchestrator), so `frameIds` is
22483
+ * the primitive a version export uses; `batchId` re-selects what an earlier
22484
+ * export carried (`exportedInBatch`).
22485
+ */
22486
+ var RetrainExportFilterSchema = object({
22487
+ deviceIds: array(number()).optional(),
22488
+ frameIds: array(string()).max(2e4).optional(),
22489
+ batchId: string().optional(),
22490
+ /** Only frames the operator marked complete (all subjects boxed). */
22491
+ completeOnly: boolean().optional()
22492
+ });
22493
+ /**
22494
+ * `frames`: the full frame copies, boxes in `annotations.json`.
22495
+ * `crops`: additionally one JPEG per subject, cut with the runtime detail-crop
22496
+ * convention — the classifier layout.
22497
+ */
22498
+ var RetrainExportLayoutSchema = _enum(["frames", "crops"]);
22499
+ /**
22500
+ * Where `writeRetrainArchive` streams the tar: one HTTP request whose body is
22501
+ * the archive, sent chunk by chunk. Covers a presigned PUT and a provider
22502
+ * addon's data-plane upload route alike. Headers are sent verbatim and never
22503
+ * logged.
22504
+ */
22505
+ var RetrainArchiveTargetSchema = object({
22506
+ kind: literal("http"),
22507
+ method: _enum(["PUT", "POST"]),
22508
+ url: string().url(),
22509
+ headers: record(string(), string()).optional()
22510
+ });
22511
+ var RetrainArchiveResultSchema = object({
22512
+ batchId: string(),
22513
+ frames: number().int(),
22514
+ crops: number().int(),
22515
+ annotations: number().int(),
22516
+ /** Frames planned but not shipped (unreadable copy, path too long). */
22517
+ missing: number().int(),
22518
+ bytes: number().int(),
22519
+ /** sha256 of the exact bytes sent. */
22520
+ sha256: string(),
22521
+ /** The target's HTTP status. */
22522
+ status: number().int()
22523
+ });
22456
22524
  /** What the operator asked the assist to look for. */
22457
22525
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
22458
22526
  kind: literal("package"),
@@ -23247,9 +23315,25 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
23247
23315
  }), RetrainTransitionResultSchema, {
23248
23316
  kind: "mutation",
23249
23317
  auth: "admin"
23250
- }), method(object({ deviceIds: array(number()).optional() }), object({ url: string() }), {
23318
+ }), method(RetrainExportFilterSchema.extend({ layout: RetrainExportLayoutSchema.optional() }), object({ url: string() }), {
23251
23319
  kind: "query",
23252
23320
  auth: "admin"
23321
+ }), method(object({
23322
+ deviceId: number(),
23323
+ trackId: string(),
23324
+ frameId: string(),
23325
+ complete: boolean()
23326
+ }), RetrainFrameSchema, {
23327
+ kind: "mutation",
23328
+ auth: "admin"
23329
+ }), method(object({
23330
+ filter: RetrainExportFilterSchema,
23331
+ layout: RetrainExportLayoutSchema,
23332
+ target: RetrainArchiveTargetSchema
23333
+ }), RetrainArchiveResultSchema, {
23334
+ kind: "mutation",
23335
+ auth: "admin",
23336
+ timeoutMs: 60 * 6e4
23253
23337
  }), method(object({
23254
23338
  /** Which of the three event tables owns the row. */
23255
23339
  ownerType: EventOwnerTypeSchema,
@@ -26579,7 +26663,19 @@ var SsoBridgeClaimsSchema = object({
26579
26663
  * editing a descriptor must not retroactively extend or shorten a link the
26580
26664
  * operator already consented to.
26581
26665
  */
26582
- refreshTtl: union([number().int().positive(), literal("never")]).optional()
26666
+ refreshTtl: union([number().int().positive(), literal("never")]).optional(),
26667
+ /**
26668
+ * Opaque handle of a hub-side LINK intent (D782). Set by an OIDC callback
26669
+ * that was started from a signed-in user's "Link" button: the finish then
26670
+ * links this identity to the intent's user instead of signing anyone in.
26671
+ * The handle carries no user id — the hub resolves it, single-use.
26672
+ */
26673
+ linkIntent: string().optional(),
26674
+ /**
26675
+ * Verified `iss` of the id_token behind an OIDC login bridge (D782). A
26676
+ * subject is unique only per issuer, so a link is bound to it.
26677
+ */
26678
+ issuer: string().optional()
26583
26679
  });
26584
26680
  method(object({
26585
26681
  claims: SsoBridgeClaimsSchema,
@@ -28514,7 +28610,22 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
28514
28610
  * field their hints were silently stripped by the schema and the
28515
28611
  * adaptive ladder started blind on the client's display size.
28516
28612
  */
28517
- hints: webrtcClientHintsSchema.optional()
28613
+ hints: webrtcClientHintsSchema.optional(),
28614
+ /**
28615
+ * Talk-back (D771): relay the PEER's audio to the device's speaker
28616
+ * through the `intercom` cap's push-talk triple. When `true` and the
28617
+ * offer lets the peer send audio, the answer's audio is `sendrecv`
28618
+ * and every inbound frame goes to `intercom.pushTalkAudio` for this
28619
+ * `deviceId`; absent/false answers `sendonly`, as for every viewer.
28620
+ *
28621
+ * TRUSTED-CALLER ONLY. Set by the Alexa export for an Echo on a camera
28622
+ * with `intercom`, when the linked user may control that camera. The
28623
+ * hub STRIPS it from every request-bound call (a browser), exactly as
28624
+ * it overwrites `relayOnly` — a viewer's talk permission is the
28625
+ * intercom cap's own surface (share tokens gate it there), and this
28626
+ * flag must not become a second door to the camera's speaker.
28627
+ */
28628
+ talkback: boolean().optional()
28518
28629
  }), object({
28519
28630
  sessionId: string(),
28520
28631
  sdpAnswer: string()
@@ -38876,6 +38987,32 @@ var TotpStatusSchema = object({
38876
38987
  /** Null when no row exists OR the row is still pending confirmation. */
38877
38988
  confirmedAt: number().nullable()
38878
38989
  });
38990
+ /**
38991
+ * user-management — singleton capability for user accounts, API keys,
38992
+ * and scoped tokens.
38993
+ *
38994
+ * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
38995
+ * — the subset check on `setUserScopes` / `createScopedToken` is moot
38996
+ * because non-admins never reach these. If/when we open non-admin
38997
+ * delegation, structural caller-scope subset check goes inside the
38998
+ * provider.
38999
+ */
39000
+ var ExternalIdentitySchema = object({
39001
+ /** Login-method id of the provider instance, e.g. `auth-oidc/authentik`. */
39002
+ provider: string(),
39003
+ /** The IdP's stable subject (`sub`) for this account. */
39004
+ subject: string(),
39005
+ /** The verified `iss` of the IdP the identity was linked under — `sub` is unique only per issuer. */
39006
+ issuer: string(),
39007
+ userId: string(),
39008
+ /** What the IdP called the account at link time (username / email) — display only. */
39009
+ label: string().optional(),
39010
+ linkedAt: number()
39011
+ });
39012
+ var ExternalIdentityKeySchema = object({
39013
+ provider: string().min(1),
39014
+ subject: string().min(1)
39015
+ });
38879
39016
  method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserInputSchema, UserSummarySchema, {
38880
39017
  kind: "mutation",
38881
39018
  auth: "admin",
@@ -38989,7 +39126,22 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
38989
39126
  userId: string(),
38990
39127
  username: string(),
38991
39128
  scopes: array(TokenScopeSchema)
38992
- }).nullable(), { access: "view" }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
39129
+ }).nullable(), { access: "view" }), method(object({ userId: string() }), array(ExternalIdentitySchema), { auth: "admin" }), method(ExternalIdentityKeySchema, object({
39130
+ userId: string(),
39131
+ issuer: string()
39132
+ }).nullable(), { auth: "admin" }), method(ExternalIdentityKeySchema.extend({
39133
+ userId: string(),
39134
+ issuer: string().min(1),
39135
+ label: string().optional()
39136
+ }), object({ success: literal(true) }), {
39137
+ kind: "mutation",
39138
+ auth: "admin",
39139
+ access: "create"
39140
+ }), method(ExternalIdentityKeySchema.extend({ userId: string() }), object({ success: boolean() }), {
39141
+ kind: "mutation",
39142
+ auth: "admin",
39143
+ access: "delete"
39144
+ }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
38993
39145
  kind: "mutation",
38994
39146
  auth: "admin",
38995
39147
  access: "delete"
@@ -45629,6 +45781,12 @@ Object.freeze({
45629
45781
  addonId: null,
45630
45782
  access: "create"
45631
45783
  },
45784
+ "pipelineAnalytics.setRetrainFrameComplete": {
45785
+ capName: "pipeline-analytics",
45786
+ capScope: "device",
45787
+ addonId: null,
45788
+ access: "create"
45789
+ },
45632
45790
  "pipelineAnalytics.setTrackFlags": {
45633
45791
  capName: "pipeline-analytics",
45634
45792
  capScope: "device",
@@ -45665,6 +45823,12 @@ Object.freeze({
45665
45823
  addonId: null,
45666
45824
  access: "delete"
45667
45825
  },
45826
+ "pipelineAnalytics.writeRetrainArchive": {
45827
+ capName: "pipeline-analytics",
45828
+ capScope: "device",
45829
+ addonId: null,
45830
+ access: "create"
45831
+ },
45668
45832
  "pipelineExecutor.cacheFrameInPool": {
45669
45833
  capName: "pipeline-executor",
45670
45834
  capScope: "system",
@@ -48017,18 +48181,36 @@ Object.freeze({
48017
48181
  addonId: null,
48018
48182
  access: "delete"
48019
48183
  },
48184
+ "userManagement.findUserByExternalIdentity": {
48185
+ capName: "user-management",
48186
+ capScope: "system",
48187
+ addonId: null,
48188
+ access: "view"
48189
+ },
48020
48190
  "userManagement.getTotpStatus": {
48021
48191
  capName: "user-management",
48022
48192
  capScope: "system",
48023
48193
  addonId: null,
48024
48194
  access: "view"
48025
48195
  },
48196
+ "userManagement.linkExternalIdentity": {
48197
+ capName: "user-management",
48198
+ capScope: "system",
48199
+ addonId: null,
48200
+ access: "create"
48201
+ },
48026
48202
  "userManagement.listApiKeys": {
48027
48203
  capName: "user-management",
48028
48204
  capScope: "system",
48029
48205
  addonId: null,
48030
48206
  access: "view"
48031
48207
  },
48208
+ "userManagement.listExternalIdentities": {
48209
+ capName: "user-management",
48210
+ capScope: "system",
48211
+ addonId: null,
48212
+ access: "view"
48213
+ },
48032
48214
  "userManagement.listOauthSessions": {
48033
48215
  capName: "user-management",
48034
48216
  capScope: "system",
@@ -48107,6 +48289,12 @@ Object.freeze({
48107
48289
  addonId: null,
48108
48290
  access: "create"
48109
48291
  },
48292
+ "userManagement.unlinkExternalIdentity": {
48293
+ capName: "user-management",
48294
+ capScope: "system",
48295
+ addonId: null,
48296
+ access: "delete"
48297
+ },
48110
48298
  "userManagement.updateUser": {
48111
48299
  capName: "user-management",
48112
48300
  capScope: "system",
@@ -51446,6 +51634,11 @@ Object.freeze({
51446
51634
  form: "single",
51447
51635
  optional: false
51448
51636
  }],
51637
+ "pipelineAnalytics.setRetrainFrameComplete": [{
51638
+ name: "deviceId",
51639
+ form: "single",
51640
+ optional: false
51641
+ }],
51449
51642
  "pipelineAnalytics.setTrackFlags": [{
51450
51643
  name: "deviceId",
51451
51644
  form: "single",
@@ -53513,7 +53706,7 @@ var DreoRegionSchema = _enum(DREO_REGIONS);
53513
53706
  */
53514
53707
  var dreoConfigSchema = object({
53515
53708
  email: string().min(1).describe("Dreo account email"),
53516
- password: string().min(1).describe("Dreo account password"),
53709
+ password: string().min(1).describe("Dreo account password").meta({ secret: true }),
53517
53710
  region: DreoRegionSchema.default("us").describe("Dreo cloud region")
53518
53711
  });
53519
53712
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-dreo",
3
- "version": "0.2.121",
3
+ "version": "0.2.122",
4
4
  "description": "Dreo smart-device (fan / air-circulator / purifier / heater / humidifier) device-provider addon for CamStack — wraps the @apocaliss92/nodedreo Dreo cloud client (REST + WebSocket)",
5
5
  "keywords": [
6
6
  "camstack",