@ykurilov/agent-chat-sandbox 0.0.0-stage → 0.55.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/CHANGELOG.md +829 -0
- package/LICENSE +21 -0
- package/README.md +59 -2
- package/dist/chunk-4O5NPJOS.js +483 -0
- package/dist/chunk-4O5NPJOS.js.map +1 -0
- package/dist/index.js +695 -0
- package/dist/index.js.map +1 -0
- package/dist/postgres.js +236 -0
- package/dist/postgres.js.map +1 -0
- package/dist/react.js +1045 -0
- package/dist/react.js.map +1 -0
- package/dist/sqlite.js +221 -0
- package/dist/sqlite.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/journal/hide-secrets.d.ts +32 -0
- package/dist/types/journal/journal-blobs.d.ts +25 -0
- package/dist/types/journal/journal-store.d.ts +77 -0
- package/dist/types/journal/journal.d.ts +19 -0
- package/dist/types/journal/memory-journal.d.ts +8 -0
- package/dist/types/journal/postgres-journal.d.ts +9 -0
- package/dist/types/journal/postgres-schema.d.ts +936 -0
- package/dist/types/journal/sqlite-journal.d.ts +4 -0
- package/dist/types/journal/sqlite-schema.d.ts +1001 -0
- package/dist/types/people/copy-person-chat.d.ts +28 -0
- package/dist/types/people/people-routes.d.ts +25 -0
- package/dist/types/people/staff-copies.d.ts +46 -0
- package/dist/types/postgres.d.ts +14 -0
- package/dist/types/react/agent-sandbox.d.ts +25 -0
- package/dist/types/react/answer-edit-draft.d.ts +42 -0
- package/dist/types/react/answer-editor-host.d.ts +13 -0
- package/dist/types/react/chat-reopen.d.ts +9 -0
- package/dist/types/react/instruction-header.d.ts +10 -0
- package/dist/types/react/journal-panel.d.ts +17 -0
- package/dist/types/react/journal-view.d.ts +61 -0
- package/dist/types/react/people-chats-panel.d.ts +18 -0
- package/dist/types/react/read-only-chat-skin.d.ts +8 -0
- package/dist/types/react/sandbox-client.d.ts +36 -0
- package/dist/types/react/sandbox-labels.d.ts +118 -0
- package/dist/types/react/sandbox-skin.d.ts +260 -0
- package/dist/types/react.d.ts +5 -0
- package/dist/types/read-only-memory.d.ts +18 -0
- package/dist/types/sandbox-handler.d.ts +15 -0
- package/dist/types/sandbox-owner.d.ts +6 -0
- package/dist/types/sandbox-tools.d.ts +14 -0
- package/dist/types/sqlite.d.ts +9 -0
- package/dist/types/types.d.ts +219 -0
- package/drizzle/postgres/0000_journal_init.sql +79 -0
- package/drizzle/postgres/meta/0000_snapshot.json +551 -0
- package/drizzle/postgres/meta/_journal.json +13 -0
- package/drizzle/sqlite/0000_journal_init.sql +77 -0
- package/drizzle/sqlite/meta/0000_snapshot.json +499 -0
- package/drizzle/sqlite/meta/_journal.json +13 -0
- package/package.json +95 -3
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,829 @@
|
|
|
1
|
+
# @ykurilov/agent-chat-sandbox
|
|
2
|
+
|
|
3
|
+
## 0.55.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [51f7b38]
|
|
8
|
+
- Updated dependencies [cdc7dd7]
|
|
9
|
+
- @ykurilov/agent-chat-core@0.55.0
|
|
10
|
+
- @ykurilov/agent-chat-react@0.55.0
|
|
11
|
+
- @ykurilov/agent-chat-server@0.55.0
|
|
12
|
+
|
|
13
|
+
## 0.54.0
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- Updated dependencies [c8fb0dd]
|
|
18
|
+
- Updated dependencies [73d3aaa]
|
|
19
|
+
- Updated dependencies [fa90219]
|
|
20
|
+
- @ykurilov/agent-chat-react@0.54.0
|
|
21
|
+
- @ykurilov/agent-chat-core@0.54.0
|
|
22
|
+
- @ykurilov/agent-chat-server@0.54.0
|
|
23
|
+
|
|
24
|
+
## 0.53.0
|
|
25
|
+
|
|
26
|
+
### Patch Changes
|
|
27
|
+
|
|
28
|
+
- Updated dependencies [b6a7786]
|
|
29
|
+
- @ykurilov/agent-chat-core@0.53.0
|
|
30
|
+
- @ykurilov/agent-chat-react@0.53.0
|
|
31
|
+
- @ykurilov/agent-chat-server@0.53.0
|
|
32
|
+
|
|
33
|
+
## 0.52.0
|
|
34
|
+
|
|
35
|
+
### Patch Changes
|
|
36
|
+
|
|
37
|
+
- @ykurilov/agent-chat-core@0.52.0
|
|
38
|
+
- @ykurilov/agent-chat-react@0.52.0
|
|
39
|
+
- @ykurilov/agent-chat-server@0.52.0
|
|
40
|
+
|
|
41
|
+
## 0.51.0
|
|
42
|
+
|
|
43
|
+
### Patch Changes
|
|
44
|
+
|
|
45
|
+
- Updated dependencies [41b1726]
|
|
46
|
+
- @ykurilov/agent-chat-core@0.51.0
|
|
47
|
+
- @ykurilov/agent-chat-server@0.51.0
|
|
48
|
+
- @ykurilov/agent-chat-react@0.51.0
|
|
49
|
+
|
|
50
|
+
## 0.50.0
|
|
51
|
+
|
|
52
|
+
### Patch Changes
|
|
53
|
+
|
|
54
|
+
- @ykurilov/agent-chat-core@0.50.0
|
|
55
|
+
- @ykurilov/agent-chat-react@0.50.0
|
|
56
|
+
- @ykurilov/agent-chat-server@0.50.0
|
|
57
|
+
|
|
58
|
+
## 0.49.0
|
|
59
|
+
|
|
60
|
+
### Patch Changes
|
|
61
|
+
|
|
62
|
+
- Updated dependencies [084cef7]
|
|
63
|
+
- @ykurilov/agent-chat-core@0.49.0
|
|
64
|
+
- @ykurilov/agent-chat-server@0.49.0
|
|
65
|
+
- @ykurilov/agent-chat-react@0.49.0
|
|
66
|
+
|
|
67
|
+
## 0.48.0
|
|
68
|
+
|
|
69
|
+
### Patch Changes
|
|
70
|
+
|
|
71
|
+
- Updated dependencies [fa10d5a]
|
|
72
|
+
- @ykurilov/agent-chat-core@0.48.0
|
|
73
|
+
- @ykurilov/agent-chat-server@0.48.0
|
|
74
|
+
- @ykurilov/agent-chat-react@0.48.0
|
|
75
|
+
|
|
76
|
+
## 0.47.0
|
|
77
|
+
|
|
78
|
+
### Patch Changes
|
|
79
|
+
|
|
80
|
+
- Updated dependencies [5a59c33]
|
|
81
|
+
- @ykurilov/agent-chat-core@0.47.0
|
|
82
|
+
- @ykurilov/agent-chat-server@0.47.0
|
|
83
|
+
- @ykurilov/agent-chat-react@0.47.0
|
|
84
|
+
|
|
85
|
+
## 0.46.2
|
|
86
|
+
|
|
87
|
+
### Patch Changes
|
|
88
|
+
|
|
89
|
+
- Updated dependencies [3d0d2f2]
|
|
90
|
+
- @ykurilov/agent-chat-core@0.46.2
|
|
91
|
+
- @ykurilov/agent-chat-server@0.46.2
|
|
92
|
+
- @ykurilov/agent-chat-react@0.46.2
|
|
93
|
+
|
|
94
|
+
## 0.46.1
|
|
95
|
+
|
|
96
|
+
### Patch Changes
|
|
97
|
+
|
|
98
|
+
- @ykurilov/agent-chat-core@0.46.1
|
|
99
|
+
- @ykurilov/agent-chat-react@0.46.1
|
|
100
|
+
- @ykurilov/agent-chat-server@0.46.1
|
|
101
|
+
|
|
102
|
+
## 0.46.0
|
|
103
|
+
|
|
104
|
+
### Patch Changes
|
|
105
|
+
|
|
106
|
+
- Updated dependencies [56d7528]
|
|
107
|
+
- Updated dependencies [a1933fd]
|
|
108
|
+
- Updated dependencies [52cc67d]
|
|
109
|
+
- @ykurilov/agent-chat-core@0.46.0
|
|
110
|
+
- @ykurilov/agent-chat-react@0.46.0
|
|
111
|
+
- @ykurilov/agent-chat-server@0.46.0
|
|
112
|
+
|
|
113
|
+
## 0.45.0
|
|
114
|
+
|
|
115
|
+
### Patch Changes
|
|
116
|
+
|
|
117
|
+
- Updated dependencies [eb74c58]
|
|
118
|
+
- Updated dependencies [ac9aede]
|
|
119
|
+
- @ykurilov/agent-chat-react@0.45.0
|
|
120
|
+
- @ykurilov/agent-chat-core@0.45.0
|
|
121
|
+
- @ykurilov/agent-chat-server@0.45.0
|
|
122
|
+
|
|
123
|
+
## 0.44.0
|
|
124
|
+
|
|
125
|
+
### Patch Changes
|
|
126
|
+
|
|
127
|
+
- Updated dependencies [6a2b5d9]
|
|
128
|
+
- @ykurilov/agent-chat-core@0.44.0
|
|
129
|
+
- @ykurilov/agent-chat-react@0.44.0
|
|
130
|
+
- @ykurilov/agent-chat-server@0.44.0
|
|
131
|
+
|
|
132
|
+
## 0.43.0
|
|
133
|
+
|
|
134
|
+
### Patch Changes
|
|
135
|
+
|
|
136
|
+
- Updated dependencies [763f4c5]
|
|
137
|
+
- @ykurilov/agent-chat-core@0.43.0
|
|
138
|
+
- @ykurilov/agent-chat-server@0.43.0
|
|
139
|
+
- @ykurilov/agent-chat-react@0.43.0
|
|
140
|
+
|
|
141
|
+
## 0.42.0
|
|
142
|
+
|
|
143
|
+
### Patch Changes
|
|
144
|
+
|
|
145
|
+
- Updated dependencies [a385276]
|
|
146
|
+
- @ykurilov/agent-chat-core@0.42.0
|
|
147
|
+
- @ykurilov/agent-chat-server@0.42.0
|
|
148
|
+
- @ykurilov/agent-chat-react@0.42.0
|
|
149
|
+
|
|
150
|
+
## 0.41.0
|
|
151
|
+
|
|
152
|
+
### Patch Changes
|
|
153
|
+
|
|
154
|
+
- Updated dependencies [9472fcb]
|
|
155
|
+
- @ykurilov/agent-chat-core@0.41.0
|
|
156
|
+
- @ykurilov/agent-chat-react@0.41.0
|
|
157
|
+
- @ykurilov/agent-chat-server@0.41.0
|
|
158
|
+
|
|
159
|
+
## 0.40.0
|
|
160
|
+
|
|
161
|
+
### Patch Changes
|
|
162
|
+
|
|
163
|
+
- Updated dependencies [0e7aab3]
|
|
164
|
+
- @ykurilov/agent-chat-core@0.40.0
|
|
165
|
+
- @ykurilov/agent-chat-server@0.40.0
|
|
166
|
+
- @ykurilov/agent-chat-react@0.40.0
|
|
167
|
+
|
|
168
|
+
## 0.39.1
|
|
169
|
+
|
|
170
|
+
### Patch Changes
|
|
171
|
+
|
|
172
|
+
- Updated dependencies [5c0f3af]
|
|
173
|
+
- @ykurilov/agent-chat-react@0.39.1
|
|
174
|
+
- @ykurilov/agent-chat-core@0.39.1
|
|
175
|
+
- @ykurilov/agent-chat-server@0.39.1
|
|
176
|
+
|
|
177
|
+
## 0.39.0
|
|
178
|
+
|
|
179
|
+
### Patch Changes
|
|
180
|
+
|
|
181
|
+
- Updated dependencies [3b90429]
|
|
182
|
+
- @ykurilov/agent-chat-core@0.39.0
|
|
183
|
+
- @ykurilov/agent-chat-server@0.39.0
|
|
184
|
+
- @ykurilov/agent-chat-react@0.39.0
|
|
185
|
+
|
|
186
|
+
## 0.38.0
|
|
187
|
+
|
|
188
|
+
### Patch Changes
|
|
189
|
+
|
|
190
|
+
- Updated dependencies [1cae504]
|
|
191
|
+
- Updated dependencies [4065a4a]
|
|
192
|
+
- @ykurilov/agent-chat-core@0.38.0
|
|
193
|
+
- @ykurilov/agent-chat-server@0.38.0
|
|
194
|
+
- @ykurilov/agent-chat-react@0.38.0
|
|
195
|
+
|
|
196
|
+
## 0.37.0
|
|
197
|
+
|
|
198
|
+
### Patch Changes
|
|
199
|
+
|
|
200
|
+
- Updated dependencies [7f49d12]
|
|
201
|
+
- Updated dependencies [ea78982]
|
|
202
|
+
- @ykurilov/agent-chat-core@0.37.0
|
|
203
|
+
- @ykurilov/agent-chat-server@0.37.0
|
|
204
|
+
- @ykurilov/agent-chat-react@0.37.0
|
|
205
|
+
|
|
206
|
+
## 0.36.0
|
|
207
|
+
|
|
208
|
+
### Patch Changes
|
|
209
|
+
|
|
210
|
+
- Updated dependencies [3487fb4]
|
|
211
|
+
- Updated dependencies [8c43b86]
|
|
212
|
+
- Updated dependencies [3f39081]
|
|
213
|
+
- Updated dependencies [6f42418]
|
|
214
|
+
- Updated dependencies [5f13c74]
|
|
215
|
+
- @ykurilov/agent-chat-core@0.36.0
|
|
216
|
+
- @ykurilov/agent-chat-server@0.36.0
|
|
217
|
+
- @ykurilov/agent-chat-react@0.36.0
|
|
218
|
+
|
|
219
|
+
## 0.35.0
|
|
220
|
+
|
|
221
|
+
### Minor Changes
|
|
222
|
+
|
|
223
|
+
- 2382026: **Ломает приложения:** память, сегодняшняя дата и место на экране больше не переезжают в последний вопрос на каждом
|
|
224
|
+
ходе. Они вписываются в вопрос того хода, где их прочитали, и дальше не меняются; набор хода хранится служебной частью
|
|
225
|
+
ответа `data-frozen-context`.
|
|
226
|
+
|
|
227
|
+
Что изменилось. Раньше блок памяти, дата и место стояли в конце последнего вопроса и на следующем ходе уезжали из него.
|
|
228
|
+
Из-за этого всё после старого вопроса (рассуждения, вызовы инструментов, их результаты) каждый ход читалось заново, мимо
|
|
229
|
+
кэша модели. Теперь блоки застывают там, где их показали, как в Claude Code. Следующий ход побайтно начинается с
|
|
230
|
+
последнего шага прошлого и читает всю переписку из кэша.
|
|
231
|
+
|
|
232
|
+
- **Изменения — только припиской.** В новый вопрос идут только изменившиеся блоки целиком и одна строка
|
|
233
|
+
`[Больше не действует: «ключ»]` про пропавшие. Ничего не менялось — вопрос без приписки.
|
|
234
|
+
- **Удалённая запись памяти** остаётся в старом вопросе, а в новом модель видит, что она больше не действует.
|
|
235
|
+
- **Запись, не влезшая в лимит памяти** (`maxBlockChars`), не считается удалённой. Модель, которая её уже видела,
|
|
236
|
+
получает строку `[Не показано ради места, но по-прежнему действует: «ключ»]` и находит её поиском. Так может любой
|
|
237
|
+
источник: элемент `{ key, hidden: true }` в списке блоков значит «блок есть, но не показан». Новый тип
|
|
238
|
+
`ContextBlockEntry = ContextBlock | HiddenContextBlock`.
|
|
239
|
+
- **Продолжение хода** (после подтверждения инструмента, автопродолжение, запасной провайдер, «Повторить») берёт блоки
|
|
240
|
+
из ответа и память заново не читает. Инструменты при этом получают свежее место (`model.place`), а модель видит
|
|
241
|
+
застывшее.
|
|
242
|
+
- **Память по записям.** `createLongTermMemory` отдаёт память блоками: шапка `<agent_memory>` (ключ `memory`) и по блоку
|
|
243
|
+
на запись (`memory:<id>`). Правка одной записи стоит одной строки, а не всего блока. Своя память может делать так же
|
|
244
|
+
через необязательный `LongTermMemory.blocks?({ userId, chatId })`; без него — один блок из `snapshot()`, как раньше.
|
|
245
|
+
Обёртка памяти в песочнице пробрасывает `blocks`. Счётчик «Показано агенту: N из M» считает записи, которые уходят
|
|
246
|
+
модели блоками.
|
|
247
|
+
- **Блоки приложения — `agent.contextBlocks`** (новое, по желанию). Приложение отдаёт список `{ key, text, private? }`:
|
|
248
|
+
скиллы, роль, правила. Он вписывается в вопрос после памяти и даты по тем же правилам:
|
|
249
|
+
|
|
250
|
+
```ts
|
|
251
|
+
agent: {
|
|
252
|
+
instructions,
|
|
253
|
+
contextBlocks: async ({ chatId, ownerId, chat, audience, abortSignal }) => [
|
|
254
|
+
{ key: "skills", text: `Скиллы агента: ${await skillsOf(ownerId, { signal: abortSignal })}` },
|
|
255
|
+
],
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
- Вход: `chatId`, `ownerId`, `messageId`, `chat.data`, `subject`, `channel`, `audience`, `staff`, `modelId`,
|
|
260
|
+
`providerId`, `abortSignal`. Данные и объект чата — копии.
|
|
261
|
+
- `private: true` — блок не показывается в групповом ходе (`audience: "group"`).
|
|
262
|
+
- Ключи `memory`, `memory:*`, `today`, `screen_place` заняты ядром. Такой блок, повтор ключа и пустой текст
|
|
263
|
+
отбрасываются, в `logError` строка `[блоки контекста] … отброшен`.
|
|
264
|
+
- `agent.contextBlocksTimeoutMs` — срок функции, по умолчанию 5000 мс; 0 или `Infinity` — без срока, иначе от 1000.
|
|
265
|
+
Не ответила или бросила — блоки приложения берутся из прошлого ответа чата, в `logError` строка
|
|
266
|
+
`[блоки контекста] … не ответил за N мс`. «Стоп» отменяет функцию сразу, без строки.
|
|
267
|
+
- Новые типы `ContextBlock`, `ContextBlocksInput`, `ContextBlocksSource`, `HiddenContextBlock`, `ContextBlockEntry`.
|
|
268
|
+
- **Кэш шагов у моделей с явными метками** (Claude, Gemini через OpenRouter). Со второго шага хода метка кэша стоит на
|
|
269
|
+
конце шага, до снимка `stepContext` и служебных пометок. Меток в запросе не больше трёх: инструкция, последнее
|
|
270
|
+
сообщение истории, конец шага. У провайдеров с автоматическим кэшем (DeepSeek, Fireworks, Together, GPT напрямую)
|
|
271
|
+
меток нет и запросы без лишних байтов. У Gemini через OpenRouter метка на самом конце запроса не работает (OpenRouter
|
|
272
|
+
её пропускает), поэтому у моделей `google/` она стоит на предпоследнем сообщении: конце прошлого хода или вызове
|
|
273
|
+
инструмента. У Claude через OpenRouter шаги с инструментами теперь пишутся в кэш (запись
|
|
274
|
+
дороже входа на 25%, при `cacheTtl: "1h"` — вдвое), а следующий ход читает их по цене чтения.
|
|
275
|
+
- **Журнал промахов кэша** (`[промах кэша]`) сравнивает первый шаг хода с последним шагом прошлого хода, без его
|
|
276
|
+
концовки (снимок, пометка попытки, пометка «подведи итог»).
|
|
277
|
+
- **Служебная часть `data-frozen-context`** не уходит в поток, историю (`getHistory`), `afterTurn` (`TurnResult.parts`) и
|
|
278
|
+
поиск по истории. Константа — `FROZEN_CONTEXT_PART_TYPE`. Миграций базы нет. Старый чат: первый ход после обновления
|
|
279
|
+
кладёт полный набор блоков в свой вопрос, прошлые вопросы остаются как были.
|
|
280
|
+
|
|
281
|
+
### Как обновить приложение
|
|
282
|
+
|
|
283
|
+
1. Найдите места, где приложение читает ответы прямо из хранилища (`storage.listMessages`, `storage.getMessage`, свой
|
|
284
|
+
SQL по таблице сообщений) и разбирает части ответа: показ, выгрузка, подсчёт, `parts[0]`. Теперь первой частью
|
|
285
|
+
ответа стоит служебная `data-frozen-context`. В ней память человека, дата и место, показывать её нельзя. Пропускайте
|
|
286
|
+
её:
|
|
287
|
+
|
|
288
|
+
Было:
|
|
289
|
+
|
|
290
|
+
```ts
|
|
291
|
+
const parts = message.parts;
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
Стало:
|
|
295
|
+
|
|
296
|
+
```ts
|
|
297
|
+
import { FROZEN_CONTEXT_PART_TYPE } from "@ykurilov/agent-chat-core";
|
|
298
|
+
|
|
299
|
+
const parts = message.parts.filter((part) => part.type !== FROZEN_CONTEXT_PART_TYPE);
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
`service.getHistory`, поток, `afterTurn` и `@ykurilov/agent-chat-history-search` её уже не отдают: там ничего делать
|
|
303
|
+
не нужно.
|
|
304
|
+
2. Если у приложения есть свои тесты, которые сравнивают запрос к модели или его снимок (где стоит `<agent_memory>`,
|
|
305
|
+
«Сегодня: …», `<screen_place>`), обновите их. Блоки теперь в вопросе того хода, где их прочитали, а не в последнем
|
|
306
|
+
вопросе. Проверьте, что разница в снимке только в этом переносе.
|
|
307
|
+
3. Если приложение подставляло в вопрос свои сведения на каждом ходе (скиллы, роль) через инструкцию или `stepContext`,
|
|
308
|
+
а они меняются редко, перенесите их в `agent.contextBlocks`: кэш модели перестанет сбрасываться. Шаг по желанию.
|
|
309
|
+
4. Своя реализация `LongTermMemory` работает без правок. Если записей много и они часто меняются, добавьте метод
|
|
310
|
+
`blocks({ userId, chatId })`, который возвращает `[{ key: "memory", text: шапка, private: true }, { key: "memory:<id>",
|
|
311
|
+
text: запись, private: true }, …]`. Шаг по желанию.
|
|
312
|
+
5. Проверка. Временно запишите в `afterTurn` расход хода:
|
|
313
|
+
|
|
314
|
+
```ts
|
|
315
|
+
afterTurn: ({ messageId, usage }) => console.log("кэш", messageId, usage?.cachedInputTokens, "из", usage?.inputTokens),
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
В одном чате с моделью, которая сообщает о кэше (Claude или Gemini через OpenRouter, DeepSeek), задайте вопрос, на
|
|
319
|
+
который агент вызовет инструмент, и через полминуты — второй вопрос. Ожидается: на втором ходе `cachedInputTokens`
|
|
320
|
+
не меньше входа последнего шага первого хода, то есть почти весь вход прочитан из кэша. Строк `[промах кэша]` в
|
|
321
|
+
журнале сервера (`logError`) нет. На экране служебных блоков нет, агент помнит записи памяти.
|
|
322
|
+
|
|
323
|
+
### Patch Changes
|
|
324
|
+
|
|
325
|
+
- Updated dependencies [6ceee78]
|
|
326
|
+
- Updated dependencies [2382026]
|
|
327
|
+
- @ykurilov/agent-chat-react@0.35.0
|
|
328
|
+
- @ykurilov/agent-chat-server@0.35.0
|
|
329
|
+
- @ykurilov/agent-chat-core@0.35.0
|
|
330
|
+
|
|
331
|
+
## 0.34.0
|
|
332
|
+
|
|
333
|
+
### Patch Changes
|
|
334
|
+
|
|
335
|
+
- Updated dependencies [d039ce4]
|
|
336
|
+
- @ykurilov/agent-chat-core@0.34.0
|
|
337
|
+
- @ykurilov/agent-chat-server@0.34.0
|
|
338
|
+
- @ykurilov/agent-chat-react@0.34.0
|
|
339
|
+
|
|
340
|
+
## 0.33.0
|
|
341
|
+
|
|
342
|
+
### Patch Changes
|
|
343
|
+
|
|
344
|
+
- Updated dependencies [4a72339]
|
|
345
|
+
- @ykurilov/agent-chat-core@0.33.0
|
|
346
|
+
- @ykurilov/agent-chat-server@0.33.0
|
|
347
|
+
- @ykurilov/agent-chat-react@0.33.0
|
|
348
|
+
|
|
349
|
+
## 0.32.0
|
|
350
|
+
|
|
351
|
+
### Patch Changes
|
|
352
|
+
|
|
353
|
+
- Updated dependencies [4087a22]
|
|
354
|
+
- Updated dependencies [71c32b7]
|
|
355
|
+
- Updated dependencies [cae13bf]
|
|
356
|
+
- Updated dependencies [a94bda9]
|
|
357
|
+
- Updated dependencies [4e44492]
|
|
358
|
+
- Updated dependencies [ac9b7d3]
|
|
359
|
+
- Updated dependencies [27f4b1e]
|
|
360
|
+
- Updated dependencies [53c41a8]
|
|
361
|
+
- @ykurilov/agent-chat-react@0.32.0
|
|
362
|
+
- @ykurilov/agent-chat-core@0.32.0
|
|
363
|
+
- @ykurilov/agent-chat-server@0.32.0
|
|
364
|
+
|
|
365
|
+
## 0.31.2
|
|
366
|
+
|
|
367
|
+
### Patch Changes
|
|
368
|
+
|
|
369
|
+
- @ykurilov/agent-chat-core@0.31.2
|
|
370
|
+
- @ykurilov/agent-chat-react@0.31.2
|
|
371
|
+
- @ykurilov/agent-chat-server@0.31.2
|
|
372
|
+
|
|
373
|
+
## 0.31.1
|
|
374
|
+
|
|
375
|
+
### Patch Changes
|
|
376
|
+
|
|
377
|
+
- @ykurilov/agent-chat-core@0.31.1
|
|
378
|
+
- @ykurilov/agent-chat-react@0.31.1
|
|
379
|
+
- @ykurilov/agent-chat-server@0.31.1
|
|
380
|
+
|
|
381
|
+
## 0.31.0
|
|
382
|
+
|
|
383
|
+
### Patch Changes
|
|
384
|
+
|
|
385
|
+
- @ykurilov/agent-chat-core@0.31.0
|
|
386
|
+
- @ykurilov/agent-chat-react@0.31.0
|
|
387
|
+
- @ykurilov/agent-chat-server@0.31.0
|
|
388
|
+
|
|
389
|
+
## 0.30.0
|
|
390
|
+
|
|
391
|
+
### Patch Changes
|
|
392
|
+
|
|
393
|
+
- @ykurilov/agent-chat-core@0.30.0
|
|
394
|
+
- @ykurilov/agent-chat-react@0.30.0
|
|
395
|
+
- @ykurilov/agent-chat-server@0.30.0
|
|
396
|
+
|
|
397
|
+
## 0.29.0
|
|
398
|
+
|
|
399
|
+
### Patch Changes
|
|
400
|
+
|
|
401
|
+
- @ykurilov/agent-chat-core@0.29.0
|
|
402
|
+
- @ykurilov/agent-chat-react@0.29.0
|
|
403
|
+
- @ykurilov/agent-chat-server@0.29.0
|
|
404
|
+
|
|
405
|
+
## 0.28.0
|
|
406
|
+
|
|
407
|
+
### Patch Changes
|
|
408
|
+
|
|
409
|
+
- Updated dependencies [11c3c97]
|
|
410
|
+
- Updated dependencies [d63ccaa]
|
|
411
|
+
- Updated dependencies [6a2f903]
|
|
412
|
+
- Updated dependencies [189cba9]
|
|
413
|
+
- @ykurilov/agent-chat-core@0.28.0
|
|
414
|
+
- @ykurilov/agent-chat-server@0.28.0
|
|
415
|
+
- @ykurilov/agent-chat-react@0.28.0
|
|
416
|
+
|
|
417
|
+
## 0.27.0
|
|
418
|
+
|
|
419
|
+
### Minor Changes
|
|
420
|
+
|
|
421
|
+
- d8341b2: Свои данные чата (`chat.data`) и защита таблиц SQLite. Приложения без новых опций работают как раньше: `subjectData` остался и равен `data`.
|
|
422
|
+
|
|
423
|
+
- **`chat.data`** — JSON-объект до 16 КБ у любого чата (раньше такие данные были только у чатов объектов). Лежит в том же столбце `subject_data`: миграции нет, старые данные чатов объектов уже читаются как `data`. В браузер и в запрос к модели данные не уходят: кэш модели не меняется.
|
|
424
|
+
- **Новый чат:** `service.createChat(userId, { data })`. Из браузера: `createChatServer({ newChatData: ({ user, request }) => data })` — данные ставит сервер, браузер их не присылает. Вернули не объект — 500. Хранилище без `updateChatData` с `newChatData` — ошибка при создании обработчика; `createChat({ data })` на таком хранилище — та же понятная ошибка, данные молча не теряются.
|
|
425
|
+
- **Правка:** `service.updateChatData(userId, chatId, patch)` — сливает верхние ключи (ключ со значением `undefined` удаляется, `null` остаётся значением). Итог больше 16 КБ — `TypeError`, данные не меняются. Возвращает новые данные. Правка атомарная: две одновременные правки разных ключей не затирают друг друга. Новое значение видно со следующего хода. Верхний ключ `__proto__` в данных, правке и фильтре не принимается (`TypeError`): иначе значение тихо пропало бы при слиянии.
|
|
426
|
+
- **Список:** `service.listChats(userId, { data: { formId: "f1", mode: "test" } })` — чаты, у которых все указанные верхние ключи равны значениям. Значения только строка, число, булево или `null` (иначе `TypeError`); `1` и `"1"` — разные значения. Можно вместе с `subjects`. SQLite ищет через `json_each`, PostgreSQL — через `jsonb @>`.
|
|
427
|
+
- **Кто видит данные:** `beforeTurn` и `chatInstructions` — `chat.data`; инструменты — `model.chat.data` (в том числе при сжатии и у фоновых помощников); `afterTurn` — `turn.chatData` (данные на момент итога: правка посреди хода видна, и итог после перезапуска даёт то же). `chatCapabilities`, проверка виджета и `stepContext` получают `Chat` и тоже видят `data`.
|
|
428
|
+
- **Событие `chat-data-changed { ownerId, chatId }`** (без данных) для `onChatEvent`. Вкладке браузера оно не пересылается.
|
|
429
|
+
- **Своё хранилище:** добавьте необязательный метод `updateChatData(chatId, patch, { maxBytes })` (одна атомарная операция, возвращает чат или `null`; больше предела — `ChatDataTooLargeError`), `listChats(ownerId, { subjects?, data? })` и запись/чтение `data` (у старого кода — `subjectData`). Без `updateChatData` служба отвечает понятной ошибкой на `updateChatData` и `listChats({ data })`. Проверка — `describeChatStorageContract(…, { chatData: "required" })`.
|
|
430
|
+
- **Песочница:** в копии чата человека инструменты и `afterTurn` видят данные исходного чата, а не служебную обёртку копии; это верно и для обычного чата без ключа объекта (`subject` у него по-прежнему нет).
|
|
431
|
+
- **SQLite: защита от чужих таблиц.** Таблицы SDK не переименованы: SDK должен жить в своём файле. При открытии, до миграций, SDK смотрит, нет ли в файле чужих `chats` или `messages` (журнал миграций SDK не знает их). Тогда `createSqliteChatStorage` бросает `ForeignChatTablesError` с текстом «дайте SDK отдельный файл», файл не тронут. Если у приложения свои `chats`/`messages` в том же файле — укажите SDK другой `filePath`. Раздел «Где лежат данные SDK» — в README хранилищ.
|
|
432
|
+
- 5e4ed28: **Что может сломаться:**
|
|
433
|
+
|
|
434
|
+
- исчерпывающий `switch` по виду ошибки сервера (`HandlerErrorKind`) и виду отказа на экране (`AppRefusalKind`): новые значения `action_forbidden`, `chat_closed`, `chat_creation_refused`;
|
|
435
|
+
- исчерпывающий `switch` по причине `turnNotStarted` (`TurnNotStartedReason`): новое значение `chat_closed`;
|
|
436
|
+
- свой словарь надписей `ChatLabels`, собранный целиком: новое обязательное поле `chatListClosed`.
|
|
437
|
+
|
|
438
|
+
Права человека в чате и закрытый чат. Приложение функцией `chatCapabilities` решает, что можно человеку: правка, «Переделать», «Повторить», ветки, выбор модели, правка ответа, список чатов, сжатие, файлы, голос. Чат можно закрыть из инструмента (`model.closeChat`) или из кода (`service.closeChat`, `reopenChat`): переписка видна, писать дальше нельзя. Хук `beforeCreateChat` решает, можно ли человеку завести новый чат. Без новых настроек всё работает как раньше. Подробно — [docs/in-product-agent.md](https://github.com/ykurilov/agent-chat-sdk/blob/main/docs/in-product-agent.md), разделы 9, 10 и 11.
|
|
439
|
+
|
|
440
|
+
- Права: опечатка в названии права (`edits` вместо `edit`) — ошибка приложения (`TypeError`), а не молчаливый доступ. За один вызов службы права спрашиваются не больше раза.
|
|
441
|
+
- Закрытие побеждает паузу: если чат закрыт, пока ответ ждёт подтверждения или виджета, ждущие запросы закрываются отказом, как при «Стопе», и ответ считается законченным.
|
|
442
|
+
- Закрытие из инструмента записывается сразу при вызове: после падения сервера чат уже закрыт. Чат, закрытый во время проверки перед ходом, хода не начинает: 409 `chat_closed`, резерв приложения закрывается `turnNotStarted` с причиной `chat_closed`.
|
|
443
|
+
- Новый чат: `beforeCreateChat({ userId, origin? })` вернул `{ code, message }` — `POST {base}` отвечает `403 { error: { kind: "chat_creation_refused", code, message } }`, мессенджер (`/new`, первый чат) — текстом. Чаты объектов и импорт хук не спрашивают.
|
|
444
|
+
- `listChats` отдаёт `closed`: на экране и в `/chats` мессенджера у закрытого чата пометка.
|
|
445
|
+
- Сервер: запрещённое действие — `403 { error: { kind: "action_forbidden", action, code, message } }`, закрытый чат — `409 { error: { kind: "chat_closed", code, message } }`. Мессенджеры отвечают человеку текстом.
|
|
446
|
+
- Мессенджеры: голосовое при `voice: false` и файлы при `attachments: false` не скачиваются и не распознаются, `/chats` смотрит на `chatList`. Своя служба может реализовать необязательный `assertCapability`.
|
|
447
|
+
- Песочница: закрытие работает как в бою, а кнопка «Открыть чат снова» (`POST {sandboxBase}/chats/:chatId/reopen`, только админ) позволяет продолжить тест. Скину песочницы — необязательный `SandboxSkin.ChatReopen`, надписи `SandboxLabels.chatReopen` (необязательные); в Тандеме кнопка своя.
|
|
448
|
+
- Экран: кнопки по правам прячутся сами, после ответа 403 `action_forbidden` права перечитываются, закрытый чат блокирует поле и показывает текст закрытия. Голосовое сообщение при `voice: false` не уходит. Новое:
|
|
449
|
+
- `AppRefusalKind` — `chat_creation_refused`; `useChatList` — `onCreateRefused` и `creationRefusal`, `ChatWorkspace` отдаёт отказ в `onTurnRefused`;
|
|
450
|
+
- `ChatListEntry.closed` и `ChatListItemView.closed` — пометка закрытого чата в списке, надпись `chatListClosed` («Закрыт», обязательное поле `ChatLabels`);
|
|
451
|
+
- `reloadKey` у `AgentChat`, `useAgentChat` и `ChatWorkspace` — перечитать историю, когда чат изменили не через экран;
|
|
452
|
+
- `onChatUnavailable` у `AgentChat` — служебный колбэк для `ChatWorkspace`, приложению не нужен;
|
|
453
|
+
- `ChatWorkspace` при `chatList: false` не мигает списком: он появляется после первой истории (и при `chatList: true` — тоже с этой короткой задержкой) и потом не запрашивается;
|
|
454
|
+
- `onTurnRefused` получает новые виды отказов, `onChatAccessChange` сообщает права и закрытие, `ChatWorkspace` при `chatList: false` показывает только чат.
|
|
455
|
+
- Скин: договор v20 — необязательный `ChatClosedNotice` и необязательный `list` у `ChatListSkin.ChatWorkspace` ([docs/skin-v20.md](https://github.com/ykurilov/agent-chat-sdk/blob/main/docs/skin-v20.md)). Скин v19 работает без правок. В Тандеме — `TandemChatClosedNotice`.
|
|
456
|
+
- Хранилища: колонка `closed` у чатов, миграция SQLite и PostgreSQL применяется сама. Своё хранилище может реализовать необязательный `setChatClosed(chatId, closed | null)` и отдавать `closed` в `getChat`; общий тест — `describeChatStorageContract(…, { chatClosure: "required" })`.
|
|
457
|
+
|
|
458
|
+
### Как обновить приложение
|
|
459
|
+
|
|
460
|
+
1. Найдите в коде приложения исчерпывающие `switch` по виду ошибки сервера чата, по `refusal.kind` из `onTurnRefused` и по `reason` в `turnNotStarted`. Искать: `kind: "turn_refused"`, `case "turn_refused"`, `case "access_refused"`, `HandlerErrorKind`, `AppRefusalKind`, `TurnNotStartedReason`, `case "busy"`.
|
|
461
|
+
2. Добавьте ветки для новых видов:
|
|
462
|
+
|
|
463
|
+
Было:
|
|
464
|
+
|
|
465
|
+
```ts
|
|
466
|
+
switch (refusal.kind) {
|
|
467
|
+
case "turn_refused": return showLessonClosed(refusal.message);
|
|
468
|
+
case "access_refused": return showNoAccess(refusal.message);
|
|
469
|
+
default: { const never: never = refusal.kind; return never; }
|
|
470
|
+
}
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
Стало:
|
|
474
|
+
|
|
475
|
+
```ts
|
|
476
|
+
switch (refusal.kind) {
|
|
477
|
+
case "turn_refused": return showLessonClosed(refusal.message);
|
|
478
|
+
case "access_refused": return showNoAccess(refusal.message);
|
|
479
|
+
case "chat_closed":
|
|
480
|
+
case "action_forbidden": return; // чат уже показал текст сам
|
|
481
|
+
case "chat_creation_refused": return showToast(refusal.message);
|
|
482
|
+
default: { const never: never = refusal.kind; return never; }
|
|
483
|
+
}
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
В `switch` по `reason` в `turnNotStarted` добавьте `case "chat_closed":` рядом с `case "busy":`: резерв снимается так же.
|
|
487
|
+
|
|
488
|
+
3. Свой словарь `ChatLabels`, собранный целиком (не поверх `russianChatLabels`): добавьте `chatListClosed: "Закрыт"`.
|
|
489
|
+
4. Своё хранилище чата (не SQLite и не PostgreSQL из SDK): если нужен закрытый чат, реализуйте `setChatClosed` и отдавайте `closed` в `getChat`. Без этого `closeChat` бросает ошибку, а инструменты не получают `model.closeChat`.
|
|
490
|
+
5. Проверка: `pnpm typecheck` проходит, чат открывается и отвечает.
|
|
491
|
+
|
|
492
|
+
Заметка к 0.28: закрытие станет записью хода, и правка, «Переделать» и ветки в закрытом чате станут возможны. Чтобы сохранить нынешнее поведение, задайте права: `chatCapabilities: ({ chat }) => chat.closed ? { edit: false, regenerate: false, branches: false } : {}`.
|
|
493
|
+
|
|
494
|
+
### Patch Changes
|
|
495
|
+
|
|
496
|
+
- Updated dependencies [d8341b2]
|
|
497
|
+
- Updated dependencies [5e4ed28]
|
|
498
|
+
- Updated dependencies [e0bb519]
|
|
499
|
+
- @ykurilov/agent-chat-core@0.27.0
|
|
500
|
+
- @ykurilov/agent-chat-server@0.27.0
|
|
501
|
+
- @ykurilov/agent-chat-react@0.27.0
|
|
502
|
+
|
|
503
|
+
## 0.26.2
|
|
504
|
+
|
|
505
|
+
### Patch Changes
|
|
506
|
+
|
|
507
|
+
- Updated dependencies [f24858a]
|
|
508
|
+
- @ykurilov/agent-chat-core@0.26.2
|
|
509
|
+
- @ykurilov/agent-chat-server@0.26.2
|
|
510
|
+
- @ykurilov/agent-chat-react@0.26.2
|
|
511
|
+
|
|
512
|
+
## 0.26.1
|
|
513
|
+
|
|
514
|
+
### Patch Changes
|
|
515
|
+
|
|
516
|
+
- Updated dependencies [5b52515]
|
|
517
|
+
- @ykurilov/agent-chat-react@0.26.1
|
|
518
|
+
- @ykurilov/agent-chat-core@0.26.1
|
|
519
|
+
- @ykurilov/agent-chat-server@0.26.1
|
|
520
|
+
|
|
521
|
+
## 0.26.0
|
|
522
|
+
|
|
523
|
+
### Minor Changes
|
|
524
|
+
|
|
525
|
+
- eb43e47: Пределы хода и честная остановка сервера. Без новых опций запрос к модели прежний. Поменялось одно: `flush()` теперь
|
|
526
|
+
закрывает идущие ответы как «Стоп», а не оставляет их «идущими» до следующего старта.
|
|
527
|
+
|
|
528
|
+
- **Общий срок хода** — `agent.turnTimeoutMs`: число мс или `{ default?, byModel? }`. Срок вышел — ход останавливается,
|
|
529
|
+
как по «Стопу»: написанное цело, `status: "stopped"`, а `afterTurn` получает `stopReason: "timeout"`. «Стоп» человека —
|
|
530
|
+
`stopReason: "user"`, остановка сервера — `"shutdown"`. 0 или `Infinity` — без срока. Иначе от 1000 до 2³¹−1. Модель из
|
|
531
|
+
`byModel`, которой нет в каталоге, — ошибка при создании службы. Не задано — без срока. Срок считается до записи итога:
|
|
532
|
+
`afterTurn` записанного ответа он не обрывает.
|
|
533
|
+
- **Предел токенов ответа** — `agent.maxOutputTokens`: целое от 1 или `{ default?, byModel? }`. Уходит провайдеру в каждом
|
|
534
|
+
запросе к модели (в каждом шаге хода). Ответ упёрся — `afterTurn` получает `lengthCut: true`. Не задано — предела в
|
|
535
|
+
запросе нет, кэш модели не меняется.
|
|
536
|
+
- **`turnNotStarted`** — новый хук службы и `createChatHandler`: `({ userId, chat, action, messageId?, text?, reason })`. Он
|
|
537
|
+
зовётся, когда `beforeTurn` пропустил ход, а ход не начался. Причины: `busy`, `too_many_turns`, `spending_limit`,
|
|
538
|
+
`duplicate_message`, `invalid`, `no_turn`, `error`. Каждый пропуск `beforeTurn` закрывается ровно одним: `afterTurn`
|
|
539
|
+
начатого хода или `turnNotStarted`. Так резерв приложения больше не повисает. Ответ клиенту прежний (409, 429…), бросок
|
|
540
|
+
хука уходит в `logError`. Порядок проверок прежний: отказ приложения (403) по-прежнему приходит раньше «занято» (409).
|
|
541
|
+
- **`beforeTurn` получает `messageId`** — id сообщения человека у `send` и `edit`.
|
|
542
|
+
- **`flush({ waitForAnswersMs })`** у службы, `createChatHandler` и песочницы. Пока идёт остановка, новые ходы не
|
|
543
|
+
начинаются: чат занят. Идущие ответы ждутся до срока (по умолчанию 0). Не успевшие закрываются как «Стоп»: написанное
|
|
544
|
+
записывается, обрывков нет, `afterTurn` видит `stopReason: "shutdown"`. `flush` возвращается, когда все ответы записаны и
|
|
545
|
+
хуки `afterTurn` (в своём сроке), сжатие, память и фон закончены. Только после этого можно закрывать хранилище. Неверный
|
|
546
|
+
срок — `TypeError`. Остановленный ход, который за 10 с так и не записал итог (база висит), `flush` больше не ждёт:
|
|
547
|
+
строка в `logError`, ответ прервёт восстановление при следующем старте. Не прошла конечная запись — ответ помечен
|
|
548
|
+
брошенным, и любая копия прерывает его сразу, без ожидания порога.
|
|
549
|
+
- Новые типы: `TurnTimeoutSetting`, `MaxOutputTokensSetting`, `TurnNotStartedHandler`, `TurnNotStartedReason`,
|
|
550
|
+
`TurnStopReason`, `FlushOptions`. В `TurnResult` — `stopReason?`, `lengthCut?`.
|
|
551
|
+
|
|
552
|
+
### Как обновить приложение
|
|
553
|
+
|
|
554
|
+
1. Остановка сервера (обработчик `SIGTERM`, где зовётся `chat.flush()`): дайте ответам доработать.
|
|
555
|
+
|
|
556
|
+
Было:
|
|
557
|
+
|
|
558
|
+
```ts
|
|
559
|
+
server.close();
|
|
560
|
+
await chat.flush();
|
|
561
|
+
await storage.close();
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
Стало:
|
|
565
|
+
|
|
566
|
+
```ts
|
|
567
|
+
server.close();
|
|
568
|
+
await chat.flush({ waitForAnswersMs: 20_000 }); // ждёт ответы и afterTurn; не успевшие — «Стоп» с записью
|
|
569
|
+
await storage.close();
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
Без опций `flush()` тоже работает, но идущие ответы останавливаются сразу (`status: "stopped"`, раньше они становились
|
|
573
|
+
`interrupted` при следующем старте). Если приложение ждало `interrupted` после остановки, ждите `stopped` со
|
|
574
|
+
`stopReason: "shutdown"`.
|
|
575
|
+
2. Если `beforeTurn` резервирует что-то (попытку, деньги), снимайте резерв в `turnNotStarted`. Связать резерв с ходом
|
|
576
|
+
удобно по `messageId`:
|
|
577
|
+
|
|
578
|
+
```ts
|
|
579
|
+
beforeTurn: async ({ userId, messageId }) => { await reserveAttempt(userId, messageId); },
|
|
580
|
+
turnNotStarted: async ({ userId, messageId }) => { await releaseAttempt(userId, messageId); },
|
|
581
|
+
```
|
|
582
|
+
3. По желанию задайте пределы хода в `agent`:
|
|
583
|
+
|
|
584
|
+
```ts
|
|
585
|
+
agent: { turnTimeoutMs: 180_000, maxOutputTokens: { default: 4_000, byModel: { "deepseek-4.1-flash": 2_000 } } },
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
В `afterTurn` отличайте `stopReason` (`user` / `timeout` / `shutdown`) и `lengthCut`.
|
|
589
|
+
4. Проверка: `pnpm typecheck` проходит. Остановите сервер посреди ответа: в базе ответ `stopped`, а `afterTurn` получил
|
|
590
|
+
`stopReason: "shutdown"`.
|
|
591
|
+
|
|
592
|
+
### Patch Changes
|
|
593
|
+
|
|
594
|
+
- Updated dependencies [eb43e47]
|
|
595
|
+
- @ykurilov/agent-chat-core@0.26.0
|
|
596
|
+
- @ykurilov/agent-chat-server@0.26.0
|
|
597
|
+
- @ykurilov/agent-chat-react@0.26.0
|
|
598
|
+
|
|
599
|
+
## 0.25.0
|
|
600
|
+
|
|
601
|
+
### Patch Changes
|
|
602
|
+
|
|
603
|
+
- Updated dependencies [99d426e]
|
|
604
|
+
- Updated dependencies [d8201f6]
|
|
605
|
+
- @ykurilov/agent-chat-core@0.25.0
|
|
606
|
+
- @ykurilov/agent-chat-server@0.25.0
|
|
607
|
+
- @ykurilov/agent-chat-react@0.25.0
|
|
608
|
+
|
|
609
|
+
## 0.24.0
|
|
610
|
+
|
|
611
|
+
### Minor Changes
|
|
612
|
+
|
|
613
|
+
- 9b895cd: Ломает приложения: только исчерпывающие `switch` по видам ошибок сервера и событиям чата (новые значения) и код, который
|
|
614
|
+
сам читает ответ `resolveUser`. Без новых настроек поведение прежнее.
|
|
615
|
+
|
|
616
|
+
Агент внутри продукта: агент работает с объектами приложения — уроком, заказом, документом. Всё по желанию; без новых
|
|
617
|
+
настроек запрос к модели не меняется ни на байт. Подробно — `docs/in-product-agent.md`.
|
|
618
|
+
|
|
619
|
+
- **Проверка перед ходом.** `beforeTurn({ userId, chat, action, text? })` отказывает своими словами: 403 `turn_refused`
|
|
620
|
+
до любых записей и лимитов, на отправке, правке, повторе, переделке, подтверждении, виджете, служебных сообщениях, фоновой
|
|
621
|
+
задаче и в мессенджерах. `resolveUser` может вернуть `{ refused: { code, message, status? } }` → `access_refused` на всех
|
|
622
|
+
адресах чата, голоса, голосового режима (WebSocket 4401) и мессенджеров. React: `onTurnRefused`, текст отказа вместо «нет
|
|
623
|
+
связи», сообщение возвращается в поле. Ручная проверка — `service.assertTurnAllowed`.
|
|
624
|
+
- **Итог хода.** `afterTurn(turn)` после каждого хода с повторами и сроком (`afterTurnAttempts`, `afterTurnTimeoutMs`),
|
|
625
|
+
переживает перезапуск сервера. `TurnResult`: владелец и автор хода, текст, части, расход, действие, канал, объект,
|
|
626
|
+
сотрудник. События приложения `{ type, data? }` — из хука, из инструмента (`model.emitAppEvent`) и вне хода
|
|
627
|
+
(`service.publishAppEvent`); в React `appEvents` и `onAppEvent`, события переживают перезагрузку. Модели не уходят.
|
|
628
|
+
- **Чат объекта.** Ключ и данные объекта у чата, один чат на ключ у человека: `service.openSubjectChat`, на сервере
|
|
629
|
+
`subjectChats` (`POST …/subject`), в React `<AgentChat subject="lesson:42" />`. Данные объекта видят `beforeTurn`,
|
|
630
|
+
инструменты (`model.subject`) и `afterTurn`; в браузер и модели не уходят.
|
|
631
|
+
- **Приветствие.** `greeting: { text }` — первое сообщение от агента без вызова модели. Проверено на всех моделях каталога.
|
|
632
|
+
- **Лимит сообщений.** Окно лимитов с `limitMessages` вместо `limitUsd`, `exemptUsers` — люди без лимитов,
|
|
633
|
+
`onMessageThreshold` — пороги. Отказ — 429 с `unit: "messages"`.
|
|
634
|
+
- **Импорт старой переписки.** `service.importChat({ ownerId, chat, messages })` с датами и картинками
|
|
635
|
+
(`attachments.importFile`), без хода, памяти, расхода и лимитов.
|
|
636
|
+
- **Сотрудник проверяет чат человека.** Песочница с опцией `people`: админ видит чаты человека только на чтение и
|
|
637
|
+
проверяет ответы в копии у себя. Память человека в копии только читается, расход — на админа, человек ничего не видит.
|
|
638
|
+
Инструменты приложения получают `model.staff` и в копии в данные человека не пишут.
|
|
639
|
+
- **Свои кнопки у поля ввода.** `composerActions` с помощником `{ value, setValue, send, addFiles, busy, blocked, canSend }`.
|
|
640
|
+
Договор скина v19: `Composer.actions`; скин v18 работает без кнопок, Тандем готов.
|
|
641
|
+
- **Хранилища.** Миграции применяются сами: SQLite `0015`, PostgreSQL `0014` (ключ объекта, состояние хука итога).
|
|
642
|
+
|
|
643
|
+
### Что может сломаться
|
|
644
|
+
|
|
645
|
+
- **Исчерпывающие `switch` по закрытым спискам.** Новые значения: вид ошибки сервера `turn_refused` и `access_refused`
|
|
646
|
+
(`HandlerErrorKind`), события чата `after-turn-failed` и `app-event` (`ChatEvent`), `unit` у отказа лимита. Добавьте ветки
|
|
647
|
+
и надписи.
|
|
648
|
+
- **Список чатов без чатов объектов.** `listChats` и `GET {basePath}` по умолчанию не показывают чаты с ключом объекта.
|
|
649
|
+
Касается только приложений, которые начнут ими пользоваться; показать — `chatList: { subjectChats: true }` или
|
|
650
|
+
`listChats(userId, { subjects: "include" })`.
|
|
651
|
+
- **Свой `resolveUser` в обёртках.** Тип ответа — `ResolvedUser` (`{ id } | { refused } | null`). Код, который сам вызывает
|
|
652
|
+
`resolveUser` и читает `.id`, сначала проверяет `"refused" in user`.
|
|
653
|
+
- **Своё хранилище.** Для новых возможностей нужны необязательные методы (`findChatBySubject`, `importChat`,
|
|
654
|
+
`setAfterTurnState`, `listPendingAfterTurn`); без них эти возможности при включении дают ошибку при старте, остальное
|
|
655
|
+
работает. `listChats(ownerId, options?)` получил второй параметр — чаты с ключом скрывать по умолчанию.
|
|
656
|
+
- **Свой `ChatService`** (заглушки в тестах) добавляет новые методы: `openSubjectChat`, `importChat`, `assertTurnAllowed`, `peekHistory`,
|
|
657
|
+
`publishAppEvent`.
|
|
658
|
+
- **Своя реализация `SpendingLimits`** может добавить `takeMessage` — без него сообщения не считаются.
|
|
659
|
+
- **`AgentChat`: `chatId` стал необязательным** — нужен ровно один из `chatId` и `subject`; ни одного или оба — ошибка при
|
|
660
|
+
рендере. При смене `chatId` чат пересоздаётся: черновик и состояние прошлого чата не переносятся.
|
|
661
|
+
- **Окна лимитов: `limitUsd` стал необязательным** (у окна сообщений его нет). Код, который читает свои окна, проверяет
|
|
662
|
+
`limitMessages`.
|
|
663
|
+
- **Отказ сервера в React** (`ServerRefusal`) получил `kind` и `code`. 401 со словами приложения (`access_refused`) — это
|
|
664
|
+
отказ, а не «вход истёк».
|
|
665
|
+
- **«Пустой чат»** для «Нового чата»: чат объекта пустым не считается, обычный чат с одним приветствием — считается.
|
|
666
|
+
- Новый подпуть `@ykurilov/agent-chat-core/access` — помощники отказа в доступе для своих обработчиков.
|
|
667
|
+
|
|
668
|
+
### Как обновить приложение
|
|
669
|
+
|
|
670
|
+
1. `pnpm up "@ykurilov/agent-chat-*@^0.24.0"`. Миграции базы применяются сами при открытии хранилища.
|
|
671
|
+
2. Исчерпывающие `switch` по `HandlerErrorKind` (сервер) и `ChatEvent` (`chatEvents` ядра): найдите их поиском и добавьте
|
|
672
|
+
ветки `turn_refused`, `access_refused`, `after-turn-failed`, `app-event`. Обязательных надписей не прибавилось: текст
|
|
673
|
+
отказа приходит с сервера. Свой словарь для лимита сообщений — необязательные `spendingMessagesLeft`,
|
|
674
|
+
`spendingMessagesExhausted`, `editMessageLimit`.
|
|
675
|
+
|
|
676
|
+
Было: `switch (event.type) { case "tasks-changed": … case "notice-added": … default: assertNever(event) }`
|
|
677
|
+
Стало: те же ветки плюс `case "after-turn-failed": case "app-event": break;`
|
|
678
|
+
3. Свой код, который сам зовёт `resolveUser` и читает `.id`: сначала `if (user && "refused" in user) …`.
|
|
679
|
+
4. Ничего больше не нужно, если новые возможности не включать. Чтобы включить — `docs/in-product-agent.md`.
|
|
680
|
+
5. Свой скин: кнопки у поля появятся, когда `Composer` начнёт рисовать `actions` (договор v19, `docs/skin-v19.md`).
|
|
681
|
+
6. Проверка: `pnpm typecheck` без ошибок, чат открывается и отвечает как раньше.
|
|
682
|
+
|
|
683
|
+
### Patch Changes
|
|
684
|
+
|
|
685
|
+
- Updated dependencies [9b895cd]
|
|
686
|
+
- @ykurilov/agent-chat-core@0.24.0
|
|
687
|
+
- @ykurilov/agent-chat-server@0.24.0
|
|
688
|
+
- @ykurilov/agent-chat-react@0.24.0
|
|
689
|
+
|
|
690
|
+
## 0.23.0
|
|
691
|
+
|
|
692
|
+
### Patch Changes
|
|
693
|
+
|
|
694
|
+
- Updated dependencies [30fb729]
|
|
695
|
+
- @ykurilov/agent-chat-react@0.23.0
|
|
696
|
+
- @ykurilov/agent-chat-core@0.23.0
|
|
697
|
+
- @ykurilov/agent-chat-server@0.23.0
|
|
698
|
+
|
|
699
|
+
## 0.22.0
|
|
700
|
+
|
|
701
|
+
### Patch Changes
|
|
702
|
+
|
|
703
|
+
- @ykurilov/agent-chat-core@0.22.0
|
|
704
|
+
- @ykurilov/agent-chat-react@0.22.0
|
|
705
|
+
- @ykurilov/agent-chat-server@0.22.0
|
|
706
|
+
|
|
707
|
+
## 0.21.0
|
|
708
|
+
|
|
709
|
+
### Patch Changes
|
|
710
|
+
|
|
711
|
+
- Updated dependencies [7c3bcc4]
|
|
712
|
+
- @ykurilov/agent-chat-core@0.21.0
|
|
713
|
+
- @ykurilov/agent-chat-server@0.21.0
|
|
714
|
+
- @ykurilov/agent-chat-react@0.21.0
|
|
715
|
+
|
|
716
|
+
## 0.20.0
|
|
717
|
+
|
|
718
|
+
### Patch Changes
|
|
719
|
+
|
|
720
|
+
- Updated dependencies [fd16b01]
|
|
721
|
+
- Updated dependencies [fd16b01]
|
|
722
|
+
- @ykurilov/agent-chat-core@0.20.0
|
|
723
|
+
- @ykurilov/agent-chat-server@0.20.0
|
|
724
|
+
- @ykurilov/agent-chat-react@0.20.0
|
|
725
|
+
|
|
726
|
+
## 0.19.0
|
|
727
|
+
|
|
728
|
+
### Patch Changes
|
|
729
|
+
|
|
730
|
+
- Updated dependencies [fde2297]
|
|
731
|
+
- Updated dependencies [aa0fd51]
|
|
732
|
+
- Updated dependencies [6f26b93]
|
|
733
|
+
- Updated dependencies [9f94dbe]
|
|
734
|
+
- Updated dependencies [2013f15]
|
|
735
|
+
- Updated dependencies [aa0fd51]
|
|
736
|
+
- Updated dependencies [05e258b]
|
|
737
|
+
- Updated dependencies [aa0fd51]
|
|
738
|
+
- @ykurilov/agent-chat-core@0.19.0
|
|
739
|
+
- @ykurilov/agent-chat-server@0.19.0
|
|
740
|
+
- @ykurilov/agent-chat-react@0.19.0
|
|
741
|
+
|
|
742
|
+
## 0.18.6
|
|
743
|
+
|
|
744
|
+
### Patch Changes
|
|
745
|
+
|
|
746
|
+
- @ykurilov/agent-chat-core@0.18.6
|
|
747
|
+
- @ykurilov/agent-chat-react@0.18.6
|
|
748
|
+
- @ykurilov/agent-chat-server@0.18.6
|
|
749
|
+
|
|
750
|
+
## 0.18.5
|
|
751
|
+
|
|
752
|
+
### Patch Changes
|
|
753
|
+
|
|
754
|
+
- Updated dependencies [56b9ab6]
|
|
755
|
+
- @ykurilov/agent-chat-react@0.18.5
|
|
756
|
+
- @ykurilov/agent-chat-core@0.18.5
|
|
757
|
+
- @ykurilov/agent-chat-server@0.18.5
|
|
758
|
+
|
|
759
|
+
## 0.18.4
|
|
760
|
+
|
|
761
|
+
### Patch Changes
|
|
762
|
+
|
|
763
|
+
- 8b1343d: Журнал песочницы на PostgreSQL пишет куски обращения к модели одним запросом. Раньше в длинном чате каждый кусок истории уходил в базу отдельным запросом: 100 сообщений — около 100 походов к базе на одну запись журнала. Теперь запись — горстка запросов при любой длине чата. Приложению ничего делать не нужно.
|
|
764
|
+
- @ykurilov/agent-chat-core@0.18.4
|
|
765
|
+
- @ykurilov/agent-chat-react@0.18.4
|
|
766
|
+
- @ykurilov/agent-chat-server@0.18.4
|
|
767
|
+
|
|
768
|
+
## 0.18.3
|
|
769
|
+
|
|
770
|
+
### Patch Changes
|
|
771
|
+
|
|
772
|
+
- Updated dependencies [ce3c26f]
|
|
773
|
+
- @ykurilov/agent-chat-react@0.18.3
|
|
774
|
+
- @ykurilov/agent-chat-core@0.18.3
|
|
775
|
+
- @ykurilov/agent-chat-server@0.18.3
|
|
776
|
+
|
|
777
|
+
## 0.18.2
|
|
778
|
+
|
|
779
|
+
### Patch Changes
|
|
780
|
+
|
|
781
|
+
- Updated dependencies [7e7e966]
|
|
782
|
+
- @ykurilov/agent-chat-react@0.18.2
|
|
783
|
+
- @ykurilov/agent-chat-core@0.18.2
|
|
784
|
+
- @ykurilov/agent-chat-server@0.18.2
|
|
785
|
+
|
|
786
|
+
## 0.18.1
|
|
787
|
+
|
|
788
|
+
### Patch Changes
|
|
789
|
+
|
|
790
|
+
- Updated dependencies [179ad9d]
|
|
791
|
+
- @ykurilov/agent-chat-react@0.18.1
|
|
792
|
+
- @ykurilov/agent-chat-core@0.18.1
|
|
793
|
+
- @ykurilov/agent-chat-server@0.18.1
|
|
794
|
+
|
|
795
|
+
## 0.18.0
|
|
796
|
+
|
|
797
|
+
### Minor Changes
|
|
798
|
+
|
|
799
|
+
- 43d7ebe: Песочница агента для админа: новый пакет `@ykurilov/agent-chat-sandbox`. Админ говорит с боевым агентом и видит журнал:
|
|
800
|
+
каждое обращение к модели (что ушло, что пришло, токены, кэш, цена) и каждый вызов инструмента. Любое сообщение можно
|
|
801
|
+
поправить (текст и результаты обычных инструментов), правка создаёт ветку. Модель и системная инструкция меняются для одного
|
|
802
|
+
чата, боевые не трогаются. Память в песочнице только на чтение.
|
|
803
|
+
|
|
804
|
+
- сервер: `createSandboxHandler({ chat, isAdmin, journal })`, журнал `createSqliteSandboxJournal` (`/sqlite`) или
|
|
805
|
+
`createPostgresSandboxJournal` (`/postgres`, схема `agent_chat`), хранится 30 дней; не админ получает 404 на любом адресе;
|
|
806
|
+
- страница: `AgentSandbox` из `@ykurilov/agent-chat-sandbox/react`, готовый скин `tandemSandboxSkin`;
|
|
807
|
+
- `createChatServer` — новый экспорт server (на нём стоят и боевой, и песочный обработчик);
|
|
808
|
+
- core: `turnObserver`, `chatInstructions`, `lockedToolOutputs`, `editAnswer`; боевой запрос к модели остаётся прежним побайтно;
|
|
809
|
+
- договор скина чата версии 15: необязательные `AgentMessage.onEdit/edited` и `ToolCallRow.outputEdited`; новые надписи
|
|
810
|
+
`answerEdited`, `toolOutputEdited`, `editAnswer`; договор скина песочницы `SandboxSkin` версии 1.
|
|
811
|
+
|
|
812
|
+
Подробно: `docs/sandbox.md`.
|
|
813
|
+
|
|
814
|
+
### Как обновить приложение
|
|
815
|
+
|
|
816
|
+
Обычному приложению делать ничего не нужно: песочница включается отдельно, миграций боевой базы нет (таблицы `sandbox_*` создаёт
|
|
817
|
+
сам журнал).
|
|
818
|
+
|
|
819
|
+
1. Полный словарь надписей, написанный вручную без `{ ...russianLabels }`, — добавьте `answerEdited`, `toolOutputEdited`, `editAnswer`.
|
|
820
|
+
2. Свой скин версии 14 работает без правок; чтобы показать «изменено» и кнопку правки, реализуйте необязательные части версии 15.
|
|
821
|
+
3. Своя реализация сервера поверх `createChatHandler` продолжает работать; для песочницы возьмите `createChatServer`.
|
|
822
|
+
4. Проверка: `pnpm typecheck`, затем в чате отправить сообщение и получить ответ.
|
|
823
|
+
|
|
824
|
+
### Patch Changes
|
|
825
|
+
|
|
826
|
+
- Updated dependencies [43d7ebe]
|
|
827
|
+
- @ykurilov/agent-chat-core@0.18.0
|
|
828
|
+
- @ykurilov/agent-chat-server@0.18.0
|
|
829
|
+
- @ykurilov/agent-chat-react@0.18.0
|