Lot 17 : interrupteurs système tenus par la façade (LOKI_SYSTEM=rust)

La façade sert /api/internet (moteur web, serveur Crawl4AI et sa clé
jamais rendue, joignabilité avec son cache de 30 s), /api/computer
(interrupteur du navigateur, binaire trouvé, vision), /api/apikey (clé de
complétion, repli sur config.env, adresse /v1 à coller dans un client
tiers) et /api/network (écoute du moteur) quand LOKI_SYSTEM=rust
(expérimental ; le Go reste le défaut).

Restent au Go derrière son API interne (facade_system.go) : le cache de
joignabilité de ses outils web (/internal/v1/web/reach/reset), le
Chromium des outils browser_* (/internal/v1/cdp/shutdown) et le
redémarrage qui applique une clé neuve quand la façade ne pilote pas le
moteur (/internal/v1/service/action). Le relais du tunnel garde l'hôte
et X-Forwarded-Proto du client.

Correction en passant : maskAPIKey paniquait sur une clé d'un octet, et
/api/apikey tombait à chaque lecture.

Parité : parity_system_test.go tire du Go 61 appels de route avec la
base et les sondes reçues par trois faux Crawl4AI après chacun, et huit
dispositions du dossier de Playwright, rejoués par tests/system.rs ; ce
qui reste au Go vérifié de bout en bout ; TestFacadeSysteme,
TestFacadeRelaisGardeHote et TestMaskAPIKeyCourte côté Go.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016tcGfJWefW5kUGoC2wL8cv
This commit is contained in:
Claude committed 2026-10-15 18:51:58 +00:00
1 parent 2da2efc1fd
commit a4f8bd3ec4
19 files changed
+3110 -3

No files matched your search

+9
View File
@@ -82,6 +82,9 @@ pub struct Config {
/// Pilotage du moteur tenu par la façade (`LOKI_ENGINE=rust`) :
/// démarrage, arrêt, déchargement de la VRAM ; `None` : au Go.
pub engine_ctl: Option<Arc<crate::enginectl::EngineCtl>>,
/// Interrupteurs système (internet, navigateur, clé de complétion,
/// réseau) tenus par la façade (`LOKI_SYSTEM=rust`) ; `None` : au Go.
pub system: Option<Arc<crate::system::System>>,
}
struct Proxy {
@@ -117,6 +120,7 @@ pub async fn serve(
mem: cfg.mem,
presets: cfg.presets,
engine_ctl: cfg.engine_ctl,
system: cfg.system,
internal_token: cfg.internal_token.clone(),
},
});
@@ -204,6 +208,11 @@ impl Proxy {
{
return chatapi::serve(&self.ctx, chat, req, from_go).await;
}
if let Some(s) = &self.ctx.system
&& crate::system::handles(path)
{
return crate::system::serve(&self.ctx, s, req, from_go).await;
}
if let Some(e) = &self.ctx.engine_ctl
&& crate::enginectl::handles(path)
{