attocode 0.2.0 → 0.2.2
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/CHANGELOG.md +111 -1
- package/README.md +7 -0
- package/dist/src/adapters.d.ts +6 -1
- package/dist/src/adapters.d.ts.map +1 -1
- package/dist/src/adapters.js +14 -1
- package/dist/src/adapters.js.map +1 -1
- package/dist/src/agent.d.ts +50 -0
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +734 -316
- package/dist/src/agent.js.map +1 -1
- package/dist/src/defaults.d.ts +1 -1
- package/dist/src/defaults.d.ts.map +1 -1
- package/dist/src/defaults.js +2 -0
- package/dist/src/defaults.js.map +1 -1
- package/dist/src/integrations/agent-registry.d.ts +9 -2
- package/dist/src/integrations/agent-registry.d.ts.map +1 -1
- package/dist/src/integrations/agent-registry.js +30 -4
- package/dist/src/integrations/agent-registry.js.map +1 -1
- package/dist/src/integrations/async-subagent.d.ts +135 -0
- package/dist/src/integrations/async-subagent.d.ts.map +1 -0
- package/dist/src/integrations/async-subagent.js +213 -0
- package/dist/src/integrations/async-subagent.js.map +1 -0
- package/dist/src/integrations/auto-checkpoint.d.ts +98 -0
- package/dist/src/integrations/auto-checkpoint.d.ts.map +1 -0
- package/dist/src/integrations/auto-checkpoint.js +252 -0
- package/dist/src/integrations/auto-checkpoint.js.map +1 -0
- package/dist/src/integrations/budget-pool.d.ts +13 -1
- package/dist/src/integrations/budget-pool.d.ts.map +1 -1
- package/dist/src/integrations/budget-pool.js +17 -0
- package/dist/src/integrations/budget-pool.js.map +1 -1
- package/dist/src/integrations/complexity-classifier.d.ts +86 -0
- package/dist/src/integrations/complexity-classifier.d.ts.map +1 -0
- package/dist/src/integrations/complexity-classifier.js +233 -0
- package/dist/src/integrations/complexity-classifier.js.map +1 -0
- package/dist/src/integrations/delegation-protocol.d.ts +86 -0
- package/dist/src/integrations/delegation-protocol.d.ts.map +1 -0
- package/dist/src/integrations/delegation-protocol.js +127 -0
- package/dist/src/integrations/delegation-protocol.js.map +1 -0
- package/dist/src/integrations/dynamic-budget.d.ts +81 -0
- package/dist/src/integrations/dynamic-budget.d.ts.map +1 -0
- package/dist/src/integrations/dynamic-budget.js +151 -0
- package/dist/src/integrations/dynamic-budget.js.map +1 -0
- package/dist/src/integrations/economics.d.ts +44 -1
- package/dist/src/integrations/economics.d.ts.map +1 -1
- package/dist/src/integrations/economics.js +182 -3
- package/dist/src/integrations/economics.js.map +1 -1
- package/dist/src/integrations/environment-facts.d.ts +52 -0
- package/dist/src/integrations/environment-facts.d.ts.map +1 -0
- package/dist/src/integrations/environment-facts.js +84 -0
- package/dist/src/integrations/environment-facts.js.map +1 -0
- package/dist/src/integrations/index.d.ts +16 -1
- package/dist/src/integrations/index.d.ts.map +1 -1
- package/dist/src/integrations/index.js +31 -1
- package/dist/src/integrations/index.js.map +1 -1
- package/dist/src/integrations/injection-budget.d.ts +71 -0
- package/dist/src/integrations/injection-budget.d.ts.map +1 -0
- package/dist/src/integrations/injection-budget.js +136 -0
- package/dist/src/integrations/injection-budget.js.map +1 -0
- package/dist/src/integrations/mcp-client.d.ts.map +1 -1
- package/dist/src/integrations/mcp-client.js +14 -0
- package/dist/src/integrations/mcp-client.js.map +1 -1
- package/dist/src/integrations/mcp-custom-tools.d.ts +102 -0
- package/dist/src/integrations/mcp-custom-tools.d.ts.map +1 -0
- package/dist/src/integrations/mcp-custom-tools.js +232 -0
- package/dist/src/integrations/mcp-custom-tools.js.map +1 -0
- package/dist/src/integrations/mcp-tool-validator.d.ts +60 -0
- package/dist/src/integrations/mcp-tool-validator.d.ts.map +1 -0
- package/dist/src/integrations/mcp-tool-validator.js +141 -0
- package/dist/src/integrations/mcp-tool-validator.js.map +1 -0
- package/dist/src/integrations/routing.d.ts +2 -1
- package/dist/src/integrations/routing.d.ts.map +1 -1
- package/dist/src/integrations/routing.js.map +1 -1
- package/dist/src/integrations/self-improvement.d.ts +90 -0
- package/dist/src/integrations/self-improvement.d.ts.map +1 -0
- package/dist/src/integrations/self-improvement.js +217 -0
- package/dist/src/integrations/self-improvement.js.map +1 -0
- package/dist/src/integrations/smart-decomposer.d.ts +4 -0
- package/dist/src/integrations/smart-decomposer.d.ts.map +1 -1
- package/dist/src/integrations/smart-decomposer.js +55 -28
- package/dist/src/integrations/smart-decomposer.js.map +1 -1
- package/dist/src/integrations/subagent-output-store.d.ts +91 -0
- package/dist/src/integrations/subagent-output-store.d.ts.map +1 -0
- package/dist/src/integrations/subagent-output-store.js +257 -0
- package/dist/src/integrations/subagent-output-store.js.map +1 -0
- package/dist/src/integrations/swarm/index.d.ts +1 -1
- package/dist/src/integrations/swarm/index.d.ts.map +1 -1
- package/dist/src/integrations/swarm/index.js +1 -1
- package/dist/src/integrations/swarm/index.js.map +1 -1
- package/dist/src/integrations/swarm/model-selector.d.ts +1 -0
- package/dist/src/integrations/swarm/model-selector.d.ts.map +1 -1
- package/dist/src/integrations/swarm/model-selector.js +37 -3
- package/dist/src/integrations/swarm/model-selector.js.map +1 -1
- package/dist/src/integrations/swarm/swarm-config-loader.d.ts +10 -1
- package/dist/src/integrations/swarm/swarm-config-loader.d.ts.map +1 -1
- package/dist/src/integrations/swarm/swarm-config-loader.js +72 -6
- package/dist/src/integrations/swarm/swarm-config-loader.js.map +1 -1
- package/dist/src/integrations/swarm/swarm-event-bridge.d.ts.map +1 -1
- package/dist/src/integrations/swarm/swarm-event-bridge.js +26 -4
- package/dist/src/integrations/swarm/swarm-event-bridge.js.map +1 -1
- package/dist/src/integrations/swarm/swarm-events.d.ts +11 -0
- package/dist/src/integrations/swarm/swarm-events.d.ts.map +1 -1
- package/dist/src/integrations/swarm/swarm-events.js +4 -0
- package/dist/src/integrations/swarm/swarm-events.js.map +1 -1
- package/dist/src/integrations/swarm/swarm-orchestrator.d.ts +11 -0
- package/dist/src/integrations/swarm/swarm-orchestrator.d.ts.map +1 -1
- package/dist/src/integrations/swarm/swarm-orchestrator.js +233 -10
- package/dist/src/integrations/swarm/swarm-orchestrator.js.map +1 -1
- package/dist/src/integrations/swarm/swarm-quality-gate.d.ts +9 -2
- package/dist/src/integrations/swarm/swarm-quality-gate.d.ts.map +1 -1
- package/dist/src/integrations/swarm/swarm-quality-gate.js +128 -11
- package/dist/src/integrations/swarm/swarm-quality-gate.js.map +1 -1
- package/dist/src/integrations/swarm/task-queue.d.ts +11 -1
- package/dist/src/integrations/swarm/task-queue.d.ts.map +1 -1
- package/dist/src/integrations/swarm/task-queue.js +125 -15
- package/dist/src/integrations/swarm/task-queue.js.map +1 -1
- package/dist/src/integrations/swarm/types.d.ts +40 -1
- package/dist/src/integrations/swarm/types.d.ts.map +1 -1
- package/dist/src/integrations/swarm/types.js +6 -1
- package/dist/src/integrations/swarm/types.js.map +1 -1
- package/dist/src/integrations/swarm/worker-pool.d.ts +9 -3
- package/dist/src/integrations/swarm/worker-pool.d.ts.map +1 -1
- package/dist/src/integrations/swarm/worker-pool.js +89 -17
- package/dist/src/integrations/swarm/worker-pool.js.map +1 -1
- package/dist/src/integrations/thinking-strategy.d.ts +52 -0
- package/dist/src/integrations/thinking-strategy.d.ts.map +1 -0
- package/dist/src/integrations/thinking-strategy.js +129 -0
- package/dist/src/integrations/thinking-strategy.js.map +1 -0
- package/dist/src/integrations/tool-recommendation.d.ts +58 -0
- package/dist/src/integrations/tool-recommendation.d.ts.map +1 -0
- package/dist/src/integrations/tool-recommendation.js +215 -0
- package/dist/src/integrations/tool-recommendation.js.map +1 -0
- package/dist/src/integrations/verification-gate.d.ts +80 -0
- package/dist/src/integrations/verification-gate.d.ts.map +1 -0
- package/dist/src/integrations/verification-gate.js +146 -0
- package/dist/src/integrations/verification-gate.js.map +1 -0
- package/dist/src/integrations/work-log.d.ts +87 -0
- package/dist/src/integrations/work-log.d.ts.map +1 -0
- package/dist/src/integrations/work-log.js +275 -0
- package/dist/src/integrations/work-log.js.map +1 -0
- package/dist/src/main.js +5 -4
- package/dist/src/main.js.map +1 -1
- package/dist/src/modes.d.ts +6 -0
- package/dist/src/modes.d.ts.map +1 -1
- package/dist/src/modes.js +73 -2
- package/dist/src/modes.js.map +1 -1
- package/dist/src/providers/adapters/anthropic.d.ts.map +1 -1
- package/dist/src/providers/adapters/anthropic.js +20 -3
- package/dist/src/providers/adapters/anthropic.js.map +1 -1
- package/dist/src/providers/adapters/openrouter.d.ts.map +1 -1
- package/dist/src/providers/adapters/openrouter.js +3 -1
- package/dist/src/providers/adapters/openrouter.js.map +1 -1
- package/dist/src/providers/types.d.ts +4 -0
- package/dist/src/providers/types.d.ts.map +1 -1
- package/dist/src/providers/types.js.map +1 -1
- package/dist/src/tools/bash.d.ts +8 -2
- package/dist/src/tools/bash.d.ts.map +1 -1
- package/dist/src/tools/bash.js +14 -1
- package/dist/src/tools/bash.js.map +1 -1
- package/dist/src/tools/coercion.d.ts +14 -0
- package/dist/src/tools/coercion.d.ts.map +1 -0
- package/dist/src/tools/coercion.js +25 -0
- package/dist/src/tools/coercion.js.map +1 -0
- package/dist/src/tools/file.d.ts +2 -2
- package/dist/src/tools/file.d.ts.map +1 -1
- package/dist/src/tools/file.js +2 -1
- package/dist/src/tools/file.js.map +1 -1
- package/dist/src/tools/standard.d.ts +17 -1
- package/dist/src/tools/standard.d.ts.map +1 -1
- package/dist/src/tools/standard.js +64 -11
- package/dist/src/tools/standard.js.map +1 -1
- package/dist/src/tui/app.d.ts.map +1 -1
- package/dist/src/tui/app.js +8 -1
- package/dist/src/tui/app.js.map +1 -1
- package/dist/src/tui/event-display.d.ts.map +1 -1
- package/dist/src/tui/event-display.js +8 -1
- package/dist/src/tui/event-display.js.map +1 -1
- package/dist/src/types.d.ts +26 -0
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Recommendation Engine
|
|
3
|
+
*
|
|
4
|
+
* Heuristic-based tool recommendation for subagents and swarm workers.
|
|
5
|
+
* Maps task types to tool categories and analyzes task descriptions
|
|
6
|
+
* for tool-relevant keywords.
|
|
7
|
+
*
|
|
8
|
+
* Key features:
|
|
9
|
+
* - Static task-type → tool-category mappings (no LLM call needed)
|
|
10
|
+
* - Keyword analysis for MCP tool preloading
|
|
11
|
+
* - Tool filtering for subagent specialization
|
|
12
|
+
*/
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// CONSTANTS
|
|
15
|
+
// =============================================================================
|
|
16
|
+
/**
|
|
17
|
+
* Static mapping from subtask types to tool categories.
|
|
18
|
+
* Core heuristic: task type determines which tools are most useful.
|
|
19
|
+
*/
|
|
20
|
+
const TASK_TYPE_TOOL_MAP = {
|
|
21
|
+
research: [
|
|
22
|
+
{ name: 'file_reading', tools: ['read_file', 'glob', 'grep', 'list_files', 'search_files', 'search_code', 'get_file_info'], relevance: 1.0 },
|
|
23
|
+
{ name: 'bash_readonly', tools: ['bash'], relevance: 0.5 },
|
|
24
|
+
],
|
|
25
|
+
analysis: [
|
|
26
|
+
{ name: 'file_reading', tools: ['read_file', 'glob', 'grep', 'list_files', 'search_files', 'search_code'], relevance: 1.0 },
|
|
27
|
+
{ name: 'bash_readonly', tools: ['bash'], relevance: 0.6 },
|
|
28
|
+
],
|
|
29
|
+
design: [
|
|
30
|
+
{ name: 'file_reading', tools: ['read_file', 'glob', 'grep', 'list_files'], relevance: 0.9 },
|
|
31
|
+
{ name: 'file_writing', tools: ['write_file'], relevance: 0.4 },
|
|
32
|
+
],
|
|
33
|
+
implement: [
|
|
34
|
+
{ name: 'file_reading', tools: ['read_file', 'glob', 'grep', 'list_files'], relevance: 0.8 },
|
|
35
|
+
{ name: 'file_writing', tools: ['write_file', 'edit_file'], relevance: 1.0 },
|
|
36
|
+
{ name: 'execution', tools: ['bash'], relevance: 0.7 },
|
|
37
|
+
],
|
|
38
|
+
test: [
|
|
39
|
+
{ name: 'execution', tools: ['bash'], relevance: 1.0 },
|
|
40
|
+
{ name: 'file_reading', tools: ['read_file', 'glob', 'grep'], relevance: 0.7 },
|
|
41
|
+
{ name: 'file_writing', tools: ['write_file', 'edit_file'], relevance: 0.5 },
|
|
42
|
+
],
|
|
43
|
+
refactor: [
|
|
44
|
+
{ name: 'file_reading', tools: ['read_file', 'glob', 'grep', 'list_files', 'search_code'], relevance: 0.9 },
|
|
45
|
+
{ name: 'file_writing', tools: ['write_file', 'edit_file'], relevance: 1.0 },
|
|
46
|
+
{ name: 'execution', tools: ['bash'], relevance: 0.5 },
|
|
47
|
+
],
|
|
48
|
+
review: [
|
|
49
|
+
{ name: 'file_reading', tools: ['read_file', 'glob', 'grep', 'list_files', 'search_files'], relevance: 1.0 },
|
|
50
|
+
{ name: 'bash_readonly', tools: ['bash'], relevance: 0.3 },
|
|
51
|
+
],
|
|
52
|
+
document: [
|
|
53
|
+
{ name: 'file_reading', tools: ['read_file', 'glob', 'grep'], relevance: 0.8 },
|
|
54
|
+
{ name: 'file_writing', tools: ['write_file', 'edit_file'], relevance: 1.0 },
|
|
55
|
+
],
|
|
56
|
+
integrate: [
|
|
57
|
+
{ name: 'file_reading', tools: ['read_file', 'glob', 'grep'], relevance: 0.8 },
|
|
58
|
+
{ name: 'file_writing', tools: ['write_file', 'edit_file'], relevance: 0.9 },
|
|
59
|
+
{ name: 'execution', tools: ['bash'], relevance: 0.8 },
|
|
60
|
+
],
|
|
61
|
+
deploy: [
|
|
62
|
+
{ name: 'execution', tools: ['bash'], relevance: 1.0 },
|
|
63
|
+
{ name: 'file_reading', tools: ['read_file', 'glob'], relevance: 0.5 },
|
|
64
|
+
{ name: 'file_writing', tools: ['write_file', 'edit_file'], relevance: 0.4 },
|
|
65
|
+
],
|
|
66
|
+
merge: [
|
|
67
|
+
{ name: 'file_reading', tools: ['read_file', 'glob', 'grep'], relevance: 0.9 },
|
|
68
|
+
{ name: 'file_writing', tools: ['write_file', 'edit_file'], relevance: 1.0 },
|
|
69
|
+
{ name: 'execution', tools: ['bash'], relevance: 0.5 },
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Keyword patterns that suggest specific MCP tools.
|
|
74
|
+
*/
|
|
75
|
+
const MCP_KEYWORD_PATTERNS = [
|
|
76
|
+
{
|
|
77
|
+
keywords: ['browser', 'screenshot', 'click', 'navigate', 'page', 'web page', 'UI test'],
|
|
78
|
+
mcpPrefix: 'mcp_playwright',
|
|
79
|
+
description: 'Playwright browser automation',
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
keywords: ['database', 'sql', 'query', 'table', 'schema'],
|
|
83
|
+
mcpPrefix: 'mcp_sqlite',
|
|
84
|
+
description: 'SQLite database operations',
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
keywords: ['documentation', 'library docs', 'api docs', 'npm package'],
|
|
88
|
+
mcpPrefix: 'mcp_context7',
|
|
89
|
+
description: 'Context7 documentation lookup',
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
keywords: ['web search', 'google', 'search online', 'look up'],
|
|
93
|
+
mcpPrefix: 'mcp_serper',
|
|
94
|
+
description: 'Web search via Serper',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
keywords: ['github', 'pull request', 'issue', 'repository'],
|
|
98
|
+
mcpPrefix: 'mcp_github',
|
|
99
|
+
description: 'GitHub API operations',
|
|
100
|
+
},
|
|
101
|
+
];
|
|
102
|
+
// =============================================================================
|
|
103
|
+
// ENGINE
|
|
104
|
+
// =============================================================================
|
|
105
|
+
export class ToolRecommendationEngine {
|
|
106
|
+
config;
|
|
107
|
+
constructor(config) {
|
|
108
|
+
this.config = {
|
|
109
|
+
maxToolsPerAgent: config?.maxToolsPerAgent ?? 15,
|
|
110
|
+
enablePreloading: config?.enablePreloading ?? true,
|
|
111
|
+
taskToolOverrides: config?.taskToolOverrides ?? {},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Recommend tools for a task based on type and description.
|
|
116
|
+
*/
|
|
117
|
+
recommendTools(taskDescription, taskType, availableToolNames) {
|
|
118
|
+
const recommendations = new Map();
|
|
119
|
+
const availableSet = new Set(availableToolNames);
|
|
120
|
+
// Phase 1: Task-type based recommendations
|
|
121
|
+
const categories = this.config.taskToolOverrides[taskType]
|
|
122
|
+
? [{ name: 'override', tools: this.config.taskToolOverrides[taskType], relevance: 1.0 }]
|
|
123
|
+
: (TASK_TYPE_TOOL_MAP[taskType] || []);
|
|
124
|
+
for (const category of categories) {
|
|
125
|
+
for (const toolName of category.tools) {
|
|
126
|
+
if (availableSet.has(toolName) && !recommendations.has(toolName)) {
|
|
127
|
+
recommendations.set(toolName, {
|
|
128
|
+
toolName,
|
|
129
|
+
relevanceScore: category.relevance,
|
|
130
|
+
reason: `${category.name} tool for ${taskType} tasks`,
|
|
131
|
+
source: 'builtin',
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Phase 2: Keyword-based MCP tool recommendations
|
|
137
|
+
const taskLower = taskDescription.toLowerCase();
|
|
138
|
+
for (const pattern of MCP_KEYWORD_PATTERNS) {
|
|
139
|
+
const matchCount = pattern.keywords.filter(kw => taskLower.includes(kw)).length;
|
|
140
|
+
if (matchCount > 0) {
|
|
141
|
+
// Find available MCP tools matching the prefix
|
|
142
|
+
for (const toolName of availableToolNames) {
|
|
143
|
+
if (toolName.startsWith(pattern.mcpPrefix) && !recommendations.has(toolName)) {
|
|
144
|
+
const relevance = Math.min(0.5 + matchCount * 0.15, 1.0);
|
|
145
|
+
recommendations.set(toolName, {
|
|
146
|
+
toolName,
|
|
147
|
+
relevanceScore: relevance,
|
|
148
|
+
reason: `${pattern.description} (matched: ${matchCount} keywords)`,
|
|
149
|
+
source: 'mcp',
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Phase 3: Always include spawn_agent for complex tasks
|
|
156
|
+
if (availableSet.has('spawn_agent') && !recommendations.has('spawn_agent')) {
|
|
157
|
+
recommendations.set('spawn_agent', {
|
|
158
|
+
toolName: 'spawn_agent',
|
|
159
|
+
relevanceScore: 0.3,
|
|
160
|
+
reason: 'Available for delegation',
|
|
161
|
+
source: 'builtin',
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
// Sort by relevance and limit
|
|
165
|
+
return [...recommendations.values()]
|
|
166
|
+
.sort((a, b) => b.relevanceScore - a.relevanceScore)
|
|
167
|
+
.slice(0, this.config.maxToolsPerAgent);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get MCP tool prefixes that should be preloaded for a task type.
|
|
171
|
+
*/
|
|
172
|
+
getMCPPreloadPrefixes(taskDescription) {
|
|
173
|
+
if (!this.config.enablePreloading)
|
|
174
|
+
return [];
|
|
175
|
+
const taskLower = taskDescription.toLowerCase();
|
|
176
|
+
const prefixes = [];
|
|
177
|
+
for (const pattern of MCP_KEYWORD_PATTERNS) {
|
|
178
|
+
const matches = pattern.keywords.filter(kw => taskLower.includes(kw));
|
|
179
|
+
if (matches.length > 0) {
|
|
180
|
+
prefixes.push(pattern.mcpPrefix);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return prefixes;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Filter tools for an agent based on task type.
|
|
187
|
+
* Returns tool names that should be available to the agent.
|
|
188
|
+
*/
|
|
189
|
+
getToolFilterForTaskType(taskType, availableToolNames) {
|
|
190
|
+
const recommendations = this.recommendTools('', taskType, availableToolNames);
|
|
191
|
+
return recommendations.map(r => r.toolName);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Infer a SubtaskType from an agent name.
|
|
195
|
+
*/
|
|
196
|
+
static inferTaskType(agentName) {
|
|
197
|
+
const nameToType = {
|
|
198
|
+
researcher: 'research',
|
|
199
|
+
coder: 'implement',
|
|
200
|
+
reviewer: 'review',
|
|
201
|
+
architect: 'design',
|
|
202
|
+
debugger: 'analysis',
|
|
203
|
+
tester: 'test',
|
|
204
|
+
documenter: 'document',
|
|
205
|
+
};
|
|
206
|
+
return nameToType[agentName.toLowerCase()] || 'research';
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Create a tool recommendation engine with optional config.
|
|
211
|
+
*/
|
|
212
|
+
export function createToolRecommendationEngine(config) {
|
|
213
|
+
return new ToolRecommendationEngine(config);
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=tool-recommendation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-recommendation.js","sourceRoot":"","sources":["../../../src/integrations/tool-recommendation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verification Gate - Opt-in Completion Verification
|
|
3
|
+
*
|
|
4
|
+
* Prevents premature completion by checking if required verification
|
|
5
|
+
* steps (like running tests) have been performed before allowing
|
|
6
|
+
* the agent to stop.
|
|
7
|
+
*
|
|
8
|
+
* Configuration:
|
|
9
|
+
* - TUI mode: off by default
|
|
10
|
+
* - Eval mode: auto-configured from FAIL_TO_PASS tests
|
|
11
|
+
* - Swarm mode: set by orchestrator per worker
|
|
12
|
+
*/
|
|
13
|
+
export interface VerificationCriteria {
|
|
14
|
+
/** Tests that must be run (e.g., pytest test paths) */
|
|
15
|
+
requiredTests?: string[];
|
|
16
|
+
/** Must have edited at least one file */
|
|
17
|
+
requireFileChanges?: boolean;
|
|
18
|
+
/** Max nudges before giving up and allowing completion */
|
|
19
|
+
maxAttempts?: number;
|
|
20
|
+
}
|
|
21
|
+
export interface VerificationState {
|
|
22
|
+
/** Tests that have been detected as run */
|
|
23
|
+
testsRun: Set<string>;
|
|
24
|
+
/** Whether any test passed */
|
|
25
|
+
anyTestPassed: boolean;
|
|
26
|
+
/** Whether file changes were made */
|
|
27
|
+
hasFileChanges: boolean;
|
|
28
|
+
/** Number of verification nudges already sent */
|
|
29
|
+
nudgeCount: number;
|
|
30
|
+
}
|
|
31
|
+
export interface VerificationCheckResult {
|
|
32
|
+
/** Whether verification criteria are satisfied */
|
|
33
|
+
satisfied: boolean;
|
|
34
|
+
/** If not satisfied, a nudge message to inject */
|
|
35
|
+
nudge?: string;
|
|
36
|
+
/** If max attempts exceeded, allow anyway */
|
|
37
|
+
forceAllow: boolean;
|
|
38
|
+
/** What's still missing */
|
|
39
|
+
missing: string[];
|
|
40
|
+
}
|
|
41
|
+
export declare class VerificationGate {
|
|
42
|
+
private criteria;
|
|
43
|
+
private state;
|
|
44
|
+
constructor(criteria: VerificationCriteria);
|
|
45
|
+
/**
|
|
46
|
+
* Record that a bash command was executed.
|
|
47
|
+
* Detects test execution from command patterns and output.
|
|
48
|
+
*/
|
|
49
|
+
recordBashExecution(command: string, output: string, exitCode: number | null): void;
|
|
50
|
+
/**
|
|
51
|
+
* Record that a file was modified.
|
|
52
|
+
*/
|
|
53
|
+
recordFileChange(): void;
|
|
54
|
+
/**
|
|
55
|
+
* Check if the agent can complete.
|
|
56
|
+
* Returns satisfied=true if criteria are met, or a nudge message if not.
|
|
57
|
+
*/
|
|
58
|
+
check(): VerificationCheckResult;
|
|
59
|
+
/**
|
|
60
|
+
* Get the current verification state.
|
|
61
|
+
*/
|
|
62
|
+
getState(): {
|
|
63
|
+
testsRun: number;
|
|
64
|
+
anyTestPassed: boolean;
|
|
65
|
+
hasFileChanges: boolean;
|
|
66
|
+
nudgeCount: number;
|
|
67
|
+
maxAttempts: number;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Reset the gate state (for reuse).
|
|
71
|
+
*/
|
|
72
|
+
reset(): void;
|
|
73
|
+
private buildNudge;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Create a verification gate from criteria.
|
|
77
|
+
* Returns null if no criteria provided (gate disabled).
|
|
78
|
+
*/
|
|
79
|
+
export declare function createVerificationGate(criteria?: VerificationCriteria | null): VerificationGate | null;
|
|
80
|
+
//# sourceMappingURL=verification-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification-gate.d.ts","sourceRoot":"","sources":["../../../src/integrations/verification-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,MAAM,WAAW,oBAAoB;IACnC,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,yCAAyC;IACzC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,8BAA8B;IAC9B,aAAa,EAAE,OAAO,CAAC;IACvB,qCAAqC;IACrC,cAAc,EAAE,OAAO,CAAC;IACxB,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,kDAAkD;IAClD,SAAS,EAAE,OAAO,CAAC;IACnB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,UAAU,EAAE,OAAO,CAAC;IACpB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAMD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,KAAK,CAAoB;gBAErB,QAAQ,EAAE,oBAAoB;IAe1C;;;OAGG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAoBnF;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAIxB;;;OAGG;IACH,KAAK,IAAI,uBAAuB;IAkChC;;OAEG;IACH,QAAQ,IAAI;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,OAAO,CAAC;QACvB,cAAc,EAAE,OAAO,CAAC;QACxB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB;IAUD;;OAEG;IACH,KAAK,IAAI,IAAI;IAab,OAAO,CAAC,UAAU;CAcnB;AAMD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,CAAC,EAAE,oBAAoB,GAAG,IAAI,GACrC,gBAAgB,GAAG,IAAI,CAKzB"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verification Gate - Opt-in Completion Verification
|
|
3
|
+
*
|
|
4
|
+
* Prevents premature completion by checking if required verification
|
|
5
|
+
* steps (like running tests) have been performed before allowing
|
|
6
|
+
* the agent to stop.
|
|
7
|
+
*
|
|
8
|
+
* Configuration:
|
|
9
|
+
* - TUI mode: off by default
|
|
10
|
+
* - Eval mode: auto-configured from FAIL_TO_PASS tests
|
|
11
|
+
* - Swarm mode: set by orchestrator per worker
|
|
12
|
+
*/
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// VERIFICATION GATE
|
|
15
|
+
// =============================================================================
|
|
16
|
+
export class VerificationGate {
|
|
17
|
+
criteria;
|
|
18
|
+
state;
|
|
19
|
+
constructor(criteria) {
|
|
20
|
+
this.criteria = {
|
|
21
|
+
requiredTests: criteria.requiredTests,
|
|
22
|
+
requireFileChanges: criteria.requireFileChanges ?? false,
|
|
23
|
+
maxAttempts: criteria.maxAttempts ?? 2,
|
|
24
|
+
};
|
|
25
|
+
this.state = {
|
|
26
|
+
testsRun: new Set(),
|
|
27
|
+
anyTestPassed: false,
|
|
28
|
+
hasFileChanges: false,
|
|
29
|
+
nudgeCount: 0,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Record that a bash command was executed.
|
|
34
|
+
* Detects test execution from command patterns and output.
|
|
35
|
+
*/
|
|
36
|
+
recordBashExecution(command, output, exitCode) {
|
|
37
|
+
// Detect pytest/test runs
|
|
38
|
+
const isTestRun = /pytest|python\s+-m\s+pytest/.test(command);
|
|
39
|
+
if (isTestRun) {
|
|
40
|
+
this.state.testsRun.add(command);
|
|
41
|
+
if (exitCode === 0) {
|
|
42
|
+
this.state.anyTestPassed = true;
|
|
43
|
+
}
|
|
44
|
+
// Check if specific required tests were run
|
|
45
|
+
if (this.criteria.requiredTests) {
|
|
46
|
+
for (const req of this.criteria.requiredTests) {
|
|
47
|
+
if (command.includes(req) || output.includes(req)) {
|
|
48
|
+
this.state.testsRun.add(req);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Record that a file was modified.
|
|
56
|
+
*/
|
|
57
|
+
recordFileChange() {
|
|
58
|
+
this.state.hasFileChanges = true;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check if the agent can complete.
|
|
62
|
+
* Returns satisfied=true if criteria are met, or a nudge message if not.
|
|
63
|
+
*/
|
|
64
|
+
check() {
|
|
65
|
+
const missing = [];
|
|
66
|
+
// Check file changes
|
|
67
|
+
if (this.criteria.requireFileChanges && !this.state.hasFileChanges) {
|
|
68
|
+
missing.push('No file changes made');
|
|
69
|
+
}
|
|
70
|
+
// Check required tests
|
|
71
|
+
if (this.criteria.requiredTests && this.criteria.requiredTests.length > 0) {
|
|
72
|
+
if (this.state.testsRun.size === 0) {
|
|
73
|
+
missing.push('Required tests have not been run');
|
|
74
|
+
}
|
|
75
|
+
else if (!this.state.anyTestPassed) {
|
|
76
|
+
missing.push('Tests ran but none passed');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// All criteria met
|
|
80
|
+
if (missing.length === 0) {
|
|
81
|
+
return { satisfied: true, forceAllow: false, missing: [] };
|
|
82
|
+
}
|
|
83
|
+
// Max nudges exceeded - allow anyway
|
|
84
|
+
if (this.state.nudgeCount >= (this.criteria.maxAttempts ?? 2)) {
|
|
85
|
+
return { satisfied: false, forceAllow: true, missing };
|
|
86
|
+
}
|
|
87
|
+
// Generate nudge
|
|
88
|
+
this.state.nudgeCount++;
|
|
89
|
+
const nudge = this.buildNudge(missing);
|
|
90
|
+
return { satisfied: false, forceAllow: false, nudge, missing };
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get the current verification state.
|
|
94
|
+
*/
|
|
95
|
+
getState() {
|
|
96
|
+
return {
|
|
97
|
+
testsRun: this.state.testsRun.size,
|
|
98
|
+
anyTestPassed: this.state.anyTestPassed,
|
|
99
|
+
hasFileChanges: this.state.hasFileChanges,
|
|
100
|
+
nudgeCount: this.state.nudgeCount,
|
|
101
|
+
maxAttempts: this.criteria.maxAttempts ?? 2,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Reset the gate state (for reuse).
|
|
106
|
+
*/
|
|
107
|
+
reset() {
|
|
108
|
+
this.state = {
|
|
109
|
+
testsRun: new Set(),
|
|
110
|
+
anyTestPassed: false,
|
|
111
|
+
hasFileChanges: false,
|
|
112
|
+
nudgeCount: 0,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
// PRIVATE
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
buildNudge(missing) {
|
|
119
|
+
const parts = ['[System] Verification incomplete:'];
|
|
120
|
+
for (const m of missing) {
|
|
121
|
+
parts.push(`- ${m}`);
|
|
122
|
+
}
|
|
123
|
+
if (this.criteria.requiredTests && this.criteria.requiredTests.length > 0) {
|
|
124
|
+
const testCmd = `python -m pytest ${this.criteria.requiredTests.join(' ')} -xvs`;
|
|
125
|
+
parts.push(`\nRun the required tests now: \`${testCmd}\``);
|
|
126
|
+
}
|
|
127
|
+
parts.push('Do NOT finish until verification is complete.');
|
|
128
|
+
return parts.join('\n');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// =============================================================================
|
|
132
|
+
// FACTORY
|
|
133
|
+
// =============================================================================
|
|
134
|
+
/**
|
|
135
|
+
* Create a verification gate from criteria.
|
|
136
|
+
* Returns null if no criteria provided (gate disabled).
|
|
137
|
+
*/
|
|
138
|
+
export function createVerificationGate(criteria) {
|
|
139
|
+
if (!criteria)
|
|
140
|
+
return null;
|
|
141
|
+
// Only create if there's something to verify
|
|
142
|
+
if (!criteria.requiredTests?.length && !criteria.requireFileChanges)
|
|
143
|
+
return null;
|
|
144
|
+
return new VerificationGate(criteria);
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=verification-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification-gate.js","sourceRoot":"","sources":["../../../src/integrations/verification-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Work Log - Compaction-Resilient Structured Summary
|
|
3
|
+
*
|
|
4
|
+
* Maintains a persistent structured summary of agent work that survives
|
|
5
|
+
* context compaction. Auto-populated from tool execution results.
|
|
6
|
+
*
|
|
7
|
+
* When context is compacted, the work log is injected as a system message
|
|
8
|
+
* so the agent doesn't "forget" what it has already done (preventing
|
|
9
|
+
* re-reading files, re-searching, etc.).
|
|
10
|
+
*/
|
|
11
|
+
export interface WorkLogEntry {
|
|
12
|
+
timestamp: number;
|
|
13
|
+
type: 'file_read' | 'file_edit' | 'search' | 'test_run' | 'command' | 'approach';
|
|
14
|
+
summary: string;
|
|
15
|
+
}
|
|
16
|
+
export interface TestResult {
|
|
17
|
+
test: string;
|
|
18
|
+
passed: boolean;
|
|
19
|
+
error?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ApproachEntry {
|
|
22
|
+
approach: string;
|
|
23
|
+
outcome: 'success' | 'failure' | 'partial';
|
|
24
|
+
detail?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface WorkLogConfig {
|
|
27
|
+
/** Maximum number of entries per category before oldest are dropped */
|
|
28
|
+
maxEntriesPerCategory?: number;
|
|
29
|
+
/** Maximum token count for compact output */
|
|
30
|
+
maxCompactTokens?: number;
|
|
31
|
+
}
|
|
32
|
+
export declare class WorkLog {
|
|
33
|
+
private currentHypothesis;
|
|
34
|
+
private filesRead;
|
|
35
|
+
private filesModified;
|
|
36
|
+
private testResults;
|
|
37
|
+
private approachesTried;
|
|
38
|
+
private commands;
|
|
39
|
+
private config;
|
|
40
|
+
constructor(config?: WorkLogConfig);
|
|
41
|
+
/**
|
|
42
|
+
* Record a tool execution result into the work log.
|
|
43
|
+
* Called automatically after each tool call in agent.ts.
|
|
44
|
+
*/
|
|
45
|
+
recordToolExecution(toolName: string, args: Record<string, unknown>, result?: unknown): void;
|
|
46
|
+
/**
|
|
47
|
+
* Record an approach the agent tried and its outcome.
|
|
48
|
+
*/
|
|
49
|
+
recordApproach(approach: string, outcome: ApproachEntry['outcome'], detail?: string): void;
|
|
50
|
+
/**
|
|
51
|
+
* Set the current working hypothesis.
|
|
52
|
+
*/
|
|
53
|
+
setHypothesis(hypothesis: string): void;
|
|
54
|
+
/**
|
|
55
|
+
* Generate a compact string representation (~500 tokens) for injection
|
|
56
|
+
* after context compaction.
|
|
57
|
+
*/
|
|
58
|
+
toCompactString(): string;
|
|
59
|
+
/**
|
|
60
|
+
* Produce a truncated compact string that fits within the character budget.
|
|
61
|
+
* Keeps fewer entries per category to stay within limits.
|
|
62
|
+
*/
|
|
63
|
+
private toCompactStringTruncated;
|
|
64
|
+
/**
|
|
65
|
+
* Check if the work log has any content worth injecting.
|
|
66
|
+
*/
|
|
67
|
+
hasContent(): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Get basic stats about the work log.
|
|
70
|
+
*/
|
|
71
|
+
getStats(): {
|
|
72
|
+
filesRead: number;
|
|
73
|
+
filesModified: number;
|
|
74
|
+
testResults: number;
|
|
75
|
+
approaches: number;
|
|
76
|
+
commands: number;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Reset the work log.
|
|
80
|
+
*/
|
|
81
|
+
reset(): void;
|
|
82
|
+
private summarizeFileContent;
|
|
83
|
+
private parseTestResults;
|
|
84
|
+
private trimMap;
|
|
85
|
+
}
|
|
86
|
+
export declare function createWorkLog(config?: WorkLogConfig): WorkLog;
|
|
87
|
+
//# sourceMappingURL=work-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-log.d.ts","sourceRoot":"","sources":["../../../src/integrations/work-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;IACjF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,uEAAuE;IACvE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAMD,qBAAa,OAAO;IAClB,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,MAAM,CAA0B;gBAE5B,MAAM,GAAE,aAAkB;IAOtC;;;OAGG;IACH,mBAAmB,CACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,CAAC,EAAE,OAAO,GACf,IAAI;IAyDP;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAO1F;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIvC;;;OAGG;IACH,eAAe,IAAI,MAAM;IAiEzB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAyDhC;;OAEG;IACH,UAAU,IAAI,OAAO;IAOrB;;OAEG;IACH,QAAQ,IAAI;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB;IAUD;;OAEG;IACH,KAAK,IAAI,IAAI;IAab,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,OAAO;CAQhB;AAMD,wBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAE7D"}
|