skillshield 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.
- package/LICENSE +21 -0
- package/README.md +400 -0
- package/dist/channels/discord.d.ts +18 -0
- package/dist/channels/discord.d.ts.map +1 -0
- package/dist/channels/discord.js +275 -0
- package/dist/channels/discord.js.map +1 -0
- package/dist/channels/index.d.ts +67 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +127 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/channels/slack.d.ts +20 -0
- package/dist/channels/slack.d.ts.map +1 -0
- package/dist/channels/slack.js +296 -0
- package/dist/channels/slack.js.map +1 -0
- package/dist/channels/telegram.d.ts +20 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +223 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/whatsapp.d.ts +25 -0
- package/dist/channels/whatsapp.d.ts.map +1 -0
- package/dist/channels/whatsapp.js +187 -0
- package/dist/channels/whatsapp.js.map +1 -0
- package/dist/cli/commands/badge.d.ts +11 -0
- package/dist/cli/commands/badge.d.ts.map +1 -0
- package/dist/cli/commands/badge.js +98 -0
- package/dist/cli/commands/badge.js.map +1 -0
- package/dist/cli/commands/config.d.ts +3 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +140 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/deploy.d.ts +3 -0
- package/dist/cli/commands/deploy.d.ts.map +1 -0
- package/dist/cli/commands/deploy.js +56 -0
- package/dist/cli/commands/deploy.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +99 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +3 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +90 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/list.d.ts +3 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +76 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/run.d.ts +3 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +160 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +3 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +133 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/search.d.ts +3 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +56 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +70 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/config.d.ts +167 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +398 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/parser.d.ts +34 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +462 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/runtime.d.ts +68 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +560 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/types.d.ts +525 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +44 -0
- package/dist/core/types.js.map +1 -0
- package/dist/guard/index.d.ts +57 -0
- package/dist/guard/index.d.ts.map +1 -0
- package/dist/guard/index.js +238 -0
- package/dist/guard/index.js.map +1 -0
- package/dist/guard/patterns.d.ts +21 -0
- package/dist/guard/patterns.d.ts.map +1 -0
- package/dist/guard/patterns.js +797 -0
- package/dist/guard/patterns.js.map +1 -0
- package/dist/hub/index.d.ts +44 -0
- package/dist/hub/index.d.ts.map +1 -0
- package/dist/hub/index.js +144 -0
- package/dist/hub/index.js.map +1 -0
- package/dist/hub/registry.d.ts +52 -0
- package/dist/hub/registry.d.ts.map +1 -0
- package/dist/hub/registry.js +192 -0
- package/dist/hub/registry.js.map +1 -0
- package/dist/i18n/index.d.ts +19 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +92 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/locales/en.d.ts +110 -0
- package/dist/i18n/locales/en.d.ts.map +1 -0
- package/dist/i18n/locales/en.js +123 -0
- package/dist/i18n/locales/en.js.map +1 -0
- package/dist/i18n/locales/es.d.ts +110 -0
- package/dist/i18n/locales/es.d.ts.map +1 -0
- package/dist/i18n/locales/es.js +123 -0
- package/dist/i18n/locales/es.js.map +1 -0
- package/dist/i18n/locales/pt.d.ts +110 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -0
- package/dist/i18n/locales/pt.js +123 -0
- package/dist/i18n/locales/pt.js.map +1 -0
- package/dist/i18n/locales/zh.d.ts +110 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -0
- package/dist/i18n/locales/zh.js +123 -0
- package/dist/i18n/locales/zh.js.map +1 -0
- package/dist/index.d.ts +168 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +275 -0
- package/dist/index.js.map +1 -0
- package/dist/router/index.d.ts +89 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +292 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/providers.d.ts +48 -0
- package/dist/router/providers.d.ts.map +1 -0
- package/dist/router/providers.js +733 -0
- package/dist/router/providers.js.map +1 -0
- package/dist/runtime/executor.d.ts +96 -0
- package/dist/runtime/executor.d.ts.map +1 -0
- package/dist/runtime/executor.js +389 -0
- package/dist/runtime/executor.js.map +1 -0
- package/dist/sandbox/index.d.ts +52 -0
- package/dist/sandbox/index.d.ts.map +1 -0
- package/dist/sandbox/index.js +248 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/security/skillguard.d.ts +25 -0
- package/dist/security/skillguard.d.ts.map +1 -0
- package/dist/security/skillguard.js +137 -0
- package/dist/security/skillguard.js.map +1 -0
- package/dist/tools/index.d.ts +55 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +276 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/web-engine.d.ts +158 -0
- package/dist/tools/web-engine.d.ts.map +1 -0
- package/dist/tools/web-engine.js +802 -0
- package/dist/tools/web-engine.js.map +1 -0
- package/dist/tools/web-tools.d.ts +173 -0
- package/dist/tools/web-tools.d.ts.map +1 -0
- package/dist/tools/web-tools.js +251 -0
- package/dist/tools/web-tools.js.map +1 -0
- package/dist/utils/errors.d.ts +44 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +130 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +28 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +121 -0
- package/dist/utils/logger.js.map +1 -0
- package/examples/basic-usage.ts +276 -0
- package/examples/code-reviewer.skill.md +83 -0
- package/examples/creative-writer.skill.md +80 -0
- package/examples/data-analyzer.skill.md +61 -0
- package/examples/hello-world.skill.md +36 -0
- package/examples/sample-skill.md +156 -0
- package/examples/summarizer.skill.md +62 -0
- package/examples/translator.skill.md +45 -0
- package/package.json +110 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { spawn, exec } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
import { SandboxError, TimeoutError } from '../utils/errors.js';
|
|
4
|
+
import { Logger } from '../utils/logger.js';
|
|
5
|
+
const execAsync = promisify(exec);
|
|
6
|
+
export class ProcessSandbox {
|
|
7
|
+
constructor(options = {}) {
|
|
8
|
+
this.logger = new Logger({ level: 'warn' });
|
|
9
|
+
this.timeout = options.timeout || 30000; // 30 seconds default
|
|
10
|
+
this.memoryLimit = options.memoryLimit || '256m';
|
|
11
|
+
// SECURITY: Only pass safe env vars — strip ALL API keys and secrets
|
|
12
|
+
const safeEnv = {
|
|
13
|
+
NODE_ENV: 'sandbox',
|
|
14
|
+
PATH: process.env.PATH || '',
|
|
15
|
+
HOME: process.env.HOME || '/tmp',
|
|
16
|
+
LANG: process.env.LANG || 'en_US.UTF-8',
|
|
17
|
+
};
|
|
18
|
+
this.env = {
|
|
19
|
+
...safeEnv,
|
|
20
|
+
...options.env,
|
|
21
|
+
};
|
|
22
|
+
this.workDir = options.workDir || '/tmp';
|
|
23
|
+
}
|
|
24
|
+
async execute(code) {
|
|
25
|
+
const startTime = Date.now();
|
|
26
|
+
// Validate code before execution
|
|
27
|
+
const validation = new SandboxManager().validateCode(code);
|
|
28
|
+
if (!validation.valid) {
|
|
29
|
+
return {
|
|
30
|
+
stdout: '',
|
|
31
|
+
stderr: `BLOCKED by sandbox: ${validation.errors.join('; ')}`,
|
|
32
|
+
exitCode: 1,
|
|
33
|
+
signal: null,
|
|
34
|
+
duration: Date.now() - startTime,
|
|
35
|
+
timedOut: false,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
// Safely parse memory limit — strip all non-numeric chars to prevent injection
|
|
40
|
+
const rawMem = this.memoryLimit.toLowerCase();
|
|
41
|
+
let memLimitMB;
|
|
42
|
+
if (rawMem.endsWith('g')) {
|
|
43
|
+
memLimitMB = parseInt(rawMem.replace(/[^0-9]/g, ''), 10) * 1000 || 256;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
memLimitMB = parseInt(rawMem.replace(/[^0-9]/g, ''), 10) || 256;
|
|
47
|
+
}
|
|
48
|
+
const result = await Promise.race([
|
|
49
|
+
this.executeWithNode(code, memLimitMB),
|
|
50
|
+
this.createTimeoutPromise(),
|
|
51
|
+
]);
|
|
52
|
+
const duration = Date.now() - startTime;
|
|
53
|
+
return {
|
|
54
|
+
...result,
|
|
55
|
+
duration,
|
|
56
|
+
timedOut: false,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
const duration = Date.now() - startTime;
|
|
61
|
+
if (error instanceof TimeoutError) {
|
|
62
|
+
return {
|
|
63
|
+
stdout: '',
|
|
64
|
+
stderr: 'Execution timed out',
|
|
65
|
+
exitCode: null,
|
|
66
|
+
signal: 'SIGKILL',
|
|
67
|
+
duration,
|
|
68
|
+
timedOut: true,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async executeWithNode(code, memLimitMB) {
|
|
75
|
+
return new Promise((resolve, reject) => {
|
|
76
|
+
// SECURITY: Use array form spawn with shell: false to prevent command injection
|
|
77
|
+
const child = spawn('node', [`--max-old-space-size=${memLimitMB}`, '-e', code], {
|
|
78
|
+
cwd: this.workDir,
|
|
79
|
+
env: this.env,
|
|
80
|
+
timeout: this.timeout,
|
|
81
|
+
shell: false,
|
|
82
|
+
});
|
|
83
|
+
let stdout = '';
|
|
84
|
+
let stderr = '';
|
|
85
|
+
child.stdout?.on('data', (data) => {
|
|
86
|
+
stdout += data.toString();
|
|
87
|
+
});
|
|
88
|
+
child.stderr?.on('data', (data) => {
|
|
89
|
+
stderr += data.toString();
|
|
90
|
+
});
|
|
91
|
+
child.on('error', (error) => {
|
|
92
|
+
reject(new SandboxError(`Execution error: ${error.message}`, { originalError: error.message }));
|
|
93
|
+
});
|
|
94
|
+
child.on('exit', (code, signal) => {
|
|
95
|
+
resolve({
|
|
96
|
+
stdout: stdout.trim(),
|
|
97
|
+
stderr: stderr.trim(),
|
|
98
|
+
exitCode: code,
|
|
99
|
+
signal: signal || null,
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
child.on('timeout', () => {
|
|
103
|
+
child.kill('SIGKILL');
|
|
104
|
+
reject(new TimeoutError(`Process exceeded ${this.timeout}ms timeout`));
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
createTimeoutPromise() {
|
|
109
|
+
return new Promise((_, reject) => {
|
|
110
|
+
setTimeout(() => {
|
|
111
|
+
reject(new TimeoutError(`Operation exceeded ${this.timeout}ms timeout`));
|
|
112
|
+
}, this.timeout + 1000); // Add buffer
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
export class DockerSandbox {
|
|
117
|
+
constructor(options = {}) {
|
|
118
|
+
this.logger = new Logger({ level: 'warn' });
|
|
119
|
+
this.timeout = options.timeout || 30000;
|
|
120
|
+
this.memoryLimit = options.memoryLimit || '256m';
|
|
121
|
+
this.cpuLimit = options.cpuLimit || 50;
|
|
122
|
+
this.networkEnabled = options.networkEnabled !== false;
|
|
123
|
+
}
|
|
124
|
+
async execute(code) {
|
|
125
|
+
const startTime = Date.now();
|
|
126
|
+
// Check if Docker is available
|
|
127
|
+
try {
|
|
128
|
+
await execAsync('docker --version');
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
throw new SandboxError('Docker is not available. Falling back to process sandbox.');
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
// Create container command with security restrictions
|
|
135
|
+
const containerCmd = `docker run --rm \
|
|
136
|
+
--memory=${this.memoryLimit} \
|
|
137
|
+
--cpus=${this.cpuLimit / 100} \
|
|
138
|
+
${!this.networkEnabled ? '--network=none' : ''} \
|
|
139
|
+
--read-only \
|
|
140
|
+
--tmpfs /tmp:rw \
|
|
141
|
+
-e NODE_ENV=sandbox \
|
|
142
|
+
node:18-alpine \
|
|
143
|
+
node -e ${JSON.stringify(code)}`;
|
|
144
|
+
const timeoutSecs = Math.ceil(this.timeout / 1000);
|
|
145
|
+
const fullCmd = `timeout ${timeoutSecs}s ${containerCmd}`;
|
|
146
|
+
const { stdout, stderr } = await execAsync(fullCmd);
|
|
147
|
+
const duration = Date.now() - startTime;
|
|
148
|
+
return {
|
|
149
|
+
stdout: stdout.trim(),
|
|
150
|
+
stderr: stderr.trim(),
|
|
151
|
+
exitCode: 0,
|
|
152
|
+
signal: null,
|
|
153
|
+
duration,
|
|
154
|
+
timedOut: false,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
const duration = Date.now() - startTime;
|
|
159
|
+
if (error instanceof Error && error.message.includes('timed out')) {
|
|
160
|
+
return {
|
|
161
|
+
stdout: '',
|
|
162
|
+
stderr: 'Execution timed out',
|
|
163
|
+
exitCode: null,
|
|
164
|
+
signal: 'SIGKILL',
|
|
165
|
+
duration,
|
|
166
|
+
timedOut: true,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
throw new SandboxError(`Docker execution failed: ${String(error)}`, {
|
|
170
|
+
originalError: String(error),
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
export class SandboxManager {
|
|
176
|
+
constructor() {
|
|
177
|
+
this.processSandbox = null;
|
|
178
|
+
this.dockerSandbox = null;
|
|
179
|
+
this.logger = new Logger({ level: 'warn' });
|
|
180
|
+
}
|
|
181
|
+
async createSandbox(type = 'process', options) {
|
|
182
|
+
if (type === 'docker') {
|
|
183
|
+
if (!this.dockerSandbox) {
|
|
184
|
+
this.dockerSandbox = new DockerSandbox(options);
|
|
185
|
+
}
|
|
186
|
+
return this.dockerSandbox;
|
|
187
|
+
}
|
|
188
|
+
if (!this.processSandbox) {
|
|
189
|
+
this.processSandbox = new ProcessSandbox(options);
|
|
190
|
+
}
|
|
191
|
+
return this.processSandbox;
|
|
192
|
+
}
|
|
193
|
+
async executeInSandbox(code, options) {
|
|
194
|
+
const sandboxType = options?.type || 'process';
|
|
195
|
+
try {
|
|
196
|
+
const sandbox = await this.createSandbox(sandboxType, options);
|
|
197
|
+
return await sandbox.execute(code);
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
// Fallback to process sandbox if Docker fails
|
|
201
|
+
if (sandboxType === 'docker' && error instanceof SandboxError) {
|
|
202
|
+
this.logger.warn('Docker sandbox unavailable, falling back to process sandbox');
|
|
203
|
+
const sandbox = await this.createSandbox('process', options);
|
|
204
|
+
return await sandbox.execute(code);
|
|
205
|
+
}
|
|
206
|
+
throw error;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
validateCode(code) {
|
|
210
|
+
const errors = [];
|
|
211
|
+
const dangerousPatterns = [
|
|
212
|
+
// Filesystem access
|
|
213
|
+
/require\s*\(\s*['"]fs['"]/,
|
|
214
|
+
/import.*from\s+['"]fs['"]/,
|
|
215
|
+
/require\s*\(\s*['"]fs\/promises['"]/,
|
|
216
|
+
// Process spawning
|
|
217
|
+
/require\s*\(\s*['"]child_process['"]/,
|
|
218
|
+
/import.*from\s+['"]child_process['"]/,
|
|
219
|
+
// Network access
|
|
220
|
+
/require\s*\(\s*['"]net['"]/,
|
|
221
|
+
/require\s*\(\s*['"]http['"]/,
|
|
222
|
+
/require\s*\(\s*['"]https['"]/,
|
|
223
|
+
/require\s*\(\s*['"]dgram['"]/,
|
|
224
|
+
// Process manipulation
|
|
225
|
+
/process\.exit/,
|
|
226
|
+
/process\.env/,
|
|
227
|
+
/process\.kill/,
|
|
228
|
+
// Code execution
|
|
229
|
+
/\beval\s*\(/,
|
|
230
|
+
/new\s+Function\s*\(/,
|
|
231
|
+
// Dynamic requires (obfuscation bypass)
|
|
232
|
+
/require\s*\(\s*[^'"]/,
|
|
233
|
+
// OS access
|
|
234
|
+
/require\s*\(\s*['"]os['"]/,
|
|
235
|
+
/require\s*\(\s*['"]path['"]/,
|
|
236
|
+
];
|
|
237
|
+
for (const pattern of dangerousPatterns) {
|
|
238
|
+
if (pattern.test(code)) {
|
|
239
|
+
errors.push(`Dangerous pattern detected: ${pattern.source}`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
valid: errors.length === 0,
|
|
244
|
+
errors,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sandbox/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAwBlC,MAAM,OAAO,cAAc;IAOzB,YAAY,UAA0B,EAAE;QACtC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,qBAAqB;QAC9D,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC;QACjD,qEAAqE;QACrE,MAAM,OAAO,GAA2B;YACtC,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;YAC5B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM;YAChC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,aAAa;SACxC,CAAC;QACF,IAAI,CAAC,GAAG,GAAG;YACT,GAAG,OAAO;YACV,GAAG,OAAO,CAAC,GAAG;SACf,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,iCAAiC;QACjC,MAAM,UAAU,GAAG,IAAI,cAAc,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO;gBACL,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,uBAAuB,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC7D,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBAChC,QAAQ,EAAE,KAAK;aAChB,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,+EAA+E;YAC/E,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;YAC9C,IAAI,UAAkB,CAAC;YACvB,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC;YACzE,CAAC;iBAAM,CAAC;gBACN,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;YAClE,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;gBAChC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC;gBACtC,IAAI,CAAC,oBAAoB,EAAE;aAC5B,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,OAAO;gBACL,GAAG,MAAM;gBACT,QAAQ;gBACR,QAAQ,EAAE,KAAK;aAChB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAExC,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;gBAClC,OAAO;oBACL,MAAM,EAAE,EAAE;oBACV,MAAM,EAAE,qBAAqB;oBAC7B,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,SAAS;oBACjB,QAAQ;oBACR,QAAQ,EAAE,IAAI;iBACf,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,IAAY,EAAE,UAAkB;QAC5D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,gFAAgF;YAChF,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,wBAAwB,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;gBAC9E,GAAG,EAAE,IAAI,CAAC,OAAO;gBACjB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;YAEH,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAEhB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAChC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAChC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC1B,MAAM,CAAC,IAAI,YAAY,CAAC,oBAAoB,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAClG,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;gBAChC,OAAO,CAAC;oBACN,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;oBACrB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;oBACrB,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,MAAM,IAAI,IAAI;iBACvB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;gBACvB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,MAAM,CAAC,IAAI,YAAY,CAAC,oBAAoB,IAAI,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC;YACzE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,oBAAoB;QAC1B,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YAC/B,UAAU,CAAC,GAAG,EAAE;gBACd,MAAM,CAAC,IAAI,YAAY,CAAC,sBAAsB,IAAI,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC;YAC3E,CAAC,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,aAAa;QACxC,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,OAAO,aAAa;IAOxB,YAAY,UAA0B,EAAE;QACtC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;QACxC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC;QACjD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,KAAK,KAAK,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,+BAA+B;QAC/B,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,YAAY,CAAC,2DAA2D,CAAC,CAAC;QACtF,CAAC;QAED,IAAI,CAAC;YACH,sDAAsD;YACtD,MAAM,YAAY,GAAG;mBACR,IAAI,CAAC,WAAW;iBAClB,IAAI,CAAC,QAAQ,GAAG,GAAG;UAC1B,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE;;;;;kBAKpC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAEnC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,WAAW,WAAW,KAAK,YAAY,EAAE,CAAC;YAE1D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAExC,OAAO;gBACL,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;gBACrB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;gBACrB,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,IAAI;gBACZ,QAAQ;gBACR,QAAQ,EAAE,KAAK;aAChB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAExC,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAClE,OAAO;oBACL,MAAM,EAAE,EAAE;oBACV,MAAM,EAAE,qBAAqB;oBAC7B,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,SAAS;oBACjB,QAAQ;oBACR,QAAQ,EAAE,IAAI;iBACf,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,YAAY,CAAC,4BAA4B,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE;gBAClE,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC;aAC7B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,cAAc;IAKzB;QAJQ,mBAAc,GAA0B,IAAI,CAAC;QAC7C,kBAAa,GAAyB,IAAI,CAAC;QAIjD,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAoB,SAAS,EAAE,OAAwB;QACzE,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxB,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;YAClD,CAAC;YACD,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,IAAY,EAAE,OAAwB;QAC3D,MAAM,WAAW,GAAgB,OAAO,EAAE,IAAI,IAAI,SAAS,CAAC;QAE5D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC/D,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,8CAA8C;YAC9C,IAAI,WAAW,KAAK,QAAQ,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;gBAC9D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;gBAChF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAC7D,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,YAAY,CAAC,IAAY;QACvB,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,iBAAiB,GAAG;YACxB,oBAAoB;YACpB,2BAA2B;YAC3B,2BAA2B;YAC3B,qCAAqC;YACrC,mBAAmB;YACnB,sCAAsC;YACtC,sCAAsC;YACtC,iBAAiB;YACjB,4BAA4B;YAC5B,6BAA6B;YAC7B,8BAA8B;YAC9B,8BAA8B;YAC9B,uBAAuB;YACvB,eAAe;YACf,cAAc;YACd,eAAe;YACf,iBAAiB;YACjB,aAAa;YACb,qBAAqB;YACrB,wCAAwC;YACxC,sBAAsB;YACtB,YAAY;YACZ,2BAA2B;YAC3B,6BAA6B;SAC9B,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;YACxC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,CAAC,+BAA+B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,MAAM;SACP,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface Threat {
|
|
2
|
+
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
3
|
+
description: string;
|
|
4
|
+
line: number;
|
|
5
|
+
pattern?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ScanResult {
|
|
8
|
+
score: number;
|
|
9
|
+
threats: Threat[];
|
|
10
|
+
scannedAt: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Security scanning engine for SKILL.md files
|
|
14
|
+
* Uses pattern matching to detect common threats
|
|
15
|
+
*/
|
|
16
|
+
export declare function scanSkill(skillPath: string): Promise<ScanResult>;
|
|
17
|
+
/**
|
|
18
|
+
* Get threat severity color for display
|
|
19
|
+
*/
|
|
20
|
+
export declare function getSeverityColor(severity: 'critical' | 'high' | 'medium' | 'low'): string;
|
|
21
|
+
/**
|
|
22
|
+
* Generate security report summary
|
|
23
|
+
*/
|
|
24
|
+
export declare function generateSecurityReport(result: ScanResult): string;
|
|
25
|
+
//# sourceMappingURL=skillguard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillguard.d.ts","sourceRoot":"","sources":["../../src/security/skillguard.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAmGtE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAC/C,MAAM,CAWR;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CA0BjE"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Security scanning engine for SKILL.md files
|
|
5
|
+
* Uses pattern matching to detect common threats
|
|
6
|
+
*/
|
|
7
|
+
export async function scanSkill(skillPath) {
|
|
8
|
+
let content;
|
|
9
|
+
// Handle both file paths and raw content
|
|
10
|
+
if (skillPath.includes('\n') || skillPath.length > 500) {
|
|
11
|
+
content = skillPath;
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
try {
|
|
15
|
+
content = await fs.readFile(resolve(skillPath), 'utf-8');
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
throw new Error(`Cannot read skill file: ${skillPath}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const threats = [];
|
|
22
|
+
const lines = content.split('\n');
|
|
23
|
+
// Security patterns to detect
|
|
24
|
+
const securityPatterns = [
|
|
25
|
+
{
|
|
26
|
+
name: 'Shell injection',
|
|
27
|
+
patterns: [/\$\(.*\)/g, /`.*`/g],
|
|
28
|
+
severity: 'critical',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'Hardcoded secrets',
|
|
32
|
+
patterns: [/api[_-]?key\s*[=:]/i, /password\s*[=:]/i, /secret\s*[=:]/i],
|
|
33
|
+
severity: 'critical',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: 'File system access',
|
|
37
|
+
patterns: [/fs\.unlink/g, /fs\.rmdir/g, /rm\s+-rf/g],
|
|
38
|
+
severity: 'high',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: 'Network access without validation',
|
|
42
|
+
patterns: [/fetch\s*\(\s*user/i, /https?:\/\/.*\$\{/g],
|
|
43
|
+
severity: 'high',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: 'eval or dynamic code execution',
|
|
47
|
+
patterns: [/eval\s*\(/g, /new\s+Function\s*\(/g, /exec\s*\(/g],
|
|
48
|
+
severity: 'critical',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'SQL injection vulnerability',
|
|
52
|
+
patterns: [/sql.*\$\{/i, /query.*concat/i],
|
|
53
|
+
severity: 'high',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'Unvalidated user input',
|
|
57
|
+
patterns: [/user\s*input|user.*data/i],
|
|
58
|
+
severity: 'medium',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: 'Missing input validation',
|
|
62
|
+
patterns: [/process\.argv/g, /process\.env/g],
|
|
63
|
+
severity: 'medium',
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
// Scan each line
|
|
67
|
+
lines.forEach((line, idx) => {
|
|
68
|
+
const lineNum = idx + 1;
|
|
69
|
+
securityPatterns.forEach((checker) => {
|
|
70
|
+
checker.patterns.forEach((pattern) => {
|
|
71
|
+
if (pattern.test(line)) {
|
|
72
|
+
threats.push({
|
|
73
|
+
severity: checker.severity,
|
|
74
|
+
description: checker.name,
|
|
75
|
+
line: lineNum,
|
|
76
|
+
pattern: line.trim(),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
// Remove duplicates
|
|
83
|
+
const uniqueThreats = Array.from(new Map(threats.map((t) => [`${t.line}-${t.description}`, t])).values());
|
|
84
|
+
// Calculate score
|
|
85
|
+
const criticalCount = uniqueThreats.filter((t) => t.severity === 'critical').length;
|
|
86
|
+
const highCount = uniqueThreats.filter((t) => t.severity === 'high').length;
|
|
87
|
+
const mediumCount = uniqueThreats.filter((t) => t.severity === 'medium').length;
|
|
88
|
+
const score = Math.max(0, 100 - criticalCount * 30 - highCount * 15 - mediumCount * 5);
|
|
89
|
+
return {
|
|
90
|
+
score: Math.round(score),
|
|
91
|
+
threats: uniqueThreats,
|
|
92
|
+
scannedAt: new Date().toISOString(),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get threat severity color for display
|
|
97
|
+
*/
|
|
98
|
+
export function getSeverityColor(severity) {
|
|
99
|
+
switch (severity) {
|
|
100
|
+
case 'critical':
|
|
101
|
+
return 'red';
|
|
102
|
+
case 'high':
|
|
103
|
+
return 'yellow';
|
|
104
|
+
case 'medium':
|
|
105
|
+
return 'blue';
|
|
106
|
+
case 'low':
|
|
107
|
+
return 'gray';
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Generate security report summary
|
|
112
|
+
*/
|
|
113
|
+
export function generateSecurityReport(result) {
|
|
114
|
+
const lines = [];
|
|
115
|
+
lines.push(`Security Scan Report`);
|
|
116
|
+
lines.push(`====================`);
|
|
117
|
+
lines.push(`Overall Score: ${result.score}/100`);
|
|
118
|
+
lines.push(`Scanned at: ${result.scannedAt}`);
|
|
119
|
+
lines.push('');
|
|
120
|
+
if (result.threats.length === 0) {
|
|
121
|
+
lines.push('No threats detected.');
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
lines.push(`Threats Found: ${result.threats.length}`);
|
|
125
|
+
lines.push('');
|
|
126
|
+
result.threats.forEach((threat, idx) => {
|
|
127
|
+
lines.push(`${idx + 1}. [${threat.severity.toUpperCase()}] ${threat.description}`);
|
|
128
|
+
lines.push(` Line: ${threat.line}`);
|
|
129
|
+
if (threat.pattern) {
|
|
130
|
+
lines.push(` Pattern: ${threat.pattern}`);
|
|
131
|
+
}
|
|
132
|
+
lines.push('');
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return lines.join('\n');
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=skillguard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillguard.js","sourceRoot":"","sources":["../../src/security/skillguard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ZodSchema } from 'zod';
|
|
2
|
+
export interface SkillTool {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
schema: ZodSchema;
|
|
6
|
+
execute(input: unknown): Promise<unknown>;
|
|
7
|
+
}
|
|
8
|
+
export interface ToolDefinition {
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
schema: Record<string, unknown>;
|
|
12
|
+
}
|
|
13
|
+
export interface ToolCallRequest {
|
|
14
|
+
name: string;
|
|
15
|
+
input: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
export interface ToolCallResult {
|
|
18
|
+
toolName: string;
|
|
19
|
+
input: Record<string, unknown>;
|
|
20
|
+
output: unknown;
|
|
21
|
+
duration: number;
|
|
22
|
+
success: boolean;
|
|
23
|
+
error?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare class ToolRegistry {
|
|
26
|
+
private tools;
|
|
27
|
+
private logger;
|
|
28
|
+
private webToolsRegistered;
|
|
29
|
+
constructor();
|
|
30
|
+
/**
|
|
31
|
+
* Register all 5 native web intelligence tools as first-class built-ins.
|
|
32
|
+
* No API keys required — all engines work out of the box.
|
|
33
|
+
*
|
|
34
|
+
* Tools registered:
|
|
35
|
+
* web_search — DuckDuckGo + Google + SearXNG search
|
|
36
|
+
* web_extract — Content-density extraction from any URL
|
|
37
|
+
* web_crawl — BFS crawler with depth control
|
|
38
|
+
* web_research — Multi-round search+extract+synthesis
|
|
39
|
+
* web_map — Sitemap.xml + link discovery
|
|
40
|
+
*/
|
|
41
|
+
private registerNativeWebTools;
|
|
42
|
+
/** Check if native web intelligence tools are active */
|
|
43
|
+
isWebIntelligenceActive(): boolean;
|
|
44
|
+
/** Register a SkillTool instance directly (used by plugins, custom tools, etc.) */
|
|
45
|
+
register(tool: SkillTool): void;
|
|
46
|
+
private registerBuiltins;
|
|
47
|
+
registerTool(name: string, handler: (input: unknown) => Promise<unknown>, schema: ZodSchema): void;
|
|
48
|
+
getTool(name: string): SkillTool | undefined;
|
|
49
|
+
executeTool(request: ToolCallRequest): Promise<ToolCallResult>;
|
|
50
|
+
listTools(): ToolDefinition[];
|
|
51
|
+
getToolsForVercelAI(): Record<string, any>;
|
|
52
|
+
private zodSchemaToJsonSchema;
|
|
53
|
+
private mapZodToJsonType;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,SAAS,EAAE,MAAM,KAAK,CAAC;AAKnC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,kBAAkB,CAAS;;IAQnC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,sBAAsB;IAe9B,wDAAwD;IACxD,uBAAuB,IAAI,OAAO;IAIlC,mFAAmF;IACnF,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAI/B,OAAO,CAAC,gBAAgB;IAgJxB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI;IAWlG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAItC,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAsCpE,SAAS,IAAI,cAAc,EAAE;IAuB7B,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAa1C,OAAO,CAAC,qBAAqB;IA6B7B,OAAO,CAAC,gBAAgB;CAczB"}
|