context-compress 1.0.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.
Files changed (118) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +275 -0
  3. package/dist/cli/doctor.d.ts +2 -0
  4. package/dist/cli/doctor.d.ts.map +1 -0
  5. package/dist/cli/doctor.js +131 -0
  6. package/dist/cli/doctor.js.map +1 -0
  7. package/dist/cli/index.d.ts +12 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +31 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/setup.d.ts +2 -0
  12. package/dist/cli/setup.d.ts.map +1 -0
  13. package/dist/cli/setup.js +43 -0
  14. package/dist/cli/setup.js.map +1 -0
  15. package/dist/cli/uninstall.d.ts +2 -0
  16. package/dist/cli/uninstall.d.ts.map +1 -0
  17. package/dist/cli/uninstall.js +102 -0
  18. package/dist/cli/uninstall.js.map +1 -0
  19. package/dist/config.d.ts +37 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +79 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/executor.d.ts +21 -0
  24. package/dist/executor.d.ts.map +1 -0
  25. package/dist/executor.js +301 -0
  26. package/dist/executor.js.map +1 -0
  27. package/dist/hooks/pretooluse.d.ts +10 -0
  28. package/dist/hooks/pretooluse.d.ts.map +1 -0
  29. package/dist/hooks/pretooluse.js +117 -0
  30. package/dist/hooks/pretooluse.js.map +1 -0
  31. package/dist/index.d.ts +2 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +9 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/logger.d.ts +4 -0
  36. package/dist/logger.d.ts.map +1 -0
  37. package/dist/logger.js +13 -0
  38. package/dist/logger.js.map +1 -0
  39. package/dist/runtime/index.d.ts +22 -0
  40. package/dist/runtime/index.d.ts.map +1 -0
  41. package/dist/runtime/index.js +81 -0
  42. package/dist/runtime/index.js.map +1 -0
  43. package/dist/runtime/languages/elixir.d.ts +3 -0
  44. package/dist/runtime/languages/elixir.d.ts.map +1 -0
  45. package/dist/runtime/languages/elixir.js +15 -0
  46. package/dist/runtime/languages/elixir.js.map +1 -0
  47. package/dist/runtime/languages/go.d.ts +3 -0
  48. package/dist/runtime/languages/go.d.ts.map +1 -0
  49. package/dist/runtime/languages/go.js +29 -0
  50. package/dist/runtime/languages/go.js.map +1 -0
  51. package/dist/runtime/languages/javascript.d.ts +3 -0
  52. package/dist/runtime/languages/javascript.d.ts.map +1 -0
  53. package/dist/runtime/languages/javascript.js +13 -0
  54. package/dist/runtime/languages/javascript.js.map +1 -0
  55. package/dist/runtime/languages/perl.d.ts +3 -0
  56. package/dist/runtime/languages/perl.d.ts.map +1 -0
  57. package/dist/runtime/languages/perl.js +13 -0
  58. package/dist/runtime/languages/perl.js.map +1 -0
  59. package/dist/runtime/languages/php.d.ts +3 -0
  60. package/dist/runtime/languages/php.d.ts.map +1 -0
  61. package/dist/runtime/languages/php.js +24 -0
  62. package/dist/runtime/languages/php.js.map +1 -0
  63. package/dist/runtime/languages/python.d.ts +3 -0
  64. package/dist/runtime/languages/python.d.ts.map +1 -0
  65. package/dist/runtime/languages/python.js +13 -0
  66. package/dist/runtime/languages/python.js.map +1 -0
  67. package/dist/runtime/languages/r.d.ts +3 -0
  68. package/dist/runtime/languages/r.d.ts.map +1 -0
  69. package/dist/runtime/languages/r.js +13 -0
  70. package/dist/runtime/languages/r.js.map +1 -0
  71. package/dist/runtime/languages/ruby.d.ts +3 -0
  72. package/dist/runtime/languages/ruby.d.ts.map +1 -0
  73. package/dist/runtime/languages/ruby.js +13 -0
  74. package/dist/runtime/languages/ruby.js.map +1 -0
  75. package/dist/runtime/languages/rust.d.ts +3 -0
  76. package/dist/runtime/languages/rust.d.ts.map +1 -0
  77. package/dist/runtime/languages/rust.js +28 -0
  78. package/dist/runtime/languages/rust.js.map +1 -0
  79. package/dist/runtime/languages/shell.d.ts +3 -0
  80. package/dist/runtime/languages/shell.d.ts.map +1 -0
  81. package/dist/runtime/languages/shell.js +14 -0
  82. package/dist/runtime/languages/shell.js.map +1 -0
  83. package/dist/runtime/languages/typescript.d.ts +3 -0
  84. package/dist/runtime/languages/typescript.d.ts.map +1 -0
  85. package/dist/runtime/languages/typescript.js +15 -0
  86. package/dist/runtime/languages/typescript.js.map +1 -0
  87. package/dist/runtime/plugin.d.ts +38 -0
  88. package/dist/runtime/plugin.d.ts.map +1 -0
  89. package/dist/runtime/plugin.js +2 -0
  90. package/dist/runtime/plugin.js.map +1 -0
  91. package/dist/server.bundle.mjs +22769 -0
  92. package/dist/server.bundle.mjs.map +7 -0
  93. package/dist/server.d.ts +5 -0
  94. package/dist/server.d.ts.map +1 -0
  95. package/dist/server.js +405 -0
  96. package/dist/server.js.map +1 -0
  97. package/dist/snippet.d.ts +15 -0
  98. package/dist/snippet.d.ts.map +1 -0
  99. package/dist/snippet.js +92 -0
  100. package/dist/snippet.js.map +1 -0
  101. package/dist/stats.d.ts +10 -0
  102. package/dist/stats.d.ts.map +1 -0
  103. package/dist/stats.js +65 -0
  104. package/dist/stats.js.map +1 -0
  105. package/dist/store.d.ts +44 -0
  106. package/dist/store.d.ts.map +1 -0
  107. package/dist/store.js +590 -0
  108. package/dist/store.js.map +1 -0
  109. package/dist/types.d.ts +75 -0
  110. package/dist/types.d.ts.map +1 -0
  111. package/dist/types.js +14 -0
  112. package/dist/types.js.map +1 -0
  113. package/hooks/hooks.json +52 -0
  114. package/hooks/pretooluse.mjs +94 -0
  115. package/package.json +55 -0
  116. package/skills/context-compress/SKILL.md +118 -0
  117. package/skills/doctor/SKILL.md +15 -0
  118. package/skills/stats/SKILL.md +11 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/cli/uninstall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export interface Config {
2
+ /** Environment variables to pass through to subprocesses (default: none) */
3
+ passthroughEnvVars: string[];
4
+ /** Enable debug logging to stderr */
5
+ debug: boolean;
6
+ /** Block curl/wget commands in Bash hook */
7
+ blockCurl: boolean;
8
+ /** Block WebFetch tool in hook */
9
+ blockWebFetch: boolean;
10
+ /** Nudge on Read tool usage */
11
+ nudgeOnRead: boolean;
12
+ /** Nudge on Grep tool usage */
13
+ nudgeOnGrep: boolean;
14
+ /** Threshold in bytes to trigger intent-based search filtering */
15
+ intentSearchThreshold: number;
16
+ /** Default max output bytes for executor */
17
+ maxOutputBytes: number;
18
+ /** Hard cap in bytes for stream-level output (kills process if exceeded) */
19
+ hardCapBytes: number;
20
+ /** Max bytes for search results */
21
+ searchMaxBytes: number;
22
+ /** Max bytes for batch_execute output */
23
+ batchMaxBytes: number;
24
+ /** Default search result limit per query */
25
+ searchLimit: number;
26
+ /** Search throttling window in ms */
27
+ searchWindowMs: number;
28
+ /** Number of search calls before reducing results */
29
+ searchReduceAfter: number;
30
+ /** Number of search calls before blocking */
31
+ searchBlockAfter: number;
32
+ }
33
+ export declare function loadConfig(projectDir?: string): Config;
34
+ export declare function getConfig(): Config;
35
+ /** Reset config (for testing) */
36
+ export declare function resetConfig(): void;
37
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,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;CACzB;AAkED,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAStD;AAED,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AAED,iCAAiC;AACjC,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
package/dist/config.js ADDED
@@ -0,0 +1,79 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ const DEFAULTS = {
4
+ passthroughEnvVars: [],
5
+ debug: false,
6
+ blockCurl: true,
7
+ blockWebFetch: true,
8
+ nudgeOnRead: true,
9
+ nudgeOnGrep: true,
10
+ intentSearchThreshold: 5_000,
11
+ maxOutputBytes: 102_400,
12
+ hardCapBytes: 100 * 1024 * 1024,
13
+ searchMaxBytes: 40_960,
14
+ batchMaxBytes: 81_920,
15
+ searchLimit: 3,
16
+ searchWindowMs: 60_000,
17
+ searchReduceAfter: 3,
18
+ searchBlockAfter: 8,
19
+ };
20
+ function loadFileConfig(projectDir) {
21
+ const paths = [
22
+ projectDir && join(projectDir, ".context-compress.json"),
23
+ join(process.env.HOME ?? "~", ".context-compress.json"),
24
+ ].filter(Boolean);
25
+ for (const p of paths) {
26
+ try {
27
+ const raw = readFileSync(p, "utf-8");
28
+ return JSON.parse(raw);
29
+ }
30
+ catch {
31
+ // File doesn't exist or invalid JSON — skip
32
+ }
33
+ }
34
+ return {};
35
+ }
36
+ function loadEnvConfig() {
37
+ const partial = {};
38
+ if (process.env.CONTEXT_COMPRESS_DEBUG === "1") {
39
+ partial.debug = true;
40
+ }
41
+ if (process.env.CONTEXT_COMPRESS_PASSTHROUGH_ENV) {
42
+ partial.passthroughEnvVars = process.env.CONTEXT_COMPRESS_PASSTHROUGH_ENV.split(",")
43
+ .map((s) => s.trim())
44
+ .filter(Boolean);
45
+ }
46
+ if (process.env.CONTEXT_COMPRESS_BLOCK_CURL !== undefined) {
47
+ partial.blockCurl = process.env.CONTEXT_COMPRESS_BLOCK_CURL !== "0";
48
+ }
49
+ if (process.env.CONTEXT_COMPRESS_BLOCK_WEBFETCH !== undefined) {
50
+ partial.blockWebFetch = process.env.CONTEXT_COMPRESS_BLOCK_WEBFETCH !== "0";
51
+ }
52
+ if (process.env.CONTEXT_COMPRESS_NUDGE_READ !== undefined) {
53
+ partial.nudgeOnRead = process.env.CONTEXT_COMPRESS_NUDGE_READ !== "0";
54
+ }
55
+ if (process.env.CONTEXT_COMPRESS_NUDGE_GREP !== undefined) {
56
+ partial.nudgeOnGrep = process.env.CONTEXT_COMPRESS_NUDGE_GREP !== "0";
57
+ }
58
+ return partial;
59
+ }
60
+ let _config = null;
61
+ export function loadConfig(projectDir) {
62
+ if (_config)
63
+ return _config;
64
+ const fileConfig = loadFileConfig(projectDir);
65
+ const envConfig = loadEnvConfig();
66
+ // Priority: ENV > file > defaults
67
+ _config = { ...DEFAULTS, ...fileConfig, ...envConfig };
68
+ return _config;
69
+ }
70
+ export function getConfig() {
71
+ if (!_config)
72
+ return loadConfig();
73
+ return _config;
74
+ }
75
+ /** Reset config (for testing) */
76
+ export function resetConfig() {
77
+ _config = null;
78
+ }
79
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Config } from "./config.js";
2
+ import type { RuntimeMap } from "./runtime/index.js";
3
+ import type { ExecFileOptions, ExecOptions, ExecResult } from "./types.js";
4
+ export declare class SubprocessExecutor {
5
+ private runtimes;
6
+ private config;
7
+ private env;
8
+ constructor(runtimes: RuntimeMap, config: Config);
9
+ /**
10
+ * Execute code in a subprocess.
11
+ */
12
+ execute(opts: ExecOptions): Promise<ExecResult>;
13
+ /**
14
+ * Execute code with FILE_CONTENT injected.
15
+ */
16
+ executeFile(opts: ExecFileOptions): Promise<ExecResult>;
17
+ private spawnAndCapture;
18
+ private createTempDir;
19
+ private cleanupTempDir;
20
+ }
21
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAY,MAAM,YAAY,CAAC;AA2HrF,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,GAAG,CAAyB;gBAExB,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM;IAMhD;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAyErD;;OAEG;IACG,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;IAsB7D,OAAO,CAAC,eAAe;IAiFvB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,cAAc;CAOtB"}
@@ -0,0 +1,301 @@
1
+ import { execFileSync, spawn } from "node:child_process";
2
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { debug, error as logError, warn } from "./logger.js";
6
+ const DEFAULT_TIMEOUT = 30_000;
7
+ const DEFAULT_MAX_OUTPUT = 102_400;
8
+ const DEFAULT_HARD_CAP = 100 * 1024 * 1024;
9
+ /** Safe base environment variables */
10
+ const SAFE_ENV_KEYS = [
11
+ "PATH",
12
+ "HOME",
13
+ "USER",
14
+ "SHELL",
15
+ "TMPDIR",
16
+ "TERM",
17
+ "LANG",
18
+ // Windows
19
+ "SYSTEMROOT",
20
+ "COMSPEC",
21
+ "PATHEXT",
22
+ "USERPROFILE",
23
+ "APPDATA",
24
+ "LOCALAPPDATA",
25
+ "PROGRAMFILES",
26
+ "PROGRAMFILES(X86)",
27
+ "COMMONPROGRAMFILES",
28
+ "WINDIR",
29
+ ];
30
+ /**
31
+ * Build a safe environment for subprocesses.
32
+ * Security fix: credential passthrough is opt-in via config.passthroughEnvVars.
33
+ */
34
+ function buildEnv(config) {
35
+ const env = {};
36
+ // Copy safe base variables
37
+ for (const key of SAFE_ENV_KEYS) {
38
+ if (process.env[key]) {
39
+ env[key] = process.env[key];
40
+ }
41
+ }
42
+ // Deterministic settings
43
+ env.LANG = "en_US.UTF-8";
44
+ env.PYTHONDONTWRITEBYTECODE = "1";
45
+ env.PYTHONUNBUFFERED = "1";
46
+ env.NO_COLOR = "1";
47
+ // Opt-in passthrough (security fix: default is empty)
48
+ for (const key of config.passthroughEnvVars) {
49
+ if (process.env[key]) {
50
+ env[key] = process.env[key];
51
+ }
52
+ }
53
+ return env;
54
+ }
55
+ /** Kill process and its children */
56
+ function killProcessTree(pid) {
57
+ try {
58
+ if (process.platform === "win32") {
59
+ execFileSync("taskkill", ["/F", "/T", "/PID", String(pid)]);
60
+ }
61
+ else {
62
+ // Kill process group
63
+ process.kill(-pid, "SIGKILL");
64
+ }
65
+ }
66
+ catch {
67
+ try {
68
+ process.kill(pid, "SIGKILL");
69
+ }
70
+ catch {
71
+ // Process already exited
72
+ }
73
+ }
74
+ }
75
+ /**
76
+ * Smart truncation: keep 60% head + 40% tail, snapping to line boundaries.
77
+ */
78
+ function smartTruncate(output, maxBytes) {
79
+ if (Buffer.byteLength(output) <= maxBytes)
80
+ return output;
81
+ const lines = output.split("\n");
82
+ const headRatio = 0.6;
83
+ const headTarget = Math.floor(maxBytes * headRatio);
84
+ const tailTarget = maxBytes - headTarget;
85
+ // Collect head lines
86
+ let headBytes = 0;
87
+ let headEnd = 0;
88
+ for (let i = 0; i < lines.length; i++) {
89
+ const lineBytes = Buffer.byteLength(lines[i]) + 1; // +1 for newline
90
+ if (headBytes + lineBytes > headTarget)
91
+ break;
92
+ headBytes += lineBytes;
93
+ headEnd = i + 1;
94
+ }
95
+ // Collect tail lines
96
+ let tailBytes = 0;
97
+ let tailStart = lines.length;
98
+ for (let i = lines.length - 1; i >= headEnd; i--) {
99
+ const lineBytes = Buffer.byteLength(lines[i]) + 1;
100
+ if (tailBytes + lineBytes > tailTarget)
101
+ break;
102
+ tailBytes += lineBytes;
103
+ tailStart = i;
104
+ }
105
+ const headLines = lines.slice(0, headEnd);
106
+ const tailLines = lines.slice(tailStart);
107
+ const truncatedLines = lines.length - headEnd - (lines.length - tailStart);
108
+ const truncatedBytes = Buffer.byteLength(output) - headBytes - tailBytes;
109
+ const separator = `\n... [${truncatedLines} lines / ${formatSize(truncatedBytes)} truncated — showing first ${headEnd} + last ${lines.length - tailStart} lines] ...\n`;
110
+ return headLines.join("\n") + separator + tailLines.join("\n");
111
+ }
112
+ function formatSize(bytes) {
113
+ if (bytes < 1024)
114
+ return `${bytes}B`;
115
+ if (bytes < 1024 * 1024)
116
+ return `${(bytes / 1024).toFixed(1)}KB`;
117
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
118
+ }
119
+ export class SubprocessExecutor {
120
+ runtimes;
121
+ config;
122
+ env;
123
+ constructor(runtimes, config) {
124
+ this.runtimes = runtimes;
125
+ this.config = config;
126
+ this.env = buildEnv(config);
127
+ }
128
+ /**
129
+ * Execute code in a subprocess.
130
+ */
131
+ async execute(opts) {
132
+ const entry = this.runtimes.get(opts.language);
133
+ if (!entry) {
134
+ return {
135
+ stdout: "",
136
+ stderr: `Language "${opts.language}" is not available. No runtime detected.`,
137
+ exitCode: 1,
138
+ truncated: false,
139
+ killed: false,
140
+ };
141
+ }
142
+ const { plugin, runtime } = entry;
143
+ const timeout = opts.timeout ?? DEFAULT_TIMEOUT;
144
+ const maxOutput = opts.maxOutputBytes ?? this.config.maxOutputBytes;
145
+ const tmpDir = this.createTempDir();
146
+ let code = opts.code;
147
+ // Apply preprocessing (e.g. Go package wrapper, PHP tag, Rust main)
148
+ const preprocessed = plugin.preprocessCode?.(code);
149
+ if (preprocessed !== undefined) {
150
+ code = preprocessed;
151
+ }
152
+ // Add network tracking for JS/TS
153
+ if (opts.language === "javascript" || opts.language === "typescript") {
154
+ code = wrapWithNetworkTracking(code);
155
+ }
156
+ const srcPath = join(tmpDir, `main${plugin.fileExtension}`);
157
+ writeFileSync(srcPath, code);
158
+ try {
159
+ // Handle compiled languages (Rust)
160
+ if (plugin.compileStep) {
161
+ const binPath = join(tmpDir, process.platform === "win32" ? "main.exe" : "main");
162
+ const compileCmd = plugin.compileStep(runtime, srcPath, binPath);
163
+ try {
164
+ // Security fix: execFileSync with array args, no shell injection
165
+ execFileSync(compileCmd[0], compileCmd.slice(1), {
166
+ timeout: timeout,
167
+ cwd: tmpDir,
168
+ env: this.env,
169
+ });
170
+ }
171
+ catch (e) {
172
+ const err = e;
173
+ return {
174
+ stdout: "",
175
+ stderr: err.stderr?.toString() ?? err.message ?? "Compilation failed",
176
+ exitCode: 1,
177
+ truncated: false,
178
+ killed: false,
179
+ };
180
+ }
181
+ return await this.spawnAndCapture(binPath, [], tmpDir, timeout, maxOutput);
182
+ }
183
+ const cmd = plugin.buildCommand(runtime, srcPath);
184
+ return await this.spawnAndCapture(cmd[0], cmd.slice(1), tmpDir, timeout, maxOutput, plugin.needsShell);
185
+ }
186
+ finally {
187
+ // Defer cleanup slightly so runtime (especially Bun) fully exits
188
+ setTimeout(() => this.cleanupTempDir(tmpDir), 100);
189
+ }
190
+ }
191
+ /**
192
+ * Execute code with FILE_CONTENT injected.
193
+ */
194
+ async executeFile(opts) {
195
+ const entry = this.runtimes.get(opts.language);
196
+ if (!entry) {
197
+ return {
198
+ stdout: "",
199
+ stderr: `Language "${opts.language}" is not available.`,
200
+ exitCode: 1,
201
+ truncated: false,
202
+ killed: false,
203
+ };
204
+ }
205
+ const { plugin } = entry;
206
+ let code = opts.code;
207
+ if (plugin.wrapWithFileContent) {
208
+ code = plugin.wrapWithFileContent(code, opts.filePath);
209
+ }
210
+ return this.execute({ ...opts, code });
211
+ }
212
+ spawnAndCapture(cmd, args, cwd, timeout, maxOutput, useShell) {
213
+ return new Promise((resolve) => {
214
+ const hardCap = this.config.hardCapBytes;
215
+ let stdoutBuf = Buffer.alloc(0);
216
+ let stderrBuf = Buffer.alloc(0);
217
+ let totalBytes = 0;
218
+ let killed = false;
219
+ let networkBytes;
220
+ const proc = spawn(cmd, args, {
221
+ cwd,
222
+ env: { ...this.env, TMPDIR: cwd },
223
+ stdio: ["ignore", "pipe", "pipe"],
224
+ timeout,
225
+ shell: useShell,
226
+ detached: process.platform !== "win32",
227
+ });
228
+ proc.stdout?.on("data", (chunk) => {
229
+ totalBytes += chunk.length;
230
+ if (totalBytes > hardCap) {
231
+ killed = true;
232
+ if (proc.pid)
233
+ killProcessTree(proc.pid);
234
+ return;
235
+ }
236
+ stdoutBuf = Buffer.concat([stdoutBuf, chunk]);
237
+ });
238
+ proc.stderr?.on("data", (chunk) => {
239
+ totalBytes += chunk.length;
240
+ if (totalBytes > hardCap) {
241
+ killed = true;
242
+ if (proc.pid)
243
+ killProcessTree(proc.pid);
244
+ return;
245
+ }
246
+ stderrBuf = Buffer.concat([stderrBuf, chunk]);
247
+ });
248
+ proc.on("error", (err) => {
249
+ debug("Process error:", err.message);
250
+ });
251
+ proc.on("close", (code) => {
252
+ let stdout = stdoutBuf.toString("utf-8");
253
+ let stderr = stderrBuf.toString("utf-8");
254
+ // Extract network bytes from JS/TS stderr marker
255
+ const netMatch = stderr.match(/__CM_NET__:(\d+)/);
256
+ if (netMatch) {
257
+ networkBytes = Number.parseInt(netMatch[1], 10);
258
+ stderr = stderr.replace(/__CM_NET__:\d+\n?/, "");
259
+ }
260
+ if (killed) {
261
+ stdout += `\n[output capped at ${formatSize(hardCap)} — process killed]`;
262
+ }
263
+ const truncated = Buffer.byteLength(stdout) > maxOutput;
264
+ if (truncated) {
265
+ stdout = smartTruncate(stdout, maxOutput);
266
+ }
267
+ resolve({
268
+ stdout,
269
+ stderr,
270
+ exitCode: code,
271
+ truncated,
272
+ killed,
273
+ networkBytes,
274
+ });
275
+ });
276
+ });
277
+ }
278
+ createTempDir() {
279
+ const base = join(tmpdir(), "context-compress");
280
+ mkdirSync(base, { recursive: true });
281
+ return mkdtempSync(join(base, "exec-"));
282
+ }
283
+ cleanupTempDir(dir) {
284
+ try {
285
+ rmSync(dir, { recursive: true, force: true });
286
+ }
287
+ catch (e) {
288
+ debug("Failed to cleanup temp dir:", dir, e);
289
+ }
290
+ }
291
+ }
292
+ /**
293
+ * Wrap JS/TS code with fetch interceptor for network tracking.
294
+ */
295
+ function wrapWithNetworkTracking(code) {
296
+ const preamble = "let __cm_net=0;const __cm_f=globalThis.fetch;if(__cm_f){globalThis.fetch=async(...a)=>{const r=await __cm_f(...a);try{const cl=r.clone();const b=await cl.arrayBuffer();__cm_net+=b.byteLength}catch{}return r};}";
297
+ const epilogue = `\nprocess.stderr.write('__CM_NET__:'+__cm_net+'\\n');`;
298
+ // Wrap in async IIFE
299
+ return `${preamble}\nasync function __cm_main(){${code}}\n__cm_main().then(()=>{${epilogue}}).catch(e=>{console.error(e);${epilogue}process.exit(1)});`;
300
+ }
301
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * PreToolUse hook for context-compress.
4
+ * Redirects data-fetching tools to context-compress MCP tools.
5
+ *
6
+ * Security: NO self-modification of settings.json or installed_plugins.json.
7
+ * Config: Reads CONTEXT_COMPRESS_* env vars for opt-out of blocking behavior.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=pretooluse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pretooluse.d.ts","sourceRoot":"","sources":["../../src/hooks/pretooluse.ts"],"names":[],"mappings":";AACA;;;;;;GAMG"}
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * PreToolUse hook for context-compress.
4
+ * Redirects data-fetching tools to context-compress MCP tools.
5
+ *
6
+ * Security: NO self-modification of settings.json or installed_plugins.json.
7
+ * Config: Reads CONTEXT_COMPRESS_* env vars for opt-out of blocking behavior.
8
+ */
9
+ const TOOL_PREFIX = "context-compress";
10
+ // Read config from env
11
+ const blockCurl = process.env.CONTEXT_COMPRESS_BLOCK_CURL !== "0";
12
+ const blockWebFetch = process.env.CONTEXT_COMPRESS_BLOCK_WEBFETCH !== "0";
13
+ const nudgeOnRead = process.env.CONTEXT_COMPRESS_NUDGE_READ !== "0";
14
+ const nudgeOnGrep = process.env.CONTEXT_COMPRESS_NUDGE_GREP !== "0";
15
+ let raw = "";
16
+ process.stdin.setEncoding("utf-8");
17
+ for await (const chunk of process.stdin)
18
+ raw += chunk;
19
+ const input = JSON.parse(raw);
20
+ const tool = input.tool_name ?? "";
21
+ const toolInput = input.tool_input ?? {};
22
+ function respond(output) {
23
+ console.log(JSON.stringify({ hookSpecificOutput: { hookEventName: "PreToolUse", ...output } }));
24
+ process.exit(0);
25
+ }
26
+ // ─── Bash: redirect data-fetching commands ───
27
+ if (tool === "Bash") {
28
+ const command = toolInput.command ?? "";
29
+ // curl/wget → block and redirect
30
+ if (blockCurl && /(^|\s|&&|\||\;)(curl|wget)\s/i.test(command)) {
31
+ respond({
32
+ updatedInput: {
33
+ command: `echo "${TOOL_PREFIX}: curl/wget blocked. Use mcp__${TOOL_PREFIX}__fetch_and_index(url, source) to fetch URLs, or mcp__${TOOL_PREFIX}__execute(language, code) to run HTTP calls in sandbox. Set CONTEXT_COMPRESS_BLOCK_CURL=0 to disable this."`,
34
+ },
35
+ });
36
+ }
37
+ // inline fetch → block and redirect
38
+ if (blockCurl &&
39
+ (/fetch\s*\(\s*['"](https?:\/\/|http)/i.test(command) ||
40
+ /requests\.(get|post|put)\s*\(/i.test(command) ||
41
+ /http\.(get|request)\s*\(/i.test(command))) {
42
+ respond({
43
+ updatedInput: {
44
+ command: `echo "${TOOL_PREFIX}: Inline HTTP blocked. Use mcp__${TOOL_PREFIX}__execute(language, code) to run HTTP calls in sandbox, or mcp__${TOOL_PREFIX}__fetch_and_index(url, source) for web pages."`,
45
+ },
46
+ });
47
+ }
48
+ // Allow all other Bash commands
49
+ process.exit(0);
50
+ }
51
+ // ─── Read: nudge toward execute_file ───
52
+ if (tool === "Read" && nudgeOnRead) {
53
+ respond({
54
+ additionalContext: `CONTEXT TIP: If this file is large (>50 lines), prefer mcp__${TOOL_PREFIX}__execute_file(path, language, code) — processes in sandbox, only stdout enters context.`,
55
+ });
56
+ }
57
+ // ─── Grep: nudge toward execute ───
58
+ if (tool === "Grep" && nudgeOnGrep) {
59
+ respond({
60
+ additionalContext: `CONTEXT TIP: If results may be large, prefer mcp__${TOOL_PREFIX}__execute(language: "shell", code: "grep ...") — runs in sandbox, only stdout enters context.`,
61
+ });
62
+ }
63
+ // ─── WebFetch: deny + redirect to sandbox ───
64
+ if (tool === "WebFetch" && blockWebFetch) {
65
+ const url = toolInput.url ?? "";
66
+ respond({
67
+ permissionDecision: "deny",
68
+ reason: `${TOOL_PREFIX}: WebFetch blocked. Use mcp__${TOOL_PREFIX}__fetch_and_index(url: "${url}", source: "...") to fetch this URL in sandbox. Then use mcp__${TOOL_PREFIX}__search(queries: [...]) to query results.`,
69
+ });
70
+ }
71
+ // ─── Task/Agent: inject context-compress routing into subagent prompts ───
72
+ if (tool === "Task" || tool === "Agent") {
73
+ const subagentType = toolInput.subagent_type ?? "";
74
+ const prompt = toolInput.prompt ?? "";
75
+ const ROUTING_BLOCK = `
76
+
77
+ ---
78
+ CONTEXT WINDOW PROTECTION — USE CONTEXT-COMPRESS MCP TOOLS
79
+
80
+ Raw Bash/Read/WebFetch output floods your context. You have context-compress tools that keep data in sandbox.
81
+
82
+ STEP 1 — GATHER: mcp__${TOOL_PREFIX}__batch_execute(commands, queries)
83
+ commands: [{label: "Name", command: "shell cmd"}, ...]
84
+ queries: ["query1", "query2", ...] — put 5-8 queries covering everything you need.
85
+ Runs all commands, indexes output, returns search results. ONE call, no follow-ups.
86
+
87
+ STEP 2 — FOLLOW-UP: mcp__${TOOL_PREFIX}__search(queries: ["q1", "q2", "q3", ...])
88
+ Pass ALL follow-up questions as queries array. ONE call, not separate calls.
89
+
90
+ OTHER: execute(language, code) | execute_file(path, language, code) | fetch_and_index(url) + search
91
+
92
+ FORBIDDEN: Bash for output, Read for files, WebFetch. Bash is ONLY for git/mkdir/rm/mv.
93
+
94
+ OUTPUT FORMAT — KEEP YOUR FINAL RESPONSE UNDER 500 WORDS:
95
+ The parent agent context window is precious. Your full response gets injected into it.
96
+
97
+ 1. ARTIFACTS (PRDs, configs, code files) → Write to FILES, never return as inline text.
98
+ Return only: file path + 1-line description.
99
+ 2. DETAILED FINDINGS → Index into knowledge base:
100
+ mcp__${TOOL_PREFIX}__index(content: "...", source: "descriptive-label")
101
+ The parent agent shares the SAME knowledge base and can search() your indexed content.
102
+ 3. YOUR RESPONSE must be a concise summary:
103
+ - What you did (2-3 bullets)
104
+ - File paths created/modified (if any)
105
+ - Source labels you indexed (so parent can search)
106
+ - Key findings in bullet points
107
+ Do NOT return raw data, full file contents, or lengthy explanations.
108
+ ---`;
109
+ const updatedInput = subagentType === "Bash"
110
+ ? { ...toolInput, prompt: prompt + ROUTING_BLOCK, subagent_type: "general-purpose" }
111
+ : { ...toolInput, prompt: prompt + ROUTING_BLOCK };
112
+ respond({ updatedInput });
113
+ }
114
+ // Unknown tool — pass through
115
+ process.exit(0);
116
+ export {};
117
+ //# sourceMappingURL=pretooluse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pretooluse.js","sourceRoot":"","sources":["../../src/hooks/pretooluse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ import { loadConfig } from "./config.js";
2
+ import { debug } from "./logger.js";
3
+ import { createServer } from "./server.js";
4
+ const config = loadConfig(process.env.CLAUDE_PROJECT_DIR);
5
+ debug("Starting context-compress server");
6
+ debug("Config:", JSON.stringify(config, null, 2));
7
+ const server = await createServer(config);
8
+ await server.start();
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAC1D,KAAK,CAAC,kCAAkC,CAAC,CAAC;AAC1C,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAElD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;AAC1C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function debug(...args: unknown[]): void;
2
+ export declare function warn(...args: unknown[]): void;
3
+ export declare function error(...args: unknown[]): void;
4
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +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;AAED,wBAAgB,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAE7C;AAED,wBAAgB,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAE9C"}