@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,10 +1,17 @@
1
1
  import { WorkspaceRepository } from "@mcoda/db";
2
- const DEFAULT_IMPLEMENTATION_STATUSES = ["not_started", "in_progress"];
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
- return Array.from(new Set(statuses.map((s) => s.toLowerCase().trim()).filter(Boolean)));
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: parseAcceptanceCriteria(row.story_acceptance),
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.NEGATIVE_INFINITY;
179
- const pb = b.task.priority ?? Number.NEGATIVE_INFINITY;
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 pb - pa;
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 effectiveStatuses = normalizeStatusList(filters.statusFilter);
221
- const allowBlocked = effectiveStatuses.includes("blocked");
222
- const tasks = await this.loadTasks({ ...filters, project });
223
- const filteredTasks = tasks.filter((task) => effectiveStatuses.includes(task.task_status.toLowerCase()));
224
- const candidateIds = filteredTasks.map((t) => t.task_id);
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 filteredTasks) {
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 blockedReason;
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
- blockedReason = "dependency_not_ready";
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 blocked unless explicitly ignored
257
- blockedReason = "dependency_not_ready";
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 (blockedReason && !(allowBlocked || (filters.taskKeys ?? []).includes(entry.task.key))) {
263
- entry.blockedReason = blockedReason;
264
- blocked.push(entry);
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 { ordered, warnings } = this.topologicalOrder(eligible, deps);
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: { ...filters, effectiveStatuses },
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
- blocked,
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
- transitionToInProgress(task: TaskRow): Promise<void>;
6
- markReadyToReview(task: TaskRow, metadataPatch?: Record<string, unknown>): Promise<void>;
7
- markReadyToQa(task: TaskRow, metadataPatch?: Record<string, unknown>): Promise<void>;
8
- markCompleted(task: TaskRow, metadataPatch?: Record<string, unknown>): Promise<void>;
9
- returnToInProgress(task: TaskRow, metadataPatch?: Record<string, unknown>): Promise<void>;
10
- markBlocked(task: TaskRow, reason: string): Promise<void>;
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;AAQzD,qBAAa,gBAAgB;IACf,OAAO,CAAC,aAAa;gBAAb,aAAa,EAAE,mBAAmB;IAEhD,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpD,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxF,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpF,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpF,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzF,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzD,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;CAW9K"}
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 transitionToInProgress(task) {
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: "ready_to_review",
20
- metadata: mergeMetadata(task.metadata, metadataPatch ?? undefined) ?? undefined,
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: mergeMetadata(task.metadata, metadataPatch ?? undefined) ?? undefined,
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: mergeMetadata(task.metadata, metadataPatch ?? undefined) ?? undefined,
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: mergeMetadata(task.metadata, metadataPatch ?? undefined) ?? undefined,
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 markBlocked(task, reason) {
42
- const metadata = mergeMetadata(task.metadata, { blocked_reason: reason }) ?? { blocked_reason: reason };
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: "blocked",
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" | "blocked" | "failed" | "skipped";
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":"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"}
1
+ {"version":3,"file":"WorkOnTasksService.d.ts","sourceRoot":"","sources":["../../../src/services/execution/WorkOnTasksService.ts"],"names":[],"mappings":"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"}