dino-spec 13.6.0 → 14.0.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 (88) hide show
  1. package/bin/dino-hud.js +1 -1
  2. package/bin/dino.js +1 -1
  3. package/dist/core/agents/context-isolation.js +26 -26
  4. package/dist/core/context/__tests__/budget-thresholds.test.d.ts +5 -0
  5. package/dist/core/context/__tests__/budget-thresholds.test.d.ts.map +1 -0
  6. package/dist/core/context/__tests__/budget-thresholds.test.js +223 -0
  7. package/dist/core/context/__tests__/budget-thresholds.test.js.map +1 -0
  8. package/dist/core/context/__tests__/compaction-engine.test.d.ts +5 -0
  9. package/dist/core/context/__tests__/compaction-engine.test.d.ts.map +1 -0
  10. package/dist/core/context/__tests__/compaction-engine.test.js +474 -0
  11. package/dist/core/context/__tests__/compaction-engine.test.js.map +1 -0
  12. package/dist/core/context/__tests__/output-persistence.test.d.ts +5 -0
  13. package/dist/core/context/__tests__/output-persistence.test.d.ts.map +1 -0
  14. package/dist/core/context/__tests__/output-persistence.test.js +246 -0
  15. package/dist/core/context/__tests__/output-persistence.test.js.map +1 -0
  16. package/dist/core/context/budget-thresholds.d.ts +167 -0
  17. package/dist/core/context/budget-thresholds.d.ts.map +1 -0
  18. package/dist/core/context/budget-thresholds.js +234 -0
  19. package/dist/core/context/budget-thresholds.js.map +1 -0
  20. package/dist/core/context/compaction-engine.d.ts +193 -0
  21. package/dist/core/context/compaction-engine.d.ts.map +1 -0
  22. package/dist/core/context/compaction-engine.js +376 -0
  23. package/dist/core/context/compaction-engine.js.map +1 -0
  24. package/dist/core/context/index.d.ts +7 -3
  25. package/dist/core/context/index.d.ts.map +1 -1
  26. package/dist/core/context/index.js +22 -3
  27. package/dist/core/context/index.js.map +1 -1
  28. package/dist/core/context/output-persistence.d.ts +142 -0
  29. package/dist/core/context/output-persistence.d.ts.map +1 -0
  30. package/dist/core/context/output-persistence.js +242 -0
  31. package/dist/core/context/output-persistence.js.map +1 -0
  32. package/dist/core/environment/__tests__/pre-verify.test.d.ts +5 -0
  33. package/dist/core/environment/__tests__/pre-verify.test.d.ts.map +1 -0
  34. package/dist/core/environment/__tests__/pre-verify.test.js +343 -0
  35. package/dist/core/environment/__tests__/pre-verify.test.js.map +1 -0
  36. package/dist/core/environment/index.d.ts +8 -0
  37. package/dist/core/environment/index.d.ts.map +1 -0
  38. package/dist/core/environment/index.js +7 -0
  39. package/dist/core/environment/index.js.map +1 -0
  40. package/dist/core/environment/pre-verify.d.ts +63 -0
  41. package/dist/core/environment/pre-verify.d.ts.map +1 -0
  42. package/dist/core/environment/pre-verify.js +221 -0
  43. package/dist/core/environment/pre-verify.js.map +1 -0
  44. package/dist/core/environment/types.d.ts +37 -0
  45. package/dist/core/environment/types.d.ts.map +1 -0
  46. package/dist/core/environment/types.js +5 -0
  47. package/dist/core/environment/types.js.map +1 -0
  48. package/dist/core/intelligence/context-budget.d.ts +10 -5
  49. package/dist/core/intelligence/context-budget.d.ts.map +1 -1
  50. package/dist/core/intelligence/context-budget.js +12 -5
  51. package/dist/core/intelligence/context-budget.js.map +1 -1
  52. package/dist/mcp/__tests__/dynamic-updates.test.d.ts +5 -0
  53. package/dist/mcp/__tests__/dynamic-updates.test.d.ts.map +1 -0
  54. package/dist/mcp/__tests__/dynamic-updates.test.js +314 -0
  55. package/dist/mcp/__tests__/dynamic-updates.test.js.map +1 -0
  56. package/dist/mcp/dynamic-updates.d.ts +167 -0
  57. package/dist/mcp/dynamic-updates.d.ts.map +1 -0
  58. package/dist/mcp/dynamic-updates.js +313 -0
  59. package/dist/mcp/dynamic-updates.js.map +1 -0
  60. package/dist/mcp/index.d.ts +4 -2
  61. package/dist/mcp/index.d.ts.map +1 -1
  62. package/dist/mcp/index.js +5 -2
  63. package/dist/mcp/index.js.map +1 -1
  64. package/dist/mcp/registry.d.ts +4 -4
  65. package/dist/mcp/registry.d.ts.map +1 -1
  66. package/dist/mcp/registry.js +16 -16
  67. package/dist/mcp/registry.js.map +1 -1
  68. package/dist/mcp/tools/__tests__/environment.test.d.ts +5 -0
  69. package/dist/mcp/tools/__tests__/environment.test.d.ts.map +1 -0
  70. package/dist/mcp/tools/__tests__/environment.test.js +219 -0
  71. package/dist/mcp/tools/__tests__/environment.test.js.map +1 -0
  72. package/dist/mcp/tools/environment.d.ts +27 -0
  73. package/dist/mcp/tools/environment.d.ts.map +1 -0
  74. package/dist/mcp/tools/environment.js +97 -0
  75. package/dist/mcp/tools/environment.js.map +1 -0
  76. package/dist/mcp/tools/index.d.ts +3 -1
  77. package/dist/mcp/tools/index.d.ts.map +1 -1
  78. package/dist/mcp/tools/index.js +13 -1
  79. package/dist/mcp/tools/index.js.map +1 -1
  80. package/dist/mcp/tools/output-persistence.d.ts +44 -0
  81. package/dist/mcp/tools/output-persistence.d.ts.map +1 -0
  82. package/dist/mcp/tools/output-persistence.js +208 -0
  83. package/dist/mcp/tools/output-persistence.js.map +1 -0
  84. package/dist/mcp-server.d.ts +2 -1
  85. package/dist/mcp-server.d.ts.map +1 -1
  86. package/dist/mcp-server.js +27 -2
  87. package/dist/mcp-server.js.map +1 -1
  88. package/package.json +1 -1
@@ -0,0 +1,314 @@
1
+ /**
2
+ * Dynamic MCP Tool Updates Tests - v14.0.0
3
+ */
4
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
5
+ import { DynamicUpdateHandler, dynamicUpdateHandler, notifyPhaseTransition, notifyFeatureFlagChange, notifyToolRegistration, notifyFocusChange, manualRefresh, createListChangedNotification, formatDynamicUpdateResult, DYNAMIC_UPDATES_FEATURE_FLAG, MIN_UPDATE_INTERVAL_MS, DEFAULT_DEBOUNCE_MS, } from '../dynamic-updates.js';
6
+ describe('Dynamic MCP Tool Updates', () => {
7
+ let handler;
8
+ beforeEach(() => {
9
+ handler = new DynamicUpdateHandler();
10
+ });
11
+ afterEach(() => {
12
+ handler.reset();
13
+ dynamicUpdateHandler.reset();
14
+ });
15
+ describe('Constants', () => {
16
+ it('should have correct feature flag name', () => {
17
+ expect(DYNAMIC_UPDATES_FEATURE_FLAG).toBe('enableDynamicToolUpdates');
18
+ });
19
+ it('should have minimum update interval', () => {
20
+ expect(MIN_UPDATE_INTERVAL_MS).toBe(100);
21
+ });
22
+ it('should have default debounce delay', () => {
23
+ expect(DEFAULT_DEBOUNCE_MS).toBe(50);
24
+ });
25
+ });
26
+ describe('DynamicUpdateHandler', () => {
27
+ describe('enabled state', () => {
28
+ it('should be enabled by default', () => {
29
+ expect(handler.isEnabled()).toBe(true);
30
+ });
31
+ it('should allow enabling and disabling', () => {
32
+ handler.setEnabled(false);
33
+ expect(handler.isEnabled()).toBe(false);
34
+ handler.setEnabled(true);
35
+ expect(handler.isEnabled()).toBe(true);
36
+ });
37
+ it('should not execute updates when disabled', async () => {
38
+ handler.setEnabled(false);
39
+ const result = await handler.forceUpdate('manual_refresh');
40
+ expect(result.toolsRefreshed).toBe(0);
41
+ expect(result.cachesCleared).toEqual([]);
42
+ expect(result.durationMs).toBe(0);
43
+ });
44
+ });
45
+ describe('handleListChanged', () => {
46
+ it('should execute update with phase_transition trigger', async () => {
47
+ const result = await handler.handleListChanged('phase_transition');
48
+ expect(result.toolsRefreshed).toBeGreaterThanOrEqual(0);
49
+ expect(result.cachesCleared).toContain('phase_cache');
50
+ expect(result.durationMs).toBeGreaterThanOrEqual(0);
51
+ });
52
+ it('should execute update with feature_flag_change trigger', async () => {
53
+ const result = await handler.handleListChanged('feature_flag_change');
54
+ expect(result.cachesCleared).toContain('phase_cache');
55
+ });
56
+ it('should execute update with tool_registration trigger', async () => {
57
+ const result = await handler.handleListChanged('tool_registration');
58
+ expect(result.cachesCleared).toContain('phase_cache');
59
+ });
60
+ it('should execute update with focus_change trigger', async () => {
61
+ const result = await handler.handleListChanged('focus_change');
62
+ expect(result.cachesCleared).toContain('phase_cache');
63
+ });
64
+ it('should debounce rapid updates', async () => {
65
+ // With debouncing, the last call wins and all previous promises resolve with its result
66
+ // We test that rapid calls don't cause errors and eventually resolve
67
+ const results = [];
68
+ // Create promises that will all resolve when the debounced update completes
69
+ const promise1 = handler.handleListChanged('phase_transition').then(r => { results.push(r); return r; });
70
+ const promise2 = handler.handleListChanged('feature_flag_change').then(r => { results.push(r); return r; });
71
+ const promise3 = handler.handleListChanged('tool_registration').then(r => { results.push(r); return r; });
72
+ // Wait for debounce timeout plus a buffer
73
+ await new Promise(resolve => setTimeout(resolve, DEFAULT_DEBOUNCE_MS + 50));
74
+ // The last promise should have resolved by now
75
+ const result3 = await promise3;
76
+ // All results should be the same (the debounced result)
77
+ expect(result3.cachesCleared.length).toBeGreaterThanOrEqual(0);
78
+ }, 5000); // Explicit shorter timeout
79
+ });
80
+ describe('forceUpdate', () => {
81
+ it('should execute update immediately', async () => {
82
+ const result = await handler.forceUpdate('manual_refresh');
83
+ expect(result.cachesCleared).toContain('phase_cache');
84
+ expect(result.durationMs).toBeGreaterThanOrEqual(0);
85
+ });
86
+ it('should respect minimum interval', async () => {
87
+ // First update
88
+ const result1 = await handler.forceUpdate('manual_refresh');
89
+ expect(result1.cachesCleared).toContain('phase_cache');
90
+ // Immediate second update should be throttled
91
+ const result2 = await handler.forceUpdate('manual_refresh');
92
+ expect(result2.toolsRefreshed).toBe(0);
93
+ expect(result2.cachesCleared).toEqual([]);
94
+ });
95
+ it('should execute after minimum interval passes', async () => {
96
+ // First update
97
+ await handler.forceUpdate('manual_refresh');
98
+ // Wait for minimum interval
99
+ await new Promise(resolve => setTimeout(resolve, MIN_UPDATE_INTERVAL_MS + 10));
100
+ // Second update should execute
101
+ const result = await handler.forceUpdate('manual_refresh');
102
+ expect(result.cachesCleared).toContain('phase_cache');
103
+ });
104
+ });
105
+ describe('notification callback', () => {
106
+ it('should call notification callback when set', async () => {
107
+ const callback = vi.fn();
108
+ handler.setNotificationCallback(callback);
109
+ await handler.forceUpdate('manual_refresh');
110
+ expect(callback).toHaveBeenCalledTimes(1);
111
+ expect(callback).toHaveBeenCalledWith(expect.objectContaining({
112
+ type: 'tools/list_changed',
113
+ timestamp: expect.any(String),
114
+ }));
115
+ });
116
+ it('should not send notification when callback not set', async () => {
117
+ const result = await handler.forceUpdate('manual_refresh');
118
+ expect(result.notificationSent).toBe(false);
119
+ });
120
+ it('should indicate notification sent when callback is set', async () => {
121
+ handler.setNotificationCallback(() => { });
122
+ const result = await handler.forceUpdate('manual_refresh');
123
+ expect(result.notificationSent).toBe(true);
124
+ });
125
+ });
126
+ describe('listeners', () => {
127
+ it('should notify listeners on update', async () => {
128
+ const listener = vi.fn();
129
+ handler.addListener(listener);
130
+ await handler.forceUpdate('manual_refresh');
131
+ expect(listener).toHaveBeenCalledTimes(1);
132
+ expect(listener).toHaveBeenCalledWith(expect.objectContaining({
133
+ cachesCleared: expect.arrayContaining(['phase_cache']),
134
+ }));
135
+ });
136
+ it('should support multiple listeners', async () => {
137
+ const listener1 = vi.fn();
138
+ const listener2 = vi.fn();
139
+ handler.addListener(listener1);
140
+ handler.addListener(listener2);
141
+ await handler.forceUpdate('manual_refresh');
142
+ expect(listener1).toHaveBeenCalledTimes(1);
143
+ expect(listener2).toHaveBeenCalledTimes(1);
144
+ });
145
+ it('should allow removing listeners', async () => {
146
+ const listener = vi.fn();
147
+ handler.addListener(listener);
148
+ handler.removeListener(listener);
149
+ await handler.forceUpdate('manual_refresh');
150
+ expect(listener).not.toHaveBeenCalled();
151
+ });
152
+ it('should handle listener errors gracefully', async () => {
153
+ const errorListener = vi.fn(() => {
154
+ throw new Error('Listener error');
155
+ });
156
+ const normalListener = vi.fn();
157
+ handler.addListener(errorListener);
158
+ handler.addListener(normalListener);
159
+ // Should not throw
160
+ await handler.forceUpdate('manual_refresh');
161
+ expect(errorListener).toHaveBeenCalled();
162
+ expect(normalListener).toHaveBeenCalled();
163
+ });
164
+ });
165
+ describe('history', () => {
166
+ it('should record updates in history', async () => {
167
+ await handler.forceUpdate('manual_refresh');
168
+ const history = handler.getHistory();
169
+ expect(history.length).toBe(1);
170
+ expect(history[0].trigger).toBe('manual_refresh');
171
+ expect(history[0].timestamp).toBeTruthy();
172
+ });
173
+ it('should record multiple updates', async () => {
174
+ await handler.forceUpdate('manual_refresh');
175
+ await new Promise(resolve => setTimeout(resolve, MIN_UPDATE_INTERVAL_MS + 10));
176
+ await handler.forceUpdate('phase_transition');
177
+ const history = handler.getHistory();
178
+ expect(history.length).toBe(2);
179
+ expect(history[0].trigger).toBe('manual_refresh');
180
+ expect(history[1].trigger).toBe('phase_transition');
181
+ });
182
+ it('should limit history size', async () => {
183
+ // Force many updates
184
+ for (let i = 0; i < 60; i++) {
185
+ await handler.forceUpdate('manual_refresh');
186
+ // Need to wait for minimum interval
187
+ await new Promise(resolve => setTimeout(resolve, MIN_UPDATE_INTERVAL_MS + 5));
188
+ }
189
+ const history = handler.getHistory();
190
+ expect(history.length).toBeLessThanOrEqual(50);
191
+ });
192
+ });
193
+ describe('getTimeSinceLastUpdate', () => {
194
+ it('should return Infinity when no updates', () => {
195
+ expect(handler.getTimeSinceLastUpdate()).toBe(Infinity);
196
+ });
197
+ it('should return time since last update', async () => {
198
+ await handler.forceUpdate('manual_refresh');
199
+ // Wait a bit
200
+ await new Promise(resolve => setTimeout(resolve, 50));
201
+ const timeSince = handler.getTimeSinceLastUpdate();
202
+ expect(timeSince).toBeGreaterThanOrEqual(50);
203
+ expect(timeSince).toBeLessThan(1000);
204
+ });
205
+ });
206
+ describe('getStats', () => {
207
+ it('should return correct stats', async () => {
208
+ await handler.forceUpdate('manual_refresh');
209
+ await new Promise(resolve => setTimeout(resolve, MIN_UPDATE_INTERVAL_MS + 10));
210
+ await handler.forceUpdate('phase_transition');
211
+ const stats = handler.getStats();
212
+ expect(stats.enabled).toBe(true);
213
+ expect(stats.historyCount).toBe(2);
214
+ expect(stats.triggerCounts.manual_refresh).toBe(1);
215
+ expect(stats.triggerCounts.phase_transition).toBe(1);
216
+ });
217
+ it('should track listener count', () => {
218
+ const listener = vi.fn();
219
+ handler.addListener(listener);
220
+ const stats = handler.getStats();
221
+ expect(stats.listenerCount).toBe(1);
222
+ });
223
+ });
224
+ describe('reset', () => {
225
+ it('should clear all state', async () => {
226
+ handler.addListener(() => { });
227
+ handler.setNotificationCallback(() => { });
228
+ await handler.forceUpdate('manual_refresh');
229
+ handler.reset();
230
+ const stats = handler.getStats();
231
+ expect(stats.historyCount).toBe(0);
232
+ expect(stats.listenerCount).toBe(0);
233
+ expect(handler.getTimeSinceLastUpdate()).toBe(Infinity);
234
+ });
235
+ });
236
+ });
237
+ describe('Helper Functions', () => {
238
+ describe('notifyPhaseTransition', () => {
239
+ it('should trigger update with phase_transition', async () => {
240
+ const result = await notifyPhaseTransition();
241
+ expect(result.cachesCleared.length).toBeGreaterThanOrEqual(0);
242
+ });
243
+ });
244
+ describe('notifyFeatureFlagChange', () => {
245
+ it('should trigger update with feature_flag_change', async () => {
246
+ const result = await notifyFeatureFlagChange();
247
+ expect(result.cachesCleared.length).toBeGreaterThanOrEqual(0);
248
+ });
249
+ });
250
+ describe('notifyToolRegistration', () => {
251
+ it('should trigger update with tool_registration', async () => {
252
+ const result = await notifyToolRegistration();
253
+ expect(result.cachesCleared.length).toBeGreaterThanOrEqual(0);
254
+ });
255
+ });
256
+ describe('notifyFocusChange', () => {
257
+ it('should trigger update with focus_change', async () => {
258
+ const result = await notifyFocusChange();
259
+ expect(result.cachesCleared.length).toBeGreaterThanOrEqual(0);
260
+ });
261
+ });
262
+ describe('manualRefresh', () => {
263
+ it('should trigger immediate update', async () => {
264
+ const result = await manualRefresh();
265
+ expect(result.cachesCleared.length).toBeGreaterThanOrEqual(0);
266
+ });
267
+ });
268
+ describe('createListChangedNotification', () => {
269
+ it('should create valid notification', () => {
270
+ const notification = createListChangedNotification();
271
+ expect(notification.type).toBe('tools/list_changed');
272
+ expect(notification.timestamp).toBeTruthy();
273
+ expect(new Date(notification.timestamp)).toBeInstanceOf(Date);
274
+ });
275
+ });
276
+ describe('formatDynamicUpdateResult', () => {
277
+ it('should format result correctly', () => {
278
+ const result = {
279
+ toolsRefreshed: 42,
280
+ cachesCleared: ['phase_cache', 'tool_cache'],
281
+ durationMs: 15,
282
+ notificationSent: true,
283
+ };
284
+ const formatted = formatDynamicUpdateResult(result);
285
+ expect(formatted).toContain('Dynamic Update Result');
286
+ expect(formatted).toContain('Tools refreshed: 42');
287
+ expect(formatted).toContain('phase_cache, tool_cache');
288
+ expect(formatted).toContain('Duration: 15ms');
289
+ expect(formatted).toContain('Notification sent: yes');
290
+ });
291
+ it('should handle empty caches', () => {
292
+ const result = {
293
+ toolsRefreshed: 0,
294
+ cachesCleared: [],
295
+ durationMs: 0,
296
+ notificationSent: false,
297
+ };
298
+ const formatted = formatDynamicUpdateResult(result);
299
+ expect(formatted).toContain('Caches cleared: none');
300
+ expect(formatted).toContain('Notification sent: no');
301
+ });
302
+ });
303
+ });
304
+ describe('Global Instance', () => {
305
+ it('should expose global dynamicUpdateHandler', () => {
306
+ expect(dynamicUpdateHandler).toBeInstanceOf(DynamicUpdateHandler);
307
+ });
308
+ it('should allow using global instance', async () => {
309
+ const result = await dynamicUpdateHandler.forceUpdate('manual_refresh');
310
+ expect(result.cachesCleared.length).toBeGreaterThanOrEqual(0);
311
+ });
312
+ });
313
+ });
314
+ //# sourceMappingURL=dynamic-updates.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic-updates.test.js","sourceRoot":"","sources":["../../../src/mcp/__tests__/dynamic-updates.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Dynamic MCP Tool Updates - v14.0.0
3
+ *
4
+ * Handles dynamic tool list updates and cache invalidation.
5
+ * When tools change (due to phase transitions or feature flag changes),
6
+ * this module notifies clients via the tools/list_changed notification.
7
+ *
8
+ * Features:
9
+ * - ListChanged notification support
10
+ * - Phase cache invalidation
11
+ * - Registry refresh coordination
12
+ * - Debounced update handling
13
+ *
14
+ * Reference: MCP Protocol tools/list_changed notification
15
+ */
16
+ /**
17
+ * List changed notification
18
+ */
19
+ export interface ListChangedNotification {
20
+ type: 'tools/list_changed';
21
+ timestamp: string;
22
+ }
23
+ /**
24
+ * Dynamic update result
25
+ */
26
+ export interface DynamicUpdateResult {
27
+ toolsRefreshed: number;
28
+ cachesCleared: string[];
29
+ durationMs: number;
30
+ notificationSent: boolean;
31
+ }
32
+ /**
33
+ * Update trigger reason
34
+ */
35
+ export type UpdateTrigger = 'phase_transition' | 'feature_flag_change' | 'tool_registration' | 'manual_refresh' | 'focus_change';
36
+ /**
37
+ * Update listener callback
38
+ */
39
+ export type UpdateListener = (result: DynamicUpdateResult) => void;
40
+ /**
41
+ * Feature flag for dynamic updates
42
+ */
43
+ export declare const DYNAMIC_UPDATES_FEATURE_FLAG = "enableDynamicToolUpdates";
44
+ /**
45
+ * Minimum interval between updates (ms)
46
+ */
47
+ export declare const MIN_UPDATE_INTERVAL_MS = 100;
48
+ /**
49
+ * Default debounce delay for updates (ms)
50
+ */
51
+ export declare const DEFAULT_DEBOUNCE_MS = 50;
52
+ /**
53
+ * Handler for dynamic MCP tool updates
54
+ *
55
+ * Coordinates tool list refreshes and cache invalidation when
56
+ * the available tools change.
57
+ */
58
+ export declare class DynamicUpdateHandler {
59
+ private lastUpdateTime;
60
+ private pendingUpdate;
61
+ private pendingResolvers;
62
+ private listeners;
63
+ private updateHistory;
64
+ private maxHistorySize;
65
+ private enabled;
66
+ private notificationCallback;
67
+ /**
68
+ * Enable or disable dynamic updates
69
+ */
70
+ setEnabled(enabled: boolean): void;
71
+ /**
72
+ * Check if dynamic updates are enabled
73
+ */
74
+ isEnabled(): boolean;
75
+ /**
76
+ * Set the notification callback for sending list_changed notifications
77
+ */
78
+ setNotificationCallback(callback: (notification: ListChangedNotification) => void): void;
79
+ /**
80
+ * Add a listener for update events
81
+ */
82
+ addListener(listener: UpdateListener): void;
83
+ /**
84
+ * Remove an update listener
85
+ */
86
+ removeListener(listener: UpdateListener): void;
87
+ /**
88
+ * Handle a list changed event
89
+ *
90
+ * This is the main entry point for triggering dynamic updates.
91
+ * Debounces rapid updates to avoid excessive cache clearing.
92
+ * All pending promises resolve with the same result when the debounced update executes.
93
+ */
94
+ handleListChanged(trigger: UpdateTrigger): Promise<DynamicUpdateResult>;
95
+ /**
96
+ * Execute the actual update
97
+ */
98
+ private executeUpdate;
99
+ /**
100
+ * Force an immediate update without debouncing
101
+ */
102
+ forceUpdate(trigger: UpdateTrigger): Promise<DynamicUpdateResult>;
103
+ /**
104
+ * Record update in history
105
+ */
106
+ private recordUpdate;
107
+ /**
108
+ * Get update history
109
+ */
110
+ getHistory(): Array<{
111
+ timestamp: string;
112
+ trigger: UpdateTrigger;
113
+ result: DynamicUpdateResult;
114
+ }>;
115
+ /**
116
+ * Get time since last update (ms)
117
+ */
118
+ getTimeSinceLastUpdate(): number;
119
+ /**
120
+ * Get stats about dynamic updates
121
+ */
122
+ getStats(): {
123
+ enabled: boolean;
124
+ lastUpdateTime: number;
125
+ timeSinceLastUpdate: number;
126
+ historyCount: number;
127
+ listenerCount: number;
128
+ triggerCounts: Record<UpdateTrigger, number>;
129
+ };
130
+ /**
131
+ * Clear handler state (for testing)
132
+ */
133
+ reset(): void;
134
+ }
135
+ /**
136
+ * Global dynamic update handler instance
137
+ */
138
+ export declare const dynamicUpdateHandler: DynamicUpdateHandler;
139
+ /**
140
+ * Trigger a dynamic update from phase transition
141
+ */
142
+ export declare function notifyPhaseTransition(): Promise<DynamicUpdateResult>;
143
+ /**
144
+ * Trigger a dynamic update from feature flag change
145
+ */
146
+ export declare function notifyFeatureFlagChange(): Promise<DynamicUpdateResult>;
147
+ /**
148
+ * Trigger a dynamic update from tool registration
149
+ */
150
+ export declare function notifyToolRegistration(): Promise<DynamicUpdateResult>;
151
+ /**
152
+ * Trigger a dynamic update from focus change
153
+ */
154
+ export declare function notifyFocusChange(): Promise<DynamicUpdateResult>;
155
+ /**
156
+ * Trigger a manual refresh
157
+ */
158
+ export declare function manualRefresh(): Promise<DynamicUpdateResult>;
159
+ /**
160
+ * Create list_changed notification for sending to client
161
+ */
162
+ export declare function createListChangedNotification(): ListChangedNotification;
163
+ /**
164
+ * Format dynamic update result for display
165
+ */
166
+ export declare function formatDynamicUpdateResult(result: DynamicUpdateResult): string;
167
+ //# sourceMappingURL=dynamic-updates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic-updates.d.ts","sourceRoot":"","sources":["../../src/mcp/dynamic-updates.ts"],"names":[],"mappings":"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"}