mozart-router 0.1.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 (238) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +250 -0
  3. package/dist/adapters/cursor.d.ts +10 -0
  4. package/dist/adapters/cursor.d.ts.map +1 -0
  5. package/dist/adapters/cursor.js +39 -0
  6. package/dist/adapters/cursor.js.map +1 -0
  7. package/dist/adapters/generic.d.ts +24 -0
  8. package/dist/adapters/generic.d.ts.map +1 -0
  9. package/dist/adapters/generic.js +192 -0
  10. package/dist/adapters/generic.js.map +1 -0
  11. package/dist/adapters/hermes.d.ts +10 -0
  12. package/dist/adapters/hermes.d.ts.map +1 -0
  13. package/dist/adapters/hermes.js +170 -0
  14. package/dist/adapters/hermes.js.map +1 -0
  15. package/dist/adapters/index.d.ts +13 -0
  16. package/dist/adapters/index.d.ts.map +1 -0
  17. package/dist/adapters/index.js +27 -0
  18. package/dist/adapters/index.js.map +1 -0
  19. package/dist/adapters/litellm.d.ts +15 -0
  20. package/dist/adapters/litellm.d.ts.map +1 -0
  21. package/dist/adapters/litellm.js +238 -0
  22. package/dist/adapters/litellm.js.map +1 -0
  23. package/dist/adapters/lmstudio.d.ts +12 -0
  24. package/dist/adapters/lmstudio.d.ts.map +1 -0
  25. package/dist/adapters/lmstudio.js +128 -0
  26. package/dist/adapters/lmstudio.js.map +1 -0
  27. package/dist/adapters/nim.d.ts +12 -0
  28. package/dist/adapters/nim.d.ts.map +1 -0
  29. package/dist/adapters/nim.js +163 -0
  30. package/dist/adapters/nim.js.map +1 -0
  31. package/dist/adapters/ollama.d.ts +12 -0
  32. package/dist/adapters/ollama.d.ts.map +1 -0
  33. package/dist/adapters/ollama.js +243 -0
  34. package/dist/adapters/ollama.js.map +1 -0
  35. package/dist/adapters/openclaw.d.ts +10 -0
  36. package/dist/adapters/openclaw.d.ts.map +1 -0
  37. package/dist/adapters/openclaw.js +197 -0
  38. package/dist/adapters/openclaw.js.map +1 -0
  39. package/dist/adapters/opencode.d.ts +10 -0
  40. package/dist/adapters/opencode.d.ts.map +1 -0
  41. package/dist/adapters/opencode.js +180 -0
  42. package/dist/adapters/opencode.js.map +1 -0
  43. package/dist/adapters/openrouter.d.ts +13 -0
  44. package/dist/adapters/openrouter.d.ts.map +1 -0
  45. package/dist/adapters/openrouter.js +173 -0
  46. package/dist/adapters/openrouter.js.map +1 -0
  47. package/dist/adapters/vllm.d.ts +12 -0
  48. package/dist/adapters/vllm.d.ts.map +1 -0
  49. package/dist/adapters/vllm.js +129 -0
  50. package/dist/adapters/vllm.js.map +1 -0
  51. package/dist/api/dashboard.d.ts +3 -0
  52. package/dist/api/dashboard.d.ts.map +1 -0
  53. package/dist/api/dashboard.js +98 -0
  54. package/dist/api/dashboard.js.map +1 -0
  55. package/dist/api/mcp.d.ts +32 -0
  56. package/dist/api/mcp.d.ts.map +1 -0
  57. package/dist/api/mcp.js +215 -0
  58. package/dist/api/mcp.js.map +1 -0
  59. package/dist/api/middleware.d.ts +20 -0
  60. package/dist/api/middleware.d.ts.map +1 -0
  61. package/dist/api/middleware.js +239 -0
  62. package/dist/api/middleware.js.map +1 -0
  63. package/dist/api/server.d.ts +26 -0
  64. package/dist/api/server.d.ts.map +1 -0
  65. package/dist/api/server.js +294 -0
  66. package/dist/api/server.js.map +1 -0
  67. package/dist/api/streaming.d.ts +19 -0
  68. package/dist/api/streaming.d.ts.map +1 -0
  69. package/dist/api/streaming.js +274 -0
  70. package/dist/api/streaming.js.map +1 -0
  71. package/dist/cli/config-init.d.ts +2 -0
  72. package/dist/cli/config-init.d.ts.map +1 -0
  73. package/dist/cli/config-init.js +73 -0
  74. package/dist/cli/config-init.js.map +1 -0
  75. package/dist/cli/main.d.ts +3 -0
  76. package/dist/cli/main.d.ts.map +1 -0
  77. package/dist/cli/main.js +618 -0
  78. package/dist/cli/main.js.map +1 -0
  79. package/dist/context/advanced-optimizer.d.ts +12 -0
  80. package/dist/context/advanced-optimizer.d.ts.map +1 -0
  81. package/dist/context/advanced-optimizer.js +64 -0
  82. package/dist/context/advanced-optimizer.js.map +1 -0
  83. package/dist/context/optimizer.d.ts +7 -0
  84. package/dist/context/optimizer.d.ts.map +1 -0
  85. package/dist/context/optimizer.js +101 -0
  86. package/dist/context/optimizer.js.map +1 -0
  87. package/dist/core/cache.d.ts +39 -0
  88. package/dist/core/cache.d.ts.map +1 -0
  89. package/dist/core/cache.js +90 -0
  90. package/dist/core/cache.js.map +1 -0
  91. package/dist/core/health.d.ts +32 -0
  92. package/dist/core/health.d.ts.map +1 -0
  93. package/dist/core/health.js +92 -0
  94. package/dist/core/health.js.map +1 -0
  95. package/dist/core/inventory.d.ts +28 -0
  96. package/dist/core/inventory.d.ts.map +1 -0
  97. package/dist/core/inventory.js +106 -0
  98. package/dist/core/inventory.js.map +1 -0
  99. package/dist/core/metrics.d.ts +48 -0
  100. package/dist/core/metrics.d.ts.map +1 -0
  101. package/dist/core/metrics.js +115 -0
  102. package/dist/core/metrics.js.map +1 -0
  103. package/dist/core/mozart.d.ts +39 -0
  104. package/dist/core/mozart.d.ts.map +1 -0
  105. package/dist/core/mozart.js +156 -0
  106. package/dist/core/mozart.js.map +1 -0
  107. package/dist/core/persistence.d.ts +13 -0
  108. package/dist/core/persistence.d.ts.map +1 -0
  109. package/dist/core/persistence.js +119 -0
  110. package/dist/core/persistence.js.map +1 -0
  111. package/dist/core/plugins.d.ts +18 -0
  112. package/dist/core/plugins.d.ts.map +1 -0
  113. package/dist/core/plugins.js +110 -0
  114. package/dist/core/plugins.js.map +1 -0
  115. package/dist/core/reliability.d.ts +23 -0
  116. package/dist/core/reliability.d.ts.map +1 -0
  117. package/dist/core/reliability.js +70 -0
  118. package/dist/core/reliability.js.map +1 -0
  119. package/dist/core/session.d.ts +17 -0
  120. package/dist/core/session.d.ts.map +1 -0
  121. package/dist/core/session.js +67 -0
  122. package/dist/core/session.js.map +1 -0
  123. package/dist/cost/dynamic-pricing.d.ts +24 -0
  124. package/dist/cost/dynamic-pricing.d.ts.map +1 -0
  125. package/dist/cost/dynamic-pricing.js +71 -0
  126. package/dist/cost/dynamic-pricing.js.map +1 -0
  127. package/dist/cost/estimator.d.ts +8 -0
  128. package/dist/cost/estimator.d.ts.map +1 -0
  129. package/dist/cost/estimator.js +48 -0
  130. package/dist/cost/estimator.js.map +1 -0
  131. package/dist/explain/engine.d.ts +6 -0
  132. package/dist/explain/engine.d.ts.map +1 -0
  133. package/dist/explain/engine.js +59 -0
  134. package/dist/explain/engine.js.map +1 -0
  135. package/dist/index.d.ts +59 -0
  136. package/dist/index.d.ts.map +1 -0
  137. package/dist/index.js +112 -0
  138. package/dist/index.js.map +1 -0
  139. package/dist/logs/logger.d.ts +35 -0
  140. package/dist/logs/logger.d.ts.map +1 -0
  141. package/dist/logs/logger.js +73 -0
  142. package/dist/logs/logger.js.map +1 -0
  143. package/dist/logs/redactor.d.ts +6 -0
  144. package/dist/logs/redactor.d.ts.map +1 -0
  145. package/dist/logs/redactor.js +54 -0
  146. package/dist/logs/redactor.js.map +1 -0
  147. package/dist/policy/engine.d.ts +9 -0
  148. package/dist/policy/engine.d.ts.map +1 -0
  149. package/dist/policy/engine.js +55 -0
  150. package/dist/policy/engine.js.map +1 -0
  151. package/dist/policy/loader.d.ts +3 -0
  152. package/dist/policy/loader.d.ts.map +1 -0
  153. package/dist/policy/loader.js +27 -0
  154. package/dist/policy/loader.js.map +1 -0
  155. package/dist/policy/profiles.d.ts +11 -0
  156. package/dist/policy/profiles.d.ts.map +1 -0
  157. package/dist/policy/profiles.js +263 -0
  158. package/dist/policy/profiles.js.map +1 -0
  159. package/dist/policy/yaml-loader.d.ts +10 -0
  160. package/dist/policy/yaml-loader.d.ts.map +1 -0
  161. package/dist/policy/yaml-loader.js +160 -0
  162. package/dist/policy/yaml-loader.js.map +1 -0
  163. package/dist/privacy/guard.d.ts +8 -0
  164. package/dist/privacy/guard.d.ts.map +1 -0
  165. package/dist/privacy/guard.js +125 -0
  166. package/dist/privacy/guard.js.map +1 -0
  167. package/dist/routing/circuit-breaker.d.ts +23 -0
  168. package/dist/routing/circuit-breaker.d.ts.map +1 -0
  169. package/dist/routing/circuit-breaker.js +74 -0
  170. package/dist/routing/circuit-breaker.js.map +1 -0
  171. package/dist/routing/classifier.d.ts +5 -0
  172. package/dist/routing/classifier.d.ts.map +1 -0
  173. package/dist/routing/classifier.js +102 -0
  174. package/dist/routing/classifier.js.map +1 -0
  175. package/dist/routing/fallback.d.ts +27 -0
  176. package/dist/routing/fallback.d.ts.map +1 -0
  177. package/dist/routing/fallback.js +66 -0
  178. package/dist/routing/fallback.js.map +1 -0
  179. package/dist/routing/multistage.d.ts +49 -0
  180. package/dist/routing/multistage.d.ts.map +1 -0
  181. package/dist/routing/multistage.js +108 -0
  182. package/dist/routing/multistage.js.map +1 -0
  183. package/dist/routing/router.d.ts +22 -0
  184. package/dist/routing/router.d.ts.map +1 -0
  185. package/dist/routing/router.js +123 -0
  186. package/dist/routing/router.js.map +1 -0
  187. package/dist/routing/scorer.d.ts +8 -0
  188. package/dist/routing/scorer.d.ts.map +1 -0
  189. package/dist/routing/scorer.js +131 -0
  190. package/dist/routing/scorer.js.map +1 -0
  191. package/dist/skills/definitions.d.ts +10 -0
  192. package/dist/skills/definitions.d.ts.map +1 -0
  193. package/dist/skills/definitions.js +112 -0
  194. package/dist/skills/definitions.js.map +1 -0
  195. package/dist/skills/index.d.ts +3 -0
  196. package/dist/skills/index.d.ts.map +1 -0
  197. package/dist/skills/index.js +14 -0
  198. package/dist/skills/index.js.map +1 -0
  199. package/dist/types/index.d.ts +298 -0
  200. package/dist/types/index.d.ts.map +1 -0
  201. package/dist/types/index.js +34 -0
  202. package/dist/types/index.js.map +1 -0
  203. package/dist/utils/canrunit.d.ts +26 -0
  204. package/dist/utils/canrunit.d.ts.map +1 -0
  205. package/dist/utils/canrunit.js +69 -0
  206. package/dist/utils/canrunit.js.map +1 -0
  207. package/dist/utils/dealsforge.d.ts +6 -0
  208. package/dist/utils/dealsforge.d.ts.map +1 -0
  209. package/dist/utils/dealsforge.js +105 -0
  210. package/dist/utils/dealsforge.js.map +1 -0
  211. package/docs/ADAPTERS.md +129 -0
  212. package/docs/ARCHITECTURE.md +113 -0
  213. package/docs/DELEGATED_EXECUTION.md +62 -0
  214. package/docs/FEATURE_MATRIX.md +113 -0
  215. package/docs/GATEWAY_FIRST_PRINCIPLES.md +66 -0
  216. package/docs/INTEGRATIONS.md +94 -0
  217. package/docs/LIMITATIONS.md +43 -0
  218. package/docs/RECOMMEND_ONLY_MODE.md +82 -0
  219. package/docs/ROADMAP.md +70 -0
  220. package/docs/SECURITY.md +74 -0
  221. package/docs/SKILLS_AND_TOOLS.md +141 -0
  222. package/examples/community-adapter/TEMPLATE.md +157 -0
  223. package/examples/generic-tools/README.md +29 -0
  224. package/examples/generic-tools/mozart-tools.json +86 -0
  225. package/examples/hermes/README.md +29 -0
  226. package/examples/hermes/mozart-tool.json +48 -0
  227. package/examples/litellm/README.md +21 -0
  228. package/examples/litellm/config.yaml +39 -0
  229. package/examples/ollama/README.md +37 -0
  230. package/examples/ollama/usage.ts +59 -0
  231. package/examples/openclaw/README.md +26 -0
  232. package/examples/openclaw/mozart-skill.yaml +80 -0
  233. package/examples/opencode/README.md +30 -0
  234. package/examples/opencode/SKILL.md +47 -0
  235. package/examples/opencode/mozart-skill.json +64 -0
  236. package/examples/openrouter/README.md +21 -0
  237. package/examples/openrouter/config.json +14 -0
  238. package/package.json +53 -0
@@ -0,0 +1,12 @@
1
+ import { GatewayAdapter, DetectionResult, Provider, Model, ExecutionTarget, ExecutionRequest, ExecutionResult, RouteDecision } from '../types';
2
+ export declare class NvidiaNimAdapter implements GatewayAdapter {
3
+ id: string;
4
+ name: string;
5
+ private baseUrl;
6
+ detect(): Promise<DetectionResult>;
7
+ listProviders(): Promise<Provider[]>;
8
+ listModels(): Promise<Model[]>;
9
+ getExecutionTarget(decision: RouteDecision): Promise<ExecutionTarget>;
10
+ execute(request: ExecutionRequest): Promise<ExecutionResult>;
11
+ }
12
+ //# sourceMappingURL=nim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nim.d.ts","sourceRoot":"","sources":["../../src/adapters/nim.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,eAAe,EACf,QAAQ,EACR,KAAK,EACL,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,aAAa,EACd,MAAM,UAAU,CAAC;AAElB,qBAAa,gBAAiB,YAAW,cAAc;IACrD,EAAE,SAAS;IACX,IAAI,SAAgB;IACpB,OAAO,CAAC,OAAO,CAA2B;IAEpC,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC;IAwClC,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAoBpC,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IA4D9B,kBAAkB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IAWrE,OAAO,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;CA6BnE"}
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NvidiaNimAdapter = void 0;
4
+ class NvidiaNimAdapter {
5
+ id = 'nim';
6
+ name = 'NVIDIA NIM';
7
+ baseUrl = 'http://localhost:8000';
8
+ async detect() {
9
+ const details = [];
10
+ const hasApiKey = !!process.env.NVIDIA_API_KEY;
11
+ if (hasApiKey) {
12
+ details.push('NVIDIA_API_KEY found in environment');
13
+ }
14
+ // Try local NIM endpoint
15
+ let localDetected = false;
16
+ try {
17
+ const response = await fetch(`${this.baseUrl}/v1/models`, {
18
+ signal: AbortSignal.timeout(3000),
19
+ });
20
+ if (response.ok) {
21
+ localDetected = true;
22
+ details.push(`Local NIM endpoint detected at ${this.baseUrl}`);
23
+ }
24
+ }
25
+ catch {
26
+ // Local not available, check cloud
27
+ }
28
+ const active = localDetected || hasApiKey;
29
+ const status = active ? 'active' : 'not_found';
30
+ if (!active) {
31
+ details.push('No local NIM endpoint or NVIDIA_API_KEY found');
32
+ }
33
+ return {
34
+ detected: active,
35
+ gatewayId: this.id,
36
+ gatewayName: this.name,
37
+ status,
38
+ providersCount: active ? 1 : 0,
39
+ modelsCount: active ? 10 : 0,
40
+ details,
41
+ };
42
+ }
43
+ async listProviders() {
44
+ return [
45
+ {
46
+ id: 'nvidia-nim',
47
+ name: 'NVIDIA NIM',
48
+ source: 'detected',
49
+ gateway: this.id,
50
+ baseUrl: this.baseUrl,
51
+ supportsModelsEndpoint: true,
52
+ supportsStreaming: true,
53
+ supportsTools: true,
54
+ supportsJsonMode: true,
55
+ supportsVision: 'unknown',
56
+ privacyLevel: 'local',
57
+ status: 'available',
58
+ lastCheckedAt: new Date().toISOString(),
59
+ },
60
+ ];
61
+ }
62
+ async listModels() {
63
+ return [
64
+ {
65
+ id: 'meta/llama-3.1-8b-instruct',
66
+ providerId: 'nvidia-nim',
67
+ gatewayId: this.id,
68
+ displayName: 'Llama 3.1 8B (NIM)',
69
+ family: 'llama',
70
+ modality: ['text'],
71
+ contextWindow: 131072,
72
+ latencyClass: 'fast',
73
+ qualityClass: 'high',
74
+ strengths: ['local', 'fast', 'coding', 'reasoning'],
75
+ weaknesses: [],
76
+ supportsTools: true,
77
+ supportsJsonMode: true,
78
+ privacyLevel: 'local',
79
+ availability: 'available',
80
+ sourceConfidence: 'high',
81
+ lastCheckedAt: new Date().toISOString(),
82
+ },
83
+ {
84
+ id: 'meta/llama-3.1-70b-instruct',
85
+ providerId: 'nvidia-nim',
86
+ gatewayId: this.id,
87
+ displayName: 'Llama 3.1 70B (NIM)',
88
+ family: 'llama',
89
+ modality: ['text'],
90
+ contextWindow: 131072,
91
+ latencyClass: 'medium',
92
+ qualityClass: 'premium',
93
+ strengths: ['coding', 'reasoning', 'long_context'],
94
+ weaknesses: ['needs_high_vram'],
95
+ supportsTools: true,
96
+ privacyLevel: 'local',
97
+ availability: 'available',
98
+ sourceConfidence: 'high',
99
+ lastCheckedAt: new Date().toISOString(),
100
+ },
101
+ {
102
+ id: 'mistralai/mixtral-8x7b-instruct',
103
+ providerId: 'nvidia-nim',
104
+ gatewayId: this.id,
105
+ displayName: 'Mixtral 8x7B (NIM)',
106
+ family: 'mixtral',
107
+ modality: ['text'],
108
+ contextWindow: 32768,
109
+ latencyClass: 'medium',
110
+ qualityClass: 'high',
111
+ strengths: ['reasoning', 'general'],
112
+ weaknesses: [],
113
+ supportsTools: true,
114
+ privacyLevel: 'local',
115
+ availability: 'available',
116
+ sourceConfidence: 'high',
117
+ lastCheckedAt: new Date().toISOString(),
118
+ },
119
+ ];
120
+ }
121
+ async getExecutionTarget(decision) {
122
+ return {
123
+ adapter: this.id,
124
+ provider: decision.selectedProvider,
125
+ model: decision.selectedModel,
126
+ baseUrl: this.baseUrl,
127
+ apiKeyManagedBy: 'none',
128
+ method: 'direct_http',
129
+ };
130
+ }
131
+ async execute(request) {
132
+ try {
133
+ const apiKey = process.env.NVIDIA_API_KEY;
134
+ const headers = { 'Content-Type': 'application/json' };
135
+ if (apiKey)
136
+ headers['Authorization'] = `Bearer ${apiKey}`;
137
+ const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {
138
+ method: 'POST',
139
+ headers,
140
+ body: JSON.stringify({
141
+ model: request.model,
142
+ messages: [{ role: 'user', content: request.input }],
143
+ stream: false,
144
+ }),
145
+ signal: AbortSignal.timeout(60000),
146
+ });
147
+ if (!response.ok) {
148
+ return { success: false, error: `NIM error: ${response.status}` };
149
+ }
150
+ const data = await response.json();
151
+ return {
152
+ success: true,
153
+ output: data.choices?.[0]?.message?.content ?? '',
154
+ delegated: false,
155
+ };
156
+ }
157
+ catch (err) {
158
+ return { success: false, error: `NIM execution failed: ${err}` };
159
+ }
160
+ }
161
+ }
162
+ exports.NvidiaNimAdapter = NvidiaNimAdapter;
163
+ //# sourceMappingURL=nim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nim.js","sourceRoot":"","sources":["../../src/adapters/nim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { GatewayAdapter, DetectionResult, GatewayConfigSummary, Provider, Model, ExecutionTarget, ExecutionRequest, ExecutionResult, RouteDecision } from '../types';
2
+ export declare class OllamaAdapter implements GatewayAdapter {
3
+ id: string;
4
+ name: string;
5
+ detect(): Promise<DetectionResult>;
6
+ readConfig(): Promise<GatewayConfigSummary>;
7
+ listProviders(): Promise<Provider[]>;
8
+ listModels(): Promise<Model[]>;
9
+ getExecutionTarget(decision: RouteDecision): Promise<ExecutionTarget>;
10
+ execute(request: ExecutionRequest): Promise<ExecutionResult>;
11
+ }
12
+ //# sourceMappingURL=ollama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/adapters/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,eAAe,EACf,oBAAoB,EACpB,QAAQ,EACR,KAAK,EACL,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,aAAa,EACd,MAAM,UAAU,CAAC;AAIlB,qBAAa,aAAc,YAAW,cAAc;IAClD,EAAE,SAAY;IACd,IAAI,SAAY;IAEV,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC;IAgFlC,UAAU,IAAI,OAAO,CAAC,oBAAoB,CAAC;IA0B3C,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAmBpC,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAoC9B,kBAAkB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IAWrE,OAAO,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;CA4BnE"}
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.OllamaAdapter = void 0;
37
+ const child_process_1 = require("child_process");
38
+ const os = __importStar(require("os"));
39
+ class OllamaAdapter {
40
+ id = 'ollama';
41
+ name = 'Ollama';
42
+ async detect() {
43
+ const details = [];
44
+ let providersCount = 0;
45
+ let modelsCount = 0;
46
+ let status = 'not_found';
47
+ try {
48
+ const ollamaPath = process.platform === 'win32'
49
+ ? 'ollama.exe'
50
+ : 'ollama';
51
+ try {
52
+ const version = (0, child_process_1.execSync)(`${ollamaPath} --version`, {
53
+ encoding: 'utf-8',
54
+ stdio: ['pipe', 'pipe', 'pipe'],
55
+ }).trim();
56
+ details.push(`Ollama version: ${version}`);
57
+ status = 'active';
58
+ }
59
+ catch {
60
+ try {
61
+ const homeDir = os.homedir();
62
+ const altPaths = [
63
+ `${homeDir}/.ollama`,
64
+ '/usr/local/bin/ollama',
65
+ '/opt/ollama',
66
+ ];
67
+ let found = false;
68
+ for (const p of altPaths) {
69
+ try {
70
+ (0, child_process_1.execSync)(`test -f ${p}`);
71
+ found = true;
72
+ details.push(`Binary found at: ${p}`);
73
+ break;
74
+ }
75
+ catch {
76
+ // continue
77
+ }
78
+ }
79
+ if (!found) {
80
+ details.push('Ollama not found in PATH or common locations');
81
+ status = 'not_found';
82
+ }
83
+ else {
84
+ status = 'configured_only';
85
+ }
86
+ }
87
+ catch {
88
+ details.push('Ollama not detected');
89
+ status = 'not_found';
90
+ }
91
+ }
92
+ if (status !== 'not_found') {
93
+ try {
94
+ const listOutput = (0, child_process_1.execSync)(`${ollamaPath} list`, {
95
+ encoding: 'utf-8',
96
+ stdio: ['pipe', 'pipe', 'pipe'],
97
+ }).trim();
98
+ const lines = listOutput.split('\n').filter((l) => l.trim() && !l.startsWith('NAME'));
99
+ modelsCount = lines.length;
100
+ providersCount = 1;
101
+ details.push(`${modelsCount} models found`);
102
+ }
103
+ catch {
104
+ details.push('Could not list models (ollama may not be running)');
105
+ status = 'configured_only';
106
+ }
107
+ }
108
+ }
109
+ catch {
110
+ details.push('Ollama detection failed');
111
+ status = 'not_found';
112
+ }
113
+ return {
114
+ detected: status !== 'not_found',
115
+ gatewayId: this.id,
116
+ gatewayName: this.name,
117
+ status,
118
+ providersCount,
119
+ modelsCount,
120
+ details,
121
+ };
122
+ }
123
+ async readConfig() {
124
+ const models = [];
125
+ try {
126
+ const ollamaPath = process.platform === 'win32' ? 'ollama.exe' : 'ollama';
127
+ const listOutput = (0, child_process_1.execSync)(`${ollamaPath} list`, {
128
+ encoding: 'utf-8',
129
+ stdio: ['pipe', 'pipe', 'pipe'],
130
+ }).trim();
131
+ const lines = listOutput.split('\n').slice(1);
132
+ for (const line of lines) {
133
+ const name = line.split(/\s+/)[0];
134
+ if (name)
135
+ models.push(name);
136
+ }
137
+ }
138
+ catch {
139
+ // ollama not running or not installed
140
+ }
141
+ return {
142
+ gatewayId: this.id,
143
+ gatewayName: this.name,
144
+ providers: ['ollama'],
145
+ models,
146
+ capabilities: ['text', 'streaming', 'local'],
147
+ };
148
+ }
149
+ async listProviders() {
150
+ return [
151
+ {
152
+ id: 'ollama',
153
+ name: 'Ollama Local',
154
+ source: 'detected',
155
+ gateway: this.id,
156
+ baseUrl: 'http://localhost:11434',
157
+ supportsModelsEndpoint: true,
158
+ supportsStreaming: true,
159
+ supportsTools: 'unknown',
160
+ supportsJsonMode: 'unknown',
161
+ privacyLevel: 'local',
162
+ status: 'available',
163
+ lastCheckedAt: new Date().toISOString(),
164
+ },
165
+ ];
166
+ }
167
+ async listModels() {
168
+ const models = [];
169
+ try {
170
+ const ollamaPath = process.platform === 'win32' ? 'ollama.exe' : 'ollama';
171
+ const listOutput = (0, child_process_1.execSync)(`${ollamaPath} list`, {
172
+ encoding: 'utf-8',
173
+ stdio: ['pipe', 'pipe', 'pipe'],
174
+ }).trim();
175
+ const lines = listOutput.split('\n').slice(1);
176
+ for (const line of lines) {
177
+ const parts = line.split(/\s+/);
178
+ const name = parts[0];
179
+ if (!name)
180
+ continue;
181
+ models.push({
182
+ id: name,
183
+ providerId: 'ollama',
184
+ gatewayId: this.id,
185
+ displayName: name,
186
+ modality: ['text'],
187
+ contextWindow: 4096,
188
+ latencyClass: 'medium',
189
+ qualityClass: 'medium',
190
+ strengths: ['local', 'free', 'private'],
191
+ weaknesses: ['limited_context', 'no_vision'],
192
+ privacyLevel: 'local',
193
+ availability: 'available',
194
+ sourceConfidence: 'high',
195
+ lastCheckedAt: new Date().toISOString(),
196
+ });
197
+ }
198
+ }
199
+ catch {
200
+ // no models
201
+ }
202
+ return models;
203
+ }
204
+ async getExecutionTarget(decision) {
205
+ return {
206
+ adapter: this.id,
207
+ provider: decision.selectedProvider,
208
+ model: decision.selectedModel,
209
+ baseUrl: 'http://localhost:11434',
210
+ apiKeyManagedBy: 'none',
211
+ method: 'direct_http',
212
+ };
213
+ }
214
+ async execute(request) {
215
+ try {
216
+ const host = request.executionTarget.baseUrl ?? 'http://localhost:11434';
217
+ const response = await fetch(`${host}/api/generate`, {
218
+ method: 'POST',
219
+ headers: { 'Content-Type': 'application/json' },
220
+ body: JSON.stringify({
221
+ model: request.model,
222
+ prompt: request.input,
223
+ stream: false,
224
+ }),
225
+ });
226
+ if (!response.ok) {
227
+ return { success: false, error: `Ollama error: ${response.status}` };
228
+ }
229
+ const data = await response.json();
230
+ return {
231
+ success: true,
232
+ output: data.response,
233
+ tokens: { input: 0, output: 0, total: 0 },
234
+ delegated: false,
235
+ };
236
+ }
237
+ catch (err) {
238
+ return { success: false, error: `Ollama execution failed: ${err}` };
239
+ }
240
+ }
241
+ }
242
+ exports.OllamaAdapter = OllamaAdapter;
243
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/adapters/ollama.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { GatewayAdapter, DetectionResult, GatewayConfigSummary, Provider, Model } from '../types';
2
+ export declare class OpenClawAdapter implements GatewayAdapter {
3
+ id: string;
4
+ name: string;
5
+ detect(): Promise<DetectionResult>;
6
+ readConfig(): Promise<GatewayConfigSummary>;
7
+ listProviders(): Promise<Provider[]>;
8
+ listModels(): Promise<Model[]>;
9
+ }
10
+ //# sourceMappingURL=openclaw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw.d.ts","sourceRoot":"","sources":["../../src/adapters/openclaw.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,eAAe,EACf,oBAAoB,EACpB,QAAQ,EACR,KAAK,EACN,MAAM,UAAU,CAAC;AAoClB,qBAAa,eAAgB,YAAW,cAAc;IACpD,EAAE,SAAc;IAChB,IAAI,SAAc;IAEZ,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC;IAuDlC,UAAU,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAwB3C,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IA6BpC,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;CAsCrC"}
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.OpenClawAdapter = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ function findConfig() {
41
+ const paths = [
42
+ path.join(os.homedir(), '.openclaw', 'openclaw.json'),
43
+ path.join(os.homedir(), '.config', 'openclaw', 'openclaw.json'),
44
+ ];
45
+ for (const p of paths) {
46
+ if (fs.existsSync(p))
47
+ return p;
48
+ }
49
+ return null;
50
+ }
51
+ class OpenClawAdapter {
52
+ id = 'openclaw';
53
+ name = 'OpenClaw';
54
+ async detect() {
55
+ const details = [];
56
+ const configPath = findConfig();
57
+ if (configPath) {
58
+ details.push(`Config found: ${configPath}`);
59
+ try {
60
+ const raw = fs.readFileSync(configPath, 'utf-8');
61
+ const config = JSON.parse(raw);
62
+ const providers = config.models?.providers ?? {};
63
+ const providerCount = Object.keys(providers).length;
64
+ const modelCount = Object.values(providers).reduce((sum, p) => sum + (p.models?.length ?? 0), 0);
65
+ details.push(`${providerCount} provider(s), ${modelCount} model(s)`);
66
+ for (const [name, p] of Object.entries(providers)) {
67
+ details.push(` Provider: ${name} (api=${p.api}, ${p.models?.length ?? 0} models)`);
68
+ for (const m of p.models ?? []) {
69
+ details.push(` - ${m.id} (ctx: ${m.contextWindow ?? '?'}, cost: ${m.cost?.input ?? 0}/${m.cost?.output ?? 0})`);
70
+ }
71
+ }
72
+ const gateway = config.gateway;
73
+ if (gateway) {
74
+ details.push(`Gateway: ${gateway.mode} mode, port ${gateway.port ?? 'default'}`);
75
+ }
76
+ return {
77
+ detected: true,
78
+ gatewayId: this.id,
79
+ gatewayName: this.name,
80
+ configPath,
81
+ configFormat: 'json',
82
+ status: 'active',
83
+ providersCount: providerCount,
84
+ modelsCount: modelCount,
85
+ details,
86
+ };
87
+ }
88
+ catch (err) {
89
+ details.push(`Config parse error: ${err}`);
90
+ }
91
+ }
92
+ else {
93
+ details.push('No OpenClaw config found (~/.openclaw/openclaw.json)');
94
+ }
95
+ return {
96
+ detected: false,
97
+ gatewayId: this.id,
98
+ gatewayName: this.name,
99
+ status: 'not_found',
100
+ providersCount: 0,
101
+ modelsCount: 0,
102
+ details,
103
+ };
104
+ }
105
+ async readConfig() {
106
+ const configPath = findConfig();
107
+ const summary = {
108
+ gatewayId: this.id,
109
+ gatewayName: this.name,
110
+ providers: [],
111
+ models: [],
112
+ capabilities: ['agent', 'tools', 'multi-agent', 'skill_system'],
113
+ };
114
+ if (!configPath)
115
+ return summary;
116
+ try {
117
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
118
+ const providers = config.models?.providers ?? {};
119
+ for (const [name, p] of Object.entries(providers)) {
120
+ summary.providers.push(name);
121
+ for (const m of p.models ?? []) {
122
+ summary.models.push(`${name}/${m.id}`);
123
+ }
124
+ }
125
+ }
126
+ catch { /* ignore */ }
127
+ return summary;
128
+ }
129
+ async listProviders() {
130
+ const configPath = findConfig();
131
+ if (!configPath)
132
+ return [];
133
+ try {
134
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
135
+ const providers = config.models?.providers ?? {};
136
+ return Object.entries(providers).map(([name, p]) => {
137
+ const isLocal = (p.baseUrl ?? '').includes('localhost') || (p.baseUrl ?? '').includes('127.0.0.1');
138
+ return {
139
+ id: `openclaw-${name}`,
140
+ name,
141
+ source: 'detected',
142
+ gateway: this.id,
143
+ baseUrl: p.baseUrl,
144
+ apiKeyRef: p.apiKey ? `managed_by_openclaw` : undefined,
145
+ supportsStreaming: true,
146
+ supportsTools: 'unknown',
147
+ privacyLevel: isLocal ? 'local' : 'cloud',
148
+ status: 'available',
149
+ lastCheckedAt: new Date().toISOString(),
150
+ };
151
+ });
152
+ }
153
+ catch {
154
+ return [];
155
+ }
156
+ }
157
+ async listModels() {
158
+ const configPath = findConfig();
159
+ if (!configPath)
160
+ return [];
161
+ try {
162
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
163
+ const providers = config.models?.providers ?? {};
164
+ const models = [];
165
+ for (const [providerName, p] of Object.entries(providers)) {
166
+ const isLocal = (p.baseUrl ?? '').includes('localhost') || (p.baseUrl ?? '').includes('127.0.0.1');
167
+ for (const m of p.models ?? []) {
168
+ models.push({
169
+ id: m.id,
170
+ providerId: `openclaw-${providerName}`,
171
+ gatewayId: this.id,
172
+ displayName: m.name ?? m.id,
173
+ modality: m.input ?? ['text'],
174
+ contextWindow: m.contextWindow ?? (isLocal ? 8192 : 32768),
175
+ inputPrice: m.cost?.input ?? 0,
176
+ outputPrice: m.cost?.output ?? 0,
177
+ latencyClass: isLocal ? 'fast' : 'medium',
178
+ qualityClass: (m.contextWindow ?? 0) > 32000 ? 'high' : 'medium',
179
+ strengths: isLocal ? ['local', 'private', 'free'] : ['openclaw_managed'],
180
+ weaknesses: [],
181
+ supportsTools: m.reasoning ? true : 'unknown',
182
+ privacyLevel: isLocal ? 'local' : 'cloud',
183
+ availability: 'available',
184
+ sourceConfidence: 'high',
185
+ lastCheckedAt: new Date().toISOString(),
186
+ });
187
+ }
188
+ }
189
+ return models;
190
+ }
191
+ catch {
192
+ return [];
193
+ }
194
+ }
195
+ }
196
+ exports.OpenClawAdapter = OpenClawAdapter;
197
+ //# sourceMappingURL=openclaw.js.map