hackmyagent 0.11.13 → 0.11.15

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 (127) hide show
  1. package/README.md +26 -3
  2. package/dist/attack-engine/feedback-loop.d.ts +36 -0
  3. package/dist/attack-engine/feedback-loop.d.ts.map +1 -0
  4. package/dist/attack-engine/feedback-loop.js +261 -0
  5. package/dist/attack-engine/feedback-loop.js.map +1 -0
  6. package/dist/attack-engine/index.d.ts +13 -0
  7. package/dist/attack-engine/index.d.ts.map +1 -0
  8. package/dist/attack-engine/index.js +21 -0
  9. package/dist/attack-engine/index.js.map +1 -0
  10. package/dist/attack-engine/payload-generator.d.ts +21 -0
  11. package/dist/attack-engine/payload-generator.d.ts.map +1 -0
  12. package/dist/attack-engine/payload-generator.js +210 -0
  13. package/dist/attack-engine/payload-generator.js.map +1 -0
  14. package/dist/attack-engine/target-reader.d.ts +15 -0
  15. package/dist/attack-engine/target-reader.d.ts.map +1 -0
  16. package/dist/attack-engine/target-reader.js +152 -0
  17. package/dist/attack-engine/target-reader.js.map +1 -0
  18. package/dist/attack-engine/training-pipeline.d.ts +57 -0
  19. package/dist/attack-engine/training-pipeline.d.ts.map +1 -0
  20. package/dist/attack-engine/training-pipeline.js +146 -0
  21. package/dist/attack-engine/training-pipeline.js.map +1 -0
  22. package/dist/attack-engine/types.d.ts +133 -0
  23. package/dist/attack-engine/types.d.ts.map +1 -0
  24. package/dist/attack-engine/types.js +22 -0
  25. package/dist/attack-engine/types.js.map +1 -0
  26. package/dist/cli.js +248 -15
  27. package/dist/cli.js.map +1 -1
  28. package/dist/index.d.ts +1 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +9 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/nanomind-core/analyzers/capability-analyzer.d.ts +40 -0
  33. package/dist/nanomind-core/analyzers/capability-analyzer.d.ts.map +1 -0
  34. package/dist/nanomind-core/analyzers/capability-analyzer.js +310 -0
  35. package/dist/nanomind-core/analyzers/capability-analyzer.js.map +1 -0
  36. package/dist/nanomind-core/analyzers/code-analyzer.d.ts +21 -0
  37. package/dist/nanomind-core/analyzers/code-analyzer.d.ts.map +1 -0
  38. package/dist/nanomind-core/analyzers/code-analyzer.js +350 -0
  39. package/dist/nanomind-core/analyzers/code-analyzer.js.map +1 -0
  40. package/dist/nanomind-core/analyzers/credential-analyzer.d.ts +20 -0
  41. package/dist/nanomind-core/analyzers/credential-analyzer.d.ts.map +1 -0
  42. package/dist/nanomind-core/analyzers/credential-analyzer.js +317 -0
  43. package/dist/nanomind-core/analyzers/credential-analyzer.js.map +1 -0
  44. package/dist/nanomind-core/analyzers/governance-analyzer.d.ts +22 -0
  45. package/dist/nanomind-core/analyzers/governance-analyzer.d.ts.map +1 -0
  46. package/dist/nanomind-core/analyzers/governance-analyzer.js +393 -0
  47. package/dist/nanomind-core/analyzers/governance-analyzer.js.map +1 -0
  48. package/dist/nanomind-core/analyzers/prompt-analyzer.d.ts +22 -0
  49. package/dist/nanomind-core/analyzers/prompt-analyzer.d.ts.map +1 -0
  50. package/dist/nanomind-core/analyzers/prompt-analyzer.js +486 -0
  51. package/dist/nanomind-core/analyzers/prompt-analyzer.js.map +1 -0
  52. package/dist/nanomind-core/analyzers/scope-analyzer.d.ts +20 -0
  53. package/dist/nanomind-core/analyzers/scope-analyzer.d.ts.map +1 -0
  54. package/dist/nanomind-core/analyzers/scope-analyzer.js +326 -0
  55. package/dist/nanomind-core/analyzers/scope-analyzer.js.map +1 -0
  56. package/dist/nanomind-core/compiler/semantic-compiler.d.ts +41 -0
  57. package/dist/nanomind-core/compiler/semantic-compiler.d.ts.map +1 -0
  58. package/dist/nanomind-core/compiler/semantic-compiler.js +490 -0
  59. package/dist/nanomind-core/compiler/semantic-compiler.js.map +1 -0
  60. package/dist/nanomind-core/index.d.ts +30 -0
  61. package/dist/nanomind-core/index.d.ts.map +1 -0
  62. package/dist/nanomind-core/index.js +45 -0
  63. package/dist/nanomind-core/index.js.map +1 -0
  64. package/dist/nanomind-core/ingestion/artifact-parser.d.ts +48 -0
  65. package/dist/nanomind-core/ingestion/artifact-parser.d.ts.map +1 -0
  66. package/dist/nanomind-core/ingestion/artifact-parser.js +203 -0
  67. package/dist/nanomind-core/ingestion/artifact-parser.js.map +1 -0
  68. package/dist/nanomind-core/ingestion/input-sanitizer.d.ts +49 -0
  69. package/dist/nanomind-core/ingestion/input-sanitizer.d.ts.map +1 -0
  70. package/dist/nanomind-core/ingestion/input-sanitizer.js +80 -0
  71. package/dist/nanomind-core/ingestion/input-sanitizer.js.map +1 -0
  72. package/dist/nanomind-core/scanner-bridge.d.ts +49 -0
  73. package/dist/nanomind-core/scanner-bridge.d.ts.map +1 -0
  74. package/dist/nanomind-core/scanner-bridge.js +317 -0
  75. package/dist/nanomind-core/scanner-bridge.js.map +1 -0
  76. package/dist/nanomind-core/security/defense-in-depth.d.ts +99 -0
  77. package/dist/nanomind-core/security/defense-in-depth.d.ts.map +1 -0
  78. package/dist/nanomind-core/security/defense-in-depth.js +206 -0
  79. package/dist/nanomind-core/security/defense-in-depth.js.map +1 -0
  80. package/dist/nanomind-core/security/integrity-verifier.d.ts +132 -0
  81. package/dist/nanomind-core/security/integrity-verifier.d.ts.map +1 -0
  82. package/dist/nanomind-core/security/integrity-verifier.js +437 -0
  83. package/dist/nanomind-core/security/integrity-verifier.js.map +1 -0
  84. package/dist/nanomind-core/types.d.ts +125 -0
  85. package/dist/nanomind-core/types.d.ts.map +1 -0
  86. package/dist/nanomind-core/types.js +22 -0
  87. package/dist/nanomind-core/types.js.map +1 -0
  88. package/dist/output/asff.d.ts.map +1 -1
  89. package/dist/output/asff.js +2 -1
  90. package/dist/output/asff.js.map +1 -1
  91. package/dist/semantic/index.d.ts +4 -0
  92. package/dist/semantic/index.d.ts.map +1 -1
  93. package/dist/semantic/index.js +13 -1
  94. package/dist/semantic/index.js.map +1 -1
  95. package/dist/semantic/nanomind-analyzer.d.ts +77 -0
  96. package/dist/semantic/nanomind-analyzer.d.ts.map +1 -0
  97. package/dist/semantic/nanomind-analyzer.js +165 -0
  98. package/dist/semantic/nanomind-analyzer.js.map +1 -0
  99. package/dist/semantic/nanomind-enhancer.d.ts +50 -0
  100. package/dist/semantic/nanomind-enhancer.d.ts.map +1 -0
  101. package/dist/semantic/nanomind-enhancer.js +203 -0
  102. package/dist/semantic/nanomind-enhancer.js.map +1 -0
  103. package/dist/simulation/engine.d.ts +69 -0
  104. package/dist/simulation/engine.d.ts.map +1 -0
  105. package/dist/simulation/engine.js +297 -0
  106. package/dist/simulation/engine.js.map +1 -0
  107. package/dist/simulation/index.d.ts +15 -0
  108. package/dist/simulation/index.d.ts.map +1 -0
  109. package/dist/simulation/index.js +31 -0
  110. package/dist/simulation/index.js.map +1 -0
  111. package/dist/simulation/llm-executor.d.ts +58 -0
  112. package/dist/simulation/llm-executor.d.ts.map +1 -0
  113. package/dist/simulation/llm-executor.js +297 -0
  114. package/dist/simulation/llm-executor.js.map +1 -0
  115. package/dist/simulation/mock-tools.d.ts +35 -0
  116. package/dist/simulation/mock-tools.d.ts.map +1 -0
  117. package/dist/simulation/mock-tools.js +181 -0
  118. package/dist/simulation/mock-tools.js.map +1 -0
  119. package/dist/simulation/probes.d.ts +17 -0
  120. package/dist/simulation/probes.d.ts.map +1 -0
  121. package/dist/simulation/probes.js +295 -0
  122. package/dist/simulation/probes.js.map +1 -0
  123. package/dist/simulation/types.d.ts +79 -0
  124. package/dist/simulation/types.d.ts.map +1 -0
  125. package/dist/simulation/types.js +25 -0
  126. package/dist/simulation/types.js.map +1 -0
  127. package/package.json +1 -1
@@ -0,0 +1,326 @@
1
+ "use strict";
2
+ /**
3
+ * Scope Analyzer -- AST-based AST-SCOPE-* checks
4
+ *
5
+ * Queries the SecurityAST for MCP tool scope mismatches and A2A exposure.
6
+ * Compares declared capabilities against inferred capabilities to detect
7
+ * wildcard access, undeclared permissions, and scope-purpose mismatches.
8
+ *
9
+ * Checks:
10
+ * AST-SCOPE-001: Wildcard tool access in MCP configurations
11
+ * AST-SCOPE-002: Undeclared tool permissions (inferred but not declared)
12
+ * AST-SCOPE-003: Scope-purpose mismatch (capabilities inconsistent with purpose)
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.analyzeScope = analyzeScope;
16
+ const defense_in_depth_js_1 = require("../security/defense-in-depth.js");
17
+ // ============================================================================
18
+ // Public API
19
+ // ============================================================================
20
+ /**
21
+ * Analyze a SecurityAST for scope and permission issues.
22
+ * Verifies AST integrity before processing.
23
+ */
24
+ function analyzeScope(ast, verifier) {
25
+ (0, defense_in_depth_js_1.assertASTIntegrity)(ast, verifier);
26
+ const findings = [];
27
+ findings.push(...checkWildcardToolAccess(ast));
28
+ findings.push(...checkUndeclaredPermissions(ast));
29
+ findings.push(...checkScopePurposeMismatch(ast));
30
+ return findings;
31
+ }
32
+ // ============================================================================
33
+ // AST-SCOPE-001: Wildcard tool access
34
+ // ============================================================================
35
+ /**
36
+ * Detects wildcard ("*") tool access in MCP configurations and agent configs.
37
+ * Wildcard access grants the agent unlimited tool permissions, which is
38
+ * the MCP equivalent of running as root.
39
+ *
40
+ * Also detects partial wildcards (e.g., "db.*") that grant broad access
41
+ * within a domain.
42
+ */
43
+ function checkWildcardToolAccess(ast) {
44
+ const findings = [];
45
+ // Full wildcards: capabilities with "*" in the name
46
+ const fullWildcards = ast.declaredCapabilities.filter(c => c.name.includes('*'));
47
+ for (const cap of fullWildcards) {
48
+ const isFullWildcard = cap.name.endsWith('.*') || cap.name === '*';
49
+ const scope = cap.scope || 'all tools';
50
+ findings.push({
51
+ checkId: 'AST-SCOPE-001',
52
+ name: isFullWildcard ? 'Full Wildcard Tool Access' : 'Partial Wildcard Tool Access',
53
+ description: isFullWildcard
54
+ ? `Wildcard capability "${cap.name}" grants unrestricted access to ${scope}. ` +
55
+ 'This is the MCP equivalent of running as root. Any tool in the server can be ' +
56
+ 'invoked, including dangerous operations like file deletion or code execution.'
57
+ : `Partial wildcard "${cap.name}" grants broad access within ${scope}. ` +
58
+ 'While scoped to a domain, this still allows access to every tool in that domain ' +
59
+ 'including tools not needed for the declared purpose.',
60
+ category: 'Scope Security',
61
+ severity: isFullWildcard ? 'critical' : 'high',
62
+ passed: false,
63
+ message: `Wildcard access: ${cap.name} (scope: ${scope})`,
64
+ fixable: true,
65
+ file: ast.artifactPath,
66
+ fix: isFullWildcard
67
+ ? `Replace wildcard "*" with an explicit allowlist of needed tools. ` +
68
+ `In your MCP config, change "allowedTools": ["*"] to "allowedTools": ["tool1", "tool2"]. ` +
69
+ 'Only include tools the agent actually needs.'
70
+ : `Replace partial wildcard "${cap.name}" with specific tool names. ` +
71
+ `List only the ${cap.name.split('.')[0]} tools the agent actually uses.`,
72
+ guidance: 'Principle of least privilege: grant only the minimum permissions needed. ' +
73
+ 'Wildcard access means a prompt injection attack can invoke any tool.',
74
+ attackClass: 'SCOPE-WILDCARD',
75
+ confidence: 0.95,
76
+ });
77
+ }
78
+ // Also flag MCP configs where no allowedTools is specified (implicit wildcard)
79
+ if (ast.artifactType === 'mcp_config') {
80
+ const mcpCaps = ast.declaredCapabilities.filter(c => c.name.startsWith('mcp.'));
81
+ // If there are MCP capabilities but none have explicit tool names (all are server-level)
82
+ const hasOnlyServerLevel = mcpCaps.length > 0 && mcpCaps.every(c => {
83
+ const parts = c.name.split('.');
84
+ return parts.length <= 2; // "mcp.servername" without a tool name
85
+ });
86
+ if (hasOnlyServerLevel && fullWildcards.length === 0) {
87
+ // MCP server declared without explicit tool restrictions
88
+ for (const cap of mcpCaps) {
89
+ findings.push({
90
+ checkId: 'AST-SCOPE-001',
91
+ name: 'Implicit Wildcard MCP Access',
92
+ description: `MCP server "${cap.scope}" is configured without an explicit tool allowlist. ` +
93
+ 'When no allowedTools is specified, all tools on the server are accessible.',
94
+ category: 'Scope Security',
95
+ severity: 'high',
96
+ passed: false,
97
+ message: `Implicit wildcard: MCP server ${cap.scope}`,
98
+ fixable: true,
99
+ file: ast.artifactPath,
100
+ fix: `Add an "allowedTools" list to the "${cap.scope}" server configuration. ` +
101
+ 'Specify only the tools your agent needs.',
102
+ guidance: 'MCP servers can expose dangerous tools (file system, shell execution). ' +
103
+ 'Always restrict access to a named allowlist.',
104
+ attackClass: 'SCOPE-WILDCARD',
105
+ confidence: 0.8,
106
+ });
107
+ }
108
+ }
109
+ }
110
+ return findings;
111
+ }
112
+ // ============================================================================
113
+ // AST-SCOPE-002: Undeclared tool permissions
114
+ // ============================================================================
115
+ /**
116
+ * Detects capabilities that NanoMind inferred from the artifact content
117
+ * but that were not explicitly declared. Undeclared permissions mean the
118
+ * agent can do more than its manifest claims.
119
+ *
120
+ * This is the scope-specific version of AST-CAP-001 (undeclared capabilities).
121
+ * While CAP-001 flags any undeclared capability, SCOPE-002 focuses on
122
+ * tool permissions and access patterns.
123
+ */
124
+ function checkUndeclaredPermissions(ast) {
125
+ const findings = [];
126
+ // Build list of declared capability names (normalized)
127
+ const declaredNamesList = ast.declaredCapabilities.map(c => normalizeCapName(c.name));
128
+ // Find inferred capabilities not covered by declarations
129
+ const undeclaredInferred = ast.inferredCapabilities.filter(c => {
130
+ const normalized = normalizeCapName(c.name);
131
+ // Check exact match
132
+ if (declaredNamesList.includes(normalized))
133
+ return false;
134
+ // Check if covered by a broader declared capability (e.g., "db.*" covers "db.read")
135
+ for (const declared of declaredNamesList) {
136
+ if (declared.endsWith('.*') && normalized.startsWith(declared.slice(0, -1))) {
137
+ return false;
138
+ }
139
+ }
140
+ return true;
141
+ });
142
+ for (const cap of undeclaredInferred) {
143
+ const severity = cap.riskLevel === 'critical'
144
+ ? 'critical'
145
+ : cap.riskLevel === 'high'
146
+ ? 'high'
147
+ : 'medium';
148
+ findings.push({
149
+ checkId: 'AST-SCOPE-002',
150
+ name: 'Undeclared Tool Permission',
151
+ description: `Tool permission "${cap.name}" (scope: ${cap.scope || 'unscoped'}) was inferred ` +
152
+ 'from artifact content but is not declared in the capability manifest. ' +
153
+ 'The artifact exercises permissions beyond its declared scope.',
154
+ category: 'Scope Security',
155
+ severity,
156
+ passed: false,
157
+ message: `Undeclared permission: ${cap.name} (${cap.riskLevel}-risk)`,
158
+ fixable: true,
159
+ file: ast.artifactPath,
160
+ fix: `Either declare "${cap.name}" in your capability manifest (if intended) ` +
161
+ 'or remove the code/instructions that exercise this permission. ' +
162
+ 'If declared, add a governance constraint for this capability.',
163
+ guidance: 'Every tool permission must be explicitly declared. Undeclared permissions are a ' +
164
+ 'supply chain risk: users and orchestrators cannot audit what the agent actually does.',
165
+ attackClass: 'SCOPE-UNDECLARED',
166
+ confidence: ast.intentConfidence,
167
+ evidence: cap.evidence,
168
+ });
169
+ }
170
+ return findings;
171
+ }
172
+ // ============================================================================
173
+ // AST-SCOPE-003: Scope-purpose mismatch
174
+ // ============================================================================
175
+ /**
176
+ * Detects capabilities that are inconsistent with the artifact's declared
177
+ * purpose. A "weather lookup" agent with file.delete capabilities is
178
+ * suspicious regardless of whether the capability is declared.
179
+ *
180
+ * Uses semantic comparison between the declared purpose and each capability,
181
+ * considering both declared and inferred capabilities.
182
+ */
183
+ function checkScopePurposeMismatch(ast) {
184
+ const findings = [];
185
+ const purpose = ast.declaredPurpose.toLowerCase();
186
+ // Skip if purpose is generic / unknown
187
+ if (purpose === 'unknown purpose' ||
188
+ purpose.length < 10 ||
189
+ purpose.includes('does whatever') ||
190
+ purpose.includes('general purpose')) {
191
+ return findings;
192
+ }
193
+ // Extract purpose domain keywords
194
+ const purposeKeywords = extractPurposeKeywords(purpose);
195
+ if (purposeKeywords.size < 2) {
196
+ return findings; // Not enough context to judge mismatch
197
+ }
198
+ // Check all capabilities (declared + inferred) for relevance to purpose
199
+ const allCaps = [...ast.declaredCapabilities, ...ast.inferredCapabilities];
200
+ // Deduplicate by name
201
+ const seen = new Set();
202
+ const uniqueCaps = [];
203
+ for (const cap of allCaps) {
204
+ if (!seen.has(cap.name)) {
205
+ seen.add(cap.name);
206
+ uniqueCaps.push(cap);
207
+ }
208
+ }
209
+ for (const cap of uniqueCaps) {
210
+ // Only flag high/critical risk mismatches
211
+ if (cap.riskLevel !== 'high' && cap.riskLevel !== 'critical') {
212
+ continue;
213
+ }
214
+ const capKeywords = extractCapabilityKeywords(cap.name, cap.scope);
215
+ const overlap = setIntersection(purposeKeywords, capKeywords);
216
+ // If zero overlap between purpose and capability keywords, it's a mismatch
217
+ if (overlap.size === 0 && capKeywords.size > 0) {
218
+ findings.push({
219
+ checkId: 'AST-SCOPE-003',
220
+ name: 'Scope-Purpose Mismatch',
221
+ description: `${cap.riskLevel}-risk capability "${cap.name}" (scope: ${cap.scope || 'unscoped'}) ` +
222
+ `does not align with declared purpose: "${truncate(ast.declaredPurpose, 100)}". ` +
223
+ 'This could indicate a trojan capability hidden in an otherwise legitimate agent.',
224
+ category: 'Scope Security',
225
+ severity: cap.riskLevel === 'critical' ? 'critical' : 'high',
226
+ passed: false,
227
+ message: `"${cap.name}" does not match purpose "${truncate(ast.declaredPurpose, 50)}"`,
228
+ fixable: true,
229
+ file: ast.artifactPath,
230
+ fix: `Either update the purpose description to explain why "${cap.name}" is needed, ` +
231
+ `or remove this capability if it is not required. ` +
232
+ 'A clear purpose statement helps users and scanners trust the agent.',
233
+ guidance: 'Scope-purpose mismatches are a red flag for trojan agents that hide malicious ' +
234
+ 'capabilities behind a benign-sounding purpose. Even if the capability is legitimate, ' +
235
+ 'the purpose should explain why it is needed.',
236
+ attackClass: 'SEMANTIC-MISMATCH',
237
+ confidence: 0.65,
238
+ evidence: cap.evidence,
239
+ });
240
+ }
241
+ }
242
+ return findings;
243
+ }
244
+ // ============================================================================
245
+ // Helpers
246
+ // ============================================================================
247
+ /**
248
+ * Normalize a capability name for comparison.
249
+ * "MCP.github.issues_list" -> "mcp.github.issues_list"
250
+ */
251
+ function normalizeCapName(name) {
252
+ return name.toLowerCase().replace(/-/g, '_');
253
+ }
254
+ /**
255
+ * Extract meaningful keywords from a purpose string.
256
+ * Filters out stop words and short tokens.
257
+ */
258
+ function extractPurposeKeywords(purpose) {
259
+ const stopWords = new Set([
260
+ 'the', 'and', 'for', 'with', 'that', 'this', 'from', 'have', 'will',
261
+ 'can', 'not', 'are', 'was', 'been', 'being', 'has', 'had', 'does',
262
+ 'did', 'but', 'its', 'they', 'their', 'what', 'which', 'when',
263
+ 'where', 'who', 'whom', 'how', 'all', 'each', 'every', 'both',
264
+ 'few', 'more', 'most', 'other', 'some', 'such', 'than', 'too',
265
+ 'very', 'just', 'about', 'also', 'only', 'then', 'tool', 'agent',
266
+ 'help', 'users', 'user',
267
+ ]);
268
+ const result = new Set();
269
+ purpose
270
+ .split(/[\s,.;:!?()[\]{}]+/)
271
+ .map(w => w.toLowerCase())
272
+ .filter(w => w.length > 3 && !stopWords.has(w))
273
+ .forEach(w => result.add(w));
274
+ return result;
275
+ }
276
+ /**
277
+ * Extract keywords from a capability name and scope.
278
+ * "db.read" + "customers table" -> {"read", "customers", "table", "database"}
279
+ */
280
+ function extractCapabilityKeywords(name, scope) {
281
+ const parts = name.split(/[._-]/).filter(p => p.length > 2);
282
+ // Expand abbreviations
283
+ const expansions = {
284
+ db: ['database', 'data'],
285
+ api: ['interface', 'endpoint', 'service'],
286
+ fs: ['file', 'filesystem'],
287
+ mcp: ['tool', 'server'],
288
+ auth: ['authentication', 'credential'],
289
+ exec: ['execute', 'shell'],
290
+ admin: ['administration', 'privilege'],
291
+ };
292
+ const keywords = new Set();
293
+ for (const part of parts) {
294
+ keywords.add(part.toLowerCase());
295
+ const expanded = expansions[part.toLowerCase()];
296
+ if (expanded) {
297
+ for (const e of expanded) {
298
+ keywords.add(e);
299
+ }
300
+ }
301
+ }
302
+ // Add scope words
303
+ if (scope) {
304
+ for (const word of scope.split(/[\s,.]+/)) {
305
+ if (word.length > 2) {
306
+ keywords.add(word.toLowerCase());
307
+ }
308
+ }
309
+ }
310
+ return keywords;
311
+ }
312
+ function setIntersection(a, b) {
313
+ const result = new Set();
314
+ a.forEach(item => {
315
+ if (b.has(item)) {
316
+ result.add(item);
317
+ }
318
+ });
319
+ return result;
320
+ }
321
+ function truncate(text, maxLen) {
322
+ if (text.length <= maxLen)
323
+ return text;
324
+ return text.slice(0, maxLen - 3) + '...';
325
+ }
326
+ //# sourceMappingURL=scope-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-analyzer.js","sourceRoot":"","sources":["../../../src/nanomind-core/analyzers/scope-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * NanoMind Semantic Compiler
3
+ *
4
+ * The core of the architecture. Compiles raw artifacts into Abstract Security Trees.
5
+ * ALL scanners consume the AST -- no scanner reads raw text directly.
6
+ *
7
+ * Pipeline:
8
+ * 1. Parse artifact (validate, classify, hash)
9
+ * 2. Sanitize for NanoMind (strip manipulation attempts)
10
+ * 3. Extract declared capabilities and constraints
11
+ * 4. Run NanoMind inference for intent + inferred capabilities
12
+ * 5. Map risk surfaces
13
+ * 6. Extract evidence spans
14
+ * 7. Sign the AST
15
+ * 8. Return CompilationResult
16
+ *
17
+ * Security:
18
+ * - Input sanitized before NanoMind processes it
19
+ * - AST signed with Ed25519 for integrity
20
+ * - Model version embedded for reproducibility
21
+ * - Content-addressed caching via SHA-256 hash
22
+ */
23
+ import type { SecurityAST, CompilationResult, CompilerConfig } from '../types.js';
24
+ export declare class SemanticCompiler {
25
+ private config;
26
+ private cache;
27
+ constructor(config?: Partial<CompilerConfig>);
28
+ /**
29
+ * Compile an artifact into a SecurityAST.
30
+ * This is the main entry point for the entire NanoMind pipeline.
31
+ */
32
+ compile(content: string, path?: string): Promise<CompilationResult>;
33
+ /**
34
+ * Verify an AST's cryptographic signature.
35
+ * Analyzers MUST call this before processing an AST.
36
+ */
37
+ verifyAST(ast: SecurityAST): boolean;
38
+ private runNanoMindInference;
39
+ private signAST;
40
+ }
41
+ //# sourceMappingURL=semantic-compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-compiler.d.ts","sourceRoot":"","sources":["../../../src/nanomind-core/compiler/semantic-compiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,cAAc,EASf,MAAM,aAAa,CAAC;AAErB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAAkC;gBAEnC,MAAM,GAAE,OAAO,CAAC,cAAc,CAAM;IAUhD;;;OAGG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA0GzE;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO;YAStB,oBAAoB;IA+ClC,OAAO,CAAC,OAAO;CAchB"}