@camstack/addon-provider-dreame 0.2.128 → 0.2.129

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -58273,7 +58273,7 @@ var ZodIssueCode = {
58273
58273
  var ZodFirstPartyTypeKind;
58274
58274
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
58275
58275
  //#endregion
58276
- //#region ../types/dist/sleep-BNeXenvr.mjs
58276
+ //#region ../types/dist/sleep-B0JG7-_F.mjs
58277
58277
  /**
58278
58278
  * The audio chunk plane's byte format, and the ONE expansion from a coded
58279
58279
  * window to float samples (D455).
@@ -67999,6 +67999,10 @@ var DeviceInfoSchema = object({
67999
67999
  isCamera: boolean(),
68000
68000
  /** Current config values — serializable snapshot */
68001
68001
  config: record(string(), unknown()),
68002
+ /** Paths inside `config` the device's schema declares secret (D783) —
68003
+ * what the non-admin redaction withholds. Paths, never values. Absent
68004
+ * when the owning runner has not reported them. */
68005
+ secretConfigPaths: array(string()).optional(),
68002
68006
  /** Hardware + identity blob (manufacturer / model / firmware / sn /
68003
68007
  * uid / mac / …). Populated by drivers; editable via setMetadata. */
68004
68008
  metadata: record(string(), unknown()).nullable().optional(),
@@ -68204,7 +68208,13 @@ var DeviceRegisterPayloadSchema = object({
68204
68208
  * call (workers re-register on init), so probe-driven updates
68205
68209
  * (e.g. PTZ flag flipping after the abilities probe) propagate. */
68206
68210
  features: array(string()).optional(),
68207
- config: record(string(), unknown())
68211
+ config: record(string(), unknown()),
68212
+ /** Config paths the device's own schema DECLARES secret
68213
+ * (`.meta({ secret: true })` — dotted, `[]` for array items, e.g.
68214
+ * `connection.password`). Re-published on every register; the non-admin
68215
+ * redaction withholds them at any depth (D783). Optional: an older runner
68216
+ * omits it and the keyword backstop applies. */
68217
+ secretConfigPaths: array(string()).optional()
68208
68218
  });
68209
68219
  var DeviceRemovePayloadSchema = object({ deviceId: number() });
68210
68220
  var DevicePersistConfigPayloadSchema = object({
@@ -69875,7 +69885,14 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
69875
69885
  icon: string().optional(),
69876
69886
  /** Addon-owned HTTP route the button navigates to (GET). */
69877
69887
  startUrl: string(),
69878
- stage: LoginStageEnum
69888
+ stage: LoginStageEnum,
69889
+ /**
69890
+ * The provider names an external identity a signed-in user can link to
69891
+ * their own account (D782): `auth.listLinkableProviders` /
69892
+ * `beginExternalLink` offer exactly the redirect methods that set this,
69893
+ * whatever their id. Absent / false — a login button only (magic-link).
69894
+ */
69895
+ linkable: boolean().optional()
69879
69896
  }),
69880
69897
  object({
69881
69898
  kind: literal("widget"),
@@ -75310,7 +75327,13 @@ var RetrainFrameSchema = object({
75310
75327
  sizeBytes: number().int(),
75311
75328
  width: number().int(),
75312
75329
  height: number().int(),
75313
- copiedAt: number()
75330
+ copiedAt: number(),
75331
+ /** When the CAMERA captured the frame. Absent on a copy taken before D785. */
75332
+ capturedAt: number().optional(),
75333
+ /** The operator's "every subject in this frame is boxed". Detector
75334
+ * evaluation keeps only complete frames: an unboxed subject would count as
75335
+ * a false positive. */
75336
+ complete: boolean()
75314
75337
  });
75315
75338
  /** Why a copy-on-select could not be honoured — named, never a silent skip. */
75316
75339
  var RetrainCopyRefusalSchema = _enum([
@@ -75331,6 +75354,51 @@ var RetrainFrameListSchema = object({
75331
75354
  /** What the page pre-selects — the native key frame when one survives. */
75332
75355
  autoPickMediaId: number().int().optional()
75333
75356
  });
75357
+ /**
75358
+ * Which frames an annotated export carries. Every field narrows; an empty
75359
+ * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
75360
+ * list owned by whoever trains (the training orchestrator), so `frameIds` is
75361
+ * the primitive a version export uses; `batchId` re-selects what an earlier
75362
+ * export carried (`exportedInBatch`).
75363
+ */
75364
+ var RetrainExportFilterSchema = object({
75365
+ deviceIds: array(number()).optional(),
75366
+ frameIds: array(string()).max(2e4).optional(),
75367
+ batchId: string().optional(),
75368
+ /** Only frames the operator marked complete (all subjects boxed). */
75369
+ completeOnly: boolean().optional()
75370
+ });
75371
+ /**
75372
+ * `frames`: the full frame copies, boxes in `annotations.json`.
75373
+ * `crops`: additionally one JPEG per subject, cut with the runtime detail-crop
75374
+ * convention — the classifier layout.
75375
+ */
75376
+ var RetrainExportLayoutSchema = _enum(["frames", "crops"]);
75377
+ /**
75378
+ * Where `writeRetrainArchive` streams the tar: one HTTP request whose body is
75379
+ * the archive, sent chunk by chunk. Covers a presigned PUT and a provider
75380
+ * addon's data-plane upload route alike. Headers are sent verbatim and never
75381
+ * logged.
75382
+ */
75383
+ var RetrainArchiveTargetSchema = object({
75384
+ kind: literal("http"),
75385
+ method: _enum(["PUT", "POST"]),
75386
+ url: string().url(),
75387
+ headers: record(string(), string()).optional()
75388
+ });
75389
+ var RetrainArchiveResultSchema = object({
75390
+ batchId: string(),
75391
+ frames: number().int(),
75392
+ crops: number().int(),
75393
+ annotations: number().int(),
75394
+ /** Frames planned but not shipped (unreadable copy, path too long). */
75395
+ missing: number().int(),
75396
+ bytes: number().int(),
75397
+ /** sha256 of the exact bytes sent. */
75398
+ sha256: string(),
75399
+ /** The target's HTTP status. */
75400
+ status: number().int()
75401
+ });
75334
75402
  /** What the operator asked the assist to look for. */
75335
75403
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
75336
75404
  kind: literal("package"),
@@ -76125,9 +76193,25 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
76125
76193
  }), RetrainTransitionResultSchema, {
76126
76194
  kind: "mutation",
76127
76195
  auth: "admin"
76128
- }), method(object({ deviceIds: array(number()).optional() }), object({ url: string() }), {
76196
+ }), method(RetrainExportFilterSchema.extend({ layout: RetrainExportLayoutSchema.optional() }), object({ url: string() }), {
76129
76197
  kind: "query",
76130
76198
  auth: "admin"
76199
+ }), method(object({
76200
+ deviceId: number(),
76201
+ trackId: string(),
76202
+ frameId: string(),
76203
+ complete: boolean()
76204
+ }), RetrainFrameSchema, {
76205
+ kind: "mutation",
76206
+ auth: "admin"
76207
+ }), method(object({
76208
+ filter: RetrainExportFilterSchema,
76209
+ layout: RetrainExportLayoutSchema,
76210
+ target: RetrainArchiveTargetSchema
76211
+ }), RetrainArchiveResultSchema, {
76212
+ kind: "mutation",
76213
+ auth: "admin",
76214
+ timeoutMs: 60 * 6e4
76131
76215
  }), method(object({
76132
76216
  /** Which of the three event tables owns the row. */
76133
76217
  ownerType: EventOwnerTypeSchema,
@@ -79457,7 +79541,19 @@ var SsoBridgeClaimsSchema = object({
79457
79541
  * editing a descriptor must not retroactively extend or shorten a link the
79458
79542
  * operator already consented to.
79459
79543
  */
79460
- refreshTtl: union([number().int().positive(), literal("never")]).optional()
79544
+ refreshTtl: union([number().int().positive(), literal("never")]).optional(),
79545
+ /**
79546
+ * Opaque handle of a hub-side LINK intent (D782). Set by an OIDC callback
79547
+ * that was started from a signed-in user's "Link" button: the finish then
79548
+ * links this identity to the intent's user instead of signing anyone in.
79549
+ * The handle carries no user id — the hub resolves it, single-use.
79550
+ */
79551
+ linkIntent: string().optional(),
79552
+ /**
79553
+ * Verified `iss` of the id_token behind an OIDC login bridge (D782). A
79554
+ * subject is unique only per issuer, so a link is bound to it.
79555
+ */
79556
+ issuer: string().optional()
79461
79557
  });
79462
79558
  method(object({
79463
79559
  claims: SsoBridgeClaimsSchema,
@@ -81392,7 +81488,22 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
81392
81488
  * field their hints were silently stripped by the schema and the
81393
81489
  * adaptive ladder started blind on the client's display size.
81394
81490
  */
81395
- hints: webrtcClientHintsSchema.optional()
81491
+ hints: webrtcClientHintsSchema.optional(),
81492
+ /**
81493
+ * Talk-back (D771): relay the PEER's audio to the device's speaker
81494
+ * through the `intercom` cap's push-talk triple. When `true` and the
81495
+ * offer lets the peer send audio, the answer's audio is `sendrecv`
81496
+ * and every inbound frame goes to `intercom.pushTalkAudio` for this
81497
+ * `deviceId`; absent/false answers `sendonly`, as for every viewer.
81498
+ *
81499
+ * TRUSTED-CALLER ONLY. Set by the Alexa export for an Echo on a camera
81500
+ * with `intercom`, when the linked user may control that camera. The
81501
+ * hub STRIPS it from every request-bound call (a browser), exactly as
81502
+ * it overwrites `relayOnly` — a viewer's talk permission is the
81503
+ * intercom cap's own surface (share tokens gate it there), and this
81504
+ * flag must not become a second door to the camera's speaker.
81505
+ */
81506
+ talkback: boolean().optional()
81396
81507
  }), object({
81397
81508
  sessionId: string(),
81398
81509
  sdpAnswer: string()
@@ -91919,6 +92030,32 @@ var TotpStatusSchema = object({
91919
92030
  /** Null when no row exists OR the row is still pending confirmation. */
91920
92031
  confirmedAt: number().nullable()
91921
92032
  });
92033
+ /**
92034
+ * user-management — singleton capability for user accounts, API keys,
92035
+ * and scoped tokens.
92036
+ *
92037
+ * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
92038
+ * — the subset check on `setUserScopes` / `createScopedToken` is moot
92039
+ * because non-admins never reach these. If/when we open non-admin
92040
+ * delegation, structural caller-scope subset check goes inside the
92041
+ * provider.
92042
+ */
92043
+ var ExternalIdentitySchema = object({
92044
+ /** Login-method id of the provider instance, e.g. `auth-oidc/authentik`. */
92045
+ provider: string(),
92046
+ /** The IdP's stable subject (`sub`) for this account. */
92047
+ subject: string(),
92048
+ /** The verified `iss` of the IdP the identity was linked under — `sub` is unique only per issuer. */
92049
+ issuer: string(),
92050
+ userId: string(),
92051
+ /** What the IdP called the account at link time (username / email) — display only. */
92052
+ label: string().optional(),
92053
+ linkedAt: number()
92054
+ });
92055
+ var ExternalIdentityKeySchema = object({
92056
+ provider: string().min(1),
92057
+ subject: string().min(1)
92058
+ });
91922
92059
  method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserInputSchema, UserSummarySchema, {
91923
92060
  kind: "mutation",
91924
92061
  auth: "admin",
@@ -92032,7 +92169,22 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
92032
92169
  userId: string(),
92033
92170
  username: string(),
92034
92171
  scopes: array(TokenScopeSchema)
92035
- }).nullable(), { access: "view" }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
92172
+ }).nullable(), { access: "view" }), method(object({ userId: string() }), array(ExternalIdentitySchema), { auth: "admin" }), method(ExternalIdentityKeySchema, object({
92173
+ userId: string(),
92174
+ issuer: string()
92175
+ }).nullable(), { auth: "admin" }), method(ExternalIdentityKeySchema.extend({
92176
+ userId: string(),
92177
+ issuer: string().min(1),
92178
+ label: string().optional()
92179
+ }), object({ success: literal(true) }), {
92180
+ kind: "mutation",
92181
+ auth: "admin",
92182
+ access: "create"
92183
+ }), method(ExternalIdentityKeySchema.extend({ userId: string() }), object({ success: boolean() }), {
92184
+ kind: "mutation",
92185
+ auth: "admin",
92186
+ access: "delete"
92187
+ }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
92036
92188
  kind: "mutation",
92037
92189
  auth: "admin",
92038
92190
  access: "delete"
@@ -98672,6 +98824,12 @@ Object.freeze({
98672
98824
  addonId: null,
98673
98825
  access: "create"
98674
98826
  },
98827
+ "pipelineAnalytics.setRetrainFrameComplete": {
98828
+ capName: "pipeline-analytics",
98829
+ capScope: "device",
98830
+ addonId: null,
98831
+ access: "create"
98832
+ },
98675
98833
  "pipelineAnalytics.setTrackFlags": {
98676
98834
  capName: "pipeline-analytics",
98677
98835
  capScope: "device",
@@ -98708,6 +98866,12 @@ Object.freeze({
98708
98866
  addonId: null,
98709
98867
  access: "delete"
98710
98868
  },
98869
+ "pipelineAnalytics.writeRetrainArchive": {
98870
+ capName: "pipeline-analytics",
98871
+ capScope: "device",
98872
+ addonId: null,
98873
+ access: "create"
98874
+ },
98711
98875
  "pipelineExecutor.cacheFrameInPool": {
98712
98876
  capName: "pipeline-executor",
98713
98877
  capScope: "system",
@@ -101060,18 +101224,36 @@ Object.freeze({
101060
101224
  addonId: null,
101061
101225
  access: "delete"
101062
101226
  },
101227
+ "userManagement.findUserByExternalIdentity": {
101228
+ capName: "user-management",
101229
+ capScope: "system",
101230
+ addonId: null,
101231
+ access: "view"
101232
+ },
101063
101233
  "userManagement.getTotpStatus": {
101064
101234
  capName: "user-management",
101065
101235
  capScope: "system",
101066
101236
  addonId: null,
101067
101237
  access: "view"
101068
101238
  },
101239
+ "userManagement.linkExternalIdentity": {
101240
+ capName: "user-management",
101241
+ capScope: "system",
101242
+ addonId: null,
101243
+ access: "create"
101244
+ },
101069
101245
  "userManagement.listApiKeys": {
101070
101246
  capName: "user-management",
101071
101247
  capScope: "system",
101072
101248
  addonId: null,
101073
101249
  access: "view"
101074
101250
  },
101251
+ "userManagement.listExternalIdentities": {
101252
+ capName: "user-management",
101253
+ capScope: "system",
101254
+ addonId: null,
101255
+ access: "view"
101256
+ },
101075
101257
  "userManagement.listOauthSessions": {
101076
101258
  capName: "user-management",
101077
101259
  capScope: "system",
@@ -101150,6 +101332,12 @@ Object.freeze({
101150
101332
  addonId: null,
101151
101333
  access: "create"
101152
101334
  },
101335
+ "userManagement.unlinkExternalIdentity": {
101336
+ capName: "user-management",
101337
+ capScope: "system",
101338
+ addonId: null,
101339
+ access: "delete"
101340
+ },
101153
101341
  "userManagement.updateUser": {
101154
101342
  capName: "user-management",
101155
101343
  capScope: "system",
@@ -104489,6 +104677,11 @@ Object.freeze({
104489
104677
  form: "single",
104490
104678
  optional: false
104491
104679
  }],
104680
+ "pipelineAnalytics.setRetrainFrameComplete": [{
104681
+ name: "deviceId",
104682
+ form: "single",
104683
+ optional: false
104684
+ }],
104492
104685
  "pipelineAnalytics.setTrackFlags": [{
104493
104686
  name: "deviceId",
104494
104687
  form: "single",
@@ -106574,7 +106767,7 @@ var DreameRegionSchema = _enum(DREAME_REGIONS);
106574
106767
  */
106575
106768
  var dreameConfigSchema = object({
106576
106769
  username: string().min(1).describe("Dreamehome account email / username"),
106577
- password: string().min(1).describe("Dreamehome account password"),
106770
+ password: string().min(1).describe("Dreamehome account password").meta({ secret: true }),
106578
106771
  region: DreameRegionSchema.default("eu").describe("Dreame cloud region"),
106579
106772
  pollIntervalMs: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(0).max(36e5).default(3e4)).describe("Poll fallback interval (ms) while MQTT push is down — 0 disables")
106580
106773
  });
@@ -108215,7 +108408,7 @@ var dreameChildSchema = object({
108215
108408
  }).optional(),
108216
108409
  navigationDisabledEntryIds: array(string()).optional(),
108217
108410
  /** Privacy PIN set at pairing — required to wake a coded camera (camera child only). */
108218
- navigationAccessCode: string().optional(),
108411
+ navigationAccessCode: string().optional().meta({ secret: true }),
108219
108412
  /**
108220
108413
  * The video backend the robot should sit on (camera child only).
108221
108414
  *
package/dist/addon.mjs CHANGED
@@ -58270,7 +58270,7 @@ var ZodIssueCode = {
58270
58270
  var ZodFirstPartyTypeKind;
58271
58271
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
58272
58272
  //#endregion
58273
- //#region ../types/dist/sleep-BNeXenvr.mjs
58273
+ //#region ../types/dist/sleep-B0JG7-_F.mjs
58274
58274
  /**
58275
58275
  * The audio chunk plane's byte format, and the ONE expansion from a coded
58276
58276
  * window to float samples (D455).
@@ -67996,6 +67996,10 @@ var DeviceInfoSchema = object({
67996
67996
  isCamera: boolean(),
67997
67997
  /** Current config values — serializable snapshot */
67998
67998
  config: record(string(), unknown()),
67999
+ /** Paths inside `config` the device's schema declares secret (D783) —
68000
+ * what the non-admin redaction withholds. Paths, never values. Absent
68001
+ * when the owning runner has not reported them. */
68002
+ secretConfigPaths: array(string()).optional(),
67999
68003
  /** Hardware + identity blob (manufacturer / model / firmware / sn /
68000
68004
  * uid / mac / …). Populated by drivers; editable via setMetadata. */
68001
68005
  metadata: record(string(), unknown()).nullable().optional(),
@@ -68201,7 +68205,13 @@ var DeviceRegisterPayloadSchema = object({
68201
68205
  * call (workers re-register on init), so probe-driven updates
68202
68206
  * (e.g. PTZ flag flipping after the abilities probe) propagate. */
68203
68207
  features: array(string()).optional(),
68204
- config: record(string(), unknown())
68208
+ config: record(string(), unknown()),
68209
+ /** Config paths the device's own schema DECLARES secret
68210
+ * (`.meta({ secret: true })` — dotted, `[]` for array items, e.g.
68211
+ * `connection.password`). Re-published on every register; the non-admin
68212
+ * redaction withholds them at any depth (D783). Optional: an older runner
68213
+ * omits it and the keyword backstop applies. */
68214
+ secretConfigPaths: array(string()).optional()
68205
68215
  });
68206
68216
  var DeviceRemovePayloadSchema = object({ deviceId: number() });
68207
68217
  var DevicePersistConfigPayloadSchema = object({
@@ -69872,7 +69882,14 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
69872
69882
  icon: string().optional(),
69873
69883
  /** Addon-owned HTTP route the button navigates to (GET). */
69874
69884
  startUrl: string(),
69875
- stage: LoginStageEnum
69885
+ stage: LoginStageEnum,
69886
+ /**
69887
+ * The provider names an external identity a signed-in user can link to
69888
+ * their own account (D782): `auth.listLinkableProviders` /
69889
+ * `beginExternalLink` offer exactly the redirect methods that set this,
69890
+ * whatever their id. Absent / false — a login button only (magic-link).
69891
+ */
69892
+ linkable: boolean().optional()
69876
69893
  }),
69877
69894
  object({
69878
69895
  kind: literal("widget"),
@@ -75307,7 +75324,13 @@ var RetrainFrameSchema = object({
75307
75324
  sizeBytes: number().int(),
75308
75325
  width: number().int(),
75309
75326
  height: number().int(),
75310
- copiedAt: number()
75327
+ copiedAt: number(),
75328
+ /** When the CAMERA captured the frame. Absent on a copy taken before D785. */
75329
+ capturedAt: number().optional(),
75330
+ /** The operator's "every subject in this frame is boxed". Detector
75331
+ * evaluation keeps only complete frames: an unboxed subject would count as
75332
+ * a false positive. */
75333
+ complete: boolean()
75311
75334
  });
75312
75335
  /** Why a copy-on-select could not be honoured — named, never a silent skip. */
75313
75336
  var RetrainCopyRefusalSchema = _enum([
@@ -75328,6 +75351,51 @@ var RetrainFrameListSchema = object({
75328
75351
  /** What the page pre-selects — the native key frame when one survives. */
75329
75352
  autoPickMediaId: number().int().optional()
75330
75353
  });
75354
+ /**
75355
+ * Which frames an annotated export carries. Every field narrows; an empty
75356
+ * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
75357
+ * list owned by whoever trains (the training orchestrator), so `frameIds` is
75358
+ * the primitive a version export uses; `batchId` re-selects what an earlier
75359
+ * export carried (`exportedInBatch`).
75360
+ */
75361
+ var RetrainExportFilterSchema = object({
75362
+ deviceIds: array(number()).optional(),
75363
+ frameIds: array(string()).max(2e4).optional(),
75364
+ batchId: string().optional(),
75365
+ /** Only frames the operator marked complete (all subjects boxed). */
75366
+ completeOnly: boolean().optional()
75367
+ });
75368
+ /**
75369
+ * `frames`: the full frame copies, boxes in `annotations.json`.
75370
+ * `crops`: additionally one JPEG per subject, cut with the runtime detail-crop
75371
+ * convention — the classifier layout.
75372
+ */
75373
+ var RetrainExportLayoutSchema = _enum(["frames", "crops"]);
75374
+ /**
75375
+ * Where `writeRetrainArchive` streams the tar: one HTTP request whose body is
75376
+ * the archive, sent chunk by chunk. Covers a presigned PUT and a provider
75377
+ * addon's data-plane upload route alike. Headers are sent verbatim and never
75378
+ * logged.
75379
+ */
75380
+ var RetrainArchiveTargetSchema = object({
75381
+ kind: literal("http"),
75382
+ method: _enum(["PUT", "POST"]),
75383
+ url: string().url(),
75384
+ headers: record(string(), string()).optional()
75385
+ });
75386
+ var RetrainArchiveResultSchema = object({
75387
+ batchId: string(),
75388
+ frames: number().int(),
75389
+ crops: number().int(),
75390
+ annotations: number().int(),
75391
+ /** Frames planned but not shipped (unreadable copy, path too long). */
75392
+ missing: number().int(),
75393
+ bytes: number().int(),
75394
+ /** sha256 of the exact bytes sent. */
75395
+ sha256: string(),
75396
+ /** The target's HTTP status. */
75397
+ status: number().int()
75398
+ });
75331
75399
  /** What the operator asked the assist to look for. */
75332
75400
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
75333
75401
  kind: literal("package"),
@@ -76122,9 +76190,25 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
76122
76190
  }), RetrainTransitionResultSchema, {
76123
76191
  kind: "mutation",
76124
76192
  auth: "admin"
76125
- }), method(object({ deviceIds: array(number()).optional() }), object({ url: string() }), {
76193
+ }), method(RetrainExportFilterSchema.extend({ layout: RetrainExportLayoutSchema.optional() }), object({ url: string() }), {
76126
76194
  kind: "query",
76127
76195
  auth: "admin"
76196
+ }), method(object({
76197
+ deviceId: number(),
76198
+ trackId: string(),
76199
+ frameId: string(),
76200
+ complete: boolean()
76201
+ }), RetrainFrameSchema, {
76202
+ kind: "mutation",
76203
+ auth: "admin"
76204
+ }), method(object({
76205
+ filter: RetrainExportFilterSchema,
76206
+ layout: RetrainExportLayoutSchema,
76207
+ target: RetrainArchiveTargetSchema
76208
+ }), RetrainArchiveResultSchema, {
76209
+ kind: "mutation",
76210
+ auth: "admin",
76211
+ timeoutMs: 60 * 6e4
76128
76212
  }), method(object({
76129
76213
  /** Which of the three event tables owns the row. */
76130
76214
  ownerType: EventOwnerTypeSchema,
@@ -79454,7 +79538,19 @@ var SsoBridgeClaimsSchema = object({
79454
79538
  * editing a descriptor must not retroactively extend or shorten a link the
79455
79539
  * operator already consented to.
79456
79540
  */
79457
- refreshTtl: union([number().int().positive(), literal("never")]).optional()
79541
+ refreshTtl: union([number().int().positive(), literal("never")]).optional(),
79542
+ /**
79543
+ * Opaque handle of a hub-side LINK intent (D782). Set by an OIDC callback
79544
+ * that was started from a signed-in user's "Link" button: the finish then
79545
+ * links this identity to the intent's user instead of signing anyone in.
79546
+ * The handle carries no user id — the hub resolves it, single-use.
79547
+ */
79548
+ linkIntent: string().optional(),
79549
+ /**
79550
+ * Verified `iss` of the id_token behind an OIDC login bridge (D782). A
79551
+ * subject is unique only per issuer, so a link is bound to it.
79552
+ */
79553
+ issuer: string().optional()
79458
79554
  });
79459
79555
  method(object({
79460
79556
  claims: SsoBridgeClaimsSchema,
@@ -81389,7 +81485,22 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
81389
81485
  * field their hints were silently stripped by the schema and the
81390
81486
  * adaptive ladder started blind on the client's display size.
81391
81487
  */
81392
- hints: webrtcClientHintsSchema.optional()
81488
+ hints: webrtcClientHintsSchema.optional(),
81489
+ /**
81490
+ * Talk-back (D771): relay the PEER's audio to the device's speaker
81491
+ * through the `intercom` cap's push-talk triple. When `true` and the
81492
+ * offer lets the peer send audio, the answer's audio is `sendrecv`
81493
+ * and every inbound frame goes to `intercom.pushTalkAudio` for this
81494
+ * `deviceId`; absent/false answers `sendonly`, as for every viewer.
81495
+ *
81496
+ * TRUSTED-CALLER ONLY. Set by the Alexa export for an Echo on a camera
81497
+ * with `intercom`, when the linked user may control that camera. The
81498
+ * hub STRIPS it from every request-bound call (a browser), exactly as
81499
+ * it overwrites `relayOnly` — a viewer's talk permission is the
81500
+ * intercom cap's own surface (share tokens gate it there), and this
81501
+ * flag must not become a second door to the camera's speaker.
81502
+ */
81503
+ talkback: boolean().optional()
81393
81504
  }), object({
81394
81505
  sessionId: string(),
81395
81506
  sdpAnswer: string()
@@ -91916,6 +92027,32 @@ var TotpStatusSchema = object({
91916
92027
  /** Null when no row exists OR the row is still pending confirmation. */
91917
92028
  confirmedAt: number().nullable()
91918
92029
  });
92030
+ /**
92031
+ * user-management — singleton capability for user accounts, API keys,
92032
+ * and scoped tokens.
92033
+ *
92034
+ * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
92035
+ * — the subset check on `setUserScopes` / `createScopedToken` is moot
92036
+ * because non-admins never reach these. If/when we open non-admin
92037
+ * delegation, structural caller-scope subset check goes inside the
92038
+ * provider.
92039
+ */
92040
+ var ExternalIdentitySchema = object({
92041
+ /** Login-method id of the provider instance, e.g. `auth-oidc/authentik`. */
92042
+ provider: string(),
92043
+ /** The IdP's stable subject (`sub`) for this account. */
92044
+ subject: string(),
92045
+ /** The verified `iss` of the IdP the identity was linked under — `sub` is unique only per issuer. */
92046
+ issuer: string(),
92047
+ userId: string(),
92048
+ /** What the IdP called the account at link time (username / email) — display only. */
92049
+ label: string().optional(),
92050
+ linkedAt: number()
92051
+ });
92052
+ var ExternalIdentityKeySchema = object({
92053
+ provider: string().min(1),
92054
+ subject: string().min(1)
92055
+ });
91919
92056
  method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserInputSchema, UserSummarySchema, {
91920
92057
  kind: "mutation",
91921
92058
  auth: "admin",
@@ -92029,7 +92166,22 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
92029
92166
  userId: string(),
92030
92167
  username: string(),
92031
92168
  scopes: array(TokenScopeSchema)
92032
- }).nullable(), { access: "view" }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
92169
+ }).nullable(), { access: "view" }), method(object({ userId: string() }), array(ExternalIdentitySchema), { auth: "admin" }), method(ExternalIdentityKeySchema, object({
92170
+ userId: string(),
92171
+ issuer: string()
92172
+ }).nullable(), { auth: "admin" }), method(ExternalIdentityKeySchema.extend({
92173
+ userId: string(),
92174
+ issuer: string().min(1),
92175
+ label: string().optional()
92176
+ }), object({ success: literal(true) }), {
92177
+ kind: "mutation",
92178
+ auth: "admin",
92179
+ access: "create"
92180
+ }), method(ExternalIdentityKeySchema.extend({ userId: string() }), object({ success: boolean() }), {
92181
+ kind: "mutation",
92182
+ auth: "admin",
92183
+ access: "delete"
92184
+ }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
92033
92185
  kind: "mutation",
92034
92186
  auth: "admin",
92035
92187
  access: "delete"
@@ -98669,6 +98821,12 @@ Object.freeze({
98669
98821
  addonId: null,
98670
98822
  access: "create"
98671
98823
  },
98824
+ "pipelineAnalytics.setRetrainFrameComplete": {
98825
+ capName: "pipeline-analytics",
98826
+ capScope: "device",
98827
+ addonId: null,
98828
+ access: "create"
98829
+ },
98672
98830
  "pipelineAnalytics.setTrackFlags": {
98673
98831
  capName: "pipeline-analytics",
98674
98832
  capScope: "device",
@@ -98705,6 +98863,12 @@ Object.freeze({
98705
98863
  addonId: null,
98706
98864
  access: "delete"
98707
98865
  },
98866
+ "pipelineAnalytics.writeRetrainArchive": {
98867
+ capName: "pipeline-analytics",
98868
+ capScope: "device",
98869
+ addonId: null,
98870
+ access: "create"
98871
+ },
98708
98872
  "pipelineExecutor.cacheFrameInPool": {
98709
98873
  capName: "pipeline-executor",
98710
98874
  capScope: "system",
@@ -101057,18 +101221,36 @@ Object.freeze({
101057
101221
  addonId: null,
101058
101222
  access: "delete"
101059
101223
  },
101224
+ "userManagement.findUserByExternalIdentity": {
101225
+ capName: "user-management",
101226
+ capScope: "system",
101227
+ addonId: null,
101228
+ access: "view"
101229
+ },
101060
101230
  "userManagement.getTotpStatus": {
101061
101231
  capName: "user-management",
101062
101232
  capScope: "system",
101063
101233
  addonId: null,
101064
101234
  access: "view"
101065
101235
  },
101236
+ "userManagement.linkExternalIdentity": {
101237
+ capName: "user-management",
101238
+ capScope: "system",
101239
+ addonId: null,
101240
+ access: "create"
101241
+ },
101066
101242
  "userManagement.listApiKeys": {
101067
101243
  capName: "user-management",
101068
101244
  capScope: "system",
101069
101245
  addonId: null,
101070
101246
  access: "view"
101071
101247
  },
101248
+ "userManagement.listExternalIdentities": {
101249
+ capName: "user-management",
101250
+ capScope: "system",
101251
+ addonId: null,
101252
+ access: "view"
101253
+ },
101072
101254
  "userManagement.listOauthSessions": {
101073
101255
  capName: "user-management",
101074
101256
  capScope: "system",
@@ -101147,6 +101329,12 @@ Object.freeze({
101147
101329
  addonId: null,
101148
101330
  access: "create"
101149
101331
  },
101332
+ "userManagement.unlinkExternalIdentity": {
101333
+ capName: "user-management",
101334
+ capScope: "system",
101335
+ addonId: null,
101336
+ access: "delete"
101337
+ },
101150
101338
  "userManagement.updateUser": {
101151
101339
  capName: "user-management",
101152
101340
  capScope: "system",
@@ -104486,6 +104674,11 @@ Object.freeze({
104486
104674
  form: "single",
104487
104675
  optional: false
104488
104676
  }],
104677
+ "pipelineAnalytics.setRetrainFrameComplete": [{
104678
+ name: "deviceId",
104679
+ form: "single",
104680
+ optional: false
104681
+ }],
104489
104682
  "pipelineAnalytics.setTrackFlags": [{
104490
104683
  name: "deviceId",
104491
104684
  form: "single",
@@ -106571,7 +106764,7 @@ var DreameRegionSchema = _enum(DREAME_REGIONS);
106571
106764
  */
106572
106765
  var dreameConfigSchema = object({
106573
106766
  username: string().min(1).describe("Dreamehome account email / username"),
106574
- password: string().min(1).describe("Dreamehome account password"),
106767
+ password: string().min(1).describe("Dreamehome account password").meta({ secret: true }),
106575
106768
  region: DreameRegionSchema.default("eu").describe("Dreame cloud region"),
106576
106769
  pollIntervalMs: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(0).max(36e5).default(3e4)).describe("Poll fallback interval (ms) while MQTT push is down — 0 disables")
106577
106770
  });
@@ -108212,7 +108405,7 @@ var dreameChildSchema = object({
108212
108405
  }).optional(),
108213
108406
  navigationDisabledEntryIds: array(string()).optional(),
108214
108407
  /** Privacy PIN set at pairing — required to wake a coded camera (camera child only). */
108215
- navigationAccessCode: string().optional(),
108408
+ navigationAccessCode: string().optional().meta({ secret: true }),
108216
108409
  /**
108217
108410
  * The video backend the robot should sit on (camera child only).
108218
108411
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-dreame",
3
- "version": "0.2.128",
3
+ "version": "0.2.129",
4
4
  "description": "Dreame robot-vacuum / lawn-mower device-provider addon for CamStack — wraps the @apocaliss92/nodedreame Dreamehome cloud client",
5
5
  "keywords": [
6
6
  "camstack",