@ykurilov/agent-chat-background 0.0.0-stage → 0.56.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 +376 -0
- package/LICENSE +21 -0
- package/README.md +92 -2
- package/dist/chunk-4RA3JT6K.js +9 -0
- package/dist/chunk-4RA3JT6K.js.map +1 -0
- package/dist/chunk-4XFSUFM6.js +53 -0
- package/dist/chunk-4XFSUFM6.js.map +1 -0
- package/dist/index.js +756 -0
- package/dist/index.js.map +1 -0
- package/dist/labels.js +14 -0
- package/dist/labels.js.map +1 -0
- package/dist/postgres.js +212 -0
- package/dist/postgres.js.map +1 -0
- package/dist/sqlite.js +184 -0
- package/dist/sqlite.js.map +1 -0
- package/dist/types/background-tasks.d.ts +18 -0
- package/dist/types/background-tool.d.ts +16 -0
- package/dist/types/helper-task.d.ts +17 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/keyed-lock.d.ts +3 -0
- package/dist/types/labels.d.ts +10 -0
- package/dist/types/postgres.d.ts +9 -0
- package/dist/types/sqlite.d.ts +8 -0
- package/dist/types/store/memory.d.ts +3 -0
- package/dist/types/store/migration-settings.d.ts +4 -0
- package/dist/types/store/postgres-schema.d.ts +406 -0
- package/dist/types/store/postgres.d.ts +12 -0
- package/dist/types/store/sqlite-schema.d.ts +431 -0
- package/dist/types/store/sqlite.d.ts +6 -0
- package/dist/types/store/task-store.d.ts +23 -0
- package/dist/types/task-delivery.d.ts +24 -0
- package/dist/types/task-runner.d.ts +51 -0
- package/dist/types/task-tools.d.ts +13 -0
- package/dist/types/types.d.ts +97 -0
- package/drizzle/postgres/0000_init.sql +28 -0
- package/drizzle/postgres/0001_delivery_key.sql +1 -0
- package/drizzle/postgres/meta/0000_snapshot.json +229 -0
- package/drizzle/postgres/meta/0001_snapshot.json +235 -0
- package/drizzle/postgres/meta/_journal.json +20 -0
- package/drizzle/sqlite/0000_init.sql +28 -0
- package/drizzle/sqlite/0001_delivery_key.sql +1 -0
- package/drizzle/sqlite/meta/0000_snapshot.json +208 -0
- package/drizzle/sqlite/meta/0001_snapshot.json +215 -0
- package/drizzle/sqlite/meta/_journal.json +20 -0
- package/package.json +75 -3
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
# @ykurilov/agent-chat-background
|
|
2
|
+
|
|
3
|
+
## 0.56.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [24c313e]
|
|
8
|
+
- @ykurilov/agent-chat-core@0.56.0
|
|
9
|
+
|
|
10
|
+
## 0.55.0
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- Updated dependencies [51f7b38]
|
|
15
|
+
- Updated dependencies [cdc7dd7]
|
|
16
|
+
- @ykurilov/agent-chat-core@0.55.0
|
|
17
|
+
|
|
18
|
+
## 0.54.0
|
|
19
|
+
|
|
20
|
+
### Patch Changes
|
|
21
|
+
|
|
22
|
+
- Updated dependencies [fa90219]
|
|
23
|
+
- @ykurilov/agent-chat-core@0.54.0
|
|
24
|
+
|
|
25
|
+
## 0.53.0
|
|
26
|
+
|
|
27
|
+
### Patch Changes
|
|
28
|
+
|
|
29
|
+
- Updated dependencies [b6a7786]
|
|
30
|
+
- @ykurilov/agent-chat-core@0.53.0
|
|
31
|
+
|
|
32
|
+
## 0.52.0
|
|
33
|
+
|
|
34
|
+
### Patch Changes
|
|
35
|
+
|
|
36
|
+
- @ykurilov/agent-chat-core@0.52.0
|
|
37
|
+
|
|
38
|
+
## 0.51.0
|
|
39
|
+
|
|
40
|
+
### Patch Changes
|
|
41
|
+
|
|
42
|
+
- b199ebe: Две копии сервера на медленной базе больше не выполняют одну фоновую задачу дважды.
|
|
43
|
+
|
|
44
|
+
- Подбор брошенных задач идёт в копии по одному: обход по таймеру, начатый посреди `recover()`, раньше брал ту же
|
|
45
|
+
задачу второй раз (свою аренду копия берёт снова) и запускал её дважды.
|
|
46
|
+
- Аренда задачи считается от её взятия, а не от начала обхода: задача, взятая в конце долгого обхода, уже не приходит
|
|
47
|
+
с истёкшей арендой, которую тут же перехватывает другая копия.
|
|
48
|
+
- Продление аренд идёт отдельно от доставки и подбора и не ждёт их: долгий подбор больше не даёт аренде идущей задачи
|
|
49
|
+
истечь.
|
|
50
|
+
|
|
51
|
+
Как обновить: поднять версию. Настроек и миграций нет.
|
|
52
|
+
- Updated dependencies [41b1726]
|
|
53
|
+
- @ykurilov/agent-chat-core@0.51.0
|
|
54
|
+
|
|
55
|
+
## 0.50.0
|
|
56
|
+
|
|
57
|
+
### Patch Changes
|
|
58
|
+
|
|
59
|
+
- @ykurilov/agent-chat-core@0.50.0
|
|
60
|
+
|
|
61
|
+
## 0.49.0
|
|
62
|
+
|
|
63
|
+
### Patch Changes
|
|
64
|
+
|
|
65
|
+
- Updated dependencies [084cef7]
|
|
66
|
+
- @ykurilov/agent-chat-core@0.49.0
|
|
67
|
+
|
|
68
|
+
## 0.48.0
|
|
69
|
+
|
|
70
|
+
### Patch Changes
|
|
71
|
+
|
|
72
|
+
- Updated dependencies [fa10d5a]
|
|
73
|
+
- @ykurilov/agent-chat-core@0.48.0
|
|
74
|
+
|
|
75
|
+
## 0.47.0
|
|
76
|
+
|
|
77
|
+
### Patch Changes
|
|
78
|
+
|
|
79
|
+
- Updated dependencies [5a59c33]
|
|
80
|
+
- @ykurilov/agent-chat-core@0.47.0
|
|
81
|
+
|
|
82
|
+
## 0.46.2
|
|
83
|
+
|
|
84
|
+
### Patch Changes
|
|
85
|
+
|
|
86
|
+
- Updated dependencies [3d0d2f2]
|
|
87
|
+
- @ykurilov/agent-chat-core@0.46.2
|
|
88
|
+
|
|
89
|
+
## 0.46.1
|
|
90
|
+
|
|
91
|
+
### Patch Changes
|
|
92
|
+
|
|
93
|
+
- @ykurilov/agent-chat-core@0.46.1
|
|
94
|
+
|
|
95
|
+
## 0.46.0
|
|
96
|
+
|
|
97
|
+
### Patch Changes
|
|
98
|
+
|
|
99
|
+
- Updated dependencies [56d7528]
|
|
100
|
+
- Updated dependencies [a1933fd]
|
|
101
|
+
- Updated dependencies [52cc67d]
|
|
102
|
+
- @ykurilov/agent-chat-core@0.46.0
|
|
103
|
+
|
|
104
|
+
## 0.45.0
|
|
105
|
+
|
|
106
|
+
### Minor Changes
|
|
107
|
+
|
|
108
|
+
- eb74c58: Простой вид работы агента: свойство экрана `workView="simple"` — пока ход идёт, одна живая строка с текущим шагом
|
|
109
|
+
(«Рисую календарь…»); после хода шаги свёрнуты в «Сделано N шагов» со списком понятных фраз, без кода и «Думал N сек».
|
|
110
|
+
По умолчанию `workView="detailed"` — всё как раньше. Фразы задаёт приложение (`stepPhrases`: имя инструмента →
|
|
111
|
+
`{ running, done, failed? }` или функция от вызова); встроенные пакеты дают свои во входе `./labels`
|
|
112
|
+
(`webToolStepPhrases`, `memoryStepPhrases`, `historySearchStepPhrases`, `backgroundStepPhrases`, и английские).
|
|
113
|
+
Договор скина 23: необязательный `ChatSkin.WorkSteps`; скин 22 работает без правок. Подробно — docs/work-view.md.
|
|
114
|
+
|
|
115
|
+
### Как обновить приложение
|
|
116
|
+
|
|
117
|
+
Ничего не требуется. Чтобы включить простой вид:
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
import { webToolStepPhrases } from "@ykurilov/agent-chat-web-tools/labels";
|
|
121
|
+
|
|
122
|
+
<ChatWorkspace
|
|
123
|
+
workView="simple"
|
|
124
|
+
stepPhrases={{
|
|
125
|
+
...webToolStepPhrases,
|
|
126
|
+
write_file: ({ input }) => ((input as { path?: string } | undefined)?.path ? { running: "Пишу файл", done: "Написал файл" } : undefined),
|
|
127
|
+
check_app: { running: "Проверяю приложение", done: "Проверил приложение" },
|
|
128
|
+
}}
|
|
129
|
+
…
|
|
130
|
+
/>;
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Свой скин может нарисовать простой вид сам — `WorkSteps` по docs/work-view.md (`WorkStepsView`: `live` с фразой или
|
|
134
|
+
`done` со `steps`, `count`, `open`). Без него шаги рисуются строкой `ToolCallRow`: «Сделано N шагов» в `title`, входа нет,
|
|
135
|
+
а список понятных фраз приходит в `output` строкой — скин покажет его как обычный результат вызова.
|
|
136
|
+
|
|
137
|
+
### Patch Changes
|
|
138
|
+
|
|
139
|
+
- @ykurilov/agent-chat-core@0.45.0
|
|
140
|
+
|
|
141
|
+
## 0.44.0
|
|
142
|
+
|
|
143
|
+
### Minor Changes
|
|
144
|
+
|
|
145
|
+
- 6a2b5d9: Живые демонстрации: блок ```html-demo в ответе запускается в изолированной рамке (`sandbox="allow-scripts"`, строгий CSP,
|
|
146
|
+
наружу только высота). `agent.liveDemos` на сервере — одна постоянная строка инструкции; `liveDemos` у `AgentChat`,
|
|
147
|
+
`ChatWorkspace` и `AgentPanel`. Договор скина v22: необязательные `AgentText.renderDemo` и `ChatSkin.demoColors`, Тандем
|
|
148
|
+
умеет. Мессенджеры вместо блока пишут `liveDemoOnSite`, если у службы чата `liveDemos` (новое необязательное поле `ChatService.liveDemos`).
|
|
149
|
+
Код живёт в рамке внутри рамки: уйти на чужой адрес он не может, WebRTC убран. Выключатель: в чате с чужим текстом (веб-инструменты, файл человека, инструмент с `metadata: { externalContent: true }`)
|
|
150
|
+
демонстрации не запускаются — признак `ChatHistory.externalContent` и кусок потока `data-external-content`. Вложенные рамки
|
|
151
|
+
и `<link rel=preconnect>` в документе демонстрации запрещены. Всё необязательное, ломающих изменений нет. Как обновить
|
|
152
|
+
приложение — в CHANGES.md, раздел 0.44.0.
|
|
153
|
+
|
|
154
|
+
### Patch Changes
|
|
155
|
+
|
|
156
|
+
- Updated dependencies [6a2b5d9]
|
|
157
|
+
- @ykurilov/agent-chat-core@0.44.0
|
|
158
|
+
|
|
159
|
+
## 0.43.0
|
|
160
|
+
|
|
161
|
+
### Patch Changes
|
|
162
|
+
|
|
163
|
+
- Updated dependencies [763f4c5]
|
|
164
|
+
- @ykurilov/agent-chat-core@0.43.0
|
|
165
|
+
|
|
166
|
+
## 0.42.0
|
|
167
|
+
|
|
168
|
+
### Patch Changes
|
|
169
|
+
|
|
170
|
+
- Updated dependencies [a385276]
|
|
171
|
+
- @ykurilov/agent-chat-core@0.42.0
|
|
172
|
+
|
|
173
|
+
## 0.41.0
|
|
174
|
+
|
|
175
|
+
### Patch Changes
|
|
176
|
+
|
|
177
|
+
- Updated dependencies [9472fcb]
|
|
178
|
+
- @ykurilov/agent-chat-core@0.41.0
|
|
179
|
+
|
|
180
|
+
## 0.40.0
|
|
181
|
+
|
|
182
|
+
### Patch Changes
|
|
183
|
+
|
|
184
|
+
- Updated dependencies [0e7aab3]
|
|
185
|
+
- @ykurilov/agent-chat-core@0.40.0
|
|
186
|
+
|
|
187
|
+
## 0.39.1
|
|
188
|
+
|
|
189
|
+
### Patch Changes
|
|
190
|
+
|
|
191
|
+
- @ykurilov/agent-chat-core@0.39.1
|
|
192
|
+
|
|
193
|
+
## 0.39.0
|
|
194
|
+
|
|
195
|
+
### Patch Changes
|
|
196
|
+
|
|
197
|
+
- Updated dependencies [3b90429]
|
|
198
|
+
- @ykurilov/agent-chat-core@0.39.0
|
|
199
|
+
|
|
200
|
+
## 0.38.0
|
|
201
|
+
|
|
202
|
+
### Patch Changes
|
|
203
|
+
|
|
204
|
+
- Updated dependencies [1cae504]
|
|
205
|
+
- Updated dependencies [4065a4a]
|
|
206
|
+
- @ykurilov/agent-chat-core@0.38.0
|
|
207
|
+
|
|
208
|
+
## 0.37.0
|
|
209
|
+
|
|
210
|
+
### Patch Changes
|
|
211
|
+
|
|
212
|
+
- Updated dependencies [7f49d12]
|
|
213
|
+
- Updated dependencies [ea78982]
|
|
214
|
+
- @ykurilov/agent-chat-core@0.37.0
|
|
215
|
+
|
|
216
|
+
## 0.36.0
|
|
217
|
+
|
|
218
|
+
### Patch Changes
|
|
219
|
+
|
|
220
|
+
- Updated dependencies [3487fb4]
|
|
221
|
+
- Updated dependencies [8c43b86]
|
|
222
|
+
- Updated dependencies [6f42418]
|
|
223
|
+
- Updated dependencies [5f13c74]
|
|
224
|
+
- @ykurilov/agent-chat-core@0.36.0
|
|
225
|
+
|
|
226
|
+
## 0.35.0
|
|
227
|
+
|
|
228
|
+
### Patch Changes
|
|
229
|
+
|
|
230
|
+
- Updated dependencies [2382026]
|
|
231
|
+
- @ykurilov/agent-chat-core@0.35.0
|
|
232
|
+
|
|
233
|
+
## 0.34.0
|
|
234
|
+
|
|
235
|
+
### Patch Changes
|
|
236
|
+
|
|
237
|
+
- Updated dependencies [d039ce4]
|
|
238
|
+
- @ykurilov/agent-chat-core@0.34.0
|
|
239
|
+
|
|
240
|
+
## 0.33.0
|
|
241
|
+
|
|
242
|
+
### Patch Changes
|
|
243
|
+
|
|
244
|
+
- Updated dependencies [4a72339]
|
|
245
|
+
- @ykurilov/agent-chat-core@0.33.0
|
|
246
|
+
|
|
247
|
+
## 0.32.0
|
|
248
|
+
|
|
249
|
+
### Patch Changes
|
|
250
|
+
|
|
251
|
+
- Updated dependencies [71c32b7]
|
|
252
|
+
- Updated dependencies [cae13bf]
|
|
253
|
+
- Updated dependencies [a94bda9]
|
|
254
|
+
- Updated dependencies [4e44492]
|
|
255
|
+
- Updated dependencies [ac9b7d3]
|
|
256
|
+
- Updated dependencies [27f4b1e]
|
|
257
|
+
- @ykurilov/agent-chat-core@0.32.0
|
|
258
|
+
|
|
259
|
+
## 0.31.2
|
|
260
|
+
|
|
261
|
+
### Patch Changes
|
|
262
|
+
|
|
263
|
+
- @ykurilov/agent-chat-core@0.31.2
|
|
264
|
+
|
|
265
|
+
## 0.31.1
|
|
266
|
+
|
|
267
|
+
### Patch Changes
|
|
268
|
+
|
|
269
|
+
- @ykurilov/agent-chat-core@0.31.1
|
|
270
|
+
|
|
271
|
+
## 0.31.0
|
|
272
|
+
|
|
273
|
+
### Patch Changes
|
|
274
|
+
|
|
275
|
+
- @ykurilov/agent-chat-core@0.31.0
|
|
276
|
+
|
|
277
|
+
## 0.30.0
|
|
278
|
+
|
|
279
|
+
### Patch Changes
|
|
280
|
+
|
|
281
|
+
- @ykurilov/agent-chat-core@0.30.0
|
|
282
|
+
|
|
283
|
+
## 0.29.0
|
|
284
|
+
|
|
285
|
+
### Patch Changes
|
|
286
|
+
|
|
287
|
+
- @ykurilov/agent-chat-core@0.29.0
|
|
288
|
+
|
|
289
|
+
## 0.28.0
|
|
290
|
+
|
|
291
|
+
### Patch Changes
|
|
292
|
+
|
|
293
|
+
- Updated dependencies [11c3c97]
|
|
294
|
+
- Updated dependencies [d63ccaa]
|
|
295
|
+
- Updated dependencies [6a2f903]
|
|
296
|
+
- Updated dependencies [189cba9]
|
|
297
|
+
- @ykurilov/agent-chat-core@0.28.0
|
|
298
|
+
|
|
299
|
+
## 0.27.0
|
|
300
|
+
|
|
301
|
+
### Patch Changes
|
|
302
|
+
|
|
303
|
+
- Updated dependencies [d8341b2]
|
|
304
|
+
- Updated dependencies [5e4ed28]
|
|
305
|
+
- Updated dependencies [e0bb519]
|
|
306
|
+
- @ykurilov/agent-chat-core@0.27.0
|
|
307
|
+
|
|
308
|
+
## 0.26.2
|
|
309
|
+
|
|
310
|
+
### Patch Changes
|
|
311
|
+
|
|
312
|
+
- Updated dependencies [f24858a]
|
|
313
|
+
- @ykurilov/agent-chat-core@0.26.2
|
|
314
|
+
|
|
315
|
+
## 0.26.1
|
|
316
|
+
|
|
317
|
+
### Patch Changes
|
|
318
|
+
|
|
319
|
+
- @ykurilov/agent-chat-core@0.26.1
|
|
320
|
+
|
|
321
|
+
## 0.26.0
|
|
322
|
+
|
|
323
|
+
### Patch Changes
|
|
324
|
+
|
|
325
|
+
- Updated dependencies [eb43e47]
|
|
326
|
+
- @ykurilov/agent-chat-core@0.26.0
|
|
327
|
+
|
|
328
|
+
## 0.25.0
|
|
329
|
+
|
|
330
|
+
### Patch Changes
|
|
331
|
+
|
|
332
|
+
- Updated dependencies [99d426e]
|
|
333
|
+
- Updated dependencies [d8201f6]
|
|
334
|
+
- @ykurilov/agent-chat-core@0.25.0
|
|
335
|
+
|
|
336
|
+
## 0.24.0
|
|
337
|
+
|
|
338
|
+
### Patch Changes
|
|
339
|
+
|
|
340
|
+
- Updated dependencies [9b895cd]
|
|
341
|
+
- @ykurilov/agent-chat-core@0.24.0
|
|
342
|
+
|
|
343
|
+
## 0.23.0
|
|
344
|
+
|
|
345
|
+
### Patch Changes
|
|
346
|
+
|
|
347
|
+
- @ykurilov/agent-chat-core@0.23.0
|
|
348
|
+
|
|
349
|
+
## 0.22.0
|
|
350
|
+
|
|
351
|
+
### Patch Changes
|
|
352
|
+
|
|
353
|
+
- @ykurilov/agent-chat-core@0.22.0
|
|
354
|
+
|
|
355
|
+
## 0.21.0
|
|
356
|
+
|
|
357
|
+
### Patch Changes
|
|
358
|
+
|
|
359
|
+
- Updated dependencies [7c3bcc4]
|
|
360
|
+
- @ykurilov/agent-chat-core@0.21.0
|
|
361
|
+
|
|
362
|
+
## 0.20.0
|
|
363
|
+
|
|
364
|
+
### Minor Changes
|
|
365
|
+
|
|
366
|
+
- fd16b01: Два новых пакета.
|
|
367
|
+
|
|
368
|
+
- `@ykurilov/agent-chat-background` — фоновые задачи: инструмент или помощник работает в фоне, итог приходит в чат служебным сообщением, задачи переживают перезапуск сервера. Хранилища: память, SQLite, PostgreSQL. README пакета и `docs/background.md`.
|
|
369
|
+
- `@ykurilov/agent-chat-messengers` — чат приложения в Telegram, VK и MAX: привязка аккаунтов, вебхук или опрос, группы, файлы, голос, голосовые ответы, карточки задач, доставка «хотя бы раз». README пакета и `docs/messengers.md`. Для вида панели подключения — `MessengersSkin` v1.
|
|
370
|
+
|
|
371
|
+
Что сделать в приложении: ставить нужно только если нужны фон или мессенджеры; подключение — по README пакетов.
|
|
372
|
+
|
|
373
|
+
### Patch Changes
|
|
374
|
+
|
|
375
|
+
- Updated dependencies [fd16b01]
|
|
376
|
+
- @ykurilov/agent-chat-core@0.20.0
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Yury Kurilov
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,93 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @ykurilov/agent-chat-background
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Фоновые задачи для агента. Долгая работа не держит разговор: агент запускает задачу, человек пишет дальше, а когда
|
|
4
|
+
задача закончилась, в чат приходит служебное сообщение «Задача готова» с итогом. Задачи переживают перезапуск
|
|
5
|
+
сервера.
|
|
6
|
+
|
|
7
|
+
Задачей бывает:
|
|
8
|
+
|
|
9
|
+
- **фоновый инструмент** — ваша функция, которая работает долго (отчёт, выгрузка, обход сайтов);
|
|
10
|
+
- **фоновый помощник** — помощник ядра (`helpers`) с `background: true`: его работа идёт в фоне, шаги сохраняются.
|
|
11
|
+
|
|
12
|
+
Без этого пакета ничего не меняется: помощники работают внутри хода, фона нет.
|
|
13
|
+
|
|
14
|
+
## Подключить
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
import { backgroundTool, createBackgroundTasks } from "@ykurilov/agent-chat-background";
|
|
18
|
+
import { sqliteTaskStore } from "@ykurilov/agent-chat-background/sqlite";
|
|
19
|
+
import { z } from "zod";
|
|
20
|
+
|
|
21
|
+
const background = createBackgroundTasks({
|
|
22
|
+
store: sqliteTaskStore("./data/chat.db"), // тот же файл, что у чатов, или свой
|
|
23
|
+
tools: {
|
|
24
|
+
build_report: backgroundTool({
|
|
25
|
+
description: "Собрать большой отчёт по продажам. Занимает несколько минут.",
|
|
26
|
+
inputSchema: z.object({ month: z.string() }),
|
|
27
|
+
title: (input) => `Отчёт за ${input.month}`,
|
|
28
|
+
run: async (input, { signal, reportProgress }) => {
|
|
29
|
+
reportProgress("Читаю продажи");
|
|
30
|
+
return await buildReport(input.month, signal); // signal сработает, если задачу отменили
|
|
31
|
+
},
|
|
32
|
+
}),
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const server = createChatServer({ …, background });
|
|
37
|
+
// или createChatHandler({ …, background }) — тогда появляются адреса {base}/:chatId/tasks
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Помощник уходит в фон одной строкой в его описании:
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
agent: {
|
|
44
|
+
helpers: {
|
|
45
|
+
researcher: { description: "…", instructions: "…", model, tools: searchTools, background: true },
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
`background: true` без подключённого `background` — ошибка при запуске, а не тихий отказ.
|
|
51
|
+
|
|
52
|
+
## Настройки `createBackgroundTasks`
|
|
53
|
+
|
|
54
|
+
| Настройка | Что | По умолчанию |
|
|
55
|
+
|---|---|---|
|
|
56
|
+
| `store` | Где лежат задачи: `memoryTaskStore()`, `sqliteTaskStore(путь)`, `postgresTaskStore(pool)` | обязательна |
|
|
57
|
+
| `tools` | Фоновые инструменты, имя → `backgroundTool({…})` | нет |
|
|
58
|
+
| `maxRunningPerUser` | Сколько задач человека идёт одновременно (ждущие подтверждения не считаются) | 3 |
|
|
59
|
+
| `timeoutMs` | Предел времени задачи; у инструмента можно свой `timeoutMs` | 30 минут |
|
|
60
|
+
| `leaseMs` | Аренда задачи копией сервера; продлевается раз в треть, минимум 3000 мс | 30 секунд |
|
|
61
|
+
|
|
62
|
+
Агент получает инструменты `check_tasks` (посмотреть задачи чата) и `cancel_task`, а в инструкцию — короткое правило, когда запускать
|
|
63
|
+
фон. Когда задач уже `maxRunningPerUser`, запуск отвечает «слишком много задач»: агент видит это и ждёт или
|
|
64
|
+
отменяет лишнее.
|
|
65
|
+
|
|
66
|
+
## Хранилища
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
import { memoryTaskStore } from "@ykurilov/agent-chat-background"; // тесты, живёт до перезапуска
|
|
70
|
+
import { sqliteTaskStore } from "@ykurilov/agent-chat-background/sqlite"; // файл
|
|
71
|
+
import { postgresTaskStore } from "@ykurilov/agent-chat-background/postgres"; // pg.Pool
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Миграции лежат в `drizzle/` и применяются при создании хранилища. Таблицы SQLite можно держать в файле чатов.
|
|
75
|
+
|
|
76
|
+
## Что бывает с задачей
|
|
77
|
+
|
|
78
|
+
`queued` → `running` → `done` / `failed` / `canceled` / `timed_out` / `interrupted`; на паузе — `awaiting_approval`.
|
|
79
|
+
|
|
80
|
+
- **Отмена.** Кнопка «Отменить» в карточке (вкладка или мессенджер) или `cancel_task` агента. Работа получает
|
|
81
|
+
`signal` и должна его уважать.
|
|
82
|
+
- **Подтверждение.** Фоновый инструмент с `needsApproval: true` спрашивает до запуска. Фоновый помощник спрашивает,
|
|
83
|
+
когда один из его инструментов просит подтверждения: задача встаёт на паузу и место не занимает. Ответ приходит
|
|
84
|
+
кнопками на вкладке или в мессенджере.
|
|
85
|
+
- **Перезапуск сервера.** Копия, которая взяла задачу, продлевает аренду. Копия упала — аренда истекает, и другая
|
|
86
|
+
копия (или та же после старта) подбирает задачу. Фоновый помощник продолжает с сохранённых шагов: уже сделанные
|
|
87
|
+
вызовы инструментов не повторяются. Фоновый инструмент по умолчанию получает `interrupted` («прервана»);
|
|
88
|
+
`rerunAfterRestart: true` запускает его заново, поэтому такая работа должна быть безопасной для повтора.
|
|
89
|
+
Больше трёх запусков одной задачи не бывает: дальше она получает `interrupted`.
|
|
90
|
+
- **Итог.** Служебное сообщение попадает в чат хотя бы один раз и будит агента; тот отвечает человеку по итогу.
|
|
91
|
+
|
|
92
|
+
Живая проверка: [`tests/live/helpers-background.live.test.ts`](tests/live/helpers-background.live.test.ts) (платная,
|
|
93
|
+
запускается отдельно: `pnpm exec vitest run --project live <файл>`).
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// src/store/migration-settings.ts
|
|
2
|
+
var BACKGROUND_MIGRATIONS_TABLE = "__background_migrations";
|
|
3
|
+
var BACKGROUND_MIGRATION_LOCK_KEY = 7311900444;
|
|
4
|
+
|
|
5
|
+
export {
|
|
6
|
+
BACKGROUND_MIGRATIONS_TABLE,
|
|
7
|
+
BACKGROUND_MIGRATION_LOCK_KEY
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=chunk-4RA3JT6K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/store/migration-settings.ts"],"sourcesContent":["/** Своя таблица учёта: хранилище чатов и песочница живут в той же базе и ведут свои. */\nexport const BACKGROUND_MIGRATIONS_TABLE = \"__background_migrations\";\n\n/** Постоянное число для блокировки базы миграциями фона; не совпадает с ключами ядра (…443 — песочница) и мессенджеров (…445). */\nexport const BACKGROUND_MIGRATION_LOCK_KEY = 7_311_900_444;\n"],"mappings":";AACO,IAAM,8BAA8B;AAGpC,IAAM,gCAAgC;","names":[]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// src/store/task-store.ts
|
|
2
|
+
var RUNNING_STATUSES = ["queued", "running"];
|
|
3
|
+
var FINISHED_STATUSES = ["done", "failed", "canceled", "interrupted", "timed_out"];
|
|
4
|
+
var NOTICE_STATUSES = [...FINISHED_STATUSES, "awaiting_approval"];
|
|
5
|
+
var isRunningStatus = (status) => RUNNING_STATUSES.includes(status);
|
|
6
|
+
var isFinishedStatus = (status) => FINISHED_STATUSES.includes(status);
|
|
7
|
+
var OPTIONAL_FIELDS = [
|
|
8
|
+
"input",
|
|
9
|
+
"helperMessages",
|
|
10
|
+
"progress",
|
|
11
|
+
"result",
|
|
12
|
+
"error",
|
|
13
|
+
"leaseOwner",
|
|
14
|
+
"leaseUntil",
|
|
15
|
+
"startedAt",
|
|
16
|
+
"finishedAt",
|
|
17
|
+
"deliveredAt",
|
|
18
|
+
"deliveryKey"
|
|
19
|
+
];
|
|
20
|
+
function meetsCondition(task, when) {
|
|
21
|
+
if (when?.leaseOwner !== void 0 && task.leaseOwner !== when.leaseOwner) return false;
|
|
22
|
+
if (when?.statuses !== void 0 && !when.statuses.includes(task.status)) return false;
|
|
23
|
+
if (when?.pendingApprovalId !== void 0 && task.progress?.pendingApproval?.approvalId !== when.pendingApprovalId) return false;
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
function withoutEmptyFields(record) {
|
|
27
|
+
const clean = { ...record };
|
|
28
|
+
for (const field of OPTIONAL_FIELDS) {
|
|
29
|
+
if (clean[field] === null || clean[field] === void 0) delete clean[field];
|
|
30
|
+
}
|
|
31
|
+
return clean;
|
|
32
|
+
}
|
|
33
|
+
function patchEntries(patch) {
|
|
34
|
+
return Object.entries(patch).map(([key, value]) => [key, value ?? null]);
|
|
35
|
+
}
|
|
36
|
+
function withoutNul(value) {
|
|
37
|
+
if (value === null || value === void 0) return value;
|
|
38
|
+
if (typeof value === "string") return value.replaceAll("\0", "");
|
|
39
|
+
if (typeof value !== "object") return value;
|
|
40
|
+
return JSON.parse(JSON.stringify(value, (_key, item) => typeof item === "string" ? item.replaceAll("\0", "") : item));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export {
|
|
44
|
+
RUNNING_STATUSES,
|
|
45
|
+
NOTICE_STATUSES,
|
|
46
|
+
isRunningStatus,
|
|
47
|
+
isFinishedStatus,
|
|
48
|
+
meetsCondition,
|
|
49
|
+
withoutEmptyFields,
|
|
50
|
+
patchEntries,
|
|
51
|
+
withoutNul
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=chunk-4XFSUFM6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/store/task-store.ts"],"sourcesContent":["import type { TaskStatus } from \"@ykurilov/agent-chat-core\";\nimport type { TaskCondition, TaskPatch, TaskRecord } from \"../types\";\n\n/**\n * Жизнь задачи в хранилище.\n * - `queued`/`running` — идёт; аренда у копии сервера, которая её ведёт.\n * - `awaiting_approval` и законченные — ждут доставки служебного сообщения; аренда у копии, которая доставляет.\n * - `delivered_at` стоит — чату всё сообщено, аренды нет, задача никому не нужна до следующего события.\n * Поэтому «задаче нужна копия сервера» — ровно `delivered_at IS NULL`.\n */\nexport const RUNNING_STATUSES = [\"queued\", \"running\"] as const satisfies readonly TaskStatus[];\nexport const FINISHED_STATUSES = [\"done\", \"failed\", \"canceled\", \"interrupted\", \"timed_out\"] as const satisfies readonly TaskStatus[];\n/** О чём чат получает служебное сообщение. */\nexport const NOTICE_STATUSES = [...FINISHED_STATUSES, \"awaiting_approval\"] as const satisfies readonly TaskStatus[];\n\nexport const isRunningStatus = (status: TaskStatus): boolean => (RUNNING_STATUSES as readonly TaskStatus[]).includes(status);\nexport const isFinishedStatus = (status: TaskStatus): boolean => (FINISHED_STATUSES as readonly TaskStatus[]).includes(status);\n\n/** Поля записи, которые хранилище может не хранить: `null` из базы и `undefined` из правки значат «нет». */\nconst OPTIONAL_FIELDS = [\n \"input\",\n \"helperMessages\",\n \"progress\",\n \"result\",\n \"error\",\n \"leaseOwner\",\n \"leaseUntil\",\n \"startedAt\",\n \"finishedAt\",\n \"deliveredAt\",\n \"deliveryKey\",\n] as const satisfies readonly (keyof TaskRecord)[];\n\n/** Выполнено ли условие записи для задачи. */\nexport function meetsCondition(task: TaskRecord, when: TaskCondition | undefined): boolean {\n if (when?.leaseOwner !== undefined && task.leaseOwner !== when.leaseOwner) return false;\n if (when?.statuses !== undefined && !when.statuses.includes(task.status)) return false;\n if (when?.pendingApprovalId !== undefined && task.progress?.pendingApproval?.approvalId !== when.pendingApprovalId) return false;\n return true;\n}\n\n/** Убирает пустые необязательные поля: запись из любого хранилища выглядит одинаково. */\nexport function withoutEmptyFields(record: TaskRecord): TaskRecord {\n const clean = { ...record } as Record<string, unknown>;\n for (const field of OPTIONAL_FIELDS) {\n if (clean[field] === null || clean[field] === undefined) delete clean[field];\n }\n return clean as unknown as TaskRecord;\n}\n\n/** Правка (или вся запись) как пары «поле — значение»: переданный `undefined` стирает поле (`null` в базе). */\nexport function patchEntries(patch: TaskPatch | TaskRecord): Array<[string, unknown]> {\n return Object.entries(patch).map(([key, value]) => [key, value ?? null]);\n}\n\n/** PostgreSQL не хранит символ NUL ни в тексте, ни в jsonb: убираем его до записи. */\nexport function withoutNul<T>(value: T): T {\n if (value === null || value === undefined) return value;\n if (typeof value === \"string\") return value.replaceAll(\"\\u0000\", \"\") as T;\n if (typeof value !== \"object\") return value;\n return JSON.parse(JSON.stringify(value, (_key, item: unknown) => (typeof item === \"string\" ? item.replaceAll(\"\\u0000\", \"\") : item))) as T;\n}\n"],"mappings":";AAUO,IAAM,mBAAmB,CAAC,UAAU,SAAS;AAC7C,IAAM,oBAAoB,CAAC,QAAQ,UAAU,YAAY,eAAe,WAAW;AAEnF,IAAM,kBAAkB,CAAC,GAAG,mBAAmB,mBAAmB;AAElE,IAAM,kBAAkB,CAAC,WAAiC,iBAA2C,SAAS,MAAM;AACpH,IAAM,mBAAmB,CAAC,WAAiC,kBAA4C,SAAS,MAAM;AAG7H,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,SAAS,eAAe,MAAkB,MAA0C;AACzF,MAAI,MAAM,eAAe,UAAa,KAAK,eAAe,KAAK,WAAY,QAAO;AAClF,MAAI,MAAM,aAAa,UAAa,CAAC,KAAK,SAAS,SAAS,KAAK,MAAM,EAAG,QAAO;AACjF,MAAI,MAAM,sBAAsB,UAAa,KAAK,UAAU,iBAAiB,eAAe,KAAK,kBAAmB,QAAO;AAC3H,SAAO;AACT;AAGO,SAAS,mBAAmB,QAAgC;AACjE,QAAM,QAAQ,EAAE,GAAG,OAAO;AAC1B,aAAW,SAAS,iBAAiB;AACnC,QAAI,MAAM,KAAK,MAAM,QAAQ,MAAM,KAAK,MAAM,OAAW,QAAO,MAAM,KAAK;AAAA,EAC7E;AACA,SAAO;AACT;AAGO,SAAS,aAAa,OAAyD;AACpF,SAAO,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,SAAS,IAAI,CAAC;AACzE;AAGO,SAAS,WAAc,OAAa;AACzC,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,WAAW,MAAU,EAAE;AACnE,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO,KAAK,MAAM,KAAK,UAAU,OAAO,CAAC,MAAM,SAAmB,OAAO,SAAS,WAAW,KAAK,WAAW,MAAU,EAAE,IAAI,IAAK,CAAC;AACrI;","names":[]}
|