llm-mask 0.3.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/.github/workflows/llm-mask-check.yml +62 -0
- package/LICENSE +21 -0
- package/README.md +549 -0
- package/dist/audit.d.ts +56 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +90 -0
- package/dist/audit.js.map +1 -0
- package/dist/cli-old.d.ts +12 -0
- package/dist/cli-old.d.ts.map +1 -0
- package/dist/cli-old.js +257 -0
- package/dist/cli-old.js.map +1 -0
- package/dist/cli.d.ts +19 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +197 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands.d.ts +9 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +121 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +81 -0
- package/dist/config.js.map +1 -0
- package/dist/context-detection.d.ts +54 -0
- package/dist/context-detection.d.ts.map +1 -0
- package/dist/context-detection.js +219 -0
- package/dist/context-detection.js.map +1 -0
- package/dist/diff-masking.d.ts +51 -0
- package/dist/diff-masking.d.ts.map +1 -0
- package/dist/diff-masking.js +121 -0
- package/dist/diff-masking.js.map +1 -0
- package/dist/executor.d.ts +105 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +250 -0
- package/dist/executor.js.map +1 -0
- package/dist/executor.test.d.ts +5 -0
- package/dist/executor.test.d.ts.map +1 -0
- package/dist/executor.test.js +500 -0
- package/dist/executor.test.js.map +1 -0
- package/dist/features.test.d.ts +5 -0
- package/dist/features.test.d.ts.map +1 -0
- package/dist/features.test.js +118 -0
- package/dist/features.test.js.map +1 -0
- package/dist/formatter.d.ts +54 -0
- package/dist/formatter.d.ts.map +1 -0
- package/dist/formatter.js +139 -0
- package/dist/formatter.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/language-patterns.d.ts +39 -0
- package/dist/language-patterns.d.ts.map +1 -0
- package/dist/language-patterns.js +177 -0
- package/dist/language-patterns.js.map +1 -0
- package/dist/masker.d.ts +100 -0
- package/dist/masker.d.ts.map +1 -0
- package/dist/masker.js +255 -0
- package/dist/masker.js.map +1 -0
- package/dist/masker.test.d.ts +11 -0
- package/dist/masker.test.d.ts.map +1 -0
- package/dist/masker.test.js +162 -0
- package/dist/masker.test.js.map +1 -0
- package/dist/mcp-server.d.ts +9 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +494 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/patterns.d.ts +25 -0
- package/dist/patterns.d.ts.map +1 -0
- package/dist/patterns.js +184 -0
- package/dist/patterns.js.map +1 -0
- package/dist/scanner.d.ts +75 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +247 -0
- package/dist/scanner.js.map +1 -0
- package/dist/test-utils.d.ts +5 -0
- package/dist/test-utils.d.ts.map +1 -0
- package/dist/test-utils.js +6 -0
- package/dist/test-utils.js.map +1 -0
- package/dist/tokenizer.d.ts +62 -0
- package/dist/tokenizer.d.ts.map +1 -0
- package/dist/tokenizer.js +95 -0
- package/dist/tokenizer.js.map +1 -0
- package/dist/types.d.ts +63 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diff masking - mask git diff output for safe LLM code review
|
|
3
|
+
*
|
|
4
|
+
* Preserves diff structure while masking sensitive data
|
|
5
|
+
*/
|
|
6
|
+
import { execSync } from 'child_process';
|
|
7
|
+
import { DataMasker } from './masker.js';
|
|
8
|
+
/**
|
|
9
|
+
* Masker for git diff output
|
|
10
|
+
*/
|
|
11
|
+
export class DiffMasker {
|
|
12
|
+
masker;
|
|
13
|
+
constructor() {
|
|
14
|
+
this.masker = new DataMasker();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get git diff and mask it
|
|
18
|
+
*/
|
|
19
|
+
maskDiff(options = {}) {
|
|
20
|
+
const diff = this.getDiff(options);
|
|
21
|
+
const lines = diff.split('\n');
|
|
22
|
+
let filesChanged = 0;
|
|
23
|
+
let linesAdded = 0;
|
|
24
|
+
let linesRemoved = 0;
|
|
25
|
+
let masksApplied = 0;
|
|
26
|
+
const maskedLines = lines.map(line => {
|
|
27
|
+
// Track diff metadata
|
|
28
|
+
if (line.startsWith('diff --git')) {
|
|
29
|
+
filesChanged++;
|
|
30
|
+
}
|
|
31
|
+
if (line.startsWith('+') && !line.startsWith('++')) {
|
|
32
|
+
linesAdded++;
|
|
33
|
+
}
|
|
34
|
+
if (line.startsWith('-') && !line.startsWith('--')) {
|
|
35
|
+
linesRemoved++;
|
|
36
|
+
}
|
|
37
|
+
// Don't mask diff metadata
|
|
38
|
+
if (line.startsWith('diff ') ||
|
|
39
|
+
line.startsWith('index ') ||
|
|
40
|
+
line.startsWith('@') ||
|
|
41
|
+
line.startsWith('---') ||
|
|
42
|
+
line.startsWith('+++') ||
|
|
43
|
+
line === '') {
|
|
44
|
+
return line;
|
|
45
|
+
}
|
|
46
|
+
// Mask the line content (preserve the +/- prefix)
|
|
47
|
+
const prefix = line.charAt(0) === '+' || line.charAt(0) === '-' ? line.charAt(0) : '';
|
|
48
|
+
const content = prefix ? line.slice(1) : line;
|
|
49
|
+
const result = this.masker.mask(content, { level: options.level });
|
|
50
|
+
masksApplied += result.stats.total;
|
|
51
|
+
return prefix + result.masked;
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
maskedDiff: maskedLines.join('\n'),
|
|
55
|
+
originalLineCount: lines.length,
|
|
56
|
+
stats: {
|
|
57
|
+
filesChanged,
|
|
58
|
+
linesAdded,
|
|
59
|
+
linesRemoved,
|
|
60
|
+
masksApplied
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get git diff output
|
|
66
|
+
*/
|
|
67
|
+
getDiff(options) {
|
|
68
|
+
const args = ['diff', '--color=never', '--unified=3'];
|
|
69
|
+
if (options.base) {
|
|
70
|
+
if (options.head) {
|
|
71
|
+
args.push(`${options.base}...${options.head}`);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
args.push(options.base);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (options.path) {
|
|
78
|
+
args.push('--', options.path);
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
const cmd = ['git'];
|
|
82
|
+
if (options.gitDir) {
|
|
83
|
+
cmd.push(`--git-dir=${options.gitDir}`);
|
|
84
|
+
}
|
|
85
|
+
cmd.push(...args);
|
|
86
|
+
return execSync(cmd.join(' '), {
|
|
87
|
+
encoding: 'utf-8',
|
|
88
|
+
maxBuffer: 50 * 1024 * 1024 // 50MB
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
throw new Error(`Failed to get git diff: ${error}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Format masked diff for display
|
|
97
|
+
*/
|
|
98
|
+
format(maskedDiff) {
|
|
99
|
+
const lines = [];
|
|
100
|
+
lines.push('📝 Masked Git Diff');
|
|
101
|
+
lines.push('');
|
|
102
|
+
lines.push(`Files changed: ${maskedDiff.stats.filesChanged}`);
|
|
103
|
+
lines.push(`Lines added: ${maskedDiff.stats.linesAdded}`);
|
|
104
|
+
lines.push(`Lines removed: ${maskedDiff.stats.linesRemoved}`);
|
|
105
|
+
lines.push(`Masks applied: ${maskedDiff.stats.masksApplied}`);
|
|
106
|
+
lines.push('');
|
|
107
|
+
lines.push('---');
|
|
108
|
+
lines.push('');
|
|
109
|
+
lines.push(maskedDiff.maskedDiff);
|
|
110
|
+
return lines.join('\n');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Convenience function to mask git diff
|
|
115
|
+
*/
|
|
116
|
+
export function maskDiff(options) {
|
|
117
|
+
const masker = new DiffMasker();
|
|
118
|
+
const result = masker.maskDiff(options);
|
|
119
|
+
return result.maskedDiff;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=diff-masking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-masking.js","sourceRoot":"","sources":["../src/diff-masking.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secure executor - run commands and redact sensitive output
|
|
3
|
+
*
|
|
4
|
+
* Key principle: Credentials work for the command, but output is redacted
|
|
5
|
+
* before the LLM sees it.
|
|
6
|
+
*/
|
|
7
|
+
import type { MaskResult } from './types.js';
|
|
8
|
+
export interface ExecOptions {
|
|
9
|
+
/** Command to execute (optional for specialized executors like kubectl/ssh) */
|
|
10
|
+
command?: string;
|
|
11
|
+
/** Arguments */
|
|
12
|
+
args?: string[];
|
|
13
|
+
/** Working directory */
|
|
14
|
+
cwd?: string;
|
|
15
|
+
/** Environment variables (merged with process.env) */
|
|
16
|
+
env?: Record<string, string>;
|
|
17
|
+
/** Timeout in milliseconds (default: 30000) */
|
|
18
|
+
timeout?: number;
|
|
19
|
+
/** Redaction level */
|
|
20
|
+
level?: 'basic' | 'standard' | 'aggressive';
|
|
21
|
+
/** Preserve format in redacted output */
|
|
22
|
+
preserveFormat?: boolean;
|
|
23
|
+
/** Redact specific patterns only */
|
|
24
|
+
redactPatterns?: string[];
|
|
25
|
+
/** Include stderr in output */
|
|
26
|
+
includeStderr?: boolean;
|
|
27
|
+
/** Include exit code in output */
|
|
28
|
+
includeExitCode?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface ExecResult {
|
|
31
|
+
stdout: string;
|
|
32
|
+
stderr: string;
|
|
33
|
+
exitCode: number | null;
|
|
34
|
+
signal: string | null;
|
|
35
|
+
timedOut: boolean;
|
|
36
|
+
redacted: {
|
|
37
|
+
stdout: string;
|
|
38
|
+
stderr: string;
|
|
39
|
+
stats: MaskResult['stats'];
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export interface KubernetesExecOptions extends ExecOptions {
|
|
43
|
+
/** Kubernetes namespace */
|
|
44
|
+
namespace?: string;
|
|
45
|
+
/** Pod name */
|
|
46
|
+
pod?: string;
|
|
47
|
+
/** Container name */
|
|
48
|
+
container?: string;
|
|
49
|
+
/** Context from kubeconfig */
|
|
50
|
+
context?: string;
|
|
51
|
+
/** Command to execute in pod */
|
|
52
|
+
execCommand?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface SSHExecOptions extends ExecOptions {
|
|
55
|
+
/** SSH host */
|
|
56
|
+
host: string;
|
|
57
|
+
/** SSH user */
|
|
58
|
+
user?: string;
|
|
59
|
+
/** Port */
|
|
60
|
+
port?: number;
|
|
61
|
+
/** Identity file (private key) */
|
|
62
|
+
identity?: string;
|
|
63
|
+
/** Command to run on remote host */
|
|
64
|
+
remoteCommand?: string;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Secure executor - runs commands and redacts output
|
|
68
|
+
*/
|
|
69
|
+
export declare class SecureExecutor {
|
|
70
|
+
private masker;
|
|
71
|
+
constructor();
|
|
72
|
+
/**
|
|
73
|
+
* Execute a command and return both original and redacted output
|
|
74
|
+
*/
|
|
75
|
+
exec(options: ExecOptions): Promise<ExecResult>;
|
|
76
|
+
/**
|
|
77
|
+
* Execute a kubectl command
|
|
78
|
+
*/
|
|
79
|
+
kubectl(options: KubernetesExecOptions): Promise<ExecResult>;
|
|
80
|
+
/**
|
|
81
|
+
* Execute a command via SSH
|
|
82
|
+
*/
|
|
83
|
+
ssh(options: SSHExecOptions): Promise<ExecResult>;
|
|
84
|
+
/**
|
|
85
|
+
* Execute a command and return only redacted output (for LLM consumption)
|
|
86
|
+
*/
|
|
87
|
+
execRedacted(options: ExecOptions): Promise<string>;
|
|
88
|
+
/**
|
|
89
|
+
* Format exec result for display
|
|
90
|
+
*/
|
|
91
|
+
formatResult(result: ExecResult, showOriginal?: boolean): string;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Convenience function
|
|
95
|
+
*/
|
|
96
|
+
export declare function execRedacted(options: ExecOptions): Promise<string>;
|
|
97
|
+
/**
|
|
98
|
+
* Kubernetes convenience function
|
|
99
|
+
*/
|
|
100
|
+
export declare function kubectl(options: KubernetesExecOptions): Promise<ExecResult>;
|
|
101
|
+
/**
|
|
102
|
+
* SSH convenience function
|
|
103
|
+
*/
|
|
104
|
+
export declare function sshExec(options: SSHExecOptions): Promise<ExecResult>;
|
|
105
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,WAAW,WAAW;IAC1B,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gBAAgB;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,sDAAsD;IACtD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sBAAsB;IACtB,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,YAAY,CAAA;IAC3C,yCAAyC;IACzC,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,oCAAoC;IACpC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,+BAA+B;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,kCAAkC;IAClC,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAA;QACd,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;KAC3B,CAAA;CACF;AAED,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACxD,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gCAAgC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,eAAe;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,eAAe;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAY;;IAM1B;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAqGrD;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC;IA4ClE;;OAEG;IACG,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;IAmCvD;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAyBzD;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,GAAE,OAAe,GAAG,MAAM;CA2CxE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAGxE;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,CAGjF;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAG1E"}
|
package/dist/executor.js
ADDED
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secure executor - run commands and redact sensitive output
|
|
3
|
+
*
|
|
4
|
+
* Key principle: Credentials work for the command, but output is redacted
|
|
5
|
+
* before the LLM sees it.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'child_process';
|
|
8
|
+
import { DataMasker } from './masker.js';
|
|
9
|
+
/**
|
|
10
|
+
* Secure executor - runs commands and redacts output
|
|
11
|
+
*/
|
|
12
|
+
export class SecureExecutor {
|
|
13
|
+
masker;
|
|
14
|
+
constructor() {
|
|
15
|
+
this.masker = new DataMasker();
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Execute a command and return both original and redacted output
|
|
19
|
+
*/
|
|
20
|
+
async exec(options) {
|
|
21
|
+
const { command, args = [], cwd, env, timeout = 30000, includeStderr = true, includeExitCode = false, level = 'standard', preserveFormat = false, redactPatterns } = options;
|
|
22
|
+
// Validate command for direct exec calls
|
|
23
|
+
if (!command) {
|
|
24
|
+
throw new Error('Command is required for exec(). Use kubectl() or ssh() for specialized operations.');
|
|
25
|
+
}
|
|
26
|
+
return new Promise((resolve) => {
|
|
27
|
+
const startTime = Date.now();
|
|
28
|
+
let timedOut = false;
|
|
29
|
+
let timeoutHandle;
|
|
30
|
+
// Spawn the process
|
|
31
|
+
const proc = spawn(command, args, {
|
|
32
|
+
cwd,
|
|
33
|
+
env: { ...process.env, ...env },
|
|
34
|
+
timeout: undefined // We handle timeout ourselves
|
|
35
|
+
});
|
|
36
|
+
let stdout = '';
|
|
37
|
+
let stderr = '';
|
|
38
|
+
let exitCode = null;
|
|
39
|
+
let signal = null;
|
|
40
|
+
// Set timeout
|
|
41
|
+
if (timeout > 0) {
|
|
42
|
+
timeoutHandle = setTimeout(() => {
|
|
43
|
+
timedOut = true;
|
|
44
|
+
proc.kill('SIGTERM');
|
|
45
|
+
// Force kill if it doesn't terminate
|
|
46
|
+
setTimeout(() => proc.kill('SIGKILL'), 5000);
|
|
47
|
+
}, timeout);
|
|
48
|
+
}
|
|
49
|
+
// Collect output
|
|
50
|
+
proc.stdout?.on('data', (data) => {
|
|
51
|
+
stdout += data.toString();
|
|
52
|
+
});
|
|
53
|
+
proc.stderr?.on('data', (data) => {
|
|
54
|
+
stderr += data.toString();
|
|
55
|
+
});
|
|
56
|
+
// Handle process exit
|
|
57
|
+
proc.on('close', (code, sig) => {
|
|
58
|
+
if (timeoutHandle) {
|
|
59
|
+
clearTimeout(timeoutHandle);
|
|
60
|
+
}
|
|
61
|
+
const duration = Date.now() - startTime;
|
|
62
|
+
// Redact output
|
|
63
|
+
const maskOptions = { level, preserveFormat };
|
|
64
|
+
// Filter by patterns if specified
|
|
65
|
+
if (redactPatterns && redactPatterns.length > 0) {
|
|
66
|
+
// Custom redaction logic would go here
|
|
67
|
+
// For now, use default masking
|
|
68
|
+
}
|
|
69
|
+
const stdoutResult = this.masker.mask(stdout, maskOptions);
|
|
70
|
+
const stderrResult = this.masker.mask(stderr, maskOptions);
|
|
71
|
+
resolve({
|
|
72
|
+
stdout,
|
|
73
|
+
stderr,
|
|
74
|
+
exitCode: code,
|
|
75
|
+
signal: sig,
|
|
76
|
+
timedOut,
|
|
77
|
+
redacted: {
|
|
78
|
+
stdout: stdoutResult.masked,
|
|
79
|
+
stderr: stderrResult.masked,
|
|
80
|
+
stats: {
|
|
81
|
+
...stdoutResult.stats,
|
|
82
|
+
byPattern: {
|
|
83
|
+
...stdoutResult.stats.byPattern,
|
|
84
|
+
...Object.entries(stderrResult.stats.byPattern).reduce((acc, [k, v]) => ({ ...acc, [k]: (acc[k] || 0) + v }), {})
|
|
85
|
+
},
|
|
86
|
+
total: stdoutResult.stats.total + stderrResult.stats.total
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Execute a kubectl command
|
|
95
|
+
*/
|
|
96
|
+
async kubectl(options) {
|
|
97
|
+
const args = [];
|
|
98
|
+
// Add context
|
|
99
|
+
if (options.context) {
|
|
100
|
+
args.push('--context', options.context);
|
|
101
|
+
}
|
|
102
|
+
// Add namespace
|
|
103
|
+
if (options.namespace) {
|
|
104
|
+
args.push('--namespace', options.namespace);
|
|
105
|
+
}
|
|
106
|
+
// Build the kubectl command
|
|
107
|
+
if (options.pod) {
|
|
108
|
+
// Exec into a pod
|
|
109
|
+
if (options.container) {
|
|
110
|
+
args.push('exec', '-c', options.container, options.pod, '--');
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
args.push('exec', options.pod, '--');
|
|
114
|
+
}
|
|
115
|
+
// Add command if provided
|
|
116
|
+
if (options.execCommand) {
|
|
117
|
+
args.push(options.execCommand);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// Regular kubectl command
|
|
122
|
+
args.push(...(options.args || []));
|
|
123
|
+
}
|
|
124
|
+
return this.exec({
|
|
125
|
+
command: 'kubectl',
|
|
126
|
+
args,
|
|
127
|
+
cwd: options.cwd,
|
|
128
|
+
env: options.env,
|
|
129
|
+
timeout: options.timeout,
|
|
130
|
+
level: options.level,
|
|
131
|
+
preserveFormat: options.preserveFormat,
|
|
132
|
+
includeStderr: options.includeStderr,
|
|
133
|
+
includeExitCode: options.includeExitCode
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Execute a command via SSH
|
|
138
|
+
*/
|
|
139
|
+
async ssh(options) {
|
|
140
|
+
const args = [];
|
|
141
|
+
// Add port
|
|
142
|
+
if (options.port) {
|
|
143
|
+
args.push('-p', String(options.port));
|
|
144
|
+
}
|
|
145
|
+
// Add identity file
|
|
146
|
+
if (options.identity) {
|
|
147
|
+
args.push('-i', options.identity);
|
|
148
|
+
}
|
|
149
|
+
// Add host
|
|
150
|
+
const host = options.user ? `${options.user}@${options.host}` : options.host;
|
|
151
|
+
args.push(host);
|
|
152
|
+
// Add remote command
|
|
153
|
+
if (options.remoteCommand) {
|
|
154
|
+
args.push(options.remoteCommand);
|
|
155
|
+
}
|
|
156
|
+
return this.exec({
|
|
157
|
+
command: 'ssh',
|
|
158
|
+
args,
|
|
159
|
+
cwd: options.cwd,
|
|
160
|
+
env: options.env,
|
|
161
|
+
timeout: options.timeout,
|
|
162
|
+
level: options.level,
|
|
163
|
+
preserveFormat: options.preserveFormat,
|
|
164
|
+
includeStderr: options.includeStderr,
|
|
165
|
+
includeExitCode: options.includeExitCode
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Execute a command and return only redacted output (for LLM consumption)
|
|
170
|
+
*/
|
|
171
|
+
async execRedacted(options) {
|
|
172
|
+
const result = await this.exec(options);
|
|
173
|
+
// Combine stdout and stderr
|
|
174
|
+
let output = result.redacted.stdout;
|
|
175
|
+
if (options.includeStderr !== false && result.redacted.stderr) {
|
|
176
|
+
output += '\n' + result.redacted.stderr;
|
|
177
|
+
}
|
|
178
|
+
if (options.includeExitCode && result.exitCode !== null) {
|
|
179
|
+
output += `\n[Exit code: ${result.exitCode}]`;
|
|
180
|
+
}
|
|
181
|
+
if (result.timedOut) {
|
|
182
|
+
output += '\n[Command timed out]';
|
|
183
|
+
}
|
|
184
|
+
if (result.signal) {
|
|
185
|
+
output += `\n[Terminated by signal: ${result.signal}]`;
|
|
186
|
+
}
|
|
187
|
+
return output;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Format exec result for display
|
|
191
|
+
*/
|
|
192
|
+
formatResult(result, showOriginal = false) {
|
|
193
|
+
const lines = [];
|
|
194
|
+
if (result.timedOut) {
|
|
195
|
+
lines.push('⏱️ Command timed out');
|
|
196
|
+
}
|
|
197
|
+
if (result.signal) {
|
|
198
|
+
lines.push(`💥 Terminated by signal: ${result.signal}`);
|
|
199
|
+
}
|
|
200
|
+
if (result.exitCode !== null && result.exitCode !== 0) {
|
|
201
|
+
lines.push(`❌ Exit code: ${result.exitCode}`);
|
|
202
|
+
}
|
|
203
|
+
// Show redacted output by default
|
|
204
|
+
if (!showOriginal) {
|
|
205
|
+
lines.push('--- Redacted Output ---');
|
|
206
|
+
lines.push(result.redacted.stdout);
|
|
207
|
+
if (result.redacted.stderr) {
|
|
208
|
+
lines.push('--- Redacted Stderr ---');
|
|
209
|
+
lines.push(result.redacted.stderr);
|
|
210
|
+
}
|
|
211
|
+
if (result.redacted.stats.total > 0) {
|
|
212
|
+
lines.push('');
|
|
213
|
+
lines.push(`🔒 Redacted ${result.redacted.stats.total} item(s)`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
// Show original (WARNING: contains sensitive data)
|
|
218
|
+
lines.push('⚠️ ORIGINAL OUTPUT (MAY CONTAIN SENSITIVE DATA)');
|
|
219
|
+
lines.push('---');
|
|
220
|
+
lines.push(result.stdout);
|
|
221
|
+
if (result.stderr) {
|
|
222
|
+
lines.push('--- Stderr ---');
|
|
223
|
+
lines.push(result.stderr);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return lines.join('\n');
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Convenience function
|
|
231
|
+
*/
|
|
232
|
+
export async function execRedacted(options) {
|
|
233
|
+
const executor = new SecureExecutor();
|
|
234
|
+
return executor.execRedacted(options);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Kubernetes convenience function
|
|
238
|
+
*/
|
|
239
|
+
export async function kubectl(options) {
|
|
240
|
+
const executor = new SecureExecutor();
|
|
241
|
+
return executor.kubectl(options);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* SSH convenience function
|
|
245
|
+
*/
|
|
246
|
+
export async function sshExec(options) {
|
|
247
|
+
const executor = new SecureExecutor();
|
|
248
|
+
return executor.ssh(options);
|
|
249
|
+
}
|
|
250
|
+
//# 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 @@
|
|
|
1
|
+
{"version":3,"file":"executor.test.d.ts","sourceRoot":"","sources":["../src/executor.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|