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

38 lines
1.6 KiB
Markdown

# 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)
```bash
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.