codehere 0.2.2 → 0.3.0-rc.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/README.md +88 -68
- package/dist/domain/entities/task.js +4 -4
- package/dist/error-handler.js +4 -9
- package/dist/index.js +253 -1219
- package/dist/infrastructure/config/product-context.js +7 -6
- package/dist/infrastructure/hooks/claude-sdk-hook.js +348 -72
- package/dist/infrastructure/observability/execution-tracer.js +11 -6
- package/dist/infrastructure/orchestration/agent-adapter.js +13 -0
- package/dist/infrastructure/orchestration/agent-installer.js +101 -0
- package/dist/infrastructure/orchestration/agents-config-seed.js +56 -0
- package/dist/infrastructure/orchestration/aider-adapter.js +319 -0
- package/dist/infrastructure/orchestration/artifacts-extractor.js +175 -0
- package/dist/infrastructure/orchestration/claude-code-adapter.js +352 -0
- package/dist/infrastructure/orchestration/codex-adapter.js +310 -0
- package/dist/infrastructure/orchestration/generic-cli-adapter.js +553 -0
- package/dist/infrastructure/orchestration/opencode-adapter.js +275 -0
- package/dist/infrastructure/orchestration/progress-aggregator.js +189 -0
- package/dist/infrastructure/orchestration/readiness.js +106 -0
- package/dist/infrastructure/orchestration/session-manager.js +272 -0
- package/dist/infrastructure/orchestration/session-persistence.js +109 -0
- package/dist/infrastructure/protocols/mcp-helpers.js +10 -30
- package/dist/infrastructure/protocols/mcp-server-impl.js +359 -21
- package/dist/infrastructure/protocols/ui-page.js +1827 -0
- package/dist/infrastructure/security/file-collection.js +115 -0
- package/dist/infrastructure/security/trust-scorer.js +301 -56
- package/dist/infrastructure/storage/task-repository.js +8 -7
- package/dist/monitoring.js +9 -38
- package/dist/presentation/cli/commands/help-command.js +96 -139
- package/dist/presentation/cli/commands/hook-command.js +17 -24
- package/dist/presentation/cli/commands/report-command.js +59 -72
- package/dist/presentation/cli/commands/setup-command.js +4 -4
- package/dist/presentation/cli/commands/status-command.js +321 -30
- package/dist/presentation/cli/commands/trust-command.js +84 -72
- package/dist/presentation/cli/error-display.js +17 -21
- package/dist/ui.js +11 -11
- package/package.json +24 -62
- package/dist/agents/base.js +0 -101
- package/dist/agents/orchestrator-model-driven.js +0 -141
- package/dist/agents/react-orchestrator-agent.js +0 -54
- package/dist/application/agents/execution-agent.js +0 -508
- package/dist/application/agents/multi-agent-orchestrator.js +0 -295
- package/dist/application/agents/planning-agent.js +0 -433
- package/dist/application/agents/validation-agent.js +0 -317
- package/dist/application/architectures/plan-and-act.js +0 -242
- package/dist/application/index.js +0 -12
- package/dist/application/services/agent-factory.js +0 -28
- package/dist/application/services/dependency-container.js +0 -596
- package/dist/application/services/git-context-service.js +0 -83
- package/dist/application/services/intelligent-router.js +0 -934
- package/dist/application/services/tool-executor-service.js +0 -94
- package/dist/application/use-cases/ask-question-use-case.js +0 -338
- package/dist/application/use-cases/edit-file-use-case.js +0 -830
- package/dist/application/use-cases/explain-file-use-case.js +0 -50
- package/dist/application/use-cases/index-codebase-use-case.js +0 -113
- package/dist/application/use-cases/planning-use-case.js +0 -276
- package/dist/application/use-cases/react-orchestration-use-case.js +0 -329
- package/dist/application/use-cases/reflexion-use-case.js +0 -30
- package/dist/application/workflows/deterministic-workflows.js +0 -189
- package/dist/ast-parser.js +0 -331
- package/dist/cache.js +0 -180
- package/dist/chat.js +0 -251
- package/dist/code-analysis.js +0 -327
- package/dist/context.js +0 -187
- package/dist/docs.js +0 -146
- package/dist/domain/entities/code-chunk.js +0 -6
- package/dist/domain/entities/decision.js +0 -9
- package/dist/domain/entities/edit.js +0 -6
- package/dist/domain/entities/knowledge-node.js +0 -9
- package/dist/domain/entities/knowledge-preservation.js +0 -10
- package/dist/domain/entities/memory.js +0 -6
- package/dist/domain/entities/pattern.js +0 -7
- package/dist/domain/entities/plan.js +0 -6
- package/dist/domain/entities/query.js +0 -6
- package/dist/domain/errors/embeddings-not-found-error.js +0 -13
- package/dist/domain/index.js +0 -19
- package/dist/domain/interfaces/ai-service.interface.js +0 -6
- package/dist/domain/interfaces/code-analyzer.interface.js +0 -6
- package/dist/domain/interfaces/decision-repository.interface.js +0 -9
- package/dist/domain/interfaces/embedding-repository.interface.js +0 -6
- package/dist/domain/interfaces/knowledge-graph-repository.interface.js +0 -9
- package/dist/domain/interfaces/knowledge-preservation-repository.interface.js +0 -8
- package/dist/domain/interfaces/memory-repository.interface.js +0 -6
- package/dist/domain/interfaces/pattern-repository.interface.js +0 -6
- package/dist/domain/interfaces/verification-service.interface.js +0 -6
- package/dist/domain/services/cross-team-pattern-sharing.js +0 -125
- package/dist/domain/services/decision-recorder.js +0 -223
- package/dist/domain/services/decision-retriever.js +0 -133
- package/dist/domain/services/environment-mode-manager.js +0 -22
- package/dist/domain/services/graded-memory-activation.js +0 -69
- package/dist/domain/services/knowledge-access.js +0 -132
- package/dist/domain/services/knowledge-extractor.js +0 -247
- package/dist/domain/services/knowledge-graph-builder.js +0 -268
- package/dist/domain/services/knowledge-graph-query.js +0 -187
- package/dist/domain/services/memory-retriever.js +0 -82
- package/dist/domain/services/memory-synthesizer.js +0 -91
- package/dist/domain/services/pattern-extractor.js +0 -442
- package/dist/domain/services/query-intent-classifier.js +0 -140
- package/dist/domain/services/react-loop.js +0 -186
- package/dist/domain/services/risk-tier-detector.js +0 -78
- package/dist/edit.js +0 -319
- package/dist/embed.js +0 -459
- package/dist/formatter.js +0 -168
- package/dist/git.js +0 -198
- package/dist/infrastructure/ai/cohere-ai-service.js +0 -607
- package/dist/infrastructure/ai/command-r-evaluation.js +0 -206
- package/dist/infrastructure/ai/model-config.js +0 -84
- package/dist/infrastructure/ai/provider-ai-service.js +0 -477
- package/dist/infrastructure/cache/embedding-cache.js +0 -175
- package/dist/infrastructure/cache/query-result-cache.js +0 -66
- package/dist/infrastructure/cache/response-cache.js +0 -48
- package/dist/infrastructure/cache/security-scan-cache.js +0 -47
- package/dist/infrastructure/chunking/ast-code-chunker.js +0 -19
- package/dist/infrastructure/chunking/code-aware-chunker.js +0 -397
- package/dist/infrastructure/context/context-compressor.js +0 -329
- package/dist/infrastructure/context/conversation-context.js +0 -128
- package/dist/infrastructure/context/session-manager.js +0 -94
- package/dist/infrastructure/cost/cost-tracker.js +0 -360
- package/dist/infrastructure/file-scanner/file-scanner.js +0 -106
- package/dist/infrastructure/governance/nist-ai-rmf.js +0 -292
- package/dist/infrastructure/governance/policy-as-code.js +0 -258
- package/dist/infrastructure/governance/prompt-to-code-lineage.js +0 -239
- package/dist/infrastructure/index.js +0 -7
- package/dist/infrastructure/observability/prompt-versioner.js +0 -145
- package/dist/infrastructure/protocols/a2a-metadata.js +0 -137
- package/dist/infrastructure/protocols/a2a-protocol.js +0 -314
- package/dist/infrastructure/protocols/mcp-oauth.js +0 -184
- package/dist/infrastructure/protocols/mcp-server.js +0 -333
- package/dist/infrastructure/protocols/streaming-handler.js +0 -103
- package/dist/infrastructure/providers/cohere-provider.js +0 -444
- package/dist/infrastructure/providers/fake-provider.js +0 -130
- package/dist/infrastructure/providers/local-llm-provider.js +0 -330
- package/dist/infrastructure/providers/model-config.types.js +0 -9
- package/dist/infrastructure/providers/model-provider.interface.js +0 -8
- package/dist/infrastructure/providers/openai-provider.js +0 -413
- package/dist/infrastructure/providers/openrouter-provider.js +0 -399
- package/dist/infrastructure/providers/operation-provider-resolver.js +0 -105
- package/dist/infrastructure/providers/provider-config-loader.js +0 -120
- package/dist/infrastructure/providers/provider-registry.js +0 -88
- package/dist/infrastructure/safety/pattern-detector.js +0 -133
- package/dist/infrastructure/security/ai-sast-scanner.js +0 -290
- package/dist/infrastructure/security/docker-sandbox.js +0 -178
- package/dist/infrastructure/security/enhanced-security-gate.js +0 -151
- package/dist/infrastructure/security/license-scanner.js +0 -167
- package/dist/infrastructure/security/provider-bias-detector.js +0 -164
- package/dist/infrastructure/security/sandbox-executor.js +0 -64
- package/dist/infrastructure/serialization/toon-serializer.js +0 -119
- package/dist/infrastructure/storage/memory-stream-service.js +0 -204
- package/dist/infrastructure/storage/plan-repository.js +0 -96
- package/dist/infrastructure/storage/sqlite-decision-repository.js +0 -232
- package/dist/infrastructure/storage/sqlite-embedding-repository.js +0 -311
- package/dist/infrastructure/storage/sqlite-knowledge-graph-repository.js +0 -417
- package/dist/infrastructure/storage/sqlite-knowledge-preservation-repository.js +0 -230
- package/dist/infrastructure/storage/sqlite-memory-repository.js +0 -229
- package/dist/infrastructure/storage/sqlite-pattern-repository.js +0 -249
- package/dist/infrastructure/storage/task-helpers.js +0 -197
- package/dist/infrastructure/telemetry/telemetry-service.js +0 -167
- package/dist/infrastructure/ux/appropriate-friction.js +0 -213
- package/dist/infrastructure/ux/bi-directional-learning.js +0 -337
- package/dist/infrastructure/ux/capability-boundaries.js +0 -42
- package/dist/infrastructure/ux/comprehensive-formatter.js +0 -117
- package/dist/infrastructure/ux/contextual-feature-discovery.js +0 -10
- package/dist/infrastructure/ux/expectation-management.js +0 -327
- package/dist/infrastructure/ux/feature-discovery.js +0 -14
- package/dist/infrastructure/ux/feedback-prompt.js +0 -45
- package/dist/infrastructure/ux/hitl-validation.js +0 -297
- package/dist/infrastructure/ux/progress-indicator.js +0 -116
- package/dist/infrastructure/ux/progressive-disclosure.js +0 -236
- package/dist/infrastructure/ux/review-checkpoint.js +0 -72
- package/dist/infrastructure/ux/staged-feature-intro.js +0 -24
- package/dist/infrastructure/ux/stream-markdown.js +0 -151
- package/dist/infrastructure/ux/syntax-highlighter.js +0 -91
- package/dist/infrastructure/ux/team-standards.js +0 -196
- package/dist/infrastructure/ux/transparency.js +0 -71
- package/dist/infrastructure/validation/agent-feedback.js +0 -55
- package/dist/infrastructure/validation/agent-validation-helper.js +0 -137
- package/dist/infrastructure/validation/review-handler.js +0 -40
- package/dist/infrastructure/validation/summary-aggregator.js +0 -70
- package/dist/infrastructure/validation/summary-extractor.js +0 -45
- package/dist/infrastructure/validation/trace-summary.js +0 -52
- package/dist/infrastructure/verification/verification-service.js +0 -47
- package/dist/infrastructure/xai/attention-visualizer.js +0 -172
- package/dist/infrastructure/xai/cot-visualizer.js +0 -283
- package/dist/infrastructure/xai/decision-tree-log.js +0 -212
- package/dist/infrastructure/xai/interactive-xai.js +0 -260
- package/dist/infrastructure/xai/uncertainty-quantifier.js +0 -198
- package/dist/intelligent-retrieval.js +0 -272
- package/dist/intent/classifier.js +0 -2
- package/dist/intent/context.js +0 -2
- package/dist/iterative-refinement.js +0 -189
- package/dist/learning.js +0 -232
- package/dist/log.js +0 -31
- package/dist/migrate.js +0 -133
- package/dist/parallel-processor.js +0 -534
- package/dist/planner.js +0 -198
- package/dist/policy.js +0 -26
- package/dist/presentation/cli/commands/ask-command.js +0 -314
- package/dist/presentation/cli/commands/cost-command.js +0 -191
- package/dist/presentation/cli/commands/decision-command.js +0 -207
- package/dist/presentation/cli/commands/docs-command.js +0 -25
- package/dist/presentation/cli/commands/fix-command.js +0 -53
- package/dist/presentation/cli/commands/knowledge-command.js +0 -129
- package/dist/presentation/cli/commands/learning-dashboard-command.js +0 -183
- package/dist/presentation/cli/commands/models-command.js +0 -194
- package/dist/presentation/cli/commands/orchestrate-command.js +0 -207
- package/dist/presentation/cli/commands/plan-command.js +0 -246
- package/dist/presentation/cli/commands/product-command.js +0 -199
- package/dist/presentation/cli/commands/react-command.js +0 -181
- package/dist/presentation/cli/commands/review-command.js +0 -154
- package/dist/presentation/cli/commands/run-command.js +0 -188
- package/dist/presentation/cli/commands/smart-command.js +0 -395
- package/dist/presentation/cli/commands/suggest-command.js +0 -138
- package/dist/presentation/cli/commands/trace-command.js +0 -129
- package/dist/presentation/cli/commands/undo-command.js +0 -150
- package/dist/query-optimizer.js +0 -205
- package/dist/refactor.js +0 -116
- package/dist/review.js +0 -206
- package/dist/search.js +0 -163
- package/dist/session.js +0 -704
- package/dist/task-verification.js +0 -336
- package/dist/testgen.js +0 -166
- package/dist/token-optimizer.js +0 -277
- package/dist/tools/bash.js +0 -213
- package/dist/tools/edit.js +0 -235
- package/dist/tools/executor.js +0 -153
- package/dist/tools/git-tool.js +0 -292
- package/dist/tools/parser.js +0 -158
- package/dist/tools/registry.js +0 -302
- package/dist/tools/search.js +0 -100
- package/dist/types.js +0 -2
- package/dist/utils/check-api-status.js +0 -100
- package/dist/utils/diff-parser.js +0 -162
- package/dist/verification/backup.js +0 -259
- package/dist/verification/compiler.js +0 -264
- package/dist/verification/index.js +0 -273
- package/dist/verification/test-runner.js +0 -379
|
@@ -1,508 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Application Agent: Execution Agent (Code Migration)
|
|
3
|
-
* Specialized agent for performing mechanical changes across files
|
|
4
|
-
*
|
|
5
|
-
* Based on enterprise architecture: Separate Execution Agent
|
|
6
|
-
* Role: Executes plans created by Planning Agent
|
|
7
|
-
*/
|
|
8
|
-
import { GitTool } from '../../tools/git-tool.js';
|
|
9
|
-
import { agentValidationHelper } from '../../infrastructure/validation/agent-validation-helper.js';
|
|
10
|
-
import { findCodebaseRoot } from '../../domain/services/codebase-detector.js';
|
|
11
|
-
export class ExecutionAgent {
|
|
12
|
-
aiService;
|
|
13
|
-
toolExecutor;
|
|
14
|
-
cwd;
|
|
15
|
-
gitTool;
|
|
16
|
-
constructor(aiService, toolExecutor, cwd = process.cwd()) {
|
|
17
|
-
this.aiService = aiService;
|
|
18
|
-
this.toolExecutor = toolExecutor;
|
|
19
|
-
this.cwd = cwd;
|
|
20
|
-
this.gitTool = new GitTool(cwd);
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Execute plan or specific sub-plan
|
|
24
|
-
*/
|
|
25
|
-
async execute(request) {
|
|
26
|
-
const { plan, subPlanId, context = {} } = request;
|
|
27
|
-
// Start validation context
|
|
28
|
-
const codebaseInfo = findCodebaseRoot(this.cwd);
|
|
29
|
-
const validationContext = agentValidationHelper.startAgentOperation('execution-agent', 'execute', {
|
|
30
|
-
query: plan.goal,
|
|
31
|
-
codebaseId: codebaseInfo?.codebaseId,
|
|
32
|
-
});
|
|
33
|
-
// Track files changed, tool calls, and rollback info
|
|
34
|
-
const filesChanged = [];
|
|
35
|
-
const filesCreated = [];
|
|
36
|
-
const filesDeleted = [];
|
|
37
|
-
const toolCalls = [];
|
|
38
|
-
const rollbackOccurred = { value: false };
|
|
39
|
-
try {
|
|
40
|
-
const results = [];
|
|
41
|
-
const updatedSubPlans = [...plan.subPlans];
|
|
42
|
-
// If executing specific sub-plan, do that and return
|
|
43
|
-
if (subPlanId) {
|
|
44
|
-
const subPlan = updatedSubPlans.find(sp => sp.id === subPlanId);
|
|
45
|
-
if (!subPlan) {
|
|
46
|
-
throw new Error(`Sub-plan ${subPlanId} not found`);
|
|
47
|
-
}
|
|
48
|
-
const result = await this.executeSubPlan(subPlan, plan, context, { filesChanged, filesCreated, filesDeleted, toolCalls, rollbackOccurred });
|
|
49
|
-
const index = updatedSubPlans.findIndex(sp => sp.id === subPlanId);
|
|
50
|
-
if (index >= 0) {
|
|
51
|
-
updatedSubPlans[index] = {
|
|
52
|
-
...subPlan,
|
|
53
|
-
status: result.success ? 'completed' : 'failed',
|
|
54
|
-
result: result.result,
|
|
55
|
-
error: result.error,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
results.push(result);
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
// Iterative execution: Keep executing until all sub-plans are done
|
|
62
|
-
let hasProgress = true;
|
|
63
|
-
const maxIterations = 100; // Prevent infinite loops
|
|
64
|
-
let iteration = 0;
|
|
65
|
-
while (hasProgress && iteration < maxIterations) {
|
|
66
|
-
iteration++;
|
|
67
|
-
// Mark sub-plans with failed dependencies as failed
|
|
68
|
-
this.markBlockedSubPlans(updatedSubPlans);
|
|
69
|
-
// Get currently executable sub-plans (dependencies satisfied)
|
|
70
|
-
const executableSubPlans = this.getExecutableSubPlans({
|
|
71
|
-
...plan,
|
|
72
|
-
subPlans: updatedSubPlans,
|
|
73
|
-
});
|
|
74
|
-
if (executableSubPlans.length === 0) {
|
|
75
|
-
// No more executable sub-plans
|
|
76
|
-
hasProgress = false;
|
|
77
|
-
break;
|
|
78
|
-
}
|
|
79
|
-
// Execute all executable sub-plans
|
|
80
|
-
for (const subPlan of executableSubPlans) {
|
|
81
|
-
const result = await this.executeSubPlan(subPlan, plan, context, { filesChanged, filesCreated, filesDeleted, toolCalls, rollbackOccurred });
|
|
82
|
-
// Update sub-plan status
|
|
83
|
-
const index = updatedSubPlans.findIndex(sp => sp.id === subPlan.id);
|
|
84
|
-
if (index >= 0) {
|
|
85
|
-
updatedSubPlans[index] = {
|
|
86
|
-
...subPlan,
|
|
87
|
-
status: result.success ? 'completed' : 'failed',
|
|
88
|
-
result: result.result,
|
|
89
|
-
error: result.error,
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
results.push(result);
|
|
93
|
-
// Stop if critical sub-plan fails
|
|
94
|
-
if (!result.success && subPlan.estimatedComplexity === 'high') {
|
|
95
|
-
hasProgress = false;
|
|
96
|
-
break;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
if (iteration >= maxIterations) {
|
|
101
|
-
console.warn('⚠️ Execution reached max iterations - some sub-plans may not have been executed');
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
// Update plan status
|
|
105
|
-
const completedCount = updatedSubPlans.filter(sp => sp.status === 'completed').length;
|
|
106
|
-
const planStatus = completedCount === updatedSubPlans.length
|
|
107
|
-
? 'completed'
|
|
108
|
-
: updatedSubPlans.some(sp => sp.status === 'failed')
|
|
109
|
-
? 'failed'
|
|
110
|
-
: 'active';
|
|
111
|
-
const updatedPlan = {
|
|
112
|
-
...plan,
|
|
113
|
-
subPlans: updatedSubPlans,
|
|
114
|
-
status: planStatus,
|
|
115
|
-
lastUpdated: new Date(),
|
|
116
|
-
};
|
|
117
|
-
// If execution was successful, commit changes (optional - can be disabled)
|
|
118
|
-
if (planStatus === 'completed' && results.length > 0) {
|
|
119
|
-
await this.commitSuccessfulChanges(plan, results);
|
|
120
|
-
}
|
|
121
|
-
// Extract files from results
|
|
122
|
-
this.extractFilesFromResults(results, filesChanged, filesCreated, filesDeleted);
|
|
123
|
-
// Complete validation
|
|
124
|
-
const validationResult = await agentValidationHelper.completeAgentOperation(validationContext, {
|
|
125
|
-
plan: updatedPlan,
|
|
126
|
-
results,
|
|
127
|
-
overallSuccess: planStatus === 'completed',
|
|
128
|
-
completedSubPlans: completedCount,
|
|
129
|
-
totalSubPlans: updatedSubPlans.length,
|
|
130
|
-
}, {
|
|
131
|
-
outcome: planStatus === 'completed' ? 'success' :
|
|
132
|
-
planStatus === 'failed' ? 'failure' : 'partial_success',
|
|
133
|
-
filesChanged: Array.from(new Set(filesChanged)),
|
|
134
|
-
filesCreated: Array.from(new Set(filesCreated)),
|
|
135
|
-
filesDeleted: Array.from(new Set(filesDeleted)),
|
|
136
|
-
errors: results.filter(r => !r.success).map(r => r.error || 'Unknown error').filter(Boolean),
|
|
137
|
-
validationChecks: [
|
|
138
|
-
{
|
|
139
|
-
check: 'All sub-plans executed',
|
|
140
|
-
passed: completedCount === updatedSubPlans.length,
|
|
141
|
-
message: `${completedCount}/${updatedSubPlans.length} sub-plans completed`,
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
check: 'No rollbacks required',
|
|
145
|
-
passed: !rollbackOccurred.value,
|
|
146
|
-
message: rollbackOccurred.value ? 'Rollback occurred during execution' : 'No rollbacks',
|
|
147
|
-
},
|
|
148
|
-
],
|
|
149
|
-
metrics: {
|
|
150
|
-
changesApplied: completedCount,
|
|
151
|
-
changesProposed: updatedSubPlans.length,
|
|
152
|
-
},
|
|
153
|
-
additionalContext: {
|
|
154
|
-
query: plan.goal,
|
|
155
|
-
codebaseId: codebaseInfo?.codebaseId,
|
|
156
|
-
toolCalls: toolCalls.map(tc => `${tc.tool}: ${tc.success ? 'success' : 'failed'}`),
|
|
157
|
-
rollbackOccurred: rollbackOccurred.value,
|
|
158
|
-
},
|
|
159
|
-
}).catch(error => {
|
|
160
|
-
// Non-blocking - log but don't fail execution
|
|
161
|
-
console.warn('[ExecutionAgent] Validation recording failed (non-critical):', error);
|
|
162
|
-
return null;
|
|
163
|
-
});
|
|
164
|
-
return {
|
|
165
|
-
plan: updatedPlan,
|
|
166
|
-
results,
|
|
167
|
-
overallSuccess: planStatus === 'completed',
|
|
168
|
-
completedSubPlans: completedCount,
|
|
169
|
-
totalSubPlans: updatedSubPlans.length,
|
|
170
|
-
...(validationResult ? {
|
|
171
|
-
validationSummary: validationResult.summary,
|
|
172
|
-
feedbackId: validationResult.feedbackId || undefined,
|
|
173
|
-
runId: validationResult.runId || undefined,
|
|
174
|
-
} : {}),
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
catch (error) {
|
|
178
|
-
// Record failure in validation
|
|
179
|
-
await agentValidationHelper.completeAgentOperation(validationContext, null, {
|
|
180
|
-
outcome: 'failure',
|
|
181
|
-
errors: [error instanceof Error ? error.message : String(error)],
|
|
182
|
-
additionalContext: {
|
|
183
|
-
query: plan.goal,
|
|
184
|
-
codebaseId: codebaseInfo?.codebaseId,
|
|
185
|
-
},
|
|
186
|
-
}).catch(() => {
|
|
187
|
-
// Non-blocking
|
|
188
|
-
});
|
|
189
|
-
throw error;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Commit successful changes to Git
|
|
194
|
-
* Only commits if there are actual file modifications
|
|
195
|
-
*/
|
|
196
|
-
async commitSuccessfulChanges(plan, results) {
|
|
197
|
-
try {
|
|
198
|
-
// Check if we're in a git repo
|
|
199
|
-
const status = await this.gitTool.status();
|
|
200
|
-
const hasChanges = status.modified.length > 0 ||
|
|
201
|
-
status.staged.length > 0 ||
|
|
202
|
-
status.untracked.length > 0;
|
|
203
|
-
if (!hasChanges) {
|
|
204
|
-
return; // No changes to commit
|
|
205
|
-
}
|
|
206
|
-
// Generate commit message from plan
|
|
207
|
-
const commitMessage = `Codehere: ${plan.goal}\n\nCompleted ${results.length} sub-plan(s)`;
|
|
208
|
-
// Commit changes
|
|
209
|
-
const commitResult = await this.gitTool.commit(commitMessage);
|
|
210
|
-
if (!commitResult.success) {
|
|
211
|
-
// Log but don't fail - commit is optional
|
|
212
|
-
console.warn('⚠️ Failed to commit changes:', commitResult.error);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
catch (error) {
|
|
216
|
-
// Silently fail - Git operations are optional
|
|
217
|
-
// Not all repos are Git repos, and that's okay
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Mark sub-plans with failed dependencies as failed
|
|
222
|
-
*/
|
|
223
|
-
markBlockedSubPlans(subPlans) {
|
|
224
|
-
const failed = new Set(subPlans.filter(sp => sp.status === 'failed').map(sp => sp.id));
|
|
225
|
-
subPlans.forEach((sp, index) => {
|
|
226
|
-
if (sp.status === 'pending') {
|
|
227
|
-
const failedDependencies = sp.dependencies.filter(depId => failed.has(depId));
|
|
228
|
-
if (failedDependencies.length > 0) {
|
|
229
|
-
// Mark as failed due to dependency failure
|
|
230
|
-
subPlans[index] = {
|
|
231
|
-
...sp,
|
|
232
|
-
status: 'failed',
|
|
233
|
-
error: `Blocked by failed dependency: ${failedDependencies.join(', ')}`,
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* Get sub-plans ready for execution (dependencies satisfied)
|
|
241
|
-
*/
|
|
242
|
-
getExecutableSubPlans(plan) {
|
|
243
|
-
const completed = new Set(plan.subPlans.filter(sp => sp.status === 'completed').map(sp => sp.id));
|
|
244
|
-
return plan.subPlans.filter(sp => sp.status === 'pending' &&
|
|
245
|
-
sp.dependencies.every(depId => completed.has(depId)));
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* Execute a single sub-plan
|
|
249
|
-
*/
|
|
250
|
-
async executeSubPlan(subPlan, plan, context, tracking) {
|
|
251
|
-
const startTime = Date.now();
|
|
252
|
-
const observations = [];
|
|
253
|
-
try {
|
|
254
|
-
// For implement/edit/refactor sub-plans, use EditFileUseCase for better file creation support
|
|
255
|
-
if (subPlan.type === 'implement' || subPlan.type === 'edit' || subPlan.type === 'refactor') {
|
|
256
|
-
const params = this.extractParameters(subPlan, context);
|
|
257
|
-
if (params.filepath) {
|
|
258
|
-
// Use EditFileUseCase which handles both editing and file creation
|
|
259
|
-
const { EditFileUseCase } = await import('../use-cases/edit-file-use-case.js');
|
|
260
|
-
const { container } = await import('../services/dependency-container.js');
|
|
261
|
-
const editUseCase = new EditFileUseCase(this.aiService, container.verificationService, container.sastScanner);
|
|
262
|
-
const editResult = await editUseCase.execute({
|
|
263
|
-
filepath: params.filepath,
|
|
264
|
-
instruction: params.instruction || subPlan.description,
|
|
265
|
-
requirements: params.requirements || [],
|
|
266
|
-
});
|
|
267
|
-
// Track file changes
|
|
268
|
-
if (editResult.edit) {
|
|
269
|
-
const filepath = editResult.edit.filepath;
|
|
270
|
-
if (editResult.edit.oldContent) {
|
|
271
|
-
// File was edited
|
|
272
|
-
if (!tracking.filesChanged.includes(filepath)) {
|
|
273
|
-
tracking.filesChanged.push(filepath);
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
else {
|
|
277
|
-
// File was created
|
|
278
|
-
if (!tracking.filesCreated.includes(filepath)) {
|
|
279
|
-
tracking.filesCreated.push(filepath);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
// Track rollback if verification failed
|
|
283
|
-
if (!editResult.success && editResult.verification && !editResult.verification.success) {
|
|
284
|
-
tracking.rollbackOccurred.value = true;
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
// Track tool call
|
|
288
|
-
tracking.toolCalls.push({
|
|
289
|
-
tool: 'EditFileUseCase',
|
|
290
|
-
success: editResult.success,
|
|
291
|
-
error: editResult.error,
|
|
292
|
-
});
|
|
293
|
-
// Trace tool execution
|
|
294
|
-
agentValidationHelper.trace({
|
|
295
|
-
operationType: 'tool_invocation',
|
|
296
|
-
operationName: 'edit_file',
|
|
297
|
-
input: { filepath: params.filepath },
|
|
298
|
-
output: editResult.edit,
|
|
299
|
-
error: editResult.error ? new Error(editResult.error) : undefined,
|
|
300
|
-
metadata: {
|
|
301
|
-
filepath: params.filepath,
|
|
302
|
-
subPlanId: subPlan.id,
|
|
303
|
-
tool: 'EditFileUseCase',
|
|
304
|
-
},
|
|
305
|
-
});
|
|
306
|
-
const duration = Date.now() - startTime;
|
|
307
|
-
return {
|
|
308
|
-
subPlanId: subPlan.id,
|
|
309
|
-
success: editResult.success,
|
|
310
|
-
result: editResult.edit,
|
|
311
|
-
error: editResult.error,
|
|
312
|
-
observations: [{
|
|
313
|
-
result: editResult.edit ? `File ${editResult.edit.filepath} ${editResult.edit.oldContent ? 'edited' : 'created'} successfully` : null,
|
|
314
|
-
success: editResult.success,
|
|
315
|
-
error: editResult.error,
|
|
316
|
-
}],
|
|
317
|
-
duration,
|
|
318
|
-
};
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
// For other sub-plan types, use tool executor
|
|
322
|
-
const action = this.createActionFromSubPlan(subPlan, context);
|
|
323
|
-
// Track tool call
|
|
324
|
-
tracking.toolCalls.push({
|
|
325
|
-
tool: action.name,
|
|
326
|
-
success: true, // Will be updated after execution
|
|
327
|
-
});
|
|
328
|
-
// Trace tool execution start
|
|
329
|
-
agentValidationHelper.trace({
|
|
330
|
-
operationType: 'tool_invocation',
|
|
331
|
-
operationName: action.name,
|
|
332
|
-
input: { parameters: action.parameters },
|
|
333
|
-
metadata: {
|
|
334
|
-
subPlanId: subPlan.id,
|
|
335
|
-
tool: action.name,
|
|
336
|
-
},
|
|
337
|
-
});
|
|
338
|
-
const observation = await this.toolExecutor.executeAction(action);
|
|
339
|
-
// Update tool call tracking
|
|
340
|
-
const lastCall = tracking.toolCalls[tracking.toolCalls.length - 1];
|
|
341
|
-
if (lastCall && lastCall.tool === action.name) {
|
|
342
|
-
lastCall.success = observation.success;
|
|
343
|
-
lastCall.error = observation.error;
|
|
344
|
-
}
|
|
345
|
-
observations.push(observation);
|
|
346
|
-
// Extract file changes from tool results
|
|
347
|
-
if (observation.result) {
|
|
348
|
-
this.extractFilesFromToolResult(observation.result, tracking);
|
|
349
|
-
}
|
|
350
|
-
const duration = Date.now() - startTime;
|
|
351
|
-
return {
|
|
352
|
-
subPlanId: subPlan.id,
|
|
353
|
-
success: observation.success,
|
|
354
|
-
result: observation.result,
|
|
355
|
-
error: observation.error,
|
|
356
|
-
observations,
|
|
357
|
-
duration,
|
|
358
|
-
};
|
|
359
|
-
}
|
|
360
|
-
catch (error) {
|
|
361
|
-
const duration = Date.now() - startTime;
|
|
362
|
-
return {
|
|
363
|
-
subPlanId: subPlan.id,
|
|
364
|
-
success: false,
|
|
365
|
-
error: error instanceof Error ? error.message : String(error),
|
|
366
|
-
observations,
|
|
367
|
-
duration,
|
|
368
|
-
};
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
/**
|
|
372
|
-
* Create action from sub-plan
|
|
373
|
-
*/
|
|
374
|
-
createActionFromSubPlan(subPlan, context) {
|
|
375
|
-
// Map sub-plan type to tool action
|
|
376
|
-
const toolMap = {
|
|
377
|
-
search: 'search',
|
|
378
|
-
edit: 'edit_replace',
|
|
379
|
-
refactor: 'edit_replace',
|
|
380
|
-
review: 'search', // Review uses search to find code
|
|
381
|
-
analyze: 'search',
|
|
382
|
-
implement: 'edit_create',
|
|
383
|
-
test: 'bash',
|
|
384
|
-
debug: 'edit_replace',
|
|
385
|
-
};
|
|
386
|
-
const toolName = toolMap[subPlan.type] || 'search';
|
|
387
|
-
// Extract parameters from sub-plan description
|
|
388
|
-
const parameters = this.extractParameters(subPlan, context);
|
|
389
|
-
return {
|
|
390
|
-
type: 'tool',
|
|
391
|
-
name: toolName,
|
|
392
|
-
parameters,
|
|
393
|
-
};
|
|
394
|
-
}
|
|
395
|
-
/**
|
|
396
|
-
* Extract action parameters from sub-plan description
|
|
397
|
-
*/
|
|
398
|
-
extractParameters(subPlan, context) {
|
|
399
|
-
const params = {};
|
|
400
|
-
// Extract filepath if mentioned
|
|
401
|
-
const filepathMatch = subPlan.description.match(/(?:in|from|at|file)\s+([^\s]+\.(ts|js|tsx|jsx|py|java|go|rs|rb|php|vue|svelte|html|css|json|yaml|yml|md|txt|sh|bash))/i);
|
|
402
|
-
if (filepathMatch) {
|
|
403
|
-
params.filepath = filepathMatch[1];
|
|
404
|
-
}
|
|
405
|
-
// For search/review/analyze actions, use description as query
|
|
406
|
-
if (subPlan.type === 'search' || subPlan.type === 'analyze' || subPlan.type === 'review') {
|
|
407
|
-
params.query = subPlan.description;
|
|
408
|
-
}
|
|
409
|
-
// For edit/implement/refactor actions, extract instruction and filepath
|
|
410
|
-
if (subPlan.type === 'edit' || subPlan.type === 'implement' || subPlan.type === 'refactor') {
|
|
411
|
-
// Use the full description as instruction
|
|
412
|
-
params.instruction = subPlan.description;
|
|
413
|
-
// Try to extract filepath more intelligently - look for filepath at start or in description
|
|
414
|
-
if (!params.filepath) {
|
|
415
|
-
// Try pattern: "Create/Implement/Edit [filepath] to do X"
|
|
416
|
-
const filepathPatterns = [
|
|
417
|
-
/(?:create|implement|edit|add|update)\s+(?:file\s+)?([^\s]+\.(ts|js|tsx|jsx|py|java|go|rs|rb|php|vue|svelte|html|css|json|yaml|yml|md|txt|sh|bash))/i,
|
|
418
|
-
/(?:in|from|at|file)\s+([^\s]+\.(ts|js|tsx|jsx|py|java|go|rs|rb|php|vue|svelte|html|css|json|yaml|yml|md|txt|sh|bash))/i,
|
|
419
|
-
];
|
|
420
|
-
for (const pattern of filepathPatterns) {
|
|
421
|
-
const match = subPlan.description.match(pattern);
|
|
422
|
-
if (match) {
|
|
423
|
-
params.filepath = match[1];
|
|
424
|
-
break;
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
// Extract requirements if mentioned
|
|
429
|
-
if (subPlan.description.includes('with') || subPlan.description.includes('including')) {
|
|
430
|
-
// Simple requirement extraction - can be enhanced
|
|
431
|
-
const requirementsMatch = subPlan.description.match(/with\s+(.+?)(?:\.|$)/i);
|
|
432
|
-
if (requirementsMatch) {
|
|
433
|
-
params.requirements = [requirementsMatch[1].trim()];
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
// Merge with context
|
|
438
|
-
return { ...context, ...params };
|
|
439
|
-
}
|
|
440
|
-
/**
|
|
441
|
-
* Extract files from execution results
|
|
442
|
-
*/
|
|
443
|
-
extractFilesFromResults(results, filesChanged, filesCreated, filesDeleted) {
|
|
444
|
-
for (const result of results) {
|
|
445
|
-
if (result.result) {
|
|
446
|
-
this.extractFilesFromToolResult(result.result, {
|
|
447
|
-
filesChanged,
|
|
448
|
-
filesCreated,
|
|
449
|
-
filesDeleted,
|
|
450
|
-
toolCalls: [],
|
|
451
|
-
rollbackOccurred: { value: false },
|
|
452
|
-
});
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
/**
|
|
457
|
-
* Extract file changes from tool result
|
|
458
|
-
*/
|
|
459
|
-
extractFilesFromToolResult(result, tracking) {
|
|
460
|
-
// Handle EditResult
|
|
461
|
-
if (result && typeof result === 'object') {
|
|
462
|
-
if (result.filepath && typeof result.filepath === 'string') {
|
|
463
|
-
// Handle edit objects from EditFileUseCase
|
|
464
|
-
if (result.oldContent && !result.newContent) {
|
|
465
|
-
// File was deleted
|
|
466
|
-
if (!tracking.filesDeleted.includes(result.filepath)) {
|
|
467
|
-
tracking.filesDeleted.push(result.filepath);
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
else if (!result.oldContent && result.newContent) {
|
|
471
|
-
// File was created
|
|
472
|
-
if (!tracking.filesCreated.includes(result.filepath)) {
|
|
473
|
-
tracking.filesCreated.push(result.filepath);
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
else if (result.oldContent && result.newContent) {
|
|
477
|
-
// File was edited
|
|
478
|
-
if (!tracking.filesChanged.includes(result.filepath)) {
|
|
479
|
-
tracking.filesChanged.push(result.filepath);
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
// Handle operation field
|
|
484
|
-
if (result.operation === 'create' || result.operation === 'create_file') {
|
|
485
|
-
if (result.filepath && !tracking.filesCreated.includes(result.filepath)) {
|
|
486
|
-
tracking.filesCreated.push(result.filepath);
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
else if (result.operation === 'str_replace') {
|
|
490
|
-
if (result.filepath && !tracking.filesChanged.includes(result.filepath)) {
|
|
491
|
-
tracking.filesChanged.push(result.filepath);
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
else if (result.operation === 'undo') {
|
|
495
|
-
tracking.rollbackOccurred.value = true;
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
// Handle arrays (search results)
|
|
499
|
-
if (Array.isArray(result)) {
|
|
500
|
-
for (const item of result) {
|
|
501
|
-
if (item && typeof item === 'object' && item.filepath) {
|
|
502
|
-
// Search results don't change files, just note them
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
//# sourceMappingURL=execution-agent.js.map
|