/** * Shield-Exec: Single Node.js Command Proxy * * A unified command proxy installed at /opt/agenshield/bin/shield-exec. * All command wrappers in $HOME/bin/ are symlinks to this binary. * It detects the invoked command name via process.argv[1] (symlink name), * then routes the request through the broker via Unix socket JSON-RPC. * * All commands are routed as `exec` operations through the broker, * which handles policy enforcement (workspace boundaries, network policies, etc.). */ /** Path where shield-exec is installed */ export declare const SHIELD_EXEC_PATH = "/opt/agenshield/bin/shield-exec"; /** Commands that shield-exec handles (all routed through broker as exec) */ export declare const PROXIED_COMMANDS: readonly ["bash", "curl", "wget", "git", "ssh", "scp", "rsync", "brew", "npm", "npx", "pip", "pip3", "open-url", "shieldctl", "agenco"]; /** * The content of shield-exec as a string, for installation */ export declare const SHIELD_EXEC_CONTENT = "#!/opt/agenshield/bin/node-bin\nimport path from 'node:path';\nimport net from 'node:net';\n\nconst DEFAULT_SOCKET_PATH = '/var/run/agenshield/agenshield.sock';\n\nfunction sendRequest(socketPath, request) {\n return new Promise((resolve, reject) => {\n const socket = net.createConnection(socketPath, () => {\n socket.write(JSON.stringify(request) + '\\n');\n });\n let data = '';\n socket.on('data', (chunk) => {\n data += chunk.toString();\n const idx = data.indexOf('\\n');\n if (idx >= 0) {\n try {\n const resp = JSON.parse(data.slice(0, idx));\n socket.end();\n resolve(resp);\n } catch (e) {\n socket.end();\n reject(new Error('Invalid JSON response: ' + e.message));\n }\n }\n });\n socket.on('error', (err) => reject(new Error('Socket error: ' + err.message)));\n socket.on('end', () => {\n if (data.trim()) {\n try { resolve(JSON.parse(data.trim())); }\n catch { reject(new Error('Connection closed before response')); }\n } else {\n reject(new Error('Connection closed without response'));\n }\n });\n socket.setTimeout(30000, () => {\n socket.destroy();\n reject(new Error('Request timed out'));\n });\n });\n}\n\nasync function main() {\n const socketPath = process.env.AGENSHIELD_SOCKET || DEFAULT_SOCKET_PATH;\n const invoked = path.basename(process.argv[1] || 'shield-exec');\n const args = process.argv.slice(2);\n const commandName = invoked === 'shield-exec' ? (args.shift() || '') : invoked;\n\n if (!commandName) {\n process.stderr.write('Usage: shield-exec [args...]\\n');\n process.exit(1);\n }\n\n const request = {\n jsonrpc: '2.0',\n id: 'shield-exec-' + Date.now() + '-' + Math.random().toString(36).slice(2, 8),\n method: 'exec',\n params: { command: commandName, args: args, cwd: process.cwd(), env: process.env },\n };\n\n try {\n const response = await sendRequest(socketPath, request);\n if (response.error) {\n process.stderr.write('Error: ' + response.error.message + '\\n');\n process.exit(1);\n }\n const data = response.result;\n if (!data) process.exit(0);\n if (data.stdout) process.stdout.write(data.stdout);\n if (data.stderr) process.stderr.write(data.stderr);\n process.exit(data.exitCode ?? 0);\n } catch (err) {\n process.stderr.write('shield-exec error: ' + err.message + '\\n');\n process.exit(1);\n }\n}\n\nmain().catch((err) => { process.stderr.write('Fatal: ' + err.message + '\\n'); process.exit(1); });\n"; //# sourceMappingURL=shield-exec.d.ts.map