monty-autonomous-fullstack-dev-multillm 1.0.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.
- package/LICENSE +81 -0
- package/README.md +608 -0
- package/bin/cli.js +448 -0
- package/dist/agents/coding.d.ts +15 -0
- package/dist/agents/coding.d.ts.map +1 -0
- package/dist/agents/coding.js +189 -0
- package/dist/agents/coding.js.map +1 -0
- package/dist/agents/initializer.d.ts +15 -0
- package/dist/agents/initializer.d.ts.map +1 -0
- package/dist/agents/initializer.js +87 -0
- package/dist/agents/initializer.js.map +1 -0
- package/dist/agents/prompts/arbitrator.md +143 -0
- package/dist/agents/prompts/coding.md +247 -0
- package/dist/agents/prompts/initializer.md +98 -0
- package/dist/config/agent-config.d.ts +103 -0
- package/dist/config/agent-config.d.ts.map +1 -0
- package/dist/config/agent-config.js +138 -0
- package/dist/config/agent-config.js.map +1 -0
- package/dist/config/auth-config.d.ts +152 -0
- package/dist/config/auth-config.d.ts.map +1 -0
- package/dist/config/auth-config.js +139 -0
- package/dist/config/auth-config.js.map +1 -0
- package/dist/config/mcp-config.d.ts +109 -0
- package/dist/config/mcp-config.d.ts.map +1 -0
- package/dist/config/mcp-config.js +234 -0
- package/dist/config/mcp-config.js.map +1 -0
- package/dist/config/provider-config.d.ts +139 -0
- package/dist/config/provider-config.d.ts.map +1 -0
- package/dist/config/provider-config.js +344 -0
- package/dist/config/provider-config.js.map +1 -0
- package/dist/config/subagents-config.d.ts +85 -0
- package/dist/config/subagents-config.d.ts.map +1 -0
- package/dist/config/subagents-config.js +430 -0
- package/dist/config/subagents-config.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +385 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/arbitrator.d.ts +93 -0
- package/dist/orchestrator/arbitrator.d.ts.map +1 -0
- package/dist/orchestrator/arbitrator.js +330 -0
- package/dist/orchestrator/arbitrator.js.map +1 -0
- package/dist/orchestrator/index.d.ts +113 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +217 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/review-coordinator.d.ts +143 -0
- package/dist/orchestrator/review-coordinator.d.ts.map +1 -0
- package/dist/orchestrator/review-coordinator.js +401 -0
- package/dist/orchestrator/review-coordinator.js.map +1 -0
- package/dist/orchestrator/task-classifier.d.ts +87 -0
- package/dist/orchestrator/task-classifier.d.ts.map +1 -0
- package/dist/orchestrator/task-classifier.js +250 -0
- package/dist/orchestrator/task-classifier.js.map +1 -0
- package/dist/providers/anthropic-provider.d.ts +64 -0
- package/dist/providers/anthropic-provider.d.ts.map +1 -0
- package/dist/providers/anthropic-provider.js +264 -0
- package/dist/providers/anthropic-provider.js.map +1 -0
- package/dist/providers/base-provider.d.ts +219 -0
- package/dist/providers/base-provider.d.ts.map +1 -0
- package/dist/providers/base-provider.js +143 -0
- package/dist/providers/base-provider.js.map +1 -0
- package/dist/providers/cursor-provider.d.ts +82 -0
- package/dist/providers/cursor-provider.d.ts.map +1 -0
- package/dist/providers/cursor-provider.js +321 -0
- package/dist/providers/cursor-provider.js.map +1 -0
- package/dist/providers/google-provider.d.ts +75 -0
- package/dist/providers/google-provider.d.ts.map +1 -0
- package/dist/providers/google-provider.js +274 -0
- package/dist/providers/google-provider.js.map +1 -0
- package/dist/providers/index.d.ts +92 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +233 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai-provider.d.ts +83 -0
- package/dist/providers/openai-provider.d.ts.map +1 -0
- package/dist/providers/openai-provider.js +295 -0
- package/dist/providers/openai-provider.js.map +1 -0
- package/dist/templates/feature_list.template.json +66 -0
- package/dist/templates/progress.template.txt +51 -0
- package/dist/utils/auth-manager.d.ts +121 -0
- package/dist/utils/auth-manager.d.ts.map +1 -0
- package/dist/utils/auth-manager.js +560 -0
- package/dist/utils/auth-manager.js.map +1 -0
- package/dist/utils/budget-enforcer.d.ts +181 -0
- package/dist/utils/budget-enforcer.d.ts.map +1 -0
- package/dist/utils/budget-enforcer.js +386 -0
- package/dist/utils/budget-enforcer.js.map +1 -0
- package/dist/utils/chatgpt-detector.d.ts +51 -0
- package/dist/utils/chatgpt-detector.d.ts.map +1 -0
- package/dist/utils/chatgpt-detector.js +274 -0
- package/dist/utils/chatgpt-detector.js.map +1 -0
- package/dist/utils/claude-code-detector.d.ts +39 -0
- package/dist/utils/claude-code-detector.d.ts.map +1 -0
- package/dist/utils/claude-code-detector.js +153 -0
- package/dist/utils/claude-code-detector.js.map +1 -0
- package/dist/utils/code-quality.d.ts +58 -0
- package/dist/utils/code-quality.d.ts.map +1 -0
- package/dist/utils/code-quality.js +258 -0
- package/dist/utils/code-quality.js.map +1 -0
- package/dist/utils/context-primer.d.ts +50 -0
- package/dist/utils/context-primer.d.ts.map +1 -0
- package/dist/utils/context-primer.js +429 -0
- package/dist/utils/context-primer.js.map +1 -0
- package/dist/utils/dependency-management.d.ts +40 -0
- package/dist/utils/dependency-management.d.ts.map +1 -0
- package/dist/utils/dependency-management.js +123 -0
- package/dist/utils/dependency-management.js.map +1 -0
- package/dist/utils/environment-validation.d.ts +33 -0
- package/dist/utils/environment-validation.d.ts.map +1 -0
- package/dist/utils/environment-validation.js +136 -0
- package/dist/utils/environment-validation.js.map +1 -0
- package/dist/utils/error-recovery.d.ts +60 -0
- package/dist/utils/error-recovery.d.ts.map +1 -0
- package/dist/utils/error-recovery.js +183 -0
- package/dist/utils/error-recovery.js.map +1 -0
- package/dist/utils/feature-list.d.ts +102 -0
- package/dist/utils/feature-list.d.ts.map +1 -0
- package/dist/utils/feature-list.js +191 -0
- package/dist/utils/feature-list.js.map +1 -0
- package/dist/utils/gemini-detector.d.ts +65 -0
- package/dist/utils/gemini-detector.d.ts.map +1 -0
- package/dist/utils/gemini-detector.js +340 -0
- package/dist/utils/gemini-detector.js.map +1 -0
- package/dist/utils/git-utils.d.ts +48 -0
- package/dist/utils/git-utils.d.ts.map +1 -0
- package/dist/utils/git-utils.js +110 -0
- package/dist/utils/git-utils.js.map +1 -0
- package/dist/utils/health-check.d.ts +32 -0
- package/dist/utils/health-check.d.ts.map +1 -0
- package/dist/utils/health-check.js +152 -0
- package/dist/utils/health-check.js.map +1 -0
- package/dist/utils/hooks-manager.d.ts +154 -0
- package/dist/utils/hooks-manager.d.ts.map +1 -0
- package/dist/utils/hooks-manager.js +359 -0
- package/dist/utils/hooks-manager.js.map +1 -0
- package/dist/utils/multi-auth-manager.d.ts +144 -0
- package/dist/utils/multi-auth-manager.d.ts.map +1 -0
- package/dist/utils/multi-auth-manager.js +588 -0
- package/dist/utils/multi-auth-manager.js.map +1 -0
- package/dist/utils/progress.d.ts +49 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +209 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/project-detection.d.ts +40 -0
- package/dist/utils/project-detection.d.ts.map +1 -0
- package/dist/utils/project-detection.js +230 -0
- package/dist/utils/project-detection.js.map +1 -0
- package/dist/utils/session-manager.d.ts +119 -0
- package/dist/utils/session-manager.d.ts.map +1 -0
- package/dist/utils/session-manager.js +389 -0
- package/dist/utils/session-manager.js.map +1 -0
- package/dist/utils/skills-manager.d.ts +113 -0
- package/dist/utils/skills-manager.d.ts.map +1 -0
- package/dist/utils/skills-manager.js +332 -0
- package/dist/utils/skills-manager.js.map +1 -0
- package/dist/utils/structured-output.d.ts +117 -0
- package/dist/utils/structured-output.d.ts.map +1 -0
- package/dist/utils/structured-output.js +191 -0
- package/dist/utils/structured-output.js.map +1 -0
- package/dist/utils/subagent-manager.d.ts +143 -0
- package/dist/utils/subagent-manager.d.ts.map +1 -0
- package/dist/utils/subagent-manager.js +326 -0
- package/dist/utils/subagent-manager.js.map +1 -0
- package/dist/utils/supabase-setup.d.ts +50 -0
- package/dist/utils/supabase-setup.d.ts.map +1 -0
- package/dist/utils/supabase-setup.js +151 -0
- package/dist/utils/supabase-setup.js.map +1 -0
- package/dist/utils/token-refresh.d.ts +21 -0
- package/dist/utils/token-refresh.d.ts.map +1 -0
- package/dist/utils/token-refresh.js +77 -0
- package/dist/utils/token-refresh.js.map +1 -0
- package/dist/utils/tos-warning.d.ts +115 -0
- package/dist/utils/tos-warning.d.ts.map +1 -0
- package/dist/utils/tos-warning.js +304 -0
- package/dist/utils/tos-warning.js.map +1 -0
- package/dist/utils/usage-monitor.d.ts +156 -0
- package/dist/utils/usage-monitor.d.ts.map +1 -0
- package/dist/utils/usage-monitor.js +296 -0
- package/dist/utils/usage-monitor.js.map +1 -0
- package/package.json +105 -0
- package/scripts/init.ps1 +73 -0
- package/scripts/init.sh +86 -0
- package/scripts/test-auth.sh +90 -0
- package/templates/feature_list.template.json +66 -0
- package/templates/progress.template.txt +51 -0
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Arbitrator Sub-Agent
|
|
3
|
+
* Resolves conflicts between multiple AI provider reviews
|
|
4
|
+
* using a designated arbitrator provider (default: Claude).
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2025 Dobeu Tech Solutions LLC
|
|
7
|
+
* Licensed under CC BY-NC 4.0
|
|
8
|
+
*/
|
|
9
|
+
import { getProviderConfig, } from '../config/provider-config.js';
|
|
10
|
+
import { getProvider, } from '../providers/index.js';
|
|
11
|
+
/**
|
|
12
|
+
* Default arbitrator config
|
|
13
|
+
*/
|
|
14
|
+
const DEFAULT_ARBITRATOR_CONFIG = {
|
|
15
|
+
provider: 'anthropic',
|
|
16
|
+
timeout: 180000,
|
|
17
|
+
allowedTools: ['Read', 'Glob', 'Grep'],
|
|
18
|
+
investigateCode: true,
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Arbitrator Sub-Agent
|
|
22
|
+
* Resolves conflicts between AI provider reviews
|
|
23
|
+
*/
|
|
24
|
+
export class Arbitrator {
|
|
25
|
+
config;
|
|
26
|
+
constructor(config) {
|
|
27
|
+
this.config = { ...DEFAULT_ARBITRATOR_CONFIG, ...config };
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Resolve conflicts from a coordinated review
|
|
31
|
+
*/
|
|
32
|
+
async resolve(reviewResult, context) {
|
|
33
|
+
const startTime = Date.now();
|
|
34
|
+
if (reviewResult.conflicts.length === 0) {
|
|
35
|
+
// No conflicts to resolve
|
|
36
|
+
return this.createNoConflictResult(reviewResult);
|
|
37
|
+
}
|
|
38
|
+
console.log(`\n⚖️ Starting Arbitration`);
|
|
39
|
+
console.log(` Arbitrator: ${getProviderConfig(this.config.provider).displayName}`);
|
|
40
|
+
console.log(` Conflicts to resolve: ${reviewResult.conflicts.length}`);
|
|
41
|
+
const provider = getProvider(this.config.provider);
|
|
42
|
+
// Build arbitration prompt
|
|
43
|
+
const prompt = this.buildArbitrationPrompt(reviewResult.reviews, reviewResult.conflicts, context);
|
|
44
|
+
// Execute arbitration query
|
|
45
|
+
const messages = [];
|
|
46
|
+
for await (const message of provider.query(prompt, {
|
|
47
|
+
tools: this.config.allowedTools,
|
|
48
|
+
timeout_ms: this.config.timeout,
|
|
49
|
+
})) {
|
|
50
|
+
messages.push(message);
|
|
51
|
+
}
|
|
52
|
+
// Parse arbitration decisions
|
|
53
|
+
const decisions = this.parseArbitrationDecisions(messages, reviewResult.conflicts);
|
|
54
|
+
// Build final merged review
|
|
55
|
+
const finalReview = this.buildFinalReview(reviewResult.reviews, reviewResult.consensusFindings, decisions);
|
|
56
|
+
// Generate summary
|
|
57
|
+
const summary = this.generateSummary(decisions, finalReview);
|
|
58
|
+
const executionTime = Date.now() - startTime;
|
|
59
|
+
console.log(`\n✓ Arbitration complete (${Math.round(executionTime / 1000)}s)`);
|
|
60
|
+
console.log(` Decisions made: ${decisions.length}`);
|
|
61
|
+
return {
|
|
62
|
+
decisions,
|
|
63
|
+
finalReview,
|
|
64
|
+
summary,
|
|
65
|
+
arbitratorProvider: this.config.provider,
|
|
66
|
+
executionTime,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Build the arbitration prompt
|
|
71
|
+
*/
|
|
72
|
+
buildArbitrationPrompt(reviews, conflicts, context) {
|
|
73
|
+
return `# Code Review Arbitration
|
|
74
|
+
|
|
75
|
+
You are the arbitrator sub-agent responsible for resolving conflicts between
|
|
76
|
+
multiple AI code reviewers. Your decision is final and must be well-reasoned.
|
|
77
|
+
|
|
78
|
+
${context ? `## Context\n${context}\n` : ''}
|
|
79
|
+
|
|
80
|
+
## Reviews Received
|
|
81
|
+
|
|
82
|
+
${reviews.map(r => `
|
|
83
|
+
### ${getProviderConfig(r.provider).displayName} Review
|
|
84
|
+
Overall Severity: ${r.overallSeverity.toUpperCase()}
|
|
85
|
+
Confidence: ${Math.round(r.confidence * 100)}%
|
|
86
|
+
Findings: ${r.findings.length}
|
|
87
|
+
|
|
88
|
+
${r.findings.slice(0, 10).map(f => `- [${f.severity.toUpperCase()}] ${f.file}:${f.line} - ${f.message}`).join('\n')}
|
|
89
|
+
${r.findings.length > 10 ? `\n... and ${r.findings.length - 10} more findings` : ''}
|
|
90
|
+
|
|
91
|
+
Suggestions:
|
|
92
|
+
${r.suggestions.slice(0, 5).map(s => `- ${s}`).join('\n')}
|
|
93
|
+
`).join('\n')}
|
|
94
|
+
|
|
95
|
+
## Conflicts to Resolve
|
|
96
|
+
|
|
97
|
+
${conflicts.map((c, i) => `
|
|
98
|
+
### Conflict ${i + 1}: ${c.description}
|
|
99
|
+
Type: ${c.type}
|
|
100
|
+
${c.file ? `Location: ${c.file}:${c.line}` : ''}
|
|
101
|
+
|
|
102
|
+
**${getProviderConfig(c.provider1).displayName}** says:
|
|
103
|
+
${c.position1}
|
|
104
|
+
|
|
105
|
+
**${getProviderConfig(c.provider2).displayName}** says:
|
|
106
|
+
${c.position2}
|
|
107
|
+
`).join('\n')}
|
|
108
|
+
|
|
109
|
+
## Your Task
|
|
110
|
+
|
|
111
|
+
1. For each conflict, analyze both positions carefully
|
|
112
|
+
2. ${this.config.investigateCode ? 'Use the Read tool to investigate the actual code if needed' : 'Consider the provided context'}
|
|
113
|
+
3. Make a final decision for each conflict
|
|
114
|
+
4. Explain your reasoning clearly
|
|
115
|
+
5. Provide a merged, conflict-free final review
|
|
116
|
+
|
|
117
|
+
## Decision Framework
|
|
118
|
+
|
|
119
|
+
When resolving conflicts, consider:
|
|
120
|
+
1. **Correctness**: Which assessment is factually accurate?
|
|
121
|
+
2. **Severity**: Which correctly identifies the risk level?
|
|
122
|
+
3. **Best Practices**: Which aligns with industry standards?
|
|
123
|
+
4. **Security**: When in doubt about security, err on caution
|
|
124
|
+
|
|
125
|
+
## Required Output Format
|
|
126
|
+
|
|
127
|
+
Provide your decisions in this exact format:
|
|
128
|
+
|
|
129
|
+
<arbitration>
|
|
130
|
+
CONFLICT 1:
|
|
131
|
+
Winner: [provider_name]
|
|
132
|
+
Reasoning: [Your detailed reasoning]
|
|
133
|
+
Resolved Severity: [info|warning|error|critical]
|
|
134
|
+
|
|
135
|
+
CONFLICT 2:
|
|
136
|
+
Winner: [provider_name]
|
|
137
|
+
Reasoning: [Your detailed reasoning]
|
|
138
|
+
Resolved Severity: [info|warning|error|critical]
|
|
139
|
+
|
|
140
|
+
FINAL ASSESSMENT:
|
|
141
|
+
Overall: [pass|minor|major|critical]
|
|
142
|
+
Key Findings:
|
|
143
|
+
- [List the most important findings after conflict resolution]
|
|
144
|
+
</arbitration>
|
|
145
|
+
|
|
146
|
+
Begin your analysis now.`;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Parse arbitration decisions from response
|
|
150
|
+
*/
|
|
151
|
+
parseArbitrationDecisions(messages, conflicts) {
|
|
152
|
+
const decisions = [];
|
|
153
|
+
// Extract text content
|
|
154
|
+
const textContent = messages
|
|
155
|
+
.flatMap(m => m.content)
|
|
156
|
+
.filter(c => c.type === 'text')
|
|
157
|
+
.map(c => c.text)
|
|
158
|
+
.join('\n');
|
|
159
|
+
// Parse arbitration block
|
|
160
|
+
const arbitrationMatch = textContent.match(/<arbitration>([\s\S]*?)<\/arbitration>/i);
|
|
161
|
+
const arbitrationText = arbitrationMatch?.[1] ?? textContent;
|
|
162
|
+
// Parse each conflict decision
|
|
163
|
+
for (let i = 0; i < conflicts.length; i++) {
|
|
164
|
+
const conflict = conflicts[i];
|
|
165
|
+
const conflictPattern = new RegExp(`CONFLICT\\s*${i + 1}[:\\s]*([\\s\\S]*?)(?=CONFLICT|FINAL|$)`, 'i');
|
|
166
|
+
const conflictMatch = arbitrationText.match(conflictPattern);
|
|
167
|
+
if (conflictMatch?.[1]) {
|
|
168
|
+
const decisionText = conflictMatch[1];
|
|
169
|
+
// Extract winner
|
|
170
|
+
const winnerMatch = decisionText.match(/Winner:\s*(\w+)/i);
|
|
171
|
+
let winner = conflict.provider1;
|
|
172
|
+
if (winnerMatch?.[1]) {
|
|
173
|
+
const winnerStr = winnerMatch[1].toLowerCase();
|
|
174
|
+
if (winnerStr.includes('openai') || winnerStr.includes('codex'))
|
|
175
|
+
winner = 'openai';
|
|
176
|
+
else if (winnerStr.includes('google') || winnerStr.includes('gemini'))
|
|
177
|
+
winner = 'google';
|
|
178
|
+
else if (winnerStr.includes('cursor'))
|
|
179
|
+
winner = 'cursor';
|
|
180
|
+
else if (winnerStr.includes('anthropic') || winnerStr.includes('claude'))
|
|
181
|
+
winner = 'anthropic';
|
|
182
|
+
else if (winnerStr === conflict.provider2)
|
|
183
|
+
winner = conflict.provider2;
|
|
184
|
+
}
|
|
185
|
+
// Extract reasoning
|
|
186
|
+
const reasoningMatch = decisionText.match(/Reasoning:\s*([^\n]+(?:\n(?!Winner|Resolved)[^\n]+)*)/i);
|
|
187
|
+
const reasoning = reasoningMatch?.[1]?.trim() ?? 'No reasoning provided';
|
|
188
|
+
decisions.push({
|
|
189
|
+
conflictId: conflict.id,
|
|
190
|
+
winner,
|
|
191
|
+
reasoning,
|
|
192
|
+
confidence: 0.85, // Default confidence
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
// Default decision if parsing fails
|
|
197
|
+
decisions.push({
|
|
198
|
+
conflictId: conflict.id,
|
|
199
|
+
winner: conflict.provider1,
|
|
200
|
+
reasoning: 'Unable to parse decision, defaulting to first provider',
|
|
201
|
+
confidence: 0.5,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return decisions;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Build the final merged review
|
|
209
|
+
*/
|
|
210
|
+
buildFinalReview(reviews, consensusFindings, decisions) {
|
|
211
|
+
// Start with consensus findings
|
|
212
|
+
const findings = [...consensusFindings];
|
|
213
|
+
const suggestions = [];
|
|
214
|
+
// Collect suggestions from all reviews
|
|
215
|
+
for (const review of reviews) {
|
|
216
|
+
suggestions.push(...review.suggestions);
|
|
217
|
+
}
|
|
218
|
+
// Deduplicate suggestions
|
|
219
|
+
const uniqueSuggestions = [...new Set(suggestions)];
|
|
220
|
+
// Determine overall severity
|
|
221
|
+
let overallSeverity = 'pass';
|
|
222
|
+
// Use the winning assessment from arbitration if available
|
|
223
|
+
const severityVotes = {};
|
|
224
|
+
for (const decision of decisions) {
|
|
225
|
+
const winningReview = reviews.find(r => r.provider === decision.winner);
|
|
226
|
+
if (winningReview) {
|
|
227
|
+
severityVotes[winningReview.overallSeverity] =
|
|
228
|
+
(severityVotes[winningReview.overallSeverity] ?? 0) + 1;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// Find most voted severity
|
|
232
|
+
let maxVotes = 0;
|
|
233
|
+
for (const [severity, votes] of Object.entries(severityVotes)) {
|
|
234
|
+
if (votes > maxVotes) {
|
|
235
|
+
maxVotes = votes;
|
|
236
|
+
overallSeverity = severity;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// If no arbitration decisions affected severity, use consensus
|
|
240
|
+
if (maxVotes === 0 && findings.length > 0) {
|
|
241
|
+
if (findings.some(f => f.severity === 'critical'))
|
|
242
|
+
overallSeverity = 'critical';
|
|
243
|
+
else if (findings.some(f => f.severity === 'error'))
|
|
244
|
+
overallSeverity = 'major';
|
|
245
|
+
else if (findings.some(f => f.severity === 'warning'))
|
|
246
|
+
overallSeverity = 'minor';
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
findings,
|
|
250
|
+
suggestions: uniqueSuggestions.slice(0, 10),
|
|
251
|
+
overallSeverity,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Generate arbitration summary
|
|
256
|
+
*/
|
|
257
|
+
generateSummary(decisions, finalReview) {
|
|
258
|
+
const lines = [];
|
|
259
|
+
lines.push('═══════════════════════════════════════════════════════════════');
|
|
260
|
+
lines.push(' Arbitration Summary ');
|
|
261
|
+
lines.push('═══════════════════════════════════════════════════════════════\n');
|
|
262
|
+
lines.push(`Conflicts Resolved: ${decisions.length}`);
|
|
263
|
+
lines.push(`Final Assessment: ${finalReview.overallSeverity.toUpperCase()}`);
|
|
264
|
+
lines.push(`Final Findings: ${finalReview.findings.length}\n`);
|
|
265
|
+
lines.push('Decisions:');
|
|
266
|
+
for (const decision of decisions) {
|
|
267
|
+
lines.push(` ${decision.conflictId}: Winner = ${getProviderConfig(decision.winner).displayName}`);
|
|
268
|
+
lines.push(` Reasoning: ${decision.reasoning.slice(0, 100)}${decision.reasoning.length > 100 ? '...' : ''}`);
|
|
269
|
+
}
|
|
270
|
+
if (finalReview.findings.length > 0) {
|
|
271
|
+
lines.push('\nKey Findings After Arbitration:');
|
|
272
|
+
for (const finding of finalReview.findings.slice(0, 5)) {
|
|
273
|
+
lines.push(` [${finding.severity.toUpperCase()}] ${finding.file}:${finding.line} - ${finding.message}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
lines.push('\n═══════════════════════════════════════════════════════════════');
|
|
277
|
+
return lines.join('\n');
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Create result when there are no conflicts
|
|
281
|
+
*/
|
|
282
|
+
createNoConflictResult(reviewResult) {
|
|
283
|
+
// Merge all findings
|
|
284
|
+
const allFindings = reviewResult.consensusFindings;
|
|
285
|
+
// Determine overall severity
|
|
286
|
+
let overallSeverity = 'pass';
|
|
287
|
+
if (allFindings.some(f => f.severity === 'critical'))
|
|
288
|
+
overallSeverity = 'critical';
|
|
289
|
+
else if (allFindings.some(f => f.severity === 'error'))
|
|
290
|
+
overallSeverity = 'major';
|
|
291
|
+
else if (allFindings.some(f => f.severity === 'warning'))
|
|
292
|
+
overallSeverity = 'minor';
|
|
293
|
+
// Collect all suggestions
|
|
294
|
+
const suggestions = reviewResult.reviews
|
|
295
|
+
.flatMap(r => r.suggestions)
|
|
296
|
+
.filter((s, i, arr) => arr.indexOf(s) === i)
|
|
297
|
+
.slice(0, 10);
|
|
298
|
+
return {
|
|
299
|
+
decisions: [],
|
|
300
|
+
finalReview: {
|
|
301
|
+
findings: allFindings,
|
|
302
|
+
suggestions,
|
|
303
|
+
overallSeverity,
|
|
304
|
+
},
|
|
305
|
+
summary: 'No conflicts to resolve. All providers agree on the review.',
|
|
306
|
+
arbitratorProvider: this.config.provider,
|
|
307
|
+
executionTime: 0,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Update configuration
|
|
312
|
+
*/
|
|
313
|
+
updateConfig(config) {
|
|
314
|
+
this.config = { ...this.config, ...config };
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Get current configuration
|
|
318
|
+
*/
|
|
319
|
+
getConfig() {
|
|
320
|
+
return { ...this.config };
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Create an arbitrator instance
|
|
325
|
+
*/
|
|
326
|
+
export function createArbitrator(config) {
|
|
327
|
+
return new Arbitrator(config);
|
|
328
|
+
}
|
|
329
|
+
export default Arbitrator;
|
|
330
|
+
//# sourceMappingURL=arbitrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arbitrator.js","sourceRoot":"","sources":["../../src/orchestrator/arbitrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Orchestrator
|
|
3
|
+
* Coordinates task execution across multiple AI providers with
|
|
4
|
+
* automatic routing, fallback, and multi-agent review capabilities.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2025 Dobeu Tech Solutions LLC
|
|
7
|
+
* Licensed under CC BY-NC 4.0
|
|
8
|
+
*/
|
|
9
|
+
import { type ProviderName, type TaskType } from '../config/provider-config.js';
|
|
10
|
+
import { type AgentMessage, type QueryOptions } from '../providers/index.js';
|
|
11
|
+
import { TaskClassifier, createTaskClassifier, type TaskClassification, type TaskContext } from './task-classifier.js';
|
|
12
|
+
/**
|
|
13
|
+
* Orchestrator configuration
|
|
14
|
+
*/
|
|
15
|
+
export interface OrchestratorConfig {
|
|
16
|
+
/** Enable task-based routing */
|
|
17
|
+
routingEnabled: boolean;
|
|
18
|
+
/** Enable multi-agent review for code_review tasks */
|
|
19
|
+
multiAgentReviewEnabled: boolean;
|
|
20
|
+
/** Enable automatic fallback to alternative providers */
|
|
21
|
+
fallbackEnabled: boolean;
|
|
22
|
+
/** Maximum retry attempts per provider */
|
|
23
|
+
maxRetries: number;
|
|
24
|
+
/** Default provider when routing is disabled */
|
|
25
|
+
defaultProvider: ProviderName;
|
|
26
|
+
/** Minimum providers for multi-agent review */
|
|
27
|
+
minReviewProviders: number;
|
|
28
|
+
/** Provider to use for arbitration */
|
|
29
|
+
arbitratorProvider: ProviderName;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Default orchestrator configuration
|
|
33
|
+
*/
|
|
34
|
+
export declare const DEFAULT_ORCHESTRATOR_CONFIG: OrchestratorConfig;
|
|
35
|
+
/**
|
|
36
|
+
* Orchestrator execution result
|
|
37
|
+
*/
|
|
38
|
+
export interface OrchestratorResult {
|
|
39
|
+
success: boolean;
|
|
40
|
+
provider: ProviderName;
|
|
41
|
+
taskType: TaskType;
|
|
42
|
+
classification: TaskClassification;
|
|
43
|
+
messages: AgentMessage[];
|
|
44
|
+
fallbacksUsed: ProviderName[];
|
|
45
|
+
error?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Task Orchestrator
|
|
49
|
+
* Main coordinator for multi-provider task execution
|
|
50
|
+
*/
|
|
51
|
+
export declare class TaskOrchestrator {
|
|
52
|
+
private config;
|
|
53
|
+
private classifier;
|
|
54
|
+
private availableProviders;
|
|
55
|
+
constructor(config?: Partial<OrchestratorConfig>);
|
|
56
|
+
/**
|
|
57
|
+
* Initialize the orchestrator - detect available providers
|
|
58
|
+
*/
|
|
59
|
+
initialize(): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Execute a task with automatic routing and fallback
|
|
62
|
+
*/
|
|
63
|
+
execute(task: string, options: QueryOptions & {
|
|
64
|
+
context?: TaskContext;
|
|
65
|
+
}): AsyncGenerator<AgentMessage, OrchestratorResult, unknown>;
|
|
66
|
+
/**
|
|
67
|
+
* Create a default classification when routing is disabled
|
|
68
|
+
*/
|
|
69
|
+
private createDefaultClassification;
|
|
70
|
+
/**
|
|
71
|
+
* Get current configuration
|
|
72
|
+
*/
|
|
73
|
+
getConfig(): OrchestratorConfig;
|
|
74
|
+
/**
|
|
75
|
+
* Update configuration
|
|
76
|
+
*/
|
|
77
|
+
updateConfig(config: Partial<OrchestratorConfig>): void;
|
|
78
|
+
/**
|
|
79
|
+
* Get available providers
|
|
80
|
+
*/
|
|
81
|
+
getAvailableProviders(): ProviderName[];
|
|
82
|
+
/**
|
|
83
|
+
* Check if multi-agent review is available
|
|
84
|
+
*/
|
|
85
|
+
canDoMultiAgentReview(): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Get the task classifier for direct access
|
|
88
|
+
*/
|
|
89
|
+
getClassifier(): TaskClassifier;
|
|
90
|
+
/**
|
|
91
|
+
* Manually classify a task without executing
|
|
92
|
+
*/
|
|
93
|
+
classifyTask(task: string, context?: TaskContext): TaskClassification;
|
|
94
|
+
/**
|
|
95
|
+
* Get provider recommendation for a task type
|
|
96
|
+
*/
|
|
97
|
+
getRecommendedProvider(taskType: TaskType): ProviderName | null;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Create a task orchestrator instance
|
|
101
|
+
*/
|
|
102
|
+
export declare function createOrchestrator(config?: Partial<OrchestratorConfig>): TaskOrchestrator;
|
|
103
|
+
/**
|
|
104
|
+
* Get or create the orchestrator singleton
|
|
105
|
+
*/
|
|
106
|
+
export declare function getOrchestrator(config?: Partial<OrchestratorConfig>): Promise<TaskOrchestrator>;
|
|
107
|
+
/**
|
|
108
|
+
* Reset the orchestrator singleton (for testing)
|
|
109
|
+
*/
|
|
110
|
+
export declare function resetOrchestrator(): void;
|
|
111
|
+
export { TaskClassifier, createTaskClassifier, type TaskClassification, type TaskContext, };
|
|
112
|
+
export default TaskOrchestrator;
|
|
113
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/orchestrator/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,QAAQ,EAGd,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,gCAAgC;IAChC,cAAc,EAAE,OAAO,CAAC;IACxB,sDAAsD;IACtD,uBAAuB,EAAE,OAAO,CAAC;IACjC,yDAAyD;IACzD,eAAe,EAAE,OAAO,CAAC;IACzB,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,eAAe,EAAE,YAAY,CAAC;IAC9B,+CAA+C;IAC/C,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sCAAsC;IACtC,kBAAkB,EAAE,YAAY,CAAC;CAClC;AAED;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,kBAQzC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,cAAc,EAAE,kBAAkB,CAAC;IACnC,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,kBAAkB,CAAsB;gBAEpC,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC;IAKhD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAYjC;;OAEG;IACI,OAAO,CACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,GAAG;QAAE,OAAO,CAAC,EAAE,WAAW,CAAA;KAAE,GAChD,cAAc,CAAC,YAAY,EAAE,kBAAkB,EAAE,OAAO,CAAC;IA2F5D;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAcnC;;OAEG;IACH,SAAS,IAAI,kBAAkB;IAI/B;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,IAAI;IAOvD;;OAEG;IACH,qBAAqB,IAAI,YAAY,EAAE;IAIvC;;OAEG;IACH,qBAAqB,IAAI,OAAO;IAOhC;;OAEG;IACH,aAAa,IAAI,cAAc;IAI/B;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,kBAAkB;IAIrE;;OAEG;IACH,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,YAAY,GAAG,IAAI;CAIhE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GACnC,gBAAgB,CAElB;AAOD;;GAEG;AACH,wBAAsB,eAAe,CACnC,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GACnC,OAAO,CAAC,gBAAgB,CAAC,CAM3B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAGD,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,KAAK,WAAW,GACjB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Orchestrator
|
|
3
|
+
* Coordinates task execution across multiple AI providers with
|
|
4
|
+
* automatic routing, fallback, and multi-agent review capabilities.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2025 Dobeu Tech Solutions LLC
|
|
7
|
+
* Licensed under CC BY-NC 4.0
|
|
8
|
+
*/
|
|
9
|
+
import { getProviderConfig, } from '../config/provider-config.js';
|
|
10
|
+
import { getProvider, getAvailableProviders, } from '../providers/index.js';
|
|
11
|
+
import { TaskClassifier, createTaskClassifier, } from './task-classifier.js';
|
|
12
|
+
/**
|
|
13
|
+
* Default orchestrator configuration
|
|
14
|
+
*/
|
|
15
|
+
export const DEFAULT_ORCHESTRATOR_CONFIG = {
|
|
16
|
+
routingEnabled: true,
|
|
17
|
+
multiAgentReviewEnabled: true,
|
|
18
|
+
fallbackEnabled: true,
|
|
19
|
+
maxRetries: 3,
|
|
20
|
+
defaultProvider: 'anthropic',
|
|
21
|
+
minReviewProviders: 2,
|
|
22
|
+
arbitratorProvider: 'anthropic',
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Task Orchestrator
|
|
26
|
+
* Main coordinator for multi-provider task execution
|
|
27
|
+
*/
|
|
28
|
+
export class TaskOrchestrator {
|
|
29
|
+
config;
|
|
30
|
+
classifier;
|
|
31
|
+
availableProviders = [];
|
|
32
|
+
constructor(config) {
|
|
33
|
+
this.config = { ...DEFAULT_ORCHESTRATOR_CONFIG, ...config };
|
|
34
|
+
this.classifier = createTaskClassifier();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Initialize the orchestrator - detect available providers
|
|
38
|
+
*/
|
|
39
|
+
async initialize() {
|
|
40
|
+
const available = await getAvailableProviders();
|
|
41
|
+
this.availableProviders = available.map(p => p.name);
|
|
42
|
+
this.classifier.setAvailableProviders(this.availableProviders);
|
|
43
|
+
this.classifier.setDefaultProvider(this.config.defaultProvider);
|
|
44
|
+
console.log(`Orchestrator initialized with ${this.availableProviders.length} providers:`);
|
|
45
|
+
for (const provider of this.availableProviders) {
|
|
46
|
+
console.log(` ✓ ${getProviderConfig(provider).displayName}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Execute a task with automatic routing and fallback
|
|
51
|
+
*/
|
|
52
|
+
async *execute(task, options) {
|
|
53
|
+
const context = options.context ?? {};
|
|
54
|
+
// Classify the task
|
|
55
|
+
const classification = this.config.routingEnabled
|
|
56
|
+
? this.classifier.classify(task, context)
|
|
57
|
+
: this.createDefaultClassification(task);
|
|
58
|
+
console.log(`\n📋 Task Classification:`);
|
|
59
|
+
console.log(` Type: ${classification.taskType}`);
|
|
60
|
+
console.log(` Provider: ${getProviderConfig(classification.recommendedProvider).displayName}`);
|
|
61
|
+
console.log(` Confidence: ${Math.round(classification.confidence * 100)}%`);
|
|
62
|
+
if (classification.keywords.length > 0) {
|
|
63
|
+
console.log(` Keywords: ${classification.keywords.join(', ')}`);
|
|
64
|
+
}
|
|
65
|
+
// Check if multi-agent review is needed
|
|
66
|
+
if (this.config.multiAgentReviewEnabled &&
|
|
67
|
+
this.classifier.isMultiAgentTask(classification.taskType)) {
|
|
68
|
+
console.log(`\n⚖️ Multi-agent review enabled for this task type`);
|
|
69
|
+
// TODO: Implement multi-agent review coordinator
|
|
70
|
+
// For now, fall through to single-provider execution
|
|
71
|
+
}
|
|
72
|
+
// Build provider order
|
|
73
|
+
const providerOrder = [
|
|
74
|
+
classification.recommendedProvider,
|
|
75
|
+
...classification.fallbackProviders,
|
|
76
|
+
];
|
|
77
|
+
const messages = [];
|
|
78
|
+
const fallbacksUsed = [];
|
|
79
|
+
let lastError;
|
|
80
|
+
let successProvider;
|
|
81
|
+
// Try providers in order
|
|
82
|
+
for (const providerName of providerOrder) {
|
|
83
|
+
if (!this.availableProviders.includes(providerName)) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
console.log(`\n🔄 Executing with ${getProviderConfig(providerName).displayName}...`);
|
|
88
|
+
const provider = getProvider(providerName);
|
|
89
|
+
// Execute query
|
|
90
|
+
for await (const message of provider.query(task, options)) {
|
|
91
|
+
messages.push(message);
|
|
92
|
+
yield message;
|
|
93
|
+
// Check for success
|
|
94
|
+
if (message.type === 'result' && message.subtype === 'success') {
|
|
95
|
+
successProvider = providerName;
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (successProvider) {
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
lastError = error instanceof Error ? error.message : String(error);
|
|
105
|
+
console.warn(`Provider ${providerName} failed: ${lastError}`);
|
|
106
|
+
if (providerName !== classification.recommendedProvider) {
|
|
107
|
+
fallbacksUsed.push(providerName);
|
|
108
|
+
}
|
|
109
|
+
if (!this.config.fallbackEnabled) {
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
// Continue to next provider
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
success: !!successProvider,
|
|
118
|
+
provider: successProvider ?? classification.recommendedProvider,
|
|
119
|
+
taskType: classification.taskType,
|
|
120
|
+
classification,
|
|
121
|
+
messages,
|
|
122
|
+
fallbacksUsed,
|
|
123
|
+
error: successProvider ? undefined : lastError,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Create a default classification when routing is disabled
|
|
128
|
+
*/
|
|
129
|
+
createDefaultClassification(task) {
|
|
130
|
+
return {
|
|
131
|
+
taskType: 'general',
|
|
132
|
+
recommendedProvider: this.config.defaultProvider,
|
|
133
|
+
fallbackProviders: this.availableProviders.filter(p => p !== this.config.defaultProvider),
|
|
134
|
+
confidence: 1.0,
|
|
135
|
+
reasoning: 'Routing disabled, using default provider',
|
|
136
|
+
requiredCapabilities: ['tool_use'],
|
|
137
|
+
keywords: [],
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get current configuration
|
|
142
|
+
*/
|
|
143
|
+
getConfig() {
|
|
144
|
+
return { ...this.config };
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Update configuration
|
|
148
|
+
*/
|
|
149
|
+
updateConfig(config) {
|
|
150
|
+
this.config = { ...this.config, ...config };
|
|
151
|
+
if (config.defaultProvider) {
|
|
152
|
+
this.classifier.setDefaultProvider(config.defaultProvider);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get available providers
|
|
157
|
+
*/
|
|
158
|
+
getAvailableProviders() {
|
|
159
|
+
return [...this.availableProviders];
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Check if multi-agent review is available
|
|
163
|
+
*/
|
|
164
|
+
canDoMultiAgentReview() {
|
|
165
|
+
return (this.config.multiAgentReviewEnabled &&
|
|
166
|
+
this.availableProviders.length >= this.config.minReviewProviders);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Get the task classifier for direct access
|
|
170
|
+
*/
|
|
171
|
+
getClassifier() {
|
|
172
|
+
return this.classifier;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Manually classify a task without executing
|
|
176
|
+
*/
|
|
177
|
+
classifyTask(task, context) {
|
|
178
|
+
return this.classifier.classify(task, context);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Get provider recommendation for a task type
|
|
182
|
+
*/
|
|
183
|
+
getRecommendedProvider(taskType) {
|
|
184
|
+
const providers = this.classifier.getProvidersForTask(taskType);
|
|
185
|
+
return providers[0] ?? null;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Create a task orchestrator instance
|
|
190
|
+
*/
|
|
191
|
+
export function createOrchestrator(config) {
|
|
192
|
+
return new TaskOrchestrator(config);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Singleton orchestrator instance
|
|
196
|
+
*/
|
|
197
|
+
let orchestratorInstance = null;
|
|
198
|
+
/**
|
|
199
|
+
* Get or create the orchestrator singleton
|
|
200
|
+
*/
|
|
201
|
+
export async function getOrchestrator(config) {
|
|
202
|
+
if (!orchestratorInstance) {
|
|
203
|
+
orchestratorInstance = createOrchestrator(config);
|
|
204
|
+
await orchestratorInstance.initialize();
|
|
205
|
+
}
|
|
206
|
+
return orchestratorInstance;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Reset the orchestrator singleton (for testing)
|
|
210
|
+
*/
|
|
211
|
+
export function resetOrchestrator() {
|
|
212
|
+
orchestratorInstance = null;
|
|
213
|
+
}
|
|
214
|
+
// Re-export types
|
|
215
|
+
export { TaskClassifier, createTaskClassifier, };
|
|
216
|
+
export default TaskOrchestrator;
|
|
217
|
+
//# sourceMappingURL=index.js.map
|