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

@ -767,6 +767,21 @@ export interface EffectivePermissions {
fallback: PermissionPosture;
}
/** Agent override choices shadowed by stricter project defaults. */
export interface PermissionShadowReport {
read: boolean;
write: boolean;
delete: boolean;
executeBash: boolean;
fallback: boolean;
}
/** Resolved file/bash permissions plus non-authoritative diagnostics. */
export interface ResolvedAgentPermissions {
effective: EffectivePermissions | null;
shadowed: PermissionShadowReport;
}
/** Wanted/effective network policy for system permissions. */
export type NetworkPolicy = "allow" | "deny" | "ask";
@ -1151,6 +1166,21 @@ export interface ProfileModelCatalog {
warnings: string[];
}
/** One native effort/reasoning preset declared by an AI profile. */
export interface EffortOption {
/** Raw value persisted/forwarded to the provider. */
value: string;
/** Human-readable label shown in selectors. */
label: string;
/** Optional short description from the profile declaration. */
hint?: string;
}
/** Per-agent effort override. `undefined`/`null` means profile default. */
export type EffortSelection =
| { kind: "preset"; value: string }
| { kind: "custom"; value: string };
/**
* A declarative AI-CLI profile (mirror of the backend `AgentProfile`). `id` is a
* UUID string; `detect` is the optional detection command line.
@ -1192,6 +1222,16 @@ export interface AgentProfile {
* CLI's own default. OpenCode keeps its dedicated provider/local model fields.
*/
model?: string;
/**
* Optional direct CLI reasoning effort configured on the profile. `undefined`
* keeps the CLI/provider default.
*/
modelReasoningEffort?: string;
/**
* Native effort presets exposed by this profile, in declaration order from
* light to deep. Empty/omitted means the provider declares no native options.
*/
effortOptions?: EffortOption[];
}
/** Availability of a candidate profile after detection (mirror of the DTO). */
@ -1233,6 +1273,8 @@ export interface Agent {
synchronized: boolean;
/** Skills assigned to this agent (injected into its convention file). */
skills: SkillRef[];
/** Per-agent effort override. Omitted for older manifests/profile default. */
effort?: EffortSelection;
}
/**
@ -1284,6 +1326,7 @@ export interface ResumableAgent {
* across projects; `project` skills are specific to one project's `.ideai/`.
*/
export type SkillScope = "global" | "project";
export type SkillKind = "workflow" | "reference";
/**
* A reusable, model-agnostic workflow assignable to agents (mirror of the
@ -1292,6 +1335,8 @@ export type SkillScope = "global" | "project";
export interface Skill {
id: string;
name: string;
description?: string | null;
kind: SkillKind;
contentMd: string;
scope: SkillScope;
}