micro-models-agent 0.2.0
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 +311 -0
- package/dist/agent/context.d.ts +18 -0
- package/dist/agent/context.d.ts.map +1 -0
- package/dist/agent/context.js +155 -0
- package/dist/agent/context.js.map +1 -0
- package/dist/agent/loop.d.ts +15 -0
- package/dist/agent/loop.d.ts.map +1 -0
- package/dist/agent/loop.js +575 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/memory.d.ts +23 -0
- package/dist/agent/memory.d.ts.map +1 -0
- package/dist/agent/memory.js +244 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/system-prompt.d.ts +3 -0
- package/dist/agent/system-prompt.d.ts.map +1 -0
- package/dist/agent/system-prompt.js +185 -0
- package/dist/agent/system-prompt.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.d.ts +3 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +25 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/model.d.ts +3 -0
- package/dist/cli/model.d.ts.map +1 -0
- package/dist/cli/model.js +144 -0
- package/dist/cli/model.js.map +1 -0
- package/dist/cli/provider.d.ts +3 -0
- package/dist/cli/provider.d.ts.map +1 -0
- package/dist/cli/provider.js +78 -0
- package/dist/cli/provider.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +88 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/config.d.ts +5 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +84 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/types.d.ts +38 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/file-loader.d.ts +12 -0
- package/dist/file-loader.d.ts.map +1 -0
- package/dist/file-loader.js +115 -0
- package/dist/file-loader.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/cache.d.ts +27 -0
- package/dist/indexer/cache.d.ts.map +1 -0
- package/dist/indexer/cache.js +95 -0
- package/dist/indexer/cache.js.map +1 -0
- package/dist/indexer/code-index.d.ts +27 -0
- package/dist/indexer/code-index.d.ts.map +1 -0
- package/dist/indexer/code-index.js +197 -0
- package/dist/indexer/code-index.js.map +1 -0
- package/dist/indexer/project-map.d.ts +14 -0
- package/dist/indexer/project-map.d.ts.map +1 -0
- package/dist/indexer/project-map.js +157 -0
- package/dist/indexer/project-map.js.map +1 -0
- package/dist/llm/openai-compat.d.ts +11 -0
- package/dist/llm/openai-compat.d.ts.map +1 -0
- package/dist/llm/openai-compat.js +81 -0
- package/dist/llm/openai-compat.js.map +1 -0
- package/dist/llm/provider.d.ts +27 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +2 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/llm/token-counter.d.ts +2 -0
- package/dist/llm/token-counter.d.ts.map +1 -0
- package/dist/llm/token-counter.js +24 -0
- package/dist/llm/token-counter.js.map +1 -0
- package/dist/repl/commands.d.ts +37 -0
- package/dist/repl/commands.d.ts.map +1 -0
- package/dist/repl/commands.js +433 -0
- package/dist/repl/commands.js.map +1 -0
- package/dist/repl/history.d.ts +19 -0
- package/dist/repl/history.d.ts.map +1 -0
- package/dist/repl/history.js +29 -0
- package/dist/repl/history.js.map +1 -0
- package/dist/repl/index.d.ts +5 -0
- package/dist/repl/index.d.ts.map +1 -0
- package/dist/repl/index.js +86 -0
- package/dist/repl/index.js.map +1 -0
- 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/session/store.d.ts +34 -0
- package/dist/session/store.d.ts.map +1 -0
- package/dist/session/store.js +115 -0
- package/dist/session/store.js.map +1 -0
- package/dist/skills/loader.d.ts +13 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +122 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/styling/engine.d.ts +37 -0
- package/dist/styling/engine.d.ts.map +1 -0
- package/dist/styling/engine.js +136 -0
- package/dist/styling/engine.js.map +1 -0
- package/dist/styling/index.d.ts +7 -0
- package/dist/styling/index.d.ts.map +1 -0
- package/dist/styling/index.js +15 -0
- package/dist/styling/index.js.map +1 -0
- package/dist/styling/loader.d.ts +4 -0
- package/dist/styling/loader.d.ts.map +1 -0
- package/dist/styling/loader.js +78 -0
- package/dist/styling/loader.js.map +1 -0
- package/dist/styling/types.d.ts +46 -0
- package/dist/styling/types.d.ts.map +1 -0
- package/dist/styling/types.js +2 -0
- package/dist/styling/types.js.map +1 -0
- package/dist/tools/approve.d.ts +13 -0
- package/dist/tools/approve.d.ts.map +1 -0
- package/dist/tools/approve.js +32 -0
- package/dist/tools/approve.js.map +1 -0
- package/dist/tools/bash.d.ts +8 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +186 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/fs/copy-file.d.ts +5 -0
- package/dist/tools/fs/copy-file.d.ts.map +1 -0
- package/dist/tools/fs/copy-file.js +41 -0
- package/dist/tools/fs/copy-file.js.map +1 -0
- package/dist/tools/fs/create-dir.d.ts +5 -0
- package/dist/tools/fs/create-dir.d.ts.map +1 -0
- package/dist/tools/fs/create-dir.js +31 -0
- package/dist/tools/fs/create-dir.js.map +1 -0
- package/dist/tools/fs/delete-file.d.ts +5 -0
- package/dist/tools/fs/delete-file.d.ts.map +1 -0
- package/dist/tools/fs/delete-file.js +39 -0
- package/dist/tools/fs/delete-file.js.map +1 -0
- package/dist/tools/fs/edit-file.d.ts +5 -0
- package/dist/tools/fs/edit-file.d.ts.map +1 -0
- package/dist/tools/fs/edit-file.js +80 -0
- package/dist/tools/fs/edit-file.js.map +1 -0
- package/dist/tools/fs/file-info.d.ts +5 -0
- package/dist/tools/fs/file-info.d.ts.map +1 -0
- package/dist/tools/fs/file-info.js +37 -0
- package/dist/tools/fs/file-info.js.map +1 -0
- package/dist/tools/fs/glob-search.d.ts +5 -0
- package/dist/tools/fs/glob-search.d.ts.map +1 -0
- package/dist/tools/fs/glob-search.js +98 -0
- package/dist/tools/fs/glob-search.js.map +1 -0
- package/dist/tools/fs/grep-search.d.ts +5 -0
- package/dist/tools/fs/grep-search.d.ts.map +1 -0
- package/dist/tools/fs/grep-search.js +120 -0
- package/dist/tools/fs/grep-search.js.map +1 -0
- package/dist/tools/fs/list-dir.d.ts +5 -0
- package/dist/tools/fs/list-dir.d.ts.map +1 -0
- package/dist/tools/fs/list-dir.js +61 -0
- package/dist/tools/fs/list-dir.js.map +1 -0
- package/dist/tools/fs/move-file.d.ts +5 -0
- package/dist/tools/fs/move-file.d.ts.map +1 -0
- package/dist/tools/fs/move-file.js +41 -0
- package/dist/tools/fs/move-file.js.map +1 -0
- package/dist/tools/fs/path-utils.d.ts +30 -0
- package/dist/tools/fs/path-utils.d.ts.map +1 -0
- package/dist/tools/fs/path-utils.js +81 -0
- package/dist/tools/fs/path-utils.js.map +1 -0
- package/dist/tools/fs/read-file.d.ts +5 -0
- package/dist/tools/fs/read-file.d.ts.map +1 -0
- package/dist/tools/fs/read-file.js +51 -0
- package/dist/tools/fs/read-file.js.map +1 -0
- package/dist/tools/fs/tree.d.ts +5 -0
- package/dist/tools/fs/tree.d.ts.map +1 -0
- package/dist/tools/fs/tree.js +75 -0
- package/dist/tools/fs/tree.js.map +1 -0
- package/dist/tools/fs/types.d.ts +7 -0
- package/dist/tools/fs/types.d.ts.map +1 -0
- package/dist/tools/fs/types.js +9 -0
- package/dist/tools/fs/types.js.map +1 -0
- package/dist/tools/fs/write-file.d.ts +5 -0
- package/dist/tools/fs/write-file.d.ts.map +1 -0
- package/dist/tools/fs/write-file.js +58 -0
- package/dist/tools/fs/write-file.js.map +1 -0
- package/dist/tools/hooks.d.ts +15 -0
- package/dist/tools/hooks.d.ts.map +1 -0
- package/dist/tools/hooks.js +109 -0
- package/dist/tools/hooks.js.map +1 -0
- package/dist/tools/mcp.d.ts +22 -0
- package/dist/tools/mcp.d.ts.map +1 -0
- package/dist/tools/mcp.js +90 -0
- package/dist/tools/mcp.js.map +1 -0
- package/dist/tools/plan.d.ts +20 -0
- package/dist/tools/plan.d.ts.map +1 -0
- package/dist/tools/plan.js +86 -0
- package/dist/tools/plan.js.map +1 -0
- package/dist/tools/question.d.ts +17 -0
- package/dist/tools/question.d.ts.map +1 -0
- package/dist/tools/question.js +55 -0
- package/dist/tools/question.js.map +1 -0
- package/dist/tools/registry.d.ts +25 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +81 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/sanitizer.d.ts +7 -0
- package/dist/tools/sanitizer.d.ts.map +1 -0
- package/dist/tools/sanitizer.js +50 -0
- package/dist/tools/sanitizer.js.map +1 -0
- package/dist/tools/syntax-check.d.ts +16 -0
- package/dist/tools/syntax-check.d.ts.map +1 -0
- package/dist/tools/syntax-check.js +265 -0
- package/dist/tools/syntax-check.js.map +1 -0
- package/dist/tools/todo.d.ts +19 -0
- package/dist/tools/todo.d.ts.map +1 -0
- package/dist/tools/todo.js +102 -0
- package/dist/tools/todo.js.map +1 -0
- 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/components/status-bar.d.ts +3 -0
- package/dist/ui/components/status-bar.d.ts.map +1 -0
- package/dist/ui/components/status-bar.js +14 -0
- package/dist/ui/components/status-bar.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/index.d.ts +4 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +7 -0
- package/dist/ui/index.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/ui/readline-renderer.d.ts +30 -0
- package/dist/ui/readline-renderer.d.ts.map +1 -0
- package/dist/ui/readline-renderer.js +97 -0
- package/dist/ui/readline-renderer.js.map +1 -0
- package/dist/ui/renderer.d.ts +35 -0
- package/dist/ui/renderer.d.ts.map +1 -0
- package/dist/ui/renderer.js +2 -0
- package/dist/ui/renderer.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
const MEMORY_DIR = join(homedir(), '.mma', 'memory');
|
|
5
|
+
const MEMORY_FILES = ['project.md', 'conventions.md', 'decisions.md', 'errors.md', 'history.md'];
|
|
6
|
+
const ARCHIVE_DIR = join(MEMORY_DIR, 'archive');
|
|
7
|
+
const MAX_MEMORY_TOKENS = 2000;
|
|
8
|
+
const ARCHIVE_DAYS = 30;
|
|
9
|
+
export function ensureMemoryDir() {
|
|
10
|
+
if (!existsSync(MEMORY_DIR))
|
|
11
|
+
mkdirSync(MEMORY_DIR, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
export function getMemoryPath(type) {
|
|
14
|
+
const fileMap = {
|
|
15
|
+
project: 'project.md',
|
|
16
|
+
conventions: 'conventions.md',
|
|
17
|
+
decisions: 'decisions.md',
|
|
18
|
+
errors: 'errors.md',
|
|
19
|
+
history: 'history.md',
|
|
20
|
+
};
|
|
21
|
+
return join(MEMORY_DIR, fileMap[type] || `${type}.md`);
|
|
22
|
+
}
|
|
23
|
+
export function loadMemory(type) {
|
|
24
|
+
const path = getMemoryPath(type);
|
|
25
|
+
try {
|
|
26
|
+
return readFileSync(path, 'utf-8');
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return `# ${type}\n\n_No entries yet._\n`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function saveMemory(type, title, content) {
|
|
33
|
+
ensureMemoryDir();
|
|
34
|
+
const path = getMemoryPath(type);
|
|
35
|
+
const date = new Date().toISOString().split('T')[0];
|
|
36
|
+
const entry = `\n## [${date}] ${title}\n${content}\n`;
|
|
37
|
+
try {
|
|
38
|
+
const existing = readFileSync(path, 'utf-8');
|
|
39
|
+
writeFileSync(path, existing + entry, 'utf-8');
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
writeFileSync(path, `# ${type}\n${entry}`, 'utf-8');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export function searchMemory(query) {
|
|
46
|
+
const results = [];
|
|
47
|
+
const lower = query.toLowerCase();
|
|
48
|
+
for (const file of MEMORY_FILES) {
|
|
49
|
+
const path = join(MEMORY_DIR, file);
|
|
50
|
+
if (!existsSync(path))
|
|
51
|
+
continue;
|
|
52
|
+
const type = file.replace('.md', '');
|
|
53
|
+
const content = readFileSync(path, 'utf-8');
|
|
54
|
+
const lines = content.split('\n');
|
|
55
|
+
for (let i = 0; i < lines.length; i++) {
|
|
56
|
+
if (lines[i].toLowerCase().includes(lower)) {
|
|
57
|
+
results.push({
|
|
58
|
+
type,
|
|
59
|
+
match: lines[i].trim().slice(0, 150),
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return results.slice(0, 20);
|
|
65
|
+
}
|
|
66
|
+
export function loadAllMemory() {
|
|
67
|
+
ensureMemoryDir();
|
|
68
|
+
const parts = [];
|
|
69
|
+
for (const file of MEMORY_FILES) {
|
|
70
|
+
const path = join(MEMORY_DIR, file);
|
|
71
|
+
if (!existsSync(path))
|
|
72
|
+
continue;
|
|
73
|
+
const content = readFileSync(path, 'utf-8').trim();
|
|
74
|
+
if (content && !content.includes('_No entries yet._')) {
|
|
75
|
+
const title = file.replace('.md', '');
|
|
76
|
+
const lines = content.split('\n').filter(l => l.startsWith('## ')).length;
|
|
77
|
+
parts.push(`${title}: ${lines} entries`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (parts.length === 0)
|
|
81
|
+
return '';
|
|
82
|
+
return `\n## Project Memory\n${parts.join('\n')}\n`;
|
|
83
|
+
}
|
|
84
|
+
export function removeMemoryEntry(type, lineNum) {
|
|
85
|
+
const path = getMemoryPath(type);
|
|
86
|
+
if (!existsSync(path))
|
|
87
|
+
return false;
|
|
88
|
+
try {
|
|
89
|
+
const content = readFileSync(path, 'utf-8');
|
|
90
|
+
const lines = content.split('\n');
|
|
91
|
+
// Find the ## entry that starts at or before lineNum
|
|
92
|
+
let entryStart = -1;
|
|
93
|
+
let entryEnd = -1;
|
|
94
|
+
for (let i = 0; i < lines.length; i++) {
|
|
95
|
+
if (lines[i].startsWith('## ')) {
|
|
96
|
+
if (i + 1 <= lineNum) {
|
|
97
|
+
entryStart = i;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
entryEnd = i;
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (entryStart === -1)
|
|
106
|
+
return false;
|
|
107
|
+
if (entryEnd === -1)
|
|
108
|
+
entryEnd = lines.length;
|
|
109
|
+
// Remove the entry
|
|
110
|
+
lines.splice(entryStart, entryEnd - entryStart);
|
|
111
|
+
writeFileSync(path, lines.join('\n'), 'utf-8');
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
export function exportMemory() {
|
|
119
|
+
ensureMemoryDir();
|
|
120
|
+
const parts = [];
|
|
121
|
+
let hasContent = false;
|
|
122
|
+
for (const file of MEMORY_FILES) {
|
|
123
|
+
const path = join(MEMORY_DIR, file);
|
|
124
|
+
if (!existsSync(path))
|
|
125
|
+
continue;
|
|
126
|
+
const content = readFileSync(path, 'utf-8').trim();
|
|
127
|
+
if (content && !content.includes('_No entries yet._')) {
|
|
128
|
+
parts.push(content);
|
|
129
|
+
hasContent = true;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (!hasContent)
|
|
133
|
+
return null;
|
|
134
|
+
const exportPath = join(MEMORY_DIR, 'memory-export.md');
|
|
135
|
+
writeFileSync(exportPath, parts.join('\n\n---\n\n'), 'utf-8');
|
|
136
|
+
return exportPath;
|
|
137
|
+
}
|
|
138
|
+
export function autoLearnFromError(command, stderr, stdout) {
|
|
139
|
+
const errorText = stderr || stdout;
|
|
140
|
+
if (!errorText || errorText.length < 10)
|
|
141
|
+
return;
|
|
142
|
+
const patterns = [
|
|
143
|
+
{ re: /Cannot find module\s+['"]([^'"]+)['"]/i, title: 'Missing module', solution: 'Install with npm install <module>' },
|
|
144
|
+
{ re: /ENOENT:\s+no such file or directory/i, title: 'File not found', solution: 'Check file path exists' },
|
|
145
|
+
{ re: /SyntaxError:\s+(.+)/i, title: 'Syntax error', solution: 'Fix syntax in the file' },
|
|
146
|
+
{ re: /TypeError:\s+(.+)/i, title: 'Type error', solution: 'Check types and null values' },
|
|
147
|
+
{ re: /ReferenceError:\s+(\w+)\s+is not defined/i, title: 'Undefined reference', solution: 'Import or define the variable' },
|
|
148
|
+
{ re: /EACCES:\s+permission denied/i, title: 'Permission denied', solution: 'Run with appropriate permissions' },
|
|
149
|
+
{ re: /EADDRINUSE:\s+address already in use/i, title: 'Port in use', solution: 'Kill process on that port or use different port' },
|
|
150
|
+
{ re: /Command failed:\s+(.+)/i, title: 'Command failed', solution: 'Check command syntax and dependencies' },
|
|
151
|
+
];
|
|
152
|
+
for (const pattern of patterns) {
|
|
153
|
+
const match = errorText.match(pattern.re);
|
|
154
|
+
if (match) {
|
|
155
|
+
const shortCmd = command.length > 60 ? command.slice(0, 57) + '...' : command;
|
|
156
|
+
const shortErr = (match[1] || match[0]).toString().slice(0, 100);
|
|
157
|
+
saveMemory('errors', `${pattern.title}: ${shortErr}`, `Command: \`${shortCmd}\`\nError: ${shortErr}\nSolution: ${pattern.solution}`);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
export function autoLearnFromEdit(filePath, content) {
|
|
163
|
+
const ext = filePath.split('.').pop()?.toLowerCase() || '';
|
|
164
|
+
const patterns = [
|
|
165
|
+
{ re: /export\s+default\s+function\s+(\w+)/, convention: 'Default export: function' },
|
|
166
|
+
{ re: /export\s+default\s+class\s+(\w+)/, convention: 'Default export: class' },
|
|
167
|
+
{ re: /export\s+(?:async\s+)?function\s+(\w+)/, convention: 'Named function export' },
|
|
168
|
+
{ re: /export\s+const\s+(\w+)\s*=\s*(?:async\s+)?\(/, convention: 'Arrow function export' },
|
|
169
|
+
{ re: /export\s+(?:type|interface)\s+(\w+)/, convention: 'Type export' },
|
|
170
|
+
{ re: /import\s+\{\s*([^}]+)\s*\}\s+from\s+['"]([^'"]+)['"]/, convention: 'Named imports' },
|
|
171
|
+
{ re: /import\s+(\w+)\s+from\s+['"]([^'"]+)['"]/, convention: 'Default import' },
|
|
172
|
+
{ re: /console\.(log|error|warn)\(/, convention: 'Console output (consider using logger)' },
|
|
173
|
+
{ re: /try\s*\{[\s\S]*?\}\s*catch\s*\(/, convention: 'Error handling pattern' },
|
|
174
|
+
];
|
|
175
|
+
const detected = [];
|
|
176
|
+
for (const p of patterns) {
|
|
177
|
+
if (p.re.test(content)) {
|
|
178
|
+
detected.push(p.convention);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (detected.length > 0) {
|
|
182
|
+
const unique = [...new Set(detected)];
|
|
183
|
+
saveMemory('conventions', `Patterns in ${filePath}`, unique.join('\n'));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
export function getMemoryTokenEstimate() {
|
|
187
|
+
let totalChars = 0;
|
|
188
|
+
for (const file of MEMORY_FILES) {
|
|
189
|
+
const path = join(MEMORY_DIR, file);
|
|
190
|
+
if (!existsSync(path))
|
|
191
|
+
continue;
|
|
192
|
+
try {
|
|
193
|
+
totalChars += readFileSync(path, 'utf-8').length;
|
|
194
|
+
}
|
|
195
|
+
catch { /* ignore */ }
|
|
196
|
+
}
|
|
197
|
+
return Math.ceil(totalChars / 4);
|
|
198
|
+
}
|
|
199
|
+
export function trimMemoryToBudget() {
|
|
200
|
+
const estimate = getMemoryTokenEstimate();
|
|
201
|
+
if (estimate <= MAX_MEMORY_TOKENS)
|
|
202
|
+
return false;
|
|
203
|
+
// Remove oldest entries from each file until under budget
|
|
204
|
+
for (const file of MEMORY_FILES) {
|
|
205
|
+
const path = join(MEMORY_DIR, file);
|
|
206
|
+
if (!existsSync(path))
|
|
207
|
+
continue;
|
|
208
|
+
try {
|
|
209
|
+
let content = readFileSync(path, 'utf-8');
|
|
210
|
+
const entries = content.split(/\n(?=## \[)/);
|
|
211
|
+
if (entries.length <= 2)
|
|
212
|
+
continue;
|
|
213
|
+
// Remove oldest entries (skip header)
|
|
214
|
+
const header = entries[0];
|
|
215
|
+
const body = entries.slice(1);
|
|
216
|
+
body.splice(0, Math.ceil(body.length / 4)); // Remove 25% oldest
|
|
217
|
+
writeFileSync(path, header + body.join(''), 'utf-8');
|
|
218
|
+
}
|
|
219
|
+
catch { /* ignore */ }
|
|
220
|
+
}
|
|
221
|
+
return getMemoryTokenEstimate() < estimate;
|
|
222
|
+
}
|
|
223
|
+
export function loadAllMemoryDetailed() {
|
|
224
|
+
ensureMemoryDir();
|
|
225
|
+
const parts = [];
|
|
226
|
+
let totalChars = 0;
|
|
227
|
+
for (const file of MEMORY_FILES) {
|
|
228
|
+
const path = join(MEMORY_DIR, file);
|
|
229
|
+
if (!existsSync(path))
|
|
230
|
+
continue;
|
|
231
|
+
const content = readFileSync(path, 'utf-8').trim();
|
|
232
|
+
if (content && !content.includes('_No entries yet._')) {
|
|
233
|
+
const title = file.replace('.md', '');
|
|
234
|
+
const entries = content.split(/\n(?=## \[)/).length - 1;
|
|
235
|
+
totalChars += content.length;
|
|
236
|
+
parts.push(`${title}: ${entries} entries`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (parts.length === 0)
|
|
240
|
+
return '';
|
|
241
|
+
const tokens = Math.ceil(totalChars / 4);
|
|
242
|
+
return `\n## Project Memory (${tokens} tokens)\n${parts.join('\n')}\n`;
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/agent/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/agent/system-prompt.ts"],"names":[],"mappings":"AAKA,OAAO,EAAwD,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAsIvG,wBAAgB,iBAAiB,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,GAAG,MAAM,CAuD/D"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import { loadAllMemoryDetailed } from './memory.js';
|
|
5
|
+
import { getOrBuildProjectMap } from '../indexer/cache.js';
|
|
6
|
+
import { loadAgentsMd, listInstalledSkills, formatSkillsBlock } from '../skills/loader.js';
|
|
7
|
+
const TOOL_FORMAT = `CRITICAL: Use filesystem tools for file operations — they are more reliable than bash.
|
|
8
|
+
|
|
9
|
+
To call a tool, output EXACTLY this format (on its own line):
|
|
10
|
+
|
|
11
|
+
<tool_call>{"name":"tool_name","arguments":{...}}</tool_call>
|
|
12
|
+
|
|
13
|
+
## Filesystem Tools (USE THESE for file ops):
|
|
14
|
+
|
|
15
|
+
Read a file:
|
|
16
|
+
{"name":"read_file","arguments":{"path":"src/index.ts"}}
|
|
17
|
+
{"name":"read_file","arguments":{"path":"src/index.ts","offset":50,"limit":100}}
|
|
18
|
+
|
|
19
|
+
Write/create a file:
|
|
20
|
+
{"name":"write_file","arguments":{"path":"src/utils.ts","content":"export function foo() { return 1; }"}}
|
|
21
|
+
|
|
22
|
+
Edit (find & replace):
|
|
23
|
+
{"name":"edit_file","arguments":{"path":"src/index.ts","old_string":"old text","new_string":"new text"}}
|
|
24
|
+
|
|
25
|
+
List directory:
|
|
26
|
+
{"name":"list_dir","arguments":{}}
|
|
27
|
+
{"name":"list_dir","arguments":{"path":"src"}}
|
|
28
|
+
|
|
29
|
+
Create directory: {"name":"create_dir","arguments":{"path":"src/routes"}}
|
|
30
|
+
Delete file: {"name":"delete_file","arguments":{"path":"old-file.ts"}}
|
|
31
|
+
Copy file: {"name":"copy_file","arguments":{"source":"src/a.ts","destination":"src/b.ts"}}
|
|
32
|
+
Move/rename: {"name":"move_file","arguments":{"source":"old.ts","destination":"new.ts"}}
|
|
33
|
+
File info: {"name":"file_info","arguments":{"path":"src/index.ts"}}
|
|
34
|
+
Search files: {"name":"glob_search","arguments":{"pattern":"**/*.ts"}}
|
|
35
|
+
Search content: {"name":"grep_search","arguments":{"pattern":"function","include":"*.ts"}}
|
|
36
|
+
Directory tree: {"name":"tree","arguments":{"depth":2}}
|
|
37
|
+
|
|
38
|
+
## Bash (for non-file operations — npm, git, etc):
|
|
39
|
+
{"name":"bash","arguments":{"cmd":"npm test"}}
|
|
40
|
+
{"name":"bash","arguments":{"cmd":"git status"}}
|
|
41
|
+
|
|
42
|
+
NEVER output tool calls in any other format. ALWAYS use <tool_call> tags.`;
|
|
43
|
+
const CONVERSATION_FLOW = `## How This Works (IMPORTANT — read this carefully)
|
|
44
|
+
|
|
45
|
+
You are in a loop. Each turn works like this:
|
|
46
|
+
|
|
47
|
+
1. User sends a message
|
|
48
|
+
2. You respond with TEXT and/or TOOL CALLS
|
|
49
|
+
3. Tool results appear — then it is YOUR TURN AGAIN
|
|
50
|
+
4. Repeat until the task is done
|
|
51
|
+
|
|
52
|
+
### What you see after a tool executes:
|
|
53
|
+
|
|
54
|
+
You will see a message like:
|
|
55
|
+
[tool result: "Written 42 bytes (3 lines) to src/index.ts"]
|
|
56
|
+
|
|
57
|
+
This is NOT the end. You MUST continue:
|
|
58
|
+
- If more files need work → call the next tool
|
|
59
|
+
- If the task is done → write a summary to the user
|
|
60
|
+
- If there was an error → explain it and fix it
|
|
61
|
+
|
|
62
|
+
### Example conversation:
|
|
63
|
+
|
|
64
|
+
User: "Create a file src/utils.ts with a hello function"
|
|
65
|
+
|
|
66
|
+
You:
|
|
67
|
+
<tool_call>{"name":"write_file","arguments":{"path":"src/utils.ts","content":"export function hello() { return 'world'; }"}}</tool_call>
|
|
68
|
+
|
|
69
|
+
[Tool result: "Written 52 bytes (1 lines) to src/utils.ts"]
|
|
70
|
+
|
|
71
|
+
You:
|
|
72
|
+
File src/utils.ts created successfully. It exports a hello() function that returns 'world'.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
NEVER stop after a tool call. ALWAYS continue with either another tool call or a text reply.`;
|
|
77
|
+
const RULES_COMMON = `Rules:
|
|
78
|
+
1. Use filesystem tools for file operations (read_file, write_file, edit_file, list_dir, glob_search, grep_search, tree). Use bash ONLY for non-file commands (npm, git, etc).
|
|
79
|
+
2. Always respond in the user's language (Русский или English).
|
|
80
|
+
3. CRITICAL: After every tool call, CHECK the result (exit code + output).
|
|
81
|
+
If exit code != 0, DO NOT claim success — tell the user about the error.
|
|
82
|
+
Verify files were created before saying "done".
|
|
83
|
+
4. NEVER return an empty response. After receiving a tool result, you MUST either:
|
|
84
|
+
a) Call another tool (if more work is needed), OR
|
|
85
|
+
b) Write a text response to the user (summarize what was done, report errors, ask questions).
|
|
86
|
+
Staying silent after a tool result is always wrong.
|
|
87
|
+
5. The JSON inside <tool_call> must be VALID JSON. Escape " inside values as \\".
|
|
88
|
+
If your command contains double quotes, wrap them in escaped form.
|
|
89
|
+
6. For large files (>200 lines), use offset/limit with read_file:
|
|
90
|
+
{"name":"read_file","arguments":{"path":"file.ts","offset":1,"limit":100}}
|
|
91
|
+
{"name":"read_file","arguments":{"path":"file.ts","offset":101,"limit":100}}
|
|
92
|
+
Or use grep_search to find specific content: {"name":"grep_search","arguments":{"pattern":"function","include":"*.ts"}}
|
|
93
|
+
7. SKILLS AND PLANNING: For complex tasks (3+ steps):
|
|
94
|
+
a. If skills are NOT loaded yet: suggest them: "Рекомендую @skill1 @skill2"
|
|
95
|
+
b. If skills ARE loaded (you see "Skills loaded" in context): DO NOT suggest skills again — they are already loaded
|
|
96
|
+
c. IMMEDIATELY create a plan and start executing
|
|
97
|
+
d. Create a plan: plan create TaskName Step1 Step2 Step3
|
|
98
|
+
e. Mark current step as in_progress before executing it
|
|
99
|
+
f. Mark step as done only AFTER verifying the result (exit code 0 + file exists)
|
|
100
|
+
Example: User: "Создай REST API" → You: plan create REST API init-project create-schemas
|
|
101
|
+
8. FOR SIMPLE TASKS (1-2 steps): Just do it, no plan needed. Use common sense.
|
|
102
|
+
9. NEVER JUST TALK — ALWAYS ACT. Do NOT say "напиши навыки в следующем сообщении" or similar waiting phrases. If skills are loaded, START WORKING IMMEDIATELY.
|
|
103
|
+
10. When skills are already loaded in your context, you MUST use filesystem tools (write_file, create_dir, etc.) for file operations. Do NOT ask the user to load skills again.`;
|
|
104
|
+
const POWERSHELL_EXAMPLES = `Examples (PowerShell):
|
|
105
|
+
<tool_call>{"name":"bash","arguments":{"cmd":"dir"}}</tool_call>
|
|
106
|
+
<tool_call>{"name":"bash","arguments":{"cmd":"Get-Content src\\\\index.ts"}}</tool_call>
|
|
107
|
+
<tool_call>{"name":"bash","arguments":{"cmd":"npm test"}}</tool_call>
|
|
108
|
+
<tool_call>{"name":"bash","arguments":{"cmd":"Set-Content -Path file.md -Value 'Hello World'"}}</tool_call>`;
|
|
109
|
+
const POWERSHELL_RULES = `PowerShell specifics:
|
|
110
|
+
- Create/write files: Set-Content -Path file.md -Value "content"
|
|
111
|
+
- Append to file: Add-Content -Path file.md -Value "line"
|
|
112
|
+
- Read files: Get-Content file.md
|
|
113
|
+
- List directory: dir (or Get-ChildItem)
|
|
114
|
+
- Create directories: New-Item -ItemType Directory -Force -Path "folder"
|
|
115
|
+
- NEVER use: echo -e, cat (use Get-Content), bash syntax like mkdir -p or {src/routes,...}
|
|
116
|
+
- NEVER use single quotes for strings with \\n, \\t — use DOUBLE quotes: "line1\\nline2"
|
|
117
|
+
- Paths use backslashes: src\\index.ts
|
|
118
|
+
- Check file exists: Test-Path file.md
|
|
119
|
+
- Install deps: npm install (NOT npm i)
|
|
120
|
+
- Run dev: npm run dev (NOT npx tsx watch)`;
|
|
121
|
+
const UNIX_EXAMPLES = `Examples (Linux/macOS):
|
|
122
|
+
<tool_call>{"name":"bash","arguments":{"cmd":"ls -la"}}</tool_call>
|
|
123
|
+
<tool_call>{"name":"bash","arguments":{"cmd":"cat src/index.ts"}}</tool_call>
|
|
124
|
+
<tool_call>{"name":"bash","arguments":{"cmd":"npm test"}}</tool_call>
|
|
125
|
+
<tool_call>{"name":"bash","arguments":{"cmd":"echo 'Hello World' > file.md"}}</tool_call>`;
|
|
126
|
+
const UNIX_RULES = `Unix specifics:
|
|
127
|
+
- Create/write files: echo "content" > file.md
|
|
128
|
+
- Read files: cat file.md
|
|
129
|
+
- List directory: ls -la
|
|
130
|
+
- Paths use forward slashes: src/index.ts
|
|
131
|
+
- Check file exists: test -f file.md`;
|
|
132
|
+
export function buildSystemPrompt(extraSkills) {
|
|
133
|
+
const isWin = os.platform() === 'win32';
|
|
134
|
+
const platformName = isWin ? 'Windows' : os.platform();
|
|
135
|
+
let osVersion = platformName;
|
|
136
|
+
try {
|
|
137
|
+
osVersion += ` (${os.version()})`;
|
|
138
|
+
}
|
|
139
|
+
catch { /* ignore */ }
|
|
140
|
+
const now = new Date();
|
|
141
|
+
const dateStr = now.toLocaleDateString('ru-RU', { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long' });
|
|
142
|
+
const timeStr = now.toLocaleTimeString('ru-RU');
|
|
143
|
+
let projectName = 'unknown';
|
|
144
|
+
const pkgPath = resolve(process.cwd(), 'package.json');
|
|
145
|
+
if (existsSync(pkgPath)) {
|
|
146
|
+
try {
|
|
147
|
+
projectName = JSON.parse(readFileSync(pkgPath, 'utf-8')).name || 'unknown';
|
|
148
|
+
}
|
|
149
|
+
catch { /* ignore */ }
|
|
150
|
+
}
|
|
151
|
+
const platformBlock = isWin
|
|
152
|
+
? [TOOL_FORMAT, CONVERSATION_FLOW, POWERSHELL_EXAMPLES, RULES_COMMON, POWERSHELL_RULES].join('\n\n')
|
|
153
|
+
: [TOOL_FORMAT, CONVERSATION_FLOW, UNIX_EXAMPLES, RULES_COMMON, UNIX_RULES].join('\n\n');
|
|
154
|
+
const header = `You are Micro Models Agent (MMA), an AI coding assistant.
|
|
155
|
+
You help with software engineering tasks in the project directory.`;
|
|
156
|
+
const sysInfo = [
|
|
157
|
+
'',
|
|
158
|
+
'## System',
|
|
159
|
+
`Date: ${dateStr}`,
|
|
160
|
+
`Time: ${timeStr}`,
|
|
161
|
+
`OS: ${osVersion}`,
|
|
162
|
+
`Node.js: ${process.version}`,
|
|
163
|
+
`CWD: ${process.cwd()}`,
|
|
164
|
+
`Project: ${projectName}`,
|
|
165
|
+
'',
|
|
166
|
+
].join('\n');
|
|
167
|
+
const memory = loadAllMemoryDetailed();
|
|
168
|
+
let projectMap = '';
|
|
169
|
+
try {
|
|
170
|
+
const { formatted, fromCache } = getOrBuildProjectMap(process.cwd());
|
|
171
|
+
if (formatted) {
|
|
172
|
+
projectMap = `\n## Project Map${fromCache ? ' (cached)' : ''}\n${formatted}`;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch { /* ignore */ }
|
|
176
|
+
const agentsMd = loadAgentsMd(process.cwd());
|
|
177
|
+
const agentsBlock = agentsMd ? `\n## Project Instructions (AGENTS.md)\n${agentsMd}` : '';
|
|
178
|
+
const allSkills = listInstalledSkills();
|
|
179
|
+
const skillsHint = allSkills.length > 0
|
|
180
|
+
? `\n## Available Skills (${allSkills.length})\nSkills contain ready-made workflows, best practices, and step-by-step guides.\nFor complex tasks (3+ steps): SUGGEST skills FIRST → User loads them → You READ them → Create plan BASED ON skill content.\nDo NOT put @skill-name inside tool_call. Just tell the user which skill to load.\nWorkflow:\n 1. User asks: "Создай REST API"\n 2. You: "Рекомендую @typescript-expert @nodejs-expert — напиши их в следующем сообщении."\n 3. User: "@typescript-expert @nodejs-expert"\n 4. Skills injected into this prompt — you READ them\n 5. You create plan BASED ON skill guidance: plan create REST API ...\n 6. You execute plan step by step\n\nInstalled skills: ${allSkills.map(s => '@' + s).join(' ')}`
|
|
181
|
+
: '';
|
|
182
|
+
const base = [header, platformBlock, sysInfo, memory, projectMap, agentsBlock, skillsHint].filter(Boolean).join('\n');
|
|
183
|
+
return base + (extraSkills && extraSkills.length > 0 ? '\n\n' + formatSkillsBlock(extraSkills) : '');
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=system-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/agent/system-prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blog-api/types/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/blog-api/types/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuB7D"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { loadConfig, saveConfig } from '../config/config.js';
|
|
2
|
+
import { getTheme } from '../styling/index.js';
|
|
3
|
+
export function registerConfigCommands(program) {
|
|
4
|
+
const configCmd = program.command('config').description('Manage configuration');
|
|
5
|
+
configCmd
|
|
6
|
+
.command('show')
|
|
7
|
+
.description('Show current configuration')
|
|
8
|
+
.action(() => {
|
|
9
|
+
const config = loadConfig();
|
|
10
|
+
console.log(JSON.stringify(config, null, 2));
|
|
11
|
+
});
|
|
12
|
+
configCmd
|
|
13
|
+
.command('reset')
|
|
14
|
+
.description('Reset config to defaults')
|
|
15
|
+
.action(() => {
|
|
16
|
+
const config = loadConfig();
|
|
17
|
+
const theme = getTheme();
|
|
18
|
+
config.providers = {};
|
|
19
|
+
config.active = { provider: 'lmstudio', model: 'qwen3.5-9b' };
|
|
20
|
+
config.agent = { maxSteps: 50, autoCompact: true, compactThreshold: 0.85, toolTimeout: 120, maxOutputLength: 2000 };
|
|
21
|
+
saveConfig(config);
|
|
22
|
+
console.log(theme.successMsg('Configuration reset to defaults'));
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAEhF,SAAS;SACN,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEL,SAAS;SACN,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,MAAM,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAC9D,MAAM,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;QACpH,UAAU,CAAC,MAAM,CAAC,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,iCAAiC,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/cli/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8I5D"}
|