@nxuss/lemma 1.7.0 → 1.7.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/dist/esm/api/dashboardRoutes.d.ts +3 -3
- package/dist/esm/api/dashboardRoutes.js +1 -1
- package/dist/esm/api/server.d.ts +4 -4
- package/dist/esm/api/server.js +3 -3
- package/dist/esm/autopilot/AutopilotWatcher.js +3 -3
- package/dist/esm/autopilot/Notifier.d.ts +1 -1
- package/dist/esm/cli/lemma-proxy.js +14 -14
- package/dist/esm/cli/stack.d.ts +4 -4
- package/dist/esm/cli/stack.js +5 -5
- package/dist/esm/cloud/KeyManager.d.ts +1 -1
- package/dist/esm/cloud/KeyManager.js +1 -1
- package/dist/esm/cloud/TenantCache.d.ts +1 -1
- package/dist/esm/cloud/TenantCache.js +1 -1
- package/dist/esm/cloud/index.d.ts +3 -3
- package/dist/esm/cloud/index.js +3 -3
- package/dist/esm/cloud/server.d.ts +3 -3
- package/dist/esm/cloud/server.js +5 -5
- package/dist/esm/config/index.d.ts +1 -1
- package/dist/esm/config/index.js +1 -1
- package/dist/esm/consensus/index.d.ts +2 -2
- package/dist/esm/consensus/index.js +2 -2
- package/dist/esm/core/AgentRegistry.d.ts +1 -1
- package/dist/esm/core/AgentRegistry.js +1 -1
- package/dist/esm/core/DashboardBroadcaster.d.ts +3 -3
- package/dist/esm/core/DashboardBroadcaster.js +2 -2
- package/dist/esm/core/DashboardWebSocketServer.d.ts +1 -1
- package/dist/esm/core/DashboardWebSocketServer.js +1 -1
- package/dist/esm/core/GhostAlchemist.js +1 -1
- package/dist/esm/core/GhostListener.js +2 -2
- package/dist/esm/core/OrchestrationEngine.d.ts +3 -3
- package/dist/esm/core/OrchestrationEngine.js +2 -2
- package/dist/esm/core/SubconsciousEngine.d.ts +1 -1
- package/dist/esm/core/SubconsciousEngine.js +2 -2
- package/dist/esm/core/WebSocketServer.d.ts +2 -2
- package/dist/esm/core/WebSocketServer.js +1 -1
- package/dist/esm/core/index.d.ts +6 -6
- package/dist/esm/core/index.js +6 -6
- package/dist/esm/core/router.d.ts +3 -3
- package/dist/esm/core/router.js +1 -1
- package/dist/esm/db/database.js +1 -1
- package/dist/esm/embed.d.ts +2 -2
- package/dist/esm/embed.js +2 -2
- package/dist/esm/examples/basic-usage.js +1 -1
- package/dist/esm/index.d.ts +14 -14
- package/dist/esm/index.js +14 -14
- package/dist/esm/infra/analyzers/DriftDetector.d.ts +1 -1
- package/dist/esm/infra/analyzers/InfraAnalyzer.d.ts +1 -1
- package/dist/esm/infra/analyzers/MonolithAnalyzer.d.ts +1 -1
- package/dist/esm/infra/analyzers/index.d.ts +3 -3
- package/dist/esm/infra/analyzers/index.js +3 -3
- package/dist/esm/infra/cli.js +2 -2
- package/dist/esm/infra/config.d.ts +1 -1
- package/dist/esm/infra/index.d.ts +5 -5
- package/dist/esm/infra/index.js +5 -5
- package/dist/esm/infra/mcp-tools.js +5 -5
- package/dist/esm/infra/providers/InfraProvider.d.ts +1 -1
- package/dist/esm/infra/providers/JenkinsProvider.d.ts +2 -2
- package/dist/esm/infra/providers/OKDProvider.d.ts +2 -2
- package/dist/esm/infra/providers/TerraformProvider.d.ts +2 -2
- package/dist/esm/infra/providers/index.d.ts +5 -5
- package/dist/esm/infra/providers/index.js +3 -3
- package/dist/esm/mcp/index.js +5 -5
- package/dist/esm/mcp/resources.js +2 -2
- package/dist/esm/mcp/tools.js +38 -38
- package/dist/esm/observability/IdeContextSync.d.ts +1 -1
- package/dist/esm/observability/IdeContextSync.js +5 -5
- package/dist/esm/pr-review/PRReviewEngine.d.ts +1 -1
- package/dist/esm/pr-review/PRReviewEngine.js +4 -4
- package/dist/esm/pr-review/ReviewStore.d.ts +1 -1
- package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.d.ts +2 -2
- package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.js +1 -1
- package/dist/esm/pr-review/adapters/GitHubAdapter.d.ts +2 -2
- package/dist/esm/pr-review/adapters/GitHubAdapter.js +1 -1
- package/dist/esm/pr-review/adapters/GitLabAdapter.d.ts +2 -2
- package/dist/esm/pr-review/adapters/GitLabAdapter.js +1 -1
- package/dist/esm/pr-review/adapters/GitPlatformAdapter.d.ts +1 -1
- package/dist/esm/pr-review/adapters/index.d.ts +4 -4
- package/dist/esm/pr-review/adapters/index.js +3 -3
- package/dist/esm/pr-review/analyzers/QualityGrader.d.ts +1 -1
- package/dist/esm/pr-review/analyzers/RegressionDetector.d.ts +1 -1
- package/dist/esm/pr-review/analyzers/SecurityScanner.d.ts +1 -1
- package/dist/esm/pr-review/analyzers/StaticAnalyzer.d.ts +1 -1
- package/dist/esm/pr-review/analyzers/index.d.ts +8 -8
- package/dist/esm/pr-review/analyzers/index.js +4 -4
- package/dist/esm/pr-review/bridge/BrainBridge.d.ts +1 -1
- package/dist/esm/pr-review/bridge/BrainBridge.js +1 -1
- package/dist/esm/pr-review/bridge/index.d.ts +1 -1
- package/dist/esm/pr-review/bridge/index.js +1 -1
- package/dist/esm/pr-review/index.d.ts +4 -4
- package/dist/esm/pr-review/index.js +2 -2
- package/dist/esm/pr-review/reviewRunner.d.ts +2 -2
- package/dist/esm/pr-review/reviewRunner.js +6 -6
- package/dist/esm/pr-review/webhook/WebhookServer.js +1 -1
- package/dist/esm/pr-review/webhook/index.d.ts +1 -1
- package/dist/esm/pr-review/webhook/index.js +1 -1
- package/dist/esm/protocol/flows.d.ts +1 -1
- package/dist/esm/protocol/flows.js +1 -1
- package/dist/esm/protocol/index.d.ts +4 -4
- package/dist/esm/protocol/index.js +4 -4
- package/dist/esm/protocol/utils.d.ts +1 -1
- package/dist/esm/protocol/utils.js +2 -2
- package/dist/esm/protocol/validators.d.ts +1 -1
- package/dist/esm/protocol/validators.js +1 -1
- package/dist/esm/proxy/ContextInjector.d.ts +1 -1
- package/dist/esm/proxy/Gatekeeper.d.ts +1 -1
- package/dist/esm/security/SecurityMiddleware.d.ts +1 -1
- package/dist/esm/security/SecurityMiddleware.js +3 -3
- package/dist/esm/security/index.d.ts +4 -4
- package/dist/esm/security/index.js +4 -4
- package/dist/esm/speculative/SpeculativeCache.d.ts +2 -2
- package/dist/esm/speculative/SpeculativeEngine.d.ts +2 -2
- package/dist/esm/speculative/SpeculativeEngine.js +3 -3
- package/dist/esm/speculative/WorkerPool.d.ts +1 -1
- package/dist/esm/speculative/index.d.ts +4 -4
- package/dist/esm/speculative/index.js +4 -4
- package/dist/esm/subconscious/SemanticCache.d.ts +2 -2
- package/dist/esm/subconscious/SemanticCache.js +2 -2
- package/dist/esm/subconscious/SubconsciousEngine.d.ts +1 -1
- package/dist/esm/subconscious/SubconsciousEngine.js +3 -3
- package/dist/esm/subconscious/index.d.ts +4 -4
- package/dist/esm/subconscious/index.js +4 -4
- package/dist/esm/utils/AutoContextBundle.d.ts +1 -1
- package/dist/esm/utils/AutoContextBundle.js +4 -4
- package/dist/esm/utils/BulkFileDigest.js +2 -2
- package/dist/esm/utils/ClipboardWatcher.js +2 -2
- package/dist/esm/utils/ContextCollapser.js +1 -1
- package/dist/esm/utils/ExecutiveReport.js +1 -1
- package/dist/esm/utils/StructuralSearch.d.ts +1 -1
- package/dist/esm/utils/SurgicalASTInsert.js +1 -1
- package/dist/esm/utils/SymbolSurgicalContext.js +1 -1
- package/dist/esm/utils/TestAutofixInterceptor.js +1 -1
- package/dist/esm/utils/WorkspaceSearch.js +0 -0
- package/dist/esm/utils/logger.js +1 -1
- package/package.json +6 -9
- package/sdks/crewai/README.md +178 -0
- package/sdks/crewai/dist/index.d.ts +130 -0
- package/sdks/crewai/dist/index.js +308 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lemma Crew Configuration
|
|
3
|
+
*/
|
|
4
|
+
export interface LemmaCrewConfig {
|
|
5
|
+
/** WebSocket URL of the Lemma router */
|
|
6
|
+
routerUrl: string;
|
|
7
|
+
/** Agent ID */
|
|
8
|
+
agentId: string;
|
|
9
|
+
/** Agent role (CrewAI concept) */
|
|
10
|
+
role: string;
|
|
11
|
+
/** Agent goal */
|
|
12
|
+
goal: string;
|
|
13
|
+
/** Agent backstory */
|
|
14
|
+
backstory?: string;
|
|
15
|
+
/** Capabilities this agent provides */
|
|
16
|
+
capabilities?: string[];
|
|
17
|
+
/** Enable verbose logging */
|
|
18
|
+
verbose?: boolean;
|
|
19
|
+
/** Allow task delegation */
|
|
20
|
+
allowDelegation?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Task execution request
|
|
24
|
+
*/
|
|
25
|
+
export interface TaskRequest {
|
|
26
|
+
description: string;
|
|
27
|
+
expectedOutput?: string;
|
|
28
|
+
context?: any;
|
|
29
|
+
allowDelegation?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Task execution result
|
|
33
|
+
*/
|
|
34
|
+
export interface TaskResult {
|
|
35
|
+
success: boolean;
|
|
36
|
+
output?: string;
|
|
37
|
+
error?: string;
|
|
38
|
+
executionTime: number;
|
|
39
|
+
cached?: boolean;
|
|
40
|
+
similarity?: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* CrewAI Agent integrated with Lemma Router
|
|
44
|
+
*/
|
|
45
|
+
export declare class LemmaCrewAgent {
|
|
46
|
+
private ws;
|
|
47
|
+
private config;
|
|
48
|
+
private connected;
|
|
49
|
+
private pendingTasks;
|
|
50
|
+
constructor(config: LemmaCrewConfig);
|
|
51
|
+
/**
|
|
52
|
+
* Connect to Lemma router
|
|
53
|
+
*/
|
|
54
|
+
connect(): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Disconnect from router
|
|
57
|
+
*/
|
|
58
|
+
disconnect(): void;
|
|
59
|
+
/**
|
|
60
|
+
* Execute a task
|
|
61
|
+
*/
|
|
62
|
+
execute(task: TaskRequest): Promise<TaskResult>;
|
|
63
|
+
/**
|
|
64
|
+
* Handle incoming message from router
|
|
65
|
+
*/
|
|
66
|
+
private handleMessage;
|
|
67
|
+
/**
|
|
68
|
+
* Handle task assignment from router
|
|
69
|
+
*/
|
|
70
|
+
private handleTaskAssign;
|
|
71
|
+
/**
|
|
72
|
+
* Handle task response from router
|
|
73
|
+
*/
|
|
74
|
+
private handleTaskResponse;
|
|
75
|
+
/**
|
|
76
|
+
* Perform task (override in subclasses)
|
|
77
|
+
*/
|
|
78
|
+
protected performTask(description: string, parameters: any): Promise<string>;
|
|
79
|
+
/**
|
|
80
|
+
* Send message to router
|
|
81
|
+
*/
|
|
82
|
+
private send;
|
|
83
|
+
/**
|
|
84
|
+
* Log message if verbose
|
|
85
|
+
*/
|
|
86
|
+
private log;
|
|
87
|
+
/**
|
|
88
|
+
* Get agent info
|
|
89
|
+
*/
|
|
90
|
+
getInfo(): {
|
|
91
|
+
agentId: string;
|
|
92
|
+
role: string;
|
|
93
|
+
goal: string;
|
|
94
|
+
backstory: string;
|
|
95
|
+
capabilities: string[];
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Lemma Crew - Multi-agent orchestration
|
|
100
|
+
*/
|
|
101
|
+
export interface LemmaCrewOptions {
|
|
102
|
+
routerUrl: string;
|
|
103
|
+
agents: Omit<LemmaCrewConfig, 'routerUrl'>[];
|
|
104
|
+
verbose?: boolean;
|
|
105
|
+
}
|
|
106
|
+
export declare class LemmaCrew {
|
|
107
|
+
private agents;
|
|
108
|
+
private config;
|
|
109
|
+
constructor(config: LemmaCrewOptions);
|
|
110
|
+
/**
|
|
111
|
+
* Connect all agents
|
|
112
|
+
*/
|
|
113
|
+
connect(): Promise<void>;
|
|
114
|
+
/**
|
|
115
|
+
* Disconnect all agents
|
|
116
|
+
*/
|
|
117
|
+
disconnect(): void;
|
|
118
|
+
/**
|
|
119
|
+
* Execute a multi-agent workflow
|
|
120
|
+
*/
|
|
121
|
+
kickoff(options: {
|
|
122
|
+
task: string;
|
|
123
|
+
process?: 'sequential' | 'hierarchical';
|
|
124
|
+
}): Promise<any>;
|
|
125
|
+
/**
|
|
126
|
+
* Get all agents
|
|
127
|
+
*/
|
|
128
|
+
getAgents(): LemmaCrewAgent[];
|
|
129
|
+
}
|
|
130
|
+
export default LemmaCrewAgent;
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LemmaCrew = exports.LemmaCrewAgent = void 0;
|
|
7
|
+
const ws_1 = __importDefault(require("ws"));
|
|
8
|
+
const uuid_1 = require("uuid");
|
|
9
|
+
/**
|
|
10
|
+
* CrewAI Agent integrated with Lemma Router
|
|
11
|
+
*/
|
|
12
|
+
class LemmaCrewAgent {
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.ws = null;
|
|
15
|
+
this.connected = false;
|
|
16
|
+
this.pendingTasks = new Map();
|
|
17
|
+
this.config = {
|
|
18
|
+
routerUrl: config.routerUrl,
|
|
19
|
+
agentId: config.agentId,
|
|
20
|
+
role: config.role,
|
|
21
|
+
goal: config.goal,
|
|
22
|
+
backstory: config.backstory || '',
|
|
23
|
+
capabilities: config.capabilities || ['crewai'],
|
|
24
|
+
verbose: config.verbose || false,
|
|
25
|
+
allowDelegation: config.allowDelegation !== false,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Connect to Lemma router
|
|
30
|
+
*/
|
|
31
|
+
async connect() {
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
this.ws = new ws_1.default(this.config.routerUrl);
|
|
34
|
+
this.ws.on('open', () => {
|
|
35
|
+
this.log('Connected to Lemma router');
|
|
36
|
+
// Send handshake
|
|
37
|
+
this.send({
|
|
38
|
+
type: 'HANDSHAKE',
|
|
39
|
+
messageId: (0, uuid_1.v4)(),
|
|
40
|
+
timestamp: Date.now(),
|
|
41
|
+
payload: {
|
|
42
|
+
agentId: this.config.agentId,
|
|
43
|
+
agentName: `${this.config.role} (CrewAI)`,
|
|
44
|
+
version: '1.0.0',
|
|
45
|
+
capabilities: this.config.capabilities.map(name => ({
|
|
46
|
+
name,
|
|
47
|
+
version: '1.0.0',
|
|
48
|
+
})),
|
|
49
|
+
metadata: {
|
|
50
|
+
role: this.config.role,
|
|
51
|
+
goal: this.config.goal,
|
|
52
|
+
backstory: this.config.backstory,
|
|
53
|
+
framework: 'crewai',
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
this.ws.on('message', (data) => {
|
|
59
|
+
try {
|
|
60
|
+
const message = JSON.parse(data.toString());
|
|
61
|
+
this.handleMessage(message);
|
|
62
|
+
if (message.type === 'HANDSHAKE_ACK') {
|
|
63
|
+
this.connected = true;
|
|
64
|
+
this.log('Handshake acknowledged');
|
|
65
|
+
resolve();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
console.error('Error parsing message:', error);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
this.ws.on('error', (error) => {
|
|
73
|
+
console.error('WebSocket error:', error);
|
|
74
|
+
if (!this.connected) {
|
|
75
|
+
reject(error);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
this.ws.on('close', () => {
|
|
79
|
+
this.connected = false;
|
|
80
|
+
this.log('Disconnected from router');
|
|
81
|
+
});
|
|
82
|
+
// Connection timeout
|
|
83
|
+
setTimeout(() => {
|
|
84
|
+
if (!this.connected) {
|
|
85
|
+
reject(new Error('Connection timeout'));
|
|
86
|
+
}
|
|
87
|
+
}, 10000);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Disconnect from router
|
|
92
|
+
*/
|
|
93
|
+
disconnect() {
|
|
94
|
+
if (this.ws) {
|
|
95
|
+
this.ws.close();
|
|
96
|
+
this.ws = null;
|
|
97
|
+
this.connected = false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Execute a task
|
|
102
|
+
*/
|
|
103
|
+
async execute(task) {
|
|
104
|
+
if (!this.connected) {
|
|
105
|
+
throw new Error('Not connected to router. Call connect() first.');
|
|
106
|
+
}
|
|
107
|
+
const taskId = (0, uuid_1.v4)();
|
|
108
|
+
this.log(`Executing task: ${task.description}`);
|
|
109
|
+
return new Promise((resolve, reject) => {
|
|
110
|
+
this.pendingTasks.set(taskId, { resolve, reject });
|
|
111
|
+
// Send task request to router
|
|
112
|
+
this.send({
|
|
113
|
+
type: 'TASK_REQUEST',
|
|
114
|
+
messageId: (0, uuid_1.v4)(),
|
|
115
|
+
timestamp: Date.now(),
|
|
116
|
+
payload: {
|
|
117
|
+
taskId,
|
|
118
|
+
description: task.description,
|
|
119
|
+
requiredCapabilities: this.config.capabilities,
|
|
120
|
+
parameters: {
|
|
121
|
+
expectedOutput: task.expectedOutput,
|
|
122
|
+
context: task.context,
|
|
123
|
+
allowDelegation: task.allowDelegation ?? this.config.allowDelegation,
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Handle incoming message from router
|
|
131
|
+
*/
|
|
132
|
+
handleMessage(message) {
|
|
133
|
+
switch (message.type) {
|
|
134
|
+
case 'TASK_ASSIGN':
|
|
135
|
+
this.handleTaskAssign(message);
|
|
136
|
+
break;
|
|
137
|
+
case 'TASK_RESPONSE':
|
|
138
|
+
this.handleTaskResponse(message);
|
|
139
|
+
break;
|
|
140
|
+
case 'PING':
|
|
141
|
+
this.send({
|
|
142
|
+
type: 'PONG',
|
|
143
|
+
messageId: (0, uuid_1.v4)(),
|
|
144
|
+
timestamp: Date.now(),
|
|
145
|
+
payload: {
|
|
146
|
+
originalMessageId: message.messageId,
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Handle task assignment from router
|
|
154
|
+
*/
|
|
155
|
+
async handleTaskAssign(message) {
|
|
156
|
+
const { taskId, description, parameters } = message.payload;
|
|
157
|
+
const startTime = Date.now();
|
|
158
|
+
this.log(`Received task assignment: ${description}`);
|
|
159
|
+
try {
|
|
160
|
+
// Execute the task (override this method in subclasses)
|
|
161
|
+
const output = await this.performTask(description, parameters);
|
|
162
|
+
// Send response back to router
|
|
163
|
+
this.send({
|
|
164
|
+
type: 'TASK_RESPONSE',
|
|
165
|
+
messageId: (0, uuid_1.v4)(),
|
|
166
|
+
timestamp: Date.now(),
|
|
167
|
+
payload: {
|
|
168
|
+
taskId,
|
|
169
|
+
success: true,
|
|
170
|
+
result: output,
|
|
171
|
+
executionTime: Date.now() - startTime,
|
|
172
|
+
taskDescription: description,
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
this.send({
|
|
178
|
+
type: 'TASK_RESPONSE',
|
|
179
|
+
messageId: (0, uuid_1.v4)(),
|
|
180
|
+
timestamp: Date.now(),
|
|
181
|
+
payload: {
|
|
182
|
+
taskId,
|
|
183
|
+
success: false,
|
|
184
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
185
|
+
executionTime: Date.now() - startTime,
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Handle task response from router
|
|
192
|
+
*/
|
|
193
|
+
handleTaskResponse(message) {
|
|
194
|
+
const { taskId, success, result, error, executionTime, cached, similarity } = message.payload;
|
|
195
|
+
const pending = this.pendingTasks.get(taskId);
|
|
196
|
+
if (!pending) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
this.pendingTasks.delete(taskId);
|
|
200
|
+
if (success) {
|
|
201
|
+
this.log(`Task completed in ${executionTime}ms${cached ? ' (cached)' : ''}`);
|
|
202
|
+
pending.resolve({
|
|
203
|
+
success: true,
|
|
204
|
+
output: result,
|
|
205
|
+
executionTime,
|
|
206
|
+
cached,
|
|
207
|
+
similarity,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
pending.reject(new Error(error || 'Task failed'));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Perform task (override in subclasses)
|
|
216
|
+
*/
|
|
217
|
+
async performTask(description, parameters) {
|
|
218
|
+
// Default implementation - subclasses should override
|
|
219
|
+
return `Task completed: ${description}`;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Send message to router
|
|
223
|
+
*/
|
|
224
|
+
send(message) {
|
|
225
|
+
if (!this.ws || !this.connected) {
|
|
226
|
+
throw new Error('Not connected to router');
|
|
227
|
+
}
|
|
228
|
+
this.ws.send(JSON.stringify(message));
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Log message if verbose
|
|
232
|
+
*/
|
|
233
|
+
log(message) {
|
|
234
|
+
if (this.config.verbose) {
|
|
235
|
+
console.log(`[${this.config.role}] ${message}`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Get agent info
|
|
240
|
+
*/
|
|
241
|
+
getInfo() {
|
|
242
|
+
return {
|
|
243
|
+
agentId: this.config.agentId,
|
|
244
|
+
role: this.config.role,
|
|
245
|
+
goal: this.config.goal,
|
|
246
|
+
backstory: this.config.backstory,
|
|
247
|
+
capabilities: this.config.capabilities,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
exports.LemmaCrewAgent = LemmaCrewAgent;
|
|
252
|
+
class LemmaCrew {
|
|
253
|
+
constructor(config) {
|
|
254
|
+
this.agents = [];
|
|
255
|
+
this.config = config;
|
|
256
|
+
// Create agents
|
|
257
|
+
this.agents = config.agents.map(agentConfig => new LemmaCrewAgent({
|
|
258
|
+
...agentConfig,
|
|
259
|
+
routerUrl: config.routerUrl,
|
|
260
|
+
verbose: config.verbose,
|
|
261
|
+
}));
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Connect all agents
|
|
265
|
+
*/
|
|
266
|
+
async connect() {
|
|
267
|
+
await Promise.all(this.agents.map(agent => agent.connect()));
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Disconnect all agents
|
|
271
|
+
*/
|
|
272
|
+
disconnect() {
|
|
273
|
+
this.agents.forEach(agent => agent.disconnect());
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Execute a multi-agent workflow
|
|
277
|
+
*/
|
|
278
|
+
async kickoff(options) {
|
|
279
|
+
const { task, process = 'sequential' } = options;
|
|
280
|
+
if (process === 'sequential') {
|
|
281
|
+
// Execute tasks sequentially through agents
|
|
282
|
+
let result = task;
|
|
283
|
+
for (const agent of this.agents) {
|
|
284
|
+
const taskResult = await agent.execute({
|
|
285
|
+
description: result,
|
|
286
|
+
});
|
|
287
|
+
result = taskResult.output || result;
|
|
288
|
+
}
|
|
289
|
+
return result;
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
// Hierarchical - first agent coordinates others
|
|
293
|
+
const manager = this.agents[0];
|
|
294
|
+
return await manager.execute({
|
|
295
|
+
description: task,
|
|
296
|
+
allowDelegation: true,
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Get all agents
|
|
302
|
+
*/
|
|
303
|
+
getAgents() {
|
|
304
|
+
return this.agents;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
exports.LemmaCrew = LemmaCrew;
|
|
308
|
+
exports.default = LemmaCrewAgent;
|