File size: 3,985 Bytes
4ae5926
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// bob.rs โ€” BOB routing logic
//
// BOB = TRUST-DEED-GATE โ†’ MAMBA โ†’ WATSON โ†’ PROLOG-KERNEL โ†’ HASKELL-MONAD โ†’ SEAL
//
// After ERRANT verifies linearity, BOB determines which MAGMA verb + agent
// handles the request. Mirrors bridge.mjs bobRoute() priority table.
//
// Priority (descending): SEAL > VAULT > SENTINEL > FORGE > ORACLE > ANCHOR > FLUX > NOVA

use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BobRoute {
    pub emoji:   &'static str,
    pub agent:   &'static str,
    pub action:  &'static str,
    pub subject: &'static str,   // NATS subject
    pub verb:    &'static str,   // MAGMA HTTP event name
}

#[derive(Debug, Default)]
pub struct BobSignals {
    pub has_seal:      bool,
    pub has_vault:     bool,
    pub ruptures:      i32,
    pub has_forge:     bool,
    pub has_resonance: bool,
    pub has_memory:    bool,
    pub has_echo:      bool,
    pub steps:         i32,
}

static ROUTE_SEAL:      BobRoute = BobRoute { emoji: "๐Ÿ”’", agent: "CIPHER",   action: "SIGN",      subject: "sovereign.cipher.seal.v1",    verb: "METAMINE_SEAL"    };
static ROUTE_VAULT:     BobRoute = BobRoute { emoji: "๐Ÿฆ", agent: "VAULT",    action: "APPROVE",   subject: "sovereign.vault.approve.v1",  verb: "VAULT_APPROVE"    };
static ROUTE_SENTINEL:  BobRoute = BobRoute { emoji: "๐Ÿ‘",  agent: "SENTINEL", action: "MONITOR",   subject: "sovereign.sentinel.watch.v1", verb: "SENTINEL_MONITOR" };
static ROUTE_FORGE:     BobRoute = BobRoute { emoji: "โš’๏ธ", agent: "FORGE",    action: "BUILD",     subject: "sovereign.forge.build.v1",    verb: "FORGE_BUILD"      };
static ROUTE_ORACLE:    BobRoute = BobRoute { emoji: "๐Ÿ”ฎ", agent: "ORACLE",   action: "KNOWLEDGE", subject: "sovereign.oracle.query.v1",   verb: "ORACLE_QUERY"     };
static ROUTE_MNEMEX:    BobRoute = BobRoute { emoji: "๐Ÿ“œ", agent: "MNEMEX",   action: "WORM",      subject: "sovereign.mnemex.anchor.v1",  verb: "ANCHOR"           };
static ROUTE_HERALD:    BobRoute = BobRoute { emoji: "โšก", agent: "HERALD",   action: "BROADCAST", subject: "sovereign.herald.flux.v1",    verb: "FLUX_BROADCAST"   };
static ROUTE_NOVA:      BobRoute = BobRoute { emoji: "๐Ÿง ", agent: "NOVA",     action: "SYNTHETIC", subject: "sovereign.nova.query.v1",     verb: "NOVA_SYNTHETIC"   };

impl BobSignals {
    /// Derive signals from ERRANT result + action string
    pub fn from_errant_and_action(
        errant: &crate::errant_ffi::ErrantResult,
        action: &str,
    ) -> Self {
        BobSignals {
            has_seal:      action.contains("seal") || action.contains("sign"),
            has_vault:     action.contains("vault") || action.contains("approve") || action.contains("transfer"),
            ruptures:      errant.ruptures,
            has_forge:     action.contains("forge") || action.contains("build"),
            has_resonance: action.contains("query") || action.contains("oracle") || action.contains("resona"),
            has_memory:    action.contains("anchor") || action.contains("memory"),
            has_echo:      errant.output.len() > 0,
            steps:         errant.steps,
        }
    }
}

pub fn route(signals: &BobSignals) -> &'static BobRoute {
    // TRUST-DEED-GATE: critical tasks always route through CIPHER for sealing
    if signals.has_seal      { return &ROUTE_SEAL;     }
    if signals.has_vault     { return &ROUTE_VAULT;    }
    if signals.ruptures > 0  { return &ROUTE_SENTINEL; }
    if signals.has_forge     { return &ROUTE_FORGE;    }
    if signals.has_resonance { return &ROUTE_ORACLE;   }
    if signals.has_memory    { return &ROUTE_MNEMEX;   }
    if signals.has_echo      { return &ROUTE_HERALD;   }
    &ROUTE_NOVA
}

/// The BOB pipeline stages printed in SSE stream
pub fn pipeline_stages() -> &'static [&'static str] {
    &["TRUST-DEED-GATE", "MAMBA", "WATSON", "PROLOG-KERNEL", "HASKELL-MONAD", "SEAL"]
}