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
package/dist/commands.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI commands for exec functionality
|
|
3
|
+
*/
|
|
4
|
+
import { SecureExecutor } from './executor.js';
|
|
5
|
+
/**
|
|
6
|
+
* Register exec commands with commander program
|
|
7
|
+
*/
|
|
8
|
+
export function registerExecCommands(program) {
|
|
9
|
+
// Main exec command
|
|
10
|
+
program
|
|
11
|
+
.command('exec [command...]')
|
|
12
|
+
.description('Execute a command and redact sensitive output')
|
|
13
|
+
.option('-l, --level <level>', 'Masking level (basic|standard|aggressive)', 'standard')
|
|
14
|
+
.option('-f, --preserve-format', 'Preserve format in redacted output')
|
|
15
|
+
.option('-t, --timeout <ms>', 'Command timeout in milliseconds', '30000')
|
|
16
|
+
.option('--original', 'Show original output (WARNING: contains sensitive data)')
|
|
17
|
+
.option('--json', 'Output as JSON')
|
|
18
|
+
.action(async (command, options) => {
|
|
19
|
+
if (!command || command.length === 0) {
|
|
20
|
+
console.error('Error: command required');
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
const executor = new SecureExecutor();
|
|
24
|
+
try {
|
|
25
|
+
const result = await executor.exec({
|
|
26
|
+
command: command[0],
|
|
27
|
+
args: command.slice(1),
|
|
28
|
+
timeout: parseInt(options.timeout),
|
|
29
|
+
level: options.level,
|
|
30
|
+
preserveFormat: options.preserveFormat
|
|
31
|
+
});
|
|
32
|
+
if (options.json) {
|
|
33
|
+
console.log(JSON.stringify(result, null, 2));
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
console.log(executor.formatResult(result, options.original));
|
|
37
|
+
}
|
|
38
|
+
// Exit with the same code as the command
|
|
39
|
+
if (result.exitCode !== null) {
|
|
40
|
+
process.exit(result.exitCode);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
// Kubernetes command
|
|
49
|
+
program
|
|
50
|
+
.command('kube [kubectl-args...]')
|
|
51
|
+
.description('Execute kubectl commands with output redaction')
|
|
52
|
+
.option('-n, --namespace <ns>', 'Kubernetes namespace')
|
|
53
|
+
.option('-c, --context <ctx>', 'Kubectl context')
|
|
54
|
+
.option('--pod <pod>', 'Pod name (for exec)')
|
|
55
|
+
.option('--container <container>', 'Container name (for exec)')
|
|
56
|
+
.option('--exec <cmd>', 'Command to execute in pod')
|
|
57
|
+
.option('-l, --level <level>', 'Masking level', 'standard')
|
|
58
|
+
.option('-f, --preserve-format', 'Preserve format in output')
|
|
59
|
+
.option('--json', 'Output as JSON')
|
|
60
|
+
.action(async (kubectlArgs, options) => {
|
|
61
|
+
const executor = new SecureExecutor();
|
|
62
|
+
try {
|
|
63
|
+
const result = await executor.kubectl({
|
|
64
|
+
args: kubectlArgs.length > 0 ? kubectlArgs : ['get', 'pods', '-o', 'wide'],
|
|
65
|
+
namespace: options.namespace,
|
|
66
|
+
context: options.context,
|
|
67
|
+
pod: options.pod,
|
|
68
|
+
container: options.container,
|
|
69
|
+
execCommand: options.exec,
|
|
70
|
+
level: options.level,
|
|
71
|
+
preserveFormat: options.preserveFormat
|
|
72
|
+
});
|
|
73
|
+
if (options.json) {
|
|
74
|
+
console.log(JSON.stringify(result, null, 2));
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
console.log(executor.formatResult(result));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
// SSH command
|
|
86
|
+
program
|
|
87
|
+
.command('ssh <host>')
|
|
88
|
+
.description('Execute SSH commands with output redaction')
|
|
89
|
+
.option('-u, --user <user>', 'SSH user')
|
|
90
|
+
.option('-p, --port <port>', 'SSH port')
|
|
91
|
+
.option('-i, --identity <file>', 'Identity file (private key)')
|
|
92
|
+
.option('-c, --command <cmd>', 'Command to execute on remote host')
|
|
93
|
+
.option('-l, --level <level>', 'Masking level', 'standard')
|
|
94
|
+
.option('-f, --preserve-format', 'Preserve format in output')
|
|
95
|
+
.option('--json', 'Output as JSON')
|
|
96
|
+
.action(async (host, options) => {
|
|
97
|
+
const executor = new SecureExecutor();
|
|
98
|
+
try {
|
|
99
|
+
const result = await executor.ssh({
|
|
100
|
+
host,
|
|
101
|
+
user: options.user,
|
|
102
|
+
port: options.port ? parseInt(options.port) : undefined,
|
|
103
|
+
identity: options.identity,
|
|
104
|
+
remoteCommand: options.command,
|
|
105
|
+
level: options.level,
|
|
106
|
+
preserveFormat: options.preserveFormat
|
|
107
|
+
});
|
|
108
|
+
if (options.json) {
|
|
109
|
+
console.log(JSON.stringify(result, null, 2));
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.log(executor.formatResult(result));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader for llm-mask
|
|
3
|
+
*
|
|
4
|
+
* Loads custom patterns from .llm-mask-rules.json
|
|
5
|
+
*/
|
|
6
|
+
import type { MaskPattern, MaskerConfig } from './types.js';
|
|
7
|
+
export interface ConfigFile {
|
|
8
|
+
customPatterns?: Array<{
|
|
9
|
+
name: string;
|
|
10
|
+
regex: string;
|
|
11
|
+
placeholder: string;
|
|
12
|
+
priority?: number;
|
|
13
|
+
}>;
|
|
14
|
+
defaultLevel?: 'basic' | 'standard' | 'aggressive';
|
|
15
|
+
excludePatterns?: string[];
|
|
16
|
+
auditLog?: boolean;
|
|
17
|
+
auditLogFile?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface LoadedConfig {
|
|
20
|
+
customPatterns: MaskPattern[];
|
|
21
|
+
defaultLevel: 'basic' | 'standard' | 'aggressive';
|
|
22
|
+
excludePatterns: string[];
|
|
23
|
+
auditLog: boolean;
|
|
24
|
+
auditLogFile: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Load config file
|
|
28
|
+
*/
|
|
29
|
+
export declare function loadConfig(configPath?: string): LoadedConfig;
|
|
30
|
+
/**
|
|
31
|
+
* Merge loaded config with MaskerConfig
|
|
32
|
+
*/
|
|
33
|
+
export declare function createMaskerConfig(loaded: LoadedConfig): MaskerConfig;
|
|
34
|
+
/**
|
|
35
|
+
* Get mask level from config or default
|
|
36
|
+
*/
|
|
37
|
+
export declare function getMaskLevel(loaded: LoadedConfig, cliLevel?: string): string;
|
|
38
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE3D,MAAM,WAAW,UAAU;IACzB,cAAc,CAAC,EAAE,KAAK,CAAC;QACrB,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,MAAM,CAAA;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB,CAAC,CAAA;IACF,YAAY,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,YAAY,CAAA;IAClD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,WAAW,EAAE,CAAA;IAC7B,YAAY,EAAE,OAAO,GAAG,UAAU,GAAG,YAAY,CAAA;IACjD,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,QAAQ,EAAE,OAAO,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;CACrB;AAgCD;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,CA8B5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAKrE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5E"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader for llm-mask
|
|
3
|
+
*
|
|
4
|
+
* Loads custom patterns from .llm-mask-rules.json
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync, existsSync } from 'fs';
|
|
7
|
+
import { resolve } from 'path';
|
|
8
|
+
import { homedir } from 'os';
|
|
9
|
+
const DEFAULT_CONFIG = {
|
|
10
|
+
customPatterns: [],
|
|
11
|
+
defaultLevel: 'standard',
|
|
12
|
+
excludePatterns: [],
|
|
13
|
+
auditLog: false,
|
|
14
|
+
auditLogFile: ''
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Search for config file in multiple locations:
|
|
18
|
+
* 1. ./.llm-mask-rules.json (current directory)
|
|
19
|
+
* 2. ~/.llm-mask-rules.json (home directory)
|
|
20
|
+
* 3. ~/.config/llm-mask/rules.json (XDG config)
|
|
21
|
+
*/
|
|
22
|
+
function findConfigPath(startDir = process.cwd()) {
|
|
23
|
+
const paths = [
|
|
24
|
+
resolve(startDir, '.llm-mask-rules.json'),
|
|
25
|
+
resolve(homedir(), '.llm-mask-rules.json'),
|
|
26
|
+
resolve(homedir(), '.config', 'llm-mask', 'rules.json')
|
|
27
|
+
];
|
|
28
|
+
for (const path of paths) {
|
|
29
|
+
if (existsSync(path)) {
|
|
30
|
+
return path;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Load config file
|
|
37
|
+
*/
|
|
38
|
+
export function loadConfig(configPath) {
|
|
39
|
+
const path = configPath || findConfigPath();
|
|
40
|
+
if (!path || !existsSync(path)) {
|
|
41
|
+
return DEFAULT_CONFIG;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const content = readFileSync(path, 'utf-8');
|
|
45
|
+
const raw = JSON.parse(content);
|
|
46
|
+
// Convert regex strings to RegExp objects
|
|
47
|
+
const customPatterns = (raw.customPatterns || []).map(p => ({
|
|
48
|
+
name: p.name,
|
|
49
|
+
regex: new RegExp(p.regex, 'g'),
|
|
50
|
+
placeholder: (i) => p.placeholder.replace('{i}', String(i)),
|
|
51
|
+
priority: p.priority || 50
|
|
52
|
+
}));
|
|
53
|
+
return {
|
|
54
|
+
customPatterns,
|
|
55
|
+
defaultLevel: raw.defaultLevel || 'standard',
|
|
56
|
+
excludePatterns: raw.excludePatterns || [],
|
|
57
|
+
auditLog: raw.auditLog || false,
|
|
58
|
+
auditLogFile: raw.auditLogFile || ''
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.error(`Failed to load config from ${path}:`, error);
|
|
63
|
+
return DEFAULT_CONFIG;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Merge loaded config with MaskerConfig
|
|
68
|
+
*/
|
|
69
|
+
export function createMaskerConfig(loaded) {
|
|
70
|
+
return {
|
|
71
|
+
customPatterns: loaded.customPatterns,
|
|
72
|
+
excludePatterns: loaded.excludePatterns
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get mask level from config or default
|
|
77
|
+
*/
|
|
78
|
+
export function getMaskLevel(loaded, cliLevel) {
|
|
79
|
+
return cliLevel || loaded.defaultLevel;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAwB5B,MAAM,cAAc,GAAiB;IACnC,cAAc,EAAE,EAAE;IAClB,YAAY,EAAE,UAAU;IACxB,eAAe,EAAE,EAAE;IACnB,QAAQ,EAAE,KAAK;IACf,YAAY,EAAE,EAAE;CACjB,CAAA;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IACtD,MAAM,KAAK,GAAG;QACZ,OAAO,CAAC,QAAQ,EAAE,sBAAsB,CAAC;QACzC,OAAO,CAAC,OAAO,EAAE,EAAE,sBAAsB,CAAC;QAC1C,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,CAAC;KACxD,CAAA;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,UAAmB;IAC5C,MAAM,IAAI,GAAG,UAAU,IAAI,cAAc,EAAE,CAAA;IAE3C,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC3C,MAAM,GAAG,GAAe,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAE3C,0CAA0C;QAC1C,MAAM,cAAc,GAAkB,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzE,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC;YAC/B,WAAW,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YACnE,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE;SAC3B,CAAC,CAAC,CAAA;QAEH,OAAO;YACL,cAAc;YACd,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,UAAU;YAC5C,eAAe,EAAE,GAAG,CAAC,eAAe,IAAI,EAAE;YAC1C,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,KAAK;YAC/B,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,EAAE;SACrC,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,GAAG,EAAE,KAAK,CAAC,CAAA;QAC3D,OAAO,cAAc,CAAA;IACvB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,OAAO;QACL,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,eAAe,EAAE,MAAM,CAAC,eAAe;KACxC,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAoB,EAAE,QAAiB;IAClE,OAAO,QAAQ,IAAI,MAAM,CAAC,YAAY,CAAA;AACxC,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart context detection - mask values while preserving structure
|
|
3
|
+
*
|
|
4
|
+
* Detects SQL, JSON, YAML, code and masks only values
|
|
5
|
+
*/
|
|
6
|
+
export type ContextType = 'sql' | 'json' | 'yaml' | 'xml' | 'code' | 'plaintext';
|
|
7
|
+
export interface ContextMaskResult {
|
|
8
|
+
masked: string;
|
|
9
|
+
context: ContextType;
|
|
10
|
+
stats: {
|
|
11
|
+
valuesMasked: number;
|
|
12
|
+
identifiersPreserved: number;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Detect context type from content
|
|
17
|
+
*/
|
|
18
|
+
export declare function detectContext(content: string): ContextType;
|
|
19
|
+
/**
|
|
20
|
+
* Context-aware masker
|
|
21
|
+
*/
|
|
22
|
+
export declare class ContextMasker {
|
|
23
|
+
private masker;
|
|
24
|
+
constructor();
|
|
25
|
+
/**
|
|
26
|
+
* Mask content with context awareness
|
|
27
|
+
*/
|
|
28
|
+
mask(content: string): ContextMaskResult;
|
|
29
|
+
/**
|
|
30
|
+
* Mask JSON - preserve keys, mask values
|
|
31
|
+
*/
|
|
32
|
+
private maskJSON;
|
|
33
|
+
/**
|
|
34
|
+
* Mask SQL - preserve identifiers, mask string literals
|
|
35
|
+
*/
|
|
36
|
+
private maskSQL;
|
|
37
|
+
/**
|
|
38
|
+
* Mask YAML - preserve keys, mask values
|
|
39
|
+
*/
|
|
40
|
+
private maskYAML;
|
|
41
|
+
/**
|
|
42
|
+
* Mask XML - preserve tags/attributes, mask text content
|
|
43
|
+
*/
|
|
44
|
+
private maskXML;
|
|
45
|
+
/**
|
|
46
|
+
* Regular plaintext masking
|
|
47
|
+
*/
|
|
48
|
+
private maskPlaintext;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Convenience function
|
|
52
|
+
*/
|
|
53
|
+
export declare function maskWithContext(content: string): ContextMaskResult;
|
|
54
|
+
//# sourceMappingURL=context-detection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-detection.d.ts","sourceRoot":"","sources":["../src/context-detection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,WAAW,CAAA;AAEhF,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,WAAW,CAAA;IACpB,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAA;QACpB,oBAAoB,EAAE,MAAM,CAAA;KAC7B,CAAA;CACF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAiC1D;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAY;;IAM1B;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB;IAiBxC;;OAEG;IACH,OAAO,CAAC,QAAQ;IAwChB;;OAEG;IACH,OAAO,CAAC,OAAO;IA8Bf;;OAEG;IACH,OAAO,CAAC,QAAQ;IA6ChB;;OAEG;IACH,OAAO,CAAC,OAAO;IAgCf;;OAEG;IACH,OAAO,CAAC,aAAa;CAQtB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAGlE"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart context detection - mask values while preserving structure
|
|
3
|
+
*
|
|
4
|
+
* Detects SQL, JSON, YAML, code and masks only values
|
|
5
|
+
*/
|
|
6
|
+
import { DataMasker } from './masker.js';
|
|
7
|
+
/**
|
|
8
|
+
* Detect context type from content
|
|
9
|
+
*/
|
|
10
|
+
export function detectContext(content) {
|
|
11
|
+
const trimmed = content.trim();
|
|
12
|
+
// JSON
|
|
13
|
+
if (trimmed.startsWith('{') && trimmed.endsWith('}')) {
|
|
14
|
+
return 'json';
|
|
15
|
+
}
|
|
16
|
+
if (trimmed.startsWith('[') && trimmed.endsWith(']')) {
|
|
17
|
+
return 'json';
|
|
18
|
+
}
|
|
19
|
+
// YAML
|
|
20
|
+
if (/^[\w\s-]+:/.test(trimmed)) {
|
|
21
|
+
return 'yaml';
|
|
22
|
+
}
|
|
23
|
+
// SQL
|
|
24
|
+
const sqlKeywords = /\b(SELECT|INSERT|UPDATE|DELETE|FROM|WHERE|INTO|VALUES|JOIN)\b/i;
|
|
25
|
+
if (sqlKeywords.test(content)) {
|
|
26
|
+
return 'sql';
|
|
27
|
+
}
|
|
28
|
+
// XML
|
|
29
|
+
if (trimmed.startsWith('<?xml') || trimmed.startsWith('<!DOCTYPE') || /<[^>]+>/.test(trimmed)) {
|
|
30
|
+
return 'xml';
|
|
31
|
+
}
|
|
32
|
+
// Code-like (has function/class definitions, imports, etc.)
|
|
33
|
+
if (/^(\s*(import|export|from|const|let|var|function|class|def|pub|fn)\b)/m.test(content)) {
|
|
34
|
+
return 'code';
|
|
35
|
+
}
|
|
36
|
+
return 'plaintext';
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Context-aware masker
|
|
40
|
+
*/
|
|
41
|
+
export class ContextMasker {
|
|
42
|
+
masker;
|
|
43
|
+
constructor() {
|
|
44
|
+
this.masker = new DataMasker();
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Mask content with context awareness
|
|
48
|
+
*/
|
|
49
|
+
mask(content) {
|
|
50
|
+
const context = detectContext(content);
|
|
51
|
+
switch (context) {
|
|
52
|
+
case 'json':
|
|
53
|
+
return this.maskJSON(content);
|
|
54
|
+
case 'sql':
|
|
55
|
+
return this.maskSQL(content);
|
|
56
|
+
case 'yaml':
|
|
57
|
+
return this.maskYAML(content);
|
|
58
|
+
case 'xml':
|
|
59
|
+
return this.maskXML(content);
|
|
60
|
+
default:
|
|
61
|
+
return this.maskPlaintext(content, context);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Mask JSON - preserve keys, mask values
|
|
66
|
+
*/
|
|
67
|
+
maskJSON(content) {
|
|
68
|
+
let valuesMasked = 0;
|
|
69
|
+
let identifiersPreserved = 0;
|
|
70
|
+
try {
|
|
71
|
+
const obj = JSON.parse(content);
|
|
72
|
+
const maskValue = (val) => {
|
|
73
|
+
if (typeof val === 'string') {
|
|
74
|
+
const result = this.masker.mask(val);
|
|
75
|
+
if (result.stats.total > 0) {
|
|
76
|
+
valuesMasked++;
|
|
77
|
+
return result.masked;
|
|
78
|
+
}
|
|
79
|
+
return val;
|
|
80
|
+
}
|
|
81
|
+
if (Array.isArray(val)) {
|
|
82
|
+
return val.map(maskValue);
|
|
83
|
+
}
|
|
84
|
+
if (val && typeof val === 'object') {
|
|
85
|
+
const result = {};
|
|
86
|
+
for (const [key, value] of Object.entries(val)) {
|
|
87
|
+
identifiersPreserved++;
|
|
88
|
+
result[key] = maskValue(value);
|
|
89
|
+
}
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
return val;
|
|
93
|
+
};
|
|
94
|
+
const maskedObj = maskValue(obj);
|
|
95
|
+
const masked = JSON.stringify(maskedObj, null, 2);
|
|
96
|
+
return { masked, context: 'json', stats: { valuesMasked, identifiersPreserved } };
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Not valid JSON, fall back to plaintext
|
|
100
|
+
return this.maskPlaintext(content, 'plaintext');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Mask SQL - preserve identifiers, mask string literals
|
|
105
|
+
*/
|
|
106
|
+
maskSQL(content) {
|
|
107
|
+
let valuesMasked = 0;
|
|
108
|
+
let identifiersPreserved = 0;
|
|
109
|
+
// Match SQL string literals
|
|
110
|
+
const lines = content.split('\n');
|
|
111
|
+
const maskedLines = lines.map(line => {
|
|
112
|
+
// Mask string literals
|
|
113
|
+
let masked = line.replace(/'([^']+)'/g, (match, value) => {
|
|
114
|
+
const result = this.masker.mask(value);
|
|
115
|
+
if (result.stats.total > 0) {
|
|
116
|
+
valuesMasked++;
|
|
117
|
+
return `'${result.masked}'`;
|
|
118
|
+
}
|
|
119
|
+
return match;
|
|
120
|
+
});
|
|
121
|
+
// Preserve identifiers (table names, column names)
|
|
122
|
+
identifiersPreserved += (line.match(/\b[A-Z][A-Z0-9_]*\b/g) || []).length;
|
|
123
|
+
return masked;
|
|
124
|
+
});
|
|
125
|
+
return {
|
|
126
|
+
masked: maskedLines.join('\n'),
|
|
127
|
+
context: 'sql',
|
|
128
|
+
stats: { valuesMasked, identifiersPreserved }
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Mask YAML - preserve keys, mask values
|
|
133
|
+
*/
|
|
134
|
+
maskYAML(content) {
|
|
135
|
+
let valuesMasked = 0;
|
|
136
|
+
let identifiersPreserved = 0;
|
|
137
|
+
const lines = content.split('\n');
|
|
138
|
+
const maskedLines = lines.map(line => {
|
|
139
|
+
// Check if this is a key-value line
|
|
140
|
+
const match = line.match(/^(\s*)([\w-]+):\s*(.+)$/);
|
|
141
|
+
if (match) {
|
|
142
|
+
const [, indent, key, value] = match;
|
|
143
|
+
const result = this.masker.mask(value.trim());
|
|
144
|
+
if (result.stats.total > 0) {
|
|
145
|
+
valuesMasked++;
|
|
146
|
+
return `${indent}${key}: ${result.masked}`;
|
|
147
|
+
}
|
|
148
|
+
identifiersPreserved++;
|
|
149
|
+
return line;
|
|
150
|
+
}
|
|
151
|
+
// Check for array items
|
|
152
|
+
const arrayMatch = line.match(/^(\s*)-\s*(.+)/);
|
|
153
|
+
if (arrayMatch) {
|
|
154
|
+
const [, indent, value] = arrayMatch;
|
|
155
|
+
const result = this.masker.mask(value.trim());
|
|
156
|
+
if (result.stats.total > 0) {
|
|
157
|
+
valuesMasked++;
|
|
158
|
+
return `${indent}- ${result.masked}`;
|
|
159
|
+
}
|
|
160
|
+
return line;
|
|
161
|
+
}
|
|
162
|
+
return line;
|
|
163
|
+
});
|
|
164
|
+
return {
|
|
165
|
+
masked: maskedLines.join('\n'),
|
|
166
|
+
context: 'yaml',
|
|
167
|
+
stats: { valuesMasked, identifiersPreserved }
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Mask XML - preserve tags/attributes, mask text content
|
|
172
|
+
*/
|
|
173
|
+
maskXML(content) {
|
|
174
|
+
let valuesMasked = 0;
|
|
175
|
+
let identifiersPreserved = 0;
|
|
176
|
+
// Count tags (identifiers)
|
|
177
|
+
identifiersPreserved += (content.match(/<[\w:]+/g) || []).length;
|
|
178
|
+
// Mask text content between tags
|
|
179
|
+
let masked = content.replace(/>([^<]+)</g, (match, text) => {
|
|
180
|
+
if (text.trim().length === 0)
|
|
181
|
+
return match;
|
|
182
|
+
const result = this.masker.mask(text.trim());
|
|
183
|
+
if (result.stats.total > 0) {
|
|
184
|
+
valuesMasked++;
|
|
185
|
+
return `>${result.masked}<`;
|
|
186
|
+
}
|
|
187
|
+
return match;
|
|
188
|
+
});
|
|
189
|
+
// Mask attribute values
|
|
190
|
+
masked = masked.replace(/(\s+[\w:]+)=["']([^"']+)["']/g, (match, attr, value) => {
|
|
191
|
+
const result = this.masker.mask(value);
|
|
192
|
+
if (result.stats.total > 0) {
|
|
193
|
+
valuesMasked++;
|
|
194
|
+
return `${attr}="${result.masked}"`;
|
|
195
|
+
}
|
|
196
|
+
return match;
|
|
197
|
+
});
|
|
198
|
+
return { masked, context: 'xml', stats: { valuesMasked, identifiersPreserved } };
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Regular plaintext masking
|
|
202
|
+
*/
|
|
203
|
+
maskPlaintext(content, context) {
|
|
204
|
+
const result = this.masker.mask(content);
|
|
205
|
+
return {
|
|
206
|
+
masked: result.masked,
|
|
207
|
+
context,
|
|
208
|
+
stats: { valuesMasked: result.stats.total, identifiersPreserved: 0 }
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Convenience function
|
|
214
|
+
*/
|
|
215
|
+
export function maskWithContext(content) {
|
|
216
|
+
const masker = new ContextMasker();
|
|
217
|
+
return masker.mask(content);
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=context-detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-detection.js","sourceRoot":"","sources":["../src/context-detection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diff masking - mask git diff output for safe LLM code review
|
|
3
|
+
*
|
|
4
|
+
* Preserves diff structure while masking sensitive data
|
|
5
|
+
*/
|
|
6
|
+
export interface DiffOptions {
|
|
7
|
+
/** Base branch or commit */
|
|
8
|
+
base?: string;
|
|
9
|
+
/** Head branch or commit (default: working directory) */
|
|
10
|
+
head?: string;
|
|
11
|
+
/** Git options */
|
|
12
|
+
gitDir?: string;
|
|
13
|
+
/** Masking level */
|
|
14
|
+
level?: 'basic' | 'standard' | 'aggressive';
|
|
15
|
+
/** Path to restrict diff */
|
|
16
|
+
path?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface MaskedDiff {
|
|
19
|
+
maskedDiff: string;
|
|
20
|
+
originalLineCount: number;
|
|
21
|
+
stats: {
|
|
22
|
+
filesChanged: number;
|
|
23
|
+
linesAdded: number;
|
|
24
|
+
linesRemoved: number;
|
|
25
|
+
masksApplied: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Masker for git diff output
|
|
30
|
+
*/
|
|
31
|
+
export declare class DiffMasker {
|
|
32
|
+
private masker;
|
|
33
|
+
constructor();
|
|
34
|
+
/**
|
|
35
|
+
* Get git diff and mask it
|
|
36
|
+
*/
|
|
37
|
+
maskDiff(options?: DiffOptions): MaskedDiff;
|
|
38
|
+
/**
|
|
39
|
+
* Get git diff output
|
|
40
|
+
*/
|
|
41
|
+
private getDiff;
|
|
42
|
+
/**
|
|
43
|
+
* Format masked diff for display
|
|
44
|
+
*/
|
|
45
|
+
format(maskedDiff: MaskedDiff): string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Convenience function to mask git diff
|
|
49
|
+
*/
|
|
50
|
+
export declare function maskDiff(options?: DiffOptions): string;
|
|
51
|
+
//# sourceMappingURL=diff-masking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-masking.d.ts","sourceRoot":"","sources":["../src/diff-masking.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,WAAW;IAC1B,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,kBAAkB;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oBAAoB;IACpB,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,YAAY,CAAA;IAC3C,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;IACzB,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;QAClB,YAAY,EAAE,MAAM,CAAA;QACpB,YAAY,EAAE,MAAM,CAAA;KACrB,CAAA;CACF;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAY;;IAM1B;;OAEG;IACH,QAAQ,CAAC,OAAO,GAAE,WAAgB,GAAG,UAAU;IAqD/C;;OAEG;IACH,OAAO,CAAC,OAAO;IA+Bf;;OAEG;IACH,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM;CAiBvC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,CAItD"}
|