adaptive-memory-multi-model-router 2.14.60 → 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.
- package/.github/ISSUE_TEMPLATE/checklist.md +35 -0
- package/.github/workflows/ci.yml +9 -6
- package/POPULARITY_BOOSTERS.md +18 -0
- package/README.md +222 -1039
- package/assets/chart-accuracy-by-tier.svg +63 -0
- package/assets/chart-confusion-matrix.svg +98 -0
- package/assets/chart-cost-comparison.svg +66 -0
- package/assets/chart-latency-overhead.svg +102 -0
- package/assets/chart-routerena-leaderboard.svg +76 -0
- package/dist/analytics/costAnalytics.d.ts +1 -0
- package/dist/benchmark/comprehensive.d.ts +4 -53
- package/dist/benchmark/comprehensive.d.ts.map +1 -0
- package/dist/benchmark/comprehensive.js +112 -214
- package/dist/benchmark/comprehensive.js.map +1 -1
- package/dist/benchmark/reproducible.d.ts +1 -0
- package/dist/cache/semanticCache.d.ts +1 -0
- package/dist/cli/setupWizard.d.ts +6 -1
- package/dist/cli/setupWizard.d.ts.map +1 -1
- package/dist/cli/setupWizard.js +6 -9
- package/dist/cli/setupWizard.js.map +1 -1
- package/dist/cli.js +15 -14
- package/dist/cost/budgetEnforcer.d.ts +1 -0
- package/dist/cost/costTracker.d.ts +1 -0
- package/dist/ensemble/multiRoundDialog.d.ts +1 -0
- package/dist/ensemble/multiRoundDialog.d.ts.map +1 -0
- package/dist/ensemble/shapleyValue.d.ts +1 -0
- package/dist/ensemble/shapleyValue.d.ts.map +1 -0
- package/dist/ensemble.d.ts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/integrations/langchainAdapter.d.ts +1 -0
- package/dist/integrations/oauth.d.ts +1 -0
- package/dist/integrations/scienceAdapter.d.ts +1 -0
- package/dist/integrations/scienceAdapter.d.ts.map +1 -0
- package/dist/memory/autoFetch.d.ts +1 -0
- package/dist/memory/hybridMemory.d.ts +1 -0
- package/dist/memory/hybridMemory.d.ts.map +1 -0
- package/dist/memory/memoryTree.d.ts +1 -0
- package/dist/memory/memoryTree.d.ts.map +1 -1
- package/dist/memory/obsidianVault.d.ts +1 -0
- package/dist/memory/obsidianVault.d.ts.map +1 -1
- package/dist/memory/reasoningBank.d.ts +1 -0
- package/dist/memory/reasoningBank.d.ts.map +1 -0
- package/dist/observability/changeWatch.d.ts +1 -0
- package/dist/observability/fatigueDetector.d.ts +1 -0
- package/dist/observability/index.d.ts +1 -0
- package/dist/observability/metrics.d.ts +1 -0
- package/dist/observability/metrics.d.ts.map +1 -1
- package/dist/observability/middleware.d.ts +1 -0
- package/dist/observability/tracer.d.ts +1 -0
- package/dist/observability/tracer.d.ts.map +1 -1
- package/dist/observability/types.d.ts +1 -0
- package/dist/providers/providerConfig.d.ts +1 -0
- package/dist/providers/providerConfig.d.ts.map +1 -1
- package/dist/routing/advancedRouter.d.ts +2 -1
- package/dist/routing/advancedRouter.d.ts.map +1 -1
- package/dist/routing/crossModelValidation.d.ts +1 -0
- package/dist/routing/providerHealth.d.ts +1 -0
- package/dist/routing/providerHealth.d.ts.map +1 -1
- package/dist/routing/providerRetry.d.ts +1 -0
- package/dist/sdk.d.ts +1 -0
- package/dist/security/guardrails.d.ts +1 -0
- package/dist/security/guardrails.d.ts.map +1 -1
- package/dist/server/dashboard.d.ts +1 -0
- package/dist/server/handlers/chatHandler.d.ts +11 -0
- package/dist/server/handlers/chatHandler.d.ts.map +1 -0
- package/dist/server/handlers/chatHandler.js +159 -0
- package/dist/server/handlers/chatHandler.js.map +1 -0
- package/dist/server/handlers/completionsHandler.d.ts +10 -0
- package/dist/server/handlers/completionsHandler.d.ts.map +1 -0
- package/dist/server/handlers/completionsHandler.js +124 -0
- package/dist/server/handlers/completionsHandler.js.map +1 -0
- package/dist/server/handlers/embeddingsHandler.d.ts +17 -0
- package/dist/server/handlers/embeddingsHandler.d.ts.map +1 -0
- package/dist/server/handlers/embeddingsHandler.js +235 -0
- package/dist/server/handlers/embeddingsHandler.js.map +1 -0
- package/dist/server/handlers/healthHandler.d.ts +10 -0
- package/dist/server/handlers/healthHandler.d.ts.map +1 -0
- package/dist/server/handlers/healthHandler.js +49 -0
- package/dist/server/handlers/healthHandler.js.map +1 -0
- package/dist/server/handlers/metricsHandler.d.ts +11 -0
- package/dist/server/handlers/metricsHandler.d.ts.map +1 -0
- package/dist/server/handlers/metricsHandler.js +24 -0
- package/dist/server/handlers/metricsHandler.js.map +1 -0
- package/dist/server/handlers/modelsHandler.d.ts +10 -0
- package/dist/server/handlers/modelsHandler.d.ts.map +1 -0
- package/dist/server/handlers/modelsHandler.js +19 -0
- package/dist/server/handlers/modelsHandler.js.map +1 -0
- package/dist/server/metrics.d.ts +96 -0
- package/dist/server/metrics.d.ts.map +1 -0
- package/dist/server/metrics.js +267 -0
- package/dist/server/metrics.js.map +1 -0
- package/dist/server/modelMapper.d.ts +1 -0
- package/dist/server/proxyServer.d.ts +53 -17
- package/dist/server/proxyServer.d.ts.map +1 -1
- package/dist/server/proxyServer.js +66 -303
- package/dist/server/proxyServer.js.map +1 -1
- package/dist/server/router.d.ts +49 -0
- package/dist/server/router.d.ts.map +1 -0
- package/dist/server/router.js +120 -0
- package/dist/server/router.js.map +1 -0
- package/dist/server/state.d.ts +30 -0
- package/dist/server/state.d.ts.map +1 -0
- package/dist/server/state.js +18 -0
- package/dist/server/state.js.map +1 -0
- package/dist/skills/__tests__/skill_manager.test.d.ts +3 -0
- package/dist/skills/__tests__/skill_manager.test.d.ts.map +1 -1
- package/dist/skills/__tests__/skill_manager.test.js +3 -6
- package/dist/skills/__tests__/skill_manager.test.js.map +1 -1
- package/dist/tui/dashboard.d.ts +1 -0
- package/dist/tui/index.d.ts +1 -0
- package/dist/utils/costUtils.d.ts +1 -0
- package/dist/utils/reliability.js +4 -18
- package/dist/utils/sorting.d.ts +1 -0
- package/dist/utils/tokenUtils.d.ts +1 -0
- package/docs/assets/chart-accuracy-by-tier.svg +63 -0
- package/docs/assets/chart-confusion-matrix.svg +98 -0
- package/docs/assets/chart-cost-comparison.svg +66 -0
- package/docs/assets/chart-latency-overhead.svg +102 -0
- package/docs/assets/chart-routerena-leaderboard.svg +76 -0
- package/docs/index.html +72 -80
- package/docs/llms-full.txt +156 -184
- package/docs/llms.txt +77 -42
- package/hf-space/app.py +3 -3
- package/llms-full.txt +156 -184
- package/llms.txt +77 -42
- package/mcp-server/package.json +6 -0
- package/mcp-server/tsconfig.json +3 -2
- package/package.json +2 -2
- package/src/server/handlers/chatHandler.ts +173 -0
- package/src/server/handlers/completionsHandler.ts +120 -0
- package/src/server/handlers/embeddingsHandler.ts +271 -0
- package/src/server/handlers/healthHandler.ts +57 -0
- package/src/server/handlers/metricsHandler.ts +30 -0
- package/src/server/handlers/modelsHandler.ts +25 -0
- package/src/server/metrics.ts +303 -0
- package/src/server/proxyServer.ts +71 -394
- package/src/server/router.ts +157 -0
- package/src/server/state.ts +34 -0
- package/src/skills/__tests__/skill_manager.test.ts +3 -3
- package/NEW_OPPORTUNITIES.md +0 -163
- package/NEW_SUBMISSIONS.md +0 -80
- package/PRIORITY_REDDIT_TARGETS.md +0 -53
- package/VISIBILITY_PLAN.md +0 -146
- package/articles/TWITTER_THREAD_IMPLICATIONS.md +0 -182
- package/articles/TWITTER_THREAD_VAULT.md +0 -164
- package/index.html +0 -667
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"healthHandler.js","sourceRoot":"","sources":["../../../src/server/handlers/healthHandler.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAYH,oCAsCC;AA9CD,mEAAuE;AACvE,oCAAoD;AAEpD,SAAS,YAAY,CAAC,GAAwB,EAAE,UAAkB,EAAE,IAAY;IAC9E,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,GAAG,EAAE,CAAC,CAAC;IACtG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAEM,KAAK,UAAU,YAAY,CAChC,IAA0B,EAC1B,GAAwB,EACxB,IAAkB;IAElB,MAAM,SAAS,GAAG,IAAA,sCAAqB,GAAE,CAAC;IAC1C,MAAM,cAAc,GAA2B,EAAE,CAAC;IAClD,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QACjC,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC;QACtD,cAAc,CAAC,EAAE,CAAC,GAAG;YACnB,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE;YACzB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;YACpC,SAAS,EAAE,WAAW;SACvB,CAAC;QACF,IAAI,WAAW;YAAE,YAAY,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,WAAW,GAAG,mBAAW,CAAC,UAAU,EAAE,CAAC;IAE7C,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE;QACrB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE;YACT,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM;YACpC,OAAO,EAAE,YAAY;YACrB,OAAO,EAAE,cAAc;SACxB;QACD,IAAI,EAAE;YACJ,KAAK,EAAE,WAAW,CAAC,UAAU;YAC7B,QAAQ,EAAE,WAAW,CAAC,aAAa;SACpC;QACD,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;QACxB,cAAc,EAAE,mBAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;KACvC,CAAC,CAAC;AACL,CAAC;AAED,kBAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A3M Router - Prometheus Metrics Handler
|
|
3
|
+
*
|
|
4
|
+
* Handles GET /metrics
|
|
5
|
+
* Returns Prometheus-compatible metrics output.
|
|
6
|
+
*/
|
|
7
|
+
import * as http from 'http';
|
|
8
|
+
import { RouteContext } from '../router';
|
|
9
|
+
export declare function handleMetrics(_req: http.IncomingMessage, res: http.ServerResponse, _ctx: RouteContext): void;
|
|
10
|
+
export default handleMetrics;
|
|
11
|
+
//# sourceMappingURL=metricsHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metricsHandler.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/metricsHandler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAYzC,wBAAgB,aAAa,CAC3B,IAAI,EAAE,IAAI,CAAC,eAAe,EAC1B,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,IAAI,EAAE,YAAY,GACjB,IAAI,CAGN;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* A3M Router - Prometheus Metrics Handler
|
|
4
|
+
*
|
|
5
|
+
* Handles GET /metrics
|
|
6
|
+
* Returns Prometheus-compatible metrics output.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.handleMetrics = handleMetrics;
|
|
10
|
+
const metrics_1 = require("../metrics");
|
|
11
|
+
function textResponse(res, statusCode, body) {
|
|
12
|
+
res.writeHead(statusCode, {
|
|
13
|
+
'Content-Type': 'text/plain; version=0.0.4; charset=utf-8',
|
|
14
|
+
'Access-Control-Allow-Origin': '*',
|
|
15
|
+
'Cache-Control': 'no-cache',
|
|
16
|
+
});
|
|
17
|
+
res.end(body);
|
|
18
|
+
}
|
|
19
|
+
function handleMetrics(_req, res, _ctx) {
|
|
20
|
+
const output = (0, metrics_1.generatePrometheusMetrics)();
|
|
21
|
+
textResponse(res, 200, output);
|
|
22
|
+
}
|
|
23
|
+
exports.default = handleMetrics;
|
|
24
|
+
//# sourceMappingURL=metricsHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metricsHandler.js","sourceRoot":"","sources":["../../../src/server/handlers/metricsHandler.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAeH,sCAOC;AAlBD,wCAAuD;AAEvD,SAAS,YAAY,CAAC,GAAwB,EAAE,UAAkB,EAAE,IAAY;IAC9E,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE;QACxB,cAAc,EAAE,0CAA0C;QAC1D,6BAA6B,EAAE,GAAG;QAClC,eAAe,EAAE,UAAU;KAC5B,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAgB,aAAa,CAC3B,IAA0B,EAC1B,GAAwB,EACxB,IAAkB;IAElB,MAAM,MAAM,GAAG,IAAA,mCAAyB,GAAE,CAAC;IAC3C,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,kBAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A3M Router - Models Handler
|
|
3
|
+
*
|
|
4
|
+
* Handles GET /v1/models
|
|
5
|
+
*/
|
|
6
|
+
import * as http from 'http';
|
|
7
|
+
import { RouteContext } from '../router';
|
|
8
|
+
export declare function handleModels(_req: http.IncomingMessage, res: http.ServerResponse, _ctx: RouteContext): void;
|
|
9
|
+
export default handleModels;
|
|
10
|
+
//# sourceMappingURL=modelsHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelsHandler.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/modelsHandler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,YAAY,CAC1B,IAAI,EAAE,IAAI,CAAC,eAAe,EAC1B,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,IAAI,EAAE,YAAY,GACjB,IAAI,CAGN;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* A3M Router - Models Handler
|
|
4
|
+
*
|
|
5
|
+
* Handles GET /v1/models
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.handleModels = handleModels;
|
|
9
|
+
const modelMapper_1 = require("../modelMapper");
|
|
10
|
+
function jsonResponse(res, statusCode, body) {
|
|
11
|
+
res.writeHead(statusCode, { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' });
|
|
12
|
+
res.end(JSON.stringify(body));
|
|
13
|
+
}
|
|
14
|
+
function handleModels(_req, res, _ctx) {
|
|
15
|
+
const models = (0, modelMapper_1.listAvailableModels)();
|
|
16
|
+
jsonResponse(res, 200, { object: 'list', data: models });
|
|
17
|
+
}
|
|
18
|
+
exports.default = handleModels;
|
|
19
|
+
//# sourceMappingURL=modelsHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelsHandler.js","sourceRoot":"","sources":["../../../src/server/handlers/modelsHandler.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAWH,oCAOC;AAdD,gDAAqD;AAErD,SAAS,YAAY,CAAC,GAAwB,EAAE,UAAkB,EAAE,IAAY;IAC9E,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,GAAG,EAAE,CAAC,CAAC;IACtG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,SAAgB,YAAY,CAC1B,IAA0B,EAC1B,GAAwB,EACxB,IAAkB;IAElB,MAAM,MAAM,GAAG,IAAA,iCAAmB,GAAE,CAAC;IACrC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,kBAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A3M Router - Prometheus Metrics
|
|
3
|
+
*
|
|
4
|
+
* Lightweight metrics collector for observability.
|
|
5
|
+
* Exports Prometheus-compatible /metrics endpoint.
|
|
6
|
+
*
|
|
7
|
+
* Metrics:
|
|
8
|
+
* a3m_requests_total{endpoint, provider, status} — Counter
|
|
9
|
+
* a3m_request_duration_ms{endpoint, provider} — Histogram
|
|
10
|
+
* a3m_cost_usd_total{provider} — Counter
|
|
11
|
+
* a3m_tokens_total{provider, type} — Counter
|
|
12
|
+
* a3m_cache_hits_total{cache_type} — Counter
|
|
13
|
+
* a3m_fallback_triggered_total{provider} — Counter
|
|
14
|
+
* a3m_provider_errors_total{provider, error_type} — Counter
|
|
15
|
+
* a3m_routing_decisions_total{model} — Counter
|
|
16
|
+
* a3m_active_requests — Gauge
|
|
17
|
+
*/
|
|
18
|
+
export interface Counter {
|
|
19
|
+
value: number;
|
|
20
|
+
labels: Record<string, string>;
|
|
21
|
+
}
|
|
22
|
+
export interface Histogram {
|
|
23
|
+
values: number[];
|
|
24
|
+
count: number;
|
|
25
|
+
sum: number;
|
|
26
|
+
buckets: {
|
|
27
|
+
bound: number;
|
|
28
|
+
count: number;
|
|
29
|
+
}[];
|
|
30
|
+
}
|
|
31
|
+
export interface Gauge {
|
|
32
|
+
value: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Increment a counter by delta (default 1).
|
|
36
|
+
*/
|
|
37
|
+
export declare function incrementCounter(name: string, labels?: Record<string, string>, delta?: number): void;
|
|
38
|
+
/**
|
|
39
|
+
* Record a histogram value (duration, size, etc.).
|
|
40
|
+
*/
|
|
41
|
+
export declare function recordHistogram(name: string, labels: Record<string, string>, value: number): void;
|
|
42
|
+
/**
|
|
43
|
+
* Set a gauge value.
|
|
44
|
+
*/
|
|
45
|
+
export declare function setGauge(name: string, labels: Record<string, string>, value: number): void;
|
|
46
|
+
/**
|
|
47
|
+
* Increment active requests gauge (call on start, decrement on end).
|
|
48
|
+
*/
|
|
49
|
+
export declare function recordActiveRequest(delta: 1 | -1): void;
|
|
50
|
+
/**
|
|
51
|
+
* Get current active request count.
|
|
52
|
+
*/
|
|
53
|
+
export declare function getActiveRequests(): number;
|
|
54
|
+
/**
|
|
55
|
+
* Generate Prometheus /metrics output.
|
|
56
|
+
*/
|
|
57
|
+
export declare function generatePrometheusMetrics(): string;
|
|
58
|
+
/**
|
|
59
|
+
* Record a completed request with all metrics.
|
|
60
|
+
*/
|
|
61
|
+
export declare function recordRequest(params: {
|
|
62
|
+
endpoint: string;
|
|
63
|
+
provider: string;
|
|
64
|
+
status: 'success' | 'error';
|
|
65
|
+
durationMs: number;
|
|
66
|
+
tokensIn?: number;
|
|
67
|
+
tokensOut?: number;
|
|
68
|
+
cost?: number;
|
|
69
|
+
model?: string;
|
|
70
|
+
}): void;
|
|
71
|
+
/**
|
|
72
|
+
* Record a provider error.
|
|
73
|
+
*/
|
|
74
|
+
export declare function recordProviderError(provider: string, errorType: string): void;
|
|
75
|
+
/**
|
|
76
|
+
* Record a cache hit.
|
|
77
|
+
*/
|
|
78
|
+
export declare function recordCacheHit(cacheType: 'semantic' | 'exact' | 'none'): void;
|
|
79
|
+
/**
|
|
80
|
+
* Record a fallback trigger.
|
|
81
|
+
*/
|
|
82
|
+
export declare function recordFallback(provider: string): void;
|
|
83
|
+
declare const _default: {
|
|
84
|
+
incrementCounter: typeof incrementCounter;
|
|
85
|
+
recordHistogram: typeof recordHistogram;
|
|
86
|
+
setGauge: typeof setGauge;
|
|
87
|
+
recordActiveRequest: typeof recordActiveRequest;
|
|
88
|
+
getActiveRequests: typeof getActiveRequests;
|
|
89
|
+
generatePrometheusMetrics: typeof generatePrometheusMetrics;
|
|
90
|
+
recordRequest: typeof recordRequest;
|
|
91
|
+
recordProviderError: typeof recordProviderError;
|
|
92
|
+
recordCacheHit: typeof recordCacheHit;
|
|
93
|
+
recordFallback: typeof recordFallback;
|
|
94
|
+
};
|
|
95
|
+
export default _default;
|
|
96
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/server/metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AA6FD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EAAE,KAAK,SAAI,GAAG,IAAI,CAInG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CASjG;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAI1F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAEvD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAI1C;AAMD;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CA8ClD;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,IAAI,CAoBP;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAE7E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAE7E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAErD;;;;;;;;;;;;;AAED,wBAWE"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* A3M Router - Prometheus Metrics
|
|
4
|
+
*
|
|
5
|
+
* Lightweight metrics collector for observability.
|
|
6
|
+
* Exports Prometheus-compatible /metrics endpoint.
|
|
7
|
+
*
|
|
8
|
+
* Metrics:
|
|
9
|
+
* a3m_requests_total{endpoint, provider, status} — Counter
|
|
10
|
+
* a3m_request_duration_ms{endpoint, provider} — Histogram
|
|
11
|
+
* a3m_cost_usd_total{provider} — Counter
|
|
12
|
+
* a3m_tokens_total{provider, type} — Counter
|
|
13
|
+
* a3m_cache_hits_total{cache_type} — Counter
|
|
14
|
+
* a3m_fallback_triggered_total{provider} — Counter
|
|
15
|
+
* a3m_provider_errors_total{provider, error_type} — Counter
|
|
16
|
+
* a3m_routing_decisions_total{model} — Counter
|
|
17
|
+
* a3m_active_requests — Gauge
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.incrementCounter = incrementCounter;
|
|
21
|
+
exports.recordHistogram = recordHistogram;
|
|
22
|
+
exports.setGauge = setGauge;
|
|
23
|
+
exports.recordActiveRequest = recordActiveRequest;
|
|
24
|
+
exports.getActiveRequests = getActiveRequests;
|
|
25
|
+
exports.generatePrometheusMetrics = generatePrometheusMetrics;
|
|
26
|
+
exports.recordRequest = recordRequest;
|
|
27
|
+
exports.recordProviderError = recordProviderError;
|
|
28
|
+
exports.recordCacheHit = recordCacheHit;
|
|
29
|
+
exports.recordFallback = recordFallback;
|
|
30
|
+
// ============================================================
|
|
31
|
+
// METRICS STORE
|
|
32
|
+
// ============================================================
|
|
33
|
+
// Counters: { name: { labels: value } }
|
|
34
|
+
const counters = new Map();
|
|
35
|
+
// Histograms: { name: { labels: { values[], count, sum, buckets[] } } }
|
|
36
|
+
const histograms = new Map();
|
|
37
|
+
// Gauges: { name: { labels: value } }
|
|
38
|
+
const gauges = new Map();
|
|
39
|
+
// Metric definitions
|
|
40
|
+
const METRIC_DEFINITIONS = {
|
|
41
|
+
a3m_requests_total: { type: 'counter', help: 'Total requests' },
|
|
42
|
+
a3m_request_duration_ms: {
|
|
43
|
+
type: 'histogram',
|
|
44
|
+
help: 'Request duration in milliseconds',
|
|
45
|
+
buckets: [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000],
|
|
46
|
+
},
|
|
47
|
+
a3m_cost_usd_total: { type: 'counter', help: 'Total cost in USD' },
|
|
48
|
+
a3m_tokens_total: { type: 'counter', help: 'Total tokens' },
|
|
49
|
+
a3m_cache_hits_total: { type: 'counter', help: 'Cache hits' },
|
|
50
|
+
a3m_fallback_triggered_total: { type: 'counter', help: 'Fallback triggered count' },
|
|
51
|
+
a3m_provider_errors_total: { type: 'counter', help: 'Provider errors' },
|
|
52
|
+
a3m_routing_decisions_total: { type: 'counter', help: 'Routing decisions' },
|
|
53
|
+
a3m_active_requests: { type: 'gauge', help: 'Active requests' },
|
|
54
|
+
};
|
|
55
|
+
const LABEL_NAMES = {
|
|
56
|
+
a3m_requests_total: ['endpoint', 'provider', 'status'],
|
|
57
|
+
a3m_request_duration_ms: ['endpoint', 'provider'],
|
|
58
|
+
a3m_cost_usd_total: ['provider'],
|
|
59
|
+
a3m_tokens_total: ['provider', 'type'],
|
|
60
|
+
a3m_cache_hits_total: ['cache_type'],
|
|
61
|
+
a3m_fallback_triggered_total: ['provider'],
|
|
62
|
+
a3m_provider_errors_total: ['provider', 'error_type'],
|
|
63
|
+
a3m_routing_decisions_total: ['model'],
|
|
64
|
+
a3m_active_requests: [],
|
|
65
|
+
};
|
|
66
|
+
// ============================================================
|
|
67
|
+
// HELPERS
|
|
68
|
+
// ============================================================
|
|
69
|
+
function labelsToKey(labels) {
|
|
70
|
+
return Object.keys(labels)
|
|
71
|
+
.sort()
|
|
72
|
+
.map((k) => `${k}="${labels[k]}"`)
|
|
73
|
+
.join(',');
|
|
74
|
+
}
|
|
75
|
+
function getOrInitCounter(name, labels) {
|
|
76
|
+
if (!counters.has(name))
|
|
77
|
+
counters.set(name, new Map());
|
|
78
|
+
const counterMap = counters.get(name);
|
|
79
|
+
const key = labelsToKey(labels);
|
|
80
|
+
if (!counterMap.has(key))
|
|
81
|
+
counterMap.set(key, 0);
|
|
82
|
+
return counterMap;
|
|
83
|
+
}
|
|
84
|
+
function getOrInitHistogram(name, labels) {
|
|
85
|
+
if (!histograms.has(name))
|
|
86
|
+
histograms.set(name, new Map());
|
|
87
|
+
const histMap = histograms.get(name);
|
|
88
|
+
const key = labelsToKey(labels);
|
|
89
|
+
if (!histMap.has(key)) {
|
|
90
|
+
const def = METRIC_DEFINITIONS[name];
|
|
91
|
+
if (def.type !== 'histogram') {
|
|
92
|
+
throw new Error(`Metric ${name} is not a histogram`);
|
|
93
|
+
}
|
|
94
|
+
const histDef = def;
|
|
95
|
+
histMap.set(key, {
|
|
96
|
+
values: [],
|
|
97
|
+
count: 0,
|
|
98
|
+
sum: 0,
|
|
99
|
+
buckets: histDef.buckets.map((b) => ({ bound: b, count: 0 })),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return histMap.get(key);
|
|
103
|
+
}
|
|
104
|
+
function getOrInitGauge(name, labels) {
|
|
105
|
+
if (!gauges.has(name))
|
|
106
|
+
gauges.set(name, new Map());
|
|
107
|
+
const gaugeMap = gauges.get(name);
|
|
108
|
+
const key = labelsToKey(labels);
|
|
109
|
+
if (!gaugeMap.has(key))
|
|
110
|
+
gaugeMap.set(key, 0);
|
|
111
|
+
return gaugeMap;
|
|
112
|
+
}
|
|
113
|
+
// ============================================================
|
|
114
|
+
// PUBLIC API
|
|
115
|
+
// ============================================================
|
|
116
|
+
/**
|
|
117
|
+
* Increment a counter by delta (default 1).
|
|
118
|
+
*/
|
|
119
|
+
function incrementCounter(name, labels = {}, delta = 1) {
|
|
120
|
+
const counterMap = getOrInitCounter(name, labels);
|
|
121
|
+
const key = labelsToKey(labels);
|
|
122
|
+
counterMap.set(key, counterMap.get(key) + delta);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Record a histogram value (duration, size, etc.).
|
|
126
|
+
*/
|
|
127
|
+
function recordHistogram(name, labels, value) {
|
|
128
|
+
const hist = getOrInitHistogram(name, labels);
|
|
129
|
+
hist.values.push(value);
|
|
130
|
+
hist.count++;
|
|
131
|
+
hist.sum += value;
|
|
132
|
+
// Update bucket counts
|
|
133
|
+
for (const bucket of hist.buckets) {
|
|
134
|
+
if (value <= bucket.bound)
|
|
135
|
+
bucket.count++;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Set a gauge value.
|
|
140
|
+
*/
|
|
141
|
+
function setGauge(name, labels, value) {
|
|
142
|
+
const gaugeMap = getOrInitGauge(name, labels);
|
|
143
|
+
const key = labelsToKey(labels);
|
|
144
|
+
gaugeMap.set(key, value);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Increment active requests gauge (call on start, decrement on end).
|
|
148
|
+
*/
|
|
149
|
+
function recordActiveRequest(delta) {
|
|
150
|
+
setGauge('a3m_active_requests', {}, Math.max(0, getActiveRequests() + delta));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get current active request count.
|
|
154
|
+
*/
|
|
155
|
+
function getActiveRequests() {
|
|
156
|
+
const gaugeMap = gauges.get('a3m_active_requests');
|
|
157
|
+
if (!gaugeMap || gaugeMap.size === 0)
|
|
158
|
+
return 0;
|
|
159
|
+
return Array.from(gaugeMap.values())[0] || 0;
|
|
160
|
+
}
|
|
161
|
+
// ============================================================
|
|
162
|
+
// PROMETHEUS EXPORT FORMAT
|
|
163
|
+
// ============================================================
|
|
164
|
+
/**
|
|
165
|
+
* Generate Prometheus /metrics output.
|
|
166
|
+
*/
|
|
167
|
+
function generatePrometheusMetrics() {
|
|
168
|
+
const lines = [];
|
|
169
|
+
// Helper to get metric help/type
|
|
170
|
+
function metricHeader(name) {
|
|
171
|
+
const def = METRIC_DEFINITIONS[name];
|
|
172
|
+
if (!def)
|
|
173
|
+
return '';
|
|
174
|
+
return `# HELP ${name} ${def.help}\n# TYPE ${name} ${def.type}`;
|
|
175
|
+
}
|
|
176
|
+
// Counters
|
|
177
|
+
for (const [name, counterMap] of counters) {
|
|
178
|
+
lines.push(metricHeader(name));
|
|
179
|
+
for (const [labelKey, value] of counterMap) {
|
|
180
|
+
lines.push(`${name}{${labelKey}} ${value}`);
|
|
181
|
+
}
|
|
182
|
+
lines.push('');
|
|
183
|
+
}
|
|
184
|
+
// Histograms
|
|
185
|
+
for (const [name, histMap] of histograms) {
|
|
186
|
+
lines.push(metricHeader(name));
|
|
187
|
+
for (const [labelKey, hist] of histMap) {
|
|
188
|
+
// Per-bucket cumulative counts
|
|
189
|
+
for (const bucket of hist.buckets) {
|
|
190
|
+
lines.push(`${name}_bucket{${labelKey},le="${bucket.bound}"} ${bucket.count}`);
|
|
191
|
+
}
|
|
192
|
+
// +Inf bucket = total count
|
|
193
|
+
lines.push(`${name}_bucket{${labelKey},le="+Inf"} ${hist.count}`);
|
|
194
|
+
// Summary
|
|
195
|
+
lines.push(`${name}_sum{${labelKey}} ${hist.sum}`);
|
|
196
|
+
lines.push(`${name}_count{${labelKey}} ${hist.count}`);
|
|
197
|
+
}
|
|
198
|
+
lines.push('');
|
|
199
|
+
}
|
|
200
|
+
// Gauges
|
|
201
|
+
for (const [name, gaugeMap] of gauges) {
|
|
202
|
+
lines.push(metricHeader(name));
|
|
203
|
+
for (const [labelKey, value] of gaugeMap) {
|
|
204
|
+
lines.push(`${name}{${labelKey}} ${value}`);
|
|
205
|
+
}
|
|
206
|
+
lines.push('');
|
|
207
|
+
}
|
|
208
|
+
return lines.join('\n');
|
|
209
|
+
}
|
|
210
|
+
// ============================================================
|
|
211
|
+
// SPECIALIZED RECORDERS (convenience wrappers)
|
|
212
|
+
// ============================================================
|
|
213
|
+
/**
|
|
214
|
+
* Record a completed request with all metrics.
|
|
215
|
+
*/
|
|
216
|
+
function recordRequest(params) {
|
|
217
|
+
incrementCounter('a3m_requests_total', {
|
|
218
|
+
endpoint: params.endpoint,
|
|
219
|
+
provider: params.provider,
|
|
220
|
+
status: params.status,
|
|
221
|
+
});
|
|
222
|
+
recordHistogram('a3m_request_duration_ms', {
|
|
223
|
+
endpoint: params.endpoint,
|
|
224
|
+
provider: params.provider,
|
|
225
|
+
}, params.durationMs);
|
|
226
|
+
if (params.tokensIn !== undefined && params.tokensOut !== undefined) {
|
|
227
|
+
incrementCounter('a3m_tokens_total', { provider: params.provider, type: 'input' }, params.tokensIn);
|
|
228
|
+
incrementCounter('a3m_tokens_total', { provider: params.provider, type: 'output' }, params.tokensOut);
|
|
229
|
+
}
|
|
230
|
+
if (params.cost !== undefined && params.cost > 0) {
|
|
231
|
+
incrementCounter('a3m_cost_usd_total', { provider: params.provider }, Math.round(params.cost * 1e6) / 1e6);
|
|
232
|
+
}
|
|
233
|
+
if (params.model) {
|
|
234
|
+
incrementCounter('a3m_routing_decisions_total', { model: params.model });
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Record a provider error.
|
|
239
|
+
*/
|
|
240
|
+
function recordProviderError(provider, errorType) {
|
|
241
|
+
incrementCounter('a3m_provider_errors_total', { provider, error_type: errorType });
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Record a cache hit.
|
|
245
|
+
*/
|
|
246
|
+
function recordCacheHit(cacheType) {
|
|
247
|
+
incrementCounter('a3m_cache_hits_total', { cache_type: cacheType });
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Record a fallback trigger.
|
|
251
|
+
*/
|
|
252
|
+
function recordFallback(provider) {
|
|
253
|
+
incrementCounter('a3m_fallback_triggered_total', { provider });
|
|
254
|
+
}
|
|
255
|
+
exports.default = {
|
|
256
|
+
incrementCounter,
|
|
257
|
+
recordHistogram,
|
|
258
|
+
setGauge,
|
|
259
|
+
recordActiveRequest,
|
|
260
|
+
getActiveRequests,
|
|
261
|
+
generatePrometheusMetrics,
|
|
262
|
+
recordRequest,
|
|
263
|
+
recordProviderError,
|
|
264
|
+
recordCacheHit,
|
|
265
|
+
recordFallback,
|
|
266
|
+
};
|
|
267
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/server/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,29 +13,65 @@
|
|
|
13
13
|
* Build: npx tsc
|
|
14
14
|
* Run: npx a3m-router serve [--port 8787]
|
|
15
15
|
*/
|
|
16
|
-
import * as http from
|
|
17
|
-
import {
|
|
18
|
-
interface
|
|
19
|
-
|
|
16
|
+
import * as http from 'http';
|
|
17
|
+
import { ModelMapping } from './modelMapper';
|
|
18
|
+
interface ChatMessage {
|
|
19
|
+
role: "system" | "user" | "assistant" | "tool";
|
|
20
|
+
content: string;
|
|
21
|
+
}
|
|
22
|
+
interface ProviderCallResult {
|
|
23
|
+
content: string;
|
|
20
24
|
model: string;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
status: "success" | "error";
|
|
28
|
-
error?: string;
|
|
29
|
-
timestamp: number;
|
|
25
|
+
usage: {
|
|
26
|
+
prompt_tokens: number;
|
|
27
|
+
completion_tokens: number;
|
|
28
|
+
total_tokens: number;
|
|
29
|
+
};
|
|
30
|
+
finish_reason: string;
|
|
30
31
|
}
|
|
31
|
-
declare const requestLogs: RequestLog[];
|
|
32
|
-
declare const costTracker: CostTracker;
|
|
33
32
|
/**
|
|
34
|
-
*
|
|
33
|
+
* Call the actual LLM provider with the given messages.
|
|
34
|
+
* Handles OpenAI-compatible APIs, Anthropic, Google, and local providers.
|
|
35
|
+
*/
|
|
36
|
+
export declare function callProvider(mapping: ModelMapping, messages: ChatMessage[], options: {
|
|
37
|
+
temperature?: number;
|
|
38
|
+
max_tokens?: number;
|
|
39
|
+
stream?: boolean;
|
|
40
|
+
stop?: string | string[];
|
|
41
|
+
}): Promise<ProviderCallResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Stream a provider response as SSE chunks.
|
|
44
|
+
*/
|
|
45
|
+
export declare function streamProviderResponse(res: http.ServerResponse, mapping: ModelMapping, messages: ChatMessage[], options: {
|
|
46
|
+
temperature?: number;
|
|
47
|
+
max_tokens?: number;
|
|
48
|
+
stop?: string | string[];
|
|
49
|
+
}, requestId: string): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Try the primary mapping, then fall back to alternatives.
|
|
52
|
+
*/
|
|
53
|
+
export declare function callWithFallback(model: string, messages: ChatMessage[], options: {
|
|
54
|
+
temperature?: number;
|
|
55
|
+
max_tokens?: number;
|
|
56
|
+
stream?: boolean;
|
|
57
|
+
stop?: string | string[];
|
|
58
|
+
}, prompt: string): Promise<{
|
|
59
|
+
result: ProviderCallResult;
|
|
60
|
+
mapping: ModelMapping;
|
|
61
|
+
}>;
|
|
62
|
+
/**
|
|
63
|
+
* Create and start the A3M Router proxy server.
|
|
64
|
+
*
|
|
65
|
+
* Uses a route table pattern (router.ts) for pluggable endpoint registration.
|
|
66
|
+
* To add a new endpoint:
|
|
67
|
+
* 1. Create src/server/handlers/yourHandler.ts
|
|
68
|
+
* 2. Import and register: registerRoute('GET', /^\/path$/, handleYourPath);
|
|
35
69
|
*
|
|
36
70
|
* @param port - Port to listen on (default: 8787, env: PORT)
|
|
37
71
|
* @returns The http.Server instance
|
|
38
72
|
*/
|
|
39
73
|
export declare function createProxyServer(port?: number): http.Server;
|
|
40
|
-
export {
|
|
74
|
+
export { costTracker, requestLogs } from './state';
|
|
75
|
+
export type { RequestLog } from './state';
|
|
41
76
|
export default createProxyServer;
|
|
77
|
+
//# sourceMappingURL=proxyServer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxyServer.d.ts","sourceRoot":"","sources":["../../src/server/proxyServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"proxyServer.d.ts","sourceRoot":"","sources":["../../src/server/proxyServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAqC,YAAY,EAAE,MAAM,eAAe,CAAC;AAehF,UAAU,WAAW;IACnB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;CACjB;AAmFD,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAClF,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAAE,GACjG,OAAO,CAAC,kBAAkB,CAAC,CAqB7B;AA2OD;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAAE,EAChF,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA6Pf;AAMD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAAE,EAClG,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,CAwChE;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CA0E5D;AAMD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACnD,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,eAAe,iBAAiB,CAAC"}
|