zames_pro 2.1.1 → 2.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +15 -16
- package/dist/input.js +11 -3
- package/dist/spinner.js +9 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -51,15 +51,15 @@ const chatIdArg = getArg('--chat', null);
|
|
|
51
51
|
// переотправляется (он уже есть в начале чата). Флаг --resend-prompt
|
|
52
52
|
// заставляет дослать его заново — например, если промпт обновился.
|
|
53
53
|
const resendPrompt = hasFlag('--resend-prompt');
|
|
54
|
-
//
|
|
55
|
-
// --resume-last:
|
|
56
|
-
//
|
|
54
|
+
// По умолчанию при старте начинается НОВЫЙ чат (контекст не тянется).
|
|
55
|
+
// --resume-last: вернуться в последнюю сессию для рабочей директории.
|
|
56
|
+
// --new-chat: оставлен для совместимости — это и так поведение по умолчанию.
|
|
57
57
|
const newChatFlag = hasFlag('--new-chat');
|
|
58
58
|
const resumeLastFlag = hasFlag('--resume-last');
|
|
59
59
|
// ---------- session persistence ----------
|
|
60
60
|
// Сессии (чаты DeepSeek) храним в ~/.zames/.sessions, чтобы они переживали
|
|
61
|
-
// перезапуск
|
|
62
|
-
//
|
|
61
|
+
// перезапуск и были доступны для явного восстановления (--resume-last,
|
|
62
|
+
// --chat <id>, /resume <n>). Автоматически при старте они НЕ поднимаются.
|
|
63
63
|
// Раньше здесь был один файл last-chat.json, который терялся при смене
|
|
64
64
|
// проекта и не давал списка сессий для восстановления.
|
|
65
65
|
function saveLastChat(id, workdir = '', title = '') {
|
|
@@ -168,8 +168,8 @@ ${theme.bold('Опции CLI:')}
|
|
|
168
168
|
--dir <path> рабочая директория агента
|
|
169
169
|
--task <text> задача одной строкой
|
|
170
170
|
--chat <id> продолжить существующий чат по id
|
|
171
|
-
--resume-last вернуться в последний сохранённый чат
|
|
172
|
-
--new-chat начать новый
|
|
171
|
+
--resume-last вернуться в последний сохранённый чат
|
|
172
|
+
--new-chat начать новый чат (поведение по умолчанию)
|
|
173
173
|
--resend-prompt дослать system-prompt в существующий чат
|
|
174
174
|
--max-iter <n> лимит итераций (по умолчанию ${config.maxIterations})
|
|
175
175
|
--headless браузер без UI
|
|
@@ -724,10 +724,10 @@ async function main() {
|
|
|
724
724
|
const tools = mod.createTools(currentWorkdir, { undo });
|
|
725
725
|
let freshChat = true;
|
|
726
726
|
let sendSystemPrompt = true;
|
|
727
|
-
// По умолчанию
|
|
728
|
-
//
|
|
727
|
+
// По умолчанию начинаем новый чат. Продолжить прошлую сессию —
|
|
728
|
+
// явно: --chat <id> или --resume-last.
|
|
729
729
|
let resumeId = chatIdArg;
|
|
730
|
-
if (!resumeId && !newChatFlag) {
|
|
730
|
+
if (!resumeId && resumeLastFlag && !newChatFlag) {
|
|
731
731
|
const last = loadLastSession(currentWorkdir);
|
|
732
732
|
if (last && last.id) {
|
|
733
733
|
resumeId = last.id;
|
|
@@ -786,14 +786,13 @@ async function main() {
|
|
|
786
786
|
console.log(theme.system('\nВыход.'));
|
|
787
787
|
process.exit(0);
|
|
788
788
|
});
|
|
789
|
-
//
|
|
790
|
-
//
|
|
791
|
-
// чтобы контекст не терялся после перезапуска. Явно начать с чистого листа
|
|
792
|
-
// можно флагом --new-chat.
|
|
789
|
+
// По умолчанию при старте начинаем НОВЫЙ чат: контекст прошлой сессии
|
|
790
|
+
// не тянется автоматически. Продолжить прошлую сессию можно явно:
|
|
793
791
|
// --chat <id> открыть конкретный чат
|
|
794
|
-
// --
|
|
792
|
+
// --resume-last вернуться в последний чат для этой рабочей директории
|
|
793
|
+
// --new-chat оставлен для совместимости (это и так поведение по умолчанию)
|
|
795
794
|
let resumeId = chatIdArg;
|
|
796
|
-
if (!resumeId && !newChatFlag) {
|
|
795
|
+
if (!resumeId && resumeLastFlag && !newChatFlag) {
|
|
797
796
|
const last = loadLastSession(currentWorkdir);
|
|
798
797
|
if (last && last.id) {
|
|
799
798
|
resumeId = last.id;
|
package/dist/input.js
CHANGED
|
@@ -18,7 +18,10 @@ const CR = String.fromCharCode(13);
|
|
|
18
18
|
const ESC = String.fromCharCode(27);
|
|
19
19
|
const PASTE_START = ESC + '[200~';
|
|
20
20
|
const PASTE_END = ESC + '[201~';
|
|
21
|
-
|
|
21
|
+
// Анимация точек: старт с пустой строки (0 точек), затем рост.
|
|
22
|
+
// Ширину выравниваем по максимуму (3), чтобы подсказка не смещалась.
|
|
23
|
+
const DOTS = ['', '.', '..', '...'];
|
|
24
|
+
const DOTS_PAD = ' ';
|
|
22
25
|
const HINT = theme.dim(' · Enter — отправить, Ctrl+J — новая строка, Esc — стоп');
|
|
23
26
|
function safeJson(v) {
|
|
24
27
|
try {
|
|
@@ -216,6 +219,11 @@ export class LineEditor {
|
|
|
216
219
|
this._dotTimer = null;
|
|
217
220
|
}
|
|
218
221
|
}
|
|
222
|
+
_dots(n) {
|
|
223
|
+
// Точки того же цвета, что и база, и фиксированной ширины — иначе
|
|
224
|
+
// подсказка справа «прыгает» при смене фазы анимации.
|
|
225
|
+
return theme.brown(DOTS[n] + DOTS_PAD.slice(DOTS[n].length));
|
|
226
|
+
}
|
|
219
227
|
_startThinking() {
|
|
220
228
|
if (this.pendingText) {
|
|
221
229
|
this.setStatus(theme.prompt('✎ ') + this.pendingText + HINT);
|
|
@@ -223,11 +231,11 @@ export class LineEditor {
|
|
|
223
231
|
}
|
|
224
232
|
this._thinkBase = theme.brown(stripEllipsis(randomThinkingPhrase()));
|
|
225
233
|
this._dotPhase = 0;
|
|
226
|
-
this.setStatus(this._thinkBase +
|
|
234
|
+
this.setStatus(this._thinkBase + this._dots(0) + HINT);
|
|
227
235
|
this._stopDots();
|
|
228
236
|
this._dotTimer = setInterval(() => {
|
|
229
237
|
this._dotPhase = (this._dotPhase + 1) % DOTS.length;
|
|
230
|
-
this.setStatus(this._thinkBase +
|
|
238
|
+
this.setStatus(this._thinkBase + this._dots(this._dotPhase) + HINT);
|
|
231
239
|
}, 400);
|
|
232
240
|
if (this._dotTimer.unref)
|
|
233
241
|
this._dotTimer.unref();
|
package/dist/spinner.js
CHANGED
|
@@ -46,7 +46,10 @@ export function createSpinner() {
|
|
|
46
46
|
let dotTimer = null;
|
|
47
47
|
let dotPhase = 0;
|
|
48
48
|
let pending = null;
|
|
49
|
-
|
|
49
|
+
// Анимация точек: старт с пустой строки (0 точек), затем рост.
|
|
50
|
+
// Ширину выравниваем по максимуму (3), чтобы подсказка не смещалась.
|
|
51
|
+
const DOTS = ['', '.', '..', '...'];
|
|
52
|
+
const DOTS_PAD = ' ';
|
|
50
53
|
const start = (text) => {
|
|
51
54
|
if (!spinner)
|
|
52
55
|
spinner = ora(text).start();
|
|
@@ -67,7 +70,10 @@ export function createSpinner() {
|
|
|
67
70
|
// Запуск анимированного статуса: коричневый текст + «бегущие» точки.
|
|
68
71
|
const startThinking = () => {
|
|
69
72
|
const base = theme.brown(stripEllipsis(randomThinkingPhrase()));
|
|
70
|
-
|
|
73
|
+
// Точки того же цвета, что и база, и фиксированной ширины — иначе
|
|
74
|
+
// подсказка справа «прыгает» при смене фазы анимации.
|
|
75
|
+
const dots = (n) => theme.brown(DOTS[n] + DOTS_PAD.slice(DOTS[n].length));
|
|
76
|
+
start(base + dots(0) + HINT);
|
|
71
77
|
dotPhase = 0;
|
|
72
78
|
if (dotTimer)
|
|
73
79
|
clearInterval(dotTimer);
|
|
@@ -75,7 +81,7 @@ export function createSpinner() {
|
|
|
75
81
|
if (!spinner)
|
|
76
82
|
return;
|
|
77
83
|
dotPhase = (dotPhase + 1) % DOTS.length;
|
|
78
|
-
spinner.text = base +
|
|
84
|
+
spinner.text = base + dots(dotPhase) + HINT;
|
|
79
85
|
}, 400);
|
|
80
86
|
if (dotTimer.unref)
|
|
81
87
|
dotTimer.unref();
|