couchloop-eq-mcp 1.0.4 → 1.0.5

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 (282) hide show
  1. package/README.md +24 -11
  2. package/dist/developer/analyzers/bloat-detector.d.ts +89 -0
  3. package/dist/developer/analyzers/bloat-detector.d.ts.map +1 -0
  4. package/dist/developer/analyzers/bloat-detector.js +483 -0
  5. package/dist/developer/analyzers/bloat-detector.js.map +1 -0
  6. package/dist/developer/backup/auto-backup.d.ts +96 -0
  7. package/dist/developer/backup/auto-backup.d.ts.map +1 -0
  8. package/dist/developer/backup/auto-backup.js +346 -0
  9. package/dist/developer/backup/auto-backup.js.map +1 -0
  10. package/dist/developer/blockers/package-blocker.d.ts +33 -0
  11. package/dist/developer/blockers/package-blocker.d.ts.map +1 -0
  12. package/dist/developer/blockers/package-blocker.js +224 -0
  13. package/dist/developer/blockers/package-blocker.js.map +1 -0
  14. package/dist/developer/evaluators/ai-error-preventer.d.ts +54 -0
  15. package/dist/developer/evaluators/ai-error-preventer.d.ts.map +1 -0
  16. package/dist/developer/evaluators/ai-error-preventer.js +270 -0
  17. package/dist/developer/evaluators/ai-error-preventer.js.map +1 -0
  18. package/dist/developer/evaluators/build-context-detector.d.ts +44 -0
  19. package/dist/developer/evaluators/build-context-detector.d.ts.map +1 -0
  20. package/dist/developer/evaluators/build-context-detector.js +258 -0
  21. package/dist/developer/evaluators/build-context-detector.js.map +1 -0
  22. package/dist/developer/evaluators/package-evaluator.d.ts +37 -0
  23. package/dist/developer/evaluators/package-evaluator.d.ts.map +1 -0
  24. package/dist/developer/evaluators/package-evaluator.js +278 -0
  25. package/dist/developer/evaluators/package-evaluator.js.map +1 -0
  26. package/dist/developer/guards/file-guardian.d.ts +79 -0
  27. package/dist/developer/guards/file-guardian.d.ts.map +1 -0
  28. package/dist/developer/guards/file-guardian.js +309 -0
  29. package/dist/developer/guards/file-guardian.js.map +1 -0
  30. package/dist/developer/managers/context-manager.d.ts +61 -0
  31. package/dist/developer/managers/context-manager.d.ts.map +1 -0
  32. package/dist/developer/managers/context-manager.js +302 -0
  33. package/dist/developer/managers/context-manager.js.map +1 -0
  34. package/dist/developer/metrics/complexity-calculator.d.ts +52 -0
  35. package/dist/developer/metrics/complexity-calculator.d.ts.map +1 -0
  36. package/dist/developer/metrics/complexity-calculator.js +259 -0
  37. package/dist/developer/metrics/complexity-calculator.js.map +1 -0
  38. package/dist/developer/reports/review-summary.d.ts +49 -0
  39. package/dist/developer/reports/review-summary.d.ts.map +1 -0
  40. package/dist/developer/reports/review-summary.js +249 -0
  41. package/dist/developer/reports/review-summary.js.map +1 -0
  42. package/dist/developer/scanners/review-assistant.d.ts +41 -0
  43. package/dist/developer/scanners/review-assistant.d.ts.map +1 -0
  44. package/dist/developer/scanners/review-assistant.js +374 -0
  45. package/dist/developer/scanners/review-assistant.js.map +1 -0
  46. package/dist/developer/scanners/secret-scanner.d.ts +66 -0
  47. package/dist/developer/scanners/secret-scanner.d.ts.map +1 -0
  48. package/dist/developer/scanners/secret-scanner.js +287 -0
  49. package/dist/developer/scanners/secret-scanner.js.map +1 -0
  50. package/dist/developer/scanners/sql-injection-detector.d.ts +54 -0
  51. package/dist/developer/scanners/sql-injection-detector.d.ts.map +1 -0
  52. package/dist/developer/scanners/sql-injection-detector.js +174 -0
  53. package/dist/developer/scanners/sql-injection-detector.js.map +1 -0
  54. package/dist/developer/scanners/xss-detector.d.ts +60 -0
  55. package/dist/developer/scanners/xss-detector.d.ts.map +1 -0
  56. package/dist/developer/scanners/xss-detector.js +229 -0
  57. package/dist/developer/scanners/xss-detector.js.map +1 -0
  58. package/dist/developer/types/ai-errors.d.ts +34 -0
  59. package/dist/developer/types/ai-errors.d.ts.map +1 -0
  60. package/dist/developer/types/ai-errors.js +271 -0
  61. package/dist/developer/types/ai-errors.js.map +1 -0
  62. package/dist/developer/types/package.d.ts +32 -0
  63. package/dist/developer/types/package.d.ts.map +1 -0
  64. package/dist/developer/types/package.js +5 -0
  65. package/dist/developer/types/package.js.map +1 -0
  66. package/dist/developer/updaters/dependency-updater.d.ts +102 -0
  67. package/dist/developer/updaters/dependency-updater.d.ts.map +1 -0
  68. package/dist/developer/updaters/dependency-updater.js +472 -0
  69. package/dist/developer/updaters/dependency-updater.js.map +1 -0
  70. package/dist/developer/validators/cargo.d.ts +14 -0
  71. package/dist/developer/validators/cargo.d.ts.map +1 -0
  72. package/dist/developer/validators/cargo.js +132 -0
  73. package/dist/developer/validators/cargo.js.map +1 -0
  74. package/dist/developer/validators/gem.d.ts +14 -0
  75. package/dist/developer/validators/gem.d.ts.map +1 -0
  76. package/dist/developer/validators/gem.js +85 -0
  77. package/dist/developer/validators/gem.js.map +1 -0
  78. package/dist/developer/validators/go.d.ts +14 -0
  79. package/dist/developer/validators/go.d.ts.map +1 -0
  80. package/dist/developer/validators/go.js +138 -0
  81. package/dist/developer/validators/go.js.map +1 -0
  82. package/dist/developer/validators/maven.d.ts +14 -0
  83. package/dist/developer/validators/maven.d.ts.map +1 -0
  84. package/dist/developer/validators/maven.js +99 -0
  85. package/dist/developer/validators/maven.js.map +1 -0
  86. package/dist/developer/validators/npm.d.ts +14 -0
  87. package/dist/developer/validators/npm.d.ts.map +1 -0
  88. package/dist/developer/validators/npm.js +96 -0
  89. package/dist/developer/validators/npm.js.map +1 -0
  90. package/dist/developer/validators/nuget.d.ts +15 -0
  91. package/dist/developer/validators/nuget.d.ts.map +1 -0
  92. package/dist/developer/validators/nuget.js +107 -0
  93. package/dist/developer/validators/nuget.js.map +1 -0
  94. package/dist/developer/validators/pypi.d.ts +14 -0
  95. package/dist/developer/validators/pypi.d.ts.map +1 -0
  96. package/dist/developer/validators/pypi.js +118 -0
  97. package/dist/developer/validators/pypi.js.map +1 -0
  98. package/dist/developer/validators/registry-manager.d.ts +37 -0
  99. package/dist/developer/validators/registry-manager.d.ts.map +1 -0
  100. package/dist/developer/validators/registry-manager.js +89 -0
  101. package/dist/developer/validators/registry-manager.js.map +1 -0
  102. package/dist/developer/validators/version-checker.d.ts +145 -0
  103. package/dist/developer/validators/version-checker.d.ts.map +1 -0
  104. package/dist/developer/validators/version-checker.js +529 -0
  105. package/dist/developer/validators/version-checker.js.map +1 -0
  106. package/dist/server/index.js.map +1 -1
  107. package/dist/server/middleware/auth.d.ts +7 -9
  108. package/dist/server/middleware/auth.d.ts.map +1 -1
  109. package/dist/server/middleware/auth.js.map +1 -1
  110. package/dist/tools/check-versions.d.ts +100 -0
  111. package/dist/tools/check-versions.d.ts.map +1 -0
  112. package/dist/tools/check-versions.js +328 -0
  113. package/dist/tools/check-versions.js.map +1 -0
  114. package/dist/tools/detect-code-smell.d.ts +9 -0
  115. package/dist/tools/detect-code-smell.d.ts.map +1 -0
  116. package/dist/tools/detect-code-smell.js +231 -0
  117. package/dist/tools/detect-code-smell.js.map +1 -0
  118. package/dist/tools/index.d.ts +471 -0
  119. package/dist/tools/index.d.ts.map +1 -1
  120. package/dist/tools/index.js +178 -0
  121. package/dist/tools/index.js.map +1 -1
  122. package/dist/tools/journey.js +1 -1
  123. package/dist/tools/journey.js.map +1 -1
  124. package/dist/tools/pre-review-code.d.ts +71 -0
  125. package/dist/tools/pre-review-code.d.ts.map +1 -0
  126. package/dist/tools/pre-review-code.js +159 -0
  127. package/dist/tools/pre-review-code.js.map +1 -0
  128. package/dist/tools/preserve-context.d.ts +27 -0
  129. package/dist/tools/preserve-context.d.ts.map +1 -0
  130. package/dist/tools/preserve-context.js +98 -0
  131. package/dist/tools/preserve-context.js.map +1 -0
  132. package/dist/tools/protect-files.d.ts +224 -0
  133. package/dist/tools/protect-files.d.ts.map +1 -0
  134. package/dist/tools/protect-files.js +286 -0
  135. package/dist/tools/protect-files.js.map +1 -0
  136. package/dist/tools/scan-security.d.ts +38 -0
  137. package/dist/tools/scan-security.d.ts.map +1 -0
  138. package/dist/tools/scan-security.js +237 -0
  139. package/dist/tools/scan-security.js.map +1 -0
  140. package/dist/tools/validate_packages.d.ts +8 -0
  141. package/dist/tools/validate_packages.d.ts.map +1 -0
  142. package/dist/tools/validate_packages.js +159 -0
  143. package/dist/tools/validate_packages.js.map +1 -0
  144. package/dist/types/auth.d.ts.map +1 -1
  145. package/dist/types/auth.js +1 -2
  146. package/dist/types/auth.js.map +1 -1
  147. package/dist/types/context.d.ts +46 -0
  148. package/dist/types/context.d.ts.map +1 -0
  149. package/dist/types/context.js +17 -0
  150. package/dist/types/context.js.map +1 -0
  151. package/dist/types/file-protection.d.ts +50 -0
  152. package/dist/types/file-protection.d.ts.map +1 -0
  153. package/dist/types/file-protection.js +9 -0
  154. package/dist/types/file-protection.js.map +1 -0
  155. package/dist/utils/errorHandler.d.ts.map +1 -1
  156. package/dist/utils/errorHandler.js +2 -1
  157. package/dist/utils/errorHandler.js.map +1 -1
  158. package/package.json +23 -2
  159. package/dist/db/migrate.d.ts +0 -4
  160. package/dist/db/migrate.d.ts.map +0 -1
  161. package/dist/db/migrate.js +0 -34
  162. package/dist/db/migrate.js.map +0 -1
  163. package/dist/db/migrations/schema.d.ts +0 -1074
  164. package/dist/db/migrations/schema.d.ts.map +0 -1
  165. package/dist/db/migrations/schema.js +0 -160
  166. package/dist/db/migrations/schema.js.map +0 -1
  167. package/dist/db/schema.d.ts +0 -1576
  168. package/dist/db/schema.d.ts.map +0 -1
  169. package/dist/db/schema.js +0 -204
  170. package/dist/db/schema.js.map +0 -1
  171. package/dist/db/seed.d.ts +0 -4
  172. package/dist/db/seed.d.ts.map +0 -1
  173. package/dist/db/seed.js +0 -57
  174. package/dist/db/seed.js.map +0 -1
  175. package/dist/db/seedOAuth.d.ts +0 -4
  176. package/dist/db/seedOAuth.d.ts.map +0 -1
  177. package/dist/db/seedOAuth.js +0 -76
  178. package/dist/db/seedOAuth.js.map +0 -1
  179. package/dist/governance/config.d.ts +0 -66
  180. package/dist/governance/config.d.ts.map +0 -1
  181. package/dist/governance/config.js +0 -238
  182. package/dist/governance/config.js.map +0 -1
  183. package/dist/governance/detectors/hallucination.d.ts +0 -61
  184. package/dist/governance/detectors/hallucination.d.ts.map +0 -1
  185. package/dist/governance/detectors/hallucination.js +0 -338
  186. package/dist/governance/detectors/hallucination.js.map +0 -1
  187. package/dist/governance/detectors/inconsistency.d.ts +0 -99
  188. package/dist/governance/detectors/inconsistency.d.ts.map +0 -1
  189. package/dist/governance/detectors/inconsistency.js +0 -548
  190. package/dist/governance/detectors/inconsistency.js.map +0 -1
  191. package/dist/governance/detectors/toneDrift.d.ts +0 -63
  192. package/dist/governance/detectors/toneDrift.d.ts.map +0 -1
  193. package/dist/governance/detectors/toneDrift.js +0 -421
  194. package/dist/governance/detectors/toneDrift.js.map +0 -1
  195. package/dist/governance/detectors/unsafeReasoning.d.ts +0 -54
  196. package/dist/governance/detectors/unsafeReasoning.d.ts.map +0 -1
  197. package/dist/governance/detectors/unsafeReasoning.js +0 -473
  198. package/dist/governance/detectors/unsafeReasoning.js.map +0 -1
  199. package/dist/governance/evaluationEngine.d.ts +0 -112
  200. package/dist/governance/evaluationEngine.d.ts.map +0 -1
  201. package/dist/governance/evaluationEngine.js +0 -265
  202. package/dist/governance/evaluationEngine.js.map +0 -1
  203. package/dist/governance/intervention.d.ts +0 -81
  204. package/dist/governance/intervention.d.ts.map +0 -1
  205. package/dist/governance/intervention.js +0 -405
  206. package/dist/governance/intervention.js.map +0 -1
  207. package/dist/server/oauth/anomalyDetection.d.ts +0 -146
  208. package/dist/server/oauth/anomalyDetection.d.ts.map +0 -1
  209. package/dist/server/oauth/anomalyDetection.js +0 -405
  210. package/dist/server/oauth/anomalyDetection.js.map +0 -1
  211. package/dist/server/oauth/authServer.d.ts +0 -61
  212. package/dist/server/oauth/authServer.d.ts.map +0 -1
  213. package/dist/server/oauth/authServer.js +0 -283
  214. package/dist/server/oauth/authServer.js.map +0 -1
  215. package/dist/server/oauth/dpop.d.ts +0 -135
  216. package/dist/server/oauth/dpop.d.ts.map +0 -1
  217. package/dist/server/oauth/dpop.js +0 -338
  218. package/dist/server/oauth/dpop.js.map +0 -1
  219. package/dist/server/oauth/gdpr/consent.d.ts +0 -173
  220. package/dist/server/oauth/gdpr/consent.d.ts.map +0 -1
  221. package/dist/server/oauth/gdpr/consent.js +0 -388
  222. package/dist/server/oauth/gdpr/consent.js.map +0 -1
  223. package/dist/server/oauth/gdpr/dataPortability.d.ts +0 -214
  224. package/dist/server/oauth/gdpr/dataPortability.d.ts.map +0 -1
  225. package/dist/server/oauth/gdpr/dataPortability.js +0 -486
  226. package/dist/server/oauth/gdpr/dataPortability.js.map +0 -1
  227. package/dist/server/oauth/gdpr/index.d.ts +0 -103
  228. package/dist/server/oauth/gdpr/index.d.ts.map +0 -1
  229. package/dist/server/oauth/gdpr/index.js +0 -273
  230. package/dist/server/oauth/gdpr/index.js.map +0 -1
  231. package/dist/server/oauth/gdpr/rightToErasure.d.ts +0 -184
  232. package/dist/server/oauth/gdpr/rightToErasure.d.ts.map +0 -1
  233. package/dist/server/oauth/gdpr/rightToErasure.js +0 -527
  234. package/dist/server/oauth/gdpr/rightToErasure.js.map +0 -1
  235. package/dist/server/oauth/monitoring/securityMonitor.d.ts +0 -218
  236. package/dist/server/oauth/monitoring/securityMonitor.d.ts.map +0 -1
  237. package/dist/server/oauth/monitoring/securityMonitor.js +0 -615
  238. package/dist/server/oauth/monitoring/securityMonitor.js.map +0 -1
  239. package/dist/server/oauth/pkce.d.ts +0 -61
  240. package/dist/server/oauth/pkce.d.ts.map +0 -1
  241. package/dist/server/oauth/pkce.js +0 -157
  242. package/dist/server/oauth/pkce.js.map +0 -1
  243. package/dist/server/oauth/providers/base.d.ts +0 -147
  244. package/dist/server/oauth/providers/base.d.ts.map +0 -1
  245. package/dist/server/oauth/providers/base.js +0 -312
  246. package/dist/server/oauth/providers/base.js.map +0 -1
  247. package/dist/server/oauth/providers/github.d.ts +0 -55
  248. package/dist/server/oauth/providers/github.d.ts.map +0 -1
  249. package/dist/server/oauth/providers/github.js +0 -225
  250. package/dist/server/oauth/providers/github.js.map +0 -1
  251. package/dist/server/oauth/providers/google.d.ts +0 -49
  252. package/dist/server/oauth/providers/google.d.ts.map +0 -1
  253. package/dist/server/oauth/providers/google.js +0 -153
  254. package/dist/server/oauth/providers/google.js.map +0 -1
  255. package/dist/server/oauth/providers/index.d.ts +0 -9
  256. package/dist/server/oauth/providers/index.d.ts.map +0 -1
  257. package/dist/server/oauth/providers/index.js +0 -24
  258. package/dist/server/oauth/providers/index.js.map +0 -1
  259. package/dist/server/oauth/refreshTokenRotation.d.ts +0 -114
  260. package/dist/server/oauth/refreshTokenRotation.d.ts.map +0 -1
  261. package/dist/server/oauth/refreshTokenRotation.js +0 -344
  262. package/dist/server/oauth/refreshTokenRotation.js.map +0 -1
  263. package/dist/server/oauth/security.d.ts +0 -101
  264. package/dist/server/oauth/security.d.ts.map +0 -1
  265. package/dist/server/oauth/security.js +0 -268
  266. package/dist/server/oauth/security.js.map +0 -1
  267. package/dist/server/oauth/tokenEncryption.d.ts +0 -80
  268. package/dist/server/oauth/tokenEncryption.d.ts.map +0 -1
  269. package/dist/server/oauth/tokenEncryption.js +0 -218
  270. package/dist/server/oauth/tokenEncryption.js.map +0 -1
  271. package/dist/tools/sendMessage-complex-backup.d.ts +0 -6
  272. package/dist/tools/sendMessage-complex-backup.d.ts.map +0 -1
  273. package/dist/tools/sendMessage-complex-backup.js +0 -545
  274. package/dist/tools/sendMessage-complex-backup.js.map +0 -1
  275. package/dist/tools/sendMessage-revised.d.ts +0 -11
  276. package/dist/tools/sendMessage-revised.d.ts.map +0 -1
  277. package/dist/tools/sendMessage-revised.js +0 -429
  278. package/dist/tools/sendMessage-revised.js.map +0 -1
  279. package/dist/tools/sendMessage-truly-simple.d.ts +0 -8
  280. package/dist/tools/sendMessage-truly-simple.d.ts.map +0 -1
  281. package/dist/tools/sendMessage-truly-simple.js +0 -299
  282. package/dist/tools/sendMessage-truly-simple.js.map +0 -1
@@ -0,0 +1,302 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { nanoid } from 'nanoid';
4
+ import { logger } from '../../utils/logger.js';
5
+ const CONTEXT_STORE_PATH = path.join(process.cwd(), 'src', 'db', 'context-store.json');
6
+ const MAX_CONTEXT_WINDOW_TOKENS = 200000; // Approximate token limit
7
+ const AVG_CHARS_PER_TOKEN = 4; // Average characters per token
8
+ export class ContextManager {
9
+ store;
10
+ isInitialized = false;
11
+ constructor() {
12
+ this.store = {
13
+ version: '1.0.0',
14
+ entries: [],
15
+ metadata: {
16
+ created_at: new Date().toISOString(),
17
+ last_updated: new Date().toISOString(),
18
+ },
19
+ };
20
+ }
21
+ /**
22
+ * Initialize the context store from disk
23
+ */
24
+ async initialize() {
25
+ try {
26
+ // Create parent directory if it doesn't exist
27
+ const dir = path.dirname(CONTEXT_STORE_PATH);
28
+ if (!fs.existsSync(dir)) {
29
+ fs.mkdirSync(dir, { recursive: true });
30
+ }
31
+ // Load existing store or create new one
32
+ if (fs.existsSync(CONTEXT_STORE_PATH)) {
33
+ const data = fs.readFileSync(CONTEXT_STORE_PATH, 'utf-8');
34
+ this.store = JSON.parse(data);
35
+ logger.info(`Loaded context store with ${this.store.entries.length} entries`);
36
+ }
37
+ else {
38
+ this.createDefaultStore();
39
+ this.save();
40
+ logger.info('Created new context store');
41
+ }
42
+ this.isInitialized = true;
43
+ }
44
+ catch (error) {
45
+ logger.error('Failed to initialize context manager:', error);
46
+ throw new Error(`Context manager initialization failed: ${error}`);
47
+ }
48
+ }
49
+ /**
50
+ * Store a context entry
51
+ */
52
+ async storeEntry(category, content) {
53
+ this.ensureInitialized();
54
+ try {
55
+ const entry = {
56
+ id: nanoid(),
57
+ category,
58
+ content,
59
+ timestamp: new Date(),
60
+ usage_count: 0,
61
+ last_retrieved: null,
62
+ };
63
+ this.store.entries.push(entry);
64
+ this.store.metadata.last_updated = new Date().toISOString();
65
+ this.save();
66
+ logger.info(`Stored context entry: ${entry.id} in category: ${category}`);
67
+ return {
68
+ success: true,
69
+ action: 'store',
70
+ message: `Successfully stored context in "${category}" category`,
71
+ data: [entry],
72
+ };
73
+ }
74
+ catch (error) {
75
+ logger.error('Error storing context:', error);
76
+ throw new Error(`Failed to store context: ${error}`);
77
+ }
78
+ }
79
+ /**
80
+ * Retrieve context entries by category or search term
81
+ */
82
+ async retrieve(category, searchTerm) {
83
+ this.ensureInitialized();
84
+ try {
85
+ let results = this.store.entries;
86
+ // Filter by category if provided
87
+ if (category) {
88
+ results = results.filter((e) => e.category === category);
89
+ }
90
+ // Filter by search term if provided
91
+ if (searchTerm) {
92
+ const term = searchTerm.toLowerCase();
93
+ results = results.filter((e) => e.content.toLowerCase().includes(term));
94
+ }
95
+ // Update usage count and last retrieved timestamp
96
+ results.forEach((entry) => {
97
+ entry.usage_count += 1;
98
+ entry.last_retrieved = new Date();
99
+ });
100
+ this.store.metadata.last_updated = new Date().toISOString();
101
+ this.save();
102
+ if (results.length === 0) {
103
+ return {
104
+ success: true,
105
+ action: 'retrieve',
106
+ message: `No context found${category ? ` in category "${category}"` : ''}${searchTerm ? ` matching "${searchTerm}"` : ''}`,
107
+ data: null,
108
+ };
109
+ }
110
+ logger.info(`Retrieved ${results.length} context entries`);
111
+ return {
112
+ success: true,
113
+ action: 'retrieve',
114
+ message: `Retrieved ${results.length} context entries`,
115
+ data: results,
116
+ };
117
+ }
118
+ catch (error) {
119
+ logger.error('Error retrieving context:', error);
120
+ throw new Error(`Failed to retrieve context: ${error}`);
121
+ }
122
+ }
123
+ /**
124
+ * Check context window status and provide warnings if needed
125
+ */
126
+ async check(includeMetadata = false) {
127
+ this.ensureInitialized();
128
+ try {
129
+ const metadata = this.getMetadata();
130
+ let warning;
131
+ if (metadata.context_window_usage_percent > 80) {
132
+ warning = `Context window is ${metadata.context_window_usage_percent.toFixed(1)}% full. Consider archiving or cleaning up old context entries.`;
133
+ }
134
+ else if (metadata.context_window_usage_percent > 60) {
135
+ warning = `Context window is ${metadata.context_window_usage_percent.toFixed(1)}% full. You may want to monitor usage.`;
136
+ }
137
+ const response = {
138
+ success: true,
139
+ action: 'check',
140
+ message: `Context store contains ${metadata.total_entries} entries`,
141
+ warning,
142
+ };
143
+ if (includeMetadata) {
144
+ response.data = metadata;
145
+ }
146
+ return response;
147
+ }
148
+ catch (error) {
149
+ logger.error('Error checking context:', error);
150
+ throw new Error(`Failed to check context: ${error}`);
151
+ }
152
+ }
153
+ /**
154
+ * Get metadata about the context store
155
+ */
156
+ getMetadata() {
157
+ const entriesByCategory = {
158
+ architecture: 0,
159
+ requirements: 0,
160
+ constraints: 0,
161
+ decisions: 0,
162
+ 'technical-patterns': 0,
163
+ 'project-metadata': 0,
164
+ };
165
+ let totalBytes = 0;
166
+ this.store.entries.forEach((entry) => {
167
+ entriesByCategory[entry.category]++;
168
+ totalBytes += entry.content.length;
169
+ });
170
+ const estimatedTokens = totalBytes / AVG_CHARS_PER_TOKEN;
171
+ const usagePercent = (estimatedTokens / MAX_CONTEXT_WINDOW_TOKENS) * 100;
172
+ return {
173
+ total_entries: this.store.entries.length,
174
+ entries_by_category: entriesByCategory,
175
+ total_stored_bytes: totalBytes,
176
+ last_updated: new Date(this.store.metadata.last_updated),
177
+ context_window_usage_percent: Math.min(usagePercent, 100),
178
+ };
179
+ }
180
+ /**
181
+ * Clear old or unused context entries (cleanup)
182
+ */
183
+ async cleanup(daysOld = 30) {
184
+ this.ensureInitialized();
185
+ try {
186
+ const cutoffDate = new Date();
187
+ cutoffDate.setDate(cutoffDate.getDate() - daysOld);
188
+ const beforeCount = this.store.entries.length;
189
+ this.store.entries = this.store.entries.filter((entry) => {
190
+ const entryDate = new Date(entry.timestamp);
191
+ return entryDate > cutoffDate;
192
+ });
193
+ const removedCount = beforeCount - this.store.entries.length;
194
+ this.store.metadata.last_updated = new Date().toISOString();
195
+ this.save();
196
+ logger.info(`Cleaned up ${removedCount} context entries older than ${daysOld} days`);
197
+ return {
198
+ success: true,
199
+ action: 'retrieve',
200
+ message: `Removed ${removedCount} entries older than ${daysOld} days`,
201
+ };
202
+ }
203
+ catch (error) {
204
+ logger.error('Error cleaning context:', error);
205
+ throw new Error(`Failed to cleanup context: ${error}`);
206
+ }
207
+ }
208
+ /**
209
+ * Export all context for backup
210
+ */
211
+ async export() {
212
+ this.ensureInitialized();
213
+ return JSON.parse(JSON.stringify(this.store));
214
+ }
215
+ /**
216
+ * Import context from backup
217
+ */
218
+ async import(store) {
219
+ try {
220
+ this.store = store;
221
+ this.store.metadata.last_updated = new Date().toISOString();
222
+ this.save();
223
+ logger.info('Imported context store');
224
+ }
225
+ catch (error) {
226
+ logger.error('Error importing context:', error);
227
+ throw new Error(`Failed to import context: ${error}`);
228
+ }
229
+ }
230
+ /**
231
+ * Create default context store
232
+ */
233
+ createDefaultStore() {
234
+ this.store = {
235
+ version: '1.0.0',
236
+ entries: [
237
+ {
238
+ id: nanoid(),
239
+ category: 'project-metadata',
240
+ content: 'CouchLoop MCP Server - Model Context Protocol server for stateful conversation management',
241
+ timestamp: new Date(),
242
+ usage_count: 0,
243
+ last_retrieved: null,
244
+ },
245
+ {
246
+ id: nanoid(),
247
+ category: 'architecture',
248
+ content: 'CouchLoop uses PostgreSQL via Supabase with Drizzle ORM. MCP protocol via stdio for communication. Session/journey/checkpoint management.',
249
+ timestamp: new Date(),
250
+ usage_count: 0,
251
+ last_retrieved: null,
252
+ },
253
+ {
254
+ id: nanoid(),
255
+ category: 'requirements',
256
+ content: 'Must support multi-turn conversations, session persistence across interruptions, guided journeys, crisis detection via shrink-chat integration',
257
+ timestamp: new Date(),
258
+ usage_count: 0,
259
+ last_retrieved: null,
260
+ },
261
+ ],
262
+ metadata: {
263
+ created_at: new Date().toISOString(),
264
+ last_updated: new Date().toISOString(),
265
+ },
266
+ };
267
+ }
268
+ /**
269
+ * Save store to disk
270
+ */
271
+ save() {
272
+ try {
273
+ const dir = path.dirname(CONTEXT_STORE_PATH);
274
+ if (!fs.existsSync(dir)) {
275
+ fs.mkdirSync(dir, { recursive: true });
276
+ }
277
+ fs.writeFileSync(CONTEXT_STORE_PATH, JSON.stringify(this.store, null, 2), 'utf-8');
278
+ }
279
+ catch (error) {
280
+ logger.error('Failed to save context store:', error);
281
+ throw new Error(`Failed to persist context: ${error}`);
282
+ }
283
+ }
284
+ /**
285
+ * Ensure manager is initialized
286
+ */
287
+ ensureInitialized() {
288
+ if (!this.isInitialized) {
289
+ throw new Error('ContextManager not initialized. Call initialize() before using other methods.');
290
+ }
291
+ }
292
+ }
293
+ // Singleton instance
294
+ let instance = null;
295
+ export async function getContextManager() {
296
+ if (!instance) {
297
+ instance = new ContextManager();
298
+ await instance.initialize();
299
+ }
300
+ return instance;
301
+ }
302
+ //# sourceMappingURL=context-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../../../src/developer/managers/context-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Complexity Calculator - Metrics for code quality analysis
3
+ * Measures cyclomatic complexity, cognitive complexity, and code metrics
4
+ */
5
+ export interface ComplexityMetrics {
6
+ cyclomaticComplexity: number;
7
+ cognitiveComplexity: number;
8
+ linesOfCode: number;
9
+ nestingDepth: number;
10
+ functionCount: number;
11
+ maxFunctionLength: number;
12
+ averageFunctionLength: number;
13
+ score: number;
14
+ severity: 'low' | 'medium' | 'high';
15
+ }
16
+ export declare class ComplexityCalculator {
17
+ /**
18
+ * Calculate all complexity metrics for given code
19
+ */
20
+ calculateMetrics(code: string, language: 'javascript' | 'typescript' | 'python'): ComplexityMetrics;
21
+ /**
22
+ * Calculate cyclomatic complexity (decision points in code)
23
+ * Counts: if, else if, for, while, do, case, catch, ?:, ||, &&
24
+ */
25
+ private calculateCyclomaticComplexity;
26
+ /**
27
+ * Calculate cognitive complexity (mental burden of understanding code)
28
+ * Similar to cyclomatic but weighs nested structures higher
29
+ */
30
+ private calculateCognitiveComplexity;
31
+ /**
32
+ * Calculate maximum nesting depth in code
33
+ */
34
+ private calculateMaxNestingDepth;
35
+ /**
36
+ * Count logical lines of code (excluding comments and blank lines)
37
+ */
38
+ private countLinesOfCode;
39
+ /**
40
+ * Extract function definitions from code
41
+ */
42
+ private extractFunctions;
43
+ /**
44
+ * Calculate overall complexity score (0-100, higher is worse)
45
+ */
46
+ private calculateScore;
47
+ /**
48
+ * Determine severity level based on score
49
+ */
50
+ private getSeverity;
51
+ }
52
+ //# sourceMappingURL=complexity-calculator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complexity-calculator.d.ts","sourceRoot":"","sources":["../../../src/developer/metrics/complexity-calculator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACrC;AAED,qBAAa,oBAAoB;IAC/B;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,iBAAiB;IAoCnG;;;OAGG;IACH,OAAO,CAAC,6BAA6B;IAiDrC;;;OAGG;IACH,OAAO,CAAC,4BAA4B;IA4CpC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAgBhC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA+DxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAkCtB;;OAEG;IACH,OAAO,CAAC,WAAW;CAKpB"}
@@ -0,0 +1,259 @@
1
+ /**
2
+ * Complexity Calculator - Metrics for code quality analysis
3
+ * Measures cyclomatic complexity, cognitive complexity, and code metrics
4
+ */
5
+ export class ComplexityCalculator {
6
+ /**
7
+ * Calculate all complexity metrics for given code
8
+ */
9
+ calculateMetrics(code, language) {
10
+ const lines = code.split('\n');
11
+ const linesOfCode = this.countLinesOfCode(lines);
12
+ const cyclomaticComplexity = this.calculateCyclomaticComplexity(code, language);
13
+ const cognitiveComplexity = this.calculateCognitiveComplexity(code, language);
14
+ const nestingDepth = this.calculateMaxNestingDepth(code);
15
+ const functions = this.extractFunctions(code, language);
16
+ const functionCount = functions.length;
17
+ const functionLengths = functions.map(f => f.length);
18
+ const maxFunctionLength = functionLengths.length > 0 ? Math.max(...functionLengths) : 0;
19
+ const averageFunctionLength = functionLengths.length > 0
20
+ ? Math.round(functionLengths.reduce((a, b) => a + b, 0) / functionLengths.length)
21
+ : 0;
22
+ // Calculate overall score (0-100, higher is worse)
23
+ const score = this.calculateScore(cyclomaticComplexity, cognitiveComplexity, nestingDepth, maxFunctionLength, linesOfCode);
24
+ return {
25
+ cyclomaticComplexity,
26
+ cognitiveComplexity,
27
+ linesOfCode,
28
+ nestingDepth,
29
+ functionCount,
30
+ maxFunctionLength,
31
+ averageFunctionLength,
32
+ score,
33
+ severity: this.getSeverity(score)
34
+ };
35
+ }
36
+ /**
37
+ * Calculate cyclomatic complexity (decision points in code)
38
+ * Counts: if, else if, for, while, do, case, catch, ?:, ||, &&
39
+ */
40
+ calculateCyclomaticComplexity(code, language) {
41
+ let complexity = 1; // Base complexity
42
+ // Count decision points
43
+ const decisionPatterns = [
44
+ /\bif\s*\(/gm,
45
+ /\belse\s+if\s*\(/gm,
46
+ /\belse\b/gm,
47
+ /\bfor\s*\(/gm,
48
+ /\bwhile\s*\(/gm,
49
+ /\bdo\b/gm,
50
+ /\bcase\b/gm,
51
+ /\bcatch\s*\(/gm,
52
+ /\?(?!:)/gm, // Ternary operator (not part of ::)
53
+ /\|\|/gm,
54
+ /&&/gm
55
+ ];
56
+ for (const pattern of decisionPatterns) {
57
+ const matches = code.match(pattern);
58
+ if (matches) {
59
+ complexity += matches.length;
60
+ }
61
+ }
62
+ // For Python, also count try/except
63
+ if (language === 'python') {
64
+ const pyPatterns = [
65
+ /\bif\s*:/gm,
66
+ /\belif\s*:/gm,
67
+ /\belse\s*:/gm,
68
+ /\bfor\s+\w+\s+in\b/gm,
69
+ /\bwhile\s*:/gm,
70
+ /\btry\s*:/gm,
71
+ /\bexcept\s*:/gm,
72
+ /\bexcept\s+\w+\s*:/gm
73
+ ];
74
+ for (const pattern of pyPatterns) {
75
+ const matches = code.match(pattern);
76
+ if (matches) {
77
+ complexity += matches.length;
78
+ }
79
+ }
80
+ }
81
+ return Math.max(1, complexity);
82
+ }
83
+ /**
84
+ * Calculate cognitive complexity (mental burden of understanding code)
85
+ * Similar to cyclomatic but weighs nested structures higher
86
+ */
87
+ calculateCognitiveComplexity(code, _language) {
88
+ let complexity = 0;
89
+ const lines = code.split('\n');
90
+ let currentNestingLevel = 0;
91
+ for (const line of lines) {
92
+ const trimmed = line.trim();
93
+ // Skip comments and empty lines
94
+ if (trimmed.startsWith('//') || trimmed.startsWith('#') || trimmed === '') {
95
+ continue;
96
+ }
97
+ // Track nesting level
98
+ const openBraces = (line.match(/\{/g) || []).length;
99
+ const closeBraces = (line.match(/\}/g) || []).length;
100
+ const nestingDelta = openBraces - closeBraces;
101
+ currentNestingLevel = Math.max(0, currentNestingLevel + nestingDelta);
102
+ // Weight by nesting level
103
+ const baseWeightPatterns = [
104
+ { regex: /\bif\s*\(/, weight: 1 },
105
+ { regex: /\belse\s+if\s*\(/, weight: 1 },
106
+ { regex: /\bfor\s*\(/, weight: 1 },
107
+ { regex: /\bwhile\s*\(/, weight: 1 },
108
+ { regex: /\btry\s*\{/, weight: 1 },
109
+ { regex: /\bcatch\s*\(/, weight: 1 },
110
+ { regex: /\?(?!:)/, weight: 0.5 }, // Ternary lower weight
111
+ ];
112
+ for (const { regex, weight } of baseWeightPatterns) {
113
+ const matches = trimmed.match(regex);
114
+ if (matches) {
115
+ // Nested decisions cost more
116
+ const nestingMultiplier = 1 + (currentNestingLevel * 0.1);
117
+ complexity += matches.length * weight * nestingMultiplier;
118
+ }
119
+ }
120
+ }
121
+ return Math.round(complexity);
122
+ }
123
+ /**
124
+ * Calculate maximum nesting depth in code
125
+ */
126
+ calculateMaxNestingDepth(code) {
127
+ let maxDepth = 0;
128
+ let currentDepth = 0;
129
+ for (const char of code) {
130
+ if (char === '{' || char === '[' || char === '(') {
131
+ currentDepth++;
132
+ maxDepth = Math.max(maxDepth, currentDepth);
133
+ }
134
+ else if (char === '}' || char === ']' || char === ')') {
135
+ currentDepth = Math.max(0, currentDepth - 1);
136
+ }
137
+ }
138
+ return maxDepth;
139
+ }
140
+ /**
141
+ * Count logical lines of code (excluding comments and blank lines)
142
+ */
143
+ countLinesOfCode(lines) {
144
+ let count = 0;
145
+ for (const line of lines) {
146
+ const trimmed = line.trim();
147
+ // Skip empty lines and comments
148
+ if (trimmed === '' || trimmed.startsWith('//') || trimmed.startsWith('#') || trimmed.startsWith('*')) {
149
+ continue;
150
+ }
151
+ count++;
152
+ }
153
+ return count;
154
+ }
155
+ /**
156
+ * Extract function definitions from code
157
+ */
158
+ extractFunctions(code, language) {
159
+ const functions = [];
160
+ if (language === 'python') {
161
+ // Python: def function_name(...)
162
+ const pyFuncRegex = /def\s+(\w+)\s*\([^)]*\):/g;
163
+ let match;
164
+ while ((match = pyFuncRegex.exec(code)) !== null) {
165
+ const funcName = match[1] || 'anonymous';
166
+ const startPos = match.index + match[0].length;
167
+ // Find the function body (indented code after def)
168
+ const restOfCode = code.substring(startPos);
169
+ const lines = restOfCode.split('\n');
170
+ let funcLength = 0;
171
+ const baseIndent = lines[0] ? lines[0].search(/\S/) : 0;
172
+ for (let i = 1; i < lines.length; i++) {
173
+ const line = lines[i];
174
+ if (!line)
175
+ continue;
176
+ const trimmed = line.trim();
177
+ // Stop when we hit a line with same or less indentation (and not empty)
178
+ if (trimmed && line.search(/\S/) <= baseIndent && baseIndent >= 0) {
179
+ break;
180
+ }
181
+ funcLength++;
182
+ }
183
+ functions.push({ name: funcName, length: funcLength });
184
+ }
185
+ }
186
+ else {
187
+ // JavaScript/TypeScript: function name() {} or const name = () => {}
188
+ const jsFuncRegex = /(?:function\s+(\w+)|const\s+(\w+)\s*=\s*(?:async\s*)?\(|(?:async\s+)?(\w+)\s*\([^)]*\)\s*\{)/g;
189
+ let match;
190
+ while ((match = jsFuncRegex.exec(code)) !== null) {
191
+ const funcName = match[1] || match[2] || match[3] || 'anonymous';
192
+ const startPos = match.index + match[0].length;
193
+ // Count lines until closing brace at same level
194
+ const restOfCode = code.substring(startPos);
195
+ let braceCount = 1;
196
+ let funcLength = 1;
197
+ for (const char of restOfCode) {
198
+ if (char === '{')
199
+ braceCount++;
200
+ else if (char === '}') {
201
+ braceCount--;
202
+ if (braceCount === 0)
203
+ break;
204
+ }
205
+ if (char === '\n')
206
+ funcLength++;
207
+ }
208
+ functions.push({ name: funcName, length: funcLength });
209
+ }
210
+ }
211
+ return functions;
212
+ }
213
+ /**
214
+ * Calculate overall complexity score (0-100, higher is worse)
215
+ */
216
+ calculateScore(cyclomaticComplexity, cognitiveComplexity, nestingDepth, maxFunctionLength, _linesOfCode) {
217
+ let score = 0;
218
+ // Cyclomatic complexity (0-40 points)
219
+ // 1-5: 0 pts, 6-10: 10 pts, 11-15: 20 pts, 15+: 40 pts
220
+ if (cyclomaticComplexity <= 5)
221
+ score += 0;
222
+ else if (cyclomaticComplexity <= 10)
223
+ score += 10;
224
+ else if (cyclomaticComplexity <= 15)
225
+ score += 20;
226
+ else
227
+ score += 40;
228
+ // Cognitive complexity (0-30 points)
229
+ score += Math.min(30, Math.round(cognitiveComplexity * 2));
230
+ // Nesting depth (0-20 points)
231
+ // 1-3: 0 pts, 4-5: 5 pts, 6-7: 10 pts, 8+: 20 pts
232
+ if (nestingDepth <= 3)
233
+ score += 0;
234
+ else if (nestingDepth <= 5)
235
+ score += 5;
236
+ else if (nestingDepth <= 7)
237
+ score += 10;
238
+ else
239
+ score += 20;
240
+ // Function length (0-10 points)
241
+ // <50: 0 pts, 50-100: 5 pts, 100+: 10 pts
242
+ if (maxFunctionLength >= 100)
243
+ score += 10;
244
+ else if (maxFunctionLength >= 50)
245
+ score += 5;
246
+ return Math.min(100, score);
247
+ }
248
+ /**
249
+ * Determine severity level based on score
250
+ */
251
+ getSeverity(score) {
252
+ if (score <= 30)
253
+ return 'low';
254
+ if (score <= 60)
255
+ return 'medium';
256
+ return 'high';
257
+ }
258
+ }
259
+ //# sourceMappingURL=complexity-calculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complexity-calculator.js","sourceRoot":"","sources":["../../../src/developer/metrics/complexity-calculator.ts"],"names":[],"mappings":"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"}