@nahisaho/musubix-security 1.8.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 (116) hide show
  1. package/README.md +105 -0
  2. package/bin/musubix-security-mcp.js +12 -0
  3. package/bin/musubix-security.js +12 -0
  4. package/dist/analysis/dependency-auditor.d.ts +30 -0
  5. package/dist/analysis/dependency-auditor.d.ts.map +1 -0
  6. package/dist/analysis/dependency-auditor.js +325 -0
  7. package/dist/analysis/dependency-auditor.js.map +1 -0
  8. package/dist/analysis/index.d.ts +9 -0
  9. package/dist/analysis/index.d.ts.map +1 -0
  10. package/dist/analysis/index.js +9 -0
  11. package/dist/analysis/index.js.map +1 -0
  12. package/dist/analysis/secret-detector.d.ts +44 -0
  13. package/dist/analysis/secret-detector.d.ts.map +1 -0
  14. package/dist/analysis/secret-detector.js +465 -0
  15. package/dist/analysis/secret-detector.js.map +1 -0
  16. package/dist/analysis/taint-analyzer.d.ts +62 -0
  17. package/dist/analysis/taint-analyzer.d.ts.map +1 -0
  18. package/dist/analysis/taint-analyzer.js +519 -0
  19. package/dist/analysis/taint-analyzer.js.map +1 -0
  20. package/dist/analysis/vulnerability-scanner.d.ts +58 -0
  21. package/dist/analysis/vulnerability-scanner.d.ts.map +1 -0
  22. package/dist/analysis/vulnerability-scanner.js +417 -0
  23. package/dist/analysis/vulnerability-scanner.js.map +1 -0
  24. package/dist/cli/commands.d.ts +15 -0
  25. package/dist/cli/commands.d.ts.map +1 -0
  26. package/dist/cli/commands.js +405 -0
  27. package/dist/cli/commands.js.map +1 -0
  28. package/dist/cli/index.d.ts +6 -0
  29. package/dist/cli/index.d.ts.map +1 -0
  30. package/dist/cli/index.js +6 -0
  31. package/dist/cli/index.js.map +1 -0
  32. package/dist/index.d.ts +42 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +66 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/infrastructure/ast-parser.d.ts +87 -0
  37. package/dist/infrastructure/ast-parser.d.ts.map +1 -0
  38. package/dist/infrastructure/ast-parser.js +273 -0
  39. package/dist/infrastructure/ast-parser.js.map +1 -0
  40. package/dist/infrastructure/cache.d.ts +100 -0
  41. package/dist/infrastructure/cache.d.ts.map +1 -0
  42. package/dist/infrastructure/cache.js +288 -0
  43. package/dist/infrastructure/cache.js.map +1 -0
  44. package/dist/infrastructure/config-loader.d.ts +35 -0
  45. package/dist/infrastructure/config-loader.d.ts.map +1 -0
  46. package/dist/infrastructure/config-loader.js +358 -0
  47. package/dist/infrastructure/config-loader.js.map +1 -0
  48. package/dist/infrastructure/file-scanner.d.ts +94 -0
  49. package/dist/infrastructure/file-scanner.d.ts.map +1 -0
  50. package/dist/infrastructure/file-scanner.js +189 -0
  51. package/dist/infrastructure/file-scanner.js.map +1 -0
  52. package/dist/infrastructure/index.d.ts +9 -0
  53. package/dist/infrastructure/index.d.ts.map +1 -0
  54. package/dist/infrastructure/index.js +9 -0
  55. package/dist/infrastructure/index.js.map +1 -0
  56. package/dist/mcp/index.d.ts +7 -0
  57. package/dist/mcp/index.d.ts.map +1 -0
  58. package/dist/mcp/index.js +7 -0
  59. package/dist/mcp/index.js.map +1 -0
  60. package/dist/mcp/server.d.ts +34 -0
  61. package/dist/mcp/server.d.ts.map +1 -0
  62. package/dist/mcp/server.js +88 -0
  63. package/dist/mcp/server.js.map +1 -0
  64. package/dist/mcp/tools.d.ts +88 -0
  65. package/dist/mcp/tools.d.ts.map +1 -0
  66. package/dist/mcp/tools.js +443 -0
  67. package/dist/mcp/tools.js.map +1 -0
  68. package/dist/services/fix-generator.d.ts +56 -0
  69. package/dist/services/fix-generator.d.ts.map +1 -0
  70. package/dist/services/fix-generator.js +346 -0
  71. package/dist/services/fix-generator.js.map +1 -0
  72. package/dist/services/fix-verifier.d.ts +62 -0
  73. package/dist/services/fix-verifier.d.ts.map +1 -0
  74. package/dist/services/fix-verifier.js +224 -0
  75. package/dist/services/fix-verifier.js.map +1 -0
  76. package/dist/services/index.d.ts +9 -0
  77. package/dist/services/index.d.ts.map +1 -0
  78. package/dist/services/index.js +13 -0
  79. package/dist/services/index.js.map +1 -0
  80. package/dist/services/report-generator.d.ts +87 -0
  81. package/dist/services/report-generator.d.ts.map +1 -0
  82. package/dist/services/report-generator.js +463 -0
  83. package/dist/services/report-generator.js.map +1 -0
  84. package/dist/services/security-service.d.ts +151 -0
  85. package/dist/services/security-service.d.ts.map +1 -0
  86. package/dist/services/security-service.js +279 -0
  87. package/dist/services/security-service.js.map +1 -0
  88. package/dist/types/config.d.ts +188 -0
  89. package/dist/types/config.d.ts.map +1 -0
  90. package/dist/types/config.js +89 -0
  91. package/dist/types/config.js.map +1 -0
  92. package/dist/types/dependency.d.ts +266 -0
  93. package/dist/types/dependency.d.ts.map +1 -0
  94. package/dist/types/dependency.js +7 -0
  95. package/dist/types/dependency.js.map +1 -0
  96. package/dist/types/fix.d.ts +213 -0
  97. package/dist/types/fix.d.ts.map +1 -0
  98. package/dist/types/fix.js +7 -0
  99. package/dist/types/fix.js.map +1 -0
  100. package/dist/types/index.d.ts +14 -0
  101. package/dist/types/index.d.ts.map +1 -0
  102. package/dist/types/index.js +8 -0
  103. package/dist/types/index.js.map +1 -0
  104. package/dist/types/secret.d.ts +151 -0
  105. package/dist/types/secret.d.ts.map +1 -0
  106. package/dist/types/secret.js +91 -0
  107. package/dist/types/secret.js.map +1 -0
  108. package/dist/types/taint.d.ts +182 -0
  109. package/dist/types/taint.d.ts.map +1 -0
  110. package/dist/types/taint.js +24 -0
  111. package/dist/types/taint.js.map +1 -0
  112. package/dist/types/vulnerability.d.ts +136 -0
  113. package/dist/types/vulnerability.d.ts.map +1 -0
  114. package/dist/types/vulnerability.js +7 -0
  115. package/dist/types/vulnerability.js.map +1 -0
  116. package/package.json +87 -0
@@ -0,0 +1,87 @@
1
+ /**
2
+ * @fileoverview TypeScript AST parser using ts-morph
3
+ * @module @nahisaho/musubix-security/infrastructure/ast-parser
4
+ * @trace REQ-SEC-SCAN-001, REQ-SEC-TAINT-001
5
+ */
6
+ import { Project, SourceFile, Node, CallExpression, Identifier } from 'ts-morph';
7
+ import type { SourceLocation } from '../types/index.js';
8
+ /**
9
+ * AST Parser service for TypeScript/JavaScript analysis
10
+ */
11
+ export declare class ASTParser {
12
+ private project;
13
+ private cache;
14
+ constructor(tsConfigPath?: string);
15
+ /**
16
+ * Parse a file and return its AST
17
+ */
18
+ parseFile(filePath: string): SourceFile;
19
+ /**
20
+ * Parse source code string
21
+ */
22
+ parseCode(code: string, fileName?: string): SourceFile;
23
+ /**
24
+ * Get source location from a node
25
+ */
26
+ getLocation(node: Node): SourceLocation;
27
+ /**
28
+ * Find all function calls in a file
29
+ */
30
+ findCallExpressions(sourceFile: SourceFile): CallExpression[];
31
+ /**
32
+ * Find all string literals in a file
33
+ */
34
+ findStringLiterals(sourceFile: SourceFile): Node[];
35
+ /**
36
+ * Find all identifiers in a file
37
+ */
38
+ findIdentifiers(sourceFile: SourceFile): Identifier[];
39
+ /**
40
+ * Get function/method name from a call expression
41
+ */
42
+ getFunctionName(callExpr: CallExpression): string | undefined;
43
+ /**
44
+ * Get the receiver object name for a method call
45
+ */
46
+ getReceiverName(callExpr: CallExpression): string | undefined;
47
+ /**
48
+ * Check if a node is inside a specific function/method
49
+ */
50
+ getEnclosingFunction(node: Node): Node | undefined;
51
+ /**
52
+ * Extract code snippet around a node
53
+ */
54
+ extractSnippet(node: Node, contextLines?: number): string;
55
+ /**
56
+ * Check if node represents user input source
57
+ */
58
+ isUserInputSource(callExpr: CallExpression): boolean;
59
+ /**
60
+ * Check if node is a dangerous sink
61
+ */
62
+ isDangerousSink(callExpr: CallExpression): {
63
+ isDangerous: boolean;
64
+ category?: string;
65
+ };
66
+ /**
67
+ * Clear cache for a file
68
+ */
69
+ invalidateCache(filePath: string): void;
70
+ /**
71
+ * Clear all caches
72
+ */
73
+ clearCache(): void;
74
+ /**
75
+ * Get project instance for advanced usage
76
+ */
77
+ getProject(): Project;
78
+ }
79
+ /**
80
+ * Get or create AST parser instance
81
+ */
82
+ export declare function getASTParser(tsConfigPath?: string): ASTParser;
83
+ /**
84
+ * Reset parser instance (for testing)
85
+ */
86
+ export declare function resetASTParser(): void;
87
+ //# sourceMappingURL=ast-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-parser.d.ts","sourceRoot":"","sources":["../../src/infrastructure/ast-parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAc,cAAc,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC7F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,KAAK,CAAsC;gBAEvC,YAAY,CAAC,EAAE,MAAM;IAajC;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU;IAWvC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAY,GAAG,UAAU;IAIzD;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,cAAc;IAgBvC;;OAEG;IACH,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,cAAc,EAAE;IAI7D;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,EAAE;IAQlD;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,EAAE;IAIrD;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS;IAwB7D;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS;IAa7D;;OAEG;IACH,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS;IASlD;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,SAAI,GAAG,MAAM;IAYpD;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO;IAsCpD;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG;QAAE,WAAW,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAyDtF;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQvC;;OAEG;IACH,UAAU,IAAI,IAAI;IAOlB;;OAEG;IACH,UAAU,IAAI,OAAO;CAGtB;AAOD;;GAEG;AACH,wBAAgB,YAAY,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAK7D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAKrC"}
@@ -0,0 +1,273 @@
1
+ /**
2
+ * @fileoverview TypeScript AST parser using ts-morph
3
+ * @module @nahisaho/musubix-security/infrastructure/ast-parser
4
+ * @trace REQ-SEC-SCAN-001, REQ-SEC-TAINT-001
5
+ */
6
+ import { Project, Node, SyntaxKind } from 'ts-morph';
7
+ /**
8
+ * AST Parser service for TypeScript/JavaScript analysis
9
+ */
10
+ export class ASTParser {
11
+ project;
12
+ cache = new Map();
13
+ constructor(tsConfigPath) {
14
+ this.project = new Project({
15
+ tsConfigFilePath: tsConfigPath,
16
+ skipAddingFilesFromTsConfig: true,
17
+ compilerOptions: {
18
+ allowJs: true,
19
+ checkJs: false,
20
+ noEmit: true,
21
+ skipLibCheck: true,
22
+ },
23
+ });
24
+ }
25
+ /**
26
+ * Parse a file and return its AST
27
+ */
28
+ parseFile(filePath) {
29
+ const cached = this.cache.get(filePath);
30
+ if (cached) {
31
+ return cached;
32
+ }
33
+ const sourceFile = this.project.addSourceFileAtPath(filePath);
34
+ this.cache.set(filePath, sourceFile);
35
+ return sourceFile;
36
+ }
37
+ /**
38
+ * Parse source code string
39
+ */
40
+ parseCode(code, fileName = 'temp.ts') {
41
+ return this.project.createSourceFile(fileName, code, { overwrite: true });
42
+ }
43
+ /**
44
+ * Get source location from a node
45
+ */
46
+ getLocation(node) {
47
+ const sourceFile = node.getSourceFile();
48
+ const start = node.getStart();
49
+ const end = node.getEnd();
50
+ const startPos = sourceFile.getLineAndColumnAtPos(start);
51
+ const endPos = sourceFile.getLineAndColumnAtPos(end);
52
+ return {
53
+ file: sourceFile.getFilePath(),
54
+ startLine: startPos.line,
55
+ endLine: endPos.line,
56
+ startColumn: startPos.column - 1, // Convert to 0-based
57
+ endColumn: endPos.column - 1,
58
+ };
59
+ }
60
+ /**
61
+ * Find all function calls in a file
62
+ */
63
+ findCallExpressions(sourceFile) {
64
+ return sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression);
65
+ }
66
+ /**
67
+ * Find all string literals in a file
68
+ */
69
+ findStringLiterals(sourceFile) {
70
+ return [
71
+ ...sourceFile.getDescendantsOfKind(SyntaxKind.StringLiteral),
72
+ ...sourceFile.getDescendantsOfKind(SyntaxKind.NoSubstitutionTemplateLiteral),
73
+ ...sourceFile.getDescendantsOfKind(SyntaxKind.TemplateExpression),
74
+ ];
75
+ }
76
+ /**
77
+ * Find all identifiers in a file
78
+ */
79
+ findIdentifiers(sourceFile) {
80
+ return sourceFile.getDescendantsOfKind(SyntaxKind.Identifier);
81
+ }
82
+ /**
83
+ * Get function/method name from a call expression
84
+ */
85
+ getFunctionName(callExpr) {
86
+ const expr = callExpr.getExpression();
87
+ // Direct function call: functionName()
88
+ if (Node.isIdentifier(expr)) {
89
+ return expr.getText();
90
+ }
91
+ // Method call: obj.methodName()
92
+ if (Node.isPropertyAccessExpression(expr)) {
93
+ return expr.getName();
94
+ }
95
+ // Element access: obj['methodName']()
96
+ if (Node.isElementAccessExpression(expr)) {
97
+ const arg = expr.getArgumentExpression();
98
+ if (arg && Node.isStringLiteral(arg)) {
99
+ return arg.getLiteralValue();
100
+ }
101
+ }
102
+ return undefined;
103
+ }
104
+ /**
105
+ * Get the receiver object name for a method call
106
+ */
107
+ getReceiverName(callExpr) {
108
+ const expr = callExpr.getExpression();
109
+ if (Node.isPropertyAccessExpression(expr)) {
110
+ const receiver = expr.getExpression();
111
+ if (Node.isIdentifier(receiver)) {
112
+ return receiver.getText();
113
+ }
114
+ }
115
+ return undefined;
116
+ }
117
+ /**
118
+ * Check if a node is inside a specific function/method
119
+ */
120
+ getEnclosingFunction(node) {
121
+ return node.getFirstAncestor((ancestor) => Node.isFunctionDeclaration(ancestor) ||
122
+ Node.isFunctionExpression(ancestor) ||
123
+ Node.isArrowFunction(ancestor) ||
124
+ Node.isMethodDeclaration(ancestor));
125
+ }
126
+ /**
127
+ * Extract code snippet around a node
128
+ */
129
+ extractSnippet(node, contextLines = 2) {
130
+ const sourceFile = node.getSourceFile();
131
+ const fullText = sourceFile.getFullText();
132
+ const lines = fullText.split('\n');
133
+ const location = this.getLocation(node);
134
+ const startLine = Math.max(0, location.startLine - 1 - contextLines);
135
+ const endLine = Math.min(lines.length, location.endLine + contextLines);
136
+ return lines.slice(startLine, endLine).join('\n');
137
+ }
138
+ /**
139
+ * Check if node represents user input source
140
+ */
141
+ isUserInputSource(callExpr) {
142
+ const funcName = this.getFunctionName(callExpr);
143
+ const receiverName = this.getReceiverName(callExpr);
144
+ // Common user input patterns
145
+ const userInputPatterns = [
146
+ // Express.js
147
+ { receiver: 'req', methods: ['body', 'query', 'params', 'headers', 'cookies'] },
148
+ // Koa
149
+ { receiver: 'ctx', methods: ['request', 'query', 'params'] },
150
+ // DOM
151
+ { receiver: 'document', methods: ['getElementById', 'querySelector', 'querySelectorAll'] },
152
+ // Forms
153
+ { receiver: undefined, methods: ['prompt', 'confirm'] },
154
+ ];
155
+ for (const pattern of userInputPatterns) {
156
+ if (pattern.receiver && receiverName !== pattern.receiver)
157
+ continue;
158
+ if (funcName && pattern.methods.includes(funcName)) {
159
+ return true;
160
+ }
161
+ }
162
+ // Property access on request objects
163
+ const expr = callExpr.getExpression();
164
+ if (Node.isPropertyAccessExpression(expr)) {
165
+ const receiver = expr.getExpression();
166
+ if (Node.isPropertyAccessExpression(receiver)) {
167
+ const text = receiver.getText();
168
+ if (text.includes('req.') || text.includes('request.') || text.includes('ctx.')) {
169
+ return true;
170
+ }
171
+ }
172
+ }
173
+ return false;
174
+ }
175
+ /**
176
+ * Check if node is a dangerous sink
177
+ */
178
+ isDangerousSink(callExpr) {
179
+ const funcName = this.getFunctionName(callExpr);
180
+ const receiverName = this.getReceiverName(callExpr);
181
+ const dangerousSinks = {
182
+ // SQL
183
+ query: [
184
+ { receiver: 'db', category: 'sql-query' },
185
+ { receiver: 'connection', category: 'sql-query' },
186
+ { receiver: 'pool', category: 'sql-query' },
187
+ ],
188
+ execute: [{ receiver: 'db', category: 'sql-query' }],
189
+ raw: [{ receiver: 'knex', category: 'sql-query' }],
190
+ // Command execution
191
+ exec: [
192
+ { receiver: 'child_process', category: 'command-exec' },
193
+ { receiver: undefined, category: 'command-exec' },
194
+ ],
195
+ execSync: [{ receiver: 'child_process', category: 'command-exec' }],
196
+ spawn: [{ receiver: 'child_process', category: 'command-exec' }],
197
+ // File system
198
+ readFile: [{ receiver: 'fs', category: 'file-read' }],
199
+ readFileSync: [{ receiver: 'fs', category: 'file-read' }],
200
+ writeFile: [{ receiver: 'fs', category: 'file-write' }],
201
+ writeFileSync: [{ receiver: 'fs', category: 'file-write' }],
202
+ // Eval/code execution
203
+ eval: [{ receiver: undefined, category: 'eval' }],
204
+ Function: [{ receiver: undefined, category: 'eval' }],
205
+ // HTML output
206
+ innerHTML: [{ receiver: undefined, category: 'html-output' }],
207
+ html: [{ receiver: undefined, category: 'html-output' }],
208
+ render: [{ receiver: 'res', category: 'html-output' }],
209
+ send: [{ receiver: 'res', category: 'html-output' }],
210
+ // Redirects
211
+ redirect: [{ receiver: 'res', category: 'redirect' }],
212
+ // Deserialization
213
+ parse: [{ receiver: 'JSON', category: 'deserialization' }],
214
+ deserialize: [{ receiver: undefined, category: 'deserialization' }],
215
+ };
216
+ if (funcName && dangerousSinks[funcName]) {
217
+ for (const sink of dangerousSinks[funcName]) {
218
+ if (!sink.receiver || sink.receiver === receiverName) {
219
+ return { isDangerous: true, category: sink.category };
220
+ }
221
+ }
222
+ }
223
+ return { isDangerous: false };
224
+ }
225
+ /**
226
+ * Clear cache for a file
227
+ */
228
+ invalidateCache(filePath) {
229
+ this.cache.delete(filePath);
230
+ const sourceFile = this.project.getSourceFile(filePath);
231
+ if (sourceFile) {
232
+ this.project.removeSourceFile(sourceFile);
233
+ }
234
+ }
235
+ /**
236
+ * Clear all caches
237
+ */
238
+ clearCache() {
239
+ this.cache.clear();
240
+ for (const sourceFile of this.project.getSourceFiles()) {
241
+ this.project.removeSourceFile(sourceFile);
242
+ }
243
+ }
244
+ /**
245
+ * Get project instance for advanced usage
246
+ */
247
+ getProject() {
248
+ return this.project;
249
+ }
250
+ }
251
+ /**
252
+ * Singleton instance
253
+ */
254
+ let parserInstance = null;
255
+ /**
256
+ * Get or create AST parser instance
257
+ */
258
+ export function getASTParser(tsConfigPath) {
259
+ if (!parserInstance) {
260
+ parserInstance = new ASTParser(tsConfigPath);
261
+ }
262
+ return parserInstance;
263
+ }
264
+ /**
265
+ * Reset parser instance (for testing)
266
+ */
267
+ export function resetASTParser() {
268
+ if (parserInstance) {
269
+ parserInstance.clearCache();
270
+ parserInstance = null;
271
+ }
272
+ }
273
+ //# sourceMappingURL=ast-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-parser.js","sourceRoot":"","sources":["../../src/infrastructure/ast-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * @fileoverview Caching infrastructure
3
+ * @module @nahisaho/musubix-security/infrastructure/cache
4
+ * @trace REQ-SEC-CACHE-001
5
+ */
6
+ import type { CacheStrategy } from '../types/index.js';
7
+ /**
8
+ * Cache statistics
9
+ */
10
+ export interface CacheStats {
11
+ hits: number;
12
+ misses: number;
13
+ size: number;
14
+ entryCount: number;
15
+ hitRate: number;
16
+ }
17
+ /**
18
+ * Cache options
19
+ */
20
+ export interface CacheOptions {
21
+ /** Cache strategy */
22
+ strategy: CacheStrategy;
23
+ /** Cache directory for file strategy */
24
+ cacheDir?: string;
25
+ /** TTL in seconds */
26
+ ttlSeconds?: number;
27
+ /** Maximum cache size in bytes */
28
+ maxSizeBytes?: number;
29
+ }
30
+ /**
31
+ * Abstract cache interface
32
+ */
33
+ export interface ICache<T = unknown> {
34
+ get(key: string): Promise<T | undefined>;
35
+ set(key: string, value: T, ttlSeconds?: number): Promise<void>;
36
+ has(key: string): Promise<boolean>;
37
+ delete(key: string): Promise<boolean>;
38
+ clear(): Promise<void>;
39
+ getStats(): CacheStats | Promise<CacheStats>;
40
+ }
41
+ /**
42
+ * Memory cache implementation
43
+ */
44
+ export declare class MemoryCache<T = unknown> implements ICache<T> {
45
+ private cache;
46
+ private stats;
47
+ private maxSizeBytes;
48
+ private defaultTtlSeconds;
49
+ private currentSize;
50
+ constructor(options?: CacheOptions);
51
+ get(key: string): Promise<T | undefined>;
52
+ set(key: string, value: T, ttlSeconds?: number): Promise<void>;
53
+ has(key: string): Promise<boolean>;
54
+ delete(key: string): Promise<boolean>;
55
+ clear(): Promise<void>;
56
+ getStats(): CacheStats;
57
+ private evictOldest;
58
+ }
59
+ /**
60
+ * File-based cache implementation
61
+ */
62
+ export declare class FileCache<T = unknown> implements ICache<T> {
63
+ private stats;
64
+ private cacheDir;
65
+ private defaultTtlSeconds;
66
+ private initialized;
67
+ constructor(options: CacheOptions);
68
+ private ensureDir;
69
+ private getCachePath;
70
+ get(key: string): Promise<T | undefined>;
71
+ set(key: string, value: T, ttlSeconds?: number): Promise<void>;
72
+ has(key: string): Promise<boolean>;
73
+ delete(key: string): Promise<boolean>;
74
+ clear(): Promise<void>;
75
+ getStats(): Promise<CacheStats>;
76
+ }
77
+ /**
78
+ * No-op cache implementation
79
+ */
80
+ export declare class NoopCache<T = unknown> implements ICache<T> {
81
+ get(_key: string): Promise<T | undefined>;
82
+ set(_key: string, _value: T): Promise<void>;
83
+ has(_key: string): Promise<boolean>;
84
+ delete(_key: string): Promise<boolean>;
85
+ clear(): Promise<void>;
86
+ getStats(): CacheStats;
87
+ }
88
+ /**
89
+ * Create a cache instance based on options
90
+ */
91
+ export declare function createCache<T = unknown>(options: CacheOptions): ICache<T>;
92
+ /**
93
+ * Generate a cache key from multiple parts
94
+ */
95
+ export declare function cacheKey(...parts: (string | number | boolean | undefined | null)[]): string;
96
+ /**
97
+ * Generate a hash for a file's content
98
+ */
99
+ export declare function contentHash(content: string): string;
100
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/infrastructure/cache.ts"],"names":[],"mappings":"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"}