@mcoda/core 0.1.27 → 0.1.28
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/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.map +1 -1
- package/dist/services/execution/WorkOnTasksService.js +183 -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)")
|
|
@@ -3639,6 +3723,16 @@ export class WorkOnTasksService {
|
|
|
3639
3723
|
};
|
|
3640
3724
|
try {
|
|
3641
3725
|
const warnings = [...baseBranchWarnings, ...statusWarnings, ...runnerWarnings];
|
|
3726
|
+
const selectionWarningSet = new Set();
|
|
3727
|
+
const pushSelectionWarnings = (entries) => {
|
|
3728
|
+
for (const warning of entries) {
|
|
3729
|
+
const normalized = warning.trim();
|
|
3730
|
+
if (!normalized || selectionWarningSet.has(normalized))
|
|
3731
|
+
continue;
|
|
3732
|
+
selectionWarningSet.add(normalized);
|
|
3733
|
+
warnings.push(warning);
|
|
3734
|
+
}
|
|
3735
|
+
};
|
|
3642
3736
|
try {
|
|
3643
3737
|
const guidance = await ensureProjectGuidance(this.workspace.workspaceRoot, {
|
|
3644
3738
|
mcodaDir: this.workspace.mcodaDir,
|
|
@@ -3687,7 +3781,7 @@ export class WorkOnTasksService {
|
|
|
3687
3781
|
totalItems: selection.ordered.length,
|
|
3688
3782
|
processedItems: 0,
|
|
3689
3783
|
});
|
|
3690
|
-
|
|
3784
|
+
pushSelectionWarnings(selection.warnings);
|
|
3691
3785
|
const results = [];
|
|
3692
3786
|
const taskSummaries = new Map();
|
|
3693
3787
|
let preflightMissingHarnessTasks = await this.findMissingTestHarnessTasks(selection.ordered);
|
|
@@ -3917,8 +4011,67 @@ export class WorkOnTasksService {
|
|
|
3917
4011
|
emitLine(" ░░░░░ END OF WORK TASK ░░░░░");
|
|
3918
4012
|
emitBlank();
|
|
3919
4013
|
};
|
|
4014
|
+
const maxSelectedTasks = typeof request.limit === "number" && request.limit > 0 ? request.limit : undefined;
|
|
4015
|
+
const selectedTaskIds = new Set(selection.ordered.map((entry) => entry.task.id));
|
|
4016
|
+
const refreshSelectionQueue = async (processedCount) => {
|
|
4017
|
+
if (maxSelectedTasks !== undefined && selectedTaskIds.size >= maxSelectedTasks)
|
|
4018
|
+
return;
|
|
4019
|
+
const remainingBudget = maxSelectedTasks === undefined ? undefined : Math.max(0, maxSelectedTasks - selectedTaskIds.size);
|
|
4020
|
+
if (remainingBudget === 0)
|
|
4021
|
+
return;
|
|
4022
|
+
const refreshedSelection = await this.selectionService.selectTasks({
|
|
4023
|
+
projectKey: request.projectKey,
|
|
4024
|
+
epicKey: request.epicKey,
|
|
4025
|
+
storyKey: request.storyKey,
|
|
4026
|
+
taskKeys: request.taskKeys,
|
|
4027
|
+
statusFilter,
|
|
4028
|
+
ignoreStatusFilter,
|
|
4029
|
+
includeTypes,
|
|
4030
|
+
excludeTypes,
|
|
4031
|
+
ignoreDependencies,
|
|
4032
|
+
missingContextPolicy: request.missingContextPolicy ?? "block",
|
|
4033
|
+
limit: remainingBudget,
|
|
4034
|
+
parallel: request.parallel,
|
|
4035
|
+
});
|
|
4036
|
+
pushSelectionWarnings(refreshedSelection.warnings);
|
|
4037
|
+
if (refreshedSelection.project && !selection.project) {
|
|
4038
|
+
selection = { ...selection, project: refreshedSelection.project };
|
|
4039
|
+
}
|
|
4040
|
+
const newlyEligible = [];
|
|
4041
|
+
for (const entry of refreshedSelection.ordered) {
|
|
4042
|
+
if (selectedTaskIds.has(entry.task.id))
|
|
4043
|
+
continue;
|
|
4044
|
+
if (maxSelectedTasks !== undefined && selectedTaskIds.size + newlyEligible.length >= maxSelectedTasks)
|
|
4045
|
+
break;
|
|
4046
|
+
newlyEligible.push(entry);
|
|
4047
|
+
}
|
|
4048
|
+
if (newlyEligible.length === 0)
|
|
4049
|
+
return;
|
|
4050
|
+
selection = {
|
|
4051
|
+
...selection,
|
|
4052
|
+
ordered: [...selection.ordered, ...newlyEligible],
|
|
4053
|
+
};
|
|
4054
|
+
for (const entry of newlyEligible) {
|
|
4055
|
+
selectedTaskIds.add(entry.task.id);
|
|
4056
|
+
}
|
|
4057
|
+
await this.checkpoint(job.id, "selection_refresh", {
|
|
4058
|
+
appended: newlyEligible.map((entry) => entry.task.key),
|
|
4059
|
+
totalSelected: selection.ordered.length,
|
|
4060
|
+
processedItems: processedCount,
|
|
4061
|
+
});
|
|
4062
|
+
await this.deps.jobService.updateJobStatus(job.id, "running", {
|
|
4063
|
+
payload: {
|
|
4064
|
+
selection: selection.ordered.map((entry) => entry.task.key),
|
|
4065
|
+
},
|
|
4066
|
+
totalItems: selection.ordered.length,
|
|
4067
|
+
processedItems: processedCount,
|
|
4068
|
+
});
|
|
4069
|
+
};
|
|
3920
4070
|
let abortRemainingReason = null;
|
|
3921
|
-
taskLoop: for (
|
|
4071
|
+
taskLoop: for (let index = 0; index < selection.ordered.length; index += 1) {
|
|
4072
|
+
const task = selection.ordered[index];
|
|
4073
|
+
if (!task)
|
|
4074
|
+
continue;
|
|
3922
4075
|
if (abortRemainingReason)
|
|
3923
4076
|
break taskLoop;
|
|
3924
4077
|
abortIfSignaled();
|
|
@@ -4864,9 +5017,7 @@ export class WorkOnTasksService {
|
|
|
4864
5017
|
if (aborted) {
|
|
4865
5018
|
throw new Error(resolveAbortReason());
|
|
4866
5019
|
}
|
|
4867
|
-
|
|
4868
|
-
invocationMetadata = chunk.metadata;
|
|
4869
|
-
}
|
|
5020
|
+
invocationMetadata = mergeInvocationMetadata(invocationMetadata, chunk.metadata);
|
|
4870
5021
|
if (!invocationAdapter && typeof chunk.adapter === "string") {
|
|
4871
5022
|
invocationAdapter = chunk.adapter;
|
|
4872
5023
|
}
|
|
@@ -4922,7 +5073,7 @@ export class WorkOnTasksService {
|
|
|
4922
5073
|
const result = await Promise.race([invokePromise, lockLostPromise]);
|
|
4923
5074
|
if (result) {
|
|
4924
5075
|
output = result.output ?? "";
|
|
4925
|
-
invocationMetadata = result.metadata
|
|
5076
|
+
invocationMetadata = mergeInvocationMetadata(invocationMetadata, result.metadata);
|
|
4926
5077
|
invocationAdapter = result.adapter ?? invocationAdapter;
|
|
4927
5078
|
invocationModel = result.model ?? invocationModel;
|
|
4928
5079
|
}
|
|
@@ -5050,8 +5201,25 @@ export class WorkOnTasksService {
|
|
|
5050
5201
|
if (!agentInvocation) {
|
|
5051
5202
|
throw new Error("Agent invocation did not return a response.");
|
|
5052
5203
|
}
|
|
5053
|
-
await recordUsage("agent", agentInvocation.output ?? "", agentDuration, agentInput, agentInvocation.agentUsed, attempt);
|
|
5054
5204
|
const invocationMeta = (agentInvocation.metadata ?? {});
|
|
5205
|
+
const failoverEvents = normalizeFailoverEvents(invocationMeta.failoverEvents);
|
|
5206
|
+
if (failoverEvents.length > 0) {
|
|
5207
|
+
for (const event of failoverEvents) {
|
|
5208
|
+
await this.logTask(taskRun.id, `Agent failover: ${describeFailoverEvent(event)}`, "agent_failover", event);
|
|
5209
|
+
}
|
|
5210
|
+
}
|
|
5211
|
+
const usageAgentId = resolveFailoverAgentId(failoverEvents, agentInvocation.agentUsed.id);
|
|
5212
|
+
let usageAgent = agentInvocation.agentUsed;
|
|
5213
|
+
if (usageAgentId !== agentInvocation.agentUsed.id) {
|
|
5214
|
+
try {
|
|
5215
|
+
const resolvedUsageAgent = await this.deps.agentService.resolveAgent(usageAgentId);
|
|
5216
|
+
usageAgent = { id: resolvedUsageAgent.id, defaultModel: resolvedUsageAgent.defaultModel };
|
|
5217
|
+
}
|
|
5218
|
+
catch (error) {
|
|
5219
|
+
await this.logTask(taskRun.id, `Unable to resolve failover agent (${usageAgentId}) for usage accounting: ${error instanceof Error ? error.message : String(error)}`, "agent_failover");
|
|
5220
|
+
}
|
|
5221
|
+
}
|
|
5222
|
+
await recordUsage("agent", agentInvocation.output ?? "", agentDuration, agentInput, usageAgent, attempt);
|
|
5055
5223
|
const rawTouched = Array.isArray(invocationMeta.touchedFiles) ? invocationMeta.touchedFiles : [];
|
|
5056
5224
|
const touchedFiles = rawTouched.filter((entry) => typeof entry === "string" && entry.trim().length > 0);
|
|
5057
5225
|
const logPath = typeof invocationMeta.logPath === "string" ? invocationMeta.logPath : undefined;
|
|
@@ -6193,6 +6361,14 @@ export class WorkOnTasksService {
|
|
|
6193
6361
|
}
|
|
6194
6362
|
finally {
|
|
6195
6363
|
await emitTaskEndOnce();
|
|
6364
|
+
if (!abortRemainingReason) {
|
|
6365
|
+
try {
|
|
6366
|
+
await refreshSelectionQueue(index + 1);
|
|
6367
|
+
}
|
|
6368
|
+
catch (error) {
|
|
6369
|
+
warnings.push(`selection_refresh_failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
6370
|
+
}
|
|
6371
|
+
}
|
|
6196
6372
|
}
|
|
6197
6373
|
}
|
|
6198
6374
|
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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"}
|