@camstack/addon-remote-storage 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.
package/dist/s3.addon.js CHANGED
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-BTuv4hPh.js");
5
+ const require_shared = require("./shared-BL-GGrW8.js");
6
6
  let node_stream = require("node:stream");
7
7
  let _aws_sdk_client_s3 = require("@aws-sdk/client-s3");
8
8
  let _aws_sdk_lib_storage = require("@aws-sdk/lib-storage");
package/dist/s3.addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { c as BaseAddon, i as rearmIdleAbort, n as getOptionalBasePath, o as scheduleIdleAbort, s as storageProviderCapability, t as createSessionId } from "./shared-m1upfQvq.mjs";
1
+ import { c as BaseAddon, i as rearmIdleAbort, n as getOptionalBasePath, o as scheduleIdleAbort, s as storageProviderCapability, t as createSessionId } from "./shared-CFMg2pY9.mjs";
2
2
  import { PassThrough } from "node:stream";
3
3
  import { DeleteObjectCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectsV2Command, PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
4
4
  import { Upload } from "@aws-sdk/lib-storage";
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-BTuv4hPh.js");
5
+ const require_shared = require("./shared-BL-GGrW8.js");
6
6
  let ssh2 = require("ssh2");
7
7
  let node_path = require("node:path");
8
8
  node_path = require_shared.__toESM(node_path);
@@ -1,4 +1,4 @@
1
- import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-m1upfQvq.mjs";
1
+ import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-CFMg2pY9.mjs";
2
2
  import { Client } from "ssh2";
3
3
  import * as path from "node:path";
4
4
  //#region src/providers/sftp/sftp-config-schema.ts
@@ -4652,7 +4652,7 @@ function _instanceof(cls, params = {}) {
4652
4652
  return inst;
4653
4653
  }
4654
4654
  //#endregion
4655
- //#region ../types/dist/sleep-DJaTV2D7.mjs
4655
+ //#region ../types/dist/sleep-Baang_XW.mjs
4656
4656
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4657
4657
  EventCategory["SystemBoot"] = "system.boot";
4658
4658
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -6756,6 +6756,18 @@ function method(input, output, options) {
6756
6756
  timeoutMs: options?.timeoutMs
6757
6757
  };
6758
6758
  }
6759
+ /**
6760
+ * A wrapper/system-only method: served exclusively by the cap's system-level
6761
+ * provider (`InferProvider`), and OPTIONAL on `InferNativeProvider` so per-device
6762
+ * driver natives don't stub out a wrapper concern (e.g. a cross-device cache
6763
+ * overview). The `systemOnly: true` literal is what `InferNativeProvider` keys on.
6764
+ */
6765
+ function systemMethod(input, output, options) {
6766
+ return {
6767
+ ...method(input, output, options),
6768
+ systemOnly: true
6769
+ };
6770
+ }
6759
6771
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6760
6772
  var VersionOutputSchema$1 = object({ version: string() });
6761
6773
  method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
@@ -10494,6 +10506,7 @@ var PipelineAddonSchemaSchema = object({
10494
10506
  defaultModelId: string(),
10495
10507
  defaultModelIdByFormat: record(string(), string()).optional(),
10496
10508
  enabledByDefault: boolean().optional(),
10509
+ backfillIntoExistingOverrides: boolean().optional(),
10497
10510
  defaultConfidence: number(),
10498
10511
  group: string().optional(),
10499
10512
  configSchema: array(ConfigFieldBridge).readonly().optional()
@@ -10675,7 +10688,15 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
10675
10688
  image: _instanceof(Uint8Array).optional(),
10676
10689
  referenceImage: string().optional(),
10677
10690
  deviceId: number().optional(),
10678
- sessionId: string().optional()
10691
+ sessionId: string().optional(),
10692
+ /**
10693
+ * Execution plane. 'full' (default) runs the whole tree — benchmark,
10694
+ * reference-image, and detail-subtree calls. 'frame' is the live
10695
+ * per-frame dispatch: ONLY root-plane steps run; crop children
10696
+ * (inputClasses ≠ null) are skipped and served per-track via
10697
+ * pipelineRunner.runDetailSubtree (two-plane design).
10698
+ */
10699
+ plane: _enum(["full", "frame"]).optional()
10679
10700
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
10680
10701
  engine: PipelineEngineChoiceSchema.optional(),
10681
10702
  steps: array(PipelineStepInputSchema).min(1),
@@ -10800,6 +10821,47 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(ZoneSchema).read
10800
10821
  auth: "admin"
10801
10822
  }), object({ zones: array(ZoneSchema).readonly() });
10802
10823
  /**
10824
+ * A bounding box in NORMALIZED [0,1] frame coordinates for `getNativeCrop`. The
10825
+ * decode worker resolves it against the RETAINED native frame's real pixel dims,
10826
+ * so the caller supplies only the detection-res bbox divided by the detection
10827
+ * dims — no native resolution to plumb.
10828
+ */
10829
+ var NativeCropBboxSchema = object({
10830
+ x: number(),
10831
+ y: number(),
10832
+ w: number(),
10833
+ h: number()
10834
+ });
10835
+ /** Result of a best-effort native-resolution crop (`getNativeCrop`). */
10836
+ var NativeCropResultSchema = object({
10837
+ /** Packed rgb (24-bit) pixels of the crop. */
10838
+ bytes: _instanceof(Uint8Array),
10839
+ width: number().int().positive(),
10840
+ height: number().int().positive()
10841
+ });
10842
+ /** Parent detection context passed to `runDetailSubtree` — the crop's
10843
+ * originating detection, in FRAME-space coordinates. Reuses
10844
+ * `NativeCropBboxSchema`'s `{x,y,w,h}` shape (same numeric fields; here
10845
+ * the coordinates are frame-space rather than getNativeCrop's
10846
+ * normalized [0,1] convention). */
10847
+ var DetailParentSchema = object({
10848
+ bbox: NativeCropBboxSchema,
10849
+ className: string()
10850
+ });
10851
+ /** One child-step result from `runDetailSubtree` — an embedding, label,
10852
+ * or refined detection produced by running the crop-subtree on a
10853
+ * single tracked detection. */
10854
+ var DetailResultSchema = object({
10855
+ stepId: string(),
10856
+ className: string(),
10857
+ score: number(),
10858
+ /** FRAME-space bbox (already mapped back from crop space). */
10859
+ bbox: NativeCropBboxSchema.optional(),
10860
+ embedding: string().optional(),
10861
+ label: string().optional(),
10862
+ alignedCropJpeg: string().optional()
10863
+ });
10864
+ /**
10803
10865
  * Per-camera tunable ranges + defaults. Single source of truth used
10804
10866
  * by both the Zod data schema (validation + default fallback) and
10805
10867
  * the device settings UI (slider min/max/step). Touch one place and
@@ -11055,7 +11117,17 @@ var RunnerLocalMetricsSchema = object({
11055
11117
  avgInferenceTimeMs: number(),
11056
11118
  queueDepth: number()
11057
11119
  });
11058
- 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());
11120
+ 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({
11121
+ handle: FrameHandleSchema,
11122
+ bbox: NativeCropBboxSchema,
11123
+ maxWidth: number().int().positive().optional()
11124
+ }), NativeCropResultSchema.nullable()), method(object({
11125
+ deviceId: number(),
11126
+ frameHandle: FrameHandleSchema.optional(),
11127
+ cropJpeg: string().optional(),
11128
+ parent: DetailParentSchema,
11129
+ steps: array(string()).optional()
11130
+ }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" });
11059
11131
  object({
11060
11132
  detected: boolean(),
11061
11133
  /** Ms epoch of the last detected-true observation. Null if never detected. */
@@ -15093,7 +15165,17 @@ var TrackSchema = object({
15093
15165
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
15094
15166
  totalDistance: number(),
15095
15167
  state: TrackStateSchema,
15096
- active: boolean()
15168
+ active: boolean(),
15169
+ /** Deterministic key-event importance score in [0,1] (server-computed at
15170
+ * track expiry, recomputed on late label). Absent on legacy rows written
15171
+ * before scoring shipped — consumers degrade to absence / compute-on-read. */
15172
+ importance: number().optional(),
15173
+ /** Id of the track's highest-confidence ObjectEvent (its representative
15174
+ * "best" frame). Absent when the track produced no object events. */
15175
+ bestEventId: string().optional(),
15176
+ /** Tag of the importance sub-signal that dominated the score
15177
+ * (identity|dwell|proximity|class|confidence|travel|zone). */
15178
+ importanceReason: string().optional()
15097
15179
  });
15098
15180
  var BaseEventFields = {
15099
15181
  id: string(),
@@ -15158,8 +15240,18 @@ var ObjectEventSchema = object({
15158
15240
  frameHeight: number().optional(),
15159
15241
  /** MediaStore key for the crop attached to this event (if any). */
15160
15242
  mediaKey: string().optional(),
15243
+ /** Design B: MediaStore key of the track's native-resolution key frame (the
15244
+ * best-detection full frame). Resolve via the event-media data-plane
15245
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
15246
+ * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
15247
+ * sources — consumers fall back to `mediaKey` (the tight crop). */
15248
+ keyFrameMediaKey: string().optional(),
15161
15249
  /** Populated by B5 (recording playback URL for this event). */
15162
- mediaUrl: string().optional()
15250
+ mediaUrl: string().optional(),
15251
+ /** The parent track's key-event importance [0,1], propagated to every object
15252
+ * event of the track (so an event row can be sorted by importance without a
15253
+ * track join). Absent on legacy rows / before the track was scored. */
15254
+ importance: number().optional()
15163
15255
  });
15164
15256
  var AudioEventSchema = object({
15165
15257
  ...BaseEventFields,
@@ -15183,7 +15275,8 @@ var MediaFileKindEnum = _enum([
15183
15275
  "fullFrame",
15184
15276
  "fullFrameBoxed",
15185
15277
  "faceCrop",
15186
- "plateCrop"
15278
+ "plateCrop",
15279
+ "keyFrame"
15187
15280
  ]);
15188
15281
  var MediaFileSchema = object({
15189
15282
  key: string(),
@@ -15204,6 +15297,32 @@ var DeviceEventQueryInput = object({
15204
15297
  projection: _enum(["full", "slim"]).optional()
15205
15298
  });
15206
15299
  var ObjectEventQueryInput = DeviceEventQueryInput.extend({ classFilter: string().optional() });
15300
+ var KeyEventQueryInput = object({
15301
+ deviceId: number(),
15302
+ /** Window lower bound (track firstSeen ≥ since). */
15303
+ since: number(),
15304
+ /** Window upper bound (track firstSeen ≤ until). */
15305
+ until: number(),
15306
+ limit: number().int().min(1).max(200).default(50),
15307
+ /** Drop tracks scoring below this importance. */
15308
+ minImportance: number().min(0).max(1).optional(),
15309
+ /** Restrict to a single class (e.g. 'person'). */
15310
+ classFilter: string().optional()
15311
+ });
15312
+ var KeyEventSchema = object({
15313
+ /** The representative event id (the track's best ObjectEvent, else its trackId). */
15314
+ id: string(),
15315
+ trackId: string(),
15316
+ /** Track start time (firstSeen). */
15317
+ timestamp: number(),
15318
+ className: string(),
15319
+ label: string().optional(),
15320
+ importance: number(),
15321
+ /** Highest-confidence ObjectEvent id for the track (empty when none). */
15322
+ bestEventId: string(),
15323
+ /** Track lifetime in ms (lastSeen - firstSeen). */
15324
+ windowMs: number().optional()
15325
+ });
15207
15326
  var TrackedDetectionSchema = object({
15208
15327
  trackId: string(),
15209
15328
  className: string(),
@@ -15233,7 +15352,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
15233
15352
  }), array(TrackSchema).readonly()), method(object({ deviceId: number() }), _void(), {
15234
15353
  kind: "mutation",
15235
15354
  auth: "admin"
15236
- }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({
15355
+ }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(object({
15237
15356
  deviceId: number(),
15238
15357
  since: number(),
15239
15358
  until: number(),
@@ -16000,7 +16119,12 @@ DeviceType.Camera, method(object({
16000
16119
  }), SnapshotImageSchema.nullable()), method(object({ deviceId: number() }), _void(), {
16001
16120
  kind: "mutation",
16002
16121
  auth: "admin"
16003
- });
16122
+ }), systemMethod(object({ deviceIds: array(number()).min(1).max(200) }), array(object({
16123
+ deviceId: number(),
16124
+ lastCapturedAt: number().nullable(),
16125
+ cacheAgeMs: number().nullable(),
16126
+ etag: string().nullable()
16127
+ })));
16004
16128
  /**
16005
16129
  * `sso-bridge` — internal hub-only cap that lets SSO-style auth
16006
16130
  * providers (OIDC, SAML, magic-link, …) mint an HMAC-signed token
@@ -16296,10 +16420,32 @@ method(_void(), array(TurnServerSchema).readonly());
16296
16420
  * b. `finishAuthentication({userId, response})` → server verifies
16297
16421
  * the assertion, bumps the credential counter, returns ok.
16298
16422
  *
16423
+ * 2b. Usernameless (discoverable-credential) authentication — the
16424
+ * passkey IS the primary factor, no password leg:
16425
+ * a. `beginDiscoverableAuthentication({})` → assertion options with
16426
+ * EMPTY `allowCredentials` (the browser offers every resident
16427
+ * passkey it holds for this RP) + `userVerification: 'required'`
16428
+ * (the passkey replaces both factors, so UV is mandatory).
16429
+ * The challenge is stored server-side, NOT bound to any user.
16430
+ * b. `finishDiscoverableAuthentication({response})` → the provider
16431
+ * resolves the credential by the response's credential id,
16432
+ * verifies the assertion against the stored challenge + that
16433
+ * credential's public key/counter, and returns the OWNING
16434
+ * `userId` — the caller (core auth router) mints the session.
16435
+ *
16299
16436
  * 3. Management:
16300
16437
  * - `listPasskeys({userId})` — enumerate user's enrolled credentials.
16301
16438
  * - `removePasskey({userId, credentialId})` — revoke one credential.
16302
16439
  *
16440
+ * 4. Second-factor preference (opt-in, default OFF):
16441
+ * Enrolling a passkey only enables passkey-FIRST sign-in. It is
16442
+ * demanded as a second factor after a password login ONLY when the
16443
+ * user explicitly opts in via `setSecondFactorPreference`.
16444
+ * - `getSecondFactorPreference({userId})` → `{ enabled }` (missing
16445
+ * row ⇒ `enabled: false`).
16446
+ * - `setSecondFactorPreference({userId, enabled})` — persisted by
16447
+ * the providing addon beside its credentials.
16448
+ *
16303
16449
  * Challenges are short-lived (5 min, in-memory). The cap is internal —
16304
16450
  * the admin-ui composes the begin/finish round-trip and never exposes
16305
16451
  * the cap to non-admins.
@@ -16342,6 +16488,17 @@ method(object({
16342
16488
  }), object({ verified: boolean() }), {
16343
16489
  kind: "mutation",
16344
16490
  access: "view"
16491
+ }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
16492
+ kind: "mutation",
16493
+ access: "view"
16494
+ }), method(object({
16495
+ /** AuthenticationResponseJSON from the browser. */
16496
+ response: record(string(), unknown()) }), object({
16497
+ verified: boolean(),
16498
+ userId: string().nullable()
16499
+ }), {
16500
+ kind: "mutation",
16501
+ access: "view"
16345
16502
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
16346
16503
  userId: string(),
16347
16504
  credentialId: string()
@@ -16349,6 +16506,13 @@ method(object({
16349
16506
  kind: "mutation",
16350
16507
  auth: "admin",
16351
16508
  access: "delete"
16509
+ }), method(object({ userId: string() }), object({ enabled: boolean() }), { auth: "admin" }), method(object({
16510
+ userId: string(),
16511
+ enabled: boolean()
16512
+ }), object({ success: literal(true) }), {
16513
+ kind: "mutation",
16514
+ auth: "admin",
16515
+ access: "create"
16352
16516
  });
16353
16517
  /**
16354
16518
  * `videoclips` — the unified, navigable-clip surface for a camera.
@@ -17150,7 +17314,17 @@ var FaceInfoSchema = object({
17150
17314
  recognizedIdentityId: string().optional(),
17151
17315
  identityName: string().optional(),
17152
17316
  assigned: boolean(),
17153
- base64: string().optional()
17317
+ base64: string().optional(),
17318
+ /** Design B: the face bbox (pixel space) on the key frame — lets a detail
17319
+ * view draw the box over the native `keyFrameMediaKey` frame. Absent on
17320
+ * legacy rows written before design B. */
17321
+ faceBbox: BoundingBoxSchema.optional(),
17322
+ /** Design B: MediaStore key of the track's native-resolution key frame.
17323
+ * Fetch the native JPEG via the event-media data-plane
17324
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
17325
+ * track produced no key frame (e.g. native/onboard source) — the UI falls
17326
+ * back to the inline `base64` face crop. */
17327
+ keyFrameMediaKey: string().optional()
17154
17328
  });
17155
17329
  var FaceFilterEnum = _enum([
17156
17330
  "unassigned",
@@ -21269,6 +21443,12 @@ Object.freeze({
21269
21443
  addonId: null,
21270
21444
  access: "view"
21271
21445
  },
21446
+ "pipelineAnalytics.getKeyEvents": {
21447
+ capName: "pipeline-analytics",
21448
+ capScope: "device",
21449
+ addonId: null,
21450
+ access: "view"
21451
+ },
21272
21452
  "pipelineAnalytics.getMotionEvents": {
21273
21453
  capName: "pipeline-analytics",
21274
21454
  capScope: "device",
@@ -21797,12 +21977,24 @@ Object.freeze({
21797
21977
  addonId: null,
21798
21978
  access: "view"
21799
21979
  },
21980
+ "pipelineRunner.getNativeCrop": {
21981
+ capName: "pipeline-runner",
21982
+ capScope: "system",
21983
+ addonId: null,
21984
+ access: "view"
21985
+ },
21800
21986
  "pipelineRunner.reportMotion": {
21801
21987
  capName: "pipeline-runner",
21802
21988
  capScope: "system",
21803
21989
  addonId: null,
21804
21990
  access: "create"
21805
21991
  },
21992
+ "pipelineRunner.runDetailSubtree": {
21993
+ capName: "pipeline-runner",
21994
+ capScope: "system",
21995
+ addonId: null,
21996
+ access: "create"
21997
+ },
21806
21998
  "plateGallery.correctPlateText": {
21807
21999
  capName: "plate-gallery",
21808
22000
  capScope: "system",
@@ -22163,6 +22355,12 @@ Object.freeze({
22163
22355
  addonId: null,
22164
22356
  access: "view"
22165
22357
  },
22358
+ "snapshot.getSnapshotOverview": {
22359
+ capName: "snapshot",
22360
+ capScope: "device",
22361
+ addonId: null,
22362
+ access: "view"
22363
+ },
22166
22364
  "snapshot.invalidateCache": {
22167
22365
  capName: "snapshot",
22168
22366
  capScope: "device",
@@ -22841,6 +23039,12 @@ Object.freeze({
22841
23039
  addonId: null,
22842
23040
  access: "view"
22843
23041
  },
23042
+ "userPasskeys.beginDiscoverableAuthentication": {
23043
+ capName: "user-passkeys",
23044
+ capScope: "system",
23045
+ addonId: null,
23046
+ access: "view"
23047
+ },
22844
23048
  "userPasskeys.beginRegistration": {
22845
23049
  capName: "user-passkeys",
22846
23050
  capScope: "system",
@@ -22853,12 +23057,24 @@ Object.freeze({
22853
23057
  addonId: null,
22854
23058
  access: "view"
22855
23059
  },
23060
+ "userPasskeys.finishDiscoverableAuthentication": {
23061
+ capName: "user-passkeys",
23062
+ capScope: "system",
23063
+ addonId: null,
23064
+ access: "view"
23065
+ },
22856
23066
  "userPasskeys.finishRegistration": {
22857
23067
  capName: "user-passkeys",
22858
23068
  capScope: "system",
22859
23069
  addonId: null,
22860
23070
  access: "create"
22861
23071
  },
23072
+ "userPasskeys.getSecondFactorPreference": {
23073
+ capName: "user-passkeys",
23074
+ capScope: "system",
23075
+ addonId: null,
23076
+ access: "view"
23077
+ },
22862
23078
  "userPasskeys.listPasskeys": {
22863
23079
  capName: "user-passkeys",
22864
23080
  capScope: "system",
@@ -22871,6 +23087,12 @@ Object.freeze({
22871
23087
  addonId: null,
22872
23088
  access: "delete"
22873
23089
  },
23090
+ "userPasskeys.setSecondFactorPreference": {
23091
+ capName: "user-passkeys",
23092
+ capScope: "system",
23093
+ addonId: null,
23094
+ access: "create"
23095
+ },
22874
23096
  "vacuumControl.locate": {
22875
23097
  capName: "vacuum-control",
22876
23098
  capScope: "device",
@@ -4629,7 +4629,7 @@ function _instanceof(cls, params = {}) {
4629
4629
  return inst;
4630
4630
  }
4631
4631
  //#endregion
4632
- //#region ../types/dist/sleep-DJaTV2D7.mjs
4632
+ //#region ../types/dist/sleep-Baang_XW.mjs
4633
4633
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4634
4634
  EventCategory["SystemBoot"] = "system.boot";
4635
4635
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -6733,6 +6733,18 @@ function method(input, output, options) {
6733
6733
  timeoutMs: options?.timeoutMs
6734
6734
  };
6735
6735
  }
6736
+ /**
6737
+ * A wrapper/system-only method: served exclusively by the cap's system-level
6738
+ * provider (`InferProvider`), and OPTIONAL on `InferNativeProvider` so per-device
6739
+ * driver natives don't stub out a wrapper concern (e.g. a cross-device cache
6740
+ * overview). The `systemOnly: true` literal is what `InferNativeProvider` keys on.
6741
+ */
6742
+ function systemMethod(input, output, options) {
6743
+ return {
6744
+ ...method(input, output, options),
6745
+ systemOnly: true
6746
+ };
6747
+ }
6736
6748
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6737
6749
  var VersionOutputSchema$1 = object({ version: string() });
6738
6750
  method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
@@ -10471,6 +10483,7 @@ var PipelineAddonSchemaSchema = object({
10471
10483
  defaultModelId: string(),
10472
10484
  defaultModelIdByFormat: record(string(), string()).optional(),
10473
10485
  enabledByDefault: boolean().optional(),
10486
+ backfillIntoExistingOverrides: boolean().optional(),
10474
10487
  defaultConfidence: number(),
10475
10488
  group: string().optional(),
10476
10489
  configSchema: array(ConfigFieldBridge).readonly().optional()
@@ -10652,7 +10665,15 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
10652
10665
  image: _instanceof(Uint8Array).optional(),
10653
10666
  referenceImage: string().optional(),
10654
10667
  deviceId: number().optional(),
10655
- sessionId: string().optional()
10668
+ sessionId: string().optional(),
10669
+ /**
10670
+ * Execution plane. 'full' (default) runs the whole tree — benchmark,
10671
+ * reference-image, and detail-subtree calls. 'frame' is the live
10672
+ * per-frame dispatch: ONLY root-plane steps run; crop children
10673
+ * (inputClasses ≠ null) are skipped and served per-track via
10674
+ * pipelineRunner.runDetailSubtree (two-plane design).
10675
+ */
10676
+ plane: _enum(["full", "frame"]).optional()
10656
10677
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
10657
10678
  engine: PipelineEngineChoiceSchema.optional(),
10658
10679
  steps: array(PipelineStepInputSchema).min(1),
@@ -10777,6 +10798,47 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(ZoneSchema).read
10777
10798
  auth: "admin"
10778
10799
  }), object({ zones: array(ZoneSchema).readonly() });
10779
10800
  /**
10801
+ * A bounding box in NORMALIZED [0,1] frame coordinates for `getNativeCrop`. The
10802
+ * decode worker resolves it against the RETAINED native frame's real pixel dims,
10803
+ * so the caller supplies only the detection-res bbox divided by the detection
10804
+ * dims — no native resolution to plumb.
10805
+ */
10806
+ var NativeCropBboxSchema = object({
10807
+ x: number(),
10808
+ y: number(),
10809
+ w: number(),
10810
+ h: number()
10811
+ });
10812
+ /** Result of a best-effort native-resolution crop (`getNativeCrop`). */
10813
+ var NativeCropResultSchema = object({
10814
+ /** Packed rgb (24-bit) pixels of the crop. */
10815
+ bytes: _instanceof(Uint8Array),
10816
+ width: number().int().positive(),
10817
+ height: number().int().positive()
10818
+ });
10819
+ /** Parent detection context passed to `runDetailSubtree` — the crop's
10820
+ * originating detection, in FRAME-space coordinates. Reuses
10821
+ * `NativeCropBboxSchema`'s `{x,y,w,h}` shape (same numeric fields; here
10822
+ * the coordinates are frame-space rather than getNativeCrop's
10823
+ * normalized [0,1] convention). */
10824
+ var DetailParentSchema = object({
10825
+ bbox: NativeCropBboxSchema,
10826
+ className: string()
10827
+ });
10828
+ /** One child-step result from `runDetailSubtree` — an embedding, label,
10829
+ * or refined detection produced by running the crop-subtree on a
10830
+ * single tracked detection. */
10831
+ var DetailResultSchema = object({
10832
+ stepId: string(),
10833
+ className: string(),
10834
+ score: number(),
10835
+ /** FRAME-space bbox (already mapped back from crop space). */
10836
+ bbox: NativeCropBboxSchema.optional(),
10837
+ embedding: string().optional(),
10838
+ label: string().optional(),
10839
+ alignedCropJpeg: string().optional()
10840
+ });
10841
+ /**
10780
10842
  * Per-camera tunable ranges + defaults. Single source of truth used
10781
10843
  * by both the Zod data schema (validation + default fallback) and
10782
10844
  * the device settings UI (slider min/max/step). Touch one place and
@@ -11032,7 +11094,17 @@ var RunnerLocalMetricsSchema = object({
11032
11094
  avgInferenceTimeMs: number(),
11033
11095
  queueDepth: number()
11034
11096
  });
11035
- 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());
11097
+ 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({
11098
+ handle: FrameHandleSchema,
11099
+ bbox: NativeCropBboxSchema,
11100
+ maxWidth: number().int().positive().optional()
11101
+ }), NativeCropResultSchema.nullable()), method(object({
11102
+ deviceId: number(),
11103
+ frameHandle: FrameHandleSchema.optional(),
11104
+ cropJpeg: string().optional(),
11105
+ parent: DetailParentSchema,
11106
+ steps: array(string()).optional()
11107
+ }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" });
11036
11108
  object({
11037
11109
  detected: boolean(),
11038
11110
  /** Ms epoch of the last detected-true observation. Null if never detected. */
@@ -15070,7 +15142,17 @@ var TrackSchema = object({
15070
15142
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
15071
15143
  totalDistance: number(),
15072
15144
  state: TrackStateSchema,
15073
- active: boolean()
15145
+ active: boolean(),
15146
+ /** Deterministic key-event importance score in [0,1] (server-computed at
15147
+ * track expiry, recomputed on late label). Absent on legacy rows written
15148
+ * before scoring shipped — consumers degrade to absence / compute-on-read. */
15149
+ importance: number().optional(),
15150
+ /** Id of the track's highest-confidence ObjectEvent (its representative
15151
+ * "best" frame). Absent when the track produced no object events. */
15152
+ bestEventId: string().optional(),
15153
+ /** Tag of the importance sub-signal that dominated the score
15154
+ * (identity|dwell|proximity|class|confidence|travel|zone). */
15155
+ importanceReason: string().optional()
15074
15156
  });
15075
15157
  var BaseEventFields = {
15076
15158
  id: string(),
@@ -15135,8 +15217,18 @@ var ObjectEventSchema = object({
15135
15217
  frameHeight: number().optional(),
15136
15218
  /** MediaStore key for the crop attached to this event (if any). */
15137
15219
  mediaKey: string().optional(),
15220
+ /** Design B: MediaStore key of the track's native-resolution key frame (the
15221
+ * best-detection full frame). Resolve via the event-media data-plane
15222
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
15223
+ * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
15224
+ * sources — consumers fall back to `mediaKey` (the tight crop). */
15225
+ keyFrameMediaKey: string().optional(),
15138
15226
  /** Populated by B5 (recording playback URL for this event). */
15139
- mediaUrl: string().optional()
15227
+ mediaUrl: string().optional(),
15228
+ /** The parent track's key-event importance [0,1], propagated to every object
15229
+ * event of the track (so an event row can be sorted by importance without a
15230
+ * track join). Absent on legacy rows / before the track was scored. */
15231
+ importance: number().optional()
15140
15232
  });
15141
15233
  var AudioEventSchema = object({
15142
15234
  ...BaseEventFields,
@@ -15160,7 +15252,8 @@ var MediaFileKindEnum = _enum([
15160
15252
  "fullFrame",
15161
15253
  "fullFrameBoxed",
15162
15254
  "faceCrop",
15163
- "plateCrop"
15255
+ "plateCrop",
15256
+ "keyFrame"
15164
15257
  ]);
15165
15258
  var MediaFileSchema = object({
15166
15259
  key: string(),
@@ -15181,6 +15274,32 @@ var DeviceEventQueryInput = object({
15181
15274
  projection: _enum(["full", "slim"]).optional()
15182
15275
  });
15183
15276
  var ObjectEventQueryInput = DeviceEventQueryInput.extend({ classFilter: string().optional() });
15277
+ var KeyEventQueryInput = object({
15278
+ deviceId: number(),
15279
+ /** Window lower bound (track firstSeen ≥ since). */
15280
+ since: number(),
15281
+ /** Window upper bound (track firstSeen ≤ until). */
15282
+ until: number(),
15283
+ limit: number().int().min(1).max(200).default(50),
15284
+ /** Drop tracks scoring below this importance. */
15285
+ minImportance: number().min(0).max(1).optional(),
15286
+ /** Restrict to a single class (e.g. 'person'). */
15287
+ classFilter: string().optional()
15288
+ });
15289
+ var KeyEventSchema = object({
15290
+ /** The representative event id (the track's best ObjectEvent, else its trackId). */
15291
+ id: string(),
15292
+ trackId: string(),
15293
+ /** Track start time (firstSeen). */
15294
+ timestamp: number(),
15295
+ className: string(),
15296
+ label: string().optional(),
15297
+ importance: number(),
15298
+ /** Highest-confidence ObjectEvent id for the track (empty when none). */
15299
+ bestEventId: string(),
15300
+ /** Track lifetime in ms (lastSeen - firstSeen). */
15301
+ windowMs: number().optional()
15302
+ });
15184
15303
  var TrackedDetectionSchema = object({
15185
15304
  trackId: string(),
15186
15305
  className: string(),
@@ -15210,7 +15329,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
15210
15329
  }), array(TrackSchema).readonly()), method(object({ deviceId: number() }), _void(), {
15211
15330
  kind: "mutation",
15212
15331
  auth: "admin"
15213
- }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({
15332
+ }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(object({
15214
15333
  deviceId: number(),
15215
15334
  since: number(),
15216
15335
  until: number(),
@@ -15977,7 +16096,12 @@ DeviceType.Camera, method(object({
15977
16096
  }), SnapshotImageSchema.nullable()), method(object({ deviceId: number() }), _void(), {
15978
16097
  kind: "mutation",
15979
16098
  auth: "admin"
15980
- });
16099
+ }), systemMethod(object({ deviceIds: array(number()).min(1).max(200) }), array(object({
16100
+ deviceId: number(),
16101
+ lastCapturedAt: number().nullable(),
16102
+ cacheAgeMs: number().nullable(),
16103
+ etag: string().nullable()
16104
+ })));
15981
16105
  /**
15982
16106
  * `sso-bridge` — internal hub-only cap that lets SSO-style auth
15983
16107
  * providers (OIDC, SAML, magic-link, …) mint an HMAC-signed token
@@ -16273,10 +16397,32 @@ method(_void(), array(TurnServerSchema).readonly());
16273
16397
  * b. `finishAuthentication({userId, response})` → server verifies
16274
16398
  * the assertion, bumps the credential counter, returns ok.
16275
16399
  *
16400
+ * 2b. Usernameless (discoverable-credential) authentication — the
16401
+ * passkey IS the primary factor, no password leg:
16402
+ * a. `beginDiscoverableAuthentication({})` → assertion options with
16403
+ * EMPTY `allowCredentials` (the browser offers every resident
16404
+ * passkey it holds for this RP) + `userVerification: 'required'`
16405
+ * (the passkey replaces both factors, so UV is mandatory).
16406
+ * The challenge is stored server-side, NOT bound to any user.
16407
+ * b. `finishDiscoverableAuthentication({response})` → the provider
16408
+ * resolves the credential by the response's credential id,
16409
+ * verifies the assertion against the stored challenge + that
16410
+ * credential's public key/counter, and returns the OWNING
16411
+ * `userId` — the caller (core auth router) mints the session.
16412
+ *
16276
16413
  * 3. Management:
16277
16414
  * - `listPasskeys({userId})` — enumerate user's enrolled credentials.
16278
16415
  * - `removePasskey({userId, credentialId})` — revoke one credential.
16279
16416
  *
16417
+ * 4. Second-factor preference (opt-in, default OFF):
16418
+ * Enrolling a passkey only enables passkey-FIRST sign-in. It is
16419
+ * demanded as a second factor after a password login ONLY when the
16420
+ * user explicitly opts in via `setSecondFactorPreference`.
16421
+ * - `getSecondFactorPreference({userId})` → `{ enabled }` (missing
16422
+ * row ⇒ `enabled: false`).
16423
+ * - `setSecondFactorPreference({userId, enabled})` — persisted by
16424
+ * the providing addon beside its credentials.
16425
+ *
16280
16426
  * Challenges are short-lived (5 min, in-memory). The cap is internal —
16281
16427
  * the admin-ui composes the begin/finish round-trip and never exposes
16282
16428
  * the cap to non-admins.
@@ -16319,6 +16465,17 @@ method(object({
16319
16465
  }), object({ verified: boolean() }), {
16320
16466
  kind: "mutation",
16321
16467
  access: "view"
16468
+ }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
16469
+ kind: "mutation",
16470
+ access: "view"
16471
+ }), method(object({
16472
+ /** AuthenticationResponseJSON from the browser. */
16473
+ response: record(string(), unknown()) }), object({
16474
+ verified: boolean(),
16475
+ userId: string().nullable()
16476
+ }), {
16477
+ kind: "mutation",
16478
+ access: "view"
16322
16479
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
16323
16480
  userId: string(),
16324
16481
  credentialId: string()
@@ -16326,6 +16483,13 @@ method(object({
16326
16483
  kind: "mutation",
16327
16484
  auth: "admin",
16328
16485
  access: "delete"
16486
+ }), method(object({ userId: string() }), object({ enabled: boolean() }), { auth: "admin" }), method(object({
16487
+ userId: string(),
16488
+ enabled: boolean()
16489
+ }), object({ success: literal(true) }), {
16490
+ kind: "mutation",
16491
+ auth: "admin",
16492
+ access: "create"
16329
16493
  });
16330
16494
  /**
16331
16495
  * `videoclips` — the unified, navigable-clip surface for a camera.
@@ -17127,7 +17291,17 @@ var FaceInfoSchema = object({
17127
17291
  recognizedIdentityId: string().optional(),
17128
17292
  identityName: string().optional(),
17129
17293
  assigned: boolean(),
17130
- base64: string().optional()
17294
+ base64: string().optional(),
17295
+ /** Design B: the face bbox (pixel space) on the key frame — lets a detail
17296
+ * view draw the box over the native `keyFrameMediaKey` frame. Absent on
17297
+ * legacy rows written before design B. */
17298
+ faceBbox: BoundingBoxSchema.optional(),
17299
+ /** Design B: MediaStore key of the track's native-resolution key frame.
17300
+ * Fetch the native JPEG via the event-media data-plane
17301
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
17302
+ * track produced no key frame (e.g. native/onboard source) — the UI falls
17303
+ * back to the inline `base64` face crop. */
17304
+ keyFrameMediaKey: string().optional()
17131
17305
  });
17132
17306
  var FaceFilterEnum = _enum([
17133
17307
  "unassigned",
@@ -21246,6 +21420,12 @@ Object.freeze({
21246
21420
  addonId: null,
21247
21421
  access: "view"
21248
21422
  },
21423
+ "pipelineAnalytics.getKeyEvents": {
21424
+ capName: "pipeline-analytics",
21425
+ capScope: "device",
21426
+ addonId: null,
21427
+ access: "view"
21428
+ },
21249
21429
  "pipelineAnalytics.getMotionEvents": {
21250
21430
  capName: "pipeline-analytics",
21251
21431
  capScope: "device",
@@ -21774,12 +21954,24 @@ Object.freeze({
21774
21954
  addonId: null,
21775
21955
  access: "view"
21776
21956
  },
21957
+ "pipelineRunner.getNativeCrop": {
21958
+ capName: "pipeline-runner",
21959
+ capScope: "system",
21960
+ addonId: null,
21961
+ access: "view"
21962
+ },
21777
21963
  "pipelineRunner.reportMotion": {
21778
21964
  capName: "pipeline-runner",
21779
21965
  capScope: "system",
21780
21966
  addonId: null,
21781
21967
  access: "create"
21782
21968
  },
21969
+ "pipelineRunner.runDetailSubtree": {
21970
+ capName: "pipeline-runner",
21971
+ capScope: "system",
21972
+ addonId: null,
21973
+ access: "create"
21974
+ },
21783
21975
  "plateGallery.correctPlateText": {
21784
21976
  capName: "plate-gallery",
21785
21977
  capScope: "system",
@@ -22140,6 +22332,12 @@ Object.freeze({
22140
22332
  addonId: null,
22141
22333
  access: "view"
22142
22334
  },
22335
+ "snapshot.getSnapshotOverview": {
22336
+ capName: "snapshot",
22337
+ capScope: "device",
22338
+ addonId: null,
22339
+ access: "view"
22340
+ },
22143
22341
  "snapshot.invalidateCache": {
22144
22342
  capName: "snapshot",
22145
22343
  capScope: "device",
@@ -22818,6 +23016,12 @@ Object.freeze({
22818
23016
  addonId: null,
22819
23017
  access: "view"
22820
23018
  },
23019
+ "userPasskeys.beginDiscoverableAuthentication": {
23020
+ capName: "user-passkeys",
23021
+ capScope: "system",
23022
+ addonId: null,
23023
+ access: "view"
23024
+ },
22821
23025
  "userPasskeys.beginRegistration": {
22822
23026
  capName: "user-passkeys",
22823
23027
  capScope: "system",
@@ -22830,12 +23034,24 @@ Object.freeze({
22830
23034
  addonId: null,
22831
23035
  access: "view"
22832
23036
  },
23037
+ "userPasskeys.finishDiscoverableAuthentication": {
23038
+ capName: "user-passkeys",
23039
+ capScope: "system",
23040
+ addonId: null,
23041
+ access: "view"
23042
+ },
22833
23043
  "userPasskeys.finishRegistration": {
22834
23044
  capName: "user-passkeys",
22835
23045
  capScope: "system",
22836
23046
  addonId: null,
22837
23047
  access: "create"
22838
23048
  },
23049
+ "userPasskeys.getSecondFactorPreference": {
23050
+ capName: "user-passkeys",
23051
+ capScope: "system",
23052
+ addonId: null,
23053
+ access: "view"
23054
+ },
22839
23055
  "userPasskeys.listPasskeys": {
22840
23056
  capName: "user-passkeys",
22841
23057
  capScope: "system",
@@ -22848,6 +23064,12 @@ Object.freeze({
22848
23064
  addonId: null,
22849
23065
  access: "delete"
22850
23066
  },
23067
+ "userPasskeys.setSecondFactorPreference": {
23068
+ capName: "user-passkeys",
23069
+ capScope: "system",
23070
+ addonId: null,
23071
+ access: "create"
23072
+ },
22851
23073
  "vacuumControl.locate": {
22852
23074
  capName: "vacuum-control",
22853
23075
  capScope: "device",
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-BTuv4hPh.js");
5
+ const require_shared = require("./shared-BL-GGrW8.js");
6
6
  let node_stream = require("node:stream");
7
7
  let webdav = require("webdav");
8
8
  //#region src/providers/webdav/webdav-config-schema.ts
@@ -1,4 +1,4 @@
1
- import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-m1upfQvq.mjs";
1
+ import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-CFMg2pY9.mjs";
2
2
  import { PassThrough } from "node:stream";
3
3
  import { AuthType, createClient } from "webdav";
4
4
  //#region src/providers/webdav/webdav-config-schema.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-remote-storage",
3
- "version": "1.1.21",
3
+ "version": "1.1.23",
4
4
  "description": "Remote storage providers (SFTP, S3, WebDAV) — unifies remote backends behind the storage-provider cap",
5
5
  "keywords": [
6
6
  "camstack",