@camstack/addon-decoder-nodeav 1.1.9 → 1.1.11

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