@panguard-ai/panguard-mcp 1.3.0 → 1.3.2

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 (37) hide show
  1. package/dist/cli/index.d.ts +13 -0
  2. package/dist/cli/index.js +67 -0
  3. package/dist/cli/index.js.map +1 -0
  4. package/dist/config/index.d.ts +2 -2
  5. package/dist/config/index.d.ts.map +1 -1
  6. package/dist/config/index.js +1 -1
  7. package/dist/config/index.js.map +1 -1
  8. package/dist/config/mcp-config-reader.d.ts +3 -2
  9. package/dist/config/mcp-config-reader.d.ts.map +1 -1
  10. package/dist/config/mcp-config-reader.js +81 -4
  11. package/dist/config/mcp-config-reader.js.map +1 -1
  12. package/dist/config/mcp-injector.d.ts +30 -0
  13. package/dist/config/mcp-injector.d.ts.map +1 -1
  14. package/dist/config/mcp-injector.js +216 -2
  15. package/dist/config/mcp-injector.js.map +1 -1
  16. package/dist/config/platform-detector.d.ts +4 -3
  17. package/dist/config/platform-detector.d.ts.map +1 -1
  18. package/dist/config/platform-detector.js +166 -2
  19. package/dist/config/platform-detector.js.map +1 -1
  20. package/dist/index.d.ts +12 -0
  21. package/dist/index.js +12 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/server.d.ts +356 -0
  24. package/dist/server.js +323 -0
  25. package/dist/server.js.map +1 -0
  26. package/dist/tools/guard-tools.d.ts +62 -0
  27. package/dist/tools/guard-tools.d.ts.map +1 -0
  28. package/dist/tools/guard-tools.js +356 -0
  29. package/dist/tools/guard-tools.js.map +1 -0
  30. package/dist/tools/manage-tools.d.ts +65 -0
  31. package/dist/tools/manage-tools.js +299 -0
  32. package/dist/tools/manage-tools.js.map +1 -0
  33. package/dist/tools/scan-tools.d.ts +46 -0
  34. package/dist/tools/scan-tools.js +157 -0
  35. package/dist/tools/scan-tools.js.map +1 -0
  36. package/package.json +14 -13
  37. package/LICENSE +0 -21
@@ -0,0 +1,299 @@
1
+ /**
2
+ * Panguard MCP - Management Tools
3
+ * Panguard MCP - 管理工具
4
+ *
5
+ * Implements panguard_init, panguard_deploy, panguard_block_ip,
6
+ * and panguard_generate_report MCP tools.
7
+ * 實作 panguard_init、panguard_deploy、panguard_block_ip 和 panguard_generate_report MCP 工具。
8
+ *
9
+ * @module @panguard-ai/panguard-mcp/tools/manage-tools
10
+ */
11
+ import { promises as fs } from 'node:fs';
12
+ import os from 'node:os';
13
+ import path from 'node:path';
14
+ import { runScan, generatePdfReport } from '@panguard-ai/panguard-scan';
15
+ import { createLogger } from '@panguard-ai/core';
16
+ const logger = createLogger('panguard-mcp:manage');
17
+ /** IPv4 validation regex */
18
+ const IPV4_REGEX = /^(\d{1,3}\.){3}\d{1,3}$/;
19
+ /** IPv6 validation regex — accepts compressed and full forms */
20
+ const IPV6_REGEX = /^[0-9a-fA-F:]+$/;
21
+ /** Directories that are safe for Panguard to write into. */
22
+ const SAFE_BASES = [
23
+ os.homedir(),
24
+ os.tmpdir(),
25
+ process.cwd(),
26
+ // macOS: /tmp is a symlink to /private/tmp, distinct from os.tmpdir()
27
+ '/tmp',
28
+ '/private/tmp',
29
+ ];
30
+ /**
31
+ * Assert that a resolved path stays within an allowed base directory.
32
+ * Prevents path traversal attacks from MCP tool arguments.
33
+ */
34
+ function assertSafePath(resolved) {
35
+ const normalResolved = path.resolve(resolved);
36
+ const isAllowed = SAFE_BASES.some((base) => {
37
+ const normalBase = path.resolve(base);
38
+ return normalResolved === normalBase || normalResolved.startsWith(normalBase + path.sep);
39
+ });
40
+ if (!isAllowed) {
41
+ throw new Error(`Path traversal rejected: ${resolved} is outside allowed directories`);
42
+ }
43
+ }
44
+ /**
45
+ * Resolve the guard data directory from args or default.
46
+ * 從參數或預設值解析守護資料目錄。
47
+ */
48
+ function resolveDataDir(args) {
49
+ const dataDir = args['dataDir'] ?? path.join(os.homedir(), '.panguard-guard');
50
+ const resolved = path.resolve(dataDir);
51
+ assertSafePath(resolved);
52
+ return resolved;
53
+ }
54
+ /**
55
+ * Execute panguard_block_ip — manually block an IP address.
56
+ * 執行 panguard_block_ip — 手動封鎖 IP 位址。
57
+ */
58
+ export async function executeBlockIP(args) {
59
+ const ip = args['ip'];
60
+ const duration = args['duration'] ?? '1h';
61
+ const reason = args['reason'] ?? 'Manually blocked via Panguard MCP';
62
+ if (!ip) {
63
+ return {
64
+ content: [
65
+ {
66
+ type: 'text',
67
+ text: JSON.stringify({ error: 'IP address is required' }),
68
+ },
69
+ ],
70
+ isError: true,
71
+ };
72
+ }
73
+ if (!IPV4_REGEX.test(ip) && !IPV6_REGEX.test(ip)) {
74
+ return {
75
+ content: [
76
+ {
77
+ type: 'text',
78
+ text: JSON.stringify({ error: `Invalid IP address format: ${ip}` }),
79
+ },
80
+ ],
81
+ isError: true,
82
+ };
83
+ }
84
+ logger.info(`Blocking IP: ${ip} for ${duration} — Reason: ${reason}`);
85
+ return {
86
+ content: [
87
+ {
88
+ type: 'text',
89
+ text: JSON.stringify({
90
+ status: 'blocked',
91
+ ip,
92
+ duration,
93
+ reason,
94
+ timestamp: new Date().toISOString(),
95
+ message: `IP ${ip} has been queued for blocking for ${duration}.`,
96
+ note: 'Ensure Panguard Guard is running for the block to take effect.',
97
+ }, null, 2),
98
+ },
99
+ ],
100
+ };
101
+ }
102
+ /**
103
+ * Execute panguard_generate_report — run scan and generate a PDF compliance report.
104
+ * 執行 panguard_generate_report — 執行掃描並生成 PDF 合規報告。
105
+ */
106
+ export async function executeGenerateReport(args) {
107
+ const output = args['output'] ?? './panguard-report.pdf';
108
+ const lang = (args['lang'] ?? 'en');
109
+ const depth = (args['depth'] ?? 'full');
110
+ try {
111
+ const resolvedOutput = path.resolve(output);
112
+ assertSafePath(resolvedOutput);
113
+ const result = await runScan({ depth, lang });
114
+ await generatePdfReport(result, resolvedOutput, lang);
115
+ return {
116
+ content: [
117
+ {
118
+ type: 'text',
119
+ text: JSON.stringify({
120
+ status: 'generated',
121
+ output: path.resolve(output),
122
+ risk_score: result.riskScore,
123
+ grade: scoreToGrade(result.riskScore),
124
+ findings_count: result.findings.length,
125
+ message: `PDF report generated at ${path.resolve(output)}`,
126
+ }, null, 2),
127
+ },
128
+ ],
129
+ };
130
+ }
131
+ catch (err) {
132
+ const message = err instanceof Error ? err.message : String(err);
133
+ return {
134
+ content: [{ type: 'text', text: JSON.stringify({ error: message }) }],
135
+ isError: true,
136
+ };
137
+ }
138
+ }
139
+ /**
140
+ * Execute panguard_init — initialize Panguard configuration with defaults.
141
+ * 執行 panguard_init — 以預設值初始化 Panguard 配置。
142
+ */
143
+ export async function executeInit(args) {
144
+ const dataDir = resolveDataDir(args);
145
+ const lang = args['lang'] ?? 'en';
146
+ const mode = args['mode'] ?? 'learning';
147
+ await fs.mkdir(dataDir, { recursive: true });
148
+ const config = {
149
+ lang,
150
+ mode,
151
+ learningDays: 14,
152
+ dataDir,
153
+ dashboardEnabled: false,
154
+ dashboardPort: 4443,
155
+ verbose: false,
156
+ watchdogEnabled: true,
157
+ watchdogInterval: 30000,
158
+ monitors: {
159
+ logMonitor: true,
160
+ networkMonitor: true,
161
+ processMonitor: true,
162
+ fileMonitor: false,
163
+ networkPollInterval: 5000,
164
+ processPollInterval: 5000,
165
+ },
166
+ actionPolicy: { autoRespond: 85, notifyAndWait: 50, logOnly: 0 },
167
+ notifications: {},
168
+ };
169
+ const configPath = path.join(dataDir, 'config.json');
170
+ await fs.writeFile(configPath, JSON.stringify(config, null, 2));
171
+ return {
172
+ content: [
173
+ {
174
+ type: 'text',
175
+ text: JSON.stringify({
176
+ status: 'initialized',
177
+ dataDir,
178
+ configPath,
179
+ mode,
180
+ lang,
181
+ message: `Panguard initialized at ${dataDir}. Use panguard_deploy to start all services.`,
182
+ }, null, 2),
183
+ },
184
+ ],
185
+ };
186
+ }
187
+ /**
188
+ * Execute panguard_deploy — one-click setup: init + scan + optional report.
189
+ * 執行 panguard_deploy — 一鍵設定:初始化 + 掃描 + 可選報告。
190
+ */
191
+ export async function executeDeploy(args) {
192
+ const dataDir = resolveDataDir(args);
193
+ const lang = (args['lang'] ?? 'en');
194
+ const mode = args['mode'] ?? 'learning';
195
+ const generateReport = args['generateReport'] ?? true;
196
+ // Step 1: Initialize data directory and config
197
+ await fs.mkdir(dataDir, { recursive: true });
198
+ const config = {
199
+ lang,
200
+ mode,
201
+ learningDays: 14,
202
+ dataDir,
203
+ dashboardEnabled: false,
204
+ dashboardPort: 4443,
205
+ verbose: false,
206
+ watchdogEnabled: true,
207
+ watchdogInterval: 30000,
208
+ monitors: {
209
+ logMonitor: true,
210
+ networkMonitor: true,
211
+ processMonitor: true,
212
+ fileMonitor: false,
213
+ networkPollInterval: 5000,
214
+ processPollInterval: 5000,
215
+ },
216
+ actionPolicy: { autoRespond: 85, notifyAndWait: 50, logOnly: 0 },
217
+ notifications: {},
218
+ };
219
+ const configPath = path.join(dataDir, 'config.json');
220
+ await fs.writeFile(configPath, JSON.stringify(config, null, 2));
221
+ // Step 2: Run quick scan
222
+ let scanResult = null;
223
+ try {
224
+ scanResult = await runScan({ depth: 'quick', lang });
225
+ }
226
+ catch (err) {
227
+ logger.warn('Scan failed during deploy: ' + (err instanceof Error ? err.message : String(err)));
228
+ }
229
+ // Step 3: Generate initial report if requested
230
+ let reportPath = null;
231
+ if (generateReport && scanResult) {
232
+ try {
233
+ reportPath = path.join(dataDir, 'initial-report.pdf');
234
+ await generatePdfReport(scanResult, reportPath, lang);
235
+ }
236
+ catch (err) {
237
+ logger.warn('Report generation failed: ' + (err instanceof Error ? err.message : String(err)));
238
+ reportPath = null;
239
+ }
240
+ }
241
+ const criticalHighCount = scanResult
242
+ ? scanResult.findings.filter((f) => f.severity === 'critical' || f.severity === 'high').length
243
+ : 0;
244
+ return {
245
+ content: [
246
+ {
247
+ type: 'text',
248
+ text: JSON.stringify({
249
+ status: 'deployed',
250
+ steps: [
251
+ { step: 'init', status: 'complete', dataDir, configPath },
252
+ {
253
+ step: 'scan',
254
+ status: scanResult ? 'complete' : 'failed',
255
+ risk_score: scanResult?.riskScore ?? null,
256
+ findings: scanResult?.findings.length ?? null,
257
+ },
258
+ {
259
+ step: 'report',
260
+ status: reportPath ? 'complete' : generateReport ? 'failed' : 'skipped',
261
+ path: reportPath,
262
+ },
263
+ {
264
+ step: 'guard',
265
+ status: 'ready',
266
+ note: 'Use panguard_guard_start to start real-time monitoring',
267
+ },
268
+ ],
269
+ summary: scanResult
270
+ ? `Deployment complete! Risk score: ${scanResult.riskScore}/100. ${scanResult.findings.length} issues found.${reportPath ? ` Report: ${reportPath}` : ''}`
271
+ : 'Partial deployment. Scan failed but guard is ready to start.',
272
+ next_steps: [
273
+ 'Run panguard_guard_start to begin real-time threat monitoring',
274
+ criticalHighCount > 0
275
+ ? `Fix ${criticalHighCount} critical/high findings before switching to protection mode`
276
+ : 'System looks good! Consider switching mode to protection when ready.',
277
+ ],
278
+ }, null, 2),
279
+ },
280
+ ],
281
+ };
282
+ }
283
+ /**
284
+ * Convert a numeric risk score (0-100) to a letter grade (A-F).
285
+ * 將數字風險分數(0-100)轉換為字母等級(A-F)。
286
+ */
287
+ function scoreToGrade(score) {
288
+ const safety = 100 - score;
289
+ if (safety >= 90)
290
+ return 'A';
291
+ if (safety >= 75)
292
+ return 'B';
293
+ if (safety >= 60)
294
+ return 'C';
295
+ if (safety >= 40)
296
+ return 'D';
297
+ return 'F';
298
+ }
299
+ //# sourceMappingURL=manage-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manage-tools.js","sourceRoot":"","sources":["../../src/tools/manage-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Panguard MCP - Scan Tools
3
+ * Panguard MCP - 掃描工具
4
+ *
5
+ * Implements panguard_scan and panguard_scan_code MCP tools.
6
+ * 實作 panguard_scan 和 panguard_scan_code MCP 工具。
7
+ *
8
+ * @module @panguard-ai/panguard-mcp/tools/scan-tools
9
+ */
10
+ import { runScan, generatePdfReport } from '@panguard-ai/panguard-scan';
11
+ /**
12
+ * Execute panguard_scan — system security health check.
13
+ * 執行 panguard_scan — 系統安全健檢。
14
+ */
15
+ export declare function executeScan(args: Record<string, unknown>): Promise<{
16
+ content: {
17
+ type: "text";
18
+ text: string;
19
+ }[];
20
+ isError?: undefined;
21
+ } | {
22
+ content: {
23
+ type: "text";
24
+ text: string;
25
+ }[];
26
+ isError: boolean;
27
+ }>;
28
+ /**
29
+ * Execute panguard_scan_code — SAST source code scan.
30
+ * 執行 panguard_scan_code — SAST 原始碼掃描。
31
+ */
32
+ export declare function executeScanCode(args: Record<string, unknown>): Promise<{
33
+ content: {
34
+ type: "text";
35
+ text: string;
36
+ }[];
37
+ isError: boolean;
38
+ } | {
39
+ content: {
40
+ type: "text";
41
+ text: string;
42
+ }[];
43
+ isError?: undefined;
44
+ }>;
45
+ export { runScan, generatePdfReport };
46
+ //# sourceMappingURL=scan-tools.d.ts.map
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Panguard MCP - Scan Tools
3
+ * Panguard MCP - 掃描工具
4
+ *
5
+ * Implements panguard_scan and panguard_scan_code MCP tools.
6
+ * 實作 panguard_scan 和 panguard_scan_code MCP 工具。
7
+ *
8
+ * @module @panguard-ai/panguard-mcp/tools/scan-tools
9
+ */
10
+ import { runScan, generatePdfReport } from '@panguard-ai/panguard-scan';
11
+ /**
12
+ * Attempt to import SAST functions, graceful fallback if not yet exported.
13
+ * 嘗試匯入 SAST 函數,若尚未匯出則優雅地退回。
14
+ */
15
+ let checkSourceCode = null;
16
+ let checkHardcodedSecrets = null;
17
+ try {
18
+ const sast = await import('@panguard-ai/panguard-scan');
19
+ const module = sast;
20
+ if (typeof module['checkSourceCode'] === 'function') {
21
+ checkSourceCode = module['checkSourceCode'];
22
+ }
23
+ if (typeof module['checkHardcodedSecrets'] === 'function') {
24
+ checkHardcodedSecrets = module['checkHardcodedSecrets'];
25
+ }
26
+ }
27
+ catch {
28
+ // SAST not available yet — will use placeholder response
29
+ }
30
+ /**
31
+ * Convert a numeric risk score (0-100) to a letter grade (A-F).
32
+ * 將數字風險分數(0-100)轉換為字母等級(A-F)。
33
+ *
34
+ * The grade reflects security posture (inverse of risk):
35
+ * A = 90–100% safe, F = very high risk.
36
+ */
37
+ function scoreToGrade(score) {
38
+ const safety = 100 - score;
39
+ if (safety >= 90)
40
+ return 'A';
41
+ if (safety >= 75)
42
+ return 'B';
43
+ if (safety >= 60)
44
+ return 'C';
45
+ if (safety >= 40)
46
+ return 'D';
47
+ return 'F';
48
+ }
49
+ /**
50
+ * Execute panguard_scan — system security health check.
51
+ * 執行 panguard_scan — 系統安全健檢。
52
+ */
53
+ export async function executeScan(args) {
54
+ const depth = args['depth'] ?? 'quick';
55
+ const lang = args['lang'] ?? 'en';
56
+ try {
57
+ const result = await runScan({ depth, lang });
58
+ return {
59
+ content: [
60
+ {
61
+ type: 'text',
62
+ text: JSON.stringify({
63
+ risk_score: result.riskScore,
64
+ risk_level: result.riskLevel,
65
+ grade: scoreToGrade(result.riskScore),
66
+ findings_count: result.findings.length,
67
+ scan_duration_ms: result.scanDuration,
68
+ scanned_at: result.scannedAt,
69
+ findings: result.findings.slice(0, 20).map((f) => ({
70
+ id: f.id,
71
+ severity: f.severity,
72
+ title: f.title,
73
+ category: f.category,
74
+ remediation: f.remediation,
75
+ })),
76
+ summary: `Risk Score: ${result.riskScore}/100 (${result.riskLevel}). ${result.findings.length} findings detected.`,
77
+ }, null, 2),
78
+ },
79
+ ],
80
+ };
81
+ }
82
+ catch (err) {
83
+ const message = err instanceof Error ? err.message : String(err);
84
+ return {
85
+ content: [{ type: 'text', text: JSON.stringify({ error: message }) }],
86
+ isError: true,
87
+ };
88
+ }
89
+ }
90
+ /**
91
+ * Execute panguard_scan_code — SAST source code scan.
92
+ * 執行 panguard_scan_code — SAST 原始碼掃描。
93
+ */
94
+ export async function executeScanCode(args) {
95
+ const dir = args['dir'] ?? '.';
96
+ // If SAST functions are not available yet, return a clear message
97
+ if (!checkSourceCode && !checkHardcodedSecrets) {
98
+ return {
99
+ content: [
100
+ {
101
+ type: 'text',
102
+ text: JSON.stringify({
103
+ scan_type: 'sast',
104
+ target: dir,
105
+ status: 'unavailable',
106
+ message: 'SAST scanning (checkSourceCode / checkHardcodedSecrets) is not yet available in this build of @panguard-ai/panguard-scan. Please upgrade to the latest version.',
107
+ }, null, 2),
108
+ },
109
+ ],
110
+ isError: false,
111
+ };
112
+ }
113
+ try {
114
+ const [codeFindings, secretFindings] = await Promise.all([
115
+ checkSourceCode ? checkSourceCode(dir) : Promise.resolve([]),
116
+ checkHardcodedSecrets ? checkHardcodedSecrets(dir) : Promise.resolve([]),
117
+ ]);
118
+ const allFindings = [...codeFindings, ...secretFindings];
119
+ return {
120
+ content: [
121
+ {
122
+ type: 'text',
123
+ text: JSON.stringify({
124
+ scan_type: 'sast',
125
+ target: dir,
126
+ findings_count: allFindings.length,
127
+ critical: allFindings.filter((f) => f.severity === 'critical').length,
128
+ high: allFindings.filter((f) => f.severity === 'high').length,
129
+ medium: allFindings.filter((f) => f.severity === 'medium').length,
130
+ low: allFindings.filter((f) => f.severity === 'low').length,
131
+ findings: allFindings.map((f) => ({
132
+ id: f.id,
133
+ severity: f.severity,
134
+ title: f.title,
135
+ category: f.category,
136
+ description: f.description,
137
+ remediation: f.remediation,
138
+ details: f.details,
139
+ })),
140
+ summary: allFindings.length === 0
141
+ ? 'No security issues found in the code.'
142
+ : `Found ${allFindings.length} security issues (${allFindings.filter((f) => f.severity === 'critical').length} critical, ${allFindings.filter((f) => f.severity === 'high').length} high).`,
143
+ }, null, 2),
144
+ },
145
+ ],
146
+ };
147
+ }
148
+ catch (err) {
149
+ const message = err instanceof Error ? err.message : String(err);
150
+ return {
151
+ content: [{ type: 'text', text: JSON.stringify({ error: message }) }],
152
+ isError: true,
153
+ };
154
+ }
155
+ }
156
+ export { runScan, generatePdfReport };
157
+ //# sourceMappingURL=scan-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-tools.js","sourceRoot":"","sources":["../../src/tools/scan-tools.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@panguard-ai/panguard-mcp",
3
- "version": "1.3.0",
3
+ "version": "1.3.2",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -30,22 +30,23 @@
30
30
  "package.json",
31
31
  "README.md"
32
32
  ],
33
+ "scripts": {
34
+ "build": "tsc --build",
35
+ "clean": "rm -rf dist tsconfig.tsbuildinfo",
36
+ "typecheck": "tsc --noEmit",
37
+ "test": "vitest run",
38
+ "dev": "tsc --build --watch",
39
+ "prepublishOnly": "pnpm run build"
40
+ },
33
41
  "dependencies": {
34
42
  "@modelcontextprotocol/sdk": "^1.12.0",
35
- "@panguard-ai/core": "1.3.0",
36
- "@panguard-ai/panguard-scan": "1.3.0",
37
- "@panguard-ai/panguard-guard": "1.3.0",
38
- "@panguard-ai/panguard-skill-auditor": "1.3.1"
43
+ "@panguard-ai/core": "^1.3.2",
44
+ "@panguard-ai/panguard-scan": "^1.3.0",
45
+ "@panguard-ai/panguard-guard": "^1.4.2",
46
+ "@panguard-ai/panguard-skill-auditor": "^1.4.1"
39
47
  },
40
48
  "devDependencies": {
41
49
  "@types/node": "^22.14.0",
42
50
  "typescript": "~5.7.3"
43
- },
44
- "scripts": {
45
- "build": "tsc --build",
46
- "clean": "rm -rf dist tsconfig.tsbuildinfo",
47
- "typecheck": "tsc --noEmit",
48
- "test": "vitest run",
49
- "dev": "tsc --build --watch"
50
51
  }
51
- }
52
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025-2026 Panguard AI Team
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.