camstack 1.2.39 → 1.2.40

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-B8EIZt4h.mjs
14525
+ // ../types/dist/sleep-Cs9MWLcT.mjs
14526
14526
  var WELL_KNOWN_TABS = [
14527
14527
  {
14528
14528
  id: "overview",
@@ -15989,6 +15989,13 @@ var ModelVariantGroupSchema = external_exports.object({
15989
15989
  */
15990
15990
  resolution: external_exports.number().int().positive().optional()
15991
15991
  });
15992
+ var MODEL_PROVIDER_IDS = [
15993
+ "camstack",
15994
+ "frigate",
15995
+ "scrypted",
15996
+ "custom"
15997
+ ];
15998
+ var ModelProviderIdSchema = external_exports.enum(MODEL_PROVIDER_IDS);
15992
15999
  var ModelCatalogEntrySchema = external_exports.object({
15993
16000
  id: external_exports.string(),
15994
16001
  name: external_exports.string(),
@@ -16086,6 +16093,12 @@ var ModelCatalogEntrySchema = external_exports.object({
16086
16093
  */
16087
16094
  group: ModelVariantGroupSchema.optional(),
16088
16095
  /**
16096
+ * Catalog source for the pipeline stepper's provider-first picker. Absent on
16097
+ * built-in CamStack entries (treated as `camstack`) and on registry rows
16098
+ * persisted before this field existed (`inferModelProvider` fills those).
16099
+ */
16100
+ provider: ModelProviderIdSchema.optional(),
16101
+ /**
16089
16102
  * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
16090
16103
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
16091
16104
  * labels already ARE the CamStack macros (Scrypted identity map).
@@ -22757,14 +22770,22 @@ var NcOccupancyConditionSchema = external_exports.object({
22757
22770
  sustainSeconds: external_exports.number().int().min(0).max(3600).default(15)
22758
22771
  });
22759
22772
  var NcAudioConditionSchema = external_exports.object({
22760
- /** LABEL MODE: audio macro labels. Present ⇒ fires on the first labelled frame. */
22773
+ /** LABEL MODE: audio macro labels. Present ⇒ count-in-window confirm. */
22761
22774
  labels: external_exports.array(external_exports.string().min(1)).min(1).optional(),
22762
22775
  /** LEVEL MODE: floor in dBFS (negative-going, `0` = full scale). */
22763
22776
  dbThreshold: external_exports.number().min(-96).max(0).optional(),
22764
22777
  /** LEVEL MODE ONLY: percentage of the window's samples that must be hits (1–100). */
22765
22778
  hitPercent: external_exports.number().int().min(1).max(100).default(60),
22766
22779
  /** LEVEL MODE ONLY: length of the sampling window in seconds. */
22767
- samplingSeconds: external_exports.number().int().min(1).max(300).default(10)
22780
+ samplingSeconds: external_exports.number().int().min(1).max(300).default(10),
22781
+ /**
22782
+ * LABEL MODE: how many labelled frames must land inside
22783
+ * {@link NcAudioConditionSchema.shape.confirmWindowSec} before dispatch.
22784
+ * Absent ⇒ 2 (the matcher default). `1` is first-frame fire.
22785
+ */
22786
+ confirmHits: external_exports.number().int().min(1).max(20).optional(),
22787
+ /** LABEL MODE: the window those frames must share, in seconds. Absent ⇒ 5. */
22788
+ confirmWindowSec: external_exports.number().int().min(1).max(60).optional()
22768
22789
  });
22769
22790
  var NcCrossingSchema = external_exports.enum([
22770
22791
  "enter",
@@ -24582,6 +24603,46 @@ var RecentTracksPageSchema = external_exports.object({
24582
24603
  /** Cursor for the next page, or null when this page is the last. */
24583
24604
  nextCursor: external_exports.string().nullable()
24584
24605
  });
24606
+ var LIST_GROUPS_DEFAULT_LIMIT = 40;
24607
+ var LIST_GROUPS_MAX_LIMIT = 100;
24608
+ var AnalyticsGroupRecordSchema = external_exports.object({
24609
+ id: external_exports.string(),
24610
+ deviceId: external_exports.number().int(),
24611
+ openedAt: external_exports.number().int(),
24612
+ closedAt: external_exports.number().int(),
24613
+ timestamp: external_exports.number().int(),
24614
+ memberCount: external_exports.number().int(),
24615
+ memberTrackIds: external_exports.array(external_exports.string()).readonly(),
24616
+ className: external_exports.string(),
24617
+ classes: external_exports.array(external_exports.string()).readonly(),
24618
+ /** Relative event-media path, or null when the group has no picture yet. */
24619
+ mediaUrl: external_exports.string().nullable(),
24620
+ singleton: external_exports.boolean()
24621
+ });
24622
+ var AnalyticsGroupMemberSchema = external_exports.object({
24623
+ trackId: external_exports.string(),
24624
+ deviceId: external_exports.number().int(),
24625
+ className: external_exports.string(),
24626
+ firstSeen: external_exports.number().int(),
24627
+ lastSeen: external_exports.number().int(),
24628
+ mediaUrl: external_exports.string().nullable()
24629
+ });
24630
+ var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: external_exports.array(AnalyticsGroupMemberSchema).readonly() });
24631
+ var ListGroupsQueryInput = external_exports.object({
24632
+ /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
24633
+ deviceIds: external_exports.array(external_exports.number()),
24634
+ /** Window lower bound on `closedAt` (inclusive). */
24635
+ since: external_exports.number().optional(),
24636
+ /** Window upper bound on `openedAt` (inclusive). */
24637
+ until: external_exports.number().optional(),
24638
+ limit: external_exports.number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
24639
+ /** Opaque continuation cursor from a previous page's `nextCursor`. */
24640
+ cursor: external_exports.string().optional()
24641
+ });
24642
+ var ListGroupsPageSchema = external_exports.object({
24643
+ groups: external_exports.array(AnalyticsGroupRecordSchema).readonly(),
24644
+ nextCursor: external_exports.string().nullable()
24645
+ });
24585
24646
  var KeyEventQueryInput = external_exports.object({
24586
24647
  deviceId: external_exports.number(),
24587
24648
  /** Window lower bound (track firstSeen ≥ since). */
@@ -24657,7 +24718,9 @@ var TrackCascadeCountsSchema = external_exports.object({
24657
24718
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
24658
24719
  plates: external_exports.number().int(),
24659
24720
  /** Per-track CLIP search vectors removed (best-effort). */
24660
- embeddings: external_exports.number().int()
24721
+ embeddings: external_exports.number().int(),
24722
+ /** Group membership + group rows removed with their last member (best-effort). */
24723
+ groups: external_exports.number().int()
24661
24724
  });
24662
24725
  var DiskReconcileCountsSchema = external_exports.object({
24663
24726
  mediaDropped: external_exports.number().int(),
@@ -24799,6 +24862,16 @@ var pipelineAnalyticsCapability = {
24799
24862
  * are not included (same contract as `listTracks`).
24800
24863
  */
24801
24864
  listRecentTracks: method(RecentTracksQueryInput, RecentTracksPageSchema),
24865
+ /**
24866
+ * Batched co-moving group listing — the Groups feed. Same merge/cursor
24867
+ * contract as {@link listRecentTracks}. A group is a sealed partition of
24868
+ * one session; `getGroup` is the detail with members.
24869
+ */
24870
+ listGroups: method(ListGroupsQueryInput, ListGroupsPageSchema),
24871
+ getGroup: method(external_exports.object({
24872
+ deviceId: external_exports.number(),
24873
+ groupId: external_exports.string().min(1)
24874
+ }), AnalyticsGroupDetailSchema.nullable()),
24802
24875
  clearTracks: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.void(), {
24803
24876
  kind: "mutation",
24804
24877
  auth: "admin"
@@ -25480,7 +25553,8 @@ var PipelineModelOptionSchema = external_exports.object({
25480
25553
  sizeMB: external_exports.number()
25481
25554
  })),
25482
25555
  group: ModelVariantGroupSchema.optional(),
25483
- legacy: external_exports.boolean().optional()
25556
+ legacy: external_exports.boolean().optional(),
25557
+ provider: ModelProviderIdSchema.optional()
25484
25558
  });
25485
25559
  var ConfigFieldBridge = external_exports.custom();
25486
25560
  var PipelineAddonSchemaSchema = external_exports.object({
@@ -33934,7 +34008,12 @@ var PlateInfoSchema = external_exports.object({
33934
34008
  plateBbox: BoundingBoxSchema.optional(),
33935
34009
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
33936
34010
  keyFrameMediaKey: external_exports.string().optional(),
33937
- base64: external_exports.string().optional()
34011
+ base64: external_exports.string().optional(),
34012
+ /**
34013
+ * Same crop as a data-plane URL. `getPlateByTrack` returns this and
34014
+ * never inlines JPEG; `listPlates` still inlines for the admin-ui.
34015
+ */
34016
+ cropUrl: external_exports.string().optional()
33938
34017
  });
33939
34018
  var MediaFileLiteSchema = external_exports.object({
33940
34019
  key: external_exports.string(),
@@ -39963,6 +40042,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
39963
40042
  addonId: null,
39964
40043
  access: "view"
39965
40044
  },
40045
+ "pipelineAnalytics.getGroup": {
40046
+ capName: "pipeline-analytics",
40047
+ capScope: "device",
40048
+ addonId: null,
40049
+ access: "view"
40050
+ },
39966
40051
  "pipelineAnalytics.getKeyEvents": {
39967
40052
  capName: "pipeline-analytics",
39968
40053
  capScope: "device",
@@ -40047,6 +40132,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
40047
40132
  addonId: null,
40048
40133
  access: "view"
40049
40134
  },
40135
+ "pipelineAnalytics.listGroups": {
40136
+ capName: "pipeline-analytics",
40137
+ capScope: "device",
40138
+ addonId: null,
40139
+ access: "view"
40140
+ },
40050
40141
  "pipelineAnalytics.listOpsLog": {
40051
40142
  capName: "pipeline-analytics",
40052
40143
  capScope: "device",
@@ -43466,6 +43557,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
43466
43557
  form: "single",
43467
43558
  optional: false
43468
43559
  }],
43560
+ "pipelineAnalytics.getGroup": [{
43561
+ name: "deviceId",
43562
+ form: "single",
43563
+ optional: false
43564
+ }],
43469
43565
  "pipelineAnalytics.getKeyEvents": [{
43470
43566
  name: "deviceId",
43471
43567
  form: "single",
@@ -43521,6 +43617,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
43521
43617
  form: "array",
43522
43618
  optional: false
43523
43619
  }],
43620
+ "pipelineAnalytics.listGroups": [{
43621
+ name: "deviceIds",
43622
+ form: "array",
43623
+ optional: false
43624
+ }],
43524
43625
  "pipelineAnalytics.listOpsLog": [{
43525
43626
  name: "deviceId",
43526
43627
  form: "single",
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runDiscover
4
- } from "./chunk-VGIPYXDI.js";
4
+ } from "./chunk-QYPK2MRI.js";
5
5
  import "./chunk-LMMQX4CK.js";
6
6
 
7
7
  // src/cli.ts
@@ -38,7 +38,7 @@ async function runServe(args) {
38
38
  ...typeof values.data === "string" ? { data: values.data } : {}
39
39
  };
40
40
  Object.assign(process.env, buildServeEnv(opts));
41
- await import("./launcher-ZGFW4X34.js");
41
+ await import("./launcher-WS2IUVTL.js");
42
42
  }
43
43
 
44
44
  // src/commands/agent.ts
@@ -83,7 +83,7 @@ async function runAgent(args) {
83
83
  ...typeof values.port === "string" ? { port: values.port } : {}
84
84
  };
85
85
  Object.assign(process.env, buildAgentEnv(opts));
86
- await import("./launcher-ZGFW4X34.js");
86
+ await import("./launcher-WS2IUVTL.js");
87
87
  }
88
88
 
89
89
  // src/commands/setup.ts
@@ -1130,7 +1130,7 @@ function isUnknown(_value) {
1130
1130
  return true;
1131
1131
  }
1132
1132
  async function resolveServerInteractive(presetNamespace) {
1133
- const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-PWDC46ET.js");
1133
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-HFSH57RG.js");
1134
1134
  if (presetNamespace) {
1135
1135
  const spinner4 = clack.spinner();
1136
1136
  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-VGIPYXDI.js";
8
+ } from "./chunk-QYPK2MRI.js";
9
9
  import "./chunk-LMMQX4CK.js";
10
10
  export {
11
11
  DEFAULT_HUB_HTTPS_PORT,