feat: implémentation et QA ticket99 - agent model configuration v2

- backend A-C: VO Codex/Claude, renderers/projecteurs modèle, SecretRef/env, catalogues/use cases/Tauri commands
- frontend D: profils Codex/Claude provider->model->secret, validations, conservation SecretRef
- fix: app-tauri embedded_server isolant IDEA_WEB_ROOT

QA: backend 57/57 tests, frontend 74/74 tests OK
This commit is contained in:
2026-07-26 11:56:25 +02:00
parent 13fb538880
commit dae07d35bb
27 changed files with 2358 additions and 143 deletions

View File

@ -13,6 +13,9 @@ import type {
AgentDrift,
AgentProfile,
AppExitWorkGuardState,
ClaudeProviderCatalogEntry,
CodexCustomProviderConfig,
CodexProviderCatalogEntry,
CustomProviderConfig,
DomainEvent,
EmbedderEngines,
@ -691,6 +694,24 @@ export interface ProfileGateway {
saveOpenCodeProviderProfile(
input: SaveOpenCodeProviderProfileInput,
): Promise<AgentProfile>;
/** Static catalogue of Codex providers/models (ticket #99). */
listCodexProviders(): Promise<CodexProviderCatalogEntry[]>;
/**
* Creates or replaces (by id) a Codex profile with provider/model/secret
* config. The literal API key is sealed backend-side and never returned.
*/
saveCodexProviderProfile(
input: SaveCodexProviderProfileInput,
): Promise<AgentProfile>;
/** Static catalogue of Claude providers/models (ticket #99). */
listClaudeProviders(): Promise<ClaudeProviderCatalogEntry[]>;
/**
* Creates or replaces (by id) a Claude profile with provider/model/secret
* config. The literal API key is sealed backend-side and never returned.
*/
saveClaudeProviderProfile(
input: SaveClaudeProviderProfileInput,
): Promise<AgentProfile>;
}
/** Input for {@link ProfileGateway.cloneOpenCodeProfileFromSeed}. */
@ -719,6 +740,32 @@ export interface SaveOpenCodeProviderProfileInput {
custom?: CustomProviderConfig;
}
/** Input for {@link ProfileGateway.saveCodexProviderProfile}. */
export interface SaveCodexProviderProfileInput {
/** The profile to create or replace (by id). */
profile: AgentProfile;
/** Provider id used as Codex's `model_provider`. */
providerId: string;
/** Model name served by this provider. */
model: string;
/** Literal API key — sealed into the `SecretStore`, never persisted as-is. */
apiKey: string;
/** Optional custom endpoint config for a Codex provider. */
custom?: CodexCustomProviderConfig;
}
/** Input for {@link ProfileGateway.saveClaudeProviderProfile}. */
export interface SaveClaudeProviderProfileInput {
/** The profile to create or replace (by id). */
profile: AgentProfile;
/** Provider id. V1 backend exposes `"anthropic"`. */
providerId: string;
/** Model name served by this provider. */
model: string;
/** Literal API key — sealed into the `SecretStore`, never persisted as-is. */
apiKey: string;
}
/**
* Local model servers (F35). CRUD over the global registry of declared
* `llama.cpp` servers an OpenCode profile can bind to via