@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
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":"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"}
|
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";
|
|
@@ -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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"}
|
|
@@ -169,6 +169,90 @@ const normalizeLineNumber = (value) => {
|
|
|
169
169
|
}
|
|
170
170
|
return undefined;
|
|
171
171
|
};
|
|
172
|
+
const isRecord = (value) => Boolean(value && typeof value === 'object' && !Array.isArray(value));
|
|
173
|
+
const normalizeFailoverEvents = (value) => {
|
|
174
|
+
if (!Array.isArray(value))
|
|
175
|
+
return [];
|
|
176
|
+
const events = [];
|
|
177
|
+
for (const entry of value) {
|
|
178
|
+
if (!isRecord(entry))
|
|
179
|
+
continue;
|
|
180
|
+
if (typeof entry.type !== 'string' || entry.type.trim().length === 0)
|
|
181
|
+
continue;
|
|
182
|
+
events.push({ ...entry });
|
|
183
|
+
}
|
|
184
|
+
return events;
|
|
185
|
+
};
|
|
186
|
+
const mergeFailoverEvents = (left, right) => {
|
|
187
|
+
if (!left.length)
|
|
188
|
+
return right;
|
|
189
|
+
if (!right.length)
|
|
190
|
+
return left;
|
|
191
|
+
const seen = new Set();
|
|
192
|
+
const merged = [];
|
|
193
|
+
const signature = (event) => [
|
|
194
|
+
event.type ?? '',
|
|
195
|
+
event.fromAgentId ?? '',
|
|
196
|
+
event.toAgentId ?? '',
|
|
197
|
+
event.at ?? '',
|
|
198
|
+
event.until ?? '',
|
|
199
|
+
event.durationMs ?? '',
|
|
200
|
+
].join('|');
|
|
201
|
+
for (const event of [...left, ...right]) {
|
|
202
|
+
const key = signature(event);
|
|
203
|
+
if (seen.has(key))
|
|
204
|
+
continue;
|
|
205
|
+
seen.add(key);
|
|
206
|
+
merged.push(event);
|
|
207
|
+
}
|
|
208
|
+
return merged;
|
|
209
|
+
};
|
|
210
|
+
const mergeInvocationMetadata = (current, incoming) => {
|
|
211
|
+
if (!current && !incoming)
|
|
212
|
+
return undefined;
|
|
213
|
+
if (!incoming)
|
|
214
|
+
return current;
|
|
215
|
+
if (!current)
|
|
216
|
+
return { ...incoming };
|
|
217
|
+
const merged = { ...current, ...incoming };
|
|
218
|
+
const currentEvents = normalizeFailoverEvents(current.failoverEvents);
|
|
219
|
+
const incomingEvents = normalizeFailoverEvents(incoming.failoverEvents);
|
|
220
|
+
if (currentEvents.length > 0 || incomingEvents.length > 0) {
|
|
221
|
+
merged.failoverEvents = mergeFailoverEvents(currentEvents, incomingEvents);
|
|
222
|
+
}
|
|
223
|
+
return merged;
|
|
224
|
+
};
|
|
225
|
+
const summarizeFailoverEvent = (event) => {
|
|
226
|
+
const type = String(event.type ?? 'unknown');
|
|
227
|
+
if (type === 'switch_agent') {
|
|
228
|
+
const from = typeof event.fromAgentId === 'string' ? event.fromAgentId : 'unknown';
|
|
229
|
+
const to = typeof event.toAgentId === 'string' ? event.toAgentId : 'unknown';
|
|
230
|
+
return `switch_agent ${from} -> ${to}`;
|
|
231
|
+
}
|
|
232
|
+
if (type === 'sleep_until_reset') {
|
|
233
|
+
const duration = typeof event.durationMs === 'number' && Number.isFinite(event.durationMs)
|
|
234
|
+
? `${Math.round(event.durationMs / 1000)}s`
|
|
235
|
+
: 'unknown duration';
|
|
236
|
+
const until = typeof event.until === 'string' ? event.until : 'unknown';
|
|
237
|
+
return `sleep_until_reset ${duration} (until ${until})`;
|
|
238
|
+
}
|
|
239
|
+
if (type === 'stream_restart_after_limit') {
|
|
240
|
+
const from = typeof event.fromAgentId === 'string' ? event.fromAgentId : 'unknown';
|
|
241
|
+
return `stream_restart_after_limit from ${from}`;
|
|
242
|
+
}
|
|
243
|
+
return type;
|
|
244
|
+
};
|
|
245
|
+
const resolveFailoverAgentId = (events, fallbackAgentId) => {
|
|
246
|
+
for (let index = events.length - 1; index >= 0; index -= 1) {
|
|
247
|
+
const event = events[index];
|
|
248
|
+
if (event?.type !== 'switch_agent')
|
|
249
|
+
continue;
|
|
250
|
+
if (typeof event.toAgentId === 'string' && event.toAgentId.trim().length > 0) {
|
|
251
|
+
return event.toAgentId;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return fallbackAgentId;
|
|
255
|
+
};
|
|
172
256
|
const detectApiTask = (task) => {
|
|
173
257
|
const metadata = task.metadata ?? {};
|
|
174
258
|
const files = Array.isArray(metadata.files) ? metadata.files : [];
|
|
@@ -1154,6 +1238,43 @@ export class QaTasksService {
|
|
|
1154
1238
|
return undefined;
|
|
1155
1239
|
return Math.min(10, Math.max(1, Math.round(candidate)));
|
|
1156
1240
|
}
|
|
1241
|
+
async logInvocationFailoverEvents(events, options) {
|
|
1242
|
+
if (!events.length)
|
|
1243
|
+
return;
|
|
1244
|
+
const taskRunId = options?.taskRunId;
|
|
1245
|
+
if (taskRunId) {
|
|
1246
|
+
for (const event of events) {
|
|
1247
|
+
await this.logTask(taskRunId, `Agent failover: ${summarizeFailoverEvent(event)}`, 'agent_failover', event);
|
|
1248
|
+
}
|
|
1249
|
+
return;
|
|
1250
|
+
}
|
|
1251
|
+
if (options?.warnings) {
|
|
1252
|
+
for (const event of events) {
|
|
1253
|
+
options.warnings.push(`QA agent failover: ${summarizeFailoverEvent(event)}`);
|
|
1254
|
+
}
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1257
|
+
async resolveInvocationUsageAgent(fallback, events, taskRunId) {
|
|
1258
|
+
const usageAgentId = resolveFailoverAgentId(events, fallback.id);
|
|
1259
|
+
if (usageAgentId === fallback.id)
|
|
1260
|
+
return fallback;
|
|
1261
|
+
const resolver = this.agentService?.resolveAgent;
|
|
1262
|
+
if (typeof resolver !== 'function')
|
|
1263
|
+
return fallback;
|
|
1264
|
+
try {
|
|
1265
|
+
const resolved = await resolver.call(this.agentService, usageAgentId);
|
|
1266
|
+
return {
|
|
1267
|
+
id: resolved.id,
|
|
1268
|
+
defaultModel: typeof resolved.defaultModel === 'string' ? resolved.defaultModel : fallback.defaultModel,
|
|
1269
|
+
};
|
|
1270
|
+
}
|
|
1271
|
+
catch (error) {
|
|
1272
|
+
if (taskRunId) {
|
|
1273
|
+
await this.logTask(taskRunId, `Unable to resolve failover agent (${usageAgentId}) for usage accounting: ${error?.message ?? String(error)}`, 'agent_failover');
|
|
1274
|
+
}
|
|
1275
|
+
return fallback;
|
|
1276
|
+
}
|
|
1277
|
+
}
|
|
1157
1278
|
estimateTokens(text) {
|
|
1158
1279
|
return Math.max(1, Math.ceil((text?.length ?? 0) / 4));
|
|
1159
1280
|
}
|
|
@@ -1817,14 +1938,18 @@ export class QaTasksService {
|
|
|
1817
1938
|
input: prompt,
|
|
1818
1939
|
metadata: { command: 'qa-tasks', action: 'qa-profile-plan' },
|
|
1819
1940
|
});
|
|
1941
|
+
const invocationMetadata = mergeInvocationMetadata(undefined, res.metadata);
|
|
1942
|
+
const failoverEvents = normalizeFailoverEvents(invocationMetadata?.failoverEvents);
|
|
1943
|
+
await this.logInvocationFailoverEvents(failoverEvents, { warnings: ctx.warnings });
|
|
1944
|
+
const usageAgent = await this.resolveInvocationUsageAgent({ id: agent.id, defaultModel: agent.defaultModel }, failoverEvents);
|
|
1820
1945
|
const output = res.output ?? '';
|
|
1821
1946
|
const tokensPrompt = this.estimateTokens(prompt);
|
|
1822
1947
|
const tokensCompletion = this.estimateTokens(output);
|
|
1823
1948
|
if (!this.dryRunGuard) {
|
|
1824
1949
|
await this.jobService.recordTokenUsage({
|
|
1825
1950
|
workspaceId: this.workspace.workspaceId,
|
|
1826
|
-
agentId:
|
|
1827
|
-
modelName:
|
|
1951
|
+
agentId: usageAgent.id,
|
|
1952
|
+
modelName: usageAgent.defaultModel,
|
|
1828
1953
|
jobId: ctx.jobId ?? 'qa-profile-plan',
|
|
1829
1954
|
commandRunId: ctx.commandRunId ?? 'qa-profile-plan',
|
|
1830
1955
|
tokensPrompt,
|
|
@@ -2178,8 +2303,12 @@ export class QaTasksService {
|
|
|
2178
2303
|
}
|
|
2179
2304
|
let output = '';
|
|
2180
2305
|
let chunkCount = 0;
|
|
2306
|
+
let invocationMetadata;
|
|
2181
2307
|
if (stream && this.agentService.invokeStream) {
|
|
2182
|
-
const gen = await withAbort(this.agentService.invokeStream(agent.id, {
|
|
2308
|
+
const gen = await withAbort(this.agentService.invokeStream(agent.id, {
|
|
2309
|
+
input: prompt,
|
|
2310
|
+
metadata: { command: 'qa-tasks', action: 'qa-interpret-results', taskKey: task.task.key },
|
|
2311
|
+
}));
|
|
2183
2312
|
while (true) {
|
|
2184
2313
|
abortIfSignaled();
|
|
2185
2314
|
const { value, done } = await withAbort(gen.next());
|
|
@@ -2188,19 +2317,27 @@ export class QaTasksService {
|
|
|
2188
2317
|
const chunk = value;
|
|
2189
2318
|
output += chunk.output ?? '';
|
|
2190
2319
|
chunkCount += 1;
|
|
2320
|
+
invocationMetadata = mergeInvocationMetadata(invocationMetadata, chunk.metadata);
|
|
2191
2321
|
}
|
|
2192
2322
|
}
|
|
2193
2323
|
else {
|
|
2194
|
-
const res = await withAbort(this.agentService.invoke(agent.id, {
|
|
2324
|
+
const res = await withAbort(this.agentService.invoke(agent.id, {
|
|
2325
|
+
input: prompt,
|
|
2326
|
+
metadata: { command: 'qa-tasks', action: 'qa-interpret-results', taskKey: task.task.key },
|
|
2327
|
+
}));
|
|
2195
2328
|
output = res.output ?? '';
|
|
2329
|
+
invocationMetadata = mergeInvocationMetadata(invocationMetadata, res.metadata);
|
|
2196
2330
|
}
|
|
2331
|
+
const failoverEvents = normalizeFailoverEvents(invocationMetadata?.failoverEvents);
|
|
2332
|
+
await this.logInvocationFailoverEvents(failoverEvents, { taskRunId });
|
|
2333
|
+
const usageAgent = await this.resolveInvocationUsageAgent({ id: agent.id, defaultModel: agent.defaultModel }, failoverEvents, taskRunId);
|
|
2197
2334
|
const tokensPrompt = this.estimateTokens(prompt);
|
|
2198
2335
|
const tokensCompletion = this.estimateTokens(output);
|
|
2199
2336
|
if (!this.dryRunGuard) {
|
|
2200
2337
|
await this.jobService.recordTokenUsage({
|
|
2201
2338
|
workspaceId: this.workspace.workspaceId,
|
|
2202
|
-
agentId:
|
|
2203
|
-
modelName:
|
|
2339
|
+
agentId: usageAgent.id,
|
|
2340
|
+
modelName: usageAgent.defaultModel,
|
|
2204
2341
|
jobId,
|
|
2205
2342
|
taskId: task.task.id,
|
|
2206
2343
|
commandRunId,
|
|
@@ -2236,14 +2373,18 @@ export class QaTasksService {
|
|
|
2236
2373
|
rawOutput: output,
|
|
2237
2374
|
tokensPrompt,
|
|
2238
2375
|
tokensCompletion,
|
|
2239
|
-
agentId:
|
|
2240
|
-
modelName:
|
|
2376
|
+
agentId: usageAgent.id,
|
|
2377
|
+
modelName: usageAgent.defaultModel,
|
|
2241
2378
|
};
|
|
2242
2379
|
}
|
|
2243
2380
|
const retryPrompt = `${prompt}\n\nReturn STRICT JSON only. Do not include prose, markdown fences, or comments.`;
|
|
2244
2381
|
let retryOutput = "";
|
|
2382
|
+
let retryMetadata;
|
|
2245
2383
|
if (stream && this.agentService.invokeStream) {
|
|
2246
|
-
const gen = await withAbort(this.agentService.invokeStream(agent.id, {
|
|
2384
|
+
const gen = await withAbort(this.agentService.invokeStream(agent.id, {
|
|
2385
|
+
input: retryPrompt,
|
|
2386
|
+
metadata: { command: 'qa-tasks', action: 'qa-interpret-retry', taskKey: task.task.key, retry: true },
|
|
2387
|
+
}));
|
|
2247
2388
|
while (true) {
|
|
2248
2389
|
abortIfSignaled();
|
|
2249
2390
|
const { value, done } = await withAbort(gen.next());
|
|
@@ -2251,19 +2392,27 @@ export class QaTasksService {
|
|
|
2251
2392
|
break;
|
|
2252
2393
|
const chunk = value;
|
|
2253
2394
|
retryOutput += chunk.output ?? '';
|
|
2395
|
+
retryMetadata = mergeInvocationMetadata(retryMetadata, chunk.metadata);
|
|
2254
2396
|
}
|
|
2255
2397
|
}
|
|
2256
2398
|
else {
|
|
2257
|
-
const res = await withAbort(this.agentService.invoke(agent.id, {
|
|
2399
|
+
const res = await withAbort(this.agentService.invoke(agent.id, {
|
|
2400
|
+
input: retryPrompt,
|
|
2401
|
+
metadata: { command: 'qa-tasks', action: 'qa-interpret-retry', taskKey: task.task.key, retry: true },
|
|
2402
|
+
}));
|
|
2258
2403
|
retryOutput = res.output ?? '';
|
|
2404
|
+
retryMetadata = mergeInvocationMetadata(retryMetadata, res.metadata);
|
|
2259
2405
|
}
|
|
2406
|
+
const retryFailoverEvents = normalizeFailoverEvents(retryMetadata?.failoverEvents);
|
|
2407
|
+
await this.logInvocationFailoverEvents(retryFailoverEvents, { taskRunId });
|
|
2408
|
+
const retryUsageAgent = await this.resolveInvocationUsageAgent({ id: agent.id, defaultModel: agent.defaultModel }, retryFailoverEvents, taskRunId);
|
|
2260
2409
|
const retryTokensPrompt = this.estimateTokens(retryPrompt);
|
|
2261
2410
|
const retryTokensCompletion = this.estimateTokens(retryOutput);
|
|
2262
2411
|
if (!this.dryRunGuard) {
|
|
2263
2412
|
await this.jobService.recordTokenUsage({
|
|
2264
2413
|
workspaceId: this.workspace.workspaceId,
|
|
2265
|
-
agentId:
|
|
2266
|
-
modelName:
|
|
2414
|
+
agentId: retryUsageAgent.id,
|
|
2415
|
+
modelName: retryUsageAgent.defaultModel,
|
|
2267
2416
|
jobId,
|
|
2268
2417
|
taskId: task.task.id,
|
|
2269
2418
|
commandRunId,
|
|
@@ -2293,8 +2442,8 @@ export class QaTasksService {
|
|
|
2293
2442
|
rawOutput: retryOutput,
|
|
2294
2443
|
tokensPrompt: tokensPrompt + retryTokensPrompt,
|
|
2295
2444
|
tokensCompletion: tokensCompletion + retryTokensCompletion,
|
|
2296
|
-
agentId:
|
|
2297
|
-
modelName:
|
|
2445
|
+
agentId: retryUsageAgent.id,
|
|
2446
|
+
modelName: retryUsageAgent.defaultModel,
|
|
2298
2447
|
};
|
|
2299
2448
|
}
|
|
2300
2449
|
if (taskRunId) {
|
|
@@ -2308,8 +2457,8 @@ export class QaTasksService {
|
|
|
2308
2457
|
rawOutput: retryOutput || output,
|
|
2309
2458
|
tokensPrompt: tokensPrompt + retryTokensPrompt,
|
|
2310
2459
|
tokensCompletion: tokensCompletion + retryTokensCompletion,
|
|
2311
|
-
agentId:
|
|
2312
|
-
modelName:
|
|
2460
|
+
agentId: retryUsageAgent.id,
|
|
2461
|
+
modelName: retryUsageAgent.defaultModel,
|
|
2313
2462
|
invalidJson: true,
|
|
2314
2463
|
};
|
|
2315
2464
|
}
|
|
@@ -2660,18 +2809,27 @@ export class QaTasksService {
|
|
|
2660
2809
|
.join('\n\n');
|
|
2661
2810
|
let output = '';
|
|
2662
2811
|
let chunkCount = 0;
|
|
2812
|
+
let invocationMetadata;
|
|
2663
2813
|
const useStream = agentStream && Boolean(this.agentService?.invokeStream);
|
|
2664
2814
|
try {
|
|
2665
2815
|
if (useStream && this.agentService.invokeStream) {
|
|
2666
|
-
const gen = await this.agentService.invokeStream(agent.id, {
|
|
2816
|
+
const gen = await this.agentService.invokeStream(agent.id, {
|
|
2817
|
+
input: prompt,
|
|
2818
|
+
metadata: { command: 'qa-tasks', action: 'qa-manual-followups', taskKey: task.task.key },
|
|
2819
|
+
});
|
|
2667
2820
|
for await (const chunk of gen) {
|
|
2668
2821
|
output += chunk.output ?? '';
|
|
2669
2822
|
chunkCount += 1;
|
|
2823
|
+
invocationMetadata = mergeInvocationMetadata(invocationMetadata, chunk.metadata);
|
|
2670
2824
|
}
|
|
2671
2825
|
}
|
|
2672
2826
|
else {
|
|
2673
|
-
const res = await this.agentService.invoke(agent.id, {
|
|
2827
|
+
const res = await this.agentService.invoke(agent.id, {
|
|
2828
|
+
input: prompt,
|
|
2829
|
+
metadata: { command: 'qa-tasks', action: 'qa-manual-followups', taskKey: task.task.key },
|
|
2830
|
+
});
|
|
2674
2831
|
output = res.output ?? '';
|
|
2832
|
+
invocationMetadata = mergeInvocationMetadata(invocationMetadata, res.metadata);
|
|
2675
2833
|
}
|
|
2676
2834
|
}
|
|
2677
2835
|
catch (error) {
|
|
@@ -2681,13 +2839,16 @@ export class QaTasksService {
|
|
|
2681
2839
|
}
|
|
2682
2840
|
return [];
|
|
2683
2841
|
}
|
|
2842
|
+
const failoverEvents = normalizeFailoverEvents(invocationMetadata?.failoverEvents);
|
|
2843
|
+
await this.logInvocationFailoverEvents(failoverEvents, { taskRunId });
|
|
2844
|
+
const usageAgent = await this.resolveInvocationUsageAgent({ id: agent.id, defaultModel: agent.defaultModel }, failoverEvents, taskRunId);
|
|
2684
2845
|
const tokensPrompt = this.estimateTokens(prompt);
|
|
2685
2846
|
const tokensCompletion = this.estimateTokens(output);
|
|
2686
2847
|
if (!this.dryRunGuard) {
|
|
2687
2848
|
await this.jobService.recordTokenUsage({
|
|
2688
2849
|
workspaceId: this.workspace.workspaceId,
|
|
2689
|
-
agentId:
|
|
2690
|
-
modelName:
|
|
2850
|
+
agentId: usageAgent.id,
|
|
2851
|
+
modelName: usageAgent.defaultModel,
|
|
2691
2852
|
jobId,
|
|
2692
2853
|
taskId: task.task.id,
|
|
2693
2854
|
commandRunId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkOnTasksService.d.ts","sourceRoot":"","sources":["../../../src/services/execution/WorkOnTasksService.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAgD,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAuB,MAAM,WAAW,CAAC;AAEvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAiB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC1G,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAsFrE,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D,SAAS,EAAE,mBAAmB,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;CACjD;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"WorkOnTasksService.d.ts","sourceRoot":"","sources":["../../../src/services/execution/WorkOnTasksService.ts"],"names":[],"mappings":"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"}
|