5fcb3ef18d
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>
38 lines
1.6 KiB
Markdown
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.
|