feat(wave): #119/#122/#131/#132 verts + sprint plugins ESM/persistance #135/#136/#139

État d'intégration confiné à la branche batch. Les tickets #119 (skills →
capacités agent découvrables), #122 (override permissions par défaut), #131
(effort par agent/presets) et #132 (outil MCP d'édition du contexte projet)
sont verts en périmètre. Le sprint plugins multi-fichiers ESM / persistance
plugin-owned (#135/#136/#139) est co-implémenté dans les MÊMES fichiers de
câblage (frontend/src/ports/index.ts, backend/src/lib.rs, domain/ports.rs,
backend/dto.rs), inséparable sans staging interactif (indisponible ici).

Commit unique volontaire : préserve l'état vert QA sans découpe hunk risquée.
NON mergé vers develop tant que #137 (QA e2e plugins) n'est pas vert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-03 11:06:23 +02:00
parent 22c6bd803d
commit 171c6c923c
59 changed files with 3654 additions and 291 deletions

View File

@ -15,6 +15,7 @@ import type {
AppExitWorkGuardState,
CustomProviderConfig,
DomainEvent,
EffortSelection,
EmbedderEngines,
EmbedderProfile,
EmbeddedServerStatus,
@ -24,6 +25,7 @@ import type {
GitFileStatus,
GraphCommit,
HealthReport,
JsonValue,
LayoutKind,
LayoutList,
LayoutOperation,
@ -38,7 +40,6 @@ import type {
OpenCodeConfig,
OpenCodeProviderCatalogEntry,
ProfileModelCatalog,
EffectivePermissions,
PairedDevice,
PairingCode,
PermissionSet,
@ -71,11 +72,13 @@ import type {
ProjectSystemPermissions,
ProfileAvailability,
ResumableAgent,
ResolvedAgentPermissions,
ResolvedAgentSystemPermissions,
ReplyChunk,
ServerExposurePreview,
ServerExposureSettings,
Skill,
SkillKind,
SkillScope,
SystemPermissionSet,
Sprint,
@ -207,6 +210,15 @@ export interface AgentGateway {
rows: number,
cols: number,
): Promise<{ agent: Agent; relaunchedSession?: TerminalSession }>;
/**
* Sets or clears one agent's effort override. `null` clears the override and
* lets launch fall back to the profile default.
*/
updateAgentEffort(
projectId: string,
agentId: string,
effort: EffortSelection | null,
): Promise<Agent>;
/** Reads an agent's `.md` context by agent id. */
readContext(projectId: string, agentId: string): Promise<string>;
/** Overwrites an agent's `.md` context. */
@ -538,6 +550,8 @@ export interface CreateSkillInput {
/** Owning project (resolved to a root; ignored on disk for `global`). */
projectId: string;
name: string;
description?: string | null;
kind?: SkillKind;
content: string;
scope: SkillScope;
}
@ -925,7 +939,7 @@ export interface PermissionGateway {
resolveAgentPermissions(
projectId: string,
agentId: string,
): Promise<EffectivePermissions | null>;
): Promise<ResolvedAgentPermissions>;
/** Reads the full project system-permission document. */
getProjectSystemPermissions(projectId: string): Promise<ProjectSystemPermissions>;
/** Replaces or removes project-level default system permissions. */
@ -1496,6 +1510,21 @@ export interface PluginConfigGateway {
updateDocument(input: PluginConfigDocumentUpdateInput): Promise<PluginConfigDocumentWriteResult>;
}
export interface PluginStorageGetInput {
pluginId: string;
key: string;
}
export interface PluginStorageSetInput extends PluginStorageGetInput {
value: JsonValue;
}
export interface PluginStorageGateway {
get(input: PluginStorageGetInput): Promise<JsonValue | null>;
set(input: PluginStorageSetInput): Promise<void>;
delete(input: PluginStorageGetInput): Promise<boolean>;
}
export interface Gateways {
system: SystemGateway;
agent: AgentGateway;
@ -1526,4 +1555,5 @@ export interface Gateways {
pluginToolchain: PluginToolchainGateway;
pluginEvents: PluginEventGateway;
pluginConfig: PluginConfigGateway;
pluginStorage: PluginStorageGateway;
}