@zhixuan92/multi-model-agent-core 0.4.0 → 1.1.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 (128) hide show
  1. package/README.md +33 -93
  2. package/dist/config/load.js +9 -9
  3. package/dist/config/load.js.map +1 -1
  4. package/dist/config/schema.d.ts +169 -275
  5. package/dist/config/schema.d.ts.map +1 -1
  6. package/dist/config/schema.js +31 -40
  7. package/dist/config/schema.js.map +1 -1
  8. package/dist/cost/cost-meter.d.ts +13 -0
  9. package/dist/cost/cost-meter.d.ts.map +1 -0
  10. package/dist/cost/cost-meter.js +20 -0
  11. package/dist/cost/cost-meter.js.map +1 -0
  12. package/dist/delegate-with-escalation.d.ts +1 -28
  13. package/dist/delegate-with-escalation.d.ts.map +1 -1
  14. package/dist/delegate-with-escalation.js +9 -89
  15. package/dist/delegate-with-escalation.js.map +1 -1
  16. package/dist/error-codes.d.ts +4 -0
  17. package/dist/error-codes.d.ts.map +1 -0
  18. package/dist/error-codes.js +16 -0
  19. package/dist/error-codes.js.map +1 -0
  20. package/dist/index.d.ts +5 -5
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +4 -5
  23. package/dist/index.js.map +1 -1
  24. package/dist/model-profiles.json +10 -5
  25. package/dist/provider.d.ts +2 -2
  26. package/dist/provider.d.ts.map +1 -1
  27. package/dist/provider.js +10 -13
  28. package/dist/provider.js.map +1 -1
  29. package/dist/readiness/normalization-budget.d.ts +2 -0
  30. package/dist/readiness/normalization-budget.d.ts.map +1 -0
  31. package/dist/readiness/normalization-budget.js +9 -0
  32. package/dist/readiness/normalization-budget.js.map +1 -0
  33. package/dist/readiness/normalize-brief.d.ts +17 -0
  34. package/dist/readiness/normalize-brief.d.ts.map +1 -0
  35. package/dist/readiness/normalize-brief.js +124 -0
  36. package/dist/readiness/normalize-brief.js.map +1 -0
  37. package/dist/readiness/readiness.d.ts +16 -0
  38. package/dist/readiness/readiness.d.ts.map +1 -0
  39. package/dist/readiness/readiness.js +160 -0
  40. package/dist/readiness/readiness.js.map +1 -0
  41. package/dist/reporting/structured-report.d.ts +18 -0
  42. package/dist/reporting/structured-report.d.ts.map +1 -0
  43. package/dist/reporting/structured-report.js +100 -0
  44. package/dist/reporting/structured-report.js.map +1 -0
  45. package/dist/review/aggregate-result.d.ts +3 -0
  46. package/dist/review/aggregate-result.d.ts.map +1 -0
  47. package/dist/review/aggregate-result.js +31 -0
  48. package/dist/review/aggregate-result.js.map +1 -0
  49. package/dist/review/quality-reviewer.d.ts +13 -0
  50. package/dist/review/quality-reviewer.d.ts.map +1 -0
  51. package/dist/review/quality-reviewer.js +39 -0
  52. package/dist/review/quality-reviewer.js.map +1 -0
  53. package/dist/review/reviewer-prompt.d.ts +10 -0
  54. package/dist/review/reviewer-prompt.d.ts.map +1 -0
  55. package/dist/review/reviewer-prompt.js +58 -0
  56. package/dist/review/reviewer-prompt.js.map +1 -0
  57. package/dist/review/spec-reviewer.d.ts +13 -0
  58. package/dist/review/spec-reviewer.d.ts.map +1 -0
  59. package/dist/review/spec-reviewer.js +37 -0
  60. package/dist/review/spec-reviewer.js.map +1 -0
  61. package/dist/routing/model-profiles.d.ts +5 -0
  62. package/dist/routing/model-profiles.d.ts.map +1 -1
  63. package/dist/routing/model-profiles.js +5 -0
  64. package/dist/routing/model-profiles.js.map +1 -1
  65. package/dist/routing/resolve-agent.d.ts +8 -0
  66. package/dist/routing/resolve-agent.d.ts.map +1 -0
  67. package/dist/routing/resolve-agent.js +45 -0
  68. package/dist/routing/resolve-agent.js.map +1 -0
  69. package/dist/run-tasks.d.ts +0 -23
  70. package/dist/run-tasks.d.ts.map +1 -1
  71. package/dist/run-tasks.js +241 -72
  72. package/dist/run-tasks.js.map +1 -1
  73. package/dist/runners/claude-runner.d.ts +2 -2
  74. package/dist/runners/claude-runner.d.ts.map +1 -1
  75. package/dist/runners/claude-runner.js +76 -28
  76. package/dist/runners/claude-runner.js.map +1 -1
  77. package/dist/runners/codex-runner.d.ts +2 -2
  78. package/dist/runners/codex-runner.d.ts.map +1 -1
  79. package/dist/runners/codex-runner.js +77 -24
  80. package/dist/runners/codex-runner.js.map +1 -1
  81. package/dist/runners/openai-runner.d.ts +2 -2
  82. package/dist/runners/openai-runner.d.ts.map +1 -1
  83. package/dist/runners/openai-runner.js +141 -22
  84. package/dist/runners/openai-runner.js.map +1 -1
  85. package/dist/runners/prevention.d.ts +2 -0
  86. package/dist/runners/prevention.d.ts.map +1 -1
  87. package/dist/runners/prevention.js +12 -0
  88. package/dist/runners/prevention.js.map +1 -1
  89. package/dist/runners/supervision.d.ts +1 -5
  90. package/dist/runners/supervision.d.ts.map +1 -1
  91. package/dist/runners/supervision.js +0 -68
  92. package/dist/runners/supervision.js.map +1 -1
  93. package/dist/tools/call-cache.d.ts +16 -0
  94. package/dist/tools/call-cache.d.ts.map +1 -0
  95. package/dist/tools/call-cache.js +28 -0
  96. package/dist/tools/call-cache.js.map +1 -0
  97. package/dist/tools/claude-adapter.d.ts +2 -2
  98. package/dist/tools/claude-adapter.d.ts.map +1 -1
  99. package/dist/tools/claude-adapter.js +12 -5
  100. package/dist/tools/claude-adapter.js.map +1 -1
  101. package/dist/tools/definitions.d.ts +4 -0
  102. package/dist/tools/definitions.d.ts.map +1 -1
  103. package/dist/tools/definitions.js +4 -0
  104. package/dist/tools/definitions.js.map +1 -1
  105. package/dist/tools/openai-adapter.d.ts +4 -4
  106. package/dist/tools/openai-adapter.d.ts.map +1 -1
  107. package/dist/tools/openai-adapter.js +9 -2
  108. package/dist/tools/openai-adapter.js.map +1 -1
  109. package/dist/types.d.ts +79 -31
  110. package/dist/types.d.ts.map +1 -1
  111. package/dist/types.js.map +1 -1
  112. package/package.json +48 -16
  113. package/dist/routing/capabilities.d.ts +0 -3
  114. package/dist/routing/capabilities.d.ts.map +0 -1
  115. package/dist/routing/capabilities.js +0 -26
  116. package/dist/routing/capabilities.js.map +0 -1
  117. package/dist/routing/get-provider-eligibility.d.ts +0 -8
  118. package/dist/routing/get-provider-eligibility.d.ts.map +0 -1
  119. package/dist/routing/get-provider-eligibility.js +0 -53
  120. package/dist/routing/get-provider-eligibility.js.map +0 -1
  121. package/dist/routing/resolve-task-capabilities.d.ts +0 -7
  122. package/dist/routing/resolve-task-capabilities.d.ts.map +0 -1
  123. package/dist/routing/resolve-task-capabilities.js +0 -19
  124. package/dist/routing/resolve-task-capabilities.js.map +0 -1
  125. package/dist/routing/select-provider-for-task.d.ts +0 -18
  126. package/dist/routing/select-provider-for-task.d.ts.map +0 -1
  127. package/dist/routing/select-provider-for-task.js +0 -50
  128. package/dist/routing/select-provider-for-task.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function computeNormalizationBudget(maxCostUSD: number | undefined): number;
2
+ //# sourceMappingURL=normalization-budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalization-budget.d.ts","sourceRoot":"","sources":["../../src/readiness/normalization-budget.ts"],"names":[],"mappings":"AAAA,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAKjF"}
@@ -0,0 +1,9 @@
1
+ export function computeNormalizationBudget(maxCostUSD) {
2
+ const FLAT_CEIL = 0.01;
3
+ if (maxCostUSD === undefined)
4
+ return FLAT_CEIL;
5
+ if (maxCostUSD <= 0)
6
+ return 0;
7
+ return Math.min(FLAT_CEIL, 0.2 * maxCostUSD);
8
+ }
9
+ //# sourceMappingURL=normalization-budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalization-budget.js","sourceRoot":"","sources":["../../src/readiness/normalization-budget.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,0BAA0B,CAAC,UAA8B;IACvE,MAAM,SAAS,GAAG,IAAI,CAAC;IACvB,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC/C,IAAI,UAAU,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,GAAG,UAAU,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { TaskSpec, MultiModelConfig } from '../types.js';
2
+ export interface NormalizationDecision {
3
+ original: string;
4
+ resolved: string;
5
+ reason: string;
6
+ }
7
+ export interface NormalizationResult {
8
+ normalizedPrompt: string;
9
+ decisions: NormalizationDecision[];
10
+ writeSet: string[];
11
+ verificationPlan: string[];
12
+ unresolved: string[];
13
+ spentCostUSD: number;
14
+ skipped: boolean;
15
+ }
16
+ export declare function normalizeBrief(task: TaskSpec, config: MultiModelConfig): Promise<NormalizationResult>;
17
+ //# sourceMappingURL=normalize-brief.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-brief.d.ts","sourceRoot":"","sources":["../../src/readiness/normalize-brief.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAK9D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,qBAAqB,EAAE,CAAC;IACnC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB;AA4BD,wBAAsB,cAAc,CAClC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,mBAAmB,CAAC,CA2C9B"}
@@ -0,0 +1,124 @@
1
+ import { createProvider } from '../provider.js';
2
+ import { delegateWithEscalation } from '../delegate-with-escalation.js';
3
+ import { computeNormalizationBudget } from './normalization-budget.js';
4
+ const NORMALIZER_PROMPT = `You are a brief normalizer. Given a task brief, analyze it for vagueness and provide concrete normalization.
5
+
6
+ Brief to normalize:
7
+ {prompt}
8
+
9
+ Respond with a structured normalization using these sections:
10
+
11
+ ## Summary
12
+ One sentence summary of what needs to be done.
13
+
14
+ ## Normalization decisions
15
+ - "original phrase" → "concrete interpretation"
16
+ List each vague element and its concrete resolution.
17
+
18
+ ## Files to change
19
+ List the specific files that need modification.
20
+
21
+ ## Verification plan
22
+ How to verify the task is done correctly.
23
+
24
+ ## Unresolved
25
+ Any elements that still need clarification.
26
+
27
+ ## Done condition
28
+ The specific criterion for marking this task complete.`;
29
+ export async function normalizeBrief(task, config) {
30
+ const budget = computeNormalizationBudget(task.maxCostUSD);
31
+ const normalizerTask = {
32
+ prompt: NORMALIZER_PROMPT.replace('{prompt}', task.prompt),
33
+ agentType: 'standard',
34
+ briefQualityPolicy: 'off',
35
+ maxCostUSD: budget,
36
+ tools: 'none',
37
+ };
38
+ try {
39
+ const provider = createProvider('standard', config);
40
+ const result = await delegateWithEscalation(normalizerTask, [provider], { explicitlyPinned: true });
41
+ if (result.status !== 'ok') {
42
+ return {
43
+ normalizedPrompt: task.prompt,
44
+ decisions: [],
45
+ writeSet: [],
46
+ verificationPlan: [],
47
+ unresolved: ['Normalization failed: ' + (result.error || result.status)],
48
+ spentCostUSD: result.usage.costUSD ?? 0,
49
+ skipped: true,
50
+ };
51
+ }
52
+ return parseNormalizationReport(result.output, task.prompt, result.usage.costUSD ?? 0);
53
+ }
54
+ catch (err) {
55
+ return {
56
+ normalizedPrompt: task.prompt,
57
+ decisions: [],
58
+ writeSet: [],
59
+ verificationPlan: [],
60
+ unresolved: [err instanceof Error ? err.message : String(err)],
61
+ spentCostUSD: 0,
62
+ skipped: true,
63
+ };
64
+ }
65
+ }
66
+ function parseNormalizationReport(output, originalPrompt, costUSD) {
67
+ const decisions = [];
68
+ const writeSet = [];
69
+ const verificationPlan = [];
70
+ const unresolved = [];
71
+ const decisionMatch = output.match(/## Normalization decisions\n([\s\S]*?)(?=\n##|\n##|$)/i);
72
+ if (decisionMatch) {
73
+ const lines = decisionMatch[1].split('\n').filter(l => l.trim().startsWith('-'));
74
+ for (const line of lines) {
75
+ const match = line.match(/- "([^"]+)" → "?([^"\n]+)"?/);
76
+ if (match) {
77
+ decisions.push({ original: match[1], resolved: match[2], reason: 'normalized' });
78
+ }
79
+ }
80
+ }
81
+ const filesMatch = output.match(/## Files to change\n([\s\S]*?)(?=\n##|\n##|$)/i);
82
+ if (filesMatch) {
83
+ const lines = filesMatch[1].split('\n').filter(l => l.trim() && !l.trim().startsWith('#'));
84
+ for (const line of lines) {
85
+ const file = line.replace(/^[-*]\s*/, '').trim();
86
+ if (file && !file.startsWith('#')) {
87
+ writeSet.push(file);
88
+ }
89
+ }
90
+ }
91
+ const verifyMatch = output.match(/## Verification plan\n([\s\S]*?)(?=\n##|\n##|$)/i);
92
+ if (verifyMatch) {
93
+ const lines = verifyMatch[1].split('\n').filter(l => l.trim() && !l.trim().startsWith('#'));
94
+ for (const line of lines) {
95
+ const item = line.replace(/^[-*]\s*/, '').trim();
96
+ if (item && !item.startsWith('#')) {
97
+ verificationPlan.push(item);
98
+ }
99
+ }
100
+ }
101
+ const unresolvedMatch = output.match(/## Unresolved\n([\s\S]*?)(?=\n##|\n##|$)/i);
102
+ if (unresolvedMatch) {
103
+ const lines = unresolvedMatch[1].split('\n').filter(l => l.trim() && !l.trim().startsWith('#'));
104
+ for (const line of lines) {
105
+ const item = line.replace(/^[-*]\s*/, '').trim();
106
+ if (item && !item.startsWith('#')) {
107
+ unresolved.push(item);
108
+ }
109
+ }
110
+ }
111
+ const normalizedPrompt = decisions.length > 0
112
+ ? decisions.reduce((prompt, d) => prompt.replace(d.original, d.resolved), originalPrompt)
113
+ : originalPrompt;
114
+ return {
115
+ normalizedPrompt,
116
+ decisions,
117
+ writeSet,
118
+ verificationPlan,
119
+ unresolved,
120
+ spentCostUSD: costUSD,
121
+ skipped: false,
122
+ };
123
+ }
124
+ //# sourceMappingURL=normalize-brief.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-brief.js","sourceRoot":"","sources":["../../src/readiness/normalize-brief.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ReadinessResult, BriefQualityPolicy } from '../types.js';
2
+ export declare function hasScopePillar(prompt: string): boolean;
3
+ export declare function hasInputsPillar(prompt: string): boolean;
4
+ export declare function hasDoneConditionPillar(prompt: string): boolean;
5
+ export declare function hasOutputContractPillar(prompt: string, disableStructuredReport?: boolean): boolean;
6
+ export declare function detectOutsourcedDiscovery(prompt: string): boolean;
7
+ export declare function detectBrittleLineAnchors(prompt: string): boolean;
8
+ export declare function detectMixedEnvironmentActions(prompt: string): boolean;
9
+ export declare function detectConcretePath(prompt: string): boolean;
10
+ export declare function detectNamedCodeArtifact(prompt: string): boolean;
11
+ export declare function detectReasonableLength(prompt: string): boolean;
12
+ export declare function evaluateReadiness(task: {
13
+ prompt: string;
14
+ briefQualityPolicy?: BriefQualityPolicy;
15
+ }, mode?: BriefQualityPolicy): ReadinessResult;
16
+ //# sourceMappingURL=readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../src/readiness/readiness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiC,eAAe,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtG,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAgBtD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAUvD;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAe9D;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,uBAAuB,CAAC,EAAE,OAAO,GAAG,OAAO,CAMlG;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGjE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAMhE;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAIrE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;CAAE,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,eAAe,CA6C/I"}
@@ -0,0 +1,160 @@
1
+ export function hasScopePillar(prompt) {
2
+ if (!prompt.trim())
3
+ return false;
4
+ // File path with extension
5
+ if (/\/[\w.-]+\.\w+/.test(prompt))
6
+ return true;
7
+ // Directory path (packages/, src/, etc.)
8
+ if (/\b(packages|src|tests|docs|scripts|layout)\/[\w/.-]/.test(prompt))
9
+ return true;
10
+ // Glob pattern
11
+ if (/\*\*\/\*\.?\w+/.test(prompt))
12
+ return true;
13
+ // Backtick-wrapped module/identifier
14
+ if (/`[\w-]+`/.test(prompt))
15
+ return true;
16
+ // Out-of-bounds clause
17
+ if (/do not modify|don't modify|no changes? to|exclude|except/.test(prompt))
18
+ return true;
19
+ // Bare topic noun (too vague)
20
+ if (/^(fix|update|change|refactor|improve|add|remove)\s+\w+\s+(stuff|things?|items?|files?|code|logic)\.?$/i.test(prompt))
21
+ return false;
22
+ if (/^(fix|update|change)\s+\w+\.?$/.test(prompt))
23
+ return false;
24
+ return prompt.length > 20 && /[.\s]/.test(prompt);
25
+ }
26
+ export function hasInputsPillar(prompt) {
27
+ // File reference
28
+ if (/\b[\w-]+\.(ts|js|tsx|jsx|json|md|yml|yaml|toml|ini|cfg|conf)\b/.test(prompt))
29
+ return true;
30
+ // Fenced code block
31
+ if (/```[\s\S]*?```/.test(prompt))
32
+ return true;
33
+ // "follow/match/based on X" pattern
34
+ if (/follow (the )?pattern (in|from|of)|match (the )?pattern|based on [\w.-]+/.test(prompt))
35
+ return true;
36
+ // Backtick identifier
37
+ if (/`[\w/.-]+`/.test(prompt))
38
+ return true;
39
+ return false;
40
+ }
41
+ export function hasDoneConditionPillar(prompt) {
42
+ const lc = prompt.toLowerCase();
43
+ // Explicit done-when phrases
44
+ if (/done when|success criteria:|complete when|finished when/.test(lc))
45
+ return true;
46
+ // Test pass phrase
47
+ if (/tsc passes?|tests? (all )?pass|eslint|fmt|lint|build(ing)? (succeeds?|passes?)/.test(lc))
48
+ return true;
49
+ // Test file reference
50
+ if (/tests?\/[\w/.-]+\.test\.(ts|js)/.test(prompt))
51
+ return true;
52
+ // expectedCoverage reference
53
+ if (/expectedcoverage|requiredmarkers/.test(lc))
54
+ return true;
55
+ // HTTP status codes as done condition
56
+ if (/status code (200|201|204|4\d{2}|5\d{2})/.test(prompt))
57
+ return true;
58
+ // Behavior checklist
59
+ if (/should (be|have|do)|verify |confirm |check(ing)? /.test(lc))
60
+ return true;
61
+ return false;
62
+ }
63
+ export function hasOutputContractPillar(prompt, disableStructuredReport) {
64
+ if (!disableStructuredReport)
65
+ return true;
66
+ // Has explicit format instructions
67
+ if (/return (json|yaml|xml|csv|object|array)|output (should be|as|format)|format( ted)? (as|with)/i.test(prompt))
68
+ return true;
69
+ if (/expectedcoverage|requiredmarkers/.test(prompt.toLowerCase()))
70
+ return true;
71
+ return false;
72
+ }
73
+ export function detectOutsourcedDiscovery(prompt) {
74
+ const lc = prompt.toLowerCase();
75
+ return /find (out |the )?(right|correct)|figure out|verify the exact|determine (the |which )|look up|check (the )?(right|correct) (file|import|path|function)|follow the same (pattern|logic)|based on the same/.test(lc);
76
+ }
77
+ export function detectBrittleLineAnchors(prompt) {
78
+ // Has "lines X-Y" or "lines X–Y" without a semantic anchor nearby
79
+ if (!/lines?\s+\d+[\s–-]+\d+/i.test(prompt))
80
+ return false;
81
+ // Check if there's a backtick identifier near the line range (semantic anchor)
82
+ if (/\`[\w`]+\`\s*\(?\s*lines?\s*\d+/i.test(prompt))
83
+ return false;
84
+ return true;
85
+ }
86
+ export function detectMixedEnvironmentActions(prompt) {
87
+ const lc = prompt.toLowerCase();
88
+ return /&&?\s*(git\s+(commit|push|pull|merge|rebase)|npm\s+(publish|version)|docker\s+(build|run|push)|deploy|release)/.test(lc) ||
89
+ /(commit|push|pull|merge)\s+(and|&|then)\s+(commit|push|build)/.test(lc);
90
+ }
91
+ export function detectConcretePath(prompt) {
92
+ return /\/[\w.-]+\.\w+/.test(prompt);
93
+ }
94
+ export function detectNamedCodeArtifact(prompt) {
95
+ return /`[\w`]+\`/.test(prompt);
96
+ }
97
+ export function detectReasonableLength(prompt) {
98
+ return prompt.length >= 50 && prompt.length <= 500;
99
+ }
100
+ export function evaluateReadiness(task, mode) {
101
+ const policy = mode ?? task.briefQualityPolicy ?? 'normalize';
102
+ if (policy === 'off') {
103
+ return { action: 'ignored', missingPillars: [], layer2Warnings: [], layer3Hints: [], briefQualityWarnings: [] };
104
+ }
105
+ const missingPillars = [];
106
+ if (!hasScopePillar(task.prompt))
107
+ missingPillars.push('scope');
108
+ if (!hasInputsPillar(task.prompt))
109
+ missingPillars.push('inputs');
110
+ if (!hasDoneConditionPillar(task.prompt))
111
+ missingPillars.push('done_condition');
112
+ if (!hasOutputContractPillar(task.prompt, false))
113
+ missingPillars.push('output_contract');
114
+ const layer2Warnings = [];
115
+ if (detectOutsourcedDiscovery(task.prompt))
116
+ layer2Warnings.push('outsourced_discovery');
117
+ if (detectBrittleLineAnchors(task.prompt))
118
+ layer2Warnings.push('brittle_line_anchors');
119
+ if (detectMixedEnvironmentActions(task.prompt))
120
+ layer2Warnings.push('mixed_environment_actions');
121
+ const layer3Hints = [];
122
+ if (detectConcretePath(task.prompt))
123
+ layer3Hints.push('concrete_path');
124
+ if (detectNamedCodeArtifact(task.prompt))
125
+ layer3Hints.push('named_code_artifact');
126
+ const reasonableLength = detectReasonableLength(task.prompt);
127
+ if (!reasonableLength)
128
+ layer3Hints.push('reasonable_length');
129
+ const briefQualityWarnings = [...layer2Warnings];
130
+ if (missingPillars.includes('scope'))
131
+ briefQualityWarnings.push('bare_topic_noun');
132
+ if (missingPillars.includes('done_condition'))
133
+ briefQualityWarnings.push('no_done_condition');
134
+ if (missingPillars.includes('output_contract'))
135
+ briefQualityWarnings.push('no_output_contract');
136
+ if (task.prompt.length < 50)
137
+ briefQualityWarnings.push('tiny_brief');
138
+ if (task.prompt.length > 500)
139
+ briefQualityWarnings.push('huge_brief');
140
+ let action = 'warn';
141
+ if (policy === 'normalize') {
142
+ if (missingPillars.length > 0)
143
+ action = 'refuse';
144
+ else if (layer2Warnings.length > 0)
145
+ action = 'normalize';
146
+ else
147
+ action = 'warn';
148
+ }
149
+ else if (policy === 'strict') {
150
+ if (missingPillars.length > 0)
151
+ action = 'refuse';
152
+ else
153
+ action = 'warn';
154
+ }
155
+ else if (policy === 'warn') {
156
+ action = 'warn';
157
+ }
158
+ return { action, missingPillars, layer2Warnings, layer3Hints, briefQualityWarnings };
159
+ }
160
+ //# sourceMappingURL=readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.js","sourceRoot":"","sources":["../../src/readiness/readiness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export declare const structuredReportSuffix: string;
2
+ export interface FileChange {
3
+ path: string;
4
+ summary: string;
5
+ }
6
+ export interface ParsedStructuredReport {
7
+ summary: string | null;
8
+ filesChanged: FileChange[];
9
+ normalizationDecisions: string[][];
10
+ validationsRun: Array<{
11
+ command: string;
12
+ result: string;
13
+ }>;
14
+ deviationsFromBrief: string[];
15
+ unresolved: string[];
16
+ }
17
+ export declare function parseStructuredReport(output: string): ParsedStructuredReport;
18
+ //# sourceMappingURL=structured-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured-report.d.ts","sourceRoot":"","sources":["../../src/reporting/structured-report.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,QAkB3B,CAAC;AAET,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,sBAAsB,EAAE,MAAM,EAAE,EAAE,CAAC;IACnC,cAAc,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,sBAAsB,CAsB5E"}
@@ -0,0 +1,100 @@
1
+ export const structuredReportSuffix = `
2
+ ## Summary
3
+ One-line summary of what was done.
4
+
5
+ ## Files changed
6
+ List of files modified, added, or deleted.
7
+
8
+ ## Normalization decisions
9
+ Any brief normalization decisions made during execution.
10
+
11
+ ## Validations run
12
+ Checks performed to verify correctness (e.g., "tsc passes", "tests pass").
13
+
14
+ ## Deviations from brief
15
+ Any intentional or unintentional deviations from the original brief.
16
+
17
+ ## Unresolved
18
+ Open questions, incomplete items, or items requiring further investigation.
19
+ `.trim();
20
+ export function parseStructuredReport(output) {
21
+ if (!output || !output.trim()) {
22
+ return {
23
+ summary: null,
24
+ filesChanged: [],
25
+ normalizationDecisions: [],
26
+ validationsRun: [],
27
+ deviationsFromBrief: [],
28
+ unresolved: [],
29
+ };
30
+ }
31
+ const sections = extractSections(output);
32
+ return {
33
+ summary: sections['summary']?.[0] ?? null,
34
+ filesChanged: parseFilesChanged(sections['files changed']),
35
+ normalizationDecisions: parseNormalizationDecisions(sections['normalization decisions']),
36
+ validationsRun: parseValidationsRun(sections['validations run']),
37
+ deviationsFromBrief: sections['deviations from brief'] ?? [],
38
+ unresolved: sections['unresolved'] ?? [],
39
+ };
40
+ }
41
+ function extractSections(output) {
42
+ const sections = {};
43
+ const parts = output.split(/(?=^##\s)/m);
44
+ for (const part of parts) {
45
+ const trimmed = part.trim();
46
+ if (!trimmed.startsWith('## '))
47
+ continue;
48
+ const firstNewline = trimmed.indexOf('\n');
49
+ if (firstNewline === -1)
50
+ continue;
51
+ const header = trimmed.slice(3, firstNewline).toLowerCase().trim();
52
+ const content = trimmed.slice(firstNewline + 1).trim();
53
+ if (header && content) {
54
+ sections[header] = content.split('\n').map(l => l.trim()).filter(Boolean);
55
+ }
56
+ }
57
+ return sections;
58
+ }
59
+ function parseListSection(lines) {
60
+ if (!lines)
61
+ return [];
62
+ return lines
63
+ .map(l => l.replace(/^[-*]\s*/, '').trim())
64
+ .filter(l => l && !l.startsWith('#'));
65
+ }
66
+ function parseFilesChanged(lines) {
67
+ if (!lines)
68
+ return [];
69
+ return lines
70
+ .map(l => l.replace(/^[-*]\s*/, '').trim())
71
+ .filter(l => l && !l.startsWith('#'))
72
+ .map(l => {
73
+ const colonIdx = l.indexOf(':');
74
+ if (colonIdx === -1)
75
+ return { path: l, summary: '' };
76
+ return { path: l.slice(0, colonIdx).trim(), summary: l.slice(colonIdx + 1).trim() };
77
+ });
78
+ }
79
+ function parseValidationsRun(lines) {
80
+ if (!lines)
81
+ return [];
82
+ return lines
83
+ .map(l => l.replace(/^[-*]\s*/, '').trim())
84
+ .filter(l => l && !l.startsWith('#'))
85
+ .map(l => {
86
+ const colonIdx = l.indexOf(':');
87
+ if (colonIdx === -1)
88
+ return { command: l, result: '' };
89
+ return { command: l.slice(0, colonIdx).trim(), result: l.slice(colonIdx + 1).trim() };
90
+ });
91
+ }
92
+ function parseNormalizationDecisions(lines) {
93
+ if (!lines)
94
+ return [];
95
+ return lines
96
+ .map(l => l.replace(/^[-*]\s*/, '').trim())
97
+ .filter(l => l.includes('→'))
98
+ .map(l => [l]);
99
+ }
100
+ //# sourceMappingURL=structured-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured-report.js","sourceRoot":"","sources":["../../src/reporting/structured-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ParsedStructuredReport } from '../reporting/structured-report.js';
2
+ export declare function aggregateResult(implReport: ParsedStructuredReport, specReport: ParsedStructuredReport | undefined, qualityReport: ParsedStructuredReport | undefined, specStatus: 'approved' | 'changes_required' | 'not_run', qualityStatus: 'approved' | 'changes_required' | 'not_run'): ParsedStructuredReport;
3
+ //# sourceMappingURL=aggregate-result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate-result.d.ts","sourceRoot":"","sources":["../../src/review/aggregate-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAEhF,wBAAgB,eAAe,CAC7B,UAAU,EAAE,sBAAsB,EAClC,UAAU,EAAE,sBAAsB,GAAG,SAAS,EAC9C,aAAa,EAAE,sBAAsB,GAAG,SAAS,EACjD,UAAU,EAAE,UAAU,GAAG,kBAAkB,GAAG,SAAS,EACvD,aAAa,EAAE,UAAU,GAAG,kBAAkB,GAAG,SAAS,GACzD,sBAAsB,CA+BxB"}
@@ -0,0 +1,31 @@
1
+ export function aggregateResult(implReport, specReport, qualityReport, specStatus, qualityStatus) {
2
+ const prefix = specStatus === 'changes_required'
3
+ ? '[Spec review exhausted] '
4
+ : qualityStatus === 'changes_required'
5
+ ? '[Quality review exhausted] '
6
+ : '[Reviewed] ';
7
+ return {
8
+ summary: `${prefix}${implReport.summary ?? ''}`,
9
+ filesChanged: [
10
+ ...implReport.filesChanged,
11
+ ...(qualityReport?.filesChanged ?? []),
12
+ ],
13
+ normalizationDecisions: implReport.normalizationDecisions,
14
+ validationsRun: [
15
+ ...implReport.validationsRun,
16
+ ...(specReport?.validationsRun ?? []),
17
+ ...(qualityReport?.validationsRun ?? []),
18
+ ],
19
+ deviationsFromBrief: [
20
+ ...(implReport.deviationsFromBrief ?? []),
21
+ ...(specReport?.deviationsFromBrief ?? []),
22
+ ...(qualityReport?.deviationsFromBrief ?? []),
23
+ ],
24
+ unresolved: [
25
+ ...(implReport.unresolved ?? []),
26
+ ...(specReport?.unresolved ?? []),
27
+ ...(qualityReport?.unresolved ?? []),
28
+ ],
29
+ };
30
+ }
31
+ //# sourceMappingURL=aggregate-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate-result.js","sourceRoot":"","sources":["../../src/review/aggregate-result.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAC7B,UAAkC,EAClC,UAA8C,EAC9C,aAAiD,EACjD,UAAuD,EACvD,aAA0D;IAE1D,MAAM,MAAM,GACV,UAAU,KAAK,kBAAkB;QAC/B,CAAC,CAAC,0BAA0B;QAC5B,CAAC,CAAC,aAAa,KAAK,kBAAkB;YACpC,CAAC,CAAC,6BAA6B;YAC/B,CAAC,CAAC,aAAa,CAAC;IAEtB,OAAO;QACL,OAAO,EAAE,GAAG,MAAM,GAAG,UAAU,CAAC,OAAO,IAAI,EAAE,EAAE;QAC/C,YAAY,EAAE;YACZ,GAAG,UAAU,CAAC,YAAY;YAC1B,GAAG,CAAC,aAAa,EAAE,YAAY,IAAI,EAAE,CAAC;SACvC;QACD,sBAAsB,EAAE,UAAU,CAAC,sBAAsB;QACzD,cAAc,EAAE;YACd,GAAG,UAAU,CAAC,cAAc;YAC5B,GAAG,CAAC,UAAU,EAAE,cAAc,IAAI,EAAE,CAAC;YACrC,GAAG,CAAC,aAAa,EAAE,cAAc,IAAI,EAAE,CAAC;SACzC;QACD,mBAAmB,EAAE;YACnB,GAAG,CAAC,UAAU,CAAC,mBAAmB,IAAI,EAAE,CAAC;YACzC,GAAG,CAAC,UAAU,EAAE,mBAAmB,IAAI,EAAE,CAAC;YAC1C,GAAG,CAAC,aAAa,EAAE,mBAAmB,IAAI,EAAE,CAAC;SAC9C;QACD,UAAU,EAAE;YACV,GAAG,CAAC,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC;YAChC,GAAG,CAAC,UAAU,EAAE,UAAU,IAAI,EAAE,CAAC;YACjC,GAAG,CAAC,aAAa,EAAE,UAAU,IAAI,EAAE,CAAC;SACrC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Provider } from '../types.js';
2
+ import type { ParsedStructuredReport } from '../reporting/structured-report.js';
3
+ export interface QualityReviewResult {
4
+ status: 'approved' | 'changes_required' | 'not_run';
5
+ report?: ParsedStructuredReport;
6
+ findings: string[];
7
+ }
8
+ export declare function runQualityReview(reviewerProvider: Provider, packet: {
9
+ normalizedPrompt: string;
10
+ scope: string[];
11
+ doneCondition: string;
12
+ }, implReport: ParsedStructuredReport, fileContents: Record<string, string>, toolCallLog: string[], filesWritten: string[]): Promise<QualityReviewResult>;
13
+ //# sourceMappingURL=quality-reviewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality-reviewer.d.ts","sourceRoot":"","sources":["../../src/review/quality-reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAGhF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,UAAU,GAAG,kBAAkB,GAAG,SAAS,CAAC;IACpD,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAsB,gBAAgB,CACpC,gBAAgB,EAAE,QAAQ,EAC1B,MAAM,EAAE;IAAE,gBAAgB,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,EAC5E,UAAU,EAAE,sBAAsB,EAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,WAAW,EAAE,MAAM,EAAE,EACrB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,mBAAmB,CAAC,CA4C9B"}
@@ -0,0 +1,39 @@
1
+ import { delegateWithEscalation } from '../delegate-with-escalation.js';
2
+ import { buildQualityReviewPrompt } from './reviewer-prompt.js';
3
+ import { parseStructuredReport } from '../reporting/structured-report.js';
4
+ export async function runQualityReview(reviewerProvider, packet, implReport, fileContents, toolCallLog, filesWritten) {
5
+ if (filesWritten.length === 0) {
6
+ return { status: 'not_run', findings: [] };
7
+ }
8
+ let result;
9
+ try {
10
+ const reviewerSlot = reviewerProvider.name === 'standard' ? 'standard' : 'complex';
11
+ result = await delegateWithEscalation({
12
+ prompt: buildQualityReviewPrompt(packet, implReport, fileContents, toolCallLog),
13
+ agentType: reviewerSlot,
14
+ briefQualityPolicy: 'off',
15
+ maxTurns: 20,
16
+ timeoutMs: 120_000,
17
+ }, [reviewerProvider], { explicitlyPinned: true });
18
+ }
19
+ catch {
20
+ return { status: 'not_run', findings: [] };
21
+ }
22
+ if (result.status !== 'ok') {
23
+ return { status: 'not_run', findings: [] };
24
+ }
25
+ const report = parseStructuredReport(result.output);
26
+ if (!report.summary) {
27
+ return { status: 'not_run', findings: [] };
28
+ }
29
+ const summaryLower = report.summary.toLowerCase();
30
+ if (summaryLower.includes('changes_required')) {
31
+ return {
32
+ status: 'changes_required',
33
+ report,
34
+ findings: [...(report.deviationsFromBrief ?? []), ...(report.unresolved ?? [])],
35
+ };
36
+ }
37
+ return { status: 'approved', report, findings: [] };
38
+ }
39
+ //# sourceMappingURL=quality-reviewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality-reviewer.js","sourceRoot":"","sources":["../../src/review/quality-reviewer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAQ1E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,gBAA0B,EAC1B,MAA4E,EAC5E,UAAkC,EAClC,YAAoC,EACpC,WAAqB,EACrB,YAAsB;IAEtB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC7C,CAAC;IAED,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,YAAY,GAChB,gBAAgB,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QAChE,MAAM,GAAG,MAAM,sBAAsB,CACnC;YACE,MAAM,EAAE,wBAAwB,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC;YAC/E,SAAS,EAAE,YAAY;YACvB,kBAAkB,EAAE,KAAK;YACzB,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,OAAO;SACnB,EACD,CAAC,gBAAgB,CAAC,EAClB,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAC3B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC7C,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IAElD,IAAI,YAAY,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC9C,OAAO;YACL,MAAM,EAAE,kBAAkB;YAC1B,MAAM;YACN,QAAQ,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,mBAAmB,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;SAChF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AACtD,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ParsedStructuredReport } from '../reporting/structured-report.js';
2
+ interface ReviewerPacketInput {
3
+ normalizedPrompt: string;
4
+ scope: string[];
5
+ doneCondition: string;
6
+ }
7
+ export declare function buildSpecReviewPrompt(packet: ReviewerPacketInput, implReport: ParsedStructuredReport, fileContents: Record<string, string>, toolCallLog: string[]): string;
8
+ export declare function buildQualityReviewPrompt(packet: ReviewerPacketInput, implReport: ParsedStructuredReport, fileContents: Record<string, string>, toolCallLog: string[]): string;
9
+ export {};
10
+ //# sourceMappingURL=reviewer-prompt.d.ts.map