video-context-mcp-server 0.26.1-beta → 0.27.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/README.md +2 -2
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.js +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/license.d.ts +57 -2
- package/dist/utils/license.d.ts.map +1 -1
- package/dist/utils/license.js +220 -11
- package/dist/utils/license.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -415,7 +415,7 @@ When a free-tier limit is reached, the tool falls back gracefully with a notice
|
|
|
415
415
|
|
|
416
416
|
### Getting a License
|
|
417
417
|
|
|
418
|
-
License keys are valid for **1 year
|
|
418
|
+
License keys are valid for **1 year**. Validation uses a hybrid approach: fast offline Ed25519 verification runs first, then a brief online heartbeat registers your device (up to **5 devices per key**) and enables revocation. The online check has a 5-second timeout; if the server is unreachable, the offline result is used as a fallback — you are never blocked by network issues. Contact the author to obtain a key.
|
|
419
419
|
|
|
420
420
|
Add `VIDEO_MCP_LICENSE_KEY` to your MCP config `env` block and restart the server:
|
|
421
421
|
|
|
@@ -427,7 +427,7 @@ Add `VIDEO_MCP_LICENSE_KEY` to your MCP config `env` block and restart the serve
|
|
|
427
427
|
}
|
|
428
428
|
```
|
|
429
429
|
|
|
430
|
-
> No registration
|
|
430
|
+
> No account registration required. Validation is offline-first — the brief online heartbeat enforces the device limit and enables revocation, but if the server is unreachable you are never blocked.
|
|
431
431
|
|
|
432
432
|
---
|
|
433
433
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.
|
|
1
|
+
export declare const VERSION = "0.27.1-beta";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,7 @@ import { searchTimestampTool } from './tools/searchTimestamp.js';
|
|
|
9
9
|
import { getVideoInfoTool } from './tools/getVideoInfo.js';
|
|
10
10
|
import { transcribeVideoTool } from './tools/transcribeVideo.js';
|
|
11
11
|
import { setLoggerServer } from './utils/logger.js';
|
|
12
|
+
import { initLicenseValidation } from './utils/license.js';
|
|
12
13
|
import { triggerUpdateCheck, waitForUpdateCheck, wrapWithUpdateNotice, } from './utils/updateCheck.js';
|
|
13
14
|
import { VERSION } from './generated/version.js';
|
|
14
15
|
import { analyzeVideoSchema, summarizeVideoSchema, extractFramesSchema, searchTimestampSchema, getVideoInfoSchema, transcribeVideoSchema, } from './tools/schemas.js';
|
|
@@ -28,6 +29,8 @@ async function main() {
|
|
|
28
29
|
});
|
|
29
30
|
// Wire up the logger so tools can emit progress notifications
|
|
30
31
|
setLoggerServer(server);
|
|
32
|
+
// Validate the pro license (offline Ed25519 + online heartbeat if key is set)
|
|
33
|
+
await initLicenseValidation();
|
|
31
34
|
/**
|
|
32
35
|
* Wrap a tool handler to:
|
|
33
36
|
* 1. Trigger the background update-check on the first call (fire-and-forget)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/license.d.ts
CHANGED
|
@@ -9,6 +9,12 @@
|
|
|
9
9
|
* The license key is read from the VIDEO_MCP_LICENSE_KEY environment variable.
|
|
10
10
|
*
|
|
11
11
|
* Tokens are valid for 1 year from issuance (exp = iat + 365 days).
|
|
12
|
+
*
|
|
13
|
+
* Hybrid validation: offline Ed25519 check runs first (fast path). When a key
|
|
14
|
+
* is present, `initLicenseValidation()` also performs an online heartbeat to
|
|
15
|
+
* register this device and enforce the 5-device-per-license limit. The online
|
|
16
|
+
* check has a 5-second timeout; on failure the offline result is used as a
|
|
17
|
+
* fallback so legitimate users are never blocked by network issues.
|
|
12
18
|
*/
|
|
13
19
|
export interface LicensePayload {
|
|
14
20
|
email: string;
|
|
@@ -22,6 +28,19 @@ export interface LicenseInfo {
|
|
|
22
28
|
email?: string;
|
|
23
29
|
expiresAt?: Date;
|
|
24
30
|
reason?: string;
|
|
31
|
+
/** Reason returned by the online validation server (e.g. 'device_limit_exceeded', 'revoked') */
|
|
32
|
+
onlineReason?: string;
|
|
33
|
+
/** Number of devices currently consuming this license (from online check) */
|
|
34
|
+
devicesUsed?: number;
|
|
35
|
+
/** Maximum devices allowed for this license (from online check) */
|
|
36
|
+
deviceLimit?: number;
|
|
37
|
+
}
|
|
38
|
+
/** Result returned by the online validation endpoint */
|
|
39
|
+
export interface OnlineValidationResult {
|
|
40
|
+
valid: boolean;
|
|
41
|
+
reason?: string;
|
|
42
|
+
devicesUsed?: number;
|
|
43
|
+
deviceLimit?: number;
|
|
25
44
|
}
|
|
26
45
|
/**
|
|
27
46
|
* Resets the cached license validation result.
|
|
@@ -29,6 +48,26 @@ export interface LicenseInfo {
|
|
|
29
48
|
* @internal
|
|
30
49
|
*/
|
|
31
50
|
export declare function _resetLicenseCache(): void;
|
|
51
|
+
/**
|
|
52
|
+
* Directly sets the license cache for testing purposes.
|
|
53
|
+
* Allows simulating a pre-validated cache state (e.g. stale online check).
|
|
54
|
+
* @internal
|
|
55
|
+
*/
|
|
56
|
+
export declare function _setLicenseCacheForTesting(result: LicenseInfo, validatedAt: number, onlineChecked: boolean): void;
|
|
57
|
+
/**
|
|
58
|
+
* Returns a stable, non-PII 16-character hex device identifier.
|
|
59
|
+
* Computed as the first 16 hex chars of:
|
|
60
|
+
* SHA-256(hostname + platform + arch + username)
|
|
61
|
+
*/
|
|
62
|
+
export declare function getDeviceFingerprint(): string;
|
|
63
|
+
/**
|
|
64
|
+
* Sends a heartbeat to the license validation server.
|
|
65
|
+
*
|
|
66
|
+
* @param token - The raw license token string
|
|
67
|
+
* @param fingerprint - Device fingerprint from `getDeviceFingerprint()`
|
|
68
|
+
* @returns - Online validation result (valid + metadata)
|
|
69
|
+
*/
|
|
70
|
+
export declare function validateOnline(token: string, fingerprint: string): Promise<OnlineValidationResult>;
|
|
32
71
|
/**
|
|
33
72
|
* Validates a raw license token string and returns detailed info.
|
|
34
73
|
*
|
|
@@ -36,14 +75,30 @@ export declare function _resetLicenseCache(): void;
|
|
|
36
75
|
* @param nowSec - Current time in Unix seconds (overridable for testing)
|
|
37
76
|
*/
|
|
38
77
|
export declare function validateLicenseToken(token: string, nowSec?: number): LicenseInfo;
|
|
78
|
+
/**
|
|
79
|
+
* Initializes the license validation cache by running both offline and
|
|
80
|
+
* (if a key is present and offline passes) online validation.
|
|
81
|
+
*
|
|
82
|
+
* Must be called once at process startup before the first `isPro()` call.
|
|
83
|
+
* Subsequent `isPro()` calls return the cached result synchronously.
|
|
84
|
+
*
|
|
85
|
+
* Worst-case startup delay: 5 s (only when online check times out).
|
|
86
|
+
*/
|
|
87
|
+
export declare function initLicenseValidation(): Promise<void>;
|
|
39
88
|
/**
|
|
40
89
|
* Returns detailed license validation info.
|
|
41
|
-
*
|
|
90
|
+
*
|
|
91
|
+
* Uses the cache populated by `initLicenseValidation()`. If the cache is stale
|
|
92
|
+
* (> 24 h since last online check), the last known result is returned and a
|
|
93
|
+
* background refresh is triggered for the next call.
|
|
94
|
+
*
|
|
95
|
+
* Falls back to a synchronous offline check if the cache was never populated
|
|
96
|
+
* (e.g. in tests or if `initLicenseValidation()` was not called).
|
|
42
97
|
*/
|
|
43
98
|
export declare function getLicenseInfo(): LicenseInfo;
|
|
44
99
|
/**
|
|
45
100
|
* Returns true if the current process has a valid (non-expired) pro license.
|
|
46
|
-
*
|
|
101
|
+
* Synchronous — relies on the cache populated by `initLicenseValidation()`.
|
|
47
102
|
*/
|
|
48
103
|
export declare function isPro(): boolean;
|
|
49
104
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/utils/license.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/utils/license.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AA0BH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gGAAgG;IAChG,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wDAAwD;AACxD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AA4BD;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,OAAO,GACrB,IAAI,CAEN;AAMD;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAQ7C;AAMD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,sBAAsB,CAAC,CAgDjC;AAMD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,MAAsC,GAC7C,WAAW,CA4Db;AAMD;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAgE3D;AAuCD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAoB5C;AAED;;;GAGG;AACH,wBAAgB,KAAK,IAAI,OAAO,CAE/B;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAgBjD"}
|
package/dist/utils/license.js
CHANGED
|
@@ -9,8 +9,16 @@
|
|
|
9
9
|
* The license key is read from the VIDEO_MCP_LICENSE_KEY environment variable.
|
|
10
10
|
*
|
|
11
11
|
* Tokens are valid for 1 year from issuance (exp = iat + 365 days).
|
|
12
|
+
*
|
|
13
|
+
* Hybrid validation: offline Ed25519 check runs first (fast path). When a key
|
|
14
|
+
* is present, `initLicenseValidation()` also performs an online heartbeat to
|
|
15
|
+
* register this device and enforce the 5-device-per-license limit. The online
|
|
16
|
+
* check has a 5-second timeout; on failure the offline result is used as a
|
|
17
|
+
* fallback so legitimate users are never blocked by network issues.
|
|
12
18
|
*/
|
|
13
19
|
import * as crypto from 'node:crypto';
|
|
20
|
+
import * as os from 'node:os';
|
|
21
|
+
import { logProgress } from './logger.js';
|
|
14
22
|
// ---------------------------------------------------------------------------
|
|
15
23
|
// Embedded public key (Ed25519, PEM format)
|
|
16
24
|
// Replace this with the real public key generated by scripts/generate-license.ts
|
|
@@ -18,6 +26,10 @@ import * as crypto from 'node:crypto';
|
|
|
18
26
|
const PUBLIC_KEY_PEM = `-----BEGIN PUBLIC KEY-----
|
|
19
27
|
MCowBQYDK2VwAyEA92GHVIXluVRurAJ8C20JIQi8vezWgKcZ8HsFYvtRtmY=
|
|
20
28
|
-----END PUBLIC KEY-----`;
|
|
29
|
+
/** Default license validation server. Set VIDEO_MCP_LICENSE_SERVER='' to disable. */
|
|
30
|
+
const DEFAULT_LICENSE_SERVER = 'https://video-mcp-license.video-context-mcp.workers.dev';
|
|
31
|
+
/** Online result cache TTL: 24 hours in milliseconds */
|
|
32
|
+
const ONLINE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
21
33
|
// ---------------------------------------------------------------------------
|
|
22
34
|
// Base64url helpers (no external deps)
|
|
23
35
|
// ---------------------------------------------------------------------------
|
|
@@ -28,19 +40,100 @@ function base64urlDecode(str) {
|
|
|
28
40
|
return Buffer.from(base64 + '='.repeat(pad), 'base64');
|
|
29
41
|
}
|
|
30
42
|
// ---------------------------------------------------------------------------
|
|
31
|
-
//
|
|
43
|
+
// Cache — richer than before to support TTL-based refresh
|
|
32
44
|
// ---------------------------------------------------------------------------
|
|
33
|
-
let
|
|
45
|
+
let licenseCache = null;
|
|
34
46
|
/**
|
|
35
47
|
* Resets the cached license validation result.
|
|
36
48
|
* Exposed for testing purposes only.
|
|
37
49
|
* @internal
|
|
38
50
|
*/
|
|
39
51
|
export function _resetLicenseCache() {
|
|
40
|
-
|
|
52
|
+
licenseCache = null;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Directly sets the license cache for testing purposes.
|
|
56
|
+
* Allows simulating a pre-validated cache state (e.g. stale online check).
|
|
57
|
+
* @internal
|
|
58
|
+
*/
|
|
59
|
+
export function _setLicenseCacheForTesting(result, validatedAt, onlineChecked) {
|
|
60
|
+
licenseCache = { result, validatedAt, onlineChecked };
|
|
61
|
+
}
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
// Device fingerprint
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
/**
|
|
66
|
+
* Returns a stable, non-PII 16-character hex device identifier.
|
|
67
|
+
* Computed as the first 16 hex chars of:
|
|
68
|
+
* SHA-256(hostname + platform + arch + username)
|
|
69
|
+
*/
|
|
70
|
+
export function getDeviceFingerprint() {
|
|
71
|
+
const raw = [
|
|
72
|
+
os.hostname(),
|
|
73
|
+
os.platform(),
|
|
74
|
+
os.arch(),
|
|
75
|
+
os.userInfo().username,
|
|
76
|
+
].join('|');
|
|
77
|
+
return crypto.createHash('sha256').update(raw).digest('hex').slice(0, 16);
|
|
78
|
+
}
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
// Online validation
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
/**
|
|
83
|
+
* Sends a heartbeat to the license validation server.
|
|
84
|
+
*
|
|
85
|
+
* @param token - The raw license token string
|
|
86
|
+
* @param fingerprint - Device fingerprint from `getDeviceFingerprint()`
|
|
87
|
+
* @returns - Online validation result (valid + metadata)
|
|
88
|
+
*/
|
|
89
|
+
export async function validateOnline(token, fingerprint) {
|
|
90
|
+
const serverUrl = process.env.VIDEO_MCP_LICENSE_SERVER ?? DEFAULT_LICENSE_SERVER;
|
|
91
|
+
// Allow disabling online validation by setting the var to empty string
|
|
92
|
+
if (!serverUrl) {
|
|
93
|
+
return { valid: true, reason: 'online_disabled' };
|
|
94
|
+
}
|
|
95
|
+
const controller = new AbortController();
|
|
96
|
+
const timeout = setTimeout(() => controller.abort(), 5000);
|
|
97
|
+
try {
|
|
98
|
+
const response = await fetch(`${serverUrl}/v1/validate`, {
|
|
99
|
+
method: 'POST',
|
|
100
|
+
headers: { 'Content-Type': 'application/json' },
|
|
101
|
+
body: JSON.stringify({
|
|
102
|
+
token,
|
|
103
|
+
fingerprint,
|
|
104
|
+
metadata: {
|
|
105
|
+
os: os.platform(),
|
|
106
|
+
arch: os.arch(),
|
|
107
|
+
nodeVersion: process.version,
|
|
108
|
+
},
|
|
109
|
+
}),
|
|
110
|
+
signal: controller.signal,
|
|
111
|
+
});
|
|
112
|
+
if (!response.ok) {
|
|
113
|
+
const text = await response.text().catch(() => '');
|
|
114
|
+
try {
|
|
115
|
+
const json = JSON.parse(text);
|
|
116
|
+
return json;
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return { valid: false, reason: `server_error_${response.status}` };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const json = (await response.json());
|
|
123
|
+
return json;
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
if (err instanceof Error && err.name === 'AbortError') {
|
|
127
|
+
return { valid: false, reason: 'timeout' };
|
|
128
|
+
}
|
|
129
|
+
return { valid: false, reason: 'network_error' };
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
clearTimeout(timeout);
|
|
133
|
+
}
|
|
41
134
|
}
|
|
42
135
|
// ---------------------------------------------------------------------------
|
|
43
|
-
// Core validation
|
|
136
|
+
// Core offline validation
|
|
44
137
|
// ---------------------------------------------------------------------------
|
|
45
138
|
/**
|
|
46
139
|
* Validates a raw license token string and returns detailed info.
|
|
@@ -102,22 +195,131 @@ export function validateLicenseToken(token, nowSec = Math.floor(Date.now() / 100
|
|
|
102
195
|
};
|
|
103
196
|
}
|
|
104
197
|
// ---------------------------------------------------------------------------
|
|
198
|
+
// Hybrid validation — run once at startup
|
|
199
|
+
// ---------------------------------------------------------------------------
|
|
200
|
+
/**
|
|
201
|
+
* Initializes the license validation cache by running both offline and
|
|
202
|
+
* (if a key is present and offline passes) online validation.
|
|
203
|
+
*
|
|
204
|
+
* Must be called once at process startup before the first `isPro()` call.
|
|
205
|
+
* Subsequent `isPro()` calls return the cached result synchronously.
|
|
206
|
+
*
|
|
207
|
+
* Worst-case startup delay: 5 s (only when online check times out).
|
|
208
|
+
*/
|
|
209
|
+
export async function initLicenseValidation() {
|
|
210
|
+
const token = process.env.VIDEO_MCP_LICENSE_KEY ?? '';
|
|
211
|
+
// Step 1: Offline check
|
|
212
|
+
const offlineResult = validateLicenseToken(token);
|
|
213
|
+
// No key or offline failure → cache immediately, skip online
|
|
214
|
+
if (!offlineResult.valid) {
|
|
215
|
+
licenseCache = {
|
|
216
|
+
result: offlineResult,
|
|
217
|
+
validatedAt: 0,
|
|
218
|
+
onlineChecked: false,
|
|
219
|
+
};
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
// Step 2: Online check (token is offline-valid)
|
|
223
|
+
const serverUrl = process.env.VIDEO_MCP_LICENSE_SERVER ?? DEFAULT_LICENSE_SERVER;
|
|
224
|
+
if (!serverUrl) {
|
|
225
|
+
// Online validation explicitly disabled
|
|
226
|
+
licenseCache = {
|
|
227
|
+
result: offlineResult,
|
|
228
|
+
validatedAt: Date.now(),
|
|
229
|
+
onlineChecked: false,
|
|
230
|
+
};
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const fingerprint = getDeviceFingerprint();
|
|
234
|
+
const onlineResult = await validateOnline(token, fingerprint);
|
|
235
|
+
if (onlineResult.reason === 'timeout' ||
|
|
236
|
+
onlineResult.reason === 'network_error') {
|
|
237
|
+
// Network failure → fall back to offline result with a warning
|
|
238
|
+
logProgress(`[video-mcp] License online check failed (${onlineResult.reason}). ` +
|
|
239
|
+
'Falling back to offline validation.');
|
|
240
|
+
licenseCache = {
|
|
241
|
+
result: offlineResult,
|
|
242
|
+
validatedAt: 0,
|
|
243
|
+
onlineChecked: false,
|
|
244
|
+
};
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
// Online result takes precedence
|
|
248
|
+
const finalResult = {
|
|
249
|
+
...offlineResult,
|
|
250
|
+
valid: onlineResult.valid,
|
|
251
|
+
onlineReason: onlineResult.reason,
|
|
252
|
+
devicesUsed: onlineResult.devicesUsed,
|
|
253
|
+
deviceLimit: onlineResult.deviceLimit,
|
|
254
|
+
};
|
|
255
|
+
licenseCache = {
|
|
256
|
+
result: finalResult,
|
|
257
|
+
validatedAt: Date.now(),
|
|
258
|
+
onlineChecked: true,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Fires a background (non-blocking) online re-validation to refresh a stale
|
|
263
|
+
* cache entry. Updates `licenseCache` in place when the response arrives.
|
|
264
|
+
*/
|
|
265
|
+
function _refreshOnlineAsync() {
|
|
266
|
+
const token = process.env.VIDEO_MCP_LICENSE_KEY ?? '';
|
|
267
|
+
const fingerprint = getDeviceFingerprint();
|
|
268
|
+
validateOnline(token, fingerprint)
|
|
269
|
+
.then((onlineResult) => {
|
|
270
|
+
if (onlineResult.reason === 'timeout' ||
|
|
271
|
+
onlineResult.reason === 'network_error') {
|
|
272
|
+
return; // Keep stale cached result
|
|
273
|
+
}
|
|
274
|
+
if (licenseCache) {
|
|
275
|
+
licenseCache.result = {
|
|
276
|
+
...licenseCache.result,
|
|
277
|
+
valid: onlineResult.valid,
|
|
278
|
+
onlineReason: onlineResult.reason,
|
|
279
|
+
devicesUsed: onlineResult.devicesUsed,
|
|
280
|
+
deviceLimit: onlineResult.deviceLimit,
|
|
281
|
+
};
|
|
282
|
+
licenseCache.validatedAt = Date.now();
|
|
283
|
+
licenseCache.onlineChecked = true;
|
|
284
|
+
}
|
|
285
|
+
})
|
|
286
|
+
.catch(() => {
|
|
287
|
+
// Silently ignore — stale cache result is fine
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
// ---------------------------------------------------------------------------
|
|
105
291
|
// Public API
|
|
106
292
|
// ---------------------------------------------------------------------------
|
|
107
293
|
/**
|
|
108
294
|
* Returns detailed license validation info.
|
|
109
|
-
*
|
|
295
|
+
*
|
|
296
|
+
* Uses the cache populated by `initLicenseValidation()`. If the cache is stale
|
|
297
|
+
* (> 24 h since last online check), the last known result is returned and a
|
|
298
|
+
* background refresh is triggered for the next call.
|
|
299
|
+
*
|
|
300
|
+
* Falls back to a synchronous offline check if the cache was never populated
|
|
301
|
+
* (e.g. in tests or if `initLicenseValidation()` was not called).
|
|
110
302
|
*/
|
|
111
303
|
export function getLicenseInfo() {
|
|
112
|
-
if (
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
304
|
+
if (!licenseCache) {
|
|
305
|
+
// Fallback: synchronous offline-only check (no initLicenseValidation called)
|
|
306
|
+
const token = process.env.VIDEO_MCP_LICENSE_KEY ?? '';
|
|
307
|
+
const result = validateLicenseToken(token);
|
|
308
|
+
licenseCache = { result, validatedAt: 0, onlineChecked: false };
|
|
309
|
+
return result;
|
|
310
|
+
}
|
|
311
|
+
// Check if online result has gone stale
|
|
312
|
+
const onlineTTLExpired = licenseCache.onlineChecked &&
|
|
313
|
+
Date.now() - licenseCache.validatedAt > ONLINE_TTL_MS;
|
|
314
|
+
if (onlineTTLExpired) {
|
|
315
|
+
// Return last known result and kick off background refresh
|
|
316
|
+
_refreshOnlineAsync();
|
|
317
|
+
}
|
|
318
|
+
return licenseCache.result;
|
|
117
319
|
}
|
|
118
320
|
/**
|
|
119
321
|
* Returns true if the current process has a valid (non-expired) pro license.
|
|
120
|
-
*
|
|
322
|
+
* Synchronous — relies on the cache populated by `initLicenseValidation()`.
|
|
121
323
|
*/
|
|
122
324
|
export function isPro() {
|
|
123
325
|
return getLicenseInfo().valid;
|
|
@@ -128,6 +330,13 @@ export function isPro() {
|
|
|
128
330
|
* @param feature - Human-readable name of the pro feature
|
|
129
331
|
*/
|
|
130
332
|
export function proNotice(feature) {
|
|
333
|
+
const info = getLicenseInfo();
|
|
334
|
+
// Device limit exceeded — give a specific, actionable message
|
|
335
|
+
if (info.onlineReason === 'device_limit_exceeded') {
|
|
336
|
+
const used = info.devicesUsed ?? '?';
|
|
337
|
+
const limit = info.deviceLimit ?? 5;
|
|
338
|
+
return `⚡ License device limit reached (${used}/${limit} devices).`;
|
|
339
|
+
}
|
|
131
340
|
return (`⚡ Pro feature: ${feature}. ` +
|
|
132
341
|
'Using free-tier limit instead. ' +
|
|
133
342
|
'Set VIDEO_MCP_LICENSE_KEY to unlock. ' +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/utils/license.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/utils/license.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.27.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",
|