@rithamnatani/agentmux 1.5.39

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 (235) hide show
  1. package/README.md +440 -0
  2. package/dist/clientFilter.d.ts +5 -0
  3. package/dist/clientFilter.d.ts.map +1 -0
  4. package/dist/clientFilter.js +31 -0
  5. package/dist/clientFilter.js.map +1 -0
  6. package/dist/config.d.ts +28 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +112 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/constants.d.ts +115 -0
  11. package/dist/constants.d.ts.map +1 -0
  12. package/dist/constants.js +118 -0
  13. package/dist/constants.js.map +1 -0
  14. package/dist/execution.d.ts +23 -0
  15. package/dist/execution.d.ts.map +1 -0
  16. package/dist/execution.js +2 -0
  17. package/dist/execution.js.map +1 -0
  18. package/dist/httpServer.d.ts +12 -0
  19. package/dist/httpServer.d.ts.map +1 -0
  20. package/dist/httpServer.js +323 -0
  21. package/dist/httpServer.js.map +1 -0
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +98 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/logger.d.ts +19 -0
  27. package/dist/logger.d.ts.map +1 -0
  28. package/dist/logger.js +172 -0
  29. package/dist/logger.js.map +1 -0
  30. package/dist/modelCatalog.d.ts +15 -0
  31. package/dist/modelCatalog.d.ts.map +1 -0
  32. package/dist/modelCatalog.generated.json +80 -0
  33. package/dist/modelCatalog.js +81 -0
  34. package/dist/modelCatalog.js.map +1 -0
  35. package/dist/router/config.d.ts +13 -0
  36. package/dist/router/config.d.ts.map +1 -0
  37. package/dist/router/config.js +198 -0
  38. package/dist/router/config.js.map +1 -0
  39. package/dist/router/defaultConfig.d.ts +13 -0
  40. package/dist/router/defaultConfig.d.ts.map +1 -0
  41. package/dist/router/defaultConfig.js +82 -0
  42. package/dist/router/defaultConfig.js.map +1 -0
  43. package/dist/router/executor.d.ts +35 -0
  44. package/dist/router/executor.d.ts.map +1 -0
  45. package/dist/router/executor.js +189 -0
  46. package/dist/router/executor.js.map +1 -0
  47. package/dist/router/modelMetadata.d.ts +5 -0
  48. package/dist/router/modelMetadata.d.ts.map +1 -0
  49. package/dist/router/modelMetadata.js +81 -0
  50. package/dist/router/modelMetadata.js.map +1 -0
  51. package/dist/router/quota.d.ts +4 -0
  52. package/dist/router/quota.d.ts.map +1 -0
  53. package/dist/router/quota.js +5 -0
  54. package/dist/router/quota.js.map +1 -0
  55. package/dist/router/router.d.ts +3 -0
  56. package/dist/router/router.d.ts.map +1 -0
  57. package/dist/router/router.js +141 -0
  58. package/dist/router/router.js.map +1 -0
  59. package/dist/router/types.d.ts +86 -0
  60. package/dist/router/types.d.ts.map +1 -0
  61. package/dist/router/types.js +2 -0
  62. package/dist/router/types.js.map +1 -0
  63. package/dist/routerConfig.d.ts +14 -0
  64. package/dist/routerConfig.d.ts.map +1 -0
  65. package/dist/routerConfig.js +194 -0
  66. package/dist/routerConfig.js.map +1 -0
  67. package/dist/serverApp.d.ts +43 -0
  68. package/dist/serverApp.d.ts.map +1 -0
  69. package/dist/serverApp.js +618 -0
  70. package/dist/serverApp.js.map +1 -0
  71. package/dist/service/bootstrap.d.ts +3 -0
  72. package/dist/service/bootstrap.d.ts.map +1 -0
  73. package/dist/service/bootstrap.js +32 -0
  74. package/dist/service/bootstrap.js.map +1 -0
  75. package/dist/service/manager.d.ts +6 -0
  76. package/dist/service/manager.d.ts.map +1 -0
  77. package/dist/service/manager.js +318 -0
  78. package/dist/service/manager.js.map +1 -0
  79. package/dist/service/paths.d.ts +10 -0
  80. package/dist/service/paths.d.ts.map +1 -0
  81. package/dist/service/paths.js +57 -0
  82. package/dist/service/paths.js.map +1 -0
  83. package/dist/service/renderers.d.ts +7 -0
  84. package/dist/service/renderers.d.ts.map +1 -0
  85. package/dist/service/renderers.js +110 -0
  86. package/dist/service/renderers.js.map +1 -0
  87. package/dist/service/runtime.d.ts +14 -0
  88. package/dist/service/runtime.d.ts.map +1 -0
  89. package/dist/service/runtime.js +129 -0
  90. package/dist/service/runtime.js.map +1 -0
  91. package/dist/service/types.d.ts +33 -0
  92. package/dist/service/types.d.ts.map +1 -0
  93. package/dist/service/types.js +2 -0
  94. package/dist/service/types.js.map +1 -0
  95. package/dist/taskClientPolicy.d.ts +16 -0
  96. package/dist/taskClientPolicy.d.ts.map +1 -0
  97. package/dist/taskClientPolicy.js +44 -0
  98. package/dist/taskClientPolicy.js.map +1 -0
  99. package/dist/taskStore.d.ts +12 -0
  100. package/dist/taskStore.d.ts.map +1 -0
  101. package/dist/taskStore.js +30 -0
  102. package/dist/taskStore.js.map +1 -0
  103. package/dist/tierConfig.d.ts +16 -0
  104. package/dist/tierConfig.d.ts.map +1 -0
  105. package/dist/tierConfig.js +70 -0
  106. package/dist/tierConfig.js.map +1 -0
  107. package/dist/tools/ask-claude.tool.d.ts +3 -0
  108. package/dist/tools/ask-claude.tool.d.ts.map +1 -0
  109. package/dist/tools/ask-claude.tool.js +30 -0
  110. package/dist/tools/ask-claude.tool.js.map +1 -0
  111. package/dist/tools/ask-codex.tool.d.ts +3 -0
  112. package/dist/tools/ask-codex.tool.d.ts.map +1 -0
  113. package/dist/tools/ask-codex.tool.js +29 -0
  114. package/dist/tools/ask-codex.tool.js.map +1 -0
  115. package/dist/tools/ask-cursor.tool.d.ts +3 -0
  116. package/dist/tools/ask-cursor.tool.d.ts.map +1 -0
  117. package/dist/tools/ask-cursor.tool.js +30 -0
  118. package/dist/tools/ask-cursor.tool.js.map +1 -0
  119. package/dist/tools/ask-gemini.tool.d.ts +3 -0
  120. package/dist/tools/ask-gemini.tool.d.ts.map +1 -0
  121. package/dist/tools/ask-gemini.tool.js +40 -0
  122. package/dist/tools/ask-gemini.tool.js.map +1 -0
  123. package/dist/tools/ask-opencode.tool.d.ts +3 -0
  124. package/dist/tools/ask-opencode.tool.d.ts.map +1 -0
  125. package/dist/tools/ask-opencode.tool.js +29 -0
  126. package/dist/tools/ask-opencode.tool.js.map +1 -0
  127. package/dist/tools/ask-router.tool.d.ts +20 -0
  128. package/dist/tools/ask-router.tool.d.ts.map +1 -0
  129. package/dist/tools/ask-router.tool.js +550 -0
  130. package/dist/tools/ask-router.tool.js.map +1 -0
  131. package/dist/tools/fetch-chunk.tool.d.ts +3 -0
  132. package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
  133. package/dist/tools/fetch-chunk.tool.js +58 -0
  134. package/dist/tools/fetch-chunk.tool.js.map +1 -0
  135. package/dist/tools/get-run.tool.d.ts +3 -0
  136. package/dist/tools/get-run.tool.d.ts.map +1 -0
  137. package/dist/tools/get-run.tool.js +53 -0
  138. package/dist/tools/get-run.tool.js.map +1 -0
  139. package/dist/tools/important-read-now.tool.d.ts +3 -0
  140. package/dist/tools/important-read-now.tool.d.ts.map +1 -0
  141. package/dist/tools/important-read-now.tool.js +31 -0
  142. package/dist/tools/important-read-now.tool.js.map +1 -0
  143. package/dist/tools/index.d.ts +12 -0
  144. package/dist/tools/index.d.ts.map +1 -0
  145. package/dist/tools/index.js +59 -0
  146. package/dist/tools/index.js.map +1 -0
  147. package/dist/tools/opencode-copilot-usage.tool.d.ts +3 -0
  148. package/dist/tools/opencode-copilot-usage.tool.d.ts.map +1 -0
  149. package/dist/tools/opencode-copilot-usage.tool.js +85 -0
  150. package/dist/tools/opencode-copilot-usage.tool.js.map +1 -0
  151. package/dist/tools/recommend-route.tool.d.ts +3 -0
  152. package/dist/tools/recommend-route.tool.d.ts.map +1 -0
  153. package/dist/tools/recommend-route.tool.js +88 -0
  154. package/dist/tools/recommend-route.tool.js.map +1 -0
  155. package/dist/tools/registry.d.ts +31 -0
  156. package/dist/tools/registry.d.ts.map +1 -0
  157. package/dist/tools/registry.js +105 -0
  158. package/dist/tools/registry.js.map +1 -0
  159. package/dist/tools/simple-tools.d.ts +12 -0
  160. package/dist/tools/simple-tools.d.ts.map +1 -0
  161. package/dist/tools/simple-tools.js +121 -0
  162. package/dist/tools/simple-tools.js.map +1 -0
  163. package/dist/tools/test-tool.example.d.ts +13 -0
  164. package/dist/tools/test-tool.example.d.ts.map +1 -0
  165. package/dist/tools/test-tool.example.js +32 -0
  166. package/dist/tools/test-tool.example.js.map +1 -0
  167. package/dist/tools/tiered-request.tool.d.ts +3 -0
  168. package/dist/tools/tiered-request.tool.d.ts.map +1 -0
  169. package/dist/tools/tiered-request.tool.js +147 -0
  170. package/dist/tools/tiered-request.tool.js.map +1 -0
  171. package/dist/utils/changeModeChunker.d.ts +11 -0
  172. package/dist/utils/changeModeChunker.d.ts.map +1 -0
  173. package/dist/utils/changeModeChunker.js +89 -0
  174. package/dist/utils/changeModeChunker.js.map +1 -0
  175. package/dist/utils/changeModeParser.d.ts +15 -0
  176. package/dist/utils/changeModeParser.d.ts.map +1 -0
  177. package/dist/utils/changeModeParser.js +67 -0
  178. package/dist/utils/changeModeParser.js.map +1 -0
  179. package/dist/utils/changeModeTranslator.d.ts +8 -0
  180. package/dist/utils/changeModeTranslator.d.ts.map +1 -0
  181. package/dist/utils/changeModeTranslator.js +70 -0
  182. package/dist/utils/changeModeTranslator.js.map +1 -0
  183. package/dist/utils/chunkCache.d.ts +22 -0
  184. package/dist/utils/chunkCache.d.ts.map +1 -0
  185. package/dist/utils/chunkCache.js +147 -0
  186. package/dist/utils/chunkCache.js.map +1 -0
  187. package/dist/utils/claudeExecutor.d.ts +3 -0
  188. package/dist/utils/claudeExecutor.d.ts.map +1 -0
  189. package/dist/utils/claudeExecutor.js +21 -0
  190. package/dist/utils/claudeExecutor.js.map +1 -0
  191. package/dist/utils/cliDetector.d.ts +20 -0
  192. package/dist/utils/cliDetector.d.ts.map +1 -0
  193. package/dist/utils/cliDetector.js +95 -0
  194. package/dist/utils/cliDetector.js.map +1 -0
  195. package/dist/utils/codexExecutor.d.ts +3 -0
  196. package/dist/utils/codexExecutor.d.ts.map +1 -0
  197. package/dist/utils/codexExecutor.js +19 -0
  198. package/dist/utils/codexExecutor.js.map +1 -0
  199. package/dist/utils/commandExecutor.d.ts +29 -0
  200. package/dist/utils/commandExecutor.d.ts.map +1 -0
  201. package/dist/utils/commandExecutor.js +487 -0
  202. package/dist/utils/commandExecutor.js.map +1 -0
  203. package/dist/utils/cursorCli.d.ts +3 -0
  204. package/dist/utils/cursorCli.d.ts.map +1 -0
  205. package/dist/utils/cursorCli.js +20 -0
  206. package/dist/utils/cursorCli.js.map +1 -0
  207. package/dist/utils/cursorExecutor.d.ts +3 -0
  208. package/dist/utils/cursorExecutor.d.ts.map +1 -0
  209. package/dist/utils/cursorExecutor.js +22 -0
  210. package/dist/utils/cursorExecutor.js.map +1 -0
  211. package/dist/utils/geminiExecutor.d.ts +4 -0
  212. package/dist/utils/geminiExecutor.d.ts.map +1 -0
  213. package/dist/utils/geminiExecutor.js +131 -0
  214. package/dist/utils/geminiExecutor.js.map +1 -0
  215. package/dist/utils/githubCli.d.ts +22 -0
  216. package/dist/utils/githubCli.d.ts.map +1 -0
  217. package/dist/utils/githubCli.js +131 -0
  218. package/dist/utils/githubCli.js.map +1 -0
  219. package/dist/utils/opencodeCatalog.d.ts +33 -0
  220. package/dist/utils/opencodeCatalog.d.ts.map +1 -0
  221. package/dist/utils/opencodeCatalog.js +171 -0
  222. package/dist/utils/opencodeCatalog.js.map +1 -0
  223. package/dist/utils/opencodeExecutor.d.ts +3 -0
  224. package/dist/utils/opencodeExecutor.d.ts.map +1 -0
  225. package/dist/utils/opencodeExecutor.js +16 -0
  226. package/dist/utils/opencodeExecutor.js.map +1 -0
  227. package/dist/utils/timeoutManager.d.ts +2 -0
  228. package/dist/utils/timeoutManager.d.ts.map +1 -0
  229. package/dist/utils/timeoutManager.js +2 -0
  230. package/dist/utils/timeoutManager.js.map +1 -0
  231. package/dist/utils/worktrunkIsolation.d.ts +26 -0
  232. package/dist/utils/worktrunkIsolation.d.ts.map +1 -0
  233. package/dist/utils/worktrunkIsolation.js +80 -0
  234. package/dist/utils/worktrunkIsolation.js.map +1 -0
  235. package/package.json +72 -0
@@ -0,0 +1,81 @@
1
+ import { createRequire } from 'node:module';
2
+ const require = createRequire(import.meta.url);
3
+ const catalog = require('../modelCatalog.generated.json');
4
+ function inferCostClass(provider, modelId) {
5
+ const id = modelId.toLowerCase();
6
+ if (provider === 'opencode' && id.includes('pickle'))
7
+ return 'free';
8
+ if (id.includes('flash') || id.includes('mini') || id.includes('haiku'))
9
+ return 'low';
10
+ if (id.includes('opus') || (id.includes('gpt-5.4') && !id.includes('mini')))
11
+ return 'premium';
12
+ if (id.includes('pro-preview') || id.includes('3.1-pro'))
13
+ return 'premium';
14
+ if (id.includes('sonnet') || id.includes('codex') || id.includes('composer'))
15
+ return 'medium';
16
+ if (id.includes('gpt-5.5'))
17
+ return 'medium';
18
+ if (id.includes('gpt-5.3'))
19
+ return 'medium';
20
+ if (id.includes('gpt-5.2'))
21
+ return 'medium';
22
+ return 'medium';
23
+ }
24
+ function collectCatalogModels() {
25
+ const out = [];
26
+ const catalogs = catalog.catalogs;
27
+ for (const [providerKey, entry] of Object.entries(catalogs)) {
28
+ const provider = providerKey;
29
+ if (!entry?.tiers)
30
+ continue;
31
+ for (const tier of entry.tiers) {
32
+ for (const modelId of tier.models ?? []) {
33
+ out.push({
34
+ provider,
35
+ modelId,
36
+ costClass: inferCostClass(provider, modelId),
37
+ });
38
+ }
39
+ }
40
+ }
41
+ return out;
42
+ }
43
+ /** Models not present in the generated Codex/Gemini/Claude catalog. */
44
+ const EXTRA_MODELS = [
45
+ { provider: 'opencode', modelId: 'opencode/big-pickle', costClass: 'free' },
46
+ { provider: 'cursor', modelId: 'composer-2', costClass: 'medium' },
47
+ { provider: 'cursor', modelId: 'gpt-5.5-low', costClass: 'medium' },
48
+ ];
49
+ const ROUTABLE_BY_KEY = new Map();
50
+ function key(provider, modelId) {
51
+ return `${provider}:${modelId}`;
52
+ }
53
+ for (const m of [...collectCatalogModels(), ...EXTRA_MODELS]) {
54
+ ROUTABLE_BY_KEY.set(key(m.provider, m.modelId), m);
55
+ }
56
+ /** Default alias target model IDs (see `defaultConfig.ts`); listed here to avoid import cycles. */
57
+ const DEFAULT_ALIAS_TARGET_MODEL_IDS = [
58
+ 'opencode/big-pickle',
59
+ 'gemini-3.1-pro-preview',
60
+ 'composer-2',
61
+ 'gpt-5.5-low',
62
+ 'gpt-5.4-mini',
63
+ 'gpt-5.3-codex',
64
+ 'claude-sonnet-4-6',
65
+ 'claude-opus-4-7',
66
+ ];
67
+ /** Known model IDs for validation warnings (catalog + extras + default alias targets). */
68
+ export function getKnownModelIdSet() {
69
+ const ids = new Set();
70
+ for (const m of ROUTABLE_BY_KEY.values()) {
71
+ ids.add(m.modelId);
72
+ }
73
+ for (const id of DEFAULT_ALIAS_TARGET_MODEL_IDS) {
74
+ ids.add(id);
75
+ }
76
+ return ids;
77
+ }
78
+ export function lookupRoutableModel(provider, modelId) {
79
+ return ROUTABLE_BY_KEY.get(key(provider, modelId));
80
+ }
81
+ //# sourceMappingURL=modelMetadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelMetadata.js","sourceRoot":"","sources":["../../src/router/modelMetadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { QuotaBucket } from './types.js';
2
+ /** Reserved for Stage 3+ quota-aware routing. */
3
+ export declare function quotaAllowsRoute(_bucket: QuotaBucket | undefined): boolean;
4
+ //# sourceMappingURL=quota.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota.d.ts","sourceRoot":"","sources":["../../src/router/quota.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,iDAAiD;AACjD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAE1E"}
@@ -0,0 +1,5 @@
1
+ /** Reserved for Stage 3+ quota-aware routing. */
2
+ export function quotaAllowsRoute(_bucket) {
3
+ return true;
4
+ }
5
+ //# sourceMappingURL=quota.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota.js","sourceRoot":"","sources":["../../src/router/quota.ts"],"names":[],"mappings":"AAEA,iDAAiD;AACjD,MAAM,UAAU,gBAAgB,CAAC,OAAgC;IAC/D,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RouteBuildContext, RouteDecision, RouteRequestInput, RouterConfig } from './types.js';
2
+ export declare function buildRouteDecision(routerConfig: RouterConfig, input: RouteRequestInput, context: RouteBuildContext, configWarnings?: string[]): RouteDecision;
3
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,iBAAiB,EAEjB,aAAa,EAEb,iBAAiB,EACjB,YAAY,EACb,MAAM,YAAY,CAAC;AAmCpB,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,iBAAiB,EAC1B,cAAc,GAAE,MAAM,EAAO,GAC5B,aAAa,CAsIf"}
@@ -0,0 +1,141 @@
1
+ import { getExcludedCategory } from '../clientFilter.js';
2
+ import { getKnownModelIdSet } from './modelMetadata.js';
3
+ import { quotaAllowsRoute } from './quota.js';
4
+ const COST_RANK = {
5
+ free: 0,
6
+ included: 1,
7
+ low: 2,
8
+ medium: 3,
9
+ premium: 4,
10
+ any: 5,
11
+ };
12
+ function costAllowed(candidateCost, maxCost) {
13
+ if (maxCost === undefined)
14
+ return true;
15
+ return COST_RANK[candidateCost] <= COST_RANK[maxCost];
16
+ }
17
+ /** Stable partition: preferred provider routes first (relative order preserved). */
18
+ function stablePreferProviderOrder(routes, preferred) {
19
+ if (!preferred)
20
+ return routes;
21
+ const pref = [];
22
+ const rest = [];
23
+ for (const r of routes) {
24
+ (r.provider === preferred ? pref : rest).push(r);
25
+ }
26
+ return [...pref, ...rest];
27
+ }
28
+ function applyCandidateOverrides(c, input) {
29
+ return {
30
+ ...c,
31
+ allowEdits: input.allowEdits ?? c.allowEdits,
32
+ requireReview: input.requireReview ?? c.requireReview,
33
+ };
34
+ }
35
+ export function buildRouteDecision(routerConfig, input, context, configWarnings = []) {
36
+ const reasons = [];
37
+ const warnings = [...configWarnings];
38
+ const rejected = [];
39
+ const tierDef = routerConfig.tiers[input.tier];
40
+ if (!tierDef) {
41
+ return {
42
+ selected: null,
43
+ fallbacks: [],
44
+ rejected: [{ reason: `Unknown tier "${input.tier}".` }],
45
+ reasons: ['No tier definition available.'],
46
+ warnings,
47
+ };
48
+ }
49
+ reasons.push(`Evaluated tier "${input.tier}" with ${tierDef.routes.length} configured routes (deterministic order).`);
50
+ if (input.prompt.trim().length > 0) {
51
+ reasons.push(`Prompt length ${input.prompt.length} characters.`);
52
+ }
53
+ if (input.domain) {
54
+ reasons.push(`Domain hint: ${input.domain} (informational for this router stage).`);
55
+ }
56
+ const excludedCategory = getExcludedCategory(context.mcpClientName);
57
+ const blocked = new Set(input.blockedProviders ?? []);
58
+ const knownModels = getKnownModelIdSet();
59
+ const ordered = stablePreferProviderOrder([...tierDef.routes], input.preferredProvider);
60
+ if (input.preferredProvider) {
61
+ reasons.push(`Preferred provider "${input.preferredProvider}" — matching routes are tried first while preserving relative order.`);
62
+ }
63
+ const tierDefaultNoEdits = tierDef.routes.every((r) => !r.allowEdits);
64
+ if (input.allowEdits === true && tierDefaultNoEdits) {
65
+ warnings.push('Edits were requested (allowEdits: true) but this tier defaults to read-only routes.');
66
+ }
67
+ const eligible = [];
68
+ for (const raw of ordered) {
69
+ if (!quotaAllowsRoute(undefined)) {
70
+ rejected.push({
71
+ routeId: raw.routeId,
72
+ provider: raw.provider,
73
+ modelId: raw.modelId,
74
+ reason: 'Quota gate rejected route (stub).',
75
+ });
76
+ continue;
77
+ }
78
+ if (!knownModels.has(raw.modelId)) {
79
+ warnings.push(`Model ID "${raw.modelId}" (${raw.provider}) is not in the bundled catalog or default alias targets — verify against List-*-Models before invoking.`);
80
+ }
81
+ if (!context.availability[raw.provider]) {
82
+ rejected.push({
83
+ routeId: raw.routeId,
84
+ provider: raw.provider,
85
+ modelId: raw.modelId,
86
+ reason: `Provider "${raw.provider}" is not available in this runtime.`,
87
+ });
88
+ continue;
89
+ }
90
+ if (blocked.has(raw.provider)) {
91
+ rejected.push({
92
+ routeId: raw.routeId,
93
+ provider: raw.provider,
94
+ modelId: raw.modelId,
95
+ reason: `Provider "${raw.provider}" is blocked by this request.`,
96
+ });
97
+ continue;
98
+ }
99
+ if (excludedCategory !== undefined && excludedCategory === raw.provider) {
100
+ rejected.push({
101
+ routeId: raw.routeId,
102
+ provider: raw.provider,
103
+ modelId: raw.modelId,
104
+ reason: `Provider "${raw.provider}" is excluded to prevent self-calls for MCP client "${context.mcpClientName ?? 'unknown'}".`,
105
+ });
106
+ continue;
107
+ }
108
+ if (!costAllowed(raw.costClass, input.maxCostClass)) {
109
+ rejected.push({
110
+ routeId: raw.routeId,
111
+ provider: raw.provider,
112
+ modelId: raw.modelId,
113
+ reason: `Cost class "${raw.costClass}" exceeds maxCostClass "${String(input.maxCostClass)}".`,
114
+ });
115
+ continue;
116
+ }
117
+ if (input.forceTask === true && raw.executionMode !== 'task') {
118
+ rejected.push({
119
+ routeId: raw.routeId,
120
+ provider: raw.provider,
121
+ modelId: raw.modelId,
122
+ reason: 'Route is sync-oriented but forceTask requested.',
123
+ });
124
+ continue;
125
+ }
126
+ eligible.push(applyCandidateOverrides(raw, input));
127
+ }
128
+ if (eligible.length === 0) {
129
+ warnings.push('No routes remained after applying availability, blocks, cost ceiling, and task constraints.');
130
+ return { selected: null, fallbacks: [], rejected, reasons, warnings };
131
+ }
132
+ const selected = eligible[0];
133
+ const fallbacks = eligible.slice(1);
134
+ const originFirstId = tierDef.routes[0]?.routeId;
135
+ if (originFirstId !== undefined && selected.routeId !== originFirstId) {
136
+ warnings.push(`Configured first route "${originFirstId}" was skipped; selected "${selected.routeId}" as the first eligible option.`);
137
+ }
138
+ reasons.push(`Selected ${selected.provider} / ${selected.modelId} (${selected.executionMode}) as the first eligible route.`);
139
+ return { selected, fallbacks, rejected, reasons, warnings };
140
+ }
141
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import type { CliAvailability } from '../utils/cliDetector.js';
2
+ export type Tier = 'trivial' | 'small' | 'medium' | 'large' | 'long' | 'crucial';
3
+ export type Provider = 'codex' | 'claude' | 'gemini' | 'opencode' | 'cursor';
4
+ export type ExecutionMode = 'sync' | 'task';
5
+ export type CostClass = 'free' | 'included' | 'low' | 'medium' | 'premium' | 'any';
6
+ /** Routing domain hint for future rules; optional in v1. */
7
+ export type RouteDomain = 'general' | 'code' | 'review' | 'docs' | 'analysis';
8
+ export type RouteId = string;
9
+ export interface RoutableModel {
10
+ provider: Provider;
11
+ modelId: string;
12
+ costClass: CostClass;
13
+ }
14
+ export interface RouteCandidate {
15
+ routeId: RouteId;
16
+ provider: Provider;
17
+ modelId: string;
18
+ executionMode: ExecutionMode;
19
+ allowEdits: boolean;
20
+ requireReview: boolean;
21
+ costClass: CostClass;
22
+ /** Per-route execution budget override (bytes UTF-8) after provider returns. */
23
+ maxOutputBytes?: number;
24
+ /** Per-route subprocess timeout override (ms), forwarded via ToolExecutionContext.timeoutMs. */
25
+ timeoutMs?: number;
26
+ }
27
+ export interface TierDefinition {
28
+ tier: Tier;
29
+ routes: RouteCandidate[];
30
+ /** Tier-wide defaults when routes omit limits. */
31
+ maxOutputBytes?: number;
32
+ timeoutMs?: number;
33
+ }
34
+ /** Optional global routing behavior (merged from user/project config). */
35
+ export interface RouterRoutingConfig {
36
+ /** How many additional routes to try after the primary when execution fails (default 2). */
37
+ maxFallbackAttempts?: number;
38
+ /** When true, trivial tier may honor allowEdits (default false — trivial stays read-only). */
39
+ allowTrivialEdits?: boolean;
40
+ defaultTimeoutMs?: number;
41
+ defaultMaxOutputBytes?: number;
42
+ }
43
+ export interface RouterConfig {
44
+ aliases: Record<string, {
45
+ provider: Provider;
46
+ modelId: string;
47
+ }>;
48
+ tiers: Record<Tier, TierDefinition>;
49
+ routing?: RouterRoutingConfig;
50
+ }
51
+ export interface RouteRejected {
52
+ routeId?: RouteId;
53
+ provider?: Provider;
54
+ modelId?: string;
55
+ reason: string;
56
+ }
57
+ export interface RouteDecision {
58
+ selected: RouteCandidate | null;
59
+ fallbacks: RouteCandidate[];
60
+ rejected: RouteRejected[];
61
+ reasons: string[];
62
+ warnings: string[];
63
+ }
64
+ export interface RouteRequestInput {
65
+ prompt: string;
66
+ tier: Tier;
67
+ domain?: RouteDomain;
68
+ allowEdits?: boolean;
69
+ requireReview?: boolean;
70
+ preferredProvider?: Provider;
71
+ blockedProviders?: Provider[];
72
+ maxCostClass?: CostClass;
73
+ forceTask?: boolean;
74
+ }
75
+ export interface RouteBuildContext {
76
+ availability: CliAvailability;
77
+ /** MCP client `Implementation.name` for self-call exclusion. */
78
+ mcpClientName?: string;
79
+ /** Working directory used to locate `multi-cli.config.json`. */
80
+ projectRoot?: string;
81
+ }
82
+ /** Stub for future quota-aware routing. */
83
+ export interface QuotaBucket {
84
+ readonly label?: string;
85
+ }
86
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/router/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/router/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import type { ToolArguments } from './constants.js';
2
+ export type RouterTier = 'default' | 'trivial' | 'low' | 'medium' | 'high' | 'crucial' | 'huge-trivial' | 'huge-medium' | 'huge-hard';
3
+ export type RouterBackend = 'gemini' | 'opencode' | 'cursor' | 'codex';
4
+ export interface RouterCandidate {
5
+ label: string;
6
+ toolName: string;
7
+ backend: RouterBackend;
8
+ model: string;
9
+ extraArgs?: ToolArguments;
10
+ }
11
+ export declare const ROUTER_TIER_ORDER: RouterTier[];
12
+ export declare const ROUTER_TIERS: Record<RouterTier, RouterCandidate[]>;
13
+ export declare function getRouterTiers(env?: NodeJS.ProcessEnv): Record<RouterTier, RouterCandidate[]>;
14
+ //# sourceMappingURL=routerConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routerConfig.d.ts","sourceRoot":"","sources":["../src/routerConfig.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,MAAM,UAAU,GAClB,SAAS,GACT,SAAS,GACT,KAAK,GACL,QAAQ,GACR,MAAM,GACN,SAAS,GACT,cAAc,GACd,aAAa,GACb,WAAW,CAAC;AAEhB,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,aAAa,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B;AAED,eAAO,MAAM,iBAAiB,EAAE,UAAU,EAUzC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,eAAe,EAAE,CA2I9D,CAAC;AAsCF,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,UAAU,EAAE,eAAe,EAAE,CAAC,CAU1G"}
@@ -0,0 +1,194 @@
1
+ import { readFileSync } from 'node:fs';
2
+ export const ROUTER_TIER_ORDER = [
3
+ 'default',
4
+ 'trivial',
5
+ 'low',
6
+ 'medium',
7
+ 'high',
8
+ 'crucial',
9
+ 'huge-trivial',
10
+ 'huge-medium',
11
+ 'huge-hard',
12
+ ];
13
+ export const ROUTER_TIERS = {
14
+ default: [
15
+ {
16
+ label: 'Gemini Flash Lite',
17
+ toolName: 'Ask-Gemini',
18
+ backend: 'gemini',
19
+ model: 'gemini-3.1-flash-lite-preview',
20
+ },
21
+ {
22
+ label: 'Copilot GPT-5 mini xhigh',
23
+ toolName: 'Ask-OpenCode',
24
+ backend: 'opencode',
25
+ model: 'github-copilot/gpt-5-mini',
26
+ extraArgs: { variant: 'xhigh' },
27
+ },
28
+ ],
29
+ trivial: [
30
+ {
31
+ label: 'Gemini Flash Lite',
32
+ toolName: 'Ask-Gemini',
33
+ backend: 'gemini',
34
+ model: 'gemini-3.1-flash-lite-preview',
35
+ },
36
+ {
37
+ label: 'Copilot GPT-5 mini xhigh',
38
+ toolName: 'Ask-OpenCode',
39
+ backend: 'opencode',
40
+ model: 'github-copilot/gpt-5-mini',
41
+ extraArgs: { variant: 'xhigh' },
42
+ },
43
+ ],
44
+ low: [
45
+ {
46
+ label: 'Gemini Flash',
47
+ toolName: 'Ask-Gemini',
48
+ backend: 'gemini',
49
+ model: 'gemini-3-flash-preview',
50
+ },
51
+ {
52
+ label: 'Copilot GPT-5 mini xhigh',
53
+ toolName: 'Ask-OpenCode',
54
+ backend: 'opencode',
55
+ model: 'github-copilot/gpt-5-mini',
56
+ extraArgs: { variant: 'xhigh' },
57
+ },
58
+ ],
59
+ medium: [
60
+ {
61
+ label: 'Ring 2.6 1T',
62
+ toolName: 'Ask-OpenCode',
63
+ backend: 'opencode',
64
+ model: 'opencode/ring-2.6-1t-free',
65
+ },
66
+ {
67
+ label: 'Gemini 3.1 Pro preview',
68
+ toolName: 'Ask-Gemini',
69
+ backend: 'gemini',
70
+ model: 'gemini-3.1-pro-preview',
71
+ },
72
+ {
73
+ label: 'Codex GPT-5.4 mini medium',
74
+ toolName: 'Ask-Codex',
75
+ backend: 'codex',
76
+ model: 'gpt-5.4-mini-medium',
77
+ },
78
+ ],
79
+ high: [
80
+ {
81
+ label: 'Gemini 3.1 Pro preview',
82
+ toolName: 'Ask-Gemini',
83
+ backend: 'gemini',
84
+ model: 'gemini-3.1-pro-preview',
85
+ },
86
+ {
87
+ label: 'Cursor Composer 2',
88
+ toolName: 'Ask-Cursor',
89
+ backend: 'cursor',
90
+ model: 'composer-2',
91
+ },
92
+ ],
93
+ crucial: [
94
+ {
95
+ label: 'Codex GPT-5.5 low',
96
+ toolName: 'Ask-Codex',
97
+ backend: 'codex',
98
+ model: 'gpt-5.5-low',
99
+ },
100
+ {
101
+ label: 'Gemini 3.1 Pro preview',
102
+ toolName: 'Ask-Gemini',
103
+ backend: 'gemini',
104
+ model: 'gemini-3.1-pro-preview',
105
+ },
106
+ ],
107
+ 'huge-trivial': [
108
+ {
109
+ label: 'Copilot GPT-5 mini xhigh',
110
+ toolName: 'Ask-OpenCode',
111
+ backend: 'opencode',
112
+ model: 'github-copilot/gpt-5-mini',
113
+ extraArgs: { variant: 'xhigh' },
114
+ },
115
+ {
116
+ label: 'Gemini Flash Lite',
117
+ toolName: 'Ask-Gemini',
118
+ backend: 'gemini',
119
+ model: 'gemini-3.1-flash-lite-preview',
120
+ },
121
+ ],
122
+ 'huge-medium': [
123
+ {
124
+ label: 'Copilot GPT-5.4 mini xhigh',
125
+ toolName: 'Ask-OpenCode',
126
+ backend: 'opencode',
127
+ model: 'github-copilot/gpt-5.4-mini',
128
+ extraArgs: { variant: 'xhigh' },
129
+ },
130
+ {
131
+ label: 'Gemini 3.1 Pro preview',
132
+ toolName: 'Ask-Gemini',
133
+ backend: 'gemini',
134
+ model: 'gemini-3.1-pro-preview',
135
+ },
136
+ ],
137
+ 'huge-hard': [
138
+ {
139
+ label: 'Copilot GPT-5.2 Codex xhigh',
140
+ toolName: 'Ask-OpenCode',
141
+ backend: 'opencode',
142
+ model: 'github-copilot/gpt-5.2-codex',
143
+ extraArgs: { variant: 'xhigh' },
144
+ },
145
+ {
146
+ label: 'Gemini 3.1 Pro preview',
147
+ toolName: 'Ask-Gemini',
148
+ backend: 'gemini',
149
+ model: 'gemini-3.1-pro-preview',
150
+ },
151
+ ],
152
+ };
153
+ function isRouterTier(value) {
154
+ return ROUTER_TIER_ORDER.includes(value);
155
+ }
156
+ function isRouterCandidate(value) {
157
+ if (!value || typeof value !== 'object')
158
+ return false;
159
+ const candidate = value;
160
+ return (typeof candidate.label === 'string' &&
161
+ typeof candidate.toolName === 'string' &&
162
+ typeof candidate.backend === 'string' &&
163
+ ['gemini', 'opencode', 'cursor', 'codex'].includes(candidate.backend) &&
164
+ typeof candidate.model === 'string' &&
165
+ (candidate.extraArgs === undefined || (typeof candidate.extraArgs === 'object' && candidate.extraArgs !== null)));
166
+ }
167
+ function parseRouterTierOverrides(configPath) {
168
+ const parsed = JSON.parse(readFileSync(configPath, 'utf-8'));
169
+ if (!parsed || typeof parsed !== 'object') {
170
+ throw new Error('router config must be a JSON object keyed by tier name');
171
+ }
172
+ const overrides = {};
173
+ for (const [tier, candidates] of Object.entries(parsed)) {
174
+ if (!isRouterTier(tier)) {
175
+ throw new Error(`router config contains unknown tier "${tier}"`);
176
+ }
177
+ if (!Array.isArray(candidates) || !candidates.every(isRouterCandidate)) {
178
+ throw new Error(`router config tier "${tier}" must be an array of router candidates`);
179
+ }
180
+ overrides[tier] = candidates;
181
+ }
182
+ return overrides;
183
+ }
184
+ export function getRouterTiers(env = process.env) {
185
+ const configPath = env.AGENTMUX_ROUTER_CONFIG?.trim();
186
+ if (!configPath) {
187
+ return ROUTER_TIERS;
188
+ }
189
+ return {
190
+ ...ROUTER_TIERS,
191
+ ...parseRouterTierOverrides(configPath),
192
+ };
193
+ }
194
+ //# sourceMappingURL=routerConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routerConfig.js","sourceRoot":"","sources":["../src/routerConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
3
+ import { type Implementation, type ListRootsResult } from "@modelcontextprotocol/sdk/types.js";
4
+ import { MultiCliConfig } from "./config.js";
5
+ import { Logger } from "./logger.js";
6
+ import type { CliAvailability } from "./utils/cliDetector.js";
7
+ export interface MultiCliRuntime {
8
+ availability: CliAvailability;
9
+ initializedAt: string;
10
+ }
11
+ export interface MultiCliSessionContext {
12
+ cwd?: string;
13
+ rootUri?: string;
14
+ projectRoots?: ListRootsResult['roots'];
15
+ env?: NodeJS.ProcessEnv;
16
+ transport?: 'stdio' | 'http';
17
+ clientName?: string;
18
+ resolveWorkingDirectory?: (server: Server, logger: Logger) => Promise<{
19
+ cwd?: string;
20
+ rootUri?: string;
21
+ projectRoots?: ListRootsResult['roots'];
22
+ }>;
23
+ }
24
+ export interface CreateServerAppOptions {
25
+ runtime?: MultiCliRuntime;
26
+ sessionContext?: MultiCliSessionContext;
27
+ onClientInitialized?: (server: Server, clientInfo: Implementation | undefined, sessionContext: MultiCliSessionContext) => Promise<void> | void;
28
+ }
29
+ export declare function createServerRuntime(config?: MultiCliConfig, rootLogger?: Logger): Promise<MultiCliRuntime>;
30
+ export declare function resolveWorkingDirectoryFromRoots(server: Server, logger: Logger): Promise<{
31
+ cwd?: string;
32
+ rootUri?: string;
33
+ projectRoots?: ListRootsResult['roots'];
34
+ }>;
35
+ export interface MultiCliServerApp {
36
+ readonly server: Server;
37
+ readonly config: MultiCliConfig;
38
+ connect(transport: Transport): Promise<void>;
39
+ close(reason?: string): Promise<void>;
40
+ }
41
+ export declare function createServerApp(config?: MultiCliConfig, rootLogger?: Logger, options?: CreateServerAppOptions): Promise<MultiCliServerApp>;
42
+ export declare function startServer(config?: MultiCliConfig, rootLogger?: Logger): Promise<MultiCliServerApp>;
43
+ //# sourceMappingURL=serverApp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverApp.d.ts","sourceRoot":"","sources":["../src/serverApp.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EAkBL,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAc,MAAM,aAAa,CAAC;AAEzD,OAAO,EAAE,MAAM,EAAgB,MAAM,aAAa,CAAC;AAiBnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAQ9D,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,eAAe,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uBAAuB,CAAC,EAAE,CACxB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,KACX,OAAO,CAAC;QACX,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;KACzC,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC,mBAAmB,CAAC,EAAE,CACpB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,cAAc,GAAG,SAAS,EACtC,cAAc,EAAE,sBAAsB,KACnC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC3B;AAuED,wBAAsB,mBAAmB,CACvC,MAAM,GAAE,cAA6B,EACrC,UAAU,GAAE,MAKV,GACD,OAAO,CAAC,eAAe,CAAC,CAgB1B;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IACT,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;CACzC,CAAC,CA0BD;AA+JD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,wBAAsB,eAAe,CACnC,MAAM,GAAE,cAA6B,EACrC,UAAU,GAAE,MAKV,EACF,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,iBAAiB,CAAC,CAuZ5B;AAED,wBAAsB,WAAW,CAC/B,MAAM,GAAE,cAA6B,EACrC,UAAU,GAAE,MAKV,GACD,OAAO,CAAC,iBAAiB,CAAC,CA0C5B"}