camstack 1.1.30 → 1.1.32

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.
@@ -687,9 +687,9 @@ function assertNever(_x) {
687
687
  }
688
688
  function assert(_) {
689
689
  }
690
- function getEnumValues(entries) {
691
- const numericValues = Object.values(entries).filter((v) => typeof v === "number");
692
- const values = Object.entries(entries).filter(([k, _]) => numericValues.indexOf(+k) === -1).map(([_, v]) => v);
690
+ function getEnumValues(entries2) {
691
+ const numericValues = Object.values(entries2).filter((v) => typeof v === "number");
692
+ const values = Object.entries(entries2).filter(([k, _]) => numericValues.indexOf(+k) === -1).map(([_, v]) => v);
693
693
  return values;
694
694
  }
695
695
  function joinValues(array2, separator = "|") {
@@ -1325,12 +1325,12 @@ var $ZodRealError = $constructor("$ZodError", initializer, { Parent: Error });
1325
1325
  function flattenError(error51, mapper = (issue2) => issue2.message) {
1326
1326
  const fieldErrors = {};
1327
1327
  const formErrors = [];
1328
- for (const sub of error51.issues) {
1329
- if (sub.path.length > 0) {
1330
- fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];
1331
- fieldErrors[sub.path[0]].push(mapper(sub));
1328
+ for (const sub2 of error51.issues) {
1329
+ if (sub2.path.length > 0) {
1330
+ fieldErrors[sub2.path[0]] = fieldErrors[sub2.path[0]] || [];
1331
+ fieldErrors[sub2.path[0]].push(mapper(sub2));
1332
1332
  } else {
1333
- formErrors.push(mapper(sub));
1333
+ formErrors.push(mapper(sub2));
1334
1334
  }
1335
1335
  }
1336
1336
  return { formErrors, fieldErrors };
@@ -11149,18 +11149,18 @@ function _set(Class2, valueType, params) {
11149
11149
  }
11150
11150
  // @__NO_SIDE_EFFECTS__
11151
11151
  function _enum(Class2, values, params) {
11152
- const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values;
11152
+ const entries2 = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values;
11153
11153
  return new Class2({
11154
11154
  type: "enum",
11155
- entries,
11155
+ entries: entries2,
11156
11156
  ...normalizeParams(params)
11157
11157
  });
11158
11158
  }
11159
11159
  // @__NO_SIDE_EFFECTS__
11160
- function _nativeEnum(Class2, entries, params) {
11160
+ function _nativeEnum(Class2, entries2, params) {
11161
11161
  return new Class2({
11162
11162
  type: "enum",
11163
- entries,
11163
+ entries: entries2,
11164
11164
  ...normalizeParams(params)
11165
11165
  });
11166
11166
  }
@@ -13618,17 +13618,17 @@ var ZodEnum = /* @__PURE__ */ $constructor("ZodEnum", (inst, def) => {
13618
13618
  };
13619
13619
  });
13620
13620
  function _enum2(values, params) {
13621
- const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values;
13621
+ const entries2 = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values;
13622
13622
  return new ZodEnum({
13623
13623
  type: "enum",
13624
- entries,
13624
+ entries: entries2,
13625
13625
  ...util_exports.normalizeParams(params)
13626
13626
  });
13627
13627
  }
13628
- function nativeEnum(entries, params) {
13628
+ function nativeEnum(entries2, params) {
13629
13629
  return new ZodEnum({
13630
13630
  type: "enum",
13631
- entries,
13631
+ entries: entries2,
13632
13632
  ...util_exports.normalizeParams(params)
13633
13633
  });
13634
13634
  }
@@ -15818,6 +15818,160 @@ var DEFAULT_RETENTION = {
15818
15818
  };
15819
15819
  var HF_REPO = "camstack/camstack-models";
15820
15820
  var HF_BASE_URL = `https://huggingface.co/${HF_REPO}/resolve/main`;
15821
+ var COCO_TO_MACRO = {
15822
+ mapping: {
15823
+ person: "person",
15824
+ bicycle: "vehicle",
15825
+ car: "vehicle",
15826
+ motorcycle: "vehicle",
15827
+ airplane: "vehicle",
15828
+ bus: "vehicle",
15829
+ train: "vehicle",
15830
+ truck: "vehicle",
15831
+ boat: "vehicle",
15832
+ bird: "animal",
15833
+ cat: "animal",
15834
+ dog: "animal",
15835
+ horse: "animal",
15836
+ sheep: "animal",
15837
+ cow: "animal",
15838
+ elephant: "animal",
15839
+ bear: "animal",
15840
+ zebra: "animal",
15841
+ giraffe: "animal",
15842
+ suitcase: "package",
15843
+ backpack: "package",
15844
+ handbag: "package"
15845
+ },
15846
+ preserveOriginal: false
15847
+ };
15848
+ var AUDIO_MACRO_LABELS = [
15849
+ {
15850
+ id: "speech",
15851
+ name: "Speech",
15852
+ icon: "\u{1F5E3}\uFE0F"
15853
+ },
15854
+ {
15855
+ id: "scream",
15856
+ name: "Scream / Shout",
15857
+ icon: "\u{1F631}"
15858
+ },
15859
+ {
15860
+ id: "crying",
15861
+ name: "Crying / Baby",
15862
+ icon: "\u{1F622}"
15863
+ },
15864
+ {
15865
+ id: "laughter",
15866
+ name: "Laughter",
15867
+ icon: "\u{1F602}"
15868
+ },
15869
+ {
15870
+ id: "music",
15871
+ name: "Music",
15872
+ icon: "\u{1F3B5}"
15873
+ },
15874
+ {
15875
+ id: "dog",
15876
+ name: "Dog",
15877
+ icon: "\u{1F415}"
15878
+ },
15879
+ {
15880
+ id: "cat",
15881
+ name: "Cat",
15882
+ icon: "\u{1F408}"
15883
+ },
15884
+ {
15885
+ id: "bird",
15886
+ name: "Bird",
15887
+ icon: "\u{1F426}"
15888
+ },
15889
+ {
15890
+ id: "animal",
15891
+ name: "Animal (other)",
15892
+ icon: "\u{1F43E}"
15893
+ },
15894
+ {
15895
+ id: "alarm",
15896
+ name: "Alarm / Siren",
15897
+ icon: "\u{1F6A8}"
15898
+ },
15899
+ {
15900
+ id: "doorbell",
15901
+ name: "Doorbell / Knock",
15902
+ icon: "\u{1F514}"
15903
+ },
15904
+ {
15905
+ id: "glass_breaking",
15906
+ name: "Glass Breaking",
15907
+ icon: "\u{1F4A5}"
15908
+ },
15909
+ {
15910
+ id: "gunshot",
15911
+ name: "Gunshot / Explosion",
15912
+ icon: "\u{1F4A3}"
15913
+ },
15914
+ {
15915
+ id: "vehicle",
15916
+ name: "Vehicle",
15917
+ icon: "\u{1F697}"
15918
+ },
15919
+ {
15920
+ id: "siren",
15921
+ name: "Emergency Siren",
15922
+ icon: "\u{1F691}"
15923
+ },
15924
+ {
15925
+ id: "fire",
15926
+ name: "Fire / Smoke",
15927
+ icon: "\u{1F525}"
15928
+ },
15929
+ {
15930
+ id: "water",
15931
+ name: "Water",
15932
+ icon: "\u{1F4A7}"
15933
+ },
15934
+ {
15935
+ id: "wind",
15936
+ name: "Wind / Weather",
15937
+ icon: "\u{1F32C}\uFE0F"
15938
+ },
15939
+ {
15940
+ id: "door",
15941
+ name: "Door",
15942
+ icon: "\u{1F6AA}"
15943
+ },
15944
+ {
15945
+ id: "footsteps",
15946
+ name: "Footsteps",
15947
+ icon: "\u{1F463}"
15948
+ },
15949
+ {
15950
+ id: "crowd",
15951
+ name: "Crowd / Chatter",
15952
+ icon: "\u{1F465}"
15953
+ },
15954
+ {
15955
+ id: "telephone",
15956
+ name: "Telephone",
15957
+ icon: "\u{1F4DE}"
15958
+ },
15959
+ {
15960
+ id: "engine",
15961
+ name: "Engine / Motor",
15962
+ icon: "\u2699\uFE0F"
15963
+ },
15964
+ {
15965
+ id: "tools",
15966
+ name: "Tools / Construction",
15967
+ icon: "\u{1F528}"
15968
+ },
15969
+ {
15970
+ id: "silence",
15971
+ name: "Silence",
15972
+ icon: "\u{1F92B}"
15973
+ }
15974
+ ];
15821
15975
  var YAMNET_TO_MACRO = {
15822
15976
  mapping: {
15823
15977
  Speech: "speech",
@@ -16083,6 +16237,102 @@ var APPLE_SA_TO_MACRO = {
16083
16237
  var _macroLookup = /* @__PURE__ */ new Map();
16084
16238
  for (const [k, v] of Object.entries(YAMNET_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
16085
16239
  for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
16240
+ var TAXONOMY_COLORS = {
16241
+ motion: "#f59e0b",
16242
+ audio: "#06b6d4",
16243
+ person: "#22c55e",
16244
+ vehicle: "#3b82f6",
16245
+ animal: "#f97316",
16246
+ package: "#a855f7",
16247
+ sensor: "#8b5cf6",
16248
+ control: "#10b981",
16249
+ genericDetection: "#64748b"
16250
+ };
16251
+ var DETECTION_SUB_COLORS = {
16252
+ car: "#f59e0b",
16253
+ truck: "#d97706",
16254
+ bus: "#b45309",
16255
+ motorcycle: "#eab308",
16256
+ bicycle: "#ca8a04",
16257
+ airplane: "#60a5fa",
16258
+ boat: "#2563eb",
16259
+ train: "#1d4ed8",
16260
+ bird: "#14b8a6",
16261
+ dog: "#84cc16",
16262
+ cat: "#f97316",
16263
+ horse: "#a16207",
16264
+ sheep: "#a3a3a3",
16265
+ cow: "#78716c",
16266
+ elephant: "#6b7280",
16267
+ bear: "#7c2d12",
16268
+ zebra: "#404040",
16269
+ giraffe: "#d4a373"
16270
+ };
16271
+ function titleCase(id) {
16272
+ return id.split(/[-_ ]/).filter((p) => p.length > 0).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join(" ");
16273
+ }
16274
+ var entries = /* @__PURE__ */ new Map();
16275
+ function macro(kind, category, color, iconId, label) {
16276
+ entries.set(kind, {
16277
+ kind,
16278
+ parentKind: null,
16279
+ level: "macro",
16280
+ category,
16281
+ color,
16282
+ iconId,
16283
+ labelKey: `eventKind.${kind}`,
16284
+ label
16285
+ });
16286
+ }
16287
+ function sub(kind, parentKind, category, color, iconId, label) {
16288
+ entries.set(kind, {
16289
+ kind,
16290
+ parentKind,
16291
+ level: "sub",
16292
+ category,
16293
+ color,
16294
+ iconId,
16295
+ labelKey: `eventKind.${kind}`,
16296
+ label
16297
+ });
16298
+ }
16299
+ macro("motion", "motion", TAXONOMY_COLORS.motion, "motion", "Motion");
16300
+ macro("audio", "audio", TAXONOMY_COLORS.audio, "audio", "Audio");
16301
+ macro("person", "detection", TAXONOMY_COLORS.person, "person", "Person");
16302
+ macro("vehicle", "detection", TAXONOMY_COLORS.vehicle, "vehicle", "Vehicle");
16303
+ macro("animal", "detection", TAXONOMY_COLORS.animal, "animal", "Animal");
16304
+ macro("package", "package", TAXONOMY_COLORS.package, "package", "Package");
16305
+ macro("sensor", "sensor", TAXONOMY_COLORS.sensor, "sensor", "Sensor");
16306
+ macro("control", "control", TAXONOMY_COLORS.control, "control", "Control");
16307
+ for (const [cocoClass, macroClass] of Object.entries(COCO_TO_MACRO.mapping)) {
16308
+ if (macroClass !== "vehicle" && macroClass !== "animal") continue;
16309
+ if (entries.has(cocoClass)) continue;
16310
+ sub(cocoClass, macroClass, "detection", DETECTION_SUB_COLORS[cocoClass] ?? TAXONOMY_COLORS.genericDetection, cocoClass, titleCase(cocoClass));
16311
+ }
16312
+ sub("package-delivered", "package", "package", TAXONOMY_COLORS.package, "package", "Package delivered");
16313
+ sub("package-picked-up", "package", "package", TAXONOMY_COLORS.package, "package", "Package picked up");
16314
+ sub("contact", "sensor", "sensor", "#f59e0b", "door", "Contact");
16315
+ sub("motion-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "pir", "Motion sensor");
16316
+ sub("smoke", "sensor", "sensor", "#ef4444", "smoke", "Smoke");
16317
+ sub("flood", "sensor", "sensor", "#3b82f6", "water", "Water leak");
16318
+ sub("gas", "sensor", "sensor", "#ef4444", "gas", "Gas");
16319
+ sub("carbon-monoxide", "sensor", "sensor", "#dc2626", "smoke", "Carbon monoxide");
16320
+ sub("vibration", "sensor", "sensor", "#eab308", "vibration", "Vibration");
16321
+ sub("tamper", "sensor", "sensor", "#f97316", "tamper", "Tamper");
16322
+ sub("presence", "sensor", "sensor", "#22c55e", "presence", "Presence");
16323
+ sub("enum-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "generic", "Sensor state");
16324
+ sub("device-event", "sensor", "sensor", "#10b981", "button", "Device event");
16325
+ sub("lock", "control", "control", "#0ea5e9", "lock", "Lock");
16326
+ sub("switch", "control", "control", TAXONOMY_COLORS.control, "switch", "Switch");
16327
+ sub("siren", "control", "control", "#dc2626", "siren", "Siren");
16328
+ sub("button", "control", "control", "#10b981", "button", "Button");
16329
+ sub("doorbell", "control", "control", "#a855f7", "doorbell", "Doorbell");
16330
+ for (const l of AUDIO_MACRO_LABELS) {
16331
+ const kind = `audio-${l.id}`;
16332
+ if (entries.has(kind)) continue;
16333
+ sub(kind, "audio", "audio", TAXONOMY_COLORS.audio, kind, l.name);
16334
+ }
16335
+ var EVENT_TAXONOMY = Object.freeze(Object.fromEntries(entries));
16086
16336
  var ExpressionParseError = class extends Error {
16087
16337
  position;
16088
16338
  constructor(message, position) {
@@ -25655,17 +25905,29 @@ var EventKindCategorySchema = external_exports.enum([
25655
25905
  "audio",
25656
25906
  "detection",
25657
25907
  "sensor",
25908
+ "control",
25658
25909
  "custom",
25659
25910
  "package"
25660
25911
  ]);
25912
+ var EventKindLevelSchema = external_exports.enum(["macro", "sub"]);
25661
25913
  var EventKindDescriptorSchema = external_exports.object({
25662
- /** Stable kind id (e.g. 'motion', 'person', 'contact'). */
25914
+ /** Stable kind id (e.g. 'motion', 'vehicle', 'car', 'lock'). */
25663
25915
  kind: external_exports.string(),
25916
+ /** i18n key resolved on the UI side; `label` is the English fallback. */
25917
+ labelKey: external_exports.string(),
25918
+ /** English fallback label (kept for clients that don't translate). */
25664
25919
  label: external_exports.string(),
25665
25920
  /** Hex color for timeline/legend rendering. */
25666
25921
  color: external_exports.string(),
25922
+ /** Dictionary id → lucide component on the UI side. */
25923
+ iconId: external_exports.string(),
25924
+ /** Legacy closed-vocab glyph — fallback for `iconId`. */
25667
25925
  icon: EventKindIconSchema,
25668
25926
  category: EventKindCategorySchema,
25927
+ /** Macro parent for this kind ('car' → 'vehicle'); null for a macro. */
25928
+ parentKind: external_exports.string().nullable(),
25929
+ /** Derived from `parentKind`, explicit for the client tree. */
25930
+ level: EventKindLevelSchema,
25669
25931
  /** Which cap + device contributes this kind. For built-ins the camera
25670
25932
  * itself; for sensor kinds the LINKED source device. */
25671
25933
  source: external_exports.object({
@@ -25714,11 +25976,14 @@ var TrackAudioLabelSchema = external_exports.object({
25714
25976
  firstAt: external_exports.number(),
25715
25977
  lastAt: external_exports.number()
25716
25978
  });
25979
+ var TrackSourceSchema = external_exports.enum(["pipeline", "sensor"]);
25717
25980
  var TrackSchema = external_exports.object({
25718
25981
  trackId: external_exports.string(),
25719
25982
  deviceId: external_exports.number(),
25720
25983
  className: external_exports.string(),
25721
25984
  label: external_exports.string().optional(),
25985
+ /** Track provenance. Absent ⇒ `pipeline` (legacy rows). */
25986
+ source: TrackSourceSchema.optional(),
25722
25987
  firstSeen: external_exports.number(),
25723
25988
  lastSeen: external_exports.number(),
25724
25989
  /** Frame-rate position history (subject to maxPositionHistory cap). */
@@ -26235,6 +26500,58 @@ var pipelineAnalyticsCapability = {
26235
26500
  }) }
26236
26501
  }
26237
26502
  };
26503
+ var LEGACY_ICON = {
26504
+ motion: "motion",
26505
+ audio: "audio",
26506
+ person: "person",
26507
+ vehicle: "vehicle",
26508
+ animal: "animal",
26509
+ package: "package",
26510
+ door: "door",
26511
+ pir: "pir",
26512
+ smoke: "smoke",
26513
+ water: "water",
26514
+ button: "button",
26515
+ generic: "generic",
26516
+ gas: "smoke",
26517
+ vibration: "generic",
26518
+ tamper: "generic",
26519
+ presence: "person",
26520
+ lock: "generic",
26521
+ siren: "generic",
26522
+ switch: "generic",
26523
+ doorbell: "button"
26524
+ };
26525
+ function legacyIcon(iconId) {
26526
+ return LEGACY_ICON[iconId] ?? "generic";
26527
+ }
26528
+ var CAP_TO_KIND = {
26529
+ contact: "contact",
26530
+ motion: "motion-sensor",
26531
+ smoke: "smoke",
26532
+ flood: "flood",
26533
+ gas: "gas",
26534
+ "carbon-monoxide": "carbon-monoxide",
26535
+ vibration: "vibration",
26536
+ tamper: "tamper",
26537
+ presence: "presence",
26538
+ "enum-sensor": "enum-sensor",
26539
+ "event-emitter": "device-event",
26540
+ "lock-control": "lock",
26541
+ switch: "switch",
26542
+ button: "button",
26543
+ doorbell: "doorbell"
26544
+ };
26545
+ function buildDescriptor(capName, kind) {
26546
+ const t = EVENT_TAXONOMY[kind];
26547
+ if (t === void 0) throw new Error(`EVENT_KIND_BY_CAP: cap '${capName}' maps to unknown taxonomy kind '${kind}'`);
26548
+ return {
26549
+ ...t,
26550
+ icon: legacyIcon(t.iconId)
26551
+ };
26552
+ }
26553
+ var EVENT_KIND_BY_CAP = Object.freeze(Object.fromEntries(Object.entries(CAP_TO_KIND).map(([capName, kind]) => [capName, buildDescriptor(capName, kind)])));
26554
+ var EVENTFUL_CAP_NAMES = Object.keys(CAP_TO_KIND);
26238
26555
  var CameraPipelineConfigSchema = external_exports.object({
26239
26556
  engine: PipelineEngineChoiceSchema.optional(),
26240
26557
  steps: external_exports.array(PipelineStepInputSchema).readonly(),
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runDiscover
4
- } from "./chunk-WX6XSMWG.js";
4
+ } from "./chunk-ZFONIXEK.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-Q6UMJNDP.js");
1082
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-ZBSZJQ2R.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-WX6XSMWG.js";
8
+ } from "./chunk-ZFONIXEK.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.30",
3
+ "version": "1.1.32",
4
4
  "description": "CLI tool for managing and running CamStack server",
5
5
  "keywords": [
6
6
  "camstack",