0.13.0
Итерации 5–9 плана аудита: continuation актора, deadlocks/recover, graceful shutdown, tool security, tool permissions.
Added
- Гарантированный
_turn_endчерезdeferвactor.handleInbound— во всех ветках success/error/panic публикуется событие завершения хода - Continue-working pattern: 16 маркеров намерения (ru/en), до 3 continuation-циклов при обнаружении незавершённой задачи
max_iterations— при достижении лимита публиковается явное сообщение «Напишите продолжай»isSystemChannel("cron"|"heartbeat")— системные сообщения не интерпретируются как ответ на pendingask_userfindPendingAskUser— поиск любого assistant-сообщения с ask_user tool_call, не только последнегоrecover()во все долгоживущие горутины: actor.run, loop.run, runner.executeTools, cron/heartbeat, email poller, WSHub- Stream-loop с idle-timeout (120s) и ctx.Done в runner
- Общий tool timeout (5 min) через
context.WithTimeoutвrunTool - Shared
appCtxв main.go: SIGINT/SIGTERM → cancel → производные контексты отменяются - Graceful shutdown-цепочка: HTTP → AgentLoop → ChannelManager → MCP → Cron → Heartbeat → Consolidator → Dream → AutoCompact → DB close
- Idempotent Stop-методы (sync.Once/флаг stopped) для AgentLoop, MCP Manager, Consolidator, Dream
- Per-component timeout 10s, общий 60s; логирование
shutdown stepсtook_ms - SSRF-защита в
web_searchиweb_fetch:ssrfGuard.SafeHTTPClient()вместоhttp.DefaultClient resolveWorkDir()в exec:filepath.Join + Clean + isUnder— traversal../etcзаблокированBuildMinimalEnv: PATH фиксированный, HOME → temp, allowlist env-vars, секреты не утекают- Расширен
isBlockedDevice:/sys/*,/proc/<pid>/mem|maps|environ|..., девайсы дисков atomicWriteFile()(temp+rename) в write_file и edit_file — устранение TOCTOU- Поля
Heartbeat boolиSkill boolвToolsPermissions— дефолтыfalse - Именованные пресеты инструментов:
assistant,automation,minimal+ APIGET /api/v1/tool-presets - Тесты: actor_test (8), runner_test (6), autocompact_service_test (2), tool_security_test (8), sandbox_test (5)
Changed
loop.Stopнеблокирующий:select-default + CancelFunc()при переполненном канале- Параллельные tools: ошибки из горутин не игнорируются, panic ловится через recover
- Rate-limit fix:
tool_resultгенерируется для каждогоtool_call_idв батче loop.providerCfg— запись подl.mu.Lock(раньше был race)AutoCompactService.Stop— idempotent через флагstopped- Cron/Heartbeat/Skill инструменты регистрируются только при включённом permission
- UI: чекбоксы «Пульс» и «Навыки» в разделе «Инструменты» страницы permissions
Fixed
- Work §1.1: отсутствие
_turn_endпри ошибке/панике актора - Work §1.3:
max_iterationsбез уведомления пользователя - Work §4.2: busy-loop в
actor.runпри мёртвом parent ctx - Work §4.3:
loop.Stopблокировался при переполненном канале актора - Work §4.4: panic в горутине tool убивал процесс
- Work §4.5: stream-loop без таймаута зависал при молчащем провайдере
- Work §4.6: rate-limit глотал tool_call_id для второго и последующего вызовов
- Work §4.7: race на
loop.providerCfg(чтение без блокировки) - Work §4.8:
os.Exit(1)вserver.Serveне давал graceful shutdown - Tools B4: cron/heartbeat/skill_manage регистрировались без проверки permission
- Tools B8: SSRF через
http.DefaultClientв web_search/web_fetch - Tools B18: path traversal в exec.workDir
- Tools B19: утечка env-секретов в sandbox
- Tools B20: неполный список заблокированных устройств