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,314 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Infrastructure: Agent-to-Agent (A2A) Communication Protocol
|
|
3
|
-
* Enables Codehere to communicate with other AI agents
|
|
4
|
-
* Standard protocol for agent collaboration and delegation
|
|
5
|
-
*
|
|
6
|
-
* Based on research: A2A Protocol (Linux Foundation/Google)
|
|
7
|
-
* - 3-layer architecture: Canonical Data Model, Abstract Operations, Protocol Bindings
|
|
8
|
-
* - Protocol Buffer messages for data integrity
|
|
9
|
-
* - Supports JSON-RPC, gRPC, HTTP/REST bindings
|
|
10
|
-
* - Agentic AI Metadata for capability discovery
|
|
11
|
-
* - Asynchronous tasks with webhooks
|
|
12
|
-
* - Server-Sent Events (SSE) for streaming
|
|
13
|
-
* - Agent Opacity (black box service economy)
|
|
14
|
-
*
|
|
15
|
-
* Vision: Codehere as "The Memory Agent" - other agents call Codehere for memory/context
|
|
16
|
-
* Research: See docs/NOTEBOOKLM_RESEARCH_PROMPTS.md - Prompt #5
|
|
17
|
-
*/
|
|
18
|
-
/**
|
|
19
|
-
* A2A Protocol Handler
|
|
20
|
-
* Handles agent-to-agent communication
|
|
21
|
-
*/
|
|
22
|
-
export class A2AProtocol {
|
|
23
|
-
agentId;
|
|
24
|
-
agentName;
|
|
25
|
-
agents = new Map();
|
|
26
|
-
messageHandlers = new Map();
|
|
27
|
-
pendingRequests = new Map();
|
|
28
|
-
constructor(agentId, agentName) {
|
|
29
|
-
this.agentId = agentId;
|
|
30
|
-
this.agentName = agentName;
|
|
31
|
-
// Register self
|
|
32
|
-
this.registerAgent({
|
|
33
|
-
id: this.agentId,
|
|
34
|
-
name: this.agentName,
|
|
35
|
-
capabilities: ['memory_query', 'memory_store', 'code_search', 'code_explain', 'code_edit'],
|
|
36
|
-
local: true,
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Register an agent
|
|
41
|
-
*/
|
|
42
|
-
registerAgent(agent) {
|
|
43
|
-
this.agents.set(agent.id, agent);
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Unregister an agent
|
|
47
|
-
*/
|
|
48
|
-
unregisterAgent(agentId) {
|
|
49
|
-
this.agents.delete(agentId);
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Register a message handler
|
|
53
|
-
*/
|
|
54
|
-
registerHandler(action, handler) {
|
|
55
|
-
this.messageHandlers.set(action, handler);
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Send a request to another agent
|
|
59
|
-
*/
|
|
60
|
-
async sendRequest(to, action, payload, timeout = 30000) {
|
|
61
|
-
const agent = this.agents.get(to);
|
|
62
|
-
if (!agent) {
|
|
63
|
-
throw new Error(`Agent not found: ${to}`);
|
|
64
|
-
}
|
|
65
|
-
const messageId = this.generateMessageId();
|
|
66
|
-
const request = {
|
|
67
|
-
id: messageId,
|
|
68
|
-
from: this.agentId,
|
|
69
|
-
to,
|
|
70
|
-
type: 'request',
|
|
71
|
-
action,
|
|
72
|
-
payload,
|
|
73
|
-
timestamp: Date.now(),
|
|
74
|
-
};
|
|
75
|
-
// Create promise for response
|
|
76
|
-
return new Promise((resolve, reject) => {
|
|
77
|
-
// Set timeout
|
|
78
|
-
const timeoutHandle = setTimeout(() => {
|
|
79
|
-
this.pendingRequests.delete(messageId);
|
|
80
|
-
reject(new Error(`Request timeout: ${action} to ${to}`));
|
|
81
|
-
}, timeout);
|
|
82
|
-
// Store pending request
|
|
83
|
-
this.pendingRequests.set(messageId, {
|
|
84
|
-
resolve,
|
|
85
|
-
reject,
|
|
86
|
-
timeout: timeoutHandle,
|
|
87
|
-
});
|
|
88
|
-
// Send request
|
|
89
|
-
if (agent.local) {
|
|
90
|
-
// Local agent - handle directly
|
|
91
|
-
this.handleLocalRequest(request).catch(reject);
|
|
92
|
-
}
|
|
93
|
-
else if (agent.endpoint) {
|
|
94
|
-
// Remote agent - send via HTTP
|
|
95
|
-
this.sendHTTPRequest(agent.endpoint, request).catch(reject);
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
clearTimeout(timeoutHandle);
|
|
99
|
-
this.pendingRequests.delete(messageId);
|
|
100
|
-
reject(new Error(`Agent has no endpoint: ${to}`));
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Handle incoming message
|
|
106
|
-
*/
|
|
107
|
-
async handleMessage(message) {
|
|
108
|
-
if (message.type === 'request') {
|
|
109
|
-
return await this.handleRequest(message);
|
|
110
|
-
}
|
|
111
|
-
else if (message.type === 'response') {
|
|
112
|
-
return await this.handleResponse(message);
|
|
113
|
-
}
|
|
114
|
-
else if (message.type === 'notification') {
|
|
115
|
-
return await this.handleNotification(message);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Handle incoming request
|
|
120
|
-
*/
|
|
121
|
-
async handleRequest(request) {
|
|
122
|
-
const handler = this.messageHandlers.get(request.action);
|
|
123
|
-
if (!handler) {
|
|
124
|
-
return {
|
|
125
|
-
id: this.generateMessageId(),
|
|
126
|
-
from: this.agentId,
|
|
127
|
-
to: request.from,
|
|
128
|
-
type: 'response',
|
|
129
|
-
action: request.action,
|
|
130
|
-
payload: {},
|
|
131
|
-
timestamp: Date.now(),
|
|
132
|
-
correlationId: request.id,
|
|
133
|
-
success: false,
|
|
134
|
-
error: `Unknown action: ${request.action}`,
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
try {
|
|
138
|
-
const response = await handler(request);
|
|
139
|
-
response.correlationId = request.id;
|
|
140
|
-
return response;
|
|
141
|
-
}
|
|
142
|
-
catch (error) {
|
|
143
|
-
return {
|
|
144
|
-
id: this.generateMessageId(),
|
|
145
|
-
from: this.agentId,
|
|
146
|
-
to: request.from,
|
|
147
|
-
type: 'response',
|
|
148
|
-
action: request.action,
|
|
149
|
-
payload: {},
|
|
150
|
-
timestamp: Date.now(),
|
|
151
|
-
correlationId: request.id,
|
|
152
|
-
success: false,
|
|
153
|
-
error: error instanceof Error ? error.message : String(error),
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Handle incoming response
|
|
159
|
-
*/
|
|
160
|
-
async handleResponse(response) {
|
|
161
|
-
if (response.correlationId) {
|
|
162
|
-
const pending = this.pendingRequests.get(response.correlationId);
|
|
163
|
-
if (pending) {
|
|
164
|
-
clearTimeout(pending.timeout);
|
|
165
|
-
this.pendingRequests.delete(response.correlationId);
|
|
166
|
-
if (response.success) {
|
|
167
|
-
pending.resolve(response);
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
pending.reject(new Error(response.error || 'Request failed'));
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Handle incoming notification
|
|
177
|
-
*/
|
|
178
|
-
async handleNotification(notification) {
|
|
179
|
-
// Handle notifications (e.g., agent discovery, status updates)
|
|
180
|
-
// Can be extended for specific notification types
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Handle local request (same process)
|
|
184
|
-
*/
|
|
185
|
-
async handleLocalRequest(request) {
|
|
186
|
-
const response = await this.handleRequest(request);
|
|
187
|
-
// Send response back
|
|
188
|
-
await this.handleMessage(response);
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Send HTTP request to remote agent
|
|
192
|
-
*/
|
|
193
|
-
async sendHTTPRequest(endpoint, request) {
|
|
194
|
-
// TODO: Implement HTTP transport for remote agents
|
|
195
|
-
// For now, local-only
|
|
196
|
-
throw new Error('HTTP transport not yet implemented');
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Generate unique message ID
|
|
200
|
-
*/
|
|
201
|
-
generateMessageId() {
|
|
202
|
-
return `${this.agentId}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Get registered agents
|
|
206
|
-
*/
|
|
207
|
-
getAgents() {
|
|
208
|
-
return Array.from(this.agents.values());
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Discover agents (local discovery for now)
|
|
212
|
-
*/
|
|
213
|
-
discoverAgents() {
|
|
214
|
-
// For now, return registered agents
|
|
215
|
-
// In future, can implement mDNS, service registry, etc.
|
|
216
|
-
return this.getAgents();
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* Codehere A2A Agent Interface
|
|
221
|
-
* Exposes Codehere capabilities to other agents
|
|
222
|
-
*/
|
|
223
|
-
export class CodehereA2AAgent {
|
|
224
|
-
protocol;
|
|
225
|
-
container;
|
|
226
|
-
constructor(container) {
|
|
227
|
-
this.container = container;
|
|
228
|
-
this.protocol = new A2AProtocol('codehere', 'Codehere');
|
|
229
|
-
// Register handlers
|
|
230
|
-
this.registerHandlers();
|
|
231
|
-
}
|
|
232
|
-
/**
|
|
233
|
-
* Register A2A message handlers
|
|
234
|
-
*/
|
|
235
|
-
registerHandlers() {
|
|
236
|
-
// Memory query handler
|
|
237
|
-
this.protocol.registerHandler('memory_query', async (request) => {
|
|
238
|
-
const memoryStream = this.container.memoryStreamService;
|
|
239
|
-
const memories = await memoryStream.retrieve(request.payload.query, request.payload.limit || 10);
|
|
240
|
-
return {
|
|
241
|
-
id: this.protocol['generateMessageId'](),
|
|
242
|
-
from: 'codehere',
|
|
243
|
-
to: request.from,
|
|
244
|
-
type: 'response',
|
|
245
|
-
action: 'memory_query',
|
|
246
|
-
payload: {
|
|
247
|
-
memories: memories.map((m) => ({
|
|
248
|
-
type: m.type,
|
|
249
|
-
description: m.description,
|
|
250
|
-
timestamp: m.timestamp,
|
|
251
|
-
importance: m.importance,
|
|
252
|
-
})),
|
|
253
|
-
},
|
|
254
|
-
timestamp: Date.now(),
|
|
255
|
-
correlationId: request.id,
|
|
256
|
-
success: true,
|
|
257
|
-
};
|
|
258
|
-
});
|
|
259
|
-
// Code search handler
|
|
260
|
-
this.protocol.registerHandler('code_search', async (request) => {
|
|
261
|
-
const useCase = this.container.askQuestionUseCase;
|
|
262
|
-
const result = await useCase.execute({
|
|
263
|
-
query: request.payload.query,
|
|
264
|
-
maxResults: request.payload.maxResults || 10,
|
|
265
|
-
});
|
|
266
|
-
return {
|
|
267
|
-
id: this.protocol['generateMessageId'](),
|
|
268
|
-
from: 'codehere',
|
|
269
|
-
to: request.from,
|
|
270
|
-
type: 'response',
|
|
271
|
-
action: 'code_search',
|
|
272
|
-
payload: {
|
|
273
|
-
chunks: result.chunks.map((chunk) => ({
|
|
274
|
-
filepath: chunk.filepath,
|
|
275
|
-
content: chunk.content.substring(0, 500),
|
|
276
|
-
score: chunk.score,
|
|
277
|
-
})),
|
|
278
|
-
},
|
|
279
|
-
timestamp: Date.now(),
|
|
280
|
-
correlationId: request.id,
|
|
281
|
-
success: true,
|
|
282
|
-
};
|
|
283
|
-
});
|
|
284
|
-
// Memory store handler
|
|
285
|
-
this.protocol.registerHandler('memory_store', async (request) => {
|
|
286
|
-
const memoryStream = this.container.memoryStreamService;
|
|
287
|
-
await memoryStream.recordObservation(request.payload.description, request.payload.metadata || {});
|
|
288
|
-
return {
|
|
289
|
-
id: this.protocol['generateMessageId'](),
|
|
290
|
-
from: 'codehere',
|
|
291
|
-
to: request.from,
|
|
292
|
-
type: 'response',
|
|
293
|
-
action: 'memory_store',
|
|
294
|
-
payload: {},
|
|
295
|
-
timestamp: Date.now(),
|
|
296
|
-
correlationId: request.id,
|
|
297
|
-
success: true,
|
|
298
|
-
};
|
|
299
|
-
});
|
|
300
|
-
}
|
|
301
|
-
/**
|
|
302
|
-
* Get A2A protocol instance
|
|
303
|
-
*/
|
|
304
|
-
getProtocol() {
|
|
305
|
-
return this.protocol;
|
|
306
|
-
}
|
|
307
|
-
/**
|
|
308
|
-
* Send request to another agent
|
|
309
|
-
*/
|
|
310
|
-
async sendRequest(to, action, payload) {
|
|
311
|
-
return await this.protocol.sendRequest(to, action, payload);
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
//# sourceMappingURL=a2a-protocol.js.map
|
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Infrastructure: MCP OAuth 2.1 Security Implementation
|
|
3
|
-
* Implements OAuth 2.1 security for MCP servers
|
|
4
|
-
*
|
|
5
|
-
* Based on research findings:
|
|
6
|
-
* - OAuth 2.1 with Dynamic Client Registration
|
|
7
|
-
* - /.well-known/oauth-protected-resource endpoint
|
|
8
|
-
* - M2M tokens for agent-to-agent communication
|
|
9
|
-
* - Scoped permissions (least privilege)
|
|
10
|
-
* - T-BAC (Task-Based Access Control) ready
|
|
11
|
-
*/
|
|
12
|
-
/**
|
|
13
|
-
* OAuth 2.1 Provider for MCP Server
|
|
14
|
-
* Implements security as Resource Server
|
|
15
|
-
*/
|
|
16
|
-
export class MCPOAuthProvider {
|
|
17
|
-
scopes = new Map();
|
|
18
|
-
authorizationServer;
|
|
19
|
-
constructor(authorizationServer) {
|
|
20
|
-
this.authorizationServer = authorizationServer;
|
|
21
|
-
this.initializeDefaultScopes();
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Get OAuth-protected resource metadata
|
|
25
|
-
* Must implement /.well-known/oauth-protected-resource endpoint
|
|
26
|
-
*/
|
|
27
|
-
getMetadata() {
|
|
28
|
-
return {
|
|
29
|
-
issuer: this.authorizationServer || 'codehere',
|
|
30
|
-
authorization_endpoint: `${this.authorizationServer || 'https://auth.codehere.io'}/oauth/authorize`,
|
|
31
|
-
token_endpoint: `${this.authorizationServer || 'https://auth.codehere.io'}/oauth/token`,
|
|
32
|
-
registration_endpoint: `${this.authorizationServer || 'https://auth.codehere.io'}/oauth/register`,
|
|
33
|
-
introspection_endpoint: `${this.authorizationServer || 'https://auth.codehere.io'}/oauth/introspect`,
|
|
34
|
-
revocation_endpoint: `${this.authorizationServer || 'https://auth.codehere.io'}/oauth/revoke`,
|
|
35
|
-
scopes_supported: Array.from(this.scopes.keys()),
|
|
36
|
-
response_types_supported: ['code'],
|
|
37
|
-
grant_types_supported: [
|
|
38
|
-
'authorization_code',
|
|
39
|
-
'client_credentials', // For M2M tokens
|
|
40
|
-
'refresh_token',
|
|
41
|
-
],
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Validate OAuth token and check permissions
|
|
46
|
-
* Resource Server validates tokens from Authorization Server
|
|
47
|
-
*/
|
|
48
|
-
async validateToken(token, requiredScope) {
|
|
49
|
-
// TODO: Implement actual token validation with Authorization Server
|
|
50
|
-
// For now, return mock validation
|
|
51
|
-
// In production, call introspection endpoint or validate JWT
|
|
52
|
-
// Mock: Check if token exists and has required scope
|
|
53
|
-
if (!token || token === 'invalid') {
|
|
54
|
-
return { valid: false, error: 'Invalid token' };
|
|
55
|
-
}
|
|
56
|
-
// Extract scopes from token (in production, decode JWT or introspect)
|
|
57
|
-
const scopes = this.extractScopesFromToken(token);
|
|
58
|
-
if (requiredScope && !scopes.includes(requiredScope)) {
|
|
59
|
-
return {
|
|
60
|
-
valid: false,
|
|
61
|
-
error: `Missing required scope: ${requiredScope}`,
|
|
62
|
-
scopes,
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
return { valid: true, scopes };
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Check if token has required permission
|
|
69
|
-
* Supports T-BAC (Task-Based Access Control)
|
|
70
|
-
*/
|
|
71
|
-
hasPermission(token, task, tool) {
|
|
72
|
-
// T-BAC: Check permission for specific task/tool combination
|
|
73
|
-
// More granular than role-based access
|
|
74
|
-
return this.validateToken(token).then(result => {
|
|
75
|
-
if (!result.valid || !result.scopes) {
|
|
76
|
-
return false;
|
|
77
|
-
}
|
|
78
|
-
// Check if scope allows this task/tool combination
|
|
79
|
-
for (const scopeName of result.scopes) {
|
|
80
|
-
const scope = this.scopes.get(scopeName);
|
|
81
|
-
if (scope && scope.permissions.includes(`${task}:${tool || '*'}`)) {
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
return false;
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Initialize default OAuth scopes for MCP tools
|
|
90
|
-
*/
|
|
91
|
-
initializeDefaultScopes() {
|
|
92
|
-
// Scope: codehere:ask - Query codebase
|
|
93
|
-
this.scopes.set('codehere:ask', {
|
|
94
|
-
name: 'codehere:ask',
|
|
95
|
-
description: 'Ask questions about codebase using semantic search',
|
|
96
|
-
permissions: ['query:codebase'],
|
|
97
|
-
});
|
|
98
|
-
// Scope: codehere:explain - Explain code files
|
|
99
|
-
this.scopes.set('codehere:explain', {
|
|
100
|
-
name: 'codehere:explain',
|
|
101
|
-
description: 'Get detailed explanations of code files',
|
|
102
|
-
permissions: ['read:code', 'explain:code'],
|
|
103
|
-
});
|
|
104
|
-
// Scope: codehere:edit - Edit files
|
|
105
|
-
this.scopes.set('codehere:edit', {
|
|
106
|
-
name: 'codehere:edit',
|
|
107
|
-
description: 'Edit files with AI-generated changes',
|
|
108
|
-
permissions: ['write:code', 'edit:code'],
|
|
109
|
-
});
|
|
110
|
-
// Scope: codehere:memory:read - Read memory
|
|
111
|
-
this.scopes.set('codehere:memory:read', {
|
|
112
|
-
name: 'codehere:memory:read',
|
|
113
|
-
description: 'Query persistent episodic memory',
|
|
114
|
-
permissions: ['read:memory'],
|
|
115
|
-
});
|
|
116
|
-
// Scope: codehere:memory:write - Write memory
|
|
117
|
-
this.scopes.set('codehere:memory:write', {
|
|
118
|
-
name: 'codehere:memory:write',
|
|
119
|
-
description: 'Store information in persistent memory',
|
|
120
|
-
permissions: ['write:memory'],
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Extract scopes from token (mock implementation)
|
|
125
|
-
* In production: Decode JWT or call introspection endpoint
|
|
126
|
-
*/
|
|
127
|
-
extractScopesFromToken(token) {
|
|
128
|
-
// Mock: For now, return all scopes if token is valid
|
|
129
|
-
// In production, decode JWT claims or introspect token
|
|
130
|
-
if (token.startsWith('codehere_')) {
|
|
131
|
-
return Array.from(this.scopes.keys());
|
|
132
|
-
}
|
|
133
|
-
return [];
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* OAuth-protected MCP Server
|
|
138
|
-
* Wraps MCP server with OAuth 2.1 security
|
|
139
|
-
*/
|
|
140
|
-
export class OAuthProtectedMCPServer {
|
|
141
|
-
mcpServer;
|
|
142
|
-
oauthProvider;
|
|
143
|
-
constructor(mcpServer, oauthProvider) {
|
|
144
|
-
this.mcpServer = mcpServer;
|
|
145
|
-
this.oauthProvider = oauthProvider;
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Get OAuth metadata endpoint
|
|
149
|
-
* Implements /.well-known/oauth-protected-resource
|
|
150
|
-
*/
|
|
151
|
-
getOAuthMetadata() {
|
|
152
|
-
return this.oauthProvider.getMetadata();
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Call tool with OAuth validation
|
|
156
|
-
*/
|
|
157
|
-
async callToolWithAuth(token, name, args) {
|
|
158
|
-
// Determine required scope based on tool
|
|
159
|
-
const scopeMap = {
|
|
160
|
-
'codehere_ask': 'codehere:ask',
|
|
161
|
-
'codehere_explain': 'codehere:explain',
|
|
162
|
-
'codehere_edit': 'codehere:edit',
|
|
163
|
-
'codehere_search': 'codehere:ask',
|
|
164
|
-
'codehere_memory_query': 'codehere:memory:read',
|
|
165
|
-
};
|
|
166
|
-
const requiredScope = scopeMap[name];
|
|
167
|
-
// Validate token and scope
|
|
168
|
-
const validation = await this.oauthProvider.validateToken(token, requiredScope);
|
|
169
|
-
if (!validation.valid) {
|
|
170
|
-
return {
|
|
171
|
-
content: [
|
|
172
|
-
{
|
|
173
|
-
type: 'text',
|
|
174
|
-
text: `Authorization failed: ${validation.error}`,
|
|
175
|
-
},
|
|
176
|
-
],
|
|
177
|
-
isError: true,
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
// Call tool if authorized
|
|
181
|
-
return await this.mcpServer.callTool(name, args);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
//# sourceMappingURL=mcp-oauth.js.map
|