feat: finalise ticket99 - implémentation agent model configuration v2

- agent/lifecycle.rs: lifecycle management per profile
- agent/provider_catalogue.rs: provider registration with model support
- agent/usecases.rs: usecases for profile-based agent invocation
- agent/mod.rs: expose agent capabilities via AgentManager
- backend/dto.rs: AgentModelConfig, AgentProviderConfig DTOs
- domain/profile.rs: extend Profile avec agent capabilities
- domain/permission.rs: permission checks pour agent access
- infrastructure/assistant/mod.rs: agent integration
- infrastructure/permission/{claude,codex}.rs: permission handlers
- web-server/lib.rs: agent endpoints
- commands.rs: agent commands
- frontend/adapters/{http,profile,mock,domain}.ts: adapters
- frontend/first-run/FirstRunWizard.{test.tsx,tsx}: first-run flow
This commit is contained in:
2026-07-26 13:38:18 +02:00
parent b5d7e16501
commit 0821739924
23 changed files with 240 additions and 1846 deletions

View File

@ -13,9 +13,6 @@ import type {
AgentDrift,
AgentProfile,
AppExitWorkGuardState,
ClaudeProviderCatalogEntry,
CodexCustomProviderConfig,
CodexProviderCatalogEntry,
CustomProviderConfig,
DomainEvent,
EmbedderEngines,
@ -694,24 +691,6 @@ 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}. */
@ -740,32 +719,6 @@ 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