@zhixuan92/multi-model-agent-core 4.2.2 → 4.3.0

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.
Files changed (226) hide show
  1. package/README.md +1 -1
  2. package/dist/config/schema.d.ts +1 -0
  3. package/dist/config/schema.d.ts.map +1 -1
  4. package/dist/config/schema.js +4 -3
  5. package/dist/config/schema.js.map +1 -1
  6. package/dist/error-codes.d.ts +1 -0
  7. package/dist/error-codes.d.ts.map +1 -1
  8. package/dist/error-codes.js +2 -0
  9. package/dist/error-codes.js.map +1 -1
  10. package/dist/events/telemetry-types.d.ts +24 -20
  11. package/dist/events/telemetry-types.d.ts.map +1 -1
  12. package/dist/identity/auth-token-store.d.ts +36 -0
  13. package/dist/identity/auth-token-store.d.ts.map +1 -1
  14. package/dist/identity/auth-token-store.js +71 -2
  15. package/dist/identity/auth-token-store.js.map +1 -1
  16. package/dist/identity/cwd-validator.d.ts.map +1 -1
  17. package/dist/identity/cwd-validator.js +15 -3
  18. package/dist/identity/cwd-validator.js.map +1 -1
  19. package/dist/identity/main-model-resolver.d.ts +14 -0
  20. package/dist/identity/main-model-resolver.d.ts.map +1 -0
  21. package/dist/identity/main-model-resolver.js +83 -0
  22. package/dist/identity/main-model-resolver.js.map +1 -0
  23. package/dist/index.d.ts +3 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +4 -2
  26. package/dist/index.js.map +1 -1
  27. package/dist/intake/brief-compiler-slots/delegate.d.ts +10 -11
  28. package/dist/intake/brief-compiler-slots/delegate.d.ts.map +1 -1
  29. package/dist/intake/brief-compiler-slots/delegate.js +12 -14
  30. package/dist/intake/brief-compiler-slots/delegate.js.map +1 -1
  31. package/dist/intake/brief-compiler-slots/execute-plan.js +3 -1
  32. package/dist/intake/brief-compiler-slots/execute-plan.js.map +1 -1
  33. package/dist/intake/context-overflow-estimator.d.ts +33 -0
  34. package/dist/intake/context-overflow-estimator.d.ts.map +1 -0
  35. package/dist/intake/context-overflow-estimator.js +36 -0
  36. package/dist/intake/context-overflow-estimator.js.map +1 -0
  37. package/dist/intake/pipeline.d.ts.map +1 -1
  38. package/dist/intake/pipeline.js +46 -0
  39. package/dist/intake/pipeline.js.map +1 -1
  40. package/dist/intake/plan-extractor.d.ts.map +1 -1
  41. package/dist/intake/plan-extractor.js +10 -1
  42. package/dist/intake/plan-extractor.js.map +1 -1
  43. package/dist/intake/types.d.ts +1 -0
  44. package/dist/intake/types.d.ts.map +1 -1
  45. package/dist/lifecycle/diff-tracker.d.ts +17 -1
  46. package/dist/lifecycle/diff-tracker.d.ts.map +1 -1
  47. package/dist/lifecycle/diff-tracker.js +115 -2
  48. package/dist/lifecycle/diff-tracker.js.map +1 -1
  49. package/dist/lifecycle/handlers/annotate-completion-handler.d.ts +9 -0
  50. package/dist/lifecycle/handlers/annotate-completion-handler.d.ts.map +1 -0
  51. package/dist/lifecycle/handlers/annotate-completion-handler.js +171 -0
  52. package/dist/lifecycle/handlers/annotate-completion-handler.js.map +1 -0
  53. package/dist/lifecycle/handlers/annotate-criteria-handler.d.ts +3 -0
  54. package/dist/lifecycle/handlers/annotate-criteria-handler.d.ts.map +1 -0
  55. package/dist/lifecycle/handlers/annotate-criteria-handler.js +67 -0
  56. package/dist/lifecycle/handlers/annotate-criteria-handler.js.map +1 -0
  57. package/dist/lifecycle/handlers/baseline-handlers.d.ts.map +1 -1
  58. package/dist/lifecycle/handlers/baseline-handlers.js +106 -71
  59. package/dist/lifecycle/handlers/baseline-handlers.js.map +1 -1
  60. package/dist/lifecycle/handlers/review-handler.d.ts +3 -0
  61. package/dist/lifecycle/handlers/review-handler.d.ts.map +1 -0
  62. package/dist/lifecycle/handlers/review-handler.js +141 -0
  63. package/dist/lifecycle/handlers/review-handler.js.map +1 -0
  64. package/dist/lifecycle/handlers/rework-handler.d.ts +3 -0
  65. package/dist/lifecycle/handlers/rework-handler.d.ts.map +1 -0
  66. package/dist/lifecycle/handlers/rework-handler.js +77 -0
  67. package/dist/lifecycle/handlers/rework-handler.js.map +1 -0
  68. package/dist/lifecycle/handlers/terminal-handlers.d.ts.map +1 -1
  69. package/dist/lifecycle/handlers/terminal-handlers.js +16 -3
  70. package/dist/lifecycle/handlers/terminal-handlers.js.map +1 -1
  71. package/dist/lifecycle/lifecycle-context.d.ts +4 -0
  72. package/dist/lifecycle/lifecycle-context.d.ts.map +1 -1
  73. package/dist/lifecycle/lifecycle-driver.d.ts.map +1 -1
  74. package/dist/lifecycle/lifecycle-driver.js +12 -7
  75. package/dist/lifecycle/lifecycle-driver.js.map +1 -1
  76. package/dist/lifecycle/parallel-criteria-routes.d.ts +1 -1
  77. package/dist/lifecycle/parallel-criteria-routes.d.ts.map +1 -1
  78. package/dist/lifecycle/parallel-criteria-routes.js +21 -1
  79. package/dist/lifecycle/parallel-criteria-routes.js.map +1 -1
  80. package/dist/lifecycle/shared-compute.d.ts +9 -0
  81. package/dist/lifecycle/shared-compute.d.ts.map +1 -1
  82. package/dist/lifecycle/shared-compute.js +35 -3
  83. package/dist/lifecycle/shared-compute.js.map +1 -1
  84. package/dist/lifecycle/stage-plan-builder.d.ts.map +1 -1
  85. package/dist/lifecycle/stage-plan-builder.js +65 -85
  86. package/dist/lifecycle/stage-plan-builder.js.map +1 -1
  87. package/dist/lifecycle/stage-plan-types.d.ts +48 -0
  88. package/dist/lifecycle/stage-plan-types.d.ts.map +1 -1
  89. package/dist/lifecycle/stage-progression.d.ts.map +1 -1
  90. package/dist/lifecycle/stage-progression.js +17 -24
  91. package/dist/lifecycle/stage-progression.js.map +1 -1
  92. package/dist/lifecycle/task-runner.d.ts.map +1 -1
  93. package/dist/lifecycle/task-runner.js +12 -1
  94. package/dist/lifecycle/task-runner.js.map +1 -1
  95. package/dist/model-profiles.json +192 -53
  96. package/dist/providers/anthropic-messages-adapter.d.ts +8 -0
  97. package/dist/providers/anthropic-messages-adapter.d.ts.map +1 -1
  98. package/dist/providers/anthropic-messages-adapter.js +16 -1
  99. package/dist/providers/anthropic-messages-adapter.js.map +1 -1
  100. package/dist/providers/file-tracker.d.ts +12 -0
  101. package/dist/providers/file-tracker.d.ts.map +1 -1
  102. package/dist/providers/file-tracker.js +16 -0
  103. package/dist/providers/file-tracker.js.map +1 -1
  104. package/dist/providers/provider-factory.d.ts.map +1 -1
  105. package/dist/providers/provider-factory.js +27 -2
  106. package/dist/providers/provider-factory.js.map +1 -1
  107. package/dist/providers/runner-shell-types.d.ts +14 -0
  108. package/dist/providers/runner-shell-types.d.ts.map +1 -1
  109. package/dist/providers/runner-shell.d.ts.map +1 -1
  110. package/dist/providers/runner-shell.js +38 -6
  111. package/dist/providers/runner-shell.js.map +1 -1
  112. package/dist/providers/tool-implementations.d.ts +12 -0
  113. package/dist/providers/tool-implementations.d.ts.map +1 -1
  114. package/dist/providers/tool-implementations.js +33 -0
  115. package/dist/providers/tool-implementations.js.map +1 -1
  116. package/dist/reporting/annotate-completion-parser.d.ts +39 -0
  117. package/dist/reporting/annotate-completion-parser.d.ts.map +1 -0
  118. package/dist/reporting/annotate-completion-parser.js +43 -0
  119. package/dist/reporting/annotate-completion-parser.js.map +1 -0
  120. package/dist/reporting/compose-running-headline.d.ts +15 -1
  121. package/dist/reporting/compose-running-headline.d.ts.map +1 -1
  122. package/dist/reporting/compose-running-headline.js +76 -1
  123. package/dist/reporting/compose-running-headline.js.map +1 -1
  124. package/dist/reporting/report-parser-slots/research-report.d.ts +1 -1
  125. package/dist/review/default-engines.d.ts.map +1 -1
  126. package/dist/review/default-engines.js +8 -4
  127. package/dist/review/default-engines.js.map +1 -1
  128. package/dist/review/parse-review-report.d.ts +6 -0
  129. package/dist/review/parse-review-report.d.ts.map +1 -0
  130. package/dist/review/parse-review-report.js +40 -0
  131. package/dist/review/parse-review-report.js.map +1 -0
  132. package/dist/review/reviewer-engine.d.ts +12 -3
  133. package/dist/review/reviewer-engine.d.ts.map +1 -1
  134. package/dist/review/reviewer-engine.js +4 -3
  135. package/dist/review/reviewer-engine.js.map +1 -1
  136. package/dist/review/templates/annotate-completion.d.ts +12 -0
  137. package/dist/review/templates/annotate-completion.d.ts.map +1 -0
  138. package/dist/review/templates/annotate-completion.js +72 -0
  139. package/dist/review/templates/annotate-completion.js.map +1 -0
  140. package/dist/review/templates/quality-review.d.ts +3 -0
  141. package/dist/review/templates/quality-review.d.ts.map +1 -0
  142. package/dist/review/templates/quality-review.js +40 -0
  143. package/dist/review/templates/quality-review.js.map +1 -0
  144. package/dist/review/templates/rework.d.ts +3 -0
  145. package/dist/review/templates/rework.d.ts.map +1 -0
  146. package/dist/review/templates/rework.js +42 -0
  147. package/dist/review/templates/rework.js.map +1 -0
  148. package/dist/review/templates/shared.d.ts +32 -0
  149. package/dist/review/templates/shared.d.ts.map +1 -1
  150. package/dist/review/templates/spec-review.d.ts +1 -16
  151. package/dist/review/templates/spec-review.d.ts.map +1 -1
  152. package/dist/review/templates/spec-review.js +23 -31
  153. package/dist/review/templates/spec-review.js.map +1 -1
  154. package/dist/stores/context-block-project-cap.d.ts +14 -0
  155. package/dist/stores/context-block-project-cap.d.ts.map +1 -0
  156. package/dist/stores/context-block-project-cap.js +68 -0
  157. package/dist/stores/context-block-project-cap.js.map +1 -0
  158. package/dist/stores/context-block-tool.d.ts +2 -0
  159. package/dist/stores/context-block-tool.d.ts.map +1 -1
  160. package/dist/stores/context-block-tool.js +3 -2
  161. package/dist/stores/context-block-tool.js.map +1 -1
  162. package/dist/stores/file-backed-context-block-store.d.ts +8 -1
  163. package/dist/stores/file-backed-context-block-store.d.ts.map +1 -1
  164. package/dist/stores/file-backed-context-block-store.js +116 -4
  165. package/dist/stores/file-backed-context-block-store.js.map +1 -1
  166. package/dist/tools/audit/plan-audit-criteria.d.ts +35 -0
  167. package/dist/tools/audit/plan-audit-criteria.d.ts.map +1 -0
  168. package/dist/tools/audit/plan-audit-criteria.js +136 -0
  169. package/dist/tools/audit/plan-audit-criteria.js.map +1 -0
  170. package/dist/tools/audit/plan-audit-verdict.d.ts +15 -0
  171. package/dist/tools/audit/plan-audit-verdict.d.ts.map +1 -0
  172. package/dist/tools/audit/plan-audit-verdict.js +44 -0
  173. package/dist/tools/audit/plan-audit-verdict.js.map +1 -0
  174. package/dist/tools/audit/schema.d.ts +1 -0
  175. package/dist/tools/audit/schema.d.ts.map +1 -1
  176. package/dist/tools/audit/schema.js +6 -3
  177. package/dist/tools/audit/schema.js.map +1 -1
  178. package/dist/tools/audit/tool-config.d.ts +3 -0
  179. package/dist/tools/audit/tool-config.d.ts.map +1 -1
  180. package/dist/tools/audit/tool-config.js +8 -0
  181. package/dist/tools/audit/tool-config.js.map +1 -1
  182. package/dist/tools/delegate/implementer-criteria.d.ts +31 -47
  183. package/dist/tools/delegate/implementer-criteria.d.ts.map +1 -1
  184. package/dist/tools/delegate/implementer-criteria.js +60 -88
  185. package/dist/tools/delegate/implementer-criteria.js.map +1 -1
  186. package/dist/tools/delegate/tool-config.js +4 -4
  187. package/dist/tools/delegate/tool-config.js.map +1 -1
  188. package/dist/tools/execute-plan/implementer-criteria.d.ts +42 -37
  189. package/dist/tools/execute-plan/implementer-criteria.d.ts.map +1 -1
  190. package/dist/tools/execute-plan/implementer-criteria.js +79 -79
  191. package/dist/tools/execute-plan/implementer-criteria.js.map +1 -1
  192. package/dist/tools/execute-plan/tool-config.d.ts.map +1 -1
  193. package/dist/tools/execute-plan/tool-config.js +23 -13
  194. package/dist/tools/execute-plan/tool-config.js.map +1 -1
  195. package/dist/types/enums.d.ts +2 -2
  196. package/dist/types/run-result.d.ts +58 -0
  197. package/dist/types/run-result.d.ts.map +1 -1
  198. package/dist/types/task-spec.d.ts +14 -0
  199. package/dist/types/task-spec.d.ts.map +1 -1
  200. package/dist/types.d.ts +10 -0
  201. package/dist/types.d.ts.map +1 -1
  202. package/package.json +5 -1
  203. package/dist/lifecycle/handlers/quality-chain-handlers.d.ts +0 -22
  204. package/dist/lifecycle/handlers/quality-chain-handlers.d.ts.map +0 -1
  205. package/dist/lifecycle/handlers/quality-chain-handlers.js +0 -369
  206. package/dist/lifecycle/handlers/quality-chain-handlers.js.map +0 -1
  207. package/dist/lifecycle/handlers/review-diff-handler.d.ts +0 -31
  208. package/dist/lifecycle/handlers/review-diff-handler.d.ts.map +0 -1
  209. package/dist/lifecycle/handlers/review-diff-handler.js +0 -168
  210. package/dist/lifecycle/handlers/review-diff-handler.js.map +0 -1
  211. package/dist/lifecycle/handlers/run-verify-command-handler.d.ts +0 -25
  212. package/dist/lifecycle/handlers/run-verify-command-handler.d.ts.map +0 -1
  213. package/dist/lifecycle/handlers/run-verify-command-handler.js +0 -84
  214. package/dist/lifecycle/handlers/run-verify-command-handler.js.map +0 -1
  215. package/dist/lifecycle/handlers/spec-chain-handlers.d.ts +0 -21
  216. package/dist/lifecycle/handlers/spec-chain-handlers.d.ts.map +0 -1
  217. package/dist/lifecycle/handlers/spec-chain-handlers.js +0 -287
  218. package/dist/lifecycle/handlers/spec-chain-handlers.js.map +0 -1
  219. package/dist/review/templates/diff-review.d.ts +0 -11
  220. package/dist/review/templates/diff-review.d.ts.map +0 -1
  221. package/dist/review/templates/diff-review.js +0 -39
  222. package/dist/review/templates/diff-review.js.map +0 -1
  223. package/dist/review/templates/quality-review-artifact.d.ts +0 -16
  224. package/dist/review/templates/quality-review-artifact.d.ts.map +0 -1
  225. package/dist/review/templates/quality-review-artifact.js +0 -46
  226. package/dist/review/templates/quality-review-artifact.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhixuan92/multi-model-agent-core",
3
- "version": "4.2.2",
3
+ "version": "4.3.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Core library for multi-model-agent: provider runners (Claude, Codex, OpenAI-compatible), routing logic, config schema, and tool/sandbox primitives.",
@@ -323,6 +323,10 @@
323
323
  "./tool-surface/openapi-generator": {
324
324
  "types": "./dist/tool-surface/openapi-generator.d.ts",
325
325
  "import": "./dist/tool-surface/openapi-generator.js"
326
+ },
327
+ "./stores/context-block-project-cap": {
328
+ "types": "./dist/stores/context-block-project-cap.d.ts",
329
+ "import": "./dist/stores/context-block-project-cap.js"
326
330
  }
327
331
  },
328
332
  "scripts": {
@@ -1,22 +0,0 @@
1
- import type { LifecycleState } from '../stage-plan-types.js';
2
- export declare const qualityReviewRound1Handler: (state: LifecycleState) => Promise<void>;
3
- export declare const qualityReviewRound2Handler: (state: LifecycleState) => Promise<void>;
4
- export declare const qualityReviewRound3Handler: (state: LifecycleState) => Promise<void>;
5
- export declare const qualityReworkRound1Handler: (state: LifecycleState) => Promise<void>;
6
- export declare const qualityReworkRound2Handler: (state: LifecycleState) => Promise<void>;
7
- /**
8
- * Settle handler. Reads the three round verdicts and writes
9
- * state.qualityChainPassed.
10
- *
11
- * Cascade rule:
12
- * - 'approved' or 'annotated' in any round ⇒ chain passed (true)
13
- * - 'skipped' (e.g., no files written) treated as passed (true) — the
14
- * no-block path when there's nothing to review
15
- * - 'changes_required' through round 3 ⇒ chain failed (false)
16
- * - 'error' in any round ⇒ chain failed (false), state.terminal = true
17
- *
18
- * Runs runOnTerminal so the chain-pass slot is authoritative even on
19
- * hard-fail paths. Idempotent on state.qualityChainPassed.
20
- */
21
- export declare function settleQualityChainHandler(state: LifecycleState): void;
22
- //# sourceMappingURL=quality-chain-handlers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"quality-chain-handlers.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/handlers/quality-chain-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AA4W7D,eAAO,MAAM,0BAA0B,UApJkB,cAAc,KAAG,OAAO,CAAC,IAAI,CAoJjB,CAAC;AACtE,eAAO,MAAM,0BAA0B,UArJkB,cAAc,KAAG,OAAO,CAAC,IAAI,CAqJjB,CAAC;AACtE,eAAO,MAAM,0BAA0B,UAtJkB,cAAc,KAAG,OAAO,CAAC,IAAI,CAsJjB,CAAC;AACtE,eAAO,MAAM,0BAA0B,UAhDa,cAAc,KAAG,OAAO,CAAC,IAAI,CAgDZ,CAAC;AACtE,eAAO,MAAM,0BAA0B,UAjDa,cAAc,KAAG,OAAO,CAAC,IAAI,CAiDZ,CAAC;AAEtE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAyCrE"}
@@ -1,369 +0,0 @@
1
- import { pickReviewer, pickEscalation } from '../../escalation/policy.js';
2
- import { ReviewerParseError } from '../../review/reviewer-engine.js';
3
- import { delegateWithEscalation } from '../../escalation/delegate-with-escalation.js';
4
- import { runWithFallback, TRANSPORT_FAILURES, isReviewTransportFailure, makeSyntheticRunResult, } from '../../escalation/fallback.js';
5
- import { makeSkippedReviewResult } from '../../review/skipped-result.js';
6
- import { makeRunnerShell } from '../../providers/make-runner-shell.js';
7
- import { mergeStageStats, replaceLastRunResultPreservingTrackers } from '../merge-stage-stats.js';
8
- async function runQualityReviewRound(input) {
9
- const { state, ctx, round } = input;
10
- const last = state.lastRunResult;
11
- if (!last)
12
- return null;
13
- const implReport = last.implementationReport ?? last.structuredReport;
14
- if (!implReport)
15
- return null;
16
- const baseTier = ctx.assignedTier;
17
- const reviewerTier = pickReviewer({ loop: 'quality', attemptIndex: round - 1, baseTier });
18
- const task = state.task;
19
- if (!task)
20
- return null;
21
- const route = (state.route ?? ctx.route);
22
- const isArtifactProducing = state.toolCategory === 'artifact_producing';
23
- const fileContents = {};
24
- const toolCallLog = last.toolCalls ?? [];
25
- const filesWritten = last.filesWritten ?? [];
26
- state.qualityUnavailable ??= new Map();
27
- const qualityUnavailable = state.qualityUnavailable;
28
- // Tool sweep #6: cumulative diff for quality review (artifact-producing
29
- // routes). Same plumbing as spec-chain — reviewer needs to see the
30
- // actual code change to make precise findings. Read-only routes don't
31
- // have a diffTracker, so this is empty for them (and harmless).
32
- let cumulativeDiff = '';
33
- if (state.diffTracker) {
34
- try {
35
- cumulativeDiff = await state.diffTracker.cumulativeDiff();
36
- }
37
- catch {
38
- // Diff failures shouldn't block review.
39
- }
40
- }
41
- const priorConcerns = Array.isArray(state.priorQualityConcerns) ? state.priorQualityConcerns : [];
42
- const reviewerCall = await runWithFallback({
43
- assigned: reviewerTier,
44
- providerFor: (tier) => ctx.providers[tier],
45
- unavailableTiers: qualityUnavailable,
46
- isTransportFailure: (r) => isReviewTransportFailure(r),
47
- getStatus: (r) => r.status,
48
- makeSyntheticFailure: () => makeSkippedReviewResult('all_tiers_unavailable'),
49
- call: async (provider, usedTier) => {
50
- const shell = makeRunnerShell(provider);
51
- if (isArtifactProducing) {
52
- const engine = ctx.reviewerEngine;
53
- if (!engine)
54
- throw new Error('reviewerEngine not configured');
55
- try {
56
- return engine.runQualityAP(shell, {
57
- workerOutput: last.output,
58
- brief: task.prompt ?? '',
59
- cwd: ctx.cwd,
60
- route,
61
- fileContents,
62
- toolCallLog,
63
- filesWritten,
64
- diff: cumulativeDiff,
65
- priorConcerns,
66
- abortSignal: ctx.stall.controller.signal,
67
- deadlineMs: ctx.timing.deadlineMs,
68
- ...(ctx.bus && { bus: ctx.bus }),
69
- ...(ctx.batchId !== undefined && { batchId: ctx.batchId }),
70
- ...(ctx.taskIndex !== undefined && { taskIndex: ctx.taskIndex }),
71
- tier: usedTier,
72
- stageLabel: 'Quality review',
73
- });
74
- }
75
- catch (err) {
76
- if (err instanceof ReviewerParseError) {
77
- return { verdict: 'error', concerns: [] };
78
- }
79
- throw err;
80
- }
81
- }
82
- const annotator = ctx.annotatorEngine;
83
- if (!annotator)
84
- throw new Error('annotatorEngine not configured');
85
- // Read-only routes go through dispatchParallelCriteria which writes
86
- // workerOutputs[] onto lastRunResult. When that field is present,
87
- // pass through verbatim. When absent (initial migration window or
88
- // any future caller that hasn't fanned out), wrap last.output as
89
- // a single-narrative input so the annotator path stays uniform.
90
- const fanoutOutputs = last.workerOutputs;
91
- const workerOutputs = Array.isArray(fanoutOutputs) && fanoutOutputs.length > 0
92
- ? fanoutOutputs.map(o => ({ criterion: `criterion ${o.criterionId} — ${o.criterionTitle}`, narrative: o.narrative }))
93
- : [{ criterion: 'all criteria', narrative: last.output }];
94
- return annotator.annotate(shell, {
95
- workerOutputs,
96
- brief: task.prompt ?? '',
97
- cwd: ctx.cwd,
98
- route: route,
99
- abortSignal: ctx.stall.controller.signal,
100
- deadlineMs: ctx.timing.deadlineMs,
101
- ...(ctx.bus && { bus: ctx.bus }),
102
- ...(ctx.batchId !== undefined && { batchId: ctx.batchId }),
103
- ...(ctx.taskIndex !== undefined && { taskIndex: ctx.taskIndex }),
104
- tier: usedTier,
105
- stageLabel: 'Annotating',
106
- });
107
- },
108
- });
109
- if (reviewerCall.bothUnavailable)
110
- return null;
111
- const out = reviewerCall.result;
112
- if ('status' in out && out.status === 'skipped')
113
- return null;
114
- return out;
115
- }
116
- async function runQualityRework(state, ctx, attemptIndex) {
117
- const task = state.task;
118
- if (!task)
119
- return null;
120
- const baseTier = ctx.assignedTier;
121
- const decision = pickEscalation({ loop: 'quality', attemptIndex, baseTier });
122
- state.qualityChainAttemptIndex = attemptIndex;
123
- state.qualityUnavailable ??= new Map();
124
- const qualityUnavailable = state.qualityUnavailable;
125
- const reworkPrompt = (task.prompt ?? '') + '\n\n[quality rework — address the prior reviewer feedback]';
126
- const reworkCall = await runWithFallback({
127
- assigned: decision.impl,
128
- providerFor: (tier) => ctx.providers[tier],
129
- unavailableTiers: qualityUnavailable,
130
- isTransportFailure: (r) => TRANSPORT_FAILURES.has(r.status) && r.incompleteReason === undefined,
131
- getStatus: (r) => r.status,
132
- makeSyntheticFailure: (assigned) => makeSyntheticRunResult(assigned, 'all_tiers_unavailable'),
133
- call: (provider, usedTier) => delegateWithEscalation({
134
- prompt: reworkPrompt,
135
- cwd: ctx.cwd,
136
- agentType: usedTier,
137
- briefQualityPolicy: 'off',
138
- timeoutMs: ctx.timing.timeoutMs,
139
- }, [provider], {
140
- explicitlyPinned: true,
141
- taskDeadlineMs: ctx.timing.deadlineMs,
142
- abortSignal: ctx.stall.controller.signal,
143
- assignedTier: usedTier,
144
- // Same fix as spec-chain rework — pass bus so runner events fire.
145
- ...(ctx.bus && { bus: ctx.bus }),
146
- ...(ctx.batchId !== undefined && { batchId: ctx.batchId }),
147
- ...(ctx.taskIndex !== undefined && { taskIndex: ctx.taskIndex }),
148
- stageLabel: `Quality rework round ${attemptIndex}`,
149
- }),
150
- });
151
- if (reworkCall.bothUnavailable)
152
- return null;
153
- const result = reworkCall.result;
154
- if (result.status !== 'ok')
155
- return null;
156
- return result;
157
- }
158
- function mapQualityVerdict(result) {
159
- if ('status' in result && result.status === 'skipped')
160
- return 'skipped';
161
- return result.verdict;
162
- }
163
- function makeQualityReviewHandler(round) {
164
- const slot = `qualityReviewRound${round}Verdict`;
165
- return async function qualityReviewRoundHandler(state) {
166
- if (state[slot])
167
- return;
168
- const ctx = state.executionContext;
169
- if (!ctx)
170
- return;
171
- const result = await runQualityReviewRound({ state, ctx, round });
172
- if (!result)
173
- return;
174
- state[slot] = mapQualityVerdict(result);
175
- // Tool sweep #6: accumulate concerns across rounds for reviewer
176
- // continuity. Same merge pattern as priorSpecConcerns.
177
- const concernsList = result.concerns;
178
- if (Array.isArray(concernsList) && concernsList.length > 0) {
179
- const prior = Array.isArray(state.priorQualityConcerns) ? state.priorQualityConcerns : [];
180
- const seen = new Set(prior);
181
- const merged = [...prior];
182
- for (const c of concernsList) {
183
- if (typeof c === 'string' && !seen.has(c)) {
184
- seen.add(c);
185
- merged.push(c);
186
- }
187
- }
188
- state.priorQualityConcerns = merged;
189
- }
190
- // Persist findings + concerns onto lastRunResult so:
191
- // - the wire event-builder's findingsBySeverity (reads rr.concerns)
192
- // populates findings_critical/high/medium/low DB columns instead
193
- // of zeros even on annotated audit/review/verify/debug/investigate runs;
194
- // - the terminal envelope's annotatedFindings field carries the
195
- // parsed findings the user can read (was empty before — the
196
- // consumer had to fall back to extraSections).
197
- persistReviewFindings(state, result);
198
- // Record per-round cost in quality_review stageStats. Annotator path
199
- // (read-only routes) and reviewer path both share the same stage slot;
200
- // the verdict differentiates ('annotated' vs 'approved'/'changes_required').
201
- const baseTier = ctx.assignedTier;
202
- const reviewerTier = (round - 1 < 2)
203
- ? (baseTier === 'standard' ? 'complex' : 'standard')
204
- : baseTier;
205
- const reviewerProvider = ctx.providers[reviewerTier];
206
- const cost = result.cost;
207
- mergeStageStats(state, 'quality_review', {
208
- inputTokens: cost?.inputTokens ?? 0,
209
- outputTokens: cost?.outputTokens ?? 0,
210
- turnCount: cost?.turnCount ?? 0,
211
- toolCallCount: cost?.toolCallCount ?? 0,
212
- costUSD: cost?.costUSD ?? null,
213
- durationMs: cost?.durationMs ?? null,
214
- }, {
215
- tier: reviewerTier,
216
- model: reviewerProvider?.config?.model ?? null,
217
- verdict: result.verdict,
218
- });
219
- };
220
- }
221
- /** Push the reviewer/annotator's findings into state.lastRunResult so the
222
- * wire telemetry's per-stage `findingsBySeverity` + the terminal envelope's
223
- * `annotatedFindings` see them. Without this:
224
- * - wire findings_critical/high/medium/low all stay 0 even when the
225
- * annotator returned a populated array;
226
- * - envelope.results[N].annotatedFindings is empty and consumers have
227
- * to mine extraSections to find the data.
228
- * Idempotent across rounds (each round appends; the wire dedupes by
229
- * per-stage filter so no double-counting). */
230
- function persistReviewFindings(state, result) {
231
- if ('status' in result && result.status === 'skipped')
232
- return;
233
- const last = state.lastRunResult;
234
- if (!last)
235
- return;
236
- // Annotator result: structured findings array.
237
- const annotatorFindings = result.annotatedFindings;
238
- if (Array.isArray(annotatorFindings) && annotatorFindings.length > 0) {
239
- const merged = [...(last.annotatedFindings ?? []), ...annotatorFindings];
240
- last.annotatedFindings = merged;
241
- const newConcerns = annotatorFindings.map(f => ({
242
- source: 'quality_review',
243
- severity: (f.severity ?? 'medium'),
244
- message: f.claim,
245
- }));
246
- last.concerns = [...(last.concerns ?? []), ...newConcerns];
247
- return;
248
- }
249
- // Reviewer result: free-text concerns array (no severity per item).
250
- // Default to 'medium' so the wire's findingsBySeverity bucketing isn't
251
- // skewed toward 'critical' by accident.
252
- const reviewerConcerns = result.concerns;
253
- if (Array.isArray(reviewerConcerns) && reviewerConcerns.length > 0) {
254
- const newConcerns = reviewerConcerns.map(text => ({
255
- source: 'quality_review',
256
- severity: 'medium',
257
- message: text,
258
- }));
259
- last.concerns = [...(last.concerns ?? []), ...newConcerns];
260
- }
261
- }
262
- function makeQualityReworkHandler(reworkIndex) {
263
- // rework_1 → attemptIndex 1 (quality index 0 has impl: null and would throw)
264
- // rework_2 → attemptIndex 2
265
- const attemptIndex = reworkIndex === 1 ? 1 : 2;
266
- return async function qualityReworkHandler(state) {
267
- const ctx = state.executionContext;
268
- if (!ctx)
269
- return;
270
- const newResult = await runQualityRework(state, ctx, attemptIndex);
271
- if (!newResult) {
272
- // The rework's implementer call did not return an ok RunResult.
273
- // Mark the chain failed so the next round's `!s.terminal` gate stops
274
- // the cascade and settle_quality_chain records the failure on the
275
- // wire envelope. See spec-chain-handlers for the same fix shape.
276
- state.qualityReworkFailed = true;
277
- state.terminal = true;
278
- if (ctx.verbose && typeof ctx.verboseStream === 'function') {
279
- ctx.verboseStream(`[mmagent verbose] event=quality_rework_failed ts=${new Date().toISOString()} batch_id=${ctx.batchId ?? ''} task_index=${ctx.taskIndex ?? 0} rework_index=${reworkIndex}\n`);
280
- }
281
- return;
282
- }
283
- // Tool sweep #6: same fix as spec-chain — union file-tracker arrays
284
- // across rework rounds so the envelope reflects ALL writes, not
285
- // just the most recent attempt's writes.
286
- replaceLastRunResultPreservingTrackers(state, newResult);
287
- // Record rework cost. Quality rework_2 (attemptIndex 2) escalates impl
288
- // from base tier to the other tier; rework_1 stays on base.
289
- const baseTier = ctx.assignedTier;
290
- const reworkTier = (attemptIndex === 2 && baseTier === 'standard') ? 'complex' : baseTier;
291
- const reworkProvider = ctx.providers[reworkTier];
292
- mergeStageStats(state, 'quality_rework', {
293
- inputTokens: newResult.usage?.inputTokens ?? 0,
294
- outputTokens: newResult.usage?.outputTokens ?? 0,
295
- cachedReadTokens: newResult.usage?.cachedReadTokens ?? 0,
296
- cachedNonReadTokens: newResult.usage?.cachedNonReadTokens ?? 0,
297
- turnCount: newResult.turns ?? 0,
298
- toolCallCount: Array.isArray(newResult.toolCalls) ? newResult.toolCalls.length : 0,
299
- costUSD: newResult.cost?.costUSD ?? null,
300
- durationMs: newResult.durationMs ?? null,
301
- filesReadCount: Array.isArray(newResult.filesRead) ? newResult.filesRead.length : 0,
302
- filesWrittenCount: Array.isArray(newResult.filesWritten) ? newResult.filesWritten.length : 0,
303
- }, {
304
- tier: reworkTier,
305
- model: reworkProvider?.config?.model ?? null,
306
- });
307
- };
308
- }
309
- export const qualityReviewRound1Handler = makeQualityReviewHandler(1);
310
- export const qualityReviewRound2Handler = makeQualityReviewHandler(2);
311
- export const qualityReviewRound3Handler = makeQualityReviewHandler(3);
312
- export const qualityReworkRound1Handler = makeQualityReworkHandler(1);
313
- export const qualityReworkRound2Handler = makeQualityReworkHandler(2);
314
- /**
315
- * Settle handler. Reads the three round verdicts and writes
316
- * state.qualityChainPassed.
317
- *
318
- * Cascade rule:
319
- * - 'approved' or 'annotated' in any round ⇒ chain passed (true)
320
- * - 'skipped' (e.g., no files written) treated as passed (true) — the
321
- * no-block path when there's nothing to review
322
- * - 'changes_required' through round 3 ⇒ chain failed (false)
323
- * - 'error' in any round ⇒ chain failed (false), state.terminal = true
324
- *
325
- * Runs runOnTerminal so the chain-pass slot is authoritative even on
326
- * hard-fail paths. Idempotent on state.qualityChainPassed.
327
- */
328
- export function settleQualityChainHandler(state) {
329
- if (typeof state.qualityChainPassed === 'boolean')
330
- return;
331
- const v1 = state.qualityReviewRound1Verdict;
332
- const v2 = state.qualityReviewRound2Verdict;
333
- const v3 = state.qualityReviewRound3Verdict;
334
- if (v1 === undefined && v2 === undefined && v3 === undefined)
335
- return;
336
- const passy = (v) => v === 'approved' || v === 'annotated' || v === 'skipped';
337
- if (passy(v1) || passy(v2) || passy(v3)) {
338
- state.qualityChainPassed = true;
339
- return;
340
- }
341
- if (v1 === 'error' || v2 === 'error' || v3 === 'error') {
342
- // 4.0.3+ soft-success path for read-only routes (audit / review /
343
- // verify / debug / investigate). These routes have NO rework loop —
344
- // the annotator is single-pass. When the annotator returns 'error'
345
- // (typically a parse failure on its own JSON block) BUT the
346
- // implementer produced a non-empty narrative output, the findings
347
- // are still recoverable from `lastRunResult.output` in the canonical
348
- // `## Finding N:` format. Treat that as chain-passed so the wire
349
- // envelope reports terminal_status='ok' / worker_status='done'
350
- // instead of leaking 'review_loop_capped' (artifact-producing-route
351
- // terminology). Round-1 verdict='error' stays in stage stats as a
352
- // soft telemetry signal. Headline composers + envelope builders
353
- // fall back to narrative parsing for the findings count.
354
- const last = state.lastRunResult;
355
- const isReadOnly = state.toolCategory === 'read_only';
356
- const implementerProducedOutput = typeof last?.output === 'string' && last.output.trim().length > 0;
357
- if (isReadOnly && implementerProducedOutput) {
358
- state.qualityChainPassed = true;
359
- return;
360
- }
361
- // Artifact-producing route, OR read-only with empty implementer
362
- // output: hard-fail (no findings to recover).
363
- state.qualityChainPassed = false;
364
- state.terminal = true;
365
- return;
366
- }
367
- state.qualityChainPassed = false;
368
- }
369
- //# sourceMappingURL=quality-chain-handlers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"quality-chain-handlers.js","sourceRoot":"","sources":["../../../src/lifecycle/handlers/quality-chain-handlers.ts"],"names":[],"mappings":"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"}
@@ -1,31 +0,0 @@
1
- import type { LifecycleState } from '../stage-plan-types.js';
2
- /**
3
- * StageHandler for row 4.13 (review_diff).
4
- *
5
- * Reads from state:
6
- * - state.task / state.executionContext for cwd, providers, timing
7
- * - state.verifyResult: VerifyStageResult required by reviewerEngine.runDiff
8
- * - state.diffReviewVerdict: idempotency guard
9
- *
10
- * Writes to state:
11
- * - state.diffReviewKind: raw verdict from reviewerEngine.runDiff
12
- * - state.diffReviewVerdict: envelope-mapped status
13
- * - state.terminal = true on 'changes_required' (reject) or 'error'
14
- *
15
- * Verdict mapping:
16
- * kind: 'approve' → envelope 'approved'
17
- * kind: 'concerns' → envelope 'approved' (concerns are flagged
18
- * but non-blocking by design)
19
- * kind: 'reject' → envelope 'changes_required'
20
- * kind: 'transport_failure' → envelope 'error'
21
- *
22
- * Both slots are written so downstream telemetry can distinguish 'approve'
23
- * from 'concerns' (both map to envelope 'approved').
24
- *
25
- * Defensive no-op when state.executionContext, state.verifyResult, or the
26
- * reviewer provider for the picked tier is missing. Diff is computed via
27
- * `git diff HEAD~..HEAD` against the cwd; if git fails, the handler
28
- * records an envelope 'error' and sets terminal.
29
- */
30
- export declare function reviewDiffHandler(state: LifecycleState): Promise<void>;
31
- //# sourceMappingURL=review-diff-handler.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-diff-handler.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/handlers/review-diff-handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAiB7D;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAkI5E"}
@@ -1,168 +0,0 @@
1
- import { execFile } from 'node:child_process';
2
- import { promisify } from 'node:util';
3
- import { pickReviewer } from '../../escalation/policy.js';
4
- import { runWithFallback, isReviewTransportFailure, } from '../../escalation/fallback.js';
5
- import { makeSkippedReviewResult } from '../../review/skipped-result.js';
6
- import { makeRunnerShell } from '../../providers/make-runner-shell.js';
7
- import { mergeStageStats } from '../merge-stage-stats.js';
8
- const exec = promisify(execFile);
9
- /**
10
- * StageHandler for row 4.13 (review_diff).
11
- *
12
- * Reads from state:
13
- * - state.task / state.executionContext for cwd, providers, timing
14
- * - state.verifyResult: VerifyStageResult required by reviewerEngine.runDiff
15
- * - state.diffReviewVerdict: idempotency guard
16
- *
17
- * Writes to state:
18
- * - state.diffReviewKind: raw verdict from reviewerEngine.runDiff
19
- * - state.diffReviewVerdict: envelope-mapped status
20
- * - state.terminal = true on 'changes_required' (reject) or 'error'
21
- *
22
- * Verdict mapping:
23
- * kind: 'approve' → envelope 'approved'
24
- * kind: 'concerns' → envelope 'approved' (concerns are flagged
25
- * but non-blocking by design)
26
- * kind: 'reject' → envelope 'changes_required'
27
- * kind: 'transport_failure' → envelope 'error'
28
- *
29
- * Both slots are written so downstream telemetry can distinguish 'approve'
30
- * from 'concerns' (both map to envelope 'approved').
31
- *
32
- * Defensive no-op when state.executionContext, state.verifyResult, or the
33
- * reviewer provider for the picked tier is missing. Diff is computed via
34
- * `git diff HEAD~..HEAD` against the cwd; if git fails, the handler
35
- * records an envelope 'error' and sets terminal.
36
- */
37
- export async function reviewDiffHandler(state) {
38
- if (state.diffReviewVerdict)
39
- return;
40
- const ctx = state.executionContext;
41
- if (!ctx)
42
- return;
43
- const verifyResult = state.verifyResult;
44
- if (!verifyResult)
45
- return;
46
- const baseTier = ctx.assignedTier;
47
- const reviewerTier = pickReviewer({ loop: 'spec', attemptIndex: 0, baseTier });
48
- // Tool sweep #6: prefer the snapshot-based DiffTracker (works in
49
- // non-git dirs, captures the cumulative across rework rounds against
50
- // the pre-task baseline). Fall back to `git diff HEAD~..HEAD` for
51
- // legacy callers (autoCommit pipelines that ran before the tracker
52
- // was wired in). If BOTH sources fail, hard-error: reviewing without
53
- // evidence would be the very bug this sweep is fixing.
54
- let diff = '';
55
- let trackerProvided = false;
56
- if (state.diffTracker) {
57
- try {
58
- diff = await state.diffTracker.cumulativeDiff();
59
- trackerProvided = true;
60
- }
61
- catch {
62
- // tracker error — fall through to git
63
- }
64
- }
65
- if (!trackerProvided) {
66
- try {
67
- const { stdout } = await exec('git', ['diff', 'HEAD~..HEAD'], { cwd: ctx.cwd });
68
- const cap = 64 * 1024;
69
- const bytes = Buffer.byteLength(stdout, 'utf8');
70
- diff = bytes > cap
71
- ? Buffer.from(stdout, 'utf8').subarray(0, cap).toString('utf8') + '\n[diff truncated]'
72
- : stdout;
73
- }
74
- catch {
75
- state.diffReviewVerdict = 'error';
76
- state.terminal = true;
77
- return;
78
- }
79
- }
80
- state.diffUnavailable ??= new Map();
81
- const diffUnavailable = state.diffUnavailable;
82
- const diffCall = await runWithFallback({
83
- assigned: reviewerTier,
84
- providerFor: (tier) => ctx.providers[tier],
85
- unavailableTiers: diffUnavailable,
86
- isTransportFailure: (r) => isReviewTransportFailure(r),
87
- getStatus: (r) => r.status,
88
- makeSyntheticFailure: () => makeSkippedReviewResult('all_tiers_unavailable'),
89
- call: async (provider, usedTier) => {
90
- const shell = makeRunnerShell(provider);
91
- const engine = ctx.reviewerEngine;
92
- if (!engine)
93
- throw new Error('reviewerEngine not configured');
94
- // Tool sweep #6: pass diff via the dedicated `diff` field so the
95
- // template's "# Cumulative diff" section gets actual diff content
96
- // instead of conflating it with the worker's text summary.
97
- // workerOutput stays as the verification summary so the diff
98
- // reviewer has both signals.
99
- const lastResult = state.lastRunResult;
100
- const verifySummary = `Verification: ${verifyResult.status}\n${verifyResult.steps.map(s => `- ${s.command} → ${s.status}`).join('\n')}`;
101
- return engine.runDiff(shell, {
102
- workerOutput: lastResult?.output ?? verifySummary,
103
- brief: `verification: ${verifyResult.status}\n${verifyResult.steps.map(s => `- ${s.command} → ${s.status}`).join('\n')}`,
104
- diff,
105
- cwd: ctx.cwd,
106
- abortSignal: ctx.stall.controller.signal,
107
- deadlineMs: ctx.timing.deadlineMs,
108
- ...(ctx.bus && { bus: ctx.bus }),
109
- ...(ctx.batchId !== undefined && { batchId: ctx.batchId }),
110
- ...(ctx.taskIndex !== undefined && { taskIndex: ctx.taskIndex }),
111
- tier: usedTier,
112
- stageLabel: 'Diff review',
113
- });
114
- },
115
- });
116
- if (diffCall.bothUnavailable) {
117
- state.diffReviewVerdict = 'skipped';
118
- return;
119
- }
120
- const verdictOrSkipped = diffCall.result;
121
- if ('status' in verdictOrSkipped && verdictOrSkipped.status === 'skipped') {
122
- state.diffReviewVerdict = 'skipped';
123
- return;
124
- }
125
- const result = verdictOrSkipped;
126
- state.diffReviewKind = result.verdict;
127
- if (result.verdict === 'approve' || result.verdict === 'concerns') {
128
- state.diffReviewVerdict = 'approved';
129
- }
130
- else if (result.verdict === 'reject') {
131
- state.diffReviewVerdict = 'changes_required';
132
- state.terminal = true;
133
- }
134
- else {
135
- state.diffReviewVerdict = 'error';
136
- state.terminal = true;
137
- }
138
- // Persist diff-reviewer concerns into lastRunResult.concerns so the
139
- // wire's findings_* DB columns reflect them on diff_review verdicts
140
- // other than 'approve'. Without this, findings counts stay 0 even when
141
- // the diff reviewer rejected with explicit concerns.
142
- if (Array.isArray(result.concerns) && result.concerns.length > 0) {
143
- const last = state.lastRunResult;
144
- if (last) {
145
- const newConcerns = result.concerns.map(text => ({
146
- source: 'diff_review',
147
- severity: 'medium',
148
- message: text,
149
- }));
150
- last.concerns = [...(last.concerns ?? []), ...newConcerns];
151
- }
152
- }
153
- // Record diff_review cost so wire telemetry sees it.
154
- const reviewerProvider = ctx.providers[reviewerTier];
155
- mergeStageStats(state, 'diff_review', {
156
- inputTokens: result.cost?.inputTokens ?? 0,
157
- outputTokens: result.cost?.outputTokens ?? 0,
158
- turnCount: result.cost?.turnCount ?? 0,
159
- toolCallCount: result.cost?.toolCallCount ?? 0,
160
- costUSD: result.cost?.costUSD ?? null,
161
- durationMs: result.cost?.durationMs ?? null,
162
- }, {
163
- tier: reviewerTier,
164
- model: reviewerProvider?.config?.model ?? null,
165
- verdict: state.diffReviewVerdict,
166
- });
167
- }
168
- //# sourceMappingURL=review-diff-handler.js.map