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.
Files changed (167) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +400 -0
  3. package/dist/channels/discord.d.ts +18 -0
  4. package/dist/channels/discord.d.ts.map +1 -0
  5. package/dist/channels/discord.js +275 -0
  6. package/dist/channels/discord.js.map +1 -0
  7. package/dist/channels/index.d.ts +67 -0
  8. package/dist/channels/index.d.ts.map +1 -0
  9. package/dist/channels/index.js +127 -0
  10. package/dist/channels/index.js.map +1 -0
  11. package/dist/channels/slack.d.ts +20 -0
  12. package/dist/channels/slack.d.ts.map +1 -0
  13. package/dist/channels/slack.js +296 -0
  14. package/dist/channels/slack.js.map +1 -0
  15. package/dist/channels/telegram.d.ts +20 -0
  16. package/dist/channels/telegram.d.ts.map +1 -0
  17. package/dist/channels/telegram.js +223 -0
  18. package/dist/channels/telegram.js.map +1 -0
  19. package/dist/channels/whatsapp.d.ts +25 -0
  20. package/dist/channels/whatsapp.d.ts.map +1 -0
  21. package/dist/channels/whatsapp.js +187 -0
  22. package/dist/channels/whatsapp.js.map +1 -0
  23. package/dist/cli/commands/badge.d.ts +11 -0
  24. package/dist/cli/commands/badge.d.ts.map +1 -0
  25. package/dist/cli/commands/badge.js +98 -0
  26. package/dist/cli/commands/badge.js.map +1 -0
  27. package/dist/cli/commands/config.d.ts +3 -0
  28. package/dist/cli/commands/config.d.ts.map +1 -0
  29. package/dist/cli/commands/config.js +140 -0
  30. package/dist/cli/commands/config.js.map +1 -0
  31. package/dist/cli/commands/deploy.d.ts +3 -0
  32. package/dist/cli/commands/deploy.d.ts.map +1 -0
  33. package/dist/cli/commands/deploy.js +56 -0
  34. package/dist/cli/commands/deploy.js.map +1 -0
  35. package/dist/cli/commands/init.d.ts +3 -0
  36. package/dist/cli/commands/init.d.ts.map +1 -0
  37. package/dist/cli/commands/init.js +99 -0
  38. package/dist/cli/commands/init.js.map +1 -0
  39. package/dist/cli/commands/install.d.ts +3 -0
  40. package/dist/cli/commands/install.d.ts.map +1 -0
  41. package/dist/cli/commands/install.js +90 -0
  42. package/dist/cli/commands/install.js.map +1 -0
  43. package/dist/cli/commands/list.d.ts +3 -0
  44. package/dist/cli/commands/list.d.ts.map +1 -0
  45. package/dist/cli/commands/list.js +76 -0
  46. package/dist/cli/commands/list.js.map +1 -0
  47. package/dist/cli/commands/run.d.ts +3 -0
  48. package/dist/cli/commands/run.d.ts.map +1 -0
  49. package/dist/cli/commands/run.js +160 -0
  50. package/dist/cli/commands/run.js.map +1 -0
  51. package/dist/cli/commands/scan.d.ts +3 -0
  52. package/dist/cli/commands/scan.d.ts.map +1 -0
  53. package/dist/cli/commands/scan.js +133 -0
  54. package/dist/cli/commands/scan.js.map +1 -0
  55. package/dist/cli/commands/search.d.ts +3 -0
  56. package/dist/cli/commands/search.d.ts.map +1 -0
  57. package/dist/cli/commands/search.js +56 -0
  58. package/dist/cli/commands/search.js.map +1 -0
  59. package/dist/cli/index.d.ts +3 -0
  60. package/dist/cli/index.d.ts.map +1 -0
  61. package/dist/cli/index.js +70 -0
  62. package/dist/cli/index.js.map +1 -0
  63. package/dist/core/config.d.ts +167 -0
  64. package/dist/core/config.d.ts.map +1 -0
  65. package/dist/core/config.js +398 -0
  66. package/dist/core/config.js.map +1 -0
  67. package/dist/core/parser.d.ts +34 -0
  68. package/dist/core/parser.d.ts.map +1 -0
  69. package/dist/core/parser.js +462 -0
  70. package/dist/core/parser.js.map +1 -0
  71. package/dist/core/runtime.d.ts +68 -0
  72. package/dist/core/runtime.d.ts.map +1 -0
  73. package/dist/core/runtime.js +560 -0
  74. package/dist/core/runtime.js.map +1 -0
  75. package/dist/core/types.d.ts +525 -0
  76. package/dist/core/types.d.ts.map +1 -0
  77. package/dist/core/types.js +44 -0
  78. package/dist/core/types.js.map +1 -0
  79. package/dist/guard/index.d.ts +57 -0
  80. package/dist/guard/index.d.ts.map +1 -0
  81. package/dist/guard/index.js +238 -0
  82. package/dist/guard/index.js.map +1 -0
  83. package/dist/guard/patterns.d.ts +21 -0
  84. package/dist/guard/patterns.d.ts.map +1 -0
  85. package/dist/guard/patterns.js +797 -0
  86. package/dist/guard/patterns.js.map +1 -0
  87. package/dist/hub/index.d.ts +44 -0
  88. package/dist/hub/index.d.ts.map +1 -0
  89. package/dist/hub/index.js +144 -0
  90. package/dist/hub/index.js.map +1 -0
  91. package/dist/hub/registry.d.ts +52 -0
  92. package/dist/hub/registry.d.ts.map +1 -0
  93. package/dist/hub/registry.js +192 -0
  94. package/dist/hub/registry.js.map +1 -0
  95. package/dist/i18n/index.d.ts +19 -0
  96. package/dist/i18n/index.d.ts.map +1 -0
  97. package/dist/i18n/index.js +92 -0
  98. package/dist/i18n/index.js.map +1 -0
  99. package/dist/i18n/locales/en.d.ts +110 -0
  100. package/dist/i18n/locales/en.d.ts.map +1 -0
  101. package/dist/i18n/locales/en.js +123 -0
  102. package/dist/i18n/locales/en.js.map +1 -0
  103. package/dist/i18n/locales/es.d.ts +110 -0
  104. package/dist/i18n/locales/es.d.ts.map +1 -0
  105. package/dist/i18n/locales/es.js +123 -0
  106. package/dist/i18n/locales/es.js.map +1 -0
  107. package/dist/i18n/locales/pt.d.ts +110 -0
  108. package/dist/i18n/locales/pt.d.ts.map +1 -0
  109. package/dist/i18n/locales/pt.js +123 -0
  110. package/dist/i18n/locales/pt.js.map +1 -0
  111. package/dist/i18n/locales/zh.d.ts +110 -0
  112. package/dist/i18n/locales/zh.d.ts.map +1 -0
  113. package/dist/i18n/locales/zh.js +123 -0
  114. package/dist/i18n/locales/zh.js.map +1 -0
  115. package/dist/index.d.ts +168 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +275 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/router/index.d.ts +89 -0
  120. package/dist/router/index.d.ts.map +1 -0
  121. package/dist/router/index.js +292 -0
  122. package/dist/router/index.js.map +1 -0
  123. package/dist/router/providers.d.ts +48 -0
  124. package/dist/router/providers.d.ts.map +1 -0
  125. package/dist/router/providers.js +733 -0
  126. package/dist/router/providers.js.map +1 -0
  127. package/dist/runtime/executor.d.ts +96 -0
  128. package/dist/runtime/executor.d.ts.map +1 -0
  129. package/dist/runtime/executor.js +389 -0
  130. package/dist/runtime/executor.js.map +1 -0
  131. package/dist/sandbox/index.d.ts +52 -0
  132. package/dist/sandbox/index.d.ts.map +1 -0
  133. package/dist/sandbox/index.js +248 -0
  134. package/dist/sandbox/index.js.map +1 -0
  135. package/dist/security/skillguard.d.ts +25 -0
  136. package/dist/security/skillguard.d.ts.map +1 -0
  137. package/dist/security/skillguard.js +137 -0
  138. package/dist/security/skillguard.js.map +1 -0
  139. package/dist/tools/index.d.ts +55 -0
  140. package/dist/tools/index.d.ts.map +1 -0
  141. package/dist/tools/index.js +276 -0
  142. package/dist/tools/index.js.map +1 -0
  143. package/dist/tools/web-engine.d.ts +158 -0
  144. package/dist/tools/web-engine.d.ts.map +1 -0
  145. package/dist/tools/web-engine.js +802 -0
  146. package/dist/tools/web-engine.js.map +1 -0
  147. package/dist/tools/web-tools.d.ts +173 -0
  148. package/dist/tools/web-tools.d.ts.map +1 -0
  149. package/dist/tools/web-tools.js +251 -0
  150. package/dist/tools/web-tools.js.map +1 -0
  151. package/dist/utils/errors.d.ts +44 -0
  152. package/dist/utils/errors.d.ts.map +1 -0
  153. package/dist/utils/errors.js +130 -0
  154. package/dist/utils/errors.js.map +1 -0
  155. package/dist/utils/logger.d.ts +28 -0
  156. package/dist/utils/logger.d.ts.map +1 -0
  157. package/dist/utils/logger.js +121 -0
  158. package/dist/utils/logger.js.map +1 -0
  159. package/examples/basic-usage.ts +276 -0
  160. package/examples/code-reviewer.skill.md +83 -0
  161. package/examples/creative-writer.skill.md +80 -0
  162. package/examples/data-analyzer.skill.md +61 -0
  163. package/examples/hello-world.skill.md +36 -0
  164. package/examples/sample-skill.md +156 -0
  165. package/examples/summarizer.skill.md +62 -0
  166. package/examples/translator.skill.md +45 -0
  167. 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":"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"}
@@ -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":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAe/B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAiB;IAC/C,IAAI,OAAe,CAAC;IAEpB,yCAAyC;IACzC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACvD,OAAO,GAAG,SAAS,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,8BAA8B;IAC9B,MAAM,gBAAgB,GAAG;QACvB;YACE,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC;YAChC,QAAQ,EAAE,UAAmB;SAC9B;QACD;YACE,IAAI,EAAE,mBAAmB;YACzB,QAAQ,EAAE,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,gBAAgB,CAAC;YACvE,QAAQ,EAAE,UAAmB;SAC9B;QACD;YACE,IAAI,EAAE,oBAAoB;YAC1B,QAAQ,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,WAAW,CAAC;YACpD,QAAQ,EAAE,MAAe;SAC1B;QACD;YACE,IAAI,EAAE,mCAAmC;YACzC,QAAQ,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;YACtD,QAAQ,EAAE,MAAe;SAC1B;QACD;YACE,IAAI,EAAE,gCAAgC;YACtC,QAAQ,EAAE,CAAC,YAAY,EAAE,sBAAsB,EAAE,YAAY,CAAC;YAC9D,QAAQ,EAAE,UAAmB;SAC9B;QACD;YACE,IAAI,EAAE,6BAA6B;YACnC,QAAQ,EAAE,CAAC,YAAY,EAAE,gBAAgB,CAAC;YAC1C,QAAQ,EAAE,MAAe;SAC1B;QACD;YACE,IAAI,EAAE,wBAAwB;YAC9B,QAAQ,EAAE,CAAC,0BAA0B,CAAC;YACtC,QAAQ,EAAE,QAAiB;SAC5B;QACD;YACE,IAAI,EAAE,0BAA0B;YAChC,QAAQ,EAAE,CAAC,gBAAgB,EAAE,eAAe,CAAC;YAC7C,QAAQ,EAAE,QAAiB;SAC5B;KACF,CAAC;IAEF,iBAAiB;IACjB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAC1B,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC;QAExB,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBACnC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACvB,OAAO,CAAC,IAAI,CAAC;wBACX,QAAQ,EAAE,OAAO,CAAC,QAAQ;wBAC1B,WAAW,EAAE,OAAO,CAAC,IAAI;wBACzB,IAAI,EAAE,OAAO;wBACb,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;qBACrB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAC9B,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CACxE,CAAC;IAEF,kBAAkB;IAClB,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;IACpF,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAC5E,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IAEhF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,CAAC,EACD,GAAG,GAAG,aAAa,GAAG,EAAE,GAAG,SAAS,GAAG,EAAE,GAAG,WAAW,GAAG,CAAC,CAC5D,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QACxB,OAAO,EAAE,aAAa;QACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAgD;IAEhD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,KAAK,CAAC;QACf,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC;QAChB,KAAK,KAAK;YACR,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAkB;IACvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC;IACjD,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;YACrC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YACnF,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACtC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9C,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -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"}