@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.
- package/README.md +440 -0
- package/dist/clientFilter.d.ts +5 -0
- package/dist/clientFilter.d.ts.map +1 -0
- package/dist/clientFilter.js +31 -0
- package/dist/clientFilter.js.map +1 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +112 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +115 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +118 -0
- package/dist/constants.js.map +1 -0
- package/dist/execution.d.ts +23 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +2 -0
- package/dist/execution.js.map +1 -0
- package/dist/httpServer.d.ts +12 -0
- package/dist/httpServer.d.ts.map +1 -0
- package/dist/httpServer.js +323 -0
- package/dist/httpServer.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +98 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +19 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +172 -0
- package/dist/logger.js.map +1 -0
- package/dist/modelCatalog.d.ts +15 -0
- package/dist/modelCatalog.d.ts.map +1 -0
- package/dist/modelCatalog.generated.json +80 -0
- package/dist/modelCatalog.js +81 -0
- package/dist/modelCatalog.js.map +1 -0
- package/dist/router/config.d.ts +13 -0
- package/dist/router/config.d.ts.map +1 -0
- package/dist/router/config.js +198 -0
- package/dist/router/config.js.map +1 -0
- package/dist/router/defaultConfig.d.ts +13 -0
- package/dist/router/defaultConfig.d.ts.map +1 -0
- package/dist/router/defaultConfig.js +82 -0
- package/dist/router/defaultConfig.js.map +1 -0
- package/dist/router/executor.d.ts +35 -0
- package/dist/router/executor.d.ts.map +1 -0
- package/dist/router/executor.js +189 -0
- package/dist/router/executor.js.map +1 -0
- package/dist/router/modelMetadata.d.ts +5 -0
- package/dist/router/modelMetadata.d.ts.map +1 -0
- package/dist/router/modelMetadata.js +81 -0
- package/dist/router/modelMetadata.js.map +1 -0
- package/dist/router/quota.d.ts +4 -0
- package/dist/router/quota.d.ts.map +1 -0
- package/dist/router/quota.js +5 -0
- package/dist/router/quota.js.map +1 -0
- package/dist/router/router.d.ts +3 -0
- package/dist/router/router.d.ts.map +1 -0
- package/dist/router/router.js +141 -0
- package/dist/router/router.js.map +1 -0
- package/dist/router/types.d.ts +86 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +2 -0
- package/dist/router/types.js.map +1 -0
- package/dist/routerConfig.d.ts +14 -0
- package/dist/routerConfig.d.ts.map +1 -0
- package/dist/routerConfig.js +194 -0
- package/dist/routerConfig.js.map +1 -0
- package/dist/serverApp.d.ts +43 -0
- package/dist/serverApp.d.ts.map +1 -0
- package/dist/serverApp.js +618 -0
- package/dist/serverApp.js.map +1 -0
- package/dist/service/bootstrap.d.ts +3 -0
- package/dist/service/bootstrap.d.ts.map +1 -0
- package/dist/service/bootstrap.js +32 -0
- package/dist/service/bootstrap.js.map +1 -0
- package/dist/service/manager.d.ts +6 -0
- package/dist/service/manager.d.ts.map +1 -0
- package/dist/service/manager.js +318 -0
- package/dist/service/manager.js.map +1 -0
- package/dist/service/paths.d.ts +10 -0
- package/dist/service/paths.d.ts.map +1 -0
- package/dist/service/paths.js +57 -0
- package/dist/service/paths.js.map +1 -0
- package/dist/service/renderers.d.ts +7 -0
- package/dist/service/renderers.d.ts.map +1 -0
- package/dist/service/renderers.js +110 -0
- package/dist/service/renderers.js.map +1 -0
- package/dist/service/runtime.d.ts +14 -0
- package/dist/service/runtime.d.ts.map +1 -0
- package/dist/service/runtime.js +129 -0
- package/dist/service/runtime.js.map +1 -0
- package/dist/service/types.d.ts +33 -0
- package/dist/service/types.d.ts.map +1 -0
- package/dist/service/types.js +2 -0
- package/dist/service/types.js.map +1 -0
- package/dist/taskClientPolicy.d.ts +16 -0
- package/dist/taskClientPolicy.d.ts.map +1 -0
- package/dist/taskClientPolicy.js +44 -0
- package/dist/taskClientPolicy.js.map +1 -0
- package/dist/taskStore.d.ts +12 -0
- package/dist/taskStore.d.ts.map +1 -0
- package/dist/taskStore.js +30 -0
- package/dist/taskStore.js.map +1 -0
- package/dist/tierConfig.d.ts +16 -0
- package/dist/tierConfig.d.ts.map +1 -0
- package/dist/tierConfig.js +70 -0
- package/dist/tierConfig.js.map +1 -0
- package/dist/tools/ask-claude.tool.d.ts +3 -0
- package/dist/tools/ask-claude.tool.d.ts.map +1 -0
- package/dist/tools/ask-claude.tool.js +30 -0
- package/dist/tools/ask-claude.tool.js.map +1 -0
- package/dist/tools/ask-codex.tool.d.ts +3 -0
- package/dist/tools/ask-codex.tool.d.ts.map +1 -0
- package/dist/tools/ask-codex.tool.js +29 -0
- package/dist/tools/ask-codex.tool.js.map +1 -0
- package/dist/tools/ask-cursor.tool.d.ts +3 -0
- package/dist/tools/ask-cursor.tool.d.ts.map +1 -0
- package/dist/tools/ask-cursor.tool.js +30 -0
- package/dist/tools/ask-cursor.tool.js.map +1 -0
- package/dist/tools/ask-gemini.tool.d.ts +3 -0
- package/dist/tools/ask-gemini.tool.d.ts.map +1 -0
- package/dist/tools/ask-gemini.tool.js +40 -0
- package/dist/tools/ask-gemini.tool.js.map +1 -0
- package/dist/tools/ask-opencode.tool.d.ts +3 -0
- package/dist/tools/ask-opencode.tool.d.ts.map +1 -0
- package/dist/tools/ask-opencode.tool.js +29 -0
- package/dist/tools/ask-opencode.tool.js.map +1 -0
- package/dist/tools/ask-router.tool.d.ts +20 -0
- package/dist/tools/ask-router.tool.d.ts.map +1 -0
- package/dist/tools/ask-router.tool.js +550 -0
- package/dist/tools/ask-router.tool.js.map +1 -0
- package/dist/tools/fetch-chunk.tool.d.ts +3 -0
- package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
- package/dist/tools/fetch-chunk.tool.js +58 -0
- package/dist/tools/fetch-chunk.tool.js.map +1 -0
- package/dist/tools/get-run.tool.d.ts +3 -0
- package/dist/tools/get-run.tool.d.ts.map +1 -0
- package/dist/tools/get-run.tool.js +53 -0
- package/dist/tools/get-run.tool.js.map +1 -0
- package/dist/tools/important-read-now.tool.d.ts +3 -0
- package/dist/tools/important-read-now.tool.d.ts.map +1 -0
- package/dist/tools/important-read-now.tool.js +31 -0
- package/dist/tools/important-read-now.tool.js.map +1 -0
- package/dist/tools/index.d.ts +12 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +59 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/opencode-copilot-usage.tool.d.ts +3 -0
- package/dist/tools/opencode-copilot-usage.tool.d.ts.map +1 -0
- package/dist/tools/opencode-copilot-usage.tool.js +85 -0
- package/dist/tools/opencode-copilot-usage.tool.js.map +1 -0
- package/dist/tools/recommend-route.tool.d.ts +3 -0
- package/dist/tools/recommend-route.tool.d.ts.map +1 -0
- package/dist/tools/recommend-route.tool.js +88 -0
- package/dist/tools/recommend-route.tool.js.map +1 -0
- package/dist/tools/registry.d.ts +31 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +105 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/simple-tools.d.ts +12 -0
- package/dist/tools/simple-tools.d.ts.map +1 -0
- package/dist/tools/simple-tools.js +121 -0
- package/dist/tools/simple-tools.js.map +1 -0
- package/dist/tools/test-tool.example.d.ts +13 -0
- package/dist/tools/test-tool.example.d.ts.map +1 -0
- package/dist/tools/test-tool.example.js +32 -0
- package/dist/tools/test-tool.example.js.map +1 -0
- package/dist/tools/tiered-request.tool.d.ts +3 -0
- package/dist/tools/tiered-request.tool.d.ts.map +1 -0
- package/dist/tools/tiered-request.tool.js +147 -0
- package/dist/tools/tiered-request.tool.js.map +1 -0
- package/dist/utils/changeModeChunker.d.ts +11 -0
- package/dist/utils/changeModeChunker.d.ts.map +1 -0
- package/dist/utils/changeModeChunker.js +89 -0
- package/dist/utils/changeModeChunker.js.map +1 -0
- package/dist/utils/changeModeParser.d.ts +15 -0
- package/dist/utils/changeModeParser.d.ts.map +1 -0
- package/dist/utils/changeModeParser.js +67 -0
- package/dist/utils/changeModeParser.js.map +1 -0
- package/dist/utils/changeModeTranslator.d.ts +8 -0
- package/dist/utils/changeModeTranslator.d.ts.map +1 -0
- package/dist/utils/changeModeTranslator.js +70 -0
- package/dist/utils/changeModeTranslator.js.map +1 -0
- package/dist/utils/chunkCache.d.ts +22 -0
- package/dist/utils/chunkCache.d.ts.map +1 -0
- package/dist/utils/chunkCache.js +147 -0
- package/dist/utils/chunkCache.js.map +1 -0
- package/dist/utils/claudeExecutor.d.ts +3 -0
- package/dist/utils/claudeExecutor.d.ts.map +1 -0
- package/dist/utils/claudeExecutor.js +21 -0
- package/dist/utils/claudeExecutor.js.map +1 -0
- package/dist/utils/cliDetector.d.ts +20 -0
- package/dist/utils/cliDetector.d.ts.map +1 -0
- package/dist/utils/cliDetector.js +95 -0
- package/dist/utils/cliDetector.js.map +1 -0
- package/dist/utils/codexExecutor.d.ts +3 -0
- package/dist/utils/codexExecutor.d.ts.map +1 -0
- package/dist/utils/codexExecutor.js +19 -0
- package/dist/utils/codexExecutor.js.map +1 -0
- package/dist/utils/commandExecutor.d.ts +29 -0
- package/dist/utils/commandExecutor.d.ts.map +1 -0
- package/dist/utils/commandExecutor.js +487 -0
- package/dist/utils/commandExecutor.js.map +1 -0
- package/dist/utils/cursorCli.d.ts +3 -0
- package/dist/utils/cursorCli.d.ts.map +1 -0
- package/dist/utils/cursorCli.js +20 -0
- package/dist/utils/cursorCli.js.map +1 -0
- package/dist/utils/cursorExecutor.d.ts +3 -0
- package/dist/utils/cursorExecutor.d.ts.map +1 -0
- package/dist/utils/cursorExecutor.js +22 -0
- package/dist/utils/cursorExecutor.js.map +1 -0
- package/dist/utils/geminiExecutor.d.ts +4 -0
- package/dist/utils/geminiExecutor.d.ts.map +1 -0
- package/dist/utils/geminiExecutor.js +131 -0
- package/dist/utils/geminiExecutor.js.map +1 -0
- package/dist/utils/githubCli.d.ts +22 -0
- package/dist/utils/githubCli.d.ts.map +1 -0
- package/dist/utils/githubCli.js +131 -0
- package/dist/utils/githubCli.js.map +1 -0
- package/dist/utils/opencodeCatalog.d.ts +33 -0
- package/dist/utils/opencodeCatalog.d.ts.map +1 -0
- package/dist/utils/opencodeCatalog.js +171 -0
- package/dist/utils/opencodeCatalog.js.map +1 -0
- package/dist/utils/opencodeExecutor.d.ts +3 -0
- package/dist/utils/opencodeExecutor.d.ts.map +1 -0
- package/dist/utils/opencodeExecutor.js +16 -0
- package/dist/utils/opencodeExecutor.js.map +1 -0
- package/dist/utils/timeoutManager.d.ts +2 -0
- package/dist/utils/timeoutManager.d.ts.map +1 -0
- package/dist/utils/timeoutManager.js +2 -0
- package/dist/utils/timeoutManager.js.map +1 -0
- package/dist/utils/worktrunkIsolation.d.ts +26 -0
- package/dist/utils/worktrunkIsolation.d.ts.map +1 -0
- package/dist/utils/worktrunkIsolation.js +80 -0
- package/dist/utils/worktrunkIsolation.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,MAAM,MAAM,IAAI,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAEjF,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE7E,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5C,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC;AAEnF,4DAA4D;AAC5D,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAE9E,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,gFAAgF;IAChF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gGAAgG;IAChG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,kDAAkD;IAClD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,4FAA4F;IAC5F,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,8FAA8F;IAC9F,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,mBAAmB,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iBAAiB,CAAC,EAAE,QAAQ,CAAC;IAC7B,gBAAgB,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC9B,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,eAAe,CAAC;IAC9B,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,2CAA2C;AAC3C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB"}
|
|
@@ -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"}
|