@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.
- package/CHANGELOG.md +3 -0
- package/README.md +2 -2
- package/dist/api/AgentsApi.d.ts +9 -1
- package/dist/api/AgentsApi.d.ts.map +1 -1
- package/dist/api/AgentsApi.js +201 -6
- package/dist/api/QaTasksApi.d.ts.map +1 -1
- package/dist/api/QaTasksApi.js +6 -0
- package/dist/api/TasksApi.d.ts.map +1 -1
- package/dist/api/TasksApi.js +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/prompts/PdrPrompts.d.ts.map +1 -1
- package/dist/prompts/PdrPrompts.js +9 -1
- package/dist/prompts/SdsPrompts.d.ts.map +1 -1
- package/dist/prompts/SdsPrompts.js +9 -0
- package/dist/services/agents/AgentRatingFormula.d.ts +27 -0
- package/dist/services/agents/AgentRatingFormula.d.ts.map +1 -0
- package/dist/services/agents/AgentRatingFormula.js +45 -0
- package/dist/services/agents/AgentRatingService.d.ts +60 -0
- package/dist/services/agents/AgentRatingService.d.ts.map +1 -0
- package/dist/services/agents/AgentRatingService.js +363 -0
- package/dist/services/agents/GatewayAgentService.d.ts +11 -0
- package/dist/services/agents/GatewayAgentService.d.ts.map +1 -1
- package/dist/services/agents/GatewayAgentService.js +525 -84
- package/dist/services/agents/GatewayHandoff.d.ts +11 -0
- package/dist/services/agents/GatewayHandoff.d.ts.map +1 -0
- package/dist/services/agents/GatewayHandoff.js +141 -0
- package/dist/services/agents/RoutingService.d.ts +1 -0
- package/dist/services/agents/RoutingService.d.ts.map +1 -1
- package/dist/services/agents/RoutingService.js +4 -4
- package/dist/services/backlog/BacklogService.d.ts +23 -0
- package/dist/services/backlog/BacklogService.d.ts.map +1 -1
- package/dist/services/backlog/BacklogService.js +62 -7
- package/dist/services/backlog/TaskOrderingHeuristics.d.ts +12 -0
- package/dist/services/backlog/TaskOrderingHeuristics.d.ts.map +1 -0
- package/dist/services/backlog/TaskOrderingHeuristics.js +56 -0
- package/dist/services/backlog/TaskOrderingService.d.ts +17 -4
- package/dist/services/backlog/TaskOrderingService.d.ts.map +1 -1
- package/dist/services/backlog/TaskOrderingService.js +538 -79
- package/dist/services/docs/DocInventory.d.ts +11 -0
- package/dist/services/docs/DocInventory.d.ts.map +1 -0
- package/dist/services/docs/DocInventory.js +230 -0
- package/dist/services/docs/DocgenRunContext.d.ts +59 -0
- package/dist/services/docs/DocgenRunContext.d.ts.map +1 -0
- package/dist/services/docs/DocgenRunContext.js +4 -0
- package/dist/services/docs/DocsService.d.ts +70 -3
- package/dist/services/docs/DocsService.d.ts.map +1 -1
- package/dist/services/docs/DocsService.js +1930 -89
- package/dist/services/docs/alignment/DocAlignmentGraph.d.ts +23 -0
- package/dist/services/docs/alignment/DocAlignmentGraph.d.ts.map +1 -0
- package/dist/services/docs/alignment/DocAlignmentGraph.js +78 -0
- package/dist/services/docs/alignment/DocAlignmentPatcher.d.ts +19 -0
- package/dist/services/docs/alignment/DocAlignmentPatcher.d.ts.map +1 -0
- package/dist/services/docs/alignment/DocAlignmentPatcher.js +222 -0
- package/dist/services/docs/patch/DocPatchEngine.d.ts +57 -0
- package/dist/services/docs/patch/DocPatchEngine.d.ts.map +1 -0
- package/dist/services/docs/patch/DocPatchEngine.js +331 -0
- package/dist/services/docs/review/Glossary.d.ts +16 -0
- package/dist/services/docs/review/Glossary.d.ts.map +1 -0
- package/dist/services/docs/review/Glossary.js +47 -0
- package/dist/services/docs/review/ReviewReportRenderer.d.ts +3 -0
- package/dist/services/docs/review/ReviewReportRenderer.d.ts.map +1 -0
- package/dist/services/docs/review/ReviewReportRenderer.js +133 -0
- package/dist/services/docs/review/ReviewReportSchema.d.ts +39 -0
- package/dist/services/docs/review/ReviewReportSchema.d.ts.map +1 -0
- package/dist/services/docs/review/ReviewReportSchema.js +47 -0
- package/dist/services/docs/review/ReviewTypes.d.ts +76 -0
- package/dist/services/docs/review/ReviewTypes.d.ts.map +1 -0
- package/dist/services/docs/review/ReviewTypes.js +94 -0
- package/dist/services/docs/review/gates/AdminOpenApiSpecGate.d.ts +7 -0
- package/dist/services/docs/review/gates/AdminOpenApiSpecGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/AdminOpenApiSpecGate.js +93 -0
- package/dist/services/docs/review/gates/ApiPathConsistencyGate.d.ts +7 -0
- package/dist/services/docs/review/gates/ApiPathConsistencyGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/ApiPathConsistencyGate.js +308 -0
- package/dist/services/docs/review/gates/BuildReadyCompletenessGate.d.ts +8 -0
- package/dist/services/docs/review/gates/BuildReadyCompletenessGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/BuildReadyCompletenessGate.js +278 -0
- package/dist/services/docs/review/gates/DeploymentBlueprintGate.d.ts +8 -0
- package/dist/services/docs/review/gates/DeploymentBlueprintGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/DeploymentBlueprintGate.js +487 -0
- package/dist/services/docs/review/gates/NoMaybesGate.d.ts +8 -0
- package/dist/services/docs/review/gates/NoMaybesGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/NoMaybesGate.js +145 -0
- package/dist/services/docs/review/gates/OpenApiCoverageGate.d.ts +7 -0
- package/dist/services/docs/review/gates/OpenApiCoverageGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/OpenApiCoverageGate.js +266 -0
- package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.d.ts +7 -0
- package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.js +59 -0
- package/dist/services/docs/review/gates/OpenQuestionsGate.d.ts +7 -0
- package/dist/services/docs/review/gates/OpenQuestionsGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/OpenQuestionsGate.js +200 -0
- package/dist/services/docs/review/gates/PdrInterfacesGate.d.ts +7 -0
- package/dist/services/docs/review/gates/PdrInterfacesGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/PdrInterfacesGate.js +159 -0
- package/dist/services/docs/review/gates/PdrOpenQuestionsGate.d.ts +8 -0
- package/dist/services/docs/review/gates/PdrOpenQuestionsGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/PdrOpenQuestionsGate.js +129 -0
- package/dist/services/docs/review/gates/PdrOwnershipGate.d.ts +7 -0
- package/dist/services/docs/review/gates/PdrOwnershipGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/PdrOwnershipGate.js +169 -0
- package/dist/services/docs/review/gates/PlaceholderArtifactGate.d.ts +10 -0
- package/dist/services/docs/review/gates/PlaceholderArtifactGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/PlaceholderArtifactGate.js +261 -0
- package/dist/services/docs/review/gates/RfpConsentGate.d.ts +6 -0
- package/dist/services/docs/review/gates/RfpConsentGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/RfpConsentGate.js +127 -0
- package/dist/services/docs/review/gates/RfpDefinitionGate.d.ts +7 -0
- package/dist/services/docs/review/gates/RfpDefinitionGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/RfpDefinitionGate.js +173 -0
- package/dist/services/docs/review/gates/SdsAdaptersGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SdsAdaptersGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SdsAdaptersGate.js +196 -0
- package/dist/services/docs/review/gates/SdsDecisionsGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SdsDecisionsGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SdsDecisionsGate.js +89 -0
- package/dist/services/docs/review/gates/SdsOpsGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SdsOpsGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SdsOpsGate.js +162 -0
- package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.js +166 -0
- package/dist/services/docs/review/gates/SqlRequiredTablesGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SqlRequiredTablesGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SqlRequiredTablesGate.js +273 -0
- package/dist/services/docs/review/gates/SqlSyntaxGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SqlSyntaxGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SqlSyntaxGate.js +203 -0
- package/dist/services/docs/review/gates/TerminologyNormalizationGate.d.ts +9 -0
- package/dist/services/docs/review/gates/TerminologyNormalizationGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/TerminologyNormalizationGate.js +217 -0
- package/dist/services/docs/review/glossary.json +47 -0
- package/dist/services/estimate/EstimateService.d.ts +2 -0
- package/dist/services/estimate/EstimateService.d.ts.map +1 -1
- package/dist/services/estimate/EstimateService.js +66 -18
- package/dist/services/estimate/VelocityService.d.ts +4 -0
- package/dist/services/estimate/VelocityService.d.ts.map +1 -1
- package/dist/services/estimate/VelocityService.js +179 -36
- package/dist/services/estimate/types.d.ts +1 -0
- package/dist/services/estimate/types.d.ts.map +1 -1
- package/dist/services/execution/GatewayTrioService.d.ts +200 -0
- package/dist/services/execution/GatewayTrioService.d.ts.map +1 -0
- package/dist/services/execution/GatewayTrioService.js +2492 -0
- package/dist/services/execution/QaApiRunner.d.ts +30 -0
- package/dist/services/execution/QaApiRunner.d.ts.map +1 -0
- package/dist/services/execution/QaApiRunner.js +881 -0
- package/dist/services/execution/QaFollowupService.d.ts +2 -0
- package/dist/services/execution/QaFollowupService.d.ts.map +1 -1
- package/dist/services/execution/QaFollowupService.js +9 -2
- package/dist/services/execution/QaPlanValidator.d.ts +10 -0
- package/dist/services/execution/QaPlanValidator.d.ts.map +1 -0
- package/dist/services/execution/QaPlanValidator.js +128 -0
- package/dist/services/execution/QaProfileService.d.ts +27 -1
- package/dist/services/execution/QaProfileService.d.ts.map +1 -1
- package/dist/services/execution/QaProfileService.js +354 -7
- package/dist/services/execution/QaTasksService.d.ts +59 -1
- package/dist/services/execution/QaTasksService.d.ts.map +1 -1
- package/dist/services/execution/QaTasksService.js +3347 -318
- package/dist/services/execution/QaTestCommandBuilder.d.ts +51 -0
- package/dist/services/execution/QaTestCommandBuilder.d.ts.map +1 -0
- package/dist/services/execution/QaTestCommandBuilder.js +495 -0
- package/dist/services/execution/TaskSelectionService.d.ts +4 -2
- package/dist/services/execution/TaskSelectionService.d.ts.map +1 -1
- package/dist/services/execution/TaskSelectionService.js +144 -28
- package/dist/services/execution/TaskStateService.d.ts +19 -6
- package/dist/services/execution/TaskStateService.d.ts.map +1 -1
- package/dist/services/execution/TaskStateService.js +128 -13
- package/dist/services/execution/WorkOnTasksService.d.ts +32 -1
- package/dist/services/execution/WorkOnTasksService.d.ts.map +1 -1
- package/dist/services/execution/WorkOnTasksService.js +4667 -722
- package/dist/services/jobs/JobInsightsService.d.ts +4 -0
- package/dist/services/jobs/JobInsightsService.d.ts.map +1 -1
- package/dist/services/jobs/JobInsightsService.js +51 -5
- package/dist/services/jobs/JobResumeService.d.ts.map +1 -1
- package/dist/services/jobs/JobResumeService.js +23 -10
- package/dist/services/jobs/JobService.d.ts +56 -4
- package/dist/services/jobs/JobService.d.ts.map +1 -1
- package/dist/services/jobs/JobService.js +232 -1
- package/dist/services/openapi/OpenApiService.d.ts +51 -0
- package/dist/services/openapi/OpenApiService.d.ts.map +1 -1
- package/dist/services/openapi/OpenApiService.js +953 -106
- package/dist/services/planning/CreateTasksService.d.ts +21 -0
- package/dist/services/planning/CreateTasksService.d.ts.map +1 -1
- package/dist/services/planning/CreateTasksService.js +569 -31
- package/dist/services/planning/RefineTasksService.d.ts +9 -0
- package/dist/services/planning/RefineTasksService.d.ts.map +1 -1
- package/dist/services/planning/RefineTasksService.js +409 -59
- package/dist/services/review/CodeReviewService.d.ts +18 -0
- package/dist/services/review/CodeReviewService.d.ts.map +1 -1
- package/dist/services/review/CodeReviewService.js +1309 -167
- package/dist/services/review/ReviewNormalizer.d.ts +9 -0
- package/dist/services/review/ReviewNormalizer.d.ts.map +1 -0
- package/dist/services/review/ReviewNormalizer.js +147 -0
- package/dist/services/shared/AuthErrors.d.ts +3 -0
- package/dist/services/shared/AuthErrors.d.ts.map +1 -0
- package/dist/services/shared/AuthErrors.js +17 -0
- package/dist/services/shared/DocdexGuidance.d.ts +7 -0
- package/dist/services/shared/DocdexGuidance.d.ts.map +1 -0
- package/dist/services/shared/DocdexGuidance.js +12 -0
- package/dist/services/shared/ProjectGuidance.d.ts +17 -0
- package/dist/services/shared/ProjectGuidance.d.ts.map +1 -0
- package/dist/services/shared/ProjectGuidance.js +78 -0
- package/dist/services/system/ToolDenylist.d.ts +13 -0
- package/dist/services/system/ToolDenylist.d.ts.map +1 -0
- package/dist/services/system/ToolDenylist.js +85 -0
- package/dist/services/tasks/TaskCommentFormatter.d.ts +20 -0
- package/dist/services/tasks/TaskCommentFormatter.d.ts.map +1 -0
- package/dist/services/tasks/TaskCommentFormatter.js +54 -0
- package/dist/services/telemetry/TelemetryService.d.ts.map +1 -1
- package/dist/services/telemetry/TelemetryService.js +39 -7
- package/dist/workspace/WorkspaceManager.d.ts +26 -0
- package/dist/workspace/WorkspaceManager.d.ts.map +1 -1
- package/dist/workspace/WorkspaceManager.js +206 -32
- 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
|
|
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
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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 +=
|
|
237
|
+
totalSp += run.story_points ?? 0;
|
|
158
238
|
totalDurationSeconds += durationSeconds;
|
|
159
|
-
samples +=
|
|
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
|
}
|
|
@@ -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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"}
|