codehere 0.2.1 → 0.3.0-rc.1
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 +335 -63
- 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 +10 -49
- 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 +334 -43
- package/dist/presentation/cli/commands/trust-command.js +115 -99
- package/dist/presentation/cli/error-display.js +17 -21
- package/dist/ui.js +17 -12
- package/package.json +35 -67
- 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 -530
- 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 -652
- 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,329 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Application Use Case: ReActOrchestrationUseCase
|
|
3
|
-
* Orchestrates ReAct loop with Memory Stream
|
|
4
|
-
*/
|
|
5
|
-
import { ReActLoop } from '../../domain/services/react-loop.js';
|
|
6
|
-
import { ToolExecutorService } from '../services/tool-executor-service.js';
|
|
7
|
-
import { DecisionTreeLog } from '../../infrastructure/xai/decision-tree-log.js';
|
|
8
|
-
export class ReActOrchestrationUseCase {
|
|
9
|
-
aiService;
|
|
10
|
-
memoryStream;
|
|
11
|
-
toolExecutor;
|
|
12
|
-
decisionTreeLog;
|
|
13
|
-
uncertaintyQuantifier;
|
|
14
|
-
cotVisualizer;
|
|
15
|
-
attentionVisualizer;
|
|
16
|
-
constructor(aiService, memoryStream, toolExecutor, decisionTreeLog, uncertaintyQuantifier, cotVisualizer, attentionVisualizer) {
|
|
17
|
-
this.aiService = aiService;
|
|
18
|
-
this.memoryStream = memoryStream;
|
|
19
|
-
this.toolExecutor = toolExecutor || new ToolExecutorService();
|
|
20
|
-
this.decisionTreeLog = decisionTreeLog || new DecisionTreeLog();
|
|
21
|
-
this.uncertaintyQuantifier = uncertaintyQuantifier;
|
|
22
|
-
this.cotVisualizer = cotVisualizer;
|
|
23
|
-
this.attentionVisualizer = attentionVisualizer;
|
|
24
|
-
}
|
|
25
|
-
async execute(request) {
|
|
26
|
-
const reactLoop = new ReActLoop(request.maxTurns || 20);
|
|
27
|
-
this.decisionTreeLog.clear(); // Start fresh for this execution
|
|
28
|
-
// 0. Create CoT trajectory for visualization (XAI Foundation - Research: CoT visualization)
|
|
29
|
-
let cotTrajectory;
|
|
30
|
-
if (this.cotVisualizer) {
|
|
31
|
-
cotTrajectory = this.cotVisualizer.createTrajectory(request.query);
|
|
32
|
-
}
|
|
33
|
-
// 1. Retrieve relevant memories
|
|
34
|
-
const memories = await this.memoryStream.retrieve(request.query, 10);
|
|
35
|
-
// 2. Get available tools for context
|
|
36
|
-
const { getToolRegistry } = await import('../../tools/registry.js');
|
|
37
|
-
const toolRegistry = getToolRegistry();
|
|
38
|
-
// getToolList() returns a string, getAll() returns Tool[] array
|
|
39
|
-
const availableTools = toolRegistry.getAll().map(tool => tool.name); // Get array of tool names
|
|
40
|
-
// 3. Log goal interpretation (XAI Foundation - Research: Full auditability required)
|
|
41
|
-
const goalId = `goal-${Date.now()}`;
|
|
42
|
-
const goalInterpretation = {
|
|
43
|
-
parsedIntent: request.query,
|
|
44
|
-
constraints: request.context?.constraints || [],
|
|
45
|
-
dependencies: memories.map(m => m.description).slice(0, 3), // Top dependencies
|
|
46
|
-
confidence: memories.length > 0 ? 0.8 : 0.6, // Higher confidence with memories
|
|
47
|
-
};
|
|
48
|
-
this.decisionTreeLog.logGoalInterpretation(goalId, goalInterpretation);
|
|
49
|
-
// 4. Build context with memories and tools
|
|
50
|
-
const context = {
|
|
51
|
-
...request.context,
|
|
52
|
-
memories,
|
|
53
|
-
query: request.query,
|
|
54
|
-
availableTools, // Now guaranteed to be an array
|
|
55
|
-
goalId, // Include goal ID for linking tool calls
|
|
56
|
-
};
|
|
57
|
-
// 4. Execute ReAct loop (with streaming support if handler provided)
|
|
58
|
-
const generateThoughtWithStreaming = async (query, context, trajectory) => {
|
|
59
|
-
const thought = await this.generateThought(query, context, trajectory);
|
|
60
|
-
// Add thought to CoT trajectory (XAI Foundation - Research: CoT visualization)
|
|
61
|
-
if (this.cotVisualizer && cotTrajectory) {
|
|
62
|
-
this.cotVisualizer.addThought(cotTrajectory, thought.content, {
|
|
63
|
-
reasoning: thought.reasoning,
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
// Stream thought if handler provided
|
|
67
|
-
if (request.streamHandler?.onThought) {
|
|
68
|
-
request.streamHandler.onThought(thought.content);
|
|
69
|
-
}
|
|
70
|
-
return thought;
|
|
71
|
-
};
|
|
72
|
-
const generateActionWithStreaming = async (thought, context) => {
|
|
73
|
-
const action = await this.generateAction(thought, context);
|
|
74
|
-
// Add action to CoT trajectory (XAI Foundation - Research: CoT visualization)
|
|
75
|
-
if (this.cotVisualizer && cotTrajectory) {
|
|
76
|
-
const actionDesc = action.type === 'tool'
|
|
77
|
-
? `${action.type}: ${action.name}`
|
|
78
|
-
: `${action.type}: ${action.answer || 'final answer'}`;
|
|
79
|
-
this.cotVisualizer.addAction(cotTrajectory, actionDesc, {
|
|
80
|
-
tool: action.type === 'tool' ? action.name : undefined,
|
|
81
|
-
toolParams: action.type === 'tool' ? action.parameters : undefined,
|
|
82
|
-
reasoning: `Action selected based on thought: ${thought.content.substring(0, 100)}`,
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
// Stream action if handler provided
|
|
86
|
-
if (request.streamHandler?.onAction) {
|
|
87
|
-
const actionDesc = `${action.type}: ${action.name}`;
|
|
88
|
-
request.streamHandler.onAction(actionDesc);
|
|
89
|
-
}
|
|
90
|
-
return action;
|
|
91
|
-
};
|
|
92
|
-
const executeActionWithStreaming = async (action) => {
|
|
93
|
-
const startTime = Date.now();
|
|
94
|
-
// Log tool rationale before execution (XAI Foundation - Research: Tool Rationale Logging)
|
|
95
|
-
if (action.type === 'tool') {
|
|
96
|
-
const toolId = `tool-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
97
|
-
const toolRationale = {
|
|
98
|
-
toolName: action.name,
|
|
99
|
-
parameters: action.parameters || {},
|
|
100
|
-
reasoning: `Tool selected based on thought and available context`,
|
|
101
|
-
alternativeTools: Array.isArray(context.availableTools)
|
|
102
|
-
? context.availableTools.filter((t) => t !== action.name).slice(0, 3)
|
|
103
|
-
: [],
|
|
104
|
-
};
|
|
105
|
-
this.decisionTreeLog.logToolExecution(toolId, toolRationale, context.goalId || goalId);
|
|
106
|
-
// Store tool ID for linking observation
|
|
107
|
-
action.toolId = toolId;
|
|
108
|
-
}
|
|
109
|
-
const observation = await this.toolExecutor.executeAction(action);
|
|
110
|
-
const executionTime = Date.now() - startTime;
|
|
111
|
-
// Update tool execution with raw output and execution time (XAI Foundation - Research: Raw Output Capture)
|
|
112
|
-
if (action.type === 'tool' && action.toolId) {
|
|
113
|
-
const toolId = action.toolId;
|
|
114
|
-
// Re-log with execution results (Note: This is a simplified approach - in production, we'd update the node)
|
|
115
|
-
const toolRationaleWithResults = {
|
|
116
|
-
toolName: action.name,
|
|
117
|
-
parameters: action.parameters || {},
|
|
118
|
-
reasoning: `Tool executed successfully`,
|
|
119
|
-
executionTime,
|
|
120
|
-
rawOutput: observation.result, // Unaltered tool result for provenance
|
|
121
|
-
};
|
|
122
|
-
this.decisionTreeLog.logToolExecution(`tool-result-${toolId}`, toolRationaleWithResults, toolId);
|
|
123
|
-
}
|
|
124
|
-
// Add observation to CoT trajectory (XAI Foundation - Research: CoT visualization)
|
|
125
|
-
if (this.cotVisualizer && cotTrajectory) {
|
|
126
|
-
const obsContent = observation.success
|
|
127
|
-
? String(observation.result).substring(0, 500) // Truncate for display
|
|
128
|
-
: `Error: ${observation.error || 'Failed'}`;
|
|
129
|
-
this.cotVisualizer.addObservation(cotTrajectory, obsContent, {
|
|
130
|
-
success: observation.success,
|
|
131
|
-
executionTime,
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
// Stream observation result if handler provided
|
|
135
|
-
if (request.streamHandler?.onObservation) {
|
|
136
|
-
const obsDesc = observation.success
|
|
137
|
-
? `✓ ${String(observation.result).substring(0, 100)}`
|
|
138
|
-
: `✗ ${observation.error || 'Failed'}`;
|
|
139
|
-
request.streamHandler.onObservation(obsDesc);
|
|
140
|
-
}
|
|
141
|
-
// Log error if execution failed (XAI Foundation - Research: Error Trace for Fault Attribution)
|
|
142
|
-
if (!observation.success && action.toolId) {
|
|
143
|
-
this.decisionTreeLog.logError(`error-${Date.now()}`, new Error(observation.error || 'Tool execution failed'), { action, observation }, action.toolId);
|
|
144
|
-
// Add error to CoT trajectory
|
|
145
|
-
if (this.cotVisualizer && cotTrajectory) {
|
|
146
|
-
this.cotVisualizer.addError(cotTrajectory, observation.error || 'Tool execution failed', {
|
|
147
|
-
tool: action.name,
|
|
148
|
-
executionTime,
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
return observation;
|
|
153
|
-
};
|
|
154
|
-
const trajectory = await reactLoop.execute(request.query, context, generateThoughtWithStreaming, generateActionWithStreaming, executeActionWithStreaming, this.isFinalAnswer.bind(this));
|
|
155
|
-
// 5. Record observation
|
|
156
|
-
if (trajectory.success) {
|
|
157
|
-
await this.memoryStream.recordObservation(`Successfully completed: ${request.query}`, { trajectory });
|
|
158
|
-
}
|
|
159
|
-
// Get complete execution tree for auditability (XAI Foundation - Research: Full auditability)
|
|
160
|
-
const executionTree = this.decisionTreeLog.getExecutionTree();
|
|
161
|
-
// Quantify uncertainty in final answer (XAI Foundation - Research: Uncertainty Quantification)
|
|
162
|
-
let uncertainty;
|
|
163
|
-
const finalAnswer = trajectory.finalAnswer || 'Max iterations reached';
|
|
164
|
-
if (this.uncertaintyQuantifier && finalAnswer) {
|
|
165
|
-
uncertainty = await this.uncertaintyQuantifier.quantifyUncertainty(request.query, finalAnswer, {
|
|
166
|
-
chunks: memories.map(m => ({ content: m.description, filepath: m.filepath || '' })),
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
// Finalize CoT trajectory (XAI Foundation - Research: CoT visualization)
|
|
170
|
-
if (this.cotVisualizer && cotTrajectory) {
|
|
171
|
-
this.cotVisualizer.completeTrajectory(cotTrajectory);
|
|
172
|
-
// Update status based on trajectory success
|
|
173
|
-
if (!trajectory.success) {
|
|
174
|
-
cotTrajectory.status = 'failed';
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
// Generate attention map from memories (XAI Foundation - Research: Attention visualization)
|
|
178
|
-
let attentionMap;
|
|
179
|
-
if (this.attentionVisualizer && memories.length > 0) {
|
|
180
|
-
attentionMap = this.attentionVisualizer.generateAttentionMap(request.query, memories.map(m => ({
|
|
181
|
-
filepath: m.filepath || '',
|
|
182
|
-
content: m.description,
|
|
183
|
-
score: m.relevanceScore || 0.5, // Default score if not available
|
|
184
|
-
})));
|
|
185
|
-
}
|
|
186
|
-
return {
|
|
187
|
-
trajectory,
|
|
188
|
-
answer: finalAnswer,
|
|
189
|
-
memoriesUsed: memories,
|
|
190
|
-
decisionTree: executionTree, // Complete audit trail
|
|
191
|
-
uncertainty, // XAI Foundation - Uncertainty quantification for transparency
|
|
192
|
-
cotTrajectory, // XAI Foundation - Chain-of-Thought visualization
|
|
193
|
-
attentionMap, // XAI Foundation - Attention visualization
|
|
194
|
-
};
|
|
195
|
-
}
|
|
196
|
-
async generateThought(query, context, trajectory) {
|
|
197
|
-
const memoryContext = context.memories?.length > 0
|
|
198
|
-
? `\n\nPrevious experiences:\n${context.memories.map((m) => `- ${m.description}`).join('\n')}`
|
|
199
|
-
: '';
|
|
200
|
-
const trajectoryContext = trajectory.steps.length > 0
|
|
201
|
-
? `\n\nPrevious steps:\n${trajectory.steps.map((s, i) => `${i + 1}. Thought: ${s.thought.content}\n Action: ${s.action.name}\n Result: ${s.observation.success ? 'Success' : 'Failed'}`).join('\n')}`
|
|
202
|
-
: '';
|
|
203
|
-
const prompt = `You are a reasoning agent. Generate a thought about how to solve this query.
|
|
204
|
-
|
|
205
|
-
Query: ${query}${memoryContext}${trajectoryContext}
|
|
206
|
-
|
|
207
|
-
Generate a thought that:
|
|
208
|
-
1. Analyzes the current situation
|
|
209
|
-
2. Considers what needs to be done next
|
|
210
|
-
3. Reasons about the best approach
|
|
211
|
-
|
|
212
|
-
Thought:`;
|
|
213
|
-
const response = await this.aiService.chat(prompt, [], context.memories || []);
|
|
214
|
-
return {
|
|
215
|
-
content: response,
|
|
216
|
-
reasoning: response,
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
async generateAction(thought, context) {
|
|
220
|
-
const availableTools = context.availableTools || 'No tools available';
|
|
221
|
-
const trajectory = context.trajectory || { steps: [] };
|
|
222
|
-
const trajectoryContext = trajectory.steps.length > 0
|
|
223
|
-
? `\n\nPrevious actions:\n${trajectory.steps.map((s, i) => `${i + 1}. ${s.action.type}: ${s.action.name} - ${s.observation.success ? 'Success' : 'Failed: ' + (s.observation.error || 'Unknown')}`).join('\n')}`
|
|
224
|
-
: '';
|
|
225
|
-
const memoryContext = context.memories?.length > 0
|
|
226
|
-
? `\n\nRelevant past experiences:\n${context.memories.slice(0, 3).map((m) => `- ${m.description}`).join('\n')}`
|
|
227
|
-
: '';
|
|
228
|
-
const prompt = `You are a reasoning agent. Based on this thought, decide the next action.
|
|
229
|
-
|
|
230
|
-
Thought: ${thought.content}${memoryContext}${trajectoryContext}
|
|
231
|
-
|
|
232
|
-
Available tools:
|
|
233
|
-
${availableTools}
|
|
234
|
-
|
|
235
|
-
CRITICAL: Respond with ONLY valid JSON in this exact format:
|
|
236
|
-
{
|
|
237
|
-
"type": "tool" | "agent" | "answer",
|
|
238
|
-
"name": "tool_or_agent_name",
|
|
239
|
-
"parameters": {...}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
Examples:
|
|
243
|
-
- Use search tool: {"type": "tool", "name": "search", "parameters": {"query": "authentication"}}
|
|
244
|
-
- View file: {"type": "tool", "name": "edit_view", "parameters": {"filepath": "src/auth.ts"}}
|
|
245
|
-
- Final answer: {"type": "answer", "name": "final", "parameters": {"answer": "The answer is..."}}
|
|
246
|
-
|
|
247
|
-
JSON only, no other text:`;
|
|
248
|
-
const response = await this.aiService.chat(prompt, [], context.memories || []);
|
|
249
|
-
try {
|
|
250
|
-
// Extract JSON - try multiple patterns
|
|
251
|
-
let jsonStr = response.trim();
|
|
252
|
-
// Remove markdown code blocks if present
|
|
253
|
-
jsonStr = jsonStr.replace(/```json\n?/g, '').replace(/```\n?/g, '').trim();
|
|
254
|
-
// Find JSON object
|
|
255
|
-
const jsonMatch = jsonStr.match(/\{[\s\S]*\}/);
|
|
256
|
-
if (jsonMatch) {
|
|
257
|
-
const parsed = JSON.parse(jsonMatch[0]);
|
|
258
|
-
if (parsed.type && parsed.name) {
|
|
259
|
-
return {
|
|
260
|
-
type: parsed.type,
|
|
261
|
-
name: parsed.name,
|
|
262
|
-
parameters: parsed.parameters || {},
|
|
263
|
-
};
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
catch (e) {
|
|
268
|
-
// Fall through to fallback
|
|
269
|
-
}
|
|
270
|
-
// Fallback: analyze thought to determine action
|
|
271
|
-
const thoughtLower = thought.content.toLowerCase();
|
|
272
|
-
if (thoughtLower.includes('search') || thoughtLower.includes('find') || thoughtLower.includes('look')) {
|
|
273
|
-
// Extract query from thought
|
|
274
|
-
const queryMatch = thought.content.match(/(?:search|find|look for|locate)\s+(.+)/i);
|
|
275
|
-
return {
|
|
276
|
-
type: 'tool',
|
|
277
|
-
name: 'search',
|
|
278
|
-
parameters: { query: queryMatch ? queryMatch[1] : thought.content },
|
|
279
|
-
};
|
|
280
|
-
}
|
|
281
|
-
if (thoughtLower.includes('view') || thoughtLower.includes('read') || thoughtLower.includes('file')) {
|
|
282
|
-
// Try to extract filepath
|
|
283
|
-
const fileMatch = thought.content.match(/(?:view|read|file|open)\s+([^\s]+\.(ts|js|tsx|jsx|py|java|cpp))/i);
|
|
284
|
-
if (fileMatch) {
|
|
285
|
-
return {
|
|
286
|
-
type: 'tool',
|
|
287
|
-
name: 'edit_view',
|
|
288
|
-
parameters: { filepath: fileMatch[1] },
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
if (thoughtLower.includes('answer') || thoughtLower.includes('complete') || thoughtLower.includes('done') || thoughtLower.includes('solution')) {
|
|
293
|
-
return {
|
|
294
|
-
type: 'answer',
|
|
295
|
-
name: 'final_answer',
|
|
296
|
-
parameters: { answer: thought.content },
|
|
297
|
-
};
|
|
298
|
-
}
|
|
299
|
-
// Default: provide answer based on thought
|
|
300
|
-
return {
|
|
301
|
-
type: 'answer',
|
|
302
|
-
name: 'direct_answer',
|
|
303
|
-
parameters: { answer: thought.content },
|
|
304
|
-
};
|
|
305
|
-
}
|
|
306
|
-
isFinalAnswer(observation) {
|
|
307
|
-
// If observation failed, not a final answer
|
|
308
|
-
if (!observation.success)
|
|
309
|
-
return false;
|
|
310
|
-
// Check if result is a meaningful string answer
|
|
311
|
-
if (typeof observation.result === 'string') {
|
|
312
|
-
const lower = observation.result.toLowerCase();
|
|
313
|
-
const result = observation.result.trim();
|
|
314
|
-
// Not a final answer if it's a tool execution message or empty
|
|
315
|
-
if (result.length === 0)
|
|
316
|
-
return false;
|
|
317
|
-
if (lower.includes('executed') || lower.includes('tool') || lower.includes('found 0')) {
|
|
318
|
-
return false;
|
|
319
|
-
}
|
|
320
|
-
// If it's a substantial answer (more than just status), it's final
|
|
321
|
-
if (result.length > 20 && !lower.includes('error')) {
|
|
322
|
-
return true;
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
// Check if it's an answer type action result
|
|
326
|
-
return false;
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
//# sourceMappingURL=react-orchestration-use-case.js.map
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Application Use Case: ReflexionUseCase
|
|
3
|
-
* Implements Reflexion pattern - converts failures to learnings
|
|
4
|
-
*/
|
|
5
|
-
export class ReflexionUseCase {
|
|
6
|
-
aiService;
|
|
7
|
-
memoryStream;
|
|
8
|
-
constructor(aiService, memoryStream) {
|
|
9
|
-
this.aiService = aiService;
|
|
10
|
-
this.memoryStream = memoryStream;
|
|
11
|
-
}
|
|
12
|
-
async execute(request) {
|
|
13
|
-
// Only generate reflection if failed (reward < 1)
|
|
14
|
-
if (request.reward >= 1.0) {
|
|
15
|
-
return {
|
|
16
|
-
reflection: 'Task completed successfully',
|
|
17
|
-
stored: false,
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
// Generate reflection using self-reflection model
|
|
21
|
-
const reflection = await this.aiService.generateReflection(request.trajectory, request.reward, request.errors);
|
|
22
|
-
// Store reflection in memory stream
|
|
23
|
-
await this.memoryStream.recordReflection(reflection, request.trajectory, request.reward, request.errors);
|
|
24
|
-
return {
|
|
25
|
-
reflection,
|
|
26
|
-
stored: true,
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=reflexion-use-case.js.map
|
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Application: Deterministic Workflows
|
|
3
|
-
* Replace overloaded prompts with deterministic workflows for common patterns
|
|
4
|
-
* Faster, more predictable, lower cost than ReAct for common operations
|
|
5
|
-
*
|
|
6
|
-
* Based on ARCHITECTURAL_DECOMPOSITION.md analysis
|
|
7
|
-
*/
|
|
8
|
-
/**
|
|
9
|
-
* Deterministic workflow for explain operations
|
|
10
|
-
* Faster than ReAct - direct path with minimal LLM calls
|
|
11
|
-
*/
|
|
12
|
-
export class ExplainWorkflow {
|
|
13
|
-
embeddingRepository;
|
|
14
|
-
aiService;
|
|
15
|
-
constructor(embeddingRepository, aiService) {
|
|
16
|
-
this.embeddingRepository = embeddingRepository;
|
|
17
|
-
this.aiService = aiService;
|
|
18
|
-
}
|
|
19
|
-
async execute(query, filepath) {
|
|
20
|
-
try {
|
|
21
|
-
// 1. Find file if not provided
|
|
22
|
-
let resolvedFilepath = filepath;
|
|
23
|
-
if (!resolvedFilepath) {
|
|
24
|
-
const foundFilepath = await this.findFile(query);
|
|
25
|
-
resolvedFilepath = foundFilepath || undefined;
|
|
26
|
-
if (!resolvedFilepath) {
|
|
27
|
-
return {
|
|
28
|
-
result: null,
|
|
29
|
-
success: false,
|
|
30
|
-
error: 'Could not find file to explain',
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
// 2. Read file content
|
|
35
|
-
const { readFileSync } = await import('fs');
|
|
36
|
-
const { join } = await import('path');
|
|
37
|
-
const fullPath = join(process.cwd(), resolvedFilepath);
|
|
38
|
-
const content = readFileSync(fullPath, 'utf-8');
|
|
39
|
-
// 3. Generate explanation (single LLM call)
|
|
40
|
-
const explanation = await this.aiService.chat(`Explain this code file clearly and concisely:\n\n${content}\n\nFile: ${resolvedFilepath}`, [], []);
|
|
41
|
-
return {
|
|
42
|
-
result: {
|
|
43
|
-
filepath: resolvedFilepath,
|
|
44
|
-
explanation,
|
|
45
|
-
},
|
|
46
|
-
success: true,
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
catch (error) {
|
|
50
|
-
return {
|
|
51
|
-
result: null,
|
|
52
|
-
success: false,
|
|
53
|
-
error: error instanceof Error ? error.message : String(error),
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
async findFile(query) {
|
|
58
|
-
// Extract filepath from query or search
|
|
59
|
-
// Simplified for now
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Deterministic workflow for find/search operations
|
|
65
|
-
* Direct semantic search + answer generation
|
|
66
|
-
*/
|
|
67
|
-
export class FindWorkflow {
|
|
68
|
-
embeddingRepository;
|
|
69
|
-
aiService;
|
|
70
|
-
constructor(embeddingRepository, aiService) {
|
|
71
|
-
this.embeddingRepository = embeddingRepository;
|
|
72
|
-
this.aiService = aiService;
|
|
73
|
-
}
|
|
74
|
-
async execute(query, maxResults = 5) {
|
|
75
|
-
try {
|
|
76
|
-
// 1. Generate query embedding
|
|
77
|
-
const queryEmbedding = await this.aiService.embedQuery?.(query) ||
|
|
78
|
-
await this.aiService.embed(query);
|
|
79
|
-
const embedding = Array.isArray(queryEmbedding[0]) ? queryEmbedding[0] : queryEmbedding;
|
|
80
|
-
// 2. Search codebase
|
|
81
|
-
const chunks = await this.embeddingRepository.searchWithEmbedding(embedding, maxResults);
|
|
82
|
-
// 3. Generate concise answer (single LLM call)
|
|
83
|
-
const contextText = chunks
|
|
84
|
-
.slice(0, 3) // Top 3 for speed
|
|
85
|
-
.map((chunk, idx) => `[${idx + 1}] ${chunk.filepath}:\n${chunk.content.substring(0, 300)}`)
|
|
86
|
-
.join('\n\n');
|
|
87
|
-
const answer = await this.aiService.chat(`Query: ${query}\n\nRelevant code:\n${contextText}\n\nProvide a concise answer.`, [], []);
|
|
88
|
-
return {
|
|
89
|
-
result: {
|
|
90
|
-
answer,
|
|
91
|
-
chunks: chunks.slice(0, 3),
|
|
92
|
-
},
|
|
93
|
-
success: true,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
return {
|
|
98
|
-
result: null,
|
|
99
|
-
success: false,
|
|
100
|
-
error: error instanceof Error ? error.message : String(error),
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Deterministic workflow for simple edits
|
|
107
|
-
* Direct edit generation without multi-step reasoning
|
|
108
|
-
*/
|
|
109
|
-
export class SimpleEditWorkflow {
|
|
110
|
-
aiService;
|
|
111
|
-
constructor(aiService) {
|
|
112
|
-
this.aiService = aiService;
|
|
113
|
-
}
|
|
114
|
-
async execute(filepath, instruction) {
|
|
115
|
-
try {
|
|
116
|
-
// 1. Read file
|
|
117
|
-
const { readFileSync } = await import('fs');
|
|
118
|
-
const { join } = await import('path');
|
|
119
|
-
const fullPath = join(process.cwd(), filepath);
|
|
120
|
-
const content = readFileSync(fullPath, 'utf-8');
|
|
121
|
-
// 2. Generate edit (single LLM call)
|
|
122
|
-
const diff = await this.aiService.generateEdit(content, instruction, filepath);
|
|
123
|
-
return {
|
|
124
|
-
result: {
|
|
125
|
-
filepath,
|
|
126
|
-
diff,
|
|
127
|
-
},
|
|
128
|
-
success: true,
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
catch (error) {
|
|
132
|
-
return {
|
|
133
|
-
result: null,
|
|
134
|
-
success: false,
|
|
135
|
-
error: error instanceof Error ? error.message : String(error),
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Workflow Router
|
|
142
|
-
* Routes to appropriate deterministic workflow
|
|
143
|
-
*/
|
|
144
|
-
export class WorkflowRouter {
|
|
145
|
-
explainWorkflow;
|
|
146
|
-
findWorkflow;
|
|
147
|
-
simpleEditWorkflow;
|
|
148
|
-
constructor(explainWorkflow, findWorkflow, simpleEditWorkflow) {
|
|
149
|
-
this.explainWorkflow = explainWorkflow;
|
|
150
|
-
this.findWorkflow = findWorkflow;
|
|
151
|
-
this.simpleEditWorkflow = simpleEditWorkflow;
|
|
152
|
-
}
|
|
153
|
-
async route(request) {
|
|
154
|
-
switch (request.type) {
|
|
155
|
-
case 'explain':
|
|
156
|
-
return await this.explainWorkflow.execute(request.query);
|
|
157
|
-
case 'find':
|
|
158
|
-
return await this.findWorkflow.execute(request.query);
|
|
159
|
-
case 'simple-edit':
|
|
160
|
-
// Extract filepath and instruction
|
|
161
|
-
const { filepath, instruction } = this.parseEditQuery(request.query);
|
|
162
|
-
if (!filepath || !instruction) {
|
|
163
|
-
return {
|
|
164
|
-
result: null,
|
|
165
|
-
success: false,
|
|
166
|
-
error: 'Could not extract filepath and instruction',
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
return await this.simpleEditWorkflow.execute(filepath, instruction);
|
|
170
|
-
case 'search':
|
|
171
|
-
return await this.findWorkflow.execute(request.query);
|
|
172
|
-
default:
|
|
173
|
-
return {
|
|
174
|
-
result: null,
|
|
175
|
-
success: false,
|
|
176
|
-
error: `Unknown workflow type: ${request.type}`,
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
parseEditQuery(query) {
|
|
181
|
-
// Extract filepath and instruction from query
|
|
182
|
-
// Simplified - should use IntelligentRouter's extraction logic
|
|
183
|
-
const filepathMatch = query.match(/(?:file|in|at)\s+([^\s]+\.(ts|js|tsx|jsx|py|java|cpp|go|rs|rb|php|vue|svelte|html|css|json|yaml|yml|md|txt|sh|bash))/i);
|
|
184
|
-
const filepath = filepathMatch ? filepathMatch[1] : null;
|
|
185
|
-
const instruction = query.replace(new RegExp(filepath || '', 'gi'), '').trim();
|
|
186
|
-
return { filepath, instruction };
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
//# sourceMappingURL=deterministic-workflows.js.map
|