@camstack/addon-provider-wyze 0.2.129 → 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 +268 -12
  2. package/dist/addon.mjs +268 -12
  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()
@@ -28935,6 +29046,59 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
28935
29046
  var RestartAddonResultSchema = unknown();
28936
29047
  var InstallPackageResultSchema = unknown();
28937
29048
  var ReloadPackagesResultSchema = unknown();
29049
+ /**
29050
+ * What an uninstall did on ONE node.
29051
+ * - `uninstalled` — removed: runner(s) stopped, caps gone, code deleted.
29052
+ * - `not-installed` — the node did not have it (nothing to do).
29053
+ * - `refused` — protected / bootstrap package; nothing touched.
29054
+ * - `failed` — attempted and did not complete; `error` says why.
29055
+ * - `pending-reconnect` — the node is OFFLINE: its record was pruned so the
29056
+ * back-fill never returns the package, and the stale-addon sweep removes the
29057
+ * copy when the node registers again (only once the hub no longer has it).
29058
+ */
29059
+ var UninstallNodeOutcomeSchema = _enum([
29060
+ "uninstalled",
29061
+ "not-installed",
29062
+ "refused",
29063
+ "failed",
29064
+ "pending-reconnect"
29065
+ ]);
29066
+ var UninstallNodeResultSchema = object({
29067
+ nodeId: string(),
29068
+ outcome: UninstallNodeOutcomeSchema,
29069
+ error: string().optional(),
29070
+ addonIds: array(string()).readonly(),
29071
+ runnersStopped: array(string()).readonly(),
29072
+ warnings: array(string()).readonly()
29073
+ });
29074
+ var UninstallPackageResultSchema = object({
29075
+ /** Every targeted node ended `uninstalled`, `not-installed` or `pending-reconnect`. */
29076
+ success: boolean(),
29077
+ packageName: string(),
29078
+ results: array(UninstallNodeResultSchema).readonly()
29079
+ });
29080
+ /**
29081
+ * `unreachable` lists online agents whose status read FAILED — absence from
29082
+ * `installations` is only "not installed" for a node that answered (D315).
29083
+ */
29084
+ var PackageInstallationsSchema = object({
29085
+ installations: array(object({
29086
+ packageName: string(),
29087
+ nodeId: string(),
29088
+ nodeName: string(),
29089
+ isHub: boolean(),
29090
+ isOnline: boolean(),
29091
+ version: string().nullable(),
29092
+ addonIds: array(string()).readonly(),
29093
+ source: _enum(["live", "recorded"]),
29094
+ /** The hub installs this package too. `false` on an agent row = an orphan. */
29095
+ onHub: boolean()
29096
+ })).readonly(),
29097
+ unreachable: array(object({
29098
+ nodeId: string(),
29099
+ error: string()
29100
+ })).readonly()
29101
+ });
28938
29102
  var BulkUpdateItemStatusSchema = _enum([
28939
29103
  "queued",
28940
29104
  "updating",
@@ -29017,10 +29181,14 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
29017
29181
  }), method(object({ packageName: string() }), InstallPackageResultSchema, {
29018
29182
  kind: "mutation",
29019
29183
  auth: "admin"
29020
- }), method(_void(), boolean()), method(_void(), array(unknown()).readonly()), method(object({ packageName: string() }), unknown(), {
29184
+ }), method(_void(), boolean()), method(_void(), array(unknown()).readonly()), method(object({
29185
+ packageName: string().min(1),
29186
+ nodeId: string().optional(),
29187
+ everywhere: boolean().optional()
29188
+ }), UninstallPackageResultSchema, {
29021
29189
  kind: "mutation",
29022
29190
  auth: "admin"
29023
- }), method(_void(), ReloadPackagesResultSchema, {
29191
+ }), method(object({ packageName: string().optional() }), PackageInstallationsSchema, { auth: "admin" }), method(_void(), ReloadPackagesResultSchema, {
29024
29192
  kind: "mutation",
29025
29193
  auth: "admin"
29026
29194
  }), method(object({ query: string().optional() }), array(SearchResultSchema)), method(object({ nodeId: string().optional() }), array(PackageUpdateSchema).readonly(), { auth: "admin" }), method(object({
@@ -38938,6 +39106,32 @@ var TotpStatusSchema = object({
38938
39106
  /** Null when no row exists OR the row is still pending confirmation. */
38939
39107
  confirmedAt: number().nullable()
38940
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
+ });
38941
39135
  method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserInputSchema, UserSummarySchema, {
38942
39136
  kind: "mutation",
38943
39137
  auth: "admin",
@@ -39051,7 +39245,22 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
39051
39245
  userId: string(),
39052
39246
  username: string(),
39053
39247
  scopes: array(TokenScopeSchema)
39054
- }).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() }), {
39055
39264
  kind: "mutation",
39056
39265
  auth: "admin",
39057
39266
  access: "delete"
@@ -41461,6 +41670,12 @@ Object.freeze({
41461
41670
  addonId: null,
41462
41671
  access: "view"
41463
41672
  },
41673
+ "addons.listInstallations": {
41674
+ capName: "addons",
41675
+ capScope: "system",
41676
+ addonId: null,
41677
+ access: "view"
41678
+ },
41464
41679
  "addons.listJobs": {
41465
41680
  capName: "addons",
41466
41681
  capScope: "system",
@@ -45685,6 +45900,12 @@ Object.freeze({
45685
45900
  addonId: null,
45686
45901
  access: "create"
45687
45902
  },
45903
+ "pipelineAnalytics.setRetrainFrameComplete": {
45904
+ capName: "pipeline-analytics",
45905
+ capScope: "device",
45906
+ addonId: null,
45907
+ access: "create"
45908
+ },
45688
45909
  "pipelineAnalytics.setTrackFlags": {
45689
45910
  capName: "pipeline-analytics",
45690
45911
  capScope: "device",
@@ -45721,6 +45942,12 @@ Object.freeze({
45721
45942
  addonId: null,
45722
45943
  access: "delete"
45723
45944
  },
45945
+ "pipelineAnalytics.writeRetrainArchive": {
45946
+ capName: "pipeline-analytics",
45947
+ capScope: "device",
45948
+ addonId: null,
45949
+ access: "create"
45950
+ },
45724
45951
  "pipelineExecutor.cacheFrameInPool": {
45725
45952
  capName: "pipeline-executor",
45726
45953
  capScope: "system",
@@ -48073,18 +48300,36 @@ Object.freeze({
48073
48300
  addonId: null,
48074
48301
  access: "delete"
48075
48302
  },
48303
+ "userManagement.findUserByExternalIdentity": {
48304
+ capName: "user-management",
48305
+ capScope: "system",
48306
+ addonId: null,
48307
+ access: "view"
48308
+ },
48076
48309
  "userManagement.getTotpStatus": {
48077
48310
  capName: "user-management",
48078
48311
  capScope: "system",
48079
48312
  addonId: null,
48080
48313
  access: "view"
48081
48314
  },
48315
+ "userManagement.linkExternalIdentity": {
48316
+ capName: "user-management",
48317
+ capScope: "system",
48318
+ addonId: null,
48319
+ access: "create"
48320
+ },
48082
48321
  "userManagement.listApiKeys": {
48083
48322
  capName: "user-management",
48084
48323
  capScope: "system",
48085
48324
  addonId: null,
48086
48325
  access: "view"
48087
48326
  },
48327
+ "userManagement.listExternalIdentities": {
48328
+ capName: "user-management",
48329
+ capScope: "system",
48330
+ addonId: null,
48331
+ access: "view"
48332
+ },
48088
48333
  "userManagement.listOauthSessions": {
48089
48334
  capName: "user-management",
48090
48335
  capScope: "system",
@@ -48163,6 +48408,12 @@ Object.freeze({
48163
48408
  addonId: null,
48164
48409
  access: "create"
48165
48410
  },
48411
+ "userManagement.unlinkExternalIdentity": {
48412
+ capName: "user-management",
48413
+ capScope: "system",
48414
+ addonId: null,
48415
+ access: "delete"
48416
+ },
48166
48417
  "userManagement.updateUser": {
48167
48418
  capName: "user-management",
48168
48419
  capScope: "system",
@@ -51502,6 +51753,11 @@ Object.freeze({
51502
51753
  form: "single",
51503
51754
  optional: false
51504
51755
  }],
51756
+ "pipelineAnalytics.setRetrainFrameComplete": [{
51757
+ name: "deviceId",
51758
+ form: "single",
51759
+ optional: false
51760
+ }],
51505
51761
  "pipelineAnalytics.setTrackFlags": [{
51506
51762
  name: "deviceId",
51507
51763
  form: "single",
@@ -58184,8 +58440,8 @@ function defaultWyzeCloudFacadeFactory(credentials) {
58184
58440
  }
58185
58441
  var wyzeCredentialsSchema = object({
58186
58442
  email: string().min(1).describe("Wyze account email"),
58187
- password: string().min(1).describe("Wyze account password"),
58188
- 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 }),
58189
58445
  apiId: string().min(1).describe("Wyze developer Key ID")
58190
58446
  });
58191
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()
@@ -28914,6 +29025,59 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
28914
29025
  var RestartAddonResultSchema = unknown();
28915
29026
  var InstallPackageResultSchema = unknown();
28916
29027
  var ReloadPackagesResultSchema = unknown();
29028
+ /**
29029
+ * What an uninstall did on ONE node.
29030
+ * - `uninstalled` — removed: runner(s) stopped, caps gone, code deleted.
29031
+ * - `not-installed` — the node did not have it (nothing to do).
29032
+ * - `refused` — protected / bootstrap package; nothing touched.
29033
+ * - `failed` — attempted and did not complete; `error` says why.
29034
+ * - `pending-reconnect` — the node is OFFLINE: its record was pruned so the
29035
+ * back-fill never returns the package, and the stale-addon sweep removes the
29036
+ * copy when the node registers again (only once the hub no longer has it).
29037
+ */
29038
+ var UninstallNodeOutcomeSchema = _enum([
29039
+ "uninstalled",
29040
+ "not-installed",
29041
+ "refused",
29042
+ "failed",
29043
+ "pending-reconnect"
29044
+ ]);
29045
+ var UninstallNodeResultSchema = object({
29046
+ nodeId: string(),
29047
+ outcome: UninstallNodeOutcomeSchema,
29048
+ error: string().optional(),
29049
+ addonIds: array(string()).readonly(),
29050
+ runnersStopped: array(string()).readonly(),
29051
+ warnings: array(string()).readonly()
29052
+ });
29053
+ var UninstallPackageResultSchema = object({
29054
+ /** Every targeted node ended `uninstalled`, `not-installed` or `pending-reconnect`. */
29055
+ success: boolean(),
29056
+ packageName: string(),
29057
+ results: array(UninstallNodeResultSchema).readonly()
29058
+ });
29059
+ /**
29060
+ * `unreachable` lists online agents whose status read FAILED — absence from
29061
+ * `installations` is only "not installed" for a node that answered (D315).
29062
+ */
29063
+ var PackageInstallationsSchema = object({
29064
+ installations: array(object({
29065
+ packageName: string(),
29066
+ nodeId: string(),
29067
+ nodeName: string(),
29068
+ isHub: boolean(),
29069
+ isOnline: boolean(),
29070
+ version: string().nullable(),
29071
+ addonIds: array(string()).readonly(),
29072
+ source: _enum(["live", "recorded"]),
29073
+ /** The hub installs this package too. `false` on an agent row = an orphan. */
29074
+ onHub: boolean()
29075
+ })).readonly(),
29076
+ unreachable: array(object({
29077
+ nodeId: string(),
29078
+ error: string()
29079
+ })).readonly()
29080
+ });
28917
29081
  var BulkUpdateItemStatusSchema = _enum([
28918
29082
  "queued",
28919
29083
  "updating",
@@ -28996,10 +29160,14 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
28996
29160
  }), method(object({ packageName: string() }), InstallPackageResultSchema, {
28997
29161
  kind: "mutation",
28998
29162
  auth: "admin"
28999
- }), method(_void(), boolean()), method(_void(), array(unknown()).readonly()), method(object({ packageName: string() }), unknown(), {
29163
+ }), method(_void(), boolean()), method(_void(), array(unknown()).readonly()), method(object({
29164
+ packageName: string().min(1),
29165
+ nodeId: string().optional(),
29166
+ everywhere: boolean().optional()
29167
+ }), UninstallPackageResultSchema, {
29000
29168
  kind: "mutation",
29001
29169
  auth: "admin"
29002
- }), method(_void(), ReloadPackagesResultSchema, {
29170
+ }), method(object({ packageName: string().optional() }), PackageInstallationsSchema, { auth: "admin" }), method(_void(), ReloadPackagesResultSchema, {
29003
29171
  kind: "mutation",
29004
29172
  auth: "admin"
29005
29173
  }), method(object({ query: string().optional() }), array(SearchResultSchema)), method(object({ nodeId: string().optional() }), array(PackageUpdateSchema).readonly(), { auth: "admin" }), method(object({
@@ -38917,6 +39085,32 @@ var TotpStatusSchema = object({
38917
39085
  /** Null when no row exists OR the row is still pending confirmation. */
38918
39086
  confirmedAt: number().nullable()
38919
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
+ });
38920
39114
  method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserInputSchema, UserSummarySchema, {
38921
39115
  kind: "mutation",
38922
39116
  auth: "admin",
@@ -39030,7 +39224,22 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
39030
39224
  userId: string(),
39031
39225
  username: string(),
39032
39226
  scopes: array(TokenScopeSchema)
39033
- }).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() }), {
39034
39243
  kind: "mutation",
39035
39244
  auth: "admin",
39036
39245
  access: "delete"
@@ -41440,6 +41649,12 @@ Object.freeze({
41440
41649
  addonId: null,
41441
41650
  access: "view"
41442
41651
  },
41652
+ "addons.listInstallations": {
41653
+ capName: "addons",
41654
+ capScope: "system",
41655
+ addonId: null,
41656
+ access: "view"
41657
+ },
41443
41658
  "addons.listJobs": {
41444
41659
  capName: "addons",
41445
41660
  capScope: "system",
@@ -45664,6 +45879,12 @@ Object.freeze({
45664
45879
  addonId: null,
45665
45880
  access: "create"
45666
45881
  },
45882
+ "pipelineAnalytics.setRetrainFrameComplete": {
45883
+ capName: "pipeline-analytics",
45884
+ capScope: "device",
45885
+ addonId: null,
45886
+ access: "create"
45887
+ },
45667
45888
  "pipelineAnalytics.setTrackFlags": {
45668
45889
  capName: "pipeline-analytics",
45669
45890
  capScope: "device",
@@ -45700,6 +45921,12 @@ Object.freeze({
45700
45921
  addonId: null,
45701
45922
  access: "delete"
45702
45923
  },
45924
+ "pipelineAnalytics.writeRetrainArchive": {
45925
+ capName: "pipeline-analytics",
45926
+ capScope: "device",
45927
+ addonId: null,
45928
+ access: "create"
45929
+ },
45703
45930
  "pipelineExecutor.cacheFrameInPool": {
45704
45931
  capName: "pipeline-executor",
45705
45932
  capScope: "system",
@@ -48052,18 +48279,36 @@ Object.freeze({
48052
48279
  addonId: null,
48053
48280
  access: "delete"
48054
48281
  },
48282
+ "userManagement.findUserByExternalIdentity": {
48283
+ capName: "user-management",
48284
+ capScope: "system",
48285
+ addonId: null,
48286
+ access: "view"
48287
+ },
48055
48288
  "userManagement.getTotpStatus": {
48056
48289
  capName: "user-management",
48057
48290
  capScope: "system",
48058
48291
  addonId: null,
48059
48292
  access: "view"
48060
48293
  },
48294
+ "userManagement.linkExternalIdentity": {
48295
+ capName: "user-management",
48296
+ capScope: "system",
48297
+ addonId: null,
48298
+ access: "create"
48299
+ },
48061
48300
  "userManagement.listApiKeys": {
48062
48301
  capName: "user-management",
48063
48302
  capScope: "system",
48064
48303
  addonId: null,
48065
48304
  access: "view"
48066
48305
  },
48306
+ "userManagement.listExternalIdentities": {
48307
+ capName: "user-management",
48308
+ capScope: "system",
48309
+ addonId: null,
48310
+ access: "view"
48311
+ },
48067
48312
  "userManagement.listOauthSessions": {
48068
48313
  capName: "user-management",
48069
48314
  capScope: "system",
@@ -48142,6 +48387,12 @@ Object.freeze({
48142
48387
  addonId: null,
48143
48388
  access: "create"
48144
48389
  },
48390
+ "userManagement.unlinkExternalIdentity": {
48391
+ capName: "user-management",
48392
+ capScope: "system",
48393
+ addonId: null,
48394
+ access: "delete"
48395
+ },
48145
48396
  "userManagement.updateUser": {
48146
48397
  capName: "user-management",
48147
48398
  capScope: "system",
@@ -51481,6 +51732,11 @@ Object.freeze({
51481
51732
  form: "single",
51482
51733
  optional: false
51483
51734
  }],
51735
+ "pipelineAnalytics.setRetrainFrameComplete": [{
51736
+ name: "deviceId",
51737
+ form: "single",
51738
+ optional: false
51739
+ }],
51484
51740
  "pipelineAnalytics.setTrackFlags": [{
51485
51741
  name: "deviceId",
51486
51742
  form: "single",
@@ -58163,8 +58419,8 @@ function defaultWyzeCloudFacadeFactory(credentials) {
58163
58419
  }
58164
58420
  var wyzeCredentialsSchema = object({
58165
58421
  email: string().min(1).describe("Wyze account email"),
58166
- password: string().min(1).describe("Wyze account password"),
58167
- 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 }),
58168
58424
  apiId: string().min(1).describe("Wyze developer Key ID")
58169
58425
  });
58170
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.129",
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",