@goplus/agentguard 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 +242 -0
- package/dist/action/detectors/exec.d.ts +21 -0
- package/dist/action/detectors/exec.d.ts.map +1 -0
- package/dist/action/detectors/exec.js +201 -0
- package/dist/action/detectors/exec.js.map +1 -0
- package/dist/action/detectors/index.d.ts +4 -0
- package/dist/action/detectors/index.d.ts.map +1 -0
- package/dist/action/detectors/index.js +20 -0
- package/dist/action/detectors/index.js.map +1 -0
- package/dist/action/detectors/network.d.ts +21 -0
- package/dist/action/detectors/network.d.ts.map +1 -0
- package/dist/action/detectors/network.js +152 -0
- package/dist/action/detectors/network.js.map +1 -0
- package/dist/action/detectors/secret-leak.d.ts +28 -0
- package/dist/action/detectors/secret-leak.d.ts.map +1 -0
- package/dist/action/detectors/secret-leak.js +94 -0
- package/dist/action/detectors/secret-leak.js.map +1 -0
- package/dist/action/goplus/client.d.ts +151 -0
- package/dist/action/goplus/client.d.ts.map +1 -0
- package/dist/action/goplus/client.js +187 -0
- package/dist/action/goplus/client.js.map +1 -0
- package/dist/action/index.d.ts +61 -0
- package/dist/action/index.d.ts.map +1 -0
- package/dist/action/index.js +643 -0
- package/dist/action/index.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server.d.ts +3 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +410 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/policy/default.d.ts +77 -0
- package/dist/policy/default.d.ts.map +1 -0
- package/dist/policy/default.js +94 -0
- package/dist/policy/default.js.map +1 -0
- package/dist/registry/index.d.ts +93 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +280 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/storage.d.ts +69 -0
- package/dist/registry/storage.d.ts.map +1 -0
- package/dist/registry/storage.js +208 -0
- package/dist/registry/storage.js.map +1 -0
- package/dist/registry/trust.d.ts +41 -0
- package/dist/registry/trust.d.ts.map +1 -0
- package/dist/registry/trust.js +139 -0
- package/dist/registry/trust.js.map +1 -0
- package/dist/scanner/file-walker.d.ts +34 -0
- package/dist/scanner/file-walker.d.ts.map +1 -0
- package/dist/scanner/file-walker.js +134 -0
- package/dist/scanner/file-walker.js.map +1 -0
- package/dist/scanner/index.d.ts +67 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +349 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/rules/exfiltration.d.ts +6 -0
- package/dist/scanner/rules/exfiltration.d.ts.map +1 -0
- package/dist/scanner/rules/exfiltration.js +48 -0
- package/dist/scanner/rules/exfiltration.js.map +1 -0
- package/dist/scanner/rules/index.d.ts +18 -0
- package/dist/scanner/rules/index.d.ts.map +1 -0
- package/dist/scanner/rules/index.js +54 -0
- package/dist/scanner/rules/index.js.map +1 -0
- package/dist/scanner/rules/obfuscation.d.ts +6 -0
- package/dist/scanner/rules/obfuscation.d.ts.map +1 -0
- package/dist/scanner/rules/obfuscation.js +37 -0
- package/dist/scanner/rules/obfuscation.js.map +1 -0
- package/dist/scanner/rules/prompt-injection.d.ts +6 -0
- package/dist/scanner/rules/prompt-injection.d.ts.map +1 -0
- package/dist/scanner/rules/prompt-injection.js +38 -0
- package/dist/scanner/rules/prompt-injection.js.map +1 -0
- package/dist/scanner/rules/remote-loader.d.ts +6 -0
- package/dist/scanner/rules/remote-loader.d.ts.map +1 -0
- package/dist/scanner/rules/remote-loader.js +31 -0
- package/dist/scanner/rules/remote-loader.js.map +1 -0
- package/dist/scanner/rules/secrets.d.ts +6 -0
- package/dist/scanner/rules/secrets.d.ts.map +1 -0
- package/dist/scanner/rules/secrets.js +68 -0
- package/dist/scanner/rules/secrets.js.map +1 -0
- package/dist/scanner/rules/shell-exec.d.ts +6 -0
- package/dist/scanner/rules/shell-exec.d.ts.map +1 -0
- package/dist/scanner/rules/shell-exec.js +52 -0
- package/dist/scanner/rules/shell-exec.js.map +1 -0
- package/dist/scanner/rules/web3.d.ts +6 -0
- package/dist/scanner/rules/web3.d.ts.map +1 -0
- package/dist/scanner/rules/web3.js +139 -0
- package/dist/scanner/rules/web3.js.map +1 -0
- package/dist/tests/action.test.d.ts +2 -0
- package/dist/tests/action.test.d.ts.map +1 -0
- package/dist/tests/action.test.js +127 -0
- package/dist/tests/action.test.js.map +1 -0
- package/dist/tests/registry.test.d.ts +2 -0
- package/dist/tests/registry.test.d.ts.map +1 -0
- package/dist/tests/registry.test.js +109 -0
- package/dist/tests/registry.test.js.map +1 -0
- package/dist/tests/scanner.test.d.ts +2 -0
- package/dist/tests/scanner.test.d.ts.map +1 -0
- package/dist/tests/scanner.test.js +57 -0
- package/dist/tests/scanner.test.js.map +1 -0
- package/dist/types/action.d.ts +198 -0
- package/dist/types/action.d.ts.map +1 -0
- package/dist/types/action.js +3 -0
- package/dist/types/action.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +22 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/registry.d.ts +104 -0
- package/dist/types/registry.d.ts.map +1 -0
- package/dist/types/registry.js +21 -0
- package/dist/types/registry.js.map +1 -0
- package/dist/types/scanner.d.ts +88 -0
- package/dist/types/scanner.d.ts.map +1 -0
- package/dist/types/scanner.js +20 -0
- package/dist/types/scanner.js.map +1 -0
- package/dist/types/skill.d.ts +52 -0
- package/dist/types/skill.d.ts.map +1 -0
- package/dist/types/skill.js +33 -0
- package/dist/types/skill.js.map +1 -0
- package/dist/utils/hash.d.ts +21 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +112 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/patterns.d.ts +74 -0
- package/dist/utils/patterns.d.ts.map +1 -0
- package/dist/utils/patterns.js +157 -0
- package/dist/utils/patterns.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.RegistryStorage = void 0;
|
|
37
|
+
const fs = __importStar(require("fs/promises"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
/**
|
|
40
|
+
* Default registry data
|
|
41
|
+
*/
|
|
42
|
+
const DEFAULT_REGISTRY = {
|
|
43
|
+
version: 1,
|
|
44
|
+
updated_at: new Date().toISOString(),
|
|
45
|
+
records: [],
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* JSON-based storage for registry
|
|
49
|
+
*/
|
|
50
|
+
class RegistryStorage {
|
|
51
|
+
filePath;
|
|
52
|
+
data = null;
|
|
53
|
+
constructor(options = {}) {
|
|
54
|
+
this.filePath =
|
|
55
|
+
options.filePath ||
|
|
56
|
+
path.join(process.cwd(), 'data', 'registry.json');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Ensure data directory exists
|
|
60
|
+
*/
|
|
61
|
+
async ensureDirectory() {
|
|
62
|
+
const dir = path.dirname(this.filePath);
|
|
63
|
+
await fs.mkdir(dir, { recursive: true });
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Load registry data from file
|
|
67
|
+
*/
|
|
68
|
+
async load() {
|
|
69
|
+
if (this.data) {
|
|
70
|
+
return this.data;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const content = await fs.readFile(this.filePath, 'utf-8');
|
|
74
|
+
this.data = JSON.parse(content);
|
|
75
|
+
// Validate version
|
|
76
|
+
if (this.data.version !== 1) {
|
|
77
|
+
console.warn(`Unknown registry version: ${this.data.version}`);
|
|
78
|
+
}
|
|
79
|
+
return this.data;
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
if (err.code === 'ENOENT') {
|
|
83
|
+
// File doesn't exist, create default
|
|
84
|
+
this.data = { ...DEFAULT_REGISTRY };
|
|
85
|
+
await this.save();
|
|
86
|
+
return this.data;
|
|
87
|
+
}
|
|
88
|
+
throw err;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Save registry data to file
|
|
93
|
+
*/
|
|
94
|
+
async save() {
|
|
95
|
+
if (!this.data) {
|
|
96
|
+
throw new Error('No data to save');
|
|
97
|
+
}
|
|
98
|
+
await this.ensureDirectory();
|
|
99
|
+
this.data.updated_at = new Date().toISOString();
|
|
100
|
+
await fs.writeFile(this.filePath, JSON.stringify(this.data, null, 2), 'utf-8');
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get all records
|
|
104
|
+
*/
|
|
105
|
+
async getRecords() {
|
|
106
|
+
const data = await this.load();
|
|
107
|
+
return data.records;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Find record by key
|
|
111
|
+
*/
|
|
112
|
+
async findByKey(recordKey) {
|
|
113
|
+
const data = await this.load();
|
|
114
|
+
return data.records.find((r) => r.record_key === recordKey) || null;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Find records by source
|
|
118
|
+
*/
|
|
119
|
+
async findBySource(source) {
|
|
120
|
+
const data = await this.load();
|
|
121
|
+
return data.records.filter((r) => r.skill.source === source);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Add or update a record
|
|
125
|
+
*/
|
|
126
|
+
async upsert(record) {
|
|
127
|
+
const data = await this.load();
|
|
128
|
+
const existingIndex = data.records.findIndex((r) => r.record_key === record.record_key);
|
|
129
|
+
if (existingIndex >= 0) {
|
|
130
|
+
data.records[existingIndex] = record;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
data.records.push(record);
|
|
134
|
+
}
|
|
135
|
+
await this.save();
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Remove a record by key
|
|
139
|
+
*/
|
|
140
|
+
async remove(recordKey) {
|
|
141
|
+
const data = await this.load();
|
|
142
|
+
const initialLength = data.records.length;
|
|
143
|
+
data.records = data.records.filter((r) => r.record_key !== recordKey);
|
|
144
|
+
if (data.records.length < initialLength) {
|
|
145
|
+
await this.save();
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Update record status
|
|
152
|
+
*/
|
|
153
|
+
async updateStatus(recordKey, status) {
|
|
154
|
+
const record = await this.findByKey(recordKey);
|
|
155
|
+
if (!record) {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
record.status = status;
|
|
159
|
+
record.updated_at = new Date().toISOString();
|
|
160
|
+
await this.upsert(record);
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Export registry to JSON string
|
|
165
|
+
*/
|
|
166
|
+
async export() {
|
|
167
|
+
const data = await this.load();
|
|
168
|
+
return JSON.stringify(data, null, 2);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Import registry from JSON string
|
|
172
|
+
*/
|
|
173
|
+
async import(jsonData, merge = false) {
|
|
174
|
+
const importData = JSON.parse(jsonData);
|
|
175
|
+
if (merge) {
|
|
176
|
+
const data = await this.load();
|
|
177
|
+
// Merge records, preferring imported records for conflicts
|
|
178
|
+
const recordMap = new Map();
|
|
179
|
+
for (const record of data.records) {
|
|
180
|
+
recordMap.set(record.record_key, record);
|
|
181
|
+
}
|
|
182
|
+
for (const record of importData.records) {
|
|
183
|
+
recordMap.set(record.record_key, record);
|
|
184
|
+
}
|
|
185
|
+
data.records = Array.from(recordMap.values());
|
|
186
|
+
await this.save();
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
this.data = importData;
|
|
190
|
+
await this.save();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Clear all records
|
|
195
|
+
*/
|
|
196
|
+
async clear() {
|
|
197
|
+
this.data = { ...DEFAULT_REGISTRY };
|
|
198
|
+
await this.save();
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get registry file path
|
|
202
|
+
*/
|
|
203
|
+
getFilePath() {
|
|
204
|
+
return this.filePath;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
exports.RegistryStorage = RegistryStorage;
|
|
208
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/registry/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { TrustLevel, TrustRecord } from '../types/registry.js';
|
|
2
|
+
import type { SkillIdentity, CapabilityModel } from '../types/skill.js';
|
|
3
|
+
/**
|
|
4
|
+
* Trust level priorities (higher = more trusted)
|
|
5
|
+
*/
|
|
6
|
+
export declare const TRUST_PRIORITY: Record<TrustLevel, number>;
|
|
7
|
+
/**
|
|
8
|
+
* Check if a trust level change is an upgrade
|
|
9
|
+
*/
|
|
10
|
+
export declare function isTrustUpgrade(from: TrustLevel, to: TrustLevel): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Check if a trust level change is a downgrade
|
|
13
|
+
*/
|
|
14
|
+
export declare function isTrustDowngrade(from: TrustLevel, to: TrustLevel): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Determine if a skill needs re-evaluation based on identity changes
|
|
17
|
+
*/
|
|
18
|
+
export declare function needsReevaluation(existingRecord: TrustRecord, newSkill: SkillIdentity): {
|
|
19
|
+
needsReevaluation: boolean;
|
|
20
|
+
reason?: string;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Check if capabilities are being escalated
|
|
24
|
+
*/
|
|
25
|
+
export declare function isCapabilityEscalation(existing: CapabilityModel, requested: CapabilityModel): {
|
|
26
|
+
isEscalation: boolean;
|
|
27
|
+
escalations: string[];
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Create a new trust record
|
|
31
|
+
*/
|
|
32
|
+
export declare function createTrustRecord(skill: SkillIdentity, trustLevel: TrustLevel, capabilities: CapabilityModel, review: {
|
|
33
|
+
reviewed_by: string;
|
|
34
|
+
evidence_refs: string[];
|
|
35
|
+
notes: string;
|
|
36
|
+
}, expiresAt?: string): TrustRecord;
|
|
37
|
+
/**
|
|
38
|
+
* Merge capabilities (take the more restrictive option)
|
|
39
|
+
*/
|
|
40
|
+
export declare function mergeCapabilities(a: CapabilityModel, b: CapabilityModel): CapabilityModel;
|
|
41
|
+
//# sourceMappingURL=trust.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust.d.ts","sourceRoot":"","sources":["../../src/registry/trust.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGxE;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAIrD,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAExE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAE1E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,cAAc,EAAE,WAAW,EAC3B,QAAQ,EAAE,aAAa,GACtB;IACD,iBAAiB,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAkBA;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,eAAe,EACzB,SAAS,EAAE,eAAe,GACzB;IACD,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CA2DA;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,eAAe,EAC7B,MAAM,EAAE;IACN,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf,EACD,SAAS,CAAC,EAAE,MAAM,GACjB,WAAW,CAiBb;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,eAAe,EAClB,CAAC,EAAE,eAAe,GACjB,eAAe,CA+BjB"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TRUST_PRIORITY = void 0;
|
|
4
|
+
exports.isTrustUpgrade = isTrustUpgrade;
|
|
5
|
+
exports.isTrustDowngrade = isTrustDowngrade;
|
|
6
|
+
exports.needsReevaluation = needsReevaluation;
|
|
7
|
+
exports.isCapabilityEscalation = isCapabilityEscalation;
|
|
8
|
+
exports.createTrustRecord = createTrustRecord;
|
|
9
|
+
exports.mergeCapabilities = mergeCapabilities;
|
|
10
|
+
const skill_js_1 = require("../types/skill.js");
|
|
11
|
+
/**
|
|
12
|
+
* Trust level priorities (higher = more trusted)
|
|
13
|
+
*/
|
|
14
|
+
exports.TRUST_PRIORITY = {
|
|
15
|
+
untrusted: 0,
|
|
16
|
+
restricted: 1,
|
|
17
|
+
trusted: 2,
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Check if a trust level change is an upgrade
|
|
21
|
+
*/
|
|
22
|
+
function isTrustUpgrade(from, to) {
|
|
23
|
+
return exports.TRUST_PRIORITY[to] > exports.TRUST_PRIORITY[from];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Check if a trust level change is a downgrade
|
|
27
|
+
*/
|
|
28
|
+
function isTrustDowngrade(from, to) {
|
|
29
|
+
return exports.TRUST_PRIORITY[to] < exports.TRUST_PRIORITY[from];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Determine if a skill needs re-evaluation based on identity changes
|
|
33
|
+
*/
|
|
34
|
+
function needsReevaluation(existingRecord, newSkill) {
|
|
35
|
+
// Hash change = definitely needs re-evaluation
|
|
36
|
+
if (existingRecord.skill.artifact_hash !== newSkill.artifact_hash) {
|
|
37
|
+
return {
|
|
38
|
+
needsReevaluation: true,
|
|
39
|
+
reason: 'artifact_hash_changed',
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// Version change (but same hash is fine, unlikely but possible)
|
|
43
|
+
if (existingRecord.skill.version_ref !== newSkill.version_ref) {
|
|
44
|
+
return {
|
|
45
|
+
needsReevaluation: true,
|
|
46
|
+
reason: 'version_changed',
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return { needsReevaluation: false };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if capabilities are being escalated
|
|
53
|
+
*/
|
|
54
|
+
function isCapabilityEscalation(existing, requested) {
|
|
55
|
+
const escalations = [];
|
|
56
|
+
// Check exec permission
|
|
57
|
+
if (existing.exec === 'deny' && requested.exec === 'allow') {
|
|
58
|
+
escalations.push('exec: deny -> allow');
|
|
59
|
+
}
|
|
60
|
+
// Check network allowlist expansion
|
|
61
|
+
const newNetworkDomains = requested.network_allowlist.filter((d) => !existing.network_allowlist.includes(d));
|
|
62
|
+
if (newNetworkDomains.length > 0) {
|
|
63
|
+
escalations.push(`network_allowlist: added ${newNetworkDomains.join(', ')}`);
|
|
64
|
+
}
|
|
65
|
+
// Check filesystem allowlist expansion
|
|
66
|
+
const newFilePaths = requested.filesystem_allowlist.filter((p) => !existing.filesystem_allowlist.includes(p));
|
|
67
|
+
if (newFilePaths.length > 0) {
|
|
68
|
+
escalations.push(`filesystem_allowlist: added ${newFilePaths.join(', ')}`);
|
|
69
|
+
}
|
|
70
|
+
// Check secrets allowlist expansion
|
|
71
|
+
const newSecrets = requested.secrets_allowlist.filter((s) => !existing.secrets_allowlist.includes(s));
|
|
72
|
+
if (newSecrets.length > 0) {
|
|
73
|
+
escalations.push(`secrets_allowlist: added ${newSecrets.join(', ')}`);
|
|
74
|
+
}
|
|
75
|
+
// Check Web3 capabilities
|
|
76
|
+
if (requested.web3 && existing.web3) {
|
|
77
|
+
const newChains = requested.web3.chains_allowlist.filter((c) => !existing.web3.chains_allowlist.includes(c));
|
|
78
|
+
if (newChains.length > 0) {
|
|
79
|
+
escalations.push(`web3.chains_allowlist: added ${newChains.join(', ')}`);
|
|
80
|
+
}
|
|
81
|
+
// Check tx_policy
|
|
82
|
+
const txPolicyPriority = { deny: 0, confirm_high_risk: 1, allow: 2 };
|
|
83
|
+
if (txPolicyPriority[requested.web3.tx_policy] >
|
|
84
|
+
txPolicyPriority[existing.web3.tx_policy]) {
|
|
85
|
+
escalations.push(`web3.tx_policy: ${existing.web3.tx_policy} -> ${requested.web3.tx_policy}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else if (requested.web3 && !existing.web3) {
|
|
89
|
+
escalations.push('web3: added');
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
isEscalation: escalations.length > 0,
|
|
93
|
+
escalations,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Create a new trust record
|
|
98
|
+
*/
|
|
99
|
+
function createTrustRecord(skill, trustLevel, capabilities, review, expiresAt) {
|
|
100
|
+
const now = new Date().toISOString();
|
|
101
|
+
return {
|
|
102
|
+
record_key: (0, skill_js_1.generateRecordKey)(skill),
|
|
103
|
+
skill,
|
|
104
|
+
trust_level: trustLevel,
|
|
105
|
+
capabilities,
|
|
106
|
+
expires_at: expiresAt,
|
|
107
|
+
review: {
|
|
108
|
+
...review,
|
|
109
|
+
reviewed_at: now,
|
|
110
|
+
},
|
|
111
|
+
status: 'active',
|
|
112
|
+
created_at: now,
|
|
113
|
+
updated_at: now,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Merge capabilities (take the more restrictive option)
|
|
118
|
+
*/
|
|
119
|
+
function mergeCapabilities(a, b) {
|
|
120
|
+
return {
|
|
121
|
+
network_allowlist: a.network_allowlist.filter((d) => b.network_allowlist.includes(d)),
|
|
122
|
+
filesystem_allowlist: a.filesystem_allowlist.filter((p) => b.filesystem_allowlist.includes(p)),
|
|
123
|
+
exec: a.exec === 'deny' || b.exec === 'deny' ? 'deny' : 'allow',
|
|
124
|
+
secrets_allowlist: a.secrets_allowlist.filter((s) => b.secrets_allowlist.includes(s)),
|
|
125
|
+
web3: a.web3 && b.web3
|
|
126
|
+
? {
|
|
127
|
+
chains_allowlist: a.web3.chains_allowlist.filter((c) => b.web3.chains_allowlist.includes(c)),
|
|
128
|
+
rpc_allowlist: a.web3.rpc_allowlist.filter((r) => b.web3.rpc_allowlist.includes(r)),
|
|
129
|
+
tx_policy: a.web3.tx_policy === 'deny' || b.web3.tx_policy === 'deny'
|
|
130
|
+
? 'deny'
|
|
131
|
+
: a.web3.tx_policy === 'confirm_high_risk' ||
|
|
132
|
+
b.web3.tx_policy === 'confirm_high_risk'
|
|
133
|
+
? 'confirm_high_risk'
|
|
134
|
+
: 'allow',
|
|
135
|
+
}
|
|
136
|
+
: undefined,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=trust.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust.js","sourceRoot":"","sources":["../../src/registry/trust.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File info for scanning
|
|
3
|
+
*/
|
|
4
|
+
export interface FileInfo {
|
|
5
|
+
/** Absolute path */
|
|
6
|
+
path: string;
|
|
7
|
+
/** Relative path from root */
|
|
8
|
+
relativePath: string;
|
|
9
|
+
/** File content */
|
|
10
|
+
content: string;
|
|
11
|
+
/** File extension */
|
|
12
|
+
extension: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Supported file extensions for scanning
|
|
16
|
+
*/
|
|
17
|
+
export declare const SCANNABLE_EXTENSIONS: string[];
|
|
18
|
+
/**
|
|
19
|
+
* Files to skip
|
|
20
|
+
*/
|
|
21
|
+
export declare const SKIP_PATTERNS: string[];
|
|
22
|
+
/**
|
|
23
|
+
* Walk directory and collect scannable files
|
|
24
|
+
*/
|
|
25
|
+
export declare function walkDirectory(rootDir: string): Promise<FileInfo[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a path is a directory
|
|
28
|
+
*/
|
|
29
|
+
export declare function isDirectory(dirPath: string): Promise<boolean>;
|
|
30
|
+
/**
|
|
31
|
+
* Check if a path exists
|
|
32
|
+
*/
|
|
33
|
+
export declare function pathExists(p: string): Promise<boolean>;
|
|
34
|
+
//# sourceMappingURL=file-walker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-walker.d.ts","sourceRoot":"","sources":["../../src/scanner/file-walker.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,UAahC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,UAWzB,CAAC;AAEF;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAmCxE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO5D"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.SKIP_PATTERNS = exports.SCANNABLE_EXTENSIONS = void 0;
|
|
37
|
+
exports.walkDirectory = walkDirectory;
|
|
38
|
+
exports.isDirectory = isDirectory;
|
|
39
|
+
exports.pathExists = pathExists;
|
|
40
|
+
const glob_1 = require("glob");
|
|
41
|
+
const fs = __importStar(require("fs/promises"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
/**
|
|
44
|
+
* Supported file extensions for scanning
|
|
45
|
+
*/
|
|
46
|
+
exports.SCANNABLE_EXTENSIONS = [
|
|
47
|
+
// JavaScript/TypeScript
|
|
48
|
+
'.js', '.ts', '.jsx', '.tsx', '.mjs', '.cjs',
|
|
49
|
+
// Python
|
|
50
|
+
'.py',
|
|
51
|
+
// Configuration
|
|
52
|
+
'.json', '.yaml', '.yml', '.toml',
|
|
53
|
+
// Solidity
|
|
54
|
+
'.sol',
|
|
55
|
+
// Shell
|
|
56
|
+
'.sh', '.bash',
|
|
57
|
+
// Markdown (for prompt injection)
|
|
58
|
+
'.md',
|
|
59
|
+
];
|
|
60
|
+
/**
|
|
61
|
+
* Files to skip
|
|
62
|
+
*/
|
|
63
|
+
exports.SKIP_PATTERNS = [
|
|
64
|
+
'**/node_modules/**',
|
|
65
|
+
'**/dist/**',
|
|
66
|
+
'**/build/**',
|
|
67
|
+
'**/.git/**',
|
|
68
|
+
'**/coverage/**',
|
|
69
|
+
'**/__pycache__/**',
|
|
70
|
+
'**/*.min.js',
|
|
71
|
+
'**/package-lock.json',
|
|
72
|
+
'**/yarn.lock',
|
|
73
|
+
'**/pnpm-lock.yaml',
|
|
74
|
+
];
|
|
75
|
+
/**
|
|
76
|
+
* Walk directory and collect scannable files
|
|
77
|
+
*/
|
|
78
|
+
async function walkDirectory(rootDir) {
|
|
79
|
+
const files = [];
|
|
80
|
+
// Build glob pattern for all scannable extensions
|
|
81
|
+
const extensions = exports.SCANNABLE_EXTENSIONS.map(e => e.slice(1)).join(',');
|
|
82
|
+
const pattern = `**/*.{${extensions}}`;
|
|
83
|
+
// Find all matching files
|
|
84
|
+
const matches = await (0, glob_1.glob)(pattern, {
|
|
85
|
+
cwd: rootDir,
|
|
86
|
+
ignore: exports.SKIP_PATTERNS,
|
|
87
|
+
nodir: true,
|
|
88
|
+
absolute: true,
|
|
89
|
+
});
|
|
90
|
+
// Read file contents
|
|
91
|
+
for (const filePath of matches) {
|
|
92
|
+
try {
|
|
93
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
94
|
+
const relativePath = path.relative(rootDir, filePath);
|
|
95
|
+
const extension = path.extname(filePath);
|
|
96
|
+
files.push({
|
|
97
|
+
path: filePath,
|
|
98
|
+
relativePath,
|
|
99
|
+
content,
|
|
100
|
+
extension,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
// Skip unreadable files
|
|
105
|
+
console.warn(`Failed to read file: ${filePath}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return files;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Check if a path is a directory
|
|
112
|
+
*/
|
|
113
|
+
async function isDirectory(dirPath) {
|
|
114
|
+
try {
|
|
115
|
+
const stat = await fs.stat(dirPath);
|
|
116
|
+
return stat.isDirectory();
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Check if a path exists
|
|
124
|
+
*/
|
|
125
|
+
async function pathExists(p) {
|
|
126
|
+
try {
|
|
127
|
+
await fs.access(p);
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=file-walker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-walker.js","sourceRoot":"","sources":["../../src/scanner/file-walker.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDA,sCAmCC;AAKD,kCAOC;AAKD,gCAOC;AAlHD,+BAA4B;AAC5B,gDAAkC;AAClC,2CAA6B;AAgB7B;;GAEG;AACU,QAAA,oBAAoB,GAAG;IAClC,wBAAwB;IACxB,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAC5C,SAAS;IACT,KAAK;IACL,gBAAgB;IAChB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO;IACjC,WAAW;IACX,MAAM;IACN,QAAQ;IACR,KAAK,EAAE,OAAO;IACd,kCAAkC;IAClC,KAAK;CACN,CAAC;AAEF;;GAEG;AACU,QAAA,aAAa,GAAG;IAC3B,oBAAoB;IACpB,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,gBAAgB;IAChB,mBAAmB;IACnB,aAAa;IACb,sBAAsB;IACtB,cAAc;IACd,mBAAmB;CACpB,CAAC;AAEF;;GAEG;AACI,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,KAAK,GAAe,EAAE,CAAC;IAE7B,kDAAkD;IAClD,MAAM,UAAU,GAAG,4BAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,SAAS,UAAU,GAAG,CAAC;IAEvC,0BAA0B;IAC1B,MAAM,OAAO,GAAG,MAAM,IAAA,WAAI,EAAC,OAAO,EAAE;QAClC,GAAG,EAAE,OAAO;QACZ,MAAM,EAAE,qBAAa;QACrB,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,qBAAqB;IACrB,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAEzC,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,QAAQ;gBACd,YAAY;gBACZ,OAAO;gBACP,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,wBAAwB;YACxB,OAAO,CAAC,IAAI,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,WAAW,CAAC,OAAe;IAC/C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,UAAU,CAAC,CAAS;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { ScanPayload, ScanResult, RiskLevel, RiskTag, ScanRule } from '../types/scanner.js';
|
|
2
|
+
/**
|
|
3
|
+
* Scanner options
|
|
4
|
+
*/
|
|
5
|
+
export interface ScannerOptions {
|
|
6
|
+
/** Use cisco-ai-defense/skill-scanner if available */
|
|
7
|
+
useExternalScanner?: boolean;
|
|
8
|
+
/** Enable deep analysis */
|
|
9
|
+
deep?: boolean;
|
|
10
|
+
/** Custom rules to add */
|
|
11
|
+
additionalRules?: ScanRule[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Skill Scanner - Module A
|
|
15
|
+
* Scans skill code for security risks
|
|
16
|
+
*/
|
|
17
|
+
export declare class SkillScanner {
|
|
18
|
+
private options;
|
|
19
|
+
private externalScannerAvailable;
|
|
20
|
+
constructor(options?: ScannerOptions);
|
|
21
|
+
/**
|
|
22
|
+
* Check if cisco-ai-defense/skill-scanner is installed
|
|
23
|
+
*/
|
|
24
|
+
private checkExternalScanner;
|
|
25
|
+
/**
|
|
26
|
+
* Run external skill-scanner CLI
|
|
27
|
+
*/
|
|
28
|
+
private runExternalScanner;
|
|
29
|
+
/**
|
|
30
|
+
* Parse external skill-scanner JSON output
|
|
31
|
+
*/
|
|
32
|
+
private parseExternalResult;
|
|
33
|
+
/**
|
|
34
|
+
* Map external finding type to our risk tags
|
|
35
|
+
*/
|
|
36
|
+
private mapExternalFindingToTag;
|
|
37
|
+
/**
|
|
38
|
+
* Run built-in scanner
|
|
39
|
+
*/
|
|
40
|
+
private runBuiltinScanner;
|
|
41
|
+
/**
|
|
42
|
+
* Calculate risk level from tags
|
|
43
|
+
*/
|
|
44
|
+
private calculateRiskLevel;
|
|
45
|
+
/**
|
|
46
|
+
* Generate human-readable summary
|
|
47
|
+
*/
|
|
48
|
+
private generateSummary;
|
|
49
|
+
/**
|
|
50
|
+
* Calculate artifact hash for a directory
|
|
51
|
+
*/
|
|
52
|
+
calculateArtifactHash(dirPath: string): Promise<string>;
|
|
53
|
+
/**
|
|
54
|
+
* Main scan method
|
|
55
|
+
*/
|
|
56
|
+
scan(payload: ScanPayload): Promise<ScanResult>;
|
|
57
|
+
/**
|
|
58
|
+
* Quick scan - scan and return basic info
|
|
59
|
+
*/
|
|
60
|
+
quickScan(dirPath: string): Promise<{
|
|
61
|
+
risk_level: RiskLevel;
|
|
62
|
+
risk_tags: RiskTag[];
|
|
63
|
+
summary: string;
|
|
64
|
+
}>;
|
|
65
|
+
}
|
|
66
|
+
export declare const scanner: SkillScanner;
|
|
67
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EAEV,SAAS,EACT,OAAO,EACP,QAAQ,EACT,MAAM,qBAAqB,CAAC;AAK7B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,sDAAsD;IACtD,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,2BAA2B;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0BAA0B;IAC1B,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC;CAC9B;AAED;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,wBAAwB,CAAwB;gBAE5C,OAAO,GAAE,cAAmB;IAQxC;;OAEG;YACW,oBAAoB;IAuBlC;;OAEG;YACW,kBAAkB;IA+ChC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA8C3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAqB/B;;OAEG;YACW,iBAAiB;IAqD/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,eAAe;IA0BvB;;OAEG;IACG,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAe7D;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAqCrD;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QACxC,UAAU,EAAE,SAAS,CAAC;QACtB,SAAS,EAAE,OAAO,EAAE,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CAoBH;AAGD,eAAO,MAAM,OAAO,cAAqB,CAAC"}
|