video-context-mcp-server 1.1.5 → 1.2.0
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/README.md +40 -27
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.js +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/services/ffmpeg.d.ts +37 -0
- package/dist/services/ffmpeg.d.ts.map +1 -1
- package/dist/services/ffmpeg.js +175 -0
- package/dist/services/ffmpeg.js.map +1 -1
- package/dist/services/providerRouter.d.ts +9 -0
- package/dist/services/providerRouter.d.ts.map +1 -1
- package/dist/services/providerRouter.js +14 -0
- package/dist/services/providerRouter.js.map +1 -1
- package/dist/services/redactionDetector.d.ts +187 -0
- package/dist/services/redactionDetector.d.ts.map +1 -0
- package/dist/services/redactionDetector.js +766 -0
- package/dist/services/redactionDetector.js.map +1 -0
- package/dist/tools/analyzeVideo.d.ts.map +1 -1
- package/dist/tools/analyzeVideo.js +4 -3
- package/dist/tools/analyzeVideo.js.map +1 -1
- package/dist/tools/redactSensitive.d.ts +11 -0
- package/dist/tools/redactSensitive.d.ts.map +1 -0
- package/dist/tools/redactSensitive.js +466 -0
- package/dist/tools/redactSensitive.js.map +1 -0
- package/dist/tools/schemas.d.ts +53 -0
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +87 -0
- package/dist/tools/schemas.js.map +1 -1
- package/dist/tools/summarizeVideo.d.ts +17 -0
- package/dist/tools/summarizeVideo.d.ts.map +1 -1
- package/dist/tools/summarizeVideo.js +36 -2
- package/dist/tools/summarizeVideo.js.map +1 -1
- package/dist/types/redaction.d.ts +32 -0
- package/dist/types/redaction.d.ts.map +1 -0
- package/dist/types/redaction.js +5 -0
- package/dist/types/redaction.js.map +1 -0
- package/dist/utils/license.js +1 -1
- package/dist/utils/license.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redaction Detector
|
|
3
|
+
* AI-assisted sensitive region detection in video frames.
|
|
4
|
+
* Samples frames, sends to a vision provider, and parses JSON detections.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import type { RedactionRegion } from '../types/redaction.js';
|
|
8
|
+
/** Full detection response from the AI provider. */
|
|
9
|
+
export declare const detectionResponseSchema: z.ZodObject<{
|
|
10
|
+
frames: z.ZodArray<z.ZodObject<{
|
|
11
|
+
frameIndex: z.ZodNumber;
|
|
12
|
+
timestampSec: z.ZodNumber;
|
|
13
|
+
detections: z.ZodArray<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodObject<{
|
|
14
|
+
label: z.ZodString;
|
|
15
|
+
confidence: z.ZodNumber;
|
|
16
|
+
box: z.ZodOptional<z.ZodObject<{
|
|
17
|
+
left: z.ZodNumber;
|
|
18
|
+
top: z.ZodNumber;
|
|
19
|
+
width: z.ZodNumber;
|
|
20
|
+
height: z.ZodNumber;
|
|
21
|
+
}, z.core.$strip>>;
|
|
22
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
23
|
+
}, z.core.$strip>>>;
|
|
24
|
+
}, z.core.$strip>>;
|
|
25
|
+
}, z.core.$strip>;
|
|
26
|
+
export type DetectionResponse = z.infer<typeof detectionResponseSchema>;
|
|
27
|
+
export interface FrameDetection {
|
|
28
|
+
label: string;
|
|
29
|
+
confidence: number;
|
|
30
|
+
box: {
|
|
31
|
+
left: number;
|
|
32
|
+
top: number;
|
|
33
|
+
width: number;
|
|
34
|
+
height: number;
|
|
35
|
+
};
|
|
36
|
+
reason?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Supported detection categories inferred from a user's natural-language intent.
|
|
40
|
+
* Using an allowlist prevents prompt-injection: raw user text is NEVER
|
|
41
|
+
* interpolated into the AI prompt.
|
|
42
|
+
*/
|
|
43
|
+
export type DetectionCategory = 'credentials' | 'pii' | 'infrastructure' | 'financial' | 'general';
|
|
44
|
+
/**
|
|
45
|
+
* Classify a free-text intent string into one of the allowed detection
|
|
46
|
+
* categories. Returns 'general' when no specific category is recognised.
|
|
47
|
+
* Raw user text is never forwarded to the AI prompt.
|
|
48
|
+
*/
|
|
49
|
+
export declare function classifyIntent(intent: string): DetectionCategory;
|
|
50
|
+
/** Return the sampling/confidence defaults for a given intent category. */
|
|
51
|
+
export declare function getDetectionDefaults(category: DetectionCategory): {
|
|
52
|
+
sampleIntervalSeconds: number;
|
|
53
|
+
maxFrames: number;
|
|
54
|
+
minConfidence: number;
|
|
55
|
+
};
|
|
56
|
+
export interface SamplingOptions {
|
|
57
|
+
/** Interval between sampled frames in seconds. Default: 5. */
|
|
58
|
+
sampleIntervalSeconds?: number;
|
|
59
|
+
/** Maximum number of frames to sample. Default: 20. */
|
|
60
|
+
maxFrames?: number;
|
|
61
|
+
/** Video duration in seconds. */
|
|
62
|
+
duration: number;
|
|
63
|
+
}
|
|
64
|
+
export declare function computeSampleTimestamps(options: SamplingOptions): number[];
|
|
65
|
+
/**
|
|
66
|
+
* Options for running AI-assisted detection.
|
|
67
|
+
*/
|
|
68
|
+
export interface DetectionOptions {
|
|
69
|
+
/** Path to the video file. */
|
|
70
|
+
videoPath: string;
|
|
71
|
+
/** Video metadata. */
|
|
72
|
+
duration: number;
|
|
73
|
+
width: number;
|
|
74
|
+
height: number;
|
|
75
|
+
/** Sampling configuration. */
|
|
76
|
+
sampling?: SamplingOptions;
|
|
77
|
+
/** Minimum confidence threshold (0–1). Detections below this are dropped. Default: 0.5. */
|
|
78
|
+
minConfidence?: number;
|
|
79
|
+
/** Extra padding in pixels to expand each detected region. Default: 10. */
|
|
80
|
+
paddingPixels?: number;
|
|
81
|
+
/** Custom instructions to append to the detection prompt. */
|
|
82
|
+
customInstructions?: string;
|
|
83
|
+
/** Intent category inferred from the user's natural-language request. When set,
|
|
84
|
+
* the detection system prompt and sampling defaults are tuned for that category. */
|
|
85
|
+
intentCategory?: DetectionCategory;
|
|
86
|
+
/** AI provider client to use for detection. */
|
|
87
|
+
provider: DetectionProvider;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Provider-agnostic interface for vision-based detection.
|
|
91
|
+
* Each AI client expects images as { data: string; mimeType: string }[].
|
|
92
|
+
*/
|
|
93
|
+
export interface DetectionProvider {
|
|
94
|
+
analyzeImages(images: Array<{
|
|
95
|
+
data: string;
|
|
96
|
+
mimeType: string;
|
|
97
|
+
}>, prompt: string): Promise<string>;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Detection statistics returned alongside detected regions.
|
|
101
|
+
*/
|
|
102
|
+
export interface DetectionResult {
|
|
103
|
+
/** Confidence-filtered pixel-coordinate regions (before consolidation). */
|
|
104
|
+
regions: RedactionRegion[];
|
|
105
|
+
/** Number of frames that were sampled and sent to the AI provider. */
|
|
106
|
+
sampledFrames: number;
|
|
107
|
+
/** Total number of raw detections returned by the provider (before confidence filtering). */
|
|
108
|
+
rawDetectionsCount: number;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Run AI-assisted detection on a video.
|
|
112
|
+
*
|
|
113
|
+
* 1. Extract evenly-spaced frames
|
|
114
|
+
* 2. Convert frames to base64
|
|
115
|
+
* 3. Send to the AI provider for analysis
|
|
116
|
+
* 4. Parse and validate the JSON response
|
|
117
|
+
* 5. Convert normalized coordinates to pixel coordinates
|
|
118
|
+
* 6. Filter by confidence threshold
|
|
119
|
+
* 7. Apply padding expansion
|
|
120
|
+
*
|
|
121
|
+
* @returns Detection result with regions, frame count, and raw detection count
|
|
122
|
+
*/
|
|
123
|
+
export declare function detectSensitiveRegions(options: DetectionOptions): Promise<DetectionResult>;
|
|
124
|
+
export declare function parseDetectionResponse(responseText: string, videoWidth?: number, videoHeight?: number): DetectionResponse;
|
|
125
|
+
export declare function convertDetectionsToRegions(response: DetectionResponse, videoWidth: number, videoHeight: number, timestamps: number[], minConfidence: number, paddingPixels: number): RedactionRegion[];
|
|
126
|
+
/**
|
|
127
|
+
* Merge overlapping detections across frames into consolidated regions.
|
|
128
|
+
* Uses simple label + proximity matching (no full IOU in v1).
|
|
129
|
+
*/
|
|
130
|
+
export declare function mergeDetections(regions: RedactionRegion[], proximityThreshold?: number): RedactionRegion[];
|
|
131
|
+
/**
|
|
132
|
+
* Internal track representing a persistent detection across time.
|
|
133
|
+
*/
|
|
134
|
+
interface DetectionTrack {
|
|
135
|
+
label: string;
|
|
136
|
+
x: number;
|
|
137
|
+
y: number;
|
|
138
|
+
width: number;
|
|
139
|
+
height: number;
|
|
140
|
+
startTime: number;
|
|
141
|
+
endTime: number;
|
|
142
|
+
confidence: number;
|
|
143
|
+
frameCount: number;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Group detections into temporal tracks across adjacent sampled frames.
|
|
147
|
+
*
|
|
148
|
+
* Uses IOU overlap and label similarity to merge boxes that represent the
|
|
149
|
+
* same persistent secret across time. Treats persistent detections in
|
|
150
|
+
* roughly the same area as one track.
|
|
151
|
+
*
|
|
152
|
+
* @param regions - Flat list of per-frame detections (already converted to pixels)
|
|
153
|
+
* @param iouThreshold - Minimum IOU to consider two boxes the same track (default: 0.3)
|
|
154
|
+
* @param sampleInterval - Seconds between sampled frames (used for gap-filling)
|
|
155
|
+
* @returns Consolidated tracks with stable time ranges
|
|
156
|
+
*/
|
|
157
|
+
export declare function groupDetectionsIntoTracks(regions: RedactionRegion[], iouThreshold?: number, sampleInterval?: number): DetectionTrack[];
|
|
158
|
+
/**
|
|
159
|
+
* Convert temporal tracks into a final `RedactionPlan` with time ranges.
|
|
160
|
+
*
|
|
161
|
+
* - Start time: detection timestamp minus half the sample interval
|
|
162
|
+
* - End time: last detection timestamp plus half the sample interval
|
|
163
|
+
* - Clamp to video duration
|
|
164
|
+
* - Merge short gaps between nearby detections
|
|
165
|
+
* - Expand boxes slightly to absorb tiny camera/UI shifts
|
|
166
|
+
*
|
|
167
|
+
* @param tracks - Grouped detection tracks
|
|
168
|
+
* @param videoDuration - Total video duration in seconds
|
|
169
|
+
* @param sampleInterval - Seconds between sampled frames
|
|
170
|
+
* @param paddingPixels - Extra padding to expand each region
|
|
171
|
+
* @param videoWidth - Video width for clamping
|
|
172
|
+
* @param videoHeight - Video height for clamping
|
|
173
|
+
* @returns Final consolidated redaction regions
|
|
174
|
+
*/
|
|
175
|
+
export declare function tracksToRedactionPlan(tracks: DetectionTrack[], videoDuration: number, sampleInterval: number, paddingPixels: number, videoWidth: number, videoHeight: number): RedactionRegion[];
|
|
176
|
+
/**
|
|
177
|
+
* Full consolidation pipeline: raw detections → stable redaction regions.
|
|
178
|
+
*
|
|
179
|
+
* 1. Group detections into temporal tracks (IOU + label matching)
|
|
180
|
+
* 2. Convert tracks to time-bounded regions
|
|
181
|
+
* 3. Expand boxes and clamp to video bounds
|
|
182
|
+
*
|
|
183
|
+
* This replaces the simpler `mergeDetections()` for AI-mode detection.
|
|
184
|
+
*/
|
|
185
|
+
export declare function consolidateDetections(regions: RedactionRegion[], videoDuration: number, sampleInterval: number, paddingPixels: number, videoWidth: number, videoHeight: number, iouThreshold?: number): RedactionRegion[];
|
|
186
|
+
export {};
|
|
187
|
+
//# sourceMappingURL=redactionDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redactionDetector.d.ts","sourceRoot":"","sources":["../../src/services/redactionDetector.ts"],"names":[],"mappings":"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"}
|