@mcoda/core 0.1.4
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/CHANGELOG.md +7 -0
- package/LICENSE +21 -0
- package/README.md +9 -0
- package/dist/api/AgentsApi.d.ts +36 -0
- package/dist/api/AgentsApi.d.ts.map +1 -0
- package/dist/api/AgentsApi.js +176 -0
- package/dist/api/QaTasksApi.d.ts +8 -0
- package/dist/api/QaTasksApi.d.ts.map +1 -0
- package/dist/api/QaTasksApi.js +36 -0
- package/dist/api/TasksApi.d.ts +7 -0
- package/dist/api/TasksApi.d.ts.map +1 -0
- package/dist/api/TasksApi.js +34 -0
- package/dist/config/ConfigService.d.ts +3 -0
- package/dist/config/ConfigService.d.ts.map +1 -0
- package/dist/config/ConfigService.js +2 -0
- package/dist/domain/dependencies/Dependency.d.ts +3 -0
- package/dist/domain/dependencies/Dependency.d.ts.map +1 -0
- package/dist/domain/dependencies/Dependency.js +2 -0
- package/dist/domain/epics/Epic.d.ts +3 -0
- package/dist/domain/epics/Epic.d.ts.map +1 -0
- package/dist/domain/epics/Epic.js +2 -0
- package/dist/domain/projects/Project.d.ts +3 -0
- package/dist/domain/projects/Project.d.ts.map +1 -0
- package/dist/domain/projects/Project.js +2 -0
- package/dist/domain/tasks/Task.d.ts +3 -0
- package/dist/domain/tasks/Task.d.ts.map +1 -0
- package/dist/domain/tasks/Task.js +2 -0
- package/dist/domain/userStories/UserStory.d.ts +3 -0
- package/dist/domain/userStories/UserStory.d.ts.map +1 -0
- package/dist/domain/userStories/UserStory.js +2 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/prompts/PdrPrompts.d.ts +4 -0
- package/dist/prompts/PdrPrompts.d.ts.map +1 -0
- package/dist/prompts/PdrPrompts.js +21 -0
- package/dist/prompts/PromptLoader.d.ts +3 -0
- package/dist/prompts/PromptLoader.d.ts.map +1 -0
- package/dist/prompts/PromptLoader.js +2 -0
- package/dist/prompts/SdsPrompts.d.ts +5 -0
- package/dist/prompts/SdsPrompts.d.ts.map +1 -0
- package/dist/prompts/SdsPrompts.js +44 -0
- package/dist/services/agents/AgentManagementService.d.ts +3 -0
- package/dist/services/agents/AgentManagementService.d.ts.map +1 -0
- package/dist/services/agents/AgentManagementService.js +2 -0
- package/dist/services/agents/GatewayAgentService.d.ts +92 -0
- package/dist/services/agents/GatewayAgentService.d.ts.map +1 -0
- package/dist/services/agents/GatewayAgentService.js +870 -0
- package/dist/services/agents/RoutingApiClient.d.ts +23 -0
- package/dist/services/agents/RoutingApiClient.d.ts.map +1 -0
- package/dist/services/agents/RoutingApiClient.js +62 -0
- package/dist/services/agents/RoutingService.d.ts +50 -0
- package/dist/services/agents/RoutingService.d.ts.map +1 -0
- package/dist/services/agents/RoutingService.js +386 -0
- package/dist/services/agents/generated/RoutingApiClient.d.ts +21 -0
- package/dist/services/agents/generated/RoutingApiClient.d.ts.map +1 -0
- package/dist/services/agents/generated/RoutingApiClient.js +68 -0
- package/dist/services/backlog/BacklogService.d.ts +98 -0
- package/dist/services/backlog/BacklogService.d.ts.map +1 -0
- package/dist/services/backlog/BacklogService.js +453 -0
- package/dist/services/backlog/TaskOrderingService.d.ts +88 -0
- package/dist/services/backlog/TaskOrderingService.d.ts.map +1 -0
- package/dist/services/backlog/TaskOrderingService.js +675 -0
- package/dist/services/docs/DocsService.d.ts +82 -0
- package/dist/services/docs/DocsService.d.ts.map +1 -0
- package/dist/services/docs/DocsService.js +1631 -0
- package/dist/services/estimate/EstimateService.d.ts +12 -0
- package/dist/services/estimate/EstimateService.d.ts.map +1 -0
- package/dist/services/estimate/EstimateService.js +103 -0
- package/dist/services/estimate/VelocityService.d.ts +19 -0
- package/dist/services/estimate/VelocityService.d.ts.map +1 -0
- package/dist/services/estimate/VelocityService.js +237 -0
- package/dist/services/estimate/types.d.ts +30 -0
- package/dist/services/estimate/types.d.ts.map +1 -0
- package/dist/services/estimate/types.js +1 -0
- package/dist/services/execution/ExecutionService.d.ts +3 -0
- package/dist/services/execution/ExecutionService.d.ts.map +1 -0
- package/dist/services/execution/ExecutionService.js +2 -0
- package/dist/services/execution/QaFollowupService.d.ts +38 -0
- package/dist/services/execution/QaFollowupService.d.ts.map +1 -0
- package/dist/services/execution/QaFollowupService.js +236 -0
- package/dist/services/execution/QaProfileService.d.ts +22 -0
- package/dist/services/execution/QaProfileService.d.ts.map +1 -0
- package/dist/services/execution/QaProfileService.js +142 -0
- package/dist/services/execution/QaTasksService.d.ts +101 -0
- package/dist/services/execution/QaTasksService.d.ts.map +1 -0
- package/dist/services/execution/QaTasksService.js +1117 -0
- package/dist/services/execution/TaskSelectionService.d.ts +50 -0
- package/dist/services/execution/TaskSelectionService.d.ts.map +1 -0
- package/dist/services/execution/TaskSelectionService.js +281 -0
- package/dist/services/execution/TaskStateService.d.ts +19 -0
- package/dist/services/execution/TaskStateService.d.ts.map +1 -0
- package/dist/services/execution/TaskStateService.js +59 -0
- package/dist/services/execution/WorkOnTasksService.d.ts +80 -0
- package/dist/services/execution/WorkOnTasksService.d.ts.map +1 -0
- package/dist/services/execution/WorkOnTasksService.js +1833 -0
- package/dist/services/jobs/JobInsightsService.d.ts +97 -0
- package/dist/services/jobs/JobInsightsService.d.ts.map +1 -0
- package/dist/services/jobs/JobInsightsService.js +263 -0
- package/dist/services/jobs/JobResumeService.d.ts +16 -0
- package/dist/services/jobs/JobResumeService.d.ts.map +1 -0
- package/dist/services/jobs/JobResumeService.js +113 -0
- package/dist/services/jobs/JobService.d.ts +149 -0
- package/dist/services/jobs/JobService.d.ts.map +1 -0
- package/dist/services/jobs/JobService.js +490 -0
- package/dist/services/jobs/JobsApiClient.d.ts +73 -0
- package/dist/services/jobs/JobsApiClient.d.ts.map +1 -0
- package/dist/services/jobs/JobsApiClient.js +67 -0
- package/dist/services/openapi/OpenApiService.d.ts +54 -0
- package/dist/services/openapi/OpenApiService.d.ts.map +1 -0
- package/dist/services/openapi/OpenApiService.js +503 -0
- package/dist/services/planning/CreateTasksService.d.ts +68 -0
- package/dist/services/planning/CreateTasksService.d.ts.map +1 -0
- package/dist/services/planning/CreateTasksService.js +989 -0
- package/dist/services/planning/KeyHelpers.d.ts +5 -0
- package/dist/services/planning/KeyHelpers.d.ts.map +1 -0
- package/dist/services/planning/KeyHelpers.js +62 -0
- package/dist/services/planning/PlanningService.d.ts +3 -0
- package/dist/services/planning/PlanningService.d.ts.map +1 -0
- package/dist/services/planning/PlanningService.js +2 -0
- package/dist/services/planning/RefineTasksService.d.ts +56 -0
- package/dist/services/planning/RefineTasksService.d.ts.map +1 -0
- package/dist/services/planning/RefineTasksService.js +1328 -0
- package/dist/services/review/CodeReviewService.d.ts +103 -0
- package/dist/services/review/CodeReviewService.d.ts.map +1 -0
- package/dist/services/review/CodeReviewService.js +1187 -0
- package/dist/services/system/SystemUpdateService.d.ts +55 -0
- package/dist/services/system/SystemUpdateService.d.ts.map +1 -0
- package/dist/services/system/SystemUpdateService.js +136 -0
- package/dist/services/tasks/TaskApiResolver.d.ts +7 -0
- package/dist/services/tasks/TaskApiResolver.d.ts.map +1 -0
- package/dist/services/tasks/TaskApiResolver.js +41 -0
- package/dist/services/tasks/TaskDetailService.d.ts +106 -0
- package/dist/services/tasks/TaskDetailService.d.ts.map +1 -0
- package/dist/services/tasks/TaskDetailService.js +332 -0
- package/dist/services/telemetry/TelemetryService.d.ts +53 -0
- package/dist/services/telemetry/TelemetryService.d.ts.map +1 -0
- package/dist/services/telemetry/TelemetryService.js +434 -0
- package/dist/workspace/WorkspaceManager.d.ts +35 -0
- package/dist/workspace/WorkspaceManager.d.ts.map +1 -0
- package/dist/workspace/WorkspaceManager.js +201 -0
- package/package.json +45 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Agent, RoutingDefaults, RoutingDefaultsUpdate, RoutingPreview } from "@mcoda/shared";
|
|
2
|
+
export interface RoutingPreviewRequest {
|
|
3
|
+
workspaceId: string;
|
|
4
|
+
commandName: string;
|
|
5
|
+
agentOverride?: string;
|
|
6
|
+
taskType?: string;
|
|
7
|
+
projectKey?: string;
|
|
8
|
+
requiredCapabilities?: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare class RoutingApiClient {
|
|
11
|
+
private baseUrl;
|
|
12
|
+
constructor(baseUrl: string);
|
|
13
|
+
static create(): RoutingApiClient;
|
|
14
|
+
private fetchJson;
|
|
15
|
+
private putJson;
|
|
16
|
+
private postJson;
|
|
17
|
+
getWorkspaceDefaults(workspaceId: string): Promise<RoutingDefaults | undefined>;
|
|
18
|
+
updateWorkspaceDefaults(workspaceId: string, update: RoutingDefaultsUpdate): Promise<RoutingDefaults | undefined>;
|
|
19
|
+
preview(request: RoutingPreviewRequest): Promise<RoutingPreview | undefined>;
|
|
20
|
+
listAgents(): Promise<Agent[] | undefined>;
|
|
21
|
+
getAgent(idOrSlug: string): Promise<Agent | undefined>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=RoutingApiClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RoutingApiClient.d.ts","sourceRoot":"","sources":["../../../src/services/agents/RoutingApiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAM9F,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,qBAAa,gBAAgB;IACf,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,MAAM;IAEnC,MAAM,CAAC,MAAM,IAAI,gBAAgB;YAKnB,SAAS;YAQT,OAAO;YAUP,QAAQ;IAUhB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAI/E,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAIjH,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAW5E,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,GAAG,SAAS,CAAC;IAI1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;CAG7D"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
const pickBaseUrl = () => {
|
|
2
|
+
return process.env.MCODA_ROUTING_API_URL ?? process.env.MCODA_API_BASE_URL;
|
|
3
|
+
};
|
|
4
|
+
export class RoutingApiClient {
|
|
5
|
+
constructor(baseUrl) {
|
|
6
|
+
this.baseUrl = baseUrl;
|
|
7
|
+
}
|
|
8
|
+
static create() {
|
|
9
|
+
const baseUrl = pickBaseUrl() ?? "http://localhost";
|
|
10
|
+
return new RoutingApiClient(baseUrl);
|
|
11
|
+
}
|
|
12
|
+
async fetchJson(path) {
|
|
13
|
+
const resp = await fetch(new URL(path, this.baseUrl), {
|
|
14
|
+
headers: { accept: "application/json" },
|
|
15
|
+
});
|
|
16
|
+
if (!resp.ok)
|
|
17
|
+
return undefined;
|
|
18
|
+
return (await resp.json());
|
|
19
|
+
}
|
|
20
|
+
async putJson(path, body) {
|
|
21
|
+
const resp = await fetch(new URL(path, this.baseUrl), {
|
|
22
|
+
method: "PUT",
|
|
23
|
+
headers: { "content-type": "application/json", accept: "application/json" },
|
|
24
|
+
body: JSON.stringify(body),
|
|
25
|
+
});
|
|
26
|
+
if (!resp.ok)
|
|
27
|
+
return undefined;
|
|
28
|
+
return (await resp.json());
|
|
29
|
+
}
|
|
30
|
+
async postJson(path, body) {
|
|
31
|
+
const resp = await fetch(new URL(path, this.baseUrl), {
|
|
32
|
+
method: "POST",
|
|
33
|
+
headers: { "content-type": "application/json", accept: "application/json" },
|
|
34
|
+
body: JSON.stringify(body),
|
|
35
|
+
});
|
|
36
|
+
if (!resp.ok)
|
|
37
|
+
return undefined;
|
|
38
|
+
return (await resp.json());
|
|
39
|
+
}
|
|
40
|
+
async getWorkspaceDefaults(workspaceId) {
|
|
41
|
+
return this.fetchJson(`/workspaces/${encodeURIComponent(workspaceId)}/defaults`);
|
|
42
|
+
}
|
|
43
|
+
async updateWorkspaceDefaults(workspaceId, update) {
|
|
44
|
+
return this.putJson(`/workspaces/${encodeURIComponent(workspaceId)}/defaults`, update);
|
|
45
|
+
}
|
|
46
|
+
async preview(request) {
|
|
47
|
+
return this.postJson("/routing/preview", {
|
|
48
|
+
workspaceId: request.workspaceId,
|
|
49
|
+
commandName: request.commandName,
|
|
50
|
+
agentOverride: request.agentOverride,
|
|
51
|
+
taskType: request.taskType,
|
|
52
|
+
projectKey: request.projectKey,
|
|
53
|
+
requiredCapabilities: request.requiredCapabilities,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
async listAgents() {
|
|
57
|
+
return this.fetchJson("/agents");
|
|
58
|
+
}
|
|
59
|
+
async getAgent(idOrSlug) {
|
|
60
|
+
return this.fetchJson(`/agents/${encodeURIComponent(idOrSlug)}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Agent, AgentHealth, RoutingDefaults, RoutingDefaultsUpdate, RoutingPreview, RoutingProvenance } from "@mcoda/shared";
|
|
2
|
+
import { GlobalRepository } from "@mcoda/db";
|
|
3
|
+
import { WorkspaceResolution } from "../../workspace/WorkspaceManager.js";
|
|
4
|
+
import { RoutingApiClient } from "./generated/RoutingApiClient.js";
|
|
5
|
+
export interface ResolveAgentParams {
|
|
6
|
+
workspace: WorkspaceResolution;
|
|
7
|
+
commandName: string;
|
|
8
|
+
taskType?: string;
|
|
9
|
+
overrideAgentSlug?: string;
|
|
10
|
+
projectKey?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ResolvedAgent {
|
|
13
|
+
agent: Agent;
|
|
14
|
+
agentId: string;
|
|
15
|
+
agentSlug: string;
|
|
16
|
+
model?: string;
|
|
17
|
+
capabilities: string[];
|
|
18
|
+
healthStatus: AgentHealth["status"] | "unknown";
|
|
19
|
+
source: RoutingProvenance;
|
|
20
|
+
routingPreview: RoutingPreview;
|
|
21
|
+
qaProfile?: string;
|
|
22
|
+
docdexScope?: string;
|
|
23
|
+
requiredCapabilities: string[];
|
|
24
|
+
}
|
|
25
|
+
export declare class RoutingService {
|
|
26
|
+
private deps;
|
|
27
|
+
constructor(deps: {
|
|
28
|
+
routingApi?: RoutingApiClient;
|
|
29
|
+
agentService?: {
|
|
30
|
+
resolveAgent(idOrSlug: string): Promise<Agent>;
|
|
31
|
+
getCapabilities?(agentId: string): Promise<string[]>;
|
|
32
|
+
close?(): Promise<void>;
|
|
33
|
+
};
|
|
34
|
+
globalRepo?: GlobalRepository;
|
|
35
|
+
});
|
|
36
|
+
static create(): Promise<RoutingService>;
|
|
37
|
+
close(): Promise<void>;
|
|
38
|
+
private requiredCapabilities;
|
|
39
|
+
normalizeCommand(commandName: string): string;
|
|
40
|
+
private fetchAgent;
|
|
41
|
+
private fetchCapabilities;
|
|
42
|
+
private normalizeProfile;
|
|
43
|
+
getWorkspaceDefaults(workspace: WorkspaceResolution | string): Promise<RoutingDefaults>;
|
|
44
|
+
private migrateLegacyDefaults;
|
|
45
|
+
getAgentSummary(agentId: string): Promise<Agent | undefined>;
|
|
46
|
+
updateWorkspaceDefaults(workspaceId: string, update: RoutingDefaultsUpdate): Promise<RoutingDefaults>;
|
|
47
|
+
private buildPreviewRequest;
|
|
48
|
+
resolveAgentForCommand(params: ResolveAgentParams): Promise<ResolvedAgent>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=RoutingService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RoutingService.d.ts","sourceRoot":"","sources":["../../../src/services/agents/RoutingService.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,WAAW,EACX,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,iBAAiB,EAKlB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAyB,MAAM,iCAAiC,CAAC;AAE1F,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,mBAAmB,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,WAAW,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;IAChD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,qBAAa,cAAc;IAEvB,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE;QACZ,UAAU,CAAC,EAAE,gBAAgB,CAAC;QAC9B,YAAY,CAAC,EAAE;YAAE,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAAC,eAAe,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAAC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;SAAE,CAAC;QACjJ,UAAU,CAAC,EAAE,gBAAgB,CAAC;KAC/B;WAGU,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC;IAYxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,OAAO,CAAC,oBAAoB;IAY5B,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;YAI/B,UAAU;YAiBV,iBAAiB;IAY/B,OAAO,CAAC,gBAAgB;IAIlB,oBAAoB,CAAC,SAAS,EAAE,mBAAmB,GAAG,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;YAc/E,qBAAqB;IAoB7B,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAQ5D,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IAyD3G,OAAO,CAAC,mBAAmB;IAYrB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;CAuOjF"}
|
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import { canonicalizeCommandName, getKnownDocdexScopes, getKnownQaProfiles, getCommandRequiredCapabilities, } from "@mcoda/shared";
|
|
2
|
+
import { AgentService } from "@mcoda/agents";
|
|
3
|
+
import { GlobalRepository } from "@mcoda/db";
|
|
4
|
+
import { RoutingApiClient } from "./generated/RoutingApiClient.js";
|
|
5
|
+
export class RoutingService {
|
|
6
|
+
constructor(deps) {
|
|
7
|
+
this.deps = deps;
|
|
8
|
+
}
|
|
9
|
+
static async create() {
|
|
10
|
+
let routingApi;
|
|
11
|
+
try {
|
|
12
|
+
routingApi = RoutingApiClient.create();
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
routingApi = undefined;
|
|
16
|
+
}
|
|
17
|
+
const globalRepo = await GlobalRepository.create();
|
|
18
|
+
const agentService = new AgentService(globalRepo);
|
|
19
|
+
return new RoutingService({ routingApi, globalRepo, agentService });
|
|
20
|
+
}
|
|
21
|
+
async close() {
|
|
22
|
+
if (this.deps.agentService?.close) {
|
|
23
|
+
await this.deps.agentService.close();
|
|
24
|
+
}
|
|
25
|
+
if (!this.deps.agentService?.close && this.deps.globalRepo?.close) {
|
|
26
|
+
await this.deps.globalRepo.close();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
requiredCapabilities(commandName, taskType) {
|
|
30
|
+
const normalized = this.normalizeCommand(commandName);
|
|
31
|
+
const required = [...getCommandRequiredCapabilities(normalized)];
|
|
32
|
+
if (taskType) {
|
|
33
|
+
const lower = taskType.toLowerCase();
|
|
34
|
+
if (lower.includes("qa")) {
|
|
35
|
+
required.push("qa_interpretation");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return Array.from(new Set(required));
|
|
39
|
+
}
|
|
40
|
+
normalizeCommand(commandName) {
|
|
41
|
+
return canonicalizeCommandName(commandName);
|
|
42
|
+
}
|
|
43
|
+
async fetchAgent(idOrSlug) {
|
|
44
|
+
const apiAgent = (await this.deps.routingApi?.getAgent(idOrSlug)) ??
|
|
45
|
+
(await this.deps.routingApi?.listAgents())?.find((a) => a.id === idOrSlug || a.slug === idOrSlug);
|
|
46
|
+
if (apiAgent)
|
|
47
|
+
return apiAgent;
|
|
48
|
+
if (this.deps.agentService) {
|
|
49
|
+
return this.deps.agentService.resolveAgent(idOrSlug);
|
|
50
|
+
}
|
|
51
|
+
if (this.deps.globalRepo) {
|
|
52
|
+
const byId = await this.deps.globalRepo.getAgentById(idOrSlug);
|
|
53
|
+
if (byId)
|
|
54
|
+
return byId;
|
|
55
|
+
const bySlug = await this.deps.globalRepo.getAgentBySlug(idOrSlug);
|
|
56
|
+
if (bySlug)
|
|
57
|
+
return bySlug;
|
|
58
|
+
}
|
|
59
|
+
throw new Error(`Agent ${idOrSlug} not found via routing API`);
|
|
60
|
+
}
|
|
61
|
+
async fetchCapabilities(agent) {
|
|
62
|
+
const caps = agent.capabilities ?? [];
|
|
63
|
+
if (caps.length)
|
|
64
|
+
return caps;
|
|
65
|
+
if (this.deps.agentService?.getCapabilities) {
|
|
66
|
+
return this.deps.agentService.getCapabilities(agent.id);
|
|
67
|
+
}
|
|
68
|
+
if (this.deps.globalRepo) {
|
|
69
|
+
return this.deps.globalRepo.getAgentCapabilities(agent.id);
|
|
70
|
+
}
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
normalizeProfile(value) {
|
|
74
|
+
return value ? value.trim().toLowerCase().replace(/[_\s]+/g, "-") : undefined;
|
|
75
|
+
}
|
|
76
|
+
async getWorkspaceDefaults(workspace) {
|
|
77
|
+
const workspaceId = typeof workspace === "string" ? workspace : workspace.workspaceId;
|
|
78
|
+
if (typeof workspace !== "string") {
|
|
79
|
+
await this.migrateLegacyDefaults(workspace);
|
|
80
|
+
}
|
|
81
|
+
if (this.deps.routingApi) {
|
|
82
|
+
return (await this.deps.routingApi.getWorkspaceDefaults(workspaceId)) ?? [];
|
|
83
|
+
}
|
|
84
|
+
if (this.deps.globalRepo) {
|
|
85
|
+
return this.deps.globalRepo.getWorkspaceDefaults(workspaceId);
|
|
86
|
+
}
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
async migrateLegacyDefaults(workspace) {
|
|
90
|
+
if (!this.deps.routingApi)
|
|
91
|
+
return;
|
|
92
|
+
const legacyIds = workspace.legacyWorkspaceIds ?? [];
|
|
93
|
+
if (!legacyIds.length)
|
|
94
|
+
return;
|
|
95
|
+
const current = (await this.deps.routingApi.getWorkspaceDefaults(workspace.workspaceId)) ?? [];
|
|
96
|
+
if (current.length > 0)
|
|
97
|
+
return;
|
|
98
|
+
for (const legacyId of legacyIds) {
|
|
99
|
+
const legacy = await this.deps.routingApi.getWorkspaceDefaults(legacyId);
|
|
100
|
+
if (legacy && legacy.length) {
|
|
101
|
+
const set = {};
|
|
102
|
+
for (const entry of legacy) {
|
|
103
|
+
const agent = await this.fetchAgent(entry.agentId);
|
|
104
|
+
set[this.normalizeCommand(entry.commandName)] = agent.slug ?? agent.id;
|
|
105
|
+
}
|
|
106
|
+
await this.updateWorkspaceDefaults(workspace.workspaceId, { set });
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async getAgentSummary(agentId) {
|
|
112
|
+
try {
|
|
113
|
+
return await this.fetchAgent(agentId);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async updateWorkspaceDefaults(workspaceId, update) {
|
|
120
|
+
const qaProfiles = getKnownQaProfiles().map((p) => this.normalizeProfile(p)).filter(Boolean);
|
|
121
|
+
const docdexScopes = getKnownDocdexScopes().map((p) => this.normalizeProfile(p)).filter(Boolean);
|
|
122
|
+
const normalizedQa = this.normalizeProfile(update.qaProfile);
|
|
123
|
+
const normalizedDocdex = this.normalizeProfile(update.docdexScope);
|
|
124
|
+
if (normalizedQa && qaProfiles.length && !qaProfiles.includes(normalizedQa)) {
|
|
125
|
+
throw new Error(`Unknown QA profile ${update.qaProfile}; allowed values: ${qaProfiles.join(", ")}`);
|
|
126
|
+
}
|
|
127
|
+
if (normalizedDocdex && docdexScopes.length && !docdexScopes.includes(normalizedDocdex)) {
|
|
128
|
+
throw new Error(`Unknown docdex scope ${update.docdexScope}; allowed values: ${docdexScopes.join(", ")}`);
|
|
129
|
+
}
|
|
130
|
+
const normalizedSet = {};
|
|
131
|
+
const setEntries = Object.entries(update.set ?? {});
|
|
132
|
+
for (const [commandName, agentSlug] of setEntries) {
|
|
133
|
+
const normalizedCommand = this.normalizeCommand(commandName);
|
|
134
|
+
const agent = await this.fetchAgent(agentSlug);
|
|
135
|
+
const capabilities = await this.fetchCapabilities(agent);
|
|
136
|
+
const required = this.requiredCapabilities(normalizedCommand);
|
|
137
|
+
const missing = required.filter((cap) => !capabilities.includes(cap));
|
|
138
|
+
if (missing.length) {
|
|
139
|
+
throw new Error(`Agent ${agentSlug} is missing required capabilities for ${normalizedCommand}: ${missing.join(", ")}`);
|
|
140
|
+
}
|
|
141
|
+
normalizedSet[normalizedCommand] = agent.slug ?? agent.id;
|
|
142
|
+
}
|
|
143
|
+
const normalizedReset = (update.reset ?? []).map((command) => this.normalizeCommand(command));
|
|
144
|
+
if (this.deps.routingApi) {
|
|
145
|
+
const updated = await this.deps.routingApi.updateWorkspaceDefaults(workspaceId, {
|
|
146
|
+
...update,
|
|
147
|
+
qaProfile: normalizedQa ?? update.qaProfile,
|
|
148
|
+
docdexScope: normalizedDocdex ?? update.docdexScope,
|
|
149
|
+
set: Object.keys(normalizedSet).length ? normalizedSet : undefined,
|
|
150
|
+
reset: normalizedReset.length ? normalizedReset : undefined,
|
|
151
|
+
});
|
|
152
|
+
return updated ?? [];
|
|
153
|
+
}
|
|
154
|
+
if (!this.deps.globalRepo) {
|
|
155
|
+
throw new Error("Routing defaults are unavailable without a routing API or global repository");
|
|
156
|
+
}
|
|
157
|
+
for (const [commandName, agentSlug] of Object.entries(normalizedSet)) {
|
|
158
|
+
const agent = await this.fetchAgent(agentSlug);
|
|
159
|
+
await this.deps.globalRepo.setWorkspaceDefault(workspaceId, commandName, agent.id, {
|
|
160
|
+
qaProfile: normalizedQa ?? update.qaProfile,
|
|
161
|
+
docdexScope: normalizedDocdex ?? update.docdexScope,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
for (const commandName of normalizedReset) {
|
|
165
|
+
await this.deps.globalRepo.removeWorkspaceDefault(workspaceId, commandName);
|
|
166
|
+
}
|
|
167
|
+
return this.deps.globalRepo.getWorkspaceDefaults(workspaceId);
|
|
168
|
+
}
|
|
169
|
+
buildPreviewRequest(params) {
|
|
170
|
+
const commandName = this.normalizeCommand(params.commandName);
|
|
171
|
+
return {
|
|
172
|
+
workspaceId: params.workspace.workspaceId,
|
|
173
|
+
commandName,
|
|
174
|
+
agentOverride: params.overrideAgentSlug,
|
|
175
|
+
taskType: params.taskType,
|
|
176
|
+
projectKey: params.projectKey,
|
|
177
|
+
requiredCapabilities: this.requiredCapabilities(commandName, params.taskType),
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
async resolveAgentForCommand(params) {
|
|
181
|
+
await this.migrateLegacyDefaults(params.workspace);
|
|
182
|
+
const normalizedCommand = this.normalizeCommand(params.commandName);
|
|
183
|
+
const requiredCaps = this.requiredCapabilities(normalizedCommand, params.taskType);
|
|
184
|
+
const fillHealth = async (agentId, current) => {
|
|
185
|
+
if (current && current.status)
|
|
186
|
+
return current;
|
|
187
|
+
const apiAgent = await this.deps.routingApi?.getAgent(agentId);
|
|
188
|
+
if (apiAgent?.health)
|
|
189
|
+
return apiAgent.health;
|
|
190
|
+
if (this.deps.globalRepo) {
|
|
191
|
+
return this.deps.globalRepo.getAgentHealth(agentId);
|
|
192
|
+
}
|
|
193
|
+
return current;
|
|
194
|
+
};
|
|
195
|
+
const fallbackFromDefaults = async () => {
|
|
196
|
+
const workspaceDefaults = (await this.deps.routingApi?.getWorkspaceDefaults(params.workspace.workspaceId)) ?? [];
|
|
197
|
+
const globalDefaults = (await this.deps.routingApi?.getWorkspaceDefaults("__GLOBAL__")) ?? [];
|
|
198
|
+
const findDefault = (defaults, command) => defaults.find((d) => this.normalizeCommand(d.commandName) === command);
|
|
199
|
+
const candidates = [
|
|
200
|
+
findDefault(workspaceDefaults, normalizedCommand),
|
|
201
|
+
findDefault(globalDefaults, normalizedCommand),
|
|
202
|
+
findDefault(workspaceDefaults, "default"),
|
|
203
|
+
findDefault(globalDefaults, "default"),
|
|
204
|
+
].filter(Boolean);
|
|
205
|
+
let chosen;
|
|
206
|
+
let capabilities = [];
|
|
207
|
+
let agent;
|
|
208
|
+
for (const candidate of candidates) {
|
|
209
|
+
const source = candidate.workspaceId === "__GLOBAL__"
|
|
210
|
+
? "global_default"
|
|
211
|
+
: "workspace_default";
|
|
212
|
+
const resolvedAgent = await this.fetchAgent(candidate.agentId);
|
|
213
|
+
const caps = await this.fetchCapabilities(resolvedAgent);
|
|
214
|
+
const missingFallback = requiredCaps.filter((cap) => !caps.includes(cap));
|
|
215
|
+
if (missingFallback.length === 0) {
|
|
216
|
+
chosen = { agentId: resolvedAgent.id, source, qaProfile: candidate.qaProfile, docdexScope: candidate.docdexScope };
|
|
217
|
+
capabilities = caps;
|
|
218
|
+
agent = resolvedAgent;
|
|
219
|
+
const health = await fillHealth(resolvedAgent.id);
|
|
220
|
+
if (health?.status === "unreachable") {
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (!chosen || !agent)
|
|
227
|
+
return null;
|
|
228
|
+
const health = await fillHealth(agent.id);
|
|
229
|
+
const preview = {
|
|
230
|
+
workspaceId: params.workspace.workspaceId,
|
|
231
|
+
commandName: normalizedCommand,
|
|
232
|
+
resolvedAgent: { ...agent, capabilities, health },
|
|
233
|
+
provenance: chosen.source,
|
|
234
|
+
requiredCapabilities: requiredCaps,
|
|
235
|
+
candidates: [
|
|
236
|
+
{
|
|
237
|
+
agent: { ...agent, capabilities, health },
|
|
238
|
+
agentId: agent.id,
|
|
239
|
+
agentSlug: agent.slug,
|
|
240
|
+
source: chosen.source,
|
|
241
|
+
capabilities,
|
|
242
|
+
health,
|
|
243
|
+
},
|
|
244
|
+
],
|
|
245
|
+
};
|
|
246
|
+
return {
|
|
247
|
+
agent,
|
|
248
|
+
agentId: agent.id,
|
|
249
|
+
agentSlug: agent.slug,
|
|
250
|
+
model: agent.defaultModel,
|
|
251
|
+
capabilities,
|
|
252
|
+
healthStatus: health?.status ?? "unknown",
|
|
253
|
+
source: chosen.source,
|
|
254
|
+
routingPreview: preview,
|
|
255
|
+
requiredCapabilities: requiredCaps,
|
|
256
|
+
qaProfile: chosen.qaProfile,
|
|
257
|
+
docdexScope: chosen.docdexScope,
|
|
258
|
+
};
|
|
259
|
+
};
|
|
260
|
+
if (this.deps.routingApi) {
|
|
261
|
+
const preview = await this.deps.routingApi.preview(this.buildPreviewRequest(params));
|
|
262
|
+
if (!preview || !preview.resolvedAgent) {
|
|
263
|
+
throw new Error(`Routing preview did not return a resolved agent for ${normalizedCommand}`);
|
|
264
|
+
}
|
|
265
|
+
const resolvedAgent = preview.resolvedAgent;
|
|
266
|
+
const previewCandidate = preview.candidates?.find((c) => c.agentId === resolvedAgent.id || c.agentSlug === resolvedAgent.slug) ??
|
|
267
|
+
undefined;
|
|
268
|
+
let capabilities = previewCandidate?.capabilities ?? preview.resolvedAgent.capabilities ?? preview.requiredCapabilities ?? [];
|
|
269
|
+
if (!capabilities.length) {
|
|
270
|
+
capabilities = await this.fetchCapabilities(resolvedAgent);
|
|
271
|
+
}
|
|
272
|
+
const missing = requiredCaps.filter((cap) => !capabilities.includes(cap));
|
|
273
|
+
if (missing.length > 0) {
|
|
274
|
+
if (params.overrideAgentSlug) {
|
|
275
|
+
// try fetching full capabilities when override was provided as slug
|
|
276
|
+
const overrideAgent = await this.fetchAgent(params.overrideAgentSlug);
|
|
277
|
+
const overrideCaps = await this.fetchCapabilities(overrideAgent);
|
|
278
|
+
const overrideMissing = requiredCaps.filter((cap) => !overrideCaps.includes(cap));
|
|
279
|
+
if (overrideMissing.length === 0) {
|
|
280
|
+
const health = await fillHealth(overrideAgent.id, previewCandidate?.health);
|
|
281
|
+
return {
|
|
282
|
+
agent: overrideAgent,
|
|
283
|
+
agentId: overrideAgent.id,
|
|
284
|
+
agentSlug: overrideAgent.slug,
|
|
285
|
+
model: overrideAgent.defaultModel,
|
|
286
|
+
capabilities: overrideCaps,
|
|
287
|
+
healthStatus: health?.status ?? "unknown",
|
|
288
|
+
source: "override",
|
|
289
|
+
routingPreview: preview,
|
|
290
|
+
requiredCapabilities: requiredCaps,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
const fallback = await fallbackFromDefaults();
|
|
295
|
+
if (fallback) {
|
|
296
|
+
return fallback;
|
|
297
|
+
}
|
|
298
|
+
throw new Error(`Resolved agent ${resolvedAgent.slug} is missing required capabilities for ${normalizedCommand}: ${missing.join(", ")}`);
|
|
299
|
+
}
|
|
300
|
+
const health = previewCandidate?.health ?? preview.resolvedAgent.health;
|
|
301
|
+
const finalHealth = await fillHealth(resolvedAgent.id, health);
|
|
302
|
+
const healthStatus = finalHealth?.status ?? health?.status ?? "unknown";
|
|
303
|
+
if (healthStatus === "unreachable") {
|
|
304
|
+
const fallback = await fallbackFromDefaults();
|
|
305
|
+
if (fallback)
|
|
306
|
+
return fallback;
|
|
307
|
+
throw new Error(`Resolved agent ${resolvedAgent.slug} is unreachable`);
|
|
308
|
+
}
|
|
309
|
+
return {
|
|
310
|
+
agent: resolvedAgent,
|
|
311
|
+
agentId: resolvedAgent.id,
|
|
312
|
+
agentSlug: resolvedAgent.slug,
|
|
313
|
+
model: resolvedAgent.defaultModel,
|
|
314
|
+
capabilities,
|
|
315
|
+
healthStatus,
|
|
316
|
+
source: preview.provenance ?? (params.overrideAgentSlug ? "override" : "workspace_default"),
|
|
317
|
+
routingPreview: preview,
|
|
318
|
+
qaProfile: preview.qaProfile,
|
|
319
|
+
docdexScope: preview.docdexScope,
|
|
320
|
+
requiredCapabilities: requiredCaps,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
if (!this.deps.globalRepo) {
|
|
324
|
+
throw new Error("Routing is unavailable without a routing API or global repository");
|
|
325
|
+
}
|
|
326
|
+
const workspaceDefaults = await this.deps.globalRepo.getWorkspaceDefaults(params.workspace.workspaceId);
|
|
327
|
+
const globalDefaults = await this.deps.globalRepo.getWorkspaceDefaults("__GLOBAL__");
|
|
328
|
+
const findDefault = (defaults, command) => defaults.find((d) => this.normalizeCommand(d.commandName) === command);
|
|
329
|
+
const commandDefault = findDefault(workspaceDefaults, normalizedCommand) ?? findDefault(globalDefaults, normalizedCommand);
|
|
330
|
+
const genericDefault = findDefault(workspaceDefaults, "default") ?? findDefault(globalDefaults, "default");
|
|
331
|
+
const selected = params.overrideAgentSlug != null
|
|
332
|
+
? { agentId: params.overrideAgentSlug, source: "override" }
|
|
333
|
+
: commandDefault
|
|
334
|
+
? { agentId: commandDefault.agentId, source: commandDefault.workspaceId === "__GLOBAL__" ? "global_default" : "workspace_default", qaProfile: commandDefault.qaProfile, docdexScope: commandDefault.docdexScope }
|
|
335
|
+
: genericDefault
|
|
336
|
+
? {
|
|
337
|
+
agentId: genericDefault.agentId,
|
|
338
|
+
source: genericDefault.workspaceId === "__GLOBAL__" ? "global_default" : "workspace_default",
|
|
339
|
+
qaProfile: genericDefault.qaProfile,
|
|
340
|
+
docdexScope: genericDefault.docdexScope,
|
|
341
|
+
}
|
|
342
|
+
: undefined;
|
|
343
|
+
if (!selected) {
|
|
344
|
+
throw new Error(`No routing defaults found for command ${normalizedCommand}`);
|
|
345
|
+
}
|
|
346
|
+
const agent = await this.fetchAgent(selected.agentId);
|
|
347
|
+
const capabilities = await this.fetchCapabilities(agent);
|
|
348
|
+
const missing = requiredCaps.filter((cap) => !capabilities.includes(cap));
|
|
349
|
+
if (missing.length) {
|
|
350
|
+
throw new Error(`Resolved agent ${agent.slug} is missing required capabilities for ${normalizedCommand}: ${missing.join(", ")}`);
|
|
351
|
+
}
|
|
352
|
+
const health = await this.deps.globalRepo.getAgentHealth(agent.id);
|
|
353
|
+
const preview = {
|
|
354
|
+
workspaceId: params.workspace.workspaceId,
|
|
355
|
+
commandName: normalizedCommand,
|
|
356
|
+
resolvedAgent: { ...agent, capabilities, health },
|
|
357
|
+
provenance: selected.source,
|
|
358
|
+
requiredCapabilities: requiredCaps,
|
|
359
|
+
qaProfile: selected.qaProfile,
|
|
360
|
+
docdexScope: selected.docdexScope,
|
|
361
|
+
candidates: [
|
|
362
|
+
{
|
|
363
|
+
agent: { ...agent, capabilities, health },
|
|
364
|
+
agentId: agent.id,
|
|
365
|
+
agentSlug: agent.slug,
|
|
366
|
+
source: selected.source,
|
|
367
|
+
capabilities,
|
|
368
|
+
health,
|
|
369
|
+
},
|
|
370
|
+
],
|
|
371
|
+
};
|
|
372
|
+
return {
|
|
373
|
+
agent,
|
|
374
|
+
agentId: agent.id,
|
|
375
|
+
agentSlug: agent.slug,
|
|
376
|
+
model: agent.defaultModel,
|
|
377
|
+
capabilities,
|
|
378
|
+
healthStatus: health?.status ?? "unknown",
|
|
379
|
+
source: selected.source,
|
|
380
|
+
routingPreview: preview,
|
|
381
|
+
qaProfile: selected.qaProfile,
|
|
382
|
+
docdexScope: selected.docdexScope,
|
|
383
|
+
requiredCapabilities: requiredCaps,
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Agent, RoutingDefaults, RoutingDefaultsUpdate, RoutingPreview } from "@mcoda/shared";
|
|
2
|
+
export interface RoutingPreviewRequest {
|
|
3
|
+
workspaceId: string;
|
|
4
|
+
commandName: string;
|
|
5
|
+
agentOverride?: string;
|
|
6
|
+
taskType?: string;
|
|
7
|
+
projectKey?: string;
|
|
8
|
+
requiredCapabilities?: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare class RoutingApiClient {
|
|
11
|
+
private baseUrl;
|
|
12
|
+
constructor(baseUrl?: string);
|
|
13
|
+
static create(): RoutingApiClient;
|
|
14
|
+
private build;
|
|
15
|
+
getWorkspaceDefaults(workspaceId: string): Promise<RoutingDefaults | undefined>;
|
|
16
|
+
updateWorkspaceDefaults(workspaceId: string, update: RoutingDefaultsUpdate): Promise<RoutingDefaults | undefined>;
|
|
17
|
+
preview(request: RoutingPreviewRequest): Promise<RoutingPreview | undefined>;
|
|
18
|
+
listAgents(): Promise<Agent[] | undefined>;
|
|
19
|
+
getAgent(idOrSlug: string): Promise<Agent | undefined>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=RoutingApiClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RoutingApiClient.d.ts","sourceRoot":"","sources":["../../../../src/services/agents/generated/RoutingApiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,eAAe,EACf,qBAAqB,EACrB,cAAc,EACf,MAAM,eAAe,CAAC;AAoBvB,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,qBAAa,gBAAgB;IACf,OAAO,CAAC,OAAO;gBAAP,OAAO,GAAE,MAAsB;IAEnD,MAAM,CAAC,MAAM,IAAI,gBAAgB;IAIjC,OAAO,CAAC,KAAK;IAIP,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAO/E,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IASjH,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAgB5E,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,GAAG,SAAS,CAAC;IAK1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;CAM7D"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
const pickBaseUrl = () => {
|
|
2
|
+
const base = process.env.MCODA_ROUTING_API_URL ?? process.env.MCODA_API_BASE_URL;
|
|
3
|
+
if (!base) {
|
|
4
|
+
throw new Error("MCODA_API_BASE_URL (or MCODA_ROUTING_API_URL) is required for routing operations per SDS.");
|
|
5
|
+
}
|
|
6
|
+
return base;
|
|
7
|
+
};
|
|
8
|
+
const handleResponse = async (resp) => {
|
|
9
|
+
if (resp.status === 404)
|
|
10
|
+
return undefined;
|
|
11
|
+
if (!resp.ok) {
|
|
12
|
+
const text = await resp.text();
|
|
13
|
+
throw new Error(`Routing API request failed (${resp.status}): ${text}`);
|
|
14
|
+
}
|
|
15
|
+
if (resp.status === 204)
|
|
16
|
+
return undefined;
|
|
17
|
+
return (await resp.json());
|
|
18
|
+
};
|
|
19
|
+
export class RoutingApiClient {
|
|
20
|
+
constructor(baseUrl = pickBaseUrl()) {
|
|
21
|
+
this.baseUrl = baseUrl;
|
|
22
|
+
}
|
|
23
|
+
static create() {
|
|
24
|
+
return new RoutingApiClient();
|
|
25
|
+
}
|
|
26
|
+
build(pathname) {
|
|
27
|
+
return new URL(pathname, this.baseUrl).toString();
|
|
28
|
+
}
|
|
29
|
+
async getWorkspaceDefaults(workspaceId) {
|
|
30
|
+
const resp = await fetch(this.build(`/workspaces/${encodeURIComponent(workspaceId)}/defaults`), {
|
|
31
|
+
headers: { accept: "application/json" },
|
|
32
|
+
});
|
|
33
|
+
return handleResponse(resp);
|
|
34
|
+
}
|
|
35
|
+
async updateWorkspaceDefaults(workspaceId, update) {
|
|
36
|
+
const resp = await fetch(this.build(`/workspaces/${encodeURIComponent(workspaceId)}/defaults`), {
|
|
37
|
+
method: "PUT",
|
|
38
|
+
headers: { accept: "application/json", "content-type": "application/json" },
|
|
39
|
+
body: JSON.stringify(update),
|
|
40
|
+
});
|
|
41
|
+
return handleResponse(resp);
|
|
42
|
+
}
|
|
43
|
+
async preview(request) {
|
|
44
|
+
const resp = await fetch(this.build("/routing/preview"), {
|
|
45
|
+
method: "POST",
|
|
46
|
+
headers: { accept: "application/json", "content-type": "application/json" },
|
|
47
|
+
body: JSON.stringify({
|
|
48
|
+
workspaceId: request.workspaceId,
|
|
49
|
+
commandName: request.commandName,
|
|
50
|
+
agentOverride: request.agentOverride,
|
|
51
|
+
taskType: request.taskType,
|
|
52
|
+
projectKey: request.projectKey,
|
|
53
|
+
requiredCapabilities: request.requiredCapabilities,
|
|
54
|
+
}),
|
|
55
|
+
});
|
|
56
|
+
return handleResponse(resp);
|
|
57
|
+
}
|
|
58
|
+
async listAgents() {
|
|
59
|
+
const resp = await fetch(this.build("/agents"), { headers: { accept: "application/json" } });
|
|
60
|
+
return handleResponse(resp);
|
|
61
|
+
}
|
|
62
|
+
async getAgent(idOrSlug) {
|
|
63
|
+
const resp = await fetch(this.build(`/agents/${encodeURIComponent(idOrSlug)}`), {
|
|
64
|
+
headers: { accept: "application/json" },
|
|
65
|
+
});
|
|
66
|
+
return handleResponse(resp);
|
|
67
|
+
}
|
|
68
|
+
}
|