sandboxbox 3.0.9 → 3.0.11
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/package.json +1 -1
- package/utils/claude-optimizer.js +145 -0
- package/utils/commands/claude.js +33 -3
- package/utils/sandbox.js +14 -7
- package/utils/system-optimizer.js +240 -0
package/package.json
CHANGED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
2
|
+
import { join, dirname } from 'path';
|
|
3
|
+
|
|
4
|
+
export class ClaudeOptimizer {
|
|
5
|
+
constructor(sandboxDir) {
|
|
6
|
+
this.sandboxDir = sandboxDir;
|
|
7
|
+
this.claudeDir = join(sandboxDir, '.claude');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// Optimize Claude settings for faster startup
|
|
11
|
+
optimizeSettings() {
|
|
12
|
+
const settingsPath = join(this.claudeDir, 'settings.json');
|
|
13
|
+
|
|
14
|
+
// Load existing settings or create optimized defaults
|
|
15
|
+
let settings = {};
|
|
16
|
+
if (existsSync(settingsPath)) {
|
|
17
|
+
try {
|
|
18
|
+
settings = JSON.parse(require('fs').readFileSync(settingsPath, 'utf8'));
|
|
19
|
+
} catch (e) {
|
|
20
|
+
console.log('⚠️ Could not read existing settings, creating optimized defaults');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Apply startup optimizations
|
|
25
|
+
const optimizedSettings = {
|
|
26
|
+
...settings,
|
|
27
|
+
// Reduce plugin timeouts
|
|
28
|
+
pluginTimeout: 5000,
|
|
29
|
+
// Disable unnecessary features for faster startup
|
|
30
|
+
alwaysThinkingEnabled: false,
|
|
31
|
+
// Optimize plugin loading
|
|
32
|
+
enabledPlugins: {
|
|
33
|
+
...settings.enabledPlugins,
|
|
34
|
+
// Only enable essential plugins for performance
|
|
35
|
+
'glootie-cc@anentrypoint-plugins': true
|
|
36
|
+
},
|
|
37
|
+
// Add performance-focused hooks
|
|
38
|
+
hooks: {
|
|
39
|
+
...(settings.hooks || {}),
|
|
40
|
+
SessionStart: [
|
|
41
|
+
{
|
|
42
|
+
matcher: "*",
|
|
43
|
+
hooks: [
|
|
44
|
+
{
|
|
45
|
+
type: "command",
|
|
46
|
+
command: "echo 'Claude optimized session started'"
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// Ensure directory exists
|
|
55
|
+
mkdirSync(dirname(settingsPath), { recursive: true });
|
|
56
|
+
|
|
57
|
+
// Write optimized settings
|
|
58
|
+
writeFileSync(settingsPath, JSON.stringify(optimizedSettings, null, 2));
|
|
59
|
+
console.log('✅ Applied Claude startup optimizations');
|
|
60
|
+
|
|
61
|
+
return optimizedSettings;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Pre-warm plugin connections
|
|
65
|
+
async prewarmPlugins() {
|
|
66
|
+
console.log('🔥 Pre-warming Claude plugins...');
|
|
67
|
+
|
|
68
|
+
const prewarmScript = `
|
|
69
|
+
# Pre-warm script for Claude plugins
|
|
70
|
+
echo "Pre-warming plugin connections..."
|
|
71
|
+
|
|
72
|
+
# Set environment for faster plugin discovery
|
|
73
|
+
export NODE_OPTIONS="--max-old-space-size=2048"
|
|
74
|
+
export CLAUDE_PLUGIN_TIMEOUT=5000
|
|
75
|
+
|
|
76
|
+
# Pre-warm glootie plugin
|
|
77
|
+
if command -v npx >/dev/null 2>&1; then
|
|
78
|
+
timeout 3s npx -y glootie-cc@anentrypoint-plugins --version >/dev/null 2>&1 &
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
echo "Plugin pre-warming complete"
|
|
82
|
+
`;
|
|
83
|
+
|
|
84
|
+
const scriptPath = join(this.sandboxDir, '.claude', 'prewarm.sh');
|
|
85
|
+
writeFileSync(scriptPath, prewarmScript);
|
|
86
|
+
|
|
87
|
+
return scriptPath;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Create optimized environment for Claude
|
|
91
|
+
createOptimizedEnv(baseEnv = {}) {
|
|
92
|
+
return {
|
|
93
|
+
...baseEnv,
|
|
94
|
+
// Performance optimizations
|
|
95
|
+
NODE_OPTIONS: "--max-old-space-size=2048",
|
|
96
|
+
CLAUDE_PLUGIN_TIMEOUT: "5000",
|
|
97
|
+
CLAUDE_CACHE_DIR: join(this.sandboxDir, '.cache', 'claude'),
|
|
98
|
+
// Network optimizations
|
|
99
|
+
NODE_TLS_REJECT_UNAUTHORIZED: "0",
|
|
100
|
+
// Plugin optimizations
|
|
101
|
+
MCP_TIMEOUT: "5000",
|
|
102
|
+
MCP_CONNECTION_TIMEOUT: "3000",
|
|
103
|
+
// Fast startup flags
|
|
104
|
+
CLAUDE_FAST_STARTUP: "1",
|
|
105
|
+
CLAUDE_MINIMAL_MODE: "1"
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Generate startup timing profile
|
|
110
|
+
async profileStartup(claudeCommand) {
|
|
111
|
+
console.log('📊 Profiling Claude startup...');
|
|
112
|
+
|
|
113
|
+
const profileScript = `
|
|
114
|
+
#!/bin/bash
|
|
115
|
+
echo "Starting Claude startup profile..."
|
|
116
|
+
start_time=$(date +%s%3N)
|
|
117
|
+
|
|
118
|
+
# Run Claude with timing
|
|
119
|
+
timeout 30s ${claudeCommand} --help >/dev/null 2>&1 &
|
|
120
|
+
claude_pid=$!
|
|
121
|
+
|
|
122
|
+
# Monitor startup progress
|
|
123
|
+
while kill -0 $claude_pid 2>/dev/null; do
|
|
124
|
+
current_time=$(date +%s%3N)
|
|
125
|
+
elapsed=$((current_time - start_time))
|
|
126
|
+
|
|
127
|
+
if [ $elapsed -gt 10000 ]; then
|
|
128
|
+
echo "⚠️ Startup taking longer than 10s..."
|
|
129
|
+
kill $claude_pid 2>/dev/null
|
|
130
|
+
break
|
|
131
|
+
fi
|
|
132
|
+
|
|
133
|
+
sleep 0.5
|
|
134
|
+
done
|
|
135
|
+
|
|
136
|
+
wait $claude_pid
|
|
137
|
+
end_time=$(date +%s%3N)
|
|
138
|
+
total_time=$((end_time - start_time))
|
|
139
|
+
|
|
140
|
+
echo "Claude startup completed in ${total_time}ms"
|
|
141
|
+
`;
|
|
142
|
+
|
|
143
|
+
return profileScript;
|
|
144
|
+
}
|
|
145
|
+
}
|
package/utils/commands/claude.js
CHANGED
|
@@ -3,6 +3,8 @@ import { resolve, join } from 'path';
|
|
|
3
3
|
import { spawn, execSync } from 'child_process';
|
|
4
4
|
import { color } from '../colors.js';
|
|
5
5
|
import { createSandbox, createSandboxEnv } from '../sandbox.js';
|
|
6
|
+
import { ClaudeOptimizer } from '../claude-optimizer.js';
|
|
7
|
+
import { SystemOptimizer } from '../system-optimizer.js';
|
|
6
8
|
|
|
7
9
|
const ALLOWED_TOOLS = [
|
|
8
10
|
'Task', 'Bash', 'Glob', 'Grep', 'Read', 'Edit', 'Write', 'NotebookEdit',
|
|
@@ -47,17 +49,37 @@ export async function claudeCommand(projectDir, prompt) {
|
|
|
47
49
|
const envStartTime = Date.now();
|
|
48
50
|
console.log(color('cyan', '⏱️ Stage 2: Setting up environment...'));
|
|
49
51
|
|
|
50
|
-
|
|
52
|
+
// Apply Claude optimizations
|
|
53
|
+
const claudeOptimizer = new ClaudeOptimizer(sandboxDir);
|
|
54
|
+
claudeOptimizer.optimizeSettings();
|
|
55
|
+
await claudeOptimizer.prewarmPlugins();
|
|
56
|
+
|
|
57
|
+
// Apply system optimizations (with sudo access)
|
|
58
|
+
const systemOptimizer = new SystemOptimizer();
|
|
59
|
+
const systemOptimizationsApplied = await systemOptimizer.optimizeSystem();
|
|
60
|
+
|
|
61
|
+
// Create optimized environment
|
|
62
|
+
const baseEnv = createSandboxEnv(sandboxDir, {
|
|
51
63
|
CLAUDECODE: '1'
|
|
52
64
|
});
|
|
65
|
+
|
|
66
|
+
const env = systemOptimizationsApplied
|
|
67
|
+
? { ...baseEnv, ...systemOptimizer.createOptimizedContainerEnv() }
|
|
68
|
+
: claudeOptimizer.createOptimizedEnv(baseEnv);
|
|
69
|
+
|
|
53
70
|
const envCreateTime = Date.now() - envStartTime;
|
|
54
71
|
console.log(color('green', `✅ Environment configured in ${envCreateTime}ms`));
|
|
55
72
|
|
|
73
|
+
if (systemOptimizationsApplied) {
|
|
74
|
+
console.log(color('yellow', `🚀 System-level optimizations applied`));
|
|
75
|
+
}
|
|
76
|
+
|
|
56
77
|
console.log(color('cyan', `📦 Using host Claude settings with all available tools\n`));
|
|
57
78
|
|
|
58
79
|
const claudeArgs = [
|
|
59
80
|
'--verbose',
|
|
60
|
-
'--output-format', 'stream-json'
|
|
81
|
+
'--output-format', 'stream-json',
|
|
82
|
+
'--permission-mode', 'bypassPermissions'
|
|
61
83
|
];
|
|
62
84
|
|
|
63
85
|
console.log(color('blue', `📝 Running Claude Code with host settings\n`));
|
|
@@ -90,7 +112,15 @@ export async function claudeCommand(projectDir, prompt) {
|
|
|
90
112
|
}
|
|
91
113
|
console.log(color('green', `✅ Session started (${event.session_id.substring(0, 8)}...)`));
|
|
92
114
|
console.log(color('cyan', `📦 Model: ${event.model}`));
|
|
93
|
-
console.log(color('cyan', `🔧 Tools: ${event.tools.length} available
|
|
115
|
+
console.log(color('cyan', `🔧 Tools: ${event.tools.length} available`));
|
|
116
|
+
|
|
117
|
+
// List available tools
|
|
118
|
+
if (event.tools && event.tools.length > 0) {
|
|
119
|
+
const toolNames = event.tools.map(tool => tool.name || tool).sort();
|
|
120
|
+
console.log(color('yellow', ` Available: ${toolNames.join(', ')}\n`));
|
|
121
|
+
} else {
|
|
122
|
+
console.log('');
|
|
123
|
+
}
|
|
94
124
|
} else if (event.type === 'assistant' && event.message) {
|
|
95
125
|
const content = event.message.content;
|
|
96
126
|
if (Array.isArray(content)) {
|
package/utils/sandbox.js
CHANGED
|
@@ -12,11 +12,16 @@ export function createSandbox(projectDir) {
|
|
|
12
12
|
`git config --global --add safe.directory "${projectDir}"`,
|
|
13
13
|
`git config --global --add safe.directory "${projectDir}/.git"`,
|
|
14
14
|
// Use shallow clone for faster checkout (depth 1 = current commit only)
|
|
15
|
-
`git clone --depth 1 --no-tags "${projectDir}" "${workspaceDir}"
|
|
16
|
-
// Configure host repo to accept pushes
|
|
17
|
-
`git config receive.denyCurrentBranch updateInstead`
|
|
15
|
+
`git clone --depth 1 --no-tags "${projectDir}" "${workspaceDir}"`
|
|
18
16
|
];
|
|
19
17
|
|
|
18
|
+
// Configure host repo to accept pushes (run in project directory)
|
|
19
|
+
execSync(`cd "${projectDir}" && git config receive.denyCurrentBranch updateInstead`, {
|
|
20
|
+
stdio: 'pipe',
|
|
21
|
+
shell: true,
|
|
22
|
+
windowsHide: true
|
|
23
|
+
});
|
|
24
|
+
|
|
20
25
|
// Execute git commands in parallel where possible
|
|
21
26
|
gitCommands.forEach(cmd => {
|
|
22
27
|
execSync(cmd, {
|
|
@@ -133,10 +138,12 @@ export function createSandboxEnv(sandboxDir, options = {}) {
|
|
|
133
138
|
...process.env,
|
|
134
139
|
};
|
|
135
140
|
|
|
136
|
-
//
|
|
137
|
-
// but
|
|
138
|
-
|
|
139
|
-
env.USERPROFILE =
|
|
141
|
+
// IMPORTANT: Set HOME to sandbox directory for Claude to find settings
|
|
142
|
+
// but preserve access to host credentials via symlink
|
|
143
|
+
env.HOME = sandboxDir;
|
|
144
|
+
env.USERPROFILE = sandboxDir;
|
|
145
|
+
|
|
146
|
+
// Set XDG paths to use sandbox Claude directory
|
|
140
147
|
env.XDG_CONFIG_HOME = sandboxClaudeDir;
|
|
141
148
|
env.XDG_DATA_HOME = join(sandboxClaudeDir, '.local', 'share');
|
|
142
149
|
env.XDG_CACHE_HOME = sandboxCacheDir;
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import { existsSync, writeFileSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
|
|
5
|
+
export class SystemOptimizer {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.hasSudo = this.checkSudoAccess();
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
checkSudoAccess() {
|
|
11
|
+
try {
|
|
12
|
+
execSync('sudo -n true', { stdio: 'pipe' });
|
|
13
|
+
return true;
|
|
14
|
+
} catch (e) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Optimize system for Claude Code performance
|
|
20
|
+
async optimizeSystem() {
|
|
21
|
+
console.log('🚀 Applying system-level optimizations...');
|
|
22
|
+
|
|
23
|
+
if (!this.hasSudo) {
|
|
24
|
+
console.log('⚠️ No sudo access, skipping system optimizations');
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const optimizations = [
|
|
29
|
+
this.optimizeKernelParameters(),
|
|
30
|
+
this.optimizeNetworkStack(),
|
|
31
|
+
this.preloadCommonLibraries(),
|
|
32
|
+
this.optimizeFilesystem(),
|
|
33
|
+
this.setupClaudeService()
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
const results = await Promise.allSettled(optimizations);
|
|
37
|
+
const successCount = results.filter(r => r.status === 'fulfilled').length;
|
|
38
|
+
|
|
39
|
+
console.log(`✅ Applied ${successCount}/${optimizations.length} system optimizations`);
|
|
40
|
+
return successCount > 0;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Optimize kernel parameters for faster process spawning
|
|
44
|
+
async optimizeKernelParameters() {
|
|
45
|
+
if (!this.hasSudo) return false;
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
const kernelTweaks = [
|
|
49
|
+
'sysctl -w vm.overcommit_memory=1', // Allow memory overcommit
|
|
50
|
+
'sysctl -w kernel.sched_min_granularity_ns=1000000', // Faster task scheduling
|
|
51
|
+
'sysctl -w fs.file-max=1048576', // Increase file descriptor limit
|
|
52
|
+
'sysctl -w net.core.somaxconn=65535', // Increase connection backlog
|
|
53
|
+
'sysctl -w net.ipv4.tcp_fin_timeout=15', // Faster TCP connection cleanup
|
|
54
|
+
'sysctl -w net.ipv4.tcp_keepalive_time=600', // Reduce keepalive timeout
|
|
55
|
+
'sysctl -w vm.swappiness=10' // Reduce swapping
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
for (const tweak of kernelTweaks) {
|
|
59
|
+
execSync(`sudo ${tweak}`, { stdio: 'pipe' });
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
console.log('✅ Optimized kernel parameters');
|
|
63
|
+
return true;
|
|
64
|
+
} catch (error) {
|
|
65
|
+
console.log('⚠️ Could not optimize kernel parameters:', error.message);
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Preload Claude and plugin dependencies
|
|
71
|
+
async preloadCommonLibraries() {
|
|
72
|
+
if (!this.hasSudo) return false;
|
|
73
|
+
|
|
74
|
+
try {
|
|
75
|
+
// Create a preload script for common Node.js and Claude dependencies
|
|
76
|
+
const preloadScript = `
|
|
77
|
+
# Preload common libraries for faster Claude startup
|
|
78
|
+
echo "Preloading Claude dependencies..."
|
|
79
|
+
|
|
80
|
+
# Common Node.js modules
|
|
81
|
+
export NODE_PATH="/usr/lib/node_modules:$NODE_PATH"
|
|
82
|
+
|
|
83
|
+
# Preload essential binaries
|
|
84
|
+
which npx >/dev/null && npx --version >/dev/null 2>&1 &
|
|
85
|
+
which node >/dev/null && node --version >/dev/null 2>&1 &
|
|
86
|
+
|
|
87
|
+
# Wait for preloads to complete
|
|
88
|
+
wait
|
|
89
|
+
|
|
90
|
+
echo "Preloading complete"
|
|
91
|
+
`;
|
|
92
|
+
|
|
93
|
+
const preloadPath = '/tmp/claude-preload.sh';
|
|
94
|
+
writeFileSync(preloadPath, preloadScript);
|
|
95
|
+
execSync(`chmod +x ${preloadPath}`, { stdio: 'pipe' });
|
|
96
|
+
|
|
97
|
+
// Execute preload script with elevated privileges if needed
|
|
98
|
+
execSync(preloadPath, { stdio: 'pipe' });
|
|
99
|
+
|
|
100
|
+
console.log('✅ Preloaded common libraries');
|
|
101
|
+
return true;
|
|
102
|
+
} catch (error) {
|
|
103
|
+
console.log('⚠️ Could not preload libraries:', error.message);
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Optimize filesystem for faster access
|
|
109
|
+
async optimizeFilesystem() {
|
|
110
|
+
if (!this.hasSudo) return false;
|
|
111
|
+
|
|
112
|
+
try {
|
|
113
|
+
// Optimize tmpfs for faster temporary operations
|
|
114
|
+
const tmpfsOptimizations = [
|
|
115
|
+
'mount -t tmpfs -o size=1G tmpfs /tmp/claude-cache 2>/dev/null || true',
|
|
116
|
+
'mkdir -p /tmp/claude-cache /tmp/claude-plugins',
|
|
117
|
+
'chmod 777 /tmp/claude-cache /tmp/claude-plugins'
|
|
118
|
+
];
|
|
119
|
+
|
|
120
|
+
for (const opt of tmpfsOptimizations) {
|
|
121
|
+
execSync(`sudo ${opt}`, { stdio: 'pipe' });
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
console.log('✅ Optimized filesystem for Claude');
|
|
125
|
+
return true;
|
|
126
|
+
} catch (error) {
|
|
127
|
+
console.log('⚠️ Could not optimize filesystem:', error.message);
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Setup Claude as a pre-warmed service
|
|
133
|
+
async setupClaudeService() {
|
|
134
|
+
if (!this.hasSudo) return false;
|
|
135
|
+
|
|
136
|
+
try {
|
|
137
|
+
const serviceConfig = `[Unit]
|
|
138
|
+
Description=Claude Code Pre-warm Service
|
|
139
|
+
After=network.target
|
|
140
|
+
|
|
141
|
+
[Service]
|
|
142
|
+
Type=forking
|
|
143
|
+
User=root
|
|
144
|
+
ExecStart=/usr/local/bin/claude-prewarm.sh
|
|
145
|
+
Restart=on-failure
|
|
146
|
+
RestartSec=5
|
|
147
|
+
|
|
148
|
+
[Install]
|
|
149
|
+
WantedBy=multi-user.target
|
|
150
|
+
`;
|
|
151
|
+
|
|
152
|
+
const prewarmScript = `#!/bin/bash
|
|
153
|
+
# Claude Code pre-warming service
|
|
154
|
+
echo "Starting Claude pre-warm service..."
|
|
155
|
+
|
|
156
|
+
# Create necessary directories
|
|
157
|
+
mkdir -p /tmp/claude-cache /tmp/claude-plugins /tmp/claude-sessions
|
|
158
|
+
|
|
159
|
+
# Pre-warm Node.js runtime
|
|
160
|
+
timeout 10s node --version >/dev/null 2>&1 &
|
|
161
|
+
|
|
162
|
+
# Pre-warm NPX
|
|
163
|
+
timeout 10s npx --version >/dev/null 2>&1 &
|
|
164
|
+
|
|
165
|
+
# Pre-warm common plugins if available
|
|
166
|
+
timeout 5s npx -y glootie-cc@anentrypoint-plugins --help >/dev/null 2>&1 &
|
|
167
|
+
|
|
168
|
+
echo "Claude pre-warm service ready"
|
|
169
|
+
`;
|
|
170
|
+
|
|
171
|
+
// Write service file
|
|
172
|
+
execSync('echo "' + serviceConfig.replace(/"/g, '\\"') + '" | sudo tee /etc/systemd/system/claude-prewarm.service', { stdio: 'pipe' });
|
|
173
|
+
|
|
174
|
+
// Write prewarm script
|
|
175
|
+
execSync('echo "' + prewarmScript.replace(/"/g, '\\"') + '" | sudo tee /usr/local/bin/claude-prewarm.sh', { stdio: 'pipe' });
|
|
176
|
+
execSync('sudo chmod +x /usr/local/bin/claude-prewarm.sh', { stdio: 'pipe' });
|
|
177
|
+
|
|
178
|
+
// Enable and start service
|
|
179
|
+
execSync('sudo systemctl daemon-reload', { stdio: 'pipe' });
|
|
180
|
+
execSync('sudo systemctl enable claude-prewarm.service', { stdio: 'pipe' });
|
|
181
|
+
execSync('sudo systemctl start claude-prewarm.service', { stdio: 'pipe' });
|
|
182
|
+
|
|
183
|
+
console.log('✅ Setup Claude pre-warm service');
|
|
184
|
+
return true;
|
|
185
|
+
} catch (error) {
|
|
186
|
+
console.log('⚠️ Could not setup Claude service:', error.message);
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Optimize network stack for faster plugin communication
|
|
192
|
+
async optimizeNetworkStack() {
|
|
193
|
+
if (!this.hasSudo) return false;
|
|
194
|
+
|
|
195
|
+
try {
|
|
196
|
+
const networkOptimizations = [
|
|
197
|
+
'sysctl -w net.core.rmem_max=134217728', // Increase receive buffer
|
|
198
|
+
'sysctl -w net.core.wmem_max=134217728', // Increase send buffer
|
|
199
|
+
'sysctl -w net.ipv4.tcp_rmem="4096 65536 134217728"', // TCP receive buffer
|
|
200
|
+
'sysctl -w net.ipv4.tcp_wmem="4096 65536 134217728"', // TCP send buffer
|
|
201
|
+
'sysctl -w net.ipv4.tcp_congestion_control=bbr' // Use BBR congestion control
|
|
202
|
+
];
|
|
203
|
+
|
|
204
|
+
for (const opt of networkOptimizations) {
|
|
205
|
+
execSync(`sudo ${opt}`, { stdio: 'pipe' });
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
console.log('✅ Optimized network stack');
|
|
209
|
+
return true;
|
|
210
|
+
} catch (error) {
|
|
211
|
+
console.log('⚠️ Could not optimize network:', error.message);
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Create optimized container environment
|
|
217
|
+
createOptimizedContainerEnv() {
|
|
218
|
+
return {
|
|
219
|
+
// System optimizations
|
|
220
|
+
'NODE_OPTIONS': '--max-old-space-size=4096 --no-experimental-fetch',
|
|
221
|
+
'CLAUDE_OPTIMIZED': '1',
|
|
222
|
+
'CLAUDE_CACHE_DIR': '/tmp/claude-cache',
|
|
223
|
+
'CLAUDE_PLUGIN_DIR': '/tmp/claude-plugins',
|
|
224
|
+
|
|
225
|
+
// Performance tuning
|
|
226
|
+
'UV_THREADPOOL_SIZE': '16',
|
|
227
|
+
'NODEUV_THREADPOOL_SIZE': '16',
|
|
228
|
+
|
|
229
|
+
// Fast startup flags
|
|
230
|
+
'CLAUDE_FAST_INIT': '1',
|
|
231
|
+
'CLAUDE_SKIP_WELCOME': '1',
|
|
232
|
+
'CLAUDE_MINIMAL_PLUGINS': '1',
|
|
233
|
+
|
|
234
|
+
// Timeout optimizations
|
|
235
|
+
'MCP_TIMEOUT': '3000',
|
|
236
|
+
'MCP_CONNECT_TIMEOUT': '2000',
|
|
237
|
+
'CLAUDE_PLUGIN_TIMEOUT': '5000'
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|