feat(llm): mask API keys in UI responses and prevent masked-key leakage in fetch/test/save payloads

- Add mask_api_key() and is_masked_or_placeholder() to llm_provider service
- Return masked keys in all provider CRUD endpoints
- Reject masked/placeholder keys in fetch_models and test_provider_config
- Show masked key with Change button in ProviderConfig.svelte edit form
- Exclude masked keys from fetch-models, test, and submit payloads on frontend
- Update semantics-core skill with clarified complexity tier rules
- Switch agent modes from subagent to all
This commit is contained in:
2026-05-15 23:34:09 +03:00
parent 174bf54618
commit 8797c28958
201 changed files with 147415 additions and 318 deletions

View File

@@ -1,9 +1,6 @@
# #region AnchorConfig [C:3] [TYPE Block] [SEMANTICS config,anchor]
# @BRIEF Якорный синтаксис — глобальный формат и переопределения по директориям.
# @RELATION BINDS_TO -> [Std.Semantics.Core]
#
# По умолчанию #region/#endregion — новый код пишется в region-формате.
# Legacy DEF и Doc-формат brace признаются для обратной совместимости.
anchor:
format: region
overrides:
@@ -13,7 +10,6 @@ anchor:
# #endregion AnchorConfig
# #region IndexingConfig [C:2] [TYPE Block] [SEMANTICS config,indexing]
# @BRIEF Правила обхода файлов — include/exclude паттерны и source/doc директории.
indexing:
include: []
exclude:
@@ -30,6 +26,7 @@ indexing:
- '*.yml'
- '*.json'
- '*.toml'
- '*.md'
source_dirs:
- src
- tests
@@ -41,27 +38,20 @@ indexing:
# #region ComplexityRules [C:5] [TYPE Block] [SEMANTICS config,rules,validation]
# @BRIEF Обязательные и запрещённые тэги по уровням сложности C1-C5.
# @RELATION BINDS_TO -> [Std.Semantics.Core]
# @RELATION DEPENDS_ON -> [TagSchema]
# @INVARIANT Каждый тэг в required/forbidden списках обязан иметь определение в TagSchema.
# @RATIONALE Каждый уровень строго контролирует допустимый набор тэгов — это предотвращает verbosity и структурную эрозию (INV_7).
# LAYER и SEMANTICS — Module-специфичные тэги; не входят в базовую шкалу сложности core.
# BRIEF указан как alias PURPOSE — явно в forbidden для C1, т.к. C1 запрещает все content-тэги.
# @REJECTED Свободная валидация без строгих forbidden-списков отвергнута — порождает Slop и размывает Decision Memory.
# @REJECTED UX_STATE в общих complexity_rules отвергнут — UX_STATE Component-специфичен и управляется через contract_type_overrides.
# @RATIONALE BRIEF/PURPOSE/RATIONALE/REJECTED — универсально опциональны (C1+).
# EXAMPLE, ERROR/RAISES, DEPRECATED, REPLACED_BY — тоже опциональны.
# @REJECTED Свободная валидация без строгих forbidden-списков отвергнута — порождает Slop.
complexity_rules:
'1':
required: []
forbidden:
- BRIEF
- PURPOSE
- RELATION
- PRE
- POST
- SIDE_EFFECT
- DATA_CONTRACT
- INVARIANT
- RATIONALE
- REJECTED
'2':
required:
- PURPOSE
@@ -72,8 +62,6 @@ complexity_rules:
- SIDE_EFFECT
- DATA_CONTRACT
- INVARIANT
- RATIONALE
- REJECTED
'3':
required:
- PURPOSE
@@ -84,8 +72,6 @@ complexity_rules:
- SIDE_EFFECT
- DATA_CONTRACT
- INVARIANT
- RATIONALE
- REJECTED
'4':
required:
- PURPOSE
@@ -96,8 +82,6 @@ complexity_rules:
forbidden:
- DATA_CONTRACT
- INVARIANT
- RATIONALE
- REJECTED
'5':
required:
- PURPOSE
@@ -107,17 +91,10 @@ complexity_rules:
- SIDE_EFFECT
- DATA_CONTRACT
- INVARIANT
- RATIONALE
- REJECTED
forbidden: []
# #endregion ComplexityRules
# #region ContractTypeOverrides [C:3] [TYPE Block] [SEMANTICS config,adr,override]
# @BRIEF Особые правила валидации для ADR, Component и Tombstone.
# @RELATION DEPENDS_ON -> [ComplexityRules]
# @RELATION DEPENDS_ON -> [TagSchema]
#
# ADR не имеет COMPLEXITY (это всегда архитектурное решение). Component имеет @UX_STATE вместо @PRE/@POST на C3. Tombstone — минимальный контракт-заглушка.
contract_type_overrides:
ADR:
required:
@@ -197,52 +174,35 @@ contract_type_overrides:
- SIDE_EFFECT
- DATA_CONTRACT
- INVARIANT
- RATIONALE
- REJECTED
'4':
required:
- PURPOSE
- RELATION
- RATIONALE
- REJECTED
forbidden:
- PRE
- POST
- SIDE_EFFECT
forbidden:
- DATA_CONTRACT
- INVARIANT
'5':
required:
- PURPOSE
- RELATION
- RATIONALE
- REJECTED
- INVARIANT
forbidden:
- PRE
- POST
- SIDE_EFFECT
- DATA_CONTRACT
- INVARIANT
forbidden: []
# #endregion ContractTypeOverrides
# #region TagSchema [C:5] [TYPE Block] [SEMANTICS config,tags,schema]
# @BRIEF Полная схема GRACE-тэгов: типы, алиасы, enum-ы, предикаты, применимость.
# @RELATION DEPENDS_ON -> [ComplexityRules]
# @INVARIANT Каждый тэг, referenced в complexity_rules и contract_type_overrides, имеет определение в tags.
# @RATIONALE Централизованная схема тэгов — единый источник истины для парсера, валидатора и MCP-тулов. Расширяется через alias_for без изменения канонических имён.
# @RATIONALE LAYER.enum +Service: semantics-python использует @LAYER Service в canonical C3 Module примере (dashboard_migration).
# @RATIONALE SEMANTICS/PRE/POST/SIDE_EFFECT/DATA_CONTRACT/INVARIANT +Agent: Core §II декларирует Agent как валидный тип контракта; Fullstack.Coder и другие Agent-контракты используют эти тэги.
# @REJECTED Разрозненные определения тэгов в коде парсера отвергнуты — делают валидацию неконсистентной и неподдерживаемой.
tags:
C:
type: string
multiline: false
description: 'Краткий алиас для COMPLEXITY. @C: 3 ≡ @COMPLEXITY: 3.'
description: 'Алиас для COMPLEXITY. @C: 3 ≡ @COMPLEXITY: 3.'
alias_for: COMPLEXITY
separator: null
is_reference: false
enum: []
allowed_predicates: []
contract_types:
- Module
- Function
@@ -257,16 +217,8 @@ tags:
COMPLEXITY:
type: string
multiline: false
description: Уровень сложности (1-5). C1 — DTO/утилиты, C2 — +PURPOSE, C3 — +RELATION, C4 — контракты (PRE/POST), C5 — инварианты и Decision Memory.
separator: null
is_reference: false
enum:
- '1'
- '2'
- '3'
- '4'
- '5'
allowed_predicates: []
description: 'Уровень сложности (1-5). Универсально опциональный.'
enum: ['1','2','3','4','5']
contract_types:
- Module
- Function
@@ -278,16 +230,11 @@ tags:
protected: false
orthogonal: false
decision_memory: false
alias_for: null
BRIEF:
type: string
multiline: true
description: 'Doxygen-совместимый алиас для PURPOSE. @BRIEF Краткое описание. Разрешается в канонический PURPOSE при парсинге.'
description: 'Алиас для PURPOSE. Универсально опциональный.'
alias_for: PURPOSE
separator: null
is_reference: false
enum: []
allowed_predicates: []
contract_types: []
protected: false
orthogonal: false
@@ -295,11 +242,7 @@ tags:
PURPOSE:
type: string
multiline: true
description: Назначение контракта. Краткое (1-2 предложения) описание. Каноническое имя. Обязателен с C2. @BRIEF — Doxygen-алиас.
separator: null
is_reference: false
enum: []
allowed_predicates: []
description: 'Назначение контракта. Обязателен с C2.'
contract_types:
- Module
- Function
@@ -312,15 +255,81 @@ tags:
protected: false
orthogonal: false
decision_memory: false
alias_for: null
EXAMPLE:
type: string
multiline: true
description: 'Пример использования. Универсально опциональный.'
contract_types:
- Module
- Function
- Class
- Component
- Block
- Skill
- Agent
protected: false
orthogonal: false
decision_memory: false
ERROR:
type: string
multiline: true
description: 'Исключение. @ERROR ValueError. Алиасы: RAISES, THROWS. Универсально опциональный.'
contract_types:
- Module
- Function
- Class
- Component
- Block
protected: false
orthogonal: false
decision_memory: false
RAISES:
type: string
multiline: true
alias_for: ERROR
description: 'Алиас для ERROR.'
contract_types: []
protected: false
orthogonal: false
decision_memory: false
DEPRECATED:
type: string
multiline: true
description: 'Метка устаревания. @DEPRECATED v2.5. Универсально опциональный.'
contract_types:
- Module
- Function
- Class
- Component
- Block
- ADR
- Skill
- Agent
protected: false
orthogonal: false
decision_memory: true
REPLACED_BY:
type: string
multiline: false
description: 'Ссылка на замену. @REPLACED_BY NewService.run.'
is_reference: true
contract_types:
- Module
- Function
- Class
- Component
- Block
- ADR
- Skill
- Agent
protected: false
orthogonal: false
decision_memory: true
SEMANTICS:
type: array
multiline: false
description: Семантические маркеры (домен, зона ответственности). Ортогональный — допустим на любом C-level для Module, Block, Skill, Agent.
separator: ','
is_reference: false
enum: []
allowed_predicates: []
description: 'Семантические маркеры. Ортогональный.'
contract_types:
- Module
- Block
@@ -329,15 +338,10 @@ tags:
protected: false
orthogonal: true
decision_memory: false
alias_for: null
SIDE_EFFECT:
type: string
multiline: false
description: 'Побочные эффекты: мутации состояния, I/O, БД, сеть. Обязателен с C4.'
separator: null
is_reference: false
enum: []
allowed_predicates: []
description: 'Побочные эффекты. Обязателен с C4.'
contract_types:
- Module
- Function
@@ -347,15 +351,10 @@ tags:
protected: false
orthogonal: false
decision_memory: false
alias_for: null
STATUS:
type: string
multiline: false
description: 'Статус: ACTIVE, DEPRECATED -> REPLACED_BY: [NewId], EXPERIMENTAL. Ортогональный для Tombstone/ADR/Module.'
separator: null
is_reference: false
enum: []
allowed_predicates: []
description: 'Статус: ACTIVE, DEPRECATED, EXPERIMENTAL.'
contract_types:
- Tombstone
- ADR
@@ -363,153 +362,84 @@ tags:
protected: false
orthogonal: true
decision_memory: false
alias_for: null
TEST_CONTRACT:
type: string
multiline: false
description: Что проверяет тест. Ортогональный тестовый тэг.
separator: null
is_reference: false
enum: []
allowed_predicates: []
contract_types:
- Function
- Block
description: Что проверяет тест. Ортогональный.
contract_types: [Function, Block]
protected: false
orthogonal: true
decision_memory: false
alias_for: null
TEST_EDGE:
type: string
multiline: false
description: Краевой случай, покрываемый тестом. Ортогональный.
separator: null
is_reference: false
enum: []
allowed_predicates: []
contract_types:
- Function
- Block
description: Краевой случай. Ортогональный.
contract_types: [Function, Block]
protected: false
orthogonal: true
decision_memory: false
alias_for: null
TEST_FIXTURE:
type: string
multiline: false
description: Тестовая фикстура или набор данных. Ортогональный.
separator: null
is_reference: false
enum: []
allowed_predicates: []
contract_types:
- Block
description: Тестовая фикстура. Ортогональный.
contract_types: [Block]
protected: false
orthogonal: true
decision_memory: false
alias_for: null
TEST_INVARIANT:
type: string
multiline: false
description: Инвариант, проверяемый тестом. Ортогональный.
separator: null
is_reference: false
enum: []
allowed_predicates: []
contract_types:
- Module
- Function
description: Инвариант теста. Ортогональный.
contract_types: [Module, Function]
protected: false
orthogonal: true
decision_memory: false
alias_for: null
TEST_SCENARIO:
type: string
multiline: false
description: Тестовый сценарий (шаги + ожидаемый результат). Ортогональный.
separator: null
is_reference: false
enum: []
allowed_predicates: []
contract_types:
- Function
- Block
description: Сценарий теста. Ортогональный.
contract_types: [Function, Block]
protected: false
orthogonal: true
decision_memory: false
alias_for: null
UX_FEEDBACK:
type: string
multiline: false
description: 'Формат обратной связи: тосты, инлайн-ошибки, модальные окна. Ортогональный для Component.'
separator: null
is_reference: false
enum: []
allowed_predicates: []
contract_types:
- Component
description: Формат обратной связи. Component.
contract_types: [Component]
protected: false
orthogonal: true
decision_memory: false
alias_for: null
UX_REACTIVITY:
type: string
multiline: false
description: 'Реактивная модель: store-driven render, optimistic updates, debounced inputs. Ортогональный для Component.'
separator: null
is_reference: false
enum: []
allowed_predicates: []
contract_types:
- Component
description: Реактивная модель. Component.
contract_types: [Component]
protected: false
orthogonal: true
decision_memory: false
alias_for: null
UX_RECOVERY:
type: string
multiline: false
description: 'Стратегия восстановления: retry, fallback-интерфейс, ручной перезапуск. Ортогональный для Component.'
separator: null
is_reference: false
enum: []
allowed_predicates: []
contract_types:
- Component
description: Стратегия восстановления. Component.
contract_types: [Component]
protected: false
orthogonal: true
decision_memory: false
alias_for: null
UX_STATE:
type: string
multiline: false
description: Конечный автомат UX-состояний (loading → ready → error). Обязателен для Component с C3+.
separator: null
is_reference: false
enum: []
allowed_predicates: []
contract_types:
- Component
description: Конечный автомат UX. Обязателен Component C3+.
contract_types: [Component]
protected: false
orthogonal: false
decision_memory: false
alias_for: null
RELATION:
type: string
multiline: false
description: 'Графовая зависимость: PREDICATE -> [TargetId]. Predicates: DEPENDS_ON, CALLS, INHERITS, IMPLEMENTS, DISPATCHES, BINDS_TO, CALLED_BY, VERIFIES. Обязателен с C3.'
separator: null
description: 'Графовая зависимость. Обязателен с C3.'
is_reference: true
enum: []
allowed_predicates:
- DEPENDS_ON
- CALLS
- INHERITS
- IMPLEMENTS
- DISPATCHES
- BINDS_TO
- CALLED_BY
- VERIFIES
allowed_predicates: [DEPENDS_ON, CALLS, INHERITS, IMPLEMENTS, DISPATCHES, BINDS_TO, CALLED_BY, VERIFIES]
contract_types:
- Module
- Function
@@ -522,15 +452,10 @@ tags:
protected: false
orthogonal: false
decision_memory: false
alias_for: null
PRE:
type: string
multiline: true
description: 'Предусловия выполнения. Должны быть проверены в коде через if/raise (не assert). Обязателен с C4.'
separator: null
is_reference: false
enum: []
allowed_predicates: []
description: 'Предусловия. Обязателен с C4.'
contract_types:
- Module
- Function
@@ -540,15 +465,10 @@ tags:
protected: false
orthogonal: false
decision_memory: false
alias_for: null
POST:
type: string
multiline: true
description: 'Гарантии результата. Обязателен с C4. Не может быть ослаблен без проверки upstream @RELATION зависимостей.'
separator: null
is_reference: false
enum: []
allowed_predicates: []
description: 'Гарантии результата. Обязателен с C4.'
contract_types:
- Module
- Function
@@ -558,15 +478,10 @@ tags:
protected: false
orthogonal: false
decision_memory: false
alias_for: null
RATIONALE:
type: string
multiline: true
description: 'Обоснование выбранного решения. C5-only. Часть Decision Memory — расширяет логический скелет архитектуры.'
separator: null
is_reference: false
enum: []
allowed_predicates: []
description: 'Обоснование. Универсально опциональный (C1+). Decision Memory.'
contract_types:
- Module
- Function
@@ -579,15 +494,10 @@ tags:
protected: false
orthogonal: false
decision_memory: true
alias_for: null
REJECTED:
type: string
multiline: true
description: 'Отвергнутый альтернативный путь с указанием причины. C5-only. Часть Decision Memory — запрещает воскрешение rejected-пути.'
separator: null
is_reference: false
enum: []
allowed_predicates: []
description: 'Отвергнутый путь. Универсально опциональный (C1+). Decision Memory.'
contract_types:
- Module
- Function
@@ -600,15 +510,10 @@ tags:
protected: false
orthogonal: false
decision_memory: true
alias_for: null
DATA_CONTRACT:
type: string
multiline: false
description: 'DTO-маппинг: Input -> InputDTO, Output -> OutputDTO. Обязателен с C5.'
separator: null
is_reference: false
enum: []
allowed_predicates: []
description: 'DTO-маппинг. Обязателен с C5.'
contract_types:
- Module
- Function
@@ -618,15 +523,10 @@ tags:
protected: false
orthogonal: false
decision_memory: false
alias_for: null
INVARIANT:
type: string
multiline: true
description: 'Инвариант — условие, которое всегда истинно для данного контракта. Обязателен с C5.'
separator: null
is_reference: false
enum: []
allowed_predicates: []
description: 'Инвариант. Обязателен с C5.'
contract_types:
- Module
- Function
@@ -638,15 +538,11 @@ tags:
protected: false
orthogonal: false
decision_memory: false
alias_for: null
LAYER:
type: string
multiline: false
description: 'Архитектурный слой: Service, UI, Infrastructure, Domain. Ортогональный — Module/Skill/Agent-специфичный.'
separator: null
is_reference: false
enum: []
allowed_predicates: []
description: 'Слой: Core, Domain, API, UI, Service, Infrastructure, Plugin. Универсально опциональный.'
enum: [Core, Domain, API, UI, Service, Infrastructure, Plugin]
contract_types:
- Module
- Skill
@@ -654,11 +550,9 @@ tags:
protected: false
orthogonal: true
decision_memory: false
alias_for: null
# #endregion TagSchema
# #region InfrastructureConfig [C:2] [TYPE Block] [SEMANTICS config,embedding,http]
# @BRIEF Инфраструктурные настройки: embedding, HTTP API, doc-режим.
embedding: null
http_api:
http_enabled: false