Kantin-Petit
a29c9dbdf0
feat(agent): maxSteps configurable, défaut 8->24 (tâches multi-outils) (v0.37.0)
...
Construire un workflow n8n (flux SDK) dépasse 8 étapes. maxAgentSteps via
CHLOVA_MAX_AGENT_STEPS, passé config -> ChatService -> runAgentTurn. 83 tests
verts.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_016w5jRe87MGdd6AMvXQcHNi
2026-06-24 00:11:45 +02:00
Kantin-Petit
0da5e2aba1
feat(chat): conversations persistantes + mémoire multi-tour (v0.36.0)
...
Store SQLite conversations/messages (propriété par actor, fenêtre 20),
historique rejoué au LLM (runAgentTurn history), ChatService persiste et
renvoie conversationId. API GET/DELETE /conversations + chat avec
conversationId. UI Chat: sidebar conversations (drawer mobile), nouvelle,
reprise, suppression. docs/conversations.md. 83 tests verts, build web vert.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_016w5jRe87MGdd6AMvXQcHNi
2026-06-23 23:25:42 +02:00
Kantin-Petit
2d3c944699
fix(mcp): intégration réelle passerelle MCP Portainer (image+auth) (v0.34.0)
...
Image portainer-mcp 0.6.0 (inexistant) -> 2.42.6. Passerelle HTTP :17717/mcp
attend Bearer (secret passerelle) + X-Portainer-API-Key (clé API restreinte
chlova) : ajout config.portainerApiKey + McpServerConfig.extraHeaders, backend
envoie les deux. socket-proxy supprimé (plus de socket monté). Compose prod,
.env.example, deploy.md à jour. Typecheck + 78 tests verts.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_016w5jRe87MGdd6AMvXQcHNi
2026-06-23 13:50:09 +02:00
Kantin-Petit
d824d16eed
feat(infra): prêt au déploiement GitOps Portainer + Telegram optionnel (v0.32.0)
...
Compose de prod docker-compose.prod.yml (GitOps, sans env_file, réseau proxy
réel, certresolver letsencrypt) + runbook docs/deploy.md (Phase 1, users
chlova restreints Portainer/n8n). Surface Telegram rendue optionnelle pour un
déploiement UI-only ; garde assertHasSurface fail-closed. Typecheck + 78 tests
verts.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_016w5jRe87MGdd6AMvXQcHNi
2026-06-23 11:27:07 +02:00
Kantin-Petit
2bfa58f440
feat: outil propose_asset + auto-extension exposée, fin Phase 5 v1 (v0.27.0)
...
Outil local sanctionné chlova.propose_asset : l'agent propose un asset →
write+commit+version+doc → need-review (privilégié = BLOQUÉ). Notion
ToolSpec.sanctioned (autorisé par gatekeeper, audité). Flag
CHLOVA_AUTOEXT_ENABLED (off défaut) + CHLOVA_REPO_ROOT. Prompt impose un
palier honnête. 75 tests, 0 vuln, compose OK.
Palier de risque : privilégié (l'agent écrit+commit) — derrière flag +
Phase 2 ; l'asset produit n'est jamais exécuté, il reste sous review.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 06:38:45 +02:00
Kantin-Petit
bc61434f7c
feat: GitCommitter + AutoExtensionService (v0.26.0)
...
propose() : écrit artefact+doc → commit ciblé + version → enregistre
l'asset en need-review (privilégié = BLOQUÉ sans sursis) → alerte
asset_created (version+commit+doc). N'exécute jamais l'asset. Commits
ciblés (jamais add -A). 73 tests (dépôt git temp), 0 vuln.
Palier de risque : privilégié (écrit + commit dans le dépôt) — derrière
flag + Phase 2 ; n'exécute aucun asset, tout reste sous review.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 06:35:08 +02:00
Kantin-Petit
d1255b926b
feat: ArtifactWriter auto-extension (artefact + doc) (v0.25.0)
...
Écrit un asset auto-créé (workflow/outil) + sa doc générée depuis le
gabarit, chemins sanitizés (anti-traversée), semver validé. 5 tests
(dépôt temp). Le dépôt fait foi avant tout passage en need-review.
Palier de risque : reversible (écriture fichier locale, sans commit ni exécution).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 06:32:49 +02:00
Kantin-Petit
e6edf1a8bc
feat: UI vue Review + backend sert le SPA, fin Phase 4 v1 (v0.24.0)
...
Vue Review (liste assets, approuver/refuser + confirm, refresh, 401→logout).
Backend sert le SPA same-origin (@fastify/static + fallback) si CHLOVA_WEB_ROOT.
Dockerfile multi-stage build web+API (contexte racine), image embarque /app/web.
Compose contexte .., image chlova/backend:0.2.0. 65 tests, 0 vuln, compose OK.
Palier de risque : privilégié (surface exposée complète) — non déployée ;
auth + CHLOVA_PHASE requis pour activer.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 05:56:01 +02:00
Kantin-Petit
e97c885ebf
feat: exposition Traefik + provisioning auth (v0.21.0)
...
Backend exposé via Traefik+TLS (réseau traefik-public externe, labels,
CHLOVA_DOMAIN) — surface unique. Script provision-auth (hash scrypt +
TOTP otpauth + JWT). .env.example section API/UI. security.md : surface
exposée Phase 4. Compose revalidé.
Palier de risque : privilégié (exposition réseau) — non déployé ; auth
requise pour activer l'API.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 02:15:17 +02:00
Kantin-Petit
26debf2fe0
feat: API HTTP authentifiée (chat + review) (v0.20.0)
...
registerApi : login rate-limité → JWT, puis Bearer obligatoire sur
/api/chat, /api/review (+approve/refuse), /api/state. CORS restreint +
rate-limit. Réutilise ChatService + ReviewService. API activée seulement
si auth configurée (apiAuth). 65 tests (5 via inject), 0 vuln.
Palier de risque : privilégié (surface exposée) — montée seulement si
auth présente ; non exposée tant que .env non renseigné.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 02:13:03 +02:00
Kantin-Petit
e322ed1167
feat: auth surface exposée + ChatService partagé (v0.19.0)
...
Auth login fort : mot de passe scrypt + TOTP 2FA (otplib) + JWT HS256
(jose), login tout-ou-rien sans indice. ChatService factorise le tour
d'agent pour toutes les surfaces (Telegram refactoré). 60 tests, 0 vuln.
Palier de risque : reversible (logique d'auth ; surface API câblée en v0.20).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 02:06:32 +02:00
Kantin-Petit
db96c4a25e
feat: hook 1ère exéc provisoire + scheduler digest/J-1 + config webhook (v0.17.0)
...
ALERT_WEBHOOK_URL (secret) → HttpAlertSender sinon NullAlertSender.
Gatekeeper émet onFirstProvisionalExec (1ère exéc PROVISOIRE) et route
onBlockedAttempt vers une alerte. Scheduler quotidien digest + rappel J-1,
câblé Phase 2 + arrêt propre. 53 tests verts.
Palier de risque : reversible.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 01:52:59 +02:00
Kantin-Petit
0a2eb203ee
feat: module alertes (sender fail-soft + builders digest/J-1) (v0.16.0)
...
AlertEvent sans secret ; HttpAlertSender (POST webhook n8n, best-effort)
+ NullAlertSender ; buildDailyDigest / selectExpiringSoon purs. 6 tests.
Rattrape l'entrée CHANGELOG 0.15.1 omise.
Palier de risque : reversible.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 01:50:18 +02:00
Kantin-Petit
52980837a9
docs: documentation + gate de phase compose, fin Phase 2 (v0.14.0)
...
docs/need-review.md (cycle complet : états, sursis, gatekeeper, cron,
review, rollback). CHLOVA_PHASE dans .env.example + compose (défaut 1).
risk-tiers + README : application par phase. Compose revalidé, 45 tests,
0 vuln.
Palier de risque : n/a (doc + config).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 01:34:12 +02:00
Kantin-Petit
a193b4e912
feat: cron expiration + commandes de review owner (v0.13.0)
...
ReviewService (approuver/refuser/lister) + cron horaire PROVISOIRE→BLOQUÉ.
Commandes Telegram owner /pending /approve /refuse hors boucle agent (le
LLM ne peut pas décider de la review). Câblage Phase 2 : routage
commande/agent, cron démarré + arrêt propre. 45 tests verts.
Palier de risque : reversible (contrôle humain ; n'exécute aucune mutation).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 01:32:18 +02:00
Kantin-Petit
48aa75d95e
feat: exposition outils mutants Phase 2 + câblage par phase (v0.12.0)
...
registry.listAllTools expose les outils mutants (contrôle délégué au
gatekeeper). Prompt système phase-aware. index.ts branche Phase 1
(read-only + ReadOnlyGuard) ou Phase 2 (tous outils + GatekeeperGuard sur
table assets, alerte sur tentative bloquée). Build + 35 tests verts.
Palier de risque : privilégié (active la capacité d'écriture) — gardé
derrière CHLOVA_PHASE=2 + gatekeeper ; aucune mutation réelle sans review.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 01:29:58 +02:00
Kantin-Petit
93d93bef0e
feat: gatekeeper service + gate de phase (v0.11.0)
...
Gatekeeper vérifie le statut d'asset avant chaque exécution : privilégié
inconnu → BLOQUÉ (aucun sursis) refusé jusqu'à review + hook d'alerte ;
approuvé → exécutable. Lecture seule autorisée sans asset. Gate de phase
CHLOVA_PHASE (défaut 1, fail-safe) ; assertReadOnlyPhase phase-aware. 7
nouveaux tests.
Palier de risque : reversible (logique de contrôle, n'exécute aucune mutation).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 01:27:35 +02:00
Kantin-Petit
56e948c976
feat: AssetRepository SQLite + cycle need-review persistant (v0.10.0)
...
Table assets sur node:sqlite (Node 24, zéro dep native) : CRUD,
listByStatus, incrementExec, setRiskTier anti-escalade, expireProvisional
(cron PROVISOIRE→BLOQUÉ). 6 tests. Bump Node 24 (sqlite stable), Dockerfile
24.13 + copie tsconfig.build.json. 0 vuln.
Palier de risque : reversible (persistance d'état, aucune mutation d'infra).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 01:24:35 +02:00
Kantin-Petit
1cce8c9db6
test: gatekeeper + readonly-filter + config, interfaces need-review (v0.9.0)
...
Fin Phase 1. 22 tests verts : barrière readonly-filter (fail-safe),
ReadOnlyGuard, paliers de risque + sursis, invariant anti-escalade,
config fail-closed + masquage secrets. Interfaces du cycle need-review
posées pour la Phase 2 (Asset, canExecute) sans câblage runtime. Split
tsconfig typecheck/build.
Palier de risque : reversible.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 01:18:02 +02:00
Kantin-Petit
c6309fd9a5
feat: surface Telegram + câblage Phase 1 complet (v0.8.0)
...
Long-polling Telegram (zéro port, allowlist obligatoire, backoff).
ReadOnlyGuard en défense profondeur. Prompt système anti-injection.
index.ts câble MCP read-only → cerveau → Telegram avec arrêt propre.
Build vert.
Palier de risque : reversible.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 01:14:59 +02:00
Kantin-Petit
bfce952817
feat: registry MCP + readonly-filter (v0.7.0)
...
Barrière n°1 de la lecture seule : seuls les outils readOnlyHint=true sont
exposés (fail-safe, palier de risque déduit côté code). Registry connecte
n8n + Portainer en HTTP authentifié et produit des ToolHandle read-only.
Retrait d'exactOptionalPropertyTypes pour interop SDK MCP (reste strict).
Palier de risque : reversible.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 01:13:03 +02:00
Kantin-Petit
be1ad76966
feat: client Ollama + boucle agent tool-calling (v0.6.0)
...
Client /api/chat (modèles cloud via proxy, auth Bearer, timeout, erreurs
sans fuite). Boucle comprendre→outil→observer→répondre avec garde-fou
anti-boucle, audit par appel et Guard injecté (abstraction prête pour le
gatekeeper Phase 2). ToolHandle découplé de MCP.
Palier de risque : reversible.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 01:10:56 +02:00
Kantin-Petit
5fcb3ef18d
feat: squelette orchestrateur TS fail-closed (v0.5.0)
...
Bootstrap backend Phase 1 : config zod fail-closed (refuse de démarrer
sans secret ; verrou lecture seule Portainer ; secrets masqués), logger
pino + journal d'audit, Dockerfile multi-stage non-root base épinglée,
vitest. Deps épinglées, npm audit 0 vuln, typecheck vert.
Palier de risque : reversible (aucune écriture branchée).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 01:09:02 +02:00