camstack 1.1.23 → 1.1.25

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.
@@ -14522,7 +14522,7 @@ function date4(params) {
14522
14522
  // ../../node_modules/zod/v4/classic/external.js
14523
14523
  config(en_default());
14524
14524
 
14525
- // ../types/dist/sleep-DJaTV2D7.mjs
14525
+ // ../types/dist/sleep-Baang_XW.mjs
14526
14526
  var WELL_KNOWN_TABS = [
14527
14527
  {
14528
14528
  id: "overview",
@@ -15132,6 +15132,12 @@ function method(input, output, options) {
15132
15132
  timeoutMs: options?.timeoutMs
15133
15133
  };
15134
15134
  }
15135
+ function systemMethod(input, output, options) {
15136
+ return {
15137
+ ...method(input, output, options),
15138
+ systemOnly: true
15139
+ };
15140
+ }
15135
15141
  function event(data) {
15136
15142
  return { data };
15137
15143
  }
@@ -19232,6 +19238,7 @@ var PipelineAddonSchemaSchema = external_exports.object({
19232
19238
  defaultModelId: external_exports.string(),
19233
19239
  defaultModelIdByFormat: external_exports.record(external_exports.string(), external_exports.string()).optional(),
19234
19240
  enabledByDefault: external_exports.boolean().optional(),
19241
+ backfillIntoExistingOverrides: external_exports.boolean().optional(),
19235
19242
  defaultConfidence: external_exports.number(),
19236
19243
  group: external_exports.string().optional(),
19237
19244
  configSchema: external_exports.array(ConfigFieldBridge).readonly().optional()
@@ -19500,7 +19507,15 @@ var pipelineExecutorCapability = {
19500
19507
  image: external_exports.instanceof(Uint8Array).optional(),
19501
19508
  referenceImage: external_exports.string().optional(),
19502
19509
  deviceId: external_exports.number().optional(),
19503
- sessionId: external_exports.string().optional()
19510
+ sessionId: external_exports.string().optional(),
19511
+ /**
19512
+ * Execution plane. 'full' (default) runs the whole tree — benchmark,
19513
+ * reference-image, and detail-subtree calls. 'frame' is the live
19514
+ * per-frame dispatch: ONLY root-plane steps run; crop children
19515
+ * (inputClasses ≠ null) are skipped and served per-track via
19516
+ * pipelineRunner.runDetailSubtree (two-plane design).
19517
+ */
19518
+ plane: external_exports.enum(["full", "frame"]).optional()
19504
19519
  }), PipelineRunResultBridge, { kind: "mutation" }),
19505
19520
  /**
19506
19521
  * Batched run — N raw frames packed into one cap call. The provider
@@ -19671,6 +19686,32 @@ var zonesCapability = {
19671
19686
  */
19672
19687
  runtimeState: external_exports.object({ zones: external_exports.array(ZoneSchema).readonly() })
19673
19688
  };
19689
+ var NativeCropBboxSchema = external_exports.object({
19690
+ x: external_exports.number(),
19691
+ y: external_exports.number(),
19692
+ w: external_exports.number(),
19693
+ h: external_exports.number()
19694
+ });
19695
+ var NativeCropResultSchema = external_exports.object({
19696
+ /** Packed rgb (24-bit) pixels of the crop. */
19697
+ bytes: external_exports.instanceof(Uint8Array),
19698
+ width: external_exports.number().int().positive(),
19699
+ height: external_exports.number().int().positive()
19700
+ });
19701
+ var DetailParentSchema = external_exports.object({
19702
+ bbox: NativeCropBboxSchema,
19703
+ className: external_exports.string()
19704
+ });
19705
+ var DetailResultSchema = external_exports.object({
19706
+ stepId: external_exports.string(),
19707
+ className: external_exports.string(),
19708
+ score: external_exports.number(),
19709
+ /** FRAME-space bbox (already mapped back from crop space). */
19710
+ bbox: NativeCropBboxSchema.optional(),
19711
+ embedding: external_exports.string().optional(),
19712
+ label: external_exports.string().optional(),
19713
+ alignedCropJpeg: external_exports.string().optional()
19714
+ });
19674
19715
  var motionCooldownMsField = {
19675
19716
  min: 0,
19676
19717
  max: 6e4,
@@ -19996,7 +20037,42 @@ var pipelineRunnerCapability = {
19996
20037
  /** All per-camera metrics in one round-trip. */
19997
20038
  getAllCameraMetrics: method(external_exports.void(), external_exports.array(CameraMetricsWithDeviceIdSchema).readonly()),
19998
20039
  /** List the deviceIds currently attached to this runner. */
19999
- getLocalCameras: method(external_exports.void(), external_exports.array(external_exports.number()).readonly())
20040
+ getLocalCameras: method(external_exports.void(), external_exports.array(external_exports.number()).readonly()),
20041
+ /**
20042
+ * Best-effort NATIVE-resolution crop of a retention-ring frame. Given the
20043
+ * `FrameHandle` that rode an inference-result event and a normalized `bbox`,
20044
+ * the runner asks the decode worker still holding that frame's NATIVE
20045
+ * surface to GPU/CPU-crop ONLY the ROI at native res and download just the
20046
+ * crop. Returns `null` on a miss (handle not registered, or the worker's
20047
+ * tiny native-retention ring already evicted the frame) — the caller falls
20048
+ * back to a detection-frame crop. Routed to the frame's owning node by
20049
+ * `handle.nodeId`; NEVER ships a full native frame.
20050
+ */
20051
+ getNativeCrop: method(external_exports.object({
20052
+ handle: FrameHandleSchema,
20053
+ bbox: NativeCropBboxSchema,
20054
+ maxWidth: external_exports.number().int().positive().optional()
20055
+ }), NativeCropResultSchema.nullable()),
20056
+ /**
20057
+ * Two-plane design: run the DETAIL subtree (crop children —
20058
+ * embedding, classifier, refiner steps whose `inputClasses ≠ null`)
20059
+ * for a single tracked detection. The per-frame plane (`runPipeline`
20060
+ * with `plane: 'frame'`) skips crop children entirely; a track-level
20061
+ * caller invokes this per-track, on its own cadence, instead of on
20062
+ * every frame. Takes either a `frameHandle` (shm lease/session —
20063
+ * preferred, zero-copy) or a `cropJpeg` fallback when the lease/
20064
+ * session backing the frame is already gone. `steps` narrows which
20065
+ * configured children to run (default: all configured children for
20066
+ * `parent.className`). Returns `null` when neither frame source is
20067
+ * resolvable (handle evicted and no cropJpeg fallback supplied).
20068
+ */
20069
+ runDetailSubtree: method(external_exports.object({
20070
+ deviceId: external_exports.number(),
20071
+ frameHandle: FrameHandleSchema.optional(),
20072
+ cropJpeg: external_exports.string().optional(),
20073
+ parent: DetailParentSchema,
20074
+ steps: external_exports.array(external_exports.string()).optional()
20075
+ }), external_exports.object({ details: external_exports.array(DetailResultSchema) }).nullable(), { kind: "mutation" })
20000
20076
  }
20001
20077
  };
20002
20078
  var MotionStatusSchema = external_exports.object({
@@ -24985,7 +25061,17 @@ var TrackSchema = external_exports.object({
24985
25061
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
24986
25062
  totalDistance: external_exports.number(),
24987
25063
  state: TrackStateSchema,
24988
- active: external_exports.boolean()
25064
+ active: external_exports.boolean(),
25065
+ /** Deterministic key-event importance score in [0,1] (server-computed at
25066
+ * track expiry, recomputed on late label). Absent on legacy rows written
25067
+ * before scoring shipped — consumers degrade to absence / compute-on-read. */
25068
+ importance: external_exports.number().optional(),
25069
+ /** Id of the track's highest-confidence ObjectEvent (its representative
25070
+ * "best" frame). Absent when the track produced no object events. */
25071
+ bestEventId: external_exports.string().optional(),
25072
+ /** Tag of the importance sub-signal that dominated the score
25073
+ * (identity|dwell|proximity|class|confidence|travel|zone). */
25074
+ importanceReason: external_exports.string().optional()
24989
25075
  });
24990
25076
  var BaseEventFields = {
24991
25077
  id: external_exports.string(),
@@ -25042,8 +25128,18 @@ var ObjectEventSchema = external_exports.object({
25042
25128
  frameHeight: external_exports.number().optional(),
25043
25129
  /** MediaStore key for the crop attached to this event (if any). */
25044
25130
  mediaKey: external_exports.string().optional(),
25131
+ /** Design B: MediaStore key of the track's native-resolution key frame (the
25132
+ * best-detection full frame). Resolve via the event-media data-plane
25133
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
25134
+ * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
25135
+ * sources — consumers fall back to `mediaKey` (the tight crop). */
25136
+ keyFrameMediaKey: external_exports.string().optional(),
25045
25137
  /** Populated by B5 (recording playback URL for this event). */
25046
- mediaUrl: external_exports.string().optional()
25138
+ mediaUrl: external_exports.string().optional(),
25139
+ /** The parent track's key-event importance [0,1], propagated to every object
25140
+ * event of the track (so an event row can be sorted by importance without a
25141
+ * track join). Absent on legacy rows / before the track was scored. */
25142
+ importance: external_exports.number().optional()
25047
25143
  });
25048
25144
  var AudioEventSchema = external_exports.object({
25049
25145
  ...BaseEventFields,
@@ -25067,7 +25163,8 @@ var MediaFileKindEnum = external_exports.enum([
25067
25163
  "fullFrame",
25068
25164
  "fullFrameBoxed",
25069
25165
  "faceCrop",
25070
- "plateCrop"
25166
+ "plateCrop",
25167
+ "keyFrame"
25071
25168
  ]);
25072
25169
  var MediaFileSchema = external_exports.object({
25073
25170
  key: external_exports.string(),
@@ -25088,6 +25185,32 @@ var DeviceEventQueryInput = external_exports.object({
25088
25185
  projection: external_exports.enum(["full", "slim"]).optional()
25089
25186
  });
25090
25187
  var ObjectEventQueryInput = DeviceEventQueryInput.extend({ classFilter: external_exports.string().optional() });
25188
+ var KeyEventQueryInput = external_exports.object({
25189
+ deviceId: external_exports.number(),
25190
+ /** Window lower bound (track firstSeen ≥ since). */
25191
+ since: external_exports.number(),
25192
+ /** Window upper bound (track firstSeen ≤ until). */
25193
+ until: external_exports.number(),
25194
+ limit: external_exports.number().int().min(1).max(200).default(50),
25195
+ /** Drop tracks scoring below this importance. */
25196
+ minImportance: external_exports.number().min(0).max(1).optional(),
25197
+ /** Restrict to a single class (e.g. 'person'). */
25198
+ classFilter: external_exports.string().optional()
25199
+ });
25200
+ var KeyEventSchema = external_exports.object({
25201
+ /** The representative event id (the track's best ObjectEvent, else its trackId). */
25202
+ id: external_exports.string(),
25203
+ trackId: external_exports.string(),
25204
+ /** Track start time (firstSeen). */
25205
+ timestamp: external_exports.number(),
25206
+ className: external_exports.string(),
25207
+ label: external_exports.string().optional(),
25208
+ importance: external_exports.number(),
25209
+ /** Highest-confidence ObjectEvent id for the track (empty when none). */
25210
+ bestEventId: external_exports.string(),
25211
+ /** Track lifetime in ms (lastSeen - firstSeen). */
25212
+ windowMs: external_exports.number().optional()
25213
+ });
25091
25214
  var TrackedDetectionSchema = external_exports.object({
25092
25215
  trackId: external_exports.string(),
25093
25216
  className: external_exports.string(),
@@ -25136,6 +25259,15 @@ var pipelineAnalyticsCapability = {
25136
25259
  getMotionEvents: method(DeviceEventQueryInput, external_exports.array(MotionEventSchema).readonly()),
25137
25260
  getObjectEvents: method(ObjectEventQueryInput, external_exports.array(ObjectEventSchema).readonly()),
25138
25261
  getAudioEvents: method(DeviceEventQueryInput, external_exports.array(AudioEventSchema).readonly()),
25262
+ /**
25263
+ * Importance-ranked highlights for a device+window. Queries completed
25264
+ * tracks by (deviceId, firstSeen ∈ [since,until]), scores each (or reuses
25265
+ * the persisted score), filters by minImportance/classFilter, orders by
25266
+ * importance desc, and returns up to `limit` compact key events mapped to
25267
+ * each track's best event. Legacy tracks lacking a persisted score are
25268
+ * scored on-read (no write). Degrades to `[]` on error.
25269
+ */
25270
+ getKeyEvents: method(KeyEventQueryInput, external_exports.array(KeyEventSchema).readonly()),
25139
25271
  /** Server-side bucketed event counts for the 24-hour timeline.
25140
25272
  * Returns one entry per non-empty bucket; empty buckets are omitted. */
25141
25273
  getEventDensity: method(external_exports.object({
@@ -26102,7 +26234,20 @@ var snapshotCapability = {
26102
26234
  invalidateCache: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.void(), {
26103
26235
  kind: "mutation",
26104
26236
  auth: "admin"
26105
- })
26237
+ }),
26238
+ /**
26239
+ * Cache-only batch overview — answers from the wrapper's in-memory cache in
26240
+ * O(n) and NEVER triggers a capture. Lets a grid skip requesting images for
26241
+ * devices that never produced a frame, and gives it an ETag per device for
26242
+ * conditional (304-able) image fetches. `lastCapturedAt`/`cacheAgeMs`/`etag`
26243
+ * are null for a device with no cached frame.
26244
+ */
26245
+ getSnapshotOverview: systemMethod(external_exports.object({ deviceIds: external_exports.array(external_exports.number()).min(1).max(200) }), external_exports.array(external_exports.object({
26246
+ deviceId: external_exports.number(),
26247
+ lastCapturedAt: external_exports.number().nullable(),
26248
+ cacheAgeMs: external_exports.number().nullable(),
26249
+ etag: external_exports.string().nullable()
26250
+ })))
26106
26251
  },
26107
26252
  status: {
26108
26253
  schema: SnapshotStatusSchema,
@@ -27500,7 +27645,17 @@ var FaceInfoSchema = external_exports.object({
27500
27645
  recognizedIdentityId: external_exports.string().optional(),
27501
27646
  identityName: external_exports.string().optional(),
27502
27647
  assigned: external_exports.boolean(),
27503
- base64: external_exports.string().optional()
27648
+ base64: external_exports.string().optional(),
27649
+ /** Design B: the face bbox (pixel space) on the key frame — lets a detail
27650
+ * view draw the box over the native `keyFrameMediaKey` frame. Absent on
27651
+ * legacy rows written before design B. */
27652
+ faceBbox: BoundingBoxSchema.optional(),
27653
+ /** Design B: MediaStore key of the track's native-resolution key frame.
27654
+ * Fetch the native JPEG via the event-media data-plane
27655
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
27656
+ * track produced no key frame (e.g. native/onboard source) — the UI falls
27657
+ * back to the inline `base64` face crop. */
27658
+ keyFrameMediaKey: external_exports.string().optional()
27504
27659
  });
27505
27660
  var FaceFilterEnum = external_exports.enum([
27506
27661
  "unassigned",
@@ -31888,6 +32043,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
31888
32043
  addonId: null,
31889
32044
  access: "view"
31890
32045
  },
32046
+ "pipelineAnalytics.getKeyEvents": {
32047
+ capName: "pipeline-analytics",
32048
+ capScope: "device",
32049
+ addonId: null,
32050
+ access: "view"
32051
+ },
31891
32052
  "pipelineAnalytics.getMotionEvents": {
31892
32053
  capName: "pipeline-analytics",
31893
32054
  capScope: "device",
@@ -32416,12 +32577,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
32416
32577
  addonId: null,
32417
32578
  access: "view"
32418
32579
  },
32580
+ "pipelineRunner.getNativeCrop": {
32581
+ capName: "pipeline-runner",
32582
+ capScope: "system",
32583
+ addonId: null,
32584
+ access: "view"
32585
+ },
32419
32586
  "pipelineRunner.reportMotion": {
32420
32587
  capName: "pipeline-runner",
32421
32588
  capScope: "system",
32422
32589
  addonId: null,
32423
32590
  access: "create"
32424
32591
  },
32592
+ "pipelineRunner.runDetailSubtree": {
32593
+ capName: "pipeline-runner",
32594
+ capScope: "system",
32595
+ addonId: null,
32596
+ access: "create"
32597
+ },
32425
32598
  "plateGallery.correctPlateText": {
32426
32599
  capName: "plate-gallery",
32427
32600
  capScope: "system",
@@ -32782,6 +32955,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
32782
32955
  addonId: null,
32783
32956
  access: "view"
32784
32957
  },
32958
+ "snapshot.getSnapshotOverview": {
32959
+ capName: "snapshot",
32960
+ capScope: "device",
32961
+ addonId: null,
32962
+ access: "view"
32963
+ },
32785
32964
  "snapshot.invalidateCache": {
32786
32965
  capName: "snapshot",
32787
32966
  capScope: "device",
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runDiscover
4
- } from "./chunk-ODEV2JIB.js";
4
+ } from "./chunk-F4PHL6CW.js";
5
5
  import "./chunk-K3NQKI34.js";
6
6
 
7
7
  // src/cli.ts
@@ -1079,7 +1079,7 @@ function isUnknown(_value) {
1079
1079
  return true;
1080
1080
  }
1081
1081
  async function resolveServerInteractive(presetNamespace) {
1082
- const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-VNCOKFC2.js");
1082
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-BDNJGQ2G.js");
1083
1083
  if (presetNamespace) {
1084
1084
  const spinner4 = clack.spinner();
1085
1085
  spinner4.start(`Discovering hub on LAN (namespace "${presetNamespace}")`);
@@ -5,7 +5,7 @@ import {
5
5
  filterHubNodes,
6
6
  resolveHubFromDiscovered,
7
7
  runDiscover
8
- } from "./chunk-ODEV2JIB.js";
8
+ } from "./chunk-F4PHL6CW.js";
9
9
  import "./chunk-K3NQKI34.js";
10
10
  export {
11
11
  DEFAULT_HUB_HTTPS_PORT,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "camstack",
3
- "version": "1.1.23",
3
+ "version": "1.1.25",
4
4
  "description": "CLI tool for managing and running CamStack server",
5
5
  "keywords": [
6
6
  "camstack",