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,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_POLICY = void 0;
4
+ exports.DEFAULT_POLICY = {
5
+ mode: 'local_first',
6
+ profile: 'startup-budget',
7
+ privacy: {
8
+ mode: 'balanced',
9
+ secrets: 'local_only',
10
+ envFiles: 'block_cloud',
11
+ customerData: 'trusted_only',
12
+ },
13
+ budget: {
14
+ mode: 'balanced',
15
+ dailyLimitUsd: 5,
16
+ warnAtPercent: 80,
17
+ },
18
+ routing: {
19
+ explain: true,
20
+ fallback: true,
21
+ cheapFirst: true,
22
+ premiumForCritical: true,
23
+ maxRetries: 2,
24
+ preferLocalForSimpleTasks: true,
25
+ allowCloudForCode: true,
26
+ allowCloudForSensitiveFiles: false,
27
+ },
28
+ logs: {
29
+ enabled: true,
30
+ redactSecrets: true,
31
+ retentionDays: 30,
32
+ },
33
+ };
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;AAmKa,QAAA,cAAc,GAAiB;IAC1C,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE,gBAAgB;IACzB,OAAO,EAAE;QACP,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,aAAa;QACvB,YAAY,EAAE,cAAc;KAC7B;IACD,MAAM,EAAE;QACN,IAAI,EAAE,UAAU;QAChB,aAAa,EAAE,CAAC;QAChB,aAAa,EAAE,EAAE;KAClB;IACD,OAAO,EAAE;QACP,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,IAAI;QAChB,kBAAkB,EAAE,IAAI;QACxB,UAAU,EAAE,CAAC;QACb,yBAAyB,EAAE,IAAI;QAC/B,iBAAiB,EAAE,IAAI;QACvB,2BAA2B,EAAE,KAAK;KACnC;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,IAAI;QACb,aAAa,EAAE,IAAI;QACnB,aAAa,EAAE,EAAE;KAClB;CACF,CAAC"}
@@ -0,0 +1,26 @@
1
+ export interface LocalCapability {
2
+ os: string;
3
+ arch: string;
4
+ platform: string;
5
+ cpu: {
6
+ model: string;
7
+ cores: number;
8
+ };
9
+ ram: {
10
+ totalGB: number;
11
+ freeGB: number;
12
+ };
13
+ gpu?: {
14
+ model: string;
15
+ vramGB?: number;
16
+ };
17
+ ollamaAvailable: boolean;
18
+ localModelCount: number;
19
+ }
20
+ export declare function scanLocalCapability(): LocalCapability;
21
+ export declare function estimateLocalModelCapacity(capability: LocalCapability): Array<{
22
+ modelSize: string;
23
+ vramRequired: number;
24
+ canRun: boolean;
25
+ }>;
26
+ //# sourceMappingURL=canrunit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canrunit.d.ts","sourceRoot":"","sources":["../../src/utils/canrunit.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,GAAG,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,GAAG,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,mBAAmB,IAAI,eAAe,CAsBrD;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,eAAe,GAAG,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAS3I"}
@@ -0,0 +1,69 @@
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.scanLocalCapability = scanLocalCapability;
37
+ exports.estimateLocalModelCapacity = estimateLocalModelCapacity;
38
+ const os = __importStar(require("os"));
39
+ function scanLocalCapability() {
40
+ const totalRAM = Math.round((os.totalmem() / (1024 * 1024 * 1024)) * 10) / 10;
41
+ const freeRAM = Math.round((os.freemem() / (1024 * 1024 * 1024)) * 10) / 10;
42
+ const result = {
43
+ os: os.type(),
44
+ arch: os.arch(),
45
+ platform: os.platform(),
46
+ cpu: {
47
+ model: os.cpus()[0]?.model ?? 'unknown',
48
+ cores: os.cpus().length,
49
+ },
50
+ ram: {
51
+ totalGB: totalRAM,
52
+ freeGB: freeRAM,
53
+ },
54
+ ollamaAvailable: false,
55
+ localModelCount: 0,
56
+ };
57
+ // GPU detection placeholder (requires native modules)
58
+ return result;
59
+ }
60
+ function estimateLocalModelCapacity(capability) {
61
+ const vramGB = capability.gpu?.vramGB ?? 0;
62
+ return [
63
+ { modelSize: '7B (Q4)', vramRequired: 5, canRun: vramGB >= 5 || capability.ram.totalGB >= 8 },
64
+ { modelSize: '13B (Q4)', vramRequired: 8, canRun: vramGB >= 8 || capability.ram.totalGB >= 16 },
65
+ { modelSize: '34B (Q4)', vramRequired: 20, canRun: vramGB >= 20 },
66
+ { modelSize: '70B (Q4)', vramRequired: 40, canRun: vramGB >= 40 },
67
+ ];
68
+ }
69
+ //# sourceMappingURL=canrunit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canrunit.js","sourceRoot":"","sources":["../../src/utils/canrunit.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,kDAsBC;AAED,gEASC;AA9CD,uCAAyB;AAazB,SAAgB,mBAAmB;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IAE5E,MAAM,MAAM,GAAoB;QAC9B,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE;QACb,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE;QACf,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;QACvB,GAAG,EAAE;YACH,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,SAAS;YACvC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM;SACxB;QACD,GAAG,EAAE;YACH,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,OAAO;SAChB;QACD,eAAe,EAAE,KAAK;QACtB,eAAe,EAAE,CAAC;KACnB,CAAC;IAEF,sDAAsD;IACtD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,0BAA0B,CAAC,UAA2B;IACpE,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,CAAC;IAE3C,OAAO;QACL,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,EAAE;QAC7F,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE;QAC/F,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE;QACjE,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE;KAClE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { InventoryRegistry } from '../core/inventory';
2
+ export declare function syncDealsForgeData(registry: InventoryRegistry): {
3
+ modelsAdded: number;
4
+ providersAdded: number;
5
+ };
6
+ //# sourceMappingURL=dealsforge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dealsforge.d.ts","sourceRoot":"","sources":["../../src/utils/dealsforge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAkEtD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,iBAAiB,GAC1B;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CA0CjD"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.syncDealsForgeData = syncDealsForgeData;
4
+ const DEALSFORGE_MODELS = [
5
+ {
6
+ providerId: 'openrouter',
7
+ id: 'openai/gpt-4o',
8
+ displayName: 'GPT-4o',
9
+ family: 'gpt-4',
10
+ contextWindow: 128000,
11
+ inputPrice: 2.5,
12
+ outputPrice: 10.0,
13
+ latencyClass: 'medium',
14
+ qualityClass: 'premium',
15
+ modality: ['text', 'vision', 'multimodal'],
16
+ strengths: ['general', 'coding', 'vision', 'tools'],
17
+ supportsTools: true,
18
+ supportsJsonMode: true,
19
+ privacyLevel: 'cloud',
20
+ },
21
+ {
22
+ providerId: 'openrouter',
23
+ id: 'openai/gpt-4.1-nano',
24
+ displayName: 'GPT-4.1 Nano',
25
+ family: 'gpt-4',
26
+ contextWindow: 1000000,
27
+ inputPrice: 0.1,
28
+ outputPrice: 0.4,
29
+ latencyClass: 'fast',
30
+ qualityClass: 'medium',
31
+ modality: ['text'],
32
+ strengths: ['cheap', 'long_context'],
33
+ privacyLevel: 'cloud',
34
+ },
35
+ {
36
+ providerId: 'openrouter',
37
+ id: 'anthropic/claude-haiku-3.5',
38
+ displayName: 'Claude Haiku 3.5',
39
+ family: 'claude',
40
+ contextWindow: 200000,
41
+ inputPrice: 0.8,
42
+ outputPrice: 4.0,
43
+ latencyClass: 'fast',
44
+ qualityClass: 'high',
45
+ modality: ['text', 'vision'],
46
+ strengths: ['coding', 'fast', 'tools'],
47
+ supportsTools: true,
48
+ privacyLevel: 'cloud',
49
+ },
50
+ {
51
+ providerId: 'openrouter',
52
+ id: 'deepseek/deepseek-r1',
53
+ displayName: 'DeepSeek R1',
54
+ family: 'deepseek',
55
+ contextWindow: 65536,
56
+ inputPrice: 0.55,
57
+ outputPrice: 2.19,
58
+ latencyClass: 'medium',
59
+ qualityClass: 'high',
60
+ modality: ['text'],
61
+ strengths: ['reasoning', 'coding', 'math'],
62
+ supportsTools: true,
63
+ privacyLevel: 'cloud',
64
+ },
65
+ ];
66
+ function syncDealsForgeData(registry) {
67
+ let modelsAdded = 0;
68
+ let providersAdded = 0;
69
+ for (const entry of DEALSFORGE_MODELS) {
70
+ const model = {
71
+ ...entry,
72
+ id: entry.id,
73
+ displayName: entry.displayName,
74
+ modality: entry.modality ?? ['text'],
75
+ latencyClass: entry.latencyClass ?? 'unknown',
76
+ qualityClass: entry.qualityClass ?? 'unknown',
77
+ strengths: entry.strengths ?? [],
78
+ weaknesses: [],
79
+ privacyLevel: entry.privacyLevel ?? 'cloud',
80
+ availability: 'available',
81
+ sourceConfidence: 'high',
82
+ lastCheckedAt: new Date().toISOString(),
83
+ };
84
+ const existing = registry.getModel(entry.providerId, entry.id);
85
+ if (!existing) {
86
+ registry.addModel(model);
87
+ modelsAdded++;
88
+ }
89
+ }
90
+ // Add a DealsForge provider
91
+ const existing = registry.getProvider('dealsforge');
92
+ if (!existing) {
93
+ registry.addProvider({
94
+ id: 'dealsforge',
95
+ name: 'DealsForge Intelligence',
96
+ source: 'dealsforge',
97
+ privacyLevel: 'cloud',
98
+ status: 'available',
99
+ lastCheckedAt: new Date().toISOString(),
100
+ });
101
+ providersAdded++;
102
+ }
103
+ return { modelsAdded, providersAdded };
104
+ }
105
+ //# sourceMappingURL=dealsforge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dealsforge.js","sourceRoot":"","sources":["../../src/utils/dealsforge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,129 @@
1
+ # Adapters
2
+
3
+ ## Overview
4
+
5
+ Mozart adapters connect to existing gateways and tools. Each adapter implements the `GatewayAdapter` interface:
6
+
7
+ ```typescript
8
+ interface GatewayAdapter {
9
+ id: string;
10
+ name: string;
11
+ detect(): Promise<DetectionResult>;
12
+ readConfig?(): Promise<GatewayConfigSummary>;
13
+ listProviders(): Promise<Provider[]>;
14
+ listModels(): Promise<Model[]>;
15
+ listCapabilities?(): Promise<CapabilitySummary>;
16
+ getExecutionTarget?(decision: RouteDecision): Promise<ExecutionTarget>;
17
+ testConnection?(): Promise<ConnectionStatus>;
18
+ execute?(request: ExecutionRequest): Promise<ExecutionResult>;
19
+ }
20
+ ```
21
+
22
+ ## Real adapters
23
+
24
+ ### OllamaAdapter
25
+ - **ID:** `ollama`
26
+ - **Detection:** Checks for `ollama` in PATH, runs `ollama --version` and `ollama list`
27
+ - **Provider:** Local Ollama instance
28
+ - **Execution:** Direct HTTP to `http://localhost:11434`
29
+ - **Privacy:** Local-only, no API key needed
30
+
31
+ ### LiteLLMAdapter
32
+ - **ID:** `litellm`
33
+ - **Detection:** Scans for `litellm_config.yaml` in common locations (cwd, ~/.litellm/)
34
+ - **Provider:** Parsed from config
35
+ - **Execution:** Delegates to LiteLLM proxy (does not execute directly)
36
+ - **Note:** Never reads or stores raw API keys from config
37
+
38
+ ### OpenRouterAdapter
39
+ - **ID:** `openrouter`
40
+ - **Detection:** Checks for `OPENROUTER_API_KEY` in environment
41
+ - **Provider:** OpenRouter gateway
42
+ - **Execution:** Recommends models, delegates execution
43
+ - **Inventory:** Curated list of popular models with pricing
44
+
45
+ ### OpenCodeAdapter
46
+ - **ID:** `opencode`
47
+ - **Status:** Real detection
48
+ - **Detection:** Checks for OpenCode installation via environment variables (OPENCODE_CLIENT, OPENCODE_SERVER_USERNAME) and data directory
49
+ - **Integration path:** `examples/opencode/mozart-skill.json`
50
+
51
+ ### OpenClawAdapter
52
+ - **ID:** `openclaw`
53
+ - **Status:** Real detection — reads openclaw.json
54
+ - **Detection:** Parses `~/.openclaw/openclaw.json`, extracts all providers, models, gateway settings
55
+ - **Integration path:** `examples/openclaw/mozart-skill.yaml`
56
+
57
+ ### LMStudioAdapter
58
+ - **ID:** `lmstudio`
59
+ - **Status:** Real — HTTP detection
60
+ - **Detection:** Queries `http://localhost:1234/v1/models`
61
+ - **Execution:** Direct HTTP to LM Studio's OpenAI-compatible endpoint
62
+
63
+ ### VllmAdapter
64
+ - **ID:** `vllm`
65
+ - **Status:** Real — HTTP detection
66
+ - **Detection:** Queries `http://localhost:8000/v1/models`
67
+ - **Execution:** Direct HTTP to vLLM's OpenAI-compatible endpoint
68
+
69
+ ### NvidiaNimAdapter
70
+ - **ID:** `nim`
71
+ - **Status:** Real — HTTP + env detection
72
+ - **Detection:** Queries local NIM endpoint + checks NVIDIA_API_KEY
73
+ - **Inventory:** Curated list of NIM-available models (Llama, Mixtral)
74
+
75
+ ### GenericOpenAIAdapter
76
+ - **ID:** configurable
77
+ - **Status:** Universal plug-and-play
78
+ - **Detection:** Queries any OpenAI-compatible `/v1/models` endpoint
79
+ - **Auto-discovery:** Scans 11 common endpoints (Ollama, LM Studio, vLLM, LiteLLM, OpenRouter, OpenAI, Groq, Together, DeepSeek, Fireworks, Mistral)
80
+ - **Custom:** Accepts any base URL — no code changes needed for new gateways
81
+
82
+ ## Stub adapters
83
+
84
+ These adapters have full typed interfaces ready but require the target environment for real detection:
85
+
86
+ ### HermesAdapter
87
+ - **ID:** `hermes`
88
+ - **Status:** Stub with manifest
89
+ - **Integration path:** `examples/hermes/mozart-tool.json`
90
+ - **Next steps:** Connect to Hermes tool system
91
+
92
+ ### CursorAdapter
93
+ - **ID:** `cursor`
94
+ - **Status:** Stub with documentation
95
+ - **Next steps:** Expose as local endpoint or use via SDK
96
+
97
+ ## Creating a custom adapter
98
+
99
+ ```typescript
100
+ import { GatewayAdapter, DetectionResult, Provider, Model } from 'mozart-router';
101
+
102
+ export class MyCustomAdapter implements GatewayAdapter {
103
+ id = 'my-custom';
104
+ name = 'My Custom Gateway';
105
+
106
+ async detect(): Promise<DetectionResult> {
107
+ // Check if your gateway is available
108
+ return {
109
+ detected: true,
110
+ gatewayId: this.id,
111
+ gatewayName: this.name,
112
+ status: 'active',
113
+ providersCount: 1,
114
+ modelsCount: 3,
115
+ details: ['Custom gateway detected'],
116
+ };
117
+ }
118
+
119
+ async listProviders(): Promise<Provider[]> {
120
+ // Return your providers
121
+ return [];
122
+ }
123
+
124
+ async listModels(): Promise<Model[]> {
125
+ // Return your models
126
+ return [];
127
+ }
128
+ }
129
+ ```
@@ -0,0 +1,113 @@
1
+ # Architecture
2
+
3
+ ## High-level design
4
+
5
+ Mozart is designed as a **gateway-first orchestration layer**. It does not replace gateways — it sits between agents and gateways adding decision intelligence.
6
+
7
+ ```
8
+ ┌──────────────────────────────────────────────────┐
9
+ │ Agent / IDE / User │
10
+ ├──────────────────────────────────────────────────┤
11
+ │ Mozart Interface Layer │
12
+ │ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
13
+ │ │ SDK │ │ CLI │ │ Skill/Tool API │ │
14
+ │ └──────────┘ └──────────┘ └──────────────────┘ │
15
+ ├──────────────────────────────────────────────────┤
16
+ │ Gateway Introspection Layer │
17
+ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌──────────┐ │
18
+ │ │Ollama │ │LiteLLM │ │OpenRt │ │Agent De- │ │
19
+ │ │Adapter │ │Adapter │ │Adapter│ │tectors │ │
20
+ │ └────────┘ └────────┘ └────────┘ └──────────┘ │
21
+ ├──────────────────────────────────────────────────┤
22
+ │ Mozart Core Engine │
23
+ │ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
24
+ │ │Inventory │ │ Policy │ │ Privacy Guard │ │
25
+ │ │Registry │ │ Engine │ │ │ │
26
+ │ └──────────┘ └──────────┘ └──────────────────┘ │
27
+ │ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
28
+ │ │ Task │ │ Routing │ │ Context │ │
29
+ │ │Classifier│ │ Engine │ │ Optimizer │ │
30
+ │ └──────────┘ └──────────┘ └──────────────────┘ │
31
+ │ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
32
+ │ │ Cost │ │Explain- │ │ Logger + │ │
33
+ │ │Estimator │ │ability │ │ Redactor │ │
34
+ │ └──────────┘ └──────────┘ └──────────────────┘ │
35
+ ├──────────────────────────────────────────────────┤
36
+ │ Execution Delegation Layer │
37
+ │ ┌──────────────────────────────────────────────┐ │
38
+ │ │ Delegates to: LiteLLM / OpenRouter / │ │
39
+ │ │ Ollama / Direct Provider / Agent Tool │ │
40
+ │ └──────────────────────────────────────────────┘ │
41
+ └──────────────────────────────────────────────────┘
42
+ ```
43
+
44
+ ## Design principles
45
+
46
+ ### 1. Gateway-first
47
+ Mozart never rebuilds what a gateway already does. It detects, understands, and orchestrates existing infrastructure.
48
+
49
+ ### 2. Agent-first
50
+ Mozart integrates as a skill, tool, or adapter within existing agent frameworks — never as a separate application.
51
+
52
+ ### 3. Integration-first
53
+ Every module is designed to be importable as a TypeScript SDK, not locked behind a UI or service boundary.
54
+
55
+ ### 4. Local-first
56
+ All processing (classification, privacy scanning, routing, logging) happens locally. No cloud dependency for core functionality.
57
+
58
+ ### 5. Privacy by default
59
+ Secrets are never logged. Privacy guard scans all content before routing. Local-only mode available.
60
+
61
+ ### 6. Modular
62
+ Every component is independently usable. You can use just the Privacy Guard, just the Router, or the full orchestrator.
63
+
64
+ ## Module dependencies
65
+
66
+ ```
67
+ types/ (zero dependencies)
68
+ |
69
+ ├─ core/
70
+ │ ├─ inventory.ts (types)
71
+ │ ├─ session.ts (types)
72
+ │ └─ mozart.ts (all modules)
73
+ |
74
+ ├─ adapters/ (types, core/inventory)
75
+ │ ├─ ollama.ts
76
+ │ ├─ litellm.ts
77
+ │ ├─ openrouter.ts
78
+ │ ├─ opencode.ts
79
+ │ ├─ openclaw.ts
80
+ │ ├─ hermes.ts
81
+ │ └─ cursor.ts
82
+ |
83
+ ├─ routing/
84
+ │ ├─ classifier.ts (types)
85
+ │ ├─ scorer.ts (types)
86
+ │ └─ router.ts (types, core/inventory, policy, cost)
87
+ |
88
+ ├─ policy/engine.ts (types)
89
+ ├─ privacy/guard.ts (types, logs)
90
+ ├─ context/optimizer.ts (types)
91
+ ├─ cost/estimator.ts (types)
92
+ ├─ explain/engine.ts (types)
93
+ |
94
+ ├─ logs/
95
+ │ ├─ logger.ts (types)
96
+ │ └─ redactor.ts
97
+ |
98
+ ├─ skills/definitions.ts (types)
99
+ └─ cli/main.ts (all modules)
100
+ ```
101
+
102
+ ## Data flow
103
+
104
+ ```
105
+ User Input → Task Classifier → Task Profile
106
+ → Privacy Guard → Privacy Decision
107
+ → Policy Engine → Policy Evaluation
108
+ → Context Optimizer → Context Strategy
109
+ → Routing Engine → Route Decision
110
+ → Execution Delegation → Gateway Call
111
+ → Explainability → Explanation
112
+ → Logger → Local Logs
113
+ ```
@@ -0,0 +1,62 @@
1
+ # Delegated Execution — Mozart
2
+
3
+ Mozart delegates execution to existing gateways. It does not become a gateway itself.
4
+
5
+ ## Architecture
6
+
7
+ ```
8
+ Agent → Mozart → Gateway → Provider
9
+ (decide) (execute)
10
+ ```
11
+
12
+ Mozart sits in the decision position. The gateway sits in the execution position. This separation is intentional and permanent.
13
+
14
+ ## Execution targets
15
+
16
+ When Mozart selects a route, it produces an `ExecutionTarget`:
17
+
18
+ ```typescript
19
+ interface ExecutionTarget {
20
+ adapter: string; // Which adapter handles this
21
+ gateway?: string; // Which gateway
22
+ provider: string; // Which provider
23
+ model: string; // Which model
24
+ baseUrl?: string; // Where to send the request
25
+ requiresApiKey?: boolean;
26
+ apiKeyManagedBy: 'gateway' | 'env' | 'manual' | 'none';
27
+ method: 'gateway_call' | 'tool_call' | 'direct_http' | 'local_exec';
28
+ }
29
+ ```
30
+
31
+ Key field: `apiKeyManagedBy` — Mozart never stores the key, only records who manages it.
32
+
33
+ ## Execution flow
34
+
35
+ 1. Mozart routes the task → produces `RouteDecision`
36
+ 2. Mozart delegates to the adapter → adapter provides `ExecutionTarget`
37
+ 3. Mozart calls `adapter.execute()` → adapter handles the HTTP call
38
+ 4. Mozart returns the result → gateway never exposed
39
+
40
+ ## Adapter responsibility
41
+
42
+ Adapters are responsible for:
43
+ - Detecting the gateway
44
+ - Reading its config (without raw keys)
45
+ - Providing execution targets
46
+ - Executing calls when possible
47
+
48
+ Mozart is responsible for:
49
+ - Classifying tasks
50
+ - Scoring models
51
+ - Selecting the best route
52
+ - Delegating to the right adapter
53
+
54
+ ## When execution is not available
55
+
56
+ If an adapter doesn't support execution (or the gateway isn't accessible):
57
+
58
+ - Mozart returns a recommendation (recommend-only)
59
+ - The user/agent sends the call themselves using their existing gateway
60
+ - Mozart's recommendation includes the exact model, provider, and rationale
61
+
62
+ This is the preferred mode. Execution is optional.