codehere 0.2.0 → 0.3.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.
Potentially problematic release.
This version of codehere might be problematic. Click here for more details.
- package/dist/application/agents/multi-agent-orchestrator.d.ts +1 -0
- package/dist/application/agents/multi-agent-orchestrator.d.ts.map +1 -1
- package/dist/application/agents/multi-agent-orchestrator.js.map +1 -1
- package/dist/application/services/dependency-container.d.ts +3 -0
- package/dist/application/services/dependency-container.d.ts.map +1 -1
- package/dist/application/services/dependency-container.js +24 -0
- package/dist/application/services/dependency-container.js.map +1 -1
- package/dist/application/use-cases/ask-question-use-case.d.ts +12 -0
- package/dist/application/use-cases/ask-question-use-case.d.ts.map +1 -1
- package/dist/application/use-cases/ask-question-use-case.js +129 -9
- package/dist/application/use-cases/ask-question-use-case.js.map +1 -1
- package/dist/application/use-cases/edit-file-use-case.d.ts.map +1 -1
- package/dist/application/use-cases/edit-file-use-case.js +70 -3
- package/dist/application/use-cases/edit-file-use-case.js.map +1 -1
- package/dist/application/use-cases/planning-use-case.d.ts.map +1 -1
- package/dist/application/use-cases/planning-use-case.js +10 -1
- package/dist/application/use-cases/planning-use-case.js.map +1 -1
- package/dist/application/use-cases/react-orchestration-use-case.d.ts.map +1 -1
- package/dist/application/use-cases/react-orchestration-use-case.js +6 -2
- package/dist/application/use-cases/react-orchestration-use-case.js.map +1 -1
- package/dist/domain/services/react-loop.d.ts +8 -0
- package/dist/domain/services/react-loop.d.ts.map +1 -1
- package/dist/domain/services/react-loop.js +82 -6
- package/dist/domain/services/react-loop.js.map +1 -1
- package/dist/formatter.d.ts +2 -2
- package/dist/formatter.d.ts.map +1 -1
- package/dist/formatter.js +30 -17
- package/dist/formatter.js.map +1 -1
- package/dist/index.js +134 -15
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/ai/cohere-ai-service.d.ts +3 -1
- package/dist/infrastructure/ai/cohere-ai-service.d.ts.map +1 -1
- package/dist/infrastructure/ai/cohere-ai-service.js +51 -4
- package/dist/infrastructure/ai/cohere-ai-service.js.map +1 -1
- package/dist/infrastructure/cache/query-result-cache.d.ts +68 -0
- package/dist/infrastructure/cache/query-result-cache.d.ts.map +1 -0
- package/dist/infrastructure/cache/query-result-cache.js +138 -0
- package/dist/infrastructure/cache/query-result-cache.js.map +1 -0
- package/dist/infrastructure/cache/security-scan-cache.d.ts +57 -0
- package/dist/infrastructure/cache/security-scan-cache.d.ts.map +1 -0
- package/dist/infrastructure/cache/security-scan-cache.js +124 -0
- package/dist/infrastructure/cache/security-scan-cache.js.map +1 -0
- package/dist/infrastructure/completion/bash-completion.d.ts +8 -0
- package/dist/infrastructure/completion/bash-completion.d.ts.map +1 -0
- package/dist/infrastructure/completion/bash-completion.js +101 -0
- package/dist/infrastructure/completion/bash-completion.js.map +1 -0
- package/dist/infrastructure/completion/completion-generator.d.ts +42 -0
- package/dist/infrastructure/completion/completion-generator.d.ts.map +1 -0
- package/dist/infrastructure/completion/completion-generator.js +184 -0
- package/dist/infrastructure/completion/completion-generator.js.map +1 -0
- package/dist/infrastructure/completion/fish-completion.d.ts +8 -0
- package/dist/infrastructure/completion/fish-completion.d.ts.map +1 -0
- package/dist/infrastructure/completion/fish-completion.js +65 -0
- package/dist/infrastructure/completion/fish-completion.js.map +1 -0
- package/dist/infrastructure/completion/zsh-completion.d.ts +8 -0
- package/dist/infrastructure/completion/zsh-completion.d.ts.map +1 -0
- package/dist/infrastructure/completion/zsh-completion.js +85 -0
- package/dist/infrastructure/completion/zsh-completion.js.map +1 -0
- package/dist/infrastructure/context/context-compressor.d.ts +94 -0
- package/dist/infrastructure/context/context-compressor.d.ts.map +1 -0
- package/dist/infrastructure/context/context-compressor.js +329 -0
- package/dist/infrastructure/context/context-compressor.js.map +1 -0
- package/dist/infrastructure/governance/policy-as-code.d.ts.map +1 -1
- package/dist/infrastructure/governance/policy-as-code.js +18 -3
- package/dist/infrastructure/governance/policy-as-code.js.map +1 -1
- package/dist/infrastructure/observability/execution-tracer.d.ts +5 -2
- package/dist/infrastructure/observability/execution-tracer.d.ts.map +1 -1
- package/dist/infrastructure/observability/execution-tracer.js +45 -8
- package/dist/infrastructure/observability/execution-tracer.js.map +1 -1
- package/dist/infrastructure/security/ai-sast-scanner.d.ts +4 -0
- package/dist/infrastructure/security/ai-sast-scanner.d.ts.map +1 -1
- package/dist/infrastructure/security/ai-sast-scanner.js +82 -4
- package/dist/infrastructure/security/ai-sast-scanner.js.map +1 -1
- package/dist/infrastructure/security/enhanced-security-gate.d.ts +2 -0
- package/dist/infrastructure/security/enhanced-security-gate.d.ts.map +1 -1
- package/dist/infrastructure/security/enhanced-security-gate.js +74 -15
- package/dist/infrastructure/security/enhanced-security-gate.js.map +1 -1
- package/dist/infrastructure/storage/plan-repository.d.ts +38 -0
- package/dist/infrastructure/storage/plan-repository.d.ts.map +1 -0
- package/dist/infrastructure/storage/plan-repository.js +133 -0
- package/dist/infrastructure/storage/plan-repository.js.map +1 -0
- package/dist/infrastructure/storage/sqlite-embedding-repository.d.ts +11 -0
- package/dist/infrastructure/storage/sqlite-embedding-repository.d.ts.map +1 -1
- package/dist/infrastructure/storage/sqlite-embedding-repository.js +121 -6
- package/dist/infrastructure/storage/sqlite-embedding-repository.js.map +1 -1
- package/dist/infrastructure/ux/contextual-feature-discovery.d.ts +24 -0
- package/dist/infrastructure/ux/contextual-feature-discovery.d.ts.map +1 -0
- package/dist/infrastructure/ux/contextual-feature-discovery.js +144 -0
- package/dist/infrastructure/ux/contextual-feature-discovery.js.map +1 -0
- package/dist/infrastructure/ux/expectation-management.d.ts +33 -0
- package/dist/infrastructure/ux/expectation-management.d.ts.map +1 -1
- package/dist/infrastructure/ux/expectation-management.js +138 -4
- package/dist/infrastructure/ux/expectation-management.js.map +1 -1
- package/dist/infrastructure/ux/feature-discovery.d.ts +47 -0
- package/dist/infrastructure/ux/feature-discovery.d.ts.map +1 -0
- package/dist/infrastructure/ux/feature-discovery.js +190 -0
- package/dist/infrastructure/ux/feature-discovery.js.map +1 -0
- package/dist/infrastructure/ux/hitl-review-portal.d.ts +47 -0
- package/dist/infrastructure/ux/hitl-review-portal.d.ts.map +1 -0
- package/dist/infrastructure/ux/hitl-review-portal.js +225 -0
- package/dist/infrastructure/ux/hitl-review-portal.js.map +1 -0
- package/dist/infrastructure/ux/progress-indicator.d.ts +54 -0
- package/dist/infrastructure/ux/progress-indicator.d.ts.map +1 -0
- package/dist/infrastructure/ux/progress-indicator.js +121 -0
- package/dist/infrastructure/ux/progress-indicator.js.map +1 -0
- package/dist/infrastructure/ux/progressive-disclosure.d.ts.map +1 -1
- package/dist/infrastructure/ux/progressive-disclosure.js +2 -1
- package/dist/infrastructure/ux/progressive-disclosure.js.map +1 -1
- package/dist/infrastructure/ux/review-checkpoint.d.ts +35 -0
- package/dist/infrastructure/ux/review-checkpoint.d.ts.map +1 -0
- package/dist/infrastructure/ux/review-checkpoint.js +119 -0
- package/dist/infrastructure/ux/review-checkpoint.js.map +1 -0
- package/dist/infrastructure/ux/staged-feature-intro.d.ts +47 -0
- package/dist/infrastructure/ux/staged-feature-intro.d.ts.map +1 -0
- package/dist/infrastructure/ux/staged-feature-intro.js +144 -0
- package/dist/infrastructure/ux/staged-feature-intro.js.map +1 -0
- package/dist/infrastructure/ux/syntax-highlighter.d.ts +21 -0
- package/dist/infrastructure/ux/syntax-highlighter.d.ts.map +1 -0
- package/dist/infrastructure/ux/syntax-highlighter.js +172 -0
- package/dist/infrastructure/ux/syntax-highlighter.js.map +1 -0
- package/dist/infrastructure/xai/cot-visualizer.d.ts +1 -0
- package/dist/infrastructure/xai/cot-visualizer.d.ts.map +1 -1
- package/dist/infrastructure/xai/cot-visualizer.js +57 -10
- package/dist/infrastructure/xai/cot-visualizer.js.map +1 -1
- package/dist/presentation/cli/commands/ask-command.d.ts.map +1 -1
- package/dist/presentation/cli/commands/ask-command.js +68 -11
- package/dist/presentation/cli/commands/ask-command.js.map +1 -1
- package/dist/presentation/cli/commands/orchestrate-command.d.ts +1 -0
- package/dist/presentation/cli/commands/orchestrate-command.d.ts.map +1 -1
- package/dist/presentation/cli/commands/orchestrate-command.js +35 -1
- package/dist/presentation/cli/commands/orchestrate-command.js.map +1 -1
- package/dist/presentation/cli/commands/plan-command.d.ts.map +1 -1
- package/dist/presentation/cli/commands/plan-command.js +57 -5
- package/dist/presentation/cli/commands/plan-command.js.map +1 -1
- package/dist/presentation/cli/commands/react-command.d.ts.map +1 -1
- package/dist/presentation/cli/commands/react-command.js +95 -15
- package/dist/presentation/cli/commands/react-command.js.map +1 -1
- package/dist/presentation/cli/commands/setup-command.d.ts.map +1 -1
- package/dist/presentation/cli/commands/setup-command.js +67 -12
- package/dist/presentation/cli/commands/setup-command.js.map +1 -1
- package/dist/presentation/cli/commands/smart-command.d.ts.map +1 -1
- package/dist/presentation/cli/commands/smart-command.js +136 -18
- package/dist/presentation/cli/commands/smart-command.js.map +1 -1
- package/dist/presentation/cli/commands/trace-command.d.ts.map +1 -1
- package/dist/presentation/cli/commands/trace-command.js +9 -5
- package/dist/presentation/cli/commands/trace-command.js.map +1 -1
- package/dist/presentation/cli/commands/undo-command.js +15 -6
- package/dist/presentation/cli/commands/undo-command.js.map +1 -1
- package/dist/presentation/cli/error-display.d.ts +2 -0
- package/dist/presentation/cli/error-display.d.ts.map +1 -1
- package/dist/presentation/cli/error-display.js +177 -2
- package/dist/presentation/cli/error-display.js.map +1 -1
- package/dist/presentation/cli/keyboard-shortcuts.d.ts +27 -0
- package/dist/presentation/cli/keyboard-shortcuts.d.ts.map +1 -0
- package/dist/presentation/cli/keyboard-shortcuts.js +77 -0
- package/dist/presentation/cli/keyboard-shortcuts.js.map +1 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +20 -0
- package/dist/session.js.map +1 -1
- package/dist/utils/version.js +2 -2
- package/dist/verification/backup.d.ts.map +1 -1
- package/dist/verification/backup.js +24 -3
- package/dist/verification/backup.js.map +1 -1
- package/dist/verification/compiler.js +47 -12
- package/dist/verification/compiler.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infrastructure: Query Result Cache
|
|
3
|
+
* Caches search results (query + topK results) to avoid redundant searches
|
|
4
|
+
*
|
|
5
|
+
* Performance optimization: Reduces search latency by ~80% for repeated queries
|
|
6
|
+
* Cache invalidation: Automatically clears on codebase re-index
|
|
7
|
+
*/
|
|
8
|
+
import { createHash } from 'crypto';
|
|
9
|
+
export class QueryResultCache {
|
|
10
|
+
cache = new Map();
|
|
11
|
+
maxSize = 500; // Max cached queries
|
|
12
|
+
ttl = 60 * 60 * 1000; // 1 hour TTL
|
|
13
|
+
accessOrder = []; // LRU tracking
|
|
14
|
+
constructor(options) {
|
|
15
|
+
this.maxSize = options?.maxSize || 500;
|
|
16
|
+
this.ttl = options?.ttl || 60 * 60 * 1000;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generate cache key from query and topK
|
|
20
|
+
*/
|
|
21
|
+
getCacheKey(query, topK) {
|
|
22
|
+
const normalized = query.toLowerCase().trim();
|
|
23
|
+
const key = `${normalized}:${topK}`;
|
|
24
|
+
return createHash('sha256').update(key).digest('hex');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get cached result if available and not expired
|
|
28
|
+
*/
|
|
29
|
+
get(query, topK) {
|
|
30
|
+
const key = this.getCacheKey(query, topK);
|
|
31
|
+
const cached = this.cache.get(key);
|
|
32
|
+
if (!cached) {
|
|
33
|
+
this.recordMiss();
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
// Check if expired
|
|
37
|
+
const now = Date.now();
|
|
38
|
+
if (now - cached.timestamp > this.ttl) {
|
|
39
|
+
this.cache.delete(key);
|
|
40
|
+
this.removeFromAccessOrder(key);
|
|
41
|
+
this.recordMiss();
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
// Update access order (LRU)
|
|
45
|
+
this.updateAccessOrder(key);
|
|
46
|
+
this.recordHit();
|
|
47
|
+
return cached.chunks;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Store result in cache
|
|
51
|
+
*/
|
|
52
|
+
set(query, topK, chunks) {
|
|
53
|
+
const key = this.getCacheKey(query, topK);
|
|
54
|
+
// Evict oldest if cache is full
|
|
55
|
+
if (this.cache.size >= this.maxSize && !this.cache.has(key)) {
|
|
56
|
+
this.evictOldest();
|
|
57
|
+
}
|
|
58
|
+
this.cache.set(key, {
|
|
59
|
+
chunks,
|
|
60
|
+
timestamp: Date.now(),
|
|
61
|
+
query,
|
|
62
|
+
topK,
|
|
63
|
+
});
|
|
64
|
+
this.updateAccessOrder(key);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Clear all cached results (called on codebase re-index)
|
|
68
|
+
*/
|
|
69
|
+
clear() {
|
|
70
|
+
this.cache.clear();
|
|
71
|
+
this.accessOrder = [];
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get cache statistics
|
|
75
|
+
*/
|
|
76
|
+
getStats() {
|
|
77
|
+
const total = this.totalHits + this.totalMisses;
|
|
78
|
+
return {
|
|
79
|
+
size: this.cache.size,
|
|
80
|
+
maxSize: this.maxSize,
|
|
81
|
+
hitRate: total > 0 ? this.totalHits / total : 0,
|
|
82
|
+
totalHits: this.totalHits,
|
|
83
|
+
totalMisses: this.totalMisses,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
totalHits = 0;
|
|
87
|
+
totalMisses = 0;
|
|
88
|
+
/**
|
|
89
|
+
* Record cache hit
|
|
90
|
+
*/
|
|
91
|
+
recordHit() {
|
|
92
|
+
this.totalHits++;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Record cache miss
|
|
96
|
+
*/
|
|
97
|
+
recordMiss() {
|
|
98
|
+
this.totalMisses++;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Update access order for LRU eviction
|
|
102
|
+
*/
|
|
103
|
+
updateAccessOrder(key) {
|
|
104
|
+
const index = this.accessOrder.indexOf(key);
|
|
105
|
+
if (index > -1) {
|
|
106
|
+
this.accessOrder.splice(index, 1);
|
|
107
|
+
}
|
|
108
|
+
this.accessOrder.push(key);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Remove key from access order
|
|
112
|
+
*/
|
|
113
|
+
removeFromAccessOrder(key) {
|
|
114
|
+
const index = this.accessOrder.indexOf(key);
|
|
115
|
+
if (index > -1) {
|
|
116
|
+
this.accessOrder.splice(index, 1);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Evict oldest entry (LRU)
|
|
121
|
+
*/
|
|
122
|
+
evictOldest() {
|
|
123
|
+
if (this.accessOrder.length === 0)
|
|
124
|
+
return;
|
|
125
|
+
const oldestKey = this.accessOrder[0];
|
|
126
|
+
this.cache.delete(oldestKey);
|
|
127
|
+
this.accessOrder.shift();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Singleton instance
|
|
131
|
+
let queryResultCacheInstance = null;
|
|
132
|
+
export function getQueryResultCache() {
|
|
133
|
+
if (!queryResultCacheInstance) {
|
|
134
|
+
queryResultCacheInstance = new QueryResultCache();
|
|
135
|
+
}
|
|
136
|
+
return queryResultCacheInstance;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=query-result-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-result-cache.js","sourceRoot":"","sources":["../../../src/infrastructure/cache/query-result-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infrastructure: Security Scan Cache
|
|
3
|
+
* Caches security scan results by file content hash to avoid redundant scans
|
|
4
|
+
*
|
|
5
|
+
* Performance optimization: Reduces scan latency by ~80% for unchanged files
|
|
6
|
+
* Cache invalidation: Automatically invalidates when file content changes
|
|
7
|
+
*/
|
|
8
|
+
import type { SASTResult } from '../security/ai-sast-scanner.js';
|
|
9
|
+
import type { LicenseScanResult } from '../security/license-scanner.js';
|
|
10
|
+
import type { ProviderBiasResult } from '../security/provider-bias-detector.js';
|
|
11
|
+
export declare class SecurityScanCache {
|
|
12
|
+
private cache;
|
|
13
|
+
private maxSize;
|
|
14
|
+
private ttl;
|
|
15
|
+
constructor(maxSize?: number, ttl?: number);
|
|
16
|
+
/**
|
|
17
|
+
* Generate content hash from file path and code content
|
|
18
|
+
*/
|
|
19
|
+
private getContentHash;
|
|
20
|
+
/**
|
|
21
|
+
* Generate cache key from filepath
|
|
22
|
+
*/
|
|
23
|
+
private getCacheKey;
|
|
24
|
+
/**
|
|
25
|
+
* Get cached scan results if available and not expired
|
|
26
|
+
*/
|
|
27
|
+
get(filepath: string, code: string): {
|
|
28
|
+
sast: SASTResult;
|
|
29
|
+
license: LicenseScanResult;
|
|
30
|
+
providerBias: ProviderBiasResult;
|
|
31
|
+
} | null;
|
|
32
|
+
/**
|
|
33
|
+
* Store scan results in cache
|
|
34
|
+
*/
|
|
35
|
+
set(filepath: string, code: string, sast: SASTResult, license: LicenseScanResult, providerBias: ProviderBiasResult): void;
|
|
36
|
+
/**
|
|
37
|
+
* Evict oldest entries (LRU eviction)
|
|
38
|
+
*/
|
|
39
|
+
private evictOldest;
|
|
40
|
+
/**
|
|
41
|
+
* Clear expired entries
|
|
42
|
+
*/
|
|
43
|
+
clearExpired(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Clear all cache
|
|
46
|
+
*/
|
|
47
|
+
clear(): void;
|
|
48
|
+
/**
|
|
49
|
+
* Get cache statistics
|
|
50
|
+
*/
|
|
51
|
+
getStats(): {
|
|
52
|
+
size: number;
|
|
53
|
+
maxSize: number;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export declare function getSecurityScanCache(): SecurityScanCache;
|
|
57
|
+
//# sourceMappingURL=security-scan-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-scan-cache.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/cache/security-scan-cache.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAWhF,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,GAAG,CAAS;gBAER,OAAO,GAAE,MAAY,EAAE,GAAG,GAAE,MAAgB;IAKxD;;OAEG;IACH,OAAO,CAAC,cAAc;IAKtB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG;QACnC,IAAI,EAAE,UAAU,CAAC;QACjB,OAAO,EAAE,iBAAiB,CAAC;QAC3B,YAAY,EAAE,kBAAkB,CAAC;KAClC,GAAG,IAAI;IA6BR;;OAEG;IACH,GAAG,CACD,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,iBAAiB,EAC1B,YAAY,EAAE,kBAAkB,GAC/B,IAAI;IAmBP;;OAEG;IACH,OAAO,CAAC,WAAW;IAYnB;;OAEG;IACH,YAAY,IAAI,IAAI;IASpB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;CAM9C;AAKD,wBAAgB,oBAAoB,IAAI,iBAAiB,CAKxD"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infrastructure: Security Scan Cache
|
|
3
|
+
* Caches security scan results by file content hash to avoid redundant scans
|
|
4
|
+
*
|
|
5
|
+
* Performance optimization: Reduces scan latency by ~80% for unchanged files
|
|
6
|
+
* Cache invalidation: Automatically invalidates when file content changes
|
|
7
|
+
*/
|
|
8
|
+
import { createHash } from 'crypto';
|
|
9
|
+
export class SecurityScanCache {
|
|
10
|
+
cache = new Map();
|
|
11
|
+
maxSize;
|
|
12
|
+
ttl; // Time to live in milliseconds
|
|
13
|
+
constructor(maxSize = 500, ttl = 3600000) {
|
|
14
|
+
this.maxSize = maxSize;
|
|
15
|
+
this.ttl = ttl;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Generate content hash from file path and code content
|
|
19
|
+
*/
|
|
20
|
+
getContentHash(filepath, code) {
|
|
21
|
+
const normalized = `${filepath}:${code}`;
|
|
22
|
+
return createHash('sha256').update(normalized).digest('hex');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Generate cache key from filepath
|
|
26
|
+
*/
|
|
27
|
+
getCacheKey(filepath, contentHash) {
|
|
28
|
+
return createHash('sha256').update(`${filepath}:${contentHash}`).digest('hex');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get cached scan results if available and not expired
|
|
32
|
+
*/
|
|
33
|
+
get(filepath, code) {
|
|
34
|
+
const contentHash = this.getContentHash(filepath, code);
|
|
35
|
+
const key = this.getCacheKey(filepath, contentHash);
|
|
36
|
+
const cached = this.cache.get(key);
|
|
37
|
+
if (!cached) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
// Verify content hash matches (file hasn't changed)
|
|
41
|
+
if (cached.contentHash !== contentHash) {
|
|
42
|
+
this.cache.delete(key);
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
// Check if expired
|
|
46
|
+
const now = Date.now();
|
|
47
|
+
if (now - cached.timestamp > this.ttl) {
|
|
48
|
+
this.cache.delete(key);
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
sast: cached.sast,
|
|
53
|
+
license: cached.license,
|
|
54
|
+
providerBias: cached.providerBias,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Store scan results in cache
|
|
59
|
+
*/
|
|
60
|
+
set(filepath, code, sast, license, providerBias) {
|
|
61
|
+
const contentHash = this.getContentHash(filepath, code);
|
|
62
|
+
const key = this.getCacheKey(filepath, contentHash);
|
|
63
|
+
// Evict oldest entries if cache is full
|
|
64
|
+
if (this.cache.size >= this.maxSize) {
|
|
65
|
+
this.evictOldest();
|
|
66
|
+
}
|
|
67
|
+
this.cache.set(key, {
|
|
68
|
+
filepath,
|
|
69
|
+
contentHash,
|
|
70
|
+
sast,
|
|
71
|
+
license,
|
|
72
|
+
providerBias,
|
|
73
|
+
timestamp: Date.now(),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Evict oldest entries (LRU eviction)
|
|
78
|
+
*/
|
|
79
|
+
evictOldest() {
|
|
80
|
+
// Remove 10% of oldest entries
|
|
81
|
+
const entriesToRemove = Math.ceil(this.maxSize * 0.1);
|
|
82
|
+
const entries = Array.from(this.cache.entries())
|
|
83
|
+
.sort((a, b) => a[1].timestamp - b[1].timestamp)
|
|
84
|
+
.slice(0, entriesToRemove);
|
|
85
|
+
for (const [key] of entries) {
|
|
86
|
+
this.cache.delete(key);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Clear expired entries
|
|
91
|
+
*/
|
|
92
|
+
clearExpired() {
|
|
93
|
+
const now = Date.now();
|
|
94
|
+
for (const [key, value] of this.cache.entries()) {
|
|
95
|
+
if (now - value.timestamp > this.ttl) {
|
|
96
|
+
this.cache.delete(key);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Clear all cache
|
|
102
|
+
*/
|
|
103
|
+
clear() {
|
|
104
|
+
this.cache.clear();
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get cache statistics
|
|
108
|
+
*/
|
|
109
|
+
getStats() {
|
|
110
|
+
return {
|
|
111
|
+
size: this.cache.size,
|
|
112
|
+
maxSize: this.maxSize,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Singleton instance
|
|
117
|
+
let securityScanCacheInstance = null;
|
|
118
|
+
export function getSecurityScanCache() {
|
|
119
|
+
if (!securityScanCacheInstance) {
|
|
120
|
+
securityScanCacheInstance = new SecurityScanCache();
|
|
121
|
+
}
|
|
122
|
+
return securityScanCacheInstance;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=security-scan-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-scan-cache.js","sourceRoot":"","sources":["../../../src/infrastructure/cache/security-scan-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash-completion.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/completion/bash-completion.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CA6F/C"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bash Completion Script Generator
|
|
3
|
+
*/
|
|
4
|
+
import { getAllCommands, } from './completion-generator.js';
|
|
5
|
+
/**
|
|
6
|
+
* Generate bash completion script
|
|
7
|
+
*/
|
|
8
|
+
export function generateBashCompletion() {
|
|
9
|
+
return `# Bash completion for codehere
|
|
10
|
+
# Installation: source <(codehere --completion bash) or add to ~/.bashrc
|
|
11
|
+
|
|
12
|
+
_codehere_completion() {
|
|
13
|
+
local cur prev words cword
|
|
14
|
+
COMPREPLY=()
|
|
15
|
+
cur="\${COMP_WORDS[COMP_CWORD]}"
|
|
16
|
+
prev="\${COMP_WORDS[COMP_CWORD-1]}"
|
|
17
|
+
words=("\${COMP_WORDS[@]}")
|
|
18
|
+
cword="\${COMP_CWORD}"
|
|
19
|
+
|
|
20
|
+
# Commands list
|
|
21
|
+
local commands="${getAllCommands().join(' ')}"
|
|
22
|
+
|
|
23
|
+
# Main command completion
|
|
24
|
+
if [ $COMP_CWORD -eq 1 ]; then
|
|
25
|
+
COMPREPLY=( $(compgen -W "\${commands}" -- "\${cur}") )
|
|
26
|
+
return 0
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
local command="\${words[1]}"
|
|
30
|
+
|
|
31
|
+
case "\${command}" in
|
|
32
|
+
config)
|
|
33
|
+
if [ $COMP_CWORD -eq 2 ]; then
|
|
34
|
+
COMPREPLY=( $(compgen -W "get set reset" -- "\${cur}") )
|
|
35
|
+
elif [ $COMP_CWORD -eq 3 ] && [ "\${prev}" = "get" ] || [ "\${prev}" = "set" ]; then
|
|
36
|
+
# Config keys (simplified - would need dynamic lookup)
|
|
37
|
+
local keys="autoCommit temperature maxResults model enableStreaming enableSecurityScan enableVerification"
|
|
38
|
+
COMPREPLY=( $(compgen -W "\${keys}" -- "\${cur}") )
|
|
39
|
+
fi
|
|
40
|
+
;;
|
|
41
|
+
undo)
|
|
42
|
+
if [ $COMP_CWORD -eq 2 ]; then
|
|
43
|
+
COMPREPLY=( $(compgen -W "undo list restore" -- "\${cur}") )
|
|
44
|
+
fi
|
|
45
|
+
;;
|
|
46
|
+
trace)
|
|
47
|
+
if [ $COMP_CWORD -eq 2 ]; then
|
|
48
|
+
COMPREPLY=( $(compgen -W "show reproduce list" -- "\${cur}") )
|
|
49
|
+
fi
|
|
50
|
+
;;
|
|
51
|
+
decision)
|
|
52
|
+
if [ $COMP_CWORD -eq 2 ]; then
|
|
53
|
+
COMPREPLY=( $(compgen -W "record list query explain" -- "\${cur}") )
|
|
54
|
+
fi
|
|
55
|
+
;;
|
|
56
|
+
knowledge)
|
|
57
|
+
if [ $COMP_CWORD -eq 2 ]; then
|
|
58
|
+
COMPREPLY=( $(compgen -W "query list summary extract" -- "\${cur}") )
|
|
59
|
+
fi
|
|
60
|
+
;;
|
|
61
|
+
learning)
|
|
62
|
+
if [ $COMP_CWORD -eq 2 ]; then
|
|
63
|
+
COMPREPLY=( $(compgen -W "overview patterns knowledge insights" -- "\${cur}") )
|
|
64
|
+
fi
|
|
65
|
+
;;
|
|
66
|
+
cost)
|
|
67
|
+
if [ $COMP_CWORD -eq 2 ]; then
|
|
68
|
+
COMPREPLY=( $(compgen -W "status summary run reset" -- "\${cur}") )
|
|
69
|
+
fi
|
|
70
|
+
;;
|
|
71
|
+
*)
|
|
72
|
+
# Option completion for other commands
|
|
73
|
+
if [[ "\${cur}" == -* ]]; then
|
|
74
|
+
case "\${command}" in
|
|
75
|
+
plan)
|
|
76
|
+
COMPREPLY=( $(compgen -W "--execute" -- "\${cur}") )
|
|
77
|
+
;;
|
|
78
|
+
orchestrate)
|
|
79
|
+
COMPREPLY=( $(compgen -W "--mode --plan-id" -- "\${cur}") )
|
|
80
|
+
;;
|
|
81
|
+
ask|react)
|
|
82
|
+
COMPREPLY=( $(compgen -W "--stream --no-stream" -- "\${cur}") )
|
|
83
|
+
;;
|
|
84
|
+
setup)
|
|
85
|
+
COMPREPLY=( $(compgen -W "--force -f" -- "\${cur}") )
|
|
86
|
+
;;
|
|
87
|
+
index)
|
|
88
|
+
COMPREPLY=( $(compgen -W "--repo -r" -- "\${cur}") )
|
|
89
|
+
;;
|
|
90
|
+
esac
|
|
91
|
+
fi
|
|
92
|
+
;;
|
|
93
|
+
esac
|
|
94
|
+
|
|
95
|
+
return 0
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
complete -F _codehere_completion codehere
|
|
99
|
+
`;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=bash-completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash-completion.js","sourceRoot":"","sources":["../../../src/infrastructure/completion/bash-completion.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,cAAc,GAKf,MAAM,2BAA2B,CAAC;AAEnC;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;;;;;;;;;;oBAYW,cAAc,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8E7C,CAAC;AAEF,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell Completion Generator
|
|
3
|
+
* Generates completion scripts for bash, zsh, and fish shells
|
|
4
|
+
*/
|
|
5
|
+
export interface CommandDefinition {
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
options?: {
|
|
9
|
+
flag: string;
|
|
10
|
+
description: string;
|
|
11
|
+
}[];
|
|
12
|
+
subcommands?: string[];
|
|
13
|
+
dynamicCompletions?: (context: CompletionContext) => Promise<string[]>;
|
|
14
|
+
}
|
|
15
|
+
export interface CompletionContext {
|
|
16
|
+
command?: string;
|
|
17
|
+
subcommand?: string;
|
|
18
|
+
currentWord?: string;
|
|
19
|
+
previousWords: string[];
|
|
20
|
+
}
|
|
21
|
+
export declare const COMMAND_DEFINITIONS: Record<string, CommandDefinition>;
|
|
22
|
+
/**
|
|
23
|
+
* Get all command names
|
|
24
|
+
*/
|
|
25
|
+
export declare function getAllCommands(): string[];
|
|
26
|
+
/**
|
|
27
|
+
* Get command definition
|
|
28
|
+
*/
|
|
29
|
+
export declare function getCommandDefinition(command: string): CommandDefinition | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Get subcommands for a command
|
|
32
|
+
*/
|
|
33
|
+
export declare function getSubcommands(command: string): string[];
|
|
34
|
+
/**
|
|
35
|
+
* Get options for a command
|
|
36
|
+
*/
|
|
37
|
+
export declare function getCommandOptions(command: string): string[];
|
|
38
|
+
/**
|
|
39
|
+
* Generate file completions (for filepath arguments)
|
|
40
|
+
*/
|
|
41
|
+
export declare function getFileCompletions(prefix: string): Promise<string[]>;
|
|
42
|
+
//# sourceMappingURL=completion-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-generator.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/completion/completion-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAClD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAGD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CA+FjE,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAEzC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAEnF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAGxD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAgB3D;AAmCD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAI1E"}
|