@camstack/addon-mqtt-broker 1.1.20 → 1.1.22

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.
@@ -4673,7 +4673,7 @@ function _instanceof(cls, params = {}) {
4673
4673
  return inst;
4674
4674
  }
4675
4675
  //#endregion
4676
- //#region ../types/dist/sleep-DJaTV2D7.mjs
4676
+ //#region ../types/dist/sleep-Baang_XW.mjs
4677
4677
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4678
4678
  EventCategory["SystemBoot"] = "system.boot";
4679
4679
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -6777,6 +6777,18 @@ function method(input, output, options) {
6777
6777
  timeoutMs: options?.timeoutMs
6778
6778
  };
6779
6779
  }
6780
+ /**
6781
+ * A wrapper/system-only method: served exclusively by the cap's system-level
6782
+ * provider (`InferProvider`), and OPTIONAL on `InferNativeProvider` so per-device
6783
+ * driver natives don't stub out a wrapper concern (e.g. a cross-device cache
6784
+ * overview). The `systemOnly: true` literal is what `InferNativeProvider` keys on.
6785
+ */
6786
+ function systemMethod(input, output, options) {
6787
+ return {
6788
+ ...method(input, output, options),
6789
+ systemOnly: true
6790
+ };
6791
+ }
6780
6792
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6781
6793
  var VersionOutputSchema$1 = object({ version: string() });
6782
6794
  method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
@@ -10515,6 +10527,7 @@ var PipelineAddonSchemaSchema = object({
10515
10527
  defaultModelId: string(),
10516
10528
  defaultModelIdByFormat: record(string(), string()).optional(),
10517
10529
  enabledByDefault: boolean().optional(),
10530
+ backfillIntoExistingOverrides: boolean().optional(),
10518
10531
  defaultConfidence: number(),
10519
10532
  group: string().optional(),
10520
10533
  configSchema: array(ConfigFieldBridge).readonly().optional()
@@ -10696,7 +10709,15 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
10696
10709
  image: _instanceof(Uint8Array).optional(),
10697
10710
  referenceImage: string().optional(),
10698
10711
  deviceId: number().optional(),
10699
- sessionId: string().optional()
10712
+ sessionId: string().optional(),
10713
+ /**
10714
+ * Execution plane. 'full' (default) runs the whole tree — benchmark,
10715
+ * reference-image, and detail-subtree calls. 'frame' is the live
10716
+ * per-frame dispatch: ONLY root-plane steps run; crop children
10717
+ * (inputClasses ≠ null) are skipped and served per-track via
10718
+ * pipelineRunner.runDetailSubtree (two-plane design).
10719
+ */
10720
+ plane: _enum(["full", "frame"]).optional()
10700
10721
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
10701
10722
  engine: PipelineEngineChoiceSchema.optional(),
10702
10723
  steps: array(PipelineStepInputSchema).min(1),
@@ -10821,6 +10842,47 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(ZoneSchema).read
10821
10842
  auth: "admin"
10822
10843
  }), object({ zones: array(ZoneSchema).readonly() });
10823
10844
  /**
10845
+ * A bounding box in NORMALIZED [0,1] frame coordinates for `getNativeCrop`. The
10846
+ * decode worker resolves it against the RETAINED native frame's real pixel dims,
10847
+ * so the caller supplies only the detection-res bbox divided by the detection
10848
+ * dims — no native resolution to plumb.
10849
+ */
10850
+ var NativeCropBboxSchema = object({
10851
+ x: number(),
10852
+ y: number(),
10853
+ w: number(),
10854
+ h: number()
10855
+ });
10856
+ /** Result of a best-effort native-resolution crop (`getNativeCrop`). */
10857
+ var NativeCropResultSchema = object({
10858
+ /** Packed rgb (24-bit) pixels of the crop. */
10859
+ bytes: _instanceof(Uint8Array),
10860
+ width: number().int().positive(),
10861
+ height: number().int().positive()
10862
+ });
10863
+ /** Parent detection context passed to `runDetailSubtree` — the crop's
10864
+ * originating detection, in FRAME-space coordinates. Reuses
10865
+ * `NativeCropBboxSchema`'s `{x,y,w,h}` shape (same numeric fields; here
10866
+ * the coordinates are frame-space rather than getNativeCrop's
10867
+ * normalized [0,1] convention). */
10868
+ var DetailParentSchema = object({
10869
+ bbox: NativeCropBboxSchema,
10870
+ className: string()
10871
+ });
10872
+ /** One child-step result from `runDetailSubtree` — an embedding, label,
10873
+ * or refined detection produced by running the crop-subtree on a
10874
+ * single tracked detection. */
10875
+ var DetailResultSchema = object({
10876
+ stepId: string(),
10877
+ className: string(),
10878
+ score: number(),
10879
+ /** FRAME-space bbox (already mapped back from crop space). */
10880
+ bbox: NativeCropBboxSchema.optional(),
10881
+ embedding: string().optional(),
10882
+ label: string().optional(),
10883
+ alignedCropJpeg: string().optional()
10884
+ });
10885
+ /**
10824
10886
  * Per-camera tunable ranges + defaults. Single source of truth used
10825
10887
  * by both the Zod data schema (validation + default fallback) and
10826
10888
  * the device settings UI (slider min/max/step). Touch one place and
@@ -11076,7 +11138,17 @@ var RunnerLocalMetricsSchema = object({
11076
11138
  avgInferenceTimeMs: number(),
11077
11139
  queueDepth: number()
11078
11140
  });
11079
- method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mutation" }), method(object({ deviceId: number() }), object({ success: literal(true) }), { kind: "mutation" }), method(ReportMotionInputSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), RunnerLocalLoadSchema), method(_void(), RunnerLocalMetricsSchema), method(object({ deviceId: number() }), CameraMetricsSchema.nullable()), method(_void(), array(CameraMetricsWithDeviceIdSchema).readonly()), method(_void(), array(number()).readonly());
11141
+ method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mutation" }), method(object({ deviceId: number() }), object({ success: literal(true) }), { kind: "mutation" }), method(ReportMotionInputSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), RunnerLocalLoadSchema), method(_void(), RunnerLocalMetricsSchema), method(object({ deviceId: number() }), CameraMetricsSchema.nullable()), method(_void(), array(CameraMetricsWithDeviceIdSchema).readonly()), method(_void(), array(number()).readonly()), method(object({
11142
+ handle: FrameHandleSchema,
11143
+ bbox: NativeCropBboxSchema,
11144
+ maxWidth: number().int().positive().optional()
11145
+ }), NativeCropResultSchema.nullable()), method(object({
11146
+ deviceId: number(),
11147
+ frameHandle: FrameHandleSchema.optional(),
11148
+ cropJpeg: string().optional(),
11149
+ parent: DetailParentSchema,
11150
+ steps: array(string()).optional()
11151
+ }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" });
11080
11152
  object({
11081
11153
  detected: boolean(),
11082
11154
  /** Ms epoch of the last detected-true observation. Null if never detected. */
@@ -15182,7 +15254,17 @@ var TrackSchema = object({
15182
15254
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
15183
15255
  totalDistance: number(),
15184
15256
  state: TrackStateSchema,
15185
- active: boolean()
15257
+ active: boolean(),
15258
+ /** Deterministic key-event importance score in [0,1] (server-computed at
15259
+ * track expiry, recomputed on late label). Absent on legacy rows written
15260
+ * before scoring shipped — consumers degrade to absence / compute-on-read. */
15261
+ importance: number().optional(),
15262
+ /** Id of the track's highest-confidence ObjectEvent (its representative
15263
+ * "best" frame). Absent when the track produced no object events. */
15264
+ bestEventId: string().optional(),
15265
+ /** Tag of the importance sub-signal that dominated the score
15266
+ * (identity|dwell|proximity|class|confidence|travel|zone). */
15267
+ importanceReason: string().optional()
15186
15268
  });
15187
15269
  var BaseEventFields = {
15188
15270
  id: string(),
@@ -15247,8 +15329,18 @@ var ObjectEventSchema = object({
15247
15329
  frameHeight: number().optional(),
15248
15330
  /** MediaStore key for the crop attached to this event (if any). */
15249
15331
  mediaKey: string().optional(),
15332
+ /** Design B: MediaStore key of the track's native-resolution key frame (the
15333
+ * best-detection full frame). Resolve via the event-media data-plane
15334
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
15335
+ * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
15336
+ * sources — consumers fall back to `mediaKey` (the tight crop). */
15337
+ keyFrameMediaKey: string().optional(),
15250
15338
  /** Populated by B5 (recording playback URL for this event). */
15251
- mediaUrl: string().optional()
15339
+ mediaUrl: string().optional(),
15340
+ /** The parent track's key-event importance [0,1], propagated to every object
15341
+ * event of the track (so an event row can be sorted by importance without a
15342
+ * track join). Absent on legacy rows / before the track was scored. */
15343
+ importance: number().optional()
15252
15344
  });
15253
15345
  var AudioEventSchema = object({
15254
15346
  ...BaseEventFields,
@@ -15272,7 +15364,8 @@ var MediaFileKindEnum = _enum([
15272
15364
  "fullFrame",
15273
15365
  "fullFrameBoxed",
15274
15366
  "faceCrop",
15275
- "plateCrop"
15367
+ "plateCrop",
15368
+ "keyFrame"
15276
15369
  ]);
15277
15370
  var MediaFileSchema = object({
15278
15371
  key: string(),
@@ -15293,6 +15386,32 @@ var DeviceEventQueryInput = object({
15293
15386
  projection: _enum(["full", "slim"]).optional()
15294
15387
  });
15295
15388
  var ObjectEventQueryInput = DeviceEventQueryInput.extend({ classFilter: string().optional() });
15389
+ var KeyEventQueryInput = object({
15390
+ deviceId: number(),
15391
+ /** Window lower bound (track firstSeen ≥ since). */
15392
+ since: number(),
15393
+ /** Window upper bound (track firstSeen ≤ until). */
15394
+ until: number(),
15395
+ limit: number().int().min(1).max(200).default(50),
15396
+ /** Drop tracks scoring below this importance. */
15397
+ minImportance: number().min(0).max(1).optional(),
15398
+ /** Restrict to a single class (e.g. 'person'). */
15399
+ classFilter: string().optional()
15400
+ });
15401
+ var KeyEventSchema = object({
15402
+ /** The representative event id (the track's best ObjectEvent, else its trackId). */
15403
+ id: string(),
15404
+ trackId: string(),
15405
+ /** Track start time (firstSeen). */
15406
+ timestamp: number(),
15407
+ className: string(),
15408
+ label: string().optional(),
15409
+ importance: number(),
15410
+ /** Highest-confidence ObjectEvent id for the track (empty when none). */
15411
+ bestEventId: string(),
15412
+ /** Track lifetime in ms (lastSeen - firstSeen). */
15413
+ windowMs: number().optional()
15414
+ });
15296
15415
  var TrackedDetectionSchema = object({
15297
15416
  trackId: string(),
15298
15417
  className: string(),
@@ -15322,7 +15441,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
15322
15441
  }), array(TrackSchema).readonly()), method(object({ deviceId: number() }), _void(), {
15323
15442
  kind: "mutation",
15324
15443
  auth: "admin"
15325
- }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({
15444
+ }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(object({
15326
15445
  deviceId: number(),
15327
15446
  since: number(),
15328
15447
  until: number(),
@@ -16089,7 +16208,12 @@ DeviceType.Camera, method(object({
16089
16208
  }), SnapshotImageSchema.nullable()), method(object({ deviceId: number() }), _void(), {
16090
16209
  kind: "mutation",
16091
16210
  auth: "admin"
16092
- });
16211
+ }), systemMethod(object({ deviceIds: array(number()).min(1).max(200) }), array(object({
16212
+ deviceId: number(),
16213
+ lastCapturedAt: number().nullable(),
16214
+ cacheAgeMs: number().nullable(),
16215
+ etag: string().nullable()
16216
+ })));
16093
16217
  /**
16094
16218
  * `sso-bridge` — internal hub-only cap that lets SSO-style auth
16095
16219
  * providers (OIDC, SAML, magic-link, …) mint an HMAC-signed token
@@ -16340,10 +16464,32 @@ method(_void(), array(TurnServerSchema).readonly());
16340
16464
  * b. `finishAuthentication({userId, response})` → server verifies
16341
16465
  * the assertion, bumps the credential counter, returns ok.
16342
16466
  *
16467
+ * 2b. Usernameless (discoverable-credential) authentication — the
16468
+ * passkey IS the primary factor, no password leg:
16469
+ * a. `beginDiscoverableAuthentication({})` → assertion options with
16470
+ * EMPTY `allowCredentials` (the browser offers every resident
16471
+ * passkey it holds for this RP) + `userVerification: 'required'`
16472
+ * (the passkey replaces both factors, so UV is mandatory).
16473
+ * The challenge is stored server-side, NOT bound to any user.
16474
+ * b. `finishDiscoverableAuthentication({response})` → the provider
16475
+ * resolves the credential by the response's credential id,
16476
+ * verifies the assertion against the stored challenge + that
16477
+ * credential's public key/counter, and returns the OWNING
16478
+ * `userId` — the caller (core auth router) mints the session.
16479
+ *
16343
16480
  * 3. Management:
16344
16481
  * - `listPasskeys({userId})` — enumerate user's enrolled credentials.
16345
16482
  * - `removePasskey({userId, credentialId})` — revoke one credential.
16346
16483
  *
16484
+ * 4. Second-factor preference (opt-in, default OFF):
16485
+ * Enrolling a passkey only enables passkey-FIRST sign-in. It is
16486
+ * demanded as a second factor after a password login ONLY when the
16487
+ * user explicitly opts in via `setSecondFactorPreference`.
16488
+ * - `getSecondFactorPreference({userId})` → `{ enabled }` (missing
16489
+ * row ⇒ `enabled: false`).
16490
+ * - `setSecondFactorPreference({userId, enabled})` — persisted by
16491
+ * the providing addon beside its credentials.
16492
+ *
16347
16493
  * Challenges are short-lived (5 min, in-memory). The cap is internal —
16348
16494
  * the admin-ui composes the begin/finish round-trip and never exposes
16349
16495
  * the cap to non-admins.
@@ -16386,6 +16532,17 @@ method(object({
16386
16532
  }), object({ verified: boolean() }), {
16387
16533
  kind: "mutation",
16388
16534
  access: "view"
16535
+ }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
16536
+ kind: "mutation",
16537
+ access: "view"
16538
+ }), method(object({
16539
+ /** AuthenticationResponseJSON from the browser. */
16540
+ response: record(string(), unknown()) }), object({
16541
+ verified: boolean(),
16542
+ userId: string().nullable()
16543
+ }), {
16544
+ kind: "mutation",
16545
+ access: "view"
16389
16546
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
16390
16547
  userId: string(),
16391
16548
  credentialId: string()
@@ -16393,6 +16550,13 @@ method(object({
16393
16550
  kind: "mutation",
16394
16551
  auth: "admin",
16395
16552
  access: "delete"
16553
+ }), method(object({ userId: string() }), object({ enabled: boolean() }), { auth: "admin" }), method(object({
16554
+ userId: string(),
16555
+ enabled: boolean()
16556
+ }), object({ success: literal(true) }), {
16557
+ kind: "mutation",
16558
+ auth: "admin",
16559
+ access: "create"
16396
16560
  });
16397
16561
  /**
16398
16562
  * `videoclips` — the unified, navigable-clip surface for a camera.
@@ -17194,7 +17358,17 @@ var FaceInfoSchema = object({
17194
17358
  recognizedIdentityId: string().optional(),
17195
17359
  identityName: string().optional(),
17196
17360
  assigned: boolean(),
17197
- base64: string().optional()
17361
+ base64: string().optional(),
17362
+ /** Design B: the face bbox (pixel space) on the key frame — lets a detail
17363
+ * view draw the box over the native `keyFrameMediaKey` frame. Absent on
17364
+ * legacy rows written before design B. */
17365
+ faceBbox: BoundingBoxSchema.optional(),
17366
+ /** Design B: MediaStore key of the track's native-resolution key frame.
17367
+ * Fetch the native JPEG via the event-media data-plane
17368
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
17369
+ * track produced no key frame (e.g. native/onboard source) — the UI falls
17370
+ * back to the inline `base64` face crop. */
17371
+ keyFrameMediaKey: string().optional()
17198
17372
  });
17199
17373
  var FaceFilterEnum = _enum([
17200
17374
  "unassigned",
@@ -21313,6 +21487,12 @@ Object.freeze({
21313
21487
  addonId: null,
21314
21488
  access: "view"
21315
21489
  },
21490
+ "pipelineAnalytics.getKeyEvents": {
21491
+ capName: "pipeline-analytics",
21492
+ capScope: "device",
21493
+ addonId: null,
21494
+ access: "view"
21495
+ },
21316
21496
  "pipelineAnalytics.getMotionEvents": {
21317
21497
  capName: "pipeline-analytics",
21318
21498
  capScope: "device",
@@ -21841,12 +22021,24 @@ Object.freeze({
21841
22021
  addonId: null,
21842
22022
  access: "view"
21843
22023
  },
22024
+ "pipelineRunner.getNativeCrop": {
22025
+ capName: "pipeline-runner",
22026
+ capScope: "system",
22027
+ addonId: null,
22028
+ access: "view"
22029
+ },
21844
22030
  "pipelineRunner.reportMotion": {
21845
22031
  capName: "pipeline-runner",
21846
22032
  capScope: "system",
21847
22033
  addonId: null,
21848
22034
  access: "create"
21849
22035
  },
22036
+ "pipelineRunner.runDetailSubtree": {
22037
+ capName: "pipeline-runner",
22038
+ capScope: "system",
22039
+ addonId: null,
22040
+ access: "create"
22041
+ },
21850
22042
  "plateGallery.correctPlateText": {
21851
22043
  capName: "plate-gallery",
21852
22044
  capScope: "system",
@@ -22207,6 +22399,12 @@ Object.freeze({
22207
22399
  addonId: null,
22208
22400
  access: "view"
22209
22401
  },
22402
+ "snapshot.getSnapshotOverview": {
22403
+ capName: "snapshot",
22404
+ capScope: "device",
22405
+ addonId: null,
22406
+ access: "view"
22407
+ },
22210
22408
  "snapshot.invalidateCache": {
22211
22409
  capName: "snapshot",
22212
22410
  capScope: "device",
@@ -22885,6 +23083,12 @@ Object.freeze({
22885
23083
  addonId: null,
22886
23084
  access: "view"
22887
23085
  },
23086
+ "userPasskeys.beginDiscoverableAuthentication": {
23087
+ capName: "user-passkeys",
23088
+ capScope: "system",
23089
+ addonId: null,
23090
+ access: "view"
23091
+ },
22888
23092
  "userPasskeys.beginRegistration": {
22889
23093
  capName: "user-passkeys",
22890
23094
  capScope: "system",
@@ -22897,12 +23101,24 @@ Object.freeze({
22897
23101
  addonId: null,
22898
23102
  access: "view"
22899
23103
  },
23104
+ "userPasskeys.finishDiscoverableAuthentication": {
23105
+ capName: "user-passkeys",
23106
+ capScope: "system",
23107
+ addonId: null,
23108
+ access: "view"
23109
+ },
22900
23110
  "userPasskeys.finishRegistration": {
22901
23111
  capName: "user-passkeys",
22902
23112
  capScope: "system",
22903
23113
  addonId: null,
22904
23114
  access: "create"
22905
23115
  },
23116
+ "userPasskeys.getSecondFactorPreference": {
23117
+ capName: "user-passkeys",
23118
+ capScope: "system",
23119
+ addonId: null,
23120
+ access: "view"
23121
+ },
22906
23122
  "userPasskeys.listPasskeys": {
22907
23123
  capName: "user-passkeys",
22908
23124
  capScope: "system",
@@ -22915,6 +23131,12 @@ Object.freeze({
22915
23131
  addonId: null,
22916
23132
  access: "delete"
22917
23133
  },
23134
+ "userPasskeys.setSecondFactorPreference": {
23135
+ capName: "user-passkeys",
23136
+ capScope: "system",
23137
+ addonId: null,
23138
+ access: "create"
23139
+ },
22918
23140
  "vacuumControl.locate": {
22919
23141
  capName: "vacuum-control",
22920
23142
  capScope: "device",
@@ -4668,7 +4668,7 @@ function _instanceof(cls, params = {}) {
4668
4668
  return inst;
4669
4669
  }
4670
4670
  //#endregion
4671
- //#region ../types/dist/sleep-DJaTV2D7.mjs
4671
+ //#region ../types/dist/sleep-Baang_XW.mjs
4672
4672
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4673
4673
  EventCategory["SystemBoot"] = "system.boot";
4674
4674
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -6772,6 +6772,18 @@ function method(input, output, options) {
6772
6772
  timeoutMs: options?.timeoutMs
6773
6773
  };
6774
6774
  }
6775
+ /**
6776
+ * A wrapper/system-only method: served exclusively by the cap's system-level
6777
+ * provider (`InferProvider`), and OPTIONAL on `InferNativeProvider` so per-device
6778
+ * driver natives don't stub out a wrapper concern (e.g. a cross-device cache
6779
+ * overview). The `systemOnly: true` literal is what `InferNativeProvider` keys on.
6780
+ */
6781
+ function systemMethod(input, output, options) {
6782
+ return {
6783
+ ...method(input, output, options),
6784
+ systemOnly: true
6785
+ };
6786
+ }
6775
6787
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6776
6788
  var VersionOutputSchema$1 = object({ version: string() });
6777
6789
  method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
@@ -10510,6 +10522,7 @@ var PipelineAddonSchemaSchema = object({
10510
10522
  defaultModelId: string(),
10511
10523
  defaultModelIdByFormat: record(string(), string()).optional(),
10512
10524
  enabledByDefault: boolean().optional(),
10525
+ backfillIntoExistingOverrides: boolean().optional(),
10513
10526
  defaultConfidence: number(),
10514
10527
  group: string().optional(),
10515
10528
  configSchema: array(ConfigFieldBridge).readonly().optional()
@@ -10691,7 +10704,15 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
10691
10704
  image: _instanceof(Uint8Array).optional(),
10692
10705
  referenceImage: string().optional(),
10693
10706
  deviceId: number().optional(),
10694
- sessionId: string().optional()
10707
+ sessionId: string().optional(),
10708
+ /**
10709
+ * Execution plane. 'full' (default) runs the whole tree — benchmark,
10710
+ * reference-image, and detail-subtree calls. 'frame' is the live
10711
+ * per-frame dispatch: ONLY root-plane steps run; crop children
10712
+ * (inputClasses ≠ null) are skipped and served per-track via
10713
+ * pipelineRunner.runDetailSubtree (two-plane design).
10714
+ */
10715
+ plane: _enum(["full", "frame"]).optional()
10695
10716
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
10696
10717
  engine: PipelineEngineChoiceSchema.optional(),
10697
10718
  steps: array(PipelineStepInputSchema).min(1),
@@ -10816,6 +10837,47 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(ZoneSchema).read
10816
10837
  auth: "admin"
10817
10838
  }), object({ zones: array(ZoneSchema).readonly() });
10818
10839
  /**
10840
+ * A bounding box in NORMALIZED [0,1] frame coordinates for `getNativeCrop`. The
10841
+ * decode worker resolves it against the RETAINED native frame's real pixel dims,
10842
+ * so the caller supplies only the detection-res bbox divided by the detection
10843
+ * dims — no native resolution to plumb.
10844
+ */
10845
+ var NativeCropBboxSchema = object({
10846
+ x: number(),
10847
+ y: number(),
10848
+ w: number(),
10849
+ h: number()
10850
+ });
10851
+ /** Result of a best-effort native-resolution crop (`getNativeCrop`). */
10852
+ var NativeCropResultSchema = object({
10853
+ /** Packed rgb (24-bit) pixels of the crop. */
10854
+ bytes: _instanceof(Uint8Array),
10855
+ width: number().int().positive(),
10856
+ height: number().int().positive()
10857
+ });
10858
+ /** Parent detection context passed to `runDetailSubtree` — the crop's
10859
+ * originating detection, in FRAME-space coordinates. Reuses
10860
+ * `NativeCropBboxSchema`'s `{x,y,w,h}` shape (same numeric fields; here
10861
+ * the coordinates are frame-space rather than getNativeCrop's
10862
+ * normalized [0,1] convention). */
10863
+ var DetailParentSchema = object({
10864
+ bbox: NativeCropBboxSchema,
10865
+ className: string()
10866
+ });
10867
+ /** One child-step result from `runDetailSubtree` — an embedding, label,
10868
+ * or refined detection produced by running the crop-subtree on a
10869
+ * single tracked detection. */
10870
+ var DetailResultSchema = object({
10871
+ stepId: string(),
10872
+ className: string(),
10873
+ score: number(),
10874
+ /** FRAME-space bbox (already mapped back from crop space). */
10875
+ bbox: NativeCropBboxSchema.optional(),
10876
+ embedding: string().optional(),
10877
+ label: string().optional(),
10878
+ alignedCropJpeg: string().optional()
10879
+ });
10880
+ /**
10819
10881
  * Per-camera tunable ranges + defaults. Single source of truth used
10820
10882
  * by both the Zod data schema (validation + default fallback) and
10821
10883
  * the device settings UI (slider min/max/step). Touch one place and
@@ -11071,7 +11133,17 @@ var RunnerLocalMetricsSchema = object({
11071
11133
  avgInferenceTimeMs: number(),
11072
11134
  queueDepth: number()
11073
11135
  });
11074
- method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mutation" }), method(object({ deviceId: number() }), object({ success: literal(true) }), { kind: "mutation" }), method(ReportMotionInputSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), RunnerLocalLoadSchema), method(_void(), RunnerLocalMetricsSchema), method(object({ deviceId: number() }), CameraMetricsSchema.nullable()), method(_void(), array(CameraMetricsWithDeviceIdSchema).readonly()), method(_void(), array(number()).readonly());
11136
+ method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mutation" }), method(object({ deviceId: number() }), object({ success: literal(true) }), { kind: "mutation" }), method(ReportMotionInputSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), RunnerLocalLoadSchema), method(_void(), RunnerLocalMetricsSchema), method(object({ deviceId: number() }), CameraMetricsSchema.nullable()), method(_void(), array(CameraMetricsWithDeviceIdSchema).readonly()), method(_void(), array(number()).readonly()), method(object({
11137
+ handle: FrameHandleSchema,
11138
+ bbox: NativeCropBboxSchema,
11139
+ maxWidth: number().int().positive().optional()
11140
+ }), NativeCropResultSchema.nullable()), method(object({
11141
+ deviceId: number(),
11142
+ frameHandle: FrameHandleSchema.optional(),
11143
+ cropJpeg: string().optional(),
11144
+ parent: DetailParentSchema,
11145
+ steps: array(string()).optional()
11146
+ }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" });
11075
11147
  object({
11076
11148
  detected: boolean(),
11077
11149
  /** Ms epoch of the last detected-true observation. Null if never detected. */
@@ -15177,7 +15249,17 @@ var TrackSchema = object({
15177
15249
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
15178
15250
  totalDistance: number(),
15179
15251
  state: TrackStateSchema,
15180
- active: boolean()
15252
+ active: boolean(),
15253
+ /** Deterministic key-event importance score in [0,1] (server-computed at
15254
+ * track expiry, recomputed on late label). Absent on legacy rows written
15255
+ * before scoring shipped — consumers degrade to absence / compute-on-read. */
15256
+ importance: number().optional(),
15257
+ /** Id of the track's highest-confidence ObjectEvent (its representative
15258
+ * "best" frame). Absent when the track produced no object events. */
15259
+ bestEventId: string().optional(),
15260
+ /** Tag of the importance sub-signal that dominated the score
15261
+ * (identity|dwell|proximity|class|confidence|travel|zone). */
15262
+ importanceReason: string().optional()
15181
15263
  });
15182
15264
  var BaseEventFields = {
15183
15265
  id: string(),
@@ -15242,8 +15324,18 @@ var ObjectEventSchema = object({
15242
15324
  frameHeight: number().optional(),
15243
15325
  /** MediaStore key for the crop attached to this event (if any). */
15244
15326
  mediaKey: string().optional(),
15327
+ /** Design B: MediaStore key of the track's native-resolution key frame (the
15328
+ * best-detection full frame). Resolve via the event-media data-plane
15329
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
15330
+ * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
15331
+ * sources — consumers fall back to `mediaKey` (the tight crop). */
15332
+ keyFrameMediaKey: string().optional(),
15245
15333
  /** Populated by B5 (recording playback URL for this event). */
15246
- mediaUrl: string().optional()
15334
+ mediaUrl: string().optional(),
15335
+ /** The parent track's key-event importance [0,1], propagated to every object
15336
+ * event of the track (so an event row can be sorted by importance without a
15337
+ * track join). Absent on legacy rows / before the track was scored. */
15338
+ importance: number().optional()
15247
15339
  });
15248
15340
  var AudioEventSchema = object({
15249
15341
  ...BaseEventFields,
@@ -15267,7 +15359,8 @@ var MediaFileKindEnum = _enum([
15267
15359
  "fullFrame",
15268
15360
  "fullFrameBoxed",
15269
15361
  "faceCrop",
15270
- "plateCrop"
15362
+ "plateCrop",
15363
+ "keyFrame"
15271
15364
  ]);
15272
15365
  var MediaFileSchema = object({
15273
15366
  key: string(),
@@ -15288,6 +15381,32 @@ var DeviceEventQueryInput = object({
15288
15381
  projection: _enum(["full", "slim"]).optional()
15289
15382
  });
15290
15383
  var ObjectEventQueryInput = DeviceEventQueryInput.extend({ classFilter: string().optional() });
15384
+ var KeyEventQueryInput = object({
15385
+ deviceId: number(),
15386
+ /** Window lower bound (track firstSeen ≥ since). */
15387
+ since: number(),
15388
+ /** Window upper bound (track firstSeen ≤ until). */
15389
+ until: number(),
15390
+ limit: number().int().min(1).max(200).default(50),
15391
+ /** Drop tracks scoring below this importance. */
15392
+ minImportance: number().min(0).max(1).optional(),
15393
+ /** Restrict to a single class (e.g. 'person'). */
15394
+ classFilter: string().optional()
15395
+ });
15396
+ var KeyEventSchema = object({
15397
+ /** The representative event id (the track's best ObjectEvent, else its trackId). */
15398
+ id: string(),
15399
+ trackId: string(),
15400
+ /** Track start time (firstSeen). */
15401
+ timestamp: number(),
15402
+ className: string(),
15403
+ label: string().optional(),
15404
+ importance: number(),
15405
+ /** Highest-confidence ObjectEvent id for the track (empty when none). */
15406
+ bestEventId: string(),
15407
+ /** Track lifetime in ms (lastSeen - firstSeen). */
15408
+ windowMs: number().optional()
15409
+ });
15291
15410
  var TrackedDetectionSchema = object({
15292
15411
  trackId: string(),
15293
15412
  className: string(),
@@ -15317,7 +15436,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
15317
15436
  }), array(TrackSchema).readonly()), method(object({ deviceId: number() }), _void(), {
15318
15437
  kind: "mutation",
15319
15438
  auth: "admin"
15320
- }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({
15439
+ }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(object({
15321
15440
  deviceId: number(),
15322
15441
  since: number(),
15323
15442
  until: number(),
@@ -16084,7 +16203,12 @@ DeviceType.Camera, method(object({
16084
16203
  }), SnapshotImageSchema.nullable()), method(object({ deviceId: number() }), _void(), {
16085
16204
  kind: "mutation",
16086
16205
  auth: "admin"
16087
- });
16206
+ }), systemMethod(object({ deviceIds: array(number()).min(1).max(200) }), array(object({
16207
+ deviceId: number(),
16208
+ lastCapturedAt: number().nullable(),
16209
+ cacheAgeMs: number().nullable(),
16210
+ etag: string().nullable()
16211
+ })));
16088
16212
  /**
16089
16213
  * `sso-bridge` — internal hub-only cap that lets SSO-style auth
16090
16214
  * providers (OIDC, SAML, magic-link, …) mint an HMAC-signed token
@@ -16335,10 +16459,32 @@ method(_void(), array(TurnServerSchema).readonly());
16335
16459
  * b. `finishAuthentication({userId, response})` → server verifies
16336
16460
  * the assertion, bumps the credential counter, returns ok.
16337
16461
  *
16462
+ * 2b. Usernameless (discoverable-credential) authentication — the
16463
+ * passkey IS the primary factor, no password leg:
16464
+ * a. `beginDiscoverableAuthentication({})` → assertion options with
16465
+ * EMPTY `allowCredentials` (the browser offers every resident
16466
+ * passkey it holds for this RP) + `userVerification: 'required'`
16467
+ * (the passkey replaces both factors, so UV is mandatory).
16468
+ * The challenge is stored server-side, NOT bound to any user.
16469
+ * b. `finishDiscoverableAuthentication({response})` → the provider
16470
+ * resolves the credential by the response's credential id,
16471
+ * verifies the assertion against the stored challenge + that
16472
+ * credential's public key/counter, and returns the OWNING
16473
+ * `userId` — the caller (core auth router) mints the session.
16474
+ *
16338
16475
  * 3. Management:
16339
16476
  * - `listPasskeys({userId})` — enumerate user's enrolled credentials.
16340
16477
  * - `removePasskey({userId, credentialId})` — revoke one credential.
16341
16478
  *
16479
+ * 4. Second-factor preference (opt-in, default OFF):
16480
+ * Enrolling a passkey only enables passkey-FIRST sign-in. It is
16481
+ * demanded as a second factor after a password login ONLY when the
16482
+ * user explicitly opts in via `setSecondFactorPreference`.
16483
+ * - `getSecondFactorPreference({userId})` → `{ enabled }` (missing
16484
+ * row ⇒ `enabled: false`).
16485
+ * - `setSecondFactorPreference({userId, enabled})` — persisted by
16486
+ * the providing addon beside its credentials.
16487
+ *
16342
16488
  * Challenges are short-lived (5 min, in-memory). The cap is internal —
16343
16489
  * the admin-ui composes the begin/finish round-trip and never exposes
16344
16490
  * the cap to non-admins.
@@ -16381,6 +16527,17 @@ method(object({
16381
16527
  }), object({ verified: boolean() }), {
16382
16528
  kind: "mutation",
16383
16529
  access: "view"
16530
+ }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
16531
+ kind: "mutation",
16532
+ access: "view"
16533
+ }), method(object({
16534
+ /** AuthenticationResponseJSON from the browser. */
16535
+ response: record(string(), unknown()) }), object({
16536
+ verified: boolean(),
16537
+ userId: string().nullable()
16538
+ }), {
16539
+ kind: "mutation",
16540
+ access: "view"
16384
16541
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
16385
16542
  userId: string(),
16386
16543
  credentialId: string()
@@ -16388,6 +16545,13 @@ method(object({
16388
16545
  kind: "mutation",
16389
16546
  auth: "admin",
16390
16547
  access: "delete"
16548
+ }), method(object({ userId: string() }), object({ enabled: boolean() }), { auth: "admin" }), method(object({
16549
+ userId: string(),
16550
+ enabled: boolean()
16551
+ }), object({ success: literal(true) }), {
16552
+ kind: "mutation",
16553
+ auth: "admin",
16554
+ access: "create"
16391
16555
  });
16392
16556
  /**
16393
16557
  * `videoclips` — the unified, navigable-clip surface for a camera.
@@ -17189,7 +17353,17 @@ var FaceInfoSchema = object({
17189
17353
  recognizedIdentityId: string().optional(),
17190
17354
  identityName: string().optional(),
17191
17355
  assigned: boolean(),
17192
- base64: string().optional()
17356
+ base64: string().optional(),
17357
+ /** Design B: the face bbox (pixel space) on the key frame — lets a detail
17358
+ * view draw the box over the native `keyFrameMediaKey` frame. Absent on
17359
+ * legacy rows written before design B. */
17360
+ faceBbox: BoundingBoxSchema.optional(),
17361
+ /** Design B: MediaStore key of the track's native-resolution key frame.
17362
+ * Fetch the native JPEG via the event-media data-plane
17363
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
17364
+ * track produced no key frame (e.g. native/onboard source) — the UI falls
17365
+ * back to the inline `base64` face crop. */
17366
+ keyFrameMediaKey: string().optional()
17193
17367
  });
17194
17368
  var FaceFilterEnum = _enum([
17195
17369
  "unassigned",
@@ -21308,6 +21482,12 @@ Object.freeze({
21308
21482
  addonId: null,
21309
21483
  access: "view"
21310
21484
  },
21485
+ "pipelineAnalytics.getKeyEvents": {
21486
+ capName: "pipeline-analytics",
21487
+ capScope: "device",
21488
+ addonId: null,
21489
+ access: "view"
21490
+ },
21311
21491
  "pipelineAnalytics.getMotionEvents": {
21312
21492
  capName: "pipeline-analytics",
21313
21493
  capScope: "device",
@@ -21836,12 +22016,24 @@ Object.freeze({
21836
22016
  addonId: null,
21837
22017
  access: "view"
21838
22018
  },
22019
+ "pipelineRunner.getNativeCrop": {
22020
+ capName: "pipeline-runner",
22021
+ capScope: "system",
22022
+ addonId: null,
22023
+ access: "view"
22024
+ },
21839
22025
  "pipelineRunner.reportMotion": {
21840
22026
  capName: "pipeline-runner",
21841
22027
  capScope: "system",
21842
22028
  addonId: null,
21843
22029
  access: "create"
21844
22030
  },
22031
+ "pipelineRunner.runDetailSubtree": {
22032
+ capName: "pipeline-runner",
22033
+ capScope: "system",
22034
+ addonId: null,
22035
+ access: "create"
22036
+ },
21845
22037
  "plateGallery.correctPlateText": {
21846
22038
  capName: "plate-gallery",
21847
22039
  capScope: "system",
@@ -22202,6 +22394,12 @@ Object.freeze({
22202
22394
  addonId: null,
22203
22395
  access: "view"
22204
22396
  },
22397
+ "snapshot.getSnapshotOverview": {
22398
+ capName: "snapshot",
22399
+ capScope: "device",
22400
+ addonId: null,
22401
+ access: "view"
22402
+ },
22205
22403
  "snapshot.invalidateCache": {
22206
22404
  capName: "snapshot",
22207
22405
  capScope: "device",
@@ -22880,6 +23078,12 @@ Object.freeze({
22880
23078
  addonId: null,
22881
23079
  access: "view"
22882
23080
  },
23081
+ "userPasskeys.beginDiscoverableAuthentication": {
23082
+ capName: "user-passkeys",
23083
+ capScope: "system",
23084
+ addonId: null,
23085
+ access: "view"
23086
+ },
22883
23087
  "userPasskeys.beginRegistration": {
22884
23088
  capName: "user-passkeys",
22885
23089
  capScope: "system",
@@ -22892,12 +23096,24 @@ Object.freeze({
22892
23096
  addonId: null,
22893
23097
  access: "view"
22894
23098
  },
23099
+ "userPasskeys.finishDiscoverableAuthentication": {
23100
+ capName: "user-passkeys",
23101
+ capScope: "system",
23102
+ addonId: null,
23103
+ access: "view"
23104
+ },
22895
23105
  "userPasskeys.finishRegistration": {
22896
23106
  capName: "user-passkeys",
22897
23107
  capScope: "system",
22898
23108
  addonId: null,
22899
23109
  access: "create"
22900
23110
  },
23111
+ "userPasskeys.getSecondFactorPreference": {
23112
+ capName: "user-passkeys",
23113
+ capScope: "system",
23114
+ addonId: null,
23115
+ access: "view"
23116
+ },
22901
23117
  "userPasskeys.listPasskeys": {
22902
23118
  capName: "user-passkeys",
22903
23119
  capScope: "system",
@@ -22910,6 +23126,12 @@ Object.freeze({
22910
23126
  addonId: null,
22911
23127
  access: "delete"
22912
23128
  },
23129
+ "userPasskeys.setSecondFactorPreference": {
23130
+ capName: "user-passkeys",
23131
+ capScope: "system",
23132
+ addonId: null,
23133
+ access: "create"
23134
+ },
22913
23135
  "vacuumControl.locate": {
22914
23136
  capName: "vacuum-control",
22915
23137
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-mqtt-broker",
3
- "version": "1.1.20",
3
+ "version": "1.1.22",
4
4
  "description": "MQTT broker registry addon for CamStack — manages external broker entries + an optional embedded aedes broker. Consumers spin up their own `mqtt.js` clients via the `mqtt-broker` cap.",
5
5
  "keywords": [
6
6
  "camstack",