video-context-mcp-server 0.28.0-beta → 0.29.1-beta
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/generated/version.d.ts +1 -1
- package/dist/generated/version.js +1 -1
- package/dist/utils/downloadCache.d.ts +24 -0
- package/dist/utils/downloadCache.d.ts.map +1 -1
- package/dist/utils/downloadCache.js +63 -0
- package/dist/utils/downloadCache.js.map +1 -1
- package/dist/utils/videoUtils.d.ts +3 -0
- package/dist/utils/videoUtils.d.ts.map +1 -1
- package/dist/utils/videoUtils.js +66 -64
- package/dist/utils/videoUtils.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.
|
|
1
|
+
export declare const VERSION = "0.29.1-beta";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
|
@@ -56,10 +56,34 @@ export declare function getCachedDownload(url: string): Promise<string | null>;
|
|
|
56
56
|
* @param filePath - Absolute path to the local file (should be inside the cache dir)
|
|
57
57
|
*/
|
|
58
58
|
export declare function registerCachedDownload(url: string, filePath: string): void;
|
|
59
|
+
/**
|
|
60
|
+
* Returns a local file path for `url`, downloading it at most once even when
|
|
61
|
+
* multiple concurrent callers request the same URL simultaneously.
|
|
62
|
+
*
|
|
63
|
+
* Resolution order:
|
|
64
|
+
* 1. Completed cache hit → return cached path immediately
|
|
65
|
+
* 2. In-flight download found → await the in-progress Promise (no duplicate download)
|
|
66
|
+
* 3. Cache miss + no in-flight → call `downloader()`, register the Promise, cache on success
|
|
67
|
+
*
|
|
68
|
+
* When caching is disabled (`VIDEO_MCP_CACHE_TTL_MINUTES=0`) this function
|
|
69
|
+
* calls the downloader directly without coalescing, because there is no shared
|
|
70
|
+
* cache directory to unify file paths across different callers' tempDirs.
|
|
71
|
+
*
|
|
72
|
+
* @param url - Source URL (used as the deduplication key)
|
|
73
|
+
* @param downloader - Async function that performs the actual download and
|
|
74
|
+
* returns the absolute path to the downloaded file.
|
|
75
|
+
*/
|
|
76
|
+
export declare function getOrDownload(url: string, downloader: () => Promise<string>): Promise<string>;
|
|
59
77
|
/**
|
|
60
78
|
* Clears the in-memory cache map and resets the cached directory path.
|
|
61
79
|
* Exposed for testing purposes only — do not call in production code.
|
|
62
80
|
* @internal
|
|
63
81
|
*/
|
|
64
82
|
export declare function _clearCache(): void;
|
|
83
|
+
/**
|
|
84
|
+
* Clears the in-flight pending downloads map.
|
|
85
|
+
* Exposed for testing purposes only — do not call in production code.
|
|
86
|
+
* @internal
|
|
87
|
+
*/
|
|
88
|
+
export declare function _clearPendingDownloads(): void;
|
|
65
89
|
//# sourceMappingURL=downloadCache.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadCache.d.ts","sourceRoot":"","sources":["../../src/utils/downloadCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"downloadCache.d.ts","sourceRoot":"","sources":["../../src/utils/downloadCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AA8BH;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAMtC;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAM3C;AAMD;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAMtD;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqB3E;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAI1E;AAkDD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAChC,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAMD;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAGlC;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
|
|
@@ -20,8 +20,14 @@
|
|
|
20
20
|
import * as fs from 'fs/promises';
|
|
21
21
|
import * as path from 'path';
|
|
22
22
|
import { tmpdir } from 'os';
|
|
23
|
+
import { logProgress } from './logger.js';
|
|
23
24
|
/** In-memory URL → file path map */
|
|
24
25
|
const cache = new Map();
|
|
26
|
+
/**
|
|
27
|
+
* In-flight download promises — coalesces concurrent downloads for the same URL
|
|
28
|
+
* so only one yt-dlp / fetch process runs at a time per URL.
|
|
29
|
+
*/
|
|
30
|
+
const pendingDownloads = new Map();
|
|
25
31
|
/** Resolved cache directory path (lazily initialised) */
|
|
26
32
|
let _cacheDirPath = null;
|
|
27
33
|
// ---------------------------------------------------------------------------
|
|
@@ -164,6 +170,55 @@ function evictLRUEntries() {
|
|
|
164
170
|
}
|
|
165
171
|
}
|
|
166
172
|
// ---------------------------------------------------------------------------
|
|
173
|
+
// In-flight deduplication (Promise coalescing)
|
|
174
|
+
// ---------------------------------------------------------------------------
|
|
175
|
+
/**
|
|
176
|
+
* Returns a local file path for `url`, downloading it at most once even when
|
|
177
|
+
* multiple concurrent callers request the same URL simultaneously.
|
|
178
|
+
*
|
|
179
|
+
* Resolution order:
|
|
180
|
+
* 1. Completed cache hit → return cached path immediately
|
|
181
|
+
* 2. In-flight download found → await the in-progress Promise (no duplicate download)
|
|
182
|
+
* 3. Cache miss + no in-flight → call `downloader()`, register the Promise, cache on success
|
|
183
|
+
*
|
|
184
|
+
* When caching is disabled (`VIDEO_MCP_CACHE_TTL_MINUTES=0`) this function
|
|
185
|
+
* calls the downloader directly without coalescing, because there is no shared
|
|
186
|
+
* cache directory to unify file paths across different callers' tempDirs.
|
|
187
|
+
*
|
|
188
|
+
* @param url - Source URL (used as the deduplication key)
|
|
189
|
+
* @param downloader - Async function that performs the actual download and
|
|
190
|
+
* returns the absolute path to the downloaded file.
|
|
191
|
+
*/
|
|
192
|
+
export async function getOrDownload(url, downloader) {
|
|
193
|
+
// Short-circuit when caching is off — no shared path to coalesce on
|
|
194
|
+
if (!isCachingEnabled()) {
|
|
195
|
+
return downloader();
|
|
196
|
+
}
|
|
197
|
+
// 1. Completed cache hit
|
|
198
|
+
const cached = await getCachedDownload(url);
|
|
199
|
+
if (cached)
|
|
200
|
+
return cached;
|
|
201
|
+
// 2. In-flight hit — piggy-back on the existing Promise
|
|
202
|
+
const pending = pendingDownloads.get(url);
|
|
203
|
+
if (pending) {
|
|
204
|
+
await logProgress('Waiting for download already in progress…');
|
|
205
|
+
return pending;
|
|
206
|
+
}
|
|
207
|
+
// 3. Start a new download and register the Promise
|
|
208
|
+
const downloadPromise = downloader()
|
|
209
|
+
.then((filePath) => {
|
|
210
|
+
registerCachedDownload(url, filePath);
|
|
211
|
+
pendingDownloads.delete(url);
|
|
212
|
+
return filePath;
|
|
213
|
+
})
|
|
214
|
+
.catch((err) => {
|
|
215
|
+
pendingDownloads.delete(url);
|
|
216
|
+
throw err;
|
|
217
|
+
});
|
|
218
|
+
pendingDownloads.set(url, downloadPromise);
|
|
219
|
+
return downloadPromise;
|
|
220
|
+
}
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
167
222
|
// Testing helpers
|
|
168
223
|
// ---------------------------------------------------------------------------
|
|
169
224
|
/**
|
|
@@ -175,4 +230,12 @@ export function _clearCache() {
|
|
|
175
230
|
cache.clear();
|
|
176
231
|
_cacheDirPath = null;
|
|
177
232
|
}
|
|
233
|
+
/**
|
|
234
|
+
* Clears the in-flight pending downloads map.
|
|
235
|
+
* Exposed for testing purposes only — do not call in production code.
|
|
236
|
+
* @internal
|
|
237
|
+
*/
|
|
238
|
+
export function _clearPendingDownloads() {
|
|
239
|
+
pendingDownloads.clear();
|
|
240
|
+
}
|
|
178
241
|
//# sourceMappingURL=downloadCache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadCache.js","sourceRoot":"","sources":["../../src/utils/downloadCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"downloadCache.js","sourceRoot":"","sources":["../../src/utils/downloadCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,6 +49,9 @@ export declare function isYtDlpAvailable(): Promise<boolean>;
|
|
|
49
49
|
* Downloads a platform video (YouTube, Vimeo, etc.) using yt-dlp and returns
|
|
50
50
|
* the local path.
|
|
51
51
|
*
|
|
52
|
+
* Concurrent calls for the same URL are coalesced: only one yt-dlp process
|
|
53
|
+
* runs at a time per URL; subsequent callers await the first download.
|
|
54
|
+
*
|
|
52
55
|
* When caching is enabled (VIDEO_MCP_CACHE_TTL_MINUTES > 0):
|
|
53
56
|
* - Returns the cached path on a cache hit (no download).
|
|
54
57
|
* - Downloads to the persistent cache directory on a miss and registers the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"videoUtils.d.ts","sourceRoot":"","sources":["../../src/utils/videoUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"videoUtils.d.ts","sourceRoot":"","sources":["../../src/utils/videoUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkCH;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGhE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAa5D;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAuCjB;AAgCD;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUjD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUlD;AAKD;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAgBzD;AA6HD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAWjB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAG7C;AAMD,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAA;AAEzD,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,MAAM,EAAE,WAAW,CAAA;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,CAkC7B"}
|
package/dist/utils/videoUtils.js
CHANGED
|
@@ -9,7 +9,7 @@ import { fileURLToPath } from 'url';
|
|
|
9
9
|
import { youtubeDl as youtubeDlExec, create as createYtDlp, } from 'youtube-dl-exec';
|
|
10
10
|
import { createTempDir, generateTempFilename } from './tempFiles.js';
|
|
11
11
|
import { logProgress } from './logger.js';
|
|
12
|
-
import { isCachingEnabled, ensureCacheDir,
|
|
12
|
+
import { isCachingEnabled, ensureCacheDir, getOrDownload, } from './downloadCache.js';
|
|
13
13
|
import { isPro, proNotice } from './license.js';
|
|
14
14
|
/** Free-tier cap for max download resolution. Pro users have no cap. */
|
|
15
15
|
const FREE_MAX_RESOLUTION = 720;
|
|
@@ -68,41 +68,38 @@ export function normalizeVideoPath(videoPath) {
|
|
|
68
68
|
* @param tempDir - Fallback scratch directory used only when caching is disabled
|
|
69
69
|
*/
|
|
70
70
|
export async function downloadVideoToTemp(url, tempDir) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
71
|
+
return getOrDownload(url, async () => {
|
|
72
|
+
// ── HTML detection: fall back to yt-dlp for non-video responses ─────────
|
|
73
|
+
// Some yt-dlp-supported sites not listed in PLATFORM_DOMAINS serve HTML
|
|
74
|
+
// pages instead of raw video bytes. Detect this early via a HEAD request
|
|
75
|
+
// and reroute through yt-dlp when available.
|
|
76
|
+
//
|
|
77
|
+
// IMPORTANT: call _rawYtDlpDownload (not downloadWithYtDlp) here to avoid
|
|
78
|
+
// re-entering getOrDownload for the same URL — which would deadlock because
|
|
79
|
+
// the outer getOrDownload has already stored this URL in pendingDownloads.
|
|
80
|
+
try {
|
|
81
|
+
const headRes = await fetch(url, { method: 'HEAD' });
|
|
82
|
+
const ct = headRes.headers.get('content-type') ?? '';
|
|
83
|
+
if ((ct.includes('text/html') || ct.includes('text/xml')) &&
|
|
84
|
+
(await isYtDlpAvailable())) {
|
|
85
|
+
await logProgress('URL returned HTML instead of video — falling back to yt-dlp...');
|
|
86
|
+
return _rawYtDlpDownload(url, tempDir);
|
|
87
|
+
}
|
|
88
88
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
registerCachedDownload(url, outputPath);
|
|
104
|
-
}
|
|
105
|
-
return outputPath;
|
|
89
|
+
catch {
|
|
90
|
+
// HEAD not supported or network error — fall through to direct fetch
|
|
91
|
+
}
|
|
92
|
+
// ── Download ─────────────────────────────────────────────────────────────
|
|
93
|
+
const outputDir = isCachingEnabled() ? await ensureCacheDir() : tempDir;
|
|
94
|
+
const outputPath = path.join(outputDir, generateTempFilename('.mp4'));
|
|
95
|
+
const response = await fetch(url);
|
|
96
|
+
if (!response.ok) {
|
|
97
|
+
throw new Error(`Failed to download video: ${response.statusText}`);
|
|
98
|
+
}
|
|
99
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
100
|
+
await pipeline(response.body, createWriteStream(outputPath));
|
|
101
|
+
return outputPath;
|
|
102
|
+
});
|
|
106
103
|
}
|
|
107
104
|
// ---------------------------------------------------------------------------
|
|
108
105
|
// Platform video support via yt-dlp
|
|
@@ -211,34 +208,15 @@ function classifyYtDlpError(stderr) {
|
|
|
211
208
|
return `yt-dlp download failed:\n${stderr}`;
|
|
212
209
|
}
|
|
213
210
|
/**
|
|
214
|
-
*
|
|
215
|
-
* the
|
|
211
|
+
* Internal: performs the actual yt-dlp binary execution and returns the local
|
|
212
|
+
* file path. Does NOT interact with the download cache or the coalescing layer —
|
|
213
|
+
* callers are responsible for wrapping this with `getOrDownload()` if needed.
|
|
216
214
|
*
|
|
217
|
-
*
|
|
218
|
-
*
|
|
219
|
-
*
|
|
220
|
-
* result so subsequent calls return instantly.
|
|
221
|
-
*
|
|
222
|
-
* Respects YT_DLP_MAX_RESOLUTION (default 720), YT_DLP_PATH, and YT_DLP_COOKIES_FILE.
|
|
223
|
-
*
|
|
224
|
-
* @param url - Platform video URL
|
|
225
|
-
* @param tempDir - Fallback scratch directory used only when caching is disabled
|
|
226
|
-
* @returns - Absolute path to the downloaded video file
|
|
215
|
+
* Separated from `downloadWithYtDlp` so that `downloadVideoToTemp`'s HTML-
|
|
216
|
+
* fallback path can call yt-dlp without re-entering `getOrDownload` for the
|
|
217
|
+
* same URL (which would deadlock).
|
|
227
218
|
*/
|
|
228
|
-
|
|
229
|
-
// ── Pro gate: free users can only download from YouTube ────────────────
|
|
230
|
-
if (!isPro() && !isYouTubeUrl(url)) {
|
|
231
|
-
throw new Error(proNotice('Platform downloads (non-YouTube)') +
|
|
232
|
-
'\nFree-tier users can only download from YouTube. ' +
|
|
233
|
-
'This URL requires a pro license.');
|
|
234
|
-
}
|
|
235
|
-
// ── Cache hit ──────────────────────────────────────────────────────────────
|
|
236
|
-
const cached = await getCachedDownload(url);
|
|
237
|
-
if (cached) {
|
|
238
|
-
await logProgress(`Cache hit: reusing ${path.basename(cached)}`);
|
|
239
|
-
return cached;
|
|
240
|
-
}
|
|
241
|
-
// ── Download ───────────────────────────────────────────────────────────────
|
|
219
|
+
async function _rawYtDlpDownload(url, tempDir) {
|
|
242
220
|
const envMaxRes = getEnvMaxResolution();
|
|
243
221
|
const maxRes = isPro() ? envMaxRes : Math.min(envMaxRes, FREE_MAX_RESOLUTION);
|
|
244
222
|
const format = `bestvideo[height<=${maxRes}][ext=mp4]+bestaudio[ext=m4a]` +
|
|
@@ -297,11 +275,35 @@ export async function downloadWithYtDlp(url, tempDir) {
|
|
|
297
275
|
}
|
|
298
276
|
const downloadedPath = path.join(outputDir, outputFile);
|
|
299
277
|
await logProgress(`Download complete: ${outputFile}`);
|
|
300
|
-
if (isCachingEnabled()) {
|
|
301
|
-
registerCachedDownload(url, downloadedPath);
|
|
302
|
-
}
|
|
303
278
|
return downloadedPath;
|
|
304
279
|
}
|
|
280
|
+
/**
|
|
281
|
+
* Downloads a platform video (YouTube, Vimeo, etc.) using yt-dlp and returns
|
|
282
|
+
* the local path.
|
|
283
|
+
*
|
|
284
|
+
* Concurrent calls for the same URL are coalesced: only one yt-dlp process
|
|
285
|
+
* runs at a time per URL; subsequent callers await the first download.
|
|
286
|
+
*
|
|
287
|
+
* When caching is enabled (VIDEO_MCP_CACHE_TTL_MINUTES > 0):
|
|
288
|
+
* - Returns the cached path on a cache hit (no download).
|
|
289
|
+
* - Downloads to the persistent cache directory on a miss and registers the
|
|
290
|
+
* result so subsequent calls return instantly.
|
|
291
|
+
*
|
|
292
|
+
* Respects YT_DLP_MAX_RESOLUTION (default 720), YT_DLP_PATH, and YT_DLP_COOKIES_FILE.
|
|
293
|
+
*
|
|
294
|
+
* @param url - Platform video URL
|
|
295
|
+
* @param tempDir - Fallback scratch directory used only when caching is disabled
|
|
296
|
+
* @returns - Absolute path to the downloaded video file
|
|
297
|
+
*/
|
|
298
|
+
export async function downloadWithYtDlp(url, tempDir) {
|
|
299
|
+
// ── Pro gate: free users can only download from YouTube ────────────────
|
|
300
|
+
if (!isPro() && !isYouTubeUrl(url)) {
|
|
301
|
+
throw new Error(proNotice('Platform downloads (non-YouTube)') +
|
|
302
|
+
'\nFree-tier users can only download from YouTube. ' +
|
|
303
|
+
'This URL requires a pro license.');
|
|
304
|
+
}
|
|
305
|
+
return getOrDownload(url, () => _rawYtDlpDownload(url, tempDir));
|
|
306
|
+
}
|
|
305
307
|
/**
|
|
306
308
|
* Returns true when the user requested a higher resolution than the free-tier
|
|
307
309
|
* cap (720p) and does not have a pro license. Used by tool handlers to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"videoUtils.js","sourceRoot":"","sources":["../../src/utils/videoUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,IAAI,CAAA;AACtC,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EACL,SAAS,IAAI,aAAa,EAC1B,MAAM,IAAI,WAAW,GAEtB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,
|
|
1
|
+
{"version":3,"file":"videoUtils.js","sourceRoot":"","sources":["../../src/utils/videoUtils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "video-context-mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.29.1-beta",
|
|
4
4
|
"description": "A Model Context Protocol server that gives GitHub Copilot the ability to understand and analyze video content",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|