@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.
Files changed (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +242 -0
  3. package/dist/action/detectors/exec.d.ts +21 -0
  4. package/dist/action/detectors/exec.d.ts.map +1 -0
  5. package/dist/action/detectors/exec.js +201 -0
  6. package/dist/action/detectors/exec.js.map +1 -0
  7. package/dist/action/detectors/index.d.ts +4 -0
  8. package/dist/action/detectors/index.d.ts.map +1 -0
  9. package/dist/action/detectors/index.js +20 -0
  10. package/dist/action/detectors/index.js.map +1 -0
  11. package/dist/action/detectors/network.d.ts +21 -0
  12. package/dist/action/detectors/network.d.ts.map +1 -0
  13. package/dist/action/detectors/network.js +152 -0
  14. package/dist/action/detectors/network.js.map +1 -0
  15. package/dist/action/detectors/secret-leak.d.ts +28 -0
  16. package/dist/action/detectors/secret-leak.d.ts.map +1 -0
  17. package/dist/action/detectors/secret-leak.js +94 -0
  18. package/dist/action/detectors/secret-leak.js.map +1 -0
  19. package/dist/action/goplus/client.d.ts +151 -0
  20. package/dist/action/goplus/client.d.ts.map +1 -0
  21. package/dist/action/goplus/client.js +187 -0
  22. package/dist/action/goplus/client.js.map +1 -0
  23. package/dist/action/index.d.ts +61 -0
  24. package/dist/action/index.d.ts.map +1 -0
  25. package/dist/action/index.js +643 -0
  26. package/dist/action/index.js.map +1 -0
  27. package/dist/index.d.ts +31 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +77 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/mcp-server.d.ts +3 -0
  32. package/dist/mcp-server.d.ts.map +1 -0
  33. package/dist/mcp-server.js +410 -0
  34. package/dist/mcp-server.js.map +1 -0
  35. package/dist/policy/default.d.ts +77 -0
  36. package/dist/policy/default.d.ts.map +1 -0
  37. package/dist/policy/default.js +94 -0
  38. package/dist/policy/default.js.map +1 -0
  39. package/dist/registry/index.d.ts +93 -0
  40. package/dist/registry/index.d.ts.map +1 -0
  41. package/dist/registry/index.js +280 -0
  42. package/dist/registry/index.js.map +1 -0
  43. package/dist/registry/storage.d.ts +69 -0
  44. package/dist/registry/storage.d.ts.map +1 -0
  45. package/dist/registry/storage.js +208 -0
  46. package/dist/registry/storage.js.map +1 -0
  47. package/dist/registry/trust.d.ts +41 -0
  48. package/dist/registry/trust.d.ts.map +1 -0
  49. package/dist/registry/trust.js +139 -0
  50. package/dist/registry/trust.js.map +1 -0
  51. package/dist/scanner/file-walker.d.ts +34 -0
  52. package/dist/scanner/file-walker.d.ts.map +1 -0
  53. package/dist/scanner/file-walker.js +134 -0
  54. package/dist/scanner/file-walker.js.map +1 -0
  55. package/dist/scanner/index.d.ts +67 -0
  56. package/dist/scanner/index.d.ts.map +1 -0
  57. package/dist/scanner/index.js +349 -0
  58. package/dist/scanner/index.js.map +1 -0
  59. package/dist/scanner/rules/exfiltration.d.ts +6 -0
  60. package/dist/scanner/rules/exfiltration.d.ts.map +1 -0
  61. package/dist/scanner/rules/exfiltration.js +48 -0
  62. package/dist/scanner/rules/exfiltration.js.map +1 -0
  63. package/dist/scanner/rules/index.d.ts +18 -0
  64. package/dist/scanner/rules/index.d.ts.map +1 -0
  65. package/dist/scanner/rules/index.js +54 -0
  66. package/dist/scanner/rules/index.js.map +1 -0
  67. package/dist/scanner/rules/obfuscation.d.ts +6 -0
  68. package/dist/scanner/rules/obfuscation.d.ts.map +1 -0
  69. package/dist/scanner/rules/obfuscation.js +37 -0
  70. package/dist/scanner/rules/obfuscation.js.map +1 -0
  71. package/dist/scanner/rules/prompt-injection.d.ts +6 -0
  72. package/dist/scanner/rules/prompt-injection.d.ts.map +1 -0
  73. package/dist/scanner/rules/prompt-injection.js +38 -0
  74. package/dist/scanner/rules/prompt-injection.js.map +1 -0
  75. package/dist/scanner/rules/remote-loader.d.ts +6 -0
  76. package/dist/scanner/rules/remote-loader.d.ts.map +1 -0
  77. package/dist/scanner/rules/remote-loader.js +31 -0
  78. package/dist/scanner/rules/remote-loader.js.map +1 -0
  79. package/dist/scanner/rules/secrets.d.ts +6 -0
  80. package/dist/scanner/rules/secrets.d.ts.map +1 -0
  81. package/dist/scanner/rules/secrets.js +68 -0
  82. package/dist/scanner/rules/secrets.js.map +1 -0
  83. package/dist/scanner/rules/shell-exec.d.ts +6 -0
  84. package/dist/scanner/rules/shell-exec.d.ts.map +1 -0
  85. package/dist/scanner/rules/shell-exec.js +52 -0
  86. package/dist/scanner/rules/shell-exec.js.map +1 -0
  87. package/dist/scanner/rules/web3.d.ts +6 -0
  88. package/dist/scanner/rules/web3.d.ts.map +1 -0
  89. package/dist/scanner/rules/web3.js +139 -0
  90. package/dist/scanner/rules/web3.js.map +1 -0
  91. package/dist/tests/action.test.d.ts +2 -0
  92. package/dist/tests/action.test.d.ts.map +1 -0
  93. package/dist/tests/action.test.js +127 -0
  94. package/dist/tests/action.test.js.map +1 -0
  95. package/dist/tests/registry.test.d.ts +2 -0
  96. package/dist/tests/registry.test.d.ts.map +1 -0
  97. package/dist/tests/registry.test.js +109 -0
  98. package/dist/tests/registry.test.js.map +1 -0
  99. package/dist/tests/scanner.test.d.ts +2 -0
  100. package/dist/tests/scanner.test.d.ts.map +1 -0
  101. package/dist/tests/scanner.test.js +57 -0
  102. package/dist/tests/scanner.test.js.map +1 -0
  103. package/dist/types/action.d.ts +198 -0
  104. package/dist/types/action.d.ts.map +1 -0
  105. package/dist/types/action.js +3 -0
  106. package/dist/types/action.js.map +1 -0
  107. package/dist/types/index.d.ts +5 -0
  108. package/dist/types/index.d.ts.map +1 -0
  109. package/dist/types/index.js +22 -0
  110. package/dist/types/index.js.map +1 -0
  111. package/dist/types/registry.d.ts +104 -0
  112. package/dist/types/registry.d.ts.map +1 -0
  113. package/dist/types/registry.js +21 -0
  114. package/dist/types/registry.js.map +1 -0
  115. package/dist/types/scanner.d.ts +88 -0
  116. package/dist/types/scanner.d.ts.map +1 -0
  117. package/dist/types/scanner.js +20 -0
  118. package/dist/types/scanner.js.map +1 -0
  119. package/dist/types/skill.d.ts +52 -0
  120. package/dist/types/skill.d.ts.map +1 -0
  121. package/dist/types/skill.js +33 -0
  122. package/dist/types/skill.js.map +1 -0
  123. package/dist/utils/hash.d.ts +21 -0
  124. package/dist/utils/hash.d.ts.map +1 -0
  125. package/dist/utils/hash.js +112 -0
  126. package/dist/utils/hash.js.map +1 -0
  127. package/dist/utils/patterns.d.ts +74 -0
  128. package/dist/utils/patterns.d.ts.map +1 -0
  129. package/dist/utils/patterns.js +157 -0
  130. package/dist/utils/patterns.js.map +1 -0
  131. 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"}