adaptive-memory-multi-model-router 2.14.16 → 2.14.17

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 (38) hide show
  1. package/.a3m-vault.json +23 -0
  2. package/.github/workflows/ci.yml +253 -5
  3. package/.publish-tick +1 -1
  4. package/README.md +15 -17
  5. package/benchmark-results.json +45 -43
  6. package/dist/ensemble.d.ts +21 -0
  7. package/dist/ensemble.js +85 -0
  8. package/dist/index.d.ts +3 -1
  9. package/dist/index.js +12 -4
  10. package/dist/tui/dashboard.js +66 -2
  11. package/dist/tui/dashboard.js.map +1 -1
  12. package/dist/utils/tokenUtils.d.ts +48 -1
  13. package/dist/utils/tokenUtils.js +117 -4
  14. package/dist/utils/tokenUtils.js.map +1 -1
  15. package/docs/CITATIONS.md +2 -2
  16. package/docs/GEO_STATUS.md +43 -157
  17. package/docs/ai-plugin.json +4 -4
  18. package/docs/llms.txt +21 -27
  19. package/docs/sitemap.xml +14 -20
  20. package/package.json +2 -2
  21. package/research/PUBLISH_LOG.md +2 -2
  22. package/sitemap.xml +57 -0
  23. package/src/ensemble.ts +103 -0
  24. package/src/index.ts +13 -3
  25. package/src/tui/dashboard.ts +76 -3
  26. package/src/utils/tokenUtils.ts +142 -4
  27. package/test-council/1-structure-tests.test.js +353 -0
  28. package/test-council/1-structure-tests.test.ts +353 -0
  29. package/test-council/2-edge-case-tests.test.ts +361 -0
  30. package/test-council/3-performance-tests.test.ts +669 -0
  31. package/test-council/4-integration-tests.test.ts +391 -0
  32. package/test-council/5-agent-council-eval.test.ts +413 -0
  33. package/test-council/TEST_COUNCIL_REPORT.md +201 -0
  34. package/test-council/agents/edge-case-agent.ts +363 -0
  35. package/test-council/agents/performance-agent.ts +426 -0
  36. package/test-council/agents/structure-agent.ts +227 -0
  37. package/test-council/council.md +183 -0
  38. package/docs/.well-known/ai-plugin.json +0 -16
@@ -0,0 +1,353 @@
1
+ /**
2
+ * Structure Tests - Code Structure & Export Coverage
3
+ *
4
+ * Tests that verify all exported functions, classes, and types work correctly.
5
+ * This file provides comprehensive coverage of the public API surface.
6
+ */
7
+
8
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
9
+
10
+ // Import all exports from the main module
11
+ const {
12
+ // Routing engine
13
+ routeQuery,
14
+ routeBatch,
15
+ recommendForTask,
16
+ extractQueryFeatures,
17
+ MODEL_PROFILES,
18
+ updateModelProfile,
19
+ getProviderHealth,
20
+
21
+ // Retry handling
22
+ ProviderRetryHandler,
23
+ createRetryHandler,
24
+ getDefaultRetryHandler,
25
+ DEFAULT_RETRY_CONFIG,
26
+ DEFAULT_PROVIDER_CONFIG,
27
+ PROVIDER_CONTEXT_LIMITS,
28
+
29
+ // Providers
30
+ DEFAULT_PROVIDERS,
31
+ getAvailableProviders,
32
+ registerProvider,
33
+ deregisterProvider,
34
+ updateProvider,
35
+ healthCheck,
36
+ checkAllProviders,
37
+ findCheapestAvailableProvider,
38
+ findFastestAvailableProvider,
39
+ loadConfig,
40
+ saveConfig,
41
+
42
+ // Cost tracking
43
+ CostTracker,
44
+ BudgetEnforcer,
45
+ BudgetExceededError,
46
+ createBudgetEnforcer,
47
+
48
+ // Memory
49
+ MemoryTree,
50
+
51
+ // Utilities
52
+ countTokens,
53
+ estimateTokens,
54
+
55
+ // Cache
56
+ SemanticCache,
57
+
58
+ // Security
59
+ GuardrailEngine,
60
+
61
+ // Analytics
62
+ CostAnalytics,
63
+
64
+ // Observability
65
+ Tracer,
66
+ getTracer,
67
+ createTracer,
68
+ MetricsCollector,
69
+ getMetrics,
70
+ createMetricsCollector,
71
+ observabilityMiddleware,
72
+ observabilityPlugin,
73
+ budgetAlertMiddleware,
74
+
75
+ // Ensemble
76
+ HALOOrchestrator,
77
+
78
+ // Factory
79
+ createA3MRouter,
80
+ } = require('../dist/index.js');
81
+
82
+ // ============================================================
83
+ // STRUCTURE TESTS
84
+ // ============================================================
85
+
86
+ describe('1. Structure - Routing Engine Exports', () => {
87
+
88
+ describe('routeQuery', () => {
89
+ it('is a function', () => {
90
+ expect(typeof routeQuery).toBe('function');
91
+ });
92
+
93
+ it('returns object with primary_model', () => {
94
+ const result = routeQuery('test query');
95
+ expect(result).toHaveProperty('primary_model');
96
+ });
97
+
98
+ it('returns object with fallback_models array', () => {
99
+ const result = routeQuery('test query');
100
+ expect(result).toHaveProperty('fallback_models');
101
+ expect(Array.isArray(result.fallback_models)).toBe(true);
102
+ });
103
+
104
+ it('returns object with estimated_cost number', () => {
105
+ const result = routeQuery('test query');
106
+ expect(result).toHaveProperty('estimated_cost');
107
+ expect(typeof result.estimated_cost).toBe('number');
108
+ });
109
+
110
+ it('returns object with confidence number', () => {
111
+ const result = routeQuery('test query');
112
+ expect(result).toHaveProperty('confidence');
113
+ expect(typeof result.confidence).toBe('number');
114
+ });
115
+ });
116
+
117
+ describe('routeBatch', () => {
118
+ it('is a function', () => {
119
+ expect(typeof routeBatch).toBe('function');
120
+ });
121
+
122
+ it('returns array of same length as input', () => {
123
+ const queries = ['a', 'b', 'c'];
124
+ const results = routeBatch(queries);
125
+ expect(results.length).toBe(queries.length);
126
+ });
127
+ });
128
+
129
+ describe('recommendForTask', () => {
130
+ it('is a function', () => {
131
+ expect(typeof recommendForTask).toBe('function');
132
+ });
133
+
134
+ it('returns object with primary field', () => {
135
+ const result = recommendForTask('coding');
136
+ expect(result).toHaveProperty('primary');
137
+ });
138
+ });
139
+
140
+ describe('extractQueryFeatures', () => {
141
+ it('is a function', () => {
142
+ expect(typeof extractQueryFeatures).toBe('function');
143
+ });
144
+
145
+ it('returns object', () => {
146
+ const features = extractQueryFeatures('test');
147
+ expect(typeof features).toBe('object');
148
+ });
149
+ });
150
+
151
+ describe('MODEL_PROFILES', () => {
152
+ it('is an object', () => {
153
+ expect(typeof MODEL_PROFILES).toBe('object');
154
+ });
155
+
156
+ it('has at least one model', () => {
157
+ expect(Object.keys(MODEL_PROFILES).length).toBeGreaterThan(0);
158
+ });
159
+ });
160
+ });
161
+
162
+ describe('2. Structure - Provider Configuration Exports', () => {
163
+
164
+ describe('DEFAULT_PROVIDERS', () => {
165
+ it('is an object', () => {
166
+ expect(typeof DEFAULT_PROVIDERS).toBe('object');
167
+ });
168
+ });
169
+
170
+ describe('getAvailableProviders', () => {
171
+ it('is a function', () => {
172
+ expect(typeof getAvailableProviders).toBe('function');
173
+ });
174
+
175
+ it('returns an object', () => {
176
+ const providers = getAvailableProviders();
177
+ expect(typeof providers).toBe('object');
178
+ });
179
+ });
180
+
181
+ describe('registerProvider', () => {
182
+ it('is a function', () => {
183
+ expect(typeof registerProvider).toBe('function');
184
+ });
185
+ });
186
+
187
+ describe('deregisterProvider', () => {
188
+ it('is a function', () => {
189
+ expect(typeof deregisterProvider).toBe('function');
190
+ });
191
+ });
192
+
193
+ describe('updateProvider', () => {
194
+ it('is a function', () => {
195
+ expect(typeof updateProvider).toBe('function');
196
+ });
197
+ });
198
+
199
+ describe('healthCheck', () => {
200
+ it('is a function', () => {
201
+ expect(typeof healthCheck).toBe('function');
202
+ });
203
+ });
204
+ });
205
+
206
+ describe('3. Structure - Retry Handler Exports', () => {
207
+
208
+ describe('ProviderRetryHandler', () => {
209
+ it('is a class', () => {
210
+ expect(typeof ProviderRetryHandler).toBe('function');
211
+ });
212
+
213
+ it('can be instantiated', () => {
214
+ const handler = new ProviderRetryHandler();
215
+ expect(handler).toBeInstanceOf(ProviderRetryHandler);
216
+ });
217
+
218
+ it('has getConfig method', () => {
219
+ const handler = new ProviderRetryHandler();
220
+ expect(typeof handler.getConfig).toBe('function');
221
+ });
222
+
223
+ it('has isRetryableError method', () => {
224
+ const handler = new ProviderRetryHandler();
225
+ expect(typeof handler.isRetryableError).toBe('function');
226
+ });
227
+ });
228
+
229
+ describe('createRetryHandler', () => {
230
+ it('is a function', () => {
231
+ expect(typeof createRetryHandler).toBe('function');
232
+ });
233
+ });
234
+
235
+ describe('DEFAULT_RETRY_CONFIG', () => {
236
+ it('is an object', () => {
237
+ expect(typeof DEFAULT_RETRY_CONFIG).toBe('object');
238
+ });
239
+ });
240
+
241
+ describe('PROVIDER_CONTEXT_LIMITS', () => {
242
+ it('is an object', () => {
243
+ expect(typeof PROVIDER_CONTEXT_LIMITS).toBe('object');
244
+ });
245
+ });
246
+ });
247
+
248
+ describe('4. Structure - Cost Tracking Exports', () => {
249
+
250
+ describe('CostTracker', () => {
251
+ it('is a class', () => {
252
+ expect(typeof CostTracker).toBe('function');
253
+ });
254
+
255
+ it('can be instantiated', () => {
256
+ const tracker = new CostTracker();
257
+ expect(tracker).toBeTruthy();
258
+ });
259
+ });
260
+
261
+ describe('BudgetEnforcer', () => {
262
+ it('is a class', () => {
263
+ expect(typeof BudgetEnforcer).toBe('function');
264
+ });
265
+ });
266
+
267
+ describe('BudgetExceededError', () => {
268
+ it('is an Error class', () => {
269
+ expect(typeof BudgetExceededError).toBe('function');
270
+ const error = new BudgetExceededError('test');
271
+ expect(error).toBeInstanceOf(Error);
272
+ });
273
+ });
274
+ });
275
+
276
+ describe('5. Structure - Memory Exports', () => {
277
+
278
+ describe('MemoryTree', () => {
279
+ it('is a class', () => {
280
+ expect(typeof MemoryTree).toBe('function');
281
+ });
282
+
283
+ it('can be instantiated', () => {
284
+ const memory = new MemoryTree({ maxSize: 100 });
285
+ expect(memory).toBeTruthy();
286
+ });
287
+
288
+ it('has add method', () => {
289
+ const memory = new MemoryTree({ maxSize: 100 });
290
+ expect(typeof memory.add).toBe('function');
291
+ });
292
+
293
+ it('has search method', () => {
294
+ const memory = new MemoryTree({ maxSize: 100 });
295
+ expect(typeof memory.search).toBe('function');
296
+ });
297
+
298
+ it('has getStats method', () => {
299
+ const memory = new MemoryTree({ maxSize: 100 });
300
+ expect(typeof memory.getStats).toBe('function');
301
+ });
302
+ });
303
+ });
304
+
305
+ describe('6. Structure - Utility Exports', () => {
306
+
307
+ describe('countTokens', () => {
308
+ it('is a function', () => {
309
+ expect(typeof countTokens).toBe('function');
310
+ });
311
+
312
+ it('returns positive number for non-empty string', () => {
313
+ const tokens = countTokens('hello world');
314
+ expect(typeof tokens).toBe('number');
315
+ expect(tokens).toBeGreaterThan(0);
316
+ });
317
+ });
318
+
319
+ describe('estimateTokens', () => {
320
+ it('is a function', () => {
321
+ expect(typeof estimateTokens).toBe('function');
322
+ });
323
+ });
324
+ });
325
+
326
+ describe('7. Structure - Factory Exports', () => {
327
+
328
+ describe('createA3MRouter', () => {
329
+ it('is a function', () => {
330
+ expect(typeof createA3MRouter).toBe('function');
331
+ });
332
+
333
+ it('returns an object', () => {
334
+ const router = createA3MRouter({});
335
+ expect(typeof router).toBe('object');
336
+ });
337
+
338
+ it('returns object with route function', () => {
339
+ const router = createA3MRouter({});
340
+ expect(typeof router.route).toBe('function');
341
+ });
342
+
343
+ it('returns object with costTracker', () => {
344
+ const router = createA3MRouter({});
345
+ expect(router.costTracker).toBeTruthy();
346
+ });
347
+
348
+ it('returns object with memoryTree', () => {
349
+ const router = createA3MRouter({});
350
+ expect(router.memoryTree).toBeTruthy();
351
+ });
352
+ });
353
+ });
@@ -0,0 +1,353 @@
1
+ /**
2
+ * Structure Tests - Code Structure & Export Coverage
3
+ *
4
+ * Tests that verify all exported functions, classes, and types work correctly.
5
+ * This file provides comprehensive coverage of the public API surface.
6
+ */
7
+
8
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
9
+
10
+ // Import all exports from the main module
11
+ const {
12
+ // Routing engine
13
+ routeQuery,
14
+ routeBatch,
15
+ recommendForTask,
16
+ extractQueryFeatures,
17
+ MODEL_PROFILES,
18
+ updateModelProfile,
19
+ getProviderHealth,
20
+
21
+ // Retry handling
22
+ ProviderRetryHandler,
23
+ createRetryHandler,
24
+ getDefaultRetryHandler,
25
+ DEFAULT_RETRY_CONFIG,
26
+ DEFAULT_PROVIDER_CONFIG,
27
+ PROVIDER_CONTEXT_LIMITS,
28
+
29
+ // Providers
30
+ DEFAULT_PROVIDERS,
31
+ getAvailableProviders,
32
+ registerProvider,
33
+ deregisterProvider,
34
+ updateProvider,
35
+ healthCheck,
36
+ checkAllProviders,
37
+ findCheapestAvailableProvider,
38
+ findFastestAvailableProvider,
39
+ loadConfig,
40
+ saveConfig,
41
+
42
+ // Cost tracking
43
+ CostTracker,
44
+ BudgetEnforcer,
45
+ BudgetExceededError,
46
+ createBudgetEnforcer,
47
+
48
+ // Memory
49
+ MemoryTree,
50
+
51
+ // Utilities
52
+ countTokens,
53
+ estimateTokens,
54
+
55
+ // Cache
56
+ SemanticCache,
57
+
58
+ // Security
59
+ GuardrailEngine,
60
+
61
+ // Analytics
62
+ CostAnalytics,
63
+
64
+ // Observability
65
+ Tracer,
66
+ getTracer,
67
+ createTracer,
68
+ MetricsCollector,
69
+ getMetrics,
70
+ createMetricsCollector,
71
+ observabilityMiddleware,
72
+ observabilityPlugin,
73
+ budgetAlertMiddleware,
74
+
75
+ // Ensemble
76
+ EnsembleOrchestrator,
77
+
78
+ // Factory
79
+ createA3MRouter,
80
+ } = require('../dist/index.js');
81
+
82
+ // ============================================================
83
+ // STRUCTURE TESTS
84
+ // ============================================================
85
+
86
+ describe('1. Structure - Routing Engine Exports', () => {
87
+
88
+ describe('routeQuery', () => {
89
+ it('is a function', () => {
90
+ expect(typeof routeQuery).toBe('function');
91
+ });
92
+
93
+ it('returns object with primary_model', () => {
94
+ const result = routeQuery('test query');
95
+ expect(result).toHaveProperty('primary_model');
96
+ });
97
+
98
+ it('returns object with fallback_models array', () => {
99
+ const result = routeQuery('test query');
100
+ expect(result).toHaveProperty('fallback_models');
101
+ expect(Array.isArray(result.fallback_models)).toBe(true);
102
+ });
103
+
104
+ it('returns object with estimated_cost number', () => {
105
+ const result = routeQuery('test query');
106
+ expect(result).toHaveProperty('estimated_cost');
107
+ expect(typeof result.estimated_cost).toBe('number');
108
+ });
109
+
110
+ it('returns object with confidence number', () => {
111
+ const result = routeQuery('test query');
112
+ expect(result).toHaveProperty('confidence');
113
+ expect(typeof result.confidence).toBe('number');
114
+ });
115
+ });
116
+
117
+ describe('routeBatch', () => {
118
+ it('is a function', () => {
119
+ expect(typeof routeBatch).toBe('function');
120
+ });
121
+
122
+ it('returns array of same length as input', () => {
123
+ const queries = ['a', 'b', 'c'];
124
+ const results = routeBatch(queries);
125
+ expect(results.length).toBe(queries.length);
126
+ });
127
+ });
128
+
129
+ describe('recommendForTask', () => {
130
+ it('is a function', () => {
131
+ expect(typeof recommendForTask).toBe('function');
132
+ });
133
+
134
+ it('returns object with primary field', () => {
135
+ const result = recommendForTask('coding');
136
+ expect(result).toHaveProperty('primary');
137
+ });
138
+ });
139
+
140
+ describe('extractQueryFeatures', () => {
141
+ it('is a function', () => {
142
+ expect(typeof extractQueryFeatures).toBe('function');
143
+ });
144
+
145
+ it('returns object', () => {
146
+ const features = extractQueryFeatures('test');
147
+ expect(typeof features).toBe('object');
148
+ });
149
+ });
150
+
151
+ describe('MODEL_PROFILES', () => {
152
+ it('is an object', () => {
153
+ expect(typeof MODEL_PROFILES).toBe('object');
154
+ });
155
+
156
+ it('has at least one model', () => {
157
+ expect(Object.keys(MODEL_PROFILES).length).toBeGreaterThan(0);
158
+ });
159
+ });
160
+ });
161
+
162
+ describe('2. Structure - Provider Configuration Exports', () => {
163
+
164
+ describe('DEFAULT_PROVIDERS', () => {
165
+ it('is an object', () => {
166
+ expect(typeof DEFAULT_PROVIDERS).toBe('object');
167
+ });
168
+ });
169
+
170
+ describe('getAvailableProviders', () => {
171
+ it('is a function', () => {
172
+ expect(typeof getAvailableProviders).toBe('function');
173
+ });
174
+
175
+ it('returns an object', () => {
176
+ const providers = getAvailableProviders();
177
+ expect(typeof providers).toBe('object');
178
+ });
179
+ });
180
+
181
+ describe('registerProvider', () => {
182
+ it('is a function', () => {
183
+ expect(typeof registerProvider).toBe('function');
184
+ });
185
+ });
186
+
187
+ describe('deregisterProvider', () => {
188
+ it('is a function', () => {
189
+ expect(typeof deregisterProvider).toBe('function');
190
+ });
191
+ });
192
+
193
+ describe('updateProvider', () => {
194
+ it('is a function', () => {
195
+ expect(typeof updateProvider).toBe('function');
196
+ });
197
+ });
198
+
199
+ describe('healthCheck', () => {
200
+ it('is a function', () => {
201
+ expect(typeof healthCheck).toBe('function');
202
+ });
203
+ });
204
+ });
205
+
206
+ describe('3. Structure - Retry Handler Exports', () => {
207
+
208
+ describe('ProviderRetryHandler', () => {
209
+ it('is a class', () => {
210
+ expect(typeof ProviderRetryHandler).toBe('function');
211
+ });
212
+
213
+ it('can be instantiated', () => {
214
+ const handler = new ProviderRetryHandler();
215
+ expect(handler).toBeInstanceOf(ProviderRetryHandler);
216
+ });
217
+
218
+ it('has getConfig method', () => {
219
+ const handler = new ProviderRetryHandler();
220
+ expect(typeof handler.getConfig).toBe('function');
221
+ });
222
+
223
+ it('has isRetryableError method', () => {
224
+ const handler = new ProviderRetryHandler();
225
+ expect(typeof handler.isRetryableError).toBe('function');
226
+ });
227
+ });
228
+
229
+ describe('createRetryHandler', () => {
230
+ it('is a function', () => {
231
+ expect(typeof createRetryHandler).toBe('function');
232
+ });
233
+ });
234
+
235
+ describe('DEFAULT_RETRY_CONFIG', () => {
236
+ it('is an object', () => {
237
+ expect(typeof DEFAULT_RETRY_CONFIG).toBe('object');
238
+ });
239
+ });
240
+
241
+ describe('PROVIDER_CONTEXT_LIMITS', () => {
242
+ it('is an object', () => {
243
+ expect(typeof PROVIDER_CONTEXT_LIMITS).toBe('object');
244
+ });
245
+ });
246
+ });
247
+
248
+ describe('4. Structure - Cost Tracking Exports', () => {
249
+
250
+ describe('CostTracker', () => {
251
+ it('is a class', () => {
252
+ expect(typeof CostTracker).toBe('function');
253
+ });
254
+
255
+ it('can be instantiated', () => {
256
+ const tracker = new CostTracker();
257
+ expect(tracker).toBeTruthy();
258
+ });
259
+ });
260
+
261
+ describe('BudgetEnforcer', () => {
262
+ it('is a class', () => {
263
+ expect(typeof BudgetEnforcer).toBe('function');
264
+ });
265
+ });
266
+
267
+ describe('BudgetExceededError', () => {
268
+ it('is an Error class', () => {
269
+ expect(typeof BudgetExceededError).toBe('function');
270
+ const error = new BudgetExceededError('test');
271
+ expect(error).toBeInstanceOf(Error);
272
+ });
273
+ });
274
+ });
275
+
276
+ describe('5. Structure - Memory Exports', () => {
277
+
278
+ describe('MemoryTree', () => {
279
+ it('is a class', () => {
280
+ expect(typeof MemoryTree).toBe('function');
281
+ });
282
+
283
+ it('can be instantiated', () => {
284
+ const memory = new MemoryTree({ maxSize: 100 });
285
+ expect(memory).toBeTruthy();
286
+ });
287
+
288
+ it('has add method', () => {
289
+ const memory = new MemoryTree({ maxSize: 100 });
290
+ expect(typeof memory.add).toBe('function');
291
+ });
292
+
293
+ it('has search method', () => {
294
+ const memory = new MemoryTree({ maxSize: 100 });
295
+ expect(typeof memory.search).toBe('function');
296
+ });
297
+
298
+ it('has getStats method', () => {
299
+ const memory = new MemoryTree({ maxSize: 100 });
300
+ expect(typeof memory.getStats).toBe('function');
301
+ });
302
+ });
303
+ });
304
+
305
+ describe('6. Structure - Utility Exports', () => {
306
+
307
+ describe('countTokens', () => {
308
+ it('is a function', () => {
309
+ expect(typeof countTokens).toBe('function');
310
+ });
311
+
312
+ it('returns positive number for non-empty string', () => {
313
+ const tokens = countTokens('hello world');
314
+ expect(typeof tokens).toBe('number');
315
+ expect(tokens).toBeGreaterThan(0);
316
+ });
317
+ });
318
+
319
+ describe('estimateTokens', () => {
320
+ it('is a function', () => {
321
+ expect(typeof estimateTokens).toBe('function');
322
+ });
323
+ });
324
+ });
325
+
326
+ describe('7. Structure - Factory Exports', () => {
327
+
328
+ describe('createA3MRouter', () => {
329
+ it('is a function', () => {
330
+ expect(typeof createA3MRouter).toBe('function');
331
+ });
332
+
333
+ it('returns an object', () => {
334
+ const router = createA3MRouter({});
335
+ expect(typeof router).toBe('object');
336
+ });
337
+
338
+ it('returns object with route function', () => {
339
+ const router = createA3MRouter({});
340
+ expect(typeof router.route).toBe('function');
341
+ });
342
+
343
+ it('returns object with costTracker', () => {
344
+ const router = createA3MRouter({});
345
+ expect(router.costTracker).toBeTruthy();
346
+ });
347
+
348
+ it('returns object with memoryTree', () => {
349
+ const router = createA3MRouter({});
350
+ expect(router.memoryTree).toBeTruthy();
351
+ });
352
+ });
353
+ });