cmp-standards 2.8.0 → 2.9.1

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 (124) hide show
  1. package/dist/analytics/CrossProjectAnalytics.d.ts +128 -0
  2. package/dist/analytics/CrossProjectAnalytics.d.ts.map +1 -0
  3. package/dist/analytics/CrossProjectAnalytics.js +431 -0
  4. package/dist/analytics/CrossProjectAnalytics.js.map +1 -0
  5. package/dist/analytics/index.d.ts +1 -0
  6. package/dist/analytics/index.d.ts.map +1 -1
  7. package/dist/analytics/index.js +2 -0
  8. package/dist/analytics/index.js.map +1 -1
  9. package/dist/cache/EmbeddingCache.d.ts +6 -4
  10. package/dist/cache/EmbeddingCache.d.ts.map +1 -1
  11. package/dist/cache/EmbeddingCache.js +28 -17
  12. package/dist/cache/EmbeddingCache.js.map +1 -1
  13. package/dist/cli/index.js +247 -141
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/cli/ui.d.ts +134 -0
  16. package/dist/cli/ui.d.ts.map +1 -0
  17. package/dist/cli/ui.js +311 -0
  18. package/dist/cli/ui.js.map +1 -0
  19. package/dist/dashboard/tokens.d.ts +228 -0
  20. package/dist/dashboard/tokens.d.ts.map +1 -0
  21. package/dist/dashboard/tokens.js +450 -0
  22. package/dist/dashboard/tokens.js.map +1 -0
  23. package/dist/dashboard/ui.d.ts +3 -0
  24. package/dist/dashboard/ui.d.ts.map +1 -1
  25. package/dist/dashboard/ui.js +95 -61
  26. package/dist/dashboard/ui.js.map +1 -1
  27. package/dist/db/cloud.d.ts +11 -0
  28. package/dist/db/cloud.d.ts.map +1 -1
  29. package/dist/db/cloud.js +49 -1
  30. package/dist/db/cloud.js.map +1 -1
  31. package/dist/db/migrations.d.ts +1 -0
  32. package/dist/db/migrations.d.ts.map +1 -1
  33. package/dist/db/migrations.js +109 -0
  34. package/dist/db/migrations.js.map +1 -1
  35. package/dist/experts/ExpertVotePersistence.d.ts +86 -0
  36. package/dist/experts/ExpertVotePersistence.d.ts.map +1 -0
  37. package/dist/experts/ExpertVotePersistence.js +234 -0
  38. package/dist/experts/ExpertVotePersistence.js.map +1 -0
  39. package/dist/experts/index.d.ts +1 -0
  40. package/dist/experts/index.d.ts.map +1 -1
  41. package/dist/experts/index.js +2 -0
  42. package/dist/experts/index.js.map +1 -1
  43. package/dist/hooks/cloud-post-tool-use.d.ts +5 -0
  44. package/dist/hooks/cloud-post-tool-use.d.ts.map +1 -1
  45. package/dist/hooks/cloud-post-tool-use.js +43 -10
  46. package/dist/hooks/cloud-post-tool-use.js.map +1 -1
  47. package/dist/hooks/cloud-session-start.d.ts.map +1 -1
  48. package/dist/hooks/cloud-session-start.js +64 -0
  49. package/dist/hooks/cloud-session-start.js.map +1 -1
  50. package/dist/hooks/index.d.ts +2 -0
  51. package/dist/hooks/index.d.ts.map +1 -1
  52. package/dist/hooks/index.js +4 -0
  53. package/dist/hooks/index.js.map +1 -1
  54. package/dist/hooks/session-end.d.ts +67 -0
  55. package/dist/hooks/session-end.d.ts.map +1 -0
  56. package/dist/hooks/session-end.js +268 -0
  57. package/dist/hooks/session-end.js.map +1 -0
  58. package/dist/hooks/startup-verify.d.ts +31 -0
  59. package/dist/hooks/startup-verify.d.ts.map +1 -0
  60. package/dist/hooks/startup-verify.js +360 -0
  61. package/dist/hooks/startup-verify.js.map +1 -0
  62. package/dist/mcp/schemas.d.ts +2 -2
  63. package/dist/performance/Debouncer.d.ts +57 -0
  64. package/dist/performance/Debouncer.d.ts.map +1 -1
  65. package/dist/performance/Debouncer.js +149 -0
  66. package/dist/performance/Debouncer.js.map +1 -1
  67. package/dist/performance/index.d.ts +1 -1
  68. package/dist/performance/index.d.ts.map +1 -1
  69. package/dist/performance/index.js +3 -1
  70. package/dist/performance/index.js.map +1 -1
  71. package/dist/plugins/PluginManager.d.ts +160 -0
  72. package/dist/plugins/PluginManager.d.ts.map +1 -0
  73. package/dist/plugins/PluginManager.js +417 -0
  74. package/dist/plugins/PluginManager.js.map +1 -0
  75. package/dist/plugins/index.d.ts +7 -0
  76. package/dist/plugins/index.d.ts.map +1 -0
  77. package/dist/plugins/index.js +7 -0
  78. package/dist/plugins/index.js.map +1 -0
  79. package/dist/schema/expert-types.d.ts +2 -2
  80. package/dist/services/AuditLog.d.ts +205 -0
  81. package/dist/services/AuditLog.d.ts.map +1 -0
  82. package/dist/services/AuditLog.js +352 -0
  83. package/dist/services/AuditLog.js.map +1 -0
  84. package/dist/services/FeedbackCollector.d.ts +71 -0
  85. package/dist/services/FeedbackCollector.d.ts.map +1 -0
  86. package/dist/services/FeedbackCollector.js +236 -0
  87. package/dist/services/FeedbackCollector.js.map +1 -0
  88. package/dist/services/GitIntegration.d.ts +140 -0
  89. package/dist/services/GitIntegration.d.ts.map +1 -0
  90. package/dist/services/GitIntegration.js +423 -0
  91. package/dist/services/GitIntegration.js.map +1 -0
  92. package/dist/services/HookVerifier.d.ts +95 -0
  93. package/dist/services/HookVerifier.d.ts.map +1 -0
  94. package/dist/services/HookVerifier.js +493 -0
  95. package/dist/services/HookVerifier.js.map +1 -0
  96. package/dist/services/MemoryVersioning.d.ts +108 -0
  97. package/dist/services/MemoryVersioning.d.ts.map +1 -0
  98. package/dist/services/MemoryVersioning.js +281 -0
  99. package/dist/services/MemoryVersioning.js.map +1 -0
  100. package/dist/services/context-injector.d.ts +8 -0
  101. package/dist/services/context-injector.d.ts.map +1 -1
  102. package/dist/services/context-injector.js +19 -2
  103. package/dist/services/context-injector.js.map +1 -1
  104. package/dist/services/index.d.ts +6 -1
  105. package/dist/services/index.d.ts.map +1 -1
  106. package/dist/services/index.js +8 -1
  107. package/dist/services/index.js.map +1 -1
  108. package/dist/services/memory-router.d.ts +8 -0
  109. package/dist/services/memory-router.d.ts.map +1 -1
  110. package/dist/services/memory-router.js +19 -2
  111. package/dist/services/memory-router.js.map +1 -1
  112. package/dist/services/pattern-tracker.d.ts +63 -0
  113. package/dist/services/pattern-tracker.d.ts.map +1 -1
  114. package/dist/services/pattern-tracker.js +180 -2
  115. package/dist/services/pattern-tracker.js.map +1 -1
  116. package/dist/services/semantic-search.d.ts +4 -0
  117. package/dist/services/semantic-search.d.ts.map +1 -1
  118. package/dist/services/semantic-search.js +53 -13
  119. package/dist/services/semantic-search.js.map +1 -1
  120. package/dist/types/index.d.ts +1 -0
  121. package/dist/types/index.d.ts.map +1 -1
  122. package/dist/types/index.js +1 -0
  123. package/dist/types/index.js.map +1 -1
  124. package/package.json +4 -1
@@ -0,0 +1,360 @@
1
+ /**
2
+ * @file Startup Verification Hook
3
+ * @description Validates all services and infrastructure on session start
4
+ *
5
+ * This hook should run FIRST to verify:
6
+ * - Environment variables are loaded correctly
7
+ * - Cloud services are reachable
8
+ * - Database connections work
9
+ * - Required configurations exist
10
+ *
11
+ * Outputs a clear status report so issues are visible immediately.
12
+ *
13
+ * @version 2.9.0
14
+ */
15
+ import { config as dotenvConfig } from 'dotenv';
16
+ import { resolve } from 'path';
17
+ import { existsSync, readFileSync } from 'fs';
18
+ import { fileURLToPath } from 'url';
19
+ // =============================================================================
20
+ // Environment Loading
21
+ // =============================================================================
22
+ /**
23
+ * Load .env from multiple possible locations (monorepo support)
24
+ */
25
+ function loadEnvironment(cwd) {
26
+ const possiblePaths = [
27
+ resolve(cwd, '.env'),
28
+ resolve(cwd, '../.env'),
29
+ resolve(cwd, '../../.env'),
30
+ resolve(cwd, '../../../.env'),
31
+ ];
32
+ for (const envPath of possiblePaths) {
33
+ if (existsSync(envPath)) {
34
+ dotenvConfig({ path: envPath, override: true });
35
+ return { loaded: true, path: envPath };
36
+ }
37
+ }
38
+ // Try default dotenv behavior
39
+ dotenvConfig();
40
+ return { loaded: false };
41
+ }
42
+ // =============================================================================
43
+ // Individual Verifications
44
+ // =============================================================================
45
+ function verifyEnvVariable(name, required = true) {
46
+ const value = process.env[name];
47
+ if (!value) {
48
+ return {
49
+ service: `ENV:${name}`,
50
+ status: required ? 'error' : 'warn',
51
+ message: required ? `Missing required variable` : `Optional variable not set`,
52
+ };
53
+ }
54
+ // Mask the value for display
55
+ const masked = value.length > 8 ? value.slice(0, 4) + '***' + value.slice(-4) : '***';
56
+ return {
57
+ service: `ENV:${name}`,
58
+ status: 'ok',
59
+ message: `Set (${masked})`,
60
+ };
61
+ }
62
+ async function verifyTurso() {
63
+ const url = process.env.TURSO_DATABASE_URL;
64
+ const token = process.env.TURSO_AUTH_TOKEN;
65
+ if (!url || !token) {
66
+ return {
67
+ service: 'Turso',
68
+ status: 'error',
69
+ message: 'Missing credentials',
70
+ details: `URL: ${url ? 'set' : 'missing'}, Token: ${token ? 'set' : 'missing'}`,
71
+ };
72
+ }
73
+ try {
74
+ const { createClient } = await import('@libsql/client');
75
+ const client = createClient({ url, authToken: token });
76
+ const result = await client.execute('SELECT 1 as test');
77
+ if (result.rows.length > 0) {
78
+ return {
79
+ service: 'Turso',
80
+ status: 'ok',
81
+ message: 'Connected and responding',
82
+ };
83
+ }
84
+ return {
85
+ service: 'Turso',
86
+ status: 'warn',
87
+ message: 'Connected but query returned no results',
88
+ };
89
+ }
90
+ catch (error) {
91
+ return {
92
+ service: 'Turso',
93
+ status: 'error',
94
+ message: 'Connection failed',
95
+ details: error instanceof Error ? error.message : String(error),
96
+ };
97
+ }
98
+ }
99
+ async function verifyRedis() {
100
+ const url = process.env.UPSTASH_REDIS_REST_URL;
101
+ const token = process.env.UPSTASH_REDIS_REST_TOKEN;
102
+ if (!url || !token) {
103
+ return {
104
+ service: 'Redis',
105
+ status: 'error',
106
+ message: 'Missing credentials',
107
+ details: `URL: ${url ? 'set' : 'missing'}, Token: ${token ? 'set' : 'missing'}`,
108
+ };
109
+ }
110
+ try {
111
+ const { Redis } = await import('@upstash/redis');
112
+ const redis = new Redis({ url, token });
113
+ const pong = await redis.ping();
114
+ if (pong === 'PONG') {
115
+ return {
116
+ service: 'Redis',
117
+ status: 'ok',
118
+ message: 'Connected (PONG)',
119
+ };
120
+ }
121
+ return {
122
+ service: 'Redis',
123
+ status: 'warn',
124
+ message: `Unexpected response: ${pong}`,
125
+ };
126
+ }
127
+ catch (error) {
128
+ return {
129
+ service: 'Redis',
130
+ status: 'error',
131
+ message: 'Connection failed',
132
+ details: error instanceof Error ? error.message : String(error),
133
+ };
134
+ }
135
+ }
136
+ async function verifyVector() {
137
+ const url = process.env.UPSTASH_VECTOR_REST_URL;
138
+ const token = process.env.UPSTASH_VECTOR_REST_TOKEN;
139
+ if (!url || !token) {
140
+ return {
141
+ service: 'Vector',
142
+ status: 'warn',
143
+ message: 'Not configured (optional)',
144
+ details: `URL: ${url ? 'set' : 'missing'}, Token: ${token ? 'set' : 'missing'}`,
145
+ };
146
+ }
147
+ try {
148
+ const { Index } = await import('@upstash/vector');
149
+ const index = new Index({ url, token });
150
+ const info = await index.info();
151
+ return {
152
+ service: 'Vector',
153
+ status: 'ok',
154
+ message: `Connected (${info.vectorCount ?? 0} vectors)`,
155
+ };
156
+ }
157
+ catch (error) {
158
+ return {
159
+ service: 'Vector',
160
+ status: 'warn',
161
+ message: 'Connection failed (optional service)',
162
+ details: error instanceof Error ? error.message : String(error),
163
+ };
164
+ }
165
+ }
166
+ function verifyProjectConfig(cwd) {
167
+ const configPath = resolve(cwd, '.claude/project.config.json');
168
+ if (!existsSync(configPath)) {
169
+ return {
170
+ service: 'Project Config',
171
+ status: 'warn',
172
+ message: 'Not found (.claude/project.config.json)',
173
+ details: 'Run: npx cmp-standards init --system YOUR_SYSTEM',
174
+ };
175
+ }
176
+ try {
177
+ const content = readFileSync(configPath, 'utf-8');
178
+ const config = JSON.parse(content);
179
+ if (!config.system) {
180
+ return {
181
+ service: 'Project Config',
182
+ status: 'warn',
183
+ message: 'Missing system identifier',
184
+ };
185
+ }
186
+ return {
187
+ service: 'Project Config',
188
+ status: 'ok',
189
+ message: `System: ${config.system}`,
190
+ };
191
+ }
192
+ catch (error) {
193
+ return {
194
+ service: 'Project Config',
195
+ status: 'error',
196
+ message: 'Invalid JSON',
197
+ details: error instanceof Error ? error.message : String(error),
198
+ };
199
+ }
200
+ }
201
+ function verifyHooksDirectory(cwd) {
202
+ const hooksPath = resolve(cwd, '.claude/hooks');
203
+ if (!existsSync(hooksPath)) {
204
+ return {
205
+ service: 'Hooks Directory',
206
+ status: 'warn',
207
+ message: 'Not found (.claude/hooks)',
208
+ details: 'Run: npx cmp-standards sync --hooks',
209
+ };
210
+ }
211
+ return {
212
+ service: 'Hooks Directory',
213
+ status: 'ok',
214
+ message: 'Exists',
215
+ };
216
+ }
217
+ // =============================================================================
218
+ // Main Verification Function
219
+ // =============================================================================
220
+ export async function verifyStartup(cwd) {
221
+ const timestamp = new Date().toISOString();
222
+ const results = [];
223
+ const issues = [];
224
+ const recommendations = [];
225
+ // 1. Load environment
226
+ const envResult = loadEnvironment(cwd);
227
+ results.push({
228
+ service: 'Environment',
229
+ status: envResult.loaded ? 'ok' : 'warn',
230
+ message: envResult.loaded ? `Loaded from ${envResult.path}` : 'Using process.env only',
231
+ });
232
+ // 2. Check required env vars
233
+ const requiredVars = ['TURSO_DATABASE_URL', 'TURSO_AUTH_TOKEN'];
234
+ const optionalVars = ['UPSTASH_REDIS_REST_URL', 'UPSTASH_REDIS_REST_TOKEN', 'UPSTASH_VECTOR_REST_URL', 'UPSTASH_VECTOR_REST_TOKEN'];
235
+ for (const varName of requiredVars) {
236
+ results.push(verifyEnvVariable(varName, true));
237
+ }
238
+ for (const varName of optionalVars) {
239
+ results.push(verifyEnvVariable(varName, false));
240
+ }
241
+ // 3. Check cloud services
242
+ const [tursoResult, redisResult, vectorResult] = await Promise.all([
243
+ verifyTurso(),
244
+ verifyRedis(),
245
+ verifyVector(),
246
+ ]);
247
+ results.push(tursoResult, redisResult, vectorResult);
248
+ // 4. Check project configuration
249
+ results.push(verifyProjectConfig(cwd));
250
+ results.push(verifyHooksDirectory(cwd));
251
+ // Analyze results
252
+ const errors = results.filter(r => r.status === 'error');
253
+ const warnings = results.filter(r => r.status === 'warn');
254
+ for (const err of errors) {
255
+ issues.push(`${err.service}: ${err.message}${err.details ? ` (${err.details})` : ''}`);
256
+ }
257
+ // Generate recommendations
258
+ if (errors.some(e => e.service.includes('TURSO'))) {
259
+ recommendations.push('Set TURSO_DATABASE_URL and TURSO_AUTH_TOKEN in your .env file');
260
+ }
261
+ if (errors.some(e => e.service === 'Turso')) {
262
+ recommendations.push('Check Turso credentials at https://turso.tech/app');
263
+ }
264
+ if (errors.some(e => e.service === 'Redis')) {
265
+ recommendations.push('Check Upstash Redis credentials at https://console.upstash.com');
266
+ }
267
+ if (warnings.some(w => w.service === 'Project Config')) {
268
+ recommendations.push('Run: npx cmp-standards init --system YOUR_SYSTEM');
269
+ }
270
+ // Determine overall status
271
+ let overallStatus = 'healthy';
272
+ if (warnings.length > 0)
273
+ overallStatus = 'degraded';
274
+ if (errors.length > 0)
275
+ overallStatus = 'critical';
276
+ return {
277
+ timestamp,
278
+ cwd,
279
+ results,
280
+ overallStatus,
281
+ issues,
282
+ recommendations,
283
+ };
284
+ }
285
+ // =============================================================================
286
+ // Output Formatting
287
+ // =============================================================================
288
+ function formatReport(report) {
289
+ const lines = [];
290
+ // Header
291
+ const statusIcon = {
292
+ healthy: '\u2705', // green check
293
+ degraded: '\u26A0\uFE0F', // warning
294
+ critical: '\u274C', // red X
295
+ }[report.overallStatus];
296
+ lines.push('');
297
+ lines.push(`${statusIcon} CMP Standards Startup Verification`);
298
+ lines.push(`${'='.repeat(50)}`);
299
+ lines.push(`Status: ${report.overallStatus.toUpperCase()}`);
300
+ lines.push(`Time: ${report.timestamp}`);
301
+ lines.push(`Directory: ${report.cwd}`);
302
+ lines.push('');
303
+ // Service Status
304
+ lines.push('Service Status:');
305
+ lines.push('-'.repeat(30));
306
+ for (const result of report.results) {
307
+ const icon = result.status === 'ok' ? '\u2705' : result.status === 'warn' ? '\u26A0\uFE0F' : '\u274C';
308
+ lines.push(`${icon} ${result.service}: ${result.message}`);
309
+ if (result.details && result.status !== 'ok') {
310
+ lines.push(` \u2514\u2500 ${result.details}`);
311
+ }
312
+ }
313
+ // Issues
314
+ if (report.issues.length > 0) {
315
+ lines.push('');
316
+ lines.push('Issues Found:');
317
+ lines.push('-'.repeat(30));
318
+ for (const issue of report.issues) {
319
+ lines.push(`\u2022 ${issue}`);
320
+ }
321
+ }
322
+ // Recommendations
323
+ if (report.recommendations.length > 0) {
324
+ lines.push('');
325
+ lines.push('Recommendations:');
326
+ lines.push('-'.repeat(30));
327
+ for (const rec of report.recommendations) {
328
+ lines.push(`\u27A4 ${rec}`);
329
+ }
330
+ }
331
+ lines.push('');
332
+ lines.push(`${'='.repeat(50)}`);
333
+ lines.push('');
334
+ return lines.join('\n');
335
+ }
336
+ // =============================================================================
337
+ // CLI Entry Point
338
+ // =============================================================================
339
+ async function main() {
340
+ const cwd = process.cwd();
341
+ try {
342
+ const report = await verifyStartup(cwd);
343
+ console.log(formatReport(report));
344
+ // Exit with error code if critical
345
+ if (report.overallStatus === 'critical') {
346
+ process.exit(1);
347
+ }
348
+ }
349
+ catch (error) {
350
+ console.error('Startup verification failed:', error);
351
+ process.exit(1);
352
+ }
353
+ }
354
+ // Run if executed directly
355
+ const __filename = fileURLToPath(import.meta.url);
356
+ if (process.argv[1] === __filename || process.argv[1]?.includes('startup-verify')) {
357
+ main();
358
+ }
359
+ export default verifyStartup;
360
+ //# sourceMappingURL=startup-verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-verify.js","sourceRoot":"","sources":["../../src/hooks/startup-verify.ts"],"names":[],"mappings":"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"}
@@ -139,12 +139,12 @@ export declare const FeedbackSubmitSchema: z.ZodObject<{
139
139
  helpful: z.ZodBoolean;
140
140
  comment: z.ZodOptional<z.ZodString>;
141
141
  }, "strip", z.ZodTypeAny, {
142
- memoryId: string;
143
142
  helpful: boolean;
143
+ memoryId: string;
144
144
  comment?: string | undefined;
145
145
  }, {
146
- memoryId: string;
147
146
  helpful: boolean;
147
+ memoryId: string;
148
148
  comment?: string | undefined;
149
149
  }>;
150
150
  export declare const TaskStartSchema: z.ZodObject<{
@@ -23,6 +23,19 @@ export interface DebouncerStats {
23
23
  skipRate: number;
24
24
  activeEntries: number;
25
25
  }
26
+ /**
27
+ * Tool-specific debounce windows
28
+ * Different tools have different optimal debounce times
29
+ */
30
+ export declare const TOOL_DEBOUNCE_CONFIG: Record<string, number>;
31
+ /**
32
+ * Get debounce window for a specific tool
33
+ */
34
+ export declare function getToolDebounceMs(toolName: string): number;
35
+ /**
36
+ * Check if a tool should never be debounced (write operations)
37
+ */
38
+ export declare function isWriteOperation(toolName: string): boolean;
26
39
  export declare class Debouncer {
27
40
  private config;
28
41
  private entries;
@@ -84,8 +97,52 @@ export declare class HookDebouncer extends Debouncer {
84
97
  constructor(config?: Partial<DebouncerConfig>);
85
98
  shouldSkipHook(hookName: string, context: Record<string, unknown>): boolean;
86
99
  }
100
+ /**
101
+ * Smart Debouncer with tool-specific windows
102
+ * Uses different debounce times based on tool type
103
+ */
104
+ export declare class SmartDebouncer {
105
+ private entries;
106
+ private maxEntries;
107
+ private debug;
108
+ private stats;
109
+ constructor(options?: {
110
+ maxEntries?: number;
111
+ debug?: boolean;
112
+ });
113
+ /**
114
+ * Check if operation should be skipped based on tool-specific window
115
+ */
116
+ shouldSkip(toolName: string, params: Record<string, unknown>): boolean;
117
+ private trackCall;
118
+ /**
119
+ * Cleanup old entries (uses longest debounce window)
120
+ */
121
+ cleanup(): number;
122
+ /**
123
+ * Get statistics including per-tool breakdown
124
+ */
125
+ getStats(): {
126
+ totalCalls: number;
127
+ skipped: number;
128
+ skipRate: number;
129
+ byTool: Record<string, {
130
+ total: number;
131
+ skipped: number;
132
+ skipRate: number;
133
+ }>;
134
+ };
135
+ /**
136
+ * Reset all state
137
+ */
138
+ reset(): void;
139
+ }
87
140
  export declare function getDebouncer(config?: Partial<DebouncerConfig>): Debouncer;
88
141
  export declare function getEmbeddingDebouncer(config?: Partial<DebouncerConfig>): EmbeddingDebouncer;
89
142
  export declare function getHookDebouncer(config?: Partial<DebouncerConfig>): HookDebouncer;
143
+ export declare function getSmartDebouncer(options?: {
144
+ maxEntries?: number;
145
+ debug?: boolean;
146
+ }): SmartDebouncer;
90
147
  export declare function resetDebouncers(): void;
91
148
  //# sourceMappingURL=Debouncer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Debouncer.d.ts","sourceRoot":"","sources":["../../src/performance/Debouncer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAA;IAChB,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,2BAA2B;IAC3B,KAAK,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;CACtB;AAiBD,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,KAAK,CAGZ;gBAEW,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAIjD;;;OAGG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IA4BhC;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAMpE;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IAK/E;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;IAM1C;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,OAAO,IAAI,MAAM;IAkBjB;;OAEG;IACH,QAAQ,IAAI,cAAc;IAY1B;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,SAAS,IAAI,eAAe;IAI5B;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;CAGlD;AAMD;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,SAAS;gBACnC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAQjD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAIxC;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,SAAS;gBAC9B,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAQjD,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;CAI5E;AAUD,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,CAKzE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,kBAAkB,CAK3F;AAED,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,aAAa,CAKjF;AAED,wBAAgB,eAAe,IAAI,IAAI,CAItC"}
1
+ {"version":3,"file":"Debouncer.d.ts","sourceRoot":"","sources":["../../src/performance/Debouncer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAA;IAChB,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,2BAA2B;IAC3B,KAAK,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;CACtB;AAiBD;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAuBvD,CAAA;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE1D;AAMD,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,KAAK,CAGZ;gBAEW,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAIjD;;;OAGG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IA4BhC;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAMpE;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IAK/E;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;IAM1C;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,OAAO,IAAI,MAAM;IAkBjB;;OAEG;IACH,QAAQ,IAAI,cAAc;IAY1B;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,SAAS,IAAI,eAAe;IAI5B;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;CAGlD;AAMD;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,SAAS;gBACnC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAQjD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAIxC;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,SAAS;gBAC9B,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAQjD,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;CAI5E;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAIZ;gBAEW,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO;IAKlE;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IAyCtE,OAAO,CAAC,SAAS;IAOjB;;OAEG;IACH,OAAO,IAAI,MAAM;IAejB;;OAEG;IACH,QAAQ,IAAI;QACV,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAC7E;IAkBD;;OAEG;IACH,KAAK,IAAI,IAAI;CAQd;AAWD,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,CAKzE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,kBAAkB,CAK3F;AAED,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,aAAa,CAKjF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,cAAc,CAKpG;AAED,wBAAgB,eAAe,IAAI,IAAI,CAKtC"}
@@ -15,6 +15,45 @@ const DEFAULT_CONFIG = {
15
15
  debug: false,
16
16
  };
17
17
  // =============================================================================
18
+ // Smart Debouncing by Tool Type
19
+ // =============================================================================
20
+ /**
21
+ * Tool-specific debounce windows
22
+ * Different tools have different optimal debounce times
23
+ */
24
+ export const TOOL_DEBOUNCE_CONFIG = {
25
+ // Read operations - frequent, short debounce
26
+ 'Read': 1000,
27
+ 'Glob': 2000,
28
+ 'Grep': 2000,
29
+ 'LSP': 1000,
30
+ // Write operations - no debounce (always execute)
31
+ 'Write': 0,
32
+ 'Edit': 0,
33
+ 'NotebookEdit': 0,
34
+ // External operations - longer debounce
35
+ 'WebSearch': 5000,
36
+ 'WebFetch': 5000,
37
+ 'Bash': 3000,
38
+ // Task/Agent operations - medium debounce
39
+ 'Task': 3000,
40
+ 'Skill': 2000,
41
+ // Default for unknown tools
42
+ 'default': 3000
43
+ };
44
+ /**
45
+ * Get debounce window for a specific tool
46
+ */
47
+ export function getToolDebounceMs(toolName) {
48
+ return TOOL_DEBOUNCE_CONFIG[toolName] ?? TOOL_DEBOUNCE_CONFIG['default'];
49
+ }
50
+ /**
51
+ * Check if a tool should never be debounced (write operations)
52
+ */
53
+ export function isWriteOperation(toolName) {
54
+ return ['Write', 'Edit', 'NotebookEdit'].includes(toolName);
55
+ }
56
+ // =============================================================================
18
57
  // Debouncer Implementation
19
58
  // =============================================================================
20
59
  export class Debouncer {
@@ -166,12 +205,115 @@ export class HookDebouncer extends Debouncer {
166
205
  return this.shouldSkip(`hook:${key}`);
167
206
  }
168
207
  }
208
+ /**
209
+ * Smart Debouncer with tool-specific windows
210
+ * Uses different debounce times based on tool type
211
+ */
212
+ export class SmartDebouncer {
213
+ entries = new Map();
214
+ maxEntries;
215
+ debug;
216
+ stats = {
217
+ totalCalls: 0,
218
+ skipped: 0,
219
+ byTool: new Map()
220
+ };
221
+ constructor(options = {}) {
222
+ this.maxEntries = options.maxEntries ?? 500;
223
+ this.debug = options.debug ?? false;
224
+ }
225
+ /**
226
+ * Check if operation should be skipped based on tool-specific window
227
+ */
228
+ shouldSkip(toolName, params) {
229
+ const debounceMs = getToolDebounceMs(toolName);
230
+ // Write operations are never debounced
231
+ if (debounceMs === 0) {
232
+ this.trackCall(toolName, false);
233
+ return false;
234
+ }
235
+ this.stats.totalCalls++;
236
+ const now = Date.now();
237
+ const paramsStr = JSON.stringify(params, Object.keys(params).sort());
238
+ const key = createHash('md5').update(`${toolName}:${paramsStr}`).digest('hex');
239
+ const entry = this.entries.get(key);
240
+ if (entry && now - entry.lastCall < debounceMs) {
241
+ this.stats.skipped++;
242
+ entry.callCount++;
243
+ this.trackCall(toolName, true);
244
+ if (this.debug) {
245
+ console.log(`[SmartDebouncer] Skipping ${toolName} (window: ${debounceMs}ms, called ${entry.callCount}x)`);
246
+ }
247
+ return true;
248
+ }
249
+ // Update or create entry
250
+ this.entries.set(key, { lastCall: now, callCount: 1 });
251
+ // Cleanup if needed
252
+ if (this.entries.size > this.maxEntries) {
253
+ this.cleanup();
254
+ }
255
+ this.trackCall(toolName, false);
256
+ return false;
257
+ }
258
+ trackCall(toolName, skipped) {
259
+ const existing = this.stats.byTool.get(toolName) ?? { total: 0, skipped: 0 };
260
+ existing.total++;
261
+ if (skipped)
262
+ existing.skipped++;
263
+ this.stats.byTool.set(toolName, existing);
264
+ }
265
+ /**
266
+ * Cleanup old entries (uses longest debounce window)
267
+ */
268
+ cleanup() {
269
+ const now = Date.now();
270
+ const maxWindow = Math.max(...Object.values(TOOL_DEBOUNCE_CONFIG));
271
+ let removed = 0;
272
+ for (const [key, entry] of this.entries) {
273
+ if (now - entry.lastCall > maxWindow) {
274
+ this.entries.delete(key);
275
+ removed++;
276
+ }
277
+ }
278
+ return removed;
279
+ }
280
+ /**
281
+ * Get statistics including per-tool breakdown
282
+ */
283
+ getStats() {
284
+ const byTool = {};
285
+ for (const [tool, stats] of this.stats.byTool) {
286
+ byTool[tool] = {
287
+ ...stats,
288
+ skipRate: stats.total > 0 ? stats.skipped / stats.total : 0
289
+ };
290
+ }
291
+ return {
292
+ totalCalls: this.stats.totalCalls,
293
+ skipped: this.stats.skipped,
294
+ skipRate: this.stats.totalCalls > 0 ? this.stats.skipped / this.stats.totalCalls : 0,
295
+ byTool
296
+ };
297
+ }
298
+ /**
299
+ * Reset all state
300
+ */
301
+ reset() {
302
+ this.entries.clear();
303
+ this.stats = {
304
+ totalCalls: 0,
305
+ skipped: 0,
306
+ byTool: new Map()
307
+ };
308
+ }
309
+ }
169
310
  // =============================================================================
170
311
  // Singleton Instances
171
312
  // =============================================================================
172
313
  let globalDebouncer = null;
173
314
  let globalEmbeddingDebouncer = null;
174
315
  let globalHookDebouncer = null;
316
+ let globalSmartDebouncer = null;
175
317
  export function getDebouncer(config) {
176
318
  if (!globalDebouncer) {
177
319
  globalDebouncer = new Debouncer(config);
@@ -190,9 +332,16 @@ export function getHookDebouncer(config) {
190
332
  }
191
333
  return globalHookDebouncer;
192
334
  }
335
+ export function getSmartDebouncer(options) {
336
+ if (!globalSmartDebouncer) {
337
+ globalSmartDebouncer = new SmartDebouncer(options);
338
+ }
339
+ return globalSmartDebouncer;
340
+ }
193
341
  export function resetDebouncers() {
194
342
  globalDebouncer = null;
195
343
  globalEmbeddingDebouncer = null;
196
344
  globalHookDebouncer = null;
345
+ globalSmartDebouncer = null;
197
346
  }
198
347
  //# sourceMappingURL=Debouncer.js.map