@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
@@ -1,7 +1,8 @@
1
1
  import fs from "node:fs/promises";
2
2
  import path from "node:path";
3
+ import { randomUUID } from "node:crypto";
3
4
  import { Connection } from "@mcoda/db";
4
- import { PathHelper } from "@mcoda/shared";
5
+ import { PathHelper, READY_TO_CODE_REVIEW } from "@mcoda/shared";
5
6
  const DEFAULT_SP_PER_HOUR = 15;
6
7
  const DEFAULT_ALPHA = 0.5;
7
8
  export class VelocityService {
@@ -65,6 +66,9 @@ export class VelocityService {
65
66
  base.reviewSpPerHour = options.spPerHourAll;
66
67
  base.qaSpPerHour = options.spPerHourAll;
67
68
  }
69
+ if (options.spPerHourImplementation !== undefined) {
70
+ base.implementationSpPerHour = options.spPerHourImplementation;
71
+ }
68
72
  if (options.spPerHourReview !== undefined) {
69
73
  base.reviewSpPerHour = options.spPerHourReview;
70
74
  }
@@ -121,44 +125,169 @@ export class VelocityService {
121
125
  return { clause: "", params: [] };
122
126
  return { clause: `AND ${clauses.join(" AND ")}`, params };
123
127
  }
124
- async computeLaneVelocity(commandName, scope, assignee, windowTasks) {
128
+ async insertStatusEvent(entry) {
129
+ await this.db.run(`INSERT INTO task_status_events (id, task_id, from_status, to_status, timestamp, command_name, job_id, task_run_id, agent_id, metadata_json)
130
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, randomUUID(), entry.taskId, entry.fromStatus ?? null, entry.toStatus, entry.timestamp, entry.commandName ?? null, entry.jobId ?? null, entry.taskRunId ?? null, entry.agentId ?? null, entry.metadata ? JSON.stringify(entry.metadata) : null);
131
+ }
132
+ async maybeBackfillStatusEvents(commandName, transition, scope, assignee, windowTasks) {
133
+ const { startStatus, endStatus } = transition;
134
+ try {
135
+ const filters = this.buildTaskFilters(scope, assignee);
136
+ const existingRow = await this.db.get(`
137
+ SELECT COUNT(1) as count
138
+ FROM task_status_events e
139
+ INNER JOIN tasks t ON t.id = e.task_id
140
+ WHERE e.from_status = ?
141
+ AND e.to_status = ?
142
+ ${filters.clause}
143
+ `, startStatus, endStatus, ...filters.params);
144
+ const existingCount = existingRow?.count ?? 0;
145
+ if (existingCount >= windowTasks)
146
+ return;
147
+ const limit = Math.max(windowTasks * 3, windowTasks);
148
+ const runs = await this.db.all(`
149
+ SELECT tr.id, tr.task_id, tr.job_id, tr.agent_id, tr.started_at, tr.finished_at
150
+ FROM task_runs tr
151
+ INNER JOIN tasks t ON t.id = tr.task_id
152
+ WHERE tr.command = ?
153
+ AND tr.status IN ('success','succeeded')
154
+ AND tr.started_at IS NOT NULL
155
+ AND tr.finished_at IS NOT NULL
156
+ ${filters.clause}
157
+ ORDER BY datetime(tr.finished_at) DESC
158
+ LIMIT ?
159
+ `, commandName, ...filters.params, limit);
160
+ let inserted = 0;
161
+ for (const run of runs) {
162
+ if (existingCount + inserted >= windowTasks)
163
+ break;
164
+ const startedAt = run.started_at;
165
+ const finishedAt = run.finished_at;
166
+ if (!startedAt || !finishedAt)
167
+ continue;
168
+ const startExists = await this.db.get(`SELECT id FROM task_status_events WHERE task_id = ? AND to_status = ? AND timestamp = ? LIMIT 1`, run.task_id, startStatus, startedAt);
169
+ if (!startExists) {
170
+ await this.insertStatusEvent({
171
+ taskId: run.task_id,
172
+ fromStatus: null,
173
+ toStatus: startStatus,
174
+ timestamp: startedAt,
175
+ commandName,
176
+ jobId: run.job_id ?? null,
177
+ taskRunId: run.id,
178
+ agentId: run.agent_id ?? null,
179
+ metadata: {
180
+ backfilled: true,
181
+ source: "task_runs",
182
+ phase: "start",
183
+ transition: `${startStatus}->${endStatus}`,
184
+ },
185
+ });
186
+ }
187
+ const endExists = await this.db.get(`SELECT id FROM task_status_events WHERE task_id = ? AND from_status = ? AND to_status = ? AND timestamp = ? LIMIT 1`, run.task_id, startStatus, endStatus, finishedAt);
188
+ if (!endExists) {
189
+ await this.insertStatusEvent({
190
+ taskId: run.task_id,
191
+ fromStatus: startStatus,
192
+ toStatus: endStatus,
193
+ timestamp: finishedAt,
194
+ commandName,
195
+ jobId: run.job_id ?? null,
196
+ taskRunId: run.id,
197
+ agentId: run.agent_id ?? null,
198
+ metadata: {
199
+ backfilled: true,
200
+ source: "task_runs",
201
+ phase: "end",
202
+ transition: `${startStatus}->${endStatus}`,
203
+ },
204
+ });
205
+ inserted += 1;
206
+ }
207
+ }
208
+ }
209
+ catch {
210
+ // ignore backfill errors
211
+ }
212
+ }
213
+ async computeLaneVelocityFromTaskRuns(commandName, scope, assignee, windowTasks) {
214
+ const filters = this.buildTaskFilters(scope, assignee);
125
215
  const runs = await this.db.all(`
126
- SELECT id, started_at, completed_at, duration_seconds
127
- FROM command_runs
128
- WHERE command_name = ?
129
- AND status IN ('success','succeeded')
130
- ORDER BY COALESCE(completed_at, started_at) DESC
131
- `, commandName);
216
+ SELECT
217
+ COALESCE(tr.story_points_at_run, t.story_points, 0) as story_points,
218
+ tr.started_at,
219
+ tr.finished_at
220
+ FROM task_runs tr
221
+ INNER JOIN tasks t ON t.id = tr.task_id
222
+ WHERE tr.command = ?
223
+ AND tr.status IN ('success','succeeded')
224
+ ${filters.clause}
225
+ ORDER BY COALESCE(tr.finished_at, tr.started_at) DESC
226
+ `, commandName, ...filters.params);
132
227
  let totalSp = 0;
133
228
  let totalDurationSeconds = 0;
134
229
  let samples = 0;
135
- const filters = this.buildTaskFilters(scope, assignee);
136
230
  for (const run of runs) {
137
- const aggregation = await this.db.get(`
138
- SELECT
139
- SUM(COALESCE(t.story_points, 0)) as sp,
140
- COUNT(*) as tasks
141
- FROM task_runs tr
142
- INNER JOIN tasks t ON t.id = tr.task_id
143
- WHERE tr.command_run_id = ?
144
- ${filters.clause}
145
- `, run.id, ...filters.params);
146
- const taskCount = aggregation?.tasks ?? 0;
147
- const sp = aggregation?.sp ?? 0;
148
- if (taskCount === 0) {
149
- continue;
150
- }
151
- const durationSeconds = typeof run.duration_seconds === "number" && Number.isFinite(run.duration_seconds)
152
- ? run.duration_seconds
153
- : this.deriveDurationSeconds(run.started_at, run.completed_at);
231
+ if (samples >= windowTasks)
232
+ break;
233
+ const durationSeconds = this.deriveDurationSeconds(run.started_at, run.finished_at);
154
234
  if (!durationSeconds || durationSeconds <= 0) {
155
235
  continue;
156
236
  }
157
- totalSp += sp;
237
+ totalSp += run.story_points ?? 0;
158
238
  totalDurationSeconds += durationSeconds;
159
- samples += taskCount;
239
+ samples += 1;
240
+ }
241
+ if (samples === 0 || totalDurationSeconds <= 0 || totalSp <= 0) {
242
+ return { samples: 0 };
243
+ }
244
+ return {
245
+ spPerHour: totalSp / (totalDurationSeconds / 3600),
246
+ samples,
247
+ };
248
+ }
249
+ async computeLaneVelocityFromStatusEvents(startStatus, endStatus, scope, assignee, windowTasks) {
250
+ const filters = this.buildTaskFilters(scope, assignee);
251
+ let rows = [];
252
+ try {
253
+ rows = await this.db.all(`
254
+ SELECT
255
+ t.id as task_id,
256
+ t.story_points as story_points,
257
+ end_event.timestamp as end_ts,
258
+ (
259
+ SELECT e2.timestamp
260
+ FROM task_status_events e2
261
+ WHERE e2.task_id = end_event.task_id
262
+ AND e2.to_status = ?
263
+ AND datetime(e2.timestamp) <= datetime(end_event.timestamp)
264
+ ORDER BY datetime(e2.timestamp) DESC
265
+ LIMIT 1
266
+ ) as start_ts
267
+ FROM task_status_events end_event
268
+ INNER JOIN tasks t ON t.id = end_event.task_id
269
+ WHERE end_event.from_status = ?
270
+ AND end_event.to_status = ?
271
+ ${filters.clause}
272
+ ORDER BY datetime(end_event.timestamp) DESC
273
+ `, startStatus, startStatus, endStatus, ...filters.params);
274
+ }
275
+ catch {
276
+ return { samples: 0 };
277
+ }
278
+ let totalSp = 0;
279
+ let totalDurationSeconds = 0;
280
+ let samples = 0;
281
+ for (const row of rows) {
160
282
  if (samples >= windowTasks)
161
283
  break;
284
+ const durationSeconds = this.deriveDurationSeconds(row.start_ts ?? undefined, row.end_ts ?? undefined);
285
+ if (!durationSeconds || durationSeconds <= 0) {
286
+ continue;
287
+ }
288
+ totalSp += row.story_points ?? 0;
289
+ totalDurationSeconds += durationSeconds;
290
+ samples += 1;
162
291
  }
163
292
  if (samples === 0 || totalDurationSeconds <= 0 || totalSp <= 0) {
164
293
  return { samples: 0 };
@@ -168,6 +297,14 @@ export class VelocityService {
168
297
  samples,
169
298
  };
170
299
  }
300
+ async computeLaneVelocity(commandName, transition, scope, assignee, windowTasks) {
301
+ await this.maybeBackfillStatusEvents(commandName, transition, scope, assignee, windowTasks);
302
+ const statusSamples = await this.computeLaneVelocityFromStatusEvents(transition.startStatus, transition.endStatus, scope, assignee, windowTasks);
303
+ if (statusSamples.samples > 0) {
304
+ return statusSamples;
305
+ }
306
+ return this.computeLaneVelocityFromTaskRuns(commandName, scope, assignee, windowTasks);
307
+ }
171
308
  deriveDurationSeconds(started, completed) {
172
309
  if (!started || !completed)
173
310
  return undefined;
@@ -181,18 +318,22 @@ export class VelocityService {
181
318
  const mode = options.mode ?? "config";
182
319
  const windowTasks = options.windowTasks ?? 10;
183
320
  const config = this.resolveConfig(options);
321
+ const defaultSamples = { implementation: 0, review: 0, qa: 0 };
184
322
  if (mode === "config") {
185
323
  return {
186
324
  implementationSpPerHour: config.implementationSpPerHour,
187
325
  reviewSpPerHour: config.reviewSpPerHour,
188
326
  qaSpPerHour: config.qaSpPerHour,
189
327
  source: "config",
328
+ requestedMode: mode,
329
+ windowTasks,
330
+ samples: defaultSamples,
190
331
  };
191
332
  }
192
333
  const scope = await this.resolveScopeIds(options);
193
- const implementation = await this.computeLaneVelocity("work-on-tasks", scope, options.assignee, windowTasks);
194
- const review = await this.computeLaneVelocity("code-review", scope, options.assignee, windowTasks);
195
- const qa = await this.computeLaneVelocity("qa-tasks", scope, options.assignee, windowTasks);
334
+ const implementation = await this.computeLaneVelocity("work-on-tasks", { startStatus: "in_progress", endStatus: READY_TO_CODE_REVIEW }, scope, options.assignee, windowTasks);
335
+ const review = await this.computeLaneVelocity("code-review", { startStatus: READY_TO_CODE_REVIEW, endStatus: "ready_to_qa" }, scope, options.assignee, windowTasks);
336
+ const qa = await this.computeLaneVelocity("qa-tasks", { startStatus: "ready_to_qa", endStatus: "completed" }, scope, options.assignee, windowTasks);
196
337
  const alpha = config.alpha ?? DEFAULT_ALPHA;
197
338
  const resolveLane = (empirical) => {
198
339
  if (empirical === undefined || empirical <= 0)
@@ -218,6 +359,11 @@ export class VelocityService {
218
359
  const implementationSpPerHour = resolveLane(implementation.spPerHour);
219
360
  const reviewSpPerHour = resolveReviewLane(review.spPerHour);
220
361
  const qaSpPerHour = resolveQaLane(qa.spPerHour);
362
+ const samples = {
363
+ implementation: implementation.samples,
364
+ review: review.samples,
365
+ qa: qa.samples,
366
+ };
221
367
  const usedEmpirical = (implementation.spPerHour && implementation.spPerHour > 0) ||
222
368
  (review.spPerHour && review.spPerHour > 0) ||
223
369
  (qa.spPerHour && qa.spPerHour > 0);
@@ -226,12 +372,9 @@ export class VelocityService {
226
372
  reviewSpPerHour,
227
373
  qaSpPerHour,
228
374
  source: usedEmpirical ? mode : "config",
375
+ requestedMode: mode,
229
376
  windowTasks,
230
- samples: {
231
- implementation: implementation.samples,
232
- review: review.samples,
233
- qa: qa.samples,
234
- },
377
+ samples,
235
378
  };
236
379
  }
237
380
  }
@@ -14,6 +14,7 @@ export interface VelocityOptions {
14
14
  mode?: VelocitySource;
15
15
  windowTasks?: 10 | 20 | 50;
16
16
  spPerHourAll?: number;
17
+ spPerHourImplementation?: number;
17
18
  spPerHourReview?: number;
18
19
  spPerHourQa?: number;
19
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/estimate/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACf,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE/E,MAAM,WAAW,cAAc;IAC7B,uBAAuB,EAAE,MAAM,CAAC;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,SAAS,EAAE,mBAAmB,CAAC;CAChC;AAED,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/estimate/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACf,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE/E,MAAM,WAAW,cAAc;IAC7B,uBAAuB,EAAE,MAAM,CAAC;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,SAAS,EAAE,mBAAmB,CAAC;CAChC;AAED,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,200 @@
1
+ import { WorkspaceResolution } from "../../workspace/WorkspaceManager.js";
2
+ import { TaskSelectionFilters } from "./TaskSelectionService.js";
3
+ type StepName = "work" | "review" | "qa";
4
+ type AgentTier = "cheap" | "strong" | "specialist" | "unknown";
5
+ type DecisionRecord = {
6
+ step: StepName;
7
+ kind: "result" | "retry" | "terminal";
8
+ status: string;
9
+ detail?: string;
10
+ attempt: number;
11
+ timestamp: string;
12
+ };
13
+ type FailureRecord = {
14
+ step: StepName;
15
+ agent: string;
16
+ reason: string;
17
+ attempt: number;
18
+ timestamp: string;
19
+ };
20
+ type RatingSummary = {
21
+ step: StepName;
22
+ agent: string;
23
+ rating?: number;
24
+ maxComplexity?: number;
25
+ runScore?: number;
26
+ qualityScore?: number;
27
+ };
28
+ type TaskProgress = {
29
+ taskKey: string;
30
+ attempts: number;
31
+ status: "pending" | "completed" | "failed" | "skipped";
32
+ lastStep?: StepName;
33
+ lastError?: string;
34
+ lastWorkAgentTier?: AgentTier;
35
+ lastEscalationReason?: string;
36
+ escalationAttempts?: Record<string, number>;
37
+ lastGuardrailRetryable?: boolean;
38
+ lastQaFailureSummary?: string;
39
+ pendingLearningSummary?: string;
40
+ lastRevertEventAt?: string;
41
+ lastDecision?: string;
42
+ lastOutcome?: string;
43
+ stepOutcomes?: Partial<Record<StepName, string>>;
44
+ decisionHistory?: DecisionRecord[];
45
+ chosenAgents: {
46
+ work?: string;
47
+ review?: string;
48
+ qa?: string;
49
+ };
50
+ failureHistory?: FailureRecord[];
51
+ ratings?: RatingSummary[];
52
+ };
53
+ export interface GatewayTrioRequest extends TaskSelectionFilters {
54
+ workspace: WorkspaceResolution;
55
+ maxIterations?: number;
56
+ maxCycles?: number;
57
+ onJobStart?: (jobId: string, commandRunId: string) => void;
58
+ onGatewayStart?: (details: GatewayLogDetails) => void;
59
+ onGatewayChunk?: (chunk: string) => void;
60
+ onGatewaySelection?: (details: GatewayLogDetails) => void;
61
+ onGatewayEnd?: (details: GatewayLogDetails) => void;
62
+ gatewayAgentName?: string;
63
+ workAgentName?: string;
64
+ reviewAgentName?: string;
65
+ qaAgentName?: string;
66
+ maxDocs?: number;
67
+ agentStream?: boolean;
68
+ noCommit?: boolean;
69
+ dryRun?: boolean;
70
+ reviewBase?: string;
71
+ maxAgentSeconds?: number;
72
+ qaProfileName?: string;
73
+ qaLevel?: string;
74
+ qaTestCommand?: string;
75
+ qaMode?: "auto" | "manual";
76
+ qaFollowups?: "auto" | "none" | "prompt";
77
+ reviewFollowups?: boolean;
78
+ qaResult?: "pass" | "fail";
79
+ qaNotes?: string;
80
+ qaEvidenceUrl?: string;
81
+ qaAllowDirty?: boolean;
82
+ resumeJobId?: string;
83
+ rateAgents?: boolean;
84
+ escalateOnNoChange?: boolean;
85
+ workRunner?: string;
86
+ useCodali?: boolean;
87
+ agentAdapterOverride?: string;
88
+ }
89
+ export interface GatewayLogDetails {
90
+ taskKey: string;
91
+ job: string;
92
+ gatewayAgent?: string;
93
+ chosenAgent?: string;
94
+ chosenModel?: string;
95
+ chosenAdapter?: string;
96
+ startedAt: string;
97
+ endedAt?: string;
98
+ status?: "completed" | "failed";
99
+ error?: string;
100
+ }
101
+ export interface GatewayTrioTaskSummary {
102
+ taskKey: string;
103
+ attempts: number;
104
+ status: TaskProgress["status"];
105
+ lastStep?: StepName;
106
+ lastDecision?: string;
107
+ lastOutcome?: string;
108
+ lastError?: string;
109
+ chosenAgents: TaskProgress["chosenAgents"];
110
+ ratings?: RatingSummary[];
111
+ }
112
+ export interface GatewayTrioResult {
113
+ jobId: string;
114
+ commandRunId: string;
115
+ tasks: GatewayTrioTaskSummary[];
116
+ warnings: string[];
117
+ failed: string[];
118
+ skipped: string[];
119
+ }
120
+ export declare class GatewayTrioService {
121
+ private workspace;
122
+ private deps;
123
+ private selectionService;
124
+ private projectKeyCache;
125
+ private tokenUsageCheckEnabled?;
126
+ private constructor();
127
+ static create(workspace: WorkspaceResolution, options?: {
128
+ noTelemetry?: boolean;
129
+ }): Promise<GatewayTrioService>;
130
+ close(): Promise<void>;
131
+ private disableDocdex;
132
+ private writeDocdexCheckArtifact;
133
+ private runDocdexPreflight;
134
+ private trioDir;
135
+ private statePath;
136
+ private writeState;
137
+ private loadState;
138
+ private readManifest;
139
+ private isPseudoTaskKey;
140
+ private skipPseudoTask;
141
+ private isTokenUsageCheckEnabled;
142
+ private isZeroTokenRun;
143
+ private backoffZeroTokens;
144
+ private cleanupExpiredTaskLocks;
145
+ private assertResumeAllowed;
146
+ private writeHandoffArtifact;
147
+ private prepareHandoff;
148
+ private projectKeyForTask;
149
+ private seedExplicitTasks;
150
+ private ensureProgress;
151
+ private dedupeTaskKeys;
152
+ private buildRunListFromExplicit;
153
+ private buildRunListFromSelection;
154
+ private guardMissingContext;
155
+ private hasMissingTaskSignal;
156
+ private hasReachedMaxIterations;
157
+ private hasIterationsRemaining;
158
+ private shouldReopenFailedTask;
159
+ private reopenRetryableFailedTasks;
160
+ private dependenciesReady;
161
+ private normalizeStatus;
162
+ private resolveRequest;
163
+ private buildStatusFilter;
164
+ private refreshTaskStatus;
165
+ private parseWorkResult;
166
+ private parseReviewResult;
167
+ private parseQaResult;
168
+ private isAuthFailure;
169
+ private shouldRetryAfter;
170
+ private escalationReasons;
171
+ private resolveTierFromComplexity;
172
+ private nextTier;
173
+ private recordFailure;
174
+ private mergeGatewayFiles;
175
+ private handoffContextForProgress;
176
+ private appendFallbackHandoffContext;
177
+ private recordDecision;
178
+ private buildQaFailureSummary;
179
+ private extractRevertLearning;
180
+ private shouldSavePreference;
181
+ private persistRevertLearning;
182
+ private sanitizeGoldenText;
183
+ private appendGoldenExample;
184
+ private countFailures;
185
+ private prioritizeFeedbackTasks;
186
+ private buildAgentOptions;
187
+ private recordRating;
188
+ private loadRatingSummary;
189
+ private updateJobHeartbeat;
190
+ private runStepWithTimeout;
191
+ private runGateway;
192
+ private withGatewayIoSuppressed;
193
+ private runWorkStep;
194
+ private runReviewStep;
195
+ private runQaStep;
196
+ private toSummary;
197
+ run(request: GatewayTrioRequest): Promise<GatewayTrioResult>;
198
+ }
199
+ export {};
200
+ //# sourceMappingURL=GatewayTrioService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GatewayTrioService.d.ts","sourceRoot":"","sources":["../../../src/services/execution/GatewayTrioService.ts"],"names":[],"mappings":"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"}