@leverageaiapps/locus-dev 2.0.1 → 2.0.2-dev
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/ai-agent.d.ts +67 -0
- package/dist/ai-agent.d.ts.map +1 -0
- package/dist/ai-agent.js +321 -0
- package/dist/ai-agent.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Agent for Locus
|
|
3
|
+
*
|
|
4
|
+
* Handles Claude API calls and tool use loop for autonomous task execution.
|
|
5
|
+
* This allows Locus to execute multi-step AI tasks independently of the iOS app.
|
|
6
|
+
*/
|
|
7
|
+
export interface AIAgentConfig {
|
|
8
|
+
apiKey: string;
|
|
9
|
+
model?: string;
|
|
10
|
+
maxTokens?: number;
|
|
11
|
+
maxIterations?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface AIAgentPayload {
|
|
14
|
+
message: string;
|
|
15
|
+
conversationHistory?: ConversationMessage[];
|
|
16
|
+
systemPrompt?: string;
|
|
17
|
+
customApiKey?: string;
|
|
18
|
+
context?: any;
|
|
19
|
+
}
|
|
20
|
+
export interface ConversationMessage {
|
|
21
|
+
role: 'user' | 'assistant';
|
|
22
|
+
content: string | ContentBlock[];
|
|
23
|
+
}
|
|
24
|
+
export interface ContentBlock {
|
|
25
|
+
type: 'text' | 'tool_use' | 'tool_result';
|
|
26
|
+
text?: string;
|
|
27
|
+
id?: string;
|
|
28
|
+
name?: string;
|
|
29
|
+
input?: any;
|
|
30
|
+
tool_use_id?: string;
|
|
31
|
+
content?: string;
|
|
32
|
+
is_error?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface AIAgentCallbacks {
|
|
35
|
+
onTextDelta: (text: string) => void;
|
|
36
|
+
onToolCall: (name: string, input: any) => void;
|
|
37
|
+
onToolResult: (name: string, result: string, isError: boolean) => void;
|
|
38
|
+
onComplete: (finalResponse: string) => void;
|
|
39
|
+
onError: (error: string) => void;
|
|
40
|
+
executeCommand: (command: string) => Promise<{
|
|
41
|
+
output: string;
|
|
42
|
+
exitCode: number;
|
|
43
|
+
}>;
|
|
44
|
+
readFile?: (path: string) => Promise<string>;
|
|
45
|
+
writeFile?: (path: string, content: string) => Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
export declare class AIAgent {
|
|
48
|
+
private client;
|
|
49
|
+
private model;
|
|
50
|
+
private maxTokens;
|
|
51
|
+
private maxIterations;
|
|
52
|
+
private cancelled;
|
|
53
|
+
constructor(config: AIAgentConfig);
|
|
54
|
+
/**
|
|
55
|
+
* Cancel the current execution
|
|
56
|
+
*/
|
|
57
|
+
cancel(): void;
|
|
58
|
+
/**
|
|
59
|
+
* Execute an AI chat task with tool use loop
|
|
60
|
+
*/
|
|
61
|
+
execute(payload: AIAgentPayload, callbacks: AIAgentCallbacks): Promise<string>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get API key from various sources (priority order)
|
|
65
|
+
*/
|
|
66
|
+
export declare function getApiKey(payloadKey?: string): string | null;
|
|
67
|
+
//# sourceMappingURL=ai-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-agent.d.ts","sourceRoot":"","sources":["../src/ai-agent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,GAAG,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,aAAa,CAAC;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC7B,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/C,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvE,UAAU,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnF,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE;AAqFD,qBAAa,OAAO;IAChB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,SAAS,CAAkB;gBAEvB,MAAM,EAAE,aAAa;IASjC;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACG,OAAO,CACT,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,gBAAgB,GAC5B,OAAO,CAAC,MAAM,CAAC;CAqNrB;AAMD;;GAEG;AACH,wBAAgB,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgB5D"}
|
package/dist/ai-agent.js
ADDED
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AI Agent for Locus
|
|
4
|
+
*
|
|
5
|
+
* Handles Claude API calls and tool use loop for autonomous task execution.
|
|
6
|
+
* This allows Locus to execute multi-step AI tasks independently of the iOS app.
|
|
7
|
+
*/
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.AIAgent = void 0;
|
|
13
|
+
exports.getApiKey = getApiKey;
|
|
14
|
+
const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Tool Definitions
|
|
17
|
+
// ============================================================================
|
|
18
|
+
const TOOLS = [
|
|
19
|
+
{
|
|
20
|
+
name: 'bash',
|
|
21
|
+
description: 'Execute a bash command on the user\'s computer. Use this to run shell commands, scripts, or interact with the file system. The command will be executed in the user\'s terminal.',
|
|
22
|
+
input_schema: {
|
|
23
|
+
type: 'object',
|
|
24
|
+
properties: {
|
|
25
|
+
command: {
|
|
26
|
+
type: 'string',
|
|
27
|
+
description: 'The bash command to execute'
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
required: ['command']
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'read_file',
|
|
35
|
+
description: 'Read the contents of a file at the specified path.',
|
|
36
|
+
input_schema: {
|
|
37
|
+
type: 'object',
|
|
38
|
+
properties: {
|
|
39
|
+
path: {
|
|
40
|
+
type: 'string',
|
|
41
|
+
description: 'The absolute path to the file to read'
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
required: ['path']
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: 'write_file',
|
|
49
|
+
description: 'Write content to a file at the specified path. Creates the file if it doesn\'t exist, overwrites if it does.',
|
|
50
|
+
input_schema: {
|
|
51
|
+
type: 'object',
|
|
52
|
+
properties: {
|
|
53
|
+
path: {
|
|
54
|
+
type: 'string',
|
|
55
|
+
description: 'The absolute path to the file to write'
|
|
56
|
+
},
|
|
57
|
+
content: {
|
|
58
|
+
type: 'string',
|
|
59
|
+
description: 'The content to write to the file'
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
required: ['path', 'content']
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
];
|
|
66
|
+
// ============================================================================
|
|
67
|
+
// System Prompt
|
|
68
|
+
// ============================================================================
|
|
69
|
+
const DEFAULT_SYSTEM_PROMPT = `You are an AI assistant with access to the user's computer through a terminal connection. You can execute bash commands and interact with the file system to help the user accomplish tasks.
|
|
70
|
+
|
|
71
|
+
## Capabilities
|
|
72
|
+
- Execute bash commands using the 'bash' tool
|
|
73
|
+
- Read files using the 'read_file' tool
|
|
74
|
+
- Write files using the 'write_file' tool
|
|
75
|
+
|
|
76
|
+
## Guidelines
|
|
77
|
+
1. Always explain what you're about to do before executing commands
|
|
78
|
+
2. For complex tasks, break them down into steps
|
|
79
|
+
3. Handle errors gracefully and explain what went wrong
|
|
80
|
+
4. Be careful with destructive operations (rm, overwriting files, etc.)
|
|
81
|
+
5. When working with files, prefer using absolute paths
|
|
82
|
+
6. For long-running commands, consider running them in the background
|
|
83
|
+
|
|
84
|
+
## Output Format
|
|
85
|
+
- Provide clear, concise responses
|
|
86
|
+
- Show relevant command output to the user
|
|
87
|
+
- Summarize results after completing tasks
|
|
88
|
+
|
|
89
|
+
Remember: You're running directly on the user's computer, so be careful and responsible with system operations.`;
|
|
90
|
+
// ============================================================================
|
|
91
|
+
// AI Agent Class
|
|
92
|
+
// ============================================================================
|
|
93
|
+
class AIAgent {
|
|
94
|
+
constructor(config) {
|
|
95
|
+
this.cancelled = false;
|
|
96
|
+
this.client = new sdk_1.default({
|
|
97
|
+
apiKey: config.apiKey
|
|
98
|
+
});
|
|
99
|
+
this.model = config.model || 'claude-sonnet-4-20250514';
|
|
100
|
+
this.maxTokens = config.maxTokens || 8192;
|
|
101
|
+
this.maxIterations = config.maxIterations || 50;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Cancel the current execution
|
|
105
|
+
*/
|
|
106
|
+
cancel() {
|
|
107
|
+
this.cancelled = true;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Execute an AI chat task with tool use loop
|
|
111
|
+
*/
|
|
112
|
+
async execute(payload, callbacks) {
|
|
113
|
+
this.cancelled = false;
|
|
114
|
+
const systemPrompt = payload.systemPrompt || DEFAULT_SYSTEM_PROMPT;
|
|
115
|
+
// Build initial messages
|
|
116
|
+
const messages = [];
|
|
117
|
+
// Add conversation history if provided
|
|
118
|
+
if (payload.conversationHistory) {
|
|
119
|
+
for (const msg of payload.conversationHistory) {
|
|
120
|
+
messages.push({
|
|
121
|
+
role: msg.role,
|
|
122
|
+
content: msg.content
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Add the new user message
|
|
127
|
+
messages.push({
|
|
128
|
+
role: 'user',
|
|
129
|
+
content: payload.message
|
|
130
|
+
});
|
|
131
|
+
let fullResponse = '';
|
|
132
|
+
let iterations = 0;
|
|
133
|
+
// Tool use loop
|
|
134
|
+
while (iterations < this.maxIterations && !this.cancelled) {
|
|
135
|
+
iterations++;
|
|
136
|
+
console.log(` [AIAgent] Iteration ${iterations}/${this.maxIterations}`);
|
|
137
|
+
try {
|
|
138
|
+
// Call Claude API with streaming
|
|
139
|
+
const response = await this.client.messages.create({
|
|
140
|
+
model: this.model,
|
|
141
|
+
max_tokens: this.maxTokens,
|
|
142
|
+
system: systemPrompt,
|
|
143
|
+
tools: TOOLS,
|
|
144
|
+
messages: messages,
|
|
145
|
+
stream: true
|
|
146
|
+
});
|
|
147
|
+
let currentTextContent = '';
|
|
148
|
+
let toolUseBlocks = [];
|
|
149
|
+
let currentToolUse = null;
|
|
150
|
+
let stopReason = null;
|
|
151
|
+
// Process streaming response
|
|
152
|
+
for await (const event of response) {
|
|
153
|
+
if (this.cancelled) {
|
|
154
|
+
console.log(' [AIAgent] Cancelled');
|
|
155
|
+
return fullResponse;
|
|
156
|
+
}
|
|
157
|
+
switch (event.type) {
|
|
158
|
+
case 'content_block_start':
|
|
159
|
+
if (event.content_block.type === 'tool_use') {
|
|
160
|
+
currentToolUse = {
|
|
161
|
+
id: event.content_block.id,
|
|
162
|
+
name: event.content_block.name,
|
|
163
|
+
inputJson: ''
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
break;
|
|
167
|
+
case 'content_block_delta':
|
|
168
|
+
if (event.delta.type === 'text_delta') {
|
|
169
|
+
currentTextContent += event.delta.text;
|
|
170
|
+
fullResponse += event.delta.text;
|
|
171
|
+
callbacks.onTextDelta(event.delta.text);
|
|
172
|
+
}
|
|
173
|
+
else if (event.delta.type === 'input_json_delta' && currentToolUse) {
|
|
174
|
+
currentToolUse.inputJson += event.delta.partial_json;
|
|
175
|
+
}
|
|
176
|
+
break;
|
|
177
|
+
case 'content_block_stop':
|
|
178
|
+
if (currentToolUse) {
|
|
179
|
+
try {
|
|
180
|
+
const input = JSON.parse(currentToolUse.inputJson);
|
|
181
|
+
toolUseBlocks.push({
|
|
182
|
+
id: currentToolUse.id,
|
|
183
|
+
name: currentToolUse.name,
|
|
184
|
+
input
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
catch (e) {
|
|
188
|
+
console.error(' [AIAgent] Failed to parse tool input:', e);
|
|
189
|
+
}
|
|
190
|
+
currentToolUse = null;
|
|
191
|
+
}
|
|
192
|
+
break;
|
|
193
|
+
case 'message_delta':
|
|
194
|
+
stopReason = event.delta.stop_reason;
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Build assistant message content for history
|
|
199
|
+
const assistantContent = [];
|
|
200
|
+
if (currentTextContent) {
|
|
201
|
+
assistantContent.push({ type: 'text', text: currentTextContent });
|
|
202
|
+
}
|
|
203
|
+
for (const tool of toolUseBlocks) {
|
|
204
|
+
assistantContent.push({
|
|
205
|
+
type: 'tool_use',
|
|
206
|
+
id: tool.id,
|
|
207
|
+
name: tool.name,
|
|
208
|
+
input: tool.input
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
// Add assistant message to history
|
|
212
|
+
messages.push({
|
|
213
|
+
role: 'assistant',
|
|
214
|
+
content: assistantContent
|
|
215
|
+
});
|
|
216
|
+
// Check if we need to execute tools
|
|
217
|
+
if (stopReason === 'tool_use' && toolUseBlocks.length > 0) {
|
|
218
|
+
const toolResults = [];
|
|
219
|
+
for (const tool of toolUseBlocks) {
|
|
220
|
+
callbacks.onToolCall(tool.name, tool.input);
|
|
221
|
+
let result;
|
|
222
|
+
let isError = false;
|
|
223
|
+
try {
|
|
224
|
+
switch (tool.name) {
|
|
225
|
+
case 'bash':
|
|
226
|
+
const cmdResult = await callbacks.executeCommand(tool.input.command);
|
|
227
|
+
result = cmdResult.output;
|
|
228
|
+
isError = cmdResult.exitCode !== 0;
|
|
229
|
+
break;
|
|
230
|
+
case 'read_file':
|
|
231
|
+
if (callbacks.readFile) {
|
|
232
|
+
result = await callbacks.readFile(tool.input.path);
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
// Fallback to bash cat
|
|
236
|
+
const readResult = await callbacks.executeCommand(`cat "${tool.input.path}"`);
|
|
237
|
+
result = readResult.output;
|
|
238
|
+
isError = readResult.exitCode !== 0;
|
|
239
|
+
}
|
|
240
|
+
break;
|
|
241
|
+
case 'write_file':
|
|
242
|
+
if (callbacks.writeFile) {
|
|
243
|
+
await callbacks.writeFile(tool.input.path, tool.input.content);
|
|
244
|
+
result = `File written successfully: ${tool.input.path}`;
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
// Fallback to bash
|
|
248
|
+
const escapedContent = tool.input.content.replace(/'/g, "'\\''");
|
|
249
|
+
const writeResult = await callbacks.executeCommand(`cat > "${tool.input.path}" << 'LOCUS_EOF'\n${tool.input.content}\nLOCUS_EOF`);
|
|
250
|
+
result = writeResult.exitCode === 0
|
|
251
|
+
? `File written successfully: ${tool.input.path}`
|
|
252
|
+
: writeResult.output;
|
|
253
|
+
isError = writeResult.exitCode !== 0;
|
|
254
|
+
}
|
|
255
|
+
break;
|
|
256
|
+
default:
|
|
257
|
+
result = `Unknown tool: ${tool.name}`;
|
|
258
|
+
isError = true;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
result = `Error executing ${tool.name}: ${error.message}`;
|
|
263
|
+
isError = true;
|
|
264
|
+
}
|
|
265
|
+
callbacks.onToolResult(tool.name, result, isError);
|
|
266
|
+
toolResults.push({
|
|
267
|
+
type: 'tool_result',
|
|
268
|
+
tool_use_id: tool.id,
|
|
269
|
+
content: result,
|
|
270
|
+
is_error: isError
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
// Add tool results to messages
|
|
274
|
+
messages.push({
|
|
275
|
+
role: 'user',
|
|
276
|
+
content: toolResults
|
|
277
|
+
});
|
|
278
|
+
// Continue the loop to get Claude's response to tool results
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
// No more tool calls, we're done
|
|
282
|
+
callbacks.onComplete(fullResponse);
|
|
283
|
+
return fullResponse;
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
console.error(' [AIAgent] Error:', error.message);
|
|
287
|
+
callbacks.onError(error.message);
|
|
288
|
+
throw error;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
if (this.cancelled) {
|
|
292
|
+
return fullResponse;
|
|
293
|
+
}
|
|
294
|
+
// Max iterations reached
|
|
295
|
+
const maxIterError = `Max iterations (${this.maxIterations}) reached`;
|
|
296
|
+
callbacks.onError(maxIterError);
|
|
297
|
+
throw new Error(maxIterError);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
exports.AIAgent = AIAgent;
|
|
301
|
+
// ============================================================================
|
|
302
|
+
// Helper: Get API Key
|
|
303
|
+
// ============================================================================
|
|
304
|
+
/**
|
|
305
|
+
* Get API key from various sources (priority order)
|
|
306
|
+
*/
|
|
307
|
+
function getApiKey(payloadKey) {
|
|
308
|
+
// 1. Environment variable
|
|
309
|
+
if (process.env.ANTHROPIC_API_KEY) {
|
|
310
|
+
return process.env.ANTHROPIC_API_KEY;
|
|
311
|
+
}
|
|
312
|
+
// 2. Payload (from iOS app)
|
|
313
|
+
if (payloadKey) {
|
|
314
|
+
return payloadKey;
|
|
315
|
+
}
|
|
316
|
+
// 3. Local config file (TODO: implement)
|
|
317
|
+
// const localKey = loadLocalConfig()?.apiKey;
|
|
318
|
+
// if (localKey) return localKey;
|
|
319
|
+
return null;
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=ai-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-agent.js","sourceRoot":"","sources":["../src/ai-agent.ts"],"names":[],"mappings":"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"}
|