@mcoda/core 0.1.27 → 0.1.29
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/dist/api/AgentsApi.d.ts +9 -1
- package/dist/api/AgentsApi.d.ts.map +1 -1
- package/dist/api/AgentsApi.js +53 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/services/backlog/TaskOrderingService.d.ts +5 -0
- package/dist/services/backlog/TaskOrderingService.d.ts.map +1 -1
- package/dist/services/backlog/TaskOrderingService.js +171 -2
- package/dist/services/execution/QaTasksService.d.ts +2 -0
- package/dist/services/execution/QaTasksService.d.ts.map +1 -1
- package/dist/services/execution/QaTasksService.js +181 -20
- package/dist/services/execution/WorkOnTasksService.d.ts +1 -0
- package/dist/services/execution/WorkOnTasksService.d.ts.map +1 -1
- package/dist/services/execution/WorkOnTasksService.js +281 -7
- package/dist/services/planning/CreateTasksService.d.ts +8 -0
- package/dist/services/planning/CreateTasksService.d.ts.map +1 -1
- package/dist/services/planning/CreateTasksService.js +350 -39
- package/dist/services/planning/SdsPreflightService.d.ts +98 -0
- package/dist/services/planning/SdsPreflightService.d.ts.map +1 -0
- package/dist/services/planning/SdsPreflightService.js +1093 -0
- package/dist/services/planning/TaskSufficiencyService.d.ts.map +1 -1
- package/dist/services/planning/TaskSufficiencyService.js +178 -83
- package/dist/services/review/CodeReviewService.d.ts.map +1 -1
- package/dist/services/review/CodeReviewService.js +149 -7
- package/package.json +6 -6
|
@@ -198,6 +198,90 @@ const deriveParentDirs = (paths) => {
|
|
|
198
198
|
}
|
|
199
199
|
return Array.from(dirs);
|
|
200
200
|
};
|
|
201
|
+
const isRecord = (value) => Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
202
|
+
const normalizeFailoverEvents = (value) => {
|
|
203
|
+
if (!Array.isArray(value))
|
|
204
|
+
return [];
|
|
205
|
+
const events = [];
|
|
206
|
+
for (const entry of value) {
|
|
207
|
+
if (!isRecord(entry))
|
|
208
|
+
continue;
|
|
209
|
+
if (typeof entry.type !== "string" || entry.type.trim().length === 0)
|
|
210
|
+
continue;
|
|
211
|
+
events.push({ ...entry });
|
|
212
|
+
}
|
|
213
|
+
return events;
|
|
214
|
+
};
|
|
215
|
+
const mergeFailoverEvents = (left, right) => {
|
|
216
|
+
if (!left.length)
|
|
217
|
+
return right;
|
|
218
|
+
if (!right.length)
|
|
219
|
+
return left;
|
|
220
|
+
const seen = new Set();
|
|
221
|
+
const merged = [];
|
|
222
|
+
const signature = (event) => [
|
|
223
|
+
event.type ?? "",
|
|
224
|
+
event.fromAgentId ?? "",
|
|
225
|
+
event.toAgentId ?? "",
|
|
226
|
+
event.at ?? "",
|
|
227
|
+
event.until ?? "",
|
|
228
|
+
event.durationMs ?? "",
|
|
229
|
+
].join("|");
|
|
230
|
+
for (const event of [...left, ...right]) {
|
|
231
|
+
const key = signature(event);
|
|
232
|
+
if (seen.has(key))
|
|
233
|
+
continue;
|
|
234
|
+
seen.add(key);
|
|
235
|
+
merged.push(event);
|
|
236
|
+
}
|
|
237
|
+
return merged;
|
|
238
|
+
};
|
|
239
|
+
const mergeInvocationMetadata = (current, incoming) => {
|
|
240
|
+
if (!current && !incoming)
|
|
241
|
+
return undefined;
|
|
242
|
+
if (!incoming)
|
|
243
|
+
return current;
|
|
244
|
+
if (!current)
|
|
245
|
+
return { ...incoming };
|
|
246
|
+
const merged = { ...current, ...incoming };
|
|
247
|
+
const currentEvents = normalizeFailoverEvents(current.failoverEvents);
|
|
248
|
+
const incomingEvents = normalizeFailoverEvents(incoming.failoverEvents);
|
|
249
|
+
if (currentEvents.length > 0 || incomingEvents.length > 0) {
|
|
250
|
+
merged.failoverEvents = mergeFailoverEvents(currentEvents, incomingEvents);
|
|
251
|
+
}
|
|
252
|
+
return merged;
|
|
253
|
+
};
|
|
254
|
+
const describeFailoverEvent = (event) => {
|
|
255
|
+
const type = String(event.type ?? "unknown");
|
|
256
|
+
if (type === "switch_agent") {
|
|
257
|
+
const from = typeof event.fromAgentId === "string" ? event.fromAgentId : "unknown";
|
|
258
|
+
const to = typeof event.toAgentId === "string" ? event.toAgentId : "unknown";
|
|
259
|
+
return `switch_agent ${from} -> ${to}`;
|
|
260
|
+
}
|
|
261
|
+
if (type === "sleep_until_reset") {
|
|
262
|
+
const duration = typeof event.durationMs === "number" && Number.isFinite(event.durationMs)
|
|
263
|
+
? `${Math.round(event.durationMs / 1000)}s`
|
|
264
|
+
: "unknown duration";
|
|
265
|
+
const until = typeof event.until === "string" ? event.until : "unknown";
|
|
266
|
+
return `sleep_until_reset ${duration} (until ${until})`;
|
|
267
|
+
}
|
|
268
|
+
if (type === "stream_restart_after_limit") {
|
|
269
|
+
const from = typeof event.fromAgentId === "string" ? event.fromAgentId : "unknown";
|
|
270
|
+
return `stream_restart_after_limit from ${from}`;
|
|
271
|
+
}
|
|
272
|
+
return type;
|
|
273
|
+
};
|
|
274
|
+
const resolveFailoverAgentId = (events, fallbackAgentId) => {
|
|
275
|
+
for (let index = events.length - 1; index >= 0; index -= 1) {
|
|
276
|
+
const event = events[index];
|
|
277
|
+
if (event?.type !== "switch_agent")
|
|
278
|
+
continue;
|
|
279
|
+
if (typeof event.toAgentId === "string" && event.toAgentId.trim().length > 0) {
|
|
280
|
+
return event.toAgentId;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return fallbackAgentId;
|
|
284
|
+
};
|
|
201
285
|
const normalizeGatewayItem = (value) => {
|
|
202
286
|
const trimmed = value.trim();
|
|
203
287
|
if (!trimmed || trimmed === "(none)")
|
|
@@ -3479,6 +3563,42 @@ export class WorkOnTasksService {
|
|
|
3479
3563
|
}
|
|
3480
3564
|
return { ok: true, results };
|
|
3481
3565
|
}
|
|
3566
|
+
selectMostDependedTask(candidates) {
|
|
3567
|
+
if (candidates.length === 0)
|
|
3568
|
+
return undefined;
|
|
3569
|
+
const candidateIds = new Set(candidates.map((candidate) => candidate.task.id));
|
|
3570
|
+
const dependentCounts = new Map();
|
|
3571
|
+
for (const candidate of candidates) {
|
|
3572
|
+
dependentCounts.set(candidate.task.id, 0);
|
|
3573
|
+
}
|
|
3574
|
+
for (const candidate of candidates) {
|
|
3575
|
+
for (const dependencyId of candidate.dependencies.ids) {
|
|
3576
|
+
if (!candidateIds.has(dependencyId))
|
|
3577
|
+
continue;
|
|
3578
|
+
dependentCounts.set(dependencyId, (dependentCounts.get(dependencyId) ?? 0) + 1);
|
|
3579
|
+
}
|
|
3580
|
+
}
|
|
3581
|
+
const ranked = candidates
|
|
3582
|
+
.map((candidate, index) => ({
|
|
3583
|
+
candidate,
|
|
3584
|
+
index,
|
|
3585
|
+
dependentCount: dependentCounts.get(candidate.task.id) ?? 0,
|
|
3586
|
+
}))
|
|
3587
|
+
.sort((a, b) => {
|
|
3588
|
+
if (a.dependentCount !== b.dependentCount)
|
|
3589
|
+
return b.dependentCount - a.dependentCount;
|
|
3590
|
+
const priorityA = a.candidate.task.priority ?? Number.MAX_SAFE_INTEGER;
|
|
3591
|
+
const priorityB = b.candidate.task.priority ?? Number.MAX_SAFE_INTEGER;
|
|
3592
|
+
if (priorityA !== priorityB)
|
|
3593
|
+
return priorityA - priorityB;
|
|
3594
|
+
const createdA = Date.parse(a.candidate.task.createdAt) || 0;
|
|
3595
|
+
const createdB = Date.parse(b.candidate.task.createdAt) || 0;
|
|
3596
|
+
if (createdA !== createdB)
|
|
3597
|
+
return createdA - createdB;
|
|
3598
|
+
return a.index - b.index;
|
|
3599
|
+
});
|
|
3600
|
+
return ranked[0]?.candidate;
|
|
3601
|
+
}
|
|
3482
3602
|
async workOnTasks(request) {
|
|
3483
3603
|
await this.ensureMcoda();
|
|
3484
3604
|
const commandName = "work-on-tasks";
|
|
@@ -3639,6 +3759,16 @@ export class WorkOnTasksService {
|
|
|
3639
3759
|
};
|
|
3640
3760
|
try {
|
|
3641
3761
|
const warnings = [...baseBranchWarnings, ...statusWarnings, ...runnerWarnings];
|
|
3762
|
+
const selectionWarningSet = new Set();
|
|
3763
|
+
const pushSelectionWarnings = (entries) => {
|
|
3764
|
+
for (const warning of entries) {
|
|
3765
|
+
const normalized = warning.trim();
|
|
3766
|
+
if (!normalized || selectionWarningSet.has(normalized))
|
|
3767
|
+
continue;
|
|
3768
|
+
selectionWarningSet.add(normalized);
|
|
3769
|
+
warnings.push(warning);
|
|
3770
|
+
}
|
|
3771
|
+
};
|
|
3642
3772
|
try {
|
|
3643
3773
|
const guidance = await ensureProjectGuidance(this.workspace.workspaceRoot, {
|
|
3644
3774
|
mcodaDir: this.workspace.mcodaDir,
|
|
@@ -3676,6 +3806,37 @@ export class WorkOnTasksService {
|
|
|
3676
3806
|
limit: request.limit,
|
|
3677
3807
|
parallel: request.parallel,
|
|
3678
3808
|
});
|
|
3809
|
+
if (selection.ordered.length === 0 && !ignoreDependencies && !explicitTaskSelection) {
|
|
3810
|
+
const dependencyBlocked = selection.warnings.some((warning) => warning.toLowerCase().includes("dependencies not ready"));
|
|
3811
|
+
if (dependencyBlocked) {
|
|
3812
|
+
const fallbackSelection = await this.selectionService.selectTasks({
|
|
3813
|
+
projectKey: request.projectKey,
|
|
3814
|
+
epicKey: request.epicKey,
|
|
3815
|
+
storyKey: request.storyKey,
|
|
3816
|
+
taskKeys: request.taskKeys,
|
|
3817
|
+
statusFilter,
|
|
3818
|
+
ignoreStatusFilter,
|
|
3819
|
+
includeTypes,
|
|
3820
|
+
excludeTypes,
|
|
3821
|
+
ignoreDependencies: true,
|
|
3822
|
+
missingContextPolicy: request.missingContextPolicy ?? "block",
|
|
3823
|
+
parallel: request.parallel,
|
|
3824
|
+
});
|
|
3825
|
+
pushSelectionWarnings(fallbackSelection.warnings);
|
|
3826
|
+
const fallbackTask = this.selectMostDependedTask(fallbackSelection.ordered);
|
|
3827
|
+
if (fallbackTask) {
|
|
3828
|
+
selection = {
|
|
3829
|
+
...selection,
|
|
3830
|
+
project: selection.project ?? fallbackSelection.project,
|
|
3831
|
+
ordered: [fallbackTask],
|
|
3832
|
+
warnings: [
|
|
3833
|
+
...selection.warnings,
|
|
3834
|
+
`No dependency-ready tasks available; selected ${fallbackTask.task.key} from dependency-loop fallback.`,
|
|
3835
|
+
],
|
|
3836
|
+
};
|
|
3837
|
+
}
|
|
3838
|
+
}
|
|
3839
|
+
}
|
|
3679
3840
|
await this.checkpoint(job.id, "selection", {
|
|
3680
3841
|
ordered: selection.ordered.map((t) => t.task.key),
|
|
3681
3842
|
});
|
|
@@ -3687,7 +3848,7 @@ export class WorkOnTasksService {
|
|
|
3687
3848
|
totalItems: selection.ordered.length,
|
|
3688
3849
|
processedItems: 0,
|
|
3689
3850
|
});
|
|
3690
|
-
|
|
3851
|
+
pushSelectionWarnings(selection.warnings);
|
|
3691
3852
|
const results = [];
|
|
3692
3853
|
const taskSummaries = new Map();
|
|
3693
3854
|
let preflightMissingHarnessTasks = await this.findMissingTestHarnessTasks(selection.ordered);
|
|
@@ -3917,8 +4078,98 @@ export class WorkOnTasksService {
|
|
|
3917
4078
|
emitLine(" ░░░░░ END OF WORK TASK ░░░░░");
|
|
3918
4079
|
emitBlank();
|
|
3919
4080
|
};
|
|
4081
|
+
const maxSelectedTasks = typeof request.limit === "number" && request.limit > 0 ? request.limit : undefined;
|
|
4082
|
+
const selectedTaskIds = new Set(selection.ordered.map((entry) => entry.task.id));
|
|
4083
|
+
const refreshSelectionQueue = async (processedCount) => {
|
|
4084
|
+
if (maxSelectedTasks !== undefined && selectedTaskIds.size >= maxSelectedTasks)
|
|
4085
|
+
return;
|
|
4086
|
+
const remainingBudget = maxSelectedTasks === undefined ? undefined : Math.max(0, maxSelectedTasks - selectedTaskIds.size);
|
|
4087
|
+
if (remainingBudget === 0)
|
|
4088
|
+
return;
|
|
4089
|
+
const refreshedSelection = await this.selectionService.selectTasks({
|
|
4090
|
+
projectKey: request.projectKey,
|
|
4091
|
+
epicKey: request.epicKey,
|
|
4092
|
+
storyKey: request.storyKey,
|
|
4093
|
+
taskKeys: request.taskKeys,
|
|
4094
|
+
statusFilter,
|
|
4095
|
+
ignoreStatusFilter,
|
|
4096
|
+
includeTypes,
|
|
4097
|
+
excludeTypes,
|
|
4098
|
+
ignoreDependencies,
|
|
4099
|
+
missingContextPolicy: request.missingContextPolicy ?? "block",
|
|
4100
|
+
limit: remainingBudget,
|
|
4101
|
+
parallel: request.parallel,
|
|
4102
|
+
});
|
|
4103
|
+
pushSelectionWarnings(refreshedSelection.warnings);
|
|
4104
|
+
if (refreshedSelection.project && !selection.project) {
|
|
4105
|
+
selection = { ...selection, project: refreshedSelection.project };
|
|
4106
|
+
}
|
|
4107
|
+
const newlyEligible = [];
|
|
4108
|
+
for (const entry of refreshedSelection.ordered) {
|
|
4109
|
+
if (selectedTaskIds.has(entry.task.id))
|
|
4110
|
+
continue;
|
|
4111
|
+
if (maxSelectedTasks !== undefined && selectedTaskIds.size + newlyEligible.length >= maxSelectedTasks)
|
|
4112
|
+
break;
|
|
4113
|
+
newlyEligible.push(entry);
|
|
4114
|
+
}
|
|
4115
|
+
if (newlyEligible.length === 0 && !ignoreDependencies && !explicitTaskSelection) {
|
|
4116
|
+
const dependencyBlocked = refreshedSelection.warnings.some((warning) => warning.toLowerCase().includes("dependencies not ready"));
|
|
4117
|
+
if (dependencyBlocked) {
|
|
4118
|
+
const fallbackSelection = await this.selectionService.selectTasks({
|
|
4119
|
+
projectKey: request.projectKey,
|
|
4120
|
+
epicKey: request.epicKey,
|
|
4121
|
+
storyKey: request.storyKey,
|
|
4122
|
+
taskKeys: request.taskKeys,
|
|
4123
|
+
statusFilter,
|
|
4124
|
+
ignoreStatusFilter,
|
|
4125
|
+
includeTypes,
|
|
4126
|
+
excludeTypes,
|
|
4127
|
+
ignoreDependencies: true,
|
|
4128
|
+
missingContextPolicy: request.missingContextPolicy ?? "block",
|
|
4129
|
+
limit: remainingBudget,
|
|
4130
|
+
parallel: request.parallel,
|
|
4131
|
+
});
|
|
4132
|
+
pushSelectionWarnings(fallbackSelection.warnings);
|
|
4133
|
+
const fallbackTask = this.selectMostDependedTask(fallbackSelection.ordered.filter((entry) => !selectedTaskIds.has(entry.task.id)));
|
|
4134
|
+
if (fallbackTask) {
|
|
4135
|
+
const fallbackWarning = `No dependency-ready tasks available; selected ${fallbackTask.task.key} from dependency-loop fallback.`;
|
|
4136
|
+
selection = {
|
|
4137
|
+
...selection,
|
|
4138
|
+
project: selection.project ?? refreshedSelection.project ?? fallbackSelection.project,
|
|
4139
|
+
warnings: [...selection.warnings, fallbackWarning],
|
|
4140
|
+
};
|
|
4141
|
+
pushSelectionWarnings([fallbackWarning]);
|
|
4142
|
+
newlyEligible.push(fallbackTask);
|
|
4143
|
+
}
|
|
4144
|
+
}
|
|
4145
|
+
}
|
|
4146
|
+
if (newlyEligible.length === 0)
|
|
4147
|
+
return;
|
|
4148
|
+
selection = {
|
|
4149
|
+
...selection,
|
|
4150
|
+
ordered: [...selection.ordered, ...newlyEligible],
|
|
4151
|
+
};
|
|
4152
|
+
for (const entry of newlyEligible) {
|
|
4153
|
+
selectedTaskIds.add(entry.task.id);
|
|
4154
|
+
}
|
|
4155
|
+
await this.checkpoint(job.id, "selection_refresh", {
|
|
4156
|
+
appended: newlyEligible.map((entry) => entry.task.key),
|
|
4157
|
+
totalSelected: selection.ordered.length,
|
|
4158
|
+
processedItems: processedCount,
|
|
4159
|
+
});
|
|
4160
|
+
await this.deps.jobService.updateJobStatus(job.id, "running", {
|
|
4161
|
+
payload: {
|
|
4162
|
+
selection: selection.ordered.map((entry) => entry.task.key),
|
|
4163
|
+
},
|
|
4164
|
+
totalItems: selection.ordered.length,
|
|
4165
|
+
processedItems: processedCount,
|
|
4166
|
+
});
|
|
4167
|
+
};
|
|
3920
4168
|
let abortRemainingReason = null;
|
|
3921
|
-
taskLoop: for (
|
|
4169
|
+
taskLoop: for (let index = 0; index < selection.ordered.length; index += 1) {
|
|
4170
|
+
const task = selection.ordered[index];
|
|
4171
|
+
if (!task)
|
|
4172
|
+
continue;
|
|
3922
4173
|
if (abortRemainingReason)
|
|
3923
4174
|
break taskLoop;
|
|
3924
4175
|
abortIfSignaled();
|
|
@@ -4864,9 +5115,7 @@ export class WorkOnTasksService {
|
|
|
4864
5115
|
if (aborted) {
|
|
4865
5116
|
throw new Error(resolveAbortReason());
|
|
4866
5117
|
}
|
|
4867
|
-
|
|
4868
|
-
invocationMetadata = chunk.metadata;
|
|
4869
|
-
}
|
|
5118
|
+
invocationMetadata = mergeInvocationMetadata(invocationMetadata, chunk.metadata);
|
|
4870
5119
|
if (!invocationAdapter && typeof chunk.adapter === "string") {
|
|
4871
5120
|
invocationAdapter = chunk.adapter;
|
|
4872
5121
|
}
|
|
@@ -4922,7 +5171,7 @@ export class WorkOnTasksService {
|
|
|
4922
5171
|
const result = await Promise.race([invokePromise, lockLostPromise]);
|
|
4923
5172
|
if (result) {
|
|
4924
5173
|
output = result.output ?? "";
|
|
4925
|
-
invocationMetadata = result.metadata
|
|
5174
|
+
invocationMetadata = mergeInvocationMetadata(invocationMetadata, result.metadata);
|
|
4926
5175
|
invocationAdapter = result.adapter ?? invocationAdapter;
|
|
4927
5176
|
invocationModel = result.model ?? invocationModel;
|
|
4928
5177
|
}
|
|
@@ -5050,8 +5299,25 @@ export class WorkOnTasksService {
|
|
|
5050
5299
|
if (!agentInvocation) {
|
|
5051
5300
|
throw new Error("Agent invocation did not return a response.");
|
|
5052
5301
|
}
|
|
5053
|
-
await recordUsage("agent", agentInvocation.output ?? "", agentDuration, agentInput, agentInvocation.agentUsed, attempt);
|
|
5054
5302
|
const invocationMeta = (agentInvocation.metadata ?? {});
|
|
5303
|
+
const failoverEvents = normalizeFailoverEvents(invocationMeta.failoverEvents);
|
|
5304
|
+
if (failoverEvents.length > 0) {
|
|
5305
|
+
for (const event of failoverEvents) {
|
|
5306
|
+
await this.logTask(taskRun.id, `Agent failover: ${describeFailoverEvent(event)}`, "agent_failover", event);
|
|
5307
|
+
}
|
|
5308
|
+
}
|
|
5309
|
+
const usageAgentId = resolveFailoverAgentId(failoverEvents, agentInvocation.agentUsed.id);
|
|
5310
|
+
let usageAgent = agentInvocation.agentUsed;
|
|
5311
|
+
if (usageAgentId !== agentInvocation.agentUsed.id) {
|
|
5312
|
+
try {
|
|
5313
|
+
const resolvedUsageAgent = await this.deps.agentService.resolveAgent(usageAgentId);
|
|
5314
|
+
usageAgent = { id: resolvedUsageAgent.id, defaultModel: resolvedUsageAgent.defaultModel };
|
|
5315
|
+
}
|
|
5316
|
+
catch (error) {
|
|
5317
|
+
await this.logTask(taskRun.id, `Unable to resolve failover agent (${usageAgentId}) for usage accounting: ${error instanceof Error ? error.message : String(error)}`, "agent_failover");
|
|
5318
|
+
}
|
|
5319
|
+
}
|
|
5320
|
+
await recordUsage("agent", agentInvocation.output ?? "", agentDuration, agentInput, usageAgent, attempt);
|
|
5055
5321
|
const rawTouched = Array.isArray(invocationMeta.touchedFiles) ? invocationMeta.touchedFiles : [];
|
|
5056
5322
|
const touchedFiles = rawTouched.filter((entry) => typeof entry === "string" && entry.trim().length > 0);
|
|
5057
5323
|
const logPath = typeof invocationMeta.logPath === "string" ? invocationMeta.logPath : undefined;
|
|
@@ -6193,6 +6459,14 @@ export class WorkOnTasksService {
|
|
|
6193
6459
|
}
|
|
6194
6460
|
finally {
|
|
6195
6461
|
await emitTaskEndOnce();
|
|
6462
|
+
if (!abortRemainingReason) {
|
|
6463
|
+
try {
|
|
6464
|
+
await refreshSelectionQueue(index + 1);
|
|
6465
|
+
}
|
|
6466
|
+
catch (error) {
|
|
6467
|
+
warnings.push(`selection_refresh_failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
6468
|
+
}
|
|
6469
|
+
}
|
|
6196
6470
|
}
|
|
6197
6471
|
}
|
|
6198
6472
|
if (abortRemainingReason) {
|
|
@@ -7,6 +7,7 @@ import { RoutingService } from "../agents/RoutingService.js";
|
|
|
7
7
|
import { AgentRatingService } from "../agents/AgentRatingService.js";
|
|
8
8
|
import { TaskOrderingService } from "../backlog/TaskOrderingService.js";
|
|
9
9
|
import { TaskSufficiencyService } from "./TaskSufficiencyService.js";
|
|
10
|
+
import { SdsPreflightService } from "./SdsPreflightService.js";
|
|
10
11
|
export interface CreateTasksOptions {
|
|
11
12
|
workspace: WorkspaceResolution;
|
|
12
13
|
projectKey: string;
|
|
@@ -22,6 +23,8 @@ export interface CreateTasksOptions {
|
|
|
22
23
|
qaEntryUrl?: string;
|
|
23
24
|
qaStartCommand?: string;
|
|
24
25
|
qaRequires?: string[];
|
|
26
|
+
sdsPreflightCommit?: boolean;
|
|
27
|
+
sdsPreflightCommitMessage?: string;
|
|
25
28
|
}
|
|
26
29
|
export interface CreateTasksResult {
|
|
27
30
|
jobId: string;
|
|
@@ -37,6 +40,8 @@ type TaskOrderingFactory = (workspace: WorkspaceResolution, options?: {
|
|
|
37
40
|
}) => Promise<TaskOrderingClient>;
|
|
38
41
|
type TaskSufficiencyClient = Pick<TaskSufficiencyService, "runAudit" | "close">;
|
|
39
42
|
type TaskSufficiencyFactory = (workspace: WorkspaceResolution) => Promise<TaskSufficiencyClient>;
|
|
43
|
+
type SdsPreflightClient = Pick<SdsPreflightService, "runPreflight" | "close">;
|
|
44
|
+
type SdsPreflightFactory = (workspace: WorkspaceResolution) => Promise<SdsPreflightClient>;
|
|
40
45
|
export declare class CreateTasksService {
|
|
41
46
|
private static readonly MAX_BUSY_RETRIES;
|
|
42
47
|
private static readonly BUSY_BACKOFF_MS;
|
|
@@ -50,6 +55,7 @@ export declare class CreateTasksService {
|
|
|
50
55
|
private ratingService?;
|
|
51
56
|
private taskOrderingFactory;
|
|
52
57
|
private taskSufficiencyFactory;
|
|
58
|
+
private sdsPreflightFactory;
|
|
53
59
|
constructor(workspace: WorkspaceResolution, deps: {
|
|
54
60
|
docdex: DocdexClient;
|
|
55
61
|
jobService: JobService;
|
|
@@ -60,6 +66,7 @@ export declare class CreateTasksService {
|
|
|
60
66
|
ratingService?: AgentRatingService;
|
|
61
67
|
taskOrderingFactory?: TaskOrderingFactory;
|
|
62
68
|
taskSufficiencyFactory?: TaskSufficiencyFactory;
|
|
69
|
+
sdsPreflightFactory?: SdsPreflightFactory;
|
|
63
70
|
});
|
|
64
71
|
static create(workspace: WorkspaceResolution): Promise<CreateTasksService>;
|
|
65
72
|
close(): Promise<void>;
|
|
@@ -72,6 +79,7 @@ export declare class CreateTasksService {
|
|
|
72
79
|
private ensureRatingService;
|
|
73
80
|
private prepareDocs;
|
|
74
81
|
private normalizeDocInputForSet;
|
|
82
|
+
private mergeDocInputs;
|
|
75
83
|
private docIdentity;
|
|
76
84
|
private mergeDocs;
|
|
77
85
|
private sortDocsForPlanning;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateTasksService.d.ts","sourceRoot":"","sources":["../../../src/services/planning/CreateTasksService.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAEL,OAAO,EACP,gBAAgB,EAEhB,QAAQ,EAER,iBAAiB,EAEjB,OAAO,EACP,mBAAmB,EACpB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,YAAY,EAAkB,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAOxE,OAAO,EAAE,sBAAsB,EAAmC,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"CreateTasksService.d.ts","sourceRoot":"","sources":["../../../src/services/planning/CreateTasksService.ts"],"names":[],"mappings":"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"}
|