chantier: durcissement reprise headless inter-projets + persistance profils Opencode

- Implémentation reprise de session Opencode headless (conversational_recovery)
- Persistance des profils IA Opencode dans .ideai/memory avec JSON Schema
- Gestion des permissions MCP pour agents externes
- Tests QA verts : structured_launch_d3, conversation_log, tickets_missing_carnet, agents, ProfilesSettings
This commit is contained in:
2026-07-28 12:23:34 +02:00
parent 78f7c8fe2d
commit 045e0984cc
15 changed files with 782 additions and 49 deletions

View File

@ -56,7 +56,10 @@ function describe(e: unknown): string {
function tabFor(profile: AgentProfile): ProfileTab | null {
if (profile.structuredAdapter === "codex") return "codex";
if (profile.structuredAdapter === "claude") return "claude";
if (profile.structuredAdapter === "openCode" && profile.opencode) {
if (
profile.structuredAdapter === "openCode" &&
(profile.opencode || profile.opencodeProvider)
) {
return "openCode";
}
return null;
@ -352,6 +355,16 @@ export function ProfilesSettings() {
setBusy(true);
setError(null);
try {
if (activeTab === "openCode") {
const created = await profile.cloneOpenCodeProfileFromSeed({
name: `${seed.name} copy`,
opencode: seed.opencode,
});
await profile.saveProfile(created);
await refresh();
return;
}
const models =
activeTab === "codex" || activeTab === "claude"
? catalogue[activeTab].models
@ -404,6 +417,16 @@ export function ProfilesSettings() {
setBusy(true);
setError(null);
try {
if (source.structuredAdapter === "openCode") {
const created = await profile.cloneOpenCodeProfileFromSeed({
name: `${source.name} copy`,
opencode: source.opencode,
});
await profile.saveProfile(created);
await refresh();
return;
}
await profile.cloneProfileFromSeed({
seedProfileId: source.id,
name: `${source.name} copy`,