zames_pro 1.2.0 → 2.0.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/dist/agent-loop.js +652 -0
- package/dist/agent-loop.js.map +1 -0
- package/dist/browser.js +573 -0
- package/dist/browser.js.map +1 -0
- package/dist/config.js +74 -0
- package/dist/config.js.map +1 -0
- package/dist/confirm.js +82 -0
- package/dist/confirm.js.map +1 -0
- package/dist/diff.js +38 -0
- package/dist/diff.js.map +1 -0
- package/dist/gitTools.js +219 -0
- package/dist/gitTools.js.map +1 -0
- package/dist/index.js +1365 -0
- package/dist/index.js.map +1 -0
- package/dist/input.js +524 -0
- package/dist/input.js.map +1 -0
- package/dist/markdown.js +48 -0
- package/dist/markdown.js.map +1 -0
- package/dist/self-review.js +281 -0
- package/dist/self-review.js.map +1 -0
- package/dist/sessions.js +123 -0
- package/dist/sessions.js.map +1 -0
- package/dist/spinner.js +138 -0
- package/dist/spinner.js.map +1 -0
- package/{src → dist}/system-prompt.js +10 -14
- package/dist/system-prompt.js.map +1 -0
- package/{src → dist}/theme.js +17 -19
- package/dist/theme.js.map +1 -0
- package/dist/tools.js +189 -0
- package/dist/tools.js.map +1 -0
- package/dist/transcript.js +51 -0
- package/dist/transcript.js.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/undo.js +100 -0
- package/dist/undo.js.map +1 -0
- package/dist/web.js +220 -0
- package/dist/web.js.map +1 -0
- package/dist/xml-toolcall.js +68 -0
- package/dist/xml-toolcall.js.map +1 -0
- package/package.json +13 -5
- package/src/agent-loop.js +0 -575
- package/src/browser.js +0 -627
- package/src/config.js +0 -81
- package/src/confirm.js +0 -85
- package/src/diff.js +0 -32
- package/src/gitTools.js +0 -256
- package/src/index.js +0 -1461
- package/src/input.js +0 -447
- package/src/markdown.js +0 -49
- package/src/self-review.js +0 -319
- package/src/spinner.js +0 -144
- package/src/tools.js +0 -206
- package/src/transcript.js +0 -46
- package/src/undo.js +0 -101
- package/src/web.js +0 -266
- package/src/xml-toolcall.js +0 -69
package/dist/markdown.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { render } from 'markdansi';
|
|
2
|
+
import { highlight } from 'cli-highlight';
|
|
3
|
+
const theme = {
|
|
4
|
+
heading: { color: '#9fb8d8', bold: true },
|
|
5
|
+
strong: { color: '#e6e0cc', bold: true },
|
|
6
|
+
emph: { color: '#cfc9b0', italic: true },
|
|
7
|
+
inlineCode: { color: '#9ecb9e' },
|
|
8
|
+
blockCode: { color: '#c9d1c9' },
|
|
9
|
+
code: { color: '#9ecb9e' },
|
|
10
|
+
link: { color: '#8fb8d8', underline: true },
|
|
11
|
+
quote: { color: '#8a8f9a', italic: true },
|
|
12
|
+
hr: { color: '#5b616e' },
|
|
13
|
+
listMarker: { color: '#8a9bb5' },
|
|
14
|
+
tableHeader: { color: '#9fb8d8', bold: true },
|
|
15
|
+
tableCell: { color: '#d0d0d0' },
|
|
16
|
+
};
|
|
17
|
+
// Подсветка кода через cli-highlight (транзитивно уже есть у нас).
|
|
18
|
+
function highlighter(code, lang) {
|
|
19
|
+
try {
|
|
20
|
+
return highlight(code, {
|
|
21
|
+
language: lang || 'plaintext',
|
|
22
|
+
ignoreIllegals: true,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return code;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function renderMarkdown(text) {
|
|
30
|
+
if (!text)
|
|
31
|
+
return '';
|
|
32
|
+
try {
|
|
33
|
+
return render(String(text), {
|
|
34
|
+
width: Math.min(process.stdout.columns || 80, 100),
|
|
35
|
+
theme: theme,
|
|
36
|
+
highlighter,
|
|
37
|
+
codeBox: true,
|
|
38
|
+
tableBorder: 'unicode',
|
|
39
|
+
listIndent: 2,
|
|
40
|
+
hyperlinks: false,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return String(text);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export default renderMarkdown;
|
|
48
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAqBzC,MAAM,KAAK,GAAY;IACrB,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;IACzC,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;IACxC,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE;IACxC,UAAU,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAChC,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC/B,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC1B,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE;IAC3C,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE;IACzC,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IACxB,UAAU,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAChC,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;IAC7C,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;CAChC,CAAA;AAED,mEAAmE;AACnE,SAAS,WAAW,CAAC,IAAY,EAAE,IAAa;IAC9C,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,IAAI,EAAE;YACrB,QAAQ,EAAE,IAAI,IAAI,WAAW;YAC7B,cAAc,EAAE,IAAI;SACrB,CAAC,CAAA;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAA;IACpB,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YAC1B,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC;YAClD,KAAK,EAAE,KAIE;YACT,WAAW;YACX,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,SAAS;YACtB,UAAU,EAAE,CAAC;YACb,UAAU,EAAE,KAAK;SAClB,CAAC,CAAA;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC;AACH,CAAC;AAED,eAAe,cAAc,CAAA"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import fs from 'fs/promises';
|
|
3
|
+
import { theme } from './theme.js';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { ZAMES_HOME } from './config.js';
|
|
6
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
// Исходники для самообзора — это .ts файлы. После сборки (tsc → dist/)
|
|
8
|
+
// __dirname указывает на dist, где лежат .js. Поэтому ищем каталог с
|
|
9
|
+
// исходниками: либо рядом (запуск из src/ через tsx), либо в ../src
|
|
10
|
+
// (запуск собранного dist/ из корня репозитория).
|
|
11
|
+
function resolveSrcDir() {
|
|
12
|
+
const candidates = [__dirname, path.join(__dirname, '..', 'src')];
|
|
13
|
+
for (const dir of candidates) {
|
|
14
|
+
try {
|
|
15
|
+
const entries = require('fs').readdirSync(dir);
|
|
16
|
+
if (entries.some((e) => e.endsWith('.ts')))
|
|
17
|
+
return dir;
|
|
18
|
+
}
|
|
19
|
+
catch { }
|
|
20
|
+
}
|
|
21
|
+
return __dirname;
|
|
22
|
+
}
|
|
23
|
+
const SRC_DIR = resolveSrcDir();
|
|
24
|
+
const SNAP_ROOT = path.join(ZAMES_HOME, 'snapshots');
|
|
25
|
+
// Динамический импорт логики с timestamp — чтобы при /reload (или авто-reload)
|
|
26
|
+
// self-review использовал СВЕЖИЕ tools/agent-loop, а не закэшированные при
|
|
27
|
+
// первой загрузке. Иначе reload не доходил бы до зависимостей self-review.
|
|
28
|
+
async function loadFresh() {
|
|
29
|
+
const stamp = Date.now();
|
|
30
|
+
const toolsUrl = new URL('./tools.js', import.meta.url);
|
|
31
|
+
toolsUrl.searchParams.set('t', String(stamp));
|
|
32
|
+
const loopUrl = new URL('./agent-loop.js', import.meta.url);
|
|
33
|
+
loopUrl.searchParams.set('t', String(stamp));
|
|
34
|
+
const [{ createTools }, { runAgentLoop }] = await Promise.all([
|
|
35
|
+
import(toolsUrl.href),
|
|
36
|
+
import(loopUrl.href),
|
|
37
|
+
]);
|
|
38
|
+
return { createTools, runAgentLoop };
|
|
39
|
+
}
|
|
40
|
+
async function ensureDir(p) {
|
|
41
|
+
await fs.mkdir(p, { recursive: true });
|
|
42
|
+
}
|
|
43
|
+
async function copyDirJsFiles(from, to) {
|
|
44
|
+
await ensureDir(to);
|
|
45
|
+
const entries = await fs.readdir(from);
|
|
46
|
+
const copied = [];
|
|
47
|
+
for (const e of entries) {
|
|
48
|
+
if (!e.endsWith('.ts'))
|
|
49
|
+
continue;
|
|
50
|
+
const data = await fs.readFile(path.join(from, e), 'utf-8');
|
|
51
|
+
await fs.writeFile(path.join(to, e), data, 'utf-8');
|
|
52
|
+
copied.push(e);
|
|
53
|
+
}
|
|
54
|
+
return copied;
|
|
55
|
+
}
|
|
56
|
+
// ---------- /self-review ----------
|
|
57
|
+
export async function selfReview({ browser, focus, transcript }) {
|
|
58
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
59
|
+
const snapRoot = path.join(SNAP_ROOT);
|
|
60
|
+
const snapDir = path.join(snapRoot, `run-${stamp}`);
|
|
61
|
+
await ensureDir(snapRoot);
|
|
62
|
+
await ensureDir(snapDir);
|
|
63
|
+
const copied = await copyDirJsFiles(SRC_DIR, snapDir);
|
|
64
|
+
if (copied.length === 0) {
|
|
65
|
+
console.error(theme.error(`\n✖ Самообзор отменён: в ${SRC_DIR} нет .ts файлов.\n` +
|
|
66
|
+
`Проверь, что src/ не пуст и ты запускаешь агента из корня проекта.\n`));
|
|
67
|
+
throw new Error('SRC_DIR пуст — нечего ревьюить');
|
|
68
|
+
}
|
|
69
|
+
// Копируем package.json для контекста — чтобы агент видел зависимости
|
|
70
|
+
try {
|
|
71
|
+
const pkg = await fs.readFile(path.resolve(SRC_DIR, '..', 'package.json'), 'utf-8');
|
|
72
|
+
await fs.writeFile(path.join(snapDir, 'package.json'), pkg, 'utf-8');
|
|
73
|
+
}
|
|
74
|
+
catch { }
|
|
75
|
+
console.log(theme.system(`\n📸 Снапшот: ${snapDir}`));
|
|
76
|
+
console.log(theme.system(`Файлов: ${copied.length} — ${copied.join(', ')}`));
|
|
77
|
+
console.log(theme.system('Начинаю самообзор...\n'));
|
|
78
|
+
const taskPrompt = buildReviewPrompt({ focus, snapDir });
|
|
79
|
+
const { createTools, runAgentLoop } = await loadFresh();
|
|
80
|
+
const tools = createTools(snapDir, { undo: null });
|
|
81
|
+
let finalMessage = '';
|
|
82
|
+
await runAgentLoop({
|
|
83
|
+
browser,
|
|
84
|
+
tools,
|
|
85
|
+
task: taskPrompt,
|
|
86
|
+
workdir: snapDir,
|
|
87
|
+
maxIterations: 80,
|
|
88
|
+
freshChat: true,
|
|
89
|
+
sendSystemPrompt: true,
|
|
90
|
+
transcript,
|
|
91
|
+
onThinking: () => { },
|
|
92
|
+
onToolCall: (name, args) => {
|
|
93
|
+
const preview = JSON.stringify(args).slice(0, 120);
|
|
94
|
+
console.log(theme.warn(`🔧 ${name}`), theme.system(preview));
|
|
95
|
+
},
|
|
96
|
+
onToolResult: (r) => {
|
|
97
|
+
const t = typeof r === 'string' ? r : JSON.stringify(r);
|
|
98
|
+
console.log(theme.system(` → ${t.slice(0, 200).replace(/\n/g, ' ↵ ')}\n`));
|
|
99
|
+
},
|
|
100
|
+
onAssistantMessage: (msg) => {
|
|
101
|
+
finalMessage = msg;
|
|
102
|
+
console.log(theme.assistant('\n📋 Отчёт:\n'));
|
|
103
|
+
console.log(msg);
|
|
104
|
+
console.log();
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
// Сохраняем отчёт
|
|
108
|
+
const reportPath = path.join(snapDir, '_report.md');
|
|
109
|
+
await fs.writeFile(reportPath, finalMessage || '(пусто)', 'utf-8');
|
|
110
|
+
// Считаем, что изменилось
|
|
111
|
+
const changed = await diffFiles(SRC_DIR, snapDir);
|
|
112
|
+
console.log(theme.system('─'.repeat(60)));
|
|
113
|
+
console.log(theme.system(`Отчёт: ${reportPath}`));
|
|
114
|
+
console.log(theme.system(`Снапшот: ${snapDir}`));
|
|
115
|
+
if (changed.length) {
|
|
116
|
+
console.log(theme.assistant(`Изменено: ${changed.length} файл(ов): ${changed.join(', ')}`));
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
console.log(theme.system('Изменено: (ничего — только отчёт)'));
|
|
120
|
+
}
|
|
121
|
+
console.log(theme.user(`\nДальше:`));
|
|
122
|
+
console.log(theme.user(` /self-diff ${path.basename(snapDir)} — посмотреть различия`));
|
|
123
|
+
console.log(theme.user(` /self-apply ${path.basename(snapDir)} — применить к живому src/`));
|
|
124
|
+
console.log();
|
|
125
|
+
return { snapDir, reportPath, changed };
|
|
126
|
+
}
|
|
127
|
+
// ---------- /self-diff ----------
|
|
128
|
+
export async function selfDiff({ name }) {
|
|
129
|
+
const snapDir = path.join(SNAP_ROOT, name);
|
|
130
|
+
const snapStat = await fs.stat(snapDir).catch(() => null);
|
|
131
|
+
if (!snapStat)
|
|
132
|
+
throw new Error(`Снапшот не найден: ${snapDir}`);
|
|
133
|
+
const { unifiedDiff, colorDiff } = await import('./diff.js');
|
|
134
|
+
const files = await fs.readdir(snapDir);
|
|
135
|
+
let anyDiff = false;
|
|
136
|
+
for (const f of files) {
|
|
137
|
+
if (!f.endsWith('.ts'))
|
|
138
|
+
continue;
|
|
139
|
+
const orig = await fs
|
|
140
|
+
.readFile(path.join(SRC_DIR, f), 'utf-8')
|
|
141
|
+
.catch(() => '');
|
|
142
|
+
const next = await fs
|
|
143
|
+
.readFile(path.join(snapDir, f), 'utf-8')
|
|
144
|
+
.catch(() => '');
|
|
145
|
+
if (orig === next)
|
|
146
|
+
continue;
|
|
147
|
+
anyDiff = true;
|
|
148
|
+
console.log(theme.bold(`\n=== src/${f} ===`));
|
|
149
|
+
const diff = unifiedDiff(orig, next, { label: f });
|
|
150
|
+
console.log(colorDiff(diff));
|
|
151
|
+
}
|
|
152
|
+
if (!anyDiff) {
|
|
153
|
+
console.log(theme.system('Различий нет.'));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// ---------- /self-apply ----------
|
|
157
|
+
export async function selfApply({ name }) {
|
|
158
|
+
const snapDir = path.join(SNAP_ROOT, name);
|
|
159
|
+
const snapStat = await fs.stat(snapDir).catch(() => null);
|
|
160
|
+
if (!snapStat)
|
|
161
|
+
throw new Error(`Снапшот не найден: ${snapDir}`);
|
|
162
|
+
// Бэкап текущего src перед перезаписью
|
|
163
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
164
|
+
const backupDir = path.join(SNAP_ROOT, `backup-before-apply-${stamp}`);
|
|
165
|
+
await copyDirJsFiles(SRC_DIR, backupDir);
|
|
166
|
+
const files = await fs.readdir(snapDir);
|
|
167
|
+
const jsFiles = files.filter((f) => f.endsWith('.ts'));
|
|
168
|
+
if (jsFiles.length === 0) {
|
|
169
|
+
throw new Error(`В снапшоте ${snapDir} нет .ts файлов. Apply отменён, чтобы не стирать src/.`);
|
|
170
|
+
}
|
|
171
|
+
const applied = [];
|
|
172
|
+
for (const f of jsFiles) {
|
|
173
|
+
const data = await fs.readFile(path.join(snapDir, f), 'utf-8');
|
|
174
|
+
await fs.writeFile(path.join(SRC_DIR, f), data, 'utf-8');
|
|
175
|
+
applied.push(f);
|
|
176
|
+
}
|
|
177
|
+
console.log(theme.assistant(`\n✅ Применено: ${applied.length} файл(ов)`));
|
|
178
|
+
console.log(theme.system(applied.join(', ')));
|
|
179
|
+
console.log(theme.system(`Бэкап: ${backupDir}`));
|
|
180
|
+
console.log(theme.warn(`\nПерезапусти агента, чтобы изменения вступили в силу.\n`));
|
|
181
|
+
}
|
|
182
|
+
// ---------- /self-list ----------
|
|
183
|
+
export async function selfList({ config } = {}) {
|
|
184
|
+
const snapRoot = path.join(SNAP_ROOT);
|
|
185
|
+
let entries = [];
|
|
186
|
+
try {
|
|
187
|
+
entries = await fs.readdir(snapRoot);
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
console.log(theme.system('Снапшотов нет.'));
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (!entries.length) {
|
|
194
|
+
console.log(theme.system('Снапшотов нет.'));
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
entries.sort();
|
|
198
|
+
console.log(theme.system('Снапшоты самообзора:'));
|
|
199
|
+
for (const e of entries) {
|
|
200
|
+
const full = path.join(snapRoot, e);
|
|
201
|
+
const stat = await fs.stat(full).catch(() => null);
|
|
202
|
+
if (!stat || !stat.isDirectory())
|
|
203
|
+
continue;
|
|
204
|
+
const report = path.join(full, '_report.md');
|
|
205
|
+
const hasReport = await fs
|
|
206
|
+
.stat(report)
|
|
207
|
+
.then(() => true)
|
|
208
|
+
.catch(() => false);
|
|
209
|
+
const changedCount = (await diffFiles(SRC_DIR, full)).length;
|
|
210
|
+
const tag = changedCount
|
|
211
|
+
? theme.assistant(`[${changedCount} изменено]`)
|
|
212
|
+
: theme.system('[без правок]');
|
|
213
|
+
const rep = hasReport ? theme.user('📋') : ' ';
|
|
214
|
+
console.log(` ${rep} ${e} ${tag}`);
|
|
215
|
+
}
|
|
216
|
+
console.log();
|
|
217
|
+
console.log(theme.system('Команды: /self-diff <name>, /self-apply <name>\n'));
|
|
218
|
+
}
|
|
219
|
+
// ---------- helpers ----------
|
|
220
|
+
async function diffFiles(origDir, newDir) {
|
|
221
|
+
const files = await fs.readdir(newDir).catch(() => []);
|
|
222
|
+
const changed = [];
|
|
223
|
+
for (const f of files) {
|
|
224
|
+
if (!f.endsWith('.ts'))
|
|
225
|
+
continue;
|
|
226
|
+
const a = await fs.readFile(path.join(origDir, f), 'utf-8').catch(() => '');
|
|
227
|
+
const b = await fs.readFile(path.join(newDir, f), 'utf-8').catch(() => '');
|
|
228
|
+
if (a !== b)
|
|
229
|
+
changed.push(f);
|
|
230
|
+
}
|
|
231
|
+
return changed;
|
|
232
|
+
}
|
|
233
|
+
function buildReviewPrompt({ focus, snapDir }) {
|
|
234
|
+
const focusLine = focus
|
|
235
|
+
? `\nThe user asked you to focus especially on: ${focus}\n`
|
|
236
|
+
: '';
|
|
237
|
+
return `You are a senior JavaScript/Node.js engineer. You are reviewing your own source code — a Playwright-based coding agent that talks to the DeepSeek web chat as an LLM backend.
|
|
238
|
+
|
|
239
|
+
All source files are in your working directory: ${snapDir}
|
|
240
|
+
${focusLine}
|
|
241
|
+
## Your job
|
|
242
|
+
|
|
243
|
+
1. Read EVERY .ts file in your working directory. Use Glob("**/*.ts") to list them, then Read each one. Do not skip files.
|
|
244
|
+
2. Identify real, concrete problems. Focus on:
|
|
245
|
+
- Race conditions and async/promise bugs (missing await, unhandled rejections, timing issues)
|
|
246
|
+
- Error handling gaps: places that can throw and crash the agent
|
|
247
|
+
- JSON parsing edge cases in agent-loop.ts (LLM output is unreliable)
|
|
248
|
+
- Fragile DOM selectors in browser.ts (DeepSeek changes layout)
|
|
249
|
+
- Cross-platform issues (Windows paths, cmd.exe vs bash, encoding)
|
|
250
|
+
- Undo/transcript consistency: could undo leave files in bad state?
|
|
251
|
+
- Self-review mode safety: could /self-apply corrupt src/?
|
|
252
|
+
- Anything that breaks state between interactive tasks (chat context, workdir, spinner)
|
|
253
|
+
3. Fix what you can fix confidently. Use Edit (small targeted change) or Write (rewrite a file only if really needed). Keep the existing architecture and naming.
|
|
254
|
+
4. Do NOT invent problems. If you're not sure, mention it in the report, don't change it.
|
|
255
|
+
5. Do NOT touch package.json, node_modules, or files outside the working directory.
|
|
256
|
+
|
|
257
|
+
## Constraints
|
|
258
|
+
|
|
259
|
+
- You CANNOT run the agent itself (node_modules is not here). But you CAN use \`node --check <file>\` via Bash to verify syntax after edits.
|
|
260
|
+
- Always read a file before editing it.
|
|
261
|
+
- After all edits, run \`node --check\` on every file you changed. If any fails, fix the syntax error.
|
|
262
|
+
|
|
263
|
+
## Report format
|
|
264
|
+
|
|
265
|
+
When done, respond with a markdown report as the message:
|
|
266
|
+
|
|
267
|
+
## Найдено
|
|
268
|
+
- (bullet list of issues you found, with file:line if possible)
|
|
269
|
+
|
|
270
|
+
## Исправлено
|
|
271
|
+
- (bullet list: file — что именно изменил)
|
|
272
|
+
|
|
273
|
+
## Не исправлено (осознанно)
|
|
274
|
+
- (bullet list: what you left alone and why)
|
|
275
|
+
|
|
276
|
+
## Проверка
|
|
277
|
+
- (bullet list: what you verified, e.g. \`node --check\` results)
|
|
278
|
+
|
|
279
|
+
Be honest and specific. If the code is fine in some area, say so.`;
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=self-review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-review.js","sourceRoot":"","sources":["../src/self-review.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,MAAM,aAAa,CAAA;AAE5B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AAEnC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAGxC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAE9D,uEAAuE;AACvE,qEAAqE;AACrE,oEAAoE;AACpE,kDAAkD;AAClD,SAAS,aAAa;IACtB,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;IACjE,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC;YACL,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;YAC9C,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAAE,OAAO,GAAG,CAAA;QAC9D,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACV,CAAC;IACD,OAAO,SAAS,CAAA;AAChB,CAAC;AAED,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;AAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;AAEpD,+EAA+E;AAC/E,2EAA2E;AAC3E,2EAA2E;AAC3E,KAAK,UAAU,SAAS;IACtB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACxB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,YAAY,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAA;IACvD,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC7C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAA;IAC3D,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC5C,MAAM,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QACrB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;KACrB,CAAC,CAAA;IACF,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAA;AACtC,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,CAAS;IAChC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AACxC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,EAAU;IACpD,MAAM,SAAS,CAAC,EAAE,CAAC,CAAA;IACnB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACtC,MAAM,MAAM,GAAG,EAAE,CAAA;IACjB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAQ;QAChC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;QAC3D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;QACnD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAGD,qCAAqC;AAErC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAkG;IAC7J,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,KAAK,EAAE,CAAC,CAAA;IACnD,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAA;IACzB,MAAM,SAAS,CAAC,OAAO,CAAC,CAAA;IAExB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAErD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,KAAK,CACT,4BAA4B,OAAO,oBAAoB;YACrD,sEAAsE,CACzE,CACF,CAAA;QACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IACnD,CAAC;IAED,sEAAsE;IACtE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAC3B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,EAC3C,OAAO,CACR,CAAA;QACD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;IACtE,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC,CAAA;IACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;IAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAA;IAEnD,MAAM,UAAU,GAAG,iBAAiB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;IAExD,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,MAAM,SAAS,EAAE,CAAA;IACvD,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IAClD,IAAI,YAAY,GAAG,EAAE,CAAA;IAErB,MAAM,YAAY,CAAC;QACjB,OAAO;QACP,KAAK;QACL,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO;QAChB,aAAa,EAAE,EAAE;QACjB,SAAS,EAAE,IAAI;QACf,gBAAgB,EAAE,IAAI;QACtB,UAAU;QACV,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC;QACpB,UAAU,EAAE,CAAC,IAAY,EAAE,IAAc,EAAE,EAAE;YAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;QAC9D,CAAC;QACD,YAAY,EAAE,CAAC,CAAU,EAAE,EAAE;YAC3B,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;QAC9E,CAAC;QACD,kBAAkB,EAAE,CAAC,GAAW,EAAE,EAAE;YAClC,YAAY,GAAG,GAAG,CAAA;YAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAA;YAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAChB,OAAO,CAAC,GAAG,EAAE,CAAA;QACf,CAAC;KACF,CAAC,CAAA;IAEF,kBAAkB;IAClB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IACnD,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,YAAY,IAAI,SAAS,EAAE,OAAO,CAAC,CAAA;IAElE,0BAA0B;IAC1B,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAEjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,UAAU,EAAE,CAAC,CAAC,CAAA;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC,CAAA;IACpD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,SAAS,CACb,gBAAgB,OAAO,CAAC,MAAM,cAAc,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACjE,CACF,CAAA;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC,CAAA;IACnE,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAA;IACpC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,gBAAgB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,0BAA0B,CACjE,CACF,CAAA;IACD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,iBAAiB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,6BAA6B,CACrE,CACF,CAAA;IACD,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAA;AACzC,CAAC;AAED,mCAAmC;AAEnC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAsC;IACzE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAC1C,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IACzD,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAA;IAE/D,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAA;IAC5D,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACvC,IAAI,OAAO,GAAG,KAAK,CAAA;IAEnB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAQ;QAChC,MAAM,IAAI,GAAG,MAAM,EAAE;aAClB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC;aACxC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;QAClB,MAAM,IAAI,GAAG,MAAM,EAAE;aAClB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC;aACxC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;QAClB,IAAI,IAAI,KAAK,IAAI;YAAE,SAAQ;QAE3B,OAAO,GAAG,IAAI,CAAA;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;QAC7C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;QAClD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;IAC9B,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC;AAED,oCAAoC;AAEpC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAE,IAAI,EAAsC;IAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAC1C,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IACzD,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAA;IAE/D,uCAAuC;IACvC,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CACzB,SAAS,EACT,uBAAuB,KAAK,EAAE,CAC/B,CAAA;IACD,MAAM,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IAExC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;IAEtD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,cAAc,OAAO,wDAAwD,CAC9E,CAAA;IACH,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAA;IAClB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;QAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,kBAAkB,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC,CAAA;IACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,SAAS,EAAE,CAAC,CAAC,CAAA;IAChD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CACvE,CAAA;AACH,CAAC;AAED,mCAAmC;AAEnC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAyB,EAAE;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACrC,IAAI,OAAO,GAAG,EAAE,CAAA;IAChB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAA;QAC3C,OAAM;IACR,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAA;QAC3C,OAAM;IACR,CAAC;IAED,OAAO,CAAC,IAAI,EAAE,CAAA;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAA;IACjD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;QACnC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QAClD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,SAAQ;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;QAC5C,MAAM,SAAS,GAAG,MAAM,EAAE;aACvB,IAAI,CAAC,MAAM,CAAC;aACZ,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;aAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;QACrB,MAAM,YAAY,GAAG,CAAC,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;QAC5D,MAAM,GAAG,GAAG,YAAY;YACtB,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,YAAY,YAAY,CAAC;YAC/C,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;QAChC,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAA;IACtC,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kDAAkD,CAAC,CAAC,CAAA;AAC/E,CAAC;AAED,gCAAgC;AAEhC,KAAK,UAAU,SAAS,CAAC,OAAe,EAAE,MAAc;IACtD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;IACtD,MAAM,OAAO,GAAG,EAAE,CAAA;IAClB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAQ;QAChC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;QAC3E,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;QAC1E,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC9B,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAuC;IAChF,MAAM,SAAS,GAAG,KAAK;QACrB,CAAC,CAAC,gDAAgD,KAAK,IAAI;QAC3D,CAAC,CAAC,EAAE,CAAA;IAEN,OAAO;;kDAEyC,OAAO;EACvD,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kEAuCuD,CAAA;AAClE,CAAC"}
|
package/dist/sessions.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
// Сессии (чаты DeepSeek) храним в отдельной папке, чтобы они не терялись
|
|
5
|
+
// после перезапуска процесса. Каждая сессия — отдельный JSON-файл
|
|
6
|
+
// <id>.json в ~/.zames/.sessions. last.json указывает на последнюю
|
|
7
|
+
// открытую сессию для конкретной рабочей директории.
|
|
8
|
+
const SESSIONS_DIR = path.join(os.homedir(), '.zames', '.sessions');
|
|
9
|
+
const INDEX_FILE = path.join(SESSIONS_DIR, 'last.json');
|
|
10
|
+
function ensureDir() {
|
|
11
|
+
fs.mkdirSync(SESSIONS_DIR, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
function safeName(id) {
|
|
14
|
+
return String(id).replace(/[^a-zA-Z0-9_.-]/g, '_');
|
|
15
|
+
}
|
|
16
|
+
// Сохраняем/обновляем сессию. workdir нужен, чтобы при запуске из того же
|
|
17
|
+
// проекта восстанавливать именно его последний чат.
|
|
18
|
+
export function saveSession({ id, title = '', workdir = '', }) {
|
|
19
|
+
if (!id)
|
|
20
|
+
return null;
|
|
21
|
+
try {
|
|
22
|
+
ensureDir();
|
|
23
|
+
const file = path.join(SESSIONS_DIR, safeName(id) + '.json');
|
|
24
|
+
let prev = {};
|
|
25
|
+
try {
|
|
26
|
+
prev = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
27
|
+
}
|
|
28
|
+
catch { }
|
|
29
|
+
const now = new Date().toISOString();
|
|
30
|
+
const data = {
|
|
31
|
+
id,
|
|
32
|
+
title: title || prev.title || '',
|
|
33
|
+
workdir: workdir || prev.workdir || '',
|
|
34
|
+
createdAt: prev.createdAt || now,
|
|
35
|
+
updatedAt: now,
|
|
36
|
+
};
|
|
37
|
+
fs.writeFileSync(file, JSON.stringify(data, null, 2), 'utf-8');
|
|
38
|
+
writeIndex({ id, workdir: data.workdir });
|
|
39
|
+
return data;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function writeIndex({ id, workdir }) {
|
|
46
|
+
try {
|
|
47
|
+
ensureDir();
|
|
48
|
+
let index = {};
|
|
49
|
+
try {
|
|
50
|
+
index = JSON.parse(fs.readFileSync(INDEX_FILE, 'utf-8'));
|
|
51
|
+
}
|
|
52
|
+
catch { }
|
|
53
|
+
if (!index || typeof index !== 'object')
|
|
54
|
+
index = {};
|
|
55
|
+
if (!index.byWorkdir || typeof index.byWorkdir !== 'object') {
|
|
56
|
+
index.byWorkdir = {};
|
|
57
|
+
}
|
|
58
|
+
const key = workdir || '';
|
|
59
|
+
index.byWorkdir[key] = id;
|
|
60
|
+
index.last = id;
|
|
61
|
+
index.updatedAt = new Date().toISOString();
|
|
62
|
+
fs.writeFileSync(INDEX_FILE, JSON.stringify(index, null, 2), 'utf-8');
|
|
63
|
+
}
|
|
64
|
+
catch { }
|
|
65
|
+
}
|
|
66
|
+
// Последняя сессия для рабочей директории. Если для неё ничего нет —
|
|
67
|
+
// возвращаем последнюю сессию вообще (полезно при запуске из нового места).
|
|
68
|
+
export function loadLastSession(workdir = '') {
|
|
69
|
+
try {
|
|
70
|
+
const index = JSON.parse(fs.readFileSync(INDEX_FILE, 'utf-8'));
|
|
71
|
+
const byWorkdir = index && index.byWorkdir ? index.byWorkdir : {};
|
|
72
|
+
const candidates = [byWorkdir[workdir], index.last].filter((x) => Boolean(x));
|
|
73
|
+
for (const id of candidates) {
|
|
74
|
+
// Файл сессии мог быть удалён — индекс тогда устарел, и сессию
|
|
75
|
+
// восстанавливать нельзя. Пробуем следующий кандидат.
|
|
76
|
+
const s = readSession(id);
|
|
77
|
+
if (s)
|
|
78
|
+
return s;
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export function readSession(id) {
|
|
87
|
+
if (!id)
|
|
88
|
+
return null;
|
|
89
|
+
try {
|
|
90
|
+
const file = path.join(SESSIONS_DIR, safeName(id) + '.json');
|
|
91
|
+
return JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Список всех сессий, свежие — первыми.
|
|
98
|
+
export function listSessions() {
|
|
99
|
+
try {
|
|
100
|
+
ensureDir();
|
|
101
|
+
const files = fs
|
|
102
|
+
.readdirSync(SESSIONS_DIR)
|
|
103
|
+
.filter((f) => f.endsWith('.json') && f !== 'last.json');
|
|
104
|
+
const out = [];
|
|
105
|
+
for (const f of files) {
|
|
106
|
+
try {
|
|
107
|
+
const data = JSON.parse(fs.readFileSync(path.join(SESSIONS_DIR, f), 'utf-8'));
|
|
108
|
+
if (data && data.id)
|
|
109
|
+
out.push(data);
|
|
110
|
+
}
|
|
111
|
+
catch { }
|
|
112
|
+
}
|
|
113
|
+
out.sort((a, b) => String(b.updatedAt || '').localeCompare(String(a.updatedAt || '')));
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export function sessionsDir() {
|
|
121
|
+
return SESSIONS_DIR;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"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"}
|
package/dist/spinner.js
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import ora from 'ora';
|
|
2
|
+
import { theme } from './theme.js';
|
|
3
|
+
import { renderMarkdown } from './markdown.js';
|
|
4
|
+
// Фразы для спиннера «агент работает». Выбираются в случайном порядке.
|
|
5
|
+
const THINKING_PHRASES = [
|
|
6
|
+
'Замешиваю кал…',
|
|
7
|
+
'Взбиваю кал до однородной массы…',
|
|
8
|
+
'Мешаю кал с логикой…',
|
|
9
|
+
'Взбалтываю кал в коктейль…',
|
|
10
|
+
'Кручу венчиком по калу…',
|
|
11
|
+
'Смешиваю кал с кофеином…',
|
|
12
|
+
'Замешиваю тесто из кала…',
|
|
13
|
+
'Взбиваю пену из кала…',
|
|
14
|
+
'Перемешиваю кал лопатой…',
|
|
15
|
+
'Замешиваю глину из кала…',
|
|
16
|
+
'Гомогенизирую кал до состояния бетона…',
|
|
17
|
+
'Взбалтываю кал до просветления…',
|
|
18
|
+
'Блендерю кал в смузи…',
|
|
19
|
+
'Замешиваю цемент из кала…',
|
|
20
|
+
'Взбиваю кашу из кала…',
|
|
21
|
+
'Мешаю кал с надеждой…',
|
|
22
|
+
'Взбалтываю осадок из кала…',
|
|
23
|
+
'Кручу блендером по калу…',
|
|
24
|
+
'Смешиваю кал до неразличимости…',
|
|
25
|
+
'Замешиваю раствор из кала…',
|
|
26
|
+
'Взбиваю коктейль «кал»…',
|
|
27
|
+
'Перемешиваю кал лопатой дедлайна…',
|
|
28
|
+
'Замешиваю кашу из кала…',
|
|
29
|
+
'Взбиваю пенку из кала…',
|
|
30
|
+
'Гомогенизирую кал до однородности…',
|
|
31
|
+
'Взбалтываю кал в бетономешалке…',
|
|
32
|
+
'Замешиваю кал в тесто…',
|
|
33
|
+
'Сбиваю кал в однородную массу…',
|
|
34
|
+
'Размешиваю кал до просветления…',
|
|
35
|
+
'Замешиваю кал из всего подряд…',
|
|
36
|
+
];
|
|
37
|
+
export function randomThinkingPhrase() {
|
|
38
|
+
return THINKING_PHRASES[Math.floor(Math.random() * THINKING_PHRASES.length)];
|
|
39
|
+
}
|
|
40
|
+
// Убираем завершающее многоточие из фразы — точки анимируем отдельно.
|
|
41
|
+
export function stripEllipsis(phrase) {
|
|
42
|
+
return phrase.replace(/[.…]+\s*$/, '');
|
|
43
|
+
}
|
|
44
|
+
export function createSpinner() {
|
|
45
|
+
let spinner = null;
|
|
46
|
+
let dotTimer = null;
|
|
47
|
+
let dotPhase = 0;
|
|
48
|
+
let pending = null;
|
|
49
|
+
const DOTS = ['.', '..', '...'];
|
|
50
|
+
const start = (text) => {
|
|
51
|
+
if (!spinner)
|
|
52
|
+
spinner = ora(text).start();
|
|
53
|
+
else
|
|
54
|
+
spinner.start(text);
|
|
55
|
+
};
|
|
56
|
+
const stop = () => {
|
|
57
|
+
if (dotTimer) {
|
|
58
|
+
clearInterval(dotTimer);
|
|
59
|
+
dotTimer = null;
|
|
60
|
+
}
|
|
61
|
+
if (spinner)
|
|
62
|
+
spinner.stop();
|
|
63
|
+
};
|
|
64
|
+
// Подсказка в строке статуса: во время работы агента терминал живой,
|
|
65
|
+
// можно печатать следующее сообщение. Без неё это неочевидно.
|
|
66
|
+
const HINT = theme.dim(' · печатай — Enter в очередь, Esc стоп');
|
|
67
|
+
// Запуск анимированного статуса: коричневый текст + «бегущие» точки.
|
|
68
|
+
const startThinking = () => {
|
|
69
|
+
const base = theme.brown(stripEllipsis(randomThinkingPhrase()));
|
|
70
|
+
start(base + DOTS[0] + HINT);
|
|
71
|
+
dotPhase = 0;
|
|
72
|
+
if (dotTimer)
|
|
73
|
+
clearInterval(dotTimer);
|
|
74
|
+
dotTimer = setInterval(() => {
|
|
75
|
+
if (!spinner)
|
|
76
|
+
return;
|
|
77
|
+
dotPhase = (dotPhase + 1) % DOTS.length;
|
|
78
|
+
spinner.text = base + DOTS[dotPhase] + HINT;
|
|
79
|
+
}, 400);
|
|
80
|
+
if (dotTimer.unref)
|
|
81
|
+
dotTimer.unref();
|
|
82
|
+
};
|
|
83
|
+
// Показать набранный, но ещё не отправленный текст вместо спиннера.
|
|
84
|
+
// Позволяет печатать сообщение прямо во время работы агента.
|
|
85
|
+
const showPending = () => {
|
|
86
|
+
if (dotTimer) {
|
|
87
|
+
clearInterval(dotTimer);
|
|
88
|
+
dotTimer = null;
|
|
89
|
+
}
|
|
90
|
+
if (!spinner)
|
|
91
|
+
spinner = ora('');
|
|
92
|
+
spinner.start();
|
|
93
|
+
spinner.text = theme.prompt('✎ ') + pending + HINT;
|
|
94
|
+
};
|
|
95
|
+
return {
|
|
96
|
+
thinking: () => {
|
|
97
|
+
if (pending) {
|
|
98
|
+
showPending();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
startThinking();
|
|
102
|
+
},
|
|
103
|
+
// Текст, который пользователь набирает во время работы агента.
|
|
104
|
+
// Пустая строка / null — вернуть обычный спиннер.
|
|
105
|
+
setPending: (text) => {
|
|
106
|
+
pending = text && String(text).length ? String(text) : null;
|
|
107
|
+
if (pending)
|
|
108
|
+
showPending();
|
|
109
|
+
else
|
|
110
|
+
startThinking();
|
|
111
|
+
},
|
|
112
|
+
toolCall: (name, args) => {
|
|
113
|
+
stop();
|
|
114
|
+
const preview = JSON.stringify(args).slice(0, 120);
|
|
115
|
+
console.log(theme.tool('🔧 ' + name), theme.dim(preview));
|
|
116
|
+
},
|
|
117
|
+
toolResult: (result) => {
|
|
118
|
+
stop();
|
|
119
|
+
const text = typeof result === 'string' ? result : JSON.stringify(result);
|
|
120
|
+
const preview = text.slice(0, 200).split(String.fromCharCode(10)).join(' ↵ ');
|
|
121
|
+
console.log(theme.toolResult(' → ' + preview + String.fromCharCode(10)));
|
|
122
|
+
},
|
|
123
|
+
assistant: (msg) => {
|
|
124
|
+
stop();
|
|
125
|
+
const NL = String.fromCharCode(10);
|
|
126
|
+
const rendered = renderMarkdown(msg);
|
|
127
|
+
// Маркер ответа модели: помогает визуально отделить его от ввода
|
|
128
|
+
// пользователя (который подсвечен приглашением с золотой стрелкой).
|
|
129
|
+
console.log(NL + theme.assistant('● Ответ') + NL);
|
|
130
|
+
console.log(rendered);
|
|
131
|
+
console.log(theme.dim('─'.repeat(60)) + NL);
|
|
132
|
+
},
|
|
133
|
+
stop,
|
|
134
|
+
succeed: () => { },
|
|
135
|
+
fail: () => { },
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../src/spinner.ts"],"names":[],"mappings":"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"}
|