trustgate-middleware 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +276 -0
- package/dashboard-dist/assets/index-CTD7-SPR.js +9 -0
- package/dashboard-dist/assets/index-PEgnqtSj.css +2 -0
- package/dashboard-dist/index.html +16 -0
- package/dist/classify.d.ts +14 -0
- package/dist/classify.d.ts.map +1 -0
- package/dist/classify.js +106 -0
- package/dist/classify.js.map +1 -0
- package/dist/emitter.d.ts +7 -0
- package/dist/emitter.d.ts.map +1 -0
- package/dist/emitter.js +36 -0
- package/dist/emitter.js.map +1 -0
- package/dist/index.d.ts +82 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +221 -0
- package/dist/index.js.map +1 -0
- package/dist/pricing.d.ts +65 -0
- package/dist/pricing.d.ts.map +1 -0
- package/dist/pricing.js +61 -0
- package/dist/pricing.js.map +1 -0
- package/dist/scoring.d.ts +38 -0
- package/dist/scoring.d.ts.map +1 -0
- package/dist/scoring.js +106 -0
- package/dist/scoring.js.map +1 -0
- package/dist/store.d.ts +9 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +72 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +59 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Context } from 'hono';
|
|
2
|
+
import type { ClassificationResult } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* 4-Tier Identity Classification
|
|
5
|
+
*
|
|
6
|
+
* 1. HUMAN — World ID cryptographic proof (unfakeable)
|
|
7
|
+
* 2. HUMAN_AGENT — AgentKit on-chain registration + World ID link
|
|
8
|
+
* 3. ANON_BOT (OWS) — OWS wallet signature (cryptographic, unfakeable)
|
|
9
|
+
* 3a. ANON_BOT (x402) — wallet address from x402 payment signature
|
|
10
|
+
* 3b. ANON_BOT (header) — self-reported address header (weak)
|
|
11
|
+
* 4. BLOCKED — no identity
|
|
12
|
+
*/
|
|
13
|
+
export declare function classifyRequest(c: Context): Promise<ClassificationResult>;
|
|
14
|
+
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../src/classify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,KAAK,EAAQ,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAkBzD;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAuF/E"}
|
package/dist/classify.js
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { TIER_COLORS } from './types';
|
|
2
|
+
import { isVerifiedHuman } from './store';
|
|
3
|
+
const OWS_SIGNATURE_MAX_AGE_MS = 5 * 60 * 1000;
|
|
4
|
+
async function verifyOwsSignature(message, signature, claimedAddress) {
|
|
5
|
+
try {
|
|
6
|
+
const { ethers } = await import('ethers');
|
|
7
|
+
const normalizedSig = signature.startsWith('0x') ? signature : `0x${signature}`;
|
|
8
|
+
const recovered = ethers.verifyMessage(message, normalizedSig);
|
|
9
|
+
if (recovered.toLowerCase() === claimedAddress.toLowerCase())
|
|
10
|
+
return recovered;
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 4-Tier Identity Classification
|
|
19
|
+
*
|
|
20
|
+
* 1. HUMAN — World ID cryptographic proof (unfakeable)
|
|
21
|
+
* 2. HUMAN_AGENT — AgentKit on-chain registration + World ID link
|
|
22
|
+
* 3. ANON_BOT (OWS) — OWS wallet signature (cryptographic, unfakeable)
|
|
23
|
+
* 3a. ANON_BOT (x402) — wallet address from x402 payment signature
|
|
24
|
+
* 3b. ANON_BOT (header) — self-reported address header (weak)
|
|
25
|
+
* 4. BLOCKED — no identity
|
|
26
|
+
*/
|
|
27
|
+
export async function classifyRequest(c) {
|
|
28
|
+
const result = (tier, address = null, humanId = null, owsVerified = false) => ({
|
|
29
|
+
tier,
|
|
30
|
+
color: TIER_COLORS[tier],
|
|
31
|
+
agentAddress: address,
|
|
32
|
+
humanId,
|
|
33
|
+
trustScore: tier === 'HUMAN' ? 100 : tier === 'HUMAN_AGENT' ? 40 : tier === 'ANON_BOT' ? (owsVerified ? 10 : 5) : 0,
|
|
34
|
+
owsVerified,
|
|
35
|
+
});
|
|
36
|
+
// TIER 1: World ID verification
|
|
37
|
+
const worldIdHeader = c.req.header('x-world-id') || c.req.header('x-world-id-proof');
|
|
38
|
+
if (worldIdHeader && isVerifiedHuman(worldIdHeader)) {
|
|
39
|
+
return result('HUMAN', null, worldIdHeader);
|
|
40
|
+
}
|
|
41
|
+
// TIER 2: AgentKit on-chain verification
|
|
42
|
+
try {
|
|
43
|
+
const { createAgentBookVerifier, parseAgentkitHeader, validateAgentkitMessage, verifyAgentkitSignature, AGENTKIT, } = await import('@worldcoin/agentkit');
|
|
44
|
+
const agentkitHeader = c.req.header(AGENTKIT) || c.req.header('agentkit');
|
|
45
|
+
if (agentkitHeader) {
|
|
46
|
+
const payload = parseAgentkitHeader(agentkitHeader);
|
|
47
|
+
const requestUrl = new URL(c.req.url).toString();
|
|
48
|
+
const validation = await validateAgentkitMessage(payload, requestUrl);
|
|
49
|
+
if (validation.valid) {
|
|
50
|
+
const verification = await verifyAgentkitSignature(payload);
|
|
51
|
+
if (verification.valid && verification.address) {
|
|
52
|
+
const agentBook = createAgentBookVerifier({ network: 'base' });
|
|
53
|
+
const humanId = await agentBook.lookupHuman(verification.address, payload.chainId);
|
|
54
|
+
if (humanId) {
|
|
55
|
+
return result('HUMAN_AGENT', verification.address, humanId);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// AgentKit not available or verification failed — continue
|
|
63
|
+
}
|
|
64
|
+
// TIER 3 (OWS): Open Wallet Standard signature verification
|
|
65
|
+
const owsSignature = c.req.header('x-ows-signature');
|
|
66
|
+
const owsMessage = c.req.header('x-ows-message');
|
|
67
|
+
const owsAddress = c.req.header('x-ows-address');
|
|
68
|
+
const owsTimestamp = c.req.header('x-ows-timestamp');
|
|
69
|
+
if (owsSignature && owsMessage && owsAddress && owsTimestamp) {
|
|
70
|
+
const ts = parseInt(owsTimestamp, 10);
|
|
71
|
+
const age = Date.now() - ts;
|
|
72
|
+
if (!isNaN(ts) && age >= 0 && age < OWS_SIGNATURE_MAX_AGE_MS) {
|
|
73
|
+
const recovered = await verifyOwsSignature(owsMessage, owsSignature, owsAddress);
|
|
74
|
+
if (recovered) {
|
|
75
|
+
return result('ANON_BOT', recovered, null, true);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// TIER 3a: x402 payment signature (cryptographic wallet proof)
|
|
80
|
+
const paymentHeader = c.req.header('payment-signature') || c.req.header('x-payment');
|
|
81
|
+
if (paymentHeader) {
|
|
82
|
+
try {
|
|
83
|
+
const decoded = JSON.parse(Buffer.from(paymentHeader, 'base64').toString());
|
|
84
|
+
const payerAddress = decoded?.payload?.authorization?.from || decoded?.from || decoded?.payload?.from;
|
|
85
|
+
if (payerAddress && payerAddress.startsWith('0x')) {
|
|
86
|
+
return result('ANON_BOT', payerAddress, null);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch { /* invalid payment header */ }
|
|
90
|
+
}
|
|
91
|
+
// TIER 3b: Direct tx hash payment proof
|
|
92
|
+
const paymentTxHash = c.req.header('x-payment-tx');
|
|
93
|
+
if (paymentTxHash && paymentTxHash.startsWith('0x')) {
|
|
94
|
+
const agentAddress = c.req.header('x-agent-address');
|
|
95
|
+
if (agentAddress)
|
|
96
|
+
return result('ANON_BOT', agentAddress, null);
|
|
97
|
+
}
|
|
98
|
+
// TIER 3c: Self-reported agent address (weak)
|
|
99
|
+
const agentAddress = c.req.header('x-agent-address');
|
|
100
|
+
if (agentAddress) {
|
|
101
|
+
return result('ANON_BOT', agentAddress, null);
|
|
102
|
+
}
|
|
103
|
+
// TIER 4: No identity
|
|
104
|
+
return result('BLOCKED');
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=classify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../src/classify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TrustGateEvent } from './types';
|
|
2
|
+
export declare function startWebSocketServer(port: number): void;
|
|
3
|
+
export declare function attachWebSocketToServer(server: {
|
|
4
|
+
on: (event: string, handler: (...args: any[]) => void) => void;
|
|
5
|
+
}): void;
|
|
6
|
+
export declare function emitEvent(event: TrustGateEvent): void;
|
|
7
|
+
//# sourceMappingURL=emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAK7C,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,QAGhD;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAAE,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,CAAA;CAAE,QAWjH;AAUD,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,QAK9C"}
|
package/dist/emitter.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { WebSocketServer, WebSocket } from 'ws';
|
|
2
|
+
let wss = null;
|
|
3
|
+
const clients = new Set();
|
|
4
|
+
export function startWebSocketServer(port) {
|
|
5
|
+
wss = new WebSocketServer({ port });
|
|
6
|
+
wireConnections();
|
|
7
|
+
}
|
|
8
|
+
export function attachWebSocketToServer(server) {
|
|
9
|
+
wss = new WebSocketServer({ noServer: true });
|
|
10
|
+
wireConnections();
|
|
11
|
+
server.on('upgrade', (request, socket, head) => {
|
|
12
|
+
const url = new URL(request.url || '/', `http://${request.headers.host}`);
|
|
13
|
+
if (url.pathname === '/ws') {
|
|
14
|
+
wss.handleUpgrade(request, socket, head, (ws) => wss.emit('connection', ws, request));
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
socket.destroy();
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
function wireConnections() {
|
|
22
|
+
if (!wss)
|
|
23
|
+
return;
|
|
24
|
+
wss.on('connection', (ws) => {
|
|
25
|
+
clients.add(ws);
|
|
26
|
+
ws.on('close', () => clients.delete(ws));
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
export function emitEvent(event) {
|
|
30
|
+
const data = JSON.stringify(event);
|
|
31
|
+
for (const client of clients) {
|
|
32
|
+
if (client.readyState === WebSocket.OPEN)
|
|
33
|
+
client.send(data);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.js","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAK/C,IAAI,GAAG,GAA2B,IAAI,CAAA;AACtC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAa,CAAA;AAEpC,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;IACnC,eAAe,EAAE,CAAA;AACnB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAA0E;IAChH,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,eAAe,EAAE,CAAA;IACjB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAwB,EAAE,MAAc,EAAE,IAAY,EAAE,EAAE;QAC9E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;QACzE,IAAI,GAAG,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YAC3B,GAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;QACzF,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,EAAE,CAAA;QAClB,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,CAAC,GAAG;QAAE,OAAM;IAChB,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAqB;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAClC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7D,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { Context, Next } from 'hono';
|
|
2
|
+
import { Hono } from 'hono';
|
|
3
|
+
import type { TrustGateConfig } from './types';
|
|
4
|
+
export type { Tier, AgentProfile, TrustGateEvent, TrustGateConfig, ClassificationResult, TrustBreakdown } from './types';
|
|
5
|
+
export { calculateTrustScore, getTrustBreakdown, identityScore, behaviorScore, reputationScore, riskPenalty } from './scoring';
|
|
6
|
+
export { calculatePlatformFee, calculateHirePrice, calculateQualityScore, getSimplePlatformFee, getSimpleHirePriceBand, getPrice, PRICING_CONSTANTS } from './pricing';
|
|
7
|
+
export { recordRequest, getAgent, getAllAgents, getTopAgents, getOrCreateAgent, addVerifiedHuman, isVerifiedHuman } from './store';
|
|
8
|
+
export { emitEvent, startWebSocketServer, attachWebSocketToServer } from './emitter';
|
|
9
|
+
export { classifyRequest } from './classify';
|
|
10
|
+
/**
|
|
11
|
+
* TrustGate middleware for Hono applications.
|
|
12
|
+
*
|
|
13
|
+
* Classifies every request into one of 4 trust tiers, calculates a dynamic
|
|
14
|
+
* price based on the agent's trust score, and returns a 402 payment challenge
|
|
15
|
+
* via the x402 protocol if payment is required.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* import { Hono } from 'hono'
|
|
20
|
+
* import { trustgate } from 'trustgate-middleware'
|
|
21
|
+
*
|
|
22
|
+
* const app = new Hono()
|
|
23
|
+
* app.use('/api/*', trustgate({ payTo: '0xYourWallet' }))
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare function trustgate(config: TrustGateConfig): (c: Context, next: Next) => Promise<void | (Response & import("hono").TypedResponse<{
|
|
27
|
+
error: string;
|
|
28
|
+
tier: string;
|
|
29
|
+
}, 403, "json">) | (Response & import("hono").TypedResponse<{
|
|
30
|
+
error: string;
|
|
31
|
+
trustgate: {
|
|
32
|
+
tier: "HUMAN_AGENT" | "ANON_BOT";
|
|
33
|
+
trustScore: number;
|
|
34
|
+
price: number;
|
|
35
|
+
identity: string;
|
|
36
|
+
};
|
|
37
|
+
x402: {
|
|
38
|
+
x402Version: number;
|
|
39
|
+
accepts: {
|
|
40
|
+
scheme: string;
|
|
41
|
+
network: string;
|
|
42
|
+
maxTimeoutSeconds: number;
|
|
43
|
+
asset: string;
|
|
44
|
+
amount: string;
|
|
45
|
+
payTo: string;
|
|
46
|
+
extra: {
|
|
47
|
+
name: string;
|
|
48
|
+
version: string;
|
|
49
|
+
resourceUrl: string;
|
|
50
|
+
};
|
|
51
|
+
}[];
|
|
52
|
+
resource: {
|
|
53
|
+
url: string;
|
|
54
|
+
description: string;
|
|
55
|
+
mimeType: string;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
}, 402, "json">) | (Response & import("hono").TypedResponse<{
|
|
59
|
+
error: string;
|
|
60
|
+
tier: "HUMAN_AGENT" | "ANON_BOT";
|
|
61
|
+
}, 402, "json">)>;
|
|
62
|
+
/**
|
|
63
|
+
* Mount the TrustGate dashboard on a Hono app.
|
|
64
|
+
*
|
|
65
|
+
* Serves the pre-built dashboard UI at /trustgate/* and adds
|
|
66
|
+
* an API endpoint at /trustgate/api/agents for real-time agent data.
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* import { Hono } from 'hono'
|
|
71
|
+
* import { trustgate, trustgateDashboard } from 'trustgate-middleware'
|
|
72
|
+
*
|
|
73
|
+
* const app = new Hono()
|
|
74
|
+
* app.use('/api/*', trustgate({ payTo: '0xYou' }))
|
|
75
|
+
* trustgateDashboard(app)
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare function trustgateDashboard(app: Hono, worldIdConfig?: {
|
|
79
|
+
rpId: string;
|
|
80
|
+
signingKey: string;
|
|
81
|
+
}): void;
|
|
82
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAI3B,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAA;AAO9D,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACxH,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC9H,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AACtK,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAClI,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAA;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAK5C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,IAGjC,GAAG,OAAO,EAAE,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA2GrC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,QA+EjG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { readFile } from 'fs/promises';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { classifyRequest } from './classify';
|
|
5
|
+
import { recordRequest, getAllAgents, addVerifiedHuman } from './store';
|
|
6
|
+
import { getPrice, getSimpleHirePriceBand } from './pricing';
|
|
7
|
+
import { emitEvent } from './emitter';
|
|
8
|
+
import { TIER_COLORS } from './types';
|
|
9
|
+
export { calculateTrustScore, getTrustBreakdown, identityScore, behaviorScore, reputationScore, riskPenalty } from './scoring';
|
|
10
|
+
export { calculatePlatformFee, calculateHirePrice, calculateQualityScore, getSimplePlatformFee, getSimpleHirePriceBand, getPrice, PRICING_CONSTANTS } from './pricing';
|
|
11
|
+
export { recordRequest, getAgent, getAllAgents, getTopAgents, getOrCreateAgent, addVerifiedHuman, isVerifiedHuman } from './store';
|
|
12
|
+
export { emitEvent, startWebSocketServer, attachWebSocketToServer } from './emitter';
|
|
13
|
+
export { classifyRequest } from './classify';
|
|
14
|
+
const BASE_SEPOLIA = 'eip155:84532';
|
|
15
|
+
const USDC_BASE_SEPOLIA = '0x036CbD53842c5426634e7929541eC2318f3dCF7e';
|
|
16
|
+
/**
|
|
17
|
+
* TrustGate middleware for Hono applications.
|
|
18
|
+
*
|
|
19
|
+
* Classifies every request into one of 4 trust tiers, calculates a dynamic
|
|
20
|
+
* price based on the agent's trust score, and returns a 402 payment challenge
|
|
21
|
+
* via the x402 protocol if payment is required.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* import { Hono } from 'hono'
|
|
26
|
+
* import { trustgate } from 'trustgate-middleware'
|
|
27
|
+
*
|
|
28
|
+
* const app = new Hono()
|
|
29
|
+
* app.use('/api/*', trustgate({ payTo: '0xYourWallet' }))
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export function trustgate(config) {
|
|
33
|
+
const { payTo, network = BASE_SEPOLIA } = config;
|
|
34
|
+
return async (c, next) => {
|
|
35
|
+
// Step 1: Classify the request
|
|
36
|
+
const classification = await classifyRequest(c);
|
|
37
|
+
// Step 2: Handle BLOCKED
|
|
38
|
+
if (classification.tier === 'BLOCKED') {
|
|
39
|
+
const event = {
|
|
40
|
+
id: crypto.randomUUID(), timestamp: Date.now(),
|
|
41
|
+
tier: 'BLOCKED', color: TIER_COLORS['BLOCKED'],
|
|
42
|
+
agentAddress: null, trustScore: 0, priceCharged: 0,
|
|
43
|
+
humanId: null, requestPath: c.req.path,
|
|
44
|
+
};
|
|
45
|
+
emitEvent(event);
|
|
46
|
+
return c.json({ error: 'Access denied. No identity, no wallet, no trust.', tier: 'BLOCKED' }, 403);
|
|
47
|
+
}
|
|
48
|
+
// Step 3: Record request + calculate trust score + price
|
|
49
|
+
const clientIp = c.req.header('x-forwarded-for') || c.req.header('x-real-ip') || 'unknown';
|
|
50
|
+
const agent = recordRequest(classification.agentAddress || 'unknown', classification.tier, true, classification.humanId, c.req.path, clientIp, classification.owsVerified);
|
|
51
|
+
const trustScore = agent.trustScore;
|
|
52
|
+
const price = getPrice(trustScore);
|
|
53
|
+
// Step 4: Set classification headers
|
|
54
|
+
const identityMethod = classification.tier === 'HUMAN' ? 'world-id'
|
|
55
|
+
: classification.tier === 'HUMAN_AGENT' ? 'agentkit'
|
|
56
|
+
: classification.owsVerified ? 'ows'
|
|
57
|
+
: classification.agentAddress ? 'wallet' : 'none';
|
|
58
|
+
c.header('X-TrustGate-Tier', classification.tier);
|
|
59
|
+
c.header('X-TrustGate-Trust-Score', String(trustScore));
|
|
60
|
+
c.header('X-TrustGate-Identity', identityMethod);
|
|
61
|
+
// Step 5: Emit event
|
|
62
|
+
const event = {
|
|
63
|
+
id: crypto.randomUUID(), timestamp: Date.now(),
|
|
64
|
+
tier: classification.tier, color: TIER_COLORS[classification.tier],
|
|
65
|
+
agentAddress: classification.agentAddress,
|
|
66
|
+
trustScore, priceCharged: price,
|
|
67
|
+
humanId: classification.humanId, requestPath: c.req.path,
|
|
68
|
+
};
|
|
69
|
+
emitEvent(event);
|
|
70
|
+
// Step 6: HUMAN gets free access
|
|
71
|
+
if (classification.tier === 'HUMAN')
|
|
72
|
+
return next();
|
|
73
|
+
// Step 7: Accept direct payment tx hash
|
|
74
|
+
const paymentTxHash = c.req.header('x-payment-tx');
|
|
75
|
+
if (paymentTxHash && paymentTxHash.startsWith('0x'))
|
|
76
|
+
return next();
|
|
77
|
+
// Step 8: Check for x402 payment signature
|
|
78
|
+
const paymentSignature = c.req.header('PAYMENT-SIGNATURE') || c.req.header('x-payment');
|
|
79
|
+
if (!paymentSignature) {
|
|
80
|
+
// Return 402 with x402 payment spec
|
|
81
|
+
const x402 = {
|
|
82
|
+
x402Version: 2,
|
|
83
|
+
accepts: [{
|
|
84
|
+
scheme: 'exact', network,
|
|
85
|
+
maxTimeoutSeconds: 300,
|
|
86
|
+
asset: USDC_BASE_SEPOLIA,
|
|
87
|
+
amount: String(Math.round(price * 1e6)),
|
|
88
|
+
payTo,
|
|
89
|
+
extra: { name: 'USDC', version: '2', resourceUrl: new URL(c.req.url).toString() },
|
|
90
|
+
}],
|
|
91
|
+
resource: {
|
|
92
|
+
url: new URL(c.req.url).toString(),
|
|
93
|
+
description: 'TrustGate-protected endpoint',
|
|
94
|
+
mimeType: 'application/json',
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
const encoded = Buffer.from(JSON.stringify(x402)).toString('base64');
|
|
98
|
+
c.header('PAYMENT-REQUIRED', encoded);
|
|
99
|
+
return c.json({
|
|
100
|
+
error: 'Payment Required',
|
|
101
|
+
trustgate: { tier: classification.tier, trustScore, price, identity: identityMethod },
|
|
102
|
+
x402,
|
|
103
|
+
}, 402);
|
|
104
|
+
}
|
|
105
|
+
// Step 9: Verify x402 payment signature
|
|
106
|
+
try {
|
|
107
|
+
const paymentPayload = JSON.parse(Buffer.from(paymentSignature, 'base64').toString());
|
|
108
|
+
const verifyRes = await fetch('https://x402.org/facilitator/verify', {
|
|
109
|
+
method: 'POST',
|
|
110
|
+
headers: { 'Content-Type': 'application/json' },
|
|
111
|
+
body: JSON.stringify({
|
|
112
|
+
payload: paymentPayload, network, scheme: 'exact',
|
|
113
|
+
payTo, asset: USDC_BASE_SEPOLIA,
|
|
114
|
+
amount: String(Math.round(price * 1e6)),
|
|
115
|
+
}),
|
|
116
|
+
});
|
|
117
|
+
if (!verifyRes.ok)
|
|
118
|
+
return c.json({ error: 'Payment verification failed', tier: classification.tier }, 402);
|
|
119
|
+
const result = await verifyRes.json();
|
|
120
|
+
if (!result.valid)
|
|
121
|
+
return c.json({ error: 'Payment invalid', tier: classification.tier }, 402);
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return c.json({ error: 'Payment verification error', tier: classification.tier }, 402);
|
|
125
|
+
}
|
|
126
|
+
await next();
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Mount the TrustGate dashboard on a Hono app.
|
|
131
|
+
*
|
|
132
|
+
* Serves the pre-built dashboard UI at /trustgate/* and adds
|
|
133
|
+
* an API endpoint at /trustgate/api/agents for real-time agent data.
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```ts
|
|
137
|
+
* import { Hono } from 'hono'
|
|
138
|
+
* import { trustgate, trustgateDashboard } from 'trustgate-middleware'
|
|
139
|
+
*
|
|
140
|
+
* const app = new Hono()
|
|
141
|
+
* app.use('/api/*', trustgate({ payTo: '0xYou' }))
|
|
142
|
+
* trustgateDashboard(app)
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
export function trustgateDashboard(app, worldIdConfig) {
|
|
146
|
+
const dashboardDir = join(fileURLToPath(import.meta.url), '../../dashboard-dist');
|
|
147
|
+
// World ID verification routes
|
|
148
|
+
if (worldIdConfig) {
|
|
149
|
+
app.post('/trustgate/verify-context', async (c) => {
|
|
150
|
+
try {
|
|
151
|
+
const { signRequest } = await import('@worldcoin/idkit-server');
|
|
152
|
+
const rpSig = signRequest({ signingKeyHex: worldIdConfig.signingKey, action: 'trustgate-verify' });
|
|
153
|
+
return c.json({
|
|
154
|
+
rp_id: worldIdConfig.rpId,
|
|
155
|
+
nonce: rpSig.nonce,
|
|
156
|
+
created_at: rpSig.createdAt,
|
|
157
|
+
expires_at: rpSig.expiresAt,
|
|
158
|
+
signature: rpSig.sig,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
return c.json({ error: 'World ID not configured' }, 500);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
app.post('/trustgate/verify-human', async (c) => {
|
|
166
|
+
try {
|
|
167
|
+
const body = await c.req.json();
|
|
168
|
+
const response = await fetch(`https://developer.world.org/api/v4/verify/${worldIdConfig.rpId}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });
|
|
169
|
+
if (response.ok) {
|
|
170
|
+
const result = await response.json();
|
|
171
|
+
const humanId = result.nullifier_hash || 'world-id-verified';
|
|
172
|
+
addVerifiedHuman(humanId);
|
|
173
|
+
return c.json({ success: true, verified: true, humanId });
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
const error = await response.json();
|
|
177
|
+
return c.json({ success: false, error }, 400);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return c.json({ success: false, error: 'Verification failed' }, 500);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
const MIME = {
|
|
186
|
+
html: 'text/html', js: 'application/javascript', mjs: 'application/javascript',
|
|
187
|
+
css: 'text/css', svg: 'image/svg+xml', png: 'image/png',
|
|
188
|
+
json: 'application/json', wasm: 'application/wasm', ico: 'image/x-icon',
|
|
189
|
+
};
|
|
190
|
+
// Agent profiles API
|
|
191
|
+
app.get('/trustgate/api/agents', (c) => {
|
|
192
|
+
const agents = getAllAgents().map(a => ({
|
|
193
|
+
...a,
|
|
194
|
+
endpointsAccessed: Array.from(a.endpointsAccessed),
|
|
195
|
+
addressesFromSameIp: Array.from(a.addressesFromSameIp),
|
|
196
|
+
daysActive: Array.from(a.daysActive),
|
|
197
|
+
platformFee: getPrice(a.trustScore),
|
|
198
|
+
hirePriceBand: getSimpleHirePriceBand(a.trustScore).band,
|
|
199
|
+
hirePriceMin: getSimpleHirePriceBand(a.trustScore).minPrice,
|
|
200
|
+
owsVerified: a.owsVerified,
|
|
201
|
+
}));
|
|
202
|
+
return c.json(agents);
|
|
203
|
+
});
|
|
204
|
+
// Serve dashboard static files
|
|
205
|
+
app.get('/trustgate/*', async (c) => {
|
|
206
|
+
const reqPath = c.req.path.replace('/trustgate', '') || '/index.html';
|
|
207
|
+
const filePath = reqPath === '/' ? '/index.html' : reqPath;
|
|
208
|
+
try {
|
|
209
|
+
const file = await readFile(join(dashboardDir, filePath));
|
|
210
|
+
const ext = filePath.split('.').pop() || 'html';
|
|
211
|
+
return new Response(file, {
|
|
212
|
+
headers: { 'Content-Type': MIME[ext] || 'application/octet-stream' },
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
const index = await readFile(join(dashboardDir, 'index.html'));
|
|
217
|
+
return new Response(index, { headers: { 'Content-Type': 'text/html' } });
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AAEnC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAY,gBAAgB,EAAE,MAAM,SAAS,CAAA;AACjF,OAAO,EAAE,QAAQ,EAAwB,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAClF,OAAO,EAAE,SAAS,EAAiD,MAAM,WAAW,CAAA;AACpF,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAGrC,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC9H,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AACtK,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAClI,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAA;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,YAAY,GAAG,cAAc,CAAA;AACnC,MAAM,iBAAiB,GAAG,4CAA4C,CAAA;AAEtE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,SAAS,CAAC,MAAuB;IAC/C,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,YAAY,EAAE,GAAG,MAAM,CAAA;IAEhD,OAAO,KAAK,EAAE,CAAU,EAAE,IAAU,EAAE,EAAE;QACtC,+BAA+B;QAC/B,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC,CAAC,CAAC,CAAA;QAE/C,yBAAyB;QACzB,IAAI,cAAc,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,KAAK,GAAmB;gBAC5B,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBAC9C,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC;gBAC9C,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;gBAClD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI;aACvC,CAAA;YACD,SAAS,CAAC,KAAK,CAAC,CAAA;YAChB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kDAAkD,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,CAAC,CAAA;QACpG,CAAC;QAED,yDAAyD;QACzD,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,SAAS,CAAA;QAC1F,MAAM,KAAK,GAAG,aAAa,CACzB,cAAc,CAAC,YAAY,IAAI,SAAS,EACxC,cAAc,CAAC,IAAI,EAAE,IAAI,EACzB,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAC5C,cAAc,CAAC,WAAW,CAC3B,CAAA;QACD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAA;QACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAA;QAElC,qCAAqC;QACrC,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU;YACjE,CAAC,CAAC,cAAc,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,UAAU;gBACpD,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK;oBACpC,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAA;QAEnD,CAAC,CAAC,MAAM,CAAC,kBAAkB,EAAE,cAAc,CAAC,IAAI,CAAC,CAAA;QACjD,CAAC,CAAC,MAAM,CAAC,yBAAyB,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAA;QACvD,CAAC,CAAC,MAAM,CAAC,sBAAsB,EAAE,cAAc,CAAC,CAAA;QAEhD,qBAAqB;QACrB,MAAM,KAAK,GAAmB;YAC5B,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YAC9C,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC;YAClE,YAAY,EAAE,cAAc,CAAC,YAAY;YACzC,UAAU,EAAE,YAAY,EAAE,KAAK;YAC/B,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI;SACzD,CAAA;QACD,SAAS,CAAC,KAAK,CAAC,CAAA;QAEhB,iCAAiC;QACjC,IAAI,cAAc,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,IAAI,EAAE,CAAA;QAElD,wCAAwC;QACxC,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;QAClD,IAAI,aAAa,IAAI,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,EAAE,CAAA;QAElE,2CAA2C;QAC3C,MAAM,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QAEvF,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,oCAAoC;YACpC,MAAM,IAAI,GAAG;gBACX,WAAW,EAAE,CAAC;gBACd,OAAO,EAAE,CAAC;wBACR,MAAM,EAAE,OAAO,EAAE,OAAO;wBACxB,iBAAiB,EAAE,GAAG;wBACtB,KAAK,EAAE,iBAAiB;wBACxB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;wBACvC,KAAK;wBACL,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;qBAClF,CAAC;gBACF,QAAQ,EAAE;oBACR,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;oBAClC,WAAW,EAAE,8BAA8B;oBAC3C,QAAQ,EAAE,kBAAkB;iBAC7B;aACF,CAAA;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;YACpE,CAAC,CAAC,MAAM,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAA;YACrC,OAAO,CAAC,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,kBAAkB;gBACzB,SAAS,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE;gBACrF,IAAI;aACL,EAAE,GAAG,CAAC,CAAA;QACT,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;YACrF,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,qCAAqC,EAAE;gBACnE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO;oBACjD,KAAK,EAAE,KAAK,EAAE,iBAAiB;oBAC/B,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;iBACxC,CAAC;aACH,CAAC,CAAA;YAEF,IAAI,CAAC,SAAS,CAAC,EAAE;gBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,6BAA6B,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAA;YAC1G,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAyB,CAAA;YAC5D,IAAI,CAAC,MAAM,CAAC,KAAK;gBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAA;QAChG,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAA;QACxF,CAAC;QAED,MAAM,IAAI,EAAE,CAAA;IACd,CAAC,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAS,EAAE,aAAoD;IAChG,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,sBAAsB,CAAC,CAAA;IAEjF,+BAA+B;IAC/B,IAAI,aAAa,EAAE,CAAC;QAClB,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAChD,IAAI,CAAC;gBACH,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAA;gBAC/D,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,aAAa,EAAE,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAA;gBAClG,OAAO,CAAC,CAAC,IAAI,CAAC;oBACZ,KAAK,EAAE,aAAa,CAAC,IAAI;oBACzB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,UAAU,EAAE,KAAK,CAAC,SAAS;oBAC3B,UAAU,EAAE,KAAK,CAAC,SAAS;oBAC3B,SAAS,EAAE,KAAK,CAAC,GAAG;iBACrB,CAAC,CAAA;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,EAAE,GAAG,CAAC,CAAA;YAC1D,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC9C,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;gBAC/B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,6CAA6C,aAAa,CAAC,IAAI,EAAE,EACjE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAChG,CAAA;gBACD,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;oBAChB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAiC,CAAA;oBACnE,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,IAAI,mBAAmB,CAAA;oBAC5D,gBAAgB,CAAC,OAAO,CAAC,CAAA;oBACzB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;gBAC3D,CAAC;qBAAM,CAAC;oBACN,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;oBACnC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAA;gBAC/C,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,GAAG,CAAC,CAAA;YACtE,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,IAAI,GAA2B;QACnC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,wBAAwB,EAAE,GAAG,EAAE,wBAAwB;QAC9E,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,WAAW;QACvD,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,cAAc;KACxE,CAAA;IAED,qBAAqB;IACrB,GAAG,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC,CAAC,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtC,GAAG,CAAC;YACJ,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC;YAClD,mBAAmB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC;YACtD,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;YACpC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;YACnC,aAAa,EAAE,sBAAsB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI;YACxD,YAAY,EAAE,sBAAsB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,QAAQ;YAC3D,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC,CAAC,CAAA;QACH,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,+BAA+B;IAC/B,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAClC,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,IAAI,aAAa,CAAA;QACrE,MAAM,QAAQ,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAA;QAC1D,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAA;YACzD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,MAAM,CAAA;YAC/C,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;gBACxB,OAAO,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,0BAA0B,EAAE;aACrE,CAAC,CAAA;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAA;YAC9D,OAAO,IAAI,QAAQ,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;QAC1E,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TRUSTGATE DUAL PRICING MODEL
|
|
3
|
+
*
|
|
4
|
+
* A. Platform Fee — what the agent pays TrustGate to participate
|
|
5
|
+
* Higher trust = LOWER fee (platform prices risk)
|
|
6
|
+
* B. Hire Price — what the human pays the agent for work
|
|
7
|
+
* Higher trust = HIGHER price (human prices value)
|
|
8
|
+
*
|
|
9
|
+
* References:
|
|
10
|
+
* - Shapiro (1983): High-quality items must sell at premium
|
|
11
|
+
* - Resnick et al. (2006): 8.1% price premium for high-reputation sellers
|
|
12
|
+
* - EigenTrust (2003): Trust earned through consistent good behavior
|
|
13
|
+
*/
|
|
14
|
+
export interface PlatformFeeInputs {
|
|
15
|
+
trustScore: number;
|
|
16
|
+
baseFee?: number;
|
|
17
|
+
trafficMultiplier?: number;
|
|
18
|
+
categoryMultiplier?: number;
|
|
19
|
+
}
|
|
20
|
+
export declare function calculatePlatformFee(inputs: PlatformFeeInputs): number;
|
|
21
|
+
export interface HirePriceInputs {
|
|
22
|
+
qualityScore: number;
|
|
23
|
+
basePrice?: number;
|
|
24
|
+
specializationMultiplier?: number;
|
|
25
|
+
urgencyMultiplier?: number;
|
|
26
|
+
successRate?: number;
|
|
27
|
+
}
|
|
28
|
+
export declare function calculateQualityScore(trustScore: number, taskFit?: number, successScore?: number): number;
|
|
29
|
+
export declare function calculateHirePrice(inputs: HirePriceInputs): number;
|
|
30
|
+
export declare function getSimplePlatformFee(trustScore: number): number;
|
|
31
|
+
export declare function getPrice(score: number): number;
|
|
32
|
+
export declare function getSimpleHirePriceBand(trustScore: number): {
|
|
33
|
+
band: string;
|
|
34
|
+
minPrice: number;
|
|
35
|
+
maxPrice: number;
|
|
36
|
+
};
|
|
37
|
+
export declare const PRICING_CONSTANTS: {
|
|
38
|
+
BASE_FEES: {
|
|
39
|
+
bid: number;
|
|
40
|
+
hireAccept: number;
|
|
41
|
+
postHelp: number;
|
|
42
|
+
contentRead: number;
|
|
43
|
+
agentReport: number;
|
|
44
|
+
};
|
|
45
|
+
TRAFFIC_MULTIPLIERS: {
|
|
46
|
+
normal: number;
|
|
47
|
+
elevated: number;
|
|
48
|
+
surge: number;
|
|
49
|
+
attack: number;
|
|
50
|
+
};
|
|
51
|
+
CATEGORY_MULTIPLIERS: {
|
|
52
|
+
content: number;
|
|
53
|
+
bid: number;
|
|
54
|
+
execution: number;
|
|
55
|
+
highRisk: number;
|
|
56
|
+
};
|
|
57
|
+
TASK_BASE_PRICES: {
|
|
58
|
+
research: number;
|
|
59
|
+
comparison: number;
|
|
60
|
+
booking: number;
|
|
61
|
+
audit: number;
|
|
62
|
+
monitoring: number;
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=pricing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../src/pricing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAMD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAGtE;AAID,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,SAAK,EAAE,YAAY,SAAK,GAAG,MAAM,CAEjG;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAKlE;AAID,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAO/D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAI/G;AAID,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;CAK7B,CAAA"}
|
package/dist/pricing.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TRUSTGATE DUAL PRICING MODEL
|
|
3
|
+
*
|
|
4
|
+
* A. Platform Fee — what the agent pays TrustGate to participate
|
|
5
|
+
* Higher trust = LOWER fee (platform prices risk)
|
|
6
|
+
* B. Hire Price — what the human pays the agent for work
|
|
7
|
+
* Higher trust = HIGHER price (human prices value)
|
|
8
|
+
*
|
|
9
|
+
* References:
|
|
10
|
+
* - Shapiro (1983): High-quality items must sell at premium
|
|
11
|
+
* - Resnick et al. (2006): 8.1% price premium for high-reputation sellers
|
|
12
|
+
* - EigenTrust (2003): Trust earned through consistent good behavior
|
|
13
|
+
*/
|
|
14
|
+
function trustDiscountFactor(trustScore) {
|
|
15
|
+
return 1.8 - 1.4 * (Math.min(100, Math.max(0, trustScore)) / 100);
|
|
16
|
+
}
|
|
17
|
+
export function calculatePlatformFee(inputs) {
|
|
18
|
+
const { trustScore, baseFee = 0.002, trafficMultiplier = 1.0, categoryMultiplier = 1.0 } = inputs;
|
|
19
|
+
return parseFloat((baseFee * trustDiscountFactor(trustScore) * trafficMultiplier * categoryMultiplier).toFixed(6));
|
|
20
|
+
}
|
|
21
|
+
export function calculateQualityScore(trustScore, taskFit = 50, successScore = 50) {
|
|
22
|
+
return Math.round(0.5 * trustScore + 0.3 * taskFit + 0.2 * successScore);
|
|
23
|
+
}
|
|
24
|
+
export function calculateHirePrice(inputs) {
|
|
25
|
+
const { qualityScore, basePrice = 0.02, specializationMultiplier = 1.0, urgencyMultiplier = 1.0, successRate = 0.85 } = inputs;
|
|
26
|
+
const quality = 0.7 + 1.1 * (Math.min(100, Math.max(0, qualityScore)) / 100);
|
|
27
|
+
const success = 0.85 + 0.3 * Math.min(1, Math.max(0, successRate));
|
|
28
|
+
return parseFloat((basePrice * quality * specializationMultiplier * urgencyMultiplier * success).toFixed(4));
|
|
29
|
+
}
|
|
30
|
+
// ── Simplified Tier Pricing ──────────────────────────────────────────
|
|
31
|
+
export function getSimplePlatformFee(trustScore) {
|
|
32
|
+
if (trustScore >= 80)
|
|
33
|
+
return 0;
|
|
34
|
+
if (trustScore >= 60)
|
|
35
|
+
return 0.001;
|
|
36
|
+
if (trustScore >= 40)
|
|
37
|
+
return 0.003;
|
|
38
|
+
if (trustScore >= 20)
|
|
39
|
+
return 0.007;
|
|
40
|
+
if (trustScore >= 1)
|
|
41
|
+
return 0.01;
|
|
42
|
+
return -1;
|
|
43
|
+
}
|
|
44
|
+
export function getPrice(score) {
|
|
45
|
+
return getSimplePlatformFee(score);
|
|
46
|
+
}
|
|
47
|
+
export function getSimpleHirePriceBand(trustScore) {
|
|
48
|
+
if (trustScore >= 70)
|
|
49
|
+
return { band: 'Elite', minPrice: 0.05, maxPrice: 0.08 };
|
|
50
|
+
if (trustScore >= 40)
|
|
51
|
+
return { band: 'Pro', minPrice: 0.02, maxPrice: 0.04 };
|
|
52
|
+
return { band: 'Starter', minPrice: 0.01, maxPrice: 0.02 };
|
|
53
|
+
}
|
|
54
|
+
// ── Constants ────────────────────────────────────────────────────────
|
|
55
|
+
export const PRICING_CONSTANTS = {
|
|
56
|
+
BASE_FEES: { bid: 0.0002, hireAccept: 0.0005, postHelp: 0.0003, contentRead: 0.0001, agentReport: 0.0002 },
|
|
57
|
+
TRAFFIC_MULTIPLIERS: { normal: 1.0, elevated: 1.25, surge: 1.6, attack: 2.2 },
|
|
58
|
+
CATEGORY_MULTIPLIERS: { content: 1.0, bid: 1.2, execution: 1.5, highRisk: 2.0 },
|
|
59
|
+
TASK_BASE_PRICES: { research: 0.005, comparison: 0.015, booking: 0.03, audit: 0.10, monitoring: 0.02 },
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=pricing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.js","sourceRoot":"","sources":["../src/pricing.ts"],"names":[],"mappings":"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"}
|