expxagents 0.30.1 → 0.30.3
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/node_modules/@expxagents/agent/dist/agent.d.ts +4 -0
- package/node_modules/@expxagents/agent/dist/agent.js +115 -46
- package/node_modules/@expxagents/agent/dist/agent.js.map +1 -1
- package/node_modules/@expxagents/agent/dist/system-prompt.js +26 -19
- package/node_modules/@expxagents/agent/dist/system-prompt.js.map +1 -1
- package/package.json +1 -1
|
@@ -5,4 +5,8 @@ export declare class AgentRunner {
|
|
|
5
5
|
private sessionManager;
|
|
6
6
|
constructor(opts: AgentRunOptions);
|
|
7
7
|
run(prompt?: string): Promise<AgentResult>;
|
|
8
|
+
/** Extract readable error detail from provider errors */
|
|
9
|
+
private static extractErrorDetail;
|
|
10
|
+
/** Check if error is transient and worth retrying */
|
|
11
|
+
private static isRetryableError;
|
|
8
12
|
}
|
|
@@ -26,68 +26,137 @@ export class AgentRunner {
|
|
|
26
26
|
const cwd = this.opts.cwd;
|
|
27
27
|
const model = this.opts.model;
|
|
28
28
|
const maxSteps = this.opts.maxSteps ?? 30;
|
|
29
|
+
const maxRetries = 3;
|
|
29
30
|
const tools = createTools(cwd, this.opts.onAskUser);
|
|
30
31
|
const session = this.opts.sessionId
|
|
31
32
|
? this.sessionManager.getOrCreate(this.opts.sessionId, cwd)
|
|
32
33
|
: null;
|
|
33
34
|
const messages = [];
|
|
34
|
-
// Add session history if multi-turn
|
|
35
35
|
if (session) {
|
|
36
36
|
messages.push(...session.messages);
|
|
37
37
|
}
|
|
38
|
-
// Add current user message
|
|
39
38
|
messages.push({ role: 'user', content: userPrompt });
|
|
40
39
|
const toolCallRecords = [];
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const p = part;
|
|
52
|
-
if (p.type === 'text-delta' && p.textDelta) {
|
|
53
|
-
fullText += p.textDelta;
|
|
54
|
-
this.opts.onChunk?.(p.textDelta);
|
|
55
|
-
}
|
|
56
|
-
else if (p.type === 'tool-call') {
|
|
57
|
-
// Emit tool call immediately so dashboard/CLI shows progress
|
|
58
|
-
this.opts.onToolCall?.(p.toolName ?? 'unknown', p.args ?? {});
|
|
59
|
-
toolCallRecords.push({
|
|
60
|
-
tool: p.toolName ?? 'unknown',
|
|
61
|
-
args: p.args ?? {},
|
|
62
|
-
result: '',
|
|
63
|
-
durationMs: 0,
|
|
40
|
+
// Retry loop for transient provider errors (rate limits, timeouts, 5xx)
|
|
41
|
+
let lastError = null;
|
|
42
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
43
|
+
try {
|
|
44
|
+
const result = streamText({
|
|
45
|
+
model: this.provider(model),
|
|
46
|
+
system: buildSystemPrompt(cwd),
|
|
47
|
+
messages: messages,
|
|
48
|
+
tools: tools,
|
|
49
|
+
maxSteps,
|
|
64
50
|
});
|
|
51
|
+
let fullText = '';
|
|
52
|
+
for await (const part of result.fullStream) {
|
|
53
|
+
const p = part;
|
|
54
|
+
if (p.type === 'text-delta' && p.textDelta) {
|
|
55
|
+
const cleaned = p.textDelta
|
|
56
|
+
.replace(/<TOOLCALL>[\s\S]*?<\/TOOLCALL>/g, '')
|
|
57
|
+
.replace(/\{"(name|tool|function)":\s*"[^"]*",\s*"arguments":\s*\{[^}]*\}\s*\}?\]?/g, '')
|
|
58
|
+
.replace(/<\/?tool_call>/gi, '')
|
|
59
|
+
.replace(/<\/?function_call>/gi, '');
|
|
60
|
+
if (cleaned.trim()) {
|
|
61
|
+
fullText += cleaned;
|
|
62
|
+
this.opts.onChunk?.(cleaned);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else if (p.type === 'tool-call') {
|
|
66
|
+
this.opts.onToolCall?.(p.toolName ?? 'unknown', p.args ?? {});
|
|
67
|
+
toolCallRecords.push({
|
|
68
|
+
tool: p.toolName ?? 'unknown',
|
|
69
|
+
args: p.args ?? {},
|
|
70
|
+
result: '',
|
|
71
|
+
durationMs: 0,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
else if (p.type === 'tool-result') {
|
|
75
|
+
const last = [...toolCallRecords].reverse().find((tc) => tc.tool === (p.toolName ?? ''));
|
|
76
|
+
if (last) {
|
|
77
|
+
last.result = String(p.result ?? '').slice(0, 500);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const totalUsage = await result.usage;
|
|
82
|
+
if (session) {
|
|
83
|
+
this.sessionManager.addMessages(session.id, [
|
|
84
|
+
{ role: 'user', content: userPrompt },
|
|
85
|
+
{ role: 'assistant', content: fullText },
|
|
86
|
+
]);
|
|
87
|
+
}
|
|
88
|
+
const agentResult = {
|
|
89
|
+
output: fullText,
|
|
90
|
+
toolCalls: toolCallRecords,
|
|
91
|
+
model,
|
|
92
|
+
inputTokens: totalUsage?.promptTokens ?? 0,
|
|
93
|
+
outputTokens: totalUsage?.completionTokens ?? 0,
|
|
94
|
+
};
|
|
95
|
+
this.opts.onDone?.(agentResult);
|
|
96
|
+
return agentResult;
|
|
65
97
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
98
|
+
catch (err) {
|
|
99
|
+
lastError = err instanceof Error ? err : new Error(String(err));
|
|
100
|
+
// Extract detailed error info from provider errors
|
|
101
|
+
const errorDetail = AgentRunner.extractErrorDetail(lastError);
|
|
102
|
+
const isRetryable = AgentRunner.isRetryableError(lastError);
|
|
103
|
+
if (isRetryable && attempt < maxRetries) {
|
|
104
|
+
const waitMs = attempt * 2000; // 2s, 4s, 6s
|
|
105
|
+
this.opts.onChunk?.(`\n[Retry ${attempt}/${maxRetries}] ${errorDetail}. Retrying in ${waitMs / 1000}s...\n`);
|
|
106
|
+
await new Promise(r => setTimeout(r, waitMs));
|
|
107
|
+
continue;
|
|
71
108
|
}
|
|
109
|
+
throw new Error(`${errorDetail} (after ${attempt} attempt${attempt > 1 ? 's' : ''})`);
|
|
72
110
|
}
|
|
73
111
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
112
|
+
throw lastError ?? new Error('Unknown error');
|
|
113
|
+
}
|
|
114
|
+
/** Extract readable error detail from provider errors */
|
|
115
|
+
static extractErrorDetail(err) {
|
|
116
|
+
const msg = err.message ?? '';
|
|
117
|
+
// OpenRouter / OpenAI structured errors
|
|
118
|
+
const jsonMatch = msg.match(/\{[\s\S]*"error"[\s\S]*\}/);
|
|
119
|
+
if (jsonMatch) {
|
|
120
|
+
try {
|
|
121
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
122
|
+
const detail = parsed.error?.message ?? parsed.message ?? parsed.error;
|
|
123
|
+
if (detail)
|
|
124
|
+
return String(detail);
|
|
125
|
+
}
|
|
126
|
+
catch { /* not JSON */ }
|
|
81
127
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
128
|
+
// Rate limit
|
|
129
|
+
if (msg.includes('429') || msg.toLowerCase().includes('rate limit')) {
|
|
130
|
+
return 'Rate limited by provider. Too many requests';
|
|
131
|
+
}
|
|
132
|
+
// Context length
|
|
133
|
+
if (msg.toLowerCase().includes('context') && msg.toLowerCase().includes('length')) {
|
|
134
|
+
return 'Context window exceeded. Try a model with larger context or a shorter conversation (/clear)';
|
|
135
|
+
}
|
|
136
|
+
// Auth
|
|
137
|
+
if (msg.includes('401') || msg.toLowerCase().includes('unauthorized') || msg.toLowerCase().includes('invalid api key')) {
|
|
138
|
+
return 'Invalid API key. Check your OPENROUTER_API_KEY';
|
|
139
|
+
}
|
|
140
|
+
// Quota
|
|
141
|
+
if (msg.includes('402') || msg.toLowerCase().includes('insufficient') || msg.toLowerCase().includes('quota')) {
|
|
142
|
+
return 'Insufficient credits on OpenRouter. Add credits at https://openrouter.ai/credits';
|
|
143
|
+
}
|
|
144
|
+
// Generic provider error
|
|
145
|
+
if (msg.includes('Provider returned error')) {
|
|
146
|
+
return 'Provider returned an error. The model may be temporarily unavailable';
|
|
147
|
+
}
|
|
148
|
+
return msg.slice(0, 300);
|
|
149
|
+
}
|
|
150
|
+
/** Check if error is transient and worth retrying */
|
|
151
|
+
static isRetryableError(err) {
|
|
152
|
+
const msg = err.message ?? '';
|
|
153
|
+
return msg.includes('429') ||
|
|
154
|
+
msg.includes('500') ||
|
|
155
|
+
msg.includes('502') ||
|
|
156
|
+
msg.includes('503') ||
|
|
157
|
+
msg.includes('timeout') ||
|
|
158
|
+
msg.toLowerCase().includes('rate limit') ||
|
|
159
|
+
msg.includes('Provider returned error');
|
|
91
160
|
}
|
|
92
161
|
}
|
|
93
162
|
//# sourceMappingURL=agent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAgB,MAAM,aAAa,CAAC;AAG1D,MAAM,OAAO,WAAW;IACd,IAAI,CAAsE;IAC1E,QAAQ,CAAkC;IAC1C,cAAc,CAAiB;IAEvC,YAAY,IAAqB;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC7D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,uFAAuF,CAAC,CAAC;QAC3G,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,aAAa,CAAC;QAElF,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACvC,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,8BAA8B;YACvD,MAAM;SACP,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,cAAc,EAAE,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAe;QACvB,MAAM,UAAU,GAAG,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAM,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -81,40 +81,47 @@ export function buildSystemPrompt(cwd) {
|
|
|
81
81
|
let skillsSection = '';
|
|
82
82
|
if (skills.size > 0) {
|
|
83
83
|
const skillNames = [...skills.keys()].map(s => `/${s}`).join(', ');
|
|
84
|
+
const MAX_SKILL_CHARS = 8000; // Limit per skill to avoid overwhelming smaller models
|
|
84
85
|
const skillContents = [...skills.entries()]
|
|
85
|
-
.map(([name, content]) =>
|
|
86
|
+
.map(([name, content]) => {
|
|
87
|
+
const trimmed = content.length > MAX_SKILL_CHARS
|
|
88
|
+
? content.slice(0, MAX_SKILL_CHARS) + '\n\n[... skill content truncated for context limits ...]'
|
|
89
|
+
: content;
|
|
90
|
+
return `### Skill: /${name}\n\n${trimmed}`;
|
|
91
|
+
})
|
|
86
92
|
.join('\n\n---\n\n');
|
|
87
93
|
skillsSection = `
|
|
88
94
|
|
|
89
|
-
## Installed Skills
|
|
95
|
+
## Installed Skills (slash commands: ${skillNames})
|
|
90
96
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
97
|
+
IMPORTANT: When the user types one of these slash commands, you MUST:
|
|
98
|
+
1. Read the files referenced in the skill (memory, agents, configs) using read_file
|
|
99
|
+
2. Follow the skill's step-by-step instructions
|
|
100
|
+
3. Use the ask_user tool for menus and questions — present options as numbered list
|
|
101
|
+
4. Respond in the user's language
|
|
102
|
+
5. NEVER just describe what the command does — actually EXECUTE it
|
|
94
103
|
|
|
95
104
|
${skillContents}`;
|
|
96
105
|
}
|
|
97
106
|
return `You are an AI coding agent working on the "${dirName}" project.
|
|
98
|
-
You have
|
|
107
|
+
You have tools to read, write, search files, run shell commands, and fetch web content.
|
|
108
|
+
You also have an ask_user tool to ask the user questions interactively.
|
|
99
109
|
|
|
100
110
|
Working directory: ${cwd}
|
|
101
111
|
|
|
102
|
-
##
|
|
112
|
+
## CRITICAL RULES
|
|
103
113
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
- Follow the project conventions described in the project context below
|
|
113
|
-
- When the user types a slash command (e.g. /expxagents), check if it matches an installed skill and execute it
|
|
114
|
+
1. Use the user's language. If they write in Portuguese, respond in Portuguese. If English, use English.
|
|
115
|
+
2. ALWAYS use your tools — do NOT output raw JSON, tool calls, or function call syntax as text. Use the actual tool functions provided to you.
|
|
116
|
+
3. NEVER output text like \`{"name": "tool", "arguments": ...}\` — that is a bug. Use the tool directly.
|
|
117
|
+
4. When a slash command matches an installed skill (listed below), follow the skill instructions step by step.
|
|
118
|
+
5. Use ask_user tool to present menus and ask questions — do NOT just print questions as text.
|
|
119
|
+
6. Read files before editing them. Use relative paths.
|
|
120
|
+
7. Prefer edit_file over write_file for existing files.
|
|
121
|
+
8. Keep shell commands focused and non-destructive.
|
|
114
122
|
|
|
115
123
|
## Output
|
|
116
124
|
|
|
117
|
-
|
|
118
|
-
Do not wrap your final response in markdown code blocks unless the user asked for code.${projectContext}${skillsSection}`;
|
|
125
|
+
Respond concisely. Summarize what you did after completing a task.${projectContext}${skillsSection}`;
|
|
119
126
|
}
|
|
120
127
|
//# sourceMappingURL=system-prompt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"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"}
|