@antseed/cli 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/.env.example +15 -0
- package/README.md +169 -0
- package/dist/cli/commands/balance.d.ts +3 -0
- package/dist/cli/commands/balance.d.ts.map +1 -0
- package/dist/cli/commands/balance.js +64 -0
- package/dist/cli/commands/balance.js.map +1 -0
- package/dist/cli/commands/browse.d.ts +7 -0
- package/dist/cli/commands/browse.d.ts.map +1 -0
- package/dist/cli/commands/browse.js +100 -0
- package/dist/cli/commands/browse.js.map +1 -0
- package/dist/cli/commands/config.d.ts +20 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +239 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/connect.d.ts +14 -0
- package/dist/cli/commands/connect.d.ts.map +1 -0
- package/dist/cli/commands/connect.js +298 -0
- package/dist/cli/commands/connect.js.map +1 -0
- package/dist/cli/commands/connect.test.d.ts +2 -0
- package/dist/cli/commands/connect.test.d.ts.map +1 -0
- package/dist/cli/commands/connect.test.js +54 -0
- package/dist/cli/commands/connect.test.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +6 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.js +48 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/deposit.d.ts +3 -0
- package/dist/cli/commands/deposit.d.ts.map +1 -0
- package/dist/cli/commands/deposit.js +48 -0
- package/dist/cli/commands/deposit.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +3 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +94 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +91 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/plugin-create.d.ts +11 -0
- package/dist/cli/commands/plugin-create.d.ts.map +1 -0
- package/dist/cli/commands/plugin-create.js +201 -0
- package/dist/cli/commands/plugin-create.js.map +1 -0
- package/dist/cli/commands/plugin-create.test.d.ts +2 -0
- package/dist/cli/commands/plugin-create.test.d.ts.map +1 -0
- package/dist/cli/commands/plugin-create.test.js +53 -0
- package/dist/cli/commands/plugin-create.test.js.map +1 -0
- package/dist/cli/commands/plugin.d.ts +3 -0
- package/dist/cli/commands/plugin.d.ts.map +1 -0
- package/dist/cli/commands/plugin.js +279 -0
- package/dist/cli/commands/plugin.js.map +1 -0
- package/dist/cli/commands/plugin.test.d.ts +2 -0
- package/dist/cli/commands/plugin.test.d.ts.map +1 -0
- package/dist/cli/commands/plugin.test.js +53 -0
- package/dist/cli/commands/plugin.test.js.map +1 -0
- package/dist/cli/commands/profile.d.ts +10 -0
- package/dist/cli/commands/profile.d.ts.map +1 -0
- package/dist/cli/commands/profile.js +89 -0
- package/dist/cli/commands/profile.js.map +1 -0
- package/dist/cli/commands/seed.d.ts +11 -0
- package/dist/cli/commands/seed.d.ts.map +1 -0
- package/dist/cli/commands/seed.js +397 -0
- package/dist/cli/commands/seed.js.map +1 -0
- package/dist/cli/commands/seed.test.d.ts +2 -0
- package/dist/cli/commands/seed.test.d.ts.map +1 -0
- package/dist/cli/commands/seed.test.js +57 -0
- package/dist/cli/commands/seed.test.js.map +1 -0
- package/dist/cli/commands/status.d.ts +8 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +55 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/types.d.ts +14 -0
- package/dist/cli/commands/types.d.ts.map +1 -0
- package/dist/cli/commands/types.js +41 -0
- package/dist/cli/commands/types.js.map +1 -0
- package/dist/cli/commands/withdraw.d.ts +3 -0
- package/dist/cli/commands/withdraw.d.ts.map +1 -0
- package/dist/cli/commands/withdraw.js +48 -0
- package/dist/cli/commands/withdraw.js.map +1 -0
- package/dist/cli/formatters.d.ts +29 -0
- package/dist/cli/formatters.d.ts.map +1 -0
- package/dist/cli/formatters.js +67 -0
- package/dist/cli/formatters.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +41 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/shutdown.d.ts +11 -0
- package/dist/cli/shutdown.d.ts.map +1 -0
- package/dist/cli/shutdown.js +34 -0
- package/dist/cli/shutdown.js.map +1 -0
- package/dist/config/defaults.d.ts +6 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +48 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/effective.d.ts +26 -0
- package/dist/config/effective.d.ts.map +1 -0
- package/dist/config/effective.js +84 -0
- package/dist/config/effective.js.map +1 -0
- package/dist/config/effective.test.d.ts +2 -0
- package/dist/config/effective.test.d.ts.map +1 -0
- package/dist/config/effective.test.js +65 -0
- package/dist/config/effective.test.js.map +1 -0
- package/dist/config/loader.d.ts +12 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +212 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/loader.test.d.ts +2 -0
- package/dist/config/loader.test.d.ts.map +1 -0
- package/dist/config/loader.test.js +77 -0
- package/dist/config/loader.test.js.map +1 -0
- package/dist/config/types.d.ts +133 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validation.d.ts +10 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +50 -0
- package/dist/config/validation.js.map +1 -0
- package/dist/env/load-env.d.ts +6 -0
- package/dist/env/load-env.d.ts.map +1 -0
- package/dist/env/load-env.js +18 -0
- package/dist/env/load-env.js.map +1 -0
- package/dist/plugins/loader.d.ts +7 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +70 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/manager.d.ts +11 -0
- package/dist/plugins/manager.d.ts.map +1 -0
- package/dist/plugins/manager.js +52 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/plugins/registry.d.ts +8 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +39 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/proxy/buyer-proxy.d.ts +30 -0
- package/dist/proxy/buyer-proxy.d.ts.map +1 -0
- package/dist/proxy/buyer-proxy.js +488 -0
- package/dist/proxy/buyer-proxy.js.map +1 -0
- package/dist/status/node-status.d.ts +22 -0
- package/dist/status/node-status.d.ts.map +1 -0
- package/dist/status/node-status.js +83 -0
- package/dist/status/node-status.js.map +1 -0
- package/package.json +39 -0
- package/src/cli/commands/balance.ts +77 -0
- package/src/cli/commands/browse.ts +113 -0
- package/src/cli/commands/config.ts +271 -0
- package/src/cli/commands/connect.test.ts +69 -0
- package/src/cli/commands/connect.ts +342 -0
- package/src/cli/commands/dashboard.ts +59 -0
- package/src/cli/commands/deposit.ts +61 -0
- package/src/cli/commands/dev.ts +107 -0
- package/src/cli/commands/init.ts +99 -0
- package/src/cli/commands/plugin-create.test.ts +60 -0
- package/src/cli/commands/plugin-create.ts +230 -0
- package/src/cli/commands/plugin.test.ts +55 -0
- package/src/cli/commands/plugin.ts +295 -0
- package/src/cli/commands/profile.ts +95 -0
- package/src/cli/commands/seed.test.ts +70 -0
- package/src/cli/commands/seed.ts +447 -0
- package/src/cli/commands/status.ts +73 -0
- package/src/cli/commands/types.ts +56 -0
- package/src/cli/commands/withdraw.ts +61 -0
- package/src/cli/formatters.ts +64 -0
- package/src/cli/index.ts +46 -0
- package/src/cli/shutdown.ts +38 -0
- package/src/config/defaults.ts +49 -0
- package/src/config/effective.test.ts +80 -0
- package/src/config/effective.ts +119 -0
- package/src/config/loader.test.ts +95 -0
- package/src/config/loader.ts +251 -0
- package/src/config/types.ts +139 -0
- package/src/config/validation.ts +78 -0
- package/src/env/load-env.ts +20 -0
- package/src/plugins/loader.ts +96 -0
- package/src/plugins/manager.ts +66 -0
- package/src/plugins/registry.ts +45 -0
- package/src/proxy/buyer-proxy.ts +604 -0
- package/src/status/node-status.ts +105 -0
- package/tsconfig.json +9 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { createDefaultConfig } from './defaults.js';
|
|
5
|
+
import { assertValidConfig } from './validation.js';
|
|
6
|
+
/**
|
|
7
|
+
* Resolve a config path, expanding ~ to the user's home directory.
|
|
8
|
+
*/
|
|
9
|
+
function resolveConfigPath(configPath) {
|
|
10
|
+
if (configPath.startsWith('~')) {
|
|
11
|
+
return resolve(homedir(), configPath.slice(2));
|
|
12
|
+
}
|
|
13
|
+
return resolve(configPath);
|
|
14
|
+
}
|
|
15
|
+
function isRecord(value) {
|
|
16
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
17
|
+
}
|
|
18
|
+
function toFiniteOrNaN(value) {
|
|
19
|
+
return typeof value === 'number' ? value : Number.NaN;
|
|
20
|
+
}
|
|
21
|
+
function clonePricing(pricing) {
|
|
22
|
+
return {
|
|
23
|
+
inputUsdPerMillion: pricing.inputUsdPerMillion,
|
|
24
|
+
outputUsdPerMillion: pricing.outputUsdPerMillion,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function normalizeTokenPricing(value) {
|
|
28
|
+
if (!isRecord(value))
|
|
29
|
+
return null;
|
|
30
|
+
return {
|
|
31
|
+
inputUsdPerMillion: toFiniteOrNaN(value['inputUsdPerMillion']),
|
|
32
|
+
outputUsdPerMillion: toFiniteOrNaN(value['outputUsdPerMillion']),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function mergeTokenPricing(defaults, value) {
|
|
36
|
+
if (!isRecord(value)) {
|
|
37
|
+
return clonePricing(defaults);
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
inputUsdPerMillion: typeof value['inputUsdPerMillion'] === 'number'
|
|
41
|
+
? value['inputUsdPerMillion']
|
|
42
|
+
: defaults.inputUsdPerMillion,
|
|
43
|
+
outputUsdPerMillion: typeof value['outputUsdPerMillion'] === 'number'
|
|
44
|
+
? value['outputUsdPerMillion']
|
|
45
|
+
: defaults.outputUsdPerMillion,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function cloneProviderPricing(providers) {
|
|
49
|
+
if (!providers)
|
|
50
|
+
return undefined;
|
|
51
|
+
const out = {};
|
|
52
|
+
for (const [provider, cfg] of Object.entries(providers)) {
|
|
53
|
+
out[provider] = {
|
|
54
|
+
...(cfg.defaults ? { defaults: clonePricing(cfg.defaults) } : {}),
|
|
55
|
+
...(cfg.models ? { models: { ...cfg.models } } : {}),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
function mergeModelPricing(defaults, value) {
|
|
61
|
+
const out = {
|
|
62
|
+
...(defaults ?? {}),
|
|
63
|
+
};
|
|
64
|
+
if (isRecord(value)) {
|
|
65
|
+
for (const [model, rawPricing] of Object.entries(value)) {
|
|
66
|
+
const parsed = normalizeTokenPricing(rawPricing);
|
|
67
|
+
if (parsed) {
|
|
68
|
+
out[model] = parsed;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
73
|
+
}
|
|
74
|
+
function mergeProviderPricing(defaults, value) {
|
|
75
|
+
const out = cloneProviderPricing(defaults) ?? {};
|
|
76
|
+
if (isRecord(value)) {
|
|
77
|
+
for (const [provider, rawCfg] of Object.entries(value)) {
|
|
78
|
+
if (!isRecord(rawCfg))
|
|
79
|
+
continue;
|
|
80
|
+
const existing = out[provider];
|
|
81
|
+
const parsedDefaults = normalizeTokenPricing(rawCfg['defaults']);
|
|
82
|
+
const next = {
|
|
83
|
+
...(parsedDefaults ? { defaults: parsedDefaults } : (existing?.defaults ? { defaults: existing.defaults } : {})),
|
|
84
|
+
};
|
|
85
|
+
const mergedModels = mergeModelPricing(existing?.models, rawCfg['models']);
|
|
86
|
+
if (mergedModels) {
|
|
87
|
+
next.models = mergedModels;
|
|
88
|
+
}
|
|
89
|
+
if (next.defaults || next.models) {
|
|
90
|
+
out[provider] = next;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
95
|
+
}
|
|
96
|
+
function mergeHierarchicalPricing(defaults, value) {
|
|
97
|
+
if (!isRecord(value)) {
|
|
98
|
+
return {
|
|
99
|
+
defaults: clonePricing(defaults.defaults),
|
|
100
|
+
...(defaults.providers ? { providers: cloneProviderPricing(defaults.providers) } : {}),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const mergedProviders = mergeProviderPricing(defaults.providers, value['providers']);
|
|
104
|
+
return {
|
|
105
|
+
defaults: mergeTokenPricing(defaults.defaults, value['defaults']),
|
|
106
|
+
...(mergedProviders ? { providers: mergedProviders } : {}),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function mergeSellerConfig(defaults, value) {
|
|
110
|
+
if (!isRecord(value)) {
|
|
111
|
+
return {
|
|
112
|
+
reserveFloor: defaults.reserveFloor,
|
|
113
|
+
maxConcurrentBuyers: defaults.maxConcurrentBuyers,
|
|
114
|
+
enabledProviders: [...defaults.enabledProviders],
|
|
115
|
+
pricing: mergeHierarchicalPricing(defaults.pricing, undefined),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
reserveFloor: typeof value['reserveFloor'] === 'number'
|
|
120
|
+
? value['reserveFloor']
|
|
121
|
+
: defaults.reserveFloor,
|
|
122
|
+
maxConcurrentBuyers: typeof value['maxConcurrentBuyers'] === 'number'
|
|
123
|
+
? value['maxConcurrentBuyers']
|
|
124
|
+
: defaults.maxConcurrentBuyers,
|
|
125
|
+
enabledProviders: Array.isArray(value['enabledProviders'])
|
|
126
|
+
? value['enabledProviders'].filter((entry) => typeof entry === 'string')
|
|
127
|
+
: [...defaults.enabledProviders],
|
|
128
|
+
pricing: mergeHierarchicalPricing(defaults.pricing, value['pricing']),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function mergeBuyerConfig(defaults, value) {
|
|
132
|
+
if (!isRecord(value)) {
|
|
133
|
+
return {
|
|
134
|
+
preferredProviders: [...defaults.preferredProviders],
|
|
135
|
+
maxPricing: mergeHierarchicalPricing(defaults.maxPricing, undefined),
|
|
136
|
+
minPeerReputation: defaults.minPeerReputation,
|
|
137
|
+
proxyPort: defaults.proxyPort,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
preferredProviders: Array.isArray(value['preferredProviders'])
|
|
142
|
+
? value['preferredProviders'].filter((entry) => typeof entry === 'string')
|
|
143
|
+
: [...defaults.preferredProviders],
|
|
144
|
+
maxPricing: mergeHierarchicalPricing(defaults.maxPricing, value['maxPricing']),
|
|
145
|
+
minPeerReputation: typeof value['minPeerReputation'] === 'number'
|
|
146
|
+
? value['minPeerReputation']
|
|
147
|
+
: defaults.minPeerReputation,
|
|
148
|
+
proxyPort: typeof value['proxyPort'] === 'number'
|
|
149
|
+
? value['proxyPort']
|
|
150
|
+
: defaults.proxyPort,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Load configuration from a JSON file.
|
|
155
|
+
* Returns default configuration if the file does not exist.
|
|
156
|
+
*/
|
|
157
|
+
export async function loadConfig(configPath) {
|
|
158
|
+
const resolved = resolveConfigPath(configPath);
|
|
159
|
+
let raw;
|
|
160
|
+
try {
|
|
161
|
+
raw = await readFile(resolved, 'utf-8');
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
if (err.code === 'ENOENT') {
|
|
165
|
+
return createDefaultConfig();
|
|
166
|
+
}
|
|
167
|
+
throw err;
|
|
168
|
+
}
|
|
169
|
+
let parsedRaw;
|
|
170
|
+
try {
|
|
171
|
+
parsedRaw = JSON.parse(raw);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
console.warn(`Warning: Could not parse config at ${resolved}. Using defaults.`);
|
|
175
|
+
return createDefaultConfig();
|
|
176
|
+
}
|
|
177
|
+
const defaults = createDefaultConfig();
|
|
178
|
+
const parsed = isRecord(parsedRaw) ? parsedRaw : {};
|
|
179
|
+
const merged = {
|
|
180
|
+
...defaults,
|
|
181
|
+
...parsed,
|
|
182
|
+
identity: {
|
|
183
|
+
...defaults.identity,
|
|
184
|
+
...(isRecord(parsed['identity']) ? parsed['identity'] : {}),
|
|
185
|
+
},
|
|
186
|
+
seller: mergeSellerConfig(defaults.seller, parsed['seller']),
|
|
187
|
+
buyer: mergeBuyerConfig(defaults.buyer, parsed['buyer']),
|
|
188
|
+
payments: {
|
|
189
|
+
...defaults.payments,
|
|
190
|
+
...(isRecord(parsed['payments']) ? parsed['payments'] : {}),
|
|
191
|
+
},
|
|
192
|
+
network: {
|
|
193
|
+
...defaults.network,
|
|
194
|
+
...(isRecord(parsed['network']) ? parsed['network'] : {}),
|
|
195
|
+
},
|
|
196
|
+
providers: Array.isArray(parsed['providers'])
|
|
197
|
+
? parsed['providers']
|
|
198
|
+
: defaults.providers,
|
|
199
|
+
};
|
|
200
|
+
assertValidConfig(merged);
|
|
201
|
+
return merged;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Save configuration to a JSON file.
|
|
205
|
+
* Creates the directory if it doesn't exist.
|
|
206
|
+
*/
|
|
207
|
+
export async function saveConfig(configPath, config) {
|
|
208
|
+
const resolved = resolveConfigPath(configPath);
|
|
209
|
+
await mkdir(dirname(resolved), { recursive: true });
|
|
210
|
+
await writeFile(resolved, JSON.stringify(config, null, 2), 'utf-8');
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.test.d.ts","sourceRoot":"","sources":["../../src/config/loader.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test from 'node:test';
|
|
3
|
+
import { mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
import { loadConfig } from './loader.js';
|
|
7
|
+
async function withTempConfig(contents, fn) {
|
|
8
|
+
const dir = await mkdtemp(join(tmpdir(), 'antseed-cli-config-'));
|
|
9
|
+
const configPath = join(dir, 'config.json');
|
|
10
|
+
try {
|
|
11
|
+
await writeFile(configPath, contents, 'utf-8');
|
|
12
|
+
await fn(configPath);
|
|
13
|
+
}
|
|
14
|
+
finally {
|
|
15
|
+
await rm(dir, { recursive: true, force: true });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
test('loadConfig deep-merges nested hierarchical pricing without dropping defaults', async () => {
|
|
19
|
+
await withTempConfig(JSON.stringify({
|
|
20
|
+
seller: {
|
|
21
|
+
pricing: {
|
|
22
|
+
providers: {
|
|
23
|
+
anthropic: {
|
|
24
|
+
models: {
|
|
25
|
+
'claude-sonnet-4-5-20250929': {
|
|
26
|
+
inputUsdPerMillion: 12,
|
|
27
|
+
outputUsdPerMillion: 18,
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
buyer: {
|
|
35
|
+
maxPricing: {
|
|
36
|
+
providers: {
|
|
37
|
+
openai: {
|
|
38
|
+
defaults: {
|
|
39
|
+
inputUsdPerMillion: 55,
|
|
40
|
+
outputUsdPerMillion: 77,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
}), async (configPath) => {
|
|
47
|
+
const config = await loadConfig(configPath);
|
|
48
|
+
assert.equal(config.seller.pricing.defaults.inputUsdPerMillion, 10);
|
|
49
|
+
assert.equal(config.seller.pricing.defaults.outputUsdPerMillion, 10);
|
|
50
|
+
assert.equal(config.seller.pricing.providers?.anthropic?.models?.['claude-sonnet-4-5-20250929']?.inputUsdPerMillion, 12);
|
|
51
|
+
assert.equal(config.seller.pricing.providers?.anthropic?.models?.['claude-sonnet-4-5-20250929']?.outputUsdPerMillion, 18);
|
|
52
|
+
assert.equal(config.buyer.maxPricing.defaults.inputUsdPerMillion, 100);
|
|
53
|
+
assert.equal(config.buyer.maxPricing.defaults.outputUsdPerMillion, 100);
|
|
54
|
+
assert.equal(config.buyer.maxPricing.providers?.openai?.defaults?.inputUsdPerMillion, 55);
|
|
55
|
+
assert.equal(config.buyer.maxPricing.providers?.openai?.defaults?.outputUsdPerMillion, 77);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
test('loadConfig throws explicit validation error for incomplete model pricing', async () => {
|
|
59
|
+
await withTempConfig(JSON.stringify({
|
|
60
|
+
seller: {
|
|
61
|
+
pricing: {
|
|
62
|
+
providers: {
|
|
63
|
+
anthropic: {
|
|
64
|
+
models: {
|
|
65
|
+
broken: {
|
|
66
|
+
inputUsdPerMillion: 12,
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
}), async (configPath) => {
|
|
74
|
+
await assert.rejects(async () => loadConfig(configPath), /seller\.pricing\.providers\.anthropic\.models\.broken\.outputUsdPerMillion/);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=loader.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.test.js","sourceRoot":"","sources":["../../src/config/loader.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import type { ProviderType } from '@antseed/node';
|
|
2
|
+
/**
|
|
3
|
+
* Provider configuration for the Antseed config file.
|
|
4
|
+
* This is distinct from the provider.ts ProviderConfig used internally.
|
|
5
|
+
*/
|
|
6
|
+
export interface CLIProviderConfig {
|
|
7
|
+
/** Provider type identifier */
|
|
8
|
+
type: ProviderType;
|
|
9
|
+
/** API endpoint URL */
|
|
10
|
+
endpoint: string;
|
|
11
|
+
/** Name of the HTTP header used for authentication */
|
|
12
|
+
authHeaderName: string;
|
|
13
|
+
/** Auth token / API key value */
|
|
14
|
+
authValue: string;
|
|
15
|
+
/** Auth type: 'apikey' (default), 'oauth' (with refresh), or 'claude-code' (read from keychain) */
|
|
16
|
+
authType?: 'apikey' | 'oauth' | 'claude-code';
|
|
17
|
+
/** OAuth refresh token (required when authType is 'oauth') */
|
|
18
|
+
refreshToken?: string;
|
|
19
|
+
/** Token expiration timestamp in epoch ms (used with authType 'oauth') */
|
|
20
|
+
expiresAt?: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Re-export ProviderType for convenience in config commands.
|
|
24
|
+
*/
|
|
25
|
+
export type { ProviderType } from '@antseed/node';
|
|
26
|
+
/**
|
|
27
|
+
* Dual token pricing in USD per 1M tokens.
|
|
28
|
+
*/
|
|
29
|
+
export interface TokenPricingUsdPerMillion {
|
|
30
|
+
inputUsdPerMillion: number;
|
|
31
|
+
outputUsdPerMillion: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Provider-level optional defaults and per-model overrides.
|
|
35
|
+
*/
|
|
36
|
+
export interface ProviderPricingConfig {
|
|
37
|
+
defaults?: TokenPricingUsdPerMillion;
|
|
38
|
+
models?: Record<string, TokenPricingUsdPerMillion>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Hierarchical pricing with global defaults and optional provider/model overrides.
|
|
42
|
+
*/
|
|
43
|
+
export interface HierarchicalPricingConfig {
|
|
44
|
+
defaults: TokenPricingUsdPerMillion;
|
|
45
|
+
providers?: Record<string, ProviderPricingConfig>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Seller-specific configuration within the Antseed config.
|
|
49
|
+
*/
|
|
50
|
+
export interface SellerCLIConfig {
|
|
51
|
+
/** Reserve floor in messages per hour to keep for yourself */
|
|
52
|
+
reserveFloor: number;
|
|
53
|
+
/** Maximum number of concurrent buyer connections */
|
|
54
|
+
maxConcurrentBuyers: number;
|
|
55
|
+
/** Which provider types are enabled for selling */
|
|
56
|
+
enabledProviders: string[];
|
|
57
|
+
/** Seller offer pricing rules in USD per 1M tokens */
|
|
58
|
+
pricing: HierarchicalPricingConfig;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Buyer-specific configuration within the Antseed config.
|
|
62
|
+
*/
|
|
63
|
+
export interface BuyerCLIConfig {
|
|
64
|
+
/** Preferred provider types for purchasing */
|
|
65
|
+
preferredProviders: string[];
|
|
66
|
+
/** Buyer max willing-to-pay rules in USD per 1M tokens */
|
|
67
|
+
maxPricing: HierarchicalPricingConfig;
|
|
68
|
+
/** Minimum peer reputation score (0-100) */
|
|
69
|
+
minPeerReputation: number;
|
|
70
|
+
/** Local proxy listen port */
|
|
71
|
+
proxyPort: number;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Payment configuration within the Antseed config.
|
|
75
|
+
*/
|
|
76
|
+
export interface PaymentsCLIConfig {
|
|
77
|
+
/** Preferred payment method */
|
|
78
|
+
preferredMethod: 'crypto';
|
|
79
|
+
/** Platform fee rate (0-1) */
|
|
80
|
+
platformFeeRate: number;
|
|
81
|
+
/** Optional crypto settlement settings (Base network) */
|
|
82
|
+
crypto?: {
|
|
83
|
+
/** Chain identifier */
|
|
84
|
+
chainId: 'base-local' | 'base-sepolia' | 'base-mainnet';
|
|
85
|
+
/** Base JSON-RPC URL (e.g. http://127.0.0.1:8545 for local anvil) */
|
|
86
|
+
rpcUrl: string;
|
|
87
|
+
/** Deployed AntseedEscrow contract address */
|
|
88
|
+
escrowContractAddress: string;
|
|
89
|
+
/** USDC token contract address */
|
|
90
|
+
usdcContractAddress: string;
|
|
91
|
+
/** Default lock amount per session in human-readable USDC (e.g. "1" = 1 USDC) */
|
|
92
|
+
defaultLockAmountUSDC?: string;
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Network configuration within the Antseed config.
|
|
97
|
+
*/
|
|
98
|
+
export interface NetworkCLIConfig {
|
|
99
|
+
/** Additional bootstrap nodes for DHT discovery (host:port pairs) */
|
|
100
|
+
bootstrapNodes: string[];
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Top-level Antseed configuration structure.
|
|
104
|
+
*/
|
|
105
|
+
export interface AntseedConfig {
|
|
106
|
+
/** Node identity information (peer ID, display name) */
|
|
107
|
+
identity: {
|
|
108
|
+
displayName: string;
|
|
109
|
+
walletAddress?: string;
|
|
110
|
+
};
|
|
111
|
+
/** Configured LLM provider credentials */
|
|
112
|
+
providers: CLIProviderConfig[];
|
|
113
|
+
/** Seller mode settings */
|
|
114
|
+
seller: SellerCLIConfig;
|
|
115
|
+
/** Buyer mode settings */
|
|
116
|
+
buyer: BuyerCLIConfig;
|
|
117
|
+
/** Payment settings */
|
|
118
|
+
payments: PaymentsCLIConfig;
|
|
119
|
+
/** Network / DHT settings */
|
|
120
|
+
network: NetworkCLIConfig;
|
|
121
|
+
/** Installed plugins */
|
|
122
|
+
plugins?: {
|
|
123
|
+
name: string;
|
|
124
|
+
package: string;
|
|
125
|
+
installedAt: string;
|
|
126
|
+
}[];
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* ProviderConfig alias for use in config commands.
|
|
130
|
+
* Maps to CLIProviderConfig.
|
|
131
|
+
*/
|
|
132
|
+
export type ProviderConfig = CLIProviderConfig;
|
|
133
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AntseedConfig } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validate the full config and return all issues.
|
|
4
|
+
*/
|
|
5
|
+
export declare function validateConfig(config: AntseedConfig): string[];
|
|
6
|
+
/**
|
|
7
|
+
* Assert that config is valid. Throws with all discovered violations.
|
|
8
|
+
*/
|
|
9
|
+
export declare function assertValidConfig(config: AntseedConfig): void;
|
|
10
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,aAAa,EAEd,MAAM,YAAY,CAAC;AAqCpB;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAuB9D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAK7D"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
function validatePricingLeaf(path, value, errors) {
|
|
2
|
+
if (!Number.isFinite(value.inputUsdPerMillion) || value.inputUsdPerMillion < 0) {
|
|
3
|
+
errors.push(`${path}.inputUsdPerMillion must be a non-negative finite number`);
|
|
4
|
+
}
|
|
5
|
+
if (!Number.isFinite(value.outputUsdPerMillion) || value.outputUsdPerMillion < 0) {
|
|
6
|
+
errors.push(`${path}.outputUsdPerMillion must be a non-negative finite number`);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function validateHierarchicalPricing(path, pricing, errors) {
|
|
10
|
+
validatePricingLeaf(`${path}.defaults`, pricing.defaults, errors);
|
|
11
|
+
for (const [provider, providerPricing] of Object.entries(pricing.providers ?? {})) {
|
|
12
|
+
if (providerPricing.defaults) {
|
|
13
|
+
validatePricingLeaf(`${path}.providers.${provider}.defaults`, providerPricing.defaults, errors);
|
|
14
|
+
}
|
|
15
|
+
for (const [model, modelPricing] of Object.entries(providerPricing.models ?? {})) {
|
|
16
|
+
validatePricingLeaf(`${path}.providers.${provider}.models.${model}`, modelPricing, errors);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Validate the full config and return all issues.
|
|
22
|
+
*/
|
|
23
|
+
export function validateConfig(config) {
|
|
24
|
+
const errors = [];
|
|
25
|
+
validateHierarchicalPricing('seller.pricing', config.seller.pricing, errors);
|
|
26
|
+
validateHierarchicalPricing('buyer.maxPricing', config.buyer.maxPricing, errors);
|
|
27
|
+
if (!Number.isFinite(config.buyer.minPeerReputation) || config.buyer.minPeerReputation < 0 || config.buyer.minPeerReputation > 100) {
|
|
28
|
+
errors.push('buyer.minPeerReputation must be in range 0-100');
|
|
29
|
+
}
|
|
30
|
+
if (!Number.isInteger(config.buyer.proxyPort) || config.buyer.proxyPort < 1 || config.buyer.proxyPort > 65535) {
|
|
31
|
+
errors.push('buyer.proxyPort must be an integer in range 1-65535');
|
|
32
|
+
}
|
|
33
|
+
if (!Number.isInteger(config.seller.maxConcurrentBuyers) || config.seller.maxConcurrentBuyers < 1) {
|
|
34
|
+
errors.push('seller.maxConcurrentBuyers must be an integer >= 1');
|
|
35
|
+
}
|
|
36
|
+
if (!Number.isFinite(config.seller.reserveFloor) || config.seller.reserveFloor < 0) {
|
|
37
|
+
errors.push('seller.reserveFloor must be a non-negative finite number');
|
|
38
|
+
}
|
|
39
|
+
return errors;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Assert that config is valid. Throws with all discovered violations.
|
|
43
|
+
*/
|
|
44
|
+
export function assertValidConfig(config) {
|
|
45
|
+
const errors = validateConfig(config);
|
|
46
|
+
if (errors.length === 0)
|
|
47
|
+
return;
|
|
48
|
+
throw new Error(`Invalid config:\n- ${errors.join('\n- ')}`);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-env.d.ts","sourceRoot":"","sources":["../../src/env/load-env.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAQvC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import dotenv from 'dotenv';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
function applyEnvFile(filePath) {
|
|
4
|
+
dotenv.config({ path: filePath, override: false });
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Load runtime environment variables from .env files.
|
|
8
|
+
* Precedence: existing process.env > explicit env file > .env.local > .env
|
|
9
|
+
*/
|
|
10
|
+
export function loadEnvFromFiles() {
|
|
11
|
+
const explicit = process.env['ANTSEED_ENV_FILE'];
|
|
12
|
+
if (explicit) {
|
|
13
|
+
applyEnvFile(resolve(explicit));
|
|
14
|
+
}
|
|
15
|
+
applyEnvFile(resolve(process.cwd(), '.env.local'));
|
|
16
|
+
applyEnvFile(resolve(process.cwd(), '.env'));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=load-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-env.js","sourceRoot":"","sources":["../../src/env/load-env.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACjD,IAAI,QAAQ,EAAE,CAAC;QACb,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;IACnD,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AntseedProviderPlugin, AntseedRouterPlugin, PluginConfigKey } from '@antseed/node';
|
|
2
|
+
export declare function loadProviderPlugin(nameOrPackage: string): Promise<AntseedProviderPlugin>;
|
|
3
|
+
export declare function loadRouterPlugin(nameOrPackage: string): Promise<AntseedRouterPlugin>;
|
|
4
|
+
export declare function buildPluginConfig(configKeys: PluginConfigKey[], runtimeOverrides?: Record<string, string>, instanceConfig?: Record<string, string>): Record<string, string>;
|
|
5
|
+
/** Map legacy package names to current names */
|
|
6
|
+
export declare const LEGACY_PACKAGE_MAP: Record<string, string>;
|
|
7
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AA0DhG,wBAAsB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAE9F;AAED,wBAAsB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAE1F;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,eAAe,EAAE,EAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACzC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBxB;AAED,gDAAgD;AAChD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGrD,CAAA"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import path, { join } from 'node:path';
|
|
2
|
+
import { getPluginsDir } from './manager.js';
|
|
3
|
+
import { TRUSTED_PLUGINS } from './registry.js';
|
|
4
|
+
function resolvePackageName(nameOrPackage) {
|
|
5
|
+
const legacy = LEGACY_PACKAGE_MAP[nameOrPackage];
|
|
6
|
+
if (legacy)
|
|
7
|
+
return legacy;
|
|
8
|
+
const trusted = TRUSTED_PLUGINS.find(p => p.name === nameOrPackage);
|
|
9
|
+
return trusted?.package ?? nameOrPackage;
|
|
10
|
+
}
|
|
11
|
+
async function loadPlugin(nameOrPackage, kind, methodName) {
|
|
12
|
+
const pkgName = resolvePackageName(nameOrPackage);
|
|
13
|
+
const pluginsDir = getPluginsDir();
|
|
14
|
+
const pluginPath = join(pluginsDir, 'node_modules', pkgName, 'dist', 'index.js');
|
|
15
|
+
const resolved = path.resolve(pluginPath);
|
|
16
|
+
if (!resolved.startsWith(path.resolve(pluginsDir))) {
|
|
17
|
+
throw new Error(`Invalid plugin path: ${pkgName}`);
|
|
18
|
+
}
|
|
19
|
+
let mod;
|
|
20
|
+
try {
|
|
21
|
+
mod = await import(resolved);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
const cause = err instanceof Error ? err.message : String(err);
|
|
25
|
+
if (err &&
|
|
26
|
+
typeof err === 'object' &&
|
|
27
|
+
'code' in err &&
|
|
28
|
+
err.code === 'ERR_MODULE_NOT_FOUND') {
|
|
29
|
+
throw new Error(`Plugin "${pkgName}" not found. Install it with:\n antseed plugin add ${pkgName}`);
|
|
30
|
+
}
|
|
31
|
+
throw new Error(`Plugin "${pkgName}" failed to load from ${resolved}.\nCause: ${cause}`);
|
|
32
|
+
}
|
|
33
|
+
const plugin = mod.default;
|
|
34
|
+
if (!plugin || typeof plugin !== 'object' || plugin.type !== kind) {
|
|
35
|
+
throw new Error(`Plugin "${pkgName}" does not export a valid ${kind} plugin (expected default export with type: '${kind}')`);
|
|
36
|
+
}
|
|
37
|
+
if (typeof plugin[methodName] !== 'function') {
|
|
38
|
+
throw new Error(`Plugin "${pkgName}" does not implement ${methodName}()`);
|
|
39
|
+
}
|
|
40
|
+
return plugin;
|
|
41
|
+
}
|
|
42
|
+
export async function loadProviderPlugin(nameOrPackage) {
|
|
43
|
+
return loadPlugin(nameOrPackage, 'provider', 'createProvider');
|
|
44
|
+
}
|
|
45
|
+
export async function loadRouterPlugin(nameOrPackage) {
|
|
46
|
+
return loadPlugin(nameOrPackage, 'router', 'createRouter');
|
|
47
|
+
}
|
|
48
|
+
export function buildPluginConfig(configKeys, runtimeOverrides, instanceConfig) {
|
|
49
|
+
const config = {};
|
|
50
|
+
// Priority: instanceConfig (lowest) < env vars < runtime overrides (highest)
|
|
51
|
+
if (instanceConfig) {
|
|
52
|
+
Object.assign(config, instanceConfig);
|
|
53
|
+
}
|
|
54
|
+
for (const key of configKeys) {
|
|
55
|
+
const value = process.env[key.key];
|
|
56
|
+
if (value !== undefined) {
|
|
57
|
+
config[key.key] = value;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (runtimeOverrides) {
|
|
61
|
+
Object.assign(config, runtimeOverrides);
|
|
62
|
+
}
|
|
63
|
+
return config;
|
|
64
|
+
}
|
|
65
|
+
/** Map legacy package names to current names */
|
|
66
|
+
export const LEGACY_PACKAGE_MAP = {
|
|
67
|
+
'antseed-provider-anthropic': '@antseed/provider-claude-code',
|
|
68
|
+
'antseed-router-claude-code': '@antseed/router-local-proxy',
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=loader.js.map
|