@zhixuan92/multi-model-agent-core 3.12.2 → 3.12.4
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/README.md +1 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +10 -2
- package/dist/provider.js.map +1 -1
- package/dist/run-tasks/reviewed-lifecycle.d.ts.map +1 -1
- package/dist/run-tasks/reviewed-lifecycle.js +33 -13
- package/dist/run-tasks/reviewed-lifecycle.js.map +1 -1
- package/dist/runners/claude-runner.d.ts.map +1 -1
- package/dist/runners/claude-runner.js +56 -8
- package/dist/runners/claude-runner.js.map +1 -1
- package/dist/runners/openai-runner.d.ts +8 -1
- package/dist/runners/openai-runner.d.ts.map +1 -1
- package/dist/runners/openai-runner.js +102 -67
- package/dist/runners/openai-runner.js.map +1 -1
- package/dist/runners/openai-usage-interceptor.d.ts +25 -0
- package/dist/runners/openai-usage-interceptor.d.ts.map +1 -0
- package/dist/runners/openai-usage-interceptor.js +121 -0
- package/dist/runners/openai-usage-interceptor.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -104,7 +104,7 @@ As of 3.4.0 every task-execution event the worker emits to the verbose stderr st
|
|
|
104
104
|
|
|
105
105
|
## What's new
|
|
106
106
|
|
|
107
|
-
Latest: **3.12.
|
|
107
|
+
Latest: **3.12.3** — Bug-fix patch closing the four real-world regressions surfaced by 3.12.2 telemetry. Reviewer cost + findings recovered for DeepSeek (and any openai-compatible non-OpenAI provider): runner stops forcing `Agent.outputType` on DeepSeek and treats structured-output parse failures as non-fatal everywhere, so `runAnnotationReview`'s text-parser fallback recovers findings from prose instead of dropping the whole call. `agents.implementer` now agrees with stage stats — both report `resolved.slot`; per-call fallback drift remains visible in `implementerHistory` + `fallbackOverrides`. Reviewer separation is **slot-based only**: `forbiddenIdentities` removed from spec/quality/diff reviewer fallback calls, so when the user puts the same model on different tiers the review still runs. `endReviewStage` clamps `totalIdleMs` to `durationMs` to prevent impossible idle ratios from the two-attempt review loop. All 2836 tests pass. Full history: [CHANGELOG](https://github.com/zhixuan312/multi-model-agent/blob/master/CHANGELOG.md).
|
|
108
108
|
|
|
109
109
|
## Full documentation
|
|
110
110
|
|
package/dist/provider.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAa,gBAAgB,EAAuD,MAAM,YAAY,CAAC;AAaxI,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAG7E;AAED,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,GAAG,IAAI,CAGxF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,QAAQ,
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAa,gBAAgB,EAAuD,MAAM,YAAY,CAAC;AAaxI,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAG7E;AAED,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,GAAG,IAAI,CAGxF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,QAAQ,CAoHlF"}
|
package/dist/provider.js
CHANGED
|
@@ -38,6 +38,7 @@ export function createProvider(slot, config) {
|
|
|
38
38
|
}
|
|
39
39
|
case 'openai-compatible': {
|
|
40
40
|
const { runOpenAI } = await import('./runners/openai-runner.js');
|
|
41
|
+
const { wrapClientForUsageCapture } = await import('./runners/openai-usage-interceptor.js');
|
|
41
42
|
const { default: OpenAI } = await import('openai');
|
|
42
43
|
const apiKey = agentConfig.apiKey
|
|
43
44
|
?? (agentConfig.apiKeyEnv ? process.env[agentConfig.apiKeyEnv] : undefined);
|
|
@@ -45,7 +46,12 @@ export function createProvider(slot, config) {
|
|
|
45
46
|
apiKey: apiKey || 'not-needed',
|
|
46
47
|
baseURL: agentConfig.baseUrl,
|
|
47
48
|
});
|
|
48
|
-
|
|
49
|
+
// 3.12.4: HTTP-level usage capture as a fallback for the
|
|
50
|
+
// @openai/agents SDK's stream-aggregation bug (DeepSeek and other
|
|
51
|
+
// openai-compatible providers can drop per-chunk usage on
|
|
52
|
+
// multi-turn streams). See openai-usage-interceptor.ts.
|
|
53
|
+
const usageAccumulator = wrapClientForUsageCapture(client);
|
|
54
|
+
const runnerOpts = { client, providerConfig, defaults, usageAccumulator };
|
|
49
55
|
return await runOpenAI(prompt, options, runnerOpts);
|
|
50
56
|
}
|
|
51
57
|
default: {
|
|
@@ -83,6 +89,7 @@ export function createProvider(slot, config) {
|
|
|
83
89
|
}
|
|
84
90
|
case 'openai-compatible': {
|
|
85
91
|
const { runOpenAIReview } = await import('./runners/openai-runner.js');
|
|
92
|
+
const { wrapClientForUsageCapture } = await import('./runners/openai-usage-interceptor.js');
|
|
86
93
|
const { default: OpenAI } = await import('openai');
|
|
87
94
|
const apiKey = agentConfig.apiKey
|
|
88
95
|
?? (agentConfig.apiKeyEnv ? process.env[agentConfig.apiKeyEnv] : undefined);
|
|
@@ -90,7 +97,8 @@ export function createProvider(slot, config) {
|
|
|
90
97
|
apiKey: apiKey || 'not-needed',
|
|
91
98
|
baseURL: agentConfig.baseUrl,
|
|
92
99
|
});
|
|
93
|
-
const
|
|
100
|
+
const usageAccumulator = wrapClientForUsageCapture(client);
|
|
101
|
+
const runnerOpts = { client, providerConfig, defaults, usageAccumulator };
|
|
94
102
|
return await runOpenAIReview(parts, options, runnerOpts);
|
|
95
103
|
}
|
|
96
104
|
default: {
|
package/dist/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAIA,IAAI,wBAAwB,GAAoB,IAAI,CAAC;AACrD,IAAI,2BAA2B,GAAiC,IAAI,CAAC;AAErE,SAAS,yBAAyB;IAChC,IAAI,OAAO,CAAC,GAAG,CAAC,8BAA8B,KAAK,GAAG,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;IACvG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,QAAyB;IACrE,yBAAyB,EAAE,CAAC;IAC5B,wBAAwB,GAAG,QAAQ,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,GAAiC;IAChF,yBAAyB,EAAE,CAAC;IAC5B,2BAA2B,GAAG,GAAG,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAe,EAAE,MAAwB;IACtE,IAAI,2BAA2B,EAAE,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,2BAA2B,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;IAC1F,IAAI,wBAAwB;QAAE,OAAO,wBAAwB,CAAC;IAC9D,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,+CAA+C,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,cAAc,GAAG,WAAwC,CAAC;IAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEjC,MAAM,GAAG,GAAG,KAAK,EAAE,MAAc,EAAE,UAAsB,EAAE,EAAsB,EAAE;QACjF,IAAI,CAAC;YACH,QAAQ,WAAW,CAAC,IAAI,EAAE,CAAC;gBACzB,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;oBAC/D,OAAO,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;gBACnE,CAAC;gBAED,KAAK,QAAQ,CAAC;gBACd,KAAK,mBAAmB,CAAC,CAAC,CAAC;oBACzB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;oBACjE,OAAO,MAAM,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;gBACpE,CAAC;gBAED,KAAK,mBAAmB,CAAC,CAAC,CAAC;oBACzB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;oBACjE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACnD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM;2BAC5B,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;oBAC9E,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;wBACxB,MAAM,EAAE,MAAM,IAAI,YAAY;wBAC9B,OAAO,EAAE,WAAW,CAAC,OAAO;qBAC7B,CAAC,CAAC;oBACH,MAAM,UAAU,GAAwB,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAIA,IAAI,wBAAwB,GAAoB,IAAI,CAAC;AACrD,IAAI,2BAA2B,GAAiC,IAAI,CAAC;AAErE,SAAS,yBAAyB;IAChC,IAAI,OAAO,CAAC,GAAG,CAAC,8BAA8B,KAAK,GAAG,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;IACvG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,QAAyB;IACrE,yBAAyB,EAAE,CAAC;IAC5B,wBAAwB,GAAG,QAAQ,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,GAAiC;IAChF,yBAAyB,EAAE,CAAC;IAC5B,2BAA2B,GAAG,GAAG,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAe,EAAE,MAAwB;IACtE,IAAI,2BAA2B,EAAE,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,2BAA2B,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;IAC1F,IAAI,wBAAwB;QAAE,OAAO,wBAAwB,CAAC;IAC9D,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,+CAA+C,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,cAAc,GAAG,WAAwC,CAAC;IAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEjC,MAAM,GAAG,GAAG,KAAK,EAAE,MAAc,EAAE,UAAsB,EAAE,EAAsB,EAAE;QACjF,IAAI,CAAC;YACH,QAAQ,WAAW,CAAC,IAAI,EAAE,CAAC;gBACzB,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;oBAC/D,OAAO,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;gBACnE,CAAC;gBAED,KAAK,QAAQ,CAAC;gBACd,KAAK,mBAAmB,CAAC,CAAC,CAAC;oBACzB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;oBACjE,OAAO,MAAM,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;gBACpE,CAAC;gBAED,KAAK,mBAAmB,CAAC,CAAC,CAAC;oBACzB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;oBACjE,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,MAAM,CAAC,uCAAuC,CAAC,CAAC;oBAC5F,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACnD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM;2BAC5B,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;oBAC9E,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;wBACxB,MAAM,EAAE,MAAM,IAAI,YAAY;wBAC9B,OAAO,EAAE,WAAW,CAAC,OAAO;qBAC7B,CAAC,CAAC;oBACH,yDAAyD;oBACzD,kEAAkE;oBAClE,0DAA0D;oBAC1D,wDAAwD;oBACxD,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;oBAC3D,MAAM,UAAU,GAAwB,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;oBAC/F,OAAO,MAAM,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;gBACtD,CAAC;gBAED,OAAO,CAAC,CAAC,CAAC;oBACR,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,MAAM,EAAE,oBAAoB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;gBAC9E,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE;gBAChJ,KAAK,EAAE,CAAC;gBACR,SAAS,EAAE,EAAE;gBACb,YAAY,EAAE,EAAE;gBAChB,SAAS,EAAE,EAAE;gBACb,kBAAkB,EAAE,IAAI;gBACxB,aAAa,EAAE,EAAE;gBACjB,cAAc,EAAE,IAAI;gBACpB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,EAAE,KAAwB,EAAE,UAA4B,EAAE,EAAsB,EAAE;QACvG,IAAI,CAAC;YACH,QAAQ,WAAW,CAAC,IAAI,EAAE,CAAC;gBACzB,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;oBACrE,OAAO,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;gBACxE,CAAC;gBAED,KAAK,QAAQ,CAAC;gBACd,KAAK,mBAAmB,CAAC,CAAC,CAAC;oBACzB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;oBACvE,OAAO,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;gBACzE,CAAC;gBAED,KAAK,mBAAmB,CAAC,CAAC,CAAC;oBACzB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;oBACvE,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,MAAM,CAAC,uCAAuC,CAAC,CAAC;oBAC5F,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACnD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM;2BAC5B,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;oBAC9E,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;wBACxB,MAAM,EAAE,MAAM,IAAI,YAAY;wBAC9B,OAAO,EAAE,WAAW,CAAC,OAAO;qBAC7B,CAAC,CAAC;oBACH,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;oBAC3D,MAAM,UAAU,GAAwB,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;oBAC/F,OAAO,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;gBAC3D,CAAC;gBAED,OAAO,CAAC,CAAC,CAAC;oBACR,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,MAAM,EAAE,oBAAoB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;gBAC9E,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE;gBAChJ,KAAK,EAAE,CAAC;gBACR,SAAS,EAAE,EAAE;gBACb,YAAY,EAAE,EAAE;gBAChB,SAAS,EAAE,EAAE;gBACb,kBAAkB,EAAE,IAAI;gBACxB,aAAa,EAAE,EAAE;gBACjB,cAAc,EAAE,IAAI;gBACpB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;AAChE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reviewed-lifecycle.d.ts","sourceRoot":"","sources":["../../src/run-tasks/reviewed-lifecycle.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,gBAAgB,EAChB,SAAS,EAGT,aAAa,EACb,aAAa,EACb,aAAa,EACb,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAsCrB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAqB3D,wBAAgB,UAAU,IAAI,aAAa,CAW1C;AAMD,wBAAgB,YAAY,CAC1B,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,cAAc,GAAG,aAAa,GAAG,gBAAgB,GAAG,YAAY,EACtE,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GAAG,IAAI,EACjB,KAAK,EAAE;IAAE,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EACtD,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,EAC/E,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5N,IAAI,CAyBN;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,aAAa,GAAG,gBAAgB,GAAG,aAAa,EACtD,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GAAG,IAAI,EACjB,KAAK,EAAE;IAAE,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EACtD,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,EAC/E,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,MAAM,EAMlB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACjP,IAAI,
|
|
1
|
+
{"version":3,"file":"reviewed-lifecycle.d.ts","sourceRoot":"","sources":["../../src/run-tasks/reviewed-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -79,10 +79,22 @@ export function endReviewStage(stats, name, t0, c0, agent, finalCostUSD, idle, v
|
|
|
79
79
|
// wall time and passes the sum, instead of `Date.now() - t0` which would
|
|
80
80
|
// span the entire review block including subsequent stages.
|
|
81
81
|
metrics) {
|
|
82
|
+
const durationMs = metrics?.durationMs !== undefined ? metrics.durationMs : Date.now() - t0;
|
|
83
|
+
// Idle-tracker leak guard: stageIdle is reset at every transitionStage(),
|
|
84
|
+
// but runAnnotationReview makes 2 sequential delegateWithEscalation calls
|
|
85
|
+
// (attempt1 + attempt2), and tail events from cross-runner async cleanup
|
|
86
|
+
// can land after the stage's wall-clock end, producing totalIdleMs values
|
|
87
|
+
// that exceed durationMs (3.12.2 saw 110-145% idle ratios). Clamping here
|
|
88
|
+
// prevents impossible values from reaching the dashboard while preserving
|
|
89
|
+
// the legitimate per-stage signal in the common case.
|
|
90
|
+
const rawTotalIdle = idle?.totalIdleMs ?? 0;
|
|
91
|
+
const rawMaxIdle = idle?.maxIdleMs ?? 0;
|
|
92
|
+
const clampedTotalIdle = Math.min(rawTotalIdle, Math.max(0, durationMs));
|
|
93
|
+
const clampedMaxIdle = Math.min(rawMaxIdle, Math.max(0, durationMs));
|
|
82
94
|
stats[name] = {
|
|
83
95
|
stage: name,
|
|
84
96
|
entered: true,
|
|
85
|
-
durationMs
|
|
97
|
+
durationMs,
|
|
86
98
|
// Item 7: != null (covers both undefined AND null) — null means
|
|
87
99
|
// "pricing unavailable, fall through to runningCostUSD computation"
|
|
88
100
|
// rather than masking unknown as the literal 0.
|
|
@@ -91,8 +103,8 @@ metrics) {
|
|
|
91
103
|
agentTier: agent.tier,
|
|
92
104
|
modelFamily: modelFamily(agent.model),
|
|
93
105
|
model: agent.model,
|
|
94
|
-
maxIdleMs:
|
|
95
|
-
totalIdleMs:
|
|
106
|
+
maxIdleMs: clampedMaxIdle,
|
|
107
|
+
totalIdleMs: clampedTotalIdle,
|
|
96
108
|
activityEvents: idle?.activityEvents ?? 0,
|
|
97
109
|
inputTokens: metrics?.inputTokens ?? null,
|
|
98
110
|
outputTokens: metrics?.outputTokens ?? null,
|
|
@@ -205,9 +217,13 @@ export async function executeReviewedLifecycle(task, resolved, config, taskIndex
|
|
|
205
217
|
function providerFor(tier) {
|
|
206
218
|
return providers[tier];
|
|
207
219
|
}
|
|
208
|
-
// Compute the implementer's canonical identity for
|
|
209
|
-
//
|
|
210
|
-
//
|
|
220
|
+
// Compute the implementer's canonical identity. Retained for diagnostics
|
|
221
|
+
// and emitFallback events; NOT used to gate reviewer separation. Separation
|
|
222
|
+
// is enforced by `forbiddenTiers: [resolved.slot]` instead — what matters is
|
|
223
|
+
// that the reviewer runs in a different agent_type slot, not that it uses
|
|
224
|
+
// a different model. If the user configures both slots with the same model
|
|
225
|
+
// (or even the same backend), the review still proceeds because the slot
|
|
226
|
+
// assignment is intentional.
|
|
211
227
|
const implementerIdentity = (() => {
|
|
212
228
|
try {
|
|
213
229
|
return canonicalIdentity(resolved.provider.config);
|
|
@@ -760,8 +776,14 @@ export async function executeReviewedLifecycle(task, resolved, config, taskIndex
|
|
|
760
776
|
const agentConfig = config.agents[resolved.slot];
|
|
761
777
|
const implementerCapabilities = (agentConfig.capabilities ?? findModelCapabilities(agentConfig.model) ?? []);
|
|
762
778
|
const agentEnvelope = (specReviewer, qualityReviewer) => {
|
|
763
|
-
|
|
764
|
-
|
|
779
|
+
// Identity = the slot the executor *resolved to* before any per-call
|
|
780
|
+
// fallback flips. This must match `stats.implementing.agentTier`
|
|
781
|
+
// (which uses `resolved.slot` directly at line ~697). Per-call slot
|
|
782
|
+
// drift is recorded in `fallbackOverrides` and `implementerHistory`,
|
|
783
|
+
// not by mutating implementer identity. Pre-3.12.3 used
|
|
784
|
+
// latestAttemptedImpl.tier here, which silently disagreed with
|
|
785
|
+
// stage stats whenever runWithFallback flipped tiers.
|
|
786
|
+
const implementer = resolved.slot;
|
|
765
787
|
return {
|
|
766
788
|
implementer,
|
|
767
789
|
...(implementerHistory.length > 1 || implementerHistory.some(t => t !== implementer) ? { implementerHistory } : {}),
|
|
@@ -1344,7 +1366,6 @@ export async function executeReviewedLifecycle(task, resolved, config, taskIndex
|
|
|
1344
1366
|
isTransportFailure: (r) => isReviewTransportFailure(r),
|
|
1345
1367
|
getStatus: (r) => r.status,
|
|
1346
1368
|
makeSyntheticFailure: () => makeSkippedReviewResult('all_tiers_unavailable'),
|
|
1347
|
-
forbiddenIdentities: implementerIdentity ? [implementerIdentity] : undefined,
|
|
1348
1369
|
forbiddenTiers: [resolved.slot],
|
|
1349
1370
|
call: (provider) => runAccounted(provider, () => runDiffReview({ cwd, diff: evidence.fullDiff, diffTruncated: evidence.diffTruncated, verification, worker: { call: (prompt, opts) => provider.run(prompt, { cwd: opts?.cwd ?? cwd, abortSignal: opts?.abortSignal, timeoutMs: opts?.timeoutMs }) }, taskDeadlineMs, abortSignal: stallController.signal })),
|
|
1350
1371
|
});
|
|
@@ -1416,7 +1437,6 @@ export async function executeReviewedLifecycle(task, resolved, config, taskIndex
|
|
|
1416
1437
|
isTransportFailure: (r) => isReviewTransportFailure(r),
|
|
1417
1438
|
getStatus: (r) => r.status,
|
|
1418
1439
|
makeSyntheticFailure: () => makeSkippedReviewResult('all_tiers_unavailable'),
|
|
1419
|
-
forbiddenIdentities: implementerIdentity ? [implementerIdentity] : undefined,
|
|
1420
1440
|
forbiddenTiers: [resolved.slot],
|
|
1421
1441
|
call: (provider) => runAccounted(provider, () => runSpecReview(provider, packet, effectiveImplReport, fileContents, implResult.toolCalls, task.planContext, evidence.block, taskDeadlineMs, stallController.signal, wrappedOnProgress, cwd)),
|
|
1422
1442
|
});
|
|
@@ -1494,7 +1514,7 @@ export async function executeReviewedLifecycle(task, resolved, config, taskIndex
|
|
|
1494
1514
|
commitReworkStage(stats, 'spec_rework', specReworkAcc, implementerAgentInfo);
|
|
1495
1515
|
transitionStage('spec_rework', 'spec_review', { stage: 'spec_review', stageIndex: 2, reviewRound: specAttemptIndex + 1, attemptCap: maxSpecRows }, null);
|
|
1496
1516
|
const reReviewIterStart = Date.now();
|
|
1497
|
-
const reviewCall = await runWithFallback({ assigned: decision.reviewer, providerFor, unavailableTiers: specUnavailable, isTransportFailure: (r) => isReviewTransportFailure(r), getStatus: (r) => r.status, makeSyntheticFailure: () => makeSkippedReviewResult('all_tiers_unavailable'),
|
|
1517
|
+
const reviewCall = await runWithFallback({ assigned: decision.reviewer, providerFor, unavailableTiers: specUnavailable, isTransportFailure: (r) => isReviewTransportFailure(r), getStatus: (r) => r.status, makeSyntheticFailure: () => makeSkippedReviewResult('all_tiers_unavailable'), forbiddenTiers: [resolved.slot], call: (provider) => runAccounted(provider, () => runSpecReview(provider, packet, finalImplReport, fileContents, finalImplResult.toolCalls, task.planContext, evidence.block, taskDeadlineMs, stallController.signal, wrappedOnProgress, cwd)) });
|
|
1498
1518
|
specReviewDurationMs += Date.now() - reReviewIterStart;
|
|
1499
1519
|
if (reviewCall.bothUnavailable) {
|
|
1500
1520
|
emitFallbackUnavailable({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'spec', attempt: specAttemptIndex, role: 'specReviewer', assignedTier: decision.reviewer, reason: reviewCall.unavailableReason });
|
|
@@ -1546,7 +1566,7 @@ export async function executeReviewedLifecycle(task, resolved, config, taskIndex
|
|
|
1546
1566
|
qualityReviewT0 = Date.now();
|
|
1547
1567
|
qualityReviewC0 = runningCostUSD();
|
|
1548
1568
|
const initialQualityIterStart = Date.now();
|
|
1549
|
-
const initialQuality = await runWithFallback({ assigned: qualityReviewerTier, providerFor, unavailableTiers: qualityUnavailable, isTransportFailure: (r) => isReviewTransportFailure(r), getStatus: (r) => r.status, makeSyntheticFailure: () => makeSkippedReviewResult('all_tiers_unavailable'),
|
|
1569
|
+
const initialQuality = await runWithFallback({ assigned: qualityReviewerTier, providerFor, unavailableTiers: qualityUnavailable, isTransportFailure: (r) => isReviewTransportFailure(r), getStatus: (r) => r.status, makeSyntheticFailure: () => makeSkippedReviewResult('all_tiers_unavailable'), forbiddenTiers: [resolved.slot], call: (provider) => runAccounted(provider, () => runQualityReview(provider, packet, specReport ?? finalImplReport, fileContents, finalImplResult.toolCalls, finalImplResult.filesWritten, evidence.block, qualityReviewPromptBuilder, finalImplResult.output, taskDeadlineMs, stallController.signal, wrappedOnProgress, cwd)) });
|
|
1550
1570
|
qualityReviewDurationMs += Date.now() - initialQualityIterStart;
|
|
1551
1571
|
if (initialQuality.bothUnavailable) {
|
|
1552
1572
|
emitFallbackUnavailable({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'quality', attempt: 0, role: 'qualityReviewer', assignedTier: qualityReviewerTier, reason: initialQuality.unavailableReason });
|
|
@@ -1659,7 +1679,7 @@ export async function executeReviewedLifecycle(task, resolved, config, taskIndex
|
|
|
1659
1679
|
commitReworkStage(stats, 'quality_rework', qualityReworkAcc, implementerAgentInfo);
|
|
1660
1680
|
transitionStage('quality_rework', 'quality_review', { stage: 'quality_review', stageIndex: 4, reviewRound: qualityAttemptIndex + 1, attemptCap: maxQualityRows }, null);
|
|
1661
1681
|
const qReReviewIterStart = Date.now();
|
|
1662
|
-
const reviewCall = await runWithFallback({ assigned: decision.reviewer, providerFor, unavailableTiers: qualityUnavailable, isTransportFailure: (r) => isReviewTransportFailure(r), getStatus: (r) => r.status, makeSyntheticFailure: () => makeSkippedReviewResult('all_tiers_unavailable'),
|
|
1682
|
+
const reviewCall = await runWithFallback({ assigned: decision.reviewer, providerFor, unavailableTiers: qualityUnavailable, isTransportFailure: (r) => isReviewTransportFailure(r), getStatus: (r) => r.status, makeSyntheticFailure: () => makeSkippedReviewResult('all_tiers_unavailable'), forbiddenTiers: [resolved.slot], call: (provider) => runAccounted(provider, () => runQualityReview(provider, packet, finalImplReport, fileContents, finalImplResult.toolCalls, finalImplResult.filesWritten, evidence.block, qualityReviewPromptBuilder, finalImplResult.output, taskDeadlineMs, stallController.signal, wrappedOnProgress, cwd)) });
|
|
1663
1683
|
qualityReviewDurationMs += Date.now() - qReReviewIterStart;
|
|
1664
1684
|
if (reviewCall.bothUnavailable) {
|
|
1665
1685
|
emitFallbackUnavailable({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'quality', attempt: qualityAttemptIndex, role: 'qualityReviewer', assignedTier: decision.reviewer, reason: reviewCall.unavailableReason });
|