Task 15 — Секреты и конфигурация
Phase: 1
Status: done
Owner: —
Slug: secrets-config
Goal
appsettings + environment variables; секреты никогда не пишутся в skill packages, Markdown memory, telemetry или export archives.
Acceptance criteria
Sub-tasks
Config/AppConfig.cs— добавитьSecretsConfigсекцию:EnvironmentVariablePrefix(default “HERCULES_SECRET_”),SecretsFile(default null),SecretReferencePrefix(default “env:”),RedactInExports(default true),RedactInMemory(default true),RedactInTelemetry(default true)Config/ISecretMaskingService.cs— интерфейс:MaskSecrets(text),ResolveSecret(reference),IsSecretReference(text),ExpandSecretReferences(text)Config/SecretMaskingService.cs— реализация: используетIRedactionServiceдля redaction;ResolveSecretчитает env vars по префиксу HERCULES_SECRET_;IsSecretReferenceпроверяетSecretReferencePrefixProgram.cs(CLI + WebAPI) — зарегистрироватьSecretsConfigsingleton иISecretMaskingService→SecretMaskingServiceв DISkills/SkillPackager.cs— при Export: redacted description + prompt черезISecretMaskingServiceперед записью в ZIP; конструктор с SecretsConfig + ISecretMaskingServiceStorage/MemoryStore.cs— приWriteProfileAsync,WritePreferencesAsync,WriteEntitiesAsync,AppendAsync,AppendContextAsync: redacted content черезISecretMaskingService; конструктор с SecretsConfig + ISecretMaskingServiceObservability/OtelService.cs— интеграция:ISecretMaskingService?nullable;SetTag+SetTags+AddEventredacts string values еслиSecretsConfig.RedactInTelemetry = trueWebApi/Controllers/AuditController.cs—/api/audit/export: redacted details/policy_decision/permission_used черезISecretMaskingServicetests/.../Config/SecretMaskingServiceTests.cs— 24 unit-тестов: MaskSecrets (API key, email, phone, bearer, multiple), ResolveSecret (env var, case-insensitive, non-existent), IsSecretReference, ExpandSecretReferences, null redaction servicedotnet buildпроходит без warnings (NU1902 на OTel.Api — pre-existing)dotnet testпроходит (539/545; 6 pre-existing failures: OTel activity source в test env + WASM sandbox + locale)
Scope / Likely files
src/agent/Config/, src/agent/HostBuilderExtensions.cs
Dependencies
- блокирует / опирается на: task_001 — core-agent-loop
Implementation notes
2026-08-12
Добавлено:
Config/AppConfig.cs — SecretsConfig:
EnvironmentVariablePrefix(“HERCULES_SECRET_”) — префикс env vars для секретовSecretReferencePrefix(“env:”) — префикс ссылок на секретыRedactInExports/RedactInMemory/RedactInTelemetry— флаги включения redaction
Config/ISecretMaskingService.cs — интерфейс с 4 методами: MaskSecrets, ResolveSecret, IsSecretReference, ExpandSecretReferences
Config/SecretMaskingService.cs — реализация:
MaskSecrets: используетIRedactionService(API keys, emails, phones, credit cards, bearer tokens) + literal env var valuesResolveSecret("env:MYAPIKEY"): prependsHERCULES_SECRET_prefix → ищетHERCULES_SECRET_MYAPIKEYв env varsIsSecretReference: проверяетSecretReferencePrefixprefixExpandSecretReferences: заменяетenv:VAR_NAMEна resolved values
DI (CLI + WebAPI):
SecretsConfigsingletonISecretMaskingService→SecretMaskingService(используетIRedactionService)
Skills/SkillPackager.cs — новый конструктор с SecretsConfig + ISecretMaskingService; Export redacts description + prompt перед записью в .skillpkg ZIP
Storage/MemoryStore.cs — новый конструктор; WriteProfileAsync, WritePreferencesAsync, WriteEntitiesAsync, AppendAsync, AppendContextAsync redacted content перед записью
Observability/OtelService.cs — nullable SecretsConfig? + ISecretMaskingService?; SetTag, SetTags, AddEvent redacts string values when RedactInTelemetry = true; OtelHostBuilderExtensions использует DI factory
WebApi/Controllers/AuditController.cs — /api/audit/export redacts details/policy_decision/permission_used перед CSV export
Tests — tests/.../Config/SecretMaskingServiceTests.cs — 24 теста (24/24 passed)
Validation:
dotnet buildHercules.csproj — 0 errors, 0 warnings (NU1902 pre-existing)dotnet buildHercules.WebApi.csproj — 0 errors, 0 warningsdotnet test— 539/545 passed (6 pre-existing failures: OTel ActivitySource без listener + WASM sandbox + locale encoding)
Risks / Rollback
Случайная утечка в логи; централизованный redaction-фильтр.
Links
- Backlog: ../backlog.md
- Roadmap (EN): ../../ROADMAP-EN.md
- Roadmap (RU): ../../ROADMAP-RU.md