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>
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user