@camstack/addon-cloudflare 1.1.21 → 1.1.23

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.
@@ -4627,7 +4627,7 @@ function _instanceof(cls, params = {}) {
4627
4627
  return inst;
4628
4628
  }
4629
4629
  //#endregion
4630
- //#region ../types/dist/sleep-DJaTV2D7.mjs
4630
+ //#region ../types/dist/sleep-Baang_XW.mjs
4631
4631
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4632
4632
  EventCategory["SystemBoot"] = "system.boot";
4633
4633
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -6731,6 +6731,18 @@ function method(input, output, options) {
6731
6731
  timeoutMs: options?.timeoutMs
6732
6732
  };
6733
6733
  }
6734
+ /**
6735
+ * A wrapper/system-only method: served exclusively by the cap's system-level
6736
+ * provider (`InferProvider`), and OPTIONAL on `InferNativeProvider` so per-device
6737
+ * driver natives don't stub out a wrapper concern (e.g. a cross-device cache
6738
+ * overview). The `systemOnly: true` literal is what `InferNativeProvider` keys on.
6739
+ */
6740
+ function systemMethod(input, output, options) {
6741
+ return {
6742
+ ...method(input, output, options),
6743
+ systemOnly: true
6744
+ };
6745
+ }
6734
6746
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6735
6747
  var VersionOutputSchema$1 = object({ version: string() });
6736
6748
  method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
@@ -10469,6 +10481,7 @@ var PipelineAddonSchemaSchema = object({
10469
10481
  defaultModelId: string(),
10470
10482
  defaultModelIdByFormat: record(string(), string()).optional(),
10471
10483
  enabledByDefault: boolean().optional(),
10484
+ backfillIntoExistingOverrides: boolean().optional(),
10472
10485
  defaultConfidence: number(),
10473
10486
  group: string().optional(),
10474
10487
  configSchema: array(ConfigFieldBridge).readonly().optional()
@@ -10650,7 +10663,15 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
10650
10663
  image: _instanceof(Uint8Array).optional(),
10651
10664
  referenceImage: string().optional(),
10652
10665
  deviceId: number().optional(),
10653
- sessionId: string().optional()
10666
+ sessionId: string().optional(),
10667
+ /**
10668
+ * Execution plane. 'full' (default) runs the whole tree — benchmark,
10669
+ * reference-image, and detail-subtree calls. 'frame' is the live
10670
+ * per-frame dispatch: ONLY root-plane steps run; crop children
10671
+ * (inputClasses ≠ null) are skipped and served per-track via
10672
+ * pipelineRunner.runDetailSubtree (two-plane design).
10673
+ */
10674
+ plane: _enum(["full", "frame"]).optional()
10654
10675
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
10655
10676
  engine: PipelineEngineChoiceSchema.optional(),
10656
10677
  steps: array(PipelineStepInputSchema).min(1),
@@ -10775,6 +10796,47 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(ZoneSchema).read
10775
10796
  auth: "admin"
10776
10797
  }), object({ zones: array(ZoneSchema).readonly() });
10777
10798
  /**
10799
+ * A bounding box in NORMALIZED [0,1] frame coordinates for `getNativeCrop`. The
10800
+ * decode worker resolves it against the RETAINED native frame's real pixel dims,
10801
+ * so the caller supplies only the detection-res bbox divided by the detection
10802
+ * dims — no native resolution to plumb.
10803
+ */
10804
+ var NativeCropBboxSchema = object({
10805
+ x: number(),
10806
+ y: number(),
10807
+ w: number(),
10808
+ h: number()
10809
+ });
10810
+ /** Result of a best-effort native-resolution crop (`getNativeCrop`). */
10811
+ var NativeCropResultSchema = object({
10812
+ /** Packed rgb (24-bit) pixels of the crop. */
10813
+ bytes: _instanceof(Uint8Array),
10814
+ width: number().int().positive(),
10815
+ height: number().int().positive()
10816
+ });
10817
+ /** Parent detection context passed to `runDetailSubtree` — the crop's
10818
+ * originating detection, in FRAME-space coordinates. Reuses
10819
+ * `NativeCropBboxSchema`'s `{x,y,w,h}` shape (same numeric fields; here
10820
+ * the coordinates are frame-space rather than getNativeCrop's
10821
+ * normalized [0,1] convention). */
10822
+ var DetailParentSchema = object({
10823
+ bbox: NativeCropBboxSchema,
10824
+ className: string()
10825
+ });
10826
+ /** One child-step result from `runDetailSubtree` — an embedding, label,
10827
+ * or refined detection produced by running the crop-subtree on a
10828
+ * single tracked detection. */
10829
+ var DetailResultSchema = object({
10830
+ stepId: string(),
10831
+ className: string(),
10832
+ score: number(),
10833
+ /** FRAME-space bbox (already mapped back from crop space). */
10834
+ bbox: NativeCropBboxSchema.optional(),
10835
+ embedding: string().optional(),
10836
+ label: string().optional(),
10837
+ alignedCropJpeg: string().optional()
10838
+ });
10839
+ /**
10778
10840
  * Per-camera tunable ranges + defaults. Single source of truth used
10779
10841
  * by both the Zod data schema (validation + default fallback) and
10780
10842
  * the device settings UI (slider min/max/step). Touch one place and
@@ -11030,7 +11092,17 @@ var RunnerLocalMetricsSchema = object({
11030
11092
  avgInferenceTimeMs: number(),
11031
11093
  queueDepth: number()
11032
11094
  });
11033
- 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());
11095
+ 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({
11096
+ handle: FrameHandleSchema,
11097
+ bbox: NativeCropBboxSchema,
11098
+ maxWidth: number().int().positive().optional()
11099
+ }), NativeCropResultSchema.nullable()), method(object({
11100
+ deviceId: number(),
11101
+ frameHandle: FrameHandleSchema.optional(),
11102
+ cropJpeg: string().optional(),
11103
+ parent: DetailParentSchema,
11104
+ steps: array(string()).optional()
11105
+ }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" });
11034
11106
  object({
11035
11107
  detected: boolean(),
11036
11108
  /** Ms epoch of the last detected-true observation. Null if never detected. */
@@ -15106,7 +15178,17 @@ var TrackSchema = object({
15106
15178
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
15107
15179
  totalDistance: number(),
15108
15180
  state: TrackStateSchema,
15109
- active: boolean()
15181
+ active: boolean(),
15182
+ /** Deterministic key-event importance score in [0,1] (server-computed at
15183
+ * track expiry, recomputed on late label). Absent on legacy rows written
15184
+ * before scoring shipped — consumers degrade to absence / compute-on-read. */
15185
+ importance: number().optional(),
15186
+ /** Id of the track's highest-confidence ObjectEvent (its representative
15187
+ * "best" frame). Absent when the track produced no object events. */
15188
+ bestEventId: string().optional(),
15189
+ /** Tag of the importance sub-signal that dominated the score
15190
+ * (identity|dwell|proximity|class|confidence|travel|zone). */
15191
+ importanceReason: string().optional()
15110
15192
  });
15111
15193
  var BaseEventFields = {
15112
15194
  id: string(),
@@ -15171,8 +15253,18 @@ var ObjectEventSchema = object({
15171
15253
  frameHeight: number().optional(),
15172
15254
  /** MediaStore key for the crop attached to this event (if any). */
15173
15255
  mediaKey: string().optional(),
15256
+ /** Design B: MediaStore key of the track's native-resolution key frame (the
15257
+ * best-detection full frame). Resolve via the event-media data-plane
15258
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
15259
+ * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
15260
+ * sources — consumers fall back to `mediaKey` (the tight crop). */
15261
+ keyFrameMediaKey: string().optional(),
15174
15262
  /** Populated by B5 (recording playback URL for this event). */
15175
- mediaUrl: string().optional()
15263
+ mediaUrl: string().optional(),
15264
+ /** The parent track's key-event importance [0,1], propagated to every object
15265
+ * event of the track (so an event row can be sorted by importance without a
15266
+ * track join). Absent on legacy rows / before the track was scored. */
15267
+ importance: number().optional()
15176
15268
  });
15177
15269
  var AudioEventSchema = object({
15178
15270
  ...BaseEventFields,
@@ -15196,7 +15288,8 @@ var MediaFileKindEnum = _enum([
15196
15288
  "fullFrame",
15197
15289
  "fullFrameBoxed",
15198
15290
  "faceCrop",
15199
- "plateCrop"
15291
+ "plateCrop",
15292
+ "keyFrame"
15200
15293
  ]);
15201
15294
  var MediaFileSchema = object({
15202
15295
  key: string(),
@@ -15217,6 +15310,32 @@ var DeviceEventQueryInput = object({
15217
15310
  projection: _enum(["full", "slim"]).optional()
15218
15311
  });
15219
15312
  var ObjectEventQueryInput = DeviceEventQueryInput.extend({ classFilter: string().optional() });
15313
+ var KeyEventQueryInput = object({
15314
+ deviceId: number(),
15315
+ /** Window lower bound (track firstSeen ≥ since). */
15316
+ since: number(),
15317
+ /** Window upper bound (track firstSeen ≤ until). */
15318
+ until: number(),
15319
+ limit: number().int().min(1).max(200).default(50),
15320
+ /** Drop tracks scoring below this importance. */
15321
+ minImportance: number().min(0).max(1).optional(),
15322
+ /** Restrict to a single class (e.g. 'person'). */
15323
+ classFilter: string().optional()
15324
+ });
15325
+ var KeyEventSchema = object({
15326
+ /** The representative event id (the track's best ObjectEvent, else its trackId). */
15327
+ id: string(),
15328
+ trackId: string(),
15329
+ /** Track start time (firstSeen). */
15330
+ timestamp: number(),
15331
+ className: string(),
15332
+ label: string().optional(),
15333
+ importance: number(),
15334
+ /** Highest-confidence ObjectEvent id for the track (empty when none). */
15335
+ bestEventId: string(),
15336
+ /** Track lifetime in ms (lastSeen - firstSeen). */
15337
+ windowMs: number().optional()
15338
+ });
15220
15339
  var TrackedDetectionSchema = object({
15221
15340
  trackId: string(),
15222
15341
  className: string(),
@@ -15246,7 +15365,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
15246
15365
  }), array(TrackSchema).readonly()), method(object({ deviceId: number() }), _void(), {
15247
15366
  kind: "mutation",
15248
15367
  auth: "admin"
15249
- }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({
15368
+ }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(object({
15250
15369
  deviceId: number(),
15251
15370
  since: number(),
15252
15371
  until: number(),
@@ -16013,7 +16132,12 @@ DeviceType.Camera, method(object({
16013
16132
  }), SnapshotImageSchema.nullable()), method(object({ deviceId: number() }), _void(), {
16014
16133
  kind: "mutation",
16015
16134
  auth: "admin"
16016
- });
16135
+ }), systemMethod(object({ deviceIds: array(number()).min(1).max(200) }), array(object({
16136
+ deviceId: number(),
16137
+ lastCapturedAt: number().nullable(),
16138
+ cacheAgeMs: number().nullable(),
16139
+ etag: string().nullable()
16140
+ })));
16017
16141
  /**
16018
16142
  * `sso-bridge` — internal hub-only cap that lets SSO-style auth
16019
16143
  * providers (OIDC, SAML, magic-link, …) mint an HMAC-signed token
@@ -16287,10 +16411,32 @@ getTurnServers: method(_void(), array(TurnServerSchema).readonly()) }
16287
16411
  * b. `finishAuthentication({userId, response})` → server verifies
16288
16412
  * the assertion, bumps the credential counter, returns ok.
16289
16413
  *
16414
+ * 2b. Usernameless (discoverable-credential) authentication — the
16415
+ * passkey IS the primary factor, no password leg:
16416
+ * a. `beginDiscoverableAuthentication({})` → assertion options with
16417
+ * EMPTY `allowCredentials` (the browser offers every resident
16418
+ * passkey it holds for this RP) + `userVerification: 'required'`
16419
+ * (the passkey replaces both factors, so UV is mandatory).
16420
+ * The challenge is stored server-side, NOT bound to any user.
16421
+ * b. `finishDiscoverableAuthentication({response})` → the provider
16422
+ * resolves the credential by the response's credential id,
16423
+ * verifies the assertion against the stored challenge + that
16424
+ * credential's public key/counter, and returns the OWNING
16425
+ * `userId` — the caller (core auth router) mints the session.
16426
+ *
16290
16427
  * 3. Management:
16291
16428
  * - `listPasskeys({userId})` — enumerate user's enrolled credentials.
16292
16429
  * - `removePasskey({userId, credentialId})` — revoke one credential.
16293
16430
  *
16431
+ * 4. Second-factor preference (opt-in, default OFF):
16432
+ * Enrolling a passkey only enables passkey-FIRST sign-in. It is
16433
+ * demanded as a second factor after a password login ONLY when the
16434
+ * user explicitly opts in via `setSecondFactorPreference`.
16435
+ * - `getSecondFactorPreference({userId})` → `{ enabled }` (missing
16436
+ * row ⇒ `enabled: false`).
16437
+ * - `setSecondFactorPreference({userId, enabled})` — persisted by
16438
+ * the providing addon beside its credentials.
16439
+ *
16294
16440
  * Challenges are short-lived (5 min, in-memory). The cap is internal —
16295
16441
  * the admin-ui composes the begin/finish round-trip and never exposes
16296
16442
  * the cap to non-admins.
@@ -16333,6 +16479,17 @@ method(object({
16333
16479
  }), object({ verified: boolean() }), {
16334
16480
  kind: "mutation",
16335
16481
  access: "view"
16482
+ }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
16483
+ kind: "mutation",
16484
+ access: "view"
16485
+ }), method(object({
16486
+ /** AuthenticationResponseJSON from the browser. */
16487
+ response: record(string(), unknown()) }), object({
16488
+ verified: boolean(),
16489
+ userId: string().nullable()
16490
+ }), {
16491
+ kind: "mutation",
16492
+ access: "view"
16336
16493
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
16337
16494
  userId: string(),
16338
16495
  credentialId: string()
@@ -16340,6 +16497,13 @@ method(object({
16340
16497
  kind: "mutation",
16341
16498
  auth: "admin",
16342
16499
  access: "delete"
16500
+ }), method(object({ userId: string() }), object({ enabled: boolean() }), { auth: "admin" }), method(object({
16501
+ userId: string(),
16502
+ enabled: boolean()
16503
+ }), object({ success: literal(true) }), {
16504
+ kind: "mutation",
16505
+ auth: "admin",
16506
+ access: "create"
16343
16507
  });
16344
16508
  /**
16345
16509
  * `videoclips` — the unified, navigable-clip surface for a camera.
@@ -17141,7 +17305,17 @@ var FaceInfoSchema = object({
17141
17305
  recognizedIdentityId: string().optional(),
17142
17306
  identityName: string().optional(),
17143
17307
  assigned: boolean(),
17144
- base64: string().optional()
17308
+ base64: string().optional(),
17309
+ /** Design B: the face bbox (pixel space) on the key frame — lets a detail
17310
+ * view draw the box over the native `keyFrameMediaKey` frame. Absent on
17311
+ * legacy rows written before design B. */
17312
+ faceBbox: BoundingBoxSchema.optional(),
17313
+ /** Design B: MediaStore key of the track's native-resolution key frame.
17314
+ * Fetch the native JPEG via the event-media data-plane
17315
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
17316
+ * track produced no key frame (e.g. native/onboard source) — the UI falls
17317
+ * back to the inline `base64` face crop. */
17318
+ keyFrameMediaKey: string().optional()
17145
17319
  });
17146
17320
  var FaceFilterEnum = _enum([
17147
17321
  "unassigned",
@@ -21260,6 +21434,12 @@ Object.freeze({
21260
21434
  addonId: null,
21261
21435
  access: "view"
21262
21436
  },
21437
+ "pipelineAnalytics.getKeyEvents": {
21438
+ capName: "pipeline-analytics",
21439
+ capScope: "device",
21440
+ addonId: null,
21441
+ access: "view"
21442
+ },
21263
21443
  "pipelineAnalytics.getMotionEvents": {
21264
21444
  capName: "pipeline-analytics",
21265
21445
  capScope: "device",
@@ -21788,12 +21968,24 @@ Object.freeze({
21788
21968
  addonId: null,
21789
21969
  access: "view"
21790
21970
  },
21971
+ "pipelineRunner.getNativeCrop": {
21972
+ capName: "pipeline-runner",
21973
+ capScope: "system",
21974
+ addonId: null,
21975
+ access: "view"
21976
+ },
21791
21977
  "pipelineRunner.reportMotion": {
21792
21978
  capName: "pipeline-runner",
21793
21979
  capScope: "system",
21794
21980
  addonId: null,
21795
21981
  access: "create"
21796
21982
  },
21983
+ "pipelineRunner.runDetailSubtree": {
21984
+ capName: "pipeline-runner",
21985
+ capScope: "system",
21986
+ addonId: null,
21987
+ access: "create"
21988
+ },
21797
21989
  "plateGallery.correctPlateText": {
21798
21990
  capName: "plate-gallery",
21799
21991
  capScope: "system",
@@ -22154,6 +22346,12 @@ Object.freeze({
22154
22346
  addonId: null,
22155
22347
  access: "view"
22156
22348
  },
22349
+ "snapshot.getSnapshotOverview": {
22350
+ capName: "snapshot",
22351
+ capScope: "device",
22352
+ addonId: null,
22353
+ access: "view"
22354
+ },
22157
22355
  "snapshot.invalidateCache": {
22158
22356
  capName: "snapshot",
22159
22357
  capScope: "device",
@@ -22832,6 +23030,12 @@ Object.freeze({
22832
23030
  addonId: null,
22833
23031
  access: "view"
22834
23032
  },
23033
+ "userPasskeys.beginDiscoverableAuthentication": {
23034
+ capName: "user-passkeys",
23035
+ capScope: "system",
23036
+ addonId: null,
23037
+ access: "view"
23038
+ },
22835
23039
  "userPasskeys.beginRegistration": {
22836
23040
  capName: "user-passkeys",
22837
23041
  capScope: "system",
@@ -22844,12 +23048,24 @@ Object.freeze({
22844
23048
  addonId: null,
22845
23049
  access: "view"
22846
23050
  },
23051
+ "userPasskeys.finishDiscoverableAuthentication": {
23052
+ capName: "user-passkeys",
23053
+ capScope: "system",
23054
+ addonId: null,
23055
+ access: "view"
23056
+ },
22847
23057
  "userPasskeys.finishRegistration": {
22848
23058
  capName: "user-passkeys",
22849
23059
  capScope: "system",
22850
23060
  addonId: null,
22851
23061
  access: "create"
22852
23062
  },
23063
+ "userPasskeys.getSecondFactorPreference": {
23064
+ capName: "user-passkeys",
23065
+ capScope: "system",
23066
+ addonId: null,
23067
+ access: "view"
23068
+ },
22853
23069
  "userPasskeys.listPasskeys": {
22854
23070
  capName: "user-passkeys",
22855
23071
  capScope: "system",
@@ -22862,6 +23078,12 @@ Object.freeze({
22862
23078
  addonId: null,
22863
23079
  access: "delete"
22864
23080
  },
23081
+ "userPasskeys.setSecondFactorPreference": {
23082
+ capName: "user-passkeys",
23083
+ capScope: "system",
23084
+ addonId: null,
23085
+ access: "create"
23086
+ },
22865
23087
  "vacuumControl.locate": {
22866
23088
  capName: "vacuum-control",
22867
23089
  capScope: "device",
@@ -4627,7 +4627,7 @@ function _instanceof(cls, params = {}) {
4627
4627
  return inst;
4628
4628
  }
4629
4629
  //#endregion
4630
- //#region ../types/dist/sleep-DJaTV2D7.mjs
4630
+ //#region ../types/dist/sleep-Baang_XW.mjs
4631
4631
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4632
4632
  EventCategory["SystemBoot"] = "system.boot";
4633
4633
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -6731,6 +6731,18 @@ function method(input, output, options) {
6731
6731
  timeoutMs: options?.timeoutMs
6732
6732
  };
6733
6733
  }
6734
+ /**
6735
+ * A wrapper/system-only method: served exclusively by the cap's system-level
6736
+ * provider (`InferProvider`), and OPTIONAL on `InferNativeProvider` so per-device
6737
+ * driver natives don't stub out a wrapper concern (e.g. a cross-device cache
6738
+ * overview). The `systemOnly: true` literal is what `InferNativeProvider` keys on.
6739
+ */
6740
+ function systemMethod(input, output, options) {
6741
+ return {
6742
+ ...method(input, output, options),
6743
+ systemOnly: true
6744
+ };
6745
+ }
6734
6746
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6735
6747
  var VersionOutputSchema$1 = object({ version: string() });
6736
6748
  method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
@@ -10469,6 +10481,7 @@ var PipelineAddonSchemaSchema = object({
10469
10481
  defaultModelId: string(),
10470
10482
  defaultModelIdByFormat: record(string(), string()).optional(),
10471
10483
  enabledByDefault: boolean().optional(),
10484
+ backfillIntoExistingOverrides: boolean().optional(),
10472
10485
  defaultConfidence: number(),
10473
10486
  group: string().optional(),
10474
10487
  configSchema: array(ConfigFieldBridge).readonly().optional()
@@ -10650,7 +10663,15 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
10650
10663
  image: _instanceof(Uint8Array).optional(),
10651
10664
  referenceImage: string().optional(),
10652
10665
  deviceId: number().optional(),
10653
- sessionId: string().optional()
10666
+ sessionId: string().optional(),
10667
+ /**
10668
+ * Execution plane. 'full' (default) runs the whole tree — benchmark,
10669
+ * reference-image, and detail-subtree calls. 'frame' is the live
10670
+ * per-frame dispatch: ONLY root-plane steps run; crop children
10671
+ * (inputClasses ≠ null) are skipped and served per-track via
10672
+ * pipelineRunner.runDetailSubtree (two-plane design).
10673
+ */
10674
+ plane: _enum(["full", "frame"]).optional()
10654
10675
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
10655
10676
  engine: PipelineEngineChoiceSchema.optional(),
10656
10677
  steps: array(PipelineStepInputSchema).min(1),
@@ -10775,6 +10796,47 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(ZoneSchema).read
10775
10796
  auth: "admin"
10776
10797
  }), object({ zones: array(ZoneSchema).readonly() });
10777
10798
  /**
10799
+ * A bounding box in NORMALIZED [0,1] frame coordinates for `getNativeCrop`. The
10800
+ * decode worker resolves it against the RETAINED native frame's real pixel dims,
10801
+ * so the caller supplies only the detection-res bbox divided by the detection
10802
+ * dims — no native resolution to plumb.
10803
+ */
10804
+ var NativeCropBboxSchema = object({
10805
+ x: number(),
10806
+ y: number(),
10807
+ w: number(),
10808
+ h: number()
10809
+ });
10810
+ /** Result of a best-effort native-resolution crop (`getNativeCrop`). */
10811
+ var NativeCropResultSchema = object({
10812
+ /** Packed rgb (24-bit) pixels of the crop. */
10813
+ bytes: _instanceof(Uint8Array),
10814
+ width: number().int().positive(),
10815
+ height: number().int().positive()
10816
+ });
10817
+ /** Parent detection context passed to `runDetailSubtree` — the crop's
10818
+ * originating detection, in FRAME-space coordinates. Reuses
10819
+ * `NativeCropBboxSchema`'s `{x,y,w,h}` shape (same numeric fields; here
10820
+ * the coordinates are frame-space rather than getNativeCrop's
10821
+ * normalized [0,1] convention). */
10822
+ var DetailParentSchema = object({
10823
+ bbox: NativeCropBboxSchema,
10824
+ className: string()
10825
+ });
10826
+ /** One child-step result from `runDetailSubtree` — an embedding, label,
10827
+ * or refined detection produced by running the crop-subtree on a
10828
+ * single tracked detection. */
10829
+ var DetailResultSchema = object({
10830
+ stepId: string(),
10831
+ className: string(),
10832
+ score: number(),
10833
+ /** FRAME-space bbox (already mapped back from crop space). */
10834
+ bbox: NativeCropBboxSchema.optional(),
10835
+ embedding: string().optional(),
10836
+ label: string().optional(),
10837
+ alignedCropJpeg: string().optional()
10838
+ });
10839
+ /**
10778
10840
  * Per-camera tunable ranges + defaults. Single source of truth used
10779
10841
  * by both the Zod data schema (validation + default fallback) and
10780
10842
  * the device settings UI (slider min/max/step). Touch one place and
@@ -11030,7 +11092,17 @@ var RunnerLocalMetricsSchema = object({
11030
11092
  avgInferenceTimeMs: number(),
11031
11093
  queueDepth: number()
11032
11094
  });
11033
- 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());
11095
+ 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({
11096
+ handle: FrameHandleSchema,
11097
+ bbox: NativeCropBboxSchema,
11098
+ maxWidth: number().int().positive().optional()
11099
+ }), NativeCropResultSchema.nullable()), method(object({
11100
+ deviceId: number(),
11101
+ frameHandle: FrameHandleSchema.optional(),
11102
+ cropJpeg: string().optional(),
11103
+ parent: DetailParentSchema,
11104
+ steps: array(string()).optional()
11105
+ }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" });
11034
11106
  object({
11035
11107
  detected: boolean(),
11036
11108
  /** Ms epoch of the last detected-true observation. Null if never detected. */
@@ -15106,7 +15178,17 @@ var TrackSchema = object({
15106
15178
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
15107
15179
  totalDistance: number(),
15108
15180
  state: TrackStateSchema,
15109
- active: boolean()
15181
+ active: boolean(),
15182
+ /** Deterministic key-event importance score in [0,1] (server-computed at
15183
+ * track expiry, recomputed on late label). Absent on legacy rows written
15184
+ * before scoring shipped — consumers degrade to absence / compute-on-read. */
15185
+ importance: number().optional(),
15186
+ /** Id of the track's highest-confidence ObjectEvent (its representative
15187
+ * "best" frame). Absent when the track produced no object events. */
15188
+ bestEventId: string().optional(),
15189
+ /** Tag of the importance sub-signal that dominated the score
15190
+ * (identity|dwell|proximity|class|confidence|travel|zone). */
15191
+ importanceReason: string().optional()
15110
15192
  });
15111
15193
  var BaseEventFields = {
15112
15194
  id: string(),
@@ -15171,8 +15253,18 @@ var ObjectEventSchema = object({
15171
15253
  frameHeight: number().optional(),
15172
15254
  /** MediaStore key for the crop attached to this event (if any). */
15173
15255
  mediaKey: string().optional(),
15256
+ /** Design B: MediaStore key of the track's native-resolution key frame (the
15257
+ * best-detection full frame). Resolve via the event-media data-plane
15258
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
15259
+ * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
15260
+ * sources — consumers fall back to `mediaKey` (the tight crop). */
15261
+ keyFrameMediaKey: string().optional(),
15174
15262
  /** Populated by B5 (recording playback URL for this event). */
15175
- mediaUrl: string().optional()
15263
+ mediaUrl: string().optional(),
15264
+ /** The parent track's key-event importance [0,1], propagated to every object
15265
+ * event of the track (so an event row can be sorted by importance without a
15266
+ * track join). Absent on legacy rows / before the track was scored. */
15267
+ importance: number().optional()
15176
15268
  });
15177
15269
  var AudioEventSchema = object({
15178
15270
  ...BaseEventFields,
@@ -15196,7 +15288,8 @@ var MediaFileKindEnum = _enum([
15196
15288
  "fullFrame",
15197
15289
  "fullFrameBoxed",
15198
15290
  "faceCrop",
15199
- "plateCrop"
15291
+ "plateCrop",
15292
+ "keyFrame"
15200
15293
  ]);
15201
15294
  var MediaFileSchema = object({
15202
15295
  key: string(),
@@ -15217,6 +15310,32 @@ var DeviceEventQueryInput = object({
15217
15310
  projection: _enum(["full", "slim"]).optional()
15218
15311
  });
15219
15312
  var ObjectEventQueryInput = DeviceEventQueryInput.extend({ classFilter: string().optional() });
15313
+ var KeyEventQueryInput = object({
15314
+ deviceId: number(),
15315
+ /** Window lower bound (track firstSeen ≥ since). */
15316
+ since: number(),
15317
+ /** Window upper bound (track firstSeen ≤ until). */
15318
+ until: number(),
15319
+ limit: number().int().min(1).max(200).default(50),
15320
+ /** Drop tracks scoring below this importance. */
15321
+ minImportance: number().min(0).max(1).optional(),
15322
+ /** Restrict to a single class (e.g. 'person'). */
15323
+ classFilter: string().optional()
15324
+ });
15325
+ var KeyEventSchema = object({
15326
+ /** The representative event id (the track's best ObjectEvent, else its trackId). */
15327
+ id: string(),
15328
+ trackId: string(),
15329
+ /** Track start time (firstSeen). */
15330
+ timestamp: number(),
15331
+ className: string(),
15332
+ label: string().optional(),
15333
+ importance: number(),
15334
+ /** Highest-confidence ObjectEvent id for the track (empty when none). */
15335
+ bestEventId: string(),
15336
+ /** Track lifetime in ms (lastSeen - firstSeen). */
15337
+ windowMs: number().optional()
15338
+ });
15220
15339
  var TrackedDetectionSchema = object({
15221
15340
  trackId: string(),
15222
15341
  className: string(),
@@ -15246,7 +15365,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
15246
15365
  }), array(TrackSchema).readonly()), method(object({ deviceId: number() }), _void(), {
15247
15366
  kind: "mutation",
15248
15367
  auth: "admin"
15249
- }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({
15368
+ }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(object({
15250
15369
  deviceId: number(),
15251
15370
  since: number(),
15252
15371
  until: number(),
@@ -16013,7 +16132,12 @@ DeviceType.Camera, method(object({
16013
16132
  }), SnapshotImageSchema.nullable()), method(object({ deviceId: number() }), _void(), {
16014
16133
  kind: "mutation",
16015
16134
  auth: "admin"
16016
- });
16135
+ }), systemMethod(object({ deviceIds: array(number()).min(1).max(200) }), array(object({
16136
+ deviceId: number(),
16137
+ lastCapturedAt: number().nullable(),
16138
+ cacheAgeMs: number().nullable(),
16139
+ etag: string().nullable()
16140
+ })));
16017
16141
  /**
16018
16142
  * `sso-bridge` — internal hub-only cap that lets SSO-style auth
16019
16143
  * providers (OIDC, SAML, magic-link, …) mint an HMAC-signed token
@@ -16287,10 +16411,32 @@ getTurnServers: method(_void(), array(TurnServerSchema).readonly()) }
16287
16411
  * b. `finishAuthentication({userId, response})` → server verifies
16288
16412
  * the assertion, bumps the credential counter, returns ok.
16289
16413
  *
16414
+ * 2b. Usernameless (discoverable-credential) authentication — the
16415
+ * passkey IS the primary factor, no password leg:
16416
+ * a. `beginDiscoverableAuthentication({})` → assertion options with
16417
+ * EMPTY `allowCredentials` (the browser offers every resident
16418
+ * passkey it holds for this RP) + `userVerification: 'required'`
16419
+ * (the passkey replaces both factors, so UV is mandatory).
16420
+ * The challenge is stored server-side, NOT bound to any user.
16421
+ * b. `finishDiscoverableAuthentication({response})` → the provider
16422
+ * resolves the credential by the response's credential id,
16423
+ * verifies the assertion against the stored challenge + that
16424
+ * credential's public key/counter, and returns the OWNING
16425
+ * `userId` — the caller (core auth router) mints the session.
16426
+ *
16290
16427
  * 3. Management:
16291
16428
  * - `listPasskeys({userId})` — enumerate user's enrolled credentials.
16292
16429
  * - `removePasskey({userId, credentialId})` — revoke one credential.
16293
16430
  *
16431
+ * 4. Second-factor preference (opt-in, default OFF):
16432
+ * Enrolling a passkey only enables passkey-FIRST sign-in. It is
16433
+ * demanded as a second factor after a password login ONLY when the
16434
+ * user explicitly opts in via `setSecondFactorPreference`.
16435
+ * - `getSecondFactorPreference({userId})` → `{ enabled }` (missing
16436
+ * row ⇒ `enabled: false`).
16437
+ * - `setSecondFactorPreference({userId, enabled})` — persisted by
16438
+ * the providing addon beside its credentials.
16439
+ *
16294
16440
  * Challenges are short-lived (5 min, in-memory). The cap is internal —
16295
16441
  * the admin-ui composes the begin/finish round-trip and never exposes
16296
16442
  * the cap to non-admins.
@@ -16333,6 +16479,17 @@ method(object({
16333
16479
  }), object({ verified: boolean() }), {
16334
16480
  kind: "mutation",
16335
16481
  access: "view"
16482
+ }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
16483
+ kind: "mutation",
16484
+ access: "view"
16485
+ }), method(object({
16486
+ /** AuthenticationResponseJSON from the browser. */
16487
+ response: record(string(), unknown()) }), object({
16488
+ verified: boolean(),
16489
+ userId: string().nullable()
16490
+ }), {
16491
+ kind: "mutation",
16492
+ access: "view"
16336
16493
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
16337
16494
  userId: string(),
16338
16495
  credentialId: string()
@@ -16340,6 +16497,13 @@ method(object({
16340
16497
  kind: "mutation",
16341
16498
  auth: "admin",
16342
16499
  access: "delete"
16500
+ }), method(object({ userId: string() }), object({ enabled: boolean() }), { auth: "admin" }), method(object({
16501
+ userId: string(),
16502
+ enabled: boolean()
16503
+ }), object({ success: literal(true) }), {
16504
+ kind: "mutation",
16505
+ auth: "admin",
16506
+ access: "create"
16343
16507
  });
16344
16508
  /**
16345
16509
  * `videoclips` — the unified, navigable-clip surface for a camera.
@@ -17141,7 +17305,17 @@ var FaceInfoSchema = object({
17141
17305
  recognizedIdentityId: string().optional(),
17142
17306
  identityName: string().optional(),
17143
17307
  assigned: boolean(),
17144
- base64: string().optional()
17308
+ base64: string().optional(),
17309
+ /** Design B: the face bbox (pixel space) on the key frame — lets a detail
17310
+ * view draw the box over the native `keyFrameMediaKey` frame. Absent on
17311
+ * legacy rows written before design B. */
17312
+ faceBbox: BoundingBoxSchema.optional(),
17313
+ /** Design B: MediaStore key of the track's native-resolution key frame.
17314
+ * Fetch the native JPEG via the event-media data-plane
17315
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
17316
+ * track produced no key frame (e.g. native/onboard source) — the UI falls
17317
+ * back to the inline `base64` face crop. */
17318
+ keyFrameMediaKey: string().optional()
17145
17319
  });
17146
17320
  var FaceFilterEnum = _enum([
17147
17321
  "unassigned",
@@ -21260,6 +21434,12 @@ Object.freeze({
21260
21434
  addonId: null,
21261
21435
  access: "view"
21262
21436
  },
21437
+ "pipelineAnalytics.getKeyEvents": {
21438
+ capName: "pipeline-analytics",
21439
+ capScope: "device",
21440
+ addonId: null,
21441
+ access: "view"
21442
+ },
21263
21443
  "pipelineAnalytics.getMotionEvents": {
21264
21444
  capName: "pipeline-analytics",
21265
21445
  capScope: "device",
@@ -21788,12 +21968,24 @@ Object.freeze({
21788
21968
  addonId: null,
21789
21969
  access: "view"
21790
21970
  },
21971
+ "pipelineRunner.getNativeCrop": {
21972
+ capName: "pipeline-runner",
21973
+ capScope: "system",
21974
+ addonId: null,
21975
+ access: "view"
21976
+ },
21791
21977
  "pipelineRunner.reportMotion": {
21792
21978
  capName: "pipeline-runner",
21793
21979
  capScope: "system",
21794
21980
  addonId: null,
21795
21981
  access: "create"
21796
21982
  },
21983
+ "pipelineRunner.runDetailSubtree": {
21984
+ capName: "pipeline-runner",
21985
+ capScope: "system",
21986
+ addonId: null,
21987
+ access: "create"
21988
+ },
21797
21989
  "plateGallery.correctPlateText": {
21798
21990
  capName: "plate-gallery",
21799
21991
  capScope: "system",
@@ -22154,6 +22346,12 @@ Object.freeze({
22154
22346
  addonId: null,
22155
22347
  access: "view"
22156
22348
  },
22349
+ "snapshot.getSnapshotOverview": {
22350
+ capName: "snapshot",
22351
+ capScope: "device",
22352
+ addonId: null,
22353
+ access: "view"
22354
+ },
22157
22355
  "snapshot.invalidateCache": {
22158
22356
  capName: "snapshot",
22159
22357
  capScope: "device",
@@ -22832,6 +23030,12 @@ Object.freeze({
22832
23030
  addonId: null,
22833
23031
  access: "view"
22834
23032
  },
23033
+ "userPasskeys.beginDiscoverableAuthentication": {
23034
+ capName: "user-passkeys",
23035
+ capScope: "system",
23036
+ addonId: null,
23037
+ access: "view"
23038
+ },
22835
23039
  "userPasskeys.beginRegistration": {
22836
23040
  capName: "user-passkeys",
22837
23041
  capScope: "system",
@@ -22844,12 +23048,24 @@ Object.freeze({
22844
23048
  addonId: null,
22845
23049
  access: "view"
22846
23050
  },
23051
+ "userPasskeys.finishDiscoverableAuthentication": {
23052
+ capName: "user-passkeys",
23053
+ capScope: "system",
23054
+ addonId: null,
23055
+ access: "view"
23056
+ },
22847
23057
  "userPasskeys.finishRegistration": {
22848
23058
  capName: "user-passkeys",
22849
23059
  capScope: "system",
22850
23060
  addonId: null,
22851
23061
  access: "create"
22852
23062
  },
23063
+ "userPasskeys.getSecondFactorPreference": {
23064
+ capName: "user-passkeys",
23065
+ capScope: "system",
23066
+ addonId: null,
23067
+ access: "view"
23068
+ },
22853
23069
  "userPasskeys.listPasskeys": {
22854
23070
  capName: "user-passkeys",
22855
23071
  capScope: "system",
@@ -22862,6 +23078,12 @@ Object.freeze({
22862
23078
  addonId: null,
22863
23079
  access: "delete"
22864
23080
  },
23081
+ "userPasskeys.setSecondFactorPreference": {
23082
+ capName: "user-passkeys",
23083
+ capScope: "system",
23084
+ addonId: null,
23085
+ access: "create"
23086
+ },
22865
23087
  "vacuumControl.locate": {
22866
23088
  capName: "vacuum-control",
22867
23089
  capScope: "device",
@@ -21,7 +21,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
21
21
  enumerable: true
22
22
  }) : target, mod));
23
23
  //#endregion
24
- const require_dist = require("../dist-CKwL81JS.js");
24
+ const require_dist = require("../dist-gkRT1B9v.js");
25
25
  let node_path = require("node:path");
26
26
  node_path = __toESM(node_path);
27
27
  let node_crypto = require("node:crypto");
@@ -1,4 +1,4 @@
1
- import { a as BaseAddon, c as array, d as literal, f as number, l as boolean, m as string, n as defineCustomActions, o as EventCategory, p as object, r as networkAccessCapability, s as _enum, t as customAction } from "../dist-B_c-nZHY.mjs";
1
+ import { a as BaseAddon, c as array, d as literal, f as number, l as boolean, m as string, n as defineCustomActions, o as EventCategory, p as object, r as networkAccessCapability, s as _enum, t as customAction } from "../dist-BUzNAvoc.mjs";
2
2
  import * as path from "node:path";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { spawn } from "node:child_process";
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("../dist-CKwL81JS.js");
2
+ const require_dist = require("../dist-gkRT1B9v.js");
3
3
  //#region src/turn/cloudflare-turn.ts
4
4
  /**
5
5
  * Cloudflare returns ICE servers in several flavours depending on which
@@ -1,4 +1,4 @@
1
- import { a as BaseAddon, d as literal, f as number, i as turnProviderCapability, l as boolean, m as string, n as defineCustomActions, p as object, t as customAction, u as discriminatedUnion } from "../dist-B_c-nZHY.mjs";
1
+ import { a as BaseAddon, d as literal, f as number, i as turnProviderCapability, l as boolean, m as string, n as defineCustomActions, p as object, t as customAction, u as discriminatedUnion } from "../dist-BUzNAvoc.mjs";
2
2
  //#region src/turn/cloudflare-turn.ts
3
3
  /**
4
4
  * Cloudflare returns ICE servers in several flavours depending on which
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-cloudflare",
3
- "version": "1.1.21",
3
+ "version": "1.1.23",
4
4
  "description": "Cloudflare bundle — Tunnel (network-access) + TURN relay (turn-provider). Multi-entry npm package shipping 2 addons under a single bundle.",
5
5
  "keywords": [
6
6
  "camstack",