@camstack/addon-provider-dreame 0.2.127 → 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 +268 -12
  2. package/dist/addon.mjs +268 -12
  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()
@@ -81694,6 +81805,59 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
81694
81805
  var RestartAddonResultSchema = unknown();
81695
81806
  var InstallPackageResultSchema = unknown();
81696
81807
  var ReloadPackagesResultSchema = unknown();
81808
+ /**
81809
+ * What an uninstall did on ONE node.
81810
+ * - `uninstalled` — removed: runner(s) stopped, caps gone, code deleted.
81811
+ * - `not-installed` — the node did not have it (nothing to do).
81812
+ * - `refused` — protected / bootstrap package; nothing touched.
81813
+ * - `failed` — attempted and did not complete; `error` says why.
81814
+ * - `pending-reconnect` — the node is OFFLINE: its record was pruned so the
81815
+ * back-fill never returns the package, and the stale-addon sweep removes the
81816
+ * copy when the node registers again (only once the hub no longer has it).
81817
+ */
81818
+ var UninstallNodeOutcomeSchema = _enum([
81819
+ "uninstalled",
81820
+ "not-installed",
81821
+ "refused",
81822
+ "failed",
81823
+ "pending-reconnect"
81824
+ ]);
81825
+ var UninstallNodeResultSchema = object({
81826
+ nodeId: string(),
81827
+ outcome: UninstallNodeOutcomeSchema,
81828
+ error: string().optional(),
81829
+ addonIds: array(string()).readonly(),
81830
+ runnersStopped: array(string()).readonly(),
81831
+ warnings: array(string()).readonly()
81832
+ });
81833
+ var UninstallPackageResultSchema = object({
81834
+ /** Every targeted node ended `uninstalled`, `not-installed` or `pending-reconnect`. */
81835
+ success: boolean(),
81836
+ packageName: string(),
81837
+ results: array(UninstallNodeResultSchema).readonly()
81838
+ });
81839
+ /**
81840
+ * `unreachable` lists online agents whose status read FAILED — absence from
81841
+ * `installations` is only "not installed" for a node that answered (D315).
81842
+ */
81843
+ var PackageInstallationsSchema = object({
81844
+ installations: array(object({
81845
+ packageName: string(),
81846
+ nodeId: string(),
81847
+ nodeName: string(),
81848
+ isHub: boolean(),
81849
+ isOnline: boolean(),
81850
+ version: string().nullable(),
81851
+ addonIds: array(string()).readonly(),
81852
+ source: _enum(["live", "recorded"]),
81853
+ /** The hub installs this package too. `false` on an agent row = an orphan. */
81854
+ onHub: boolean()
81855
+ })).readonly(),
81856
+ unreachable: array(object({
81857
+ nodeId: string(),
81858
+ error: string()
81859
+ })).readonly()
81860
+ });
81697
81861
  var BulkUpdateItemStatusSchema = _enum([
81698
81862
  "queued",
81699
81863
  "updating",
@@ -81776,10 +81940,14 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
81776
81940
  }), method(object({ packageName: string() }), InstallPackageResultSchema, {
81777
81941
  kind: "mutation",
81778
81942
  auth: "admin"
81779
- }), method(_void(), boolean()), method(_void(), array(unknown()).readonly()), method(object({ packageName: string() }), unknown(), {
81943
+ }), method(_void(), boolean()), method(_void(), array(unknown()).readonly()), method(object({
81944
+ packageName: string().min(1),
81945
+ nodeId: string().optional(),
81946
+ everywhere: boolean().optional()
81947
+ }), UninstallPackageResultSchema, {
81780
81948
  kind: "mutation",
81781
81949
  auth: "admin"
81782
- }), method(_void(), ReloadPackagesResultSchema, {
81950
+ }), method(object({ packageName: string().optional() }), PackageInstallationsSchema, { auth: "admin" }), method(_void(), ReloadPackagesResultSchema, {
81783
81951
  kind: "mutation",
81784
81952
  auth: "admin"
81785
81953
  }), method(object({ query: string().optional() }), array(SearchResultSchema)), method(object({ nodeId: string().optional() }), array(PackageUpdateSchema).readonly(), { auth: "admin" }), method(object({
@@ -91862,6 +92030,32 @@ var TotpStatusSchema = object({
91862
92030
  /** Null when no row exists OR the row is still pending confirmation. */
91863
92031
  confirmedAt: number().nullable()
91864
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
+ });
91865
92059
  method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserInputSchema, UserSummarySchema, {
91866
92060
  kind: "mutation",
91867
92061
  auth: "admin",
@@ -91975,7 +92169,22 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
91975
92169
  userId: string(),
91976
92170
  username: string(),
91977
92171
  scopes: array(TokenScopeSchema)
91978
- }).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() }), {
91979
92188
  kind: "mutation",
91980
92189
  auth: "admin",
91981
92190
  access: "delete"
@@ -94385,6 +94594,12 @@ Object.freeze({
94385
94594
  addonId: null,
94386
94595
  access: "view"
94387
94596
  },
94597
+ "addons.listInstallations": {
94598
+ capName: "addons",
94599
+ capScope: "system",
94600
+ addonId: null,
94601
+ access: "view"
94602
+ },
94388
94603
  "addons.listJobs": {
94389
94604
  capName: "addons",
94390
94605
  capScope: "system",
@@ -98609,6 +98824,12 @@ Object.freeze({
98609
98824
  addonId: null,
98610
98825
  access: "create"
98611
98826
  },
98827
+ "pipelineAnalytics.setRetrainFrameComplete": {
98828
+ capName: "pipeline-analytics",
98829
+ capScope: "device",
98830
+ addonId: null,
98831
+ access: "create"
98832
+ },
98612
98833
  "pipelineAnalytics.setTrackFlags": {
98613
98834
  capName: "pipeline-analytics",
98614
98835
  capScope: "device",
@@ -98645,6 +98866,12 @@ Object.freeze({
98645
98866
  addonId: null,
98646
98867
  access: "delete"
98647
98868
  },
98869
+ "pipelineAnalytics.writeRetrainArchive": {
98870
+ capName: "pipeline-analytics",
98871
+ capScope: "device",
98872
+ addonId: null,
98873
+ access: "create"
98874
+ },
98648
98875
  "pipelineExecutor.cacheFrameInPool": {
98649
98876
  capName: "pipeline-executor",
98650
98877
  capScope: "system",
@@ -100997,18 +101224,36 @@ Object.freeze({
100997
101224
  addonId: null,
100998
101225
  access: "delete"
100999
101226
  },
101227
+ "userManagement.findUserByExternalIdentity": {
101228
+ capName: "user-management",
101229
+ capScope: "system",
101230
+ addonId: null,
101231
+ access: "view"
101232
+ },
101000
101233
  "userManagement.getTotpStatus": {
101001
101234
  capName: "user-management",
101002
101235
  capScope: "system",
101003
101236
  addonId: null,
101004
101237
  access: "view"
101005
101238
  },
101239
+ "userManagement.linkExternalIdentity": {
101240
+ capName: "user-management",
101241
+ capScope: "system",
101242
+ addonId: null,
101243
+ access: "create"
101244
+ },
101006
101245
  "userManagement.listApiKeys": {
101007
101246
  capName: "user-management",
101008
101247
  capScope: "system",
101009
101248
  addonId: null,
101010
101249
  access: "view"
101011
101250
  },
101251
+ "userManagement.listExternalIdentities": {
101252
+ capName: "user-management",
101253
+ capScope: "system",
101254
+ addonId: null,
101255
+ access: "view"
101256
+ },
101012
101257
  "userManagement.listOauthSessions": {
101013
101258
  capName: "user-management",
101014
101259
  capScope: "system",
@@ -101087,6 +101332,12 @@ Object.freeze({
101087
101332
  addonId: null,
101088
101333
  access: "create"
101089
101334
  },
101335
+ "userManagement.unlinkExternalIdentity": {
101336
+ capName: "user-management",
101337
+ capScope: "system",
101338
+ addonId: null,
101339
+ access: "delete"
101340
+ },
101090
101341
  "userManagement.updateUser": {
101091
101342
  capName: "user-management",
101092
101343
  capScope: "system",
@@ -104426,6 +104677,11 @@ Object.freeze({
104426
104677
  form: "single",
104427
104678
  optional: false
104428
104679
  }],
104680
+ "pipelineAnalytics.setRetrainFrameComplete": [{
104681
+ name: "deviceId",
104682
+ form: "single",
104683
+ optional: false
104684
+ }],
104429
104685
  "pipelineAnalytics.setTrackFlags": [{
104430
104686
  name: "deviceId",
104431
104687
  form: "single",
@@ -106511,7 +106767,7 @@ var DreameRegionSchema = _enum(DREAME_REGIONS);
106511
106767
  */
106512
106768
  var dreameConfigSchema = object({
106513
106769
  username: string().min(1).describe("Dreamehome account email / username"),
106514
- password: string().min(1).describe("Dreamehome account password"),
106770
+ password: string().min(1).describe("Dreamehome account password").meta({ secret: true }),
106515
106771
  region: DreameRegionSchema.default("eu").describe("Dreame cloud region"),
106516
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")
106517
106773
  });
@@ -108152,7 +108408,7 @@ var dreameChildSchema = object({
108152
108408
  }).optional(),
108153
108409
  navigationDisabledEntryIds: array(string()).optional(),
108154
108410
  /** Privacy PIN set at pairing — required to wake a coded camera (camera child only). */
108155
- navigationAccessCode: string().optional(),
108411
+ navigationAccessCode: string().optional().meta({ secret: true }),
108156
108412
  /**
108157
108413
  * The video backend the robot should sit on (camera child only).
108158
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()
@@ -81691,6 +81802,59 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
81691
81802
  var RestartAddonResultSchema = unknown();
81692
81803
  var InstallPackageResultSchema = unknown();
81693
81804
  var ReloadPackagesResultSchema = unknown();
81805
+ /**
81806
+ * What an uninstall did on ONE node.
81807
+ * - `uninstalled` — removed: runner(s) stopped, caps gone, code deleted.
81808
+ * - `not-installed` — the node did not have it (nothing to do).
81809
+ * - `refused` — protected / bootstrap package; nothing touched.
81810
+ * - `failed` — attempted and did not complete; `error` says why.
81811
+ * - `pending-reconnect` — the node is OFFLINE: its record was pruned so the
81812
+ * back-fill never returns the package, and the stale-addon sweep removes the
81813
+ * copy when the node registers again (only once the hub no longer has it).
81814
+ */
81815
+ var UninstallNodeOutcomeSchema = _enum([
81816
+ "uninstalled",
81817
+ "not-installed",
81818
+ "refused",
81819
+ "failed",
81820
+ "pending-reconnect"
81821
+ ]);
81822
+ var UninstallNodeResultSchema = object({
81823
+ nodeId: string(),
81824
+ outcome: UninstallNodeOutcomeSchema,
81825
+ error: string().optional(),
81826
+ addonIds: array(string()).readonly(),
81827
+ runnersStopped: array(string()).readonly(),
81828
+ warnings: array(string()).readonly()
81829
+ });
81830
+ var UninstallPackageResultSchema = object({
81831
+ /** Every targeted node ended `uninstalled`, `not-installed` or `pending-reconnect`. */
81832
+ success: boolean(),
81833
+ packageName: string(),
81834
+ results: array(UninstallNodeResultSchema).readonly()
81835
+ });
81836
+ /**
81837
+ * `unreachable` lists online agents whose status read FAILED — absence from
81838
+ * `installations` is only "not installed" for a node that answered (D315).
81839
+ */
81840
+ var PackageInstallationsSchema = object({
81841
+ installations: array(object({
81842
+ packageName: string(),
81843
+ nodeId: string(),
81844
+ nodeName: string(),
81845
+ isHub: boolean(),
81846
+ isOnline: boolean(),
81847
+ version: string().nullable(),
81848
+ addonIds: array(string()).readonly(),
81849
+ source: _enum(["live", "recorded"]),
81850
+ /** The hub installs this package too. `false` on an agent row = an orphan. */
81851
+ onHub: boolean()
81852
+ })).readonly(),
81853
+ unreachable: array(object({
81854
+ nodeId: string(),
81855
+ error: string()
81856
+ })).readonly()
81857
+ });
81694
81858
  var BulkUpdateItemStatusSchema = _enum([
81695
81859
  "queued",
81696
81860
  "updating",
@@ -81773,10 +81937,14 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
81773
81937
  }), method(object({ packageName: string() }), InstallPackageResultSchema, {
81774
81938
  kind: "mutation",
81775
81939
  auth: "admin"
81776
- }), method(_void(), boolean()), method(_void(), array(unknown()).readonly()), method(object({ packageName: string() }), unknown(), {
81940
+ }), method(_void(), boolean()), method(_void(), array(unknown()).readonly()), method(object({
81941
+ packageName: string().min(1),
81942
+ nodeId: string().optional(),
81943
+ everywhere: boolean().optional()
81944
+ }), UninstallPackageResultSchema, {
81777
81945
  kind: "mutation",
81778
81946
  auth: "admin"
81779
- }), method(_void(), ReloadPackagesResultSchema, {
81947
+ }), method(object({ packageName: string().optional() }), PackageInstallationsSchema, { auth: "admin" }), method(_void(), ReloadPackagesResultSchema, {
81780
81948
  kind: "mutation",
81781
81949
  auth: "admin"
81782
81950
  }), method(object({ query: string().optional() }), array(SearchResultSchema)), method(object({ nodeId: string().optional() }), array(PackageUpdateSchema).readonly(), { auth: "admin" }), method(object({
@@ -91859,6 +92027,32 @@ var TotpStatusSchema = object({
91859
92027
  /** Null when no row exists OR the row is still pending confirmation. */
91860
92028
  confirmedAt: number().nullable()
91861
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
+ });
91862
92056
  method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserInputSchema, UserSummarySchema, {
91863
92057
  kind: "mutation",
91864
92058
  auth: "admin",
@@ -91972,7 +92166,22 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
91972
92166
  userId: string(),
91973
92167
  username: string(),
91974
92168
  scopes: array(TokenScopeSchema)
91975
- }).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() }), {
91976
92185
  kind: "mutation",
91977
92186
  auth: "admin",
91978
92187
  access: "delete"
@@ -94382,6 +94591,12 @@ Object.freeze({
94382
94591
  addonId: null,
94383
94592
  access: "view"
94384
94593
  },
94594
+ "addons.listInstallations": {
94595
+ capName: "addons",
94596
+ capScope: "system",
94597
+ addonId: null,
94598
+ access: "view"
94599
+ },
94385
94600
  "addons.listJobs": {
94386
94601
  capName: "addons",
94387
94602
  capScope: "system",
@@ -98606,6 +98821,12 @@ Object.freeze({
98606
98821
  addonId: null,
98607
98822
  access: "create"
98608
98823
  },
98824
+ "pipelineAnalytics.setRetrainFrameComplete": {
98825
+ capName: "pipeline-analytics",
98826
+ capScope: "device",
98827
+ addonId: null,
98828
+ access: "create"
98829
+ },
98609
98830
  "pipelineAnalytics.setTrackFlags": {
98610
98831
  capName: "pipeline-analytics",
98611
98832
  capScope: "device",
@@ -98642,6 +98863,12 @@ Object.freeze({
98642
98863
  addonId: null,
98643
98864
  access: "delete"
98644
98865
  },
98866
+ "pipelineAnalytics.writeRetrainArchive": {
98867
+ capName: "pipeline-analytics",
98868
+ capScope: "device",
98869
+ addonId: null,
98870
+ access: "create"
98871
+ },
98645
98872
  "pipelineExecutor.cacheFrameInPool": {
98646
98873
  capName: "pipeline-executor",
98647
98874
  capScope: "system",
@@ -100994,18 +101221,36 @@ Object.freeze({
100994
101221
  addonId: null,
100995
101222
  access: "delete"
100996
101223
  },
101224
+ "userManagement.findUserByExternalIdentity": {
101225
+ capName: "user-management",
101226
+ capScope: "system",
101227
+ addonId: null,
101228
+ access: "view"
101229
+ },
100997
101230
  "userManagement.getTotpStatus": {
100998
101231
  capName: "user-management",
100999
101232
  capScope: "system",
101000
101233
  addonId: null,
101001
101234
  access: "view"
101002
101235
  },
101236
+ "userManagement.linkExternalIdentity": {
101237
+ capName: "user-management",
101238
+ capScope: "system",
101239
+ addonId: null,
101240
+ access: "create"
101241
+ },
101003
101242
  "userManagement.listApiKeys": {
101004
101243
  capName: "user-management",
101005
101244
  capScope: "system",
101006
101245
  addonId: null,
101007
101246
  access: "view"
101008
101247
  },
101248
+ "userManagement.listExternalIdentities": {
101249
+ capName: "user-management",
101250
+ capScope: "system",
101251
+ addonId: null,
101252
+ access: "view"
101253
+ },
101009
101254
  "userManagement.listOauthSessions": {
101010
101255
  capName: "user-management",
101011
101256
  capScope: "system",
@@ -101084,6 +101329,12 @@ Object.freeze({
101084
101329
  addonId: null,
101085
101330
  access: "create"
101086
101331
  },
101332
+ "userManagement.unlinkExternalIdentity": {
101333
+ capName: "user-management",
101334
+ capScope: "system",
101335
+ addonId: null,
101336
+ access: "delete"
101337
+ },
101087
101338
  "userManagement.updateUser": {
101088
101339
  capName: "user-management",
101089
101340
  capScope: "system",
@@ -104423,6 +104674,11 @@ Object.freeze({
104423
104674
  form: "single",
104424
104675
  optional: false
104425
104676
  }],
104677
+ "pipelineAnalytics.setRetrainFrameComplete": [{
104678
+ name: "deviceId",
104679
+ form: "single",
104680
+ optional: false
104681
+ }],
104426
104682
  "pipelineAnalytics.setTrackFlags": [{
104427
104683
  name: "deviceId",
104428
104684
  form: "single",
@@ -106508,7 +106764,7 @@ var DreameRegionSchema = _enum(DREAME_REGIONS);
106508
106764
  */
106509
106765
  var dreameConfigSchema = object({
106510
106766
  username: string().min(1).describe("Dreamehome account email / username"),
106511
- password: string().min(1).describe("Dreamehome account password"),
106767
+ password: string().min(1).describe("Dreamehome account password").meta({ secret: true }),
106512
106768
  region: DreameRegionSchema.default("eu").describe("Dreame cloud region"),
106513
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")
106514
106770
  });
@@ -108149,7 +108405,7 @@ var dreameChildSchema = object({
108149
108405
  }).optional(),
108150
108406
  navigationDisabledEntryIds: array(string()).optional(),
108151
108407
  /** Privacy PIN set at pairing — required to wake a coded camera (camera child only). */
108152
- navigationAccessCode: string().optional(),
108408
+ navigationAccessCode: string().optional().meta({ secret: true }),
108153
108409
  /**
108154
108410
  * The video backend the robot should sit on (camera child only).
108155
108411
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-dreame",
3
- "version": "0.2.127",
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",