@camstack/addon-decoder-ffmpeg 1.1.10 → 1.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -4635,7 +4635,7 @@ function _instanceof(cls, params = {}) {
4635
4635
  return inst;
4636
4636
  }
4637
4637
  //#endregion
4638
- //#region ../types/dist/sleep-DJaTV2D7.mjs
4638
+ //#region ../types/dist/sleep-Baang_XW.mjs
4639
4639
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4640
4640
  EventCategory["SystemBoot"] = "system.boot";
4641
4641
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -6739,6 +6739,18 @@ function method(input, output, options) {
6739
6739
  timeoutMs: options?.timeoutMs
6740
6740
  };
6741
6741
  }
6742
+ /**
6743
+ * A wrapper/system-only method: served exclusively by the cap's system-level
6744
+ * provider (`InferProvider`), and OPTIONAL on `InferNativeProvider` so per-device
6745
+ * driver natives don't stub out a wrapper concern (e.g. a cross-device cache
6746
+ * overview). The `systemOnly: true` literal is what `InferNativeProvider` keys on.
6747
+ */
6748
+ function systemMethod(input, output, options) {
6749
+ return {
6750
+ ...method(input, output, options),
6751
+ systemOnly: true
6752
+ };
6753
+ }
6742
6754
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6743
6755
  var VersionOutputSchema$1 = object({ version: string() });
6744
6756
  method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
@@ -10489,6 +10501,7 @@ var PipelineAddonSchemaSchema = object({
10489
10501
  defaultModelId: string(),
10490
10502
  defaultModelIdByFormat: record(string(), string()).optional(),
10491
10503
  enabledByDefault: boolean().optional(),
10504
+ backfillIntoExistingOverrides: boolean().optional(),
10492
10505
  defaultConfidence: number(),
10493
10506
  group: string().optional(),
10494
10507
  configSchema: array(ConfigFieldBridge).readonly().optional()
@@ -10670,7 +10683,15 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
10670
10683
  image: _instanceof(Uint8Array).optional(),
10671
10684
  referenceImage: string().optional(),
10672
10685
  deviceId: number().optional(),
10673
- sessionId: string().optional()
10686
+ sessionId: string().optional(),
10687
+ /**
10688
+ * Execution plane. 'full' (default) runs the whole tree — benchmark,
10689
+ * reference-image, and detail-subtree calls. 'frame' is the live
10690
+ * per-frame dispatch: ONLY root-plane steps run; crop children
10691
+ * (inputClasses ≠ null) are skipped and served per-track via
10692
+ * pipelineRunner.runDetailSubtree (two-plane design).
10693
+ */
10694
+ plane: _enum(["full", "frame"]).optional()
10674
10695
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
10675
10696
  engine: PipelineEngineChoiceSchema.optional(),
10676
10697
  steps: array(PipelineStepInputSchema).min(1),
@@ -10795,6 +10816,47 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(ZoneSchema).read
10795
10816
  auth: "admin"
10796
10817
  }), object({ zones: array(ZoneSchema).readonly() });
10797
10818
  /**
10819
+ * A bounding box in NORMALIZED [0,1] frame coordinates for `getNativeCrop`. The
10820
+ * decode worker resolves it against the RETAINED native frame's real pixel dims,
10821
+ * so the caller supplies only the detection-res bbox divided by the detection
10822
+ * dims — no native resolution to plumb.
10823
+ */
10824
+ var NativeCropBboxSchema = object({
10825
+ x: number(),
10826
+ y: number(),
10827
+ w: number(),
10828
+ h: number()
10829
+ });
10830
+ /** Result of a best-effort native-resolution crop (`getNativeCrop`). */
10831
+ var NativeCropResultSchema = object({
10832
+ /** Packed rgb (24-bit) pixels of the crop. */
10833
+ bytes: _instanceof(Uint8Array),
10834
+ width: number().int().positive(),
10835
+ height: number().int().positive()
10836
+ });
10837
+ /** Parent detection context passed to `runDetailSubtree` — the crop's
10838
+ * originating detection, in FRAME-space coordinates. Reuses
10839
+ * `NativeCropBboxSchema`'s `{x,y,w,h}` shape (same numeric fields; here
10840
+ * the coordinates are frame-space rather than getNativeCrop's
10841
+ * normalized [0,1] convention). */
10842
+ var DetailParentSchema = object({
10843
+ bbox: NativeCropBboxSchema,
10844
+ className: string()
10845
+ });
10846
+ /** One child-step result from `runDetailSubtree` — an embedding, label,
10847
+ * or refined detection produced by running the crop-subtree on a
10848
+ * single tracked detection. */
10849
+ var DetailResultSchema = object({
10850
+ stepId: string(),
10851
+ className: string(),
10852
+ score: number(),
10853
+ /** FRAME-space bbox (already mapped back from crop space). */
10854
+ bbox: NativeCropBboxSchema.optional(),
10855
+ embedding: string().optional(),
10856
+ label: string().optional(),
10857
+ alignedCropJpeg: string().optional()
10858
+ });
10859
+ /**
10798
10860
  * Per-camera tunable ranges + defaults. Single source of truth used
10799
10861
  * by both the Zod data schema (validation + default fallback) and
10800
10862
  * the device settings UI (slider min/max/step). Touch one place and
@@ -11050,7 +11112,17 @@ var RunnerLocalMetricsSchema = object({
11050
11112
  avgInferenceTimeMs: number(),
11051
11113
  queueDepth: number()
11052
11114
  });
11053
- 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());
11115
+ 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({
11116
+ handle: FrameHandleSchema,
11117
+ bbox: NativeCropBboxSchema,
11118
+ maxWidth: number().int().positive().optional()
11119
+ }), NativeCropResultSchema.nullable()), method(object({
11120
+ deviceId: number(),
11121
+ frameHandle: FrameHandleSchema.optional(),
11122
+ cropJpeg: string().optional(),
11123
+ parent: DetailParentSchema,
11124
+ steps: array(string()).optional()
11125
+ }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" });
11054
11126
  object({
11055
11127
  detected: boolean(),
11056
11128
  /** Ms epoch of the last detected-true observation. Null if never detected. */
@@ -15218,7 +15290,17 @@ var TrackSchema = object({
15218
15290
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
15219
15291
  totalDistance: number(),
15220
15292
  state: TrackStateSchema,
15221
- active: boolean()
15293
+ active: boolean(),
15294
+ /** Deterministic key-event importance score in [0,1] (server-computed at
15295
+ * track expiry, recomputed on late label). Absent on legacy rows written
15296
+ * before scoring shipped — consumers degrade to absence / compute-on-read. */
15297
+ importance: number().optional(),
15298
+ /** Id of the track's highest-confidence ObjectEvent (its representative
15299
+ * "best" frame). Absent when the track produced no object events. */
15300
+ bestEventId: string().optional(),
15301
+ /** Tag of the importance sub-signal that dominated the score
15302
+ * (identity|dwell|proximity|class|confidence|travel|zone). */
15303
+ importanceReason: string().optional()
15222
15304
  });
15223
15305
  var BaseEventFields = {
15224
15306
  id: string(),
@@ -15283,8 +15365,18 @@ var ObjectEventSchema = object({
15283
15365
  frameHeight: number().optional(),
15284
15366
  /** MediaStore key for the crop attached to this event (if any). */
15285
15367
  mediaKey: string().optional(),
15368
+ /** Design B: MediaStore key of the track's native-resolution key frame (the
15369
+ * best-detection full frame). Resolve via the event-media data-plane
15370
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
15371
+ * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
15372
+ * sources — consumers fall back to `mediaKey` (the tight crop). */
15373
+ keyFrameMediaKey: string().optional(),
15286
15374
  /** Populated by B5 (recording playback URL for this event). */
15287
- mediaUrl: string().optional()
15375
+ mediaUrl: string().optional(),
15376
+ /** The parent track's key-event importance [0,1], propagated to every object
15377
+ * event of the track (so an event row can be sorted by importance without a
15378
+ * track join). Absent on legacy rows / before the track was scored. */
15379
+ importance: number().optional()
15288
15380
  });
15289
15381
  var AudioEventSchema = object({
15290
15382
  ...BaseEventFields,
@@ -15308,7 +15400,8 @@ var MediaFileKindEnum = _enum([
15308
15400
  "fullFrame",
15309
15401
  "fullFrameBoxed",
15310
15402
  "faceCrop",
15311
- "plateCrop"
15403
+ "plateCrop",
15404
+ "keyFrame"
15312
15405
  ]);
15313
15406
  var MediaFileSchema = object({
15314
15407
  key: string(),
@@ -15329,6 +15422,32 @@ var DeviceEventQueryInput = object({
15329
15422
  projection: _enum(["full", "slim"]).optional()
15330
15423
  });
15331
15424
  var ObjectEventQueryInput = DeviceEventQueryInput.extend({ classFilter: string().optional() });
15425
+ var KeyEventQueryInput = object({
15426
+ deviceId: number(),
15427
+ /** Window lower bound (track firstSeen ≥ since). */
15428
+ since: number(),
15429
+ /** Window upper bound (track firstSeen ≤ until). */
15430
+ until: number(),
15431
+ limit: number().int().min(1).max(200).default(50),
15432
+ /** Drop tracks scoring below this importance. */
15433
+ minImportance: number().min(0).max(1).optional(),
15434
+ /** Restrict to a single class (e.g. 'person'). */
15435
+ classFilter: string().optional()
15436
+ });
15437
+ var KeyEventSchema = object({
15438
+ /** The representative event id (the track's best ObjectEvent, else its trackId). */
15439
+ id: string(),
15440
+ trackId: string(),
15441
+ /** Track start time (firstSeen). */
15442
+ timestamp: number(),
15443
+ className: string(),
15444
+ label: string().optional(),
15445
+ importance: number(),
15446
+ /** Highest-confidence ObjectEvent id for the track (empty when none). */
15447
+ bestEventId: string(),
15448
+ /** Track lifetime in ms (lastSeen - firstSeen). */
15449
+ windowMs: number().optional()
15450
+ });
15332
15451
  var TrackedDetectionSchema = object({
15333
15452
  trackId: string(),
15334
15453
  className: string(),
@@ -15358,7 +15477,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
15358
15477
  }), array(TrackSchema).readonly()), method(object({ deviceId: number() }), _void(), {
15359
15478
  kind: "mutation",
15360
15479
  auth: "admin"
15361
- }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({
15480
+ }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(object({
15362
15481
  deviceId: number(),
15363
15482
  since: number(),
15364
15483
  until: number(),
@@ -16125,7 +16244,12 @@ DeviceType.Camera, method(object({
16125
16244
  }), SnapshotImageSchema.nullable()), method(object({ deviceId: number() }), _void(), {
16126
16245
  kind: "mutation",
16127
16246
  auth: "admin"
16128
- });
16247
+ }), systemMethod(object({ deviceIds: array(number()).min(1).max(200) }), array(object({
16248
+ deviceId: number(),
16249
+ lastCapturedAt: number().nullable(),
16250
+ cacheAgeMs: number().nullable(),
16251
+ etag: string().nullable()
16252
+ })));
16129
16253
  /**
16130
16254
  * `sso-bridge` — internal hub-only cap that lets SSO-style auth
16131
16255
  * providers (OIDC, SAML, magic-link, …) mint an HMAC-signed token
@@ -16376,10 +16500,32 @@ method(_void(), array(TurnServerSchema).readonly());
16376
16500
  * b. `finishAuthentication({userId, response})` → server verifies
16377
16501
  * the assertion, bumps the credential counter, returns ok.
16378
16502
  *
16503
+ * 2b. Usernameless (discoverable-credential) authentication — the
16504
+ * passkey IS the primary factor, no password leg:
16505
+ * a. `beginDiscoverableAuthentication({})` → assertion options with
16506
+ * EMPTY `allowCredentials` (the browser offers every resident
16507
+ * passkey it holds for this RP) + `userVerification: 'required'`
16508
+ * (the passkey replaces both factors, so UV is mandatory).
16509
+ * The challenge is stored server-side, NOT bound to any user.
16510
+ * b. `finishDiscoverableAuthentication({response})` → the provider
16511
+ * resolves the credential by the response's credential id,
16512
+ * verifies the assertion against the stored challenge + that
16513
+ * credential's public key/counter, and returns the OWNING
16514
+ * `userId` — the caller (core auth router) mints the session.
16515
+ *
16379
16516
  * 3. Management:
16380
16517
  * - `listPasskeys({userId})` — enumerate user's enrolled credentials.
16381
16518
  * - `removePasskey({userId, credentialId})` — revoke one credential.
16382
16519
  *
16520
+ * 4. Second-factor preference (opt-in, default OFF):
16521
+ * Enrolling a passkey only enables passkey-FIRST sign-in. It is
16522
+ * demanded as a second factor after a password login ONLY when the
16523
+ * user explicitly opts in via `setSecondFactorPreference`.
16524
+ * - `getSecondFactorPreference({userId})` → `{ enabled }` (missing
16525
+ * row ⇒ `enabled: false`).
16526
+ * - `setSecondFactorPreference({userId, enabled})` — persisted by
16527
+ * the providing addon beside its credentials.
16528
+ *
16383
16529
  * Challenges are short-lived (5 min, in-memory). The cap is internal —
16384
16530
  * the admin-ui composes the begin/finish round-trip and never exposes
16385
16531
  * the cap to non-admins.
@@ -16422,6 +16568,17 @@ method(object({
16422
16568
  }), object({ verified: boolean() }), {
16423
16569
  kind: "mutation",
16424
16570
  access: "view"
16571
+ }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
16572
+ kind: "mutation",
16573
+ access: "view"
16574
+ }), method(object({
16575
+ /** AuthenticationResponseJSON from the browser. */
16576
+ response: record(string(), unknown()) }), object({
16577
+ verified: boolean(),
16578
+ userId: string().nullable()
16579
+ }), {
16580
+ kind: "mutation",
16581
+ access: "view"
16425
16582
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
16426
16583
  userId: string(),
16427
16584
  credentialId: string()
@@ -16429,6 +16586,13 @@ method(object({
16429
16586
  kind: "mutation",
16430
16587
  auth: "admin",
16431
16588
  access: "delete"
16589
+ }), method(object({ userId: string() }), object({ enabled: boolean() }), { auth: "admin" }), method(object({
16590
+ userId: string(),
16591
+ enabled: boolean()
16592
+ }), object({ success: literal(true) }), {
16593
+ kind: "mutation",
16594
+ auth: "admin",
16595
+ access: "create"
16432
16596
  });
16433
16597
  /**
16434
16598
  * `videoclips` — the unified, navigable-clip surface for a camera.
@@ -17230,7 +17394,17 @@ var FaceInfoSchema = object({
17230
17394
  recognizedIdentityId: string().optional(),
17231
17395
  identityName: string().optional(),
17232
17396
  assigned: boolean(),
17233
- base64: string().optional()
17397
+ base64: string().optional(),
17398
+ /** Design B: the face bbox (pixel space) on the key frame — lets a detail
17399
+ * view draw the box over the native `keyFrameMediaKey` frame. Absent on
17400
+ * legacy rows written before design B. */
17401
+ faceBbox: BoundingBoxSchema.optional(),
17402
+ /** Design B: MediaStore key of the track's native-resolution key frame.
17403
+ * Fetch the native JPEG via the event-media data-plane
17404
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
17405
+ * track produced no key frame (e.g. native/onboard source) — the UI falls
17406
+ * back to the inline `base64` face crop. */
17407
+ keyFrameMediaKey: string().optional()
17234
17408
  });
17235
17409
  var FaceFilterEnum = _enum([
17236
17410
  "unassigned",
@@ -21349,6 +21523,12 @@ Object.freeze({
21349
21523
  addonId: null,
21350
21524
  access: "view"
21351
21525
  },
21526
+ "pipelineAnalytics.getKeyEvents": {
21527
+ capName: "pipeline-analytics",
21528
+ capScope: "device",
21529
+ addonId: null,
21530
+ access: "view"
21531
+ },
21352
21532
  "pipelineAnalytics.getMotionEvents": {
21353
21533
  capName: "pipeline-analytics",
21354
21534
  capScope: "device",
@@ -21877,12 +22057,24 @@ Object.freeze({
21877
22057
  addonId: null,
21878
22058
  access: "view"
21879
22059
  },
22060
+ "pipelineRunner.getNativeCrop": {
22061
+ capName: "pipeline-runner",
22062
+ capScope: "system",
22063
+ addonId: null,
22064
+ access: "view"
22065
+ },
21880
22066
  "pipelineRunner.reportMotion": {
21881
22067
  capName: "pipeline-runner",
21882
22068
  capScope: "system",
21883
22069
  addonId: null,
21884
22070
  access: "create"
21885
22071
  },
22072
+ "pipelineRunner.runDetailSubtree": {
22073
+ capName: "pipeline-runner",
22074
+ capScope: "system",
22075
+ addonId: null,
22076
+ access: "create"
22077
+ },
21886
22078
  "plateGallery.correctPlateText": {
21887
22079
  capName: "plate-gallery",
21888
22080
  capScope: "system",
@@ -22243,6 +22435,12 @@ Object.freeze({
22243
22435
  addonId: null,
22244
22436
  access: "view"
22245
22437
  },
22438
+ "snapshot.getSnapshotOverview": {
22439
+ capName: "snapshot",
22440
+ capScope: "device",
22441
+ addonId: null,
22442
+ access: "view"
22443
+ },
22246
22444
  "snapshot.invalidateCache": {
22247
22445
  capName: "snapshot",
22248
22446
  capScope: "device",
@@ -22921,6 +23119,12 @@ Object.freeze({
22921
23119
  addonId: null,
22922
23120
  access: "view"
22923
23121
  },
23122
+ "userPasskeys.beginDiscoverableAuthentication": {
23123
+ capName: "user-passkeys",
23124
+ capScope: "system",
23125
+ addonId: null,
23126
+ access: "view"
23127
+ },
22924
23128
  "userPasskeys.beginRegistration": {
22925
23129
  capName: "user-passkeys",
22926
23130
  capScope: "system",
@@ -22933,12 +23137,24 @@ Object.freeze({
22933
23137
  addonId: null,
22934
23138
  access: "view"
22935
23139
  },
23140
+ "userPasskeys.finishDiscoverableAuthentication": {
23141
+ capName: "user-passkeys",
23142
+ capScope: "system",
23143
+ addonId: null,
23144
+ access: "view"
23145
+ },
22936
23146
  "userPasskeys.finishRegistration": {
22937
23147
  capName: "user-passkeys",
22938
23148
  capScope: "system",
22939
23149
  addonId: null,
22940
23150
  access: "create"
22941
23151
  },
23152
+ "userPasskeys.getSecondFactorPreference": {
23153
+ capName: "user-passkeys",
23154
+ capScope: "system",
23155
+ addonId: null,
23156
+ access: "view"
23157
+ },
22942
23158
  "userPasskeys.listPasskeys": {
22943
23159
  capName: "user-passkeys",
22944
23160
  capScope: "system",
@@ -22951,6 +23167,12 @@ Object.freeze({
22951
23167
  addonId: null,
22952
23168
  access: "delete"
22953
23169
  },
23170
+ "userPasskeys.setSecondFactorPreference": {
23171
+ capName: "user-passkeys",
23172
+ capScope: "system",
23173
+ addonId: null,
23174
+ access: "create"
23175
+ },
22954
23176
  "vacuumControl.locate": {
22955
23177
  capName: "vacuum-control",
22956
23178
  capScope: "device",
package/dist/index.mjs CHANGED
@@ -4631,7 +4631,7 @@ function _instanceof(cls, params = {}) {
4631
4631
  return inst;
4632
4632
  }
4633
4633
  //#endregion
4634
- //#region ../types/dist/sleep-DJaTV2D7.mjs
4634
+ //#region ../types/dist/sleep-Baang_XW.mjs
4635
4635
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4636
4636
  EventCategory["SystemBoot"] = "system.boot";
4637
4637
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -6735,6 +6735,18 @@ function method(input, output, options) {
6735
6735
  timeoutMs: options?.timeoutMs
6736
6736
  };
6737
6737
  }
6738
+ /**
6739
+ * A wrapper/system-only method: served exclusively by the cap's system-level
6740
+ * provider (`InferProvider`), and OPTIONAL on `InferNativeProvider` so per-device
6741
+ * driver natives don't stub out a wrapper concern (e.g. a cross-device cache
6742
+ * overview). The `systemOnly: true` literal is what `InferNativeProvider` keys on.
6743
+ */
6744
+ function systemMethod(input, output, options) {
6745
+ return {
6746
+ ...method(input, output, options),
6747
+ systemOnly: true
6748
+ };
6749
+ }
6738
6750
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6739
6751
  var VersionOutputSchema$1 = object({ version: string() });
6740
6752
  method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
@@ -10485,6 +10497,7 @@ var PipelineAddonSchemaSchema = object({
10485
10497
  defaultModelId: string(),
10486
10498
  defaultModelIdByFormat: record(string(), string()).optional(),
10487
10499
  enabledByDefault: boolean().optional(),
10500
+ backfillIntoExistingOverrides: boolean().optional(),
10488
10501
  defaultConfidence: number(),
10489
10502
  group: string().optional(),
10490
10503
  configSchema: array(ConfigFieldBridge).readonly().optional()
@@ -10666,7 +10679,15 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
10666
10679
  image: _instanceof(Uint8Array).optional(),
10667
10680
  referenceImage: string().optional(),
10668
10681
  deviceId: number().optional(),
10669
- sessionId: string().optional()
10682
+ sessionId: string().optional(),
10683
+ /**
10684
+ * Execution plane. 'full' (default) runs the whole tree — benchmark,
10685
+ * reference-image, and detail-subtree calls. 'frame' is the live
10686
+ * per-frame dispatch: ONLY root-plane steps run; crop children
10687
+ * (inputClasses ≠ null) are skipped and served per-track via
10688
+ * pipelineRunner.runDetailSubtree (two-plane design).
10689
+ */
10690
+ plane: _enum(["full", "frame"]).optional()
10670
10691
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
10671
10692
  engine: PipelineEngineChoiceSchema.optional(),
10672
10693
  steps: array(PipelineStepInputSchema).min(1),
@@ -10791,6 +10812,47 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(ZoneSchema).read
10791
10812
  auth: "admin"
10792
10813
  }), object({ zones: array(ZoneSchema).readonly() });
10793
10814
  /**
10815
+ * A bounding box in NORMALIZED [0,1] frame coordinates for `getNativeCrop`. The
10816
+ * decode worker resolves it against the RETAINED native frame's real pixel dims,
10817
+ * so the caller supplies only the detection-res bbox divided by the detection
10818
+ * dims — no native resolution to plumb.
10819
+ */
10820
+ var NativeCropBboxSchema = object({
10821
+ x: number(),
10822
+ y: number(),
10823
+ w: number(),
10824
+ h: number()
10825
+ });
10826
+ /** Result of a best-effort native-resolution crop (`getNativeCrop`). */
10827
+ var NativeCropResultSchema = object({
10828
+ /** Packed rgb (24-bit) pixels of the crop. */
10829
+ bytes: _instanceof(Uint8Array),
10830
+ width: number().int().positive(),
10831
+ height: number().int().positive()
10832
+ });
10833
+ /** Parent detection context passed to `runDetailSubtree` — the crop's
10834
+ * originating detection, in FRAME-space coordinates. Reuses
10835
+ * `NativeCropBboxSchema`'s `{x,y,w,h}` shape (same numeric fields; here
10836
+ * the coordinates are frame-space rather than getNativeCrop's
10837
+ * normalized [0,1] convention). */
10838
+ var DetailParentSchema = object({
10839
+ bbox: NativeCropBboxSchema,
10840
+ className: string()
10841
+ });
10842
+ /** One child-step result from `runDetailSubtree` — an embedding, label,
10843
+ * or refined detection produced by running the crop-subtree on a
10844
+ * single tracked detection. */
10845
+ var DetailResultSchema = object({
10846
+ stepId: string(),
10847
+ className: string(),
10848
+ score: number(),
10849
+ /** FRAME-space bbox (already mapped back from crop space). */
10850
+ bbox: NativeCropBboxSchema.optional(),
10851
+ embedding: string().optional(),
10852
+ label: string().optional(),
10853
+ alignedCropJpeg: string().optional()
10854
+ });
10855
+ /**
10794
10856
  * Per-camera tunable ranges + defaults. Single source of truth used
10795
10857
  * by both the Zod data schema (validation + default fallback) and
10796
10858
  * the device settings UI (slider min/max/step). Touch one place and
@@ -11046,7 +11108,17 @@ var RunnerLocalMetricsSchema = object({
11046
11108
  avgInferenceTimeMs: number(),
11047
11109
  queueDepth: number()
11048
11110
  });
11049
- 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());
11111
+ 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({
11112
+ handle: FrameHandleSchema,
11113
+ bbox: NativeCropBboxSchema,
11114
+ maxWidth: number().int().positive().optional()
11115
+ }), NativeCropResultSchema.nullable()), method(object({
11116
+ deviceId: number(),
11117
+ frameHandle: FrameHandleSchema.optional(),
11118
+ cropJpeg: string().optional(),
11119
+ parent: DetailParentSchema,
11120
+ steps: array(string()).optional()
11121
+ }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" });
11050
11122
  object({
11051
11123
  detected: boolean(),
11052
11124
  /** Ms epoch of the last detected-true observation. Null if never detected. */
@@ -15214,7 +15286,17 @@ var TrackSchema = object({
15214
15286
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
15215
15287
  totalDistance: number(),
15216
15288
  state: TrackStateSchema,
15217
- active: boolean()
15289
+ active: boolean(),
15290
+ /** Deterministic key-event importance score in [0,1] (server-computed at
15291
+ * track expiry, recomputed on late label). Absent on legacy rows written
15292
+ * before scoring shipped — consumers degrade to absence / compute-on-read. */
15293
+ importance: number().optional(),
15294
+ /** Id of the track's highest-confidence ObjectEvent (its representative
15295
+ * "best" frame). Absent when the track produced no object events. */
15296
+ bestEventId: string().optional(),
15297
+ /** Tag of the importance sub-signal that dominated the score
15298
+ * (identity|dwell|proximity|class|confidence|travel|zone). */
15299
+ importanceReason: string().optional()
15218
15300
  });
15219
15301
  var BaseEventFields = {
15220
15302
  id: string(),
@@ -15279,8 +15361,18 @@ var ObjectEventSchema = object({
15279
15361
  frameHeight: number().optional(),
15280
15362
  /** MediaStore key for the crop attached to this event (if any). */
15281
15363
  mediaKey: string().optional(),
15364
+ /** Design B: MediaStore key of the track's native-resolution key frame (the
15365
+ * best-detection full frame). Resolve via the event-media data-plane
15366
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
15367
+ * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
15368
+ * sources — consumers fall back to `mediaKey` (the tight crop). */
15369
+ keyFrameMediaKey: string().optional(),
15282
15370
  /** Populated by B5 (recording playback URL for this event). */
15283
- mediaUrl: string().optional()
15371
+ mediaUrl: string().optional(),
15372
+ /** The parent track's key-event importance [0,1], propagated to every object
15373
+ * event of the track (so an event row can be sorted by importance without a
15374
+ * track join). Absent on legacy rows / before the track was scored. */
15375
+ importance: number().optional()
15284
15376
  });
15285
15377
  var AudioEventSchema = object({
15286
15378
  ...BaseEventFields,
@@ -15304,7 +15396,8 @@ var MediaFileKindEnum = _enum([
15304
15396
  "fullFrame",
15305
15397
  "fullFrameBoxed",
15306
15398
  "faceCrop",
15307
- "plateCrop"
15399
+ "plateCrop",
15400
+ "keyFrame"
15308
15401
  ]);
15309
15402
  var MediaFileSchema = object({
15310
15403
  key: string(),
@@ -15325,6 +15418,32 @@ var DeviceEventQueryInput = object({
15325
15418
  projection: _enum(["full", "slim"]).optional()
15326
15419
  });
15327
15420
  var ObjectEventQueryInput = DeviceEventQueryInput.extend({ classFilter: string().optional() });
15421
+ var KeyEventQueryInput = object({
15422
+ deviceId: number(),
15423
+ /** Window lower bound (track firstSeen ≥ since). */
15424
+ since: number(),
15425
+ /** Window upper bound (track firstSeen ≤ until). */
15426
+ until: number(),
15427
+ limit: number().int().min(1).max(200).default(50),
15428
+ /** Drop tracks scoring below this importance. */
15429
+ minImportance: number().min(0).max(1).optional(),
15430
+ /** Restrict to a single class (e.g. 'person'). */
15431
+ classFilter: string().optional()
15432
+ });
15433
+ var KeyEventSchema = object({
15434
+ /** The representative event id (the track's best ObjectEvent, else its trackId). */
15435
+ id: string(),
15436
+ trackId: string(),
15437
+ /** Track start time (firstSeen). */
15438
+ timestamp: number(),
15439
+ className: string(),
15440
+ label: string().optional(),
15441
+ importance: number(),
15442
+ /** Highest-confidence ObjectEvent id for the track (empty when none). */
15443
+ bestEventId: string(),
15444
+ /** Track lifetime in ms (lastSeen - firstSeen). */
15445
+ windowMs: number().optional()
15446
+ });
15328
15447
  var TrackedDetectionSchema = object({
15329
15448
  trackId: string(),
15330
15449
  className: string(),
@@ -15354,7 +15473,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
15354
15473
  }), array(TrackSchema).readonly()), method(object({ deviceId: number() }), _void(), {
15355
15474
  kind: "mutation",
15356
15475
  auth: "admin"
15357
- }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({
15476
+ }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(object({
15358
15477
  deviceId: number(),
15359
15478
  since: number(),
15360
15479
  until: number(),
@@ -16121,7 +16240,12 @@ DeviceType.Camera, method(object({
16121
16240
  }), SnapshotImageSchema.nullable()), method(object({ deviceId: number() }), _void(), {
16122
16241
  kind: "mutation",
16123
16242
  auth: "admin"
16124
- });
16243
+ }), systemMethod(object({ deviceIds: array(number()).min(1).max(200) }), array(object({
16244
+ deviceId: number(),
16245
+ lastCapturedAt: number().nullable(),
16246
+ cacheAgeMs: number().nullable(),
16247
+ etag: string().nullable()
16248
+ })));
16125
16249
  /**
16126
16250
  * `sso-bridge` — internal hub-only cap that lets SSO-style auth
16127
16251
  * providers (OIDC, SAML, magic-link, …) mint an HMAC-signed token
@@ -16372,10 +16496,32 @@ method(_void(), array(TurnServerSchema).readonly());
16372
16496
  * b. `finishAuthentication({userId, response})` → server verifies
16373
16497
  * the assertion, bumps the credential counter, returns ok.
16374
16498
  *
16499
+ * 2b. Usernameless (discoverable-credential) authentication — the
16500
+ * passkey IS the primary factor, no password leg:
16501
+ * a. `beginDiscoverableAuthentication({})` → assertion options with
16502
+ * EMPTY `allowCredentials` (the browser offers every resident
16503
+ * passkey it holds for this RP) + `userVerification: 'required'`
16504
+ * (the passkey replaces both factors, so UV is mandatory).
16505
+ * The challenge is stored server-side, NOT bound to any user.
16506
+ * b. `finishDiscoverableAuthentication({response})` → the provider
16507
+ * resolves the credential by the response's credential id,
16508
+ * verifies the assertion against the stored challenge + that
16509
+ * credential's public key/counter, and returns the OWNING
16510
+ * `userId` — the caller (core auth router) mints the session.
16511
+ *
16375
16512
  * 3. Management:
16376
16513
  * - `listPasskeys({userId})` — enumerate user's enrolled credentials.
16377
16514
  * - `removePasskey({userId, credentialId})` — revoke one credential.
16378
16515
  *
16516
+ * 4. Second-factor preference (opt-in, default OFF):
16517
+ * Enrolling a passkey only enables passkey-FIRST sign-in. It is
16518
+ * demanded as a second factor after a password login ONLY when the
16519
+ * user explicitly opts in via `setSecondFactorPreference`.
16520
+ * - `getSecondFactorPreference({userId})` → `{ enabled }` (missing
16521
+ * row ⇒ `enabled: false`).
16522
+ * - `setSecondFactorPreference({userId, enabled})` — persisted by
16523
+ * the providing addon beside its credentials.
16524
+ *
16379
16525
  * Challenges are short-lived (5 min, in-memory). The cap is internal —
16380
16526
  * the admin-ui composes the begin/finish round-trip and never exposes
16381
16527
  * the cap to non-admins.
@@ -16418,6 +16564,17 @@ method(object({
16418
16564
  }), object({ verified: boolean() }), {
16419
16565
  kind: "mutation",
16420
16566
  access: "view"
16567
+ }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
16568
+ kind: "mutation",
16569
+ access: "view"
16570
+ }), method(object({
16571
+ /** AuthenticationResponseJSON from the browser. */
16572
+ response: record(string(), unknown()) }), object({
16573
+ verified: boolean(),
16574
+ userId: string().nullable()
16575
+ }), {
16576
+ kind: "mutation",
16577
+ access: "view"
16421
16578
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
16422
16579
  userId: string(),
16423
16580
  credentialId: string()
@@ -16425,6 +16582,13 @@ method(object({
16425
16582
  kind: "mutation",
16426
16583
  auth: "admin",
16427
16584
  access: "delete"
16585
+ }), method(object({ userId: string() }), object({ enabled: boolean() }), { auth: "admin" }), method(object({
16586
+ userId: string(),
16587
+ enabled: boolean()
16588
+ }), object({ success: literal(true) }), {
16589
+ kind: "mutation",
16590
+ auth: "admin",
16591
+ access: "create"
16428
16592
  });
16429
16593
  /**
16430
16594
  * `videoclips` — the unified, navigable-clip surface for a camera.
@@ -17226,7 +17390,17 @@ var FaceInfoSchema = object({
17226
17390
  recognizedIdentityId: string().optional(),
17227
17391
  identityName: string().optional(),
17228
17392
  assigned: boolean(),
17229
- base64: string().optional()
17393
+ base64: string().optional(),
17394
+ /** Design B: the face bbox (pixel space) on the key frame — lets a detail
17395
+ * view draw the box over the native `keyFrameMediaKey` frame. Absent on
17396
+ * legacy rows written before design B. */
17397
+ faceBbox: BoundingBoxSchema.optional(),
17398
+ /** Design B: MediaStore key of the track's native-resolution key frame.
17399
+ * Fetch the native JPEG via the event-media data-plane
17400
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
17401
+ * track produced no key frame (e.g. native/onboard source) — the UI falls
17402
+ * back to the inline `base64` face crop. */
17403
+ keyFrameMediaKey: string().optional()
17230
17404
  });
17231
17405
  var FaceFilterEnum = _enum([
17232
17406
  "unassigned",
@@ -21345,6 +21519,12 @@ Object.freeze({
21345
21519
  addonId: null,
21346
21520
  access: "view"
21347
21521
  },
21522
+ "pipelineAnalytics.getKeyEvents": {
21523
+ capName: "pipeline-analytics",
21524
+ capScope: "device",
21525
+ addonId: null,
21526
+ access: "view"
21527
+ },
21348
21528
  "pipelineAnalytics.getMotionEvents": {
21349
21529
  capName: "pipeline-analytics",
21350
21530
  capScope: "device",
@@ -21873,12 +22053,24 @@ Object.freeze({
21873
22053
  addonId: null,
21874
22054
  access: "view"
21875
22055
  },
22056
+ "pipelineRunner.getNativeCrop": {
22057
+ capName: "pipeline-runner",
22058
+ capScope: "system",
22059
+ addonId: null,
22060
+ access: "view"
22061
+ },
21876
22062
  "pipelineRunner.reportMotion": {
21877
22063
  capName: "pipeline-runner",
21878
22064
  capScope: "system",
21879
22065
  addonId: null,
21880
22066
  access: "create"
21881
22067
  },
22068
+ "pipelineRunner.runDetailSubtree": {
22069
+ capName: "pipeline-runner",
22070
+ capScope: "system",
22071
+ addonId: null,
22072
+ access: "create"
22073
+ },
21882
22074
  "plateGallery.correctPlateText": {
21883
22075
  capName: "plate-gallery",
21884
22076
  capScope: "system",
@@ -22239,6 +22431,12 @@ Object.freeze({
22239
22431
  addonId: null,
22240
22432
  access: "view"
22241
22433
  },
22434
+ "snapshot.getSnapshotOverview": {
22435
+ capName: "snapshot",
22436
+ capScope: "device",
22437
+ addonId: null,
22438
+ access: "view"
22439
+ },
22242
22440
  "snapshot.invalidateCache": {
22243
22441
  capName: "snapshot",
22244
22442
  capScope: "device",
@@ -22917,6 +23115,12 @@ Object.freeze({
22917
23115
  addonId: null,
22918
23116
  access: "view"
22919
23117
  },
23118
+ "userPasskeys.beginDiscoverableAuthentication": {
23119
+ capName: "user-passkeys",
23120
+ capScope: "system",
23121
+ addonId: null,
23122
+ access: "view"
23123
+ },
22920
23124
  "userPasskeys.beginRegistration": {
22921
23125
  capName: "user-passkeys",
22922
23126
  capScope: "system",
@@ -22929,12 +23133,24 @@ Object.freeze({
22929
23133
  addonId: null,
22930
23134
  access: "view"
22931
23135
  },
23136
+ "userPasskeys.finishDiscoverableAuthentication": {
23137
+ capName: "user-passkeys",
23138
+ capScope: "system",
23139
+ addonId: null,
23140
+ access: "view"
23141
+ },
22932
23142
  "userPasskeys.finishRegistration": {
22933
23143
  capName: "user-passkeys",
22934
23144
  capScope: "system",
22935
23145
  addonId: null,
22936
23146
  access: "create"
22937
23147
  },
23148
+ "userPasskeys.getSecondFactorPreference": {
23149
+ capName: "user-passkeys",
23150
+ capScope: "system",
23151
+ addonId: null,
23152
+ access: "view"
23153
+ },
22938
23154
  "userPasskeys.listPasskeys": {
22939
23155
  capName: "user-passkeys",
22940
23156
  capScope: "system",
@@ -22947,6 +23163,12 @@ Object.freeze({
22947
23163
  addonId: null,
22948
23164
  access: "delete"
22949
23165
  },
23166
+ "userPasskeys.setSecondFactorPreference": {
23167
+ capName: "user-passkeys",
23168
+ capScope: "system",
23169
+ addonId: null,
23170
+ access: "create"
23171
+ },
22950
23172
  "vacuumControl.locate": {
22951
23173
  capName: "vacuum-control",
22952
23174
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-decoder-ffmpeg",
3
- "version": "1.1.10",
3
+ "version": "1.1.12",
4
4
  "description": "Standalone ffmpeg-subprocess decoder fallback addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",