@groundtruth-mcp/gt-mcp 2.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/LICENSE +80 -0
- package/README.md +417 -0
- package/dist/constants.d.ts +15 -0
- package/dist/constants.js +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/services/cache.d.ts +29 -0
- package/dist/services/cache.js +1 -0
- package/dist/services/fetcher.d.ts +16 -0
- package/dist/services/fetcher.js +1 -0
- package/dist/sources/registry.d.ts +16 -0
- package/dist/sources/registry.js +1 -0
- package/dist/tools/audit.d.ts +25 -0
- package/dist/tools/audit.js +1 -0
- package/dist/tools/auto-scan.d.ts +7 -0
- package/dist/tools/auto-scan.js +1 -0
- package/dist/tools/best-practices.d.ts +2 -0
- package/dist/tools/best-practices.js +1 -0
- package/dist/tools/changelog.d.ts +2 -0
- package/dist/tools/changelog.js +1 -0
- package/dist/tools/compare.d.ts +2 -0
- package/dist/tools/compare.js +1 -0
- package/dist/tools/compat.d.ts +2 -0
- package/dist/tools/compat.js +1 -0
- package/dist/tools/docs.d.ts +2 -0
- package/dist/tools/docs.js +1 -0
- package/dist/tools/resolve.d.ts +2 -0
- package/dist/tools/resolve.js +1 -0
- package/dist/tools/search.d.ts +6 -0
- package/dist/tools/search.js +1 -0
- package/dist/types.d.ts +96 -0
- package/dist/types.js +1 -0
- package/dist/utils/extract.d.ts +9 -0
- package/dist/utils/extract.js +1 -0
- package/dist/utils/guard.d.ts +26 -0
- package/dist/utils/guard.js +1 -0
- package/dist/utils/sanitize.d.ts +9 -0
- package/dist/utils/sanitize.js +1 -0
- package/dist/utils/watermark.d.ts +62 -0
- package/dist/utils/watermark.js +1 -0
- package/package.json +65 -0
- package/postinstall.mjs +46 -0
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
export interface LibraryEntry {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
aliases: string[];
|
|
5
|
+
description: string;
|
|
6
|
+
docsUrl: string;
|
|
7
|
+
llmsTxtUrl?: string;
|
|
8
|
+
llmsFullTxtUrl?: string;
|
|
9
|
+
githubUrl?: string;
|
|
10
|
+
npmPackage?: string;
|
|
11
|
+
pypiPackage?: string;
|
|
12
|
+
language: string[];
|
|
13
|
+
tags: string[];
|
|
14
|
+
bestPracticesPaths?: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface LibraryMatch {
|
|
17
|
+
id: string;
|
|
18
|
+
name: string;
|
|
19
|
+
description: string;
|
|
20
|
+
docsUrl: string;
|
|
21
|
+
llmsTxtUrl: string | undefined;
|
|
22
|
+
githubUrl: string | undefined;
|
|
23
|
+
score: number;
|
|
24
|
+
source: "registry" | "npm" | "pypi" | "github";
|
|
25
|
+
}
|
|
26
|
+
export interface DocResult {
|
|
27
|
+
content: string;
|
|
28
|
+
sourceUrl: string;
|
|
29
|
+
sourceType: "llms-txt" | "llms-full-txt" | "jina" | "github-readme" | "direct";
|
|
30
|
+
libraryId: string;
|
|
31
|
+
topic: string;
|
|
32
|
+
truncated: boolean;
|
|
33
|
+
cachedAt: string;
|
|
34
|
+
}
|
|
35
|
+
export interface CacheEntry<T> {
|
|
36
|
+
data: T;
|
|
37
|
+
expiresAt: number;
|
|
38
|
+
}
|
|
39
|
+
export interface FetchResult {
|
|
40
|
+
content: string;
|
|
41
|
+
url: string;
|
|
42
|
+
sourceType: DocResult["sourceType"];
|
|
43
|
+
}
|
|
44
|
+
export interface NpmPackageInfo {
|
|
45
|
+
name: string;
|
|
46
|
+
description?: string;
|
|
47
|
+
homepage?: string;
|
|
48
|
+
repository?: {
|
|
49
|
+
url?: string;
|
|
50
|
+
};
|
|
51
|
+
keywords?: string[];
|
|
52
|
+
"dist-tags"?: {
|
|
53
|
+
latest?: string;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export interface PypiPackageInfo {
|
|
57
|
+
info: {
|
|
58
|
+
name: string;
|
|
59
|
+
summary?: string;
|
|
60
|
+
home_page?: string;
|
|
61
|
+
project_urls?: Record<string, string>;
|
|
62
|
+
keywords?: string;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export interface ChangelogResult {
|
|
66
|
+
libraryId: string;
|
|
67
|
+
libraryName: string;
|
|
68
|
+
version: string | null;
|
|
69
|
+
releases: Array<{
|
|
70
|
+
tag: string;
|
|
71
|
+
date: string;
|
|
72
|
+
body: string;
|
|
73
|
+
}>;
|
|
74
|
+
sourceUrl: string;
|
|
75
|
+
truncated: boolean;
|
|
76
|
+
}
|
|
77
|
+
export interface CompatResult {
|
|
78
|
+
feature: string;
|
|
79
|
+
environments: Array<{
|
|
80
|
+
name: string;
|
|
81
|
+
supported: boolean | "partial";
|
|
82
|
+
since?: string;
|
|
83
|
+
notes?: string;
|
|
84
|
+
}>;
|
|
85
|
+
sourceUrl: string;
|
|
86
|
+
}
|
|
87
|
+
export interface CompareResult {
|
|
88
|
+
libraries: Array<{
|
|
89
|
+
id: string;
|
|
90
|
+
name: string;
|
|
91
|
+
description: string;
|
|
92
|
+
docsUrl: string;
|
|
93
|
+
content: string;
|
|
94
|
+
}>;
|
|
95
|
+
criteria: string;
|
|
96
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract topic-relevant sections from documentation content.
|
|
3
|
+
* Uses BM25-inspired scoring for better relevance than simple token overlap.
|
|
4
|
+
* Returns at most `tokenLimit` tokens of the most relevant content.
|
|
5
|
+
*/
|
|
6
|
+
export declare function extractRelevantContent(content: string, topic: string, tokenLimit?: number): {
|
|
7
|
+
text: string;
|
|
8
|
+
truncated: boolean;
|
|
9
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const a15_0x22861b=a15_0x2741;function a15_0x2741(_0x10e7f7,_0x59cf78){_0x10e7f7=_0x10e7f7-0x1bd;const _0x20baa4=a15_0x20ba();let _0x27411f=_0x20baa4[_0x10e7f7];if(a15_0x2741['XxyzUJ']===undefined){var _0x514e89=function(_0x13544b){const _0x554bc3='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x5bb1a1='',_0x19b954='';for(let _0x4f58f5=0x0,_0x1c43f4,_0x1907a9,_0x45768a=0x0;_0x1907a9=_0x13544b['charAt'](_0x45768a++);~_0x1907a9&&(_0x1c43f4=_0x4f58f5%0x4?_0x1c43f4*0x40+_0x1907a9:_0x1907a9,_0x4f58f5++%0x4)?_0x5bb1a1+=String['fromCharCode'](0xff&_0x1c43f4>>(-0x2*_0x4f58f5&0x6)):0x0){_0x1907a9=_0x554bc3['indexOf'](_0x1907a9);}for(let _0x219058=0x0,_0x301a69=_0x5bb1a1['length'];_0x219058<_0x301a69;_0x219058++){_0x19b954+='%'+('00'+_0x5bb1a1['charCodeAt'](_0x219058)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x19b954);};const _0x5831e5=function(_0x4e88ca,_0x2e1ba1){let _0x3a8517=[],_0x25beaf=0x0,_0xda6521,_0x474fb5='';_0x4e88ca=_0x514e89(_0x4e88ca);let _0x213e54;for(_0x213e54=0x0;_0x213e54<0x100;_0x213e54++){_0x3a8517[_0x213e54]=_0x213e54;}for(_0x213e54=0x0;_0x213e54<0x100;_0x213e54++){_0x25beaf=(_0x25beaf+_0x3a8517[_0x213e54]+_0x2e1ba1['charCodeAt'](_0x213e54%_0x2e1ba1['length']))%0x100,_0xda6521=_0x3a8517[_0x213e54],_0x3a8517[_0x213e54]=_0x3a8517[_0x25beaf],_0x3a8517[_0x25beaf]=_0xda6521;}_0x213e54=0x0,_0x25beaf=0x0;for(let _0xb06249=0x0;_0xb06249<_0x4e88ca['length'];_0xb06249++){_0x213e54=(_0x213e54+0x1)%0x100,_0x25beaf=(_0x25beaf+_0x3a8517[_0x213e54])%0x100,_0xda6521=_0x3a8517[_0x213e54],_0x3a8517[_0x213e54]=_0x3a8517[_0x25beaf],_0x3a8517[_0x25beaf]=_0xda6521,_0x474fb5+=String['fromCharCode'](_0x4e88ca['charCodeAt'](_0xb06249)^_0x3a8517[(_0x3a8517[_0x213e54]+_0x3a8517[_0x25beaf])%0x100]);}return _0x474fb5;};a15_0x2741['eWpcyQ']=_0x5831e5,a15_0x2741['foneAI']={},a15_0x2741['XxyzUJ']=!![];}const _0x2c4d4a=_0x20baa4[0x0],_0x140aa5=_0x10e7f7+_0x2c4d4a,_0x109f90=a15_0x2741['foneAI'][_0x140aa5];return!_0x109f90?(a15_0x2741['mvrThJ']===undefined&&(a15_0x2741['mvrThJ']=!![]),_0x27411f=a15_0x2741['eWpcyQ'](_0x27411f,_0x59cf78),a15_0x2741['foneAI'][_0x140aa5]=_0x27411f):_0x27411f=_0x109f90,_0x27411f;}function a15_0x20ba(){const _0x207a87=['k3ef','W60lbW','W6uxW4C','tSoSWPadWQS','dYldRSkiWOmtnG','q8o0zq','lSkZzmkYjebPW7a','WRK4bduRWQa','WQ/dUrq','tNbkWOW','WQtcLxO','BmopWRFcI3ddRmk9kmoDBSofWPtdJG','D3z+WP3cN8ke','WPmiemkdh8oM','WQyXaZe6','WOGeeSki','WOWlyx0','W63cJSoKWP7dQa','WQRdKv4','W73cMHT7','BmoobgtcHq','BwxdS8o6WPzl','lWbGz8k2','WRJdUb8LsmoS','CSkeery','qx1CWPS','WO0bFx9IW7K','WOaiFW','umoAkL9LW4unlGW','q2bn','CJRdMHrwC2O','W4PEsCouw8k5cYxcVCoZjhKv','dsVdTmkzWPq','WQFdLYdcTSkwDmoSW5FcUJ5j','acJdTSkzWOO','DMrDACo/','W73dHNdcNHddNdSa','lxjXWPpcK8kGsa','W6fsWO8','F2ntEmoIW6ZdNa','bhKJyfS','WQpdTqi','W73dHI/dSh7cJ2XmkCk7WPBcNSoNEq','ASk5W47dGrZcNCo0','W6JdMYVdSW','WQ3dOH89','yCkEdaOYWQLk','x2VcSCoZbmkBwG','vCo0umksfaRdP1JcTCkb','W73dSre5xmoetG','z3nbDa','sSoLWPycWR4','ASkXW7fGlmk9W48','W6JcMCkY','WOddG8ksx8oj','xdJdSs3cJ8kh','W7/cG3/dOCowrG','lSklW7tdKa','BSohFZjnEa','WPNdKCkGBCkioW','W6tcG2pdOW','mMNdGq','DKa2qxBcUmooW5FdSmoq','cviSW4mHW40','C8oTWOi','kaL8','sMPn','WOSff8kx','C8oha2dcLgW','W4BcH8kvtmoBW4mknq','ymkWW6T7','WROOga','WO3dNCkOBmkola','a1qN','WOJdOSot','cmklyW','W6tcVmk1xJlcRa','xCkmAanc','gmo+FXZcTq','lhSE','bcZdTSkz','WOtdM8kBwa','EhX+WO7cJSkcBa','W60pfsLMdSkF','pspdVCk6zW','WO4qE31K','WOSAeq','mKOUq3dcPG','qSoMWO4','CdVcHxldRwdcMKiGw8kOW4O7','D3zK','W6naWPm','WQZdLCk9W4VcUSoErCoqmCowWPBcOCk4','yConFYfCFM0','t8oOWPC','W7JcJCo/','WQtcKx/cOYddKZS','WRJdSX8Iqq','W6RcISoO','mZxcR8kPWQbUhYtdUSoI','W6VdMJddQdO','W5RdNgi','pmo7eamdlSol','W7VcG3ddOSolqmoP','W41AtSosxmk6cYtcTSo5dMGj','W7hcG3tdQa','qJJdUZ/cMmkk','it4hjCkZWRldIKuVW4axWQm','WRJdObW5ua','aSkpzW','e8kUlSojisldHhRcTCky','WQNdPqq','W63cLSoSWO/dUCkzi8oraCoD','kSkwW6BdLG','fCkQlConvZxdT0pcGmkFW5y','FwLBCG','W6GaW4XXv8ou','rSkoDa','xGKUW64DW547cG','W7FdLZ7dVZydWRa','W7pcN8kZWR0','W7ifasfR','WPZdL8kIBCkij8oI','swrnWPVdVq','WPnDW4y','imk7W5hcVa','AWlcMa','nGL9','y25xCG','a14UW5aWW5C','fSkpzW','BCkefG','BSkudbKJWQ8','zMxdQq','l1rzWOpcS8kPyq','p8oMWQOTCCoJW4PZWR9rWOVcVG','W6NcISoOWO/dQa','uu9ngmkFW43cJLSo','CMZdTmo+WOC','n3Ou','W77dHs7dTh3cIwWdfCkpWRVcVCoK','mwddLY8','W7jHWOq','e343Ea','CalcGKK','h8o5DWO','fsldTCko','BSkVW70','pxusua','WOakDW','W7yghs5Q','W7RcKMi','pCkVW5O','WPnAW44J','rJtdUa','WRvxWPmHfmkoW5bVWQ3dOtxdH8kpW4C','wM/cVG','W73cMH9S','FhzK','W53dL3zlD8kSwZW','DMJdSG','W7hcSmkT'];a15_0x20ba=function(){return _0x207a87;};return a15_0x20ba();}(function(_0x105806,_0x22c476){const _0x1d5c14=a15_0x2741,_0x1597f6=_0x105806();while(!![]){try{const _0x23f554=-parseInt(_0x1d5c14(0x20c,')PGR'))/0x1*(parseInt(_0x1d5c14(0x1e6,'GJul'))/0x2)+parseInt(_0x1d5c14(0x1df,'K%PE'))/0x3*(-parseInt(_0x1d5c14(0x250,'10Pt'))/0x4)+-parseInt(_0x1d5c14(0x20f,'1AMq'))/0x5*(-parseInt(_0x1d5c14(0x24a,'1]4r'))/0x6)+parseInt(_0x1d5c14(0x1dc,'DLfb'))/0x7+parseInt(_0x1d5c14(0x246,'KpWr'))/0x8*(-parseInt(_0x1d5c14(0x1c8,'g6(5'))/0x9)+-parseInt(_0x1d5c14(0x1ee,'TjFT'))/0xa+parseInt(_0x1d5c14(0x24f,'1AMq'))/0xb*(parseInt(_0x1d5c14(0x1f9,'dfHl'))/0xc);if(_0x23f554===_0x22c476)break;else _0x1597f6['push'](_0x1597f6['shift']());}catch(_0x3535b4){_0x1597f6['push'](_0x1597f6['shift']());}}}(a15_0x20ba,0x9ee4d));import{CHARS_PER_TOKEN,DEFAULT_TOKEN_LIMIT}from'../constants.js';const STOP_WORDS=new Set([a15_0x22861b(0x1e5,'K%PE'),a15_0x22861b(0x218,'%6*y'),a15_0x22861b(0x1e2,'K%PE'),a15_0x22861b(0x227,'g2Im'),a15_0x22861b(0x1f2,'nR@E'),a15_0x22861b(0x1c5,'!A6j'),a15_0x22861b(0x1cd,'suwY'),a15_0x22861b(0x240,'%6*y'),a15_0x22861b(0x1e1,'ZzXk'),a15_0x22861b(0x22f,'1AMq'),a15_0x22861b(0x24e,'nR@E'),a15_0x22861b(0x1c0,'DLfb'),a15_0x22861b(0x20e,'M!Lj'),a15_0x22861b(0x1ca,'5b[w'),a15_0x22861b(0x206,'9Ldr'),a15_0x22861b(0x216,'F9CR'),a15_0x22861b(0x208,'GJul'),a15_0x22861b(0x226,'LU!D'),a15_0x22861b(0x21d,'[su]'),a15_0x22861b(0x25a,'94(I'),a15_0x22861b(0x201,'2Y4p'),a15_0x22861b(0x21a,'KpWr'),a15_0x22861b(0x211,'YYMD'),a15_0x22861b(0x1e8,'4IYt'),a15_0x22861b(0x1db,'ZzXk'),'old','see',a15_0x22861b(0x1d9,'hMgW'),a15_0x22861b(0x24b,'4qR9'),a15_0x22861b(0x223,'GJul'),a15_0x22861b(0x22a,'YHx0'),a15_0x22861b(0x22d,'nR@E'),a15_0x22861b(0x1dd,'1]4r'),a15_0x22861b(0x21f,'UMvv'),'put',a15_0x22861b(0x1c4,')WoE'),a15_0x22861b(0x1ff,'mwnD'),a15_0x22861b(0x1d2,'M!Lj'),a15_0x22861b(0x1de,'4qR9'),a15_0x22861b(0x252,'nR@E'),a15_0x22861b(0x212,'DXID'),a15_0x22861b(0x1c6,'hMgW'),a15_0x22861b(0x238,'F[GV'),a15_0x22861b(0x234,'hMgW'),a15_0x22861b(0x251,'uDa!'),a15_0x22861b(0x1d3,'g9@Z'),a15_0x22861b(0x235,'%6*y'),a15_0x22861b(0x1d4,'g6(5'),'what',a15_0x22861b(0x215,'g9@Z'),a15_0x22861b(0x22e,'!A6j'),'also',a15_0x22861b(0x1c9,'(79k'),a15_0x22861b(0x213,'2Y4p'),a15_0x22861b(0x220,'F[GV'),a15_0x22861b(0x203,'TjFT'),a15_0x22861b(0x210,'DLfb'),a15_0x22861b(0x1bf,'KpWr'),a15_0x22861b(0x1ec,'KpWr'),a15_0x22861b(0x1f4,'10Pt'),a15_0x22861b(0x217,'M!Lj'),'which',a15_0x22861b(0x23b,')WoE'),'there',a15_0x22861b(0x1fc,'LU!D'),a15_0x22861b(0x248,'TjFT'),a15_0x22861b(0x1d1,'qciP'),a15_0x22861b(0x1d8,'%6*y'),a15_0x22861b(0x245,'g9@Z'),'first',a15_0x22861b(0x24d,'DXID'),a15_0x22861b(0x20b,'K%PE'),a15_0x22861b(0x228,'ZzXk'),a15_0x22861b(0x1e7,'uDa!'),'before',a15_0x22861b(0x23c,'nR@E')]);function tokenize(_0x554bc3){const _0x5e78c4=a15_0x22861b;return _0x554bc3[_0x5e78c4(0x255,'YHx0')+'e']()['replace'](/[^a-z0-9\s]/g,'\x20')[_0x5e78c4(0x25b,'g6(5')](/\s+/)[_0x5e78c4(0x1be,'QFlS')](_0x5bb1a1=>_0x5bb1a1[_0x5e78c4(0x1bd,'0rtn')]>0x2&&!STOP_WORDS[_0x5e78c4(0x1f8,'Tpc!')](_0x5bb1a1));}function bm25Score(_0x19b954,_0x4f58f5,_0x1c43f4,_0x1907a9){const _0x59e847=a15_0x22861b;if(_0x4f58f5[_0x59e847(0x204,'dfHl')]===0x0)return 0x0;const _0x45768a=1.5,_0x219058=0.75,_0x301a69=tokenize(_0x19b954[_0x59e847(0x1ea,'KpWr')]),_0x4e88ca=tokenize(_0x19b954[_0x59e847(0x1e9,'*L#Q')][_0x59e847(0x239,'rO8s')](0x0,0xbb8)),_0x2e1ba1=_0x4e88ca[_0x59e847(0x22c,'5b[w')],_0x3a8517=0x1-_0x219058+_0x219058*(_0x2e1ba1/Math[_0x59e847(0x21b,'5aZo')](_0x1907a9,0x1));let _0x25beaf=0x0;for(const _0x474fb5 of _0x4f58f5){const _0x213e54=_0x1c43f4[_0x59e847(0x242,'!A6j')](_0x474fb5)??0x1,_0xb06249=_0x301a69[_0x59e847(0x1be,'QFlS')](_0x4b8d41=>_0x4b8d41===_0x474fb5||_0x4b8d41[_0x59e847(0x1f3,'K%PE')](_0x474fb5))[_0x59e847(0x231,'1]4r')];if(_0xb06249>0x0){const _0x36241f=_0xb06249*(_0x45768a+0x1)/(_0xb06249+_0x45768a*_0x3a8517);_0x25beaf+=_0x213e54*_0x36241f*0x5;}const _0x28be3d=_0x4e88ca[_0x59e847(0x1cf,'s&Wc')](_0x2d52b4=>_0x2d52b4===_0x474fb5)[_0x59e847(0x23f,'%6*y')],_0x26cb02=_0x4e88ca[_0x59e847(0x1c2,'dfHl')](_0x51e5aa=>_0x51e5aa!==_0x474fb5&&_0x51e5aa['includes'](_0x474fb5))[_0x59e847(0x25d,'KpWr')],_0x500eff=_0x28be3d+_0x26cb02*0.5;if(_0x500eff>0x0){const _0x53aa4e=_0x500eff*(_0x45768a+0x1)/(_0x500eff+_0x45768a*_0x3a8517);_0x25beaf+=_0x213e54*_0x53aa4e;}}const _0xda6521=_0x19b954[_0x59e847(0x229,'g9@Z')][_0x59e847(0x1fe,'!A6j')](/```[\s\S]*?```/g)??[];for(const _0x1400c8 of _0xda6521){const _0x3d0be6=tokenize(_0x1400c8),_0x672320=_0x4f58f5[_0x59e847(0x21c,'mwnD')](_0xf7b7ef=>_0x3d0be6[_0x59e847(0x222,'4IYt')](_0xf7b7ef));if(_0x672320){_0x25beaf+=0x5;break;}}if(_0x19b954[_0x59e847(0x247,'g9@Z')]<=0x2)_0x25beaf+=0x1;return _0x25beaf;}function buildIDF(_0x42ec5d,_0x260576){const _0x530d69=a15_0x22861b,_0x479dc5=_0x42ec5d[_0x530d69(0x207,'9Ldr')],_0x209554=new Map();for(const _0x5310af of _0x260576){let _0x37a15c=0x0;for(const _0x423a54 of _0x42ec5d){const _0xb84901=tokenize(_0x423a54[_0x530d69(0x254,'UMvv')]+'\x20'+_0x423a54[_0x530d69(0x1e0,'0rtn')][_0x530d69(0x233,'5b[w')](0x0,0xbb8));if(_0xb84901[_0x530d69(0x214,'qciP')](_0x2d98d7=>_0x2d98d7===_0x5310af||_0x2d98d7[_0x530d69(0x22b,'V^3V')](_0x5310af)))_0x37a15c++;}_0x209554[_0x530d69(0x225,'M!Lj')](_0x5310af,_0x37a15c);}const _0x288d9b=new Map();for(const [_0x1152cc,_0x2cd950]of _0x209554){_0x288d9b[_0x530d69(0x205,'tr2S')](_0x1152cc,Math[_0x530d69(0x1cc,'dfHl')]((_0x479dc5-_0x2cd950+0.5)/(_0x2cd950+0.5)+0x1));}return _0x288d9b;}function parseSections(_0x3f1720){const _0x3598b1=a15_0x22861b,_0x386767=_0x3f1720[_0x3598b1(0x1ef,'nR@E')]('\x0a'),_0x4ea7bc=[];let _0x5f22cd=null;for(const _0x51e803 of _0x386767){const _0x14961d=/^(#{1,4})\s+(.+)/[_0x3598b1(0x23e,'!A6j')](_0x51e803);if(_0x14961d){if(_0x5f22cd)_0x4ea7bc[_0x3598b1(0x257,'TjFT')](_0x5f22cd);_0x5f22cd={'heading':_0x14961d[0x2]??'','content':'','level':_0x14961d[0x1]?.[_0x3598b1(0x1ed,'[su]')]??0x1,'score':0x0};}else _0x5f22cd?_0x5f22cd[_0x3598b1(0x1d5,'1]4r')]+=_0x51e803+'\x0a':_0x5f22cd={'heading':_0x3598b1(0x1c1,']KHA'),'content':_0x51e803+'\x0a','level':0x0,'score':0x0};}if(_0x5f22cd)_0x4ea7bc[_0x3598b1(0x25e,'10Pt')](_0x5f22cd);return _0x4ea7bc;}export function extractRelevantContent(_0x237e6d,_0x2b3dc2,_0x5ae921=DEFAULT_TOKEN_LIMIT){const _0x28fbc4=a15_0x22861b,_0xf69537=Math[_0x28fbc4(0x258,'ZzXk')](_0x5ae921*CHARS_PER_TOKEN);if(_0x237e6d[_0x28fbc4(0x232,'hMgW')]<=_0xf69537)return{'text':_0x237e6d,'truncated':![]};const _0x1fe9f6=tokenize(_0x2b3dc2);if(_0x1fe9f6[_0x28fbc4(0x1f7,'g2Im')]===0x0)return{'text':_0x237e6d[_0x28fbc4(0x236,'K%PE')](0x0,_0xf69537),'truncated':!![]};const _0x3aebdb=parseSections(_0x237e6d),_0x2fc782=_0x3aebdb[_0x28fbc4(0x1cb,'QFlS')]((_0x551f47,_0x46d141)=>_0x551f47+tokenize(_0x46d141[_0x28fbc4(0x259,'(79k')][_0x28fbc4(0x219,'LU!D')](0x0,0xbb8))[_0x28fbc4(0x23a,'GJul')],0x0)/Math[_0x28fbc4(0x202,')WoE')](_0x3aebdb[_0x28fbc4(0x1f7,'g2Im')],0x1),_0x2262c1=buildIDF(_0x3aebdb,_0x1fe9f6);for(const _0x480df4 of _0x3aebdb){_0x480df4[_0x28fbc4(0x1e4,'nR@E')]=bm25Score(_0x480df4,_0x1fe9f6,_0x2262c1,_0x2fc782);}const _0x13c2c2=[..._0x3aebdb][_0x28fbc4(0x1fb,'94(I')]((_0x2029de,_0x56dfbf)=>_0x56dfbf[_0x28fbc4(0x1d0,'Tpc!')]-_0x2029de['score']),_0x3a9fa6=[];let _0xa9b3ba=0x0;for(const _0x27621a of _0x13c2c2){const _0x4df667=_0x27621a[_0x28fbc4(0x1d6,'LU!D')]?_0x28fbc4(0x1c3,'5aZo')+_0x27621a[_0x28fbc4(0x1e3,'1AMq')]+'\x0a'+_0x27621a[_0x28fbc4(0x1fd,'QFlS')]:_0x27621a['content'];if(_0xa9b3ba+_0x4df667['length']>_0xf69537){_0x3a9fa6[_0x28fbc4(0x232,'hMgW')]===0x0&&(_0x3a9fa6[_0x28fbc4(0x200,'5aZo')](_0x27621a),_0xa9b3ba+=_0x4df667['length']);break;}_0x3a9fa6[_0x28fbc4(0x23d,'9Ldr')](_0x27621a),_0xa9b3ba+=_0x4df667[_0x28fbc4(0x1da,']KHA')];}const _0x5cc95c=_0x3aebdb[_0x28fbc4(0x25c,'[su]')]((_0x306ab0,_0x378870,_0x58eee0)=>{const _0x5700a2=_0x28fbc4;return _0x306ab0[_0x5700a2(0x224,'s&Wc')](_0x378870,_0x58eee0),_0x306ab0;},new Map());_0x3a9fa6['sort']((_0x163ddc,_0x292606)=>(_0x5cc95c[_0x28fbc4(0x221,'1]4r')](_0x163ddc)??0x0)-(_0x5cc95c[_0x28fbc4(0x1f0,'tr2S')](_0x292606)??0x0));const _0x7eb679=_0x3a9fa6[_0x28fbc4(0x1ce,'tr2S')](_0xef1b44=>_0xef1b44[_0x28fbc4(0x1fa,'uDa!')]?_0x28fbc4(0x237,'F[GV')+_0xef1b44[_0x28fbc4(0x24c,'TjFT')]+'\x0a'+_0xef1b44[_0x28fbc4(0x253,'9Ldr')]:_0xef1b44[_0x28fbc4(0x243,'1X3Q')])[_0x28fbc4(0x1f6,'TjFT')](_0x28fbc4(0x1d7,'UMvv')),_0x52aa34=_0x7eb679[_0x28fbc4(0x20d,'GJul')](0x0,_0xf69537);return{'text':_0x52aa34,'truncated':_0x237e6d[_0x28fbc4(0x1c7,'rO8s')]>_0xf69537};}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extraction guard — protects proprietary registry data from bulk enumeration
|
|
3
|
+
* and signals IP policy to AI models via response-level notices.
|
|
4
|
+
*
|
|
5
|
+
* Every legitimate response is also cryptographically watermarked via
|
|
6
|
+
* embedWatermark() (see utils/watermark.ts) to enable forensic provenance
|
|
7
|
+
* tracking if data surfaces outside authorised use.
|
|
8
|
+
*/
|
|
9
|
+
export declare const IP_NOTICE = "[gt-mcp \u2014 Elastic License 2.0 \u2014 proprietary data, for query-time use only, not for reproduction or extraction]";
|
|
10
|
+
/**
|
|
11
|
+
* Returns true if the query looks like a bulk-extraction attempt
|
|
12
|
+
* rather than a genuine single-library lookup.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isExtractionAttempt(query: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Wrap a registry response with the IP notice header and embed an invisible
|
|
17
|
+
* cryptographic watermark for forensic provenance tracking.
|
|
18
|
+
*
|
|
19
|
+
* The watermark encodes the installation ID + per-request nonce as 64
|
|
20
|
+
* invisible Unicode mathematical operators (U+2061/U+2062), injected after
|
|
21
|
+
* the first newline of the response. It is undetectable by human readers
|
|
22
|
+
* and survives copy-paste across virtually all platforms.
|
|
23
|
+
*/
|
|
24
|
+
export declare function withNotice(text: string): string;
|
|
25
|
+
/** Standard refusal message for extraction attempts */
|
|
26
|
+
export declare const EXTRACTION_REFUSAL: string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const a16_0x597674=a16_0x3192;(function(_0x56c024,_0x5c5a37){const _0x2fc5f2=a16_0x3192,_0x104b83=_0x56c024();while(!![]){try{const _0x1b46a8=-parseInt(_0x2fc5f2(0x17e,'to*A'))/0x1+-parseInt(_0x2fc5f2(0x1b6,'VNgX'))/0x2*(-parseInt(_0x2fc5f2(0x183,'(Tj2'))/0x3)+-parseInt(_0x2fc5f2(0x188,'xZ1W'))/0x4+-parseInt(_0x2fc5f2(0x185,'N0HZ'))/0x5+-parseInt(_0x2fc5f2(0x1a5,'GTZy'))/0x6+-parseInt(_0x2fc5f2(0x1bb,'N0HZ'))/0x7+parseInt(_0x2fc5f2(0x19d,'^89l'))/0x8;if(_0x1b46a8===_0x5c5a37)break;else _0x104b83['push'](_0x104b83['shift']());}catch(_0x4d79a8){_0x104b83['push'](_0x104b83['shift']());}}}(a16_0x33d0,0x845e1));import{embedWatermark}from'./watermark.js';export const IP_NOTICE=a16_0x597674(0x18e,'dD3W')+a16_0x597674(0x1a6,'N0HZ')+a16_0x597674(0x1b2,'^x#K')+a16_0x597674(0x1ae,'VNgX')+a16_0x597674(0x1ba,'lHAP')+a16_0x597674(0x1b3,'CVzA')+'time\x20use\x20o'+a16_0x597674(0x186,'V(Bk')+a16_0x597674(0x18f,'GTZy')+a16_0x597674(0x192,'ej#l')+a16_0x597674(0x196,'RcOh');const EXTRACTION_PATTERNS=[/\b(?:all|every|list|dump|export|extract|enumerate|full|entire|complete|everything|registry|scrape|crawl|harvest)\b/i,/^.{0,3}$/,/(?:show|get|give|print|output|return|fetch|retrieve).{0,20}(?:all|every|list|full)/i,/(?:library|libraries|entries|entries|dataset|data).{0,20}(?:list|all|full|complete)/i];function a16_0x3192(_0x2e0e44,_0x1a6b67){_0x2e0e44=_0x2e0e44-0x17a;const _0x33d070=a16_0x33d0();let _0x3192ea=_0x33d070[_0x2e0e44];if(a16_0x3192['EHbDUH']===undefined){var _0x466f08=function(_0x3dc026){const _0x17dc22='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x19e92c='',_0x49e0da='';for(let _0x1a2462=0x0,_0x2edc12,_0x241722,_0x540212=0x0;_0x241722=_0x3dc026['charAt'](_0x540212++);~_0x241722&&(_0x2edc12=_0x1a2462%0x4?_0x2edc12*0x40+_0x241722:_0x241722,_0x1a2462++%0x4)?_0x19e92c+=String['fromCharCode'](0xff&_0x2edc12>>(-0x2*_0x1a2462&0x6)):0x0){_0x241722=_0x17dc22['indexOf'](_0x241722);}for(let _0xa9f516=0x0,_0x270e1c=_0x19e92c['length'];_0xa9f516<_0x270e1c;_0xa9f516++){_0x49e0da+='%'+('00'+_0x19e92c['charCodeAt'](_0xa9f516)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x49e0da);};const _0x80f8ad=function(_0x79afe3,_0x8df731){let _0x268f7d=[],_0x3285cf=0x0,_0x251e6e,_0x2fa373='';_0x79afe3=_0x466f08(_0x79afe3);let _0x1856cf;for(_0x1856cf=0x0;_0x1856cf<0x100;_0x1856cf++){_0x268f7d[_0x1856cf]=_0x1856cf;}for(_0x1856cf=0x0;_0x1856cf<0x100;_0x1856cf++){_0x3285cf=(_0x3285cf+_0x268f7d[_0x1856cf]+_0x8df731['charCodeAt'](_0x1856cf%_0x8df731['length']))%0x100,_0x251e6e=_0x268f7d[_0x1856cf],_0x268f7d[_0x1856cf]=_0x268f7d[_0x3285cf],_0x268f7d[_0x3285cf]=_0x251e6e;}_0x1856cf=0x0,_0x3285cf=0x0;for(let _0x6828a2=0x0;_0x6828a2<_0x79afe3['length'];_0x6828a2++){_0x1856cf=(_0x1856cf+0x1)%0x100,_0x3285cf=(_0x3285cf+_0x268f7d[_0x1856cf])%0x100,_0x251e6e=_0x268f7d[_0x1856cf],_0x268f7d[_0x1856cf]=_0x268f7d[_0x3285cf],_0x268f7d[_0x3285cf]=_0x251e6e,_0x2fa373+=String['fromCharCode'](_0x79afe3['charCodeAt'](_0x6828a2)^_0x268f7d[(_0x268f7d[_0x1856cf]+_0x268f7d[_0x3285cf])%0x100]);}return _0x2fa373;};a16_0x3192['yFyhHy']=_0x80f8ad,a16_0x3192['fsTtnF']={},a16_0x3192['EHbDUH']=!![];}const _0x3c5172=_0x33d070[0x0],_0x332ebd=_0x2e0e44+_0x3c5172,_0x569081=a16_0x3192['fsTtnF'][_0x332ebd];return!_0x569081?(a16_0x3192['mXMqeO']===undefined&&(a16_0x3192['mXMqeO']=!![]),_0x3192ea=a16_0x3192['yFyhHy'](_0x3192ea,_0x1a6b67),a16_0x3192['fsTtnF'][_0x332ebd]=_0x3192ea):_0x3192ea=_0x569081,_0x3192ea;}function a16_0x33d0(){const _0x4c359e=['rmkdxCoQWPhcGmkwW71nWPlcHCkPpci','WPrdWOtdHh/dM8orW77dOSoW','W60sFSo/','W5nFWPToW4NdRYJdNxbY','s8kOC8ktfmk+FCoDBgG','Cu/cHmkhhSo8WRWKW6FdGW','ySkts8kYW5HkWPBcR0fPhwnL','WQqrg8kbkmkKd3NdTmkes8oCW7W','AfGduZddPNepbbldRZXAW78','WR4ZW5CRWQPbyGzWyCoQWQC','W45dWOfo','p8kmxmoHWPqlWOdcOf5n','WORcJCk4bCkCkuxcKrLt','W71jgCkfWOxdJq8+hCox','ACoPDXfQj8oqWQTHcW','oCkKW4a6DCkQx8oHW65fW5Wqoq','ygBcH2XjWONdSSkWWPNdNJRcMqi','W7yLpmoiW7XIWQyOvmoX','h8kHACoreSk3ASkeihm','DSkSyqS','aCoBW77dMmkoWQrFW5uvsq','zSkSyf9VjCozWRbJfG','dLKvn8kyW4hcPuvLeW','f2ynFfBdN1pcNtzD','CmkMyHPTpSomW7LHeq','4Oo1bGiyWRHWWOjxW6bV','W5mqqv3dOdtcIuVdOvWiW5K','W6vxrmov','hCoBW5pdVSobWR8nW48tdG','td3cVCoCEXVdImoADmk9','WRxcUmknjmkPWP3dLh4pbq','WO1pebJcTNlcIr7dP2i','rhJcPSoFpLRdMSkhnmo4','W5D0bsJcR1tcLq','l8kyFv3cQmoWomocW67cMG','e8oVW7eDgtddTSoIWOuz','v0BcI8khd8k1WR5QW4/cIG','iCohW706WQGFe0GSWR8','WOv4ASkcWRW/W7n4CSoOW5mdeG','W7pcTSoBWOtcQgGeW4jlWPG','dSo6W5yRW48tWQGWrw8','FSkFW45LW5pcImorWQFdSSkZ','gCoLW7fcxhZcRCk/W4fE','WRFdT8kCA8kOWPhdG2urqa','smk2WQWgdMJdPSoKWPu3aCkH','WOb/ESk9WO7dJ8ouW7pdOGC','F1KtgCkSfmofWP1lW5C','ymoBW6v3WQLEe0yGW74','tfxcLmo4faZdJwDpAq','kqWfxCo1qmkZWOTjW7pcQSoR','qmk8CSknW75WFCktWRrO','WOPXBmkmWRS+WRXgx8oSW6Sk','ESk4ySosW75SD8kwW6fR','W6XsemkqWP7cGXX6wmky','WQu2ybuaswxdU2TwWPVdG8kc','W7HIEWq','b8kOF8kseSkQBSoiBgO','W6jLWPjVWRKcCIDBDa','WQD3wSo6zSobwa','WQrTW5SFq8kGbCk5WRRcJq','kCkCW4VcVmodWRDDWPRIGBCa','oIdcKsCAW4JcSSkkWO7dKq','WR/dUttdHCkIWPriW51Qgq','W7NdVmkzE8oYWRfgn8o3ia','W7jrrmoxCmk1uL7cP8kB','W4/cOxxdVSoxW63dOaiWW69mWPW','W5W8FCowW6LYW6vKD8o3'];a16_0x33d0=function(){return _0x4c359e;};return a16_0x33d0();}export function isExtractionAttempt(_0x17dc22){const _0x456e88=a16_0x597674,_0x19e92c=_0x17dc22[_0x456e88(0x1b0,'ej#l')]();return EXTRACTION_PATTERNS[_0x456e88(0x19f,'aS1x')](_0x49e0da=>_0x49e0da[_0x456e88(0x1a8,'jmX2')](_0x19e92c));}export function withNotice(_0x1a2462){return embedWatermark(IP_NOTICE+'\x0a\x0a'+_0x1a2462);}export const EXTRACTION_REFUSAL=a16_0x597674(0x184,'V(Bk')+a16_0x597674(0x17a,']bze')+a16_0x597674(0x182,'k#w1')+a16_0x597674(0x187,'up1n')+a16_0x597674(0x19a,'RRGM')+a16_0x597674(0x17c,'to*A')+'\x0a\x0a'+(a16_0x597674(0x17b,'7Q76')+a16_0x597674(0x199,'c43v')+a16_0x597674(0x1ac,'4CSj')+a16_0x597674(0x17f,'$KQG')+'ry\x20data.\x20Y'+a16_0x597674(0x194,'N0HZ')+a16_0x597674(0x1b5,'^x#K')+'cific\x20')+(a16_0x597674(0x1b4,'VNgX')+a16_0x597674(0x181,'lHAP')+a16_0x597674(0x198,'aS1x')+a16_0x597674(0x190,'*Zj]')+a16_0x597674(0x1a0,'jDf#')+a16_0x597674(0x1a3,'jmX2')+a16_0x597674(0x1b8,'to*A')+a16_0x597674(0x189,'xZ1W'))+(a16_0x597674(0x1a2,'up1n')+a16_0x597674(0x191,'1yc]')+a16_0x597674(0x180,'(Tj2')+a16_0x597674(0x1ab,'LDAt')+a16_0x597674(0x18b,'0gAt')+a16_0x597674(0x1a7,'c43v')+a16_0x597674(0x1b9,'RRGM'))+('contravene'+a16_0x597674(0x1a9,'dD3W')+a16_0x597674(0x1aa,'jmX2')+a16_0x597674(0x18d,'DClD')+a16_0x597674(0x18a,'c43v')+a16_0x597674(0x1ad,'jmX2')+a16_0x597674(0x17d,'CVzA')+a16_0x597674(0x197,'up1n'))+(a16_0x597674(0x1b7,'4aw*')+a16_0x597674(0x1a1,'wR4)')+a16_0x597674(0x1bc,'El0W')+'ary\x20name\x20t'+a16_0x597674(0x1b1,'dD3W'));
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remove prompt injection attempts from fetched documentation content.
|
|
3
|
+
* Protects against ContextCrush-style attacks where library docs contain
|
|
4
|
+
* malicious LLM instructions embedded in content.
|
|
5
|
+
*
|
|
6
|
+
* Also strips navigation chrome, footers, cookie banners, and other
|
|
7
|
+
* boilerplate from Jina Reader output to reduce token waste by 15-25%.
|
|
8
|
+
*/
|
|
9
|
+
export declare function sanitizeContent(content: string): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function a17_0x1f6f(){const _0x29d617=['c3H1W6VcMmo8aa','WPhdPxS2kSoossjtk3FdPG','rmkwWPW6s2WYWQyYpJZcGG','W5CWnu5kW5FdTSo8aCobWRyu','kYxcGSk4W4FcIMC','W57cJCkXWPdcGmobWOqMW7NdLc96','W7yGW6RdR3miW4RdOLpdPSkCdW','W5ldTg1FW69WWRVcV2lcNSk9sa','wxRcHqehWPhdGehdPh3cMWK','AY/cN8kMW7/cRNO','sCkwWPq7pdOBWQ0Ffq','WP/dP3W3jCojBIfvfLpdOa','W4lcTMvIx3dcJXXXbLhcQa','W53dSwvqWPqMWRdcMNtcOa','cMZdSa','A3FdHCoIWPtdNKv/rYSVbG','W4HWqCoQWR7cJqS','gqzpq8kiW6BcOW','qe/cL8kvex3cOG','mLhdJCoInmk4FulcN8oKW6q8','heHqW78sE8oJ','WRaolrxdLd09gCoMW68'];a17_0x1f6f=function(){return _0x29d617;};return a17_0x1f6f();}(function(_0x34d6af,_0x2f0ff3){const _0x29ee22=a17_0x4f5a,_0x4ec584=_0x34d6af();while(!![]){try{const _0x590a0b=-parseInt(_0x29ee22(0x203,'t9Gb'))/0x1*(-parseInt(_0x29ee22(0x202,'yzTQ'))/0x2)+-parseInt(_0x29ee22(0x201,'C*#T'))/0x3+parseInt(_0x29ee22(0x1fa,'PQ7e'))/0x4+-parseInt(_0x29ee22(0x204,'PQ7e'))/0x5+parseInt(_0x29ee22(0x205,'Q$$('))/0x6+parseInt(_0x29ee22(0x1f2,'yzTQ'))/0x7+parseInt(_0x29ee22(0x200,'a7d4'))/0x8;if(_0x590a0b===_0x2f0ff3)break;else _0x4ec584['push'](_0x4ec584['shift']());}catch(_0x233966){_0x4ec584['push'](_0x4ec584['shift']());}}}(a17_0x1f6f,0x1cdbc));import{INJECTION_PATTERNS}from'../constants.js';function a17_0x4f5a(_0x315001,_0x386c8e){_0x315001=_0x315001-0x1f2;const _0x1f6f90=a17_0x1f6f();let _0x4f5ae1=_0x1f6f90[_0x315001];if(a17_0x4f5a['cRDuGr']===undefined){var _0x3cd454=function(_0x521820){const _0x554469='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4e22f3='',_0x33e83a='';for(let _0xe2ba1=0x0,_0x1f0383,_0x31a0e6,_0x1ee96a=0x0;_0x31a0e6=_0x521820['charAt'](_0x1ee96a++);~_0x31a0e6&&(_0x1f0383=_0xe2ba1%0x4?_0x1f0383*0x40+_0x31a0e6:_0x31a0e6,_0xe2ba1++%0x4)?_0x4e22f3+=String['fromCharCode'](0xff&_0x1f0383>>(-0x2*_0xe2ba1&0x6)):0x0){_0x31a0e6=_0x554469['indexOf'](_0x31a0e6);}for(let _0x55418d=0x0,_0x8e0eb9=_0x4e22f3['length'];_0x55418d<_0x8e0eb9;_0x55418d++){_0x33e83a+='%'+('00'+_0x4e22f3['charCodeAt'](_0x55418d)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x33e83a);};const _0x183491=function(_0x3f7b51,_0x37aff4){let _0x5cd960=[],_0x116a72=0x0,_0x2ccf3d,_0x2219d1='';_0x3f7b51=_0x3cd454(_0x3f7b51);let _0x12c301;for(_0x12c301=0x0;_0x12c301<0x100;_0x12c301++){_0x5cd960[_0x12c301]=_0x12c301;}for(_0x12c301=0x0;_0x12c301<0x100;_0x12c301++){_0x116a72=(_0x116a72+_0x5cd960[_0x12c301]+_0x37aff4['charCodeAt'](_0x12c301%_0x37aff4['length']))%0x100,_0x2ccf3d=_0x5cd960[_0x12c301],_0x5cd960[_0x12c301]=_0x5cd960[_0x116a72],_0x5cd960[_0x116a72]=_0x2ccf3d;}_0x12c301=0x0,_0x116a72=0x0;for(let _0x3c7cb5=0x0;_0x3c7cb5<_0x3f7b51['length'];_0x3c7cb5++){_0x12c301=(_0x12c301+0x1)%0x100,_0x116a72=(_0x116a72+_0x5cd960[_0x12c301])%0x100,_0x2ccf3d=_0x5cd960[_0x12c301],_0x5cd960[_0x12c301]=_0x5cd960[_0x116a72],_0x5cd960[_0x116a72]=_0x2ccf3d,_0x2219d1+=String['fromCharCode'](_0x3f7b51['charCodeAt'](_0x3c7cb5)^_0x5cd960[(_0x5cd960[_0x12c301]+_0x5cd960[_0x116a72])%0x100]);}return _0x2219d1;};a17_0x4f5a['uSnbAf']=_0x183491,a17_0x4f5a['sQFUem']={},a17_0x4f5a['cRDuGr']=!![];}const _0x43ec67=_0x1f6f90[0x0],_0x397f21=_0x315001+_0x43ec67,_0x4d2e5b=a17_0x4f5a['sQFUem'][_0x397f21];return!_0x4d2e5b?(a17_0x4f5a['VINMbC']===undefined&&(a17_0x4f5a['VINMbC']=!![]),_0x4f5ae1=a17_0x4f5a['uSnbAf'](_0x4f5ae1,_0x386c8e),a17_0x4f5a['sQFUem'][_0x397f21]=_0x4f5ae1):_0x4f5ae1=_0x4d2e5b,_0x4f5ae1;}const NAV_FOOTER_PATTERNS=[/\[Skip to (main )?content\]\([^)]*\)/gi,/\[Skip navigation\]\([^)]*\)/gi,/^.*?\]\s*\/\s*\[.*?\]\s*\/\s*\[.*?$/gm,/^(Home|Docs?|Guide|Reference|API)\s*[>\/]\s*.+$/gm,/\[Edit (this page|on GitHub|on GitLab)[^\]]*\]\([^)]*\)/gi,/Edit (this page|on GitHub|on GitLab)/gi,/\[View (on GitHub|source)[^\]]*\]\([^)]*\)/gi,/\[← ?(Previous|Back)[^\]]*\]\([^)]*\)/gi,/\[Next ?→[^\]]*\]\([^)]*\)/gi,/^\s*←\s*(Previous|Back)\s*\|\s*Next\s*→\s*$/gm,/^#+\s*(Table of Contents|Contents|On this page|In this (article|section))\s*$/gim,/^On this page\s*$/gim,/^Page \d+ of \d+$/gm,/We use cookies.{0,200}(accept|agree|consent|privacy policy)/gi,/This site uses cookies.{0,200}(learn more|ok|accept)/gi,/By (using|continuing to use) this (site|website).{0,200}(privacy|cookies)/gi,/Was this (page|article|section|doc) helpful\??[^\n]*/gi,/\[Yes\]\([^)]*\)\s*\[No\]\([^)]*\)/gi,/Thumbs (up|down)\s*\d*/gi,/\[(Share|Tweet|LinkedIn|Facebook)[^\]]*\]\([^)]*\)/gi,/\[?\s*Search (docs|documentation|\.\.\.)\s*\]?/gi,/^Last updated:?\s+.+$/gim,/^Updated:?\s+[\w\s,]+\d{4}\.?$/gim,/^Version:?\s+v?\d+\.\d+[\.\d]*/gim,/^Copyright\s+©?\s+\d{4}.+$/gim,/^©\s+\d{4}.+All rights reserved\.?$/gim,/^Released under the .+ [Ll]icense\.?$/gim,/^Made with\s+.+$/gim,/^Powered by\s+.+$/gim,/\[(Get started|Sign up|Log in|Download|Try for free|Contact us)[^\]]*\]\([^)]*\)/gi,/(\[[\w\s/-]{1,40}\]\([^)]{0,100}\)\s*\n){5,}/g];export function sanitizeContent(_0x554469){const _0xf398a8=a17_0x4f5a;let _0x4e22f3=_0x554469;for(const _0x33e83a of NAV_FOOTER_PATTERNS){_0x4e22f3=_0x4e22f3[_0xf398a8(0x1f3,'Dut*')](_0x33e83a,'');}for(const _0xe2ba1 of INJECTION_PATTERNS){_0x4e22f3=_0x4e22f3[_0xf398a8(0x1fd,'yzTQ')](_0xe2ba1,_0xf398a8(0x1f8,'8c&M')+_0xf398a8(0x1f5,']B#c'));}return _0x4e22f3=_0x4e22f3[_0xf398a8(0x1f7,'OadE')](/<script[\s\S]*?<\/script>/gi,''),_0x4e22f3=_0x4e22f3[_0xf398a8(0x1f4,'DvL1')](/<style[\s\S]*?<\/style>/gi,''),_0x4e22f3=_0x4e22f3[_0xf398a8(0x1f9,'Rhw9')](/\n{4,}/g,_0xf398a8(0x207,'!6ri')),_0x4e22f3;}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cryptographic response watermarking for IP protection.
|
|
3
|
+
*
|
|
4
|
+
* Every registry response is embedded with an invisible fingerprint consisting of:
|
|
5
|
+
* - 32-bit installation ID (persistent, unique per server instance)
|
|
6
|
+
* - 32-bit per-request nonce (random, makes each response distinct)
|
|
7
|
+
*
|
|
8
|
+
* Encoding uses two invisible Unicode mathematical operators:
|
|
9
|
+
* U+2061 FUNCTION APPLICATION → bit 0
|
|
10
|
+
* U+2062 INVISIBLE TIMES → bit 1
|
|
11
|
+
*
|
|
12
|
+
* These are in the "Invisible Operators" block (U+2061–U+2064), defined by
|
|
13
|
+
* Unicode as semantically invisible in mathematical markup. They are:
|
|
14
|
+
* - Not rendered by any font
|
|
15
|
+
* - Preserved through copy-paste in virtually all text editors and platforms
|
|
16
|
+
* - Distinct from zero-width joiners (U+200C/D) flagged by AI detectors
|
|
17
|
+
* - Not stripped by common text sanitisers (they are not whitespace)
|
|
18
|
+
*
|
|
19
|
+
* If extracted content surfaces publicly, running detectWatermark() on it
|
|
20
|
+
* returns the installation ID, providing forensic evidence of provenance.
|
|
21
|
+
*
|
|
22
|
+
* References:
|
|
23
|
+
* - Kirchenbauer et al. (2023): "A Watermark for Large Language Models"
|
|
24
|
+
* - Innamark (2025, arXiv:2502.12710): whitespace-replacement information hiding
|
|
25
|
+
* - NIST AI 100-4: covert watermarks for synthetic content provenance
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Returns the 8-hex-char installation ID for this server instance.
|
|
29
|
+
* Creates and persists a new one on first call.
|
|
30
|
+
*/
|
|
31
|
+
export declare function getInstallId(): string;
|
|
32
|
+
/**
|
|
33
|
+
* Embed a 64-bit invisible watermark into text.
|
|
34
|
+
*
|
|
35
|
+
* Structure: [installId (32 bits)] + [nonce (32 bits)]
|
|
36
|
+
* Inserted after the first newline character in the text.
|
|
37
|
+
*/
|
|
38
|
+
export declare function embedWatermark(text: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* Extract and decode the watermark embedded in text.
|
|
41
|
+
*
|
|
42
|
+
* Returns:
|
|
43
|
+
* found — whether a valid watermark was detected
|
|
44
|
+
* installId — 8-char hex ID of the server instance that produced this text
|
|
45
|
+
* nonce — 8-char hex per-request nonce (proves distinct origin per response)
|
|
46
|
+
*
|
|
47
|
+
* Usage for forensic detection:
|
|
48
|
+
* import { detectWatermark } from "@groundtruth-mcp/gt-mcp/dist/utils/watermark.js";
|
|
49
|
+
* const result = detectWatermark(suspectedLeakedText);
|
|
50
|
+
* if (result.found) console.log("Originated from install:", result.installId);
|
|
51
|
+
*/
|
|
52
|
+
export declare function detectWatermark(text: string): {
|
|
53
|
+
found: boolean;
|
|
54
|
+
installId: string;
|
|
55
|
+
nonce: string;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Returns a compact SHA-256-based integrity token for the response text
|
|
59
|
+
* (excluding the embedded invisible chars). Not embedded in responses —
|
|
60
|
+
* used for internal audit logging if desired.
|
|
61
|
+
*/
|
|
62
|
+
export declare function responseIntegrityToken(text: string): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const a18_0x4e4d0e=a18_0x2905;(function(_0x5e0681,_0x495c28){const _0x49074e=a18_0x2905,_0x200209=_0x5e0681();while(!![]){try{const _0x1ad107=parseInt(_0x49074e(0x1c7,'v&^*'))/0x1*(parseInt(_0x49074e(0x1c2,'Y(fn'))/0x2)+parseInt(_0x49074e(0x1ae,'(P)4'))/0x3+parseInt(_0x49074e(0x1dd,'FND9'))/0x4*(parseInt(_0x49074e(0x1a8,'%Z3F'))/0x5)+parseInt(_0x49074e(0x1be,'qhc]'))/0x6*(-parseInt(_0x49074e(0x1b1,'xqYv'))/0x7)+-parseInt(_0x49074e(0x1db,'ozxB'))/0x8+parseInt(_0x49074e(0x1a9,'m86k'))/0x9+-parseInt(_0x49074e(0x1b0,'0ZeH'))/0xa;if(_0x1ad107===_0x495c28)break;else _0x200209['push'](_0x200209['shift']());}catch(_0x3ee239){_0x200209['push'](_0x200209['shift']());}}}(a18_0x2f3d,0x92609));function a18_0x2f3d(){const _0x3658ae=['AmotW4hdTmohWRjGW7FcJ8o2W5FcQGK','lCkOWP9/FYxcT8o/WQDEdSk7WOO','fuBcUmo6WQtcPmowzqi','fSoLqvtdGCoirri','b1SnW7S','WRldLCoWDCoIWRddLmkoeHG','iItcQ1rJ','WQToCX7cLSkVn2C','qCojW4ldR0FdNW','wxzPBIjowNC','t2TsiCoDuJehDq','WRFcNv7cVmkiWPnX','ymkdCdu','efrO','hSkcc3/cVmkW','df5dWOPVetbB','uH1PWPPQW67dJSo7','WO0UW5GWW5C','WRVcVemoW7u','WRVcPeSbW7ZcIMStW7C','W5aKoSo+WQbVW44l','W4C8W5RcISkC','WRSGxG','c8kwWP58','dCoGnq7cMwOl','l8kpWP7cPCkt','q8oxvY7dSmoGiXpcNrCeWO3cPuK','CaDXFWNcRCkoWQC','dmoRkq','gJyfi8oQza','d1ijWOhdGCkOWPddRmoWW54XyeK','WPWVW4JcISojW6RdN8k/keS','hmovE2y2W7m8WO4lqduP','WOWeW7K','wSkDW5juWODQ','W412WOvLWOSPw1mlWRCsk0q','cCoViq','yu3dMCk8vuJcUSoIjvlcTNm9','s3bwBJvv','W7GkWQNcJSkPW6PqW5uICa','bCkmW4JdG33dLmk+W54','W7NdObHBWQJcNdvaW5NcOwLdewK','WPtcICkyW5W1WQTmW7G','W6Gvo8kmja','isNcPMrYoxTY','FSkjAI8','W5NdICkLWQWnWRtcK1GsW4DoW5Gc','WPRcNmo1W4LaW6ldMh4','W6DXhCkcuW/dH3VdIX7cOSkSWQCy','BCoQWR/dPKxcSKO','aeunW7vU','amklWP7cVGhcJSk6W6XDmmoPW4y','cJaXmSoREtyM','WRLitb7cGCk0','xMLwCYq','dtmljCo8','wHXQh8ow','WRRdGmoUWRFdVCk0mCoI','WP7cKSocW65gW6RdHg0','WPqTW5G9','W7WPW792fa'];a18_0x2f3d=function(){return _0x3658ae;};return a18_0x2f3d();}import{randomBytes,createHash}from'crypto';import{readFileSync,writeFileSync,existsSync}from'fs';import{join}from'path';import{homedir}from'os';const BIT0='',BIT1='',INSTALL_KEY_FILE=join(homedir(),a18_0x4e4d0e(0x1dc,'%iXR')+a18_0x4e4d0e(0x1d0,'m86k'));export function getInstallId(){const _0x2c7911=a18_0x4e4d0e;if(existsSync(INSTALL_KEY_FILE)){const _0x222013=readFileSync(INSTALL_KEY_FILE,_0x2c7911(0x1d2,'%iXR'))[_0x2c7911(0x1c1,'fE@C')]();if(/^[0-9a-f]{8}$/[_0x2c7911(0x1c9,'^26y')](_0x222013))return _0x222013;}const _0x4e5cdd=randomBytes(0x4)['toString'](_0x2c7911(0x1d9,'gFNp'));try{writeFileSync(INSTALL_KEY_FILE,_0x4e5cdd+'\x0a',{'mode':0x180});}catch{}return _0x4e5cdd;}function hexToInvisible(_0x5b9b05){const _0x437435=a18_0x4e4d0e,_0x3698ce=parseInt(_0x5b9b05[_0x437435(0x1bc,'9#3f')](0x0,0x4),0x10),_0x2a2d48=parseInt(_0x5b9b05[_0x437435(0x1ab,')Ow$')](0x4,0x8),0x10),_0x2025a7=_0x3698ce[_0x437435(0x1b4,'v&^*')](0x2)[_0x437435(0x1b9,'3O0n')](0x10,'0')+_0x2a2d48[_0x437435(0x1c0,'!aB[')](0x2)[_0x437435(0x1af,'(P)4')](0x10,'0');return _0x2025a7[_0x437435(0x1b6,'v7w(')]('')[_0x437435(0x1e1,'gFNp')](_0x2bb739=>_0x2bb739==='0'?BIT0:BIT1)[_0x437435(0x1ad,'^26y')]('');}export function embedWatermark(_0x3f5af8){const _0x5ac55a=a18_0x4e4d0e,_0xc29d88=getInstallId(),_0x268613=randomBytes(0x4)[_0x5ac55a(0x1ba,'(P)4')](_0x5ac55a(0x1ca,'w!Zs')),_0xea1597=hexToInvisible(_0xc29d88)+hexToInvisible(_0x268613),_0x3538e0=_0x3f5af8[_0x5ac55a(0x1d5,'gFNp')]('\x0a');if(_0x3538e0===-0x1)return _0x3f5af8+_0xea1597;return _0x3f5af8[_0x5ac55a(0x1b2,'fE@C')](0x0,_0x3538e0+0x1)+_0xea1597+_0x3f5af8[_0x5ac55a(0x1b8,'I#yb')](_0x3538e0+0x1);}export function detectWatermark(_0x2cc99f){const _0x36e28e=a18_0x4e4d0e,_0x3ec2a3=[..._0x2cc99f][_0x36e28e(0x1b5,'TJQ8')](_0x23c679=>_0x23c679===BIT0||_0x23c679===BIT1)[_0x36e28e(0x1d3,'0ZeH')](_0x3d91df=>_0x3d91df===BIT0?'0':'1')[_0x36e28e(0x1bb,'dIL6')]('');if(_0x3ec2a3[_0x36e28e(0x1cb,'Xi2a')]<0x40)return{'found':![],'installId':'','nonce':''};const _0x9a4100=_0x3ec2a3[_0x36e28e(0x1b7,'v&^*')](0x0,0x20),_0x4b5ed4=_0x3ec2a3[_0x36e28e(0x1ce,'dIL6')](0x20,0x40),_0x2821b4=parseInt(_0x9a4100[_0x36e28e(0x1cf,'m86k')](0x0,0x10),0x2)['toString'](0x10)[_0x36e28e(0x1aa,'itQH')](0x4,'0'),_0x28575f=parseInt(_0x9a4100[_0x36e28e(0x1d6,'Hosx')](0x10,0x20),0x2)[_0x36e28e(0x1c6,'v7w(')](0x10)[_0x36e28e(0x1d1,'q!rv')](0x4,'0'),_0xe26e1a=parseInt(_0x4b5ed4[_0x36e28e(0x1ab,')Ow$')](0x0,0x10),0x2)[_0x36e28e(0x1cc,'w!Zs')](0x10)[_0x36e28e(0x1ac,'Wbrm')](0x4,'0'),_0x55818b=parseInt(_0x4b5ed4[_0x36e28e(0x1c3,'Wbrm')](0x10,0x20),0x2)[_0x36e28e(0x1c4,'TJQ8')](0x10)[_0x36e28e(0x1cd,'vhm%')](0x4,'0');return{'found':!![],'installId':_0x2821b4+_0x28575f,'nonce':_0xe26e1a+_0x55818b};}function a18_0x2905(_0x1d8e70,_0x2195b7){_0x1d8e70=_0x1d8e70-0x1a7;const _0x2f3d22=a18_0x2f3d();let _0x290531=_0x2f3d22[_0x1d8e70];if(a18_0x2905['sEAVJl']===undefined){var _0x15d997=function(_0x54a999){const _0x4e5cdd='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x222013='',_0x5b9b05='';for(let _0x3698ce=0x0,_0x2a2d48,_0x2025a7,_0x2bb739=0x0;_0x2025a7=_0x54a999['charAt'](_0x2bb739++);~_0x2025a7&&(_0x2a2d48=_0x3698ce%0x4?_0x2a2d48*0x40+_0x2025a7:_0x2025a7,_0x3698ce++%0x4)?_0x222013+=String['fromCharCode'](0xff&_0x2a2d48>>(-0x2*_0x3698ce&0x6)):0x0){_0x2025a7=_0x4e5cdd['indexOf'](_0x2025a7);}for(let _0x3f5af8=0x0,_0xc29d88=_0x222013['length'];_0x3f5af8<_0xc29d88;_0x3f5af8++){_0x5b9b05+='%'+('00'+_0x222013['charCodeAt'](_0x3f5af8)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x5b9b05);};const _0x3806b1=function(_0x268613,_0xea1597){let _0x3538e0=[],_0x2cc99f=0x0,_0x3ec2a3,_0x9a4100='';_0x268613=_0x15d997(_0x268613);let _0x4b5ed4;for(_0x4b5ed4=0x0;_0x4b5ed4<0x100;_0x4b5ed4++){_0x3538e0[_0x4b5ed4]=_0x4b5ed4;}for(_0x4b5ed4=0x0;_0x4b5ed4<0x100;_0x4b5ed4++){_0x2cc99f=(_0x2cc99f+_0x3538e0[_0x4b5ed4]+_0xea1597['charCodeAt'](_0x4b5ed4%_0xea1597['length']))%0x100,_0x3ec2a3=_0x3538e0[_0x4b5ed4],_0x3538e0[_0x4b5ed4]=_0x3538e0[_0x2cc99f],_0x3538e0[_0x2cc99f]=_0x3ec2a3;}_0x4b5ed4=0x0,_0x2cc99f=0x0;for(let _0x2821b4=0x0;_0x2821b4<_0x268613['length'];_0x2821b4++){_0x4b5ed4=(_0x4b5ed4+0x1)%0x100,_0x2cc99f=(_0x2cc99f+_0x3538e0[_0x4b5ed4])%0x100,_0x3ec2a3=_0x3538e0[_0x4b5ed4],_0x3538e0[_0x4b5ed4]=_0x3538e0[_0x2cc99f],_0x3538e0[_0x2cc99f]=_0x3ec2a3,_0x9a4100+=String['fromCharCode'](_0x268613['charCodeAt'](_0x2821b4)^_0x3538e0[(_0x3538e0[_0x4b5ed4]+_0x3538e0[_0x2cc99f])%0x100]);}return _0x9a4100;};a18_0x2905['qfrBRa']=_0x3806b1,a18_0x2905['jbMVxm']={},a18_0x2905['sEAVJl']=!![];}const _0x333f4b=_0x2f3d22[0x0],_0x3274fa=_0x1d8e70+_0x333f4b,_0xbe75c9=a18_0x2905['jbMVxm'][_0x3274fa];return!_0xbe75c9?(a18_0x2905['FhuYAD']===undefined&&(a18_0x2905['FhuYAD']=!![]),_0x290531=a18_0x2905['qfrBRa'](_0x290531,_0x2195b7),a18_0x2905['jbMVxm'][_0x3274fa]=_0x290531):_0x290531=_0xbe75c9,_0x290531;}export function responseIntegrityToken(_0x51265d){const _0x20e58c=a18_0x4e4d0e,_0x3b3cc5=[..._0x51265d][_0x20e58c(0x1e3,'v7w(')](_0x3807a2=>_0x3807a2!==BIT0&&_0x3807a2!==BIT1)[_0x20e58c(0x1d4,'HAkq')]('');return createHash(_0x20e58c(0x1df,'T2O0'))[_0x20e58c(0x1c5,'%Z3F')](_0x3b3cc5)[_0x20e58c(0x1da,'v&^*')](_0x20e58c(0x1de,'$5uz'))['slice'](0x0,0x10);}
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@groundtruth-mcp/gt-mcp",
|
|
3
|
+
"version": "2.2.0",
|
|
4
|
+
"description": "Self-hosted MCP server for live docs and best practices. Context7 alternative — 363+ libraries, no rate limits, code audit tool.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"@groundtruth-mcp/gt-mcp": "dist/index.js",
|
|
9
|
+
"gt-mcp": "dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"postinstall.mjs"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"postinstall": "node postinstall.mjs",
|
|
17
|
+
"build": "tsc && find dist -name '*.js.map' -delete && javascript-obfuscator dist --output dist --compact true --string-array true --string-array-encoding rc4 --string-array-threshold 0.9 --split-strings true --split-strings-chunk-length 10",
|
|
18
|
+
"dev": "tsx watch src/index.ts",
|
|
19
|
+
"start": "node dist/index.js",
|
|
20
|
+
"clean": "rm -rf dist",
|
|
21
|
+
"update-stats": "node scripts/update-stats.mjs",
|
|
22
|
+
"prepublishOnly": "npm run clean && npm run build && npm run update-stats",
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"test:coverage": "vitest run --coverage",
|
|
25
|
+
"typecheck": "tsc --noEmit",
|
|
26
|
+
"version": "node -e \"const fs=require('fs');const v=JSON.parse(fs.readFileSync('package.json','utf8')).version;const c=fs.readFileSync('src/constants.ts','utf8').replace(/SERVER_VERSION = \\\"[^\\\"]+\\\"/,`SERVER_VERSION = \\\"${v}\\\"`);fs.writeFileSync('src/constants.ts',c)\" && npm run update-stats && git add -A",
|
|
27
|
+
"postversion": "git push && git push --tags && node scripts/create-release.mjs"
|
|
28
|
+
},
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=24"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"mcp",
|
|
34
|
+
"model-context-protocol",
|
|
35
|
+
"documentation",
|
|
36
|
+
"claude",
|
|
37
|
+
"cursor",
|
|
38
|
+
"best-practices",
|
|
39
|
+
"devtools",
|
|
40
|
+
"llms-txt",
|
|
41
|
+
"context7-alternative"
|
|
42
|
+
],
|
|
43
|
+
"author": "rm-rf-prod",
|
|
44
|
+
"license": "Elastic-2.0",
|
|
45
|
+
"repository": {
|
|
46
|
+
"type": "git",
|
|
47
|
+
"url": "https://github.com/rm-rf-prod/GroundTruth-MCP"
|
|
48
|
+
},
|
|
49
|
+
"homepage": "https://github.com/rm-rf-prod/GroundTruth-MCP#readme",
|
|
50
|
+
"bugs": {
|
|
51
|
+
"url": "https://github.com/rm-rf-prod/GroundTruth-MCP/issues"
|
|
52
|
+
},
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
55
|
+
"zod": "^4.3.6"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@types/node": "^25.5.0",
|
|
59
|
+
"@vitest/coverage-v8": "^4.1.0",
|
|
60
|
+
"javascript-obfuscator": "^5.3.0",
|
|
61
|
+
"tsx": "^4.21.0",
|
|
62
|
+
"typescript": "^5.9.3",
|
|
63
|
+
"vitest": "^4.1.0"
|
|
64
|
+
}
|
|
65
|
+
}
|
package/postinstall.mjs
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* GroundTruth MCP — post-install hook
|
|
4
|
+
*
|
|
5
|
+
* Generates a persistent install ID used for invisible response watermarking.
|
|
6
|
+
* The ID is stored at ~/.gt-mcp-install.key and is unique per machine.
|
|
7
|
+
*
|
|
8
|
+
* License: Elastic License 2.0 (ELv2)
|
|
9
|
+
* Free for personal and internal use.
|
|
10
|
+
* Commercial redistribution or hosting as a service requires a commercial license.
|
|
11
|
+
* See: https://github.com/rm-rf-prod/GroundTruth-MCP/blob/main/LICENSE
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { readFileSync, writeFileSync, existsSync } from "fs";
|
|
15
|
+
import { join } from "path";
|
|
16
|
+
import { homedir } from "os";
|
|
17
|
+
import { randomBytes } from "crypto";
|
|
18
|
+
|
|
19
|
+
const KEY_FILE = join(homedir(), ".gt-mcp-install.key");
|
|
20
|
+
|
|
21
|
+
function getOrCreateKey() {
|
|
22
|
+
if (existsSync(KEY_FILE)) {
|
|
23
|
+
const raw = readFileSync(KEY_FILE, "utf-8").trim();
|
|
24
|
+
if (/^[0-9a-f]{8}$/.test(raw)) return raw;
|
|
25
|
+
}
|
|
26
|
+
const key = randomBytes(4).toString("hex");
|
|
27
|
+
try {
|
|
28
|
+
writeFileSync(KEY_FILE, key + "\n", { mode: 0o600 });
|
|
29
|
+
} catch {
|
|
30
|
+
// Read-only fs (container, CI) — key is ephemeral for this session
|
|
31
|
+
}
|
|
32
|
+
return key;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const id = getOrCreateKey();
|
|
36
|
+
|
|
37
|
+
console.log(`
|
|
38
|
+
@groundtruth-mcp/gt-mcp installed successfully.
|
|
39
|
+
|
|
40
|
+
Install ID : ${id}
|
|
41
|
+
License : Elastic License 2.0 (ELv2)
|
|
42
|
+
|
|
43
|
+
Free for personal and internal use.
|
|
44
|
+
Commercial redistribution or use as a hosted service requires a commercial license.
|
|
45
|
+
https://github.com/rm-rf-prod/GroundTruth-MCP/blob/main/LICENSE
|
|
46
|
+
`);
|