@camstack/addon-provider-wyze 0.2.130 → 0.2.131

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.
Files changed (3) hide show
  1. package/dist/addon.js +203 -10
  2. package/dist/addon.mjs +203 -10
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -5402,7 +5402,7 @@ var ZodIssueCode = {
5402
5402
  var ZodFirstPartyTypeKind;
5403
5403
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5404
5404
  //#endregion
5405
- //#region ../types/dist/sleep-BNeXenvr.mjs
5405
+ //#region ../types/dist/sleep-B0JG7-_F.mjs
5406
5406
  /**
5407
5407
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5408
5408
  * window to float samples (D455).
@@ -15148,6 +15148,10 @@ var DeviceInfoSchema = object({
15148
15148
  isCamera: boolean(),
15149
15149
  /** Current config values — serializable snapshot */
15150
15150
  config: record(string(), unknown()),
15151
+ /** Paths inside `config` the device's schema declares secret (D783) —
15152
+ * what the non-admin redaction withholds. Paths, never values. Absent
15153
+ * when the owning runner has not reported them. */
15154
+ secretConfigPaths: array(string()).optional(),
15151
15155
  /** Hardware + identity blob (manufacturer / model / firmware / sn /
15152
15156
  * uid / mac / …). Populated by drivers; editable via setMetadata. */
15153
15157
  metadata: record(string(), unknown()).nullable().optional(),
@@ -15353,7 +15357,13 @@ var DeviceRegisterPayloadSchema = object({
15353
15357
  * call (workers re-register on init), so probe-driven updates
15354
15358
  * (e.g. PTZ flag flipping after the abilities probe) propagate. */
15355
15359
  features: array(string()).optional(),
15356
- config: record(string(), unknown())
15360
+ config: record(string(), unknown()),
15361
+ /** Config paths the device's own schema DECLARES secret
15362
+ * (`.meta({ secret: true })` — dotted, `[]` for array items, e.g.
15363
+ * `connection.password`). Re-published on every register; the non-admin
15364
+ * redaction withholds them at any depth (D783). Optional: an older runner
15365
+ * omits it and the keyword backstop applies. */
15366
+ secretConfigPaths: array(string()).optional()
15357
15367
  });
15358
15368
  var DeviceRemovePayloadSchema = object({ deviceId: number() });
15359
15369
  var DevicePersistConfigPayloadSchema = object({
@@ -17012,7 +17022,14 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
17012
17022
  icon: string().optional(),
17013
17023
  /** Addon-owned HTTP route the button navigates to (GET). */
17014
17024
  startUrl: string(),
17015
- stage: LoginStageEnum
17025
+ stage: LoginStageEnum,
17026
+ /**
17027
+ * The provider names an external identity a signed-in user can link to
17028
+ * their own account (D782): `auth.listLinkableProviders` /
17029
+ * `beginExternalLink` offer exactly the redirect methods that set this,
17030
+ * whatever their id. Absent / false — a login button only (magic-link).
17031
+ */
17032
+ linkable: boolean().optional()
17016
17033
  }),
17017
17034
  object({
17018
17035
  kind: literal("widget"),
@@ -22447,7 +22464,13 @@ var RetrainFrameSchema = object({
22447
22464
  sizeBytes: number().int(),
22448
22465
  width: number().int(),
22449
22466
  height: number().int(),
22450
- copiedAt: number()
22467
+ copiedAt: number(),
22468
+ /** When the CAMERA captured the frame. Absent on a copy taken before D785. */
22469
+ capturedAt: number().optional(),
22470
+ /** The operator's "every subject in this frame is boxed". Detector
22471
+ * evaluation keeps only complete frames: an unboxed subject would count as
22472
+ * a false positive. */
22473
+ complete: boolean()
22451
22474
  });
22452
22475
  /** Why a copy-on-select could not be honoured — named, never a silent skip. */
22453
22476
  var RetrainCopyRefusalSchema = _enum([
@@ -22468,6 +22491,51 @@ var RetrainFrameListSchema = object({
22468
22491
  /** What the page pre-selects — the native key frame when one survives. */
22469
22492
  autoPickMediaId: number().int().optional()
22470
22493
  });
22494
+ /**
22495
+ * Which frames an annotated export carries. Every field narrows; an empty
22496
+ * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
22497
+ * list owned by whoever trains (the training orchestrator), so `frameIds` is
22498
+ * the primitive a version export uses; `batchId` re-selects what an earlier
22499
+ * export carried (`exportedInBatch`).
22500
+ */
22501
+ var RetrainExportFilterSchema = object({
22502
+ deviceIds: array(number()).optional(),
22503
+ frameIds: array(string()).max(2e4).optional(),
22504
+ batchId: string().optional(),
22505
+ /** Only frames the operator marked complete (all subjects boxed). */
22506
+ completeOnly: boolean().optional()
22507
+ });
22508
+ /**
22509
+ * `frames`: the full frame copies, boxes in `annotations.json`.
22510
+ * `crops`: additionally one JPEG per subject, cut with the runtime detail-crop
22511
+ * convention — the classifier layout.
22512
+ */
22513
+ var RetrainExportLayoutSchema = _enum(["frames", "crops"]);
22514
+ /**
22515
+ * Where `writeRetrainArchive` streams the tar: one HTTP request whose body is
22516
+ * the archive, sent chunk by chunk. Covers a presigned PUT and a provider
22517
+ * addon's data-plane upload route alike. Headers are sent verbatim and never
22518
+ * logged.
22519
+ */
22520
+ var RetrainArchiveTargetSchema = object({
22521
+ kind: literal("http"),
22522
+ method: _enum(["PUT", "POST"]),
22523
+ url: string().url(),
22524
+ headers: record(string(), string()).optional()
22525
+ });
22526
+ var RetrainArchiveResultSchema = object({
22527
+ batchId: string(),
22528
+ frames: number().int(),
22529
+ crops: number().int(),
22530
+ annotations: number().int(),
22531
+ /** Frames planned but not shipped (unreadable copy, path too long). */
22532
+ missing: number().int(),
22533
+ bytes: number().int(),
22534
+ /** sha256 of the exact bytes sent. */
22535
+ sha256: string(),
22536
+ /** The target's HTTP status. */
22537
+ status: number().int()
22538
+ });
22471
22539
  /** What the operator asked the assist to look for. */
22472
22540
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
22473
22541
  kind: literal("package"),
@@ -23262,9 +23330,25 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
23262
23330
  }), RetrainTransitionResultSchema, {
23263
23331
  kind: "mutation",
23264
23332
  auth: "admin"
23265
- }), method(object({ deviceIds: array(number()).optional() }), object({ url: string() }), {
23333
+ }), method(RetrainExportFilterSchema.extend({ layout: RetrainExportLayoutSchema.optional() }), object({ url: string() }), {
23266
23334
  kind: "query",
23267
23335
  auth: "admin"
23336
+ }), method(object({
23337
+ deviceId: number(),
23338
+ trackId: string(),
23339
+ frameId: string(),
23340
+ complete: boolean()
23341
+ }), RetrainFrameSchema, {
23342
+ kind: "mutation",
23343
+ auth: "admin"
23344
+ }), method(object({
23345
+ filter: RetrainExportFilterSchema,
23346
+ layout: RetrainExportLayoutSchema,
23347
+ target: RetrainArchiveTargetSchema
23348
+ }), RetrainArchiveResultSchema, {
23349
+ kind: "mutation",
23350
+ auth: "admin",
23351
+ timeoutMs: 60 * 6e4
23268
23352
  }), method(object({
23269
23353
  /** Which of the three event tables owns the row. */
23270
23354
  ownerType: EventOwnerTypeSchema,
@@ -26698,7 +26782,19 @@ var SsoBridgeClaimsSchema = object({
26698
26782
  * editing a descriptor must not retroactively extend or shorten a link the
26699
26783
  * operator already consented to.
26700
26784
  */
26701
- refreshTtl: union([number().int().positive(), literal("never")]).optional()
26785
+ refreshTtl: union([number().int().positive(), literal("never")]).optional(),
26786
+ /**
26787
+ * Opaque handle of a hub-side LINK intent (D782). Set by an OIDC callback
26788
+ * that was started from a signed-in user's "Link" button: the finish then
26789
+ * links this identity to the intent's user instead of signing anyone in.
26790
+ * The handle carries no user id — the hub resolves it, single-use.
26791
+ */
26792
+ linkIntent: string().optional(),
26793
+ /**
26794
+ * Verified `iss` of the id_token behind an OIDC login bridge (D782). A
26795
+ * subject is unique only per issuer, so a link is bound to it.
26796
+ */
26797
+ issuer: string().optional()
26702
26798
  });
26703
26799
  method(object({
26704
26800
  claims: SsoBridgeClaimsSchema,
@@ -28633,7 +28729,22 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
28633
28729
  * field their hints were silently stripped by the schema and the
28634
28730
  * adaptive ladder started blind on the client's display size.
28635
28731
  */
28636
- hints: webrtcClientHintsSchema.optional()
28732
+ hints: webrtcClientHintsSchema.optional(),
28733
+ /**
28734
+ * Talk-back (D771): relay the PEER's audio to the device's speaker
28735
+ * through the `intercom` cap's push-talk triple. When `true` and the
28736
+ * offer lets the peer send audio, the answer's audio is `sendrecv`
28737
+ * and every inbound frame goes to `intercom.pushTalkAudio` for this
28738
+ * `deviceId`; absent/false answers `sendonly`, as for every viewer.
28739
+ *
28740
+ * TRUSTED-CALLER ONLY. Set by the Alexa export for an Echo on a camera
28741
+ * with `intercom`, when the linked user may control that camera. The
28742
+ * hub STRIPS it from every request-bound call (a browser), exactly as
28743
+ * it overwrites `relayOnly` — a viewer's talk permission is the
28744
+ * intercom cap's own surface (share tokens gate it there), and this
28745
+ * flag must not become a second door to the camera's speaker.
28746
+ */
28747
+ talkback: boolean().optional()
28637
28748
  }), object({
28638
28749
  sessionId: string(),
28639
28750
  sdpAnswer: string()
@@ -38995,6 +39106,32 @@ var TotpStatusSchema = object({
38995
39106
  /** Null when no row exists OR the row is still pending confirmation. */
38996
39107
  confirmedAt: number().nullable()
38997
39108
  });
39109
+ /**
39110
+ * user-management — singleton capability for user accounts, API keys,
39111
+ * and scoped tokens.
39112
+ *
39113
+ * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
39114
+ * — the subset check on `setUserScopes` / `createScopedToken` is moot
39115
+ * because non-admins never reach these. If/when we open non-admin
39116
+ * delegation, structural caller-scope subset check goes inside the
39117
+ * provider.
39118
+ */
39119
+ var ExternalIdentitySchema = object({
39120
+ /** Login-method id of the provider instance, e.g. `auth-oidc/authentik`. */
39121
+ provider: string(),
39122
+ /** The IdP's stable subject (`sub`) for this account. */
39123
+ subject: string(),
39124
+ /** The verified `iss` of the IdP the identity was linked under — `sub` is unique only per issuer. */
39125
+ issuer: string(),
39126
+ userId: string(),
39127
+ /** What the IdP called the account at link time (username / email) — display only. */
39128
+ label: string().optional(),
39129
+ linkedAt: number()
39130
+ });
39131
+ var ExternalIdentityKeySchema = object({
39132
+ provider: string().min(1),
39133
+ subject: string().min(1)
39134
+ });
38998
39135
  method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserInputSchema, UserSummarySchema, {
38999
39136
  kind: "mutation",
39000
39137
  auth: "admin",
@@ -39108,7 +39245,22 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
39108
39245
  userId: string(),
39109
39246
  username: string(),
39110
39247
  scopes: array(TokenScopeSchema)
39111
- }).nullable(), { access: "view" }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
39248
+ }).nullable(), { access: "view" }), method(object({ userId: string() }), array(ExternalIdentitySchema), { auth: "admin" }), method(ExternalIdentityKeySchema, object({
39249
+ userId: string(),
39250
+ issuer: string()
39251
+ }).nullable(), { auth: "admin" }), method(ExternalIdentityKeySchema.extend({
39252
+ userId: string(),
39253
+ issuer: string().min(1),
39254
+ label: string().optional()
39255
+ }), object({ success: literal(true) }), {
39256
+ kind: "mutation",
39257
+ auth: "admin",
39258
+ access: "create"
39259
+ }), method(ExternalIdentityKeySchema.extend({ userId: string() }), object({ success: boolean() }), {
39260
+ kind: "mutation",
39261
+ auth: "admin",
39262
+ access: "delete"
39263
+ }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
39112
39264
  kind: "mutation",
39113
39265
  auth: "admin",
39114
39266
  access: "delete"
@@ -45748,6 +45900,12 @@ Object.freeze({
45748
45900
  addonId: null,
45749
45901
  access: "create"
45750
45902
  },
45903
+ "pipelineAnalytics.setRetrainFrameComplete": {
45904
+ capName: "pipeline-analytics",
45905
+ capScope: "device",
45906
+ addonId: null,
45907
+ access: "create"
45908
+ },
45751
45909
  "pipelineAnalytics.setTrackFlags": {
45752
45910
  capName: "pipeline-analytics",
45753
45911
  capScope: "device",
@@ -45784,6 +45942,12 @@ Object.freeze({
45784
45942
  addonId: null,
45785
45943
  access: "delete"
45786
45944
  },
45945
+ "pipelineAnalytics.writeRetrainArchive": {
45946
+ capName: "pipeline-analytics",
45947
+ capScope: "device",
45948
+ addonId: null,
45949
+ access: "create"
45950
+ },
45787
45951
  "pipelineExecutor.cacheFrameInPool": {
45788
45952
  capName: "pipeline-executor",
45789
45953
  capScope: "system",
@@ -48136,18 +48300,36 @@ Object.freeze({
48136
48300
  addonId: null,
48137
48301
  access: "delete"
48138
48302
  },
48303
+ "userManagement.findUserByExternalIdentity": {
48304
+ capName: "user-management",
48305
+ capScope: "system",
48306
+ addonId: null,
48307
+ access: "view"
48308
+ },
48139
48309
  "userManagement.getTotpStatus": {
48140
48310
  capName: "user-management",
48141
48311
  capScope: "system",
48142
48312
  addonId: null,
48143
48313
  access: "view"
48144
48314
  },
48315
+ "userManagement.linkExternalIdentity": {
48316
+ capName: "user-management",
48317
+ capScope: "system",
48318
+ addonId: null,
48319
+ access: "create"
48320
+ },
48145
48321
  "userManagement.listApiKeys": {
48146
48322
  capName: "user-management",
48147
48323
  capScope: "system",
48148
48324
  addonId: null,
48149
48325
  access: "view"
48150
48326
  },
48327
+ "userManagement.listExternalIdentities": {
48328
+ capName: "user-management",
48329
+ capScope: "system",
48330
+ addonId: null,
48331
+ access: "view"
48332
+ },
48151
48333
  "userManagement.listOauthSessions": {
48152
48334
  capName: "user-management",
48153
48335
  capScope: "system",
@@ -48226,6 +48408,12 @@ Object.freeze({
48226
48408
  addonId: null,
48227
48409
  access: "create"
48228
48410
  },
48411
+ "userManagement.unlinkExternalIdentity": {
48412
+ capName: "user-management",
48413
+ capScope: "system",
48414
+ addonId: null,
48415
+ access: "delete"
48416
+ },
48229
48417
  "userManagement.updateUser": {
48230
48418
  capName: "user-management",
48231
48419
  capScope: "system",
@@ -51565,6 +51753,11 @@ Object.freeze({
51565
51753
  form: "single",
51566
51754
  optional: false
51567
51755
  }],
51756
+ "pipelineAnalytics.setRetrainFrameComplete": [{
51757
+ name: "deviceId",
51758
+ form: "single",
51759
+ optional: false
51760
+ }],
51568
51761
  "pipelineAnalytics.setTrackFlags": [{
51569
51762
  name: "deviceId",
51570
51763
  form: "single",
@@ -58247,8 +58440,8 @@ function defaultWyzeCloudFacadeFactory(credentials) {
58247
58440
  }
58248
58441
  var wyzeCredentialsSchema = object({
58249
58442
  email: string().min(1).describe("Wyze account email"),
58250
- password: string().min(1).describe("Wyze account password"),
58251
- apiKey: string().min(1).describe("Wyze developer API key"),
58443
+ password: string().min(1).describe("Wyze account password").meta({ secret: true }),
58444
+ apiKey: string().min(1).describe("Wyze developer API key").meta({ secret: true }),
58252
58445
  apiId: string().min(1).describe("Wyze developer Key ID")
58253
58446
  });
58254
58447
  var TEST_LABEL = "Signs in to the Wyze cloud with these account credentials";
package/dist/addon.mjs CHANGED
@@ -5381,7 +5381,7 @@ var ZodIssueCode = {
5381
5381
  var ZodFirstPartyTypeKind;
5382
5382
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5383
5383
  //#endregion
5384
- //#region ../types/dist/sleep-BNeXenvr.mjs
5384
+ //#region ../types/dist/sleep-B0JG7-_F.mjs
5385
5385
  /**
5386
5386
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5387
5387
  * window to float samples (D455).
@@ -15127,6 +15127,10 @@ var DeviceInfoSchema = object({
15127
15127
  isCamera: boolean(),
15128
15128
  /** Current config values — serializable snapshot */
15129
15129
  config: record(string(), unknown()),
15130
+ /** Paths inside `config` the device's schema declares secret (D783) —
15131
+ * what the non-admin redaction withholds. Paths, never values. Absent
15132
+ * when the owning runner has not reported them. */
15133
+ secretConfigPaths: array(string()).optional(),
15130
15134
  /** Hardware + identity blob (manufacturer / model / firmware / sn /
15131
15135
  * uid / mac / …). Populated by drivers; editable via setMetadata. */
15132
15136
  metadata: record(string(), unknown()).nullable().optional(),
@@ -15332,7 +15336,13 @@ var DeviceRegisterPayloadSchema = object({
15332
15336
  * call (workers re-register on init), so probe-driven updates
15333
15337
  * (e.g. PTZ flag flipping after the abilities probe) propagate. */
15334
15338
  features: array(string()).optional(),
15335
- config: record(string(), unknown())
15339
+ config: record(string(), unknown()),
15340
+ /** Config paths the device's own schema DECLARES secret
15341
+ * (`.meta({ secret: true })` — dotted, `[]` for array items, e.g.
15342
+ * `connection.password`). Re-published on every register; the non-admin
15343
+ * redaction withholds them at any depth (D783). Optional: an older runner
15344
+ * omits it and the keyword backstop applies. */
15345
+ secretConfigPaths: array(string()).optional()
15336
15346
  });
15337
15347
  var DeviceRemovePayloadSchema = object({ deviceId: number() });
15338
15348
  var DevicePersistConfigPayloadSchema = object({
@@ -16991,7 +17001,14 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
16991
17001
  icon: string().optional(),
16992
17002
  /** Addon-owned HTTP route the button navigates to (GET). */
16993
17003
  startUrl: string(),
16994
- stage: LoginStageEnum
17004
+ stage: LoginStageEnum,
17005
+ /**
17006
+ * The provider names an external identity a signed-in user can link to
17007
+ * their own account (D782): `auth.listLinkableProviders` /
17008
+ * `beginExternalLink` offer exactly the redirect methods that set this,
17009
+ * whatever their id. Absent / false — a login button only (magic-link).
17010
+ */
17011
+ linkable: boolean().optional()
16995
17012
  }),
16996
17013
  object({
16997
17014
  kind: literal("widget"),
@@ -22426,7 +22443,13 @@ var RetrainFrameSchema = object({
22426
22443
  sizeBytes: number().int(),
22427
22444
  width: number().int(),
22428
22445
  height: number().int(),
22429
- copiedAt: number()
22446
+ copiedAt: number(),
22447
+ /** When the CAMERA captured the frame. Absent on a copy taken before D785. */
22448
+ capturedAt: number().optional(),
22449
+ /** The operator's "every subject in this frame is boxed". Detector
22450
+ * evaluation keeps only complete frames: an unboxed subject would count as
22451
+ * a false positive. */
22452
+ complete: boolean()
22430
22453
  });
22431
22454
  /** Why a copy-on-select could not be honoured — named, never a silent skip. */
22432
22455
  var RetrainCopyRefusalSchema = _enum([
@@ -22447,6 +22470,51 @@ var RetrainFrameListSchema = object({
22447
22470
  /** What the page pre-selects — the native key frame when one survives. */
22448
22471
  autoPickMediaId: number().int().optional()
22449
22472
  });
22473
+ /**
22474
+ * Which frames an annotated export carries. Every field narrows; an empty
22475
+ * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
22476
+ * list owned by whoever trains (the training orchestrator), so `frameIds` is
22477
+ * the primitive a version export uses; `batchId` re-selects what an earlier
22478
+ * export carried (`exportedInBatch`).
22479
+ */
22480
+ var RetrainExportFilterSchema = object({
22481
+ deviceIds: array(number()).optional(),
22482
+ frameIds: array(string()).max(2e4).optional(),
22483
+ batchId: string().optional(),
22484
+ /** Only frames the operator marked complete (all subjects boxed). */
22485
+ completeOnly: boolean().optional()
22486
+ });
22487
+ /**
22488
+ * `frames`: the full frame copies, boxes in `annotations.json`.
22489
+ * `crops`: additionally one JPEG per subject, cut with the runtime detail-crop
22490
+ * convention — the classifier layout.
22491
+ */
22492
+ var RetrainExportLayoutSchema = _enum(["frames", "crops"]);
22493
+ /**
22494
+ * Where `writeRetrainArchive` streams the tar: one HTTP request whose body is
22495
+ * the archive, sent chunk by chunk. Covers a presigned PUT and a provider
22496
+ * addon's data-plane upload route alike. Headers are sent verbatim and never
22497
+ * logged.
22498
+ */
22499
+ var RetrainArchiveTargetSchema = object({
22500
+ kind: literal("http"),
22501
+ method: _enum(["PUT", "POST"]),
22502
+ url: string().url(),
22503
+ headers: record(string(), string()).optional()
22504
+ });
22505
+ var RetrainArchiveResultSchema = object({
22506
+ batchId: string(),
22507
+ frames: number().int(),
22508
+ crops: number().int(),
22509
+ annotations: number().int(),
22510
+ /** Frames planned but not shipped (unreadable copy, path too long). */
22511
+ missing: number().int(),
22512
+ bytes: number().int(),
22513
+ /** sha256 of the exact bytes sent. */
22514
+ sha256: string(),
22515
+ /** The target's HTTP status. */
22516
+ status: number().int()
22517
+ });
22450
22518
  /** What the operator asked the assist to look for. */
22451
22519
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
22452
22520
  kind: literal("package"),
@@ -23241,9 +23309,25 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
23241
23309
  }), RetrainTransitionResultSchema, {
23242
23310
  kind: "mutation",
23243
23311
  auth: "admin"
23244
- }), method(object({ deviceIds: array(number()).optional() }), object({ url: string() }), {
23312
+ }), method(RetrainExportFilterSchema.extend({ layout: RetrainExportLayoutSchema.optional() }), object({ url: string() }), {
23245
23313
  kind: "query",
23246
23314
  auth: "admin"
23315
+ }), method(object({
23316
+ deviceId: number(),
23317
+ trackId: string(),
23318
+ frameId: string(),
23319
+ complete: boolean()
23320
+ }), RetrainFrameSchema, {
23321
+ kind: "mutation",
23322
+ auth: "admin"
23323
+ }), method(object({
23324
+ filter: RetrainExportFilterSchema,
23325
+ layout: RetrainExportLayoutSchema,
23326
+ target: RetrainArchiveTargetSchema
23327
+ }), RetrainArchiveResultSchema, {
23328
+ kind: "mutation",
23329
+ auth: "admin",
23330
+ timeoutMs: 60 * 6e4
23247
23331
  }), method(object({
23248
23332
  /** Which of the three event tables owns the row. */
23249
23333
  ownerType: EventOwnerTypeSchema,
@@ -26677,7 +26761,19 @@ var SsoBridgeClaimsSchema = object({
26677
26761
  * editing a descriptor must not retroactively extend or shorten a link the
26678
26762
  * operator already consented to.
26679
26763
  */
26680
- refreshTtl: union([number().int().positive(), literal("never")]).optional()
26764
+ refreshTtl: union([number().int().positive(), literal("never")]).optional(),
26765
+ /**
26766
+ * Opaque handle of a hub-side LINK intent (D782). Set by an OIDC callback
26767
+ * that was started from a signed-in user's "Link" button: the finish then
26768
+ * links this identity to the intent's user instead of signing anyone in.
26769
+ * The handle carries no user id — the hub resolves it, single-use.
26770
+ */
26771
+ linkIntent: string().optional(),
26772
+ /**
26773
+ * Verified `iss` of the id_token behind an OIDC login bridge (D782). A
26774
+ * subject is unique only per issuer, so a link is bound to it.
26775
+ */
26776
+ issuer: string().optional()
26681
26777
  });
26682
26778
  method(object({
26683
26779
  claims: SsoBridgeClaimsSchema,
@@ -28612,7 +28708,22 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
28612
28708
  * field their hints were silently stripped by the schema and the
28613
28709
  * adaptive ladder started blind on the client's display size.
28614
28710
  */
28615
- hints: webrtcClientHintsSchema.optional()
28711
+ hints: webrtcClientHintsSchema.optional(),
28712
+ /**
28713
+ * Talk-back (D771): relay the PEER's audio to the device's speaker
28714
+ * through the `intercom` cap's push-talk triple. When `true` and the
28715
+ * offer lets the peer send audio, the answer's audio is `sendrecv`
28716
+ * and every inbound frame goes to `intercom.pushTalkAudio` for this
28717
+ * `deviceId`; absent/false answers `sendonly`, as for every viewer.
28718
+ *
28719
+ * TRUSTED-CALLER ONLY. Set by the Alexa export for an Echo on a camera
28720
+ * with `intercom`, when the linked user may control that camera. The
28721
+ * hub STRIPS it from every request-bound call (a browser), exactly as
28722
+ * it overwrites `relayOnly` — a viewer's talk permission is the
28723
+ * intercom cap's own surface (share tokens gate it there), and this
28724
+ * flag must not become a second door to the camera's speaker.
28725
+ */
28726
+ talkback: boolean().optional()
28616
28727
  }), object({
28617
28728
  sessionId: string(),
28618
28729
  sdpAnswer: string()
@@ -38974,6 +39085,32 @@ var TotpStatusSchema = object({
38974
39085
  /** Null when no row exists OR the row is still pending confirmation. */
38975
39086
  confirmedAt: number().nullable()
38976
39087
  });
39088
+ /**
39089
+ * user-management — singleton capability for user accounts, API keys,
39090
+ * and scoped tokens.
39091
+ *
39092
+ * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
39093
+ * — the subset check on `setUserScopes` / `createScopedToken` is moot
39094
+ * because non-admins never reach these. If/when we open non-admin
39095
+ * delegation, structural caller-scope subset check goes inside the
39096
+ * provider.
39097
+ */
39098
+ var ExternalIdentitySchema = object({
39099
+ /** Login-method id of the provider instance, e.g. `auth-oidc/authentik`. */
39100
+ provider: string(),
39101
+ /** The IdP's stable subject (`sub`) for this account. */
39102
+ subject: string(),
39103
+ /** The verified `iss` of the IdP the identity was linked under — `sub` is unique only per issuer. */
39104
+ issuer: string(),
39105
+ userId: string(),
39106
+ /** What the IdP called the account at link time (username / email) — display only. */
39107
+ label: string().optional(),
39108
+ linkedAt: number()
39109
+ });
39110
+ var ExternalIdentityKeySchema = object({
39111
+ provider: string().min(1),
39112
+ subject: string().min(1)
39113
+ });
38977
39114
  method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserInputSchema, UserSummarySchema, {
38978
39115
  kind: "mutation",
38979
39116
  auth: "admin",
@@ -39087,7 +39224,22 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
39087
39224
  userId: string(),
39088
39225
  username: string(),
39089
39226
  scopes: array(TokenScopeSchema)
39090
- }).nullable(), { access: "view" }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
39227
+ }).nullable(), { access: "view" }), method(object({ userId: string() }), array(ExternalIdentitySchema), { auth: "admin" }), method(ExternalIdentityKeySchema, object({
39228
+ userId: string(),
39229
+ issuer: string()
39230
+ }).nullable(), { auth: "admin" }), method(ExternalIdentityKeySchema.extend({
39231
+ userId: string(),
39232
+ issuer: string().min(1),
39233
+ label: string().optional()
39234
+ }), object({ success: literal(true) }), {
39235
+ kind: "mutation",
39236
+ auth: "admin",
39237
+ access: "create"
39238
+ }), method(ExternalIdentityKeySchema.extend({ userId: string() }), object({ success: boolean() }), {
39239
+ kind: "mutation",
39240
+ auth: "admin",
39241
+ access: "delete"
39242
+ }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
39091
39243
  kind: "mutation",
39092
39244
  auth: "admin",
39093
39245
  access: "delete"
@@ -45727,6 +45879,12 @@ Object.freeze({
45727
45879
  addonId: null,
45728
45880
  access: "create"
45729
45881
  },
45882
+ "pipelineAnalytics.setRetrainFrameComplete": {
45883
+ capName: "pipeline-analytics",
45884
+ capScope: "device",
45885
+ addonId: null,
45886
+ access: "create"
45887
+ },
45730
45888
  "pipelineAnalytics.setTrackFlags": {
45731
45889
  capName: "pipeline-analytics",
45732
45890
  capScope: "device",
@@ -45763,6 +45921,12 @@ Object.freeze({
45763
45921
  addonId: null,
45764
45922
  access: "delete"
45765
45923
  },
45924
+ "pipelineAnalytics.writeRetrainArchive": {
45925
+ capName: "pipeline-analytics",
45926
+ capScope: "device",
45927
+ addonId: null,
45928
+ access: "create"
45929
+ },
45766
45930
  "pipelineExecutor.cacheFrameInPool": {
45767
45931
  capName: "pipeline-executor",
45768
45932
  capScope: "system",
@@ -48115,18 +48279,36 @@ Object.freeze({
48115
48279
  addonId: null,
48116
48280
  access: "delete"
48117
48281
  },
48282
+ "userManagement.findUserByExternalIdentity": {
48283
+ capName: "user-management",
48284
+ capScope: "system",
48285
+ addonId: null,
48286
+ access: "view"
48287
+ },
48118
48288
  "userManagement.getTotpStatus": {
48119
48289
  capName: "user-management",
48120
48290
  capScope: "system",
48121
48291
  addonId: null,
48122
48292
  access: "view"
48123
48293
  },
48294
+ "userManagement.linkExternalIdentity": {
48295
+ capName: "user-management",
48296
+ capScope: "system",
48297
+ addonId: null,
48298
+ access: "create"
48299
+ },
48124
48300
  "userManagement.listApiKeys": {
48125
48301
  capName: "user-management",
48126
48302
  capScope: "system",
48127
48303
  addonId: null,
48128
48304
  access: "view"
48129
48305
  },
48306
+ "userManagement.listExternalIdentities": {
48307
+ capName: "user-management",
48308
+ capScope: "system",
48309
+ addonId: null,
48310
+ access: "view"
48311
+ },
48130
48312
  "userManagement.listOauthSessions": {
48131
48313
  capName: "user-management",
48132
48314
  capScope: "system",
@@ -48205,6 +48387,12 @@ Object.freeze({
48205
48387
  addonId: null,
48206
48388
  access: "create"
48207
48389
  },
48390
+ "userManagement.unlinkExternalIdentity": {
48391
+ capName: "user-management",
48392
+ capScope: "system",
48393
+ addonId: null,
48394
+ access: "delete"
48395
+ },
48208
48396
  "userManagement.updateUser": {
48209
48397
  capName: "user-management",
48210
48398
  capScope: "system",
@@ -51544,6 +51732,11 @@ Object.freeze({
51544
51732
  form: "single",
51545
51733
  optional: false
51546
51734
  }],
51735
+ "pipelineAnalytics.setRetrainFrameComplete": [{
51736
+ name: "deviceId",
51737
+ form: "single",
51738
+ optional: false
51739
+ }],
51547
51740
  "pipelineAnalytics.setTrackFlags": [{
51548
51741
  name: "deviceId",
51549
51742
  form: "single",
@@ -58226,8 +58419,8 @@ function defaultWyzeCloudFacadeFactory(credentials) {
58226
58419
  }
58227
58420
  var wyzeCredentialsSchema = object({
58228
58421
  email: string().min(1).describe("Wyze account email"),
58229
- password: string().min(1).describe("Wyze account password"),
58230
- apiKey: string().min(1).describe("Wyze developer API key"),
58422
+ password: string().min(1).describe("Wyze account password").meta({ secret: true }),
58423
+ apiKey: string().min(1).describe("Wyze developer API key").meta({ secret: true }),
58231
58424
  apiId: string().min(1).describe("Wyze developer Key ID")
58232
58425
  });
58233
58426
  var TEST_LABEL = "Signs in to the Wyze cloud with these account credentials";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-wyze",
3
- "version": "0.2.130",
3
+ "version": "0.2.131",
4
4
  "description": "Wyze camera device-provider addon for CamStack — wraps the @apocaliss92/wyze-bridge-js P2P/DTLS client, feeding the stream-broker via the pull-rfc4571 lazy-publish path (a structural twin of addon-provider-reolink)",
5
5
  "keywords": [
6
6
  "camstack",