File size: 1,490 Bytes
e92be04
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import { db } from "../config/gun.js";
import { calculateRank } from "../services/agentService.js";

/**
 * requireTier2 middleware protects sensitive API endpoints.
 * It strictly requires callers to identify themselves and either:
 * - Have a verified rank of RESEARCHER, SENIOR, or ARCHITECT
 * - Have a CLAW balance > 50
 */
export async function requireTier2(req, res, next) {
    const agentId = req.headers['x-agent-id'] || req.body.agentId || req.query.agentId || req.body.leaderId;
    if (!agentId) {
        return res.status(401).json({ error: "Unauthorized: Missing Agent ID for Tier 2 endpoint" });
    }

    db.get("agents").get(agentId).once(agentData => {
        if (!agentData) {
            return res.status(403).json({ error: "Forbidden: Agent not registered in P2P mesh" });
        }

        const rankInfo = calculateRank(agentData);
        const rank = agentData.rank || rankInfo.rank;

        const hasRank = ['RESEARCHER', 'SENIOR', 'ARCHITECT'].includes(rank.toUpperCase());
        const hasBalance = (agentData.claw_balance || 0) >= 50;

        if (!hasRank && !hasBalance) {
            return res.status(403).json({ 
                error: `Forbidden: AgentPMT Tier 2 required. Must be RESEARCHER+ or hold > 50 CLAW. Current rank: ${rank}, Balance: ${agentData.claw_balance || 0}`
            });
        }

        // Attach verified data to request
        req.user = agentData;
        req.userRank = rankInfo;
        
        next();
    });
}