@relayplane/proxy 1.5.13 → 1.5.14

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=model-suggestions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-suggestions.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/model-suggestions.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const model_suggestions_js_1 = require("../utils/model-suggestions.js");
5
+ (0, vitest_1.describe)('suggestModels', () => {
6
+ const availableModels = [
7
+ 'claude-sonnet-4',
8
+ 'claude-opus-4-5',
9
+ 'claude-3-5-sonnet',
10
+ 'claude-3-5-haiku',
11
+ 'gpt-4o',
12
+ 'gpt-4o-mini',
13
+ 'rp:best',
14
+ 'rp:fast',
15
+ 'rp:balanced',
16
+ ];
17
+ (0, vitest_1.it)('should suggest similar models for typos', () => {
18
+ const suggestions = (0, model_suggestions_js_1.suggestModels)('claud-sonnet', availableModels);
19
+ (0, vitest_1.expect)(suggestions).toContain('claude-sonnet-4');
20
+ });
21
+ (0, vitest_1.it)('should suggest claude-sonnet-4 for "claude-sonet-4" typo', () => {
22
+ const suggestions = (0, model_suggestions_js_1.suggestModels)('claude-sonet-4', availableModels);
23
+ (0, vitest_1.expect)(suggestions[0]).toBe('claude-sonnet-4');
24
+ });
25
+ (0, vitest_1.it)('should suggest gpt-4o for "gpt4o" typo', () => {
26
+ const suggestions = (0, model_suggestions_js_1.suggestModels)('gpt4o', availableModels);
27
+ (0, vitest_1.expect)(suggestions).toContain('gpt-4o');
28
+ });
29
+ (0, vitest_1.it)('should return empty array for completely different strings', () => {
30
+ const suggestions = (0, model_suggestions_js_1.suggestModels)('totally-random-model-xyz', availableModels);
31
+ (0, vitest_1.expect)(suggestions.length).toBeLessThanOrEqual(3);
32
+ });
33
+ (0, vitest_1.it)('should limit results to max parameter', () => {
34
+ const suggestions = (0, model_suggestions_js_1.suggestModels)('claude', availableModels, 2);
35
+ (0, vitest_1.expect)(suggestions.length).toBeLessThanOrEqual(2);
36
+ });
37
+ (0, vitest_1.it)('should be case-insensitive', () => {
38
+ const suggestions = (0, model_suggestions_js_1.suggestModels)('CLAUDE-SONNET-4', availableModels);
39
+ (0, vitest_1.expect)(suggestions).toContain('claude-sonnet-4');
40
+ });
41
+ (0, vitest_1.it)('should suggest rp:best for "rp:bst" typo', () => {
42
+ const suggestions = (0, model_suggestions_js_1.suggestModels)('rp:bst', availableModels);
43
+ (0, vitest_1.expect)(suggestions).toContain('rp:best');
44
+ });
45
+ });
46
+ (0, vitest_1.describe)('buildModelNotFoundError', () => {
47
+ const availableModels = [
48
+ 'claude-sonnet-4',
49
+ 'claude-opus-4-5',
50
+ 'gpt-4o',
51
+ ];
52
+ (0, vitest_1.it)('should build error with suggestions for close match', () => {
53
+ const error = (0, model_suggestions_js_1.buildModelNotFoundError)('claude-sonet-4', availableModels);
54
+ (0, vitest_1.expect)(error.error).toContain('claude-sonet-4');
55
+ (0, vitest_1.expect)(error.error).toContain('does not exist');
56
+ (0, vitest_1.expect)(error.suggestions).toBeDefined();
57
+ (0, vitest_1.expect)(error.suggestions).toContain('claude-sonnet-4');
58
+ (0, vitest_1.expect)(error.hint).toBe("Did you mean 'claude-sonnet-4'?");
59
+ });
60
+ (0, vitest_1.it)('should build error without suggestions for no close match', () => {
61
+ const error = (0, model_suggestions_js_1.buildModelNotFoundError)('totally-random-xyz-12345', availableModels);
62
+ (0, vitest_1.expect)(error.error).toContain('totally-random-xyz-12345');
63
+ (0, vitest_1.expect)(error.suggestions).toBeUndefined();
64
+ (0, vitest_1.expect)(error.hint).toBeUndefined();
65
+ });
66
+ });
67
+ //# sourceMappingURL=model-suggestions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-suggestions.test.js","sourceRoot":"","sources":["../../src/__tests__/model-suggestions.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=routing-aliases.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-aliases.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/routing-aliases.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const standalone_proxy_js_1 = require("../standalone-proxy.js");
5
+ (0, vitest_1.describe)('RELAYPLANE_ALIASES', () => {
6
+ (0, vitest_1.it)('should map relayplane:auto to rp:balanced', () => {
7
+ (0, vitest_1.expect)(standalone_proxy_js_1.RELAYPLANE_ALIASES['relayplane:auto']).toBe('rp:balanced');
8
+ });
9
+ (0, vitest_1.it)('should map rp:auto to rp:balanced', () => {
10
+ (0, vitest_1.expect)(standalone_proxy_js_1.RELAYPLANE_ALIASES['rp:auto']).toBe('rp:balanced');
11
+ });
12
+ });
13
+ (0, vitest_1.describe)('SMART_ALIASES', () => {
14
+ (0, vitest_1.it)('should have rp:best pointing to a valid model', () => {
15
+ (0, vitest_1.expect)(standalone_proxy_js_1.SMART_ALIASES['rp:best']).toBeDefined();
16
+ (0, vitest_1.expect)(standalone_proxy_js_1.SMART_ALIASES['rp:best'].provider).toBe('anthropic');
17
+ (0, vitest_1.expect)(standalone_proxy_js_1.SMART_ALIASES['rp:best'].model).toContain('claude');
18
+ });
19
+ (0, vitest_1.it)('should have rp:fast pointing to a fast model', () => {
20
+ (0, vitest_1.expect)(standalone_proxy_js_1.SMART_ALIASES['rp:fast']).toBeDefined();
21
+ (0, vitest_1.expect)(standalone_proxy_js_1.SMART_ALIASES['rp:fast'].model).toContain('haiku');
22
+ });
23
+ (0, vitest_1.it)('should have rp:cheap pointing to a cheap model', () => {
24
+ (0, vitest_1.expect)(standalone_proxy_js_1.SMART_ALIASES['rp:cheap']).toBeDefined();
25
+ (0, vitest_1.expect)(standalone_proxy_js_1.SMART_ALIASES['rp:cheap'].model).toContain('mini');
26
+ });
27
+ (0, vitest_1.it)('should have rp:balanced pointing to a balanced model', () => {
28
+ (0, vitest_1.expect)(standalone_proxy_js_1.SMART_ALIASES['rp:balanced']).toBeDefined();
29
+ });
30
+ (0, vitest_1.it)('should point to existing models', () => {
31
+ // Verify model names are valid API model IDs
32
+ (0, vitest_1.expect)(standalone_proxy_js_1.SMART_ALIASES['rp:best'].model).toMatch(/claude-.*-\d{8}$/);
33
+ (0, vitest_1.expect)(standalone_proxy_js_1.SMART_ALIASES['rp:fast'].model).toMatch(/claude-.*-\d{8}$/);
34
+ (0, vitest_1.expect)(standalone_proxy_js_1.SMART_ALIASES['rp:balanced'].model).toMatch(/claude-.*-\d{8}$/);
35
+ });
36
+ });
37
+ (0, vitest_1.describe)('resolveModelAlias', () => {
38
+ (0, vitest_1.it)('should resolve relayplane:auto to rp:balanced', () => {
39
+ (0, vitest_1.expect)((0, standalone_proxy_js_1.resolveModelAlias)('relayplane:auto')).toBe('rp:balanced');
40
+ });
41
+ (0, vitest_1.it)('should resolve rp:auto to rp:balanced', () => {
42
+ (0, vitest_1.expect)((0, standalone_proxy_js_1.resolveModelAlias)('rp:auto')).toBe('rp:balanced');
43
+ });
44
+ (0, vitest_1.it)('should return unchanged for non-alias models', () => {
45
+ (0, vitest_1.expect)((0, standalone_proxy_js_1.resolveModelAlias)('claude-sonnet-4')).toBe('claude-sonnet-4');
46
+ (0, vitest_1.expect)((0, standalone_proxy_js_1.resolveModelAlias)('gpt-4o')).toBe('gpt-4o');
47
+ (0, vitest_1.expect)((0, standalone_proxy_js_1.resolveModelAlias)('rp:best')).toBe('rp:best');
48
+ });
49
+ (0, vitest_1.it)('should return unchanged for unknown models', () => {
50
+ (0, vitest_1.expect)((0, standalone_proxy_js_1.resolveModelAlias)('unknown-model')).toBe('unknown-model');
51
+ });
52
+ });
53
+ (0, vitest_1.describe)('getAvailableModelNames', () => {
54
+ (0, vitest_1.it)('should include MODEL_MAPPING keys', () => {
55
+ const available = (0, standalone_proxy_js_1.getAvailableModelNames)();
56
+ (0, vitest_1.expect)(available).toContain('claude-sonnet-4');
57
+ (0, vitest_1.expect)(available).toContain('gpt-4o');
58
+ });
59
+ (0, vitest_1.it)('should include SMART_ALIASES keys', () => {
60
+ const available = (0, standalone_proxy_js_1.getAvailableModelNames)();
61
+ (0, vitest_1.expect)(available).toContain('rp:best');
62
+ (0, vitest_1.expect)(available).toContain('rp:fast');
63
+ (0, vitest_1.expect)(available).toContain('rp:balanced');
64
+ });
65
+ (0, vitest_1.it)('should include relayplane routing models', () => {
66
+ const available = (0, standalone_proxy_js_1.getAvailableModelNames)();
67
+ (0, vitest_1.expect)(available).toContain('relayplane:auto');
68
+ (0, vitest_1.expect)(available).toContain('relayplane:cost');
69
+ (0, vitest_1.expect)(available).toContain('relayplane:fast');
70
+ (0, vitest_1.expect)(available).toContain('relayplane:quality');
71
+ });
72
+ });
73
+ (0, vitest_1.describe)('MODEL_MAPPING', () => {
74
+ (0, vitest_1.it)('should have updated sonnet pointing to claude-sonnet-4', () => {
75
+ (0, vitest_1.expect)(standalone_proxy_js_1.MODEL_MAPPING['sonnet'].model).toContain('claude-sonnet-4');
76
+ });
77
+ (0, vitest_1.it)('should have updated opus pointing to claude-opus-4-5', () => {
78
+ (0, vitest_1.expect)(standalone_proxy_js_1.MODEL_MAPPING['opus'].model).toContain('claude-opus-4-5');
79
+ });
80
+ });
81
+ //# sourceMappingURL=routing-aliases.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-aliases.test.js","sourceRoot":"","sources":["../../src/__tests__/routing-aliases.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,gEAMgC;AAEhC,IAAA,iBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAA,WAAE,EAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,IAAA,eAAM,EAAC,wCAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,IAAA,eAAM,EAAC,wCAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAA,WAAE,EAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,IAAA,eAAM,EAAC,mCAAa,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/C,IAAA,eAAM,EAAC,mCAAa,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5D,IAAA,eAAM,EAAC,mCAAa,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,IAAA,eAAM,EAAC,mCAAa,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/C,IAAA,eAAM,EAAC,mCAAa,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,IAAA,eAAM,EAAC,mCAAa,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,IAAA,eAAM,EAAC,mCAAa,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,IAAA,eAAM,EAAC,mCAAa,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,6CAA6C;QAC7C,IAAA,eAAM,EAAC,mCAAa,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACnE,IAAA,eAAM,EAAC,mCAAa,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACnE,IAAA,eAAM,EAAC,mCAAa,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAA,WAAE,EAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,IAAA,eAAM,EAAC,IAAA,uCAAiB,EAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,IAAA,eAAM,EAAC,IAAA,uCAAiB,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,IAAA,eAAM,EAAC,IAAA,uCAAiB,EAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACrE,IAAA,eAAM,EAAC,IAAA,uCAAiB,EAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAA,eAAM,EAAC,IAAA,uCAAiB,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,IAAA,eAAM,EAAC,IAAA,uCAAiB,EAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,SAAS,GAAG,IAAA,4CAAsB,GAAE,CAAC;QAC3C,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC/C,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,SAAS,GAAG,IAAA,4CAAsB,GAAE,CAAC;QAC3C,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACvC,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACvC,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,SAAS,GAAG,IAAA,4CAAsB,GAAE,CAAC;QAC3C,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC/C,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC/C,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC/C,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAA,WAAE,EAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,IAAA,eAAM,EAAC,mCAAa,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,IAAA,eAAM,EAAC,mCAAa,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/cli.js CHANGED
File without changes
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Osmosis Mesh Integration for RelayPlane Proxy
3
+ *
4
+ * Connects the proxy to the collective knowledge mesh via dynamic imports.
5
+ * Includes Level 1 (local aggregation) and Level 2 (LLM distillation).
6
+ * All mesh features are failure-tolerant and never crash the proxy.
7
+ */
8
+ export interface DistillConfig {
9
+ enabled: boolean;
10
+ apiKey: string;
11
+ model: string;
12
+ batchSize: number;
13
+ }
14
+ export interface MeshConfig {
15
+ enabled: boolean;
16
+ contribute: boolean;
17
+ meshUrl: string;
18
+ syncIntervalMs: number;
19
+ dataDir: string;
20
+ distill?: DistillConfig;
21
+ }
22
+ export declare const DEFAULT_MESH_CONFIG: MeshConfig;
23
+ export declare const DEFAULT_DISTILL_CONFIG: DistillConfig;
24
+ export interface MeshRequestData {
25
+ taskType: string;
26
+ modelUsed: string;
27
+ originalModel: string;
28
+ tokensIn: number;
29
+ tokensOut: number;
30
+ costUsd: number;
31
+ latencyMs: number;
32
+ success: boolean;
33
+ routingChanged: boolean;
34
+ }
35
+ export interface MeshRoutingHint {
36
+ avoidModel?: string;
37
+ preferModel?: string;
38
+ reason?: string;
39
+ }
40
+ export interface MeshStatus {
41
+ available: boolean;
42
+ enabled: boolean;
43
+ atomCount: number;
44
+ contributing: boolean;
45
+ meshUrl: string;
46
+ dataDir: string;
47
+ lastSync?: string;
48
+ syncErrors?: string[];
49
+ distillation: {
50
+ enabled: boolean;
51
+ pendingTraces: number;
52
+ lastRun: string | null;
53
+ totalDistilled: number;
54
+ };
55
+ patterns: number;
56
+ rawAtoms: number;
57
+ }
58
+ export declare function initMesh(config: MeshConfig, log: (msg: string) => void): Promise<void>;
59
+ export declare function recordMeshAtom(data: MeshRequestData): void;
60
+ export declare function getMeshRoutingHint(taskType: string, candidateModel: string): MeshRoutingHint | null;
61
+ export declare function getMeshStatus(config: MeshConfig): MeshStatus;
62
+ export declare function triggerManualSync(config: MeshConfig): Promise<{
63
+ success: boolean;
64
+ message: string;
65
+ }>;
66
+ export declare function getMeshTips(taskType?: string): {
67
+ tips: Array<{
68
+ model: string;
69
+ taskType: string;
70
+ recommendation: string;
71
+ reason: string;
72
+ alternative?: string;
73
+ confidence: number;
74
+ }>;
75
+ warnings: string[];
76
+ lastDistillation: string | null;
77
+ totalAtoms: number;
78
+ distilledAtoms: number;
79
+ };
80
+ export declare function getMeshQuery(taskType?: string, model?: string, limit?: number): {
81
+ taskType: string | null;
82
+ rankings: Array<{
83
+ model: string;
84
+ score: number;
85
+ successRate: number;
86
+ avgCost: number;
87
+ avgLatency: number;
88
+ sampleSize: number;
89
+ }>;
90
+ warnings: string[];
91
+ source: string;
92
+ };
93
+ export declare function getMeshAtoms(limit?: number, offset?: number): any[];
94
+ export declare function shutdownMesh(): void;
95
+ //# sourceMappingURL=mesh-integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-integration.d.ts","sourceRoot":"","sources":["../src/mesh-integration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,634 @@
1
+ "use strict";
2
+ /**
3
+ * Osmosis Mesh Integration for RelayPlane Proxy
4
+ *
5
+ * Connects the proxy to the collective knowledge mesh via dynamic imports.
6
+ * Includes Level 1 (local aggregation) and Level 2 (LLM distillation).
7
+ * All mesh features are failure-tolerant and never crash the proxy.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.DEFAULT_DISTILL_CONFIG = exports.DEFAULT_MESH_CONFIG = void 0;
44
+ exports.initMesh = initMesh;
45
+ exports.recordMeshAtom = recordMeshAtom;
46
+ exports.getMeshRoutingHint = getMeshRoutingHint;
47
+ exports.getMeshStatus = getMeshStatus;
48
+ exports.triggerManualSync = triggerManualSync;
49
+ exports.getMeshTips = getMeshTips;
50
+ exports.getMeshQuery = getMeshQuery;
51
+ exports.getMeshAtoms = getMeshAtoms;
52
+ exports.shutdownMesh = shutdownMesh;
53
+ const path = __importStar(require("node:path"));
54
+ const os = __importStar(require("node:os"));
55
+ const fs = __importStar(require("node:fs"));
56
+ exports.DEFAULT_MESH_CONFIG = {
57
+ enabled: false,
58
+ contribute: false,
59
+ meshUrl: 'https://mesh.relayplane.com',
60
+ syncIntervalMs: 300_000,
61
+ dataDir: path.join(os.homedir(), '.relayplane', 'mesh'),
62
+ };
63
+ exports.DEFAULT_DISTILL_CONFIG = {
64
+ enabled: false,
65
+ apiKey: '',
66
+ model: 'gpt-4o-mini',
67
+ batchSize: 50,
68
+ };
69
+ const aggregationCounters = new Map();
70
+ const AGGREGATION_THRESHOLD = 20;
71
+ function getAggKey(model, taskType) {
72
+ return `${model}::${taskType}`;
73
+ }
74
+ function computeP95(latencies) {
75
+ if (latencies.length === 0)
76
+ return 0;
77
+ const sorted = [...latencies].sort((a, b) => a - b);
78
+ const idx = Math.ceil(sorted.length * 0.95) - 1;
79
+ return sorted[Math.max(0, idx)];
80
+ }
81
+ function tryCreatePatternAtom(key, counter) {
82
+ if (!atomStore || !meshAvailable)
83
+ return;
84
+ try {
85
+ const [model, taskType] = key.split('::');
86
+ const successRate = counter.successes / counter.count;
87
+ const avgLatency = counter.totalLatency / counter.count;
88
+ const avgCost = counter.totalCost / counter.count;
89
+ const p95 = computeP95(counter.latencies);
90
+ const observation = `${model} for ${taskType}: ${Math.round(successRate * 100)}% success, avg ${(avgLatency / 1000).toFixed(1)}s, $${avgCost.toFixed(4)}/call, p95 ${(p95 / 1000).toFixed(1)}s (n=${counter.count})`;
91
+ atomStore.createAtom({
92
+ type: 'pattern',
93
+ observation,
94
+ context: JSON.stringify({
95
+ model,
96
+ task_type: taskType,
97
+ success_rate: successRate,
98
+ avg_latency_ms: Math.round(avgLatency),
99
+ avg_cost_usd: avgCost,
100
+ p95_latency_ms: Math.round(p95),
101
+ sample_size: counter.count,
102
+ source: 'level1-aggregation',
103
+ }),
104
+ confidence: Math.min(0.5 + counter.count * 0.01, 0.95),
105
+ fitness_score: 0.85,
106
+ trust_tier: 'verified',
107
+ source_agent_hash: `proxy-${os.hostname()}`,
108
+ decay_rate: 0.995,
109
+ });
110
+ patternCount++;
111
+ }
112
+ catch {
113
+ // Never crash
114
+ }
115
+ }
116
+ // ── Level 2: LLM Distillation State ─────────────────────────
117
+ let distiller = null;
118
+ let distillConfig = { ...exports.DEFAULT_DISTILL_CONFIG };
119
+ let lastDistillRun = null;
120
+ let totalDistilled = 0;
121
+ let patternCount = 0;
122
+ // ── Lazy-loaded references ───────────────────────────────────
123
+ let atomStore = null;
124
+ let syncHandle = null;
125
+ let meshAvailable = false;
126
+ let lastSyncTimestamp;
127
+ let lastSyncErrors = [];
128
+ // ── User plan check ──────────────────────────────────────────
129
+ function getUserPlan() {
130
+ try {
131
+ const credPath = path.join(os.homedir(), '.relayplane', 'credentials.json');
132
+ const raw = fs.readFileSync(credPath, 'utf8');
133
+ const creds = JSON.parse(raw);
134
+ return creds.plan || 'free';
135
+ }
136
+ catch {
137
+ return 'free';
138
+ }
139
+ }
140
+ function isMeshAllowed() {
141
+ const plan = getUserPlan();
142
+ return plan !== 'free'; // Starter+ gets mesh access
143
+ }
144
+ // ── Initialize ───────────────────────────────────────────────
145
+ async function initMesh(config, log) {
146
+ if (!config.enabled) {
147
+ log('Mesh: disabled in config');
148
+ return;
149
+ }
150
+ if (!isMeshAllowed()) {
151
+ log('Mesh: not available on free tier');
152
+ return;
153
+ }
154
+ try {
155
+ // Dynamic import so proxy works without mesh packages
156
+ const meshCore = await import('@relayplane/mesh-core');
157
+ // Ensure data directory exists
158
+ fs.mkdirSync(config.dataDir, { recursive: true });
159
+ const dbPath = path.join(config.dataDir, 'atoms.db');
160
+ atomStore = new meshCore.AtomStore(dbPath);
161
+ meshAvailable = true;
162
+ log(`Mesh: initialized (store at ${dbPath})`);
163
+ // Initialize distill config
164
+ distillConfig = { ...exports.DEFAULT_DISTILL_CONFIG, ...(config.distill || {}) };
165
+ // Initialize Level 2 LLM distillation if configured
166
+ if (distillConfig.enabled && distillConfig.apiKey) {
167
+ try {
168
+ const meshCoreDistill = await import('@relayplane/mesh-core');
169
+ const { BatchDistiller, llmDistill, toCreateAtoms } = meshCoreDistill;
170
+ distiller = new BatchDistiller({
171
+ batchSize: distillConfig.batchSize,
172
+ distillFn: async (trace) => {
173
+ // We accumulate and batch-distill on flush, not per-trace
174
+ return null;
175
+ },
176
+ });
177
+ // Override flush to use LLM distillation
178
+ const originalFlush = distiller.flush.bind(distiller);
179
+ distiller.flushWithLLM = async () => {
180
+ const traces = distiller.drain();
181
+ if (traces.length === 0)
182
+ return;
183
+ try {
184
+ const distilled = await llmDistill(traces, {
185
+ apiUrl: 'https://api.openai.com/v1/chat/completions',
186
+ apiKey: distillConfig.apiKey,
187
+ model: distillConfig.model,
188
+ minTraces: 5,
189
+ maxTokens: 1024,
190
+ });
191
+ const createAtoms = toCreateAtoms(distilled, `proxy-${os.hostname()}`);
192
+ for (const atomData of createAtoms) {
193
+ try {
194
+ // Set distilled atoms to 'verified' so they get pushed to mesh
195
+ atomData.trust_tier = 'verified';
196
+ atomData.fitness_score = Math.max(atomData.fitness_score || 0, 0.8);
197
+ if (atomData.type === 'negative') {
198
+ atomStore.createNegativeAtom(atomData);
199
+ }
200
+ else {
201
+ atomStore.createToolAtom(atomData);
202
+ }
203
+ totalDistilled++;
204
+ }
205
+ catch { /* skip individual atom errors */ }
206
+ }
207
+ lastDistillRun = new Date().toISOString();
208
+ log(`Mesh: LLM distillation produced ${createAtoms.length} atoms from ${traces.length} traces`);
209
+ }
210
+ catch (err) {
211
+ log(`Mesh: LLM distillation failed — ${err.message}`);
212
+ }
213
+ };
214
+ log(`Mesh: Level 2 LLM distillation enabled (model: ${distillConfig.model}, batch: ${distillConfig.batchSize})`);
215
+ }
216
+ catch (err) {
217
+ log(`Mesh: Level 2 distillation init failed — ${err.message}`);
218
+ distiller = null;
219
+ }
220
+ }
221
+ // Start background sync if enabled
222
+ if (config.syncIntervalMs > 0) {
223
+ startSyncLoop(config, log);
224
+ }
225
+ }
226
+ catch (err) {
227
+ log(`Mesh: failed to initialize — ${err.message}`);
228
+ meshAvailable = false;
229
+ }
230
+ }
231
+ // ── Sync Loop ────────────────────────────────────────────────
232
+ function startSyncLoop(config, log) {
233
+ if (syncHandle)
234
+ return;
235
+ const doSync = async () => {
236
+ if (!atomStore || !meshAvailable)
237
+ return;
238
+ try {
239
+ const meshSync = await import('@relayplane/mesh-sync');
240
+ // Pull always (if mesh enabled)
241
+ const pullResult = await meshSync.pullAtoms(atomStore, config.meshUrl);
242
+ // Push only if contributing — only distilled/pattern atoms get pushed
243
+ // Raw ToolAtoms have trust_tier='local' and won't be shared
244
+ // PatternAtoms and LLM-distilled atoms have trust_tier='verified'
245
+ let pushResult = { pushed: 0, errors: [] };
246
+ if (config.contribute) {
247
+ pushResult = await meshSync.pushAtoms(atomStore, config.meshUrl);
248
+ }
249
+ lastSyncTimestamp = new Date().toISOString();
250
+ lastSyncErrors = [...(pullResult.errors || []), ...(pushResult.errors || [])];
251
+ if (pullResult.pulled > 0 || pushResult.pushed > 0) {
252
+ log(`Mesh sync: pulled ${pullResult.pulled}, pushed ${pushResult.pushed}`);
253
+ }
254
+ }
255
+ catch (err) {
256
+ lastSyncErrors = [err.message];
257
+ log(`Mesh sync error: ${err.message}`);
258
+ }
259
+ };
260
+ // Initial sync after short delay
261
+ setTimeout(() => doSync().catch(() => { }), 5000);
262
+ // Periodic sync
263
+ syncHandle = setInterval(() => doSync().catch(() => { }), config.syncIntervalMs);
264
+ }
265
+ // ── Record Request Atom ──────────────────────────────────────
266
+ function recordMeshAtom(data) {
267
+ if (!atomStore || !meshAvailable)
268
+ return;
269
+ try {
270
+ const agentHash = `proxy-${os.hostname()}`;
271
+ // Store raw ToolAtom with trust_tier='local' (won't be pushed to mesh)
272
+ atomStore.createToolAtom({
273
+ type: 'tool',
274
+ observation: `${data.taskType} request: ${data.originalModel} → ${data.modelUsed} | ${data.success ? 'success' : 'failure'} | ${data.latencyMs}ms | $${data.costUsd.toFixed(4)}`,
275
+ context: JSON.stringify({
276
+ task_type: data.taskType,
277
+ model_used: data.modelUsed,
278
+ original_model: data.originalModel,
279
+ tokens_in: data.tokensIn,
280
+ tokens_out: data.tokensOut,
281
+ cost_usd: data.costUsd,
282
+ latency_ms: data.latencyMs,
283
+ routing_changed: data.routingChanged,
284
+ }),
285
+ confidence: data.success ? 0.8 : 0.6,
286
+ fitness_score: data.success ? 0.7 : 0.3,
287
+ trust_tier: 'local',
288
+ source_agent_hash: agentHash,
289
+ decay_rate: 0.99,
290
+ tool_name: data.modelUsed,
291
+ params_hash: data.taskType,
292
+ outcome: (data.success ? 'success' : 'failure'),
293
+ error_signature: null,
294
+ latency_ms: data.latencyMs,
295
+ reliability_score: data.success ? 0.9 : 0.1,
296
+ });
297
+ // ── Level 1: Local Aggregation ─────────────────────────
298
+ const aggKey = getAggKey(data.modelUsed, data.taskType);
299
+ let counter = aggregationCounters.get(aggKey);
300
+ if (!counter) {
301
+ counter = { count: 0, successes: 0, failures: 0, totalLatency: 0, totalCost: 0, latencies: [] };
302
+ aggregationCounters.set(aggKey, counter);
303
+ }
304
+ counter.count++;
305
+ if (data.success)
306
+ counter.successes++;
307
+ else
308
+ counter.failures++;
309
+ counter.totalLatency += data.latencyMs;
310
+ counter.totalCost += data.costUsd;
311
+ counter.latencies.push(data.latencyMs);
312
+ if (counter.count >= AGGREGATION_THRESHOLD) {
313
+ tryCreatePatternAtom(aggKey, counter);
314
+ // Reset counter
315
+ aggregationCounters.set(aggKey, { count: 0, successes: 0, failures: 0, totalLatency: 0, totalCost: 0, latencies: [] });
316
+ }
317
+ // ── Level 2: Feed to LLM Distiller ─────────────────────
318
+ if (distiller) {
319
+ const trace = {
320
+ toolName: data.modelUsed,
321
+ params: { task_type: data.taskType, original_model: data.originalModel },
322
+ result: { tokens_in: data.tokensIn, tokens_out: data.tokensOut, cost_usd: data.costUsd },
323
+ error: data.success ? null : 'request_failure',
324
+ latencyMs: data.latencyMs,
325
+ outcome: (data.success ? 'success' : 'failure'),
326
+ agentId: agentHash,
327
+ timestamp: new Date().toISOString(),
328
+ };
329
+ const batchReady = distiller.add(trace);
330
+ if (batchReady && distiller.flushWithLLM) {
331
+ // Non-blocking LLM distillation
332
+ distiller.flushWithLLM().catch(() => { });
333
+ }
334
+ }
335
+ }
336
+ catch {
337
+ // Never crash the proxy
338
+ }
339
+ }
340
+ // ── Routing Hints ────────────────────────────────────────────
341
+ function getMeshRoutingHint(taskType, candidateModel) {
342
+ if (!atomStore || !meshAvailable)
343
+ return null;
344
+ try {
345
+ // Query atoms related to this task type + model
346
+ const atoms = atomStore.search(taskType);
347
+ if (!atoms || atoms.length === 0)
348
+ return null;
349
+ // Filter to atoms about the candidate model
350
+ const relevant = atoms.filter((a) => {
351
+ try {
352
+ const ctx = JSON.parse(a.context || '{}');
353
+ return ctx.model_used === candidateModel || ctx.original_model === candidateModel;
354
+ }
355
+ catch {
356
+ return a.observation?.includes(candidateModel);
357
+ }
358
+ });
359
+ if (relevant.length < 3)
360
+ return null; // Need enough data
361
+ // Calculate failure rate
362
+ const failures = relevant.filter((a) => a.outcome === 'failure').length;
363
+ const failureRate = failures / relevant.length;
364
+ if (failureRate > 0.5) {
365
+ return {
366
+ avoidModel: candidateModel,
367
+ reason: `Mesh data: ${candidateModel} has ${Math.round(failureRate * 100)}% failure rate for ${taskType} tasks (${relevant.length} observations)`,
368
+ };
369
+ }
370
+ return null;
371
+ }
372
+ catch {
373
+ return null;
374
+ }
375
+ }
376
+ // ── API Handlers ─────────────────────────────────────────────
377
+ function getMeshStatus(config) {
378
+ const allAtoms = atomStore ? (atomStore.getAll() ?? []) : [];
379
+ const rawCount = allAtoms.filter((a) => a.type === 'tool' && a.trust_tier === 'local').length;
380
+ const patCount = allAtoms.filter((a) => a.type === 'pattern').length;
381
+ return {
382
+ available: meshAvailable,
383
+ enabled: config.enabled,
384
+ atomCount: allAtoms.length,
385
+ contributing: config.contribute,
386
+ meshUrl: config.meshUrl,
387
+ dataDir: config.dataDir,
388
+ lastSync: lastSyncTimestamp,
389
+ syncErrors: lastSyncErrors.length > 0 ? lastSyncErrors : undefined,
390
+ distillation: {
391
+ enabled: distillConfig.enabled && !!distillConfig.apiKey,
392
+ pendingTraces: distiller ? distiller.pending : 0,
393
+ lastRun: lastDistillRun,
394
+ totalDistilled,
395
+ },
396
+ patterns: patCount,
397
+ rawAtoms: rawCount,
398
+ };
399
+ }
400
+ async function triggerManualSync(config) {
401
+ if (!atomStore || !meshAvailable) {
402
+ return { success: false, message: 'Mesh not initialized' };
403
+ }
404
+ try {
405
+ const meshSync = await import('@relayplane/mesh-sync');
406
+ const result = await meshSync.syncWithMesh(atomStore, config.meshUrl);
407
+ lastSyncTimestamp = new Date().toISOString();
408
+ lastSyncErrors = result.errors || [];
409
+ return {
410
+ success: true,
411
+ message: `Synced: pushed ${result.pushed}, pulled ${result.pulled}, deduped ${result.deduped}`,
412
+ };
413
+ }
414
+ catch (err) {
415
+ return { success: false, message: err.message };
416
+ }
417
+ }
418
+ function getMeshTips(taskType) {
419
+ if (!atomStore || !meshAvailable) {
420
+ return { tips: [], warnings: [], lastDistillation: null, totalAtoms: 0, distilledAtoms: 0 };
421
+ }
422
+ try {
423
+ const allAtoms = atomStore.getAll();
424
+ // Prefer PatternAtoms and high-fitness atoms
425
+ const patterns = allAtoms.filter((a) => a.type === 'pattern');
426
+ const highFitness = allAtoms.filter((a) => a.fitness_score >= 0.8 && a.type !== 'pattern');
427
+ // Build model stats from patterns and raw atoms
428
+ const modelStats = new Map();
429
+ // Parse pattern atoms for stats
430
+ for (const atom of patterns) {
431
+ try {
432
+ const ctx = JSON.parse(atom.context || '{}');
433
+ const model = ctx.model;
434
+ const tt = ctx.task_type;
435
+ if (!model || !tt)
436
+ continue;
437
+ if (taskType && tt !== taskType)
438
+ continue;
439
+ if (!modelStats.has(tt))
440
+ modelStats.set(tt, new Map());
441
+ modelStats.get(tt).set(model, {
442
+ successRate: ctx.success_rate,
443
+ avgCost: ctx.avg_cost_usd,
444
+ avgLatency: ctx.avg_latency_ms,
445
+ sampleSize: ctx.sample_size,
446
+ confidence: atom.confidence,
447
+ });
448
+ }
449
+ catch { /* skip */ }
450
+ }
451
+ // Fallback: aggregate from raw ToolAtoms if no patterns yet
452
+ if (modelStats.size === 0) {
453
+ const toolAtoms = allAtoms.filter((a) => a.type === 'tool');
454
+ for (const atom of toolAtoms.slice(0, 500)) {
455
+ try {
456
+ const ctx = JSON.parse(atom.context || '{}');
457
+ const model = ctx.model_used;
458
+ const tt = ctx.task_type;
459
+ if (!model || !tt)
460
+ continue;
461
+ if (taskType && tt !== taskType)
462
+ continue;
463
+ if (!modelStats.has(tt))
464
+ modelStats.set(tt, new Map());
465
+ const existing = modelStats.get(tt).get(model) || {
466
+ successRate: 0, avgCost: 0, avgLatency: 0, sampleSize: 0, confidence: 0,
467
+ };
468
+ const n = existing.sampleSize;
469
+ const isSuccess = atom.outcome === 'success' ? 1 : 0;
470
+ existing.successRate = (existing.successRate * n + isSuccess) / (n + 1);
471
+ existing.avgCost = (existing.avgCost * n + (ctx.cost_usd || 0)) / (n + 1);
472
+ existing.avgLatency = (existing.avgLatency * n + (ctx.latency_ms || 0)) / (n + 1);
473
+ existing.sampleSize = n + 1;
474
+ existing.confidence = Math.min(0.5 + (n + 1) * 0.01, 0.95);
475
+ modelStats.get(tt).set(model, existing);
476
+ }
477
+ catch { /* skip */ }
478
+ }
479
+ }
480
+ const tips = [];
481
+ const warnings = [];
482
+ for (const [tt, models] of modelStats) {
483
+ // Sort models by success rate to find best alternative
484
+ const sorted = [...models.entries()].sort((a, b) => b[1].successRate - a[1].successRate);
485
+ const bestModel = sorted[0]?.[0];
486
+ for (const [model, stats] of models) {
487
+ if (stats.sampleSize < 3)
488
+ continue;
489
+ if (stats.successRate >= 0.8) {
490
+ tips.push({
491
+ model,
492
+ taskType: tt,
493
+ recommendation: 'preferred',
494
+ reason: `${Math.round(stats.successRate * 100)}% success rate, avg $${stats.avgCost.toFixed(4)}/call (n=${stats.sampleSize})`,
495
+ confidence: stats.confidence,
496
+ });
497
+ }
498
+ else if (stats.successRate < 0.5 && stats.sampleSize >= 5) {
499
+ const tip = {
500
+ model,
501
+ taskType: tt,
502
+ recommendation: 'avoid',
503
+ reason: `${Math.round(stats.successRate * 100)}% failure rate for ${tt} tasks (n=${stats.sampleSize})`,
504
+ confidence: stats.confidence,
505
+ };
506
+ if (bestModel && bestModel !== model) {
507
+ tip.alternative = bestModel;
508
+ }
509
+ tips.push(tip);
510
+ warnings.push(`${model} has high failure rate for ${tt} tasks`);
511
+ }
512
+ }
513
+ }
514
+ return {
515
+ tips: tips.sort((a, b) => b.confidence - a.confidence).slice(0, 20),
516
+ warnings,
517
+ lastDistillation: lastDistillRun,
518
+ totalAtoms: allAtoms.length,
519
+ distilledAtoms: totalDistilled + patternCount,
520
+ };
521
+ }
522
+ catch {
523
+ return { tips: [], warnings: [], lastDistillation: null, totalAtoms: 0, distilledAtoms: 0 };
524
+ }
525
+ }
526
+ function getMeshQuery(taskType, model, limit = 10) {
527
+ if (!atomStore || !meshAvailable) {
528
+ return { taskType: taskType || null, rankings: [], warnings: [], source: 'unavailable' };
529
+ }
530
+ try {
531
+ const allAtoms = atomStore.getAll();
532
+ // Build rankings from pattern atoms first, fall back to raw tool atoms
533
+ const modelData = new Map();
534
+ // Check pattern atoms first
535
+ const patterns = allAtoms.filter((a) => a.type === 'pattern');
536
+ let source = 'local';
537
+ for (const atom of patterns) {
538
+ try {
539
+ const ctx = JSON.parse(atom.context || '{}');
540
+ if (taskType && ctx.task_type !== taskType)
541
+ continue;
542
+ if (model && ctx.model !== model)
543
+ continue;
544
+ const m = ctx.model;
545
+ if (!m)
546
+ continue;
547
+ const existing = modelData.get(m) || { successes: 0, total: 0, totalCost: 0, totalLatency: 0 };
548
+ existing.successes += Math.round(ctx.success_rate * ctx.sample_size);
549
+ existing.total += ctx.sample_size;
550
+ existing.totalCost += ctx.avg_cost_usd * ctx.sample_size;
551
+ existing.totalLatency += ctx.avg_latency_ms * ctx.sample_size;
552
+ modelData.set(m, existing);
553
+ source = 'local+mesh';
554
+ }
555
+ catch { /* skip */ }
556
+ }
557
+ // Supplement with raw tool atoms
558
+ const toolAtoms = allAtoms.filter((a) => a.type === 'tool');
559
+ for (const atom of toolAtoms) {
560
+ try {
561
+ const ctx = JSON.parse(atom.context || '{}');
562
+ if (taskType && ctx.task_type !== taskType)
563
+ continue;
564
+ if (model && ctx.model_used !== model)
565
+ continue;
566
+ const m = ctx.model_used;
567
+ if (!m)
568
+ continue;
569
+ const existing = modelData.get(m) || { successes: 0, total: 0, totalCost: 0, totalLatency: 0 };
570
+ existing.total++;
571
+ if (atom.outcome === 'success')
572
+ existing.successes++;
573
+ existing.totalCost += ctx.cost_usd || 0;
574
+ existing.totalLatency += ctx.latency_ms || 0;
575
+ modelData.set(m, existing);
576
+ }
577
+ catch { /* skip */ }
578
+ }
579
+ const warnings = [];
580
+ const rankings = [];
581
+ for (const [m, data] of modelData) {
582
+ if (data.total < 1)
583
+ continue;
584
+ const successRate = data.successes / data.total;
585
+ const avgCost = data.totalCost / data.total;
586
+ const avgLatency = Math.round(data.totalLatency / data.total);
587
+ // Score: weighted combination of success rate (primary) and cost efficiency
588
+ const score = parseFloat((successRate * 0.7 + (1 - Math.min(avgCost, 0.1) / 0.1) * 0.3).toFixed(2));
589
+ rankings.push({ model: m, score, successRate: parseFloat(successRate.toFixed(3)), avgCost: parseFloat(avgCost.toFixed(4)), avgLatency, sampleSize: data.total });
590
+ if (successRate < 0.5 && data.total >= 5) {
591
+ warnings.push(`${m}: ${Math.round((1 - successRate) * 100)}% failure rate (n=${data.total})`);
592
+ }
593
+ }
594
+ rankings.sort((a, b) => b.score - a.score);
595
+ return {
596
+ taskType: taskType || null,
597
+ rankings: rankings.slice(0, limit),
598
+ warnings,
599
+ source,
600
+ };
601
+ }
602
+ catch {
603
+ return { taskType: taskType || null, rankings: [], warnings: [], source: 'error' };
604
+ }
605
+ }
606
+ function getMeshAtoms(limit = 100, offset = 0) {
607
+ if (!atomStore || !meshAvailable)
608
+ return [];
609
+ try {
610
+ const all = atomStore.getAll();
611
+ return all.slice(offset, offset + limit);
612
+ }
613
+ catch {
614
+ return [];
615
+ }
616
+ }
617
+ // ── Shutdown ─────────────────────────────────────────────────
618
+ function shutdownMesh() {
619
+ if (syncHandle) {
620
+ clearInterval(syncHandle);
621
+ syncHandle = null;
622
+ }
623
+ if (atomStore) {
624
+ try {
625
+ atomStore.close();
626
+ }
627
+ catch { /* ignore */ }
628
+ atomStore = null;
629
+ }
630
+ meshAvailable = false;
631
+ distiller = null;
632
+ aggregationCounters.clear();
633
+ }
634
+ //# sourceMappingURL=mesh-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-integration.js","sourceRoot":"","sources":["../src/mesh-integration.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@relayplane/proxy",
3
- "version": "1.5.13",
3
+ "version": "1.5.14",
4
4
  "description": "Open source cost intelligence proxy for AI agents. Cut LLM costs ~80% with smart model routing. Dashboard, policy engine, 11 providers. MIT licensed.",
5
5
  "homepage": "https://relayplane.com",
6
6
  "repository": {