@camstack/addon-provider-ecowitt 0.2.122 → 0.2.123

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/addon.js CHANGED
@@ -5373,7 +5373,7 @@ var ZodIssueCode$1 = {
5373
5373
  var ZodFirstPartyTypeKind$1;
5374
5374
  ZodFirstPartyTypeKind$1 || (ZodFirstPartyTypeKind$1 = {});
5375
5375
  //#endregion
5376
- //#region ../types/dist/sleep-BNeXenvr.mjs
5376
+ //#region ../types/dist/sleep-B0JG7-_F.mjs
5377
5377
  /**
5378
5378
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5379
5379
  * window to float samples (D455).
@@ -15195,6 +15195,10 @@ var DeviceInfoSchema = object({
15195
15195
  isCamera: boolean(),
15196
15196
  /** Current config values — serializable snapshot */
15197
15197
  config: record(string(), unknown()),
15198
+ /** Paths inside `config` the device's schema declares secret (D783) —
15199
+ * what the non-admin redaction withholds. Paths, never values. Absent
15200
+ * when the owning runner has not reported them. */
15201
+ secretConfigPaths: array(string()).optional(),
15198
15202
  /** Hardware + identity blob (manufacturer / model / firmware / sn /
15199
15203
  * uid / mac / …). Populated by drivers; editable via setMetadata. */
15200
15204
  metadata: record(string(), unknown()).nullable().optional(),
@@ -15400,7 +15404,13 @@ var DeviceRegisterPayloadSchema = object({
15400
15404
  * call (workers re-register on init), so probe-driven updates
15401
15405
  * (e.g. PTZ flag flipping after the abilities probe) propagate. */
15402
15406
  features: array(string()).optional(),
15403
- config: record(string(), unknown())
15407
+ config: record(string(), unknown()),
15408
+ /** Config paths the device's own schema DECLARES secret
15409
+ * (`.meta({ secret: true })` — dotted, `[]` for array items, e.g.
15410
+ * `connection.password`). Re-published on every register; the non-admin
15411
+ * redaction withholds them at any depth (D783). Optional: an older runner
15412
+ * omits it and the keyword backstop applies. */
15413
+ secretConfigPaths: array(string()).optional()
15404
15414
  });
15405
15415
  var DeviceRemovePayloadSchema = object({ deviceId: number() });
15406
15416
  var DevicePersistConfigPayloadSchema = object({
@@ -17059,7 +17069,14 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
17059
17069
  icon: string().optional(),
17060
17070
  /** Addon-owned HTTP route the button navigates to (GET). */
17061
17071
  startUrl: string(),
17062
- stage: LoginStageEnum
17072
+ stage: LoginStageEnum,
17073
+ /**
17074
+ * The provider names an external identity a signed-in user can link to
17075
+ * their own account (D782): `auth.listLinkableProviders` /
17076
+ * `beginExternalLink` offer exactly the redirect methods that set this,
17077
+ * whatever their id. Absent / false — a login button only (magic-link).
17078
+ */
17079
+ linkable: boolean().optional()
17063
17080
  }),
17064
17081
  object({
17065
17082
  kind: literal("widget"),
@@ -22494,7 +22511,13 @@ var RetrainFrameSchema = object({
22494
22511
  sizeBytes: number().int(),
22495
22512
  width: number().int(),
22496
22513
  height: number().int(),
22497
- copiedAt: number()
22514
+ copiedAt: number(),
22515
+ /** When the CAMERA captured the frame. Absent on a copy taken before D785. */
22516
+ capturedAt: number().optional(),
22517
+ /** The operator's "every subject in this frame is boxed". Detector
22518
+ * evaluation keeps only complete frames: an unboxed subject would count as
22519
+ * a false positive. */
22520
+ complete: boolean()
22498
22521
  });
22499
22522
  /** Why a copy-on-select could not be honoured — named, never a silent skip. */
22500
22523
  var RetrainCopyRefusalSchema = _enum([
@@ -22515,6 +22538,51 @@ var RetrainFrameListSchema = object({
22515
22538
  /** What the page pre-selects — the native key frame when one survives. */
22516
22539
  autoPickMediaId: number().int().optional()
22517
22540
  });
22541
+ /**
22542
+ * Which frames an annotated export carries. Every field narrows; an empty
22543
+ * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
22544
+ * list owned by whoever trains (the training orchestrator), so `frameIds` is
22545
+ * the primitive a version export uses; `batchId` re-selects what an earlier
22546
+ * export carried (`exportedInBatch`).
22547
+ */
22548
+ var RetrainExportFilterSchema = object({
22549
+ deviceIds: array(number()).optional(),
22550
+ frameIds: array(string()).max(2e4).optional(),
22551
+ batchId: string().optional(),
22552
+ /** Only frames the operator marked complete (all subjects boxed). */
22553
+ completeOnly: boolean().optional()
22554
+ });
22555
+ /**
22556
+ * `frames`: the full frame copies, boxes in `annotations.json`.
22557
+ * `crops`: additionally one JPEG per subject, cut with the runtime detail-crop
22558
+ * convention — the classifier layout.
22559
+ */
22560
+ var RetrainExportLayoutSchema = _enum(["frames", "crops"]);
22561
+ /**
22562
+ * Where `writeRetrainArchive` streams the tar: one HTTP request whose body is
22563
+ * the archive, sent chunk by chunk. Covers a presigned PUT and a provider
22564
+ * addon's data-plane upload route alike. Headers are sent verbatim and never
22565
+ * logged.
22566
+ */
22567
+ var RetrainArchiveTargetSchema = object({
22568
+ kind: literal("http"),
22569
+ method: _enum(["PUT", "POST"]),
22570
+ url: string().url(),
22571
+ headers: record(string(), string()).optional()
22572
+ });
22573
+ var RetrainArchiveResultSchema = object({
22574
+ batchId: string(),
22575
+ frames: number().int(),
22576
+ crops: number().int(),
22577
+ annotations: number().int(),
22578
+ /** Frames planned but not shipped (unreadable copy, path too long). */
22579
+ missing: number().int(),
22580
+ bytes: number().int(),
22581
+ /** sha256 of the exact bytes sent. */
22582
+ sha256: string(),
22583
+ /** The target's HTTP status. */
22584
+ status: number().int()
22585
+ });
22518
22586
  /** What the operator asked the assist to look for. */
22519
22587
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
22520
22588
  kind: literal("package"),
@@ -23309,9 +23377,25 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
23309
23377
  }), RetrainTransitionResultSchema, {
23310
23378
  kind: "mutation",
23311
23379
  auth: "admin"
23312
- }), method(object({ deviceIds: array(number()).optional() }), object({ url: string() }), {
23380
+ }), method(RetrainExportFilterSchema.extend({ layout: RetrainExportLayoutSchema.optional() }), object({ url: string() }), {
23313
23381
  kind: "query",
23314
23382
  auth: "admin"
23383
+ }), method(object({
23384
+ deviceId: number(),
23385
+ trackId: string(),
23386
+ frameId: string(),
23387
+ complete: boolean()
23388
+ }), RetrainFrameSchema, {
23389
+ kind: "mutation",
23390
+ auth: "admin"
23391
+ }), method(object({
23392
+ filter: RetrainExportFilterSchema,
23393
+ layout: RetrainExportLayoutSchema,
23394
+ target: RetrainArchiveTargetSchema
23395
+ }), RetrainArchiveResultSchema, {
23396
+ kind: "mutation",
23397
+ auth: "admin",
23398
+ timeoutMs: 60 * 6e4
23315
23399
  }), method(object({
23316
23400
  /** Which of the three event tables owns the row. */
23317
23401
  ownerType: EventOwnerTypeSchema,
@@ -26641,7 +26725,19 @@ var SsoBridgeClaimsSchema = object({
26641
26725
  * editing a descriptor must not retroactively extend or shorten a link the
26642
26726
  * operator already consented to.
26643
26727
  */
26644
- refreshTtl: union([number().int().positive(), literal("never")]).optional()
26728
+ refreshTtl: union([number().int().positive(), literal("never")]).optional(),
26729
+ /**
26730
+ * Opaque handle of a hub-side LINK intent (D782). Set by an OIDC callback
26731
+ * that was started from a signed-in user's "Link" button: the finish then
26732
+ * links this identity to the intent's user instead of signing anyone in.
26733
+ * The handle carries no user id — the hub resolves it, single-use.
26734
+ */
26735
+ linkIntent: string().optional(),
26736
+ /**
26737
+ * Verified `iss` of the id_token behind an OIDC login bridge (D782). A
26738
+ * subject is unique only per issuer, so a link is bound to it.
26739
+ */
26740
+ issuer: string().optional()
26645
26741
  });
26646
26742
  method(object({
26647
26743
  claims: SsoBridgeClaimsSchema,
@@ -28576,7 +28672,22 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
28576
28672
  * field their hints were silently stripped by the schema and the
28577
28673
  * adaptive ladder started blind on the client's display size.
28578
28674
  */
28579
- hints: webrtcClientHintsSchema.optional()
28675
+ hints: webrtcClientHintsSchema.optional(),
28676
+ /**
28677
+ * Talk-back (D771): relay the PEER's audio to the device's speaker
28678
+ * through the `intercom` cap's push-talk triple. When `true` and the
28679
+ * offer lets the peer send audio, the answer's audio is `sendrecv`
28680
+ * and every inbound frame goes to `intercom.pushTalkAudio` for this
28681
+ * `deviceId`; absent/false answers `sendonly`, as for every viewer.
28682
+ *
28683
+ * TRUSTED-CALLER ONLY. Set by the Alexa export for an Echo on a camera
28684
+ * with `intercom`, when the linked user may control that camera. The
28685
+ * hub STRIPS it from every request-bound call (a browser), exactly as
28686
+ * it overwrites `relayOnly` — a viewer's talk permission is the
28687
+ * intercom cap's own surface (share tokens gate it there), and this
28688
+ * flag must not become a second door to the camera's speaker.
28689
+ */
28690
+ talkback: boolean().optional()
28580
28691
  }), object({
28581
28692
  sessionId: string(),
28582
28693
  sdpAnswer: string()
@@ -38930,6 +39041,32 @@ var TotpStatusSchema = object({
38930
39041
  /** Null when no row exists OR the row is still pending confirmation. */
38931
39042
  confirmedAt: number().nullable()
38932
39043
  });
39044
+ /**
39045
+ * user-management — singleton capability for user accounts, API keys,
39046
+ * and scoped tokens.
39047
+ *
39048
+ * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
39049
+ * — the subset check on `setUserScopes` / `createScopedToken` is moot
39050
+ * because non-admins never reach these. If/when we open non-admin
39051
+ * delegation, structural caller-scope subset check goes inside the
39052
+ * provider.
39053
+ */
39054
+ var ExternalIdentitySchema = object({
39055
+ /** Login-method id of the provider instance, e.g. `auth-oidc/authentik`. */
39056
+ provider: string(),
39057
+ /** The IdP's stable subject (`sub`) for this account. */
39058
+ subject: string(),
39059
+ /** The verified `iss` of the IdP the identity was linked under — `sub` is unique only per issuer. */
39060
+ issuer: string(),
39061
+ userId: string(),
39062
+ /** What the IdP called the account at link time (username / email) — display only. */
39063
+ label: string().optional(),
39064
+ linkedAt: number()
39065
+ });
39066
+ var ExternalIdentityKeySchema = object({
39067
+ provider: string().min(1),
39068
+ subject: string().min(1)
39069
+ });
38933
39070
  method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserInputSchema, UserSummarySchema, {
38934
39071
  kind: "mutation",
38935
39072
  auth: "admin",
@@ -39043,7 +39180,22 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
39043
39180
  userId: string(),
39044
39181
  username: string(),
39045
39182
  scopes: array(TokenScopeSchema)
39046
- }).nullable(), { access: "view" }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
39183
+ }).nullable(), { access: "view" }), method(object({ userId: string() }), array(ExternalIdentitySchema), { auth: "admin" }), method(ExternalIdentityKeySchema, object({
39184
+ userId: string(),
39185
+ issuer: string()
39186
+ }).nullable(), { auth: "admin" }), method(ExternalIdentityKeySchema.extend({
39187
+ userId: string(),
39188
+ issuer: string().min(1),
39189
+ label: string().optional()
39190
+ }), object({ success: literal(true) }), {
39191
+ kind: "mutation",
39192
+ auth: "admin",
39193
+ access: "create"
39194
+ }), method(ExternalIdentityKeySchema.extend({ userId: string() }), object({ success: boolean() }), {
39195
+ kind: "mutation",
39196
+ auth: "admin",
39197
+ access: "delete"
39198
+ }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
39047
39199
  kind: "mutation",
39048
39200
  auth: "admin",
39049
39201
  access: "delete"
@@ -45683,6 +45835,12 @@ Object.freeze({
45683
45835
  addonId: null,
45684
45836
  access: "create"
45685
45837
  },
45838
+ "pipelineAnalytics.setRetrainFrameComplete": {
45839
+ capName: "pipeline-analytics",
45840
+ capScope: "device",
45841
+ addonId: null,
45842
+ access: "create"
45843
+ },
45686
45844
  "pipelineAnalytics.setTrackFlags": {
45687
45845
  capName: "pipeline-analytics",
45688
45846
  capScope: "device",
@@ -45719,6 +45877,12 @@ Object.freeze({
45719
45877
  addonId: null,
45720
45878
  access: "delete"
45721
45879
  },
45880
+ "pipelineAnalytics.writeRetrainArchive": {
45881
+ capName: "pipeline-analytics",
45882
+ capScope: "device",
45883
+ addonId: null,
45884
+ access: "create"
45885
+ },
45722
45886
  "pipelineExecutor.cacheFrameInPool": {
45723
45887
  capName: "pipeline-executor",
45724
45888
  capScope: "system",
@@ -48071,18 +48235,36 @@ Object.freeze({
48071
48235
  addonId: null,
48072
48236
  access: "delete"
48073
48237
  },
48238
+ "userManagement.findUserByExternalIdentity": {
48239
+ capName: "user-management",
48240
+ capScope: "system",
48241
+ addonId: null,
48242
+ access: "view"
48243
+ },
48074
48244
  "userManagement.getTotpStatus": {
48075
48245
  capName: "user-management",
48076
48246
  capScope: "system",
48077
48247
  addonId: null,
48078
48248
  access: "view"
48079
48249
  },
48250
+ "userManagement.linkExternalIdentity": {
48251
+ capName: "user-management",
48252
+ capScope: "system",
48253
+ addonId: null,
48254
+ access: "create"
48255
+ },
48080
48256
  "userManagement.listApiKeys": {
48081
48257
  capName: "user-management",
48082
48258
  capScope: "system",
48083
48259
  addonId: null,
48084
48260
  access: "view"
48085
48261
  },
48262
+ "userManagement.listExternalIdentities": {
48263
+ capName: "user-management",
48264
+ capScope: "system",
48265
+ addonId: null,
48266
+ access: "view"
48267
+ },
48086
48268
  "userManagement.listOauthSessions": {
48087
48269
  capName: "user-management",
48088
48270
  capScope: "system",
@@ -48161,6 +48343,12 @@ Object.freeze({
48161
48343
  addonId: null,
48162
48344
  access: "create"
48163
48345
  },
48346
+ "userManagement.unlinkExternalIdentity": {
48347
+ capName: "user-management",
48348
+ capScope: "system",
48349
+ addonId: null,
48350
+ access: "delete"
48351
+ },
48164
48352
  "userManagement.updateUser": {
48165
48353
  capName: "user-management",
48166
48354
  capScope: "system",
@@ -51500,6 +51688,11 @@ Object.freeze({
51500
51688
  form: "single",
51501
51689
  optional: false
51502
51690
  }],
51691
+ "pipelineAnalytics.setRetrainFrameComplete": [{
51692
+ name: "deviceId",
51693
+ form: "single",
51694
+ optional: false
51695
+ }],
51503
51696
  "pipelineAnalytics.setTrackFlags": [{
51504
51697
  name: "deviceId",
51505
51698
  form: "single",
@@ -59371,7 +59564,7 @@ var ecowittConfigSchema = discriminatedUnion("transport", [object({
59371
59564
  transport: literal("local"),
59372
59565
  host: string().min(1).describe("Ecowitt gateway host name or IP address"),
59373
59566
  port: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(1).max(65535).default(80)).describe("Gateway HTTP port"),
59374
- password: string().default("").describe("Gateway password (optional — newer firmware)"),
59567
+ password: string().default("").describe("Gateway password (optional — newer firmware)").meta({ secret: true }),
59375
59568
  pollIntervalMs: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(1e3).max(36e5).default(6e4)).describe("Live-data poll interval (ms)"),
59376
59569
  mappingIntervalMs: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(1e4).max(864e5).default(6e5)).describe("Sensor-map refresh interval (ms)"),
59377
59570
  ...baseFields
package/dist/addon.mjs CHANGED
@@ -5372,7 +5372,7 @@ var ZodIssueCode$1 = {
5372
5372
  var ZodFirstPartyTypeKind$1;
5373
5373
  ZodFirstPartyTypeKind$1 || (ZodFirstPartyTypeKind$1 = {});
5374
5374
  //#endregion
5375
- //#region ../types/dist/sleep-BNeXenvr.mjs
5375
+ //#region ../types/dist/sleep-B0JG7-_F.mjs
5376
5376
  /**
5377
5377
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5378
5378
  * window to float samples (D455).
@@ -15194,6 +15194,10 @@ var DeviceInfoSchema = object({
15194
15194
  isCamera: boolean(),
15195
15195
  /** Current config values — serializable snapshot */
15196
15196
  config: record(string(), unknown()),
15197
+ /** Paths inside `config` the device's schema declares secret (D783) —
15198
+ * what the non-admin redaction withholds. Paths, never values. Absent
15199
+ * when the owning runner has not reported them. */
15200
+ secretConfigPaths: array(string()).optional(),
15197
15201
  /** Hardware + identity blob (manufacturer / model / firmware / sn /
15198
15202
  * uid / mac / …). Populated by drivers; editable via setMetadata. */
15199
15203
  metadata: record(string(), unknown()).nullable().optional(),
@@ -15399,7 +15403,13 @@ var DeviceRegisterPayloadSchema = object({
15399
15403
  * call (workers re-register on init), so probe-driven updates
15400
15404
  * (e.g. PTZ flag flipping after the abilities probe) propagate. */
15401
15405
  features: array(string()).optional(),
15402
- config: record(string(), unknown())
15406
+ config: record(string(), unknown()),
15407
+ /** Config paths the device's own schema DECLARES secret
15408
+ * (`.meta({ secret: true })` — dotted, `[]` for array items, e.g.
15409
+ * `connection.password`). Re-published on every register; the non-admin
15410
+ * redaction withholds them at any depth (D783). Optional: an older runner
15411
+ * omits it and the keyword backstop applies. */
15412
+ secretConfigPaths: array(string()).optional()
15403
15413
  });
15404
15414
  var DeviceRemovePayloadSchema = object({ deviceId: number() });
15405
15415
  var DevicePersistConfigPayloadSchema = object({
@@ -17058,7 +17068,14 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
17058
17068
  icon: string().optional(),
17059
17069
  /** Addon-owned HTTP route the button navigates to (GET). */
17060
17070
  startUrl: string(),
17061
- stage: LoginStageEnum
17071
+ stage: LoginStageEnum,
17072
+ /**
17073
+ * The provider names an external identity a signed-in user can link to
17074
+ * their own account (D782): `auth.listLinkableProviders` /
17075
+ * `beginExternalLink` offer exactly the redirect methods that set this,
17076
+ * whatever their id. Absent / false — a login button only (magic-link).
17077
+ */
17078
+ linkable: boolean().optional()
17062
17079
  }),
17063
17080
  object({
17064
17081
  kind: literal("widget"),
@@ -22493,7 +22510,13 @@ var RetrainFrameSchema = object({
22493
22510
  sizeBytes: number().int(),
22494
22511
  width: number().int(),
22495
22512
  height: number().int(),
22496
- copiedAt: number()
22513
+ copiedAt: number(),
22514
+ /** When the CAMERA captured the frame. Absent on a copy taken before D785. */
22515
+ capturedAt: number().optional(),
22516
+ /** The operator's "every subject in this frame is boxed". Detector
22517
+ * evaluation keeps only complete frames: an unboxed subject would count as
22518
+ * a false positive. */
22519
+ complete: boolean()
22497
22520
  });
22498
22521
  /** Why a copy-on-select could not be honoured — named, never a silent skip. */
22499
22522
  var RetrainCopyRefusalSchema = _enum([
@@ -22514,6 +22537,51 @@ var RetrainFrameListSchema = object({
22514
22537
  /** What the page pre-selects — the native key frame when one survives. */
22515
22538
  autoPickMediaId: number().int().optional()
22516
22539
  });
22540
+ /**
22541
+ * Which frames an annotated export carries. Every field narrows; an empty
22542
+ * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
22543
+ * list owned by whoever trains (the training orchestrator), so `frameIds` is
22544
+ * the primitive a version export uses; `batchId` re-selects what an earlier
22545
+ * export carried (`exportedInBatch`).
22546
+ */
22547
+ var RetrainExportFilterSchema = object({
22548
+ deviceIds: array(number()).optional(),
22549
+ frameIds: array(string()).max(2e4).optional(),
22550
+ batchId: string().optional(),
22551
+ /** Only frames the operator marked complete (all subjects boxed). */
22552
+ completeOnly: boolean().optional()
22553
+ });
22554
+ /**
22555
+ * `frames`: the full frame copies, boxes in `annotations.json`.
22556
+ * `crops`: additionally one JPEG per subject, cut with the runtime detail-crop
22557
+ * convention — the classifier layout.
22558
+ */
22559
+ var RetrainExportLayoutSchema = _enum(["frames", "crops"]);
22560
+ /**
22561
+ * Where `writeRetrainArchive` streams the tar: one HTTP request whose body is
22562
+ * the archive, sent chunk by chunk. Covers a presigned PUT and a provider
22563
+ * addon's data-plane upload route alike. Headers are sent verbatim and never
22564
+ * logged.
22565
+ */
22566
+ var RetrainArchiveTargetSchema = object({
22567
+ kind: literal("http"),
22568
+ method: _enum(["PUT", "POST"]),
22569
+ url: string().url(),
22570
+ headers: record(string(), string()).optional()
22571
+ });
22572
+ var RetrainArchiveResultSchema = object({
22573
+ batchId: string(),
22574
+ frames: number().int(),
22575
+ crops: number().int(),
22576
+ annotations: number().int(),
22577
+ /** Frames planned but not shipped (unreadable copy, path too long). */
22578
+ missing: number().int(),
22579
+ bytes: number().int(),
22580
+ /** sha256 of the exact bytes sent. */
22581
+ sha256: string(),
22582
+ /** The target's HTTP status. */
22583
+ status: number().int()
22584
+ });
22517
22585
  /** What the operator asked the assist to look for. */
22518
22586
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
22519
22587
  kind: literal("package"),
@@ -23308,9 +23376,25 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
23308
23376
  }), RetrainTransitionResultSchema, {
23309
23377
  kind: "mutation",
23310
23378
  auth: "admin"
23311
- }), method(object({ deviceIds: array(number()).optional() }), object({ url: string() }), {
23379
+ }), method(RetrainExportFilterSchema.extend({ layout: RetrainExportLayoutSchema.optional() }), object({ url: string() }), {
23312
23380
  kind: "query",
23313
23381
  auth: "admin"
23382
+ }), method(object({
23383
+ deviceId: number(),
23384
+ trackId: string(),
23385
+ frameId: string(),
23386
+ complete: boolean()
23387
+ }), RetrainFrameSchema, {
23388
+ kind: "mutation",
23389
+ auth: "admin"
23390
+ }), method(object({
23391
+ filter: RetrainExportFilterSchema,
23392
+ layout: RetrainExportLayoutSchema,
23393
+ target: RetrainArchiveTargetSchema
23394
+ }), RetrainArchiveResultSchema, {
23395
+ kind: "mutation",
23396
+ auth: "admin",
23397
+ timeoutMs: 60 * 6e4
23314
23398
  }), method(object({
23315
23399
  /** Which of the three event tables owns the row. */
23316
23400
  ownerType: EventOwnerTypeSchema,
@@ -26640,7 +26724,19 @@ var SsoBridgeClaimsSchema = object({
26640
26724
  * editing a descriptor must not retroactively extend or shorten a link the
26641
26725
  * operator already consented to.
26642
26726
  */
26643
- refreshTtl: union([number().int().positive(), literal("never")]).optional()
26727
+ refreshTtl: union([number().int().positive(), literal("never")]).optional(),
26728
+ /**
26729
+ * Opaque handle of a hub-side LINK intent (D782). Set by an OIDC callback
26730
+ * that was started from a signed-in user's "Link" button: the finish then
26731
+ * links this identity to the intent's user instead of signing anyone in.
26732
+ * The handle carries no user id — the hub resolves it, single-use.
26733
+ */
26734
+ linkIntent: string().optional(),
26735
+ /**
26736
+ * Verified `iss` of the id_token behind an OIDC login bridge (D782). A
26737
+ * subject is unique only per issuer, so a link is bound to it.
26738
+ */
26739
+ issuer: string().optional()
26644
26740
  });
26645
26741
  method(object({
26646
26742
  claims: SsoBridgeClaimsSchema,
@@ -28575,7 +28671,22 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
28575
28671
  * field their hints were silently stripped by the schema and the
28576
28672
  * adaptive ladder started blind on the client's display size.
28577
28673
  */
28578
- hints: webrtcClientHintsSchema.optional()
28674
+ hints: webrtcClientHintsSchema.optional(),
28675
+ /**
28676
+ * Talk-back (D771): relay the PEER's audio to the device's speaker
28677
+ * through the `intercom` cap's push-talk triple. When `true` and the
28678
+ * offer lets the peer send audio, the answer's audio is `sendrecv`
28679
+ * and every inbound frame goes to `intercom.pushTalkAudio` for this
28680
+ * `deviceId`; absent/false answers `sendonly`, as for every viewer.
28681
+ *
28682
+ * TRUSTED-CALLER ONLY. Set by the Alexa export for an Echo on a camera
28683
+ * with `intercom`, when the linked user may control that camera. The
28684
+ * hub STRIPS it from every request-bound call (a browser), exactly as
28685
+ * it overwrites `relayOnly` — a viewer's talk permission is the
28686
+ * intercom cap's own surface (share tokens gate it there), and this
28687
+ * flag must not become a second door to the camera's speaker.
28688
+ */
28689
+ talkback: boolean().optional()
28579
28690
  }), object({
28580
28691
  sessionId: string(),
28581
28692
  sdpAnswer: string()
@@ -38929,6 +39040,32 @@ var TotpStatusSchema = object({
38929
39040
  /** Null when no row exists OR the row is still pending confirmation. */
38930
39041
  confirmedAt: number().nullable()
38931
39042
  });
39043
+ /**
39044
+ * user-management — singleton capability for user accounts, API keys,
39045
+ * and scoped tokens.
39046
+ *
39047
+ * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
39048
+ * — the subset check on `setUserScopes` / `createScopedToken` is moot
39049
+ * because non-admins never reach these. If/when we open non-admin
39050
+ * delegation, structural caller-scope subset check goes inside the
39051
+ * provider.
39052
+ */
39053
+ var ExternalIdentitySchema = object({
39054
+ /** Login-method id of the provider instance, e.g. `auth-oidc/authentik`. */
39055
+ provider: string(),
39056
+ /** The IdP's stable subject (`sub`) for this account. */
39057
+ subject: string(),
39058
+ /** The verified `iss` of the IdP the identity was linked under — `sub` is unique only per issuer. */
39059
+ issuer: string(),
39060
+ userId: string(),
39061
+ /** What the IdP called the account at link time (username / email) — display only. */
39062
+ label: string().optional(),
39063
+ linkedAt: number()
39064
+ });
39065
+ var ExternalIdentityKeySchema = object({
39066
+ provider: string().min(1),
39067
+ subject: string().min(1)
39068
+ });
38932
39069
  method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserInputSchema, UserSummarySchema, {
38933
39070
  kind: "mutation",
38934
39071
  auth: "admin",
@@ -39042,7 +39179,22 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
39042
39179
  userId: string(),
39043
39180
  username: string(),
39044
39181
  scopes: array(TokenScopeSchema)
39045
- }).nullable(), { access: "view" }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
39182
+ }).nullable(), { access: "view" }), method(object({ userId: string() }), array(ExternalIdentitySchema), { auth: "admin" }), method(ExternalIdentityKeySchema, object({
39183
+ userId: string(),
39184
+ issuer: string()
39185
+ }).nullable(), { auth: "admin" }), method(ExternalIdentityKeySchema.extend({
39186
+ userId: string(),
39187
+ issuer: string().min(1),
39188
+ label: string().optional()
39189
+ }), object({ success: literal(true) }), {
39190
+ kind: "mutation",
39191
+ auth: "admin",
39192
+ access: "create"
39193
+ }), method(ExternalIdentityKeySchema.extend({ userId: string() }), object({ success: boolean() }), {
39194
+ kind: "mutation",
39195
+ auth: "admin",
39196
+ access: "delete"
39197
+ }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
39046
39198
  kind: "mutation",
39047
39199
  auth: "admin",
39048
39200
  access: "delete"
@@ -45682,6 +45834,12 @@ Object.freeze({
45682
45834
  addonId: null,
45683
45835
  access: "create"
45684
45836
  },
45837
+ "pipelineAnalytics.setRetrainFrameComplete": {
45838
+ capName: "pipeline-analytics",
45839
+ capScope: "device",
45840
+ addonId: null,
45841
+ access: "create"
45842
+ },
45685
45843
  "pipelineAnalytics.setTrackFlags": {
45686
45844
  capName: "pipeline-analytics",
45687
45845
  capScope: "device",
@@ -45718,6 +45876,12 @@ Object.freeze({
45718
45876
  addonId: null,
45719
45877
  access: "delete"
45720
45878
  },
45879
+ "pipelineAnalytics.writeRetrainArchive": {
45880
+ capName: "pipeline-analytics",
45881
+ capScope: "device",
45882
+ addonId: null,
45883
+ access: "create"
45884
+ },
45721
45885
  "pipelineExecutor.cacheFrameInPool": {
45722
45886
  capName: "pipeline-executor",
45723
45887
  capScope: "system",
@@ -48070,18 +48234,36 @@ Object.freeze({
48070
48234
  addonId: null,
48071
48235
  access: "delete"
48072
48236
  },
48237
+ "userManagement.findUserByExternalIdentity": {
48238
+ capName: "user-management",
48239
+ capScope: "system",
48240
+ addonId: null,
48241
+ access: "view"
48242
+ },
48073
48243
  "userManagement.getTotpStatus": {
48074
48244
  capName: "user-management",
48075
48245
  capScope: "system",
48076
48246
  addonId: null,
48077
48247
  access: "view"
48078
48248
  },
48249
+ "userManagement.linkExternalIdentity": {
48250
+ capName: "user-management",
48251
+ capScope: "system",
48252
+ addonId: null,
48253
+ access: "create"
48254
+ },
48079
48255
  "userManagement.listApiKeys": {
48080
48256
  capName: "user-management",
48081
48257
  capScope: "system",
48082
48258
  addonId: null,
48083
48259
  access: "view"
48084
48260
  },
48261
+ "userManagement.listExternalIdentities": {
48262
+ capName: "user-management",
48263
+ capScope: "system",
48264
+ addonId: null,
48265
+ access: "view"
48266
+ },
48085
48267
  "userManagement.listOauthSessions": {
48086
48268
  capName: "user-management",
48087
48269
  capScope: "system",
@@ -48160,6 +48342,12 @@ Object.freeze({
48160
48342
  addonId: null,
48161
48343
  access: "create"
48162
48344
  },
48345
+ "userManagement.unlinkExternalIdentity": {
48346
+ capName: "user-management",
48347
+ capScope: "system",
48348
+ addonId: null,
48349
+ access: "delete"
48350
+ },
48163
48351
  "userManagement.updateUser": {
48164
48352
  capName: "user-management",
48165
48353
  capScope: "system",
@@ -51499,6 +51687,11 @@ Object.freeze({
51499
51687
  form: "single",
51500
51688
  optional: false
51501
51689
  }],
51690
+ "pipelineAnalytics.setRetrainFrameComplete": [{
51691
+ name: "deviceId",
51692
+ form: "single",
51693
+ optional: false
51694
+ }],
51502
51695
  "pipelineAnalytics.setTrackFlags": [{
51503
51696
  name: "deviceId",
51504
51697
  form: "single",
@@ -59370,7 +59563,7 @@ var ecowittConfigSchema = discriminatedUnion("transport", [object({
59370
59563
  transport: literal("local"),
59371
59564
  host: string().min(1).describe("Ecowitt gateway host name or IP address"),
59372
59565
  port: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(1).max(65535).default(80)).describe("Gateway HTTP port"),
59373
- password: string().default("").describe("Gateway password (optional — newer firmware)"),
59566
+ password: string().default("").describe("Gateway password (optional — newer firmware)").meta({ secret: true }),
59374
59567
  pollIntervalMs: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(1e3).max(36e5).default(6e4)).describe("Live-data poll interval (ms)"),
59375
59568
  mappingIntervalMs: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(1e4).max(864e5).default(6e5)).describe("Sensor-map refresh interval (ms)"),
59376
59569
  ...baseFields
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-ecowitt",
3
- "version": "0.2.122",
3
+ "version": "0.2.123",
4
4
  "description": "Ecowitt weather-station device-provider addon for CamStack — wraps the @apocaliss92/nodewitt local-poll / push client",
5
5
  "keywords": [
6
6
  "camstack",