@mcoda/core 0.1.9 → 0.1.12

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 (204) hide show
  1. package/README.md +2 -2
  2. package/dist/api/AgentsApi.d.ts +1 -0
  3. package/dist/api/AgentsApi.d.ts.map +1 -1
  4. package/dist/api/AgentsApi.js +136 -11
  5. package/dist/api/QaTasksApi.d.ts.map +1 -1
  6. package/dist/api/QaTasksApi.js +4 -0
  7. package/dist/prompts/PdrPrompts.d.ts.map +1 -1
  8. package/dist/prompts/PdrPrompts.js +6 -0
  9. package/dist/prompts/SdsPrompts.d.ts.map +1 -1
  10. package/dist/prompts/SdsPrompts.js +7 -0
  11. package/dist/services/agents/AgentRatingService.d.ts +19 -0
  12. package/dist/services/agents/AgentRatingService.d.ts.map +1 -1
  13. package/dist/services/agents/AgentRatingService.js +66 -2
  14. package/dist/services/agents/GatewayAgentService.d.ts +8 -0
  15. package/dist/services/agents/GatewayAgentService.d.ts.map +1 -1
  16. package/dist/services/agents/GatewayAgentService.js +462 -65
  17. package/dist/services/agents/GatewayHandoff.d.ts +5 -1
  18. package/dist/services/agents/GatewayHandoff.d.ts.map +1 -1
  19. package/dist/services/agents/GatewayHandoff.js +65 -32
  20. package/dist/services/agents/RoutingService.d.ts +1 -0
  21. package/dist/services/agents/RoutingService.d.ts.map +1 -1
  22. package/dist/services/agents/RoutingService.js +4 -4
  23. package/dist/services/backlog/BacklogService.d.ts +23 -0
  24. package/dist/services/backlog/BacklogService.d.ts.map +1 -1
  25. package/dist/services/backlog/BacklogService.js +62 -7
  26. package/dist/services/backlog/TaskOrderingHeuristics.d.ts +12 -0
  27. package/dist/services/backlog/TaskOrderingHeuristics.d.ts.map +1 -0
  28. package/dist/services/backlog/TaskOrderingHeuristics.js +56 -0
  29. package/dist/services/backlog/TaskOrderingService.d.ts +16 -4
  30. package/dist/services/backlog/TaskOrderingService.d.ts.map +1 -1
  31. package/dist/services/backlog/TaskOrderingService.js +529 -73
  32. package/dist/services/docs/DocInventory.d.ts +11 -0
  33. package/dist/services/docs/DocInventory.d.ts.map +1 -0
  34. package/dist/services/docs/DocInventory.js +230 -0
  35. package/dist/services/docs/DocgenRunContext.d.ts +59 -0
  36. package/dist/services/docs/DocgenRunContext.d.ts.map +1 -0
  37. package/dist/services/docs/DocgenRunContext.js +4 -0
  38. package/dist/services/docs/DocsService.d.ts +59 -2
  39. package/dist/services/docs/DocsService.d.ts.map +1 -1
  40. package/dist/services/docs/DocsService.js +1701 -48
  41. package/dist/services/docs/alignment/DocAlignmentGraph.d.ts +23 -0
  42. package/dist/services/docs/alignment/DocAlignmentGraph.d.ts.map +1 -0
  43. package/dist/services/docs/alignment/DocAlignmentGraph.js +78 -0
  44. package/dist/services/docs/alignment/DocAlignmentPatcher.d.ts +19 -0
  45. package/dist/services/docs/alignment/DocAlignmentPatcher.d.ts.map +1 -0
  46. package/dist/services/docs/alignment/DocAlignmentPatcher.js +222 -0
  47. package/dist/services/docs/patch/DocPatchEngine.d.ts +57 -0
  48. package/dist/services/docs/patch/DocPatchEngine.d.ts.map +1 -0
  49. package/dist/services/docs/patch/DocPatchEngine.js +331 -0
  50. package/dist/services/docs/review/Glossary.d.ts +16 -0
  51. package/dist/services/docs/review/Glossary.d.ts.map +1 -0
  52. package/dist/services/docs/review/Glossary.js +47 -0
  53. package/dist/services/docs/review/ReviewReportRenderer.d.ts +3 -0
  54. package/dist/services/docs/review/ReviewReportRenderer.d.ts.map +1 -0
  55. package/dist/services/docs/review/ReviewReportRenderer.js +133 -0
  56. package/dist/services/docs/review/ReviewReportSchema.d.ts +39 -0
  57. package/dist/services/docs/review/ReviewReportSchema.d.ts.map +1 -0
  58. package/dist/services/docs/review/ReviewReportSchema.js +47 -0
  59. package/dist/services/docs/review/ReviewTypes.d.ts +76 -0
  60. package/dist/services/docs/review/ReviewTypes.d.ts.map +1 -0
  61. package/dist/services/docs/review/ReviewTypes.js +94 -0
  62. package/dist/services/docs/review/gates/AdminOpenApiSpecGate.d.ts +7 -0
  63. package/dist/services/docs/review/gates/AdminOpenApiSpecGate.d.ts.map +1 -0
  64. package/dist/services/docs/review/gates/AdminOpenApiSpecGate.js +93 -0
  65. package/dist/services/docs/review/gates/ApiPathConsistencyGate.d.ts +7 -0
  66. package/dist/services/docs/review/gates/ApiPathConsistencyGate.d.ts.map +1 -0
  67. package/dist/services/docs/review/gates/ApiPathConsistencyGate.js +308 -0
  68. package/dist/services/docs/review/gates/BuildReadyCompletenessGate.d.ts +8 -0
  69. package/dist/services/docs/review/gates/BuildReadyCompletenessGate.d.ts.map +1 -0
  70. package/dist/services/docs/review/gates/BuildReadyCompletenessGate.js +278 -0
  71. package/dist/services/docs/review/gates/DeploymentBlueprintGate.d.ts +8 -0
  72. package/dist/services/docs/review/gates/DeploymentBlueprintGate.d.ts.map +1 -0
  73. package/dist/services/docs/review/gates/DeploymentBlueprintGate.js +487 -0
  74. package/dist/services/docs/review/gates/NoMaybesGate.d.ts +8 -0
  75. package/dist/services/docs/review/gates/NoMaybesGate.d.ts.map +1 -0
  76. package/dist/services/docs/review/gates/NoMaybesGate.js +145 -0
  77. package/dist/services/docs/review/gates/OpenApiCoverageGate.d.ts +7 -0
  78. package/dist/services/docs/review/gates/OpenApiCoverageGate.d.ts.map +1 -0
  79. package/dist/services/docs/review/gates/OpenApiCoverageGate.js +266 -0
  80. package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.d.ts +7 -0
  81. package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.d.ts.map +1 -0
  82. package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.js +59 -0
  83. package/dist/services/docs/review/gates/OpenQuestionsGate.d.ts +7 -0
  84. package/dist/services/docs/review/gates/OpenQuestionsGate.d.ts.map +1 -0
  85. package/dist/services/docs/review/gates/OpenQuestionsGate.js +200 -0
  86. package/dist/services/docs/review/gates/PdrInterfacesGate.d.ts +7 -0
  87. package/dist/services/docs/review/gates/PdrInterfacesGate.d.ts.map +1 -0
  88. package/dist/services/docs/review/gates/PdrInterfacesGate.js +159 -0
  89. package/dist/services/docs/review/gates/PdrOpenQuestionsGate.d.ts +8 -0
  90. package/dist/services/docs/review/gates/PdrOpenQuestionsGate.d.ts.map +1 -0
  91. package/dist/services/docs/review/gates/PdrOpenQuestionsGate.js +129 -0
  92. package/dist/services/docs/review/gates/PdrOwnershipGate.d.ts +7 -0
  93. package/dist/services/docs/review/gates/PdrOwnershipGate.d.ts.map +1 -0
  94. package/dist/services/docs/review/gates/PdrOwnershipGate.js +169 -0
  95. package/dist/services/docs/review/gates/PlaceholderArtifactGate.d.ts +10 -0
  96. package/dist/services/docs/review/gates/PlaceholderArtifactGate.d.ts.map +1 -0
  97. package/dist/services/docs/review/gates/PlaceholderArtifactGate.js +261 -0
  98. package/dist/services/docs/review/gates/RfpConsentGate.d.ts +6 -0
  99. package/dist/services/docs/review/gates/RfpConsentGate.d.ts.map +1 -0
  100. package/dist/services/docs/review/gates/RfpConsentGate.js +127 -0
  101. package/dist/services/docs/review/gates/RfpDefinitionGate.d.ts +7 -0
  102. package/dist/services/docs/review/gates/RfpDefinitionGate.d.ts.map +1 -0
  103. package/dist/services/docs/review/gates/RfpDefinitionGate.js +173 -0
  104. package/dist/services/docs/review/gates/SdsAdaptersGate.d.ts +7 -0
  105. package/dist/services/docs/review/gates/SdsAdaptersGate.d.ts.map +1 -0
  106. package/dist/services/docs/review/gates/SdsAdaptersGate.js +196 -0
  107. package/dist/services/docs/review/gates/SdsDecisionsGate.d.ts +7 -0
  108. package/dist/services/docs/review/gates/SdsDecisionsGate.d.ts.map +1 -0
  109. package/dist/services/docs/review/gates/SdsDecisionsGate.js +89 -0
  110. package/dist/services/docs/review/gates/SdsOpsGate.d.ts +7 -0
  111. package/dist/services/docs/review/gates/SdsOpsGate.d.ts.map +1 -0
  112. package/dist/services/docs/review/gates/SdsOpsGate.js +162 -0
  113. package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.d.ts +7 -0
  114. package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.d.ts.map +1 -0
  115. package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.js +166 -0
  116. package/dist/services/docs/review/gates/SqlRequiredTablesGate.d.ts +7 -0
  117. package/dist/services/docs/review/gates/SqlRequiredTablesGate.d.ts.map +1 -0
  118. package/dist/services/docs/review/gates/SqlRequiredTablesGate.js +273 -0
  119. package/dist/services/docs/review/gates/SqlSyntaxGate.d.ts +7 -0
  120. package/dist/services/docs/review/gates/SqlSyntaxGate.d.ts.map +1 -0
  121. package/dist/services/docs/review/gates/SqlSyntaxGate.js +203 -0
  122. package/dist/services/docs/review/gates/TerminologyNormalizationGate.d.ts +9 -0
  123. package/dist/services/docs/review/gates/TerminologyNormalizationGate.d.ts.map +1 -0
  124. package/dist/services/docs/review/gates/TerminologyNormalizationGate.js +217 -0
  125. package/dist/services/docs/review/glossary.json +47 -0
  126. package/dist/services/estimate/EstimateService.d.ts +2 -0
  127. package/dist/services/estimate/EstimateService.d.ts.map +1 -1
  128. package/dist/services/estimate/EstimateService.js +66 -18
  129. package/dist/services/estimate/VelocityService.d.ts +4 -0
  130. package/dist/services/estimate/VelocityService.d.ts.map +1 -1
  131. package/dist/services/estimate/VelocityService.js +179 -36
  132. package/dist/services/estimate/types.d.ts +1 -0
  133. package/dist/services/estimate/types.d.ts.map +1 -1
  134. package/dist/services/execution/GatewayTrioService.d.ts +71 -4
  135. package/dist/services/execution/GatewayTrioService.d.ts.map +1 -1
  136. package/dist/services/execution/GatewayTrioService.js +1695 -328
  137. package/dist/services/execution/QaApiRunner.d.ts +30 -0
  138. package/dist/services/execution/QaApiRunner.d.ts.map +1 -0
  139. package/dist/services/execution/QaApiRunner.js +881 -0
  140. package/dist/services/execution/QaFollowupService.d.ts +1 -0
  141. package/dist/services/execution/QaFollowupService.d.ts.map +1 -1
  142. package/dist/services/execution/QaFollowupService.js +8 -2
  143. package/dist/services/execution/QaPlanValidator.d.ts +10 -0
  144. package/dist/services/execution/QaPlanValidator.d.ts.map +1 -0
  145. package/dist/services/execution/QaPlanValidator.js +128 -0
  146. package/dist/services/execution/QaProfileService.d.ts +21 -1
  147. package/dist/services/execution/QaProfileService.d.ts.map +1 -1
  148. package/dist/services/execution/QaProfileService.js +214 -29
  149. package/dist/services/execution/QaTasksService.d.ts +41 -1
  150. package/dist/services/execution/QaTasksService.d.ts.map +1 -1
  151. package/dist/services/execution/QaTasksService.js +2851 -500
  152. package/dist/services/execution/QaTestCommandBuilder.d.ts +51 -0
  153. package/dist/services/execution/QaTestCommandBuilder.d.ts.map +1 -0
  154. package/dist/services/execution/QaTestCommandBuilder.js +495 -0
  155. package/dist/services/execution/TaskSelectionService.d.ts +4 -2
  156. package/dist/services/execution/TaskSelectionService.d.ts.map +1 -1
  157. package/dist/services/execution/TaskSelectionService.js +144 -28
  158. package/dist/services/execution/TaskStateService.d.ts +19 -6
  159. package/dist/services/execution/TaskStateService.d.ts.map +1 -1
  160. package/dist/services/execution/TaskStateService.js +128 -13
  161. package/dist/services/execution/WorkOnTasksService.d.ts +19 -2
  162. package/dist/services/execution/WorkOnTasksService.d.ts.map +1 -1
  163. package/dist/services/execution/WorkOnTasksService.js +3913 -1225
  164. package/dist/services/jobs/JobInsightsService.d.ts +4 -0
  165. package/dist/services/jobs/JobInsightsService.d.ts.map +1 -1
  166. package/dist/services/jobs/JobInsightsService.js +51 -5
  167. package/dist/services/jobs/JobResumeService.d.ts.map +1 -1
  168. package/dist/services/jobs/JobResumeService.js +23 -10
  169. package/dist/services/jobs/JobService.d.ts +56 -4
  170. package/dist/services/jobs/JobService.d.ts.map +1 -1
  171. package/dist/services/jobs/JobService.js +232 -1
  172. package/dist/services/openapi/OpenApiService.d.ts +41 -0
  173. package/dist/services/openapi/OpenApiService.d.ts.map +1 -1
  174. package/dist/services/openapi/OpenApiService.js +889 -98
  175. package/dist/services/planning/CreateTasksService.d.ts +15 -0
  176. package/dist/services/planning/CreateTasksService.d.ts.map +1 -1
  177. package/dist/services/planning/CreateTasksService.js +311 -6
  178. package/dist/services/planning/RefineTasksService.d.ts +4 -0
  179. package/dist/services/planning/RefineTasksService.d.ts.map +1 -1
  180. package/dist/services/planning/RefineTasksService.js +225 -24
  181. package/dist/services/review/CodeReviewService.d.ts +4 -0
  182. package/dist/services/review/CodeReviewService.d.ts.map +1 -1
  183. package/dist/services/review/CodeReviewService.js +778 -232
  184. package/dist/services/review/ReviewNormalizer.d.ts +9 -0
  185. package/dist/services/review/ReviewNormalizer.d.ts.map +1 -0
  186. package/dist/services/review/ReviewNormalizer.js +147 -0
  187. package/dist/services/shared/AuthErrors.d.ts +3 -0
  188. package/dist/services/shared/AuthErrors.d.ts.map +1 -0
  189. package/dist/services/shared/AuthErrors.js +17 -0
  190. package/dist/services/shared/DocdexGuidance.d.ts +7 -0
  191. package/dist/services/shared/DocdexGuidance.d.ts.map +1 -0
  192. package/dist/services/shared/DocdexGuidance.js +12 -0
  193. package/dist/services/shared/ProjectGuidance.d.ts +12 -1
  194. package/dist/services/shared/ProjectGuidance.d.ts.map +1 -1
  195. package/dist/services/shared/ProjectGuidance.js +64 -7
  196. package/dist/services/system/ToolDenylist.d.ts +13 -0
  197. package/dist/services/system/ToolDenylist.d.ts.map +1 -0
  198. package/dist/services/system/ToolDenylist.js +85 -0
  199. package/dist/services/telemetry/TelemetryService.d.ts.map +1 -1
  200. package/dist/services/telemetry/TelemetryService.js +39 -7
  201. package/dist/workspace/WorkspaceManager.d.ts +22 -0
  202. package/dist/workspace/WorkspaceManager.d.ts.map +1 -1
  203. package/dist/workspace/WorkspaceManager.js +203 -32
  204. package/package.json +6 -5
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
@@ -33,6 +33,7 @@ export declare class AgentsApi {
33
33
  prompt: string;
34
34
  }>;
35
35
  private extractTokenUsage;
36
+ private extractTelemetryInfo;
36
37
  runAgent(idOrSlug: string, prompts: string[], metadata?: Record<string, unknown>): Promise<{
37
38
  agent: Pick<Agent, "id" | "slug">;
38
39
  prompts: string[];
@@ -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,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"}
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"}
@@ -140,11 +140,13 @@ export class AgentsApi {
140
140
  agentId: agent.id,
141
141
  commandRunId: run.id,
142
142
  modelName: agent.defaultModel,
143
+ commandName: "agent.test",
144
+ action: "health_check",
143
145
  tokensPrompt: 0,
144
146
  tokensCompletion: 0,
145
147
  tokensTotal: 0,
146
148
  timestamp: new Date().toISOString(),
147
- metadata: { reason: "agent.test", healthStatus: health.status },
149
+ metadata: { reason: "agent.test", healthStatus: health.status, phase: "health_check", attempt: 1 },
148
150
  });
149
151
  return health;
150
152
  });
@@ -154,19 +156,49 @@ export class AgentsApi {
154
156
  const trimmedPrompt = prompt.trim() || "Hello from mcoda test-agent. Please reply with a short acknowledgement.";
155
157
  return this.withCommandRun("agent.test", { id: agent.id, slug: agent.slug, prompt: trimmedPrompt }, async (run) => {
156
158
  const health = await this.agentService.healthCheck(agent.id);
159
+ const startedAtMs = Date.now();
160
+ const startedAt = new Date(startedAtMs).toISOString();
157
161
  const response = await this.agentService.invoke(agent.id, {
158
162
  input: trimmedPrompt,
159
163
  metadata: { command: "test-agent" },
160
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;
161
175
  await this.repo.recordTokenUsage({
162
176
  agentId: agent.id,
163
177
  commandRunId: run.id,
164
178
  modelName: agent.defaultModel,
165
- tokensPrompt: 0,
166
- tokensCompletion: 0,
167
- tokensTotal: 0,
168
- timestamp: new Date().toISOString(),
169
- 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
+ },
170
202
  });
171
203
  return { health, response, prompt: trimmedPrompt };
172
204
  });
@@ -175,7 +207,18 @@ export class AgentsApi {
175
207
  if (!metadata || typeof metadata !== "object")
176
208
  return {};
177
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;
178
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
+ };
179
222
  const tokensPrompt = toNumber(metadata.tokensPrompt) ??
180
223
  toNumber(metadata.tokens_prompt) ??
181
224
  toNumber(usage?.prompt_tokens) ??
@@ -194,7 +237,67 @@ export class AgentsApi {
194
237
  if (tokensTotal === undefined && tokensPrompt !== undefined && tokensCompletion !== undefined) {
195
238
  tokensTotal = tokensPrompt + tokensCompletion;
196
239
  }
197
- return { tokensPrompt, tokensCompletion, tokensTotal };
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
+ };
198
301
  }
199
302
  async runAgent(idOrSlug, prompts, metadata) {
200
303
  const agent = await this.resolveAgent(idOrSlug);
@@ -206,7 +309,8 @@ export class AgentsApi {
206
309
  const responses = [];
207
310
  for (let index = 0; index < cleaned.length; index += 1) {
208
311
  const input = cleaned[index];
209
- const startedAt = Date.now();
312
+ const startedAtMs = Date.now();
313
+ const startedAt = new Date(startedAtMs).toISOString();
210
314
  const response = await this.agentService.invoke(agent.id, {
211
315
  input,
212
316
  metadata: {
@@ -215,21 +319,42 @@ export class AgentsApi {
215
319
  ...metadata,
216
320
  },
217
321
  });
218
- const durationSeconds = (Date.now() - startedAt) / 1000;
322
+ const finishedAtMs = Date.now();
323
+ const finishedAt = new Date(finishedAtMs).toISOString();
324
+ const durationMs = finishedAtMs - startedAtMs;
325
+ const durationSeconds = durationMs / 1000;
219
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;
220
332
  await this.repo.recordTokenUsage({
221
333
  agentId: agent.id,
222
334
  commandRunId: run.id,
223
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,
224
341
  tokensPrompt: usage.tokensPrompt,
225
342
  tokensCompletion: usage.tokensCompletion,
226
343
  tokensTotal: usage.tokensTotal,
227
- durationSeconds,
228
- timestamp: new Date().toISOString(),
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(),
229
352
  metadata: {
230
353
  reason: "agent.run",
231
354
  adapter: response.adapter,
232
355
  promptIndex: index,
356
+ phase: "agent_run",
357
+ attempt: 1,
233
358
  },
234
359
  });
235
360
  responses.push(response);
@@ -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;CAiC5B"}
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,
@@ -29,6 +32,7 @@ export class QaTasksApi {
29
32
  notes: request.notes,
30
33
  evidenceUrl: request.evidenceUrl,
31
34
  allowDirty: request.allowDirty,
35
+ cleanIgnorePaths: request.cleanIgnorePaths,
32
36
  });
33
37
  }
34
38
  finally {
@@ -1 +1 @@
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"}
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,8 +1,11 @@
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.
5
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}
6
9
  `.trim();
7
10
  export const DEFAULT_PDR_CHARACTER_PROMPT = `
8
11
  Be precise, risk-aware, and concise. Prefer bullet points. Cite assumptions and avoid speculation. Always state the technology stack with rationale.
@@ -17,7 +20,10 @@ Produce Markdown with the following sections at minimum:
17
20
  - Interfaces / APIs (do not invent endpoints; if missing, list as open questions)
18
21
  - Non-Functional Requirements
19
22
  - Risks & Mitigations
23
+ - Resolved Decisions (include when open questions are resolved)
20
24
  - Open Questions
21
25
 
22
26
  Call out gaps and missing specifications explicitly. Keep outputs grounded in the given context.
27
+
28
+ ${GLOSSARY_PROMPT_SNIPPET}
23
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,QAoB/B,CAAC;AAET,eAAO,MAAM,oBAAoB,QAiBzB,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.
@@ -21,10 +24,13 @@ Mandatory sections (include even if you must mark TODOs):
21
24
  - Failure Modes & Resilience
22
25
  - Risks & Mitigations
23
26
  - Assumptions
27
+ - Resolved Decisions (include when open questions are resolved)
24
28
  - Open Questions
25
29
  - Acceptance Criteria
26
30
 
27
31
  If context is missing, call it out explicitly and list the questions needed to complete the SDS.
32
+
33
+ ${GLOSSARY_PROMPT_SNIPPET}
28
34
  `.trim();
29
35
  export const DEFAULT_SDS_TEMPLATE = `
30
36
  # Software Design Specification
@@ -41,6 +47,7 @@ export const DEFAULT_SDS_TEMPLATE = `
41
47
  ## Failure Modes & Resilience
42
48
  ## Risks & Mitigations
43
49
  ## Assumptions
50
+ ## Resolved Decisions
44
51
  ## Open Questions
45
52
  ## Acceptance Criteria
46
53
  `.trim();
@@ -1,5 +1,6 @@
1
1
  import { AgentService } from "@mcoda/agents";
2
2
  import { GlobalRepository, WorkspaceRepository } from "@mcoda/db";
3
+ import { Agent, AgentHealth } from "@mcoda/shared";
3
4
  import { RoutingService } from "./RoutingService.js";
4
5
  import { WorkspaceResolution } from "../../workspace/WorkspaceManager.js";
5
6
  export type AgentRatingRequest = {
@@ -15,6 +16,24 @@ export type AgentRatingRequest = {
15
16
  reviewerAgentName?: string;
16
17
  ratingWindow?: number;
17
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;
18
37
  export declare class AgentRatingService {
19
38
  private workspace;
20
39
  private deps;
@@ -1 +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"}
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"}
@@ -34,6 +34,70 @@ const extractJson = (raw) => {
34
34
  return undefined;
35
35
  }
36
36
  };
37
+ const uniqueList = (values) => Array.from(new Set(values.map((value) => (value ?? "").trim()).filter(Boolean)));
38
+ const countMatches = (caps, required) => required.reduce((total, cap) => (caps.includes(cap) ? total + 1 : total), 0);
39
+ export const selectBestAgentForCapabilities = (input) => {
40
+ const required = uniqueList(input.required ?? []);
41
+ const preferred = uniqueList(input.preferred ?? []);
42
+ const scored = input.candidates
43
+ .filter((candidate) => candidate.agent)
44
+ .filter((candidate) => candidate.healthStatus !== "unreachable")
45
+ .map((candidate) => {
46
+ const caps = uniqueList(candidate.capabilities ?? []);
47
+ const requiredMatches = countMatches(caps, required);
48
+ const preferredMatches = countMatches(caps, preferred);
49
+ const hasRequired = required.length === 0 || requiredMatches === required.length;
50
+ const rating = Number(candidate.agent.rating ?? 0);
51
+ const reasoning = Number(candidate.agent.reasoningRating ?? rating);
52
+ const cost = Number.isFinite(candidate.agent.costPerMillion)
53
+ ? Number(candidate.agent.costPerMillion)
54
+ : Number.POSITIVE_INFINITY;
55
+ const slug = candidate.agent.slug ?? candidate.agent.id;
56
+ return {
57
+ ...candidate,
58
+ caps,
59
+ requiredMatches,
60
+ preferredMatches,
61
+ hasRequired,
62
+ rating,
63
+ reasoning,
64
+ cost,
65
+ slug,
66
+ };
67
+ });
68
+ if (scored.length === 0)
69
+ return undefined;
70
+ const hasFullRequired = scored.some((candidate) => candidate.hasRequired);
71
+ scored.sort((a, b) => {
72
+ if (a.hasRequired !== b.hasRequired)
73
+ return a.hasRequired ? -1 : 1;
74
+ if (a.requiredMatches !== b.requiredMatches)
75
+ return b.requiredMatches - a.requiredMatches;
76
+ if (a.preferredMatches !== b.preferredMatches)
77
+ return b.preferredMatches - a.preferredMatches;
78
+ if (a.rating !== b.rating)
79
+ return b.rating - a.rating;
80
+ if (a.reasoning !== b.reasoning)
81
+ return b.reasoning - a.reasoning;
82
+ if (a.cost !== b.cost)
83
+ return a.cost - b.cost;
84
+ return a.slug.localeCompare(b.slug);
85
+ });
86
+ const pick = scored[0];
87
+ const missingRequired = required.filter((cap) => !pick.caps.includes(cap));
88
+ const missingPreferred = preferred.filter((cap) => !pick.caps.includes(cap));
89
+ const reason = hasFullRequired
90
+ ? `selected highest-ranked agent with ${pick.preferredMatches}/${preferred.length} preferred capabilities`
91
+ : `no agent satisfies all required capabilities; selected highest-ranked match (${pick.requiredMatches}/${required.length} required)`;
92
+ return {
93
+ agent: pick.agent,
94
+ capabilities: pick.caps,
95
+ missingRequired,
96
+ missingPreferred,
97
+ meetsRequired: missingRequired.length === 0,
98
+ reason,
99
+ };
100
+ };
37
101
  export class AgentRatingService {
38
102
  constructor(workspace, deps) {
39
103
  this.workspace = workspace;
@@ -59,7 +123,7 @@ export class AgentRatingService {
59
123
  }
60
124
  }
61
125
  ratingPromptPath() {
62
- return path.join(this.workspace.workspaceRoot, ".mcoda", "prompts", "agent-rating.md");
126
+ return path.join(this.workspace.mcodaDir, "prompts", "agent-rating.md");
63
127
  }
64
128
  async loadRatingPrompt() {
65
129
  const promptPath = this.ratingPromptPath();
@@ -291,7 +355,7 @@ export class AgentRatingService {
291
355
  async writeRatingArtifact(jobId, payload) {
292
356
  if (!jobId)
293
357
  return;
294
- const outDir = path.join(this.workspace.workspaceRoot, ".mcoda", "jobs", jobId);
358
+ const outDir = path.join(this.workspace.mcodaDir, "jobs", jobId);
295
359
  await fs.mkdir(outDir, { recursive: true });
296
360
  const filePath = path.join(outDir, "rating.json");
297
361
  await fs.writeFile(filePath, JSON.stringify(payload, null, 2), "utf8");
@@ -31,6 +31,7 @@ export interface GatewayAnalysis {
31
31
  discipline: string;
32
32
  filesLikelyTouched: string[];
33
33
  filesToCreate: string[];
34
+ dirsToCreate: string[];
34
35
  assumptions: string[];
35
36
  risks: string[];
36
37
  docdexNotes: string[];
@@ -57,6 +58,7 @@ export interface GatewayAgentResult {
57
58
  chosenAgent: GatewayAgentDecision;
58
59
  warnings: string[];
59
60
  }
61
+ type AgentTierHint = "strong" | "specialist";
60
62
  export interface GatewayAgentRequest extends TaskSelectionFilters {
61
63
  workspace: WorkspaceResolution;
62
64
  job: string;
@@ -68,6 +70,7 @@ export interface GatewayAgentRequest extends TaskSelectionFilters {
68
70
  rateAgents?: boolean;
69
71
  avoidAgents?: string[];
70
72
  forceStronger?: boolean;
73
+ forceTier?: AgentTierHint;
71
74
  }
72
75
  export declare class GatewayAgentService {
73
76
  private workspace;
@@ -77,6 +80,9 @@ export declare class GatewayAgentService {
77
80
  static create(workspace: WorkspaceResolution): Promise<GatewayAgentService>;
78
81
  private readPromptFiles;
79
82
  close(): Promise<void>;
83
+ setDocdexAvailability(available: boolean, reason?: string): void;
84
+ saveRepoMemory(text: string): Promise<void>;
85
+ savePreference(category: string, content: string, agentId?: string): Promise<void>;
80
86
  private loadGatewayPrompts;
81
87
  private resolveGatewayAgent;
82
88
  private invokeGatewayAgent;
@@ -90,6 +96,8 @@ export declare class GatewayAgentService {
90
96
  private listCandidates;
91
97
  private chooseCandidate;
92
98
  private selectAgentForJob;
99
+ preflightExecutionAgents(job: string, overrideAgent?: string): Promise<void>;
93
100
  run(request: GatewayAgentRequest): Promise<GatewayAgentResult>;
94
101
  }
102
+ export {};
95
103
  //# sourceMappingURL=GatewayAgentService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GatewayAgentService.d.ts","sourceRoot":"","sources":["../../../src/services/agents/GatewayAgentService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GatewayAgentService.d.ts","sourceRoot":"","sources":["../../../src/services/agents/GatewayAgentService.ts"],"names":[],"mappings":"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"}