0.134.30
Fixed (DEFERRED-задачи §3.2 Agent/Tools, см. docs/audit/backend-2026-06.md §3.2)
- H-T-8
ApprovalManager.ResolveTOCTOU race —m.mu.RLock()удерживается до захватаpa.mu.Lock(), устраняя окно гонки.RequestApprovalsuccess/timeout пути устанавливаютpa.done = trueподpa.mu. Добавлены 8 тестов с-race. - H-T-5
decryptPasswordвEmailSendTool/EmailInboxTool— при ошибкеsecrets.Decryptлогирует черезslog.Errorи возвращает""вместо зашифрованного текста. - H-T-4
EmailSendTool.attachPaths—NewEmailSendToolпринимает*FsGuard. При наличии guard путь валидируется черезResolveAndCheckRead()(workspace boundary, blocked devices, symlink protection).RegisterToolsFromPermissionsвозвращает*FsGuardдля проброса. - H-T-3
ToolStreamEventchannel — добавленаsendStreamEvent(ctx, ch, evt)с context-awareselect { case ch<-evt | case <-ctx.Done() }. Все блокирующие записи вExecuteStreamиweb_fetch.goзаменены. Producer не зависает при отменённом контексте. - H-T-7
memoryToolBase.embedQuery— добавлен helper, устраняющий дублированиеembedder.Embed(ctx, []string{query})в 3 методахMemorySearchTool. - H-T-6
memory_searchN+1 — добавлены batch-методыGetFactsByIDs/GetChunksByIDs/GetEntitiesByIDsв Store (SQLite + PG + DualStore). Render-циклы переписаны на batch fetch.filterFactsByCategoryиbatchKGEnrichmentиспользуют batch. - H-T-1
ExecTool.ExecuteStreamдублируетExecute— извлечена общая логика валидации/подготовки вexecPrepare(). ~150 строк дублирования устранены. Добавлены 5 регрессионных тестов.
Added
- Batch Store-методы:
GetFactsByIDs,GetChunksByIDs,GetEntitiesByIDs— единый SQL-запросWHERE id IN (...)вместо N+1. sendStreamEvent(ctx, ch, evt)— helper для context-aware записи вToolStreamEventchannel.memoryToolBase.embedQuery(ctx, query)— общий helper для embedding запросов.approval_test.go— 8 тестов (basic approve/deny, timeout, concurrent resolve, cleanup).email_send_test.go— 9 тестов (decrypt, FsGuard attach, blocked devices, path traversal).stream_test.go— 3 теста (normal, cancelled context, full channel).exec_test.go— 5 новых тестов (Execute, ExecuteStream, empty command, non-zero exit, cancelled context).
Build / Tests
go test ./internal/... -race -count=1— все тесты проходят.make build-cross— 6 бинарников собираются без ошибок.