Files
chlova/orchestrator
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
..

orchestrator — backend CHLOVA

Le cerveau : LLM en boucle tool-calling. Phase 1 = lecture seule. Seule surface exposée de la stack (voir ../CLAUDE.md, ../docs/architecture.md).

Stack

Node 22, TypeScript (ESM, NodeNext, strict), Fastify, MCP SDK officiel, pino (audit), zod (config), Vitest (tests). Toutes deps épinglées ; npm audit doit rester à 0 vuln.

Démarrage (dev)

cp ../.env.example ../.env   # renseigner les secrets (jamais commités)
npm install
npm run dev                  # tsx watch
npm run typecheck
npm test

Modules

Fichier Rôle
src/config.ts Config fail-closed (zod). Refuse de démarrer si secret manquant. assertReadOnlyPhase() verrouille la lecture seule P1. redactedConfig() masque les secrets.
src/audit/log.ts Logger pino + journal d'audit des exécutions d'outils.
src/index.ts Bootstrap : config → verrou RO → logger → (P1) MCP + agent + Telegram. Healthcheck interne.
src/llm/ Client Ollama + boucle agent (v0.6.0).
src/mcp/ Registry MCP + readonly-filter (v0.7.0).
src/gatekeeper/ Paliers de risque + table assets (interfaces P1, câblé P2).
src/surfaces/ Surface Telegram (v0.8.0).

Sécurité

  • Secrets par référence uniquement, jamais loggés (redactedConfig + redact pino).
  • Phase 1 : PORTAINER_READ_ONLY=false fait échouer le démarrage.
  • Aucun port publié (Telegram long-polling) ; Fastify n'écoute qu'en interne.

Palier de risque

reversible (lecture seule). Aucune capacité d'écriture branchée en Phase 1.