@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
package/dist/api/AgentsApi.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Agent, AgentAuthMetadata, AgentHealth, AgentPromptManifest, CreateAgentInput, UpdateAgentInput } from "@mcoda/shared";
|
|
1
|
+
import { Agent, AgentAuthMetadata, AgentHealth, AgentPromptManifest, AgentUsageLimitRecord, CreateAgentInput, UpdateAgentInput } from "@mcoda/shared";
|
|
2
2
|
import { AgentRunRatingRow, GlobalRepository } from "@mcoda/db";
|
|
3
3
|
import { AgentService, InvocationResult } from "@mcoda/agents";
|
|
4
4
|
import { RoutingService } from "../services/agents/RoutingService.js";
|
|
@@ -9,6 +9,12 @@ export interface AgentResponse extends Agent {
|
|
|
9
9
|
auth?: AgentAuthMetadata;
|
|
10
10
|
models?: Agent["models"];
|
|
11
11
|
}
|
|
12
|
+
export interface AgentUsageLimitResponse extends AgentUsageLimitRecord {
|
|
13
|
+
agentSlug?: string;
|
|
14
|
+
effectiveResetAt?: string;
|
|
15
|
+
resetAtExact: boolean;
|
|
16
|
+
resetAtSource?: string;
|
|
17
|
+
}
|
|
12
18
|
export declare class AgentsApi {
|
|
13
19
|
private repo;
|
|
14
20
|
private agentService;
|
|
@@ -20,6 +26,8 @@ export declare class AgentsApi {
|
|
|
20
26
|
private withCommandRun;
|
|
21
27
|
listAgents(): Promise<AgentResponse[]>;
|
|
22
28
|
listAgentRunRatings(idOrSlug: string, limit?: number): Promise<AgentRunRatingRow[]>;
|
|
29
|
+
private deriveUsageLimitReset;
|
|
30
|
+
listAgentUsageLimits(idOrSlug?: string): Promise<AgentUsageLimitResponse[]>;
|
|
23
31
|
createAgent(input: CreateAgentInput): Promise<AgentResponse>;
|
|
24
32
|
getAgent(idOrSlug: string): Promise<AgentResponse>;
|
|
25
33
|
updateAgent(idOrSlug: string, patch: UpdateAgentInput): Promise<AgentResponse>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentsApi.d.ts","sourceRoot":"","sources":["../../src/api/AgentsApi.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,iBAAiB,EACjB,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAEjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAoB,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAEtE,MAAM,WAAW,aAAc,SAAQ,KAAK;IAC1C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,MAAM,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;CAC1B;AAED,qBAAa,SAAS;IACR,OAAO,CAAC,IAAI;IAAoB,OAAO,CAAC,YAAY;IAAgB,OAAO,CAAC,cAAc;gBAAlF,IAAI,EAAE,gBAAgB,EAAU,YAAY,EAAE,YAAY,EAAU,cAAc,EAAE,cAAc;WAEzG,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC;IAOnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAOd,YAAY;YAIZ,cAAc;IA+BtB,UAAU,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAoBtC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"AgentsApi.d.ts","sourceRoot":"","sources":["../../src/api/AgentsApi.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,iBAAiB,EACjB,WAAW,EACX,mBAAmB,EACnB,qBAAqB,EAErB,gBAAgB,EAChB,gBAAgB,EAEjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAoB,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAEtE,MAAM,WAAW,aAAc,SAAQ,KAAK;IAC1C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,MAAM,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAwB,SAAQ,qBAAqB;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AASD,qBAAa,SAAS;IACR,OAAO,CAAC,IAAI;IAAoB,OAAO,CAAC,YAAY;IAAgB,OAAO,CAAC,cAAc;gBAAlF,IAAI,EAAE,gBAAgB,EAAU,YAAY,EAAE,YAAY,EAAU,cAAc,EAAE,cAAc;WAEzG,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC;IAOnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAOd,YAAY;YAIZ,cAAc;IA+BtB,UAAU,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAoBtC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAKrF,OAAO,CAAC,qBAAqB;IAwCvB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAc3E,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAW5D,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAYlD,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAY9E,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB3D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAS1E,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAK3E,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAoBjD,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,MAAM,SAA4E,GACjF,OAAO,CAAC;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,QAAQ,EAAE,gBAAgB,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAyD/E,OAAO,CAAC,iBAAiB;IA0GzB,OAAO,CAAC,oBAAoB;IAetB,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EAAE,EACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC;QAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,gBAAgB,EAAE,CAAA;KAAE,CAAC;IAoE7F,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,WAAW,SAAe,EAC1B,WAAW,SAAY,GACtB,OAAO,CAAC,IAAI,CAAC;CAMjB"}
|
package/dist/api/AgentsApi.js
CHANGED
|
@@ -2,6 +2,12 @@ import { CryptoHelper, } from "@mcoda/shared";
|
|
|
2
2
|
import { GlobalRepository } from "@mcoda/db";
|
|
3
3
|
import { AgentService } from "@mcoda/agents";
|
|
4
4
|
import { RoutingService } from "../services/agents/RoutingService.js";
|
|
5
|
+
const WINDOW_RESET_FALLBACK_MS = {
|
|
6
|
+
rolling_5h: 5 * 60 * 60 * 1000,
|
|
7
|
+
daily: 24 * 60 * 60 * 1000,
|
|
8
|
+
weekly: 7 * 24 * 60 * 60 * 1000,
|
|
9
|
+
other: 60 * 60 * 1000,
|
|
10
|
+
};
|
|
5
11
|
export class AgentsApi {
|
|
6
12
|
constructor(repo, agentService, routingService) {
|
|
7
13
|
this.repo = repo;
|
|
@@ -73,6 +79,53 @@ export class AgentsApi {
|
|
|
73
79
|
const agent = await this.resolveAgent(idOrSlug);
|
|
74
80
|
return this.repo.listAgentRunRatings(agent.id, limit);
|
|
75
81
|
}
|
|
82
|
+
deriveUsageLimitReset(record) {
|
|
83
|
+
const details = record.details && typeof record.details === "object"
|
|
84
|
+
? record.details
|
|
85
|
+
: undefined;
|
|
86
|
+
const detailResetSource = typeof details?.resetAtSource === "string" ? details.resetAtSource : undefined;
|
|
87
|
+
if (record.resetAt) {
|
|
88
|
+
return {
|
|
89
|
+
effectiveResetAt: record.resetAt,
|
|
90
|
+
resetAtExact: detailResetSource !== "estimated_window_fallback",
|
|
91
|
+
resetAtSource: detailResetSource,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const estimatedFromDetails = typeof details?.estimatedResetAt === "string" ? details.estimatedResetAt : undefined;
|
|
95
|
+
if (estimatedFromDetails) {
|
|
96
|
+
return {
|
|
97
|
+
effectiveResetAt: estimatedFromDetails,
|
|
98
|
+
resetAtExact: false,
|
|
99
|
+
resetAtSource: detailResetSource ?? "estimated_from_details",
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const observedAtMs = Date.parse(record.observedAt);
|
|
103
|
+
if (!Number.isFinite(observedAtMs)) {
|
|
104
|
+
return {
|
|
105
|
+
resetAtExact: false,
|
|
106
|
+
resetAtSource: detailResetSource,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const fallbackMs = WINDOW_RESET_FALLBACK_MS[record.windowType] ?? WINDOW_RESET_FALLBACK_MS.other;
|
|
110
|
+
return {
|
|
111
|
+
effectiveResetAt: new Date(observedAtMs + fallbackMs).toISOString(),
|
|
112
|
+
resetAtExact: false,
|
|
113
|
+
resetAtSource: detailResetSource ?? "estimated_from_observed_at",
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
async listAgentUsageLimits(idOrSlug) {
|
|
117
|
+
const filterAgent = idOrSlug ? await this.resolveAgent(idOrSlug) : undefined;
|
|
118
|
+
const [limits, agents] = await Promise.all([
|
|
119
|
+
this.repo.listAgentUsageLimits(filterAgent?.id),
|
|
120
|
+
this.repo.listAgents(),
|
|
121
|
+
]);
|
|
122
|
+
const slugById = new Map(agents.map((agent) => [agent.id, agent.slug]));
|
|
123
|
+
return limits.map((record) => ({
|
|
124
|
+
...record,
|
|
125
|
+
agentSlug: slugById.get(record.agentId),
|
|
126
|
+
...this.deriveUsageLimitReset(record),
|
|
127
|
+
}));
|
|
128
|
+
}
|
|
76
129
|
async createAgent(input) {
|
|
77
130
|
return this.withCommandRun("agent.add", { slug: input.slug, adapter: input.adapter }, async () => {
|
|
78
131
|
const agent = await this.repo.createAgent(input);
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export * from "./services/jobs/JobService.js";
|
|
|
5
5
|
export * from "./services/jobs/JobInsightsService.js";
|
|
6
6
|
export * from "./services/jobs/JobResumeService.js";
|
|
7
7
|
export * from "./services/planning/CreateTasksService.js";
|
|
8
|
+
export * from "./services/planning/SdsPreflightService.js";
|
|
8
9
|
export * from "./services/planning/RefineTasksService.js";
|
|
9
10
|
export * from "./services/planning/TaskSufficiencyService.js";
|
|
10
11
|
export * from "./services/planning/KeyHelpers.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uCAAuC,CAAC;AACtD,cAAc,qCAAqC,CAAC;AACpD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,mCAAmC,CAAC;AAClD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,0CAA0C,CAAC;AACzD,cAAc,yCAAyC,CAAC;AACxD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,wCAAwC,CAAC;AACvD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,wCAAwC,CAAC;AACvD,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0CAA0C,CAAC;AACzD,cAAc,uCAAuC,CAAC;AACtD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qCAAqC,CAAC;AACpD,cAAc,0CAA0C,CAAC;AACzD,cAAc,qCAAqC,CAAC;AACpD,cAAc,yCAAyC,CAAC;AACxD,cAAc,yCAAyC,CAAC;AACxD,cAAc,sCAAsC,CAAC;AACrD,cAAc,iCAAiC,CAAC;AAChD,cAAc,0CAA0C,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uCAAuC,CAAC;AACtD,cAAc,qCAAqC,CAAC;AACpD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,mCAAmC,CAAC;AAClD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,0CAA0C,CAAC;AACzD,cAAc,yCAAyC,CAAC;AACxD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,wCAAwC,CAAC;AACvD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,wCAAwC,CAAC;AACvD,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0CAA0C,CAAC;AACzD,cAAc,uCAAuC,CAAC;AACtD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qCAAqC,CAAC;AACpD,cAAc,0CAA0C,CAAC;AACzD,cAAc,qCAAqC,CAAC;AACpD,cAAc,yCAAyC,CAAC;AACxD,cAAc,yCAAyC,CAAC;AACxD,cAAc,sCAAsC,CAAC;AACrD,cAAc,iCAAiC,CAAC;AAChD,cAAc,0CAA0C,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,6 +5,7 @@ export * from "./services/jobs/JobService.js";
|
|
|
5
5
|
export * from "./services/jobs/JobInsightsService.js";
|
|
6
6
|
export * from "./services/jobs/JobResumeService.js";
|
|
7
7
|
export * from "./services/planning/CreateTasksService.js";
|
|
8
|
+
export * from "./services/planning/SdsPreflightService.js";
|
|
8
9
|
export * from "./services/planning/RefineTasksService.js";
|
|
9
10
|
export * from "./services/planning/TaskSufficiencyService.js";
|
|
10
11
|
export * from "./services/planning/KeyHelpers.js";
|
|
@@ -93,6 +93,11 @@ export declare class TaskOrderingService {
|
|
|
93
93
|
private buildOrderingMetadata;
|
|
94
94
|
private buildDependencyGraph;
|
|
95
95
|
private hasDependencyPath;
|
|
96
|
+
private buildDependentsFromGraph;
|
|
97
|
+
private findCyclicComponents;
|
|
98
|
+
private chooseCycleBreakCandidate;
|
|
99
|
+
private removeDependencyEdge;
|
|
100
|
+
private resolveDependencyCycles;
|
|
96
101
|
private injectFoundationDependencies;
|
|
97
102
|
private applyInferredDependencies;
|
|
98
103
|
private compareTasks;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskOrderingService.d.ts","sourceRoot":"","sources":["../../../src/services/backlog/TaskOrderingService.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG1E,OAAO,EAAgB,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAwEtE,KAAK,qBAAqB,GAAG,aAAa,GAAG,aAAa,GAAG,wBAAwB,CAAC;AAEtF,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,UAAU,OAAO;IACf,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAuCD,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;CAC/C;
|
|
1
|
+
{"version":3,"file":"TaskOrderingService.d.ts","sourceRoot":"","sources":["../../../src/services/backlog/TaskOrderingService.ts"],"names":[],"mappings":"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"}
|
|
@@ -646,6 +646,166 @@ export class TaskOrderingService {
|
|
|
646
646
|
}
|
|
647
647
|
return false;
|
|
648
648
|
}
|
|
649
|
+
buildDependentsFromGraph(graph) {
|
|
650
|
+
const dependents = new Map();
|
|
651
|
+
for (const [taskId, dependencies] of graph.entries()) {
|
|
652
|
+
for (const dependencyId of dependencies) {
|
|
653
|
+
const list = dependents.get(dependencyId) ?? [];
|
|
654
|
+
list.push(taskId);
|
|
655
|
+
dependents.set(dependencyId, list);
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
return dependents;
|
|
659
|
+
}
|
|
660
|
+
findCyclicComponents(graph) {
|
|
661
|
+
const nodes = new Set();
|
|
662
|
+
for (const [taskId, dependencies] of graph.entries()) {
|
|
663
|
+
nodes.add(taskId);
|
|
664
|
+
for (const dependencyId of dependencies)
|
|
665
|
+
nodes.add(dependencyId);
|
|
666
|
+
}
|
|
667
|
+
const indexByNode = new Map();
|
|
668
|
+
const lowLinkByNode = new Map();
|
|
669
|
+
const stack = [];
|
|
670
|
+
const onStack = new Set();
|
|
671
|
+
const components = [];
|
|
672
|
+
let index = 0;
|
|
673
|
+
const visit = (nodeId) => {
|
|
674
|
+
indexByNode.set(nodeId, index);
|
|
675
|
+
lowLinkByNode.set(nodeId, index);
|
|
676
|
+
index += 1;
|
|
677
|
+
stack.push(nodeId);
|
|
678
|
+
onStack.add(nodeId);
|
|
679
|
+
const neighbors = graph.get(nodeId) ?? new Set();
|
|
680
|
+
for (const neighbor of neighbors) {
|
|
681
|
+
if (!indexByNode.has(neighbor)) {
|
|
682
|
+
visit(neighbor);
|
|
683
|
+
const nextLow = Math.min(lowLinkByNode.get(nodeId) ?? Number.MAX_SAFE_INTEGER, lowLinkByNode.get(neighbor) ?? Number.MAX_SAFE_INTEGER);
|
|
684
|
+
lowLinkByNode.set(nodeId, nextLow);
|
|
685
|
+
continue;
|
|
686
|
+
}
|
|
687
|
+
if (!onStack.has(neighbor))
|
|
688
|
+
continue;
|
|
689
|
+
const nextLow = Math.min(lowLinkByNode.get(nodeId) ?? Number.MAX_SAFE_INTEGER, indexByNode.get(neighbor) ?? Number.MAX_SAFE_INTEGER);
|
|
690
|
+
lowLinkByNode.set(nodeId, nextLow);
|
|
691
|
+
}
|
|
692
|
+
if ((lowLinkByNode.get(nodeId) ?? -1) !== (indexByNode.get(nodeId) ?? -2))
|
|
693
|
+
return;
|
|
694
|
+
const component = [];
|
|
695
|
+
while (stack.length > 0) {
|
|
696
|
+
const popped = stack.pop();
|
|
697
|
+
onStack.delete(popped);
|
|
698
|
+
component.push(popped);
|
|
699
|
+
if (popped === nodeId)
|
|
700
|
+
break;
|
|
701
|
+
}
|
|
702
|
+
if (component.length > 1) {
|
|
703
|
+
components.push(component);
|
|
704
|
+
return;
|
|
705
|
+
}
|
|
706
|
+
const only = component[0];
|
|
707
|
+
if (only && graph.get(only)?.has(only)) {
|
|
708
|
+
components.push(component);
|
|
709
|
+
}
|
|
710
|
+
};
|
|
711
|
+
for (const nodeId of nodes) {
|
|
712
|
+
if (!indexByNode.has(nodeId))
|
|
713
|
+
visit(nodeId);
|
|
714
|
+
}
|
|
715
|
+
return components;
|
|
716
|
+
}
|
|
717
|
+
chooseCycleBreakCandidate(component, dependencyGraph, impact) {
|
|
718
|
+
const members = new Set(component);
|
|
719
|
+
const candidates = [];
|
|
720
|
+
for (const taskId of component) {
|
|
721
|
+
const dependencies = dependencyGraph.get(taskId);
|
|
722
|
+
if (!dependencies || dependencies.size === 0)
|
|
723
|
+
continue;
|
|
724
|
+
const weight = impact.get(taskId)?.total ?? 0;
|
|
725
|
+
for (const dependencyId of dependencies) {
|
|
726
|
+
if (!members.has(dependencyId))
|
|
727
|
+
continue;
|
|
728
|
+
candidates.push({ taskId, dependsOnTaskId: dependencyId, weight });
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
if (candidates.length === 0)
|
|
732
|
+
return undefined;
|
|
733
|
+
const maxWeight = Math.max(...candidates.map((candidate) => candidate.weight));
|
|
734
|
+
const weighted = candidates.filter((candidate) => candidate.weight === maxWeight);
|
|
735
|
+
if (weighted.length === 1)
|
|
736
|
+
return weighted[0];
|
|
737
|
+
const randomIndex = Math.floor(Math.random() * weighted.length);
|
|
738
|
+
return weighted[randomIndex];
|
|
739
|
+
}
|
|
740
|
+
async removeDependencyEdge(deps, taskId, dependsOnTaskId, persist) {
|
|
741
|
+
const rows = deps.get(taskId) ?? [];
|
|
742
|
+
const rowIndex = rows.findIndex((row) => row.depends_on_task_id === dependsOnTaskId);
|
|
743
|
+
if (rowIndex < 0)
|
|
744
|
+
return false;
|
|
745
|
+
if (persist) {
|
|
746
|
+
await this.db.run(`DELETE FROM task_dependencies
|
|
747
|
+
WHERE id = (
|
|
748
|
+
SELECT id
|
|
749
|
+
FROM task_dependencies
|
|
750
|
+
WHERE task_id = ?
|
|
751
|
+
AND depends_on_task_id = ?
|
|
752
|
+
LIMIT 1
|
|
753
|
+
)`, taskId, dependsOnTaskId);
|
|
754
|
+
}
|
|
755
|
+
const nextRows = [...rows];
|
|
756
|
+
nextRows.splice(rowIndex, 1);
|
|
757
|
+
if (nextRows.length > 0) {
|
|
758
|
+
deps.set(taskId, nextRows);
|
|
759
|
+
}
|
|
760
|
+
else {
|
|
761
|
+
deps.delete(taskId);
|
|
762
|
+
}
|
|
763
|
+
return true;
|
|
764
|
+
}
|
|
765
|
+
async resolveDependencyCycles(tasks, deps, warnings, persist) {
|
|
766
|
+
const taskById = new Map(tasks.map((task) => [task.id, task]));
|
|
767
|
+
const maxIterations = Math.max(1, tasks.length * tasks.length);
|
|
768
|
+
let removedEdges = 0;
|
|
769
|
+
let unresolvedCycleMembers = new Set();
|
|
770
|
+
for (let iteration = 0; iteration < maxIterations; iteration += 1) {
|
|
771
|
+
const dependencyGraph = this.buildDependencyGraph(tasks, deps);
|
|
772
|
+
const cyclicComponents = this.findCyclicComponents(dependencyGraph);
|
|
773
|
+
if (cyclicComponents.length === 0) {
|
|
774
|
+
return { removedEdges, unresolvedCycleMembers: new Set() };
|
|
775
|
+
}
|
|
776
|
+
let removedThisIteration = false;
|
|
777
|
+
const dependents = this.buildDependentsFromGraph(dependencyGraph);
|
|
778
|
+
const impact = this.dependencyImpactMap(dependents);
|
|
779
|
+
for (const component of cyclicComponents) {
|
|
780
|
+
const candidate = this.chooseCycleBreakCandidate(component, dependencyGraph, impact);
|
|
781
|
+
if (!candidate)
|
|
782
|
+
continue;
|
|
783
|
+
const removed = await this.removeDependencyEdge(deps, candidate.taskId, candidate.dependsOnTaskId, persist);
|
|
784
|
+
if (!removed)
|
|
785
|
+
continue;
|
|
786
|
+
removedThisIteration = true;
|
|
787
|
+
removedEdges += 1;
|
|
788
|
+
const taskKey = taskById.get(candidate.taskId)?.key ?? candidate.taskId;
|
|
789
|
+
const dependencyKey = taskById.get(candidate.dependsOnTaskId)?.key ?? candidate.dependsOnTaskId;
|
|
790
|
+
warnings.push(persist
|
|
791
|
+
? `Resolved dependency cycle: removed ${taskKey} -> ${dependencyKey}.`
|
|
792
|
+
: `Dry run: would remove cyclic dependency ${taskKey} -> ${dependencyKey}.`);
|
|
793
|
+
break;
|
|
794
|
+
}
|
|
795
|
+
if (removedThisIteration)
|
|
796
|
+
continue;
|
|
797
|
+
unresolvedCycleMembers = new Set(cyclicComponents.flat());
|
|
798
|
+
break;
|
|
799
|
+
}
|
|
800
|
+
if (unresolvedCycleMembers.size === 0) {
|
|
801
|
+
const dependencyGraph = this.buildDependencyGraph(tasks, deps);
|
|
802
|
+
const cyclicComponents = this.findCyclicComponents(dependencyGraph);
|
|
803
|
+
if (cyclicComponents.length > 0) {
|
|
804
|
+
unresolvedCycleMembers = new Set(cyclicComponents.flat());
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
return { removedEdges, unresolvedCycleMembers };
|
|
808
|
+
}
|
|
649
809
|
async injectFoundationDependencies(tasks, deps, warnings, persist) {
|
|
650
810
|
const relationType = "inferred_foundation";
|
|
651
811
|
const classification = new Map();
|
|
@@ -1243,6 +1403,11 @@ export class TaskOrderingService {
|
|
|
1243
1403
|
else if (enableInference && !resolvedAgent) {
|
|
1244
1404
|
warnings.push("Dependency inference skipped: no agent resolved.");
|
|
1245
1405
|
}
|
|
1406
|
+
const cycleResolution = await this.resolveDependencyCycles(tasks, deps, warnings, applyChanges);
|
|
1407
|
+
if (cycleResolution.removedEdges > 0) {
|
|
1408
|
+
warnings.push(`Cycle resolution removed ${cycleResolution.removedEdges} dependency edge(s).`);
|
|
1409
|
+
}
|
|
1410
|
+
({ nodes, dependents, missingRefs } = this.buildNodes(tasks, deps));
|
|
1246
1411
|
if (missingRefs.size > 0) {
|
|
1247
1412
|
warnings.push(`Missing dependencies referenced: ${Array.from(missingRefs).join(", ")}`);
|
|
1248
1413
|
}
|
|
@@ -1270,7 +1435,7 @@ export class TaskOrderingService {
|
|
|
1270
1435
|
? this.buildOrderingMetadata(nodes, impact, missingContext, docContext)
|
|
1271
1436
|
: { metadataByTask: new Map(), complexityByTask: new Map() };
|
|
1272
1437
|
const { ordered: initialOrder, cycle, cycleMembers } = this.topologicalSort(nodes, dependents, impact, complexityByTask, missingContext, undefined, stageOrderMap);
|
|
1273
|
-
if (cycle) {
|
|
1438
|
+
if (cycle || cycleResolution.unresolvedCycleMembers.size > 0) {
|
|
1274
1439
|
warnings.push("Dependency cycle detected; ordering may be partial.");
|
|
1275
1440
|
}
|
|
1276
1441
|
let agentRank;
|
|
@@ -1351,7 +1516,11 @@ export class TaskOrderingService {
|
|
|
1351
1516
|
warnings.push("Agent refinement skipped: no agent resolved.");
|
|
1352
1517
|
}
|
|
1353
1518
|
const { ordered, cycle: cycleAfterAgent, cycleMembers: agentCycleMembers } = this.topologicalSort(nodes, dependents, impact, complexityByTask, missingContext, agentRank, stageOrderMap);
|
|
1354
|
-
const finalCycleMembers = new Set([
|
|
1519
|
+
const finalCycleMembers = new Set([
|
|
1520
|
+
...cycleMembers,
|
|
1521
|
+
...agentCycleMembers,
|
|
1522
|
+
...cycleResolution.unresolvedCycleMembers,
|
|
1523
|
+
]);
|
|
1355
1524
|
if (cycleAfterAgent && !cycle) {
|
|
1356
1525
|
warnings.push("Agent-influenced ordering encountered a cycle; used partial order.");
|
|
1357
1526
|
}
|
|
@@ -108,6 +108,8 @@ export declare class QaTasksService {
|
|
|
108
108
|
private resolveAgent;
|
|
109
109
|
private ensureRatingService;
|
|
110
110
|
private resolveTaskComplexity;
|
|
111
|
+
private logInvocationFailoverEvents;
|
|
112
|
+
private resolveInvocationUsageAgent;
|
|
111
113
|
private estimateTokens;
|
|
112
114
|
private fileExists;
|
|
113
115
|
private readPackageJson;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QaTasksService.d.ts","sourceRoot":"","sources":["../../../src/services/execution/QaTasksService.ts"],"names":[],"mappings":"AAWA,OAAO,EAAW,mBAAmB,EAA2D,MAAM,WAAW,CAAC;AAGlH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAY,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAC1G,OAAO,EAAE,gBAAgB,EAA+B,MAAM,uBAAuB,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAsB,MAAM,wBAAwB,CAAC;AAM/E,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"QaTasksService.d.ts","sourceRoot":"","sources":["../../../src/services/execution/QaTasksService.ts"],"names":[],"mappings":"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"}
|