sentinelo / agent-core
Cœur métier des agents Sentinelo — neutre vis-à-vis de la plateforme (WordPress, PrestaShop, Symfony/Sylius/Laravel).
Requires
- php: >=8.1
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Cœur métier partagé par tous les agents Sentinelo. Il a vécu jusqu'ici dans
agents/wordpress/src/AgentCore/, à l'intérieur du plugin WordPress ; il en est sorti le jour
où un second agent a dû le consommer, parce qu'un cœur « partagé » qui n'est installable
que par copie n'est pas partagé, il est dupliqué.
Ce qu'il contient
Aucune ligne de ce paquet ne connaît WordPress, PrestaShop ou Symfony. Il fournit :
Port/— les interfaces que chaque plateforme implémente (FileSystem,DatabaseDumper,ObjectStorage,Crypto,Inventory,Scheduler,PackageInstaller, …) ;Backup/,Scanner/,Audit/,Webhook/,Storage/,Support/— les orchestrateurs, les barèmes et les constructeurs de payload, qui n'utilisent que ces ports.
Les trois règles qui ne se négocient pas
- Neutralité. Pas de
wp_*, pas de$wpdb, pas de constante WordPress — pas même dans une chaîne qui finit dans un payload. La règle est vérifiée partests/Neutrality/PlatformNeutralityTest.php, qui échoue sur simple présence du motif. - Le barème de scan ne s'invente pas.
Scanner\CheckCataloguedétient les identifiants de check et leurs points. Une plateforme déclare le sous-ensemble qu'elle sait honnêtement exécuter viaScanProfile::of([...]);ScoreCalculatornormalise sur ce qui a tourné. Un check qu'on ne peut pas faire est omis, jamais simulé — un stub distribue des points gratuits et fait mentir la comparaison entre deux sites. - Le contrat agent ↔ backend est produit ici.
Backup\BackupPayloadetBackup\RestorePayloadrendent à la fois la réponse de polling et le webhook ;Support\Timestampsest la seule autorité d'horodatage (UTC en stockage, ISO 8601 avec offset sur le fil). Voir la section « Agent ↔ backend contract » duCLAUDE.mdracine.
Consommation
Le paquet n'est pas publié sur Packagist. Les agents du monorepo le référencent par dépôt
path :
{
"repositories": [
{ "type": "path", "url": "../core" }
],
"require": { "sentinelo/agent-core": "@dev" }
}
En dehors du monorepo, il passe par le dépôt Composer privé — voir
docs/AGENT-DISTRIBUTION.md.
Déchiffrer une sauvegarde hors de Sentinelo : bin/sentinelo-decrypt
Une sauvegarde téléchargée depuis l'application est un fichier ….enc : l'agent chiffre
l'archive avant de l'envoyer (format SENTFENC / SENTFEN2, blocs de 1 Mio authentifiés).
La clé est dérivée de la configuration du site ; la plateforme ne la détient pas. Cet
outil rend l'archive d'origine — un tar (ou un zip pour les sauvegardes les plus
anciennes) contenant les fichiers et l'export SQL —, lisible ensuite par les outils
standard (tar -xf, mysql < …).
Prérequis : PHP 8.1 ou plus, avec l'extension sodium (ou openssl pour les archives
produites sur un hébergement qui n'avait pas sodium). Aucune autre dépendance : sans
vendor/, le script charge directement le chiffreur.
# La clé passe par l'environnement ou par un fichier, jamais par un argument # (elle serait visible dans la liste des processus et dans l'historique). SENTINELO_KEY_MATERIAL='…' php bin/sentinelo-decrypt sauvegarde.tar.enc sauvegarde.tar php bin/sentinelo-decrypt --key-file=cle.txt sauvegarde.tar.enc sauvegarde.tar tar -tf sauvegarde.tar
Codes de sortie : 0 succès, 1 déchiffrement refusé (clé fausse, archive altérée ou
tronquée — aucune sortie n'est alors laissée), 2 usage incorrect. Une sortie existante
n'est jamais écrasée.
Matière de clé, selon la plateforme du site — les valeurs brutes des constantes, concaténées dans cet ordre, sans séparateur :
| Plateforme | Matière de clé |
|---|---|
| WordPress / WooCommerce | AUTH_KEY puis SECURE_AUTH_KEY (wp-config.php) — par exemple wp eval 'echo AUTH_KEY . SECURE_AUTH_KEY;' |
| PrestaShop | _COOKIE_KEY_ puis _RIJNDAEL_KEY_ si la boutique la définit encore |
| Symfony / Sylius / Laravel | non couvert : l'agent Composer chiffre dans son propre format (OpenSslCrypto) |
Ce qu'il faut savoir avant d'en dépendre : la clé suit ces constantes. Si les clés du site sont régénérées (salts WordPress, clé de cookie PrestaShop), les archives produites avant ne se déchiffrent plus qu'avec les anciennes valeurs — conservez-les tant que vous voulez pouvoir relire ces sauvegardes.
Tests
Le paquet porte ses propres tests de neutralité et de barème :
docker run --rm -u $(id -u):$(id -g) -e HOME=/tmp -v $PWD:/w -w /w \ composer:2 sh -c 'composer install -q && php vendor/bin/phpunit --no-coverage'
Les tests de comportement les plus riches vivent encore dans agents/wordpress/tests/ : ils
exercent le cœur à travers l'agent WordPress, c'est-à-dire par le chemin qu'emprunte
la production. Ils y restent tant qu'aucun second agent ne les revendique.