@mcoda/core 0.1.40 → 0.1.42

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.
@@ -1 +1 @@
1
- {"version":3,"file":"AgentsApi.d.ts","sourceRoot":"","sources":["../../src/api/AgentsApi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AgentsApi.d.ts","sourceRoot":"","sources":["../../src/api/AgentsApi.ts"],"names":[],"mappings":"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"}
@@ -2,6 +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 isManagedMswarmAgent = (agent) => {
6
+ const config = agent.config;
7
+ if (!config || typeof config !== "object" || Array.isArray(config)) {
8
+ return false;
9
+ }
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
+ });
18
+ };
19
+ const shouldRefreshInventoryHealth = (agent) => !isManagedMswarmAgent(agent);
5
20
  const WINDOW_RESET_FALLBACK_MS = {
6
21
  rolling_5h: 5 * 60 * 60 * 1000,
7
22
  daily: 24 * 60 * 60 * 1000,
@@ -59,7 +74,8 @@ export class AgentsApi {
59
74
  async listAgents(options = {}) {
60
75
  const agents = await this.repo.listAgents();
61
76
  if (options.refreshHealth) {
62
- await Promise.all(agents.map((agent) => this.agentService.healthCheck(agent.id)));
77
+ const refreshableAgents = agents.filter((agent) => shouldRefreshInventoryHealth(agent));
78
+ await Promise.all(refreshableAgents.map((agent) => this.agentService.healthCheck(agent.id)));
63
79
  }
64
80
  const health = await this.repo.listAgentHealthSummary();
65
81
  const healthById = new Map(health.map((h) => [h.agentId, h]));
@@ -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;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,8BAA8B;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,wBAAwB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,IAAI,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAyB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,wBAAwB,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,+BAA+B;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AASD,eAAO,MAAM,6BAA6B,eAAe,CAAC;AAC1D,eAAO,MAAM,sBAAsB,sBAAsB,CAAC;AAsjB1D,qBAAa,SAAS;IAKlB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;gBAGd,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,wBAAwB;WAMvC,MAAM,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,CAAC;WAK1D,uBAAuB,CAClC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,+BAA+B,CAAC;IAwBrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,uBAAuB,IAAI,OAAO,CAAC,+BAA+B,CAAC;IAIzE,OAAO,CAAC,aAAa;YAOP,WAAW;IA6DnB,eAAe,CACnB,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAgBxB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAU5D,eAAe,CACnB,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,iBAAiB,CAAC;IAkIvB,gBAAgB,CACpB,aAAa,SAAgC,GAC5C,OAAO,CAAC,qBAAqB,CAAC;IAoB3B,uBAAuB,CAC3B,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,qBAAqB,CAAC;IAmB3B,aAAa,CACjB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAclD,mBAAmB,CACvB,KAAK,EAAE,8BAA8B,GACpC,OAAO,CAAC,0BAA0B,CAAC;CAgBvC"}
1
+ {"version":3,"file":"MswarmApi.d.ts","sourceRoot":"","sources":["../../src/api/MswarmApi.ts"],"names":[],"mappings":"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"}
@@ -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 isManagedMswarmConfig = (config) => {
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
- (!isManagedMswarmConfig(existing.config) ||
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 = isManagedMswarmConfig(localAgent.config)
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.40",
3
+ "version": "0.1.42",
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.40",
36
- "@mcoda/db": "0.1.40",
37
- "@mcoda/agents": "0.1.40",
38
- "@mcoda/integrations": "0.1.40",
39
- "@mcoda/generators": "0.1.40"
35
+ "@mcoda/db": "0.1.42",
36
+ "@mcoda/shared": "0.1.42",
37
+ "@mcoda/agents": "0.1.42",
38
+ "@mcoda/generators": "0.1.42",
39
+ "@mcoda/integrations": "0.1.42"
40
40
  },
41
41
  "scripts": {
42
42
  "build": "tsc -p tsconfig.json",