@mcoda/core 0.1.41 → 0.1.43
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/dist/api/AgentsApi.d.ts.map +1 -1
- package/dist/api/AgentsApi.js +10 -7
- package/dist/api/MswarmApi.d.ts +41 -0
- package/dist/api/MswarmApi.d.ts.map +1 -1
- package/dist/api/MswarmApi.js +185 -5
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentsApi.d.ts","sourceRoot":"","sources":["../../src/api/AgentsApi.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,iBAAiB,EACjB,WAAW,EACX,mBAAmB,EACnB,qBAAqB,EAErB,gBAAgB,EAChB,gBAAgB,EAEjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAoB,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAEtE,MAAM,WAAW,aAAc,SAAQ,KAAK;IAC1C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,MAAM,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAwB,SAAQ,qBAAqB;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"AgentsApi.d.ts","sourceRoot":"","sources":["../../src/api/AgentsApi.ts"],"names":[],"mappings":"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"}
|
package/dist/api/AgentsApi.js
CHANGED
|
@@ -2,18 +2,21 @@ import { CryptoHelper, } from "@mcoda/shared";
|
|
|
2
2
|
import { GlobalRepository } from "@mcoda/db";
|
|
3
3
|
import { AgentService } from "@mcoda/agents";
|
|
4
4
|
import { RoutingService } from "../services/agents/RoutingService.js";
|
|
5
|
-
const
|
|
5
|
+
const isManagedMswarmAgent = (agent) => {
|
|
6
6
|
const config = agent.config;
|
|
7
7
|
if (!config || typeof config !== "object" || Array.isArray(config)) {
|
|
8
8
|
return false;
|
|
9
9
|
}
|
|
10
|
-
const
|
|
11
|
-
return
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
const record = config;
|
|
11
|
+
return ["mswarmCloud", "mswarmSelfHosted"].some((key) => {
|
|
12
|
+
const managed = record[key];
|
|
13
|
+
return Boolean(managed &&
|
|
14
|
+
typeof managed === "object" &&
|
|
15
|
+
!Array.isArray(managed) &&
|
|
16
|
+
managed.managed === true);
|
|
17
|
+
});
|
|
15
18
|
};
|
|
16
|
-
const shouldRefreshInventoryHealth = (agent) => !
|
|
19
|
+
const shouldRefreshInventoryHealth = (agent) => !isManagedMswarmAgent(agent);
|
|
17
20
|
const WINDOW_RESET_FALLBACK_MS = {
|
|
18
21
|
rolling_5h: 5 * 60 * 60 * 1000,
|
|
19
22
|
daily: 24 * 60 * 60 * 1000,
|
package/dist/api/MswarmApi.d.ts
CHANGED
|
@@ -26,6 +26,13 @@ export interface MswarmCloudAgent {
|
|
|
26
26
|
complexity_updated_at?: string;
|
|
27
27
|
sync?: Record<string, unknown>;
|
|
28
28
|
}
|
|
29
|
+
export interface MswarmSelfHostedAgent extends MswarmCloudAgent {
|
|
30
|
+
agent_slug?: string;
|
|
31
|
+
remote_slug?: string;
|
|
32
|
+
adapter?: string;
|
|
33
|
+
source_agent_id?: string;
|
|
34
|
+
source_agent_slug?: string;
|
|
35
|
+
}
|
|
29
36
|
export interface MswarmCloudAgentDetail extends MswarmCloudAgent {
|
|
30
37
|
pricing?: Record<string, unknown>;
|
|
31
38
|
supported_parameters?: string[];
|
|
@@ -33,6 +40,8 @@ export interface MswarmCloudAgentDetail extends MswarmCloudAgent {
|
|
|
33
40
|
moderation_status?: string;
|
|
34
41
|
mcoda_shape?: Record<string, unknown>;
|
|
35
42
|
}
|
|
43
|
+
export interface MswarmSelfHostedAgentDetail extends MswarmSelfHostedAgent, Omit<MswarmCloudAgentDetail, keyof MswarmCloudAgent> {
|
|
44
|
+
}
|
|
36
45
|
export interface ListMswarmCloudAgentsOptions {
|
|
37
46
|
provider?: string;
|
|
38
47
|
limit?: number;
|
|
@@ -42,12 +51,16 @@ export interface ListMswarmCloudAgentsOptions {
|
|
|
42
51
|
sortByCatalogRating?: boolean;
|
|
43
52
|
pruneMissing?: boolean;
|
|
44
53
|
}
|
|
54
|
+
export interface ListMswarmSelfHostedAgentsOptions extends ListMswarmCloudAgentsOptions {
|
|
55
|
+
includeUnreachable?: boolean;
|
|
56
|
+
}
|
|
45
57
|
export interface MswarmApiOptions {
|
|
46
58
|
baseUrl?: string;
|
|
47
59
|
openAiBaseUrl?: string;
|
|
48
60
|
apiKey?: string;
|
|
49
61
|
timeoutMs?: number;
|
|
50
62
|
agentSlugPrefix?: string;
|
|
63
|
+
selfHostedAgentSlugPrefix?: string;
|
|
51
64
|
}
|
|
52
65
|
export interface MswarmConsentResponse {
|
|
53
66
|
consent_token: string;
|
|
@@ -87,6 +100,7 @@ interface ResolvedMswarmApiOptions {
|
|
|
87
100
|
apiKey?: string;
|
|
88
101
|
timeoutMs: number;
|
|
89
102
|
agentSlugPrefix: string;
|
|
103
|
+
selfHostedAgentSlugPrefix: string;
|
|
90
104
|
}
|
|
91
105
|
export interface ManagedMswarmCloudConfig {
|
|
92
106
|
managed: true;
|
|
@@ -108,6 +122,29 @@ export interface ManagedMswarmAgentConfig extends Record<string, unknown> {
|
|
|
108
122
|
apiBaseUrl: string;
|
|
109
123
|
mswarmCloud: ManagedMswarmCloudConfig;
|
|
110
124
|
}
|
|
125
|
+
export interface ManagedMswarmSelfHostedConfig {
|
|
126
|
+
managed: true;
|
|
127
|
+
remoteSlug: string;
|
|
128
|
+
agentSlug: string;
|
|
129
|
+
provider: string;
|
|
130
|
+
adapter?: string;
|
|
131
|
+
sourceAgentSlug?: string;
|
|
132
|
+
nodeId?: string;
|
|
133
|
+
serverName?: string;
|
|
134
|
+
modelId?: string;
|
|
135
|
+
displayName?: string;
|
|
136
|
+
description?: string;
|
|
137
|
+
supportsReasoning?: boolean;
|
|
138
|
+
catalogBaseUrl: string;
|
|
139
|
+
openAiBaseUrl: string;
|
|
140
|
+
sync?: Record<string, unknown>;
|
|
141
|
+
syncedAt: string;
|
|
142
|
+
}
|
|
143
|
+
export interface ManagedMswarmSelfHostedAgentConfig extends Record<string, unknown> {
|
|
144
|
+
baseUrl: string;
|
|
145
|
+
apiBaseUrl: string;
|
|
146
|
+
mswarmSelfHosted: ManagedMswarmSelfHostedConfig;
|
|
147
|
+
}
|
|
111
148
|
export interface MswarmSyncRecord {
|
|
112
149
|
remoteSlug: string;
|
|
113
150
|
localSlug: string;
|
|
@@ -133,6 +170,7 @@ export declare class MswarmApi {
|
|
|
133
170
|
private readonly options;
|
|
134
171
|
readonly baseUrl: string;
|
|
135
172
|
readonly agentSlugPrefix: string;
|
|
173
|
+
readonly selfHostedAgentSlugPrefix: string;
|
|
136
174
|
constructor(repo: GlobalRepository, options: ResolvedMswarmApiOptions);
|
|
137
175
|
static create(options?: MswarmApiOptions): Promise<MswarmApi>;
|
|
138
176
|
static refreshManagedAgentAuth(apiKey: string): Promise<MswarmManagedAuthRefreshSummary>;
|
|
@@ -142,7 +180,10 @@ export declare class MswarmApi {
|
|
|
142
180
|
private requestJson;
|
|
143
181
|
listCloudAgents(options?: ListMswarmCloudAgentsOptions): Promise<MswarmCloudAgent[]>;
|
|
144
182
|
getCloudAgent(slug: string): Promise<MswarmCloudAgentDetail>;
|
|
183
|
+
listSelfHostedAgents(options?: ListMswarmSelfHostedAgentsOptions): Promise<MswarmSelfHostedAgent[]>;
|
|
184
|
+
getSelfHostedAgent(slug: string): Promise<MswarmSelfHostedAgentDetail>;
|
|
145
185
|
syncCloudAgents(options?: ListMswarmCloudAgentsOptions): Promise<MswarmSyncSummary>;
|
|
186
|
+
syncSelfHostedAgents(options?: ListMswarmSelfHostedAgentsOptions): Promise<MswarmSyncSummary>;
|
|
146
187
|
issuePaidConsent(policyVersion?: string): Promise<MswarmConsentResponse>;
|
|
147
188
|
registerFreeMcodaClient(options: RegisterFreeMcodaClientOptions): Promise<MswarmConsentResponse>;
|
|
148
189
|
revokeConsent(consentToken: string, reason?: string): Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MswarmApi.d.ts","sourceRoot":"","sources":["../../src/api/MswarmApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAY7C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"MswarmApi.d.ts","sourceRoot":"","sources":["../../src/api/MswarmApi.ts"],"names":[],"mappings":"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"}
|
package/dist/api/MswarmApi.js
CHANGED
|
@@ -4,6 +4,7 @@ import { MswarmConfigStore } from './MswarmConfigStore.js';
|
|
|
4
4
|
const DEFAULT_BASE_URL = 'https://api.mswarm.org/';
|
|
5
5
|
const DEFAULT_TIMEOUT_MS = 15000;
|
|
6
6
|
const DEFAULT_AGENT_SLUG_PREFIX = 'mswarm-cloud';
|
|
7
|
+
const DEFAULT_SELF_HOSTED_AGENT_SLUG_PREFIX = 'mswarm-self-hosted';
|
|
7
8
|
export const MSWARM_CONSENT_POLICY_VERSION = '2026-03-18';
|
|
8
9
|
export const MCODA_FREE_CLIENT_TYPE = 'free_mcoda_client';
|
|
9
10
|
const MCODA_PRODUCT_SLUG = 'mcoda';
|
|
@@ -71,10 +72,13 @@ const resolveOptions = async (options = {}) => {
|
|
|
71
72
|
const directApiKey = options.apiKey ?? process.env.MCODA_MSWARM_API_KEY;
|
|
72
73
|
const directTimeout = options.timeoutMs ?? envTimeout;
|
|
73
74
|
const directAgentSlugPrefix = options.agentSlugPrefix ?? process.env.MCODA_MSWARM_AGENT_SLUG_PREFIX;
|
|
75
|
+
const directSelfHostedAgentSlugPrefix = options.selfHostedAgentSlugPrefix ??
|
|
76
|
+
process.env.MCODA_MSWARM_SELF_HOSTED_AGENT_SLUG_PREFIX;
|
|
74
77
|
const needsStoredFallback = directBaseUrl === undefined ||
|
|
75
78
|
directApiKey === undefined ||
|
|
76
79
|
directTimeout === undefined ||
|
|
77
|
-
directAgentSlugPrefix === undefined
|
|
80
|
+
directAgentSlugPrefix === undefined ||
|
|
81
|
+
directSelfHostedAgentSlugPrefix === undefined;
|
|
78
82
|
const stored = needsStoredFallback
|
|
79
83
|
? await new MswarmConfigStore().readState()
|
|
80
84
|
: {};
|
|
@@ -87,6 +91,8 @@ const resolveOptions = async (options = {}) => {
|
|
|
87
91
|
timeoutMs: normalizePositiveInt(directTimeout ?? stored.timeoutMs, 'MCODA_MSWARM_TIMEOUT_MS', DEFAULT_TIMEOUT_MS),
|
|
88
92
|
agentSlugPrefix: resolveString(directAgentSlugPrefix ?? stored.agentSlugPrefix) ??
|
|
89
93
|
DEFAULT_AGENT_SLUG_PREFIX,
|
|
94
|
+
selfHostedAgentSlugPrefix: resolveString(directSelfHostedAgentSlugPrefix) ??
|
|
95
|
+
DEFAULT_SELF_HOSTED_AGENT_SLUG_PREFIX,
|
|
90
96
|
};
|
|
91
97
|
};
|
|
92
98
|
const uniqueStrings = (values) => Array.from(new Set(values.filter((value) => value.trim().length > 0)));
|
|
@@ -198,7 +204,8 @@ const toHealthStatus = (value) => {
|
|
|
198
204
|
};
|
|
199
205
|
const isSyncManagedHealth = (health) => isRecord(health?.details) &&
|
|
200
206
|
(health.details.source === 'mswarm' ||
|
|
201
|
-
health.details.source === 'mswarm_catalog'
|
|
207
|
+
health.details.source === 'mswarm_catalog' ||
|
|
208
|
+
health.details.source === 'mswarm_self_hosted');
|
|
202
209
|
const isAuthMissingManagedHealth = (health) => {
|
|
203
210
|
if (!isRecord(health?.details))
|
|
204
211
|
return false;
|
|
@@ -209,13 +216,21 @@ const isAuthMissingManagedHealth = (health) => {
|
|
|
209
216
|
/missing the synced API key/i.test(error));
|
|
210
217
|
};
|
|
211
218
|
const shouldReplaceManagedHealth = (health) => !health || isSyncManagedHealth(health) || isAuthMissingManagedHealth(health);
|
|
212
|
-
const
|
|
219
|
+
const isManagedMswarmCloudConfig = (config) => {
|
|
213
220
|
if (!isRecord(config))
|
|
214
221
|
return false;
|
|
215
222
|
if (!isRecord(config.mswarmCloud))
|
|
216
223
|
return false;
|
|
217
224
|
return config.mswarmCloud.managed === true;
|
|
218
225
|
};
|
|
226
|
+
const isManagedMswarmSelfHostedConfig = (config) => {
|
|
227
|
+
if (!isRecord(config))
|
|
228
|
+
return false;
|
|
229
|
+
if (!isRecord(config.mswarmSelfHosted))
|
|
230
|
+
return false;
|
|
231
|
+
return config.mswarmSelfHosted.managed === true;
|
|
232
|
+
};
|
|
233
|
+
const isManagedMswarmConfig = (config) => isManagedMswarmCloudConfig(config) || isManagedMswarmSelfHostedConfig(config);
|
|
219
234
|
const toManagedConfig = (existingConfig, catalogBaseUrl, openAiBaseUrl, agent, syncedAt) => {
|
|
220
235
|
const nextConfig = {
|
|
221
236
|
...(existingConfig ?? {}),
|
|
@@ -239,6 +254,33 @@ const toManagedConfig = (existingConfig, catalogBaseUrl, openAiBaseUrl, agent, s
|
|
|
239
254
|
};
|
|
240
255
|
return nextConfig;
|
|
241
256
|
};
|
|
257
|
+
const toManagedSelfHostedConfig = (existingConfig, catalogBaseUrl, openAiBaseUrl, agent, syncedAt) => {
|
|
258
|
+
const sync = isRecord(agent.sync) ? agent.sync : {};
|
|
259
|
+
const nextConfig = {
|
|
260
|
+
...(existingConfig ?? {}),
|
|
261
|
+
baseUrl: openAiBaseUrl,
|
|
262
|
+
apiBaseUrl: openAiBaseUrl,
|
|
263
|
+
mswarmSelfHosted: {
|
|
264
|
+
managed: true,
|
|
265
|
+
remoteSlug: agent.remote_slug ?? agent.slug,
|
|
266
|
+
agentSlug: agent.agent_slug ?? agent.slug,
|
|
267
|
+
provider: agent.provider,
|
|
268
|
+
adapter: agent.adapter,
|
|
269
|
+
sourceAgentSlug: agent.source_agent_slug,
|
|
270
|
+
nodeId: resolveString(sync.node_id),
|
|
271
|
+
serverName: resolveString(sync.server_name),
|
|
272
|
+
modelId: agent.model_id,
|
|
273
|
+
displayName: agent.display_name,
|
|
274
|
+
description: agent.description,
|
|
275
|
+
supportsReasoning: agent.supports_reasoning,
|
|
276
|
+
catalogBaseUrl,
|
|
277
|
+
openAiBaseUrl,
|
|
278
|
+
sync: Object.keys(sync).length > 0 ? sync : undefined,
|
|
279
|
+
syncedAt,
|
|
280
|
+
},
|
|
281
|
+
};
|
|
282
|
+
return nextConfig;
|
|
283
|
+
};
|
|
242
284
|
const toManagedSyncRecord = (config, localSlug, defaultModel, action) => ({
|
|
243
285
|
remoteSlug: config.mswarmCloud.remoteSlug,
|
|
244
286
|
localSlug,
|
|
@@ -247,6 +289,13 @@ const toManagedSyncRecord = (config, localSlug, defaultModel, action) => ({
|
|
|
247
289
|
defaultModel,
|
|
248
290
|
pricingVersion: config.mswarmCloud.pricingVersion,
|
|
249
291
|
});
|
|
292
|
+
const toManagedSelfHostedSyncRecord = (config, localSlug, defaultModel, action) => ({
|
|
293
|
+
remoteSlug: config.mswarmSelfHosted.remoteSlug,
|
|
294
|
+
localSlug,
|
|
295
|
+
action,
|
|
296
|
+
provider: config.mswarmSelfHosted.provider,
|
|
297
|
+
defaultModel,
|
|
298
|
+
});
|
|
250
299
|
const toCloudAgent = (value) => {
|
|
251
300
|
if (!isRecord(value)) {
|
|
252
301
|
throw new Error('mswarm returned an invalid cloud-agent payload');
|
|
@@ -298,6 +347,30 @@ const toCloudAgentDetail = (value) => {
|
|
|
298
347
|
mcoda_shape: isRecord(record.mcoda_shape) ? record.mcoda_shape : undefined,
|
|
299
348
|
};
|
|
300
349
|
};
|
|
350
|
+
const toSelfHostedAgent = (value) => {
|
|
351
|
+
const agent = toCloudAgent(value);
|
|
352
|
+
const record = isRecord(value) ? value : {};
|
|
353
|
+
return {
|
|
354
|
+
...agent,
|
|
355
|
+
agent_slug: resolveString(record.agent_slug),
|
|
356
|
+
remote_slug: resolveString(record.remote_slug),
|
|
357
|
+
adapter: resolveString(record.adapter),
|
|
358
|
+
source_agent_id: resolveString(record.source_agent_id),
|
|
359
|
+
source_agent_slug: resolveString(record.source_agent_slug),
|
|
360
|
+
};
|
|
361
|
+
};
|
|
362
|
+
const toSelfHostedAgentDetail = (value) => {
|
|
363
|
+
const agent = toSelfHostedAgent(value);
|
|
364
|
+
const record = isRecord(value) ? value : {};
|
|
365
|
+
return {
|
|
366
|
+
...agent,
|
|
367
|
+
pricing: isRecord(record.pricing) ? record.pricing : undefined,
|
|
368
|
+
supported_parameters: resolveStringArray(record.supported_parameters),
|
|
369
|
+
status: resolveString(record.status),
|
|
370
|
+
moderation_status: resolveString(record.moderation_status),
|
|
371
|
+
mcoda_shape: isRecord(record.mcoda_shape) ? record.mcoda_shape : undefined,
|
|
372
|
+
};
|
|
373
|
+
};
|
|
301
374
|
const hasAdvancedCloudAgentSelection = (options) => options.maxCostPerMillion !== undefined ||
|
|
302
375
|
options.minContextWindow !== undefined ||
|
|
303
376
|
options.minReasoningRating !== undefined ||
|
|
@@ -354,6 +427,7 @@ export class MswarmApi {
|
|
|
354
427
|
this.options = options;
|
|
355
428
|
this.baseUrl = options.baseUrl;
|
|
356
429
|
this.agentSlugPrefix = options.agentSlugPrefix;
|
|
430
|
+
this.selfHostedAgentSlugPrefix = options.selfHostedAgentSlugPrefix;
|
|
357
431
|
}
|
|
358
432
|
static async create(options = {}) {
|
|
359
433
|
const repo = await GlobalRepository.create();
|
|
@@ -463,6 +537,29 @@ export class MswarmApi {
|
|
|
463
537
|
const payload = await this.requestJson(`/v1/swarm/cloud/agents/${encodeURIComponent(slug)}`);
|
|
464
538
|
return toCloudAgentDetail(payload);
|
|
465
539
|
}
|
|
540
|
+
async listSelfHostedAgents(options = {}) {
|
|
541
|
+
const remoteLimit = hasAdvancedCloudAgentSelection(options)
|
|
542
|
+
? undefined
|
|
543
|
+
: options.limit;
|
|
544
|
+
const payload = await this.requestJson('/v1/swarm/self-hosted/agents', {
|
|
545
|
+
shape: 'mcoda',
|
|
546
|
+
provider: options.provider,
|
|
547
|
+
limit: remoteLimit,
|
|
548
|
+
include_unreachable: options.includeUnreachable ? 'true' : undefined,
|
|
549
|
+
});
|
|
550
|
+
let agents = (Array.isArray(payload.agents) ? payload.agents : []).map(toSelfHostedAgent);
|
|
551
|
+
if (options.provider) {
|
|
552
|
+
agents = agents.filter((agent) => agent.provider === options.provider);
|
|
553
|
+
}
|
|
554
|
+
return applyCloudAgentListOptions(agents, options);
|
|
555
|
+
}
|
|
556
|
+
async getSelfHostedAgent(slug) {
|
|
557
|
+
if (!slug.trim()) {
|
|
558
|
+
throw new Error('Self-hosted agent slug is required');
|
|
559
|
+
}
|
|
560
|
+
const payload = await this.requestJson(`/v1/swarm/self-hosted/agents/${encodeURIComponent(slug)}`);
|
|
561
|
+
return toSelfHostedAgentDetail(payload);
|
|
562
|
+
}
|
|
466
563
|
async syncCloudAgents(options = {}) {
|
|
467
564
|
if (options.pruneMissing &&
|
|
468
565
|
(options.limit !== undefined || hasAdvancedCloudAgentSelection(options))) {
|
|
@@ -478,7 +575,7 @@ export class MswarmApi {
|
|
|
478
575
|
const localSlug = toManagedLocalSlug(this.options.agentSlugPrefix, agent.slug);
|
|
479
576
|
const existing = await this.repo.getAgentBySlug(localSlug);
|
|
480
577
|
if (existing &&
|
|
481
|
-
(!
|
|
578
|
+
(!isManagedMswarmCloudConfig(existing.config) ||
|
|
482
579
|
existing.config.mswarmCloud.remoteSlug !== agent.slug)) {
|
|
483
580
|
throw new Error(`Refusing to overwrite non-mswarm agent ${localSlug}`);
|
|
484
581
|
}
|
|
@@ -519,7 +616,7 @@ export class MswarmApi {
|
|
|
519
616
|
const remoteSlugs = new Set(agents.map((agent) => agent.slug));
|
|
520
617
|
const localAgents = await this.repo.listAgents();
|
|
521
618
|
for (const localAgent of localAgents) {
|
|
522
|
-
const managedConfig =
|
|
619
|
+
const managedConfig = isManagedMswarmCloudConfig(localAgent.config)
|
|
523
620
|
? localAgent.config
|
|
524
621
|
: undefined;
|
|
525
622
|
if (!managedConfig)
|
|
@@ -541,6 +638,89 @@ export class MswarmApi {
|
|
|
541
638
|
agents: records,
|
|
542
639
|
};
|
|
543
640
|
}
|
|
641
|
+
async syncSelfHostedAgents(options = {}) {
|
|
642
|
+
if (options.pruneMissing &&
|
|
643
|
+
(options.limit !== undefined || hasAdvancedCloudAgentSelection(options))) {
|
|
644
|
+
throw new Error('pruneMissing cannot be combined with limit or advanced self-hosted agent filters');
|
|
645
|
+
}
|
|
646
|
+
const agents = await this.listSelfHostedAgents(options);
|
|
647
|
+
const openAiBaseUrl = this.options.openAiBaseUrl ??
|
|
648
|
+
new URL('/v1/swarm/self-hosted/openai/', this.options.baseUrl).toString();
|
|
649
|
+
const syncedAt = new Date().toISOString();
|
|
650
|
+
const encryptedApiKey = await CryptoHelper.encryptSecret(this.requireApiKey());
|
|
651
|
+
const records = [];
|
|
652
|
+
for (const agent of agents) {
|
|
653
|
+
const localSlug = toManagedLocalSlug(this.options.selfHostedAgentSlugPrefix, agent.slug);
|
|
654
|
+
const existing = await this.repo.getAgentBySlug(localSlug);
|
|
655
|
+
const remoteSlug = agent.remote_slug ?? agent.slug;
|
|
656
|
+
if (existing &&
|
|
657
|
+
(!isManagedMswarmSelfHostedConfig(existing.config) ||
|
|
658
|
+
existing.config.mswarmSelfHosted.remoteSlug !== remoteSlug)) {
|
|
659
|
+
throw new Error(`Refusing to overwrite non-mswarm agent ${localSlug}`);
|
|
660
|
+
}
|
|
661
|
+
const existingConfig = existing && isRecord(existing.config)
|
|
662
|
+
? existing.config
|
|
663
|
+
: undefined;
|
|
664
|
+
const nextConfig = toManagedSelfHostedConfig(existingConfig, this.options.baseUrl, openAiBaseUrl, agent, syncedAt);
|
|
665
|
+
const createInput = toSyncedAgentInput(existing, agent, localSlug, nextConfig, syncedAt);
|
|
666
|
+
const { slug: _ignoredSlug, ...updateInput } = createInput;
|
|
667
|
+
const stored = existing
|
|
668
|
+
? await this.repo.updateAgent(existing.id, updateInput)
|
|
669
|
+
: await this.repo.createAgent(createInput);
|
|
670
|
+
if (!stored) {
|
|
671
|
+
throw new Error(`Failed to persist synced agent ${localSlug}`);
|
|
672
|
+
}
|
|
673
|
+
await this.repo.setAgentModels(stored.id, toAgentModels(stored.id, agent));
|
|
674
|
+
await this.repo.setAgentAuth(stored.id, encryptedApiKey);
|
|
675
|
+
const existingHealth = existing
|
|
676
|
+
? await this.repo.getAgentHealth(existing.id)
|
|
677
|
+
: undefined;
|
|
678
|
+
const mappedHealth = toHealthStatus(agent.health_status);
|
|
679
|
+
if (mappedHealth && shouldReplaceManagedHealth(existingHealth)) {
|
|
680
|
+
const health = {
|
|
681
|
+
agentId: stored.id,
|
|
682
|
+
status: mappedHealth,
|
|
683
|
+
lastCheckedAt: syncedAt,
|
|
684
|
+
details: {
|
|
685
|
+
source: 'mswarm_self_hosted',
|
|
686
|
+
remoteSlug,
|
|
687
|
+
agentSlug: agent.agent_slug ?? agent.slug,
|
|
688
|
+
provider: agent.provider,
|
|
689
|
+
remoteHealthStatus: agent.health_status,
|
|
690
|
+
},
|
|
691
|
+
};
|
|
692
|
+
await this.repo.setAgentHealth(health);
|
|
693
|
+
}
|
|
694
|
+
records.push(toManagedSelfHostedSyncRecord(nextConfig, localSlug, agent.default_model, existing ? 'updated' : 'created'));
|
|
695
|
+
}
|
|
696
|
+
if (options.pruneMissing) {
|
|
697
|
+
const remoteSlugs = new Set(agents.map((agent) => agent.remote_slug ?? agent.slug));
|
|
698
|
+
const localAgents = await this.repo.listAgents();
|
|
699
|
+
for (const localAgent of localAgents) {
|
|
700
|
+
const managedConfig = isManagedMswarmSelfHostedConfig(localAgent.config)
|
|
701
|
+
? localAgent.config
|
|
702
|
+
: undefined;
|
|
703
|
+
if (!managedConfig)
|
|
704
|
+
continue;
|
|
705
|
+
if (options.provider &&
|
|
706
|
+
managedConfig.mswarmSelfHosted.provider !== options.provider) {
|
|
707
|
+
continue;
|
|
708
|
+
}
|
|
709
|
+
if (remoteSlugs.has(managedConfig.mswarmSelfHosted.remoteSlug))
|
|
710
|
+
continue;
|
|
711
|
+
await this.repo.deleteAgent(localAgent.id);
|
|
712
|
+
records.push(toManagedSelfHostedSyncRecord(managedConfig, localAgent.slug, localAgent.defaultModel ??
|
|
713
|
+
managedConfig.mswarmSelfHosted.modelId ??
|
|
714
|
+
'-', 'deleted'));
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
return {
|
|
718
|
+
created: records.filter((record) => record.action === 'created').length,
|
|
719
|
+
updated: records.filter((record) => record.action === 'updated').length,
|
|
720
|
+
deleted: records.filter((record) => record.action === 'deleted').length,
|
|
721
|
+
agents: records,
|
|
722
|
+
};
|
|
723
|
+
}
|
|
544
724
|
async issuePaidConsent(policyVersion = MSWARM_CONSENT_POLICY_VERSION) {
|
|
545
725
|
const apiKey = this.requireApiKey();
|
|
546
726
|
return this.requestJson('/v1/swarm/consent/issue', undefined, {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcoda/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.43",
|
|
4
4
|
"description": "Core services and APIs for the mcoda CLI.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -32,11 +32,11 @@
|
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@apidevtools/swagger-parser": "^10.1.0",
|
|
34
34
|
"yaml": "^2.4.2",
|
|
35
|
-
"@mcoda/shared": "0.1.
|
|
36
|
-
"@mcoda/db": "0.1.
|
|
37
|
-
"@mcoda/agents": "0.1.
|
|
38
|
-
"@mcoda/generators": "0.1.
|
|
39
|
-
"@mcoda/integrations": "0.1.
|
|
35
|
+
"@mcoda/shared": "0.1.43",
|
|
36
|
+
"@mcoda/db": "0.1.43",
|
|
37
|
+
"@mcoda/agents": "0.1.43",
|
|
38
|
+
"@mcoda/generators": "0.1.43",
|
|
39
|
+
"@mcoda/integrations": "0.1.43"
|
|
40
40
|
},
|
|
41
41
|
"scripts": {
|
|
42
42
|
"build": "tsc -p tsconfig.json",
|