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.
Files changed (179) hide show
  1. package/CHANGELOG.md +111 -1
  2. package/README.md +7 -0
  3. package/dist/src/adapters.d.ts +6 -1
  4. package/dist/src/adapters.d.ts.map +1 -1
  5. package/dist/src/adapters.js +14 -1
  6. package/dist/src/adapters.js.map +1 -1
  7. package/dist/src/agent.d.ts +50 -0
  8. package/dist/src/agent.d.ts.map +1 -1
  9. package/dist/src/agent.js +734 -316
  10. package/dist/src/agent.js.map +1 -1
  11. package/dist/src/defaults.d.ts +1 -1
  12. package/dist/src/defaults.d.ts.map +1 -1
  13. package/dist/src/defaults.js +2 -0
  14. package/dist/src/defaults.js.map +1 -1
  15. package/dist/src/integrations/agent-registry.d.ts +9 -2
  16. package/dist/src/integrations/agent-registry.d.ts.map +1 -1
  17. package/dist/src/integrations/agent-registry.js +30 -4
  18. package/dist/src/integrations/agent-registry.js.map +1 -1
  19. package/dist/src/integrations/async-subagent.d.ts +135 -0
  20. package/dist/src/integrations/async-subagent.d.ts.map +1 -0
  21. package/dist/src/integrations/async-subagent.js +213 -0
  22. package/dist/src/integrations/async-subagent.js.map +1 -0
  23. package/dist/src/integrations/auto-checkpoint.d.ts +98 -0
  24. package/dist/src/integrations/auto-checkpoint.d.ts.map +1 -0
  25. package/dist/src/integrations/auto-checkpoint.js +252 -0
  26. package/dist/src/integrations/auto-checkpoint.js.map +1 -0
  27. package/dist/src/integrations/budget-pool.d.ts +13 -1
  28. package/dist/src/integrations/budget-pool.d.ts.map +1 -1
  29. package/dist/src/integrations/budget-pool.js +17 -0
  30. package/dist/src/integrations/budget-pool.js.map +1 -1
  31. package/dist/src/integrations/complexity-classifier.d.ts +86 -0
  32. package/dist/src/integrations/complexity-classifier.d.ts.map +1 -0
  33. package/dist/src/integrations/complexity-classifier.js +233 -0
  34. package/dist/src/integrations/complexity-classifier.js.map +1 -0
  35. package/dist/src/integrations/delegation-protocol.d.ts +86 -0
  36. package/dist/src/integrations/delegation-protocol.d.ts.map +1 -0
  37. package/dist/src/integrations/delegation-protocol.js +127 -0
  38. package/dist/src/integrations/delegation-protocol.js.map +1 -0
  39. package/dist/src/integrations/dynamic-budget.d.ts +81 -0
  40. package/dist/src/integrations/dynamic-budget.d.ts.map +1 -0
  41. package/dist/src/integrations/dynamic-budget.js +151 -0
  42. package/dist/src/integrations/dynamic-budget.js.map +1 -0
  43. package/dist/src/integrations/economics.d.ts +44 -1
  44. package/dist/src/integrations/economics.d.ts.map +1 -1
  45. package/dist/src/integrations/economics.js +182 -3
  46. package/dist/src/integrations/economics.js.map +1 -1
  47. package/dist/src/integrations/environment-facts.d.ts +52 -0
  48. package/dist/src/integrations/environment-facts.d.ts.map +1 -0
  49. package/dist/src/integrations/environment-facts.js +84 -0
  50. package/dist/src/integrations/environment-facts.js.map +1 -0
  51. package/dist/src/integrations/index.d.ts +16 -1
  52. package/dist/src/integrations/index.d.ts.map +1 -1
  53. package/dist/src/integrations/index.js +31 -1
  54. package/dist/src/integrations/index.js.map +1 -1
  55. package/dist/src/integrations/injection-budget.d.ts +71 -0
  56. package/dist/src/integrations/injection-budget.d.ts.map +1 -0
  57. package/dist/src/integrations/injection-budget.js +136 -0
  58. package/dist/src/integrations/injection-budget.js.map +1 -0
  59. package/dist/src/integrations/mcp-client.d.ts.map +1 -1
  60. package/dist/src/integrations/mcp-client.js +14 -0
  61. package/dist/src/integrations/mcp-client.js.map +1 -1
  62. package/dist/src/integrations/mcp-custom-tools.d.ts +102 -0
  63. package/dist/src/integrations/mcp-custom-tools.d.ts.map +1 -0
  64. package/dist/src/integrations/mcp-custom-tools.js +232 -0
  65. package/dist/src/integrations/mcp-custom-tools.js.map +1 -0
  66. package/dist/src/integrations/mcp-tool-validator.d.ts +60 -0
  67. package/dist/src/integrations/mcp-tool-validator.d.ts.map +1 -0
  68. package/dist/src/integrations/mcp-tool-validator.js +141 -0
  69. package/dist/src/integrations/mcp-tool-validator.js.map +1 -0
  70. package/dist/src/integrations/routing.d.ts +2 -1
  71. package/dist/src/integrations/routing.d.ts.map +1 -1
  72. package/dist/src/integrations/routing.js.map +1 -1
  73. package/dist/src/integrations/self-improvement.d.ts +90 -0
  74. package/dist/src/integrations/self-improvement.d.ts.map +1 -0
  75. package/dist/src/integrations/self-improvement.js +217 -0
  76. package/dist/src/integrations/self-improvement.js.map +1 -0
  77. package/dist/src/integrations/smart-decomposer.d.ts +4 -0
  78. package/dist/src/integrations/smart-decomposer.d.ts.map +1 -1
  79. package/dist/src/integrations/smart-decomposer.js +55 -28
  80. package/dist/src/integrations/smart-decomposer.js.map +1 -1
  81. package/dist/src/integrations/subagent-output-store.d.ts +91 -0
  82. package/dist/src/integrations/subagent-output-store.d.ts.map +1 -0
  83. package/dist/src/integrations/subagent-output-store.js +257 -0
  84. package/dist/src/integrations/subagent-output-store.js.map +1 -0
  85. package/dist/src/integrations/swarm/index.d.ts +1 -1
  86. package/dist/src/integrations/swarm/index.d.ts.map +1 -1
  87. package/dist/src/integrations/swarm/index.js +1 -1
  88. package/dist/src/integrations/swarm/index.js.map +1 -1
  89. package/dist/src/integrations/swarm/model-selector.d.ts +1 -0
  90. package/dist/src/integrations/swarm/model-selector.d.ts.map +1 -1
  91. package/dist/src/integrations/swarm/model-selector.js +37 -3
  92. package/dist/src/integrations/swarm/model-selector.js.map +1 -1
  93. package/dist/src/integrations/swarm/swarm-config-loader.d.ts +10 -1
  94. package/dist/src/integrations/swarm/swarm-config-loader.d.ts.map +1 -1
  95. package/dist/src/integrations/swarm/swarm-config-loader.js +72 -6
  96. package/dist/src/integrations/swarm/swarm-config-loader.js.map +1 -1
  97. package/dist/src/integrations/swarm/swarm-event-bridge.d.ts.map +1 -1
  98. package/dist/src/integrations/swarm/swarm-event-bridge.js +26 -4
  99. package/dist/src/integrations/swarm/swarm-event-bridge.js.map +1 -1
  100. package/dist/src/integrations/swarm/swarm-events.d.ts +11 -0
  101. package/dist/src/integrations/swarm/swarm-events.d.ts.map +1 -1
  102. package/dist/src/integrations/swarm/swarm-events.js +4 -0
  103. package/dist/src/integrations/swarm/swarm-events.js.map +1 -1
  104. package/dist/src/integrations/swarm/swarm-orchestrator.d.ts +11 -0
  105. package/dist/src/integrations/swarm/swarm-orchestrator.d.ts.map +1 -1
  106. package/dist/src/integrations/swarm/swarm-orchestrator.js +233 -10
  107. package/dist/src/integrations/swarm/swarm-orchestrator.js.map +1 -1
  108. package/dist/src/integrations/swarm/swarm-quality-gate.d.ts +9 -2
  109. package/dist/src/integrations/swarm/swarm-quality-gate.d.ts.map +1 -1
  110. package/dist/src/integrations/swarm/swarm-quality-gate.js +128 -11
  111. package/dist/src/integrations/swarm/swarm-quality-gate.js.map +1 -1
  112. package/dist/src/integrations/swarm/task-queue.d.ts +11 -1
  113. package/dist/src/integrations/swarm/task-queue.d.ts.map +1 -1
  114. package/dist/src/integrations/swarm/task-queue.js +125 -15
  115. package/dist/src/integrations/swarm/task-queue.js.map +1 -1
  116. package/dist/src/integrations/swarm/types.d.ts +40 -1
  117. package/dist/src/integrations/swarm/types.d.ts.map +1 -1
  118. package/dist/src/integrations/swarm/types.js +6 -1
  119. package/dist/src/integrations/swarm/types.js.map +1 -1
  120. package/dist/src/integrations/swarm/worker-pool.d.ts +9 -3
  121. package/dist/src/integrations/swarm/worker-pool.d.ts.map +1 -1
  122. package/dist/src/integrations/swarm/worker-pool.js +89 -17
  123. package/dist/src/integrations/swarm/worker-pool.js.map +1 -1
  124. package/dist/src/integrations/thinking-strategy.d.ts +52 -0
  125. package/dist/src/integrations/thinking-strategy.d.ts.map +1 -0
  126. package/dist/src/integrations/thinking-strategy.js +129 -0
  127. package/dist/src/integrations/thinking-strategy.js.map +1 -0
  128. package/dist/src/integrations/tool-recommendation.d.ts +58 -0
  129. package/dist/src/integrations/tool-recommendation.d.ts.map +1 -0
  130. package/dist/src/integrations/tool-recommendation.js +215 -0
  131. package/dist/src/integrations/tool-recommendation.js.map +1 -0
  132. package/dist/src/integrations/verification-gate.d.ts +80 -0
  133. package/dist/src/integrations/verification-gate.d.ts.map +1 -0
  134. package/dist/src/integrations/verification-gate.js +146 -0
  135. package/dist/src/integrations/verification-gate.js.map +1 -0
  136. package/dist/src/integrations/work-log.d.ts +87 -0
  137. package/dist/src/integrations/work-log.d.ts.map +1 -0
  138. package/dist/src/integrations/work-log.js +275 -0
  139. package/dist/src/integrations/work-log.js.map +1 -0
  140. package/dist/src/main.js +5 -4
  141. package/dist/src/main.js.map +1 -1
  142. package/dist/src/modes.d.ts +6 -0
  143. package/dist/src/modes.d.ts.map +1 -1
  144. package/dist/src/modes.js +73 -2
  145. package/dist/src/modes.js.map +1 -1
  146. package/dist/src/providers/adapters/anthropic.d.ts.map +1 -1
  147. package/dist/src/providers/adapters/anthropic.js +20 -3
  148. package/dist/src/providers/adapters/anthropic.js.map +1 -1
  149. package/dist/src/providers/adapters/openrouter.d.ts.map +1 -1
  150. package/dist/src/providers/adapters/openrouter.js +3 -1
  151. package/dist/src/providers/adapters/openrouter.js.map +1 -1
  152. package/dist/src/providers/types.d.ts +4 -0
  153. package/dist/src/providers/types.d.ts.map +1 -1
  154. package/dist/src/providers/types.js.map +1 -1
  155. package/dist/src/tools/bash.d.ts +8 -2
  156. package/dist/src/tools/bash.d.ts.map +1 -1
  157. package/dist/src/tools/bash.js +14 -1
  158. package/dist/src/tools/bash.js.map +1 -1
  159. package/dist/src/tools/coercion.d.ts +14 -0
  160. package/dist/src/tools/coercion.d.ts.map +1 -0
  161. package/dist/src/tools/coercion.js +25 -0
  162. package/dist/src/tools/coercion.js.map +1 -0
  163. package/dist/src/tools/file.d.ts +2 -2
  164. package/dist/src/tools/file.d.ts.map +1 -1
  165. package/dist/src/tools/file.js +2 -1
  166. package/dist/src/tools/file.js.map +1 -1
  167. package/dist/src/tools/standard.d.ts +17 -1
  168. package/dist/src/tools/standard.d.ts.map +1 -1
  169. package/dist/src/tools/standard.js +64 -11
  170. package/dist/src/tools/standard.js.map +1 -1
  171. package/dist/src/tui/app.d.ts.map +1 -1
  172. package/dist/src/tui/app.js +8 -1
  173. package/dist/src/tui/app.js.map +1 -1
  174. package/dist/src/tui/event-display.d.ts.map +1 -1
  175. package/dist/src/tui/event-display.js +8 -1
  176. package/dist/src/tui/event-display.js.map +1 -1
  177. package/dist/src/types.d.ts +26 -0
  178. package/dist/src/types.d.ts.map +1 -1
  179. 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"}