@camstack/addon-matter-broker 0.2.120 → 0.2.122

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 +269 -12
  2. package/dist/addon.mjs +269 -12
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -5384,7 +5384,7 @@ var ZodIssueCode = {
5384
5384
  var ZodFirstPartyTypeKind;
5385
5385
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5386
5386
  //#endregion
5387
- //#region ../types/dist/sleep-BNeXenvr.mjs
5387
+ //#region ../types/dist/sleep-B0JG7-_F.mjs
5388
5388
  /**
5389
5389
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5390
5390
  * window to float samples (D455).
@@ -15159,6 +15159,10 @@ var DeviceInfoSchema = object({
15159
15159
  isCamera: boolean(),
15160
15160
  /** Current config values — serializable snapshot */
15161
15161
  config: record(string$2(), unknown()),
15162
+ /** Paths inside `config` the device's schema declares secret (D783) —
15163
+ * what the non-admin redaction withholds. Paths, never values. Absent
15164
+ * when the owning runner has not reported them. */
15165
+ secretConfigPaths: array(string$2()).optional(),
15162
15166
  /** Hardware + identity blob (manufacturer / model / firmware / sn /
15163
15167
  * uid / mac / …). Populated by drivers; editable via setMetadata. */
15164
15168
  metadata: record(string$2(), unknown()).nullable().optional(),
@@ -15364,7 +15368,13 @@ var DeviceRegisterPayloadSchema = object({
15364
15368
  * call (workers re-register on init), so probe-driven updates
15365
15369
  * (e.g. PTZ flag flipping after the abilities probe) propagate. */
15366
15370
  features: array(string$2()).optional(),
15367
- config: record(string$2(), unknown())
15371
+ config: record(string$2(), unknown()),
15372
+ /** Config paths the device's own schema DECLARES secret
15373
+ * (`.meta({ secret: true })` — dotted, `[]` for array items, e.g.
15374
+ * `connection.password`). Re-published on every register; the non-admin
15375
+ * redaction withholds them at any depth (D783). Optional: an older runner
15376
+ * omits it and the keyword backstop applies. */
15377
+ secretConfigPaths: array(string$2()).optional()
15368
15378
  });
15369
15379
  var DeviceRemovePayloadSchema = object({ deviceId: number() });
15370
15380
  var DevicePersistConfigPayloadSchema = object({
@@ -17023,7 +17033,14 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
17023
17033
  icon: string$2().optional(),
17024
17034
  /** Addon-owned HTTP route the button navigates to (GET). */
17025
17035
  startUrl: string$2(),
17026
- stage: LoginStageEnum
17036
+ stage: LoginStageEnum,
17037
+ /**
17038
+ * The provider names an external identity a signed-in user can link to
17039
+ * their own account (D782): `auth.listLinkableProviders` /
17040
+ * `beginExternalLink` offer exactly the redirect methods that set this,
17041
+ * whatever their id. Absent / false — a login button only (magic-link).
17042
+ */
17043
+ linkable: boolean().optional()
17027
17044
  }),
17028
17045
  object({
17029
17046
  kind: literal("widget"),
@@ -22458,7 +22475,13 @@ var RetrainFrameSchema = object({
22458
22475
  sizeBytes: number().int(),
22459
22476
  width: number().int(),
22460
22477
  height: number().int(),
22461
- copiedAt: number()
22478
+ copiedAt: number(),
22479
+ /** When the CAMERA captured the frame. Absent on a copy taken before D785. */
22480
+ capturedAt: number().optional(),
22481
+ /** The operator's "every subject in this frame is boxed". Detector
22482
+ * evaluation keeps only complete frames: an unboxed subject would count as
22483
+ * a false positive. */
22484
+ complete: boolean()
22462
22485
  });
22463
22486
  /** Why a copy-on-select could not be honoured — named, never a silent skip. */
22464
22487
  var RetrainCopyRefusalSchema = _enum([
@@ -22479,6 +22502,51 @@ var RetrainFrameListSchema = object({
22479
22502
  /** What the page pre-selects — the native key frame when one survives. */
22480
22503
  autoPickMediaId: number().int().optional()
22481
22504
  });
22505
+ /**
22506
+ * Which frames an annotated export carries. Every field narrows; an empty
22507
+ * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
22508
+ * list owned by whoever trains (the training orchestrator), so `frameIds` is
22509
+ * the primitive a version export uses; `batchId` re-selects what an earlier
22510
+ * export carried (`exportedInBatch`).
22511
+ */
22512
+ var RetrainExportFilterSchema = object({
22513
+ deviceIds: array(number()).optional(),
22514
+ frameIds: array(string$2()).max(2e4).optional(),
22515
+ batchId: string$2().optional(),
22516
+ /** Only frames the operator marked complete (all subjects boxed). */
22517
+ completeOnly: boolean().optional()
22518
+ });
22519
+ /**
22520
+ * `frames`: the full frame copies, boxes in `annotations.json`.
22521
+ * `crops`: additionally one JPEG per subject, cut with the runtime detail-crop
22522
+ * convention — the classifier layout.
22523
+ */
22524
+ var RetrainExportLayoutSchema = _enum(["frames", "crops"]);
22525
+ /**
22526
+ * Where `writeRetrainArchive` streams the tar: one HTTP request whose body is
22527
+ * the archive, sent chunk by chunk. Covers a presigned PUT and a provider
22528
+ * addon's data-plane upload route alike. Headers are sent verbatim and never
22529
+ * logged.
22530
+ */
22531
+ var RetrainArchiveTargetSchema = object({
22532
+ kind: literal("http"),
22533
+ method: _enum(["PUT", "POST"]),
22534
+ url: string$2().url(),
22535
+ headers: record(string$2(), string$2()).optional()
22536
+ });
22537
+ var RetrainArchiveResultSchema = object({
22538
+ batchId: string$2(),
22539
+ frames: number().int(),
22540
+ crops: number().int(),
22541
+ annotations: number().int(),
22542
+ /** Frames planned but not shipped (unreadable copy, path too long). */
22543
+ missing: number().int(),
22544
+ bytes: number().int(),
22545
+ /** sha256 of the exact bytes sent. */
22546
+ sha256: string$2(),
22547
+ /** The target's HTTP status. */
22548
+ status: number().int()
22549
+ });
22482
22550
  /** What the operator asked the assist to look for. */
22483
22551
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
22484
22552
  kind: literal("package"),
@@ -23273,9 +23341,25 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
23273
23341
  }), RetrainTransitionResultSchema, {
23274
23342
  kind: "mutation",
23275
23343
  auth: "admin"
23276
- }), method(object({ deviceIds: array(number()).optional() }), object({ url: string$2() }), {
23344
+ }), method(RetrainExportFilterSchema.extend({ layout: RetrainExportLayoutSchema.optional() }), object({ url: string$2() }), {
23277
23345
  kind: "query",
23278
23346
  auth: "admin"
23347
+ }), method(object({
23348
+ deviceId: number(),
23349
+ trackId: string$2(),
23350
+ frameId: string$2(),
23351
+ complete: boolean()
23352
+ }), RetrainFrameSchema, {
23353
+ kind: "mutation",
23354
+ auth: "admin"
23355
+ }), method(object({
23356
+ filter: RetrainExportFilterSchema,
23357
+ layout: RetrainExportLayoutSchema,
23358
+ target: RetrainArchiveTargetSchema
23359
+ }), RetrainArchiveResultSchema, {
23360
+ kind: "mutation",
23361
+ auth: "admin",
23362
+ timeoutMs: 60 * 6e4
23279
23363
  }), method(object({
23280
23364
  /** Which of the three event tables owns the row. */
23281
23365
  ownerType: EventOwnerTypeSchema,
@@ -26605,7 +26689,19 @@ var SsoBridgeClaimsSchema = object({
26605
26689
  * editing a descriptor must not retroactively extend or shorten a link the
26606
26690
  * operator already consented to.
26607
26691
  */
26608
- refreshTtl: union([number().int().positive(), literal("never")]).optional()
26692
+ refreshTtl: union([number().int().positive(), literal("never")]).optional(),
26693
+ /**
26694
+ * Opaque handle of a hub-side LINK intent (D782). Set by an OIDC callback
26695
+ * that was started from a signed-in user's "Link" button: the finish then
26696
+ * links this identity to the intent's user instead of signing anyone in.
26697
+ * The handle carries no user id — the hub resolves it, single-use.
26698
+ */
26699
+ linkIntent: string$2().optional(),
26700
+ /**
26701
+ * Verified `iss` of the id_token behind an OIDC login bridge (D782). A
26702
+ * subject is unique only per issuer, so a link is bound to it.
26703
+ */
26704
+ issuer: string$2().optional()
26609
26705
  });
26610
26706
  method(object({
26611
26707
  claims: SsoBridgeClaimsSchema,
@@ -28540,7 +28636,22 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
28540
28636
  * field their hints were silently stripped by the schema and the
28541
28637
  * adaptive ladder started blind on the client's display size.
28542
28638
  */
28543
- hints: webrtcClientHintsSchema.optional()
28639
+ hints: webrtcClientHintsSchema.optional(),
28640
+ /**
28641
+ * Talk-back (D771): relay the PEER's audio to the device's speaker
28642
+ * through the `intercom` cap's push-talk triple. When `true` and the
28643
+ * offer lets the peer send audio, the answer's audio is `sendrecv`
28644
+ * and every inbound frame goes to `intercom.pushTalkAudio` for this
28645
+ * `deviceId`; absent/false answers `sendonly`, as for every viewer.
28646
+ *
28647
+ * TRUSTED-CALLER ONLY. Set by the Alexa export for an Echo on a camera
28648
+ * with `intercom`, when the linked user may control that camera. The
28649
+ * hub STRIPS it from every request-bound call (a browser), exactly as
28650
+ * it overwrites `relayOnly` — a viewer's talk permission is the
28651
+ * intercom cap's own surface (share tokens gate it there), and this
28652
+ * flag must not become a second door to the camera's speaker.
28653
+ */
28654
+ talkback: boolean().optional()
28544
28655
  }), object({
28545
28656
  sessionId: string$2(),
28546
28657
  sdpAnswer: string$2()
@@ -28842,6 +28953,59 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
28842
28953
  var RestartAddonResultSchema = unknown();
28843
28954
  var InstallPackageResultSchema = unknown();
28844
28955
  var ReloadPackagesResultSchema = unknown();
28956
+ /**
28957
+ * What an uninstall did on ONE node.
28958
+ * - `uninstalled` — removed: runner(s) stopped, caps gone, code deleted.
28959
+ * - `not-installed` — the node did not have it (nothing to do).
28960
+ * - `refused` — protected / bootstrap package; nothing touched.
28961
+ * - `failed` — attempted and did not complete; `error` says why.
28962
+ * - `pending-reconnect` — the node is OFFLINE: its record was pruned so the
28963
+ * back-fill never returns the package, and the stale-addon sweep removes the
28964
+ * copy when the node registers again (only once the hub no longer has it).
28965
+ */
28966
+ var UninstallNodeOutcomeSchema = _enum([
28967
+ "uninstalled",
28968
+ "not-installed",
28969
+ "refused",
28970
+ "failed",
28971
+ "pending-reconnect"
28972
+ ]);
28973
+ var UninstallNodeResultSchema = object({
28974
+ nodeId: string$2(),
28975
+ outcome: UninstallNodeOutcomeSchema,
28976
+ error: string$2().optional(),
28977
+ addonIds: array(string$2()).readonly(),
28978
+ runnersStopped: array(string$2()).readonly(),
28979
+ warnings: array(string$2()).readonly()
28980
+ });
28981
+ var UninstallPackageResultSchema = object({
28982
+ /** Every targeted node ended `uninstalled`, `not-installed` or `pending-reconnect`. */
28983
+ success: boolean(),
28984
+ packageName: string$2(),
28985
+ results: array(UninstallNodeResultSchema).readonly()
28986
+ });
28987
+ /**
28988
+ * `unreachable` lists online agents whose status read FAILED — absence from
28989
+ * `installations` is only "not installed" for a node that answered (D315).
28990
+ */
28991
+ var PackageInstallationsSchema = object({
28992
+ installations: array(object({
28993
+ packageName: string$2(),
28994
+ nodeId: string$2(),
28995
+ nodeName: string$2(),
28996
+ isHub: boolean(),
28997
+ isOnline: boolean(),
28998
+ version: string$2().nullable(),
28999
+ addonIds: array(string$2()).readonly(),
29000
+ source: _enum(["live", "recorded"]),
29001
+ /** The hub installs this package too. `false` on an agent row = an orphan. */
29002
+ onHub: boolean()
29003
+ })).readonly(),
29004
+ unreachable: array(object({
29005
+ nodeId: string$2(),
29006
+ error: string$2()
29007
+ })).readonly()
29008
+ });
28845
29009
  var BulkUpdateItemStatusSchema = _enum([
28846
29010
  "queued",
28847
29011
  "updating",
@@ -28924,10 +29088,14 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
28924
29088
  }), method(object({ packageName: string$2() }), InstallPackageResultSchema, {
28925
29089
  kind: "mutation",
28926
29090
  auth: "admin"
28927
- }), method(_void(), boolean()), method(_void(), array(unknown()).readonly()), method(object({ packageName: string$2() }), unknown(), {
29091
+ }), method(_void(), boolean()), method(_void(), array(unknown()).readonly()), method(object({
29092
+ packageName: string$2().min(1),
29093
+ nodeId: string$2().optional(),
29094
+ everywhere: boolean().optional()
29095
+ }), UninstallPackageResultSchema, {
28928
29096
  kind: "mutation",
28929
29097
  auth: "admin"
28930
- }), method(_void(), ReloadPackagesResultSchema, {
29098
+ }), method(object({ packageName: string$2().optional() }), PackageInstallationsSchema, { auth: "admin" }), method(_void(), ReloadPackagesResultSchema, {
28931
29099
  kind: "mutation",
28932
29100
  auth: "admin"
28933
29101
  }), method(object({ query: string$2().optional() }), array(SearchResultSchema)), method(object({ nodeId: string$2().optional() }), array(PackageUpdateSchema).readonly(), { auth: "admin" }), method(object({
@@ -38854,6 +39022,32 @@ var TotpStatusSchema = object({
38854
39022
  /** Null when no row exists OR the row is still pending confirmation. */
38855
39023
  confirmedAt: number().nullable()
38856
39024
  });
39025
+ /**
39026
+ * user-management — singleton capability for user accounts, API keys,
39027
+ * and scoped tokens.
39028
+ *
39029
+ * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
39030
+ * — the subset check on `setUserScopes` / `createScopedToken` is moot
39031
+ * because non-admins never reach these. If/when we open non-admin
39032
+ * delegation, structural caller-scope subset check goes inside the
39033
+ * provider.
39034
+ */
39035
+ var ExternalIdentitySchema = object({
39036
+ /** Login-method id of the provider instance, e.g. `auth-oidc/authentik`. */
39037
+ provider: string$2(),
39038
+ /** The IdP's stable subject (`sub`) for this account. */
39039
+ subject: string$2(),
39040
+ /** The verified `iss` of the IdP the identity was linked under — `sub` is unique only per issuer. */
39041
+ issuer: string$2(),
39042
+ userId: string$2(),
39043
+ /** What the IdP called the account at link time (username / email) — display only. */
39044
+ label: string$2().optional(),
39045
+ linkedAt: number()
39046
+ });
39047
+ var ExternalIdentityKeySchema = object({
39048
+ provider: string$2().min(1),
39049
+ subject: string$2().min(1)
39050
+ });
38857
39051
  method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserInputSchema, UserSummarySchema, {
38858
39052
  kind: "mutation",
38859
39053
  auth: "admin",
@@ -38967,7 +39161,22 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
38967
39161
  userId: string$2(),
38968
39162
  username: string$2(),
38969
39163
  scopes: array(TokenScopeSchema)
38970
- }).nullable(), { access: "view" }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string$2() }), object({ success: boolean() }), {
39164
+ }).nullable(), { access: "view" }), method(object({ userId: string$2() }), array(ExternalIdentitySchema), { auth: "admin" }), method(ExternalIdentityKeySchema, object({
39165
+ userId: string$2(),
39166
+ issuer: string$2()
39167
+ }).nullable(), { auth: "admin" }), method(ExternalIdentityKeySchema.extend({
39168
+ userId: string$2(),
39169
+ issuer: string$2().min(1),
39170
+ label: string$2().optional()
39171
+ }), object({ success: literal(true) }), {
39172
+ kind: "mutation",
39173
+ auth: "admin",
39174
+ access: "create"
39175
+ }), method(ExternalIdentityKeySchema.extend({ userId: string$2() }), object({ success: boolean() }), {
39176
+ kind: "mutation",
39177
+ auth: "admin",
39178
+ access: "delete"
39179
+ }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string$2() }), object({ success: boolean() }), {
38971
39180
  kind: "mutation",
38972
39181
  auth: "admin",
38973
39182
  access: "delete"
@@ -41377,6 +41586,12 @@ Object.freeze({
41377
41586
  addonId: null,
41378
41587
  access: "view"
41379
41588
  },
41589
+ "addons.listInstallations": {
41590
+ capName: "addons",
41591
+ capScope: "system",
41592
+ addonId: null,
41593
+ access: "view"
41594
+ },
41380
41595
  "addons.listJobs": {
41381
41596
  capName: "addons",
41382
41597
  capScope: "system",
@@ -45601,6 +45816,12 @@ Object.freeze({
45601
45816
  addonId: null,
45602
45817
  access: "create"
45603
45818
  },
45819
+ "pipelineAnalytics.setRetrainFrameComplete": {
45820
+ capName: "pipeline-analytics",
45821
+ capScope: "device",
45822
+ addonId: null,
45823
+ access: "create"
45824
+ },
45604
45825
  "pipelineAnalytics.setTrackFlags": {
45605
45826
  capName: "pipeline-analytics",
45606
45827
  capScope: "device",
@@ -45637,6 +45858,12 @@ Object.freeze({
45637
45858
  addonId: null,
45638
45859
  access: "delete"
45639
45860
  },
45861
+ "pipelineAnalytics.writeRetrainArchive": {
45862
+ capName: "pipeline-analytics",
45863
+ capScope: "device",
45864
+ addonId: null,
45865
+ access: "create"
45866
+ },
45640
45867
  "pipelineExecutor.cacheFrameInPool": {
45641
45868
  capName: "pipeline-executor",
45642
45869
  capScope: "system",
@@ -47989,18 +48216,36 @@ Object.freeze({
47989
48216
  addonId: null,
47990
48217
  access: "delete"
47991
48218
  },
48219
+ "userManagement.findUserByExternalIdentity": {
48220
+ capName: "user-management",
48221
+ capScope: "system",
48222
+ addonId: null,
48223
+ access: "view"
48224
+ },
47992
48225
  "userManagement.getTotpStatus": {
47993
48226
  capName: "user-management",
47994
48227
  capScope: "system",
47995
48228
  addonId: null,
47996
48229
  access: "view"
47997
48230
  },
48231
+ "userManagement.linkExternalIdentity": {
48232
+ capName: "user-management",
48233
+ capScope: "system",
48234
+ addonId: null,
48235
+ access: "create"
48236
+ },
47998
48237
  "userManagement.listApiKeys": {
47999
48238
  capName: "user-management",
48000
48239
  capScope: "system",
48001
48240
  addonId: null,
48002
48241
  access: "view"
48003
48242
  },
48243
+ "userManagement.listExternalIdentities": {
48244
+ capName: "user-management",
48245
+ capScope: "system",
48246
+ addonId: null,
48247
+ access: "view"
48248
+ },
48004
48249
  "userManagement.listOauthSessions": {
48005
48250
  capName: "user-management",
48006
48251
  capScope: "system",
@@ -48079,6 +48324,12 @@ Object.freeze({
48079
48324
  addonId: null,
48080
48325
  access: "create"
48081
48326
  },
48327
+ "userManagement.unlinkExternalIdentity": {
48328
+ capName: "user-management",
48329
+ capScope: "system",
48330
+ addonId: null,
48331
+ access: "delete"
48332
+ },
48082
48333
  "userManagement.updateUser": {
48083
48334
  capName: "user-management",
48084
48335
  capScope: "system",
@@ -51418,6 +51669,11 @@ Object.freeze({
51418
51669
  form: "single",
51419
51670
  optional: false
51420
51671
  }],
51672
+ "pipelineAnalytics.setRetrainFrameComplete": [{
51673
+ name: "deviceId",
51674
+ form: "single",
51675
+ optional: false
51676
+ }],
51421
51677
  "pipelineAnalytics.setTrackFlags": [{
51422
51678
  name: "deviceId",
51423
51679
  form: "single",
@@ -163416,11 +163672,11 @@ var MatterBrokerRegistry = class {
163416
163672
  */
163417
163673
  var matterConnectionSchema = object({
163418
163674
  /** Optional Thread operational dataset (hex) for Thread device onboarding. */
163419
- threadDataset: string$2().default("").describe("Thread operational dataset (hex) — required only for Thread devices"),
163675
+ threadDataset: string$2().default("").describe("Thread operational dataset (hex) — required only for Thread devices").meta({ secret: true }),
163420
163676
  /** Optional Wi-Fi SSID for Wi-Fi device onboarding over BLE. */
163421
163677
  wifiSsid: string$2().default("").describe("Wi-Fi SSID — required only for BLE Wi-Fi onboarding"),
163422
163678
  /** Optional Wi-Fi password for Wi-Fi device onboarding over BLE. */
163423
- wifiPassword: string$2().default("").describe("Wi-Fi password (optional)"),
163679
+ wifiPassword: string$2().default("").describe("Wi-Fi password (optional)").meta({ secret: true }),
163424
163680
  /** PULL-reconcile interval for the commissioned-node inventory. */
163425
163681
  reconcileIntervalMs: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(1e4).max(864e5).default(3e5)).describe("Node-inventory reconcile interval (ms)")
163426
163682
  });
@@ -163451,6 +163707,7 @@ function buildConnectionFormSchema() {
163451
163707
  {
163452
163708
  type: "text",
163453
163709
  key: "threadDataset",
163710
+ secret: true,
163454
163711
  label: "Thread operational dataset (hex, optional)",
163455
163712
  placeholder: "0e08000000000001…"
163456
163713
  },
package/dist/addon.mjs CHANGED
@@ -5382,7 +5382,7 @@ var ZodIssueCode = {
5382
5382
  var ZodFirstPartyTypeKind;
5383
5383
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5384
5384
  //#endregion
5385
- //#region ../types/dist/sleep-BNeXenvr.mjs
5385
+ //#region ../types/dist/sleep-B0JG7-_F.mjs
5386
5386
  /**
5387
5387
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5388
5388
  * window to float samples (D455).
@@ -15157,6 +15157,10 @@ var DeviceInfoSchema = object({
15157
15157
  isCamera: boolean(),
15158
15158
  /** Current config values — serializable snapshot */
15159
15159
  config: record(string$2(), unknown()),
15160
+ /** Paths inside `config` the device's schema declares secret (D783) —
15161
+ * what the non-admin redaction withholds. Paths, never values. Absent
15162
+ * when the owning runner has not reported them. */
15163
+ secretConfigPaths: array(string$2()).optional(),
15160
15164
  /** Hardware + identity blob (manufacturer / model / firmware / sn /
15161
15165
  * uid / mac / …). Populated by drivers; editable via setMetadata. */
15162
15166
  metadata: record(string$2(), unknown()).nullable().optional(),
@@ -15362,7 +15366,13 @@ var DeviceRegisterPayloadSchema = object({
15362
15366
  * call (workers re-register on init), so probe-driven updates
15363
15367
  * (e.g. PTZ flag flipping after the abilities probe) propagate. */
15364
15368
  features: array(string$2()).optional(),
15365
- config: record(string$2(), unknown())
15369
+ config: record(string$2(), unknown()),
15370
+ /** Config paths the device's own schema DECLARES secret
15371
+ * (`.meta({ secret: true })` — dotted, `[]` for array items, e.g.
15372
+ * `connection.password`). Re-published on every register; the non-admin
15373
+ * redaction withholds them at any depth (D783). Optional: an older runner
15374
+ * omits it and the keyword backstop applies. */
15375
+ secretConfigPaths: array(string$2()).optional()
15366
15376
  });
15367
15377
  var DeviceRemovePayloadSchema = object({ deviceId: number() });
15368
15378
  var DevicePersistConfigPayloadSchema = object({
@@ -17021,7 +17031,14 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
17021
17031
  icon: string$2().optional(),
17022
17032
  /** Addon-owned HTTP route the button navigates to (GET). */
17023
17033
  startUrl: string$2(),
17024
- stage: LoginStageEnum
17034
+ stage: LoginStageEnum,
17035
+ /**
17036
+ * The provider names an external identity a signed-in user can link to
17037
+ * their own account (D782): `auth.listLinkableProviders` /
17038
+ * `beginExternalLink` offer exactly the redirect methods that set this,
17039
+ * whatever their id. Absent / false — a login button only (magic-link).
17040
+ */
17041
+ linkable: boolean().optional()
17025
17042
  }),
17026
17043
  object({
17027
17044
  kind: literal("widget"),
@@ -22456,7 +22473,13 @@ var RetrainFrameSchema = object({
22456
22473
  sizeBytes: number().int(),
22457
22474
  width: number().int(),
22458
22475
  height: number().int(),
22459
- copiedAt: number()
22476
+ copiedAt: number(),
22477
+ /** When the CAMERA captured the frame. Absent on a copy taken before D785. */
22478
+ capturedAt: number().optional(),
22479
+ /** The operator's "every subject in this frame is boxed". Detector
22480
+ * evaluation keeps only complete frames: an unboxed subject would count as
22481
+ * a false positive. */
22482
+ complete: boolean()
22460
22483
  });
22461
22484
  /** Why a copy-on-select could not be honoured — named, never a silent skip. */
22462
22485
  var RetrainCopyRefusalSchema = _enum([
@@ -22477,6 +22500,51 @@ var RetrainFrameListSchema = object({
22477
22500
  /** What the page pre-selects — the native key frame when one survives. */
22478
22501
  autoPickMediaId: number().int().optional()
22479
22502
  });
22503
+ /**
22504
+ * Which frames an annotated export carries. Every field narrows; an empty
22505
+ * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
22506
+ * list owned by whoever trains (the training orchestrator), so `frameIds` is
22507
+ * the primitive a version export uses; `batchId` re-selects what an earlier
22508
+ * export carried (`exportedInBatch`).
22509
+ */
22510
+ var RetrainExportFilterSchema = object({
22511
+ deviceIds: array(number()).optional(),
22512
+ frameIds: array(string$2()).max(2e4).optional(),
22513
+ batchId: string$2().optional(),
22514
+ /** Only frames the operator marked complete (all subjects boxed). */
22515
+ completeOnly: boolean().optional()
22516
+ });
22517
+ /**
22518
+ * `frames`: the full frame copies, boxes in `annotations.json`.
22519
+ * `crops`: additionally one JPEG per subject, cut with the runtime detail-crop
22520
+ * convention — the classifier layout.
22521
+ */
22522
+ var RetrainExportLayoutSchema = _enum(["frames", "crops"]);
22523
+ /**
22524
+ * Where `writeRetrainArchive` streams the tar: one HTTP request whose body is
22525
+ * the archive, sent chunk by chunk. Covers a presigned PUT and a provider
22526
+ * addon's data-plane upload route alike. Headers are sent verbatim and never
22527
+ * logged.
22528
+ */
22529
+ var RetrainArchiveTargetSchema = object({
22530
+ kind: literal("http"),
22531
+ method: _enum(["PUT", "POST"]),
22532
+ url: string$2().url(),
22533
+ headers: record(string$2(), string$2()).optional()
22534
+ });
22535
+ var RetrainArchiveResultSchema = object({
22536
+ batchId: string$2(),
22537
+ frames: number().int(),
22538
+ crops: number().int(),
22539
+ annotations: number().int(),
22540
+ /** Frames planned but not shipped (unreadable copy, path too long). */
22541
+ missing: number().int(),
22542
+ bytes: number().int(),
22543
+ /** sha256 of the exact bytes sent. */
22544
+ sha256: string$2(),
22545
+ /** The target's HTTP status. */
22546
+ status: number().int()
22547
+ });
22480
22548
  /** What the operator asked the assist to look for. */
22481
22549
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
22482
22550
  kind: literal("package"),
@@ -23271,9 +23339,25 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
23271
23339
  }), RetrainTransitionResultSchema, {
23272
23340
  kind: "mutation",
23273
23341
  auth: "admin"
23274
- }), method(object({ deviceIds: array(number()).optional() }), object({ url: string$2() }), {
23342
+ }), method(RetrainExportFilterSchema.extend({ layout: RetrainExportLayoutSchema.optional() }), object({ url: string$2() }), {
23275
23343
  kind: "query",
23276
23344
  auth: "admin"
23345
+ }), method(object({
23346
+ deviceId: number(),
23347
+ trackId: string$2(),
23348
+ frameId: string$2(),
23349
+ complete: boolean()
23350
+ }), RetrainFrameSchema, {
23351
+ kind: "mutation",
23352
+ auth: "admin"
23353
+ }), method(object({
23354
+ filter: RetrainExportFilterSchema,
23355
+ layout: RetrainExportLayoutSchema,
23356
+ target: RetrainArchiveTargetSchema
23357
+ }), RetrainArchiveResultSchema, {
23358
+ kind: "mutation",
23359
+ auth: "admin",
23360
+ timeoutMs: 60 * 6e4
23277
23361
  }), method(object({
23278
23362
  /** Which of the three event tables owns the row. */
23279
23363
  ownerType: EventOwnerTypeSchema,
@@ -26603,7 +26687,19 @@ var SsoBridgeClaimsSchema = object({
26603
26687
  * editing a descriptor must not retroactively extend or shorten a link the
26604
26688
  * operator already consented to.
26605
26689
  */
26606
- refreshTtl: union([number().int().positive(), literal("never")]).optional()
26690
+ refreshTtl: union([number().int().positive(), literal("never")]).optional(),
26691
+ /**
26692
+ * Opaque handle of a hub-side LINK intent (D782). Set by an OIDC callback
26693
+ * that was started from a signed-in user's "Link" button: the finish then
26694
+ * links this identity to the intent's user instead of signing anyone in.
26695
+ * The handle carries no user id — the hub resolves it, single-use.
26696
+ */
26697
+ linkIntent: string$2().optional(),
26698
+ /**
26699
+ * Verified `iss` of the id_token behind an OIDC login bridge (D782). A
26700
+ * subject is unique only per issuer, so a link is bound to it.
26701
+ */
26702
+ issuer: string$2().optional()
26607
26703
  });
26608
26704
  method(object({
26609
26705
  claims: SsoBridgeClaimsSchema,
@@ -28538,7 +28634,22 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
28538
28634
  * field their hints were silently stripped by the schema and the
28539
28635
  * adaptive ladder started blind on the client's display size.
28540
28636
  */
28541
- hints: webrtcClientHintsSchema.optional()
28637
+ hints: webrtcClientHintsSchema.optional(),
28638
+ /**
28639
+ * Talk-back (D771): relay the PEER's audio to the device's speaker
28640
+ * through the `intercom` cap's push-talk triple. When `true` and the
28641
+ * offer lets the peer send audio, the answer's audio is `sendrecv`
28642
+ * and every inbound frame goes to `intercom.pushTalkAudio` for this
28643
+ * `deviceId`; absent/false answers `sendonly`, as for every viewer.
28644
+ *
28645
+ * TRUSTED-CALLER ONLY. Set by the Alexa export for an Echo on a camera
28646
+ * with `intercom`, when the linked user may control that camera. The
28647
+ * hub STRIPS it from every request-bound call (a browser), exactly as
28648
+ * it overwrites `relayOnly` — a viewer's talk permission is the
28649
+ * intercom cap's own surface (share tokens gate it there), and this
28650
+ * flag must not become a second door to the camera's speaker.
28651
+ */
28652
+ talkback: boolean().optional()
28542
28653
  }), object({
28543
28654
  sessionId: string$2(),
28544
28655
  sdpAnswer: string$2()
@@ -28840,6 +28951,59 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
28840
28951
  var RestartAddonResultSchema = unknown();
28841
28952
  var InstallPackageResultSchema = unknown();
28842
28953
  var ReloadPackagesResultSchema = unknown();
28954
+ /**
28955
+ * What an uninstall did on ONE node.
28956
+ * - `uninstalled` — removed: runner(s) stopped, caps gone, code deleted.
28957
+ * - `not-installed` — the node did not have it (nothing to do).
28958
+ * - `refused` — protected / bootstrap package; nothing touched.
28959
+ * - `failed` — attempted and did not complete; `error` says why.
28960
+ * - `pending-reconnect` — the node is OFFLINE: its record was pruned so the
28961
+ * back-fill never returns the package, and the stale-addon sweep removes the
28962
+ * copy when the node registers again (only once the hub no longer has it).
28963
+ */
28964
+ var UninstallNodeOutcomeSchema = _enum([
28965
+ "uninstalled",
28966
+ "not-installed",
28967
+ "refused",
28968
+ "failed",
28969
+ "pending-reconnect"
28970
+ ]);
28971
+ var UninstallNodeResultSchema = object({
28972
+ nodeId: string$2(),
28973
+ outcome: UninstallNodeOutcomeSchema,
28974
+ error: string$2().optional(),
28975
+ addonIds: array(string$2()).readonly(),
28976
+ runnersStopped: array(string$2()).readonly(),
28977
+ warnings: array(string$2()).readonly()
28978
+ });
28979
+ var UninstallPackageResultSchema = object({
28980
+ /** Every targeted node ended `uninstalled`, `not-installed` or `pending-reconnect`. */
28981
+ success: boolean(),
28982
+ packageName: string$2(),
28983
+ results: array(UninstallNodeResultSchema).readonly()
28984
+ });
28985
+ /**
28986
+ * `unreachable` lists online agents whose status read FAILED — absence from
28987
+ * `installations` is only "not installed" for a node that answered (D315).
28988
+ */
28989
+ var PackageInstallationsSchema = object({
28990
+ installations: array(object({
28991
+ packageName: string$2(),
28992
+ nodeId: string$2(),
28993
+ nodeName: string$2(),
28994
+ isHub: boolean(),
28995
+ isOnline: boolean(),
28996
+ version: string$2().nullable(),
28997
+ addonIds: array(string$2()).readonly(),
28998
+ source: _enum(["live", "recorded"]),
28999
+ /** The hub installs this package too. `false` on an agent row = an orphan. */
29000
+ onHub: boolean()
29001
+ })).readonly(),
29002
+ unreachable: array(object({
29003
+ nodeId: string$2(),
29004
+ error: string$2()
29005
+ })).readonly()
29006
+ });
28843
29007
  var BulkUpdateItemStatusSchema = _enum([
28844
29008
  "queued",
28845
29009
  "updating",
@@ -28922,10 +29086,14 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
28922
29086
  }), method(object({ packageName: string$2() }), InstallPackageResultSchema, {
28923
29087
  kind: "mutation",
28924
29088
  auth: "admin"
28925
- }), method(_void(), boolean()), method(_void(), array(unknown()).readonly()), method(object({ packageName: string$2() }), unknown(), {
29089
+ }), method(_void(), boolean()), method(_void(), array(unknown()).readonly()), method(object({
29090
+ packageName: string$2().min(1),
29091
+ nodeId: string$2().optional(),
29092
+ everywhere: boolean().optional()
29093
+ }), UninstallPackageResultSchema, {
28926
29094
  kind: "mutation",
28927
29095
  auth: "admin"
28928
- }), method(_void(), ReloadPackagesResultSchema, {
29096
+ }), method(object({ packageName: string$2().optional() }), PackageInstallationsSchema, { auth: "admin" }), method(_void(), ReloadPackagesResultSchema, {
28929
29097
  kind: "mutation",
28930
29098
  auth: "admin"
28931
29099
  }), method(object({ query: string$2().optional() }), array(SearchResultSchema)), method(object({ nodeId: string$2().optional() }), array(PackageUpdateSchema).readonly(), { auth: "admin" }), method(object({
@@ -38852,6 +39020,32 @@ var TotpStatusSchema = object({
38852
39020
  /** Null when no row exists OR the row is still pending confirmation. */
38853
39021
  confirmedAt: number().nullable()
38854
39022
  });
39023
+ /**
39024
+ * user-management — singleton capability for user accounts, API keys,
39025
+ * and scoped tokens.
39026
+ *
39027
+ * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
39028
+ * — the subset check on `setUserScopes` / `createScopedToken` is moot
39029
+ * because non-admins never reach these. If/when we open non-admin
39030
+ * delegation, structural caller-scope subset check goes inside the
39031
+ * provider.
39032
+ */
39033
+ var ExternalIdentitySchema = object({
39034
+ /** Login-method id of the provider instance, e.g. `auth-oidc/authentik`. */
39035
+ provider: string$2(),
39036
+ /** The IdP's stable subject (`sub`) for this account. */
39037
+ subject: string$2(),
39038
+ /** The verified `iss` of the IdP the identity was linked under — `sub` is unique only per issuer. */
39039
+ issuer: string$2(),
39040
+ userId: string$2(),
39041
+ /** What the IdP called the account at link time (username / email) — display only. */
39042
+ label: string$2().optional(),
39043
+ linkedAt: number()
39044
+ });
39045
+ var ExternalIdentityKeySchema = object({
39046
+ provider: string$2().min(1),
39047
+ subject: string$2().min(1)
39048
+ });
38855
39049
  method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserInputSchema, UserSummarySchema, {
38856
39050
  kind: "mutation",
38857
39051
  auth: "admin",
@@ -38965,7 +39159,22 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
38965
39159
  userId: string$2(),
38966
39160
  username: string$2(),
38967
39161
  scopes: array(TokenScopeSchema)
38968
- }).nullable(), { access: "view" }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string$2() }), object({ success: boolean() }), {
39162
+ }).nullable(), { access: "view" }), method(object({ userId: string$2() }), array(ExternalIdentitySchema), { auth: "admin" }), method(ExternalIdentityKeySchema, object({
39163
+ userId: string$2(),
39164
+ issuer: string$2()
39165
+ }).nullable(), { auth: "admin" }), method(ExternalIdentityKeySchema.extend({
39166
+ userId: string$2(),
39167
+ issuer: string$2().min(1),
39168
+ label: string$2().optional()
39169
+ }), object({ success: literal(true) }), {
39170
+ kind: "mutation",
39171
+ auth: "admin",
39172
+ access: "create"
39173
+ }), method(ExternalIdentityKeySchema.extend({ userId: string$2() }), object({ success: boolean() }), {
39174
+ kind: "mutation",
39175
+ auth: "admin",
39176
+ access: "delete"
39177
+ }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string$2() }), object({ success: boolean() }), {
38969
39178
  kind: "mutation",
38970
39179
  auth: "admin",
38971
39180
  access: "delete"
@@ -41375,6 +41584,12 @@ Object.freeze({
41375
41584
  addonId: null,
41376
41585
  access: "view"
41377
41586
  },
41587
+ "addons.listInstallations": {
41588
+ capName: "addons",
41589
+ capScope: "system",
41590
+ addonId: null,
41591
+ access: "view"
41592
+ },
41378
41593
  "addons.listJobs": {
41379
41594
  capName: "addons",
41380
41595
  capScope: "system",
@@ -45599,6 +45814,12 @@ Object.freeze({
45599
45814
  addonId: null,
45600
45815
  access: "create"
45601
45816
  },
45817
+ "pipelineAnalytics.setRetrainFrameComplete": {
45818
+ capName: "pipeline-analytics",
45819
+ capScope: "device",
45820
+ addonId: null,
45821
+ access: "create"
45822
+ },
45602
45823
  "pipelineAnalytics.setTrackFlags": {
45603
45824
  capName: "pipeline-analytics",
45604
45825
  capScope: "device",
@@ -45635,6 +45856,12 @@ Object.freeze({
45635
45856
  addonId: null,
45636
45857
  access: "delete"
45637
45858
  },
45859
+ "pipelineAnalytics.writeRetrainArchive": {
45860
+ capName: "pipeline-analytics",
45861
+ capScope: "device",
45862
+ addonId: null,
45863
+ access: "create"
45864
+ },
45638
45865
  "pipelineExecutor.cacheFrameInPool": {
45639
45866
  capName: "pipeline-executor",
45640
45867
  capScope: "system",
@@ -47987,18 +48214,36 @@ Object.freeze({
47987
48214
  addonId: null,
47988
48215
  access: "delete"
47989
48216
  },
48217
+ "userManagement.findUserByExternalIdentity": {
48218
+ capName: "user-management",
48219
+ capScope: "system",
48220
+ addonId: null,
48221
+ access: "view"
48222
+ },
47990
48223
  "userManagement.getTotpStatus": {
47991
48224
  capName: "user-management",
47992
48225
  capScope: "system",
47993
48226
  addonId: null,
47994
48227
  access: "view"
47995
48228
  },
48229
+ "userManagement.linkExternalIdentity": {
48230
+ capName: "user-management",
48231
+ capScope: "system",
48232
+ addonId: null,
48233
+ access: "create"
48234
+ },
47996
48235
  "userManagement.listApiKeys": {
47997
48236
  capName: "user-management",
47998
48237
  capScope: "system",
47999
48238
  addonId: null,
48000
48239
  access: "view"
48001
48240
  },
48241
+ "userManagement.listExternalIdentities": {
48242
+ capName: "user-management",
48243
+ capScope: "system",
48244
+ addonId: null,
48245
+ access: "view"
48246
+ },
48002
48247
  "userManagement.listOauthSessions": {
48003
48248
  capName: "user-management",
48004
48249
  capScope: "system",
@@ -48077,6 +48322,12 @@ Object.freeze({
48077
48322
  addonId: null,
48078
48323
  access: "create"
48079
48324
  },
48325
+ "userManagement.unlinkExternalIdentity": {
48326
+ capName: "user-management",
48327
+ capScope: "system",
48328
+ addonId: null,
48329
+ access: "delete"
48330
+ },
48080
48331
  "userManagement.updateUser": {
48081
48332
  capName: "user-management",
48082
48333
  capScope: "system",
@@ -51416,6 +51667,11 @@ Object.freeze({
51416
51667
  form: "single",
51417
51668
  optional: false
51418
51669
  }],
51670
+ "pipelineAnalytics.setRetrainFrameComplete": [{
51671
+ name: "deviceId",
51672
+ form: "single",
51673
+ optional: false
51674
+ }],
51419
51675
  "pipelineAnalytics.setTrackFlags": [{
51420
51676
  name: "deviceId",
51421
51677
  form: "single",
@@ -163414,11 +163670,11 @@ var MatterBrokerRegistry = class {
163414
163670
  */
163415
163671
  var matterConnectionSchema = object({
163416
163672
  /** Optional Thread operational dataset (hex) for Thread device onboarding. */
163417
- threadDataset: string$2().default("").describe("Thread operational dataset (hex) — required only for Thread devices"),
163673
+ threadDataset: string$2().default("").describe("Thread operational dataset (hex) — required only for Thread devices").meta({ secret: true }),
163418
163674
  /** Optional Wi-Fi SSID for Wi-Fi device onboarding over BLE. */
163419
163675
  wifiSsid: string$2().default("").describe("Wi-Fi SSID — required only for BLE Wi-Fi onboarding"),
163420
163676
  /** Optional Wi-Fi password for Wi-Fi device onboarding over BLE. */
163421
- wifiPassword: string$2().default("").describe("Wi-Fi password (optional)"),
163677
+ wifiPassword: string$2().default("").describe("Wi-Fi password (optional)").meta({ secret: true }),
163422
163678
  /** PULL-reconcile interval for the commissioned-node inventory. */
163423
163679
  reconcileIntervalMs: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(1e4).max(864e5).default(3e5)).describe("Node-inventory reconcile interval (ms)")
163424
163680
  });
@@ -163449,6 +163705,7 @@ function buildConnectionFormSchema() {
163449
163705
  {
163450
163706
  type: "text",
163451
163707
  key: "threadDataset",
163708
+ secret: true,
163452
163709
  label: "Thread operational dataset (hex, optional)",
163453
163710
  placeholder: "0e08000000000001…"
163454
163711
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-matter-broker",
3
- "version": "0.2.120",
3
+ "version": "0.2.122",
4
4
  "description": "Matter broker addon for CamStack — owns a Matter fabric (commissioning + the long-lived controller) via the matter.js controller and brokers commissioned Matter nodes into CamStack",
5
5
  "keywords": [
6
6
  "camstack",