@camstack/addon-agent-ui 1.2.190 → 1.2.191

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 (2) hide show
  1. package/dist/addon.js +202 -9
  2. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -5371,7 +5371,7 @@ var ZodIssueCode = {
5371
5371
  var ZodFirstPartyTypeKind;
5372
5372
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5373
5373
  //#endregion
5374
- //#region ../types/dist/sleep-BNeXenvr.mjs
5374
+ //#region ../types/dist/sleep-B0JG7-_F.mjs
5375
5375
  /**
5376
5376
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5377
5377
  * window to float samples (D455).
@@ -14794,6 +14794,10 @@ var DeviceInfoSchema = object({
14794
14794
  isCamera: boolean(),
14795
14795
  /** Current config values — serializable snapshot */
14796
14796
  config: record(string(), unknown()),
14797
+ /** Paths inside `config` the device's schema declares secret (D783) —
14798
+ * what the non-admin redaction withholds. Paths, never values. Absent
14799
+ * when the owning runner has not reported them. */
14800
+ secretConfigPaths: array(string()).optional(),
14797
14801
  /** Hardware + identity blob (manufacturer / model / firmware / sn /
14798
14802
  * uid / mac / …). Populated by drivers; editable via setMetadata. */
14799
14803
  metadata: record(string(), unknown()).nullable().optional(),
@@ -14999,7 +15003,13 @@ var DeviceRegisterPayloadSchema = object({
14999
15003
  * call (workers re-register on init), so probe-driven updates
15000
15004
  * (e.g. PTZ flag flipping after the abilities probe) propagate. */
15001
15005
  features: array(string()).optional(),
15002
- config: record(string(), unknown())
15006
+ config: record(string(), unknown()),
15007
+ /** Config paths the device's own schema DECLARES secret
15008
+ * (`.meta({ secret: true })` — dotted, `[]` for array items, e.g.
15009
+ * `connection.password`). Re-published on every register; the non-admin
15010
+ * redaction withholds them at any depth (D783). Optional: an older runner
15011
+ * omits it and the keyword backstop applies. */
15012
+ secretConfigPaths: array(string()).optional()
15003
15013
  });
15004
15014
  var DeviceRemovePayloadSchema = object({ deviceId: number() });
15005
15015
  var DevicePersistConfigPayloadSchema = object({
@@ -16658,7 +16668,14 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
16658
16668
  icon: string().optional(),
16659
16669
  /** Addon-owned HTTP route the button navigates to (GET). */
16660
16670
  startUrl: string(),
16661
- stage: LoginStageEnum
16671
+ stage: LoginStageEnum,
16672
+ /**
16673
+ * The provider names an external identity a signed-in user can link to
16674
+ * their own account (D782): `auth.listLinkableProviders` /
16675
+ * `beginExternalLink` offer exactly the redirect methods that set this,
16676
+ * whatever their id. Absent / false — a login button only (magic-link).
16677
+ */
16678
+ linkable: boolean().optional()
16662
16679
  }),
16663
16680
  object({
16664
16681
  kind: literal("widget"),
@@ -22055,7 +22072,13 @@ var RetrainFrameSchema = object({
22055
22072
  sizeBytes: number().int(),
22056
22073
  width: number().int(),
22057
22074
  height: number().int(),
22058
- copiedAt: number()
22075
+ copiedAt: number(),
22076
+ /** When the CAMERA captured the frame. Absent on a copy taken before D785. */
22077
+ capturedAt: number().optional(),
22078
+ /** The operator's "every subject in this frame is boxed". Detector
22079
+ * evaluation keeps only complete frames: an unboxed subject would count as
22080
+ * a false positive. */
22081
+ complete: boolean()
22059
22082
  });
22060
22083
  /** Why a copy-on-select could not be honoured — named, never a silent skip. */
22061
22084
  var RetrainCopyRefusalSchema = _enum([
@@ -22076,6 +22099,51 @@ var RetrainFrameListSchema = object({
22076
22099
  /** What the page pre-selects — the native key frame when one survives. */
22077
22100
  autoPickMediaId: number().int().optional()
22078
22101
  });
22102
+ /**
22103
+ * Which frames an annotated export carries. Every field narrows; an empty
22104
+ * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
22105
+ * list owned by whoever trains (the training orchestrator), so `frameIds` is
22106
+ * the primitive a version export uses; `batchId` re-selects what an earlier
22107
+ * export carried (`exportedInBatch`).
22108
+ */
22109
+ var RetrainExportFilterSchema = object({
22110
+ deviceIds: array(number()).optional(),
22111
+ frameIds: array(string()).max(2e4).optional(),
22112
+ batchId: string().optional(),
22113
+ /** Only frames the operator marked complete (all subjects boxed). */
22114
+ completeOnly: boolean().optional()
22115
+ });
22116
+ /**
22117
+ * `frames`: the full frame copies, boxes in `annotations.json`.
22118
+ * `crops`: additionally one JPEG per subject, cut with the runtime detail-crop
22119
+ * convention — the classifier layout.
22120
+ */
22121
+ var RetrainExportLayoutSchema = _enum(["frames", "crops"]);
22122
+ /**
22123
+ * Where `writeRetrainArchive` streams the tar: one HTTP request whose body is
22124
+ * the archive, sent chunk by chunk. Covers a presigned PUT and a provider
22125
+ * addon's data-plane upload route alike. Headers are sent verbatim and never
22126
+ * logged.
22127
+ */
22128
+ var RetrainArchiveTargetSchema = object({
22129
+ kind: literal("http"),
22130
+ method: _enum(["PUT", "POST"]),
22131
+ url: string().url(),
22132
+ headers: record(string(), string()).optional()
22133
+ });
22134
+ var RetrainArchiveResultSchema = object({
22135
+ batchId: string(),
22136
+ frames: number().int(),
22137
+ crops: number().int(),
22138
+ annotations: number().int(),
22139
+ /** Frames planned but not shipped (unreadable copy, path too long). */
22140
+ missing: number().int(),
22141
+ bytes: number().int(),
22142
+ /** sha256 of the exact bytes sent. */
22143
+ sha256: string(),
22144
+ /** The target's HTTP status. */
22145
+ status: number().int()
22146
+ });
22079
22147
  /** What the operator asked the assist to look for. */
22080
22148
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
22081
22149
  kind: literal("package"),
@@ -22870,9 +22938,25 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
22870
22938
  }), RetrainTransitionResultSchema, {
22871
22939
  kind: "mutation",
22872
22940
  auth: "admin"
22873
- }), method(object({ deviceIds: array(number()).optional() }), object({ url: string() }), {
22941
+ }), method(RetrainExportFilterSchema.extend({ layout: RetrainExportLayoutSchema.optional() }), object({ url: string() }), {
22874
22942
  kind: "query",
22875
22943
  auth: "admin"
22944
+ }), method(object({
22945
+ deviceId: number(),
22946
+ trackId: string(),
22947
+ frameId: string(),
22948
+ complete: boolean()
22949
+ }), RetrainFrameSchema, {
22950
+ kind: "mutation",
22951
+ auth: "admin"
22952
+ }), method(object({
22953
+ filter: RetrainExportFilterSchema,
22954
+ layout: RetrainExportLayoutSchema,
22955
+ target: RetrainArchiveTargetSchema
22956
+ }), RetrainArchiveResultSchema, {
22957
+ kind: "mutation",
22958
+ auth: "admin",
22959
+ timeoutMs: 60 * 6e4
22876
22960
  }), method(object({
22877
22961
  /** Which of the three event tables owns the row. */
22878
22962
  ownerType: EventOwnerTypeSchema,
@@ -26162,7 +26246,19 @@ var SsoBridgeClaimsSchema = object({
26162
26246
  * editing a descriptor must not retroactively extend or shorten a link the
26163
26247
  * operator already consented to.
26164
26248
  */
26165
- refreshTtl: union([number().int().positive(), literal("never")]).optional()
26249
+ refreshTtl: union([number().int().positive(), literal("never")]).optional(),
26250
+ /**
26251
+ * Opaque handle of a hub-side LINK intent (D782). Set by an OIDC callback
26252
+ * that was started from a signed-in user's "Link" button: the finish then
26253
+ * links this identity to the intent's user instead of signing anyone in.
26254
+ * The handle carries no user id — the hub resolves it, single-use.
26255
+ */
26256
+ linkIntent: string().optional(),
26257
+ /**
26258
+ * Verified `iss` of the id_token behind an OIDC login bridge (D782). A
26259
+ * subject is unique only per issuer, so a link is bound to it.
26260
+ */
26261
+ issuer: string().optional()
26166
26262
  });
26167
26263
  method(object({
26168
26264
  claims: SsoBridgeClaimsSchema,
@@ -28068,7 +28164,22 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
28068
28164
  * field their hints were silently stripped by the schema and the
28069
28165
  * adaptive ladder started blind on the client's display size.
28070
28166
  */
28071
- hints: webrtcClientHintsSchema.optional()
28167
+ hints: webrtcClientHintsSchema.optional(),
28168
+ /**
28169
+ * Talk-back (D771): relay the PEER's audio to the device's speaker
28170
+ * through the `intercom` cap's push-talk triple. When `true` and the
28171
+ * offer lets the peer send audio, the answer's audio is `sendrecv`
28172
+ * and every inbound frame goes to `intercom.pushTalkAudio` for this
28173
+ * `deviceId`; absent/false answers `sendonly`, as for every viewer.
28174
+ *
28175
+ * TRUSTED-CALLER ONLY. Set by the Alexa export for an Echo on a camera
28176
+ * with `intercom`, when the linked user may control that camera. The
28177
+ * hub STRIPS it from every request-bound call (a browser), exactly as
28178
+ * it overwrites `relayOnly` — a viewer's talk permission is the
28179
+ * intercom cap's own surface (share tokens gate it there), and this
28180
+ * flag must not become a second door to the camera's speaker.
28181
+ */
28182
+ talkback: boolean().optional()
28072
28183
  }), object({
28073
28184
  sessionId: string(),
28074
28185
  sdpAnswer: string()
@@ -36112,6 +36223,32 @@ var TotpStatusSchema = object({
36112
36223
  /** Null when no row exists OR the row is still pending confirmation. */
36113
36224
  confirmedAt: number().nullable()
36114
36225
  });
36226
+ /**
36227
+ * user-management — singleton capability for user accounts, API keys,
36228
+ * and scoped tokens.
36229
+ *
36230
+ * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
36231
+ * — the subset check on `setUserScopes` / `createScopedToken` is moot
36232
+ * because non-admins never reach these. If/when we open non-admin
36233
+ * delegation, structural caller-scope subset check goes inside the
36234
+ * provider.
36235
+ */
36236
+ var ExternalIdentitySchema = object({
36237
+ /** Login-method id of the provider instance, e.g. `auth-oidc/authentik`. */
36238
+ provider: string(),
36239
+ /** The IdP's stable subject (`sub`) for this account. */
36240
+ subject: string(),
36241
+ /** The verified `iss` of the IdP the identity was linked under — `sub` is unique only per issuer. */
36242
+ issuer: string(),
36243
+ userId: string(),
36244
+ /** What the IdP called the account at link time (username / email) — display only. */
36245
+ label: string().optional(),
36246
+ linkedAt: number()
36247
+ });
36248
+ var ExternalIdentityKeySchema = object({
36249
+ provider: string().min(1),
36250
+ subject: string().min(1)
36251
+ });
36115
36252
  method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserInputSchema, UserSummarySchema, {
36116
36253
  kind: "mutation",
36117
36254
  auth: "admin",
@@ -36225,7 +36362,22 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
36225
36362
  userId: string(),
36226
36363
  username: string(),
36227
36364
  scopes: array(TokenScopeSchema)
36228
- }).nullable(), { access: "view" }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
36365
+ }).nullable(), { access: "view" }), method(object({ userId: string() }), array(ExternalIdentitySchema), { auth: "admin" }), method(ExternalIdentityKeySchema, object({
36366
+ userId: string(),
36367
+ issuer: string()
36368
+ }).nullable(), { auth: "admin" }), method(ExternalIdentityKeySchema.extend({
36369
+ userId: string(),
36370
+ issuer: string().min(1),
36371
+ label: string().optional()
36372
+ }), object({ success: literal(true) }), {
36373
+ kind: "mutation",
36374
+ auth: "admin",
36375
+ access: "create"
36376
+ }), method(ExternalIdentityKeySchema.extend({ userId: string() }), object({ success: boolean() }), {
36377
+ kind: "mutation",
36378
+ auth: "admin",
36379
+ access: "delete"
36380
+ }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
36229
36381
  kind: "mutation",
36230
36382
  auth: "admin",
36231
36383
  access: "delete"
@@ -41031,6 +41183,12 @@ Object.freeze({
41031
41183
  addonId: null,
41032
41184
  access: "create"
41033
41185
  },
41186
+ "pipelineAnalytics.setRetrainFrameComplete": {
41187
+ capName: "pipeline-analytics",
41188
+ capScope: "device",
41189
+ addonId: null,
41190
+ access: "create"
41191
+ },
41034
41192
  "pipelineAnalytics.setTrackFlags": {
41035
41193
  capName: "pipeline-analytics",
41036
41194
  capScope: "device",
@@ -41067,6 +41225,12 @@ Object.freeze({
41067
41225
  addonId: null,
41068
41226
  access: "delete"
41069
41227
  },
41228
+ "pipelineAnalytics.writeRetrainArchive": {
41229
+ capName: "pipeline-analytics",
41230
+ capScope: "device",
41231
+ addonId: null,
41232
+ access: "create"
41233
+ },
41070
41234
  "pipelineExecutor.cacheFrameInPool": {
41071
41235
  capName: "pipeline-executor",
41072
41236
  capScope: "system",
@@ -43419,18 +43583,36 @@ Object.freeze({
43419
43583
  addonId: null,
43420
43584
  access: "delete"
43421
43585
  },
43586
+ "userManagement.findUserByExternalIdentity": {
43587
+ capName: "user-management",
43588
+ capScope: "system",
43589
+ addonId: null,
43590
+ access: "view"
43591
+ },
43422
43592
  "userManagement.getTotpStatus": {
43423
43593
  capName: "user-management",
43424
43594
  capScope: "system",
43425
43595
  addonId: null,
43426
43596
  access: "view"
43427
43597
  },
43598
+ "userManagement.linkExternalIdentity": {
43599
+ capName: "user-management",
43600
+ capScope: "system",
43601
+ addonId: null,
43602
+ access: "create"
43603
+ },
43428
43604
  "userManagement.listApiKeys": {
43429
43605
  capName: "user-management",
43430
43606
  capScope: "system",
43431
43607
  addonId: null,
43432
43608
  access: "view"
43433
43609
  },
43610
+ "userManagement.listExternalIdentities": {
43611
+ capName: "user-management",
43612
+ capScope: "system",
43613
+ addonId: null,
43614
+ access: "view"
43615
+ },
43434
43616
  "userManagement.listOauthSessions": {
43435
43617
  capName: "user-management",
43436
43618
  capScope: "system",
@@ -43509,6 +43691,12 @@ Object.freeze({
43509
43691
  addonId: null,
43510
43692
  access: "create"
43511
43693
  },
43694
+ "userManagement.unlinkExternalIdentity": {
43695
+ capName: "user-management",
43696
+ capScope: "system",
43697
+ addonId: null,
43698
+ access: "delete"
43699
+ },
43512
43700
  "userManagement.updateUser": {
43513
43701
  capName: "user-management",
43514
43702
  capScope: "system",
@@ -46848,6 +47036,11 @@ Object.freeze({
46848
47036
  form: "single",
46849
47037
  optional: false
46850
47038
  }],
47039
+ "pipelineAnalytics.setRetrainFrameComplete": [{
47040
+ name: "deviceId",
47041
+ form: "single",
47042
+ optional: false
47043
+ }],
46851
47044
  "pipelineAnalytics.setTrackFlags": [{
46852
47045
  name: "deviceId",
46853
47046
  form: "single",
@@ -48919,7 +49112,7 @@ var AgentUIAddon = class extends BaseAddon {
48919
49112
  capability: adminUiCapability,
48920
49113
  provider: {
48921
49114
  getStaticDir: async () => ({ staticDir: path.resolve(__dirname) }),
48922
- getVersion: async () => ({ version: "1.2.190" })
49115
+ getVersion: async () => ({ version: "1.2.191" })
48923
49116
  }
48924
49117
  }];
48925
49118
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-agent-ui",
3
- "version": "1.2.190",
3
+ "version": "1.2.191",
4
4
  "description": "Agent UI — lightweight status dashboard served by every agent node",
5
5
  "keywords": [
6
6
  "camstack",