@mcoda/core 0.1.8 → 0.1.11

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 (216) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/README.md +2 -2
  3. package/dist/api/AgentsApi.d.ts +9 -1
  4. package/dist/api/AgentsApi.d.ts.map +1 -1
  5. package/dist/api/AgentsApi.js +201 -6
  6. package/dist/api/QaTasksApi.d.ts.map +1 -1
  7. package/dist/api/QaTasksApi.js +6 -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 +9 -1
  15. package/dist/prompts/SdsPrompts.d.ts.map +1 -1
  16. package/dist/prompts/SdsPrompts.js +9 -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 +60 -0
  21. package/dist/services/agents/AgentRatingService.d.ts.map +1 -0
  22. package/dist/services/agents/AgentRatingService.js +363 -0
  23. package/dist/services/agents/GatewayAgentService.d.ts +11 -0
  24. package/dist/services/agents/GatewayAgentService.d.ts.map +1 -1
  25. package/dist/services/agents/GatewayAgentService.js +525 -84
  26. package/dist/services/agents/GatewayHandoff.d.ts +11 -0
  27. package/dist/services/agents/GatewayHandoff.d.ts.map +1 -0
  28. package/dist/services/agents/GatewayHandoff.js +141 -0
  29. package/dist/services/agents/RoutingService.d.ts +1 -0
  30. package/dist/services/agents/RoutingService.d.ts.map +1 -1
  31. package/dist/services/agents/RoutingService.js +4 -4
  32. package/dist/services/backlog/BacklogService.d.ts +23 -0
  33. package/dist/services/backlog/BacklogService.d.ts.map +1 -1
  34. package/dist/services/backlog/BacklogService.js +62 -7
  35. package/dist/services/backlog/TaskOrderingHeuristics.d.ts +12 -0
  36. package/dist/services/backlog/TaskOrderingHeuristics.d.ts.map +1 -0
  37. package/dist/services/backlog/TaskOrderingHeuristics.js +56 -0
  38. package/dist/services/backlog/TaskOrderingService.d.ts +17 -4
  39. package/dist/services/backlog/TaskOrderingService.d.ts.map +1 -1
  40. package/dist/services/backlog/TaskOrderingService.js +538 -79
  41. package/dist/services/docs/DocInventory.d.ts +11 -0
  42. package/dist/services/docs/DocInventory.d.ts.map +1 -0
  43. package/dist/services/docs/DocInventory.js +230 -0
  44. package/dist/services/docs/DocgenRunContext.d.ts +59 -0
  45. package/dist/services/docs/DocgenRunContext.d.ts.map +1 -0
  46. package/dist/services/docs/DocgenRunContext.js +4 -0
  47. package/dist/services/docs/DocsService.d.ts +70 -3
  48. package/dist/services/docs/DocsService.d.ts.map +1 -1
  49. package/dist/services/docs/DocsService.js +1930 -89
  50. package/dist/services/docs/alignment/DocAlignmentGraph.d.ts +23 -0
  51. package/dist/services/docs/alignment/DocAlignmentGraph.d.ts.map +1 -0
  52. package/dist/services/docs/alignment/DocAlignmentGraph.js +78 -0
  53. package/dist/services/docs/alignment/DocAlignmentPatcher.d.ts +19 -0
  54. package/dist/services/docs/alignment/DocAlignmentPatcher.d.ts.map +1 -0
  55. package/dist/services/docs/alignment/DocAlignmentPatcher.js +222 -0
  56. package/dist/services/docs/patch/DocPatchEngine.d.ts +57 -0
  57. package/dist/services/docs/patch/DocPatchEngine.d.ts.map +1 -0
  58. package/dist/services/docs/patch/DocPatchEngine.js +331 -0
  59. package/dist/services/docs/review/Glossary.d.ts +16 -0
  60. package/dist/services/docs/review/Glossary.d.ts.map +1 -0
  61. package/dist/services/docs/review/Glossary.js +47 -0
  62. package/dist/services/docs/review/ReviewReportRenderer.d.ts +3 -0
  63. package/dist/services/docs/review/ReviewReportRenderer.d.ts.map +1 -0
  64. package/dist/services/docs/review/ReviewReportRenderer.js +133 -0
  65. package/dist/services/docs/review/ReviewReportSchema.d.ts +39 -0
  66. package/dist/services/docs/review/ReviewReportSchema.d.ts.map +1 -0
  67. package/dist/services/docs/review/ReviewReportSchema.js +47 -0
  68. package/dist/services/docs/review/ReviewTypes.d.ts +76 -0
  69. package/dist/services/docs/review/ReviewTypes.d.ts.map +1 -0
  70. package/dist/services/docs/review/ReviewTypes.js +94 -0
  71. package/dist/services/docs/review/gates/AdminOpenApiSpecGate.d.ts +7 -0
  72. package/dist/services/docs/review/gates/AdminOpenApiSpecGate.d.ts.map +1 -0
  73. package/dist/services/docs/review/gates/AdminOpenApiSpecGate.js +93 -0
  74. package/dist/services/docs/review/gates/ApiPathConsistencyGate.d.ts +7 -0
  75. package/dist/services/docs/review/gates/ApiPathConsistencyGate.d.ts.map +1 -0
  76. package/dist/services/docs/review/gates/ApiPathConsistencyGate.js +308 -0
  77. package/dist/services/docs/review/gates/BuildReadyCompletenessGate.d.ts +8 -0
  78. package/dist/services/docs/review/gates/BuildReadyCompletenessGate.d.ts.map +1 -0
  79. package/dist/services/docs/review/gates/BuildReadyCompletenessGate.js +278 -0
  80. package/dist/services/docs/review/gates/DeploymentBlueprintGate.d.ts +8 -0
  81. package/dist/services/docs/review/gates/DeploymentBlueprintGate.d.ts.map +1 -0
  82. package/dist/services/docs/review/gates/DeploymentBlueprintGate.js +487 -0
  83. package/dist/services/docs/review/gates/NoMaybesGate.d.ts +8 -0
  84. package/dist/services/docs/review/gates/NoMaybesGate.d.ts.map +1 -0
  85. package/dist/services/docs/review/gates/NoMaybesGate.js +145 -0
  86. package/dist/services/docs/review/gates/OpenApiCoverageGate.d.ts +7 -0
  87. package/dist/services/docs/review/gates/OpenApiCoverageGate.d.ts.map +1 -0
  88. package/dist/services/docs/review/gates/OpenApiCoverageGate.js +266 -0
  89. package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.d.ts +7 -0
  90. package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.d.ts.map +1 -0
  91. package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.js +59 -0
  92. package/dist/services/docs/review/gates/OpenQuestionsGate.d.ts +7 -0
  93. package/dist/services/docs/review/gates/OpenQuestionsGate.d.ts.map +1 -0
  94. package/dist/services/docs/review/gates/OpenQuestionsGate.js +200 -0
  95. package/dist/services/docs/review/gates/PdrInterfacesGate.d.ts +7 -0
  96. package/dist/services/docs/review/gates/PdrInterfacesGate.d.ts.map +1 -0
  97. package/dist/services/docs/review/gates/PdrInterfacesGate.js +159 -0
  98. package/dist/services/docs/review/gates/PdrOpenQuestionsGate.d.ts +8 -0
  99. package/dist/services/docs/review/gates/PdrOpenQuestionsGate.d.ts.map +1 -0
  100. package/dist/services/docs/review/gates/PdrOpenQuestionsGate.js +129 -0
  101. package/dist/services/docs/review/gates/PdrOwnershipGate.d.ts +7 -0
  102. package/dist/services/docs/review/gates/PdrOwnershipGate.d.ts.map +1 -0
  103. package/dist/services/docs/review/gates/PdrOwnershipGate.js +169 -0
  104. package/dist/services/docs/review/gates/PlaceholderArtifactGate.d.ts +10 -0
  105. package/dist/services/docs/review/gates/PlaceholderArtifactGate.d.ts.map +1 -0
  106. package/dist/services/docs/review/gates/PlaceholderArtifactGate.js +261 -0
  107. package/dist/services/docs/review/gates/RfpConsentGate.d.ts +6 -0
  108. package/dist/services/docs/review/gates/RfpConsentGate.d.ts.map +1 -0
  109. package/dist/services/docs/review/gates/RfpConsentGate.js +127 -0
  110. package/dist/services/docs/review/gates/RfpDefinitionGate.d.ts +7 -0
  111. package/dist/services/docs/review/gates/RfpDefinitionGate.d.ts.map +1 -0
  112. package/dist/services/docs/review/gates/RfpDefinitionGate.js +173 -0
  113. package/dist/services/docs/review/gates/SdsAdaptersGate.d.ts +7 -0
  114. package/dist/services/docs/review/gates/SdsAdaptersGate.d.ts.map +1 -0
  115. package/dist/services/docs/review/gates/SdsAdaptersGate.js +196 -0
  116. package/dist/services/docs/review/gates/SdsDecisionsGate.d.ts +7 -0
  117. package/dist/services/docs/review/gates/SdsDecisionsGate.d.ts.map +1 -0
  118. package/dist/services/docs/review/gates/SdsDecisionsGate.js +89 -0
  119. package/dist/services/docs/review/gates/SdsOpsGate.d.ts +7 -0
  120. package/dist/services/docs/review/gates/SdsOpsGate.d.ts.map +1 -0
  121. package/dist/services/docs/review/gates/SdsOpsGate.js +162 -0
  122. package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.d.ts +7 -0
  123. package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.d.ts.map +1 -0
  124. package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.js +166 -0
  125. package/dist/services/docs/review/gates/SqlRequiredTablesGate.d.ts +7 -0
  126. package/dist/services/docs/review/gates/SqlRequiredTablesGate.d.ts.map +1 -0
  127. package/dist/services/docs/review/gates/SqlRequiredTablesGate.js +273 -0
  128. package/dist/services/docs/review/gates/SqlSyntaxGate.d.ts +7 -0
  129. package/dist/services/docs/review/gates/SqlSyntaxGate.d.ts.map +1 -0
  130. package/dist/services/docs/review/gates/SqlSyntaxGate.js +203 -0
  131. package/dist/services/docs/review/gates/TerminologyNormalizationGate.d.ts +9 -0
  132. package/dist/services/docs/review/gates/TerminologyNormalizationGate.d.ts.map +1 -0
  133. package/dist/services/docs/review/gates/TerminologyNormalizationGate.js +217 -0
  134. package/dist/services/docs/review/glossary.json +47 -0
  135. package/dist/services/estimate/EstimateService.d.ts +2 -0
  136. package/dist/services/estimate/EstimateService.d.ts.map +1 -1
  137. package/dist/services/estimate/EstimateService.js +66 -18
  138. package/dist/services/estimate/VelocityService.d.ts +4 -0
  139. package/dist/services/estimate/VelocityService.d.ts.map +1 -1
  140. package/dist/services/estimate/VelocityService.js +179 -36
  141. package/dist/services/estimate/types.d.ts +1 -0
  142. package/dist/services/estimate/types.d.ts.map +1 -1
  143. package/dist/services/execution/GatewayTrioService.d.ts +200 -0
  144. package/dist/services/execution/GatewayTrioService.d.ts.map +1 -0
  145. package/dist/services/execution/GatewayTrioService.js +2492 -0
  146. package/dist/services/execution/QaApiRunner.d.ts +30 -0
  147. package/dist/services/execution/QaApiRunner.d.ts.map +1 -0
  148. package/dist/services/execution/QaApiRunner.js +881 -0
  149. package/dist/services/execution/QaFollowupService.d.ts +2 -0
  150. package/dist/services/execution/QaFollowupService.d.ts.map +1 -1
  151. package/dist/services/execution/QaFollowupService.js +9 -2
  152. package/dist/services/execution/QaPlanValidator.d.ts +10 -0
  153. package/dist/services/execution/QaPlanValidator.d.ts.map +1 -0
  154. package/dist/services/execution/QaPlanValidator.js +128 -0
  155. package/dist/services/execution/QaProfileService.d.ts +27 -1
  156. package/dist/services/execution/QaProfileService.d.ts.map +1 -1
  157. package/dist/services/execution/QaProfileService.js +354 -7
  158. package/dist/services/execution/QaTasksService.d.ts +59 -1
  159. package/dist/services/execution/QaTasksService.d.ts.map +1 -1
  160. package/dist/services/execution/QaTasksService.js +3347 -318
  161. package/dist/services/execution/QaTestCommandBuilder.d.ts +51 -0
  162. package/dist/services/execution/QaTestCommandBuilder.d.ts.map +1 -0
  163. package/dist/services/execution/QaTestCommandBuilder.js +495 -0
  164. package/dist/services/execution/TaskSelectionService.d.ts +4 -2
  165. package/dist/services/execution/TaskSelectionService.d.ts.map +1 -1
  166. package/dist/services/execution/TaskSelectionService.js +144 -28
  167. package/dist/services/execution/TaskStateService.d.ts +19 -6
  168. package/dist/services/execution/TaskStateService.d.ts.map +1 -1
  169. package/dist/services/execution/TaskStateService.js +128 -13
  170. package/dist/services/execution/WorkOnTasksService.d.ts +32 -1
  171. package/dist/services/execution/WorkOnTasksService.d.ts.map +1 -1
  172. package/dist/services/execution/WorkOnTasksService.js +4667 -722
  173. package/dist/services/jobs/JobInsightsService.d.ts +4 -0
  174. package/dist/services/jobs/JobInsightsService.d.ts.map +1 -1
  175. package/dist/services/jobs/JobInsightsService.js +51 -5
  176. package/dist/services/jobs/JobResumeService.d.ts.map +1 -1
  177. package/dist/services/jobs/JobResumeService.js +23 -10
  178. package/dist/services/jobs/JobService.d.ts +56 -4
  179. package/dist/services/jobs/JobService.d.ts.map +1 -1
  180. package/dist/services/jobs/JobService.js +232 -1
  181. package/dist/services/openapi/OpenApiService.d.ts +51 -0
  182. package/dist/services/openapi/OpenApiService.d.ts.map +1 -1
  183. package/dist/services/openapi/OpenApiService.js +953 -106
  184. package/dist/services/planning/CreateTasksService.d.ts +21 -0
  185. package/dist/services/planning/CreateTasksService.d.ts.map +1 -1
  186. package/dist/services/planning/CreateTasksService.js +569 -31
  187. package/dist/services/planning/RefineTasksService.d.ts +9 -0
  188. package/dist/services/planning/RefineTasksService.d.ts.map +1 -1
  189. package/dist/services/planning/RefineTasksService.js +409 -59
  190. package/dist/services/review/CodeReviewService.d.ts +18 -0
  191. package/dist/services/review/CodeReviewService.d.ts.map +1 -1
  192. package/dist/services/review/CodeReviewService.js +1309 -167
  193. package/dist/services/review/ReviewNormalizer.d.ts +9 -0
  194. package/dist/services/review/ReviewNormalizer.d.ts.map +1 -0
  195. package/dist/services/review/ReviewNormalizer.js +147 -0
  196. package/dist/services/shared/AuthErrors.d.ts +3 -0
  197. package/dist/services/shared/AuthErrors.d.ts.map +1 -0
  198. package/dist/services/shared/AuthErrors.js +17 -0
  199. package/dist/services/shared/DocdexGuidance.d.ts +7 -0
  200. package/dist/services/shared/DocdexGuidance.d.ts.map +1 -0
  201. package/dist/services/shared/DocdexGuidance.js +12 -0
  202. package/dist/services/shared/ProjectGuidance.d.ts +17 -0
  203. package/dist/services/shared/ProjectGuidance.d.ts.map +1 -0
  204. package/dist/services/shared/ProjectGuidance.js +78 -0
  205. package/dist/services/system/ToolDenylist.d.ts +13 -0
  206. package/dist/services/system/ToolDenylist.d.ts.map +1 -0
  207. package/dist/services/system/ToolDenylist.js +85 -0
  208. package/dist/services/tasks/TaskCommentFormatter.d.ts +20 -0
  209. package/dist/services/tasks/TaskCommentFormatter.d.ts.map +1 -0
  210. package/dist/services/tasks/TaskCommentFormatter.js +54 -0
  211. package/dist/services/telemetry/TelemetryService.d.ts.map +1 -1
  212. package/dist/services/telemetry/TelemetryService.js +39 -7
  213. package/dist/workspace/WorkspaceManager.d.ts +26 -0
  214. package/dist/workspace/WorkspaceManager.d.ts.map +1 -1
  215. package/dist/workspace/WorkspaceManager.js +206 -32
  216. package/package.json +6 -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.9
7
+ - Release v0.1.9.
8
+
6
9
  ## 0.1.8
7
10
  - Initial release.
package/README.md CHANGED
@@ -7,7 +7,7 @@ Core services that power the mcoda CLI (docs, planning, jobs, telemetry, openapi
7
7
  - Install: `npm i @mcoda/core`
8
8
 
9
9
  ## What it provides
10
- - WorkspaceResolver for discovering/initializing `.mcoda` workspaces.
10
+ - WorkspaceResolver for discovering/initializing workspace data under `~/.mcoda/workspaces/<fingerprint>`.
11
11
  - Service layer for docs, planning, execution, review, telemetry, and system updates.
12
12
  - API wrappers (AgentsApi, TasksApi, QaTasksApi) used by the CLI.
13
13
 
@@ -21,7 +21,7 @@ const jobs = new JobService(workspace);
21
21
  ```
22
22
 
23
23
  ## Notes
24
- - Most services expect a resolved workspace and read/write `.mcoda/` state.
24
+ - Most services expect a resolved workspace and read/write state under `~/.mcoda/workspaces/<fingerprint>`.
25
25
  - Primarily used by the mcoda CLI; APIs may evolve.
26
26
 
27
27
  ## 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,13 @@ export declare class AgentsApi {
31
32
  response: InvocationResult;
32
33
  prompt: string;
33
34
  }>;
35
+ private extractTokenUsage;
36
+ private extractTelemetryInfo;
37
+ runAgent(idOrSlug: string, prompts: string[], metadata?: Record<string, unknown>): Promise<{
38
+ agent: Pick<Agent, "id" | "slug">;
39
+ prompts: string[];
40
+ responses: InvocationResult[];
41
+ }>;
34
42
  setDefaultAgent(idOrSlug: string, workspaceId?: string, commandName?: string): Promise<void>;
35
43
  }
36
44
  //# 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;IAoBjD,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;IAyD/E,OAAO,CAAC,iBAAiB;IA0GzB,OAAO,CAAC,oBAAoB;IAetB,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;IAoE7F,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);
@@ -136,11 +140,13 @@ export class AgentsApi {
136
140
  agentId: agent.id,
137
141
  commandRunId: run.id,
138
142
  modelName: agent.defaultModel,
143
+ commandName: "agent.test",
144
+ action: "health_check",
139
145
  tokensPrompt: 0,
140
146
  tokensCompletion: 0,
141
147
  tokensTotal: 0,
142
148
  timestamp: new Date().toISOString(),
143
- metadata: { reason: "agent.test", healthStatus: health.status },
149
+ metadata: { reason: "agent.test", healthStatus: health.status, phase: "health_check", attempt: 1 },
144
150
  });
145
151
  return health;
146
152
  });
@@ -150,23 +156,212 @@ export class AgentsApi {
150
156
  const trimmedPrompt = prompt.trim() || "Hello from mcoda test-agent. Please reply with a short acknowledgement.";
151
157
  return this.withCommandRun("agent.test", { id: agent.id, slug: agent.slug, prompt: trimmedPrompt }, async (run) => {
152
158
  const health = await this.agentService.healthCheck(agent.id);
159
+ const startedAtMs = Date.now();
160
+ const startedAt = new Date(startedAtMs).toISOString();
153
161
  const response = await this.agentService.invoke(agent.id, {
154
162
  input: trimmedPrompt,
155
163
  metadata: { command: "test-agent" },
156
164
  });
165
+ const finishedAtMs = Date.now();
166
+ const finishedAt = new Date(finishedAtMs).toISOString();
167
+ const durationMs = finishedAtMs - startedAtMs;
168
+ const durationSeconds = durationMs / 1000;
169
+ const usage = this.extractTokenUsage(response.metadata);
170
+ const telemetry = this.extractTelemetryInfo(response.metadata);
171
+ const resolvedDurationMs = usage.durationMs ?? durationMs;
172
+ const resolvedDurationSeconds = resolvedDurationMs !== undefined ? resolvedDurationMs / 1000 : durationSeconds;
173
+ const resolvedStartedAt = usage.startedAt ?? startedAt;
174
+ const resolvedFinishedAt = usage.finishedAt ?? finishedAt;
157
175
  await this.repo.recordTokenUsage({
158
176
  agentId: agent.id,
159
177
  commandRunId: run.id,
160
178
  modelName: agent.defaultModel,
161
- tokensPrompt: 0,
162
- tokensCompletion: 0,
163
- tokensTotal: 0,
164
- timestamp: new Date().toISOString(),
165
- metadata: { reason: "agent.test", healthStatus: health.status, adapter: response.adapter },
179
+ commandName: "agent.test",
180
+ action: "probe",
181
+ invocationKind: telemetry.invocationKind,
182
+ provider: telemetry.provider,
183
+ currency: telemetry.currency,
184
+ tokensPrompt: usage.tokensPrompt ?? 0,
185
+ tokensCompletion: usage.tokensCompletion ?? 0,
186
+ tokensTotal: usage.tokensTotal ?? 0,
187
+ tokensCached: usage.tokensCached,
188
+ tokensCacheRead: usage.tokensCacheRead,
189
+ tokensCacheWrite: usage.tokensCacheWrite,
190
+ durationSeconds: resolvedDurationSeconds,
191
+ durationMs: resolvedDurationMs,
192
+ startedAt: resolvedStartedAt,
193
+ finishedAt: resolvedFinishedAt,
194
+ timestamp: resolvedFinishedAt ?? new Date().toISOString(),
195
+ metadata: {
196
+ reason: "agent.test",
197
+ healthStatus: health.status,
198
+ adapter: response.adapter,
199
+ phase: "probe",
200
+ attempt: 1,
201
+ },
166
202
  });
167
203
  return { health, response, prompt: trimmedPrompt };
168
204
  });
169
205
  }
206
+ extractTokenUsage(metadata) {
207
+ if (!metadata || typeof metadata !== "object")
208
+ return {};
209
+ const usage = typeof metadata.usage === "object" && metadata.usage ? metadata.usage : undefined;
210
+ const promptDetails = typeof usage?.prompt_tokens_details === "object" && usage?.prompt_tokens_details
211
+ ? usage.prompt_tokens_details
212
+ : undefined;
213
+ const cacheDetails = typeof usage?.cache === "object" && usage?.cache ? usage.cache : undefined;
214
+ const toNumber = (value) => typeof value === "number" && Number.isFinite(value) ? value : undefined;
215
+ const toTimestamp = (value) => {
216
+ if (typeof value === "string" && value.trim())
217
+ return value;
218
+ if (typeof value === "number" && Number.isFinite(value))
219
+ return new Date(value).toISOString();
220
+ return undefined;
221
+ };
222
+ const tokensPrompt = toNumber(metadata.tokensPrompt) ??
223
+ toNumber(metadata.tokens_prompt) ??
224
+ toNumber(usage?.prompt_tokens) ??
225
+ toNumber(usage?.promptTokens) ??
226
+ toNumber(usage?.prompt_tokens);
227
+ const tokensCompletion = toNumber(metadata.tokensCompletion) ??
228
+ toNumber(metadata.tokens_completion) ??
229
+ toNumber(usage?.completion_tokens) ??
230
+ toNumber(usage?.completionTokens) ??
231
+ toNumber(usage?.completion_tokens);
232
+ let tokensTotal = toNumber(metadata.tokensTotal) ??
233
+ toNumber(metadata.tokens_total) ??
234
+ toNumber(usage?.total_tokens) ??
235
+ toNumber(usage?.totalTokens) ??
236
+ toNumber(usage?.total_tokens);
237
+ if (tokensTotal === undefined && tokensPrompt !== undefined && tokensCompletion !== undefined) {
238
+ tokensTotal = tokensPrompt + tokensCompletion;
239
+ }
240
+ const tokensCached = toNumber(metadata.tokensCached) ??
241
+ toNumber(metadata.tokens_cached) ??
242
+ toNumber(metadata.cachedTokens) ??
243
+ toNumber(metadata.cached_tokens) ??
244
+ toNumber(usage?.cached_tokens) ??
245
+ toNumber(usage?.cachedTokens) ??
246
+ toNumber(promptDetails?.cached_tokens) ??
247
+ toNumber(promptDetails?.cachedTokens) ??
248
+ toNumber(cacheDetails?.cached_tokens) ??
249
+ toNumber(cacheDetails?.cachedTokens);
250
+ const tokensCacheRead = toNumber(metadata.tokensCacheRead) ??
251
+ toNumber(metadata.tokens_cache_read) ??
252
+ toNumber(metadata.cacheRead) ??
253
+ toNumber(metadata.cache_read) ??
254
+ toNumber(usage?.tokens_cache_read) ??
255
+ toNumber(usage?.cache_read) ??
256
+ toNumber(usage?.cacheRead) ??
257
+ toNumber(promptDetails?.cache_read) ??
258
+ toNumber(promptDetails?.cacheRead) ??
259
+ toNumber(cacheDetails?.cache_read) ??
260
+ toNumber(cacheDetails?.cacheRead);
261
+ const tokensCacheWrite = toNumber(metadata.tokensCacheWrite) ??
262
+ toNumber(metadata.tokens_cache_write) ??
263
+ toNumber(metadata.cacheWrite) ??
264
+ toNumber(metadata.cache_write) ??
265
+ toNumber(usage?.tokens_cache_write) ??
266
+ toNumber(usage?.cache_write) ??
267
+ toNumber(usage?.cacheWrite) ??
268
+ toNumber(promptDetails?.cache_write) ??
269
+ toNumber(promptDetails?.cacheWrite) ??
270
+ toNumber(cacheDetails?.cache_write) ??
271
+ toNumber(cacheDetails?.cacheWrite);
272
+ const durationSeconds = toNumber(metadata.durationSeconds) ??
273
+ toNumber(metadata.duration_seconds);
274
+ const durationMs = toNumber(metadata.durationMs) ??
275
+ toNumber(metadata.duration_ms) ??
276
+ toNumber(metadata.elapsed_ms) ??
277
+ toNumber(metadata.latency_ms) ??
278
+ toNumber(metadata.latencyMs) ??
279
+ toNumber(usage?.duration_ms) ??
280
+ (durationSeconds !== undefined ? durationSeconds * 1000 : undefined);
281
+ const startedAt = toTimestamp(metadata.startedAt) ??
282
+ toTimestamp(metadata.started_at) ??
283
+ toTimestamp(metadata.startTime) ??
284
+ toTimestamp(metadata.start_time);
285
+ const finishedAt = toTimestamp(metadata.finishedAt) ??
286
+ toTimestamp(metadata.finished_at) ??
287
+ toTimestamp(metadata.endTime) ??
288
+ toTimestamp(metadata.end_time) ??
289
+ toTimestamp(metadata.completed_at);
290
+ return { tokensPrompt, tokensCompletion, tokensTotal, tokensCached, tokensCacheRead, tokensCacheWrite, durationMs, startedAt, finishedAt };
291
+ }
292
+ extractTelemetryInfo(metadata) {
293
+ if (!metadata || typeof metadata !== "object")
294
+ return {};
295
+ const toString = (value) => typeof value === "string" && value.trim() ? value : undefined;
296
+ return {
297
+ invocationKind: toString(metadata.invocationKind) ?? toString(metadata.invocation_kind),
298
+ provider: toString(metadata.provider) ?? toString(metadata.vendor),
299
+ currency: toString(metadata.currency),
300
+ };
301
+ }
302
+ async runAgent(idOrSlug, prompts, metadata) {
303
+ const agent = await this.resolveAgent(idOrSlug);
304
+ const cleaned = prompts.map((prompt) => prompt.trim()).filter(Boolean);
305
+ if (cleaned.length === 0) {
306
+ throw new Error("No prompts provided.");
307
+ }
308
+ return this.withCommandRun("agent.run", { id: agent.id, slug: agent.slug, promptCount: cleaned.length }, async (run) => {
309
+ const responses = [];
310
+ for (let index = 0; index < cleaned.length; index += 1) {
311
+ const input = cleaned[index];
312
+ const startedAtMs = Date.now();
313
+ const startedAt = new Date(startedAtMs).toISOString();
314
+ const response = await this.agentService.invoke(agent.id, {
315
+ input,
316
+ metadata: {
317
+ command: "agent-run",
318
+ promptIndex: index,
319
+ ...metadata,
320
+ },
321
+ });
322
+ const finishedAtMs = Date.now();
323
+ const finishedAt = new Date(finishedAtMs).toISOString();
324
+ const durationMs = finishedAtMs - startedAtMs;
325
+ const durationSeconds = durationMs / 1000;
326
+ const usage = this.extractTokenUsage(response.metadata);
327
+ const telemetry = this.extractTelemetryInfo(response.metadata);
328
+ const resolvedDurationMs = usage.durationMs ?? durationMs;
329
+ const resolvedDurationSeconds = resolvedDurationMs !== undefined ? resolvedDurationMs / 1000 : durationSeconds;
330
+ const resolvedStartedAt = usage.startedAt ?? startedAt;
331
+ const resolvedFinishedAt = usage.finishedAt ?? finishedAt;
332
+ await this.repo.recordTokenUsage({
333
+ agentId: agent.id,
334
+ commandRunId: run.id,
335
+ modelName: response.model ?? agent.defaultModel,
336
+ commandName: "agent.run",
337
+ action: "invoke",
338
+ invocationKind: telemetry.invocationKind,
339
+ provider: telemetry.provider,
340
+ currency: telemetry.currency,
341
+ tokensPrompt: usage.tokensPrompt,
342
+ tokensCompletion: usage.tokensCompletion,
343
+ tokensTotal: usage.tokensTotal,
344
+ tokensCached: usage.tokensCached,
345
+ tokensCacheRead: usage.tokensCacheRead,
346
+ tokensCacheWrite: usage.tokensCacheWrite,
347
+ durationSeconds: resolvedDurationSeconds,
348
+ durationMs: resolvedDurationMs,
349
+ startedAt: resolvedStartedAt,
350
+ finishedAt: resolvedFinishedAt,
351
+ timestamp: resolvedFinishedAt ?? new Date().toISOString(),
352
+ metadata: {
353
+ reason: "agent.run",
354
+ adapter: response.adapter,
355
+ promptIndex: index,
356
+ phase: "agent_run",
357
+ attempt: 1,
358
+ },
359
+ });
360
+ responses.push(response);
361
+ }
362
+ return { agent: { id: agent.id, slug: agent.slug }, prompts: cleaned, responses };
363
+ });
364
+ }
170
365
  async setDefaultAgent(idOrSlug, workspaceId = "__GLOBAL__", commandName = "default") {
171
366
  const agent = await this.resolveAgent(idOrSlug);
172
367
  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;CAqC5B"}
@@ -5,6 +5,7 @@ export class QaTasksApi {
5
5
  const workspace = await WorkspaceResolver.resolveWorkspace({
6
6
  cwd: process.cwd(),
7
7
  explicitWorkspace: request.workspaceRoot,
8
+ noRepoWrites: true,
8
9
  });
9
10
  const service = await QaTasksService.create(workspace, { noTelemetry: request.noTelemetry ?? false });
10
11
  try {
@@ -15,6 +16,8 @@ export class QaTasksApi {
15
16
  storyKey: request.storyKey,
16
17
  taskKeys: request.taskKeys,
17
18
  statusFilter: request.statusFilter,
19
+ ignoreStatusFilter: request.ignoreStatusFilter,
20
+ limit: request.limit,
18
21
  mode: request.mode,
19
22
  resumeJobId: request.resumeJobId,
20
23
  profileName: request.profileName,
@@ -22,11 +25,14 @@ export class QaTasksApi {
22
25
  testCommand: request.testCommand,
23
26
  agentName: request.agentName,
24
27
  agentStream: request.agentStream,
28
+ rateAgents: request.rateAgents,
25
29
  createFollowupTasks: request.createFollowupTasks,
26
30
  dryRun: request.dryRun,
27
31
  result: request.result,
28
32
  notes: request.notes,
29
33
  evidenceUrl: request.evidenceUrl,
34
+ allowDirty: request.allowDirty,
35
+ cleanIgnorePaths: request.cleanIgnorePaths,
30
36
  });
31
37
  }
32
38
  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":"AAEA,eAAO,MAAM,sBAAsB,QAO3B,CAAC;AAET,eAAO,MAAM,4BAA4B,QAEjC,CAAC;AAET,eAAO,MAAM,0BAA0B,QAgB/B,CAAC"}
@@ -1,21 +1,29 @@
1
+ import { GLOSSARY_PROMPT_SNIPPET } from "../services/docs/review/Glossary.js";
1
2
  export const DEFAULT_PDR_JOB_PROMPT = `
2
3
  You generate Product Design Reviews (PDR) grounded strictly in provided RFPs and related docs.
3
4
  Summarize intent, constraints, interfaces, risks, and open questions concisely with clear headings.
4
5
  Avoid inventing APIs or requirements; highlight uncertainties and assumptions for follow-up.
6
+ 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).
7
+
8
+ ${GLOSSARY_PROMPT_SNIPPET}
5
9
  `.trim();
6
10
  export const DEFAULT_PDR_CHARACTER_PROMPT = `
7
- Be precise, risk-aware, and concise. Prefer bullet points. Cite assumptions and avoid speculation.
11
+ Be precise, risk-aware, and concise. Prefer bullet points. Cite assumptions and avoid speculation. Always state the technology stack with rationale.
8
12
  `.trim();
9
13
  export const DEFAULT_PDR_RUNBOOK_PROMPT = `
10
14
  Produce Markdown with the following sections at minimum:
11
15
  - Introduction
12
16
  - Scope
17
+ - Technology Stack (detail frontend, backend, data, infra, tooling; default to TypeScript/React/MySQL/Redis/Bash unless domain clearly indicates otherwise)
13
18
  - Requirements & Constraints
14
19
  - Architecture Overview
15
20
  - Interfaces / APIs (do not invent endpoints; if missing, list as open questions)
16
21
  - Non-Functional Requirements
17
22
  - Risks & Mitigations
23
+ - Resolved Decisions (include when open questions are resolved)
18
24
  - Open Questions
19
25
 
20
26
  Call out gaps and missing specifications explicitly. Keep outputs grounded in the given context.
27
+
28
+ ${GLOSSARY_PROMPT_SNIPPET}
21
29
  `.trim();
@@ -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":"AAEA,eAAO,MAAM,sBAAsB,QAK3B,CAAC;AAET,eAAO,MAAM,4BAA4B,QAEjC,CAAC;AAET,eAAO,MAAM,0BAA0B,QAuB/B,CAAC;AAET,eAAO,MAAM,oBAAoB,QAkBzB,CAAC"}
@@ -1,6 +1,9 @@
1
+ import { GLOSSARY_PROMPT_SNIPPET } from "../services/docs/review/Glossary.js";
1
2
  export const DEFAULT_SDS_JOB_PROMPT = `
2
3
  You generate Software Design Specifications (SDS) that stay aligned to the provided PDR, RFP, and OpenAPI context.
3
4
  Highlight architecture, data, interfaces, non-functional requirements, risks, and open questions with traceability back to sources.
5
+
6
+ ${GLOSSARY_PROMPT_SNIPPET}
4
7
  `.trim();
5
8
  export const DEFAULT_SDS_CHARACTER_PROMPT = `
6
9
  Be architectural, explicit, and risk-aware. Avoid speculation, cite assumptions, and flag gaps that need clarification.
@@ -13,6 +16,7 @@ Mandatory sections (include even if you must mark TODOs):
13
16
  - Goals & Scope
14
17
  - Architecture Overview
15
18
  - Components & Responsibilities
19
+ - Planned Folder Tree (include a detailed final structure, scripts, and tooling paths)
16
20
  - Data Model & Persistence
17
21
  - Interfaces & Contracts (reference OpenAPI operations when available)
18
22
  - Non-Functional Requirements
@@ -20,10 +24,13 @@ Mandatory sections (include even if you must mark TODOs):
20
24
  - Failure Modes & Resilience
21
25
  - Risks & Mitigations
22
26
  - Assumptions
27
+ - Resolved Decisions (include when open questions are resolved)
23
28
  - Open Questions
24
29
  - Acceptance Criteria
25
30
 
26
31
  If context is missing, call it out explicitly and list the questions needed to complete the SDS.
32
+
33
+ ${GLOSSARY_PROMPT_SNIPPET}
27
34
  `.trim();
28
35
  export const DEFAULT_SDS_TEMPLATE = `
29
36
  # Software Design Specification
@@ -32,6 +39,7 @@ export const DEFAULT_SDS_TEMPLATE = `
32
39
  ## Goals & Scope
33
40
  ## Architecture Overview
34
41
  ## Components & Responsibilities
42
+ ## Planned Folder Tree
35
43
  ## Data Model & Persistence
36
44
  ## Interfaces & Contracts
37
45
  ## Non-Functional Requirements
@@ -39,6 +47,7 @@ export const DEFAULT_SDS_TEMPLATE = `
39
47
  ## Failure Modes & Resilience
40
48
  ## Risks & Mitigations
41
49
  ## Assumptions
50
+ ## Resolved Decisions
42
51
  ## Open Questions
43
52
  ## Acceptance Criteria
44
53
  `.trim();
@@ -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,60 @@
1
+ import { AgentService } from "@mcoda/agents";
2
+ import { GlobalRepository, WorkspaceRepository } from "@mcoda/db";
3
+ import { Agent, AgentHealth } from "@mcoda/shared";
4
+ import { RoutingService } from "./RoutingService.js";
5
+ import { WorkspaceResolution } from "../../workspace/WorkspaceManager.js";
6
+ export type AgentRatingRequest = {
7
+ workspace: WorkspaceResolution;
8
+ agentId: string;
9
+ commandName: string;
10
+ jobId?: string;
11
+ commandRunId?: string;
12
+ taskId?: string;
13
+ taskKey?: string;
14
+ discipline?: string;
15
+ complexity?: number;
16
+ reviewerAgentName?: string;
17
+ ratingWindow?: number;
18
+ };
19
+ export type AgentCapabilityCandidate = {
20
+ agent: Agent;
21
+ capabilities: string[];
22
+ healthStatus?: AgentHealth["status"] | "unknown";
23
+ };
24
+ export type AgentCapabilitySelection = {
25
+ agent: Agent;
26
+ capabilities: string[];
27
+ missingRequired: string[];
28
+ missingPreferred: string[];
29
+ meetsRequired: boolean;
30
+ reason: string;
31
+ };
32
+ export declare const selectBestAgentForCapabilities: (input: {
33
+ candidates: AgentCapabilityCandidate[];
34
+ required: string[];
35
+ preferred?: string[];
36
+ }) => AgentCapabilitySelection | undefined;
37
+ export declare class AgentRatingService {
38
+ private workspace;
39
+ private deps;
40
+ constructor(workspace: WorkspaceResolution, deps: {
41
+ workspaceRepo: WorkspaceRepository;
42
+ globalRepo: GlobalRepository;
43
+ agentService: AgentService;
44
+ routingService: RoutingService;
45
+ });
46
+ static create(workspace: WorkspaceResolution): Promise<AgentRatingService>;
47
+ close(): Promise<void>;
48
+ private ratingPromptPath;
49
+ private loadRatingPrompt;
50
+ private resolveReviewer;
51
+ private loadUsage;
52
+ private countIterations;
53
+ private loadDurationSeconds;
54
+ private buildReviewContext;
55
+ private runReviewer;
56
+ private computeBudgets;
57
+ rate(request: AgentRatingRequest): Promise<void>;
58
+ private writeRatingArtifact;
59
+ }
60
+ //# 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;AAClE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACnD,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,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAQF,eAAO,MAAM,8BAA8B,GAAI,OAAO;IACpD,UAAU,EAAE,wBAAwB,EAAE,CAAC;IACvC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,KAAG,wBAAwB,GAAG,SAwD9B,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"}