micro-models-agent 0.2.63 → 0.2.64
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 +354 -354
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +119 -3
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/tool-executor.d.ts +2 -10
- package/dist/agent/tool-executor.d.ts.map +1 -1
- package/dist/agent/tool-executor.js +92 -1
- package/dist/agent/tool-executor.js.map +1 -1
- package/dist/async-map.d.ts +6 -0
- package/dist/async-map.d.ts.map +1 -0
- package/dist/async-map.js +16 -0
- package/dist/async-map.js.map +1 -0
- package/dist/blog-api/types/index.d.ts +2 -0
- package/dist/blog-api/types/index.d.ts.map +1 -0
- package/dist/blog-api/types/index.js +2 -0
- package/dist/blog-api/types/index.js.map +1 -0
- package/dist/cli/config.js +1 -1
- package/dist/cli/config.js.map +1 -1
- package/dist/config/config.d.ts +10 -0
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +29 -2
- package/dist/config/config.js.map +1 -1
- package/dist/config/types.d.ts +16 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/examples.d.ts +22 -0
- package/dist/examples.d.ts.map +1 -0
- package/dist/examples.js +45 -0
- package/dist/examples.js.map +1 -0
- package/dist/fibonacci.d.ts +19 -0
- package/dist/fibonacci.d.ts.map +1 -0
- package/dist/fibonacci.js +61 -0
- package/dist/fibonacci.js.map +1 -0
- package/dist/plugins/builtin/lint-on-write/index.ts +96 -96
- package/dist/plugins/builtin/notify/index.js +6 -6
- package/dist/plugins/builtin/notify/index.ts +104 -104
- package/dist/repl.d.ts +5 -0
- package/dist/repl.d.ts.map +1 -0
- package/dist/repl.js +472 -0
- package/dist/repl.js.map +1 -0
- package/dist/skills/builtin/agent-test/SKILL.md +68 -68
- package/dist/skills/builtin/grill-me/SKILL.md +46 -46
- package/dist/sort.d.ts +8 -0
- package/dist/sort.d.ts.map +1 -0
- package/dist/sort.js +36 -0
- package/dist/sort.js.map +1 -0
- package/dist/stack.d.ts +9 -0
- package/dist/stack.d.ts.map +1 -0
- package/dist/stack.js +22 -0
- package/dist/stack.js.map +1 -0
- package/dist/test-run.d.ts +2 -0
- package/dist/test-run.d.ts.map +1 -0
- package/dist/test-run.js +13 -0
- package/dist/test-run.js.map +1 -0
- package/dist/tools/subagent.d.ts +16 -1
- package/dist/tools/subagent.d.ts.map +1 -1
- package/dist/tools/subagent.js +84 -9
- package/dist/tools/subagent.js.map +1 -1
- package/dist/ui/components/diff-view.d.ts +8 -0
- package/dist/ui/components/diff-view.d.ts.map +1 -0
- package/dist/ui/components/diff-view.js +25 -0
- package/dist/ui/components/diff-view.js.map +1 -0
- package/dist/ui/double-press.d.ts +9 -0
- package/dist/ui/double-press.d.ts.map +1 -0
- package/dist/ui/double-press.js +18 -0
- package/dist/ui/double-press.js.map +1 -0
- package/dist/ui/opentui-renderer.d.ts +53 -0
- package/dist/ui/opentui-renderer.d.ts.map +1 -0
- package/dist/ui/opentui-renderer.js +463 -0
- package/dist/ui/opentui-renderer.js.map +1 -0
- package/dist/utils/memoize.d.ts +14 -0
- package/dist/utils/memoize.d.ts.map +1 -0
- package/dist/utils/memoize.js +51 -0
- package/dist/utils/memoize.js.map +1 -0
- package/dist/utils/types.d.ts +6 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/utils/types.js +2 -0
- package/dist/utils/types.js.map +1 -0
- package/dist/utils.d.ts +22 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +81 -0
- package/dist/utils.js.map +1 -0
- package/package.json +2 -2
package/dist/repl.js
ADDED
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { globSync } from 'node:fs';
|
|
3
|
+
import { execSync } from 'node:child_process';
|
|
4
|
+
import { executeBash } from './tools/bash.js';
|
|
5
|
+
import { runAgentLoop } from './agent/loop.js';
|
|
6
|
+
import { loadMemory, saveMemory, searchMemory, loadAllMemory, ensureMemoryDir, removeMemoryEntry, exportMemory } from './agent/memory.js';
|
|
7
|
+
import { listInstalledSkills } from './skills/loader.js';
|
|
8
|
+
import { listSessions, loadSession, createNamedSession, createAutoSession, formatSessionList } from './session/store.js';
|
|
9
|
+
import { rebuildCodeIndex, rebuildProjectMap } from './indexer/cache.js';
|
|
10
|
+
import { getTheme } from './styling/index.js';
|
|
11
|
+
function slashRead(path, renderer) {
|
|
12
|
+
const theme = getTheme();
|
|
13
|
+
try {
|
|
14
|
+
const content = readFileSync(path, 'utf-8');
|
|
15
|
+
const lines = content.split('\n');
|
|
16
|
+
const maxLines = 200;
|
|
17
|
+
renderer.writeNewline();
|
|
18
|
+
const shown = lines.slice(0, maxLines);
|
|
19
|
+
renderer.writeFileOutput(shown);
|
|
20
|
+
if (lines.length > maxLines) {
|
|
21
|
+
renderer.writeDim(` ... (${lines.length - maxLines} more lines)`);
|
|
22
|
+
}
|
|
23
|
+
renderer.writeNewline();
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
renderer.writeError(e.message);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function slashFind(pattern, renderer) {
|
|
30
|
+
const theme = getTheme();
|
|
31
|
+
try {
|
|
32
|
+
const IGNORE = ['node_modules', '.git', 'dist', '.mma', 'build', '__pycache__'];
|
|
33
|
+
const fixedPattern = pattern.includes('/') || pattern.includes('\\') ? pattern : `**/${pattern}`;
|
|
34
|
+
const results = globSync(fixedPattern).filter(f => !f.split(/[/\\]/).some(p => IGNORE.includes(p)));
|
|
35
|
+
if (results.length === 0) {
|
|
36
|
+
renderer.writeDim(' No matches');
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
for (const f of results) {
|
|
40
|
+
renderer.writeLine(`${theme.indent}${theme.filePath(f)}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
renderer.writeError(e.message);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function slashSearch(pattern, renderer) {
|
|
48
|
+
const theme = getTheme();
|
|
49
|
+
try {
|
|
50
|
+
const result = execSync(`findstr /s /n /c:"${pattern}" *.ts *.js *.tsx *.jsx *.json *.md`, { encoding: 'utf-8', timeout: 10000 });
|
|
51
|
+
const lines = result.trim().split('\n').slice(0, 30);
|
|
52
|
+
if (lines.length === 0 || (lines.length === 1 && lines[0] === '')) {
|
|
53
|
+
renderer.writeDim(' No matches');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
for (const line of lines) {
|
|
57
|
+
renderer.writeLine(`${theme.indent}${line}`);
|
|
58
|
+
}
|
|
59
|
+
if (result.trim().split('\n').length > 30) {
|
|
60
|
+
renderer.writeDim(` ... (${result.trim().split('\n').length - 30} more)`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
if (e.status === 1) {
|
|
65
|
+
renderer.writeDim(' No matches');
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
renderer.writeError(e.message);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function slashWrite(path, content, renderer) {
|
|
73
|
+
const theme = getTheme();
|
|
74
|
+
try {
|
|
75
|
+
writeFileSync(path, content, 'utf-8');
|
|
76
|
+
renderer.writeSuccess(`written to ${theme.filePath(path)}`);
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
renderer.writeError(e.message);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function slashEdit(args, renderer) {
|
|
83
|
+
const theme = getTheme();
|
|
84
|
+
const parts = args.split(/\s+/);
|
|
85
|
+
if (parts.length < 3) {
|
|
86
|
+
renderer.writeInfo(' Usage: /edit <file> <line> <new content>');
|
|
87
|
+
renderer.writeInfo(' Example: /edit src/index.ts 5 const x = 1;');
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const [filePath, lineStr, ...rest] = parts;
|
|
91
|
+
const lineNum = parseInt(lineStr, 10);
|
|
92
|
+
if (isNaN(lineNum) || lineNum < 1) {
|
|
93
|
+
renderer.writeDim(' Line number must be a positive integer');
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const newContent = rest.join(' ');
|
|
97
|
+
try {
|
|
98
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
99
|
+
const lines = content.split('\n');
|
|
100
|
+
if (lineNum > lines.length) {
|
|
101
|
+
renderer.writeWarning(` File has only ${lines.length} lines`);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
lines[lineNum - 1] = newContent;
|
|
105
|
+
writeFileSync(filePath, lines.join('\n'), 'utf-8');
|
|
106
|
+
renderer.writeSuccess(`Line ${lineNum} updated in ${theme.filePath(filePath)}`);
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
renderer.writeError(e.message);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async function slashBash(cmd, renderer) {
|
|
113
|
+
const result = await executeBash(cmd);
|
|
114
|
+
if (result.stdout)
|
|
115
|
+
renderer.write(result.stdout);
|
|
116
|
+
if (result.stderr)
|
|
117
|
+
renderer.writeError(result.stderr);
|
|
118
|
+
}
|
|
119
|
+
function slashSkill(args, renderer) {
|
|
120
|
+
const subcmd = args.trim() || 'list';
|
|
121
|
+
switch (subcmd) {
|
|
122
|
+
case 'list': {
|
|
123
|
+
const skills = listInstalledSkills();
|
|
124
|
+
if (skills.length === 0) {
|
|
125
|
+
renderer.writeDim(' No skills installed.');
|
|
126
|
+
renderer.writeDim(' Skills are loaded from: ~/.mma/skills/, ~/.claude/skills/, .claude/skills/, .agents/skills/');
|
|
127
|
+
renderer.writeDim(' Reference skills in prompts with @skill-name');
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
renderer.writeInfo(` Installed skills (${skills.length}):`);
|
|
131
|
+
for (const s of skills) {
|
|
132
|
+
renderer.writeLine(` @${s}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
default:
|
|
138
|
+
renderer.writeInfo(' Usage: /skill [list]');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function slashMemory(args, renderer) {
|
|
142
|
+
ensureMemoryDir();
|
|
143
|
+
if (!args.trim()) {
|
|
144
|
+
const summary = loadAllMemory();
|
|
145
|
+
if (summary) {
|
|
146
|
+
renderer.writeLine(summary);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
renderer.writeDim(' Project memory is empty. Use /memory add <type> <text>');
|
|
150
|
+
}
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const parts = args.trim().split(/\s+/);
|
|
154
|
+
const subcommand = parts[0];
|
|
155
|
+
const rest = parts.slice(1);
|
|
156
|
+
const type = rest[0] || '';
|
|
157
|
+
const text = rest.slice(1).join(' ') || '';
|
|
158
|
+
switch (subcommand) {
|
|
159
|
+
case 'show': {
|
|
160
|
+
if (!type) {
|
|
161
|
+
renderer.writeInfo(' Usage: /memory show <type> (project|conventions|decisions|errors|history)');
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const content = loadMemory(type);
|
|
165
|
+
renderer.writeNewline();
|
|
166
|
+
renderer.writeLine(content);
|
|
167
|
+
renderer.writeNewline();
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
case 'add': {
|
|
171
|
+
if (!type || !text) {
|
|
172
|
+
renderer.writeInfo(' Usage: /memory add <type> <text>');
|
|
173
|
+
renderer.writeInfo(' Types: project, conventions, decisions, errors, history');
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
saveMemory(type, text.slice(0, 60), text);
|
|
177
|
+
renderer.writeSuccess(`Saved to .mma/memory/${type}.md`);
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
case 'search': {
|
|
181
|
+
if (!type) {
|
|
182
|
+
renderer.writeInfo(' Usage: /memory search <query>');
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const results = searchMemory(type);
|
|
186
|
+
if (results.length === 0) {
|
|
187
|
+
renderer.writeDim(' No matches');
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
renderer.writeInfo(` Found ${results.length} matches:`);
|
|
191
|
+
for (const r of results) {
|
|
192
|
+
renderer.writeLine(` [${r.type}] ${r.match}`);
|
|
193
|
+
}
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
case 'remove': {
|
|
197
|
+
if (!type) {
|
|
198
|
+
renderer.writeInfo(' Usage: /memory remove <type> <line-number>');
|
|
199
|
+
renderer.writeInfo(' First use /memory show <type> to see entries with line numbers.');
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const lineNum = parseInt(text, 10);
|
|
203
|
+
if (isNaN(lineNum) || lineNum < 1) {
|
|
204
|
+
renderer.writeDim(' Line number must be a positive integer');
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
const removed = removeMemoryEntry(type, lineNum);
|
|
208
|
+
if (removed) {
|
|
209
|
+
renderer.writeSuccess(`Entry removed from ${type}.md`);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
renderer.writeError(' Could not remove entry (line number out of range?)');
|
|
213
|
+
}
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
case 'export': {
|
|
217
|
+
const exported = exportMemory();
|
|
218
|
+
if (exported) {
|
|
219
|
+
renderer.writeSuccess(`Memory exported to ${exported}`);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
renderer.writeDim(' No memory to export');
|
|
223
|
+
}
|
|
224
|
+
break;
|
|
225
|
+
}
|
|
226
|
+
default: {
|
|
227
|
+
renderer.writeInfo(' Usage: /memory [show <type>|add <type> <text>|search <query>|remove <type> <line>|export]');
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function slashSessions(renderer) {
|
|
232
|
+
const sessions = listSessions();
|
|
233
|
+
renderer.writeLine(formatSessionList(sessions));
|
|
234
|
+
}
|
|
235
|
+
async function slashResume(args, provider, registry, history, renderer) {
|
|
236
|
+
if (!args.trim()) {
|
|
237
|
+
renderer.writeInfo(' Usage: /resume <session-id>');
|
|
238
|
+
renderer.writeInfo(' Use /sessions to see available sessions.');
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
const session = loadSession(args.trim());
|
|
242
|
+
if (!session) {
|
|
243
|
+
renderer.writeError(` Session "${args.trim()}" not found.`);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
renderer.writeInfo(`Resumed session: ${session.id} (${session.messages.length} messages)`);
|
|
247
|
+
renderer.writeDim(`Provider: ${session.provider}`);
|
|
248
|
+
renderer.writeNewline();
|
|
249
|
+
const lastUser = session.messages.filter(m => m.role === 'user').pop();
|
|
250
|
+
const prevMsgs = session.messages.filter(m => m.role !== 'system').map(m => ({ role: m.role, content: m.content }));
|
|
251
|
+
if (lastUser) {
|
|
252
|
+
const result = await runAgentLoop(provider, registry, lastUser.content, undefined, prevMsgs, renderer);
|
|
253
|
+
for (const msg of result.messages) {
|
|
254
|
+
if (msg.role !== 'system') {
|
|
255
|
+
history.push({ role: msg.role, content: msg.content });
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
function slashSave(args, history, provider, renderer) {
|
|
261
|
+
if (history.length === 0) {
|
|
262
|
+
renderer.writeDim(' No conversation to save.');
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
const name = args.trim() || '';
|
|
266
|
+
const providerLabel = `${provider.model}`;
|
|
267
|
+
const filePath = createNamedSession(name, history, providerLabel, process.cwd(), { totalTokens: 0, compactCount: 0 });
|
|
268
|
+
const id = filePath.split(/[/\\]/).pop()?.replace('.json', '') || '';
|
|
269
|
+
renderer.writeSuccess(`Session saved: ${id}${name ? ` (${name})` : ''}`);
|
|
270
|
+
}
|
|
271
|
+
function slashClear(history, renderer) {
|
|
272
|
+
history.length = 0;
|
|
273
|
+
renderer.writeInfo(' Context cleared. Starting new session.');
|
|
274
|
+
}
|
|
275
|
+
function slashIndex(args, renderer) {
|
|
276
|
+
const subcmd = args.trim() || 'status';
|
|
277
|
+
switch (subcmd) {
|
|
278
|
+
case 'rebuild': {
|
|
279
|
+
renderer.writeInfo(' Rebuilding code index...');
|
|
280
|
+
const { formatted } = rebuildCodeIndex(process.cwd());
|
|
281
|
+
renderer.writeLine(formatted);
|
|
282
|
+
renderer.writeSuccess('Code index rebuilt');
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
case 'map': {
|
|
286
|
+
renderer.writeInfo(' Rebuilding project map...');
|
|
287
|
+
const { formatted } = rebuildProjectMap(process.cwd());
|
|
288
|
+
renderer.writeLine(formatted);
|
|
289
|
+
renderer.writeSuccess('Project map rebuilt');
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
case 'status': {
|
|
293
|
+
const { getOrBuildCodeIndex, getOrBuildProjectMap } = require('./indexer/cache.js');
|
|
294
|
+
const { formatted: mapFormatted } = getOrBuildProjectMap(process.cwd());
|
|
295
|
+
const { formatted: idxFormatted } = getOrBuildCodeIndex(process.cwd());
|
|
296
|
+
renderer.writeLine(mapFormatted.split('\n').slice(0, 3).join('\n'));
|
|
297
|
+
renderer.writeNewline();
|
|
298
|
+
renderer.writeLine(idxFormatted.split('\n').slice(0, 3).join('\n'));
|
|
299
|
+
break;
|
|
300
|
+
}
|
|
301
|
+
default:
|
|
302
|
+
renderer.writeInfo(' Usage: /index [status|rebuild|map]');
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
export async function runRepl(provider, registry, modelLabel, renderer) {
|
|
306
|
+
const memorySummary = loadAllMemory();
|
|
307
|
+
renderer.writeHeading(`MMA v0.1 — ${modelLabel}`);
|
|
308
|
+
if (memorySummary) {
|
|
309
|
+
renderer.writeLine(memorySummary);
|
|
310
|
+
}
|
|
311
|
+
renderer.writeDim('Type /help for commands, /exit to quit');
|
|
312
|
+
renderer.writeNewline();
|
|
313
|
+
let currentWritePath = null;
|
|
314
|
+
let writeBuffer = [];
|
|
315
|
+
let conversationHistory = [];
|
|
316
|
+
const sigintHandler = () => {
|
|
317
|
+
if (conversationHistory.length > 0) {
|
|
318
|
+
createAutoSession(conversationHistory, modelLabel, process.cwd(), { totalTokens: 0, compactCount: 0 });
|
|
319
|
+
renderer.writeSuccess('\nSession auto-saved.');
|
|
320
|
+
}
|
|
321
|
+
renderer.destroy();
|
|
322
|
+
process.exit(0);
|
|
323
|
+
};
|
|
324
|
+
process.on('SIGINT', sigintHandler);
|
|
325
|
+
while (true) {
|
|
326
|
+
let line;
|
|
327
|
+
try {
|
|
328
|
+
line = await renderer.prompt('MMA> ');
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
if (!line.trim())
|
|
334
|
+
continue;
|
|
335
|
+
if (currentWritePath) {
|
|
336
|
+
if (line.trim() === 'EOF') {
|
|
337
|
+
slashWrite(currentWritePath, writeBuffer.join('\n'), renderer);
|
|
338
|
+
currentWritePath = null;
|
|
339
|
+
writeBuffer = [];
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
writeBuffer.push(line);
|
|
343
|
+
}
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
if (line.startsWith('/')) {
|
|
347
|
+
const spaceIdx = line.indexOf(' ');
|
|
348
|
+
const cmd = spaceIdx === -1 ? line.slice(1) : line.slice(1, spaceIdx);
|
|
349
|
+
const args = spaceIdx === -1 ? '' : line.slice(spaceIdx + 1);
|
|
350
|
+
switch (cmd) {
|
|
351
|
+
case 'exit':
|
|
352
|
+
case 'quit':
|
|
353
|
+
if (conversationHistory.length > 0) {
|
|
354
|
+
createAutoSession(conversationHistory, modelLabel, process.cwd(), { totalTokens: 0, compactCount: 0 });
|
|
355
|
+
renderer.writeSuccess('Session auto-saved.');
|
|
356
|
+
}
|
|
357
|
+
renderer.writeDim('Bye!');
|
|
358
|
+
renderer.destroy();
|
|
359
|
+
return;
|
|
360
|
+
case 'help':
|
|
361
|
+
renderer.writeDim(`
|
|
362
|
+
/bash <cmd> — run shell command
|
|
363
|
+
/read <file> — display file with line numbers
|
|
364
|
+
/edit <file> <n> — replace line N in file with rest of args
|
|
365
|
+
/write <file> — write file (end with EOF on its own line)
|
|
366
|
+
/find <pattern> — find files by glob pattern
|
|
367
|
+
/search <pattern> — search file contents
|
|
368
|
+
/git <args> — git operations
|
|
369
|
+
/memory — show memory summary
|
|
370
|
+
/memory show <t> — show memory type content
|
|
371
|
+
/memory add <t> — add memory entry
|
|
372
|
+
/memory search <q> — search memory
|
|
373
|
+
/memory remove <t> <n> — remove entry N from type
|
|
374
|
+
/memory export — export memory to .mma/memory-export.md
|
|
375
|
+
/skill — list installed skills
|
|
376
|
+
/sessions — list saved sessions
|
|
377
|
+
/resume <id> — resume a session
|
|
378
|
+
/save [name] — save current session
|
|
379
|
+
/clear — clear context (new session)
|
|
380
|
+
/index [cmd] — index status/rebuild/map
|
|
381
|
+
/stop — stop agent loop
|
|
382
|
+
/exit — exit MMA
|
|
383
|
+
`);
|
|
384
|
+
break;
|
|
385
|
+
case 'bash':
|
|
386
|
+
await slashBash(args, renderer);
|
|
387
|
+
break;
|
|
388
|
+
case 'read':
|
|
389
|
+
slashRead(args, renderer);
|
|
390
|
+
break;
|
|
391
|
+
case 'write':
|
|
392
|
+
if (!args) {
|
|
393
|
+
renderer.writeInfo(' Usage: /write <file> (then type content, end with EOF)');
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
currentWritePath = args;
|
|
397
|
+
renderer.writeDim(' Type your content. End with EOF on its own line:');
|
|
398
|
+
}
|
|
399
|
+
break;
|
|
400
|
+
case 'edit':
|
|
401
|
+
slashEdit(args, renderer);
|
|
402
|
+
break;
|
|
403
|
+
case 'find':
|
|
404
|
+
slashFind(args, renderer);
|
|
405
|
+
break;
|
|
406
|
+
case 'search':
|
|
407
|
+
slashSearch(args, renderer);
|
|
408
|
+
break;
|
|
409
|
+
case 'git':
|
|
410
|
+
await slashBash(`git ${args}`, renderer);
|
|
411
|
+
break;
|
|
412
|
+
case 'memory':
|
|
413
|
+
slashMemory(args, renderer);
|
|
414
|
+
break;
|
|
415
|
+
case 'skill':
|
|
416
|
+
slashSkill(args, renderer);
|
|
417
|
+
break;
|
|
418
|
+
case 'sessions':
|
|
419
|
+
slashSessions(renderer);
|
|
420
|
+
break;
|
|
421
|
+
case 'resume':
|
|
422
|
+
await slashResume(args, provider, registry, conversationHistory, renderer);
|
|
423
|
+
break;
|
|
424
|
+
case 'save':
|
|
425
|
+
slashSave(args, conversationHistory, provider, renderer);
|
|
426
|
+
break;
|
|
427
|
+
case 'clear':
|
|
428
|
+
case 'new':
|
|
429
|
+
slashClear(conversationHistory, renderer);
|
|
430
|
+
break;
|
|
431
|
+
case 'stop':
|
|
432
|
+
renderer.writeDim(' Stopping agent loop...');
|
|
433
|
+
renderer.destroy();
|
|
434
|
+
return;
|
|
435
|
+
case 'index':
|
|
436
|
+
slashIndex(args, renderer);
|
|
437
|
+
break;
|
|
438
|
+
default:
|
|
439
|
+
renderer.writeError(` Unknown command: /${cmd}. `);
|
|
440
|
+
renderer.writeDim('Type /help');
|
|
441
|
+
}
|
|
442
|
+
continue;
|
|
443
|
+
}
|
|
444
|
+
const result = await runAgentLoop(provider, registry, line, undefined, conversationHistory, renderer, modelLabel);
|
|
445
|
+
const newMessages = result.messages;
|
|
446
|
+
for (const msg of newMessages) {
|
|
447
|
+
if (msg.role !== 'system') {
|
|
448
|
+
conversationHistory.push({ role: msg.role, content: msg.content });
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
if (result.questionPending) {
|
|
452
|
+
const { question, choices } = result.questionPending;
|
|
453
|
+
renderer.writeNewline();
|
|
454
|
+
renderer.writeWarning(` Question: ${question}`);
|
|
455
|
+
if (choices && choices.length > 0) {
|
|
456
|
+
for (let i = 0; i < choices.length; i++) {
|
|
457
|
+
renderer.writeLine(` ${i + 1}. ${choices[i]}`);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
renderer.writeNewline();
|
|
461
|
+
const answer = await renderer.prompt(' Your answer: ');
|
|
462
|
+
conversationHistory.push({ role: 'user', content: answer });
|
|
463
|
+
const answerResult = await runAgentLoop(provider, registry, `User answered: ${answer}`, undefined, conversationHistory, renderer, modelLabel);
|
|
464
|
+
for (const msg of answerResult.messages) {
|
|
465
|
+
if (msg.role !== 'system') {
|
|
466
|
+
conversationHistory.push({ role: msg.role, content: msg.content });
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
//# sourceMappingURL=repl.js.map
|
package/dist/repl.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.js","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
# Agent Test — тестирование MMA агента
|
|
2
|
-
|
|
3
|
-
Навык для автоматизированного тестирования ответов MMA агента на разных сценариях.
|
|
4
|
-
|
|
5
|
-
## Запуск
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
# Все сценарии
|
|
9
|
-
bun run test-agent-conversation.ts
|
|
10
|
-
|
|
11
|
-
# Один сценарий
|
|
12
|
-
bun run test-agent-conversation.ts --scenario chat
|
|
13
|
-
|
|
14
|
-
# Список сценариев
|
|
15
|
-
bun run test-agent-conversation.ts --list
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## Добавление нового сценария
|
|
19
|
-
|
|
20
|
-
Отредактируй `test-agent-conversation.ts`, секция `SCENARIOS`:
|
|
21
|
-
|
|
22
|
-
```ts
|
|
23
|
-
{
|
|
24
|
-
name: 'my-new-scenario', // уникальное имя
|
|
25
|
-
description: 'Описание что тестируем',
|
|
26
|
-
prompts: [
|
|
27
|
-
'Промпт 1',
|
|
28
|
-
'Промпт 2',
|
|
29
|
-
'Промпт 3',
|
|
30
|
-
],
|
|
31
|
-
},
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
Затем запусти: `bun run test-agent-conversation.ts --scenario my-new-scenario`
|
|
35
|
-
|
|
36
|
-
## Текущие сценарии
|
|
37
|
-
|
|
38
|
-
| Имя | Описание | Промптов |
|
|
39
|
-
|-----|----------|----------|
|
|
40
|
-
| chat | Простая беседа | 8 |
|
|
41
|
-
| read | Чтение файлов | 3 |
|
|
42
|
-
| code | Написание кода | 3 |
|
|
43
|
-
| project | Микро-проект из 5 файлов | 1 |
|
|
44
|
-
| topics | Смена тем | 4 |
|
|
45
|
-
|
|
46
|
-
## Что проверяется автоматически
|
|
47
|
-
|
|
48
|
-
- **Пустые ответы** — модель не ответила
|
|
49
|
-
- **User profile** — модель упомянула профиль пользователя (запрещено)
|
|
50
|
-
- **Tool calls** — какие инструменты были использованы
|
|
51
|
-
- **Длина ответов** — min/max/avg
|
|
52
|
-
|
|
53
|
-
## Настройка через env
|
|
54
|
-
|
|
55
|
-
```bash
|
|
56
|
-
MMA_LLM_URL=http://localhost:1234/v1 # URL LLM сервера
|
|
57
|
-
MMA_LLM_MODEL=qwen/qwen3.5-9b # Модель
|
|
58
|
-
MMA_CTX=32768 # Размер контекста
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## Структура
|
|
62
|
-
|
|
63
|
-
```
|
|
64
|
-
test-agent-conversation.ts — основной скрипт (все сценарии + анализ)
|
|
65
|
-
test-llm-direct.ts — прямой вызов LLM (для отладки)
|
|
66
|
-
test-compare.ts — сравнение direct fetch vs provider
|
|
67
|
-
test-thinking.ts — тест thinking/reasoning модели
|
|
68
|
-
```
|
|
1
|
+
# Agent Test — тестирование MMA агента
|
|
2
|
+
|
|
3
|
+
Навык для автоматизированного тестирования ответов MMA агента на разных сценариях.
|
|
4
|
+
|
|
5
|
+
## Запуск
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Все сценарии
|
|
9
|
+
bun run test-agent-conversation.ts
|
|
10
|
+
|
|
11
|
+
# Один сценарий
|
|
12
|
+
bun run test-agent-conversation.ts --scenario chat
|
|
13
|
+
|
|
14
|
+
# Список сценариев
|
|
15
|
+
bun run test-agent-conversation.ts --list
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Добавление нового сценария
|
|
19
|
+
|
|
20
|
+
Отредактируй `test-agent-conversation.ts`, секция `SCENARIOS`:
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
{
|
|
24
|
+
name: 'my-new-scenario', // уникальное имя
|
|
25
|
+
description: 'Описание что тестируем',
|
|
26
|
+
prompts: [
|
|
27
|
+
'Промпт 1',
|
|
28
|
+
'Промпт 2',
|
|
29
|
+
'Промпт 3',
|
|
30
|
+
],
|
|
31
|
+
},
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Затем запусти: `bun run test-agent-conversation.ts --scenario my-new-scenario`
|
|
35
|
+
|
|
36
|
+
## Текущие сценарии
|
|
37
|
+
|
|
38
|
+
| Имя | Описание | Промптов |
|
|
39
|
+
|-----|----------|----------|
|
|
40
|
+
| chat | Простая беседа | 8 |
|
|
41
|
+
| read | Чтение файлов | 3 |
|
|
42
|
+
| code | Написание кода | 3 |
|
|
43
|
+
| project | Микро-проект из 5 файлов | 1 |
|
|
44
|
+
| topics | Смена тем | 4 |
|
|
45
|
+
|
|
46
|
+
## Что проверяется автоматически
|
|
47
|
+
|
|
48
|
+
- **Пустые ответы** — модель не ответила
|
|
49
|
+
- **User profile** — модель упомянула профиль пользователя (запрещено)
|
|
50
|
+
- **Tool calls** — какие инструменты были использованы
|
|
51
|
+
- **Длина ответов** — min/max/avg
|
|
52
|
+
|
|
53
|
+
## Настройка через env
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
MMA_LLM_URL=http://localhost:1234/v1 # URL LLM сервера
|
|
57
|
+
MMA_LLM_MODEL=qwen/qwen3.5-9b # Модель
|
|
58
|
+
MMA_CTX=32768 # Размер контекста
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Структура
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
test-agent-conversation.ts — основной скрипт (все сценарии + анализ)
|
|
65
|
+
test-llm-direct.ts — прямой вызов LLM (для отладки)
|
|
66
|
+
test-compare.ts — сравнение direct fetch vs provider
|
|
67
|
+
test-thinking.ts — тест thinking/reasoning модели
|
|
68
|
+
```
|