aether-agent-sdk 1.0.0 → 1.0.3
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/LICENSE +21 -0
- package/README.md +67 -185
- package/dist/src/agents/AgentRegistry.d.ts +48 -0
- package/dist/src/agents/AgentRegistry.d.ts.map +1 -0
- package/dist/src/agents/AgentRegistry.js +114 -0
- package/dist/src/agents/AgentRegistry.js.map +1 -0
- package/dist/src/agents/AnalyzerAgent.d.ts +18 -0
- package/dist/src/agents/AnalyzerAgent.d.ts.map +1 -0
- package/dist/src/agents/AnalyzerAgent.js +129 -0
- package/dist/src/agents/AnalyzerAgent.js.map +1 -0
- package/dist/src/agents/IntelligentVerifierAgent.d.ts +46 -0
- package/dist/src/agents/IntelligentVerifierAgent.d.ts.map +1 -0
- package/dist/src/agents/IntelligentVerifierAgent.js +262 -0
- package/dist/src/agents/IntelligentVerifierAgent.js.map +1 -0
- package/dist/src/agents/SettlementAgent.d.ts +14 -0
- package/dist/src/agents/SettlementAgent.d.ts.map +1 -0
- package/dist/src/agents/SettlementAgent.js +155 -0
- package/dist/src/agents/SettlementAgent.js.map +1 -0
- package/dist/src/agents/SettlementAgentEnhanced.d.ts +33 -0
- package/dist/src/agents/SettlementAgentEnhanced.d.ts.map +1 -0
- package/dist/src/agents/SettlementAgentEnhanced.js +219 -0
- package/dist/src/agents/SettlementAgentEnhanced.js.map +1 -0
- package/dist/src/agents/VerifierAgent.d.ts +30 -0
- package/dist/src/agents/VerifierAgent.d.ts.map +1 -0
- package/dist/src/agents/VerifierAgent.js +181 -0
- package/dist/src/agents/VerifierAgent.js.map +1 -0
- package/dist/src/agents/index.d.ts +7 -0
- package/dist/src/agents/index.d.ts.map +1 -0
- package/dist/src/agents/index.js +11 -0
- package/dist/src/agents/index.js.map +1 -0
- package/dist/src/facilitator/X402FacilitatorServer.d.ts +17 -0
- package/dist/src/facilitator/X402FacilitatorServer.d.ts.map +1 -0
- package/dist/src/facilitator/X402FacilitatorServer.js +176 -0
- package/dist/src/facilitator/X402FacilitatorServer.js.map +1 -0
- package/dist/src/facilitator/index.d.ts +7 -0
- package/dist/src/facilitator/index.d.ts.map +1 -0
- package/dist/src/facilitator/index.js +11 -0
- package/dist/src/facilitator/index.js.map +1 -0
- package/dist/src/index.d.ts +19 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +39 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/modes/HumanInTheLoopMode.d.ts +92 -0
- package/dist/src/modes/HumanInTheLoopMode.d.ts.map +1 -0
- package/dist/src/modes/HumanInTheLoopMode.js +234 -0
- package/dist/src/modes/HumanInTheLoopMode.js.map +1 -0
- package/dist/src/modes/index.d.ts +8 -0
- package/dist/src/modes/index.d.ts.map +1 -0
- package/dist/src/modes/index.js +11 -0
- package/dist/src/modes/index.js.map +1 -0
- package/dist/src/protocols/A2ANegotiation.d.ts +122 -0
- package/dist/src/protocols/A2ANegotiation.d.ts.map +1 -0
- package/dist/src/protocols/A2ANegotiation.js +230 -0
- package/dist/src/protocols/A2ANegotiation.js.map +1 -0
- package/dist/src/protocols/A2AProtocol.d.ts +49 -0
- package/dist/src/protocols/A2AProtocol.d.ts.map +1 -0
- package/dist/src/protocols/A2AProtocol.js +126 -0
- package/dist/src/protocols/A2AProtocol.js.map +1 -0
- package/dist/src/protocols/AP2Protocol.d.ts +57 -0
- package/dist/src/protocols/AP2Protocol.d.ts.map +1 -0
- package/dist/src/protocols/AP2Protocol.js +121 -0
- package/dist/src/protocols/AP2Protocol.js.map +1 -0
- package/dist/src/protocols/index.d.ts +10 -0
- package/dist/src/protocols/index.d.ts.map +1 -0
- package/dist/src/protocols/index.js +15 -0
- package/dist/src/protocols/index.js.map +1 -0
- package/dist/src/services/index.d.ts +8 -0
- package/dist/src/services/index.d.ts.map +1 -0
- package/dist/src/services/index.js +13 -0
- package/dist/src/services/index.js.map +1 -0
- package/dist/src/utils/env.d.ts +15 -0
- package/dist/src/utils/env.d.ts.map +1 -0
- package/dist/src/utils/env.js +39 -0
- package/dist/src/utils/env.js.map +1 -0
- package/dist/src/utils/index.d.ts +7 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +12 -0
- package/dist/src/utils/index.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.AnalyzerAgent = void 0;
|
|
7
|
+
const standards_agent_kit_1 = require("@hashgraphonline/standards-agent-kit");
|
|
8
|
+
const sdk_1 = require("@hashgraph/sdk");
|
|
9
|
+
const HCS10ConnectionManager_1 = require("../protocols/HCS10ConnectionManager");
|
|
10
|
+
const axios_1 = __importDefault(require("axios"));
|
|
11
|
+
const dotenv_1 = __importDefault(require("dotenv"));
|
|
12
|
+
// Load environment variables
|
|
13
|
+
dotenv_1.default.config();
|
|
14
|
+
class AnalyzerAgent {
|
|
15
|
+
hcsClient;
|
|
16
|
+
hederaClient;
|
|
17
|
+
connectionManager;
|
|
18
|
+
MIRROR_NODE_URL = 'https://testnet.mirrornode.hedera.com';
|
|
19
|
+
constructor() {
|
|
20
|
+
// Get agent credentials from environment variables
|
|
21
|
+
const agentId = process.env.ANALYZER_AGENT_ID;
|
|
22
|
+
const privateKey = process.env.ANALYZER_PRIVATE_KEY;
|
|
23
|
+
if (!agentId || !privateKey) {
|
|
24
|
+
throw new Error('Missing required environment variables: ANALYZER_AGENT_ID and ANALYZER_PRIVATE_KEY');
|
|
25
|
+
}
|
|
26
|
+
// Check if we have a placeholder private key
|
|
27
|
+
if (privateKey.startsWith('placeholder-key-for-')) {
|
|
28
|
+
console.warn('⚠️ Using placeholder private key. Agent registration may not have captured the actual private key.');
|
|
29
|
+
console.warn('⚠️ For now, we\'ll use the main Hedera account for testing.');
|
|
30
|
+
// Use the main Hedera account credentials for testing
|
|
31
|
+
const mainAccountId = process.env.HEDERA_ACCOUNT_ID;
|
|
32
|
+
const mainPrivateKey = process.env.HEDERA_PRIVATE_KEY;
|
|
33
|
+
if (!mainAccountId || !mainPrivateKey) {
|
|
34
|
+
throw new Error('Missing main Hedera credentials for fallback');
|
|
35
|
+
}
|
|
36
|
+
this.hederaClient = sdk_1.Client.forTestnet();
|
|
37
|
+
this.hederaClient.setOperator(sdk_1.AccountId.fromString(mainAccountId), mainPrivateKey);
|
|
38
|
+
// Initialize HCS10Client with main account for now
|
|
39
|
+
this.hcsClient = new standards_agent_kit_1.HCS10Client(mainAccountId, mainPrivateKey, 'testnet');
|
|
40
|
+
// Initialize connection manager (optional)
|
|
41
|
+
const useConnections = process.env.USE_HCS10_CONNECTIONS === 'true';
|
|
42
|
+
if (useConnections) {
|
|
43
|
+
this.connectionManager = new HCS10ConnectionManager_1.HCS10ConnectionManager(this.hcsClient, mainAccountId);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// Initialize HCS10Client with actual agent credentials
|
|
48
|
+
this.hcsClient = new standards_agent_kit_1.HCS10Client(agentId, privateKey, 'testnet');
|
|
49
|
+
// Also initialize Hedera client for direct queries
|
|
50
|
+
this.hederaClient = sdk_1.Client.forTestnet();
|
|
51
|
+
this.hederaClient.setOperator(sdk_1.AccountId.fromString(agentId), privateKey);
|
|
52
|
+
// Initialize connection manager (optional)
|
|
53
|
+
const useConnections = process.env.USE_HCS10_CONNECTIONS === 'true';
|
|
54
|
+
if (useConnections) {
|
|
55
|
+
this.connectionManager = new HCS10ConnectionManager_1.HCS10ConnectionManager(this.hcsClient, agentId);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async init() {
|
|
60
|
+
try {
|
|
61
|
+
// Log initialization success
|
|
62
|
+
console.log('🔗 AnalyzerAgent initialized for Hedera testnet');
|
|
63
|
+
console.log(`📡 Mirror node URL: ${this.MIRROR_NODE_URL}`);
|
|
64
|
+
console.log(`🆔 Agent ID: ${process.env.ANALYZER_AGENT_ID}`);
|
|
65
|
+
// Test connection by querying our own account
|
|
66
|
+
const agentId = process.env.ANALYZER_AGENT_ID;
|
|
67
|
+
if (agentId) {
|
|
68
|
+
try {
|
|
69
|
+
const accountInfo = await this.queryAccount(agentId);
|
|
70
|
+
console.log(`✅ Agent account verified: ${accountInfo.balance} tinybars`);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.warn(`⚠️ Could not verify agent account ${agentId}:`, error.message);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
console.error('❌ Failed to initialize AnalyzerAgent:', error);
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async queryAccount(accountId) {
|
|
83
|
+
try {
|
|
84
|
+
console.log(`🔍 Querying account: ${accountId}`);
|
|
85
|
+
// Query account info using Hedera SDK
|
|
86
|
+
const accountInfo = await new sdk_1.AccountInfoQuery()
|
|
87
|
+
.setAccountId(accountId)
|
|
88
|
+
.execute(this.hederaClient);
|
|
89
|
+
console.log(`✅ Account ${accountId} found`);
|
|
90
|
+
console.log(`💰 Balance: ${accountInfo.balance} tinybars`);
|
|
91
|
+
console.log(`🔑 Key: ${accountInfo.key?.toString()}`);
|
|
92
|
+
return {
|
|
93
|
+
accountId: accountId,
|
|
94
|
+
balance: accountInfo.balance.toString(),
|
|
95
|
+
key: accountInfo.key?.toString(),
|
|
96
|
+
isDeleted: accountInfo.isDeleted,
|
|
97
|
+
autoRenewPeriod: accountInfo.autoRenewPeriod?.toString()
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
console.error(`❌ Failed to query account ${accountId}:`, error);
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async queryAccountViaMirror(accountId) {
|
|
106
|
+
try {
|
|
107
|
+
console.log(`🔍 Querying account via mirror node: ${accountId}`);
|
|
108
|
+
const response = await axios_1.default.get(`${this.MIRROR_NODE_URL}/api/v1/accounts/${accountId}`);
|
|
109
|
+
console.log(`✅ Account ${accountId} found via mirror node`);
|
|
110
|
+
console.log(`💰 Balance: ${response.data.balance?.balance} tinybars`);
|
|
111
|
+
return response.data;
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
console.error(`❌ Failed to query account ${accountId} via mirror node:`, error);
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
getHcsClient() {
|
|
119
|
+
return this.hcsClient;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get connection manager instance (if initialized)
|
|
123
|
+
*/
|
|
124
|
+
getConnectionManager() {
|
|
125
|
+
return this.connectionManager;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.AnalyzerAgent = AnalyzerAgent;
|
|
129
|
+
//# sourceMappingURL=AnalyzerAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnalyzerAgent.js","sourceRoot":"","sources":["../../../src/agents/AnalyzerAgent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intelligent Verifier Agent with LLM Reasoning
|
|
3
|
+
*
|
|
4
|
+
* This agent uses OpenAI LLM to make intelligent decisions about:
|
|
5
|
+
* - Invoice validation and fraud detection
|
|
6
|
+
* - Payment approval with context-aware reasoning
|
|
7
|
+
* - Negotiation with counter-offers
|
|
8
|
+
* - Anomaly detection in transactions
|
|
9
|
+
*
|
|
10
|
+
* Demonstrates the power of AI + blockchain for autonomous decisions
|
|
11
|
+
*/
|
|
12
|
+
export declare class IntelligentVerifierAgent {
|
|
13
|
+
private llm?;
|
|
14
|
+
private hcsClient?;
|
|
15
|
+
private agentId;
|
|
16
|
+
private useLLM;
|
|
17
|
+
constructor();
|
|
18
|
+
/**
|
|
19
|
+
* Intelligent invoice validation using LLM reasoning
|
|
20
|
+
*/
|
|
21
|
+
analyzeInvoiceWithReasoning(invoice: any): Promise<{
|
|
22
|
+
approved: boolean;
|
|
23
|
+
reasoning: string;
|
|
24
|
+
confidence: number;
|
|
25
|
+
riskFactors: string[];
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* Parse LLM response (handles both JSON and plain text)
|
|
29
|
+
*/
|
|
30
|
+
private parseLLMResponse;
|
|
31
|
+
/**
|
|
32
|
+
* Fallback rule-based analysis
|
|
33
|
+
*/
|
|
34
|
+
private analyzeInvoiceRuleBased;
|
|
35
|
+
/**
|
|
36
|
+
* Intelligent fraud detection
|
|
37
|
+
*/
|
|
38
|
+
detectFraud(transaction: any): Promise<{
|
|
39
|
+
isFraud: boolean;
|
|
40
|
+
riskScore: number;
|
|
41
|
+
reasoning: string;
|
|
42
|
+
recommendations: string[];
|
|
43
|
+
}>;
|
|
44
|
+
init(): Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=IntelligentVerifierAgent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IntelligentVerifierAgent.d.ts","sourceRoot":"","sources":["../../../src/agents/IntelligentVerifierAgent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,GAAG,CAAC,CAAY;IACxB,OAAO,CAAC,SAAS,CAAC,CAAa;IAC/B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,MAAM,CAAS;;IAsCvB;;OAEG;IACG,2BAA2B,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC;QACvD,QAAQ,EAAE,OAAO,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;QACjB,UAAU,EAAE,MAAM,CAAA;QAClB,WAAW,EAAE,MAAM,EAAE,CAAA;KACtB,CAAC;IAqDF;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAqCxB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAoD/B;;OAEG;IACG,WAAW,CAAC,WAAW,EAAE,GAAG,GAAG,OAAO,CAAC;QAC3C,OAAO,EAAE,OAAO,CAAA;QAChB,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;QACjB,eAAe,EAAE,MAAM,EAAE,CAAA;KAC1B,CAAC;IAmEI,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAW5B"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Intelligent Verifier Agent with LLM Reasoning
|
|
4
|
+
*
|
|
5
|
+
* This agent uses OpenAI LLM to make intelligent decisions about:
|
|
6
|
+
* - Invoice validation and fraud detection
|
|
7
|
+
* - Payment approval with context-aware reasoning
|
|
8
|
+
* - Negotiation with counter-offers
|
|
9
|
+
* - Anomaly detection in transactions
|
|
10
|
+
*
|
|
11
|
+
* Demonstrates the power of AI + blockchain for autonomous decisions
|
|
12
|
+
*/
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.IntelligentVerifierAgent = void 0;
|
|
18
|
+
const openai_1 = require("@langchain/openai");
|
|
19
|
+
const standards_agent_kit_1 = require("@hashgraphonline/standards-agent-kit");
|
|
20
|
+
const env_1 = require("../utils/env");
|
|
21
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
22
|
+
(0, env_1.loadEnvIfNeeded)();
|
|
23
|
+
class IntelligentVerifierAgent {
|
|
24
|
+
llm;
|
|
25
|
+
hcsClient;
|
|
26
|
+
agentId;
|
|
27
|
+
useLLM;
|
|
28
|
+
constructor() {
|
|
29
|
+
const apiKey = process.env.OPENAI_API_KEY;
|
|
30
|
+
const agentId = process.env.VERIFIER_AGENT_ID || process.env.HEDERA_ACCOUNT_ID;
|
|
31
|
+
const privateKey = process.env.VERIFIER_PRIVATE_KEY || process.env.HEDERA_PRIVATE_KEY;
|
|
32
|
+
this.agentId = agentId || 'demo-agent';
|
|
33
|
+
// Try to initialize HCS client, but don't fail if credentials are missing
|
|
34
|
+
if (agentId && privateKey) {
|
|
35
|
+
try {
|
|
36
|
+
this.hcsClient = new standards_agent_kit_1.HCS10Client(agentId, privateKey, 'testnet');
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
// Ignore initialization errors - we'll use LLM without HCS
|
|
40
|
+
console.log(chalk_1.default.yellow('⚠️ Could not initialize HCS client'));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
this.useLLM = !!apiKey;
|
|
44
|
+
// Initialize LLM only if API key is provided
|
|
45
|
+
if (apiKey) {
|
|
46
|
+
try {
|
|
47
|
+
this.llm = new openai_1.ChatOpenAI({
|
|
48
|
+
model: 'gpt-4o-mini',
|
|
49
|
+
temperature: 0.2,
|
|
50
|
+
maxTokens: 500
|
|
51
|
+
});
|
|
52
|
+
console.log(chalk_1.default.green('✅ Intelligent Verifier Agent initialized with LLM reasoning'));
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.log(chalk_1.default.yellow('⚠️ LLM initialization failed - falling back to rule-based validation'));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
console.log(chalk_1.default.yellow('⚠️ No OpenAI API key - falling back to rule-based validation'));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Intelligent invoice validation using LLM reasoning
|
|
64
|
+
*/
|
|
65
|
+
async analyzeInvoiceWithReasoning(invoice) {
|
|
66
|
+
if (!this.useLLM || !this.llm) {
|
|
67
|
+
// Fallback to rule-based validation
|
|
68
|
+
return this.analyzeInvoiceRuleBased(invoice);
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
console.log(chalk_1.default.blue('🤖 LLM analyzing invoice with intelligent reasoning...'));
|
|
72
|
+
const systemPrompt = `You are an intelligent financial agent analyzing invoices for automated payment.
|
|
73
|
+
Your task is to validate the invoice, detect potential fraud, and approve or reject based on risk assessment.
|
|
74
|
+
|
|
75
|
+
Business Rules:
|
|
76
|
+
- Amounts < $500: Usually approved automatically
|
|
77
|
+
- Amounts $500-$2000: Require scrutiny
|
|
78
|
+
- Amounts > $2000: Require detailed analysis
|
|
79
|
+
|
|
80
|
+
Common Red Flags: Unusual patterns, unfamiliar vendors, round numbers without context, inconsistent metadata.
|
|
81
|
+
|
|
82
|
+
Respond in JSON format: {approved: boolean, confidence: 0-100, reasoning: string, riskFactors: [string]}`;
|
|
83
|
+
const userPrompt = `Analyze this invoice:
|
|
84
|
+
ID: ${invoice.invoiceId}
|
|
85
|
+
Amount: $${invoice.amountUSD}
|
|
86
|
+
Description: ${invoice.description}
|
|
87
|
+
Vendor: ${invoice.vendorAccountId}
|
|
88
|
+
Due Date: ${invoice.dueDate.toISOString()}
|
|
89
|
+
Category: ${invoice.category}
|
|
90
|
+
Urgency: ${invoice.urgency}`;
|
|
91
|
+
const response = await this.llm.invoke([
|
|
92
|
+
{ role: 'system', content: systemPrompt },
|
|
93
|
+
{ role: 'user', content: userPrompt }
|
|
94
|
+
]);
|
|
95
|
+
const reasoning = response.content;
|
|
96
|
+
// Parse LLM response
|
|
97
|
+
let result = this.parseLLMResponse(reasoning);
|
|
98
|
+
console.log(chalk_1.default.green('✅ LLM analysis complete'));
|
|
99
|
+
console.log(chalk_1.default.blue(`📊 Decision: ${result.approved ? 'APPROVED' : 'REJECTED'}`));
|
|
100
|
+
console.log(chalk_1.default.blue(`🎯 Confidence: ${result.confidence}%`));
|
|
101
|
+
console.log(chalk_1.default.blue(`💡 Reasoning: ${result.reasoning}`));
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
console.error(chalk_1.default.red(`❌ LLM analysis failed: ${error.message}`));
|
|
106
|
+
return this.analyzeInvoiceRuleBased(invoice);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Parse LLM response (handles both JSON and plain text)
|
|
111
|
+
*/
|
|
112
|
+
parseLLMResponse(reasoning) {
|
|
113
|
+
try {
|
|
114
|
+
// Try to extract JSON
|
|
115
|
+
const jsonMatch = reasoning.match(/\{[\s\S]*\}/);
|
|
116
|
+
if (jsonMatch) {
|
|
117
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
118
|
+
return {
|
|
119
|
+
approved: parsed.approved !== false,
|
|
120
|
+
reasoning: parsed.reasoning || 'No reasoning provided',
|
|
121
|
+
confidence: parsed.confidence || 50,
|
|
122
|
+
riskFactors: parsed.riskFactors || []
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
// If no JSON, parse text response
|
|
126
|
+
const approved = reasoning.toLowerCase().includes('approve') && !reasoning.toLowerCase().includes('not approve');
|
|
127
|
+
return {
|
|
128
|
+
approved,
|
|
129
|
+
reasoning,
|
|
130
|
+
confidence: approved ? 75 : 25,
|
|
131
|
+
riskFactors: []
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
return {
|
|
136
|
+
approved: true,
|
|
137
|
+
reasoning: reasoning,
|
|
138
|
+
confidence: 50,
|
|
139
|
+
riskFactors: []
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Fallback rule-based analysis
|
|
145
|
+
*/
|
|
146
|
+
analyzeInvoiceRuleBased(invoice) {
|
|
147
|
+
const riskFactors = [];
|
|
148
|
+
let approved = true;
|
|
149
|
+
// Check amount
|
|
150
|
+
if (invoice.amountUSD > 2000) {
|
|
151
|
+
riskFactors.push('High amount (>$2000)');
|
|
152
|
+
approved = false;
|
|
153
|
+
return {
|
|
154
|
+
approved: false,
|
|
155
|
+
reasoning: 'Amount exceeds rule-based threshold of $2000',
|
|
156
|
+
confidence: 80,
|
|
157
|
+
riskFactors
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
if (invoice.amountUSD > 500) {
|
|
161
|
+
riskFactors.push('Medium amount ($500-$2000)');
|
|
162
|
+
}
|
|
163
|
+
// Check if vendor account is provided
|
|
164
|
+
if (!invoice.vendorAccountId || invoice.vendorAccountId === '0.0.XXXXXX') {
|
|
165
|
+
approved = false;
|
|
166
|
+
riskFactors.push('Invalid vendor account');
|
|
167
|
+
return {
|
|
168
|
+
approved: false,
|
|
169
|
+
reasoning: 'Invalid or missing vendor account ID',
|
|
170
|
+
confidence: 90,
|
|
171
|
+
riskFactors
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
// Check description
|
|
175
|
+
if (!invoice.description || invoice.description.length < 10) {
|
|
176
|
+
riskFactors.push('Insufficient description');
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
approved,
|
|
180
|
+
reasoning: approved
|
|
181
|
+
? `Rule-based validation passed. Amount: $${invoice.amountUSD} within acceptable range.`
|
|
182
|
+
: 'Rule-based validation failed due to risk factors',
|
|
183
|
+
confidence: 70,
|
|
184
|
+
riskFactors
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Intelligent fraud detection
|
|
189
|
+
*/
|
|
190
|
+
async detectFraud(transaction) {
|
|
191
|
+
if (!this.useLLM || !this.llm) {
|
|
192
|
+
return {
|
|
193
|
+
isFraud: false,
|
|
194
|
+
riskScore: 0,
|
|
195
|
+
reasoning: 'LLM not available for fraud detection',
|
|
196
|
+
recommendations: []
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
try {
|
|
200
|
+
console.log(chalk_1.default.blue('🔍 LLM checking for fraud patterns...'));
|
|
201
|
+
const systemPrompt = `You are a fraud detection agent. Analyze transactions for suspicious patterns.
|
|
202
|
+
|
|
203
|
+
VALID: Hedera account IDs (0.0.XXXXXX), reasonable amounts for B2B ($1-$10000), typical business descriptions.
|
|
204
|
+
|
|
205
|
+
RED FLAGS:
|
|
206
|
+
- Amounts outside $1-$10000 range
|
|
207
|
+
- Vague or suspicious descriptions ("urgent payment needed")
|
|
208
|
+
- Multiple rapid transactions in short time
|
|
209
|
+
- Amounts with suspicious patterns (e.g., $1234.56)
|
|
210
|
+
|
|
211
|
+
Respond in JSON only: {"isFraud": false, "riskScore": 0-100, "reasoning": "brief explanation", "recommendations": []}`;
|
|
212
|
+
const userPrompt = `Transaction:
|
|
213
|
+
Amount: $${transaction.amount}
|
|
214
|
+
Vendor: ${transaction.vendorAccountId}
|
|
215
|
+
Description: ${transaction.description}
|
|
216
|
+
Timestamp: ${transaction.timestamp}`;
|
|
217
|
+
const response = await this.llm.invoke([
|
|
218
|
+
{ role: 'system', content: systemPrompt },
|
|
219
|
+
{ role: 'user', content: userPrompt }
|
|
220
|
+
]);
|
|
221
|
+
const reasoning = response.content;
|
|
222
|
+
// Parse response
|
|
223
|
+
const jsonMatch = reasoning.match(/\{[\s\S]*\}/);
|
|
224
|
+
if (jsonMatch) {
|
|
225
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
226
|
+
return {
|
|
227
|
+
isFraud: parsed.isFraud || false,
|
|
228
|
+
riskScore: parsed.riskScore || 0,
|
|
229
|
+
reasoning: parsed.reasoning || 'No fraud detected',
|
|
230
|
+
recommendations: parsed.recommendations || []
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
isFraud: false,
|
|
235
|
+
riskScore: 0,
|
|
236
|
+
reasoning,
|
|
237
|
+
recommendations: []
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
console.error(chalk_1.default.red(`❌ Fraud detection failed: ${error.message}`));
|
|
242
|
+
return {
|
|
243
|
+
isFraud: false,
|
|
244
|
+
riskScore: 0,
|
|
245
|
+
reasoning: 'Fraud detection unavailable',
|
|
246
|
+
recommendations: []
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
async init() {
|
|
251
|
+
const topicId = process.env.VERIFIER_TOPIC_ID;
|
|
252
|
+
if (!topicId) {
|
|
253
|
+
console.log(chalk_1.default.yellow('⚠️ No topic ID - agent will not poll'));
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
console.log(chalk_1.default.green('✅ Intelligent Verifier Agent ready'));
|
|
257
|
+
console.log(chalk_1.default.blue(`📡 Topic ID: ${topicId}`));
|
|
258
|
+
console.log(chalk_1.default.blue(`🤖 LLM Reasoning: ${this.useLLM ? 'Enabled' : 'Disabled'}`));
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
exports.IntelligentVerifierAgent = IntelligentVerifierAgent;
|
|
262
|
+
//# sourceMappingURL=IntelligentVerifierAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IntelligentVerifierAgent.js","sourceRoot":"","sources":["../../../src/agents/IntelligentVerifierAgent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class SettlementAgent {
|
|
2
|
+
private connection;
|
|
3
|
+
private agentWallet?;
|
|
4
|
+
private facilitator;
|
|
5
|
+
private merchantWallet;
|
|
6
|
+
constructor();
|
|
7
|
+
triggerSettlement(verification: any): Promise<void>;
|
|
8
|
+
init(): Promise<void>;
|
|
9
|
+
private createPaymentRequirements;
|
|
10
|
+
private executeSettlement;
|
|
11
|
+
private createPaymentPayload;
|
|
12
|
+
executeSolanaTransfer(recipientAddress: string, amountUsdc: number): Promise<string | null>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=SettlementAgent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettlementAgent.d.ts","sourceRoot":"","sources":["../../../src/agents/SettlementAgent.ts"],"names":[],"mappings":"AAQA,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,cAAc,CAAQ;;IAmCxB,iBAAiB,CAAC,YAAY,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B,OAAO,CAAC,yBAAyB;YAiBnB,iBAAiB;IAqC/B,OAAO,CAAC,oBAAoB;IAuBtB,qBAAqB,CAAC,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CA+BlG"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SettlementAgent = void 0;
|
|
7
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
8
|
+
const X402FacilitatorServer_1 = require("../facilitator/X402FacilitatorServer");
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const dotenv_1 = __importDefault(require("dotenv"));
|
|
11
|
+
const bs58_1 = __importDefault(require("bs58"));
|
|
12
|
+
dotenv_1.default.config();
|
|
13
|
+
class SettlementAgent {
|
|
14
|
+
connection;
|
|
15
|
+
agentWallet;
|
|
16
|
+
facilitator;
|
|
17
|
+
merchantWallet;
|
|
18
|
+
constructor() {
|
|
19
|
+
const rpcUrl = process.env.SOLANA_RPC_URL || 'https://api.devnet.solana.com';
|
|
20
|
+
const agentPrivateKey = process.env.AGENT_PRIVATE_KEY;
|
|
21
|
+
const merchantWallet = process.env.MERCHANT_WALLET_ADDRESS;
|
|
22
|
+
if (!merchantWallet) {
|
|
23
|
+
console.error(chalk_1.default.red('\n❌ Configuration Error: Missing MERCHANT_WALLET_ADDRESS'));
|
|
24
|
+
console.log(chalk_1.default.yellow('\n📋 Setup Instructions:'));
|
|
25
|
+
console.log(chalk_1.default.white('1. Copy the example configuration:'));
|
|
26
|
+
console.log(chalk_1.default.gray(' cp .env.example .env\n'));
|
|
27
|
+
console.log(chalk_1.default.white('2. Edit .env and add:'));
|
|
28
|
+
console.log(chalk_1.default.gray(' AGENT_PRIVATE_KEY=your_base58_key'));
|
|
29
|
+
console.log(chalk_1.default.gray(' MERCHANT_WALLET_ADDRESS=recipient_address\n'));
|
|
30
|
+
console.log(chalk_1.default.white('3. Generate a Solana wallet (if needed):'));
|
|
31
|
+
console.log(chalk_1.default.gray(' solana-keygen new --outfile wallet.json\n'));
|
|
32
|
+
throw new Error('Missing required environment variable: MERCHANT_WALLET_ADDRESS');
|
|
33
|
+
}
|
|
34
|
+
this.connection = new web3_js_1.Connection(rpcUrl, 'confirmed');
|
|
35
|
+
this.merchantWallet = merchantWallet;
|
|
36
|
+
this.facilitator = new X402FacilitatorServer_1.X402FacilitatorServer();
|
|
37
|
+
if (agentPrivateKey) {
|
|
38
|
+
try {
|
|
39
|
+
const privateKeyBytes = bs58_1.default.decode(agentPrivateKey);
|
|
40
|
+
this.agentWallet = web3_js_1.Keypair.fromSecretKey(privateKeyBytes);
|
|
41
|
+
console.log(chalk_1.default.green(`✅ Settlement Agent initialized with wallet: ${this.agentWallet.publicKey.toBase58()}`));
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
console.error(chalk_1.default.red('❌ Failed to load agent wallet:'), error);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async triggerSettlement(verification) {
|
|
49
|
+
console.log(chalk_1.default.yellow('🔧 SettlementAgent: Triggering settlement...'));
|
|
50
|
+
await this.executeSettlement(verification);
|
|
51
|
+
}
|
|
52
|
+
async init() {
|
|
53
|
+
try {
|
|
54
|
+
const agentId = process.env.SETTLEMENT_AGENT_ID;
|
|
55
|
+
console.log(chalk_1.default.yellow('✅ SettlementAgent initialized for Solana'));
|
|
56
|
+
console.log(`🆔 Agent ID: ${agentId}`);
|
|
57
|
+
console.log(`🌐 RPC URL: ${process.env.SOLANA_RPC_URL}`);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
console.error('❌ Failed to initialize SettlementAgent:', error);
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
createPaymentRequirements() {
|
|
65
|
+
const paymentAmount = parseFloat(process.env.DEFAULT_PAYMENT_AMOUNT_USDC || '1.0');
|
|
66
|
+
const amountInMicroUsdc = Math.floor(paymentAmount * 1_000_000);
|
|
67
|
+
return {
|
|
68
|
+
scheme: 'exact',
|
|
69
|
+
network: 'solana-devnet',
|
|
70
|
+
asset: process.env.USDC_MINT || '4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU',
|
|
71
|
+
payTo: this.merchantWallet,
|
|
72
|
+
maxAmountRequired: amountInMicroUsdc.toString(),
|
|
73
|
+
resource: '/agent-settlement',
|
|
74
|
+
description: 'A2A agent settlement via x402 on Solana',
|
|
75
|
+
mimeType: 'application/json',
|
|
76
|
+
maxTimeoutSeconds: 120
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
async executeSettlement(verification) {
|
|
80
|
+
try {
|
|
81
|
+
console.log(chalk_1.default.yellow('💰 Initiating settlement flow on Solana...'));
|
|
82
|
+
const requirements = this.createPaymentRequirements();
|
|
83
|
+
console.log(chalk_1.default.blue('📋 Step 1: Creating payment authorization...'));
|
|
84
|
+
const paymentPayload = this.createPaymentPayload(requirements);
|
|
85
|
+
const paymentHeader = Buffer.from(JSON.stringify(paymentPayload)).toString('base64');
|
|
86
|
+
console.log(chalk_1.default.blue('📋 Payment payload structure:'), JSON.stringify(paymentPayload, null, 2));
|
|
87
|
+
console.log(chalk_1.default.blue('📋 Step 2: Verifying payment...'));
|
|
88
|
+
const verificationResult = await this.facilitator.verify(paymentHeader, requirements);
|
|
89
|
+
if (!verificationResult.isValid) {
|
|
90
|
+
throw new Error(`Payment verification failed: ${verificationResult.invalidReason}`);
|
|
91
|
+
}
|
|
92
|
+
console.log(chalk_1.default.green('✅ Payment verification successful'));
|
|
93
|
+
console.log(chalk_1.default.blue('📋 Step 3: Settling payment and executing USDC transfer...'));
|
|
94
|
+
const settlementResult = await this.facilitator.settle(paymentHeader, requirements);
|
|
95
|
+
if (!settlementResult.success) {
|
|
96
|
+
throw new Error(`Payment settlement failed: ${settlementResult.error}`);
|
|
97
|
+
}
|
|
98
|
+
console.log(chalk_1.default.green('✅ Payment settled successfully!'));
|
|
99
|
+
console.log(chalk_1.default.blue(`📋 Transaction signature: ${settlementResult.txHash}`));
|
|
100
|
+
console.log(chalk_1.default.blue(`📋 Explorer: https://explorer.solana.com/tx/${settlementResult.txHash}?cluster=devnet`));
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
console.error('❌ Error executing settlement:', error);
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
createPaymentPayload(requirements) {
|
|
108
|
+
if (!this.agentWallet) {
|
|
109
|
+
throw new Error('Agent wallet not initialized');
|
|
110
|
+
}
|
|
111
|
+
const validBefore = Math.floor(Date.now() / 1000) + requirements.maxTimeoutSeconds;
|
|
112
|
+
return {
|
|
113
|
+
x402Version: 1,
|
|
114
|
+
scheme: requirements.scheme,
|
|
115
|
+
network: requirements.network,
|
|
116
|
+
payload: {
|
|
117
|
+
authorization: {
|
|
118
|
+
from: this.agentWallet.publicKey.toBase58(),
|
|
119
|
+
to: requirements.payTo,
|
|
120
|
+
value: requirements.maxAmountRequired,
|
|
121
|
+
asset: requirements.asset,
|
|
122
|
+
validBefore: validBefore
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
async executeSolanaTransfer(recipientAddress, amountUsdc) {
|
|
128
|
+
try {
|
|
129
|
+
if (!this.agentWallet) {
|
|
130
|
+
throw new Error('Agent wallet not initialized');
|
|
131
|
+
}
|
|
132
|
+
console.log(chalk_1.default.blue(`💸 Executing direct USDC transfer to ${recipientAddress}`));
|
|
133
|
+
console.log(chalk_1.default.blue(`💵 Amount: ${amountUsdc} USDC`));
|
|
134
|
+
const requirements = {
|
|
135
|
+
...this.createPaymentRequirements(),
|
|
136
|
+
payTo: recipientAddress,
|
|
137
|
+
maxAmountRequired: Math.floor(amountUsdc * 1_000_000).toString()
|
|
138
|
+
};
|
|
139
|
+
const paymentPayload = this.createPaymentPayload(requirements);
|
|
140
|
+
const paymentHeader = Buffer.from(JSON.stringify(paymentPayload)).toString('base64');
|
|
141
|
+
const settlementResult = await this.facilitator.settle(paymentHeader, requirements);
|
|
142
|
+
if (settlementResult.success) {
|
|
143
|
+
console.log(chalk_1.default.green(`✅ Transfer successful: ${settlementResult.txHash}`));
|
|
144
|
+
return settlementResult.txHash;
|
|
145
|
+
}
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
console.error('❌ Transfer error:', error);
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
exports.SettlementAgent = SettlementAgent;
|
|
155
|
+
//# sourceMappingURL=SettlementAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettlementAgent.js","sourceRoot":"","sources":["../../../src/agents/SettlementAgent.ts"],"names":[],"mappings":"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"}
|