context-compress 2026.3.13 → 2026.3.20
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/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +51 -0
- package/dist/config.js.map +1 -1
- package/dist/logger.d.ts +0 -2
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +0 -6
- package/dist/logger.js.map +1 -1
- package/dist/network.d.ts +9 -0
- package/dist/network.d.ts.map +1 -1
- package/dist/network.js +61 -0
- package/dist/network.js.map +1 -1
- package/dist/server.bundle.mjs +316 -142
- package/dist/server.bundle.mjs.map +3 -3
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +162 -55
- package/dist/server.js.map +1 -1
- package/dist/stats.d.ts.map +1 -1
- package/dist/stats.js +24 -11
- package/dist/stats.js.map +1 -1
- package/dist/store.d.ts +6 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +37 -66
- package/dist/store.js.map +1 -1
- package/dist/types.d.ts +0 -19
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/config.d.ts
CHANGED
|
@@ -32,6 +32,10 @@ export interface Config {
|
|
|
32
32
|
searchBlockAfter: number;
|
|
33
33
|
/** Compression level: normal (default), compact (shorter labels), ultra (minimal output) */
|
|
34
34
|
compressionLevel: CompressionLevel;
|
|
35
|
+
/** Persist the knowledge base DB across MCP server restarts (default: false) */
|
|
36
|
+
persistDb: boolean;
|
|
37
|
+
/** Custom directory for the persistent DB (default: null, uses .context-compress/ in project dir) */
|
|
38
|
+
dbDir: string | null;
|
|
35
39
|
}
|
|
36
40
|
export declare function loadConfig(projectDir?: string): Config;
|
|
37
41
|
export declare function getConfig(): Config;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AAE9D,MAAM,WAAW,MAAM;IACtB,4EAA4E;IAC5E,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,qCAAqC;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,4CAA4C;IAC5C,SAAS,EAAE,OAAO,CAAC;IACnB,kCAAkC;IAClC,aAAa,EAAE,OAAO,CAAC;IACvB,+BAA+B;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,+BAA+B;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,kEAAkE;IAClE,qBAAqB,EAAE,MAAM,CAAC;IAC9B,4CAA4C;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,yCAAyC;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,6CAA6C;IAC7C,gBAAgB,EAAE,MAAM,CAAC;IACzB,4FAA4F;IAC5F,gBAAgB,EAAE,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AAE9D,MAAM,WAAW,MAAM;IACtB,4EAA4E;IAC5E,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,qCAAqC;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,4CAA4C;IAC5C,SAAS,EAAE,OAAO,CAAC;IACnB,kCAAkC;IAClC,aAAa,EAAE,OAAO,CAAC;IACvB,+BAA+B;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,+BAA+B;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,kEAAkE;IAClE,qBAAqB,EAAE,MAAM,CAAC;IAC9B,4CAA4C;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,yCAAyC;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,6CAA6C;IAC7C,gBAAgB,EAAE,MAAM,CAAC;IACzB,4FAA4F;IAC5F,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gFAAgF;IAChF,SAAS,EAAE,OAAO,CAAC;IACnB,qGAAqG;IACrG,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAkKD,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CA4EtD;AAED,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AAED,iCAAiC;AACjC,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
|
package/dist/config.js
CHANGED
|
@@ -19,6 +19,8 @@ const DEFAULTS = {
|
|
|
19
19
|
searchReduceAfter: 3,
|
|
20
20
|
searchBlockAfter: 8,
|
|
21
21
|
compressionLevel: "normal",
|
|
22
|
+
persistDb: false,
|
|
23
|
+
dbDir: null,
|
|
22
24
|
};
|
|
23
25
|
/** Overrides applied per compression level */
|
|
24
26
|
const LEVEL_OVERRIDES = {
|
|
@@ -55,6 +57,8 @@ const ConfigSchema = z.object({
|
|
|
55
57
|
searchReduceAfter: z.number().int().nonnegative().optional(),
|
|
56
58
|
searchBlockAfter: z.number().int().positive().optional(),
|
|
57
59
|
compressionLevel: z.enum(["normal", "compact", "ultra"]).optional(),
|
|
60
|
+
persistDb: z.boolean().optional(),
|
|
61
|
+
dbDir: z.string().nullable().optional(),
|
|
58
62
|
});
|
|
59
63
|
function parseIntEnv(key) {
|
|
60
64
|
const val = process.env[key];
|
|
@@ -139,6 +143,12 @@ function loadEnvConfig() {
|
|
|
139
143
|
if (level === "normal" || level === "compact" || level === "ultra") {
|
|
140
144
|
partial.compressionLevel = level;
|
|
141
145
|
}
|
|
146
|
+
if (process.env.CONTEXT_COMPRESS_PERSIST_DB === "1") {
|
|
147
|
+
partial.persistDb = true;
|
|
148
|
+
}
|
|
149
|
+
if (process.env.CONTEXT_COMPRESS_DB_DIR) {
|
|
150
|
+
partial.dbDir = process.env.CONTEXT_COMPRESS_DB_DIR;
|
|
151
|
+
}
|
|
142
152
|
return partial;
|
|
143
153
|
}
|
|
144
154
|
let _config = null;
|
|
@@ -157,6 +167,47 @@ export function loadConfig(projectDir) {
|
|
|
157
167
|
merged[k] = value;
|
|
158
168
|
}
|
|
159
169
|
}
|
|
170
|
+
// Sanity checks on final config (log when values are clamped)
|
|
171
|
+
if (merged.maxOutputBytes < 1024) {
|
|
172
|
+
console.error(`[context-compress] Config: maxOutputBytes clamped from ${merged.maxOutputBytes} to 1024`);
|
|
173
|
+
merged.maxOutputBytes = 1024;
|
|
174
|
+
}
|
|
175
|
+
if (merged.hardCapBytes < merged.maxOutputBytes) {
|
|
176
|
+
console.error(`[context-compress] Config: hardCapBytes clamped from ${merged.hardCapBytes} to ${merged.maxOutputBytes}`);
|
|
177
|
+
merged.hardCapBytes = merged.maxOutputBytes;
|
|
178
|
+
}
|
|
179
|
+
if (merged.intentSearchThreshold < 0) {
|
|
180
|
+
console.error(`[context-compress] Config: intentSearchThreshold clamped from ${merged.intentSearchThreshold} to 0`);
|
|
181
|
+
merged.intentSearchThreshold = 0;
|
|
182
|
+
}
|
|
183
|
+
if (merged.searchLimit < 1) {
|
|
184
|
+
console.error(`[context-compress] Config: searchLimit clamped from ${merged.searchLimit} to 1`);
|
|
185
|
+
merged.searchLimit = 1;
|
|
186
|
+
}
|
|
187
|
+
if (merged.searchWindowMs < 1000) {
|
|
188
|
+
console.error(`[context-compress] Config: searchWindowMs clamped from ${merged.searchWindowMs} to 1000`);
|
|
189
|
+
merged.searchWindowMs = 1000;
|
|
190
|
+
}
|
|
191
|
+
if (merged.searchReduceAfter < 1) {
|
|
192
|
+
console.error(`[context-compress] Config: searchReduceAfter clamped from ${merged.searchReduceAfter} to 1`);
|
|
193
|
+
merged.searchReduceAfter = 1;
|
|
194
|
+
}
|
|
195
|
+
if (merged.searchBlockAfter < merged.searchReduceAfter + 1) {
|
|
196
|
+
const minVal = merged.searchReduceAfter + 1;
|
|
197
|
+
console.error(`[context-compress] Config: searchBlockAfter clamped from ${merged.searchBlockAfter} to ${minVal}`);
|
|
198
|
+
merged.searchBlockAfter = minVal;
|
|
199
|
+
}
|
|
200
|
+
if (merged.searchMaxBytes < 1024) {
|
|
201
|
+
console.error(`[context-compress] Config: searchMaxBytes clamped from ${merged.searchMaxBytes} to 1024`);
|
|
202
|
+
merged.searchMaxBytes = 1024;
|
|
203
|
+
}
|
|
204
|
+
if (merged.batchMaxBytes < 1024) {
|
|
205
|
+
console.error(`[context-compress] Config: batchMaxBytes clamped from ${merged.batchMaxBytes} to 1024`);
|
|
206
|
+
merged.batchMaxBytes = 1024;
|
|
207
|
+
}
|
|
208
|
+
// dbDir implies persistDb
|
|
209
|
+
if (merged.dbDir)
|
|
210
|
+
merged.persistDb = true;
|
|
160
211
|
_config = merged;
|
|
161
212
|
return _config;
|
|
162
213
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2CxB,MAAM,QAAQ,GAAW;IACxB,kBAAkB,EAAE,EAAE;IACtB,KAAK,EAAE,KAAK;IACZ,SAAS,EAAE,IAAI;IACf,aAAa,EAAE,IAAI;IACnB,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,IAAI;IACjB,qBAAqB,EAAE,KAAK;IAC5B,cAAc,EAAE,OAAO;IACvB,YAAY,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;IAC/B,cAAc,EAAE,MAAM;IACtB,aAAa,EAAE,MAAM;IACrB,WAAW,EAAE,CAAC;IACd,cAAc,EAAE,MAAM;IACtB,iBAAiB,EAAE,CAAC;IACpB,gBAAgB,EAAE,CAAC;IACnB,gBAAgB,EAAE,QAAQ;IAC1B,SAAS,EAAE,KAAK;IAChB,KAAK,EAAE,IAAI;CACX,CAAC;AAEF,8CAA8C;AAC9C,MAAM,eAAe,GAA8C;IAClE,MAAM,EAAE,EAAE;IACV,OAAO,EAAE;QACR,cAAc,EAAE,MAAM;QACtB,cAAc,EAAE,MAAM;QACtB,aAAa,EAAE,MAAM;QACrB,WAAW,EAAE,CAAC;QACd,qBAAqB,EAAE,KAAK;KAC5B;IACD,KAAK,EAAE;QACN,cAAc,EAAE,MAAM;QACtB,cAAc,EAAE,MAAM;QACtB,aAAa,EAAE,MAAM;QACrB,WAAW,EAAE,CAAC;QACd,qBAAqB,EAAE,KAAK;KAC5B;CACD,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAClD,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC7B,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACjC,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACrC,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACnC,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACnC,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC7D,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACtD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACpD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACtD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACrD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACnD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACtD,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAC5D,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACxD,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;IACnE,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACjC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC;AAEH,SAAS,WAAW,CAAC,GAAW;IAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,cAAc,CAAC,UAAmB;IAC1C,MAAM,KAAK,GAAG;QACb,UAAU,IAAI,IAAI,CAAC,UAAU,EAAE,wBAAwB,CAAC;QACxD,IAAI,CAAC,OAAO,EAAE,EAAE,wBAAwB,CAAC;KACzC,CAAC,MAAM,CAAC,OAAO,CAAa,CAAC;IAE9B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,MAAM,CAAC,IAAuB,CAAC;YACvC,CAAC;YACD,yCAAyC;YACzC,OAAO,EAAE,CAAC;QACX,CAAC;QAAC,MAAM,CAAC;YACR,4CAA4C;QAC7C,CAAC;IACF,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC;AAED,SAAS,aAAa;IACrB,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,GAAG,EAAE,CAAC;QAChD,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,CAAC;QAClD,OAAO,CAAC,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,KAAK,CAAC,GAAG,CAAC;aAClF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,SAAS,EAAE,CAAC;QAC3D,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,GAAG,CAAC;IACrE,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,+BAA+B,KAAK,SAAS,EAAE,CAAC;QAC/D,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,KAAK,GAAG,CAAC;IAC7E,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,SAAS,EAAE,CAAC;QAC3D,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,GAAG,CAAC;IACvE,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,SAAS,EAAE,CAAC;QAC3D,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,GAAG,CAAC;IACvE,CAAC;IAED,oBAAoB;IACpB,MAAM,SAAS,GAAG,WAAW,CAAC,mCAAmC,CAAC,CAAC;IACnE,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAEhE,MAAM,OAAO,GAAG,WAAW,CAAC,iCAAiC,CAAC,CAAC;IAC/D,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC;IAE1D,MAAM,SAAS,GAAG,WAAW,CAAC,mCAAmC,CAAC,CAAC;IACnE,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAEhE,MAAM,QAAQ,GAAG,WAAW,CAAC,kCAAkC,CAAC,CAAC;IACjE,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,CAAC,aAAa,GAAG,QAAQ,CAAC;IAE7D,MAAM,WAAW,GAAG,WAAW,CAAC,+BAA+B,CAAC,CAAC;IACjE,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;IAEjE,MAAM,YAAY,GAAG,WAAW,CAAC,mCAAmC,CAAC,CAAC;IACtE,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,CAAC,cAAc,GAAG,YAAY,CAAC;IAEtE,MAAM,YAAY,GAAG,WAAW,CAAC,sCAAsC,CAAC,CAAC;IACzE,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,CAAC,iBAAiB,GAAG,YAAY,CAAC;IAEzE,MAAM,WAAW,GAAG,WAAW,CAAC,qCAAqC,CAAC,CAAC;IACvE,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,CAAC,gBAAgB,GAAG,WAAW,CAAC;IAEtE,MAAM,eAAe,GAAG,WAAW,CAAC,0CAA0C,CAAC,CAAC;IAChF,IAAI,eAAe,KAAK,SAAS;QAAE,OAAO,CAAC,qBAAqB,GAAG,eAAe,CAAC;IAEnF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACjD,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACpE,OAAO,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAClC,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,GAAG,EAAE,CAAC;QACrD,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC;QACzC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IACrD,CAAC;IAED,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,IAAI,OAAO,GAAkB,IAAI,CAAC;AAElC,MAAM,UAAU,UAAU,CAAC,UAAmB;IAC7C,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAElC,oDAAoD;IACpD,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,UAAU,EAAE,GAAG,SAAS,EAAE,CAAC;IAC5D,MAAM,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAChE,kEAAkE;IAClE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAC3D,MAAM,CAAC,GAAG,GAAmB,CAAC;QAC9B,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC;YAC5C,MAAkC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QAChD,CAAC;IACF,CAAC;IAED,8DAA8D;IAC9D,IAAI,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CACZ,0DAA0D,MAAM,CAAC,cAAc,UAAU,CACzF,CAAC;QACF,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;IAC9B,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QACjD,OAAO,CAAC,KAAK,CACZ,wDAAwD,MAAM,CAAC,YAAY,OAAO,MAAM,CAAC,cAAc,EAAE,CACzG,CAAC;QACF,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC;IAC7C,CAAC;IACD,IAAI,MAAM,CAAC,qBAAqB,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,KAAK,CACZ,iEAAiE,MAAM,CAAC,qBAAqB,OAAO,CACpG,CAAC;QACF,MAAM,CAAC,qBAAqB,GAAG,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,uDAAuD,MAAM,CAAC,WAAW,OAAO,CAAC,CAAC;QAChG,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CACZ,0DAA0D,MAAM,CAAC,cAAc,UAAU,CACzF,CAAC;QACF,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;IAC9B,CAAC;IACD,IAAI,MAAM,CAAC,iBAAiB,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CACZ,6DAA6D,MAAM,CAAC,iBAAiB,OAAO,CAC5F,CAAC;QACF,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,MAAM,CAAC,gBAAgB,GAAG,MAAM,CAAC,iBAAiB,GAAG,CAAC,EAAE,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAC5C,OAAO,CAAC,KAAK,CACZ,4DAA4D,MAAM,CAAC,gBAAgB,OAAO,MAAM,EAAE,CAClG,CAAC;QACF,MAAM,CAAC,gBAAgB,GAAG,MAAM,CAAC;IAClC,CAAC;IACD,IAAI,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CACZ,0DAA0D,MAAM,CAAC,cAAc,UAAU,CACzF,CAAC;QACF,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;IAC9B,CAAC;IACD,IAAI,MAAM,CAAC,aAAa,GAAG,IAAI,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CACZ,yDAAyD,MAAM,CAAC,aAAa,UAAU,CACvF,CAAC;QACF,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,0BAA0B;IAC1B,IAAI,MAAM,CAAC,KAAK;QAAE,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1C,OAAO,GAAG,MAAM,CAAC;IACjB,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,SAAS;IACxB,IAAI,CAAC,OAAO;QAAE,OAAO,UAAU,EAAE,CAAC;IAClC,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,WAAW;IAC1B,OAAO,GAAG,IAAI,CAAC;AAChB,CAAC"}
|
package/dist/logger.d.ts
CHANGED
package/dist/logger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,wBAAgB,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAI9C
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,wBAAgB,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAI9C"}
|
package/dist/logger.js
CHANGED
|
@@ -4,10 +4,4 @@ export function debug(...args) {
|
|
|
4
4
|
process.stderr.write(`[context-compress] ${args.map(String).join(" ")}\n`);
|
|
5
5
|
}
|
|
6
6
|
}
|
|
7
|
-
export function warn(...args) {
|
|
8
|
-
process.stderr.write(`[context-compress WARN] ${args.map(String).join(" ")}\n`);
|
|
9
|
-
}
|
|
10
|
-
export function error(...args) {
|
|
11
|
-
process.stderr.write(`[context-compress ERROR] ${args.map(String).join(" ")}\n`);
|
|
12
|
-
}
|
|
13
7
|
//# sourceMappingURL=logger.js.map
|
package/dist/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,UAAU,KAAK,CAAC,GAAG,IAAe;IACvC,IAAI,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC;AACF,CAAC
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,UAAU,KAAK,CAAC,GAAG,IAAe;IACvC,IAAI,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC;AACF,CAAC"}
|
package/dist/network.d.ts
CHANGED
|
@@ -2,4 +2,13 @@
|
|
|
2
2
|
* SSRF protection: detect private/internal hostnames.
|
|
3
3
|
*/
|
|
4
4
|
export declare function isPrivateHost(hostname: string): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* DNS rebinding protection: resolve hostname to IP and validate it is not private.
|
|
7
|
+
* This prevents attackers from using DNS to resolve a public hostname to a private IP.
|
|
8
|
+
* Throws an error if the resolved IP is private.
|
|
9
|
+
*/
|
|
10
|
+
export declare function resolveAndValidate(url: string): Promise<{
|
|
11
|
+
url: string;
|
|
12
|
+
resolvedIp: string | null;
|
|
13
|
+
}>;
|
|
5
14
|
//# sourceMappingURL=network.d.ts.map
|
package/dist/network.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CA0CvD;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACvC,GAAG,EAAE,MAAM,GACT,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAiDrD"}
|
package/dist/network.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import dns from "node:dns";
|
|
1
2
|
/**
|
|
2
3
|
* SSRF protection: detect private/internal hostnames.
|
|
3
4
|
*/
|
|
@@ -8,6 +9,9 @@ export function isPrivateHost(hostname) {
|
|
|
8
9
|
// Localhost variants
|
|
9
10
|
if (lower === "localhost" || lower === "0.0.0.0")
|
|
10
11
|
return true;
|
|
12
|
+
// IPv4 "this network" range: 0.0.0.0/8
|
|
13
|
+
if (/^0\./.test(h))
|
|
14
|
+
return true;
|
|
11
15
|
// IPv4 loopback: 127.0.0.0/8
|
|
12
16
|
if (/^127\./.test(h))
|
|
13
17
|
return true;
|
|
@@ -27,6 +31,9 @@ export function isPrivateHost(hostname) {
|
|
|
27
31
|
// IPv6 loopback
|
|
28
32
|
if (lower === "::1")
|
|
29
33
|
return true;
|
|
34
|
+
// IPv6 unspecified address
|
|
35
|
+
if (lower === "::" || lower === "0:0:0:0:0:0:0:0")
|
|
36
|
+
return true;
|
|
30
37
|
// IPv6 mapped IPv4: ::ffff:127.0.0.1, ::ffff:10.*, etc.
|
|
31
38
|
const mappedMatch = lower.match(/^::ffff:(\d+\.\d+\.\d+\.\d+)$/);
|
|
32
39
|
if (mappedMatch)
|
|
@@ -39,4 +46,58 @@ export function isPrivateHost(hostname) {
|
|
|
39
46
|
return true;
|
|
40
47
|
return false;
|
|
41
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* DNS rebinding protection: resolve hostname to IP and validate it is not private.
|
|
51
|
+
* This prevents attackers from using DNS to resolve a public hostname to a private IP.
|
|
52
|
+
* Throws an error if the resolved IP is private.
|
|
53
|
+
*/
|
|
54
|
+
export async function resolveAndValidate(url) {
|
|
55
|
+
const parsed = new URL(url);
|
|
56
|
+
const hostname = parsed.hostname;
|
|
57
|
+
// Skip DNS resolution for raw IP addresses — isPrivateHost already handles them
|
|
58
|
+
if (/^\d+\.\d+\.\d+\.\d+$/.test(hostname) || hostname.includes(":")) {
|
|
59
|
+
if (isPrivateHost(hostname)) {
|
|
60
|
+
throw new Error(`Blocked: resolved IP ${hostname} is a private/internal address`);
|
|
61
|
+
}
|
|
62
|
+
return { url, resolvedIp: null };
|
|
63
|
+
}
|
|
64
|
+
let resolvedIp = null;
|
|
65
|
+
let v4Error = false;
|
|
66
|
+
let v6Error = false;
|
|
67
|
+
// Resolve IPv4
|
|
68
|
+
try {
|
|
69
|
+
const { address } = await dns.promises.lookup(hostname, { family: 4 });
|
|
70
|
+
if (isPrivateHost(address)) {
|
|
71
|
+
throw new Error(`Blocked: ${hostname} resolved to private IP ${address}`);
|
|
72
|
+
}
|
|
73
|
+
resolvedIp = address;
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
// If it's our own block error, re-throw
|
|
77
|
+
if (err instanceof Error && err.message.startsWith("Blocked:"))
|
|
78
|
+
throw err;
|
|
79
|
+
// IPv4 resolution failed — track it
|
|
80
|
+
v4Error = true;
|
|
81
|
+
}
|
|
82
|
+
// Resolve IPv6
|
|
83
|
+
try {
|
|
84
|
+
const { address } = await dns.promises.lookup(hostname, { family: 6 });
|
|
85
|
+
if (isPrivateHost(address)) {
|
|
86
|
+
throw new Error(`Blocked: ${hostname} resolved to private IPv6 ${address}`);
|
|
87
|
+
}
|
|
88
|
+
if (!resolvedIp)
|
|
89
|
+
resolvedIp = address;
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
if (err instanceof Error && err.message.startsWith("Blocked:"))
|
|
93
|
+
throw err;
|
|
94
|
+
// IPv6 resolution failed — track it
|
|
95
|
+
v6Error = true;
|
|
96
|
+
}
|
|
97
|
+
// If BOTH resolutions failed (not blocked, just DNS errors), fail closed
|
|
98
|
+
if (v4Error && v6Error) {
|
|
99
|
+
throw new Error(`DNS resolution failed for ${hostname}: unable to verify host safety`);
|
|
100
|
+
}
|
|
101
|
+
return { url, resolvedIp };
|
|
102
|
+
}
|
|
42
103
|
//# sourceMappingURL=network.js.map
|
package/dist/network.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.js","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC7C,+CAA+C;IAC/C,MAAM,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAChG,MAAM,KAAK,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAE9B,qBAAqB;IACrB,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAE9D,6BAA6B;IAC7B,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,sBAAsB;IACtB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,kCAAkC;IAClC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,kDAAkD;IAClD,IAAI,0CAA0C,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpE,gBAAgB;IAChB,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAEjC,wDAAwD;IACxD,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACjE,IAAI,WAAW;QAAE,OAAO,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtD,6BAA6B;IAC7B,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,mCAAmC;IACnC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,OAAO,KAAK,CAAC;AACd,CAAC"}
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"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"}
|