@i14ks/ccv 0.1.0 → 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/LICENSE CHANGED
@@ -1,173 +1,173 @@
1
- Claude Code Visual (ccv)
2
- Лицензионное соглашение с конечным пользователем
3
- Версия 1.0, 30 июля 2026
4
-
5
- Правообладатель: Иван (I14ks), https://github.com/I14ks/ClaudeCodeVisual
6
- Copyright (c) 2026 Иван (I14ks). Все права защищены.
7
-
8
- ================================================================================
9
- РУССКИЙ ТЕКСТ (УПРАВЛЯЮЩИЙ)
10
- ================================================================================
11
-
12
- 1. ОПРЕДЕЛЕНИЯ
13
-
14
- «Программа» — программа Claude Code Visual, распространяемая как пакет npm
15
- @i14ks/ccv, включая исходный код, собранные файлы, интерфейс и документацию.
16
-
17
- «Вы» — физическое или юридическое лицо, получившее копию Программы.
18
-
19
- 2. ЧТО РАЗРЕШЕНО
20
-
21
- Вам разрешается устанавливать и запускать Программу на любом количестве
22
- принадлежащих Вам или подконтрольных Вам устройств, в личных и коммерческих
23
- целях, и использовать её результаты работы без каких-либо ограничений.
24
-
25
- Результаты Вашей работы в Программе принадлежат Вам. Правообладатель не
26
- заявляет никаких прав на файлы, код и тексты, которые Вы создаёте или
27
- изменяете с её помощью.
28
-
29
- 3. ЧТО НЕ РАЗРЕШЕНО
30
-
31
- Без предварительного письменного разрешения Правообладателя Вам не
32
- разрешается:
33
-
34
- а) распространять, публиковать, передавать, сдавать в аренду, продавать
35
- или иным образом предоставлять Программу или её часть третьим лицам,
36
- в том числе в составе других продуктов;
37
-
38
- б) изменять Программу, создавать производные произведения на её основе,
39
- публиковать форки;
40
-
41
- в) декомпилировать, дизассемблировать или иным образом восстанавливать
42
- исходный код тех частей Программы, которые поставляются в собранном
43
- виде, за исключением случаев, прямо разрешённых применимым правом;
44
-
45
- г) удалять или изменять уведомления об авторских правах, настоящее
46
- соглашение и уведомления о стороннем коде (THIRD-PARTY-NOTICES.md);
47
-
48
- д) предоставлять Программу как сервис третьим лицам.
49
-
50
- Исходный код Программы открыт для чтения. Открытость для чтения не является
51
- разрешением из пунктов «а»–«д»: смотреть можно, распространять и изменять —
52
- нет.
53
-
54
- 4. СТОРОННИЙ КОД
55
-
56
- Программа содержит код третьих лиц, распространяемый на собственных
57
- условиях. Эти условия перечислены в файле THIRD-PARTY-NOTICES.md и имеют
58
- преимущественную силу в отношении соответствующих частей. Настоящее
59
- соглашение не ограничивает Ваши права на сторонний код.
60
-
61
- Программа предназначена для работы с Claude Code — отдельным продуктом
62
- Anthropic PBC, распространяемым на собственных условиях. Правообладатель не
63
- связан с Anthropic PBC, а названия Claude и Claude Code принадлежат их
64
- правообладателю и используются только для указания на совместимость.
65
-
66
- 5. ОТСУТСТВИЕ ГАРАНТИЙ
67
-
68
- ПРОГРАММА ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ
69
- ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ
70
- ОПРЕДЕЛЁННОЙ ЦЕЛИ И ОТСУТСТВИЯ НАРУШЕНИЙ ПРАВ ТРЕТЬИХ ЛИЦ.
71
-
72
- Программа запускает агента, который читает и изменяет файлы на Вашем
73
- устройстве и выполняет команды. Ответственность за то, какие каталоги ему
74
- открыты и какие действия разрешены, лежит на Вас.
75
-
76
- 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ
77
-
78
- НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ НЕСЁТ ОТВЕТСТВЕННОСТИ ЗА
79
- ЛЮБОЙ УЩЕРБ, ВКЛЮЧАЯ УТРАТУ ДАННЫХ И УПУЩЕННУЮ ВЫГОДУ, ВОЗНИКШИЙ ИЗ
80
- ИСПОЛЬЗОВАНИЯ ИЛИ НЕВОЗМОЖНОСТИ ИСПОЛЬЗОВАНИЯ ПРОГРАММЫ.
81
-
82
- 7. ПРЕКРАЩЕНИЕ
83
-
84
- Соглашение прекращается автоматически при нарушении Вами пункта 3. После
85
- прекращения Вы обязаны удалить все копии Программы.
86
-
87
- 8. ИЗМЕНЕНИЕ УСЛОВИЙ
88
-
89
- Правообладатель вправе изменить условия для будущих версий. К уже полученной
90
- Вами версии применяются условия, приложенные к ней.
91
-
92
- ================================================================================
93
- ENGLISH TRANSLATION (FOR CONVENIENCE ONLY)
94
- ================================================================================
95
-
96
- In case of any discrepancy between the Russian text above and this English
97
- translation, the Russian text prevails.
98
-
99
- 1. DEFINITIONS
100
-
101
- "Software" means Claude Code Visual, distributed as the npm package
102
- @i14ks/ccv, including its source code, build output, interface and
103
- documentation.
104
-
105
- "You" means the individual or legal entity that obtained a copy.
106
-
107
- 2. WHAT IS PERMITTED
108
-
109
- You may install and run the Software on any number of devices you own or
110
- control, for personal and commercial purposes, and use its output without
111
- restriction.
112
-
113
- Your work product is yours. The copyright holder claims no rights over the
114
- files, code or text you create or modify with the Software.
115
-
116
- 3. WHAT IS NOT PERMITTED
117
-
118
- Without the copyright holder's prior written permission, you may not:
119
-
120
- (a) distribute, publish, transfer, rent, sell or otherwise make the Software
121
- or any part of it available to third parties, including as part of
122
- another product;
123
-
124
- (b) modify the Software, create derivative works, or publish forks;
125
-
126
- (c) decompile, disassemble or otherwise reverse engineer the parts of the
127
- Software shipped in built form, except where applicable law expressly
128
- permits it;
129
-
130
- (d) remove or alter copyright notices, this agreement, or the third-party
131
- notices (THIRD-PARTY-NOTICES.md);
132
-
133
- (e) offer the Software as a service to third parties.
134
-
135
- The source code is readable. Being readable is not permission under (a)-(e):
136
- you may look, not redistribute or modify.
137
-
138
- 4. THIRD-PARTY CODE
139
-
140
- The Software includes third-party code under its own terms, listed in
141
- THIRD-PARTY-NOTICES.md, which prevail for those parts. This agreement does
142
- not restrict your rights in that third-party code.
143
-
144
- The Software is built to work with Claude Code, a separate product of
145
- Anthropic PBC distributed under its own terms. The copyright holder is not
146
- affiliated with Anthropic PBC; Claude and Claude Code are marks of their
147
- owner and are used solely to indicate compatibility.
148
-
149
- 5. NO WARRANTY
150
-
151
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
152
- IMPLIED, INCLUDING BUT NOT LIMITED TO FITNESS FOR A PARTICULAR PURPOSE AND
153
- NONINFRINGEMENT.
154
-
155
- The Software runs an agent that reads and modifies files on your device and
156
- executes commands. Which directories it may touch and which actions it may
157
- take is your responsibility.
158
-
159
- 6. LIMITATION OF LIABILITY
160
-
161
- IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY DAMAGES, INCLUDING
162
- LOSS OF DATA OR LOST PROFITS, ARISING FROM THE USE OF OR INABILITY TO USE
163
- THE SOFTWARE.
164
-
165
- 7. TERMINATION
166
-
167
- This agreement terminates automatically if you breach section 3. Upon
168
- termination you must delete all copies of the Software.
169
-
170
- 8. CHANGES
171
-
172
- The copyright holder may change the terms for future versions. The version
173
- you received is governed by the terms shipped with it.
1
+ Claude Code Visual (ccv)
2
+ Лицензионное соглашение с конечным пользователем
3
+ Версия 1.0, 30 июля 2026
4
+
5
+ Правообладатель: Иван (I14ks), https://github.com/I14ks/ClaudeCodeVisual
6
+ Copyright (c) 2026 Иван (I14ks). Все права защищены.
7
+
8
+ ================================================================================
9
+ РУССКИЙ ТЕКСТ (УПРАВЛЯЮЩИЙ)
10
+ ================================================================================
11
+
12
+ 1. ОПРЕДЕЛЕНИЯ
13
+
14
+ «Программа» — программа Claude Code Visual, распространяемая как пакет npm
15
+ @i14ks/ccv, включая исходный код, собранные файлы, интерфейс и документацию.
16
+
17
+ «Вы» — физическое или юридическое лицо, получившее копию Программы.
18
+
19
+ 2. ЧТО РАЗРЕШЕНО
20
+
21
+ Вам разрешается устанавливать и запускать Программу на любом количестве
22
+ принадлежащих Вам или подконтрольных Вам устройств, в личных и коммерческих
23
+ целях, и использовать её результаты работы без каких-либо ограничений.
24
+
25
+ Результаты Вашей работы в Программе принадлежат Вам. Правообладатель не
26
+ заявляет никаких прав на файлы, код и тексты, которые Вы создаёте или
27
+ изменяете с её помощью.
28
+
29
+ 3. ЧТО НЕ РАЗРЕШЕНО
30
+
31
+ Без предварительного письменного разрешения Правообладателя Вам не
32
+ разрешается:
33
+
34
+ а) распространять, публиковать, передавать, сдавать в аренду, продавать
35
+ или иным образом предоставлять Программу или её часть третьим лицам,
36
+ в том числе в составе других продуктов;
37
+
38
+ б) изменять Программу, создавать производные произведения на её основе,
39
+ публиковать форки;
40
+
41
+ в) декомпилировать, дизассемблировать или иным образом восстанавливать
42
+ исходный код тех частей Программы, которые поставляются в собранном
43
+ виде, за исключением случаев, прямо разрешённых применимым правом;
44
+
45
+ г) удалять или изменять уведомления об авторских правах, настоящее
46
+ соглашение и уведомления о стороннем коде (THIRD-PARTY-NOTICES.md);
47
+
48
+ д) предоставлять Программу как сервис третьим лицам.
49
+
50
+ Исходный код Программы открыт для чтения. Открытость для чтения не является
51
+ разрешением из пунктов «а»–«д»: смотреть можно, распространять и изменять —
52
+ нет.
53
+
54
+ 4. СТОРОННИЙ КОД
55
+
56
+ Программа содержит код третьих лиц, распространяемый на собственных
57
+ условиях. Эти условия перечислены в файле THIRD-PARTY-NOTICES.md и имеют
58
+ преимущественную силу в отношении соответствующих частей. Настоящее
59
+ соглашение не ограничивает Ваши права на сторонний код.
60
+
61
+ Программа предназначена для работы с Claude Code — отдельным продуктом
62
+ Anthropic PBC, распространяемым на собственных условиях. Правообладатель не
63
+ связан с Anthropic PBC, а названия Claude и Claude Code принадлежат их
64
+ правообладателю и используются только для указания на совместимость.
65
+
66
+ 5. ОТСУТСТВИЕ ГАРАНТИЙ
67
+
68
+ ПРОГРАММА ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ
69
+ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ
70
+ ОПРЕДЕЛЁННОЙ ЦЕЛИ И ОТСУТСТВИЯ НАРУШЕНИЙ ПРАВ ТРЕТЬИХ ЛИЦ.
71
+
72
+ Программа запускает агента, который читает и изменяет файлы на Вашем
73
+ устройстве и выполняет команды. Ответственность за то, какие каталоги ему
74
+ открыты и какие действия разрешены, лежит на Вас.
75
+
76
+ 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ
77
+
78
+ НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ НЕСЁТ ОТВЕТСТВЕННОСТИ ЗА
79
+ ЛЮБОЙ УЩЕРБ, ВКЛЮЧАЯ УТРАТУ ДАННЫХ И УПУЩЕННУЮ ВЫГОДУ, ВОЗНИКШИЙ ИЗ
80
+ ИСПОЛЬЗОВАНИЯ ИЛИ НЕВОЗМОЖНОСТИ ИСПОЛЬЗОВАНИЯ ПРОГРАММЫ.
81
+
82
+ 7. ПРЕКРАЩЕНИЕ
83
+
84
+ Соглашение прекращается автоматически при нарушении Вами пункта 3. После
85
+ прекращения Вы обязаны удалить все копии Программы.
86
+
87
+ 8. ИЗМЕНЕНИЕ УСЛОВИЙ
88
+
89
+ Правообладатель вправе изменить условия для будущих версий. К уже полученной
90
+ Вами версии применяются условия, приложенные к ней.
91
+
92
+ ================================================================================
93
+ ENGLISH TRANSLATION (FOR CONVENIENCE ONLY)
94
+ ================================================================================
95
+
96
+ In case of any discrepancy between the Russian text above and this English
97
+ translation, the Russian text prevails.
98
+
99
+ 1. DEFINITIONS
100
+
101
+ "Software" means Claude Code Visual, distributed as the npm package
102
+ @i14ks/ccv, including its source code, build output, interface and
103
+ documentation.
104
+
105
+ "You" means the individual or legal entity that obtained a copy.
106
+
107
+ 2. WHAT IS PERMITTED
108
+
109
+ You may install and run the Software on any number of devices you own or
110
+ control, for personal and commercial purposes, and use its output without
111
+ restriction.
112
+
113
+ Your work product is yours. The copyright holder claims no rights over the
114
+ files, code or text you create or modify with the Software.
115
+
116
+ 3. WHAT IS NOT PERMITTED
117
+
118
+ Without the copyright holder's prior written permission, you may not:
119
+
120
+ (a) distribute, publish, transfer, rent, sell or otherwise make the Software
121
+ or any part of it available to third parties, including as part of
122
+ another product;
123
+
124
+ (b) modify the Software, create derivative works, or publish forks;
125
+
126
+ (c) decompile, disassemble or otherwise reverse engineer the parts of the
127
+ Software shipped in built form, except where applicable law expressly
128
+ permits it;
129
+
130
+ (d) remove or alter copyright notices, this agreement, or the third-party
131
+ notices (THIRD-PARTY-NOTICES.md);
132
+
133
+ (e) offer the Software as a service to third parties.
134
+
135
+ The source code is readable. Being readable is not permission under (a)-(e):
136
+ you may look, not redistribute or modify.
137
+
138
+ 4. THIRD-PARTY CODE
139
+
140
+ The Software includes third-party code under its own terms, listed in
141
+ THIRD-PARTY-NOTICES.md, which prevail for those parts. This agreement does
142
+ not restrict your rights in that third-party code.
143
+
144
+ The Software is built to work with Claude Code, a separate product of
145
+ Anthropic PBC distributed under its own terms. The copyright holder is not
146
+ affiliated with Anthropic PBC; Claude and Claude Code are marks of their
147
+ owner and are used solely to indicate compatibility.
148
+
149
+ 5. NO WARRANTY
150
+
151
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
152
+ IMPLIED, INCLUDING BUT NOT LIMITED TO FITNESS FOR A PARTICULAR PURPOSE AND
153
+ NONINFRINGEMENT.
154
+
155
+ The Software runs an agent that reads and modifies files on your device and
156
+ executes commands. Which directories it may touch and which actions it may
157
+ take is your responsibility.
158
+
159
+ 6. LIMITATION OF LIABILITY
160
+
161
+ IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY DAMAGES, INCLUDING
162
+ LOSS OF DATA OR LOST PROFITS, ARISING FROM THE USE OF OR INABILITY TO USE
163
+ THE SOFTWARE.
164
+
165
+ 7. TERMINATION
166
+
167
+ This agreement terminates automatically if you breach section 3. Upon
168
+ termination you must delete all copies of the Software.
169
+
170
+ 8. CHANGES
171
+
172
+ The copyright holder may change the terms for future versions. The version
173
+ you received is governed by the terms shipped with it.
package/README.md CHANGED
@@ -1,56 +1,56 @@
1
- # ccv — Claude Code Visual
2
-
3
- Интерфейс к Claude Code в браузере: сессии агента в каталогах проектов, дерево
4
- файлов и редактор рядом с разговором. Работает на вашей машине — хост
5
- поднимается локально, а страница открывается по `127.0.0.1`.
6
-
7
- ## Установка
8
-
9
- ```
10
- npm install --global @i14ks/ccv
11
- ```
12
-
13
- Нужен [Node.js](https://nodejs.org) 22.5 или новее. Команда в консоли — `ccv`,
14
- имя пакета на неё не влияет.
15
-
16
- Проще — одной строкой с сайта, она ещё и разберётся с PATH и с движком сессий:
17
-
18
- ```
19
- curl -fsSL https://claudevisual.com/install.sh | sh # macOS, Linux
20
- irm https://claudevisual.com/install.ps1 | iex # Windows
21
- ```
22
-
23
- ## Запуск
24
-
25
- ```
26
- ccv
27
- ```
28
-
29
- Поднимает хост и открывает вкладку. Повторный `ccv` второй хост не поднимает —
30
- открывает вкладку в уже работающем.
31
-
32
- ```
33
- ccv --help все опции
34
- ccv --claude чем будут подниматься сессии
35
- ccv --port 8788 другой порт
36
- ```
37
-
38
- ## Нужен установленный Claude Code
39
-
40
- `ccv` — интерфейс к [Claude Code](https://claude.com/claude-code), а не его
41
- замена: сессии поднимает он. Найденный в системе CLI используется как есть;
42
- если его нет, приезжает бинарник из Agent SDK — те самые 254 МБ, ради которых
43
- установщик и спрашивает.
44
-
45
- Переменные на случай, когда автоматика ошиблась: `CCV_CLAUDE_PATH` — взять
46
- указанный CLI, `CCV_BUNDLED_CLAUDE=1` — принудительно встроенный.
47
-
48
- ## Условия
49
-
50
- Пользоваться можно свободно, в том числе в коммерческой работе; то, что вы
51
- создаёте с помощью программы, принадлежит вам. Распространять, изменять и
52
- форкать саму программу нельзя — условия целиком в файле `LICENSE` внутри
53
- пакета. Сторонний код и его лицензии перечислены в `THIRD-PARTY-NOTICES.md`.
54
-
55
- Не продукт Anthropic. Claude и Claude Code — товарные знаки Anthropic,
56
- используются только для указания на совместимость.
1
+ # ccv — Claude Code Visual
2
+
3
+ Интерфейс к Claude Code в браузере: сессии агента в каталогах проектов, дерево
4
+ файлов и редактор рядом с разговором. Работает на вашей машине — хост
5
+ поднимается локально, а страница открывается по `127.0.0.1`.
6
+
7
+ ## Установка
8
+
9
+ ```
10
+ npm install --global @i14ks/ccv
11
+ ```
12
+
13
+ Нужен [Node.js](https://nodejs.org) 22.5 или новее. Команда в консоли — `ccv`,
14
+ имя пакета на неё не влияет.
15
+
16
+ Проще — одной строкой с сайта, она ещё и разберётся с PATH и с движком сессий:
17
+
18
+ ```
19
+ curl -fsSL https://claudevisual.com/install.sh | sh # macOS, Linux
20
+ irm https://claudevisual.com/install.ps1 | iex # Windows
21
+ ```
22
+
23
+ ## Запуск
24
+
25
+ ```
26
+ ccv
27
+ ```
28
+
29
+ Поднимает хост и открывает вкладку. Повторный `ccv` второй хост не поднимает —
30
+ открывает вкладку в уже работающем.
31
+
32
+ ```
33
+ ccv --help все опции
34
+ ccv --claude чем будут подниматься сессии
35
+ ccv --port 8788 другой порт
36
+ ```
37
+
38
+ ## Нужен установленный Claude Code
39
+
40
+ `ccv` — интерфейс к [Claude Code](https://claude.com/claude-code), а не его
41
+ замена: сессии поднимает он. Найденный в системе CLI используется как есть;
42
+ если его нет, приезжает бинарник из Agent SDK — те самые 254 МБ, ради которых
43
+ установщик и спрашивает.
44
+
45
+ Переменные на случай, когда автоматика ошиблась: `CCV_CLAUDE_PATH` — взять
46
+ указанный CLI, `CCV_BUNDLED_CLAUDE=1` — принудительно встроенный.
47
+
48
+ ## Условия
49
+
50
+ Пользоваться можно свободно, в том числе в коммерческой работе; то, что вы
51
+ создаёте с помощью программы, принадлежит вам. Распространять, изменять и
52
+ форкать саму программу нельзя — условия целиком в файле `LICENSE` внутри
53
+ пакета. Сторонний код и его лицензии перечислены в `THIRD-PARTY-NOTICES.md`.
54
+
55
+ Не продукт Anthropic. Claude и Claude Code — товарные знаки Anthropic,
56
+ используются только для указания на совместимость.
package/bundle/ccv.mjs CHANGED
@@ -646,6 +646,57 @@ function writeTarget(input) {
646
646
  const target = record.file_path ?? record.notebook_path;
647
647
  return typeof target === "string" && target ? target : null;
648
648
  }
649
+ var ASK_QUESTION_TOOL = "AskUserQuestion";
650
+ function parseQuestions(input) {
651
+ if (typeof input !== "object" || input === null)
652
+ return null;
653
+ const raw = input.questions;
654
+ if (!Array.isArray(raw) || raw.length === 0)
655
+ return null;
656
+ const questions = [];
657
+ for (const item of raw) {
658
+ if (typeof item !== "object" || item === null)
659
+ return null;
660
+ const { question, header, options: options2, multiSelect } = item;
661
+ if (typeof question !== "string" || !question)
662
+ return null;
663
+ if (!Array.isArray(options2) || options2.length === 0)
664
+ return null;
665
+ const parsed = [];
666
+ for (const option of options2) {
667
+ if (typeof option !== "object" || option === null)
668
+ return null;
669
+ const { label, description, preview } = option;
670
+ if (typeof label !== "string" || !label)
671
+ return null;
672
+ parsed.push({
673
+ label,
674
+ description: typeof description === "string" ? description : "",
675
+ ...typeof preview === "string" && preview ? { preview } : {}
676
+ });
677
+ }
678
+ questions.push({
679
+ question,
680
+ header: typeof header === "string" ? header : "",
681
+ options: parsed,
682
+ multiSelect: multiSelect === true
683
+ });
684
+ }
685
+ return questions;
686
+ }
687
+ function previewAnnotations(questions, answers) {
688
+ const annotations = {};
689
+ for (const question of questions) {
690
+ const answer = answers[question.question];
691
+ if (!answer)
692
+ continue;
693
+ const chosen = question.options.filter((option) => answer.split(", ").includes(option.label));
694
+ if (chosen.length !== 1 || !chosen[0]?.preview)
695
+ continue;
696
+ annotations[question.question] = { preview: chosen[0].preview };
697
+ }
698
+ return annotations;
699
+ }
649
700
  var USAGE_MIN_INTERVAL_MS = 2e4;
650
701
  var ClaudeSession = class extends EventEmitter {
651
702
  id;
@@ -898,13 +949,41 @@ var ClaudeSession = class extends EventEmitter {
898
949
  parent_tool_use_id: null
899
950
  });
900
951
  }
901
- respondPermission(requestId, decision, reason) {
952
+ /**
953
+ * Ответ человека на запрос прав — он же ответ на вопрос агента.
954
+ *
955
+ * `answers` осмысленны только для `AskUserQuestion`: там разрешение и есть
956
+ * ответ, и выбранное надо вернуть инструменту в его же аргументах. Схема
957
+ * аргументов у него строгая (`strictObject`), поэтому дописываем ровно те
958
+ * поля, которые она знает, — лишнее уронило бы вызов ZodError'ом там, где
959
+ * человек только что нажал кнопку.
960
+ */
961
+ respondPermission(requestId, decision, reason, answers, annotations) {
902
962
  const pending = this.#pendingPermissions.get(requestId);
903
963
  if (!pending)
904
964
  return;
905
965
  this.#pendingPermissions.delete(requestId);
906
- pending.resolve(decision === "allow" ? { behavior: "allow", updatedInput: pending.input } : { behavior: "deny", message: reason ?? "\u041E\u0442\u043A\u043B\u043E\u043D\u0435\u043D\u043E \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C" });
907
- this.#record({ kind: "permission.resolved", requestId, decision, reason });
966
+ const answered = pending.questions && answers ? answers : null;
967
+ let input = pending.input;
968
+ if (answered) {
969
+ const withPreviews = {
970
+ ...previewAnnotations(pending.questions ?? [], answered),
971
+ ...annotations
972
+ };
973
+ input = {
974
+ ...pending.input,
975
+ answers: answered,
976
+ ...Object.keys(withPreviews).length > 0 ? { annotations: withPreviews } : {}
977
+ };
978
+ }
979
+ pending.resolve(decision === "allow" ? { behavior: "allow", updatedInput: input } : { behavior: "deny", message: reason ?? "\u041E\u0442\u043A\u043B\u043E\u043D\u0435\u043D\u043E \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C" });
980
+ this.#record({
981
+ kind: "permission.resolved",
982
+ requestId,
983
+ decision,
984
+ reason,
985
+ ...answered ? { answers: answered } : {}
986
+ });
908
987
  if (this.#pendingPermissions.size === 0)
909
988
  this.#setState("running");
910
989
  }
@@ -1135,7 +1214,23 @@ var ClaudeSession = class extends EventEmitter {
1135
1214
  }
1136
1215
  };
1137
1216
  };
1138
- #canUseTool = (toolName, input, { signal, decisionReason }) => {
1217
+ /**
1218
+ * Мост между `canUseTool` из SDK и решением человека в UI.
1219
+ *
1220
+ * Сюда же приходит и `AskUserQuestion` — вопрос агента с вариантами ответа.
1221
+ * Отдельного канала для него в SDK нет и не нужно: CLI объявляет этот
1222
+ * инструмент как `requiresUserInteraction`, а такой всегда попадает в
1223
+ * `canUseTool`, в любом режиме прав, — даже в `bypassPermissions`, где всё
1224
+ * остальное проходит молча. Проверка стоит раньше разбора режима, так что
1225
+ * вопрос не потеряется ни в одном из них.
1226
+ *
1227
+ * Разрешение для него значит не «выполняй», а «вот ответ»: выбранное
1228
+ * возвращается в `updatedInput.answers`, и уже с ним инструмент выполняется
1229
+ * и складывает ответ в результат вызова. Пустой `answers` (то есть простое
1230
+ * «Разрешить») инструмент понимает как «человек не стал отвечать» — ровно
1231
+ * это и происходило, пока вопросы показывались обычной карточкой прав.
1232
+ */
1233
+ #canUseTool = (toolName, input, { signal, decisionReason, toolUseID }) => {
1139
1234
  if (this.#options.readOnly) {
1140
1235
  this.#record({
1141
1236
  kind: "error",
@@ -1147,8 +1242,9 @@ var ClaudeSession = class extends EventEmitter {
1147
1242
  });
1148
1243
  }
1149
1244
  const requestId = randomUUID();
1245
+ const questions = toolName === ASK_QUESTION_TOOL ? parseQuestions(input) : null;
1150
1246
  return new Promise((resolve) => {
1151
- this.#pendingPermissions.set(requestId, { resolve, toolName, input });
1247
+ this.#pendingPermissions.set(requestId, { resolve, toolName, input, questions });
1152
1248
  this.#setState("waiting_permission");
1153
1249
  this.#record({
1154
1250
  kind: "permission.request",
@@ -1157,8 +1253,11 @@ var ClaudeSession = class extends EventEmitter {
1157
1253
  input,
1158
1254
  // Причину даёт не всякий запрос: обычный вопрос в режиме `default`
1159
1255
  // объясняется самим режимом, а вот запрос, поднятый хуком поверх
1160
- // разрешающего режима, без неё выглядит сбоем.
1161
- ...decisionReason ? { reason: decisionReason } : {}
1256
+ // разрешающего режима, без неё выглядит сбоем. Вопросу агента причина
1257
+ // не нужна вовсе: CLI объясняет его технически («requiresUserInteraction»),
1258
+ // а спрашивают тут не «почему», а «что выбрать».
1259
+ ...decisionReason && !questions ? { reason: decisionReason } : {},
1260
+ ...questions ? { questions, toolUseId: toolUseID } : {}
1162
1261
  });
1163
1262
  signal.addEventListener("abort", () => {
1164
1263
  if (!this.#pendingPermissions.delete(requestId))
@@ -2429,12 +2528,16 @@ import { homedir as homedir3 } from "node:os";
2429
2528
  import path9 from "node:path";
2430
2529
  var DEFAULT_AUTO_ARCHIVE_AFTER_MS = 2 * 24 * 60 * 60 * 1e3;
2431
2530
  var MIN_AUTO_ARCHIVE_AFTER_MS = 60 * 60 * 1e3;
2531
+ var MIN_AUTO_SAVE_AFTER_PAUSE_MS = 500;
2432
2532
  var FOLDER_ACCESS = ["all", "projects", "project"];
2433
2533
  var DEFAULT_APP_SETTINGS = {
2434
2534
  autoArchiveAfterMs: DEFAULT_AUTO_ARCHIVE_AFTER_MS,
2435
2535
  // Строгий режим по умолчанию: молча писать в чужой проект приложение начнёт
2436
2536
  // только после того, как об этом попросили явно.
2437
- folderAccess: "project"
2537
+ folderAccess: "project",
2538
+ // Выключено по умолчанию: сохранение — явное действие, пока человек сам не
2539
+ // попросил иначе.
2540
+ autoSaveAfterPauseMs: 0
2438
2541
  };
2439
2542
  var AppSettingsStore = class {
2440
2543
  #settings = { ...DEFAULT_APP_SETTINGS };
@@ -2482,6 +2585,10 @@ function sanitize(value, fallback) {
2482
2585
  if (typeof access2 === "string" && FOLDER_ACCESS.includes(access2)) {
2483
2586
  result.folderAccess = access2;
2484
2587
  }
2588
+ const autoSave = record.autoSaveAfterPauseMs;
2589
+ if (typeof autoSave === "number" && Number.isFinite(autoSave)) {
2590
+ result.autoSaveAfterPauseMs = autoSave <= 0 ? 0 : Math.max(Math.round(autoSave), MIN_AUTO_SAVE_AFTER_PAUSE_MS);
2591
+ }
2485
2592
  return result;
2486
2593
  }
2487
2594
  function claudeHome() {
@@ -3510,7 +3617,7 @@ var HostServer = class {
3510
3617
  this.#requireSession(frame.sessionId).sendPrompt(frame.text);
3511
3618
  return;
3512
3619
  case "permission.respond":
3513
- this.#requireSession(frame.sessionId).respondPermission(frame.requestId, frame.decision, frame.reason);
3620
+ this.#requireSession(frame.sessionId).respondPermission(frame.requestId, frame.decision, frame.reason, frame.answers, frame.annotations);
3514
3621
  return;
3515
3622
  case "side.ask":
3516
3623
  this.#ensureSide(this.#requireSession(frame.sessionId)).sendPrompt(frame.text);