adaptive-memory-multi-model-router 2.14.59 → 2.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/.github/ISSUE_TEMPLATE/checklist.md +35 -0
  2. package/.github/workflows/ci.yml +9 -6
  3. package/POPULARITY_BOOSTERS.md +18 -0
  4. package/PR_STATUS_REPORT.md +55 -148
  5. package/README.md +222 -1035
  6. package/assets/chart-accuracy-by-tier.svg +63 -0
  7. package/assets/chart-confusion-matrix.svg +98 -0
  8. package/assets/chart-cost-comparison.svg +66 -0
  9. package/assets/chart-latency-overhead.svg +102 -0
  10. package/assets/chart-routerena-leaderboard.svg +76 -0
  11. package/dist/analytics/costAnalytics.d.ts +1 -0
  12. package/dist/benchmark/comprehensive.d.ts +4 -53
  13. package/dist/benchmark/comprehensive.d.ts.map +1 -0
  14. package/dist/benchmark/comprehensive.js +112 -214
  15. package/dist/benchmark/comprehensive.js.map +1 -1
  16. package/dist/benchmark/reproducible.d.ts +1 -0
  17. package/dist/cache/semanticCache.d.ts +1 -0
  18. package/dist/cli/setupWizard.d.ts +6 -1
  19. package/dist/cli/setupWizard.d.ts.map +1 -1
  20. package/dist/cli/setupWizard.js +6 -9
  21. package/dist/cli/setupWizard.js.map +1 -1
  22. package/dist/cost/budgetEnforcer.d.ts +1 -0
  23. package/dist/cost/costTracker.d.ts +1 -0
  24. package/dist/ensemble/multiRoundDialog.d.ts +1 -0
  25. package/dist/ensemble/multiRoundDialog.d.ts.map +1 -0
  26. package/dist/ensemble/shapleyValue.d.ts +1 -0
  27. package/dist/ensemble/shapleyValue.d.ts.map +1 -0
  28. package/dist/ensemble.d.ts +1 -0
  29. package/dist/index.d.ts +1 -0
  30. package/dist/integrations/langchainAdapter.d.ts +1 -0
  31. package/dist/integrations/oauth.d.ts +1 -0
  32. package/dist/integrations/scienceAdapter.d.ts +1 -0
  33. package/dist/integrations/scienceAdapter.d.ts.map +1 -0
  34. package/dist/memory/autoFetch.d.ts +1 -0
  35. package/dist/memory/hybridMemory.d.ts +1 -0
  36. package/dist/memory/hybridMemory.d.ts.map +1 -0
  37. package/dist/memory/memoryTree.d.ts +1 -0
  38. package/dist/memory/memoryTree.d.ts.map +1 -1
  39. package/dist/memory/obsidianVault.d.ts +1 -0
  40. package/dist/memory/obsidianVault.d.ts.map +1 -1
  41. package/dist/memory/reasoningBank.d.ts +1 -0
  42. package/dist/memory/reasoningBank.d.ts.map +1 -0
  43. package/dist/observability/changeWatch.d.ts +1 -0
  44. package/dist/observability/fatigueDetector.d.ts +1 -0
  45. package/dist/observability/index.d.ts +1 -0
  46. package/dist/observability/metrics.d.ts +1 -0
  47. package/dist/observability/metrics.d.ts.map +1 -1
  48. package/dist/observability/middleware.d.ts +1 -0
  49. package/dist/observability/tracer.d.ts +1 -0
  50. package/dist/observability/tracer.d.ts.map +1 -1
  51. package/dist/observability/types.d.ts +1 -0
  52. package/dist/providers/providerConfig.d.ts +1 -0
  53. package/dist/providers/providerConfig.d.ts.map +1 -1
  54. package/dist/routing/advancedRouter.d.ts +2 -1
  55. package/dist/routing/advancedRouter.d.ts.map +1 -1
  56. package/dist/routing/crossModelValidation.d.ts +1 -0
  57. package/dist/routing/providerHealth.d.ts +1 -0
  58. package/dist/routing/providerHealth.d.ts.map +1 -1
  59. package/dist/routing/providerRetry.d.ts +1 -0
  60. package/dist/sdk.d.ts +1 -0
  61. package/dist/security/guardrails.d.ts +1 -0
  62. package/dist/security/guardrails.d.ts.map +1 -1
  63. package/dist/server/dashboard.d.ts +1 -0
  64. package/dist/server/handlers/chatHandler.d.ts +11 -0
  65. package/dist/server/handlers/chatHandler.d.ts.map +1 -0
  66. package/dist/server/handlers/chatHandler.js +159 -0
  67. package/dist/server/handlers/chatHandler.js.map +1 -0
  68. package/dist/server/handlers/completionsHandler.d.ts +10 -0
  69. package/dist/server/handlers/completionsHandler.d.ts.map +1 -0
  70. package/dist/server/handlers/completionsHandler.js +124 -0
  71. package/dist/server/handlers/completionsHandler.js.map +1 -0
  72. package/dist/server/handlers/embeddingsHandler.d.ts +17 -0
  73. package/dist/server/handlers/embeddingsHandler.d.ts.map +1 -0
  74. package/dist/server/handlers/embeddingsHandler.js +235 -0
  75. package/dist/server/handlers/embeddingsHandler.js.map +1 -0
  76. package/dist/server/handlers/healthHandler.d.ts +10 -0
  77. package/dist/server/handlers/healthHandler.d.ts.map +1 -0
  78. package/dist/server/handlers/healthHandler.js +49 -0
  79. package/dist/server/handlers/healthHandler.js.map +1 -0
  80. package/dist/server/handlers/metricsHandler.d.ts +11 -0
  81. package/dist/server/handlers/metricsHandler.d.ts.map +1 -0
  82. package/dist/server/handlers/metricsHandler.js +24 -0
  83. package/dist/server/handlers/metricsHandler.js.map +1 -0
  84. package/dist/server/handlers/modelsHandler.d.ts +10 -0
  85. package/dist/server/handlers/modelsHandler.d.ts.map +1 -0
  86. package/dist/server/handlers/modelsHandler.js +19 -0
  87. package/dist/server/handlers/modelsHandler.js.map +1 -0
  88. package/dist/server/metrics.d.ts +96 -0
  89. package/dist/server/metrics.d.ts.map +1 -0
  90. package/dist/server/metrics.js +267 -0
  91. package/dist/server/metrics.js.map +1 -0
  92. package/dist/server/modelMapper.d.ts +1 -0
  93. package/dist/server/proxyServer.d.ts +53 -17
  94. package/dist/server/proxyServer.d.ts.map +1 -1
  95. package/dist/server/proxyServer.js +66 -303
  96. package/dist/server/proxyServer.js.map +1 -1
  97. package/dist/server/router.d.ts +49 -0
  98. package/dist/server/router.d.ts.map +1 -0
  99. package/dist/server/router.js +120 -0
  100. package/dist/server/router.js.map +1 -0
  101. package/dist/server/state.d.ts +30 -0
  102. package/dist/server/state.d.ts.map +1 -0
  103. package/dist/server/state.js +18 -0
  104. package/dist/server/state.js.map +1 -0
  105. package/dist/skills/__tests__/skill_manager.test.d.ts +3 -0
  106. package/dist/skills/__tests__/skill_manager.test.d.ts.map +1 -1
  107. package/dist/skills/__tests__/skill_manager.test.js +3 -6
  108. package/dist/skills/__tests__/skill_manager.test.js.map +1 -1
  109. package/dist/tui/dashboard.d.ts +1 -0
  110. package/dist/tui/index.d.ts +1 -0
  111. package/dist/utils/costUtils.d.ts +1 -0
  112. package/dist/utils/reliability.js +4 -18
  113. package/dist/utils/sorting.d.ts +1 -0
  114. package/dist/utils/tokenUtils.d.ts +1 -0
  115. package/docs/assets/chart-accuracy-by-tier.svg +63 -0
  116. package/docs/assets/chart-confusion-matrix.svg +98 -0
  117. package/docs/assets/chart-cost-comparison.svg +66 -0
  118. package/docs/assets/chart-latency-overhead.svg +102 -0
  119. package/docs/assets/chart-routerena-leaderboard.svg +76 -0
  120. package/docs/index.html +72 -80
  121. package/docs/llms-full.txt +156 -184
  122. package/docs/llms.txt +77 -42
  123. package/llms-full.txt +156 -184
  124. package/llms.txt +77 -42
  125. package/mcp-server/package.json +6 -0
  126. package/mcp-server/tsconfig.json +3 -2
  127. package/package.json +4 -3
  128. package/scripts/postinstall-nudge.js +3 -0
  129. package/src/server/handlers/chatHandler.ts +173 -0
  130. package/src/server/handlers/completionsHandler.ts +120 -0
  131. package/src/server/handlers/embeddingsHandler.ts +271 -0
  132. package/src/server/handlers/healthHandler.ts +57 -0
  133. package/src/server/handlers/metricsHandler.ts +30 -0
  134. package/src/server/handlers/modelsHandler.ts +25 -0
  135. package/src/server/metrics.ts +303 -0
  136. package/src/server/proxyServer.ts +71 -394
  137. package/src/server/router.ts +157 -0
  138. package/src/server/state.ts +34 -0
  139. package/src/skills/__tests__/skill_manager.test.ts +3 -3
  140. package/index.html +0 -667
@@ -0,0 +1,157 @@
1
+ /**
2
+ * A3M Router - HTTP Route Registry
3
+ *
4
+ * Pluggable route table pattern replacing monolithic if/else routing.
5
+ * Adding a new endpoint = 1 handler file + 1 registration line.
6
+ *
7
+ * Usage:
8
+ * import { createRouter, registerRoute } from './router';
9
+ * registerRoute('GET', /^\/health$/, handleHealth);
10
+ * registerRoute('POST', /^\/v1\/chat\/completions$/, handleChatCompletions);
11
+ * const router = createRouter();
12
+ * server.use(router);
13
+ */
14
+
15
+ import * as http from 'http';
16
+
17
+ // ============================================================
18
+ // TYPES
19
+ // ============================================================
20
+
21
+ export type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'OPTIONS';
22
+
23
+ export interface RouteContext {
24
+ requestId: string;
25
+ startTime: number;
26
+ method: HTTPMethod;
27
+ path: string;
28
+ query: Record<string, string>;
29
+ }
30
+
31
+ export type RouteHandler = (
32
+ req: http.IncomingMessage,
33
+ res: http.ServerResponse,
34
+ ctx: RouteContext
35
+ ) => Promise<void> | void;
36
+
37
+ export interface Route {
38
+ method: HTTPMethod;
39
+ pattern: RegExp;
40
+ handler: RouteHandler;
41
+ name: string;
42
+ }
43
+
44
+ // ============================================================
45
+ // ROUTE REGISTRY
46
+ // ============================================================
47
+
48
+ const routes: Route[] = [];
49
+
50
+ /**
51
+ * Generate a short request ID.
52
+ */
53
+ function generateRequestId(): string {
54
+ return 'req-' + Math.random().toString(36).substring(2, 10) + Date.now().toString(36);
55
+ }
56
+
57
+ /**
58
+ * Parse query string from URL.
59
+ */
60
+ function parseQuery(url: string): Record<string, string> {
61
+ try {
62
+ const urlObj = new URL(url, 'http://localhost');
63
+ const query: Record<string, string> = {};
64
+ urlObj.searchParams.forEach((value, key) => {
65
+ query[key] = value;
66
+ });
67
+ return query;
68
+ } catch {
69
+ return {};
70
+ }
71
+ }
72
+
73
+ /**
74
+ * Parse HTTP method safely.
75
+ */
76
+ function parseMethod(method: string | undefined): HTTPMethod {
77
+ const m = (method || 'GET').toUpperCase();
78
+ if (['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'].includes(m)) {
79
+ return m as HTTPMethod;
80
+ }
81
+ return 'GET';
82
+ }
83
+
84
+ /**
85
+ * Register a route. Routes are matched in registration order.
86
+ */
87
+ export function registerRoute(
88
+ method: HTTPMethod,
89
+ pattern: RegExp,
90
+ handler: RouteHandler,
91
+ name?: string
92
+ ): void {
93
+ routes.push({ method, pattern, handler, name: name || `${method} ${pattern}` });
94
+ }
95
+
96
+ /**
97
+ * Create the request handler function for the registered routes.
98
+ * Returns a function compatible with http.createServer's requestListener.
99
+ */
100
+ export function createRequestHandler(): (req: http.IncomingMessage, res: http.ServerResponse) => Promise<void> {
101
+ return async function handleRequest(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {
102
+ const method = parseMethod(req.method);
103
+ const url = req.url || '/';
104
+ const ctx: RouteContext = {
105
+ requestId: generateRequestId(),
106
+ startTime: Date.now(),
107
+ method,
108
+ path: url.split('?')[0],
109
+ query: parseQuery(url),
110
+ };
111
+
112
+ // CORS preflight
113
+ if (method === 'OPTIONS') {
114
+ res.writeHead(204, {
115
+ 'Access-Control-Allow-Origin': '*',
116
+ 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS',
117
+ 'Access-Control-Allow-Headers': 'Content-Type, Authorization, x-request-id',
118
+ 'Access-Control-Max-Age': '86400',
119
+ });
120
+ res.end();
121
+ return;
122
+ }
123
+
124
+ // Find matching route
125
+ for (const route of routes) {
126
+ if (route.method !== method) continue;
127
+ const match = ctx.path.match(route.pattern);
128
+ if (match) {
129
+ try {
130
+ await route.handler(req, res, ctx);
131
+ } catch (err: any) {
132
+ console.error(`[a3m-router] Route ${route.name} error: ${err.message}`);
133
+ if (!res.headersSent) {
134
+ res.writeHead(500, { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' });
135
+ res.end(JSON.stringify({ error: { message: err.message, type: 'server_error' } }));
136
+ }
137
+ }
138
+ return;
139
+ }
140
+ }
141
+
142
+ // No route matched — 404
143
+ if (!res.headersSent) {
144
+ res.writeHead(404, { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' });
145
+ res.end(JSON.stringify({ error: { message: `Not found: ${method} ${url}`, type: 'not_found' } }));
146
+ }
147
+ };
148
+ }
149
+
150
+ /**
151
+ * Get all registered routes (for debugging and /routes endpoint).
152
+ */
153
+ export function getRegisteredRoutes(): Route[] {
154
+ return [...routes];
155
+ }
156
+
157
+ export default { registerRoute, createRequestHandler, getRegisteredRoutes };
@@ -0,0 +1,34 @@
1
+ /**
2
+ * A3M Router - Shared Server State
3
+ *
4
+ * Singleton state shared across the proxy server and all handlers.
5
+ * Extracted from proxyServer.ts to enable modular handler architecture.
6
+ */
7
+
8
+ import { CostTracker } from '../cost/costTracker';
9
+
10
+ // ============================================================
11
+ // SHARED STATE
12
+ // ============================================================
13
+
14
+ /** Singleton cost tracker instance */
15
+ export const costTracker = new CostTracker();
16
+
17
+ /** In-memory request log (last 1000 entries) */
18
+ export interface RequestLog {
19
+ id: string;
20
+ model: string;
21
+ resolvedProvider: string;
22
+ resolvedModel: string;
23
+ latencyMs: number;
24
+ tokensIn: number;
25
+ tokensOut: number;
26
+ cost: number;
27
+ status: 'success' | 'error';
28
+ error?: string;
29
+ timestamp: number;
30
+ }
31
+
32
+ export const requestLogs: RequestLog[] = [];
33
+
34
+ export default { costTracker, requestLogs };
@@ -1,6 +1,6 @@
1
- """
2
- Tests for SkillManager and TMLEnhancedAgent
3
- """
1
+ /**
2
+ * Tests for SkillManager and TMLEnhancedAgent
3
+ */
4
4
 
5
5
  import { describe, it, expect, beforeEach, jest } from '@jest/globals';
6
6
  import { SkillManager, Skill } from '../skill_manager';