@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.
Files changed (71) hide show
  1. package/CHANGELOG.md +4 -1
  2. package/README.md +22 -3
  3. package/dist/api/AgentsApi.d.ts +8 -1
  4. package/dist/api/AgentsApi.d.ts.map +1 -1
  5. package/dist/api/AgentsApi.js +70 -0
  6. package/dist/api/QaTasksApi.d.ts.map +1 -1
  7. package/dist/api/QaTasksApi.js +2 -0
  8. package/dist/api/TasksApi.d.ts.map +1 -1
  9. package/dist/api/TasksApi.js +1 -0
  10. package/dist/index.d.ts +4 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +4 -0
  13. package/dist/prompts/PdrPrompts.d.ts.map +1 -1
  14. package/dist/prompts/PdrPrompts.js +3 -1
  15. package/dist/prompts/SdsPrompts.d.ts.map +1 -1
  16. package/dist/prompts/SdsPrompts.js +2 -0
  17. package/dist/services/agents/AgentRatingFormula.d.ts +27 -0
  18. package/dist/services/agents/AgentRatingFormula.d.ts.map +1 -0
  19. package/dist/services/agents/AgentRatingFormula.js +45 -0
  20. package/dist/services/agents/AgentRatingService.d.ts +41 -0
  21. package/dist/services/agents/AgentRatingService.d.ts.map +1 -0
  22. package/dist/services/agents/AgentRatingService.js +299 -0
  23. package/dist/services/agents/GatewayAgentService.d.ts +3 -0
  24. package/dist/services/agents/GatewayAgentService.d.ts.map +1 -1
  25. package/dist/services/agents/GatewayAgentService.js +68 -24
  26. package/dist/services/agents/GatewayHandoff.d.ts +7 -0
  27. package/dist/services/agents/GatewayHandoff.d.ts.map +1 -0
  28. package/dist/services/agents/GatewayHandoff.js +108 -0
  29. package/dist/services/backlog/TaskOrderingService.d.ts +1 -0
  30. package/dist/services/backlog/TaskOrderingService.d.ts.map +1 -1
  31. package/dist/services/backlog/TaskOrderingService.js +19 -16
  32. package/dist/services/docs/DocsService.d.ts +11 -1
  33. package/dist/services/docs/DocsService.d.ts.map +1 -1
  34. package/dist/services/docs/DocsService.js +240 -52
  35. package/dist/services/execution/GatewayTrioService.d.ts +133 -0
  36. package/dist/services/execution/GatewayTrioService.d.ts.map +1 -0
  37. package/dist/services/execution/GatewayTrioService.js +1125 -0
  38. package/dist/services/execution/QaFollowupService.d.ts +1 -0
  39. package/dist/services/execution/QaFollowupService.d.ts.map +1 -1
  40. package/dist/services/execution/QaFollowupService.js +1 -0
  41. package/dist/services/execution/QaProfileService.d.ts +6 -0
  42. package/dist/services/execution/QaProfileService.d.ts.map +1 -1
  43. package/dist/services/execution/QaProfileService.js +165 -3
  44. package/dist/services/execution/QaTasksService.d.ts +18 -0
  45. package/dist/services/execution/QaTasksService.d.ts.map +1 -1
  46. package/dist/services/execution/QaTasksService.js +712 -34
  47. package/dist/services/execution/WorkOnTasksService.d.ts +14 -0
  48. package/dist/services/execution/WorkOnTasksService.d.ts.map +1 -1
  49. package/dist/services/execution/WorkOnTasksService.js +1497 -240
  50. package/dist/services/openapi/OpenApiService.d.ts +10 -0
  51. package/dist/services/openapi/OpenApiService.d.ts.map +1 -1
  52. package/dist/services/openapi/OpenApiService.js +66 -10
  53. package/dist/services/planning/CreateTasksService.d.ts +6 -0
  54. package/dist/services/planning/CreateTasksService.d.ts.map +1 -1
  55. package/dist/services/planning/CreateTasksService.js +261 -28
  56. package/dist/services/planning/RefineTasksService.d.ts +5 -0
  57. package/dist/services/planning/RefineTasksService.d.ts.map +1 -1
  58. package/dist/services/planning/RefineTasksService.js +184 -35
  59. package/dist/services/review/CodeReviewService.d.ts +14 -0
  60. package/dist/services/review/CodeReviewService.d.ts.map +1 -1
  61. package/dist/services/review/CodeReviewService.js +657 -61
  62. package/dist/services/shared/ProjectGuidance.d.ts +6 -0
  63. package/dist/services/shared/ProjectGuidance.d.ts.map +1 -0
  64. package/dist/services/shared/ProjectGuidance.js +21 -0
  65. package/dist/services/tasks/TaskCommentFormatter.d.ts +20 -0
  66. package/dist/services/tasks/TaskCommentFormatter.d.ts.map +1 -0
  67. package/dist/services/tasks/TaskCommentFormatter.js +54 -0
  68. package/dist/workspace/WorkspaceManager.d.ts +4 -0
  69. package/dist/workspace/WorkspaceManager.d.ts.map +1 -1
  70. package/dist/workspace/WorkspaceManager.js +3 -0
  71. package/package.json +5 -5
package/CHANGELOG.md CHANGED
@@ -3,5 +3,8 @@
3
3
  ## Unreleased
4
4
  - Initial public packaging for @mcoda/core.
5
5
 
6
- ## 0.1.7
6
+ ## 0.1.9
7
+ - Release v0.1.9.
8
+
9
+ ## 0.1.8
7
10
  - Initial release.
package/README.md CHANGED
@@ -1,9 +1,28 @@
1
1
  # @mcoda/core
2
2
 
3
- Core services and APIs used by the mcoda CLI.
3
+ Core services that power the mcoda CLI (docs, planning, jobs, telemetry, openapi).
4
4
 
5
- ## Usage
6
- This package is primarily an internal dependency of `mcoda`.
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`.
@@ -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;AAC/D,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,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;IA2BzE,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,WAAW,SAAe,EAC1B,WAAW,SAAY,GACtB,OAAO,CAAC,IAAI,CAAC;CAMjB"}
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"}
@@ -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;CA+B5B"}
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"}
@@ -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;CA6B/G"}
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"}
@@ -19,6 +19,7 @@ export class TasksApi {
19
19
  strategy: request.strategy,
20
20
  agentName: request.agentIdOverride,
21
21
  agentStream: true,
22
+ rateAgents: request.rateAgents,
22
23
  fromDb: true,
23
24
  dryRun: request.dryRun,
24
25
  planInPath: request.planInPath,
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
@@ -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,QAI3B,CAAC;AAET,eAAO,MAAM,4BAA4B,QAEjC,CAAC;AAET,eAAO,MAAM,0BAA0B,QAY/B,CAAC"}
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,QAmB/B,CAAC;AAET,eAAO,MAAM,oBAAoB,QAgBzB,CAAC"}
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"}