@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,10 +1,17 @@
|
|
|
1
1
|
import { WorkspaceRepository } from "@mcoda/db";
|
|
2
|
-
|
|
2
|
+
import { normalizeReviewStatuses } from "@mcoda/shared";
|
|
3
|
+
const DEFAULT_IMPLEMENTATION_STATUSES = ["not_started", "in_progress", "changes_requested"];
|
|
3
4
|
const DONE_DEPENDENCY_STATUSES = new Set(["completed", "cancelled"]);
|
|
4
5
|
const normalizeStatusList = (statuses) => {
|
|
5
6
|
if (!statuses || statuses.length === 0)
|
|
6
7
|
return DEFAULT_IMPLEMENTATION_STATUSES;
|
|
7
|
-
|
|
8
|
+
const normalized = Array.from(new Set(statuses.map((s) => s.toLowerCase().trim()).filter(Boolean))).filter((status) => status !== "blocked");
|
|
9
|
+
return normalizeReviewStatuses(normalized);
|
|
10
|
+
};
|
|
11
|
+
const normalizeTypeList = (types) => {
|
|
12
|
+
if (!types || types.length === 0)
|
|
13
|
+
return [];
|
|
14
|
+
return Array.from(new Set(types.map((type) => type.toLowerCase().trim()).filter(Boolean)));
|
|
8
15
|
};
|
|
9
16
|
const parseAcceptanceCriteria = (raw) => {
|
|
10
17
|
if (!raw)
|
|
@@ -14,6 +21,67 @@ const parseAcceptanceCriteria = (raw) => {
|
|
|
14
21
|
.map((line) => line.trim())
|
|
15
22
|
.filter(Boolean);
|
|
16
23
|
};
|
|
24
|
+
const DOD_HEADER = /(definition of done|dod)\b/i;
|
|
25
|
+
const SECTION_HEADER = /^(?:\*+\s*)?(?:\*\*)?\s*(objective|context|inputs|implementation plan|testing|dependencies|risks|references|related documentation|acceptance criteria)\b/i;
|
|
26
|
+
const extractTaskDodCriteria = (description) => {
|
|
27
|
+
if (!description)
|
|
28
|
+
return [];
|
|
29
|
+
const lines = description.split(/\r?\n/);
|
|
30
|
+
let startIndex = -1;
|
|
31
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
32
|
+
const line = lines[i].trim();
|
|
33
|
+
if (!line)
|
|
34
|
+
continue;
|
|
35
|
+
if (DOD_HEADER.test(line)) {
|
|
36
|
+
startIndex = i;
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (startIndex === -1)
|
|
41
|
+
return [];
|
|
42
|
+
const results = [];
|
|
43
|
+
const addInline = (line) => {
|
|
44
|
+
const parts = line.split(":");
|
|
45
|
+
if (parts.length < 2)
|
|
46
|
+
return;
|
|
47
|
+
const tail = parts.slice(1).join(":").trim();
|
|
48
|
+
if (!tail)
|
|
49
|
+
return;
|
|
50
|
+
tail
|
|
51
|
+
.split(/\s*;\s*/)
|
|
52
|
+
.map((item) => item.trim())
|
|
53
|
+
.filter(Boolean)
|
|
54
|
+
.forEach((item) => results.push(item));
|
|
55
|
+
};
|
|
56
|
+
const isBullet = (line) => /^[-*]\s+/.test(line);
|
|
57
|
+
const isHeading = (line) => SECTION_HEADER.test(line) ||
|
|
58
|
+
(/^\*+\s*\*\*.+\*\*\s*:?\s*$/.test(line) && !DOD_HEADER.test(line)) ||
|
|
59
|
+
(/^[A-Z][A-Za-z0-9 &/]{2,}:\s*$/.test(line) && !DOD_HEADER.test(line));
|
|
60
|
+
const headerLine = lines[startIndex].trim();
|
|
61
|
+
addInline(headerLine);
|
|
62
|
+
for (let i = startIndex + 1; i < lines.length; i += 1) {
|
|
63
|
+
const rawLine = lines[i];
|
|
64
|
+
const line = rawLine.trim();
|
|
65
|
+
if (!line) {
|
|
66
|
+
if (results.length)
|
|
67
|
+
break;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (!isBullet(line) && isHeading(line))
|
|
71
|
+
break;
|
|
72
|
+
if (isBullet(line)) {
|
|
73
|
+
results.push(line.replace(/^[-*]\s+/, "").trim());
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (results.length) {
|
|
77
|
+
results[results.length - 1] = `${results[results.length - 1]} ${line}`.trim();
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
results.push(line);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return Array.from(new Set(results.filter(Boolean)));
|
|
84
|
+
};
|
|
17
85
|
export class TaskSelectionService {
|
|
18
86
|
constructor(workspace, workspaceRepo) {
|
|
19
87
|
this.workspace = workspace;
|
|
@@ -32,6 +100,8 @@ export class TaskSelectionService {
|
|
|
32
100
|
return this.workspaceRepo.getProjectByKey(projectKey);
|
|
33
101
|
}
|
|
34
102
|
buildTaskFromRow(row) {
|
|
103
|
+
const taskDod = extractTaskDodCriteria(row.task_description ?? "");
|
|
104
|
+
const storyAcceptance = parseAcceptanceCriteria(row.story_acceptance);
|
|
35
105
|
return {
|
|
36
106
|
id: row.task_id,
|
|
37
107
|
projectId: row.project_id,
|
|
@@ -58,7 +128,7 @@ export class TaskSelectionService {
|
|
|
58
128
|
epicTitle: row.epic_title ?? undefined,
|
|
59
129
|
storyTitle: row.story_title ?? undefined,
|
|
60
130
|
storyDescription: row.story_description ?? undefined,
|
|
61
|
-
acceptanceCriteria:
|
|
131
|
+
acceptanceCriteria: taskDod.length ? taskDod : storyAcceptance,
|
|
62
132
|
};
|
|
63
133
|
}
|
|
64
134
|
async loadTasks(filters) {
|
|
@@ -175,10 +245,10 @@ export class TaskSelectionService {
|
|
|
175
245
|
const ordered = [];
|
|
176
246
|
while (queue.length) {
|
|
177
247
|
queue.sort((a, b) => {
|
|
178
|
-
const pa = a.task.priority ?? Number.
|
|
179
|
-
const pb = b.task.priority ?? Number.
|
|
248
|
+
const pa = a.task.priority ?? Number.POSITIVE_INFINITY;
|
|
249
|
+
const pb = b.task.priority ?? Number.POSITIVE_INFINITY;
|
|
180
250
|
if (pa !== pb)
|
|
181
|
-
return
|
|
251
|
+
return pa - pb;
|
|
182
252
|
const spa = a.task.storyPoints ?? Number.POSITIVE_INFINITY;
|
|
183
253
|
const spb = b.task.storyPoints ?? Number.POSITIVE_INFINITY;
|
|
184
254
|
if (spa !== spb)
|
|
@@ -217,28 +287,66 @@ export class TaskSelectionService {
|
|
|
217
287
|
if (filters.projectKey && !project) {
|
|
218
288
|
throw new Error(`Unknown project key: ${filters.projectKey}`);
|
|
219
289
|
}
|
|
220
|
-
const
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
const
|
|
224
|
-
const
|
|
290
|
+
const dedupedTaskKeys = filters.taskKeys?.length
|
|
291
|
+
? Array.from(new Set(filters.taskKeys.map((key) => key.trim()).filter(Boolean)))
|
|
292
|
+
: undefined;
|
|
293
|
+
const ignoreStatusFilter = Boolean(filters.ignoreStatusFilter);
|
|
294
|
+
const effectiveStatuses = ignoreStatusFilter ? [] : normalizeStatusList(filters.statusFilter);
|
|
295
|
+
const includeTypes = normalizeTypeList(filters.includeTypes);
|
|
296
|
+
const excludeTypes = normalizeTypeList(filters.excludeTypes);
|
|
297
|
+
const tasks = await this.loadTasks({ ...filters, project, taskKeys: dedupedTaskKeys });
|
|
298
|
+
const filteredTasks = tasks.filter((task) => {
|
|
299
|
+
if (!ignoreStatusFilter && !effectiveStatuses.includes(task.task_status.toLowerCase()))
|
|
300
|
+
return false;
|
|
301
|
+
const type = task.task_type?.toLowerCase().trim() ?? "";
|
|
302
|
+
if (includeTypes.length > 0 && !includeTypes.includes(type))
|
|
303
|
+
return false;
|
|
304
|
+
if (excludeTypes.length > 0 && type && excludeTypes.includes(type))
|
|
305
|
+
return false;
|
|
306
|
+
return true;
|
|
307
|
+
});
|
|
308
|
+
const dedupeWarnings = [];
|
|
309
|
+
const selectionWarnings = [];
|
|
310
|
+
if (!ignoreStatusFilter) {
|
|
311
|
+
const requestedBlocked = filters.statusFilter?.some((status) => status.toLowerCase().trim() === "blocked") ?? false;
|
|
312
|
+
const requestedLegacyReview = filters.statusFilter?.some((status) => status.toLowerCase().trim() === "ready_to_review") ?? false;
|
|
313
|
+
if (requestedBlocked) {
|
|
314
|
+
selectionWarnings.push("Status 'blocked' is no longer supported; ignoring it in selection.");
|
|
315
|
+
}
|
|
316
|
+
if (requestedLegacyReview) {
|
|
317
|
+
selectionWarnings.push("Status 'ready_to_review' is deprecated; use 'ready_to_code_review' instead.");
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
const seenKeys = new Set();
|
|
321
|
+
const dedupedTasks = [];
|
|
322
|
+
for (const row of filteredTasks) {
|
|
323
|
+
const key = row.task_key;
|
|
324
|
+
if (seenKeys.has(key)) {
|
|
325
|
+
dedupeWarnings.push(`Duplicate task key detected in selection: ${key}.`);
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
seenKeys.add(key);
|
|
329
|
+
dedupedTasks.push(row);
|
|
330
|
+
}
|
|
331
|
+
const candidateIds = dedupedTasks.map((t) => t.task_id);
|
|
225
332
|
const deps = await this.loadDependencies(candidateIds);
|
|
226
333
|
const taskMap = new Map();
|
|
227
|
-
for (const row of
|
|
334
|
+
for (const row of dedupedTasks) {
|
|
228
335
|
const task = this.buildTaskFromRow(row);
|
|
229
336
|
taskMap.set(task.id, {
|
|
230
337
|
task,
|
|
231
338
|
dependencies: { ids: [], keys: [], blocking: [] },
|
|
232
339
|
});
|
|
233
340
|
}
|
|
234
|
-
const blocked = [];
|
|
235
341
|
const eligible = [];
|
|
342
|
+
const skippedDependencies = [];
|
|
343
|
+
const ignoreDependencies = filters.ignoreDependencies === true;
|
|
236
344
|
for (const [taskId, entry] of taskMap.entries()) {
|
|
237
345
|
const depRows = deps.get(taskId) ?? [];
|
|
238
346
|
const ids = [];
|
|
239
347
|
const keys = [];
|
|
240
348
|
const blocking = [];
|
|
241
|
-
let
|
|
349
|
+
let dependencyNotReady = false;
|
|
242
350
|
for (const dep of depRows) {
|
|
243
351
|
ids.push(dep.dependsOnTaskId);
|
|
244
352
|
if (dep.dependsOnKey)
|
|
@@ -249,33 +357,41 @@ export class TaskSelectionService {
|
|
|
249
357
|
? DONE_DEPENDENCY_STATUSES.has(status ?? "")
|
|
250
358
|
: true;
|
|
251
359
|
if (!clear) {
|
|
252
|
-
|
|
360
|
+
if (!ignoreDependencies)
|
|
361
|
+
dependencyNotReady = true;
|
|
253
362
|
blocking.push(dep.dependsOnTaskId);
|
|
254
363
|
}
|
|
255
364
|
else if (!status && !depInSelection) {
|
|
256
|
-
// unknown status but dependency referenced; treat as
|
|
257
|
-
|
|
365
|
+
// unknown status but dependency referenced; treat as not ready unless explicitly ignored
|
|
366
|
+
if (!ignoreDependencies)
|
|
367
|
+
dependencyNotReady = true;
|
|
258
368
|
blocking.push(dep.dependsOnTaskId);
|
|
259
369
|
}
|
|
260
370
|
}
|
|
261
371
|
entry.dependencies = { ids, keys, blocking };
|
|
262
|
-
if (
|
|
263
|
-
entry.
|
|
264
|
-
|
|
265
|
-
}
|
|
266
|
-
else {
|
|
267
|
-
entry.blockedReason = blockedReason;
|
|
268
|
-
eligible.push(entry);
|
|
372
|
+
if (dependencyNotReady && !ignoreDependencies) {
|
|
373
|
+
skippedDependencies.push(entry.task.key);
|
|
374
|
+
continue;
|
|
269
375
|
}
|
|
376
|
+
eligible.push(entry);
|
|
377
|
+
}
|
|
378
|
+
const { ordered, warnings: topoWarnings } = this.topologicalOrder(eligible, deps);
|
|
379
|
+
if (skippedDependencies.length > 0) {
|
|
380
|
+
selectionWarnings.push(`Skipped ${skippedDependencies.length} task(s) due to dependencies not ready.`);
|
|
270
381
|
}
|
|
271
|
-
const
|
|
382
|
+
const combinedWarnings = [...dedupeWarnings, ...selectionWarnings, ...topoWarnings];
|
|
272
383
|
const limited = typeof filters.limit === "number" && filters.limit > 0 ? ordered.slice(0, filters.limit) : ordered;
|
|
273
384
|
return {
|
|
274
385
|
project: project ?? undefined,
|
|
275
|
-
filters: {
|
|
386
|
+
filters: {
|
|
387
|
+
...filters,
|
|
388
|
+
taskKeys: dedupedTaskKeys ?? filters.taskKeys,
|
|
389
|
+
effectiveStatuses,
|
|
390
|
+
includeTypes: includeTypes.length ? includeTypes : undefined,
|
|
391
|
+
excludeTypes: excludeTypes.length ? excludeTypes : undefined,
|
|
392
|
+
},
|
|
276
393
|
ordered: limited,
|
|
277
|
-
|
|
278
|
-
warnings,
|
|
394
|
+
warnings: combinedWarnings,
|
|
279
395
|
};
|
|
280
396
|
}
|
|
281
397
|
}
|
|
@@ -1,19 +1,32 @@
|
|
|
1
1
|
import { WorkspaceRepository, TaskRow } from "@mcoda/db";
|
|
2
|
+
export type TaskStatusEventContext = {
|
|
3
|
+
commandName?: string | null;
|
|
4
|
+
jobId?: string | null;
|
|
5
|
+
taskRunId?: string | null;
|
|
6
|
+
agentId?: string | null;
|
|
7
|
+
metadata?: Record<string, unknown> | null;
|
|
8
|
+
timestamp?: string | null;
|
|
9
|
+
};
|
|
2
10
|
export declare class TaskStateService {
|
|
3
11
|
private workspaceRepo;
|
|
4
12
|
constructor(workspaceRepo: WorkspaceRepository);
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
13
|
+
private recordStatusEvent;
|
|
14
|
+
transitionToInProgress(task: TaskRow, context?: TaskStatusEventContext): Promise<void>;
|
|
15
|
+
markNotStarted(task: TaskRow, metadataPatch?: Record<string, unknown>, context?: TaskStatusEventContext): Promise<void>;
|
|
16
|
+
markReadyToReview(task: TaskRow, metadataPatch?: Record<string, unknown>, context?: TaskStatusEventContext): Promise<void>;
|
|
17
|
+
markReadyToQa(task: TaskRow, metadataPatch?: Record<string, unknown>, context?: TaskStatusEventContext): Promise<void>;
|
|
18
|
+
markCompleted(task: TaskRow, metadataPatch?: Record<string, unknown>, context?: TaskStatusEventContext): Promise<void>;
|
|
19
|
+
returnToInProgress(task: TaskRow, metadataPatch?: Record<string, unknown>, context?: TaskStatusEventContext): Promise<void>;
|
|
20
|
+
markChangesRequested(task: TaskRow, metadataPatch?: Record<string, unknown>, context?: TaskStatusEventContext): Promise<void>;
|
|
21
|
+
markFailed(task: TaskRow, reason: string, context?: TaskStatusEventContext): Promise<void>;
|
|
11
22
|
recordReviewMetadata(task: TaskRow, metadata: {
|
|
12
23
|
decision: string;
|
|
13
24
|
agentId?: string | null;
|
|
14
25
|
modelName?: string | null;
|
|
15
26
|
jobId?: string | null;
|
|
16
27
|
reviewId?: string | null;
|
|
28
|
+
diffEmpty?: boolean;
|
|
29
|
+
changedPaths?: string[];
|
|
17
30
|
}): Promise<void>;
|
|
18
31
|
}
|
|
19
32
|
//# sourceMappingURL=TaskStateService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskStateService.d.ts","sourceRoot":"","sources":["../../../src/services/execution/TaskStateService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"TaskStateService.d.ts","sourceRoot":"","sources":["../../../src/services/execution/TaskStateService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzD,MAAM,MAAM,sBAAsB,GAAG;IACnC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,qBAAa,gBAAgB;IACf,OAAO,CAAC,aAAa;gBAAb,aAAa,EAAE,mBAAmB;YAExC,iBAAiB;IAoBzB,sBAAsB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtF,cAAc,CAClB,IAAI,EAAE,OAAO,EACb,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,IAAI,CAAC;IAYV,iBAAiB,CACrB,IAAI,EAAE,OAAO,EACb,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,IAAI,CAAC;IAYV,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtH,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBtH,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3H,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsD7H,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB1F,oBAAoB,CACxB,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB;CAgBJ"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { READY_TO_CODE_REVIEW } from "@mcoda/shared";
|
|
1
2
|
const mergeMetadata = (existing, patch) => {
|
|
2
3
|
if (patch === undefined)
|
|
3
4
|
return existing;
|
|
@@ -9,41 +10,151 @@ export class TaskStateService {
|
|
|
9
10
|
constructor(workspaceRepo) {
|
|
10
11
|
this.workspaceRepo = workspaceRepo;
|
|
11
12
|
}
|
|
12
|
-
async
|
|
13
|
+
async recordStatusEvent(task, fromStatus, toStatus, context) {
|
|
14
|
+
if (fromStatus === toStatus)
|
|
15
|
+
return;
|
|
16
|
+
await this.workspaceRepo.recordTaskStatusEvent({
|
|
17
|
+
taskId: task.id,
|
|
18
|
+
fromStatus: fromStatus ?? null,
|
|
19
|
+
toStatus,
|
|
20
|
+
timestamp: context?.timestamp ?? new Date().toISOString(),
|
|
21
|
+
commandName: context?.commandName ?? null,
|
|
22
|
+
jobId: context?.jobId ?? null,
|
|
23
|
+
taskRunId: context?.taskRunId ?? null,
|
|
24
|
+
agentId: context?.agentId ?? null,
|
|
25
|
+
metadata: context?.metadata ?? undefined,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
async transitionToInProgress(task, context) {
|
|
13
29
|
if (task.status === "in_progress")
|
|
14
30
|
return;
|
|
31
|
+
const fromStatus = task.status;
|
|
15
32
|
await this.workspaceRepo.updateTask(task.id, { status: "in_progress" });
|
|
33
|
+
await this.recordStatusEvent(task, fromStatus, "in_progress", context);
|
|
34
|
+
task.status = "in_progress";
|
|
35
|
+
}
|
|
36
|
+
async markNotStarted(task, metadataPatch, context) {
|
|
37
|
+
const fromStatus = task.status;
|
|
38
|
+
const mergedMetadata = mergeMetadata(task.metadata, metadataPatch ?? undefined);
|
|
39
|
+
await this.workspaceRepo.updateTask(task.id, {
|
|
40
|
+
status: "not_started",
|
|
41
|
+
metadata: mergedMetadata ?? undefined,
|
|
42
|
+
});
|
|
43
|
+
await this.recordStatusEvent(task, fromStatus, "not_started", context);
|
|
44
|
+
task.status = "not_started";
|
|
45
|
+
task.metadata = mergedMetadata ?? undefined;
|
|
16
46
|
}
|
|
17
|
-
async markReadyToReview(task, metadataPatch) {
|
|
47
|
+
async markReadyToReview(task, metadataPatch, context) {
|
|
48
|
+
const fromStatus = task.status;
|
|
49
|
+
const mergedMetadata = mergeMetadata(task.metadata, metadataPatch ?? undefined);
|
|
18
50
|
await this.workspaceRepo.updateTask(task.id, {
|
|
19
|
-
status:
|
|
20
|
-
metadata:
|
|
51
|
+
status: READY_TO_CODE_REVIEW,
|
|
52
|
+
metadata: mergedMetadata ?? undefined,
|
|
21
53
|
});
|
|
54
|
+
await this.recordStatusEvent(task, fromStatus, READY_TO_CODE_REVIEW, context);
|
|
55
|
+
task.status = READY_TO_CODE_REVIEW;
|
|
56
|
+
task.metadata = mergedMetadata ?? undefined;
|
|
22
57
|
}
|
|
23
|
-
async markReadyToQa(task, metadataPatch) {
|
|
58
|
+
async markReadyToQa(task, metadataPatch, context) {
|
|
59
|
+
const fromStatus = task.status;
|
|
60
|
+
const mergedMetadata = mergeMetadata(task.metadata, metadataPatch ?? undefined);
|
|
24
61
|
await this.workspaceRepo.updateTask(task.id, {
|
|
25
62
|
status: "ready_to_qa",
|
|
26
|
-
metadata:
|
|
63
|
+
metadata: mergedMetadata ?? undefined,
|
|
27
64
|
});
|
|
65
|
+
await this.recordStatusEvent(task, fromStatus, "ready_to_qa", context);
|
|
66
|
+
task.status = "ready_to_qa";
|
|
67
|
+
task.metadata = mergedMetadata ?? undefined;
|
|
28
68
|
}
|
|
29
|
-
async markCompleted(task, metadataPatch) {
|
|
69
|
+
async markCompleted(task, metadataPatch, context) {
|
|
70
|
+
const fromStatus = task.status;
|
|
71
|
+
const mergedMetadata = mergeMetadata(task.metadata, {
|
|
72
|
+
...(metadataPatch ?? {}),
|
|
73
|
+
last_completed_at: new Date().toISOString(),
|
|
74
|
+
...(metadataPatch?.revert_event_pending === undefined ? { revert_event_pending: false } : {}),
|
|
75
|
+
});
|
|
30
76
|
await this.workspaceRepo.updateTask(task.id, {
|
|
31
77
|
status: "completed",
|
|
32
|
-
metadata:
|
|
78
|
+
metadata: mergedMetadata ?? undefined,
|
|
33
79
|
});
|
|
80
|
+
await this.recordStatusEvent(task, fromStatus, "completed", context);
|
|
81
|
+
task.status = "completed";
|
|
82
|
+
task.metadata = mergedMetadata ?? undefined;
|
|
34
83
|
}
|
|
35
|
-
async returnToInProgress(task, metadataPatch) {
|
|
84
|
+
async returnToInProgress(task, metadataPatch, context) {
|
|
85
|
+
const fromStatus = task.status;
|
|
86
|
+
const mergedMetadata = mergeMetadata(task.metadata, metadataPatch ?? undefined);
|
|
36
87
|
await this.workspaceRepo.updateTask(task.id, {
|
|
37
88
|
status: "in_progress",
|
|
38
|
-
metadata:
|
|
89
|
+
metadata: mergedMetadata ?? undefined,
|
|
90
|
+
});
|
|
91
|
+
await this.recordStatusEvent(task, fromStatus, "in_progress", context);
|
|
92
|
+
task.status = "in_progress";
|
|
93
|
+
task.metadata = mergedMetadata ?? undefined;
|
|
94
|
+
}
|
|
95
|
+
async markChangesRequested(task, metadataPatch, context) {
|
|
96
|
+
const fromStatus = task.status;
|
|
97
|
+
const isRevert = fromStatus === "completed";
|
|
98
|
+
const baseMetadata = task.metadata ?? {};
|
|
99
|
+
const currentRevertCount = typeof baseMetadata.revert_event_count === "number" && Number.isFinite(baseMetadata.revert_event_count)
|
|
100
|
+
? baseMetadata.revert_event_count
|
|
101
|
+
: 0;
|
|
102
|
+
const reasonFromPatch = typeof metadataPatch?.revert_reason === "string" ? metadataPatch.revert_reason : undefined;
|
|
103
|
+
const reasonFromContext = typeof context?.metadata?.revert_reason === "string"
|
|
104
|
+
? String(context.metadata.revert_reason)
|
|
105
|
+
: typeof context?.metadata?.reason === "string"
|
|
106
|
+
? String(context.metadata.reason)
|
|
107
|
+
: undefined;
|
|
108
|
+
const revertReason = reasonFromPatch ?? reasonFromContext;
|
|
109
|
+
const revertEvent = isRevert
|
|
110
|
+
? {
|
|
111
|
+
from_status: fromStatus,
|
|
112
|
+
to_status: "changes_requested",
|
|
113
|
+
timestamp: context?.timestamp ?? new Date().toISOString(),
|
|
114
|
+
reason: revertReason ?? "changes requested after completion",
|
|
115
|
+
}
|
|
116
|
+
: undefined;
|
|
117
|
+
const mergedMetadata = mergeMetadata(task.metadata, {
|
|
118
|
+
...(metadataPatch ?? {}),
|
|
119
|
+
...(isRevert
|
|
120
|
+
? {
|
|
121
|
+
revert_event_pending: true,
|
|
122
|
+
revert_event_count: currentRevertCount + 1,
|
|
123
|
+
last_revert_event: revertEvent,
|
|
124
|
+
}
|
|
125
|
+
: {}),
|
|
126
|
+
});
|
|
127
|
+
await this.workspaceRepo.updateTask(task.id, {
|
|
128
|
+
status: "changes_requested",
|
|
129
|
+
metadata: mergedMetadata ?? undefined,
|
|
39
130
|
});
|
|
131
|
+
const eventContext = isRevert
|
|
132
|
+
? {
|
|
133
|
+
...(context ?? {}),
|
|
134
|
+
metadata: mergeMetadata(context?.metadata ?? undefined, {
|
|
135
|
+
revert_event: true,
|
|
136
|
+
revert_reason: revertReason ?? "changes requested after completion",
|
|
137
|
+
}),
|
|
138
|
+
}
|
|
139
|
+
: context;
|
|
140
|
+
await this.recordStatusEvent(task, fromStatus, "changes_requested", eventContext);
|
|
141
|
+
task.status = "changes_requested";
|
|
142
|
+
task.metadata = mergedMetadata ?? undefined;
|
|
40
143
|
}
|
|
41
|
-
async
|
|
42
|
-
const
|
|
144
|
+
async markFailed(task, reason, context) {
|
|
145
|
+
const fromStatus = task.status;
|
|
146
|
+
const metadata = mergeMetadata(task.metadata, { failed_reason: reason }) ?? {
|
|
147
|
+
failed_reason: reason,
|
|
148
|
+
};
|
|
43
149
|
await this.workspaceRepo.updateTask(task.id, {
|
|
44
|
-
status: "
|
|
150
|
+
status: "failed",
|
|
45
151
|
metadata,
|
|
46
152
|
});
|
|
153
|
+
const eventMetadata = mergeMetadata(context?.metadata ?? undefined, { failed_reason: reason }) ?? { failed_reason: reason };
|
|
154
|
+
const eventContext = context ? { ...context, metadata: eventMetadata } : { metadata: eventMetadata };
|
|
155
|
+
await this.recordStatusEvent(task, fromStatus, "failed", eventContext);
|
|
156
|
+
task.status = "failed";
|
|
157
|
+
task.metadata = metadata;
|
|
47
158
|
}
|
|
48
159
|
async recordReviewMetadata(task, metadata) {
|
|
49
160
|
const patch = mergeMetadata(task.metadata, {
|
|
@@ -53,6 +164,10 @@ export class TaskStateService {
|
|
|
53
164
|
last_review_job_id: metadata.jobId ?? null,
|
|
54
165
|
last_review_id: metadata.reviewId ?? null,
|
|
55
166
|
last_reviewed_at: new Date().toISOString(),
|
|
167
|
+
...(metadata.diffEmpty !== undefined ? { last_review_diff_empty: metadata.diffEmpty } : {}),
|
|
168
|
+
...(Array.isArray(metadata.changedPaths) && metadata.changedPaths.length
|
|
169
|
+
? { last_review_changed_paths: metadata.changedPaths }
|
|
170
|
+
: {}),
|
|
56
171
|
});
|
|
57
172
|
await this.workspaceRepo.updateTask(task.id, { metadata: patch ?? undefined });
|
|
58
173
|
}
|
|
@@ -6,18 +6,28 @@ import { JobService } from "../jobs/JobService.js";
|
|
|
6
6
|
import { TaskSelectionService, TaskSelectionFilters, TaskSelectionPlan } from "./TaskSelectionService.js";
|
|
7
7
|
import { TaskStateService } from "./TaskStateService.js";
|
|
8
8
|
import { RoutingService } from "../agents/RoutingService.js";
|
|
9
|
+
import { AgentRatingService } from "../agents/AgentRatingService.js";
|
|
9
10
|
export interface WorkOnTasksRequest extends TaskSelectionFilters {
|
|
10
11
|
workspace: WorkspaceResolution;
|
|
11
12
|
noCommit?: boolean;
|
|
12
13
|
dryRun?: boolean;
|
|
13
14
|
agentName?: string;
|
|
14
15
|
agentStream?: boolean;
|
|
16
|
+
rateAgents?: boolean;
|
|
15
17
|
baseBranch?: string;
|
|
18
|
+
autoMerge?: boolean;
|
|
19
|
+
autoPush?: boolean;
|
|
20
|
+
workRunner?: string;
|
|
21
|
+
useCodali?: boolean;
|
|
22
|
+
agentAdapterOverride?: string;
|
|
16
23
|
onAgentChunk?: (chunk: string) => void;
|
|
24
|
+
abortSignal?: AbortSignal;
|
|
25
|
+
maxAgentSeconds?: number;
|
|
26
|
+
allowFileOverwrite?: boolean;
|
|
17
27
|
}
|
|
18
28
|
export interface TaskExecutionResult {
|
|
19
29
|
taskKey: string;
|
|
20
|
-
status: "succeeded" | "
|
|
30
|
+
status: "succeeded" | "failed" | "skipped";
|
|
21
31
|
notes?: string;
|
|
22
32
|
branch?: string;
|
|
23
33
|
}
|
|
@@ -36,6 +46,7 @@ export declare class WorkOnTasksService {
|
|
|
36
46
|
private taskLogSeq;
|
|
37
47
|
private vcs;
|
|
38
48
|
private routingService;
|
|
49
|
+
private ratingService?;
|
|
39
50
|
private readPromptFiles;
|
|
40
51
|
constructor(workspace: WorkspaceResolution, deps: {
|
|
41
52
|
agentService: AgentService;
|
|
@@ -47,21 +58,35 @@ export declare class WorkOnTasksService {
|
|
|
47
58
|
repo: GlobalRepository;
|
|
48
59
|
vcsClient?: VcsClient;
|
|
49
60
|
routingService: RoutingService;
|
|
61
|
+
ratingService?: AgentRatingService;
|
|
50
62
|
});
|
|
51
63
|
private loadPrompts;
|
|
52
64
|
private ensureMcoda;
|
|
53
65
|
private writeWorkCheckpoint;
|
|
66
|
+
private persistPatchArtifact;
|
|
54
67
|
private checkpoint;
|
|
55
68
|
static create(workspace: WorkspaceResolution): Promise<WorkOnTasksService>;
|
|
56
69
|
close(): Promise<void>;
|
|
70
|
+
setDocdexAvailability(available: boolean, reason?: string): void;
|
|
57
71
|
private resolveAgent;
|
|
72
|
+
private ensureWorkAgent;
|
|
73
|
+
private ensureRatingService;
|
|
74
|
+
private resolveTaskComplexity;
|
|
58
75
|
private nextLogSeq;
|
|
59
76
|
private logTask;
|
|
60
77
|
private recordTokenUsage;
|
|
61
78
|
private updateTaskPhase;
|
|
62
79
|
private gatherDocContext;
|
|
80
|
+
private parseCommentBody;
|
|
81
|
+
private buildCommentBacklog;
|
|
82
|
+
private buildWorkLog;
|
|
83
|
+
private loadCommentContext;
|
|
84
|
+
private loadWorkLog;
|
|
85
|
+
private countCommentBacklogFailures;
|
|
86
|
+
private applyCommentResolutions;
|
|
63
87
|
private buildPrompt;
|
|
64
88
|
private checkoutBaseBranch;
|
|
89
|
+
private buildCommitEnv;
|
|
65
90
|
private commitPendingChanges;
|
|
66
91
|
private ensureBranches;
|
|
67
92
|
private formatGitError;
|
|
@@ -70,10 +95,16 @@ export declare class WorkOnTasksService {
|
|
|
70
95
|
private isRemotePermissionError;
|
|
71
96
|
private isCommitHookFailure;
|
|
72
97
|
private isGpgSignFailure;
|
|
98
|
+
private isDirtyCheckoutError;
|
|
73
99
|
private pushWithRecovery;
|
|
74
100
|
private validateScope;
|
|
101
|
+
private buildStructuredFileBlocks;
|
|
102
|
+
private applyStructuredActions;
|
|
75
103
|
private applyPatches;
|
|
76
104
|
private applyFileBlocks;
|
|
105
|
+
private usesCliBrowserTools;
|
|
106
|
+
private ensureCypressChromium;
|
|
107
|
+
private applyChromiumForTests;
|
|
77
108
|
private runTests;
|
|
78
109
|
workOnTasks(request: WorkOnTasksRequest): Promise<WorkOnTasksResult>;
|
|
79
110
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkOnTasksService.d.ts","sourceRoot":"","sources":["../../../src/services/execution/WorkOnTasksService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WorkOnTasksService.d.ts","sourceRoot":"","sources":["../../../src/services/execution/WorkOnTasksService.ts"],"names":[],"mappings":"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"}
|