@mcoda/core 0.1.7 → 0.1.9
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 +4 -1
- package/README.md +22 -3
- package/dist/api/AgentsApi.d.ts +8 -1
- package/dist/api/AgentsApi.d.ts.map +1 -1
- package/dist/api/AgentsApi.js +70 -0
- package/dist/api/QaTasksApi.d.ts.map +1 -1
- package/dist/api/QaTasksApi.js +2 -0
- package/dist/api/TasksApi.d.ts.map +1 -1
- package/dist/api/TasksApi.js +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/prompts/PdrPrompts.d.ts.map +1 -1
- package/dist/prompts/PdrPrompts.js +3 -1
- package/dist/prompts/SdsPrompts.d.ts.map +1 -1
- package/dist/prompts/SdsPrompts.js +2 -0
- package/dist/services/agents/AgentRatingFormula.d.ts +27 -0
- package/dist/services/agents/AgentRatingFormula.d.ts.map +1 -0
- package/dist/services/agents/AgentRatingFormula.js +45 -0
- package/dist/services/agents/AgentRatingService.d.ts +41 -0
- package/dist/services/agents/AgentRatingService.d.ts.map +1 -0
- package/dist/services/agents/AgentRatingService.js +299 -0
- package/dist/services/agents/GatewayAgentService.d.ts +3 -0
- package/dist/services/agents/GatewayAgentService.d.ts.map +1 -1
- package/dist/services/agents/GatewayAgentService.js +68 -24
- package/dist/services/agents/GatewayHandoff.d.ts +7 -0
- package/dist/services/agents/GatewayHandoff.d.ts.map +1 -0
- package/dist/services/agents/GatewayHandoff.js +108 -0
- package/dist/services/backlog/TaskOrderingService.d.ts +1 -0
- package/dist/services/backlog/TaskOrderingService.d.ts.map +1 -1
- package/dist/services/backlog/TaskOrderingService.js +19 -16
- package/dist/services/docs/DocsService.d.ts +11 -1
- package/dist/services/docs/DocsService.d.ts.map +1 -1
- package/dist/services/docs/DocsService.js +240 -52
- package/dist/services/execution/GatewayTrioService.d.ts +133 -0
- package/dist/services/execution/GatewayTrioService.d.ts.map +1 -0
- package/dist/services/execution/GatewayTrioService.js +1125 -0
- package/dist/services/execution/QaFollowupService.d.ts +1 -0
- package/dist/services/execution/QaFollowupService.d.ts.map +1 -1
- package/dist/services/execution/QaFollowupService.js +1 -0
- package/dist/services/execution/QaProfileService.d.ts +6 -0
- package/dist/services/execution/QaProfileService.d.ts.map +1 -1
- package/dist/services/execution/QaProfileService.js +165 -3
- package/dist/services/execution/QaTasksService.d.ts +18 -0
- package/dist/services/execution/QaTasksService.d.ts.map +1 -1
- package/dist/services/execution/QaTasksService.js +712 -34
- package/dist/services/execution/WorkOnTasksService.d.ts +14 -0
- package/dist/services/execution/WorkOnTasksService.d.ts.map +1 -1
- package/dist/services/execution/WorkOnTasksService.js +1497 -240
- package/dist/services/openapi/OpenApiService.d.ts +10 -0
- package/dist/services/openapi/OpenApiService.d.ts.map +1 -1
- package/dist/services/openapi/OpenApiService.js +66 -10
- package/dist/services/planning/CreateTasksService.d.ts +6 -0
- package/dist/services/planning/CreateTasksService.d.ts.map +1 -1
- package/dist/services/planning/CreateTasksService.js +261 -28
- package/dist/services/planning/RefineTasksService.d.ts +5 -0
- package/dist/services/planning/RefineTasksService.d.ts.map +1 -1
- package/dist/services/planning/RefineTasksService.js +184 -35
- package/dist/services/review/CodeReviewService.d.ts +14 -0
- package/dist/services/review/CodeReviewService.d.ts.map +1 -1
- package/dist/services/review/CodeReviewService.js +657 -61
- package/dist/services/shared/ProjectGuidance.d.ts +6 -0
- package/dist/services/shared/ProjectGuidance.d.ts.map +1 -0
- package/dist/services/shared/ProjectGuidance.js +21 -0
- package/dist/services/tasks/TaskCommentFormatter.d.ts +20 -0
- package/dist/services/tasks/TaskCommentFormatter.d.ts.map +1 -0
- package/dist/services/tasks/TaskCommentFormatter.js +54 -0
- package/dist/workspace/WorkspaceManager.d.ts +4 -0
- package/dist/workspace/WorkspaceManager.d.ts.map +1 -1
- package/dist/workspace/WorkspaceManager.js +3 -0
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -1,9 +1,28 @@
|
|
|
1
1
|
# @mcoda/core
|
|
2
2
|
|
|
3
|
-
Core services
|
|
3
|
+
Core services that power the mcoda CLI (docs, planning, jobs, telemetry, openapi).
|
|
4
4
|
|
|
5
|
-
##
|
|
6
|
-
|
|
5
|
+
## Install
|
|
6
|
+
- Requires Node.js >= 20.
|
|
7
|
+
- Install: `npm i @mcoda/core`
|
|
8
|
+
|
|
9
|
+
## What it provides
|
|
10
|
+
- WorkspaceResolver for discovering/initializing `.mcoda` workspaces.
|
|
11
|
+
- Service layer for docs, planning, execution, review, telemetry, and system updates.
|
|
12
|
+
- API wrappers (AgentsApi, TasksApi, QaTasksApi) used by the CLI.
|
|
13
|
+
|
|
14
|
+
## Example
|
|
15
|
+
```ts
|
|
16
|
+
import { WorkspaceResolver, JobService } from "@mcoda/core";
|
|
17
|
+
|
|
18
|
+
const workspace = await WorkspaceResolver.resolveWorkspace({ cwd: process.cwd() });
|
|
19
|
+
const jobs = new JobService(workspace);
|
|
20
|
+
// Use jobs to record command runs, token usage, and job state.
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Notes
|
|
24
|
+
- Most services expect a resolved workspace and read/write `.mcoda/` state.
|
|
25
|
+
- Primarily used by the mcoda CLI; APIs may evolve.
|
|
7
26
|
|
|
8
27
|
## License
|
|
9
28
|
MIT - see `LICENSE`.
|
package/dist/api/AgentsApi.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Agent, AgentAuthMetadata, AgentHealth, AgentPromptManifest, CreateAgentInput, UpdateAgentInput } from "@mcoda/shared";
|
|
2
|
-
import { GlobalRepository } from "@mcoda/db";
|
|
2
|
+
import { AgentRunRatingRow, GlobalRepository } from "@mcoda/db";
|
|
3
3
|
import { AgentService, InvocationResult } from "@mcoda/agents";
|
|
4
4
|
import { RoutingService } from "../services/agents/RoutingService.js";
|
|
5
5
|
export interface AgentResponse extends Agent {
|
|
@@ -19,6 +19,7 @@ export declare class AgentsApi {
|
|
|
19
19
|
private resolveAgent;
|
|
20
20
|
private withCommandRun;
|
|
21
21
|
listAgents(): Promise<AgentResponse[]>;
|
|
22
|
+
listAgentRunRatings(idOrSlug: string, limit?: number): Promise<AgentRunRatingRow[]>;
|
|
22
23
|
createAgent(input: CreateAgentInput): Promise<AgentResponse>;
|
|
23
24
|
getAgent(idOrSlug: string): Promise<AgentResponse>;
|
|
24
25
|
updateAgent(idOrSlug: string, patch: UpdateAgentInput): Promise<AgentResponse>;
|
|
@@ -31,6 +32,12 @@ export declare class AgentsApi {
|
|
|
31
32
|
response: InvocationResult;
|
|
32
33
|
prompt: string;
|
|
33
34
|
}>;
|
|
35
|
+
private extractTokenUsage;
|
|
36
|
+
runAgent(idOrSlug: string, prompts: string[], metadata?: Record<string, unknown>): Promise<{
|
|
37
|
+
agent: Pick<Agent, "id" | "slug">;
|
|
38
|
+
prompts: string[];
|
|
39
|
+
responses: InvocationResult[];
|
|
40
|
+
}>;
|
|
34
41
|
setDefaultAgent(idOrSlug: string, workspaceId?: string, commandName?: string): Promise<void>;
|
|
35
42
|
}
|
|
36
43
|
//# sourceMappingURL=AgentsApi.d.ts.map
|
|
@@ -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,gBAAgB,EAChB,gBAAgB,EAEjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAoB,gBAAgB,EAAE,MAAM,WAAW,CAAC;
|
|
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,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,qBAAa,SAAS;IACR,OAAO,CAAC,IAAI;IAAoB,OAAO,CAAC,YAAY;IAAgB,OAAO,CAAC,cAAc;gBAAlF,IAAI,EAAE,gBAAgB,EAAU,YAAY,EAAE,YAAY,EAAU,cAAc,EAAE,cAAc;WAEzG,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC;IAOnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAOd,YAAY;YAIZ,cAAc;IA+BtB,UAAU,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAoBtC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAK/E,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAW5D,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAYlD,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAY9E,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB3D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAS1E,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAK3E,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAkBjD,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,MAAM,SAA4E,GACjF,OAAO,CAAC;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,QAAQ,EAAE,gBAAgB,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IA2B/E,OAAO,CAAC,iBAAiB;IAiCnB,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EAAE,EACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC;QAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,gBAAgB,EAAE,CAAA;KAAE,CAAC;IA8C7F,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,WAAW,SAAe,EAC1B,WAAW,SAAY,GACtB,OAAO,CAAC,IAAI,CAAC;CAMjB"}
|
package/dist/api/AgentsApi.js
CHANGED
|
@@ -69,6 +69,10 @@ export class AgentsApi {
|
|
|
69
69
|
}
|
|
70
70
|
return results;
|
|
71
71
|
}
|
|
72
|
+
async listAgentRunRatings(idOrSlug, limit = 50) {
|
|
73
|
+
const agent = await this.resolveAgent(idOrSlug);
|
|
74
|
+
return this.repo.listAgentRunRatings(agent.id, limit);
|
|
75
|
+
}
|
|
72
76
|
async createAgent(input) {
|
|
73
77
|
return this.withCommandRun("agent.add", { slug: input.slug, adapter: input.adapter }, async () => {
|
|
74
78
|
const agent = await this.repo.createAgent(input);
|
|
@@ -167,6 +171,72 @@ export class AgentsApi {
|
|
|
167
171
|
return { health, response, prompt: trimmedPrompt };
|
|
168
172
|
});
|
|
169
173
|
}
|
|
174
|
+
extractTokenUsage(metadata) {
|
|
175
|
+
if (!metadata || typeof metadata !== "object")
|
|
176
|
+
return {};
|
|
177
|
+
const usage = typeof metadata.usage === "object" && metadata.usage ? metadata.usage : undefined;
|
|
178
|
+
const toNumber = (value) => typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
179
|
+
const tokensPrompt = toNumber(metadata.tokensPrompt) ??
|
|
180
|
+
toNumber(metadata.tokens_prompt) ??
|
|
181
|
+
toNumber(usage?.prompt_tokens) ??
|
|
182
|
+
toNumber(usage?.promptTokens) ??
|
|
183
|
+
toNumber(usage?.prompt_tokens);
|
|
184
|
+
const tokensCompletion = toNumber(metadata.tokensCompletion) ??
|
|
185
|
+
toNumber(metadata.tokens_completion) ??
|
|
186
|
+
toNumber(usage?.completion_tokens) ??
|
|
187
|
+
toNumber(usage?.completionTokens) ??
|
|
188
|
+
toNumber(usage?.completion_tokens);
|
|
189
|
+
let tokensTotal = toNumber(metadata.tokensTotal) ??
|
|
190
|
+
toNumber(metadata.tokens_total) ??
|
|
191
|
+
toNumber(usage?.total_tokens) ??
|
|
192
|
+
toNumber(usage?.totalTokens) ??
|
|
193
|
+
toNumber(usage?.total_tokens);
|
|
194
|
+
if (tokensTotal === undefined && tokensPrompt !== undefined && tokensCompletion !== undefined) {
|
|
195
|
+
tokensTotal = tokensPrompt + tokensCompletion;
|
|
196
|
+
}
|
|
197
|
+
return { tokensPrompt, tokensCompletion, tokensTotal };
|
|
198
|
+
}
|
|
199
|
+
async runAgent(idOrSlug, prompts, metadata) {
|
|
200
|
+
const agent = await this.resolveAgent(idOrSlug);
|
|
201
|
+
const cleaned = prompts.map((prompt) => prompt.trim()).filter(Boolean);
|
|
202
|
+
if (cleaned.length === 0) {
|
|
203
|
+
throw new Error("No prompts provided.");
|
|
204
|
+
}
|
|
205
|
+
return this.withCommandRun("agent.run", { id: agent.id, slug: agent.slug, promptCount: cleaned.length }, async (run) => {
|
|
206
|
+
const responses = [];
|
|
207
|
+
for (let index = 0; index < cleaned.length; index += 1) {
|
|
208
|
+
const input = cleaned[index];
|
|
209
|
+
const startedAt = Date.now();
|
|
210
|
+
const response = await this.agentService.invoke(agent.id, {
|
|
211
|
+
input,
|
|
212
|
+
metadata: {
|
|
213
|
+
command: "agent-run",
|
|
214
|
+
promptIndex: index,
|
|
215
|
+
...metadata,
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
const durationSeconds = (Date.now() - startedAt) / 1000;
|
|
219
|
+
const usage = this.extractTokenUsage(response.metadata);
|
|
220
|
+
await this.repo.recordTokenUsage({
|
|
221
|
+
agentId: agent.id,
|
|
222
|
+
commandRunId: run.id,
|
|
223
|
+
modelName: response.model ?? agent.defaultModel,
|
|
224
|
+
tokensPrompt: usage.tokensPrompt,
|
|
225
|
+
tokensCompletion: usage.tokensCompletion,
|
|
226
|
+
tokensTotal: usage.tokensTotal,
|
|
227
|
+
durationSeconds,
|
|
228
|
+
timestamp: new Date().toISOString(),
|
|
229
|
+
metadata: {
|
|
230
|
+
reason: "agent.run",
|
|
231
|
+
adapter: response.adapter,
|
|
232
|
+
promptIndex: index,
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
responses.push(response);
|
|
236
|
+
}
|
|
237
|
+
return { agent: { id: agent.id, slug: agent.slug }, prompts: cleaned, responses };
|
|
238
|
+
});
|
|
239
|
+
}
|
|
170
240
|
async setDefaultAgent(idOrSlug, workspaceId = "__GLOBAL__", commandName = "default") {
|
|
171
241
|
const agent = await this.resolveAgent(idOrSlug);
|
|
172
242
|
await this.withCommandRun("agent.set-default", { workspaceId, commandName, agent: agent.slug }, async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QaTasksApi.d.ts","sourceRoot":"","sources":["../../src/api/QaTasksApi.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,cAAc,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAE1G,qBAAa,UAAU;WACR,KAAK,CAChB,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GACnF,OAAO,CAAC,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"QaTasksApi.d.ts","sourceRoot":"","sources":["../../src/api/QaTasksApi.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,cAAc,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAE1G,qBAAa,UAAU;WACR,KAAK,CAChB,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GACnF,OAAO,CAAC,eAAe,CAAC;CAiC5B"}
|
package/dist/api/QaTasksApi.js
CHANGED
|
@@ -22,11 +22,13 @@ export class QaTasksApi {
|
|
|
22
22
|
testCommand: request.testCommand,
|
|
23
23
|
agentName: request.agentName,
|
|
24
24
|
agentStream: request.agentStream,
|
|
25
|
+
rateAgents: request.rateAgents,
|
|
25
26
|
createFollowupTasks: request.createFollowupTasks,
|
|
26
27
|
dryRun: request.dryRun,
|
|
27
28
|
result: request.result,
|
|
28
29
|
notes: request.notes,
|
|
29
30
|
evidenceUrl: request.evidenceUrl,
|
|
31
|
+
allowDirty: request.allowDirty,
|
|
30
32
|
});
|
|
31
33
|
}
|
|
32
34
|
finally {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TasksApi.d.ts","sourceRoot":"","sources":["../../src/api/TasksApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAItE,qBAAa,QAAQ;WACN,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"TasksApi.d.ts","sourceRoot":"","sources":["../../src/api/TasksApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAItE,qBAAa,QAAQ;WACN,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA8B/G"}
|
package/dist/api/TasksApi.js
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export * from "./services/execution/TaskSelectionService.js";
|
|
|
11
11
|
export * from "./services/execution/TaskStateService.js";
|
|
12
12
|
export * from "./services/execution/WorkOnTasksService.js";
|
|
13
13
|
export * from "./services/execution/QaTasksService.js";
|
|
14
|
+
export * from "./services/execution/GatewayTrioService.js";
|
|
14
15
|
export * from "./services/review/CodeReviewService.js";
|
|
15
16
|
export * from "./api/TasksApi.js";
|
|
16
17
|
export * from "./api/QaTasksApi.js";
|
|
@@ -23,6 +24,9 @@ export * from "./services/tasks/TaskDetailService.js";
|
|
|
23
24
|
export * from "./services/backlog/TaskOrderingService.js";
|
|
24
25
|
export * from "./services/agents/RoutingService.js";
|
|
25
26
|
export * from "./services/agents/GatewayAgentService.js";
|
|
27
|
+
export * from "./services/agents/GatewayHandoff.js";
|
|
28
|
+
export * from "./services/agents/AgentRatingService.js";
|
|
29
|
+
export * from "./services/agents/AgentRatingFormula.js";
|
|
26
30
|
export * from "./workspace/WorkspaceManager.js";
|
|
27
31
|
export * from "./services/system/SystemUpdateService.js";
|
|
28
32
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uCAAuC,CAAC;AACtD,cAAc,qCAAqC,CAAC;AACpD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mCAAmC,CAAC;AAClD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,0CAA0C,CAAC;AACzD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0CAA0C,CAAC;AACzD,cAAc,uCAAuC,CAAC;AACtD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qCAAqC,CAAC;AACpD,cAAc,0CAA0C,CAAC;AACzD,cAAc,iCAAiC,CAAC;AAChD,cAAc,0CAA0C,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uCAAuC,CAAC;AACtD,cAAc,qCAAqC,CAAC;AACpD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mCAAmC,CAAC;AAClD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,0CAA0C,CAAC;AACzD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,wCAAwC,CAAC;AACvD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,wCAAwC,CAAC;AACvD,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0CAA0C,CAAC;AACzD,cAAc,uCAAuC,CAAC;AACtD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qCAAqC,CAAC;AACpD,cAAc,0CAA0C,CAAC;AACzD,cAAc,qCAAqC,CAAC;AACpD,cAAc,yCAAyC,CAAC;AACxD,cAAc,yCAAyC,CAAC;AACxD,cAAc,iCAAiC,CAAC;AAChD,cAAc,0CAA0C,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -11,6 +11,7 @@ export * from "./services/execution/TaskSelectionService.js";
|
|
|
11
11
|
export * from "./services/execution/TaskStateService.js";
|
|
12
12
|
export * from "./services/execution/WorkOnTasksService.js";
|
|
13
13
|
export * from "./services/execution/QaTasksService.js";
|
|
14
|
+
export * from "./services/execution/GatewayTrioService.js";
|
|
14
15
|
export * from "./services/review/CodeReviewService.js";
|
|
15
16
|
export * from "./api/TasksApi.js";
|
|
16
17
|
export * from "./api/QaTasksApi.js";
|
|
@@ -23,5 +24,8 @@ export * from "./services/tasks/TaskDetailService.js";
|
|
|
23
24
|
export * from "./services/backlog/TaskOrderingService.js";
|
|
24
25
|
export * from "./services/agents/RoutingService.js";
|
|
25
26
|
export * from "./services/agents/GatewayAgentService.js";
|
|
27
|
+
export * from "./services/agents/GatewayHandoff.js";
|
|
28
|
+
export * from "./services/agents/AgentRatingService.js";
|
|
29
|
+
export * from "./services/agents/AgentRatingFormula.js";
|
|
26
30
|
export * from "./workspace/WorkspaceManager.js";
|
|
27
31
|
export * from "./services/system/SystemUpdateService.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PdrPrompts.d.ts","sourceRoot":"","sources":["../../src/prompts/PdrPrompts.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"PdrPrompts.d.ts","sourceRoot":"","sources":["../../src/prompts/PdrPrompts.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,QAK3B,CAAC;AAET,eAAO,MAAM,4BAA4B,QAEjC,CAAC;AAET,eAAO,MAAM,0BAA0B,QAa/B,CAAC"}
|
|
@@ -2,14 +2,16 @@ export const DEFAULT_PDR_JOB_PROMPT = `
|
|
|
2
2
|
You generate Product Design Reviews (PDR) grounded strictly in provided RFPs and related docs.
|
|
3
3
|
Summarize intent, constraints, interfaces, risks, and open questions concisely with clear headings.
|
|
4
4
|
Avoid inventing APIs or requirements; highlight uncertainties and assumptions for follow-up.
|
|
5
|
+
Explicitly specify the technology stack. If none is stated, default to TypeScript, React, MySQL, Redis, and Bash scripting where needed, unless the domain clearly demands another stack (e.g., Python for ML).
|
|
5
6
|
`.trim();
|
|
6
7
|
export const DEFAULT_PDR_CHARACTER_PROMPT = `
|
|
7
|
-
Be precise, risk-aware, and concise. Prefer bullet points. Cite assumptions and avoid speculation.
|
|
8
|
+
Be precise, risk-aware, and concise. Prefer bullet points. Cite assumptions and avoid speculation. Always state the technology stack with rationale.
|
|
8
9
|
`.trim();
|
|
9
10
|
export const DEFAULT_PDR_RUNBOOK_PROMPT = `
|
|
10
11
|
Produce Markdown with the following sections at minimum:
|
|
11
12
|
- Introduction
|
|
12
13
|
- Scope
|
|
14
|
+
- Technology Stack (detail frontend, backend, data, infra, tooling; default to TypeScript/React/MySQL/Redis/Bash unless domain clearly indicates otherwise)
|
|
13
15
|
- Requirements & Constraints
|
|
14
16
|
- Architecture Overview
|
|
15
17
|
- Interfaces / APIs (do not invent endpoints; if missing, list as open questions)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SdsPrompts.d.ts","sourceRoot":"","sources":["../../src/prompts/SdsPrompts.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,QAG3B,CAAC;AAET,eAAO,MAAM,4BAA4B,QAEjC,CAAC;AAET,eAAO,MAAM,0BAA0B,
|
|
1
|
+
{"version":3,"file":"SdsPrompts.d.ts","sourceRoot":"","sources":["../../src/prompts/SdsPrompts.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,QAG3B,CAAC;AAET,eAAO,MAAM,4BAA4B,QAEjC,CAAC;AAET,eAAO,MAAM,0BAA0B,QAoB/B,CAAC;AAET,eAAO,MAAM,oBAAoB,QAiBzB,CAAC"}
|
|
@@ -13,6 +13,7 @@ Mandatory sections (include even if you must mark TODOs):
|
|
|
13
13
|
- Goals & Scope
|
|
14
14
|
- Architecture Overview
|
|
15
15
|
- Components & Responsibilities
|
|
16
|
+
- Planned Folder Tree (include a detailed final structure, scripts, and tooling paths)
|
|
16
17
|
- Data Model & Persistence
|
|
17
18
|
- Interfaces & Contracts (reference OpenAPI operations when available)
|
|
18
19
|
- Non-Functional Requirements
|
|
@@ -32,6 +33,7 @@ export const DEFAULT_SDS_TEMPLATE = `
|
|
|
32
33
|
## Goals & Scope
|
|
33
34
|
## Architecture Overview
|
|
34
35
|
## Components & Responsibilities
|
|
36
|
+
## Planned Folder Tree
|
|
35
37
|
## Data Model & Persistence
|
|
36
38
|
## Interfaces & Contracts
|
|
37
39
|
## Non-Functional Requirements
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type RatingBudgets = {
|
|
2
|
+
costUsd: number;
|
|
3
|
+
durationSeconds: number;
|
|
4
|
+
iterations: number;
|
|
5
|
+
};
|
|
6
|
+
export type RatingWeights = {
|
|
7
|
+
quality: number;
|
|
8
|
+
cost: number;
|
|
9
|
+
time: number;
|
|
10
|
+
iterations: number;
|
|
11
|
+
};
|
|
12
|
+
export type RunScoreInput = {
|
|
13
|
+
qualityScore: number;
|
|
14
|
+
totalCost: number;
|
|
15
|
+
durationSeconds: number;
|
|
16
|
+
iterations: number;
|
|
17
|
+
budgets?: Partial<RatingBudgets>;
|
|
18
|
+
weights?: Partial<RatingWeights>;
|
|
19
|
+
};
|
|
20
|
+
export declare const DEFAULT_RATING_WEIGHTS: RatingWeights;
|
|
21
|
+
export declare const DEFAULT_RATING_BUDGETS: RatingBudgets;
|
|
22
|
+
export declare const normalizeScore: (value: number, maxValue?: number) => number;
|
|
23
|
+
export declare const normalizeBudget: (value: number, budget: number) => number;
|
|
24
|
+
export declare const computeRunScore: (input: RunScoreInput) => number;
|
|
25
|
+
export declare const updateEmaRating: (current: number, score: number, alpha: number) => number;
|
|
26
|
+
export declare const computeAlpha: (windowSize: number) => number;
|
|
27
|
+
//# sourceMappingURL=AgentRatingFormula.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentRatingFormula.d.ts","sourceRoot":"","sources":["../../../src/services/agents/AgentRatingFormula.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CAClC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,aAKpC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,aAIpC,CAAC;AASF,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,EAAE,iBAAa,KAAG,MAA4C,CAAC;AAE3G,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAG,MAA0C,CAAC;AAE3G,eAAO,MAAM,eAAe,GAAI,OAAO,aAAa,KAAG,MAatD,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,EAAE,OAAO,MAAM,EAAE,OAAO,MAAM,KAAG,MAM/E,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,YAAY,MAAM,KAAG,MAGjD,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export const DEFAULT_RATING_WEIGHTS = {
|
|
2
|
+
quality: 1.0,
|
|
3
|
+
cost: 0.15,
|
|
4
|
+
time: 0.1,
|
|
5
|
+
iterations: 0.2,
|
|
6
|
+
};
|
|
7
|
+
export const DEFAULT_RATING_BUDGETS = {
|
|
8
|
+
costUsd: 0.05,
|
|
9
|
+
durationSeconds: 600,
|
|
10
|
+
iterations: 2,
|
|
11
|
+
};
|
|
12
|
+
const clamp = (value, min = 0, max = 1) => Math.max(min, Math.min(max, value));
|
|
13
|
+
const safeDivide = (value, denom) => {
|
|
14
|
+
if (!Number.isFinite(value) || !Number.isFinite(denom) || denom <= 0)
|
|
15
|
+
return 0;
|
|
16
|
+
return value / denom;
|
|
17
|
+
};
|
|
18
|
+
export const normalizeScore = (value, maxValue = 10) => clamp(safeDivide(value, maxValue));
|
|
19
|
+
export const normalizeBudget = (value, budget) => clamp(safeDivide(value, budget));
|
|
20
|
+
export const computeRunScore = (input) => {
|
|
21
|
+
const weights = { ...DEFAULT_RATING_WEIGHTS, ...(input.weights ?? {}) };
|
|
22
|
+
const budgets = { ...DEFAULT_RATING_BUDGETS, ...(input.budgets ?? {}) };
|
|
23
|
+
const qualityNorm = normalizeScore(input.qualityScore, 10);
|
|
24
|
+
const costNorm = normalizeBudget(input.totalCost, budgets.costUsd);
|
|
25
|
+
const timeNorm = normalizeBudget(input.durationSeconds, budgets.durationSeconds);
|
|
26
|
+
const iterNorm = normalizeBudget(input.iterations, budgets.iterations);
|
|
27
|
+
const weighted = weights.quality * qualityNorm -
|
|
28
|
+
weights.cost * costNorm -
|
|
29
|
+
weights.time * timeNorm -
|
|
30
|
+
weights.iterations * iterNorm;
|
|
31
|
+
return Math.round(clamp(weighted, 0, 1) * 1000) / 100; // 0-10 with 2 decimal precision
|
|
32
|
+
};
|
|
33
|
+
export const updateEmaRating = (current, score, alpha) => {
|
|
34
|
+
if (!Number.isFinite(current))
|
|
35
|
+
return score;
|
|
36
|
+
if (!Number.isFinite(score))
|
|
37
|
+
return current;
|
|
38
|
+
const safeAlpha = clamp(alpha, 0, 1);
|
|
39
|
+
const next = current + safeAlpha * (score - current);
|
|
40
|
+
return Math.round(next * 100) / 100;
|
|
41
|
+
};
|
|
42
|
+
export const computeAlpha = (windowSize) => {
|
|
43
|
+
const size = Math.max(1, windowSize);
|
|
44
|
+
return 2 / (size + 1);
|
|
45
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { AgentService } from "@mcoda/agents";
|
|
2
|
+
import { GlobalRepository, WorkspaceRepository } from "@mcoda/db";
|
|
3
|
+
import { RoutingService } from "./RoutingService.js";
|
|
4
|
+
import { WorkspaceResolution } from "../../workspace/WorkspaceManager.js";
|
|
5
|
+
export type AgentRatingRequest = {
|
|
6
|
+
workspace: WorkspaceResolution;
|
|
7
|
+
agentId: string;
|
|
8
|
+
commandName: string;
|
|
9
|
+
jobId?: string;
|
|
10
|
+
commandRunId?: string;
|
|
11
|
+
taskId?: string;
|
|
12
|
+
taskKey?: string;
|
|
13
|
+
discipline?: string;
|
|
14
|
+
complexity?: number;
|
|
15
|
+
reviewerAgentName?: string;
|
|
16
|
+
ratingWindow?: number;
|
|
17
|
+
};
|
|
18
|
+
export declare class AgentRatingService {
|
|
19
|
+
private workspace;
|
|
20
|
+
private deps;
|
|
21
|
+
constructor(workspace: WorkspaceResolution, deps: {
|
|
22
|
+
workspaceRepo: WorkspaceRepository;
|
|
23
|
+
globalRepo: GlobalRepository;
|
|
24
|
+
agentService: AgentService;
|
|
25
|
+
routingService: RoutingService;
|
|
26
|
+
});
|
|
27
|
+
static create(workspace: WorkspaceResolution): Promise<AgentRatingService>;
|
|
28
|
+
close(): Promise<void>;
|
|
29
|
+
private ratingPromptPath;
|
|
30
|
+
private loadRatingPrompt;
|
|
31
|
+
private resolveReviewer;
|
|
32
|
+
private loadUsage;
|
|
33
|
+
private countIterations;
|
|
34
|
+
private loadDurationSeconds;
|
|
35
|
+
private buildReviewContext;
|
|
36
|
+
private runReviewer;
|
|
37
|
+
private computeBudgets;
|
|
38
|
+
rate(request: AgentRatingRequest): Promise<void>;
|
|
39
|
+
private writeRatingArtifact;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=AgentRatingService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentRatingService.d.ts","sourceRoot":"","sources":["../../../src/services/agents/AgentRatingService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAElE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AA0C1E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,mBAAmB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAeF,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,IAAI;gBADJ,SAAS,EAAE,mBAAmB,EAC9B,IAAI,EAAE;QACZ,aAAa,EAAE,mBAAmB,CAAC;QACnC,UAAU,EAAE,gBAAgB,CAAC;QAC7B,YAAY,EAAE,YAAY,CAAC;QAC3B,cAAc,EAAE,cAAc,CAAC;KAChC;WAGU,MAAM,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAa1E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,OAAO,CAAC,gBAAgB;YAIV,gBAAgB;YAahB,eAAe;YAWf,SAAS;IAoBvB,OAAO,CAAC,eAAe;YAgBT,mBAAmB;YA0BnB,kBAAkB;YA2BlB,WAAW;IAYzB,OAAO,CAAC,cAAc;IAShB,IAAI,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;YA4GxC,mBAAmB;CAOlC"}
|