@camstack/types 0.1.0 → 0.1.1
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/index.d.mts +2345 -90
- package/dist/index.d.ts +2345 -90
- package/dist/index.js +96 -649
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +206 -28
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -1
- package/dist/catalogs/index.d.mts +0 -1
- package/dist/catalogs/index.d.ts +0 -1
- package/dist/catalogs/index.js +0 -805
- package/dist/catalogs/index.js.map +0 -1
- package/dist/catalogs/index.mjs +0 -31
- package/dist/catalogs/index.mjs.map +0 -1
- package/dist/chunk-QNLZQW6W.mjs +0 -770
- package/dist/chunk-QNLZQW6W.mjs.map +0 -1
- package/dist/index-B9wf2RhV.d.mts +0 -89
- package/dist/index-B9wf2RhV.d.ts +0 -89
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/utils/hf-url.ts","../src/catalogs/coco-classmap.ts","../src/catalogs/object-detection-models.ts","../src/catalogs/face-detection-models.ts","../src/catalogs/face-recognition-models.ts","../src/catalogs/plate-detection-models.ts","../src/catalogs/plate-recognition-models.ts","../src/catalogs/audio-classification-models.ts","../src/catalogs/segmentation-models.ts","../src/catalogs/animal-classification-models.ts"],"sourcesContent":["export * from './types/io.js'\nexport * from './types/labels.js'\nexport * from './types/detection.js'\nexport * from './types/tracked.js'\nexport * from './types/events.js'\nexport * from './types/config.js'\nexport * from './types/entities.js'\nexport * from './types/models.js'\nexport * from './types/pipeline.js'\nexport * from './types/live-state.js'\nexport * from './types/analytics.js'\nexport type * from './types/benchmark.js'\nexport type * from './interfaces/addon.js'\nexport type * from './interfaces/config-ui.js'\nexport type * from './interfaces/pipeline-slot.js'\nexport type * from './interfaces/detector.js'\nexport type * from './interfaces/cropper.js'\nexport type * from './interfaces/classifier.js'\nexport type * from './interfaces/detection-addon.js'\nexport type * from './interfaces/inference-engine.js'\nexport type * from './interfaces/repositories.js'\nexport type * from './interfaces/analysis.js'\nexport type * from './interfaces/python-env.js'\nexport type * from './interfaces/network.js'\nexport type * from './interfaces/router.js'\nexport type * from './interfaces/storage-backend.js'\nexport type * from './interfaces/logging.js'\nexport type * from './interfaces/event-bus.js'\nexport type * from './interfaces/pipeline-runner.js'\n\n// Constants\nexport * from './constants.js'\n\n// Utils\nexport { hfModelUrl } from './utils/hf-url.js'\n\n// Catalogs\nexport {\n COCO_80_LABELS,\n COCO_TO_MACRO,\n MACRO_LABELS,\n} from './catalogs/coco-classmap.js'\nexport { OBJECT_DETECTION_MODELS } from './catalogs/object-detection-models.js'\nexport { FACE_DETECTION_MODELS } from './catalogs/face-detection-models.js'\nexport { FACE_RECOGNITION_MODELS } from './catalogs/face-recognition-models.js'\nexport { PLATE_DETECTION_MODELS } from './catalogs/plate-detection-models.js'\nexport { PLATE_RECOGNITION_MODELS } from './catalogs/plate-recognition-models.js'\nexport { AUDIO_CLASSIFICATION_MODELS } from './catalogs/audio-classification-models.js'\nexport { SEGMENTATION_MODELS } from './catalogs/segmentation-models.js'\nexport { BIRD_SPECIES_MODELS, BIRD_NABIRDS_MODELS, ANIMAL_TYPE_MODELS } from './catalogs/animal-classification-models.js'\n","export const HF_REPO = 'camstack/camstack-models'\nexport const HF_BASE_URL = `https://huggingface.co/${HF_REPO}/resolve/main`\n","export function hfModelUrl(repo: string, path: string): string {\n return `https://huggingface.co/${repo}/resolve/main/${path}`\n}\n","import type { LabelDefinition, ClassMapDefinition } from '../types/labels.js'\n\nexport const COCO_80_LABELS: readonly LabelDefinition[] = [\n { id: 'person', name: 'Person' },\n { id: 'bicycle', name: 'Bicycle' },\n { id: 'car', name: 'Car' },\n { id: 'motorcycle', name: 'Motorcycle' },\n { id: 'airplane', name: 'Airplane' },\n { id: 'bus', name: 'Bus' },\n { id: 'train', name: 'Train' },\n { id: 'truck', name: 'Truck' },\n { id: 'boat', name: 'Boat' },\n { id: 'traffic light', name: 'Traffic Light' },\n { id: 'fire hydrant', name: 'Fire Hydrant' },\n { id: 'stop sign', name: 'Stop Sign' },\n { id: 'parking meter', name: 'Parking Meter' },\n { id: 'bench', name: 'Bench' },\n { id: 'bird', name: 'Bird' },\n { id: 'cat', name: 'Cat' },\n { id: 'dog', name: 'Dog' },\n { id: 'horse', name: 'Horse' },\n { id: 'sheep', name: 'Sheep' },\n { id: 'cow', name: 'Cow' },\n { id: 'elephant', name: 'Elephant' },\n { id: 'bear', name: 'Bear' },\n { id: 'zebra', name: 'Zebra' },\n { id: 'giraffe', name: 'Giraffe' },\n { id: 'backpack', name: 'Backpack' },\n { id: 'umbrella', name: 'Umbrella' },\n { id: 'handbag', name: 'Handbag' },\n { id: 'tie', name: 'Tie' },\n { id: 'suitcase', name: 'Suitcase' },\n { id: 'frisbee', name: 'Frisbee' },\n { id: 'skis', name: 'Skis' },\n { id: 'snowboard', name: 'Snowboard' },\n { id: 'sports ball', name: 'Sports Ball' },\n { id: 'kite', name: 'Kite' },\n { id: 'baseball bat', name: 'Baseball Bat' },\n { id: 'baseball glove', name: 'Baseball Glove' },\n { id: 'skateboard', name: 'Skateboard' },\n { id: 'surfboard', name: 'Surfboard' },\n { id: 'tennis racket', name: 'Tennis Racket' },\n { id: 'bottle', name: 'Bottle' },\n { id: 'wine glass', name: 'Wine Glass' },\n { id: 'cup', name: 'Cup' },\n { id: 'fork', name: 'Fork' },\n { id: 'knife', name: 'Knife' },\n { id: 'spoon', name: 'Spoon' },\n { id: 'bowl', name: 'Bowl' },\n { id: 'banana', name: 'Banana' },\n { id: 'apple', name: 'Apple' },\n { id: 'sandwich', name: 'Sandwich' },\n { id: 'orange', name: 'Orange' },\n { id: 'broccoli', name: 'Broccoli' },\n { id: 'carrot', name: 'Carrot' },\n { id: 'hot dog', name: 'Hot Dog' },\n { id: 'pizza', name: 'Pizza' },\n { id: 'donut', name: 'Donut' },\n { id: 'cake', name: 'Cake' },\n { id: 'chair', name: 'Chair' },\n { id: 'couch', name: 'Couch' },\n { id: 'potted plant', name: 'Potted Plant' },\n { id: 'bed', name: 'Bed' },\n { id: 'dining table', name: 'Dining Table' },\n { id: 'toilet', name: 'Toilet' },\n { id: 'tv', name: 'TV' },\n { id: 'laptop', name: 'Laptop' },\n { id: 'mouse', name: 'Mouse' },\n { id: 'remote', name: 'Remote' },\n { id: 'keyboard', name: 'Keyboard' },\n { id: 'cell phone', name: 'Cell Phone' },\n { id: 'microwave', name: 'Microwave' },\n { id: 'oven', name: 'Oven' },\n { id: 'toaster', name: 'Toaster' },\n { id: 'sink', name: 'Sink' },\n { id: 'refrigerator', name: 'Refrigerator' },\n { id: 'book', name: 'Book' },\n { id: 'clock', name: 'Clock' },\n { id: 'vase', name: 'Vase' },\n { id: 'scissors', name: 'Scissors' },\n { id: 'teddy bear', name: 'Teddy Bear' },\n { id: 'hair drier', name: 'Hair Drier' },\n { id: 'toothbrush', name: 'Toothbrush' },\n] as const\n\nexport const MACRO_LABELS: readonly LabelDefinition[] = [\n { id: 'person', name: 'Person' },\n { id: 'vehicle', name: 'Vehicle' },\n { id: 'animal', name: 'Animal' },\n] as const\n\nexport const COCO_TO_MACRO: ClassMapDefinition = {\n mapping: {\n person: 'person',\n bicycle: 'vehicle',\n car: 'vehicle',\n motorcycle: 'vehicle',\n airplane: 'vehicle',\n bus: 'vehicle',\n train: 'vehicle',\n truck: 'vehicle',\n boat: 'vehicle',\n bird: 'animal',\n cat: 'animal',\n dog: 'animal',\n horse: 'animal',\n sheep: 'animal',\n cow: 'animal',\n elephant: 'animal',\n bear: 'animal',\n zebra: 'animal',\n giraffe: 'animal',\n },\n preserveOriginal: true,\n}\n","import type { ModelCatalogEntry } from '../types/models.js'\nimport { hfModelUrl } from '../utils/hf-url.js'\nimport { COCO_80_LABELS } from './coco-classmap.js'\n\nconst HF_REPO = 'camstack/camstack-models'\n\nexport const OBJECT_DETECTION_MODELS: readonly ModelCatalogEntry[] = [\n {\n id: 'yolov8n',\n name: 'YOLOv8 Nano',\n description: 'YOLOv8 Nano — fastest, smallest object detection model',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/onnx/camstack-yolov8n.onnx'),\n sizeMB: 12,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/coreml/camstack-yolov8n.mlpackage'),\n sizeMB: 6,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/openvino/camstack-yolov8n.xml'),\n sizeMB: 7,\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/tflite/camstack-yolov8n_float32.tflite'),\n sizeMB: 12,\n },\n },\n },\n {\n id: 'yolov8s',\n name: 'YOLOv8 Small',\n description: 'YOLOv8 Small — balanced speed and accuracy',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/onnx/camstack-yolov8s.onnx'),\n sizeMB: 43,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/coreml/camstack-yolov8s.mlpackage'),\n sizeMB: 21,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/openvino/camstack-yolov8s.xml'),\n sizeMB: 22,\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/tflite/camstack-yolov8s_float32.tflite'),\n sizeMB: 43,\n },\n },\n },\n {\n id: 'yolov8m',\n name: 'YOLOv8 Medium',\n description: 'YOLOv8 Medium — higher accuracy, moderate size',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/onnx/camstack-yolov8m.onnx'),\n sizeMB: 99,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/coreml/camstack-yolov8m.mlpackage'),\n sizeMB: 49,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/openvino/camstack-yolov8m.xml'),\n sizeMB: 50,\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/tflite/camstack-yolov8m_float32.tflite'),\n sizeMB: 99,\n },\n },\n },\n {\n id: 'yolov9t',\n name: 'YOLOv9 Tiny',\n description: 'YOLOv9 Tiny — ultra-lightweight next-gen detector',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/onnx/camstack-yolov9t.onnx'),\n sizeMB: 8,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/coreml/camstack-yolov9t.mlpackage'),\n sizeMB: 4,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/openvino/camstack-yolov9t.xml'),\n sizeMB: 6,\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/tflite/camstack-yolov9t_float32.tflite'),\n sizeMB: 8,\n },\n },\n },\n {\n id: 'yolov9s',\n name: 'YOLOv9 Small',\n description: 'YOLOv9 Small — improved efficiency over YOLOv8s',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/onnx/camstack-yolov9s.onnx'),\n sizeMB: 28,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/coreml/camstack-yolov9s.mlpackage'),\n sizeMB: 14,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/openvino/camstack-yolov9s.xml'),\n sizeMB: 16,\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/tflite/camstack-yolov9s_float32.tflite'),\n sizeMB: 28,\n },\n },\n },\n {\n id: 'yolov9c',\n name: 'YOLOv9 C',\n description: 'YOLOv9 C — high-accuracy compact model',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/onnx/camstack-yolov9c.onnx'),\n sizeMB: 97,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/coreml/camstack-yolov9c.mlpackage'),\n sizeMB: 48,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/openvino/camstack-yolov9c.xml'),\n sizeMB: 49,\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/tflite/camstack-yolov9c_float32.tflite'),\n sizeMB: 97,\n },\n },\n },\n // YOLO11 — no CoreML (coremltools incompatible)\n {\n id: 'yolo11n',\n name: 'YOLO11 Nano',\n description: 'YOLO11 Nano — fastest, smallest YOLO11 detection model',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/onnx/camstack-yolo11n.onnx'),\n sizeMB: 10,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/openvino/camstack-yolo11n.xml'),\n sizeMB: 5.4,\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/tflite/camstack-yolo11n_float32.tflite'),\n sizeMB: 10,\n },\n },\n },\n {\n id: 'yolo11s',\n name: 'YOLO11 Small',\n description: 'YOLO11 Small — balanced speed and accuracy',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/onnx/camstack-yolo11s.onnx'),\n sizeMB: 36,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/openvino/camstack-yolo11s.xml'),\n sizeMB: 18,\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/tflite/camstack-yolo11s_float32.tflite'),\n sizeMB: 36,\n },\n },\n },\n {\n id: 'yolo11m',\n name: 'YOLO11 Medium',\n description: 'YOLO11 Medium — higher accuracy, moderate size',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/onnx/camstack-yolo11m.onnx'),\n sizeMB: 77,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/openvino/camstack-yolo11m.xml'),\n sizeMB: 39,\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/tflite/camstack-yolo11m_float32.tflite'),\n sizeMB: 77,\n },\n },\n },\n {\n id: 'yolo11l',\n name: 'YOLO11 Large',\n description: 'YOLO11 Large — high-accuracy large model',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/onnx/camstack-yolo11l.onnx'),\n sizeMB: 97,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/openvino/camstack-yolo11l.xml'),\n sizeMB: 49,\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/tflite/camstack-yolo11l_float32.tflite'),\n sizeMB: 97,\n },\n },\n },\n {\n id: 'yolo11x',\n name: 'YOLO11 Extra-Large',\n description: 'YOLO11 Extra-Large — maximum accuracy',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/onnx/camstack-yolo11x.onnx'),\n sizeMB: 218,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/openvino/camstack-yolo11x.xml'),\n sizeMB: 109,\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/tflite/camstack-yolo11x_float32.tflite'),\n sizeMB: 218,\n },\n },\n },\n] as const\n","import type { ModelCatalogEntry } from '../types/models.js'\nimport { hfModelUrl } from '../utils/hf-url.js'\nimport type { LabelDefinition } from '../types/labels.js'\n\nconst HF_REPO = 'camstack/camstack-models'\n\nconst FACE_LABELS: readonly LabelDefinition[] = [\n { id: 'face', name: 'Face' },\n] as const\n\nexport const FACE_DETECTION_MODELS: readonly ModelCatalogEntry[] = [\n {\n id: 'scrfd-500m',\n name: 'SCRFD 500M',\n description: 'SCRFD 500M — ultra-lightweight face detector',\n inputSize: { width: 640, height: 640 },\n labels: FACE_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'faceDetection/scrfd/onnx/camstack-scrfd-500m.onnx'),\n sizeMB: 2.2,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'faceDetection/scrfd/coreml/camstack-scrfd-500m.mlpackage'),\n sizeMB: 1.2,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'faceDetection/scrfd/openvino/camstack-scrfd-500m.xml'),\n sizeMB: 1.3,\n },\n },\n },\n {\n id: 'scrfd-2.5g',\n name: 'SCRFD 2.5G',\n description: 'SCRFD 2.5G — balanced face detection model',\n inputSize: { width: 640, height: 640 },\n labels: FACE_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'faceDetection/scrfd/onnx/camstack-scrfd-2.5g.onnx'),\n sizeMB: 3.1,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'faceDetection/scrfd/coreml/camstack-scrfd-2.5g.mlpackage'),\n sizeMB: 1.7,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'faceDetection/scrfd/openvino/camstack-scrfd-2.5g.xml'),\n sizeMB: 1.8,\n },\n },\n },\n {\n id: 'scrfd-10g',\n name: 'SCRFD 10G',\n description: 'SCRFD 10G — high-accuracy face detector',\n inputSize: { width: 640, height: 640 },\n labels: FACE_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'faceDetection/scrfd/onnx/camstack-scrfd-10g.onnx'),\n sizeMB: 16,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'faceDetection/scrfd/coreml/camstack-scrfd-10g.mlpackage'),\n sizeMB: 8.2,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'faceDetection/scrfd/openvino/camstack-scrfd-10g.xml'),\n sizeMB: 8.3,\n },\n },\n },\n] as const\n","import type { ModelCatalogEntry } from '../types/models.js'\nimport { hfModelUrl } from '../utils/hf-url.js'\nimport type { LabelDefinition } from '../types/labels.js'\n\nconst HF_REPO = 'camstack/camstack-models'\n\nconst FACE_EMBEDDING_LABELS: readonly LabelDefinition[] = [\n { id: 'embedding', name: 'Face Embedding' },\n] as const\n\nexport const FACE_RECOGNITION_MODELS: readonly ModelCatalogEntry[] = [\n {\n id: 'arcface-r100',\n name: 'ArcFace R100',\n description: 'ArcFace ResNet-100 — high-accuracy face recognition embeddings',\n inputSize: { width: 112, height: 112 },\n inputLayout: 'nhwc',\n labels: FACE_EMBEDDING_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'faceRecognition/arcface/onnx/camstack-arcface-arcface.onnx'),\n sizeMB: 130,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'faceRecognition/arcface/coreml/camstack-arcface-r100.mlpackage'),\n sizeMB: 65,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'faceRecognition/arcface/openvino/camstack-arcface-r100.xml'),\n sizeMB: 65,\n },\n },\n },\n] as const\n","import type { ModelCatalogEntry } from '../types/models.js'\nimport { hfModelUrl } from '../utils/hf-url.js'\nimport type { LabelDefinition } from '../types/labels.js'\n\nconst HF_REPO = 'camstack/camstack-models'\n\nconst PLATE_LABELS: readonly LabelDefinition[] = [\n { id: 'plate', name: 'License Plate' },\n] as const\n\nexport const PLATE_DETECTION_MODELS: readonly ModelCatalogEntry[] = [\n {\n id: 'yolov8n-plate',\n name: 'YOLOv8 Nano — License Plate',\n description: 'YOLOv8 Nano fine-tuned for license plate detection',\n inputSize: { width: 640, height: 640 },\n labels: PLATE_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'plateDetection/yolov8-plate/onnx/camstack-yolov8n-plate.onnx'),\n sizeMB: 12,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'plateDetection/yolov8-plate/coreml/camstack-yolov8n-plate.mlpackage'),\n sizeMB: 5.9,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'plateDetection/yolov8-plate/openvino/camstack-yolov8n-plate.xml'),\n sizeMB: 6.1,\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'plateDetection/yolov8-plate/tflite/camstack-yolov8n-plate_float32.tflite'),\n sizeMB: 12,\n },\n },\n },\n] as const\n","import type { ModelCatalogEntry } from '../types/models.js'\nimport { hfModelUrl } from '../utils/hf-url.js'\nimport type { LabelDefinition } from '../types/labels.js'\n\nconst HF_REPO = 'camstack/camstack-models'\n\nconst PLATE_TEXT_LABELS: readonly LabelDefinition[] = [\n { id: 'text', name: 'Plate Text' },\n] as const\n\nexport const PLATE_RECOGNITION_MODELS: readonly ModelCatalogEntry[] = [\n {\n id: 'paddleocr-latin',\n name: 'PaddleOCR Latin',\n description: 'PaddleOCR recognition model for Latin-script license plates',\n inputSize: { width: 320, height: 48 },\n labels: PLATE_TEXT_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'plateRecognition/paddleocr/onnx/camstack-paddleocr-latin-rec.onnx'),\n sizeMB: 7.5,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'plateRecognition/paddleocr/openvino/camstack-paddleocr-latin.xml'),\n sizeMB: 4,\n },\n },\n },\n {\n id: 'paddleocr-en',\n name: 'PaddleOCR English',\n description: 'PaddleOCR recognition model optimized for English license plates',\n inputSize: { width: 320, height: 48 },\n labels: PLATE_TEXT_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'plateRecognition/paddleocr/onnx/camstack-paddleocr-en-rec.onnx'),\n sizeMB: 7.5,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'plateRecognition/paddleocr/openvino/camstack-paddleocr-en.xml'),\n sizeMB: 4,\n },\n },\n },\n] as const\n","import type { ModelCatalogEntry } from '../types/models.js'\nimport { hfModelUrl } from '../utils/hf-url.js'\nimport type { LabelDefinition } from '../types/labels.js'\n\nconst HF_REPO = 'camstack/camstack-models'\n\nconst AUDIO_LABELS: readonly LabelDefinition[] = [\n { id: 'audio', name: 'Audio Event' },\n] as const\n\nexport const AUDIO_CLASSIFICATION_MODELS: readonly ModelCatalogEntry[] = [\n {\n id: 'yamnet',\n name: 'YAMNet',\n description: 'YAMNet — audio event classification from raw waveform',\n inputSize: { width: 1, height: 16000 },\n labels: AUDIO_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'audioClassification/yamnet/onnx/camstack-yamnet.onnx'),\n sizeMB: 15,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'audioClassification/yamnet/openvino/camstack-yamnet.xml'),\n sizeMB: 8,\n },\n },\n },\n] as const\n","import type { ModelCatalogEntry } from '../types/models.js'\nimport { hfModelUrl } from '../utils/hf-url.js'\nimport { COCO_80_LABELS } from './coco-classmap.js'\n\nconst HF_REPO = 'camstack/camstack-models'\n\nexport const SEGMENTATION_MODELS: readonly ModelCatalogEntry[] = [\n // YOLO11-seg — no CoreML (coremltools incompatible)\n {\n id: 'yolo11n-seg',\n name: 'YOLO11 Nano Segmentation',\n description: 'YOLO11 Nano — fastest, smallest YOLO11 instance segmentation model',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolo11-seg/onnx/camstack-yolo11n-seg.onnx'),\n sizeMB: 11,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolo11-seg/openvino/camstack-yolo11n-seg.xml'),\n sizeMB: 6,\n },\n },\n },\n {\n id: 'yolo11s-seg',\n name: 'YOLO11 Small Segmentation',\n description: 'YOLO11 Small — balanced speed and accuracy for instance segmentation',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolo11-seg/onnx/camstack-yolo11s-seg.onnx'),\n sizeMB: 39,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolo11-seg/openvino/camstack-yolo11s-seg.xml'),\n sizeMB: 20,\n },\n },\n },\n {\n id: 'yolo11m-seg',\n name: 'YOLO11 Medium Segmentation',\n description: 'YOLO11 Medium — higher accuracy instance segmentation',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolo11-seg/onnx/camstack-yolo11m-seg.onnx'),\n sizeMB: 86,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolo11-seg/openvino/camstack-yolo11m-seg.xml'),\n sizeMB: 43,\n },\n },\n },\n // YOLOv8-seg — CoreML available\n {\n id: 'yolov8n-seg',\n name: 'YOLOv8 Nano Segmentation',\n description: 'YOLOv8 Nano — fastest, smallest YOLOv8 instance segmentation model',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolov8-seg/onnx/camstack-yolov8n-seg.onnx'),\n sizeMB: 13,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolov8-seg/coreml/camstack-yolov8n-seg.mlpackage'),\n sizeMB: 7,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolov8-seg/openvino/camstack-yolov8n-seg.xml'),\n sizeMB: 7,\n },\n },\n },\n {\n id: 'yolov8s-seg',\n name: 'YOLOv8 Small Segmentation',\n description: 'YOLOv8 Small — balanced speed and accuracy for instance segmentation',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolov8-seg/onnx/camstack-yolov8s-seg.onnx'),\n sizeMB: 45,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolov8-seg/coreml/camstack-yolov8s-seg.mlpackage'),\n sizeMB: 23,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolov8-seg/openvino/camstack-yolov8s-seg.xml'),\n sizeMB: 23,\n },\n },\n },\n {\n id: 'yolov8m-seg',\n name: 'YOLOv8 Medium Segmentation',\n description: 'YOLOv8 Medium — higher accuracy instance segmentation',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolov8-seg/onnx/camstack-yolov8m-seg.onnx'),\n sizeMB: 104,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolov8-seg/coreml/camstack-yolov8m-seg.mlpackage'),\n sizeMB: 52,\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolov8-seg/openvino/camstack-yolov8m-seg.xml'),\n sizeMB: 53,\n },\n },\n },\n] as const\n","import type { ModelCatalogEntry } from '../types/models.js'\nimport type { LabelDefinition } from '../types/labels.js'\nimport { hfModelUrl } from '../utils/hf-url.js'\nimport { HF_REPO } from '../constants.js'\n\nconst hf = (path: string) => hfModelUrl(HF_REPO, path)\n\nconst BIRD_LABEL: LabelDefinition = { id: 'species', name: 'Bird Species' }\nconst ANIMAL_TYPE_LABEL: LabelDefinition = { id: 'animal-type', name: 'Animal Type' }\n\nexport const BIRD_SPECIES_MODELS: readonly ModelCatalogEntry[] = [\n {\n id: 'bird-species-525',\n name: 'Bird Species (525)',\n description: 'EfficientNet bird species classifier — 525 species, MIT license',\n inputSize: { width: 224, height: 224 },\n inputNormalization: 'imagenet',\n labels: [BIRD_LABEL],\n formats: {\n onnx: { url: hf('animalClassification/bird-species/onnx/camstack-bird-species-525.onnx'), sizeMB: 32 },\n },\n },\n] as const\n\nexport const BIRD_NABIRDS_MODELS: readonly ModelCatalogEntry[] = [\n {\n id: 'bird-nabirds-404',\n name: 'NABirds (404 species)',\n description: 'ResNet50 trained on NABirds — 404 North American species with ONNX, CoreML, OpenVINO',\n inputSize: { width: 224, height: 224 },\n inputNormalization: 'imagenet',\n labels: [{ id: 'species', name: 'Bird Species' }],\n formats: {\n onnx: { url: hf('animalClassification/bird-nabirds/onnx/camstack-bird-nabirds-404.onnx'), sizeMB: 93 },\n coreml: { url: hf('animalClassification/bird-nabirds/coreml/camstack-bird-nabirds-404.mlpackage'), sizeMB: 47 },\n openvino: { url: hf('animalClassification/bird-nabirds/openvino/camstack-bird-nabirds-404.xml'), sizeMB: 47 },\n },\n },\n] as const\n\nexport const ANIMAL_TYPE_MODELS: readonly ModelCatalogEntry[] = [\n {\n id: 'animals-10',\n name: 'Animal Classifier (10)',\n description: 'ViT-based animal type classifier — cat, cow, dog, dolphin, eagle, panda, horse, monkey, sheep, spider',\n inputSize: { width: 224, height: 224 },\n inputNormalization: 'imagenet',\n labels: [ANIMAL_TYPE_LABEL],\n formats: {\n onnx: { url: hf('animalClassification/animals-10/onnx/camstack-animals-10.onnx'), sizeMB: 328 },\n },\n },\n] as const\n"],"mappings":"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","names":["HF_REPO","HF_REPO","HF_REPO","HF_REPO","HF_REPO","HF_REPO","HF_REPO"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/interfaces/storage-backend.ts","../src/interfaces/feature-flags.ts","../src/interfaces/agent-protocol.ts","../src/interfaces/server-analysis.ts","../src/interfaces/analysis-persistence.ts","../src/constants.ts","../src/utils/hf-url.ts","../src/utils/cosine-similarity.ts","../src/catalogs/coco-classmap.ts"],"sourcesContent":["export * from './types/io.js'\nexport * from './types/labels.js'\nexport * from './types/detection.js'\nexport * from './types/tracked.js'\nexport * from './types/events.js'\nexport * from './types/config.js'\nexport * from './types/entities.js'\nexport * from './types/models.js'\nexport * from './types/pipeline.js'\nexport * from './types/live-state.js'\nexport * from './types/analytics.js'\nexport type * from './types/benchmark.js'\n\n// --- Core interfaces (used by addons and server) ---\nexport type * from './interfaces/addon.js'\nexport type * from './interfaces/capability.js'\nexport type * from './interfaces/config-ui.js'\nexport type * from './interfaces/pipeline-slot.js'\nexport type * from './interfaces/detector.js'\nexport type * from './interfaces/cropper.js'\nexport type * from './interfaces/classifier.js'\nexport type * from './interfaces/detection-addon.js'\nexport type * from './interfaces/inference-engine.js'\nexport type * from './interfaces/repositories.js'\nexport type * from './interfaces/analysis.js'\nexport type * from './interfaces/python-env.js'\nexport type * from './interfaces/network.js'\nexport type * from './interfaces/router.js'\nexport * from './interfaces/storage-backend.js'\nexport type * from './interfaces/logging.js'\nexport type * from './interfaces/event-bus.js'\nexport type * from './interfaces/pipeline-runner.js'\nexport type * from './interfaces/auth-provider.js'\nexport type * from './interfaces/notification.js'\nexport type * from './interfaces/addon-routes.js'\nexport type * from './interfaces/scoped-token.js'\nexport type * from './interfaces/task-handler.js'\n\n// --- Server interfaces (consolidated from server/backend/src/interfaces/) ---\nexport type * from './interfaces/storage.js'\nexport type * from './interfaces/context.js'\nexport type * from './interfaces/device-capability.js'\nexport type * from './interfaces/device.js'\nexport type * from './interfaces/device-provider.js'\nexport type * from './interfaces/device-capabilities/index.js'\nexport type * from './interfaces/streaming.js'\nexport type * from './interfaces/auth.js'\nexport type * from './interfaces/lifecycle.js'\nexport type * from './interfaces/server-network.js'\nexport type * from './interfaces/process.js'\nexport * from './interfaces/feature-flags.js'\nexport type * from './interfaces/agent.js'\nexport type * from './interfaces/agent-protocol.js'\nexport * from './interfaces/agent-protocol.js'\nexport type * from './interfaces/camera-pipeline.js'\nexport type * from './interfaces/server-analysis.js'\nexport * from './interfaces/server-analysis.js'\nexport type * from './interfaces/stream-broker.js'\nexport * from './interfaces/analysis-persistence.js'\nexport type * from './interfaces/restreamer.js'\nexport type * from './interfaces/decoder.js'\nexport type * from './interfaces/ffmpeg.js'\nexport type {\n ModelType as ServerModelType,\n ServerModelCatalogEntry,\n IModelCatalogProvider,\n} from './interfaces/model-catalog.js'\nexport type * from './interfaces/network-quality.js'\nexport type * from './interfaces/webrtc-provider.js'\nexport type * from './interfaces/repl.js'\n\n// Constants\nexport * from './constants.js'\n\n// Utils\nexport { hfModelUrl } from './utils/hf-url.js'\nexport { cosineSimilarity } from './utils/cosine-similarity.js'\n\n// Catalogs (coco-classmap stays in types — used by object-detection addon and other consumers)\nexport {\n COCO_80_LABELS,\n COCO_TO_MACRO,\n MACRO_LABELS,\n} from './catalogs/coco-classmap.js'\n","import type { StorageLocationName } from './storage.js'\n\n/**\n * Abstract storage backend -- resolves subpaths to absolute filesystem paths.\n */\nexport interface IStorageBackend {\n /** Backend type identifier */\n readonly type: string\n\n /** Base path of this backend */\n readonly basePath: string\n\n /** Resolve a subpath to an absolute path */\n resolve(subpath: string): string\n /** Also support location-based resolution */\n resolve(location: StorageLocationName, ...segments: string[]): string\n\n /** Check if the backend path exists and is writable */\n isAvailable(location?: StorageLocationName): boolean\n\n /** Ensure base directory exists (mkdir -p equivalent) */\n initialize(): Promise<void>\n\n /** Get the absolute path for a named storage location */\n getLocationPath?(location: StorageLocationName): string\n}\n\n/** @deprecated Use IStorageProvider from storage.ts instead */\nexport interface IStorageProviderLegacy {\n getLocation(name: string): string\n setLocationPath?(name: StorageLocationName, absolutePath: string): void\n}\n\n/** Configuration for a storage location */\nexport interface StorageLocationConfig {\n readonly name: string\n readonly basePath: string\n readonly backendType?: string\n}\n\n/** Default storage location paths, relative to dataPath */\nexport const DEFAULT_LOCATION_SUBPATHS: Record<string, string> = {\n data: 'db',\n media: 'media',\n recordings: 'recordings',\n models: 'models',\n cache: '/tmp/camstack-cache',\n logs: 'logs',\n}\n","export interface FeatureManifest {\n streaming: boolean\n notifications: boolean\n objectDetection: boolean\n remoteAccess: boolean\n agentCluster: boolean\n smartHome: boolean\n recordings: boolean\n backup: boolean\n repl: boolean\n}\n\nexport type FeatureFlag = keyof FeatureManifest\n\nexport const DEFAULT_FEATURES: FeatureManifest = {\n streaming: true,\n notifications: true,\n objectDetection: false,\n remoteAccess: true,\n agentCluster: false,\n smartHome: true,\n recordings: true,\n backup: true,\n repl: true,\n}\n","import type { TaskProgress } from './task-handler.js'\n\n// --- Agent capabilities & roles ---\nexport type AgentCapability = 'decoder' | 'transcoder' | 'detector' | 'recorder'\nexport type RolePriority = 'primary' | 'backup' | 'overflow'\n\nexport interface CameraRoleAssignment {\n cameraId: string\n role: AgentCapability\n agentId: string\n priority: RolePriority\n rtspUrl?: string\n detectionConfig?: {\n modelId: string\n runtime: string\n confidence: number\n fps: number\n classes?: string[]\n }\n}\n\n// --- Hub -> Agent messages ---\nexport type HubToAgentMessage =\n | { type: 'assign'; assignment: CameraRoleAssignment }\n | { type: 'unassign'; cameraId: string; role: AgentCapability }\n | { type: 'recording.start'; cameraId: string; rtspUrl: string }\n | { type: 'recording.stop'; cameraId: string }\n | { type: 'benchmark.run'; config: RemoteBenchmarkConfig }\n | { type: 'config.update'; addonId: string; config: Record<string, unknown> }\n | { type: 'task.execute'; taskId: string; taskType: string; payload: unknown }\n | { type: 'task.cancel'; taskId: string }\n | { type: 'addon.install'; package: string; version?: string }\n | { type: 'addon.uninstall'; package: string }\n | { type: 'addon.update'; package: string; version?: string }\n | { type: 'addon.restart' }\n | { type: 'ping' }\n\n// --- Agent -> Hub messages ---\nexport type AgentToHubMessage =\n | { type: 'register'; info: AgentRegistrationInfo }\n | { type: 'heartbeat'; status: AgentRuntimeStatus }\n | { type: 'detection.result'; cameraId: string; detections: DetectionResult[]; timestamp: number; inferenceMs: number }\n | { type: 'recording.segment'; cameraId: string; segment: RecordingSegmentInfo }\n | { type: 'recording.status'; cameraId: string; recording: boolean }\n | { type: 'benchmark.progress'; event: BenchmarkStreamEvent }\n | { type: 'benchmark.result'; report: BenchmarkReport }\n | { type: 'task.result'; taskId: string; success: boolean; result?: unknown; error?: string }\n | { type: 'task.progress'; taskId: string; progress: TaskProgress }\n | { type: 'addon.install-result'; package: string; success: boolean; version?: string; error?: string }\n | { type: 'addon.uninstall-result'; package: string; success: boolean; error?: string }\n | { type: 'addon.update-result'; package: string; success: boolean; version?: string; error?: string }\n | { type: 'log'; level: string; scope: string; message: string }\n | { type: 'pong' }\n\n// --- Binary frame header (29 bytes) ---\nexport const BINARY_FRAME_HEADER_SIZE = 29\nexport const BINARY_FRAME_TYPE = 0x01\n\nexport interface AgentRegistrationInfo {\n id: string\n name: string\n capabilities: AgentCapability[]\n host: string\n port: number\n platform: string\n arch: string\n cpuCores: number\n memoryMB: number\n gpuModel?: string\n pythonRuntimes: string[]\n httpPort: number\n /** Task types this agent can handle (e.g., 'pipeline.decode', 'system.info') */\n taskTypes?: string[]\n /** Installed addons on this agent */\n installedAddons?: string[]\n}\n\nexport interface AgentRuntimeStatus {\n activeCameras: number\n cpuPercent: number\n memoryPercent: number\n fps: Record<string, number>\n errors: string[]\n}\n\nexport interface DetectionResult {\n className: string\n score: number\n bbox: [number, number, number, number]\n}\n\nexport interface RecordingSegmentInfo {\n id: string\n startTime: number\n endTime: number\n duration: number\n sizeBytes: number\n path: string\n format: 'mp4' | 'ts'\n}\n\nexport interface RemoteBenchmarkConfig {\n runtime: string\n modelId?: string\n durationMs: number\n warmupMs: number\n inputWidth: number\n inputHeight: number\n}\n\nexport interface BenchmarkStreamEvent {\n phase: 'warmup' | 'running'\n iteration: number\n inferenceMs: number\n}\n\nexport interface BenchmarkReport {\n runtime: string\n modelId?: string\n iterations: number\n meanMs: number\n p50Ms: number\n p95Ms: number\n p99Ms: number\n minMs: number\n maxMs: number\n}\n","/**\n * Detection Analysis Pipeline -- processes raw detections through\n * configurable stages to produce tracked, enriched, actionable events.\n */\n\nimport type { Detection } from './device-capabilities/object-detector.js'\nimport type { VideoFrame } from './camera-pipeline.js'\n\n// --- Detection type const unions ---\n\nexport const DETECTION_TYPES = ['person', 'vehicle', 'animal', 'package'] as const\nexport type DetectionType = typeof DETECTION_TYPES[number]\n\nexport const SUB_DETECTION_TYPES = ['face', 'plate'] as const\nexport type SubDetectionType = typeof SUB_DETECTION_TYPES[number]\n\nexport const RECOGNITION_TYPES = ['face', 'plate', 'clip', 'custom'] as const\nexport type RecognitionType = typeof RECOGNITION_TYPES[number]\n\n// --- Analysis Context ---\n\nexport interface AnalysisContext {\n readonly deviceId: string\n readonly frame: VideoFrame\n readonly timestamp: number\n readonly rawDetections: readonly Detection[]\n readonly trackedDetections: readonly ServerTrackedDetection[]\n readonly events: readonly AnalysisEvent[]\n readonly metadata: Readonly<Record<string, unknown>>\n}\n\n// --- Tracked Detection ---\n\nexport interface ServerTrackedDetection {\n readonly trackId: string\n readonly detection: Detection\n readonly crop?: Buffer\n readonly tracking: TrackingInfo\n readonly subDetections: readonly SubDetection[]\n readonly recognitions: readonly RecognitionResult[]\n readonly zones: readonly string[]\n readonly previousZones: readonly string[]\n}\n\nexport interface TrackingInfo {\n readonly age: number\n readonly state: 'moving' | 'stationary' | 'new' | 'lost'\n readonly stationaryDuration: number\n readonly velocity: { readonly dx: number; readonly dy: number }\n readonly positionHistory: ReadonlyArray<{ readonly x: number; readonly y: number; readonly t: number }>\n}\n\n// --- Sub-Detection ---\n\nexport interface SubDetection {\n readonly detectionType: SubDetectionType\n readonly boundingBox: readonly [number, number, number, number]\n readonly score: number\n readonly crop?: Buffer\n}\n\n// --- Recognition ---\n\nexport interface RecognitionResult {\n readonly recognitionType: RecognitionType\n readonly label: string\n readonly score: number\n readonly embedding?: readonly number[]\n readonly metadata?: Readonly<Record<string, unknown>>\n}\n\n// --- Analysis Events ---\n\nexport interface AnalysisEvent {\n readonly category: string\n readonly severity: 'info' | 'warning' | 'alert'\n readonly detection: ServerTrackedDetection\n readonly description: string\n readonly data: Readonly<Record<string, unknown>>\n}\n\n// --- Analysis Stage ---\n\nexport interface IAnalysisStage {\n readonly id: string\n readonly name: string\n readonly priority: number\n enabled: boolean\n process(ctx: AnalysisContext): Promise<AnalysisContext>\n}\n\n// --- Sub-Detector Interface ---\n\nexport interface ISubDetector {\n readonly detectionType: SubDetectionType\n readonly targetClasses: readonly string[]\n detect(crop: Buffer, cropWidth: number, cropHeight: number): Promise<SubDetection[]>\n}\n\nexport interface IFaceDetector extends ISubDetector {\n readonly detectionType: 'face'\n}\n\nexport interface IPlateDetector extends ISubDetector {\n readonly detectionType: 'plate'\n}\n\n// --- Recognizer Interface ---\n\nexport interface IRecognizer {\n readonly recognitionType: RecognitionType\n recognize(crop: Buffer, width: number, height: number): Promise<RecognitionResult | null>\n}\n\nexport interface IFaceRecognizer extends IRecognizer {\n getEmbedding(crop: Buffer): Promise<Float32Array>\n registerKnown(label: string, embedding: Float32Array): void\n}\n\nexport interface IPlateRecognizer extends IRecognizer {\n readonly recognitionType: 'plate'\n}\n\n// --- Audio Classifier ---\n\nexport interface IAudioClassifier {\n readonly ready: boolean\n initialize(): Promise<void>\n classify(\n audioSamples: Float32Array,\n sampleRate: number,\n topN?: number,\n ): Promise<readonly AudioClassification[]>\n release(): Promise<void>\n}\n\nexport interface AudioClassification {\n readonly classIndex: number\n readonly className: string\n readonly score: number\n readonly isSurveillanceRelevant: boolean\n}\n\n// --- Pipeline Stage Interfaces ---\n\nexport interface IClassFilterStage extends IAnalysisStage {\n readonly id: 'class-filter'\n setConfig(deviceId: string, config: Record<string, unknown>): void\n getConfig(deviceId: string): Record<string, unknown>\n}\n\nexport interface ITrackerStage extends IAnalysisStage {\n readonly id: 'tracker'\n setConfig(deviceId: string, config: Record<string, unknown>): void\n getConfig(deviceId: string): Record<string, unknown>\n resetDevice(deviceId: string): void\n}\n\nexport interface ISubDetectionStage extends IAnalysisStage {\n readonly id: 'sub-detection'\n registerDetector(detector: ISubDetector): void\n}\n\nexport interface IRecognitionStage extends IAnalysisStage {\n readonly id: 'recognition'\n registerRecognizer(recognizer: IRecognizer): void\n}\n\nexport interface IZoneAnalysisStage extends IAnalysisStage {\n readonly id: 'zone-analysis'\n setConfig(deviceId: string, config: Record<string, unknown>): void\n}\n\nexport interface IEventGenerationStage extends IAnalysisStage {\n readonly id: 'event-generation'\n setConfig(deviceId: string, config: Record<string, unknown>): void\n}\n\nexport interface IObjectSnapshotStage extends IAnalysisStage {\n readonly id: 'object-snapshot'\n setConfig(deviceId: string, config: Record<string, unknown>): void\n}\n\n// --- Analysis Pipeline ---\n\nexport interface IAnalysisPipeline {\n addStage(stage: IAnalysisStage): void\n removeStage(stageId: string): void\n getStages(): readonly IAnalysisStage[]\n analyze(deviceId: string, frame: VideoFrame, rawDetections: Detection[]): Promise<AnalysisContext>\n}\n\n// --- Helper functions ---\n\nexport function createAnalysisContext(\n deviceId: string,\n frame: VideoFrame,\n rawDetections: Detection[],\n): AnalysisContext {\n return {\n deviceId,\n frame,\n timestamp: frame.timestamp,\n rawDetections,\n trackedDetections: [],\n events: [],\n metadata: {},\n }\n}\n\nexport function enrichContext(\n ctx: AnalysisContext,\n updates: Partial<Pick<AnalysisContext, 'trackedDetections' | 'events' | 'metadata'>>,\n): AnalysisContext {\n return {\n ...ctx,\n trackedDetections: updates.trackedDetections ?? ctx.trackedDetections,\n events: updates.events ?? ctx.events,\n metadata: updates.metadata ? { ...ctx.metadata, ...updates.metadata } : ctx.metadata,\n }\n}\n","/**\n * Analysis Persistence Types — interfaces for event persistence, track trails,\n * retention, session tracking, and known faces.\n *\n * These interfaces define the contracts used by the server; concrete\n * implementations live in addon-pipeline and are received via CapabilityRegistry.\n */\n\nimport type { ServerTrackedDetection } from './server-analysis.js'\n\n// ---------------------------------------------------------------------------\n// Event Persistence\n// ---------------------------------------------------------------------------\n\nexport interface ObjectSnapshotResult {\n readonly trackId: string\n readonly thumbnail?: Buffer\n readonly fullCrop?: Buffer\n}\n\nexport interface AnnotatedSnapshotResult {\n readonly thumbnail: Buffer\n readonly full: Buffer\n}\n\nexport interface PersistableEvent {\n readonly id: string\n readonly timestamp: number\n readonly deviceId: string\n readonly category: string\n readonly className: string\n readonly score: number\n readonly trackId: string\n readonly severity: string\n readonly description: string\n readonly data: Record<string, unknown>\n readonly mediaFiles: readonly string[]\n}\n\nexport interface EventBufferStatus {\n readonly eventCount: number\n readonly mediaCount: number\n readonly mediaSizeMB: number\n}\n\nexport type TrackMediaType =\n | 'crop-thumb'\n | 'crop-full'\n | 'debug-annotated-thumb'\n | 'debug-annotated-full'\n | 'original'\n | 'original-thumb'\n | 'inline-crop'\n | 'unknown'\n\nexport interface TrackMediaFile {\n readonly path: string\n readonly type: TrackMediaType\n readonly data: Buffer\n readonly source: 'buffer' | 'storage'\n}\n\n// ---------------------------------------------------------------------------\n// Track Trail\n// ---------------------------------------------------------------------------\n\nexport interface TrackCaptureConfig {\n readonly enabled: boolean\n readonly snapshotIntervalMs: number\n readonly maxTrailLength: number\n readonly saveThumbnails: boolean\n readonly thumbnailSize: { readonly width: number; readonly height: number }\n}\n\nexport interface TrackPosition {\n readonly x: number\n readonly y: number\n readonly timestamp: number\n readonly bbox: readonly [number, number, number, number]\n}\n\nexport interface TrackSnapshot {\n readonly timestamp: number\n readonly position: TrackPosition\n readonly thumbnailPath: string\n}\n\nexport interface TrackTrail {\n readonly trackId: string\n readonly deviceId: string\n readonly className: string\n readonly label?: string\n readonly firstSeen: number\n readonly lastSeen: number\n readonly positions: readonly TrackPosition[]\n readonly snapshots: readonly TrackSnapshot[]\n readonly totalDistance: number\n readonly zonesVisited: readonly string[]\n readonly active: boolean\n}\n\n// ---------------------------------------------------------------------------\n// Retention\n// ---------------------------------------------------------------------------\n\nexport interface RetentionConfig {\n readonly cleanupIntervalMs: number\n readonly detectionEventsDays: number\n readonly audioLevelsDays: number\n /** @deprecated — snapshots are tied to events, use detectionEventsDays */\n readonly snapshotsDays: number\n readonly deviceOverrides?: Readonly<Record<string, Partial<Pick<RetentionConfig, 'detectionEventsDays' | 'audioLevelsDays' | 'snapshotsDays'>>>>\n}\n\nexport const DEFAULT_RETENTION: RetentionConfig = {\n cleanupIntervalMs: 60 * 60 * 1000,\n detectionEventsDays: 30,\n audioLevelsDays: 7,\n snapshotsDays: 14,\n}\n\nexport interface RetentionReport {\n readonly deletedEvents: number\n readonly deletedAudioRecords: number\n readonly deletedSnapshots: number\n}\n\n// ---------------------------------------------------------------------------\n// Session Tracker\n// ---------------------------------------------------------------------------\n\nexport interface SessionTrack {\n readonly trackId: string\n readonly deviceId: string\n readonly className: string\n readonly label?: string\n readonly firstSeen: number\n readonly lastSeen: number\n readonly totalFrames: number\n readonly lastDetection: ServerTrackedDetection\n readonly state: string\n readonly positions: ReadonlyArray<{ readonly x: number; readonly y: number; readonly t: number }>\n readonly embedding?: Float32Array\n readonly globalId?: string\n readonly bestCrop?: Buffer\n}\n\nexport interface GlobalIdentity {\n readonly globalId: string\n readonly embedding: Float32Array\n readonly label?: string\n readonly firstSeen: number\n readonly lastSeen: number\n readonly deviceIds: ReadonlyArray<string>\n}\n\n// ---------------------------------------------------------------------------\n// Known Faces\n// ---------------------------------------------------------------------------\n\nexport interface ClipRecognizer {\n getEmbedding(imageBuffer: Buffer): Promise<Float32Array>\n}\n\nexport interface KnownFaceEntry {\n readonly id: string\n readonly label: string\n readonly group?: string\n readonly embedding: readonly number[]\n readonly cropBase64: string\n readonly createdAt: number\n readonly updatedAt: number\n readonly source?: string\n readonly metadata?: Readonly<Record<string, unknown>>\n}\n\n// ---------------------------------------------------------------------------\n// Recording Addon (generic interface for recording engine access)\n// ---------------------------------------------------------------------------\n\n/**\n * Interface for the recording addon — the server uses this instead of\n * importing PipelineAddon directly from addon-pipeline.\n */\nexport interface IRecordingAddon {\n getCoordinator(): IRecordingCoordinator\n getRecordingDb(): IRecordingDb\n}\n\n/**\n * Minimal coordinator interface for the server's recording router.\n */\nexport interface IRecordingCoordinator {\n enableRecording(deviceId: string, options: {\n policy: unknown\n ffmpegOverrides?: unknown\n }): Promise<void>\n disableRecording(deviceId: string): Promise<void>\n isRecording(deviceId: string): boolean\n readonly playlistGenerator: {\n generate(\n deviceId: string,\n streamId: string,\n startTime: number,\n endTime: number,\n options?: { live?: boolean },\n ): unknown\n }\n readonly storageEstimator: {\n estimateForDevice(\n deviceId: string,\n motionInput?: { avgEventsPerDay: number; avgDurationSec: number },\n ): { totalEstimatedGb: number; [key: string]: unknown }\n }\n}\n\n/**\n * Minimal recording database interface for the server's recording router.\n */\nexport interface IRecordingDb {\n upsertStorageConfig(config: {\n deviceId: string\n dataCategory: string\n storageName: string\n subDirectory: string\n retentionDays: number | null\n retentionGb: number | null\n }): void\n getPolicy(deviceId: string): unknown\n getEnabledPolicies(): Array<{ deviceId: string; [key: string]: unknown }>\n querySegments(deviceId: string, streamId: string, startTime: number, endTime: number): unknown\n getAvailability(deviceId: string, startTime: number, endTime: number): unknown\n getStorageUsage(deviceId: string, streamId: string): unknown\n upsertPolicy(policy: unknown): void\n findNearestThumbnail(deviceId: string, timestamp: number, category: string): unknown\n getMotionStats(deviceId: string, startTime: number, endTime: number): {\n avgEventsPerDay: number\n avgDurationSec: number\n dutyCyclePercent: number\n totalEvents: number\n }\n resolveStorageConfig(deviceId: string, dataCategory: string): unknown\n}\n\n// ---------------------------------------------------------------------------\n// Sub-service interfaces — used by the server's thin NestJS wrappers\n// to receive delegates via CapabilityRegistry.\n// ---------------------------------------------------------------------------\n\nexport interface IEventPersistence {\n start(): void\n stop(): void\n saveDetectionCrops(eventId: string, crops: readonly ObjectSnapshotResult[]): void\n saveAnnotatedFrame(eventId: string, result: AnnotatedSnapshotResult): void\n saveOriginalFrame(eventId: string, frame: import('./camera-pipeline.js').VideoFrame): Promise<void>\n getEventMedia(eventId: string): Promise<unknown>\n getTrackMedia(trackId: string): Promise<unknown>\n getDeviceMedia(deviceId: string, since?: number, until?: number): Promise<unknown>\n getBufferStatus(): unknown\n flush(): Promise<void>\n}\n\nexport interface ITrackTrail {\n setConfig(deviceId: string, config: Partial<TrackCaptureConfig>): void\n getConfig(deviceId: string): unknown\n recordFrame(ctx: unknown): Promise<void>\n getActiveTrail(trackId: string): unknown\n getActiveTrails(deviceId: string): unknown\n getPersistedTrail(trackId: string): Promise<unknown>\n getTrail(trackId: string): Promise<unknown>\n listTrails(deviceId: string, options?: {\n since?: number\n until?: number\n limit?: number\n className?: string\n }): Promise<unknown>\n}\n\nexport interface IRetention {\n start(): void\n stop(): void\n runCleanup(): Promise<unknown>\n setConfig(update: Partial<RetentionConfig>): void\n getConfig(): unknown\n forceCleanup(): Promise<unknown>\n}\n\nexport interface ISessionTracker {\n updateFromAnalysis(deviceId: string, ctx: unknown): void\n getActiveTracks(deviceId: string): unknown\n getAllActiveTracks(): unknown\n getTrack(deviceId: string, trackId: string): unknown\n getTrackCounts(): unknown\n clearDevice(deviceId: string): void\n clearAll(): void\n getGlobalPool(): unknown\n}\n\nexport interface IKnownFaces {\n register(entry: KnownFaceEntry): Promise<void>\n listAll(): Promise<unknown>\n delete(id: string): Promise<void>\n update(id: string, updates: Partial<Pick<KnownFaceEntry, 'label' | 'group'>>): Promise<void>\n recalculateEmbedding(id: string, clipRecognizer: ClipRecognizer): Promise<void>\n findMatch(embedding: Float32Array, threshold: number): Promise<unknown>\n batchRegister(\n entries: ReadonlyArray<{ readonly label: string; readonly cropBase64: string; readonly group?: string }>,\n clipRecognizer: ClipRecognizer,\n ): Promise<unknown>\n}\n\n/**\n * Composite interface exposed via CapabilityRegistry as the\n * 'analysis-data-persistence' singleton. Each sub-service is wired\n * individually to the corresponding NestJS wrapper service.\n */\nexport interface IAnalysisDataPersistence {\n readonly eventPersistence: IEventPersistence\n readonly knownFaces: IKnownFaces\n readonly sessionTracker: ISessionTracker\n readonly retention: IRetention\n readonly trackTrail: ITrackTrail\n}\n\n// ---------------------------------------------------------------------------\n// Provider Connection Testing\n// ---------------------------------------------------------------------------\n\nexport interface TestConnectionResult {\n readonly success: boolean\n readonly version?: string\n readonly cameraCount?: number\n readonly error?: string\n}\n\n/**\n * Generic interface for testing provider connections.\n * Each provider addon can expose a connection tester.\n */\nexport interface IProviderConnectionTester {\n testConnection(): Promise<TestConnectionResult>\n}\n","export const HF_REPO = 'camstack/camstack-models'\nexport const HF_BASE_URL = `https://huggingface.co/${HF_REPO}/resolve/main`\n","export function hfModelUrl(repo: string, path: string): string {\n return `https://huggingface.co/${repo}/resolve/main/${path}`\n}\n","/** Cosine similarity between two embedding vectors */\nexport function cosineSimilarity(a: Float32Array, b: Float32Array): number {\n if (a.length !== b.length) return 0\n let dotProduct = 0\n let normA = 0\n let normB = 0\n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i]! * b[i]!\n normA += a[i]! * a[i]!\n normB += b[i]! * b[i]!\n }\n const denom = Math.sqrt(normA) * Math.sqrt(normB)\n return denom === 0 ? 0 : dotProduct / denom\n}\n","import type { LabelDefinition, ClassMapDefinition } from '../types/labels.js'\n\nexport const COCO_80_LABELS: readonly LabelDefinition[] = [\n { id: 'person', name: 'Person' },\n { id: 'bicycle', name: 'Bicycle' },\n { id: 'car', name: 'Car' },\n { id: 'motorcycle', name: 'Motorcycle' },\n { id: 'airplane', name: 'Airplane' },\n { id: 'bus', name: 'Bus' },\n { id: 'train', name: 'Train' },\n { id: 'truck', name: 'Truck' },\n { id: 'boat', name: 'Boat' },\n { id: 'traffic light', name: 'Traffic Light' },\n { id: 'fire hydrant', name: 'Fire Hydrant' },\n { id: 'stop sign', name: 'Stop Sign' },\n { id: 'parking meter', name: 'Parking Meter' },\n { id: 'bench', name: 'Bench' },\n { id: 'bird', name: 'Bird' },\n { id: 'cat', name: 'Cat' },\n { id: 'dog', name: 'Dog' },\n { id: 'horse', name: 'Horse' },\n { id: 'sheep', name: 'Sheep' },\n { id: 'cow', name: 'Cow' },\n { id: 'elephant', name: 'Elephant' },\n { id: 'bear', name: 'Bear' },\n { id: 'zebra', name: 'Zebra' },\n { id: 'giraffe', name: 'Giraffe' },\n { id: 'backpack', name: 'Backpack' },\n { id: 'umbrella', name: 'Umbrella' },\n { id: 'handbag', name: 'Handbag' },\n { id: 'tie', name: 'Tie' },\n { id: 'suitcase', name: 'Suitcase' },\n { id: 'frisbee', name: 'Frisbee' },\n { id: 'skis', name: 'Skis' },\n { id: 'snowboard', name: 'Snowboard' },\n { id: 'sports ball', name: 'Sports Ball' },\n { id: 'kite', name: 'Kite' },\n { id: 'baseball bat', name: 'Baseball Bat' },\n { id: 'baseball glove', name: 'Baseball Glove' },\n { id: 'skateboard', name: 'Skateboard' },\n { id: 'surfboard', name: 'Surfboard' },\n { id: 'tennis racket', name: 'Tennis Racket' },\n { id: 'bottle', name: 'Bottle' },\n { id: 'wine glass', name: 'Wine Glass' },\n { id: 'cup', name: 'Cup' },\n { id: 'fork', name: 'Fork' },\n { id: 'knife', name: 'Knife' },\n { id: 'spoon', name: 'Spoon' },\n { id: 'bowl', name: 'Bowl' },\n { id: 'banana', name: 'Banana' },\n { id: 'apple', name: 'Apple' },\n { id: 'sandwich', name: 'Sandwich' },\n { id: 'orange', name: 'Orange' },\n { id: 'broccoli', name: 'Broccoli' },\n { id: 'carrot', name: 'Carrot' },\n { id: 'hot dog', name: 'Hot Dog' },\n { id: 'pizza', name: 'Pizza' },\n { id: 'donut', name: 'Donut' },\n { id: 'cake', name: 'Cake' },\n { id: 'chair', name: 'Chair' },\n { id: 'couch', name: 'Couch' },\n { id: 'potted plant', name: 'Potted Plant' },\n { id: 'bed', name: 'Bed' },\n { id: 'dining table', name: 'Dining Table' },\n { id: 'toilet', name: 'Toilet' },\n { id: 'tv', name: 'TV' },\n { id: 'laptop', name: 'Laptop' },\n { id: 'mouse', name: 'Mouse' },\n { id: 'remote', name: 'Remote' },\n { id: 'keyboard', name: 'Keyboard' },\n { id: 'cell phone', name: 'Cell Phone' },\n { id: 'microwave', name: 'Microwave' },\n { id: 'oven', name: 'Oven' },\n { id: 'toaster', name: 'Toaster' },\n { id: 'sink', name: 'Sink' },\n { id: 'refrigerator', name: 'Refrigerator' },\n { id: 'book', name: 'Book' },\n { id: 'clock', name: 'Clock' },\n { id: 'vase', name: 'Vase' },\n { id: 'scissors', name: 'Scissors' },\n { id: 'teddy bear', name: 'Teddy Bear' },\n { id: 'hair drier', name: 'Hair Drier' },\n { id: 'toothbrush', name: 'Toothbrush' },\n] as const\n\nexport const MACRO_LABELS: readonly LabelDefinition[] = [\n { id: 'person', name: 'Person' },\n { id: 'vehicle', name: 'Vehicle' },\n { id: 'animal', name: 'Animal' },\n] as const\n\nexport const COCO_TO_MACRO: ClassMapDefinition = {\n mapping: {\n person: 'person',\n bicycle: 'vehicle',\n car: 'vehicle',\n motorcycle: 'vehicle',\n airplane: 'vehicle',\n bus: 'vehicle',\n train: 'vehicle',\n truck: 'vehicle',\n boat: 'vehicle',\n bird: 'animal',\n cat: 'animal',\n dog: 'animal',\n horse: 'animal',\n sheep: 'animal',\n cow: 'animal',\n elephant: 'animal',\n bear: 'animal',\n zebra: 'animal',\n giraffe: 'animal',\n },\n preserveOriginal: true,\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,37 +1,215 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
// src/interfaces/storage-backend.ts
|
|
2
|
+
var DEFAULT_LOCATION_SUBPATHS = {
|
|
3
|
+
data: "db",
|
|
4
|
+
media: "media",
|
|
5
|
+
recordings: "recordings",
|
|
6
|
+
models: "models",
|
|
7
|
+
cache: "/tmp/camstack-cache",
|
|
8
|
+
logs: "logs"
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
// src/interfaces/feature-flags.ts
|
|
12
|
+
var DEFAULT_FEATURES = {
|
|
13
|
+
streaming: true,
|
|
14
|
+
notifications: true,
|
|
15
|
+
objectDetection: false,
|
|
16
|
+
remoteAccess: true,
|
|
17
|
+
agentCluster: false,
|
|
18
|
+
smartHome: true,
|
|
19
|
+
recordings: true,
|
|
20
|
+
backup: true,
|
|
21
|
+
repl: true
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// src/interfaces/agent-protocol.ts
|
|
25
|
+
var BINARY_FRAME_HEADER_SIZE = 29;
|
|
26
|
+
var BINARY_FRAME_TYPE = 1;
|
|
27
|
+
|
|
28
|
+
// src/interfaces/server-analysis.ts
|
|
29
|
+
var DETECTION_TYPES = ["person", "vehicle", "animal", "package"];
|
|
30
|
+
var SUB_DETECTION_TYPES = ["face", "plate"];
|
|
31
|
+
var RECOGNITION_TYPES = ["face", "plate", "clip", "custom"];
|
|
32
|
+
function createAnalysisContext(deviceId, frame, rawDetections) {
|
|
33
|
+
return {
|
|
34
|
+
deviceId,
|
|
35
|
+
frame,
|
|
36
|
+
timestamp: frame.timestamp,
|
|
37
|
+
rawDetections,
|
|
38
|
+
trackedDetections: [],
|
|
39
|
+
events: [],
|
|
40
|
+
metadata: {}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function enrichContext(ctx, updates) {
|
|
44
|
+
return {
|
|
45
|
+
...ctx,
|
|
46
|
+
trackedDetections: updates.trackedDetections ?? ctx.trackedDetections,
|
|
47
|
+
events: updates.events ?? ctx.events,
|
|
48
|
+
metadata: updates.metadata ? { ...ctx.metadata, ...updates.metadata } : ctx.metadata
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// src/interfaces/analysis-persistence.ts
|
|
53
|
+
var DEFAULT_RETENTION = {
|
|
54
|
+
cleanupIntervalMs: 60 * 60 * 1e3,
|
|
55
|
+
detectionEventsDays: 30,
|
|
56
|
+
audioLevelsDays: 7,
|
|
57
|
+
snapshotsDays: 14
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
// src/constants.ts
|
|
61
|
+
var HF_REPO = "camstack/camstack-models";
|
|
62
|
+
var HF_BASE_URL = `https://huggingface.co/${HF_REPO}/resolve/main`;
|
|
63
|
+
|
|
64
|
+
// src/utils/hf-url.ts
|
|
65
|
+
function hfModelUrl(repo, path) {
|
|
66
|
+
return `https://huggingface.co/${repo}/resolve/main/${path}`;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// src/utils/cosine-similarity.ts
|
|
70
|
+
function cosineSimilarity(a, b) {
|
|
71
|
+
if (a.length !== b.length) return 0;
|
|
72
|
+
let dotProduct = 0;
|
|
73
|
+
let normA = 0;
|
|
74
|
+
let normB = 0;
|
|
75
|
+
for (let i = 0; i < a.length; i++) {
|
|
76
|
+
dotProduct += a[i] * b[i];
|
|
77
|
+
normA += a[i] * a[i];
|
|
78
|
+
normB += b[i] * b[i];
|
|
79
|
+
}
|
|
80
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
81
|
+
return denom === 0 ? 0 : dotProduct / denom;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// src/catalogs/coco-classmap.ts
|
|
85
|
+
var COCO_80_LABELS = [
|
|
86
|
+
{ id: "person", name: "Person" },
|
|
87
|
+
{ id: "bicycle", name: "Bicycle" },
|
|
88
|
+
{ id: "car", name: "Car" },
|
|
89
|
+
{ id: "motorcycle", name: "Motorcycle" },
|
|
90
|
+
{ id: "airplane", name: "Airplane" },
|
|
91
|
+
{ id: "bus", name: "Bus" },
|
|
92
|
+
{ id: "train", name: "Train" },
|
|
93
|
+
{ id: "truck", name: "Truck" },
|
|
94
|
+
{ id: "boat", name: "Boat" },
|
|
95
|
+
{ id: "traffic light", name: "Traffic Light" },
|
|
96
|
+
{ id: "fire hydrant", name: "Fire Hydrant" },
|
|
97
|
+
{ id: "stop sign", name: "Stop Sign" },
|
|
98
|
+
{ id: "parking meter", name: "Parking Meter" },
|
|
99
|
+
{ id: "bench", name: "Bench" },
|
|
100
|
+
{ id: "bird", name: "Bird" },
|
|
101
|
+
{ id: "cat", name: "Cat" },
|
|
102
|
+
{ id: "dog", name: "Dog" },
|
|
103
|
+
{ id: "horse", name: "Horse" },
|
|
104
|
+
{ id: "sheep", name: "Sheep" },
|
|
105
|
+
{ id: "cow", name: "Cow" },
|
|
106
|
+
{ id: "elephant", name: "Elephant" },
|
|
107
|
+
{ id: "bear", name: "Bear" },
|
|
108
|
+
{ id: "zebra", name: "Zebra" },
|
|
109
|
+
{ id: "giraffe", name: "Giraffe" },
|
|
110
|
+
{ id: "backpack", name: "Backpack" },
|
|
111
|
+
{ id: "umbrella", name: "Umbrella" },
|
|
112
|
+
{ id: "handbag", name: "Handbag" },
|
|
113
|
+
{ id: "tie", name: "Tie" },
|
|
114
|
+
{ id: "suitcase", name: "Suitcase" },
|
|
115
|
+
{ id: "frisbee", name: "Frisbee" },
|
|
116
|
+
{ id: "skis", name: "Skis" },
|
|
117
|
+
{ id: "snowboard", name: "Snowboard" },
|
|
118
|
+
{ id: "sports ball", name: "Sports Ball" },
|
|
119
|
+
{ id: "kite", name: "Kite" },
|
|
120
|
+
{ id: "baseball bat", name: "Baseball Bat" },
|
|
121
|
+
{ id: "baseball glove", name: "Baseball Glove" },
|
|
122
|
+
{ id: "skateboard", name: "Skateboard" },
|
|
123
|
+
{ id: "surfboard", name: "Surfboard" },
|
|
124
|
+
{ id: "tennis racket", name: "Tennis Racket" },
|
|
125
|
+
{ id: "bottle", name: "Bottle" },
|
|
126
|
+
{ id: "wine glass", name: "Wine Glass" },
|
|
127
|
+
{ id: "cup", name: "Cup" },
|
|
128
|
+
{ id: "fork", name: "Fork" },
|
|
129
|
+
{ id: "knife", name: "Knife" },
|
|
130
|
+
{ id: "spoon", name: "Spoon" },
|
|
131
|
+
{ id: "bowl", name: "Bowl" },
|
|
132
|
+
{ id: "banana", name: "Banana" },
|
|
133
|
+
{ id: "apple", name: "Apple" },
|
|
134
|
+
{ id: "sandwich", name: "Sandwich" },
|
|
135
|
+
{ id: "orange", name: "Orange" },
|
|
136
|
+
{ id: "broccoli", name: "Broccoli" },
|
|
137
|
+
{ id: "carrot", name: "Carrot" },
|
|
138
|
+
{ id: "hot dog", name: "Hot Dog" },
|
|
139
|
+
{ id: "pizza", name: "Pizza" },
|
|
140
|
+
{ id: "donut", name: "Donut" },
|
|
141
|
+
{ id: "cake", name: "Cake" },
|
|
142
|
+
{ id: "chair", name: "Chair" },
|
|
143
|
+
{ id: "couch", name: "Couch" },
|
|
144
|
+
{ id: "potted plant", name: "Potted Plant" },
|
|
145
|
+
{ id: "bed", name: "Bed" },
|
|
146
|
+
{ id: "dining table", name: "Dining Table" },
|
|
147
|
+
{ id: "toilet", name: "Toilet" },
|
|
148
|
+
{ id: "tv", name: "TV" },
|
|
149
|
+
{ id: "laptop", name: "Laptop" },
|
|
150
|
+
{ id: "mouse", name: "Mouse" },
|
|
151
|
+
{ id: "remote", name: "Remote" },
|
|
152
|
+
{ id: "keyboard", name: "Keyboard" },
|
|
153
|
+
{ id: "cell phone", name: "Cell Phone" },
|
|
154
|
+
{ id: "microwave", name: "Microwave" },
|
|
155
|
+
{ id: "oven", name: "Oven" },
|
|
156
|
+
{ id: "toaster", name: "Toaster" },
|
|
157
|
+
{ id: "sink", name: "Sink" },
|
|
158
|
+
{ id: "refrigerator", name: "Refrigerator" },
|
|
159
|
+
{ id: "book", name: "Book" },
|
|
160
|
+
{ id: "clock", name: "Clock" },
|
|
161
|
+
{ id: "vase", name: "Vase" },
|
|
162
|
+
{ id: "scissors", name: "Scissors" },
|
|
163
|
+
{ id: "teddy bear", name: "Teddy Bear" },
|
|
164
|
+
{ id: "hair drier", name: "Hair Drier" },
|
|
165
|
+
{ id: "toothbrush", name: "Toothbrush" }
|
|
166
|
+
];
|
|
167
|
+
var MACRO_LABELS = [
|
|
168
|
+
{ id: "person", name: "Person" },
|
|
169
|
+
{ id: "vehicle", name: "Vehicle" },
|
|
170
|
+
{ id: "animal", name: "Animal" }
|
|
171
|
+
];
|
|
172
|
+
var COCO_TO_MACRO = {
|
|
173
|
+
mapping: {
|
|
174
|
+
person: "person",
|
|
175
|
+
bicycle: "vehicle",
|
|
176
|
+
car: "vehicle",
|
|
177
|
+
motorcycle: "vehicle",
|
|
178
|
+
airplane: "vehicle",
|
|
179
|
+
bus: "vehicle",
|
|
180
|
+
train: "vehicle",
|
|
181
|
+
truck: "vehicle",
|
|
182
|
+
boat: "vehicle",
|
|
183
|
+
bird: "animal",
|
|
184
|
+
cat: "animal",
|
|
185
|
+
dog: "animal",
|
|
186
|
+
horse: "animal",
|
|
187
|
+
sheep: "animal",
|
|
188
|
+
cow: "animal",
|
|
189
|
+
elephant: "animal",
|
|
190
|
+
bear: "animal",
|
|
191
|
+
zebra: "animal",
|
|
192
|
+
giraffe: "animal"
|
|
193
|
+
},
|
|
194
|
+
preserveOriginal: true
|
|
195
|
+
};
|
|
19
196
|
export {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
BIRD_NABIRDS_MODELS,
|
|
23
|
-
BIRD_SPECIES_MODELS,
|
|
197
|
+
BINARY_FRAME_HEADER_SIZE,
|
|
198
|
+
BINARY_FRAME_TYPE,
|
|
24
199
|
COCO_80_LABELS,
|
|
25
200
|
COCO_TO_MACRO,
|
|
26
|
-
|
|
27
|
-
|
|
201
|
+
DEFAULT_FEATURES,
|
|
202
|
+
DEFAULT_LOCATION_SUBPATHS,
|
|
203
|
+
DEFAULT_RETENTION,
|
|
204
|
+
DETECTION_TYPES,
|
|
28
205
|
HF_BASE_URL,
|
|
29
206
|
HF_REPO,
|
|
30
207
|
MACRO_LABELS,
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
208
|
+
RECOGNITION_TYPES,
|
|
209
|
+
SUB_DETECTION_TYPES,
|
|
210
|
+
cosineSimilarity,
|
|
211
|
+
createAnalysisContext,
|
|
212
|
+
enrichContext,
|
|
35
213
|
hfModelUrl
|
|
36
214
|
};
|
|
37
215
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/interfaces/storage-backend.ts","../src/interfaces/feature-flags.ts","../src/interfaces/agent-protocol.ts","../src/interfaces/server-analysis.ts","../src/interfaces/analysis-persistence.ts","../src/constants.ts","../src/utils/hf-url.ts","../src/utils/cosine-similarity.ts","../src/catalogs/coco-classmap.ts"],"sourcesContent":["import type { StorageLocationName } from './storage.js'\n\n/**\n * Abstract storage backend -- resolves subpaths to absolute filesystem paths.\n */\nexport interface IStorageBackend {\n /** Backend type identifier */\n readonly type: string\n\n /** Base path of this backend */\n readonly basePath: string\n\n /** Resolve a subpath to an absolute path */\n resolve(subpath: string): string\n /** Also support location-based resolution */\n resolve(location: StorageLocationName, ...segments: string[]): string\n\n /** Check if the backend path exists and is writable */\n isAvailable(location?: StorageLocationName): boolean\n\n /** Ensure base directory exists (mkdir -p equivalent) */\n initialize(): Promise<void>\n\n /** Get the absolute path for a named storage location */\n getLocationPath?(location: StorageLocationName): string\n}\n\n/** @deprecated Use IStorageProvider from storage.ts instead */\nexport interface IStorageProviderLegacy {\n getLocation(name: string): string\n setLocationPath?(name: StorageLocationName, absolutePath: string): void\n}\n\n/** Configuration for a storage location */\nexport interface StorageLocationConfig {\n readonly name: string\n readonly basePath: string\n readonly backendType?: string\n}\n\n/** Default storage location paths, relative to dataPath */\nexport const DEFAULT_LOCATION_SUBPATHS: Record<string, string> = {\n data: 'db',\n media: 'media',\n recordings: 'recordings',\n models: 'models',\n cache: '/tmp/camstack-cache',\n logs: 'logs',\n}\n","export interface FeatureManifest {\n streaming: boolean\n notifications: boolean\n objectDetection: boolean\n remoteAccess: boolean\n agentCluster: boolean\n smartHome: boolean\n recordings: boolean\n backup: boolean\n repl: boolean\n}\n\nexport type FeatureFlag = keyof FeatureManifest\n\nexport const DEFAULT_FEATURES: FeatureManifest = {\n streaming: true,\n notifications: true,\n objectDetection: false,\n remoteAccess: true,\n agentCluster: false,\n smartHome: true,\n recordings: true,\n backup: true,\n repl: true,\n}\n","import type { TaskProgress } from './task-handler.js'\n\n// --- Agent capabilities & roles ---\nexport type AgentCapability = 'decoder' | 'transcoder' | 'detector' | 'recorder'\nexport type RolePriority = 'primary' | 'backup' | 'overflow'\n\nexport interface CameraRoleAssignment {\n cameraId: string\n role: AgentCapability\n agentId: string\n priority: RolePriority\n rtspUrl?: string\n detectionConfig?: {\n modelId: string\n runtime: string\n confidence: number\n fps: number\n classes?: string[]\n }\n}\n\n// --- Hub -> Agent messages ---\nexport type HubToAgentMessage =\n | { type: 'assign'; assignment: CameraRoleAssignment }\n | { type: 'unassign'; cameraId: string; role: AgentCapability }\n | { type: 'recording.start'; cameraId: string; rtspUrl: string }\n | { type: 'recording.stop'; cameraId: string }\n | { type: 'benchmark.run'; config: RemoteBenchmarkConfig }\n | { type: 'config.update'; addonId: string; config: Record<string, unknown> }\n | { type: 'task.execute'; taskId: string; taskType: string; payload: unknown }\n | { type: 'task.cancel'; taskId: string }\n | { type: 'addon.install'; package: string; version?: string }\n | { type: 'addon.uninstall'; package: string }\n | { type: 'addon.update'; package: string; version?: string }\n | { type: 'addon.restart' }\n | { type: 'ping' }\n\n// --- Agent -> Hub messages ---\nexport type AgentToHubMessage =\n | { type: 'register'; info: AgentRegistrationInfo }\n | { type: 'heartbeat'; status: AgentRuntimeStatus }\n | { type: 'detection.result'; cameraId: string; detections: DetectionResult[]; timestamp: number; inferenceMs: number }\n | { type: 'recording.segment'; cameraId: string; segment: RecordingSegmentInfo }\n | { type: 'recording.status'; cameraId: string; recording: boolean }\n | { type: 'benchmark.progress'; event: BenchmarkStreamEvent }\n | { type: 'benchmark.result'; report: BenchmarkReport }\n | { type: 'task.result'; taskId: string; success: boolean; result?: unknown; error?: string }\n | { type: 'task.progress'; taskId: string; progress: TaskProgress }\n | { type: 'addon.install-result'; package: string; success: boolean; version?: string; error?: string }\n | { type: 'addon.uninstall-result'; package: string; success: boolean; error?: string }\n | { type: 'addon.update-result'; package: string; success: boolean; version?: string; error?: string }\n | { type: 'log'; level: string; scope: string; message: string }\n | { type: 'pong' }\n\n// --- Binary frame header (29 bytes) ---\nexport const BINARY_FRAME_HEADER_SIZE = 29\nexport const BINARY_FRAME_TYPE = 0x01\n\nexport interface AgentRegistrationInfo {\n id: string\n name: string\n capabilities: AgentCapability[]\n host: string\n port: number\n platform: string\n arch: string\n cpuCores: number\n memoryMB: number\n gpuModel?: string\n pythonRuntimes: string[]\n httpPort: number\n /** Task types this agent can handle (e.g., 'pipeline.decode', 'system.info') */\n taskTypes?: string[]\n /** Installed addons on this agent */\n installedAddons?: string[]\n}\n\nexport interface AgentRuntimeStatus {\n activeCameras: number\n cpuPercent: number\n memoryPercent: number\n fps: Record<string, number>\n errors: string[]\n}\n\nexport interface DetectionResult {\n className: string\n score: number\n bbox: [number, number, number, number]\n}\n\nexport interface RecordingSegmentInfo {\n id: string\n startTime: number\n endTime: number\n duration: number\n sizeBytes: number\n path: string\n format: 'mp4' | 'ts'\n}\n\nexport interface RemoteBenchmarkConfig {\n runtime: string\n modelId?: string\n durationMs: number\n warmupMs: number\n inputWidth: number\n inputHeight: number\n}\n\nexport interface BenchmarkStreamEvent {\n phase: 'warmup' | 'running'\n iteration: number\n inferenceMs: number\n}\n\nexport interface BenchmarkReport {\n runtime: string\n modelId?: string\n iterations: number\n meanMs: number\n p50Ms: number\n p95Ms: number\n p99Ms: number\n minMs: number\n maxMs: number\n}\n","/**\n * Detection Analysis Pipeline -- processes raw detections through\n * configurable stages to produce tracked, enriched, actionable events.\n */\n\nimport type { Detection } from './device-capabilities/object-detector.js'\nimport type { VideoFrame } from './camera-pipeline.js'\n\n// --- Detection type const unions ---\n\nexport const DETECTION_TYPES = ['person', 'vehicle', 'animal', 'package'] as const\nexport type DetectionType = typeof DETECTION_TYPES[number]\n\nexport const SUB_DETECTION_TYPES = ['face', 'plate'] as const\nexport type SubDetectionType = typeof SUB_DETECTION_TYPES[number]\n\nexport const RECOGNITION_TYPES = ['face', 'plate', 'clip', 'custom'] as const\nexport type RecognitionType = typeof RECOGNITION_TYPES[number]\n\n// --- Analysis Context ---\n\nexport interface AnalysisContext {\n readonly deviceId: string\n readonly frame: VideoFrame\n readonly timestamp: number\n readonly rawDetections: readonly Detection[]\n readonly trackedDetections: readonly ServerTrackedDetection[]\n readonly events: readonly AnalysisEvent[]\n readonly metadata: Readonly<Record<string, unknown>>\n}\n\n// --- Tracked Detection ---\n\nexport interface ServerTrackedDetection {\n readonly trackId: string\n readonly detection: Detection\n readonly crop?: Buffer\n readonly tracking: TrackingInfo\n readonly subDetections: readonly SubDetection[]\n readonly recognitions: readonly RecognitionResult[]\n readonly zones: readonly string[]\n readonly previousZones: readonly string[]\n}\n\nexport interface TrackingInfo {\n readonly age: number\n readonly state: 'moving' | 'stationary' | 'new' | 'lost'\n readonly stationaryDuration: number\n readonly velocity: { readonly dx: number; readonly dy: number }\n readonly positionHistory: ReadonlyArray<{ readonly x: number; readonly y: number; readonly t: number }>\n}\n\n// --- Sub-Detection ---\n\nexport interface SubDetection {\n readonly detectionType: SubDetectionType\n readonly boundingBox: readonly [number, number, number, number]\n readonly score: number\n readonly crop?: Buffer\n}\n\n// --- Recognition ---\n\nexport interface RecognitionResult {\n readonly recognitionType: RecognitionType\n readonly label: string\n readonly score: number\n readonly embedding?: readonly number[]\n readonly metadata?: Readonly<Record<string, unknown>>\n}\n\n// --- Analysis Events ---\n\nexport interface AnalysisEvent {\n readonly category: string\n readonly severity: 'info' | 'warning' | 'alert'\n readonly detection: ServerTrackedDetection\n readonly description: string\n readonly data: Readonly<Record<string, unknown>>\n}\n\n// --- Analysis Stage ---\n\nexport interface IAnalysisStage {\n readonly id: string\n readonly name: string\n readonly priority: number\n enabled: boolean\n process(ctx: AnalysisContext): Promise<AnalysisContext>\n}\n\n// --- Sub-Detector Interface ---\n\nexport interface ISubDetector {\n readonly detectionType: SubDetectionType\n readonly targetClasses: readonly string[]\n detect(crop: Buffer, cropWidth: number, cropHeight: number): Promise<SubDetection[]>\n}\n\nexport interface IFaceDetector extends ISubDetector {\n readonly detectionType: 'face'\n}\n\nexport interface IPlateDetector extends ISubDetector {\n readonly detectionType: 'plate'\n}\n\n// --- Recognizer Interface ---\n\nexport interface IRecognizer {\n readonly recognitionType: RecognitionType\n recognize(crop: Buffer, width: number, height: number): Promise<RecognitionResult | null>\n}\n\nexport interface IFaceRecognizer extends IRecognizer {\n getEmbedding(crop: Buffer): Promise<Float32Array>\n registerKnown(label: string, embedding: Float32Array): void\n}\n\nexport interface IPlateRecognizer extends IRecognizer {\n readonly recognitionType: 'plate'\n}\n\n// --- Audio Classifier ---\n\nexport interface IAudioClassifier {\n readonly ready: boolean\n initialize(): Promise<void>\n classify(\n audioSamples: Float32Array,\n sampleRate: number,\n topN?: number,\n ): Promise<readonly AudioClassification[]>\n release(): Promise<void>\n}\n\nexport interface AudioClassification {\n readonly classIndex: number\n readonly className: string\n readonly score: number\n readonly isSurveillanceRelevant: boolean\n}\n\n// --- Pipeline Stage Interfaces ---\n\nexport interface IClassFilterStage extends IAnalysisStage {\n readonly id: 'class-filter'\n setConfig(deviceId: string, config: Record<string, unknown>): void\n getConfig(deviceId: string): Record<string, unknown>\n}\n\nexport interface ITrackerStage extends IAnalysisStage {\n readonly id: 'tracker'\n setConfig(deviceId: string, config: Record<string, unknown>): void\n getConfig(deviceId: string): Record<string, unknown>\n resetDevice(deviceId: string): void\n}\n\nexport interface ISubDetectionStage extends IAnalysisStage {\n readonly id: 'sub-detection'\n registerDetector(detector: ISubDetector): void\n}\n\nexport interface IRecognitionStage extends IAnalysisStage {\n readonly id: 'recognition'\n registerRecognizer(recognizer: IRecognizer): void\n}\n\nexport interface IZoneAnalysisStage extends IAnalysisStage {\n readonly id: 'zone-analysis'\n setConfig(deviceId: string, config: Record<string, unknown>): void\n}\n\nexport interface IEventGenerationStage extends IAnalysisStage {\n readonly id: 'event-generation'\n setConfig(deviceId: string, config: Record<string, unknown>): void\n}\n\nexport interface IObjectSnapshotStage extends IAnalysisStage {\n readonly id: 'object-snapshot'\n setConfig(deviceId: string, config: Record<string, unknown>): void\n}\n\n// --- Analysis Pipeline ---\n\nexport interface IAnalysisPipeline {\n addStage(stage: IAnalysisStage): void\n removeStage(stageId: string): void\n getStages(): readonly IAnalysisStage[]\n analyze(deviceId: string, frame: VideoFrame, rawDetections: Detection[]): Promise<AnalysisContext>\n}\n\n// --- Helper functions ---\n\nexport function createAnalysisContext(\n deviceId: string,\n frame: VideoFrame,\n rawDetections: Detection[],\n): AnalysisContext {\n return {\n deviceId,\n frame,\n timestamp: frame.timestamp,\n rawDetections,\n trackedDetections: [],\n events: [],\n metadata: {},\n }\n}\n\nexport function enrichContext(\n ctx: AnalysisContext,\n updates: Partial<Pick<AnalysisContext, 'trackedDetections' | 'events' | 'metadata'>>,\n): AnalysisContext {\n return {\n ...ctx,\n trackedDetections: updates.trackedDetections ?? ctx.trackedDetections,\n events: updates.events ?? ctx.events,\n metadata: updates.metadata ? { ...ctx.metadata, ...updates.metadata } : ctx.metadata,\n }\n}\n","/**\n * Analysis Persistence Types — interfaces for event persistence, track trails,\n * retention, session tracking, and known faces.\n *\n * These interfaces define the contracts used by the server; concrete\n * implementations live in addon-pipeline and are received via CapabilityRegistry.\n */\n\nimport type { ServerTrackedDetection } from './server-analysis.js'\n\n// ---------------------------------------------------------------------------\n// Event Persistence\n// ---------------------------------------------------------------------------\n\nexport interface ObjectSnapshotResult {\n readonly trackId: string\n readonly thumbnail?: Buffer\n readonly fullCrop?: Buffer\n}\n\nexport interface AnnotatedSnapshotResult {\n readonly thumbnail: Buffer\n readonly full: Buffer\n}\n\nexport interface PersistableEvent {\n readonly id: string\n readonly timestamp: number\n readonly deviceId: string\n readonly category: string\n readonly className: string\n readonly score: number\n readonly trackId: string\n readonly severity: string\n readonly description: string\n readonly data: Record<string, unknown>\n readonly mediaFiles: readonly string[]\n}\n\nexport interface EventBufferStatus {\n readonly eventCount: number\n readonly mediaCount: number\n readonly mediaSizeMB: number\n}\n\nexport type TrackMediaType =\n | 'crop-thumb'\n | 'crop-full'\n | 'debug-annotated-thumb'\n | 'debug-annotated-full'\n | 'original'\n | 'original-thumb'\n | 'inline-crop'\n | 'unknown'\n\nexport interface TrackMediaFile {\n readonly path: string\n readonly type: TrackMediaType\n readonly data: Buffer\n readonly source: 'buffer' | 'storage'\n}\n\n// ---------------------------------------------------------------------------\n// Track Trail\n// ---------------------------------------------------------------------------\n\nexport interface TrackCaptureConfig {\n readonly enabled: boolean\n readonly snapshotIntervalMs: number\n readonly maxTrailLength: number\n readonly saveThumbnails: boolean\n readonly thumbnailSize: { readonly width: number; readonly height: number }\n}\n\nexport interface TrackPosition {\n readonly x: number\n readonly y: number\n readonly timestamp: number\n readonly bbox: readonly [number, number, number, number]\n}\n\nexport interface TrackSnapshot {\n readonly timestamp: number\n readonly position: TrackPosition\n readonly thumbnailPath: string\n}\n\nexport interface TrackTrail {\n readonly trackId: string\n readonly deviceId: string\n readonly className: string\n readonly label?: string\n readonly firstSeen: number\n readonly lastSeen: number\n readonly positions: readonly TrackPosition[]\n readonly snapshots: readonly TrackSnapshot[]\n readonly totalDistance: number\n readonly zonesVisited: readonly string[]\n readonly active: boolean\n}\n\n// ---------------------------------------------------------------------------\n// Retention\n// ---------------------------------------------------------------------------\n\nexport interface RetentionConfig {\n readonly cleanupIntervalMs: number\n readonly detectionEventsDays: number\n readonly audioLevelsDays: number\n /** @deprecated — snapshots are tied to events, use detectionEventsDays */\n readonly snapshotsDays: number\n readonly deviceOverrides?: Readonly<Record<string, Partial<Pick<RetentionConfig, 'detectionEventsDays' | 'audioLevelsDays' | 'snapshotsDays'>>>>\n}\n\nexport const DEFAULT_RETENTION: RetentionConfig = {\n cleanupIntervalMs: 60 * 60 * 1000,\n detectionEventsDays: 30,\n audioLevelsDays: 7,\n snapshotsDays: 14,\n}\n\nexport interface RetentionReport {\n readonly deletedEvents: number\n readonly deletedAudioRecords: number\n readonly deletedSnapshots: number\n}\n\n// ---------------------------------------------------------------------------\n// Session Tracker\n// ---------------------------------------------------------------------------\n\nexport interface SessionTrack {\n readonly trackId: string\n readonly deviceId: string\n readonly className: string\n readonly label?: string\n readonly firstSeen: number\n readonly lastSeen: number\n readonly totalFrames: number\n readonly lastDetection: ServerTrackedDetection\n readonly state: string\n readonly positions: ReadonlyArray<{ readonly x: number; readonly y: number; readonly t: number }>\n readonly embedding?: Float32Array\n readonly globalId?: string\n readonly bestCrop?: Buffer\n}\n\nexport interface GlobalIdentity {\n readonly globalId: string\n readonly embedding: Float32Array\n readonly label?: string\n readonly firstSeen: number\n readonly lastSeen: number\n readonly deviceIds: ReadonlyArray<string>\n}\n\n// ---------------------------------------------------------------------------\n// Known Faces\n// ---------------------------------------------------------------------------\n\nexport interface ClipRecognizer {\n getEmbedding(imageBuffer: Buffer): Promise<Float32Array>\n}\n\nexport interface KnownFaceEntry {\n readonly id: string\n readonly label: string\n readonly group?: string\n readonly embedding: readonly number[]\n readonly cropBase64: string\n readonly createdAt: number\n readonly updatedAt: number\n readonly source?: string\n readonly metadata?: Readonly<Record<string, unknown>>\n}\n\n// ---------------------------------------------------------------------------\n// Recording Addon (generic interface for recording engine access)\n// ---------------------------------------------------------------------------\n\n/**\n * Interface for the recording addon — the server uses this instead of\n * importing PipelineAddon directly from addon-pipeline.\n */\nexport interface IRecordingAddon {\n getCoordinator(): IRecordingCoordinator\n getRecordingDb(): IRecordingDb\n}\n\n/**\n * Minimal coordinator interface for the server's recording router.\n */\nexport interface IRecordingCoordinator {\n enableRecording(deviceId: string, options: {\n policy: unknown\n ffmpegOverrides?: unknown\n }): Promise<void>\n disableRecording(deviceId: string): Promise<void>\n isRecording(deviceId: string): boolean\n readonly playlistGenerator: {\n generate(\n deviceId: string,\n streamId: string,\n startTime: number,\n endTime: number,\n options?: { live?: boolean },\n ): unknown\n }\n readonly storageEstimator: {\n estimateForDevice(\n deviceId: string,\n motionInput?: { avgEventsPerDay: number; avgDurationSec: number },\n ): { totalEstimatedGb: number; [key: string]: unknown }\n }\n}\n\n/**\n * Minimal recording database interface for the server's recording router.\n */\nexport interface IRecordingDb {\n upsertStorageConfig(config: {\n deviceId: string\n dataCategory: string\n storageName: string\n subDirectory: string\n retentionDays: number | null\n retentionGb: number | null\n }): void\n getPolicy(deviceId: string): unknown\n getEnabledPolicies(): Array<{ deviceId: string; [key: string]: unknown }>\n querySegments(deviceId: string, streamId: string, startTime: number, endTime: number): unknown\n getAvailability(deviceId: string, startTime: number, endTime: number): unknown\n getStorageUsage(deviceId: string, streamId: string): unknown\n upsertPolicy(policy: unknown): void\n findNearestThumbnail(deviceId: string, timestamp: number, category: string): unknown\n getMotionStats(deviceId: string, startTime: number, endTime: number): {\n avgEventsPerDay: number\n avgDurationSec: number\n dutyCyclePercent: number\n totalEvents: number\n }\n resolveStorageConfig(deviceId: string, dataCategory: string): unknown\n}\n\n// ---------------------------------------------------------------------------\n// Sub-service interfaces — used by the server's thin NestJS wrappers\n// to receive delegates via CapabilityRegistry.\n// ---------------------------------------------------------------------------\n\nexport interface IEventPersistence {\n start(): void\n stop(): void\n saveDetectionCrops(eventId: string, crops: readonly ObjectSnapshotResult[]): void\n saveAnnotatedFrame(eventId: string, result: AnnotatedSnapshotResult): void\n saveOriginalFrame(eventId: string, frame: import('./camera-pipeline.js').VideoFrame): Promise<void>\n getEventMedia(eventId: string): Promise<unknown>\n getTrackMedia(trackId: string): Promise<unknown>\n getDeviceMedia(deviceId: string, since?: number, until?: number): Promise<unknown>\n getBufferStatus(): unknown\n flush(): Promise<void>\n}\n\nexport interface ITrackTrail {\n setConfig(deviceId: string, config: Partial<TrackCaptureConfig>): void\n getConfig(deviceId: string): unknown\n recordFrame(ctx: unknown): Promise<void>\n getActiveTrail(trackId: string): unknown\n getActiveTrails(deviceId: string): unknown\n getPersistedTrail(trackId: string): Promise<unknown>\n getTrail(trackId: string): Promise<unknown>\n listTrails(deviceId: string, options?: {\n since?: number\n until?: number\n limit?: number\n className?: string\n }): Promise<unknown>\n}\n\nexport interface IRetention {\n start(): void\n stop(): void\n runCleanup(): Promise<unknown>\n setConfig(update: Partial<RetentionConfig>): void\n getConfig(): unknown\n forceCleanup(): Promise<unknown>\n}\n\nexport interface ISessionTracker {\n updateFromAnalysis(deviceId: string, ctx: unknown): void\n getActiveTracks(deviceId: string): unknown\n getAllActiveTracks(): unknown\n getTrack(deviceId: string, trackId: string): unknown\n getTrackCounts(): unknown\n clearDevice(deviceId: string): void\n clearAll(): void\n getGlobalPool(): unknown\n}\n\nexport interface IKnownFaces {\n register(entry: KnownFaceEntry): Promise<void>\n listAll(): Promise<unknown>\n delete(id: string): Promise<void>\n update(id: string, updates: Partial<Pick<KnownFaceEntry, 'label' | 'group'>>): Promise<void>\n recalculateEmbedding(id: string, clipRecognizer: ClipRecognizer): Promise<void>\n findMatch(embedding: Float32Array, threshold: number): Promise<unknown>\n batchRegister(\n entries: ReadonlyArray<{ readonly label: string; readonly cropBase64: string; readonly group?: string }>,\n clipRecognizer: ClipRecognizer,\n ): Promise<unknown>\n}\n\n/**\n * Composite interface exposed via CapabilityRegistry as the\n * 'analysis-data-persistence' singleton. Each sub-service is wired\n * individually to the corresponding NestJS wrapper service.\n */\nexport interface IAnalysisDataPersistence {\n readonly eventPersistence: IEventPersistence\n readonly knownFaces: IKnownFaces\n readonly sessionTracker: ISessionTracker\n readonly retention: IRetention\n readonly trackTrail: ITrackTrail\n}\n\n// ---------------------------------------------------------------------------\n// Provider Connection Testing\n// ---------------------------------------------------------------------------\n\nexport interface TestConnectionResult {\n readonly success: boolean\n readonly version?: string\n readonly cameraCount?: number\n readonly error?: string\n}\n\n/**\n * Generic interface for testing provider connections.\n * Each provider addon can expose a connection tester.\n */\nexport interface IProviderConnectionTester {\n testConnection(): Promise<TestConnectionResult>\n}\n","export const HF_REPO = 'camstack/camstack-models'\nexport const HF_BASE_URL = `https://huggingface.co/${HF_REPO}/resolve/main`\n","export function hfModelUrl(repo: string, path: string): string {\n return `https://huggingface.co/${repo}/resolve/main/${path}`\n}\n","/** Cosine similarity between two embedding vectors */\nexport function cosineSimilarity(a: Float32Array, b: Float32Array): number {\n if (a.length !== b.length) return 0\n let dotProduct = 0\n let normA = 0\n let normB = 0\n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i]! * b[i]!\n normA += a[i]! * a[i]!\n normB += b[i]! * b[i]!\n }\n const denom = Math.sqrt(normA) * Math.sqrt(normB)\n return denom === 0 ? 0 : dotProduct / denom\n}\n","import type { LabelDefinition, ClassMapDefinition } from '../types/labels.js'\n\nexport const COCO_80_LABELS: readonly LabelDefinition[] = [\n { id: 'person', name: 'Person' },\n { id: 'bicycle', name: 'Bicycle' },\n { id: 'car', name: 'Car' },\n { id: 'motorcycle', name: 'Motorcycle' },\n { id: 'airplane', name: 'Airplane' },\n { id: 'bus', name: 'Bus' },\n { id: 'train', name: 'Train' },\n { id: 'truck', name: 'Truck' },\n { id: 'boat', name: 'Boat' },\n { id: 'traffic light', name: 'Traffic Light' },\n { id: 'fire hydrant', name: 'Fire Hydrant' },\n { id: 'stop sign', name: 'Stop Sign' },\n { id: 'parking meter', name: 'Parking Meter' },\n { id: 'bench', name: 'Bench' },\n { id: 'bird', name: 'Bird' },\n { id: 'cat', name: 'Cat' },\n { id: 'dog', name: 'Dog' },\n { id: 'horse', name: 'Horse' },\n { id: 'sheep', name: 'Sheep' },\n { id: 'cow', name: 'Cow' },\n { id: 'elephant', name: 'Elephant' },\n { id: 'bear', name: 'Bear' },\n { id: 'zebra', name: 'Zebra' },\n { id: 'giraffe', name: 'Giraffe' },\n { id: 'backpack', name: 'Backpack' },\n { id: 'umbrella', name: 'Umbrella' },\n { id: 'handbag', name: 'Handbag' },\n { id: 'tie', name: 'Tie' },\n { id: 'suitcase', name: 'Suitcase' },\n { id: 'frisbee', name: 'Frisbee' },\n { id: 'skis', name: 'Skis' },\n { id: 'snowboard', name: 'Snowboard' },\n { id: 'sports ball', name: 'Sports Ball' },\n { id: 'kite', name: 'Kite' },\n { id: 'baseball bat', name: 'Baseball Bat' },\n { id: 'baseball glove', name: 'Baseball Glove' },\n { id: 'skateboard', name: 'Skateboard' },\n { id: 'surfboard', name: 'Surfboard' },\n { id: 'tennis racket', name: 'Tennis Racket' },\n { id: 'bottle', name: 'Bottle' },\n { id: 'wine glass', name: 'Wine Glass' },\n { id: 'cup', name: 'Cup' },\n { id: 'fork', name: 'Fork' },\n { id: 'knife', name: 'Knife' },\n { id: 'spoon', name: 'Spoon' },\n { id: 'bowl', name: 'Bowl' },\n { id: 'banana', name: 'Banana' },\n { id: 'apple', name: 'Apple' },\n { id: 'sandwich', name: 'Sandwich' },\n { id: 'orange', name: 'Orange' },\n { id: 'broccoli', name: 'Broccoli' },\n { id: 'carrot', name: 'Carrot' },\n { id: 'hot dog', name: 'Hot Dog' },\n { id: 'pizza', name: 'Pizza' },\n { id: 'donut', name: 'Donut' },\n { id: 'cake', name: 'Cake' },\n { id: 'chair', name: 'Chair' },\n { id: 'couch', name: 'Couch' },\n { id: 'potted plant', name: 'Potted Plant' },\n { id: 'bed', name: 'Bed' },\n { id: 'dining table', name: 'Dining Table' },\n { id: 'toilet', name: 'Toilet' },\n { id: 'tv', name: 'TV' },\n { id: 'laptop', name: 'Laptop' },\n { id: 'mouse', name: 'Mouse' },\n { id: 'remote', name: 'Remote' },\n { id: 'keyboard', name: 'Keyboard' },\n { id: 'cell phone', name: 'Cell Phone' },\n { id: 'microwave', name: 'Microwave' },\n { id: 'oven', name: 'Oven' },\n { id: 'toaster', name: 'Toaster' },\n { id: 'sink', name: 'Sink' },\n { id: 'refrigerator', name: 'Refrigerator' },\n { id: 'book', name: 'Book' },\n { id: 'clock', name: 'Clock' },\n { id: 'vase', name: 'Vase' },\n { id: 'scissors', name: 'Scissors' },\n { id: 'teddy bear', name: 'Teddy Bear' },\n { id: 'hair drier', name: 'Hair Drier' },\n { id: 'toothbrush', name: 'Toothbrush' },\n] as const\n\nexport const MACRO_LABELS: readonly LabelDefinition[] = [\n { id: 'person', name: 'Person' },\n { id: 'vehicle', name: 'Vehicle' },\n { id: 'animal', name: 'Animal' },\n] as const\n\nexport const COCO_TO_MACRO: ClassMapDefinition = {\n mapping: {\n person: 'person',\n bicycle: 'vehicle',\n car: 'vehicle',\n motorcycle: 'vehicle',\n airplane: 'vehicle',\n bus: 'vehicle',\n train: 'vehicle',\n truck: 'vehicle',\n boat: 'vehicle',\n bird: 'animal',\n cat: 'animal',\n dog: 'animal',\n horse: 'animal',\n sheep: 'animal',\n cow: 'animal',\n elephant: 'animal',\n bear: 'animal',\n zebra: 'animal',\n giraffe: 'animal',\n },\n preserveOriginal: true,\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/types",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Shared types, interfaces, and model catalogs for the CamStack detection ecosystem",
|
|
5
|
+
"keywords": ["camstack", "types", "typescript", "camera", "detection", "nvr"],
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/camstack/server"
|
|
10
|
+
},
|
|
5
11
|
"main": "./dist/index.js",
|
|
6
12
|
"module": "./dist/index.mjs",
|
|
7
13
|
"types": "./dist/index.d.ts",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { A as ANIMAL_TYPE_MODELS, d as AUDIO_CLASSIFICATION_MODELS, B as BIRD_NABIRDS_MODELS, e as BIRD_SPECIES_MODELS, f as COCO_80_LABELS, g as COCO_TO_MACRO, F as FACE_DETECTION_MODELS, h as FACE_RECOGNITION_MODELS, i as MACRO_LABELS, O as OBJECT_DETECTION_MODELS, P as PLATE_DETECTION_MODELS, m as PLATE_RECOGNITION_MODELS, S as SEGMENTATION_MODELS } from '../index-B9wf2RhV.mjs';
|
package/dist/catalogs/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { A as ANIMAL_TYPE_MODELS, d as AUDIO_CLASSIFICATION_MODELS, B as BIRD_NABIRDS_MODELS, e as BIRD_SPECIES_MODELS, f as COCO_80_LABELS, g as COCO_TO_MACRO, F as FACE_DETECTION_MODELS, h as FACE_RECOGNITION_MODELS, i as MACRO_LABELS, O as OBJECT_DETECTION_MODELS, P as PLATE_DETECTION_MODELS, m as PLATE_RECOGNITION_MODELS, S as SEGMENTATION_MODELS } from '../index-B9wf2RhV.js';
|