Search by

sentinelo / agent-core

sentinelo-webntricks

Cœur métier des agents Sentinelo — neutre vis-à-vis de la plateforme (WordPress, PrestaShop, Symfony/Sylius/Laravel).

v1.0.0 2026-10-01 17:16 UTC

This package is auto-updated.

Last update: 2026-10-01 17:27:18 UTC


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

  1. 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 par tests/Neutrality/PlatformNeutralityTest.php, qui échoue sur simple présence du motif.
  2. Le barème de scan ne s'invente pas. Scanner\CheckCatalogue détient les identifiants de check et leurs points. Une plateforme déclare le sous-ensemble qu'elle sait honnêtement exécuter via ScanProfile::of([...]) ; ScoreCalculator normalise 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.
  3. Le contrat agent ↔ backend est produit ici. Backup\BackupPayload et Backup\RestorePayload rendent à la fois la réponse de polling et le webhook ; Support\Timestamps est la seule autorité d'horodatage (UTC en stockage, ISO 8601 avec offset sur le fil). Voir la section « Agent ↔ backend contract » du CLAUDE.md racine.

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.