@zhixuan92/multi-model-agent-core 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.
- package/LICENSE +21 -0
- package/README.md +112 -0
- package/dist/auth/claude-oauth.d.ts +6 -0
- package/dist/auth/claude-oauth.d.ts.map +1 -0
- package/dist/auth/claude-oauth.js +8 -0
- package/dist/auth/claude-oauth.js.map +1 -0
- package/dist/auth/codex-oauth.d.ts +6 -0
- package/dist/auth/codex-oauth.d.ts.map +1 -0
- package/dist/auth/codex-oauth.js +50 -0
- package/dist/auth/codex-oauth.js.map +1 -0
- package/dist/config/load.d.ts +8 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +49 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/schema.d.ts +275 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +62 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/model-profiles.json +34 -0
- package/dist/provider.d.ts +3 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +50 -0
- package/dist/provider.js.map +1 -0
- package/dist/routing/capabilities.d.ts +3 -0
- package/dist/routing/capabilities.d.ts.map +1 -0
- package/dist/routing/capabilities.js +26 -0
- package/dist/routing/capabilities.js.map +1 -0
- package/dist/routing/get-provider-eligibility.d.ts +8 -0
- package/dist/routing/get-provider-eligibility.d.ts.map +1 -0
- package/dist/routing/get-provider-eligibility.js +53 -0
- package/dist/routing/get-provider-eligibility.js.map +1 -0
- package/dist/routing/model-profiles.d.ts +24 -0
- package/dist/routing/model-profiles.d.ts.map +1 -0
- package/dist/routing/model-profiles.js +41 -0
- package/dist/routing/model-profiles.js.map +1 -0
- package/dist/routing/resolve-task-capabilities.d.ts +7 -0
- package/dist/routing/resolve-task-capabilities.d.ts.map +1 -0
- package/dist/routing/resolve-task-capabilities.js +19 -0
- package/dist/routing/resolve-task-capabilities.js.map +1 -0
- package/dist/routing/select-provider-for-task.d.ts +18 -0
- package/dist/routing/select-provider-for-task.d.ts.map +1 -0
- package/dist/routing/select-provider-for-task.js +50 -0
- package/dist/routing/select-provider-for-task.js.map +1 -0
- package/dist/run-tasks.d.ts +7 -0
- package/dist/run-tasks.d.ts.map +1 -0
- package/dist/run-tasks.js +81 -0
- package/dist/run-tasks.js.map +1 -0
- package/dist/runners/claude-runner.d.ts +7 -0
- package/dist/runners/claude-runner.d.ts.map +1 -0
- package/dist/runners/claude-runner.js +118 -0
- package/dist/runners/claude-runner.js.map +1 -0
- package/dist/runners/codex-runner.d.ts +23 -0
- package/dist/runners/codex-runner.d.ts.map +1 -0
- package/dist/runners/codex-runner.js +403 -0
- package/dist/runners/codex-runner.js.map +1 -0
- package/dist/runners/openai-runner.d.ts +22 -0
- package/dist/runners/openai-runner.d.ts.map +1 -0
- package/dist/runners/openai-runner.js +92 -0
- package/dist/runners/openai-runner.js.map +1 -0
- package/dist/tools/claude-adapter.d.ts +4 -0
- package/dist/tools/claude-adapter.d.ts.map +1 -0
- package/dist/tools/claude-adapter.js +42 -0
- package/dist/tools/claude-adapter.js.map +1 -0
- package/dist/tools/definitions.d.ts +19 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +147 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/openai-adapter.d.ts +13 -0
- package/dist/tools/openai-adapter.d.ts.map +1 -0
- package/dist/tools/openai-adapter.js +74 -0
- package/dist/tools/openai-adapter.js.map +1 -0
- package/dist/tools/tracker.d.ts +7 -0
- package/dist/tools/tracker.d.ts.map +1 -0
- package/dist/tools/tracker.js +13 -0
- package/dist/tools/tracker.js.map +1 -0
- package/dist/types.d.ts +106 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +23 -0
- package/dist/types.js.map +1 -0
- package/package.json +97 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Zhang Zhixuan
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# @zhixuan92/multi-model-agent-core
|
|
2
|
+
|
|
3
|
+
Runtime library for [`multi-model-agent`](https://github.com/zhixuan312/multi-model-agent): provider runners (Claude, Codex, OpenAI-compatible), routing logic (capability / quality tier / cost), config schema, and a sandboxed file/shell tool layer.
|
|
4
|
+
|
|
5
|
+
This is the building-block library. If you just want to run the MCP server, install [`@zhixuan92/multi-model-agent-mcp`](https://www.npmjs.com/package/@zhixuan92/multi-model-agent-mcp) instead.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @zhixuan92/multi-model-agent-core
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
If you plan to use `openai-compatible` providers, also install the optional peer dependencies:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install @openai/agents openai
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Requires Node `>= 22`. ESM only.
|
|
20
|
+
|
|
21
|
+
## What's exported
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import {
|
|
25
|
+
// Config
|
|
26
|
+
loadConfigFromFile,
|
|
27
|
+
parseConfig,
|
|
28
|
+
multiModelConfigSchema,
|
|
29
|
+
|
|
30
|
+
// Provider factory + dispatch
|
|
31
|
+
createProvider,
|
|
32
|
+
runTasks,
|
|
33
|
+
|
|
34
|
+
// Routing helpers
|
|
35
|
+
selectProviderForTask,
|
|
36
|
+
getProviderEligibility,
|
|
37
|
+
getBaseCapabilities,
|
|
38
|
+
resolveTaskCapabilities,
|
|
39
|
+
findModelProfile,
|
|
40
|
+
getEffectiveCostTier,
|
|
41
|
+
} from '@zhixuan92/multi-model-agent-core';
|
|
42
|
+
|
|
43
|
+
import type {
|
|
44
|
+
MultiModelConfig,
|
|
45
|
+
ProviderConfig,
|
|
46
|
+
TaskSpec,
|
|
47
|
+
RunResult,
|
|
48
|
+
RunStatus,
|
|
49
|
+
Tier,
|
|
50
|
+
Capability,
|
|
51
|
+
CostTier,
|
|
52
|
+
Effort,
|
|
53
|
+
SandboxPolicy,
|
|
54
|
+
} from '@zhixuan92/multi-model-agent-core';
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Subpath exports are available for tree-shaking-friendly imports:
|
|
58
|
+
|
|
59
|
+
| Subpath | What |
|
|
60
|
+
| --- | --- |
|
|
61
|
+
| `./config/schema` | `parseConfig`, `multiModelConfigSchema` |
|
|
62
|
+
| `./config/load` | `loadConfigFromFile` |
|
|
63
|
+
| `./routing/capabilities` | base provider capability table |
|
|
64
|
+
| `./routing/model-profiles` | tier/cost defaults per model name prefix |
|
|
65
|
+
| `./routing/select-provider-for-task` | routing decision |
|
|
66
|
+
| `./routing/get-provider-eligibility` | per-provider eligibility breakdown with reasons |
|
|
67
|
+
| `./routing/resolve-task-capabilities` | merges per-task overrides into provider capabilities |
|
|
68
|
+
| `./provider` | `createProvider` factory |
|
|
69
|
+
| `./run-tasks` | `runTasks` parallel dispatcher |
|
|
70
|
+
| `./types` | all shared types |
|
|
71
|
+
|
|
72
|
+
## Quick example
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
import { runTasks } from '@zhixuan92/multi-model-agent-core';
|
|
76
|
+
|
|
77
|
+
const config = {
|
|
78
|
+
providers: {
|
|
79
|
+
claude: { type: 'claude', model: 'claude-sonnet-4-6' },
|
|
80
|
+
codex: { type: 'codex', model: 'gpt-5-codex' },
|
|
81
|
+
},
|
|
82
|
+
defaults: { maxTurns: 200, timeoutMs: 600_000, tools: 'full' },
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const results = await runTasks(
|
|
86
|
+
[
|
|
87
|
+
{ prompt: 'Refactor auth.ts to use JWT.', tier: 'reasoning', requiredCapabilities: ['file_read', 'file_write'] },
|
|
88
|
+
{ prompt: 'List all .ts files.', tier: 'trivial', requiredCapabilities: ['glob'] },
|
|
89
|
+
],
|
|
90
|
+
config,
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
for (const r of results) {
|
|
94
|
+
console.log(r.status, r.output);
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
`runTasks` runs each task on the cheapest eligible provider in parallel and returns a result per task. Pin a task to a specific provider by adding `provider: 'claude'`.
|
|
99
|
+
|
|
100
|
+
## Sandbox
|
|
101
|
+
|
|
102
|
+
File tools enforce `sandboxPolicy: 'cwd-only'` by default — paths must resolve (via `fs.realpath`) inside the task's `cwd`. `runShell` is hard-disabled under `cwd-only`. `readFile` rejects targets larger than 50 MiB and `writeFile` rejects content larger than 100 MiB before touching memory or disk.
|
|
103
|
+
|
|
104
|
+
## Documentation
|
|
105
|
+
|
|
106
|
+
Full docs, configuration reference, supported providers, and the routing matrix live in the project README:
|
|
107
|
+
|
|
108
|
+
→ **<https://github.com/zhixuan312/multi-model-agent#readme>**
|
|
109
|
+
|
|
110
|
+
## License
|
|
111
|
+
|
|
112
|
+
[MIT](./LICENSE) — Copyright (c) 2026 Zhang Zhixuan
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-oauth.d.ts","sourceRoot":"","sources":["../../src/auth/claude-oauth.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,aAAa,IAAI,UAAU,CAM1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-oauth.js","sourceRoot":"","sources":["../../src/auth/claude-oauth.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,aAAa;IAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC7C,OAAO;QACL,MAAM,EAAE,MAAM,IAAI,SAAS;QAC3B,QAAQ,EAAE,CAAC,MAAM;KAClB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-oauth.d.ts","sourceRoot":"","sources":["../../src/auth/codex-oauth.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AA8BD,wBAAgB,YAAY,IAAI,SAAS,GAAG,IAAI,CAgB/C"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
const CODEX_AUTH_PATH = () => path.join(os.homedir(), '.codex', 'auth.json');
|
|
5
|
+
// Track which paths we have already warned about so getCodexAuth() can be
|
|
6
|
+
// called repeatedly (it is, on every sub-agent dispatch) without spamming
|
|
7
|
+
// stderr with the same chmod warning.
|
|
8
|
+
const warnedPaths = new Set();
|
|
9
|
+
function warnIfWorldReadable(authPath) {
|
|
10
|
+
// Permission bits are POSIX-only. On Windows, mode bits are not meaningful.
|
|
11
|
+
if (process.platform === 'win32')
|
|
12
|
+
return;
|
|
13
|
+
if (warnedPaths.has(authPath))
|
|
14
|
+
return;
|
|
15
|
+
try {
|
|
16
|
+
const stats = fs.statSync(authPath);
|
|
17
|
+
const groupOrOtherReadable = (stats.mode & 0o077) !== 0;
|
|
18
|
+
if (groupOrOtherReadable) {
|
|
19
|
+
warnedPaths.add(authPath);
|
|
20
|
+
const mode = (stats.mode & 0o777).toString(8);
|
|
21
|
+
// eslint-disable-next-line no-console
|
|
22
|
+
console.warn(`[multi-model-agent] WARNING: ${authPath} has permissions 0${mode} ` +
|
|
23
|
+
`and is readable by other users on this system. Run \`chmod 600 ${authPath}\` ` +
|
|
24
|
+
`to restrict access to your Codex OAuth token.`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// statSync should not normally fail here (we just confirmed existsSync),
|
|
29
|
+
// but if it does there's nothing useful to warn about.
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function getCodexAuth() {
|
|
33
|
+
const authPath = CODEX_AUTH_PATH();
|
|
34
|
+
if (!fs.existsSync(authPath))
|
|
35
|
+
return null;
|
|
36
|
+
warnIfWorldReadable(authPath);
|
|
37
|
+
try {
|
|
38
|
+
const raw = JSON.parse(fs.readFileSync(authPath, 'utf-8'));
|
|
39
|
+
if (!raw.tokens?.access_token || !raw.tokens?.account_id)
|
|
40
|
+
return null;
|
|
41
|
+
return {
|
|
42
|
+
accessToken: raw.tokens.access_token,
|
|
43
|
+
accountId: raw.tokens.account_id,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=codex-oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-oauth.js","sourceRoot":"","sources":["../../src/auth/codex-oauth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;AAc7E,0EAA0E;AAC1E,0EAA0E;AAC1E,sCAAsC;AACtC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;AAEtC,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,4EAA4E;IAC5E,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO;IACzC,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO;IACtC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,oBAAoB,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,oBAAoB,EAAE,CAAC;YACzB,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1B,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC9C,sCAAsC;YACtC,OAAO,CAAC,IAAI,CACV,gCAAgC,QAAQ,qBAAqB,IAAI,GAAG;gBAClE,kEAAkE,QAAQ,KAAK;gBAC/E,+CAA+C,CAClD,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;QACzE,uDAAuD;IACzD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1C,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAkB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1E,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU;YAAE,OAAO,IAAI,CAAC;QACtE,OAAO;YACL,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY;YACpC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU;SACjC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { MultiModelConfig } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Load and parse a config file by path.
|
|
4
|
+
* No auto-lookup — callers must provide the path.
|
|
5
|
+
* Core has no knowledge of MULTI_MODEL_CONFIG env var or home-directory discovery.
|
|
6
|
+
*/
|
|
7
|
+
export declare function loadConfigFromFile(path: string): Promise<MultiModelConfig>;
|
|
8
|
+
//# sourceMappingURL=load.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA6BpD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiBhF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import { multiModelConfigSchema } from './schema.js';
|
|
3
|
+
/**
|
|
4
|
+
* Warn if any openai-compatible provider in the parsed config carries an
|
|
5
|
+
* inline `apiKey` instead of using `apiKeyEnv`. The schema permits both for
|
|
6
|
+
* backwards compatibility, but storing a plaintext API key in a config file
|
|
7
|
+
* that may end up in a backup, dotfile repo, or git is a footgun. We surface
|
|
8
|
+
* the issue at load time, once, so the operator notices.
|
|
9
|
+
*/
|
|
10
|
+
function warnOnInlineApiKey(config, configPath) {
|
|
11
|
+
const offenders = [];
|
|
12
|
+
for (const [name, provider] of Object.entries(config.providers)) {
|
|
13
|
+
if (provider.type === 'openai-compatible' &&
|
|
14
|
+
typeof provider.apiKey === 'string') {
|
|
15
|
+
offenders.push(name);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
if (offenders.length > 0) {
|
|
19
|
+
// eslint-disable-next-line no-console
|
|
20
|
+
console.warn(`[multi-model-agent] WARNING: ${configPath} stores an inline \`apiKey\` for ` +
|
|
21
|
+
`provider(s): ${offenders.join(', ')}. Prefer \`apiKeyEnv\` and read the key ` +
|
|
22
|
+
`from an environment variable so it never lands in version control.`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Load and parse a config file by path.
|
|
27
|
+
* No auto-lookup — callers must provide the path.
|
|
28
|
+
* Core has no knowledge of MULTI_MODEL_CONFIG env var or home-directory discovery.
|
|
29
|
+
*/
|
|
30
|
+
export async function loadConfigFromFile(path) {
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
fs.readFile(path, 'utf-8', (err, data) => {
|
|
33
|
+
if (err) {
|
|
34
|
+
reject(new Error(`Config file not found: ${path}`));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const raw = JSON.parse(data);
|
|
39
|
+
const parsed = multiModelConfigSchema.parse(raw);
|
|
40
|
+
warnOnInlineApiKey(parsed, path);
|
|
41
|
+
resolve(parsed);
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
reject(new Error(`Invalid config at ${path}: ${e instanceof Error ? e.message : String(e)}`));
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAGrD;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAC,MAAwB,EAAE,UAAkB;IACtE,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAChE,IACE,QAAQ,CAAC,IAAI,KAAK,mBAAmB;YACrC,OAAQ,QAAiC,CAAC,MAAM,KAAK,QAAQ,EAC7D,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,sCAAsC;QACtC,OAAO,CAAC,IAAI,CACV,gCAAgC,UAAU,mCAAmC;YAC3E,gBAAgB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,0CAA0C;YAC9E,oEAAoE,CACvE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY;IACnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACvC,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC7B,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACjD,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBACjC,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,IAAI,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChG,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { MultiModelConfig } from '../types.js';
|
|
3
|
+
export declare const codexProviderConfigSchema: z.ZodObject<{
|
|
4
|
+
type: z.ZodLiteral<"codex">;
|
|
5
|
+
model: z.ZodString;
|
|
6
|
+
effort: z.ZodOptional<z.ZodEnum<{
|
|
7
|
+
none: "none";
|
|
8
|
+
low: "low";
|
|
9
|
+
medium: "medium";
|
|
10
|
+
high: "high";
|
|
11
|
+
}>>;
|
|
12
|
+
maxTurns: z.ZodOptional<z.ZodNumber>;
|
|
13
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
sandboxPolicy: z.ZodOptional<z.ZodEnum<{
|
|
15
|
+
none: "none";
|
|
16
|
+
"cwd-only": "cwd-only";
|
|
17
|
+
}>>;
|
|
18
|
+
hostedTools: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
19
|
+
web_search: "web_search";
|
|
20
|
+
image_generation: "image_generation";
|
|
21
|
+
code_interpreter: "code_interpreter";
|
|
22
|
+
}>>>;
|
|
23
|
+
costTier: z.ZodOptional<z.ZodEnum<{
|
|
24
|
+
low: "low";
|
|
25
|
+
medium: "medium";
|
|
26
|
+
high: "high";
|
|
27
|
+
free: "free";
|
|
28
|
+
}>>;
|
|
29
|
+
}, z.core.$strip>;
|
|
30
|
+
export declare const claudeProviderConfigSchema: z.ZodObject<{
|
|
31
|
+
type: z.ZodLiteral<"claude">;
|
|
32
|
+
model: z.ZodString;
|
|
33
|
+
effort: z.ZodOptional<z.ZodEnum<{
|
|
34
|
+
none: "none";
|
|
35
|
+
low: "low";
|
|
36
|
+
medium: "medium";
|
|
37
|
+
high: "high";
|
|
38
|
+
}>>;
|
|
39
|
+
maxTurns: z.ZodOptional<z.ZodNumber>;
|
|
40
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
41
|
+
sandboxPolicy: z.ZodOptional<z.ZodEnum<{
|
|
42
|
+
none: "none";
|
|
43
|
+
"cwd-only": "cwd-only";
|
|
44
|
+
}>>;
|
|
45
|
+
hostedTools: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
46
|
+
web_search: "web_search";
|
|
47
|
+
image_generation: "image_generation";
|
|
48
|
+
code_interpreter: "code_interpreter";
|
|
49
|
+
}>>>;
|
|
50
|
+
costTier: z.ZodOptional<z.ZodEnum<{
|
|
51
|
+
low: "low";
|
|
52
|
+
medium: "medium";
|
|
53
|
+
high: "high";
|
|
54
|
+
free: "free";
|
|
55
|
+
}>>;
|
|
56
|
+
}, z.core.$strip>;
|
|
57
|
+
export declare const openAICompatibleProviderConfigSchema: z.ZodObject<{
|
|
58
|
+
type: z.ZodLiteral<"openai-compatible">;
|
|
59
|
+
model: z.ZodString;
|
|
60
|
+
baseUrl: z.ZodString;
|
|
61
|
+
apiKey: z.ZodOptional<z.ZodString>;
|
|
62
|
+
apiKeyEnv: z.ZodOptional<z.ZodString>;
|
|
63
|
+
effort: z.ZodOptional<z.ZodEnum<{
|
|
64
|
+
none: "none";
|
|
65
|
+
low: "low";
|
|
66
|
+
medium: "medium";
|
|
67
|
+
high: "high";
|
|
68
|
+
}>>;
|
|
69
|
+
maxTurns: z.ZodOptional<z.ZodNumber>;
|
|
70
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
71
|
+
sandboxPolicy: z.ZodOptional<z.ZodEnum<{
|
|
72
|
+
none: "none";
|
|
73
|
+
"cwd-only": "cwd-only";
|
|
74
|
+
}>>;
|
|
75
|
+
hostedTools: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
76
|
+
web_search: "web_search";
|
|
77
|
+
image_generation: "image_generation";
|
|
78
|
+
code_interpreter: "code_interpreter";
|
|
79
|
+
}>>>;
|
|
80
|
+
costTier: z.ZodOptional<z.ZodEnum<{
|
|
81
|
+
low: "low";
|
|
82
|
+
medium: "medium";
|
|
83
|
+
high: "high";
|
|
84
|
+
free: "free";
|
|
85
|
+
}>>;
|
|
86
|
+
}, z.core.$strip>;
|
|
87
|
+
export declare const providerConfigSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
88
|
+
type: z.ZodLiteral<"codex">;
|
|
89
|
+
model: z.ZodString;
|
|
90
|
+
effort: z.ZodOptional<z.ZodEnum<{
|
|
91
|
+
none: "none";
|
|
92
|
+
low: "low";
|
|
93
|
+
medium: "medium";
|
|
94
|
+
high: "high";
|
|
95
|
+
}>>;
|
|
96
|
+
maxTurns: z.ZodOptional<z.ZodNumber>;
|
|
97
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
98
|
+
sandboxPolicy: z.ZodOptional<z.ZodEnum<{
|
|
99
|
+
none: "none";
|
|
100
|
+
"cwd-only": "cwd-only";
|
|
101
|
+
}>>;
|
|
102
|
+
hostedTools: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
103
|
+
web_search: "web_search";
|
|
104
|
+
image_generation: "image_generation";
|
|
105
|
+
code_interpreter: "code_interpreter";
|
|
106
|
+
}>>>;
|
|
107
|
+
costTier: z.ZodOptional<z.ZodEnum<{
|
|
108
|
+
low: "low";
|
|
109
|
+
medium: "medium";
|
|
110
|
+
high: "high";
|
|
111
|
+
free: "free";
|
|
112
|
+
}>>;
|
|
113
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
114
|
+
type: z.ZodLiteral<"claude">;
|
|
115
|
+
model: z.ZodString;
|
|
116
|
+
effort: z.ZodOptional<z.ZodEnum<{
|
|
117
|
+
none: "none";
|
|
118
|
+
low: "low";
|
|
119
|
+
medium: "medium";
|
|
120
|
+
high: "high";
|
|
121
|
+
}>>;
|
|
122
|
+
maxTurns: z.ZodOptional<z.ZodNumber>;
|
|
123
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
124
|
+
sandboxPolicy: z.ZodOptional<z.ZodEnum<{
|
|
125
|
+
none: "none";
|
|
126
|
+
"cwd-only": "cwd-only";
|
|
127
|
+
}>>;
|
|
128
|
+
hostedTools: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
129
|
+
web_search: "web_search";
|
|
130
|
+
image_generation: "image_generation";
|
|
131
|
+
code_interpreter: "code_interpreter";
|
|
132
|
+
}>>>;
|
|
133
|
+
costTier: z.ZodOptional<z.ZodEnum<{
|
|
134
|
+
low: "low";
|
|
135
|
+
medium: "medium";
|
|
136
|
+
high: "high";
|
|
137
|
+
free: "free";
|
|
138
|
+
}>>;
|
|
139
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
140
|
+
type: z.ZodLiteral<"openai-compatible">;
|
|
141
|
+
model: z.ZodString;
|
|
142
|
+
baseUrl: z.ZodString;
|
|
143
|
+
apiKey: z.ZodOptional<z.ZodString>;
|
|
144
|
+
apiKeyEnv: z.ZodOptional<z.ZodString>;
|
|
145
|
+
effort: z.ZodOptional<z.ZodEnum<{
|
|
146
|
+
none: "none";
|
|
147
|
+
low: "low";
|
|
148
|
+
medium: "medium";
|
|
149
|
+
high: "high";
|
|
150
|
+
}>>;
|
|
151
|
+
maxTurns: z.ZodOptional<z.ZodNumber>;
|
|
152
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
153
|
+
sandboxPolicy: z.ZodOptional<z.ZodEnum<{
|
|
154
|
+
none: "none";
|
|
155
|
+
"cwd-only": "cwd-only";
|
|
156
|
+
}>>;
|
|
157
|
+
hostedTools: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
158
|
+
web_search: "web_search";
|
|
159
|
+
image_generation: "image_generation";
|
|
160
|
+
code_interpreter: "code_interpreter";
|
|
161
|
+
}>>>;
|
|
162
|
+
costTier: z.ZodOptional<z.ZodEnum<{
|
|
163
|
+
low: "low";
|
|
164
|
+
medium: "medium";
|
|
165
|
+
high: "high";
|
|
166
|
+
free: "free";
|
|
167
|
+
}>>;
|
|
168
|
+
}, z.core.$strip>], "type">;
|
|
169
|
+
export declare const multiModelConfigSchema: z.ZodObject<{
|
|
170
|
+
providers: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
171
|
+
type: z.ZodLiteral<"codex">;
|
|
172
|
+
model: z.ZodString;
|
|
173
|
+
effort: z.ZodOptional<z.ZodEnum<{
|
|
174
|
+
none: "none";
|
|
175
|
+
low: "low";
|
|
176
|
+
medium: "medium";
|
|
177
|
+
high: "high";
|
|
178
|
+
}>>;
|
|
179
|
+
maxTurns: z.ZodOptional<z.ZodNumber>;
|
|
180
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
181
|
+
sandboxPolicy: z.ZodOptional<z.ZodEnum<{
|
|
182
|
+
none: "none";
|
|
183
|
+
"cwd-only": "cwd-only";
|
|
184
|
+
}>>;
|
|
185
|
+
hostedTools: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
186
|
+
web_search: "web_search";
|
|
187
|
+
image_generation: "image_generation";
|
|
188
|
+
code_interpreter: "code_interpreter";
|
|
189
|
+
}>>>;
|
|
190
|
+
costTier: z.ZodOptional<z.ZodEnum<{
|
|
191
|
+
low: "low";
|
|
192
|
+
medium: "medium";
|
|
193
|
+
high: "high";
|
|
194
|
+
free: "free";
|
|
195
|
+
}>>;
|
|
196
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
197
|
+
type: z.ZodLiteral<"claude">;
|
|
198
|
+
model: z.ZodString;
|
|
199
|
+
effort: z.ZodOptional<z.ZodEnum<{
|
|
200
|
+
none: "none";
|
|
201
|
+
low: "low";
|
|
202
|
+
medium: "medium";
|
|
203
|
+
high: "high";
|
|
204
|
+
}>>;
|
|
205
|
+
maxTurns: z.ZodOptional<z.ZodNumber>;
|
|
206
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
207
|
+
sandboxPolicy: z.ZodOptional<z.ZodEnum<{
|
|
208
|
+
none: "none";
|
|
209
|
+
"cwd-only": "cwd-only";
|
|
210
|
+
}>>;
|
|
211
|
+
hostedTools: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
212
|
+
web_search: "web_search";
|
|
213
|
+
image_generation: "image_generation";
|
|
214
|
+
code_interpreter: "code_interpreter";
|
|
215
|
+
}>>>;
|
|
216
|
+
costTier: z.ZodOptional<z.ZodEnum<{
|
|
217
|
+
low: "low";
|
|
218
|
+
medium: "medium";
|
|
219
|
+
high: "high";
|
|
220
|
+
free: "free";
|
|
221
|
+
}>>;
|
|
222
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
223
|
+
type: z.ZodLiteral<"openai-compatible">;
|
|
224
|
+
model: z.ZodString;
|
|
225
|
+
baseUrl: z.ZodString;
|
|
226
|
+
apiKey: z.ZodOptional<z.ZodString>;
|
|
227
|
+
apiKeyEnv: z.ZodOptional<z.ZodString>;
|
|
228
|
+
effort: z.ZodOptional<z.ZodEnum<{
|
|
229
|
+
none: "none";
|
|
230
|
+
low: "low";
|
|
231
|
+
medium: "medium";
|
|
232
|
+
high: "high";
|
|
233
|
+
}>>;
|
|
234
|
+
maxTurns: z.ZodOptional<z.ZodNumber>;
|
|
235
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
236
|
+
sandboxPolicy: z.ZodOptional<z.ZodEnum<{
|
|
237
|
+
none: "none";
|
|
238
|
+
"cwd-only": "cwd-only";
|
|
239
|
+
}>>;
|
|
240
|
+
hostedTools: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
241
|
+
web_search: "web_search";
|
|
242
|
+
image_generation: "image_generation";
|
|
243
|
+
code_interpreter: "code_interpreter";
|
|
244
|
+
}>>>;
|
|
245
|
+
costTier: z.ZodOptional<z.ZodEnum<{
|
|
246
|
+
low: "low";
|
|
247
|
+
medium: "medium";
|
|
248
|
+
high: "high";
|
|
249
|
+
free: "free";
|
|
250
|
+
}>>;
|
|
251
|
+
}, z.core.$strip>], "type">>>;
|
|
252
|
+
defaults: z.ZodDefault<z.ZodObject<{
|
|
253
|
+
maxTurns: z.ZodDefault<z.ZodNumber>;
|
|
254
|
+
timeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
255
|
+
tools: z.ZodDefault<z.ZodEnum<{
|
|
256
|
+
none: "none";
|
|
257
|
+
full: "full";
|
|
258
|
+
}>>;
|
|
259
|
+
}, z.core.$strip>>;
|
|
260
|
+
}, z.core.$strip>;
|
|
261
|
+
export interface ParsedConfigSuccess {
|
|
262
|
+
config: MultiModelConfig;
|
|
263
|
+
success: true;
|
|
264
|
+
}
|
|
265
|
+
export interface ParsedConfigFailure {
|
|
266
|
+
success: false;
|
|
267
|
+
error: string;
|
|
268
|
+
}
|
|
269
|
+
export type ParseConfigResult = ParsedConfigSuccess | ParsedConfigFailure;
|
|
270
|
+
/**
|
|
271
|
+
* Parse a raw config object — validates schema, no side effects.
|
|
272
|
+
* Does NOT load from disk.
|
|
273
|
+
*/
|
|
274
|
+
export declare function parseConfig(raw: unknown): MultiModelConfig;
|
|
275
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAGV,gBAAgB,EAGjB,MAAM,aAAa,CAAC;AASrB,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;iBASpC,CAAC;AAEH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;iBASrC,CAAC;AAEH,eAAO,MAAM,oCAAoC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAY/C,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAI/B,CAAC;AAUH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAGjC,CAAC;AAEH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,gBAAgB,CAAA;IACxB,OAAO,EAAE,IAAI,CAAA;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,KAAK,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,GAAG,mBAAmB,CAAA;AAEzE;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CAE1D"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
// === Per-provider Zod schemas ===
|
|
3
|
+
const effortSchema = z.enum(['none', 'low', 'medium', 'high']);
|
|
4
|
+
const costTierSchema = z.enum(['free', 'low', 'medium', 'high']);
|
|
5
|
+
const hostedToolsSchema = z.array(z.enum(['web_search', 'image_generation', 'code_interpreter']));
|
|
6
|
+
const sandboxPolicySchema = z.enum(['none', 'cwd-only']).optional();
|
|
7
|
+
export const codexProviderConfigSchema = z.object({
|
|
8
|
+
type: z.literal('codex'),
|
|
9
|
+
model: z.string(),
|
|
10
|
+
effort: effortSchema.optional(),
|
|
11
|
+
maxTurns: z.number().int().positive().optional(),
|
|
12
|
+
timeoutMs: z.number().int().positive().optional(),
|
|
13
|
+
sandboxPolicy: sandboxPolicySchema,
|
|
14
|
+
hostedTools: hostedToolsSchema.optional(),
|
|
15
|
+
costTier: costTierSchema.optional(),
|
|
16
|
+
});
|
|
17
|
+
export const claudeProviderConfigSchema = z.object({
|
|
18
|
+
type: z.literal('claude'),
|
|
19
|
+
model: z.string(),
|
|
20
|
+
effort: effortSchema.optional(),
|
|
21
|
+
maxTurns: z.number().int().positive().optional(),
|
|
22
|
+
timeoutMs: z.number().int().positive().optional(),
|
|
23
|
+
sandboxPolicy: sandboxPolicySchema,
|
|
24
|
+
hostedTools: hostedToolsSchema.optional(),
|
|
25
|
+
costTier: costTierSchema.optional(),
|
|
26
|
+
});
|
|
27
|
+
export const openAICompatibleProviderConfigSchema = z.object({
|
|
28
|
+
type: z.literal('openai-compatible'),
|
|
29
|
+
model: z.string(),
|
|
30
|
+
baseUrl: z.string().min(1, 'baseUrl is required for openai-compatible providers'),
|
|
31
|
+
apiKey: z.string().optional(),
|
|
32
|
+
apiKeyEnv: z.string().optional(),
|
|
33
|
+
effort: effortSchema.optional(),
|
|
34
|
+
maxTurns: z.number().int().positive().optional(),
|
|
35
|
+
timeoutMs: z.number().int().positive().optional(),
|
|
36
|
+
sandboxPolicy: sandboxPolicySchema,
|
|
37
|
+
hostedTools: hostedToolsSchema.optional(),
|
|
38
|
+
costTier: costTierSchema.optional(),
|
|
39
|
+
});
|
|
40
|
+
export const providerConfigSchema = z.discriminatedUnion('type', [
|
|
41
|
+
codexProviderConfigSchema,
|
|
42
|
+
claudeProviderConfigSchema,
|
|
43
|
+
openAICompatibleProviderConfigSchema,
|
|
44
|
+
]);
|
|
45
|
+
// === MultiModelConfig schema ===
|
|
46
|
+
const defaultsSchema = z.object({
|
|
47
|
+
maxTurns: z.number().int().positive().default(200),
|
|
48
|
+
timeoutMs: z.number().int().positive().default(600_000),
|
|
49
|
+
tools: z.enum(['none', 'full']).default('full'),
|
|
50
|
+
}).default(() => ({ maxTurns: 200, timeoutMs: 600_000, tools: 'full' }));
|
|
51
|
+
export const multiModelConfigSchema = z.object({
|
|
52
|
+
providers: z.record(z.string(), providerConfigSchema).default({}),
|
|
53
|
+
defaults: defaultsSchema,
|
|
54
|
+
});
|
|
55
|
+
/**
|
|
56
|
+
* Parse a raw config object — validates schema, no side effects.
|
|
57
|
+
* Does NOT load from disk.
|
|
58
|
+
*/
|
|
59
|
+
export function parseConfig(raw) {
|
|
60
|
+
return multiModelConfigSchema.parse(raw);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { loadConfigFromFile } from './config/load.js';
|
|
2
|
+
export { parseConfig, multiModelConfigSchema } from './config/schema.js';
|
|
3
|
+
export type { Tier, Capability, ToolMode, SandboxPolicy, Effort, CostTier, RunStatus, TaskSpec, ProviderConfig, CodexProviderConfig, ClaudeProviderConfig, OpenAICompatibleProviderConfig, MultiModelConfig, TokenUsage, RunResult, Provider, RunOptions, EligibilityFailureCheck, EligibilityFailure, ProviderEligibility, } from './types.js';
|
|
4
|
+
export { createProvider } from './provider.js';
|
|
5
|
+
export { runTasks } from './run-tasks.js';
|
|
6
|
+
export { getBaseCapabilities } from './routing/capabilities.js';
|
|
7
|
+
export { resolveTaskCapabilities } from './routing/resolve-task-capabilities.js';
|
|
8
|
+
export { findModelProfile, getEffectiveCostTier } from './routing/model-profiles.js';
|
|
9
|
+
export { selectProviderForTask } from './routing/select-provider-for-task.js';
|
|
10
|
+
export { getProviderEligibility } from './routing/get-provider-eligibility.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAGzE,YAAY,EACV,IAAI,EACJ,UAAU,EACV,QAAQ,EACR,aAAa,EACb,MAAM,EACN,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,8BAA8B,EAC9B,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,QAAQ,EACR,UAAU,EACV,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC"}
|