@varun-ai07/covenant-mcp 1.2.3 → 1.3.2
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 +1056 -170
- package/dist/abis/MultiTokenEscrow.json +836 -0
- package/dist/abis/v2/AgentRegistry.json +872 -0
- package/dist/abis/v2/DisputeResolution.json +493 -0
- package/dist/abis/v2/InsurancePool.json +645 -0
- package/dist/abis/v2/ReceiptVerifier.json +394 -0
- package/dist/abis/v2/RevisionManager.json +544 -0
- package/dist/abis/v2/TaskEscrow.json +1018 -0
- package/dist/cli.js +0 -0
- package/dist/config.d.ts +13 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +84 -25
- package/dist/config.js.map +1 -1
- package/dist/lib/did.d.ts +72 -0
- package/dist/lib/did.d.ts.map +1 -0
- package/dist/lib/did.js +115 -0
- package/dist/lib/did.js.map +1 -0
- package/dist/lib/formatResponse.d.ts +33 -0
- package/dist/lib/formatResponse.d.ts.map +1 -0
- package/dist/lib/formatResponse.js +92 -0
- package/dist/lib/formatResponse.js.map +1 -0
- package/dist/lib/schemaHelpers.d.ts +11 -0
- package/dist/lib/schemaHelpers.d.ts.map +1 -0
- package/dist/lib/schemaHelpers.js +11 -0
- package/dist/lib/schemaHelpers.js.map +1 -0
- package/dist/lib/store.d.ts +10 -0
- package/dist/lib/store.d.ts.map +1 -0
- package/dist/lib/store.js +39 -0
- package/dist/lib/store.js.map +1 -0
- package/dist/lib/verify.d.ts +21 -0
- package/dist/lib/verify.d.ts.map +1 -0
- package/dist/lib/verify.js +568 -0
- package/dist/lib/verify.js.map +1 -0
- package/dist/schemas.d.ts +5 -5
- package/dist/schemas.d.ts.map +1 -1
- package/dist/server.d.ts +1 -25
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +53 -37
- package/dist/server.js.map +1 -1
- package/dist/shared-types.d.ts +67 -0
- package/dist/shared-types.d.ts.map +1 -0
- package/dist/shared-types.js +86 -0
- package/dist/shared-types.js.map +1 -0
- package/dist/tools/account-abstraction.d.ts +3 -0
- package/dist/tools/account-abstraction.d.ts.map +1 -0
- package/dist/tools/account-abstraction.js +364 -0
- package/dist/tools/account-abstraction.js.map +1 -0
- package/dist/tools/batches.d.ts.map +1 -1
- package/dist/tools/batches.js +68 -37
- package/dist/tools/batches.js.map +1 -1
- package/dist/tools/bounties.d.ts +3 -0
- package/dist/tools/bounties.d.ts.map +1 -0
- package/dist/tools/bounties.js +304 -0
- package/dist/tools/bounties.js.map +1 -0
- package/dist/tools/bridge.d.ts +3 -0
- package/dist/tools/bridge.d.ts.map +1 -0
- package/dist/tools/bridge.js +190 -0
- package/dist/tools/bridge.js.map +1 -0
- package/dist/tools/collectives.d.ts.map +1 -1
- package/dist/tools/collectives.js +74 -46
- package/dist/tools/collectives.js.map +1 -1
- package/dist/tools/covenant-help.d.ts +3 -0
- package/dist/tools/covenant-help.d.ts.map +1 -0
- package/dist/tools/covenant-help.js +321 -0
- package/dist/tools/covenant-help.js.map +1 -0
- package/dist/tools/cross-chain.d.ts +3 -0
- package/dist/tools/cross-chain.d.ts.map +1 -0
- package/dist/tools/cross-chain.js +77 -0
- package/dist/tools/cross-chain.js.map +1 -0
- package/dist/tools/disputes.d.ts.map +1 -1
- package/dist/tools/disputes.js +39 -33
- package/dist/tools/disputes.js.map +1 -1
- package/dist/tools/escrow.d.ts.map +1 -1
- package/dist/tools/escrow.js +248 -199
- package/dist/tools/escrow.js.map +1 -1
- package/dist/tools/fiat-onramp.d.ts +3 -0
- package/dist/tools/fiat-onramp.d.ts.map +1 -0
- package/dist/tools/fiat-onramp.js +108 -0
- package/dist/tools/fiat-onramp.js.map +1 -0
- package/dist/tools/governance.d.ts +3 -0
- package/dist/tools/governance.d.ts.map +1 -0
- package/dist/tools/governance.js +271 -0
- package/dist/tools/governance.js.map +1 -0
- package/dist/tools/grants.d.ts +3 -0
- package/dist/tools/grants.d.ts.map +1 -0
- package/dist/tools/grants.js +269 -0
- package/dist/tools/grants.js.map +1 -0
- package/dist/tools/insurance.d.ts.map +1 -1
- package/dist/tools/insurance.js +92 -45
- package/dist/tools/insurance.js.map +1 -1
- package/dist/tools/market.d.ts.map +1 -1
- package/dist/tools/market.js +122 -103
- package/dist/tools/market.js.map +1 -1
- package/dist/tools/matching.d.ts +3 -0
- package/dist/tools/matching.d.ts.map +1 -0
- package/dist/tools/matching.js +233 -0
- package/dist/tools/matching.js.map +1 -0
- package/dist/tools/messaging.d.ts +3 -0
- package/dist/tools/messaging.d.ts.map +1 -0
- package/dist/tools/messaging.js +159 -0
- package/dist/tools/messaging.js.map +1 -0
- package/dist/tools/multi-token.d.ts +3 -0
- package/dist/tools/multi-token.d.ts.map +1 -0
- package/dist/tools/multi-token.js +274 -0
- package/dist/tools/multi-token.js.map +1 -0
- package/dist/tools/offchain-coordinator.d.ts +3 -0
- package/dist/tools/offchain-coordinator.d.ts.map +1 -0
- package/dist/tools/offchain-coordinator.js +436 -0
- package/dist/tools/offchain-coordinator.js.map +1 -0
- package/dist/tools/protocol.d.ts.map +1 -1
- package/dist/tools/protocol.js +19 -6
- package/dist/tools/protocol.js.map +1 -1
- package/dist/tools/receipts.d.ts.map +1 -1
- package/dist/tools/receipts.js +39 -39
- package/dist/tools/receipts.js.map +1 -1
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +90 -43
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/reputation-vc.d.ts +3 -0
- package/dist/tools/reputation-vc.d.ts.map +1 -0
- package/dist/tools/reputation-vc.js +438 -0
- package/dist/tools/reputation-vc.js.map +1 -0
- package/dist/tools/revisions.d.ts +3 -0
- package/dist/tools/revisions.d.ts.map +1 -0
- package/dist/tools/revisions.js +108 -0
- package/dist/tools/revisions.js.map +1 -0
- package/dist/tools/router.d.ts +3 -0
- package/dist/tools/router.d.ts.map +1 -0
- package/dist/tools/router.js +104 -0
- package/dist/tools/router.js.map +1 -0
- package/dist/tools/streaming.d.ts +3 -0
- package/dist/tools/streaming.d.ts.map +1 -0
- package/dist/tools/streaming.js +350 -0
- package/dist/tools/streaming.js.map +1 -0
- package/dist/tools/templates.d.ts +3 -0
- package/dist/tools/templates.d.ts.map +1 -0
- package/dist/tools/templates.js +392 -0
- package/dist/tools/templates.js.map +1 -0
- package/dist/tools/training.d.ts +3 -0
- package/dist/tools/training.d.ts.map +1 -0
- package/dist/tools/training.js +304 -0
- package/dist/tools/training.js.map +1 -0
- package/dist/tools/v2-settlement.d.ts +3 -0
- package/dist/tools/v2-settlement.d.ts.map +1 -0
- package/dist/tools/v2-settlement.js +226 -0
- package/dist/tools/v2-settlement.js.map +1 -0
- package/dist/tools/verification.d.ts +3 -0
- package/dist/tools/verification.d.ts.map +1 -0
- package/dist/tools/verification.js +215 -0
- package/dist/tools/verification.js.map +1 -0
- package/dist/tools/verify-deep.d.ts +3 -0
- package/dist/tools/verify-deep.d.ts.map +1 -0
- package/dist/tools/verify-deep.js +125 -0
- package/dist/tools/verify-deep.js.map +1 -0
- package/dist/types.d.ts +16 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -23
- package/dist/types.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Offchain Coordination Layer
|
|
3
|
+
*
|
|
4
|
+
* All coordination that doesn't need onchain settlement:
|
|
5
|
+
* - Agent profiles (signed by wallet, stored offchain)
|
|
6
|
+
* - Smart matching (offchain algorithm using onchain reputation)
|
|
7
|
+
* - Messaging (encrypted, offchain)
|
|
8
|
+
* - Task templates (offchain)
|
|
9
|
+
* - Collective coordination (Merkle root anchor)
|
|
10
|
+
* - Marketplace discovery (offchain indexer)
|
|
11
|
+
*
|
|
12
|
+
* This is the "maximum coordination offchain" layer that pairs
|
|
13
|
+
* with the minimal v2 settlement contracts.
|
|
14
|
+
*/
|
|
15
|
+
import { z } from "zod";
|
|
16
|
+
import { keccak256, toBytes } from "viem";
|
|
17
|
+
import { loadAbi, CONTRACTS, getAccount } from "../config.js";
|
|
18
|
+
import { readContract } from "../handlers/wallet.js";
|
|
19
|
+
import { formatReadResult, formatError } from "../handlers/transactions.js";
|
|
20
|
+
import { ethAddress } from "../lib/schemaHelpers.js";
|
|
21
|
+
import { parseContractError, formatStructuredError } from "../lib/formatResponse.js";
|
|
22
|
+
const REGISTRY_ABI = loadAbi("AgentRegistry");
|
|
23
|
+
// In-memory stores (production: IPFS + database)
|
|
24
|
+
const profileStore = new Map();
|
|
25
|
+
const templateStore = new Map();
|
|
26
|
+
const listingStore = new Map();
|
|
27
|
+
// ─── Built-in Templates ─────────────────────────────────────
|
|
28
|
+
const BUILT_IN_TEMPLATES = [
|
|
29
|
+
{
|
|
30
|
+
id: "code-review",
|
|
31
|
+
name: "Code Review",
|
|
32
|
+
description: "Thorough code review with actionable feedback",
|
|
33
|
+
category: "development",
|
|
34
|
+
parameters: { language: "string", repoUrl: "string", scope: "string" },
|
|
35
|
+
pricing: { base: "0.005", multiplier: 1.5 },
|
|
36
|
+
verificationChecks: ["output_not_empty", "has_issues", "has_suggestions"],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: "security-audit",
|
|
40
|
+
name: "Security Audit",
|
|
41
|
+
description: "Security vulnerability assessment",
|
|
42
|
+
category: "security",
|
|
43
|
+
parameters: { target: "string", depth: "string", standards: "string[]" },
|
|
44
|
+
pricing: { base: "0.02", multiplier: 2.0 },
|
|
45
|
+
verificationChecks: ["output_not_empty", "has_vulnerabilities", "has_remediation"],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: "data-analysis",
|
|
49
|
+
name: "Data Analysis",
|
|
50
|
+
description: "Analyze dataset and produce insights",
|
|
51
|
+
category: "data",
|
|
52
|
+
parameters: { datasetUrl: "string", questions: "string[]" },
|
|
53
|
+
pricing: { base: "0.008", multiplier: 1.2 },
|
|
54
|
+
verificationChecks: ["output_not_empty", "answers_questions", "has_visualizations"],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: "api-development",
|
|
58
|
+
name: "API Development",
|
|
59
|
+
description: "Build REST/GraphQL API endpoints",
|
|
60
|
+
category: "development",
|
|
61
|
+
parameters: { spec: "string", framework: "string", testsRequired: "boolean" },
|
|
62
|
+
pricing: { base: "0.015", multiplier: 1.8 },
|
|
63
|
+
verificationChecks: ["output_not_empty", "has_endpoints", "has_tests"],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: "documentation",
|
|
67
|
+
name: "Documentation",
|
|
68
|
+
description: "Generate technical documentation",
|
|
69
|
+
category: "writing",
|
|
70
|
+
parameters: { source: "string", format: "string", audience: "string" },
|
|
71
|
+
pricing: { base: "0.003", multiplier: 1.0 },
|
|
72
|
+
verificationChecks: ["output_not_empty", "has_sections", "has_examples"],
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
// Initialize templates
|
|
76
|
+
BUILT_IN_TEMPLATES.forEach(t => templateStore.set(t.id, t));
|
|
77
|
+
function calculateMatchScore(requirements, agent) {
|
|
78
|
+
const reasons = [];
|
|
79
|
+
let score = 0;
|
|
80
|
+
// Capability match (40% weight)
|
|
81
|
+
const matchedCaps = requirements.capabilities.filter(c => agent.capabilities.includes(c));
|
|
82
|
+
const capScore = requirements.capabilities.length > 0
|
|
83
|
+
? matchedCaps.length / requirements.capabilities.length
|
|
84
|
+
: 0;
|
|
85
|
+
score += capScore * 0.4;
|
|
86
|
+
if (matchedCaps.length > 0)
|
|
87
|
+
reasons.push(`${matchedCaps.length}/${requirements.capabilities.length} capabilities matched`);
|
|
88
|
+
// Reputation score (30% weight)
|
|
89
|
+
const repScore = agent.reputation / 1000;
|
|
90
|
+
score += repScore * 0.3;
|
|
91
|
+
if (agent.reputation >= 800)
|
|
92
|
+
reasons.push("High reputation agent");
|
|
93
|
+
// Experience score (20% weight)
|
|
94
|
+
const totalTasks = agent.tasksCompleted + agent.tasksFailed;
|
|
95
|
+
const expScore = totalTasks > 0 ? Math.min(totalTasks / 20, 1) : 0;
|
|
96
|
+
score += expScore * 0.2;
|
|
97
|
+
if (agent.tasksCompleted >= 10)
|
|
98
|
+
reasons.push(`${agent.tasksCompleted} tasks completed`);
|
|
99
|
+
// Stake score (10% weight)
|
|
100
|
+
const stake = parseFloat(agent.stakedAmount);
|
|
101
|
+
const stakeScore = Math.min(stake / 0.1, 1);
|
|
102
|
+
score += stakeScore * 0.1;
|
|
103
|
+
return { score, reasons };
|
|
104
|
+
}
|
|
105
|
+
// ─── Input Schemas ───────────────────────────────────────────
|
|
106
|
+
const profileUpdateSchema = z.object({
|
|
107
|
+
name: z.string().min(1).max(100),
|
|
108
|
+
bio: z.string().max(500).optional(),
|
|
109
|
+
website: z.string().url().optional(),
|
|
110
|
+
capabilities: z.array(z.string()).max(20),
|
|
111
|
+
tags: z.array(z.string()).max(10).optional(),
|
|
112
|
+
avatarUrl: z.string().url().optional(),
|
|
113
|
+
socialLinks: z.record(z.string(), z.string()).optional(),
|
|
114
|
+
});
|
|
115
|
+
const matchingSchema = z.object({
|
|
116
|
+
capabilities: z.array(z.string()).min(1),
|
|
117
|
+
budget: z.string().optional(),
|
|
118
|
+
priority: z.enum(["low", "medium", "high", "urgent"]).optional(),
|
|
119
|
+
topN: z.number().int().min(1).max(20).optional(),
|
|
120
|
+
});
|
|
121
|
+
const messagingSchema = z.object({
|
|
122
|
+
to: ethAddress,
|
|
123
|
+
content: z.string().min(1).max(5000),
|
|
124
|
+
taskId: z.number().optional(),
|
|
125
|
+
messageType: z.enum(["general", "proposal", "question", "update"]).optional(),
|
|
126
|
+
});
|
|
127
|
+
const marketplaceSchema = z.object({
|
|
128
|
+
capabilities: z.array(z.string()).optional(),
|
|
129
|
+
minReputation: z.number().int().min(0).max(1000).optional(),
|
|
130
|
+
maxRate: z.string().optional(),
|
|
131
|
+
availability: z.enum(["available", "busy", "offline"]).optional(),
|
|
132
|
+
sortBy: z.enum(["reputation", "rate", "tasks"]).optional(),
|
|
133
|
+
});
|
|
134
|
+
// ─── Tool Registration ───────────────────────────────────────
|
|
135
|
+
export function registerOffchainCoordinatorTools(server) {
|
|
136
|
+
// ──────────────────────────────────────────────────────────
|
|
137
|
+
// corven_profile_update
|
|
138
|
+
// ──────────────────────────────────────────────────────────
|
|
139
|
+
server.registerTool("corven_profile_update", {
|
|
140
|
+
title: "Update Agent Profile",
|
|
141
|
+
description: "Update offchain agent profile. Profile data is signed by wallet " +
|
|
142
|
+
"and stored offchain (IPFS in production). No gas cost.\n" +
|
|
143
|
+
"USE WHEN: An agent wants to enrich its public profile with bio, website, avatar, social links, or refined capability tags.\n" +
|
|
144
|
+
"REQUIRES: Wallet configured (PRIVATE_KEY set). Agent should be registered on-chain via corven_register_agent first.\n" +
|
|
145
|
+
"RETURNS: Confirmation with address, name, capabilities, and updatedAt timestamp.\n" +
|
|
146
|
+
"COMES BEFORE: corven_match_agents, corven_marketplace_list (richer profiles score higher in matching).\n" +
|
|
147
|
+
"COMES AFTER: corven_register_agent (on-chain identity must exist first).\n" +
|
|
148
|
+
"NOTE: Zero gas cost. Data is signed by wallet and stored in-memory (IPFS in production).",
|
|
149
|
+
inputSchema: {
|
|
150
|
+
name: z.string().describe("Display name"),
|
|
151
|
+
bio: z.string().optional().describe("Agent bio (max 500 chars)"),
|
|
152
|
+
website: z.string().optional().describe("Website URL"),
|
|
153
|
+
capabilities: z.array(z.string()).describe("Capability tags"),
|
|
154
|
+
tags: z.array(z.string()).optional().describe("Additional tags"),
|
|
155
|
+
avatarUrl: z.string().optional().describe("Avatar image URL"),
|
|
156
|
+
socialLinks: z.record(z.string(), z.string()).optional().describe("Social media links"),
|
|
157
|
+
},
|
|
158
|
+
}, async (params) => {
|
|
159
|
+
try {
|
|
160
|
+
const parsed = profileUpdateSchema.safeParse(params);
|
|
161
|
+
if (!parsed.success)
|
|
162
|
+
return formatError(parsed.error);
|
|
163
|
+
const account = getAccount();
|
|
164
|
+
if (!account)
|
|
165
|
+
return formatError(new Error("No wallet configured."));
|
|
166
|
+
const profile = {
|
|
167
|
+
address: account,
|
|
168
|
+
name: parsed.data.name,
|
|
169
|
+
bio: parsed.data.bio || "",
|
|
170
|
+
website: parsed.data.website || "",
|
|
171
|
+
capabilities: parsed.data.capabilities,
|
|
172
|
+
tags: parsed.data.tags || [],
|
|
173
|
+
avatarUrl: parsed.data.avatarUrl || "",
|
|
174
|
+
socialLinks: parsed.data.socialLinks || {},
|
|
175
|
+
updatedAt: Math.floor(Date.now() / 1000),
|
|
176
|
+
};
|
|
177
|
+
profileStore.set(account.toLowerCase(), profile);
|
|
178
|
+
return formatReadResult({
|
|
179
|
+
address: account,
|
|
180
|
+
name: profile.name,
|
|
181
|
+
capabilities: profile.capabilities,
|
|
182
|
+
updatedAt: new Date(profile.updatedAt * 1000).toISOString(),
|
|
183
|
+
note: "Profile stored offchain. No gas consumed.",
|
|
184
|
+
}, "Profile Updated");
|
|
185
|
+
}
|
|
186
|
+
catch (e) {
|
|
187
|
+
const parsed = parseContractError(e);
|
|
188
|
+
return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
// ──────────────────────────────────────────────────────────
|
|
192
|
+
// corven_profile_get
|
|
193
|
+
// ──────────────────────────────────────────────────────────
|
|
194
|
+
server.registerTool("corven_profile_get", {
|
|
195
|
+
title: "Get Agent Profile",
|
|
196
|
+
description: "Get offchain profile for an agent. Combines onchain data with offchain profile.\n" +
|
|
197
|
+
"USE WHEN: You need a complete view of an agent — both on-chain reputation/stake and off-chain bio/website/social.\n" +
|
|
198
|
+
"REQUIRES: Valid Ethereum address. Agent may or may not be registered on-chain (returns partial data if not).\n" +
|
|
199
|
+
"RETURNS: Object with address, onchain data (reputation, isActive, tasksCompleted, stakedAmount), and offchain profile (name, bio, website, capabilities, tags, avatarUrl, socialLinks).\n" +
|
|
200
|
+
"COMES BEFORE: Hiring decisions, task assignment, or messaging.\n" +
|
|
201
|
+
"COMES AFTER: corven_register_agent and corven_profile_update.\n" +
|
|
202
|
+
"NOTE: Returns onchain data even if no offchain profile exists (shows 'No offchain profile set').",
|
|
203
|
+
inputSchema: {
|
|
204
|
+
address: ethAddress,
|
|
205
|
+
},
|
|
206
|
+
}, async (params) => {
|
|
207
|
+
try {
|
|
208
|
+
const address = params.address.toLowerCase();
|
|
209
|
+
// Get onchain data
|
|
210
|
+
const onchainData = await readContract(CONTRACTS.AgentRegistry, REGISTRY_ABI, "getAgent", [address]).catch(() => null);
|
|
211
|
+
// Get offchain profile
|
|
212
|
+
const profile = profileStore.get(address);
|
|
213
|
+
const onchain = onchainData;
|
|
214
|
+
return formatReadResult({
|
|
215
|
+
address,
|
|
216
|
+
onchain: onchain ? {
|
|
217
|
+
reputation: onchain[2]?.toString(),
|
|
218
|
+
isActive: onchain[3] === 1,
|
|
219
|
+
tasksCompleted: onchain[4]?.toString(),
|
|
220
|
+
stakedAmount: onchain[6]?.toString(),
|
|
221
|
+
} : "Not registered onchain",
|
|
222
|
+
offchain: profile || "No offchain profile set",
|
|
223
|
+
}, "Agent Profile");
|
|
224
|
+
}
|
|
225
|
+
catch (e) {
|
|
226
|
+
const parsed = parseContractError(e);
|
|
227
|
+
return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
// ──────────────────────────────────────────────────────────
|
|
231
|
+
// corven_templates_list
|
|
232
|
+
// ──────────────────────────────────────────────────────────
|
|
233
|
+
server.registerTool("corven_templates_list", {
|
|
234
|
+
title: "List Task Templates",
|
|
235
|
+
description: "List available task templates for quick task creation.\n" +
|
|
236
|
+
"USE WHEN: You want to browse pre-built task templates (code-review, security-audit, data-analysis, api-development, documentation) to speed up task creation.\n" +
|
|
237
|
+
"REQUIRES: None. Built-in templates are always available.\n" +
|
|
238
|
+
"RETURNS: Array of templates with id, name, description, category, and basePrice.\n" +
|
|
239
|
+
"COMES BEFORE: corven_create_task (use a template's pricing and verificationChecks as a starting point).\n" +
|
|
240
|
+
"COMES AFTER: Nothing — standalone read.",
|
|
241
|
+
inputSchema: {
|
|
242
|
+
category: z.string().optional().describe("Filter by category"),
|
|
243
|
+
},
|
|
244
|
+
}, async (params) => {
|
|
245
|
+
try {
|
|
246
|
+
const category = params.category;
|
|
247
|
+
let templates = Array.from(templateStore.values());
|
|
248
|
+
if (category) {
|
|
249
|
+
templates = templates.filter(t => t.category === category);
|
|
250
|
+
}
|
|
251
|
+
return formatReadResult({
|
|
252
|
+
count: templates.length,
|
|
253
|
+
templates: templates.map(t => ({
|
|
254
|
+
id: t.id,
|
|
255
|
+
name: t.name,
|
|
256
|
+
description: t.description,
|
|
257
|
+
category: t.category,
|
|
258
|
+
basePrice: `${t.pricing.base} ETH`,
|
|
259
|
+
})),
|
|
260
|
+
}, "Task Templates");
|
|
261
|
+
}
|
|
262
|
+
catch (e) {
|
|
263
|
+
const parsed = parseContractError(e);
|
|
264
|
+
return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
// ──────────────────────────────────────────────────────────
|
|
268
|
+
// corven_message_send
|
|
269
|
+
// ──────────────────────────────────────────────────────────
|
|
270
|
+
server.registerTool("corven_message_send", {
|
|
271
|
+
title: "Send Message",
|
|
272
|
+
description: "Send an offchain message to another agent. Messages are signed " +
|
|
273
|
+
"by sender's wallet. No gas cost.\n" +
|
|
274
|
+
"USE WHEN: You need to communicate with another agent — send a proposal, ask a question, or provide a status update.\n" +
|
|
275
|
+
"REQUIRES: Wallet configured (PRIVATE_KEY set). Recipient address must be valid.\n" +
|
|
276
|
+
"RETURNS: Message ID (keccak256 hash), sender, recipient, type, and timestamp.\n" +
|
|
277
|
+
"COMES BEFORE: Task negotiation or collaborative work.\n" +
|
|
278
|
+
"COMES AFTER: corven_find_workers or corven_match_agents (you found an agent to message).\n" +
|
|
279
|
+
"NOTE: Zero gas cost. Messages are signed with sender's wallet. In production: encrypted with ECDH, stored on IPFS.",
|
|
280
|
+
inputSchema: {
|
|
281
|
+
to: ethAddress,
|
|
282
|
+
content: z.string().describe("Message content"),
|
|
283
|
+
taskId: z.number().optional().describe("Related task ID"),
|
|
284
|
+
messageType: z.enum(["general", "proposal", "question", "update"]).optional(),
|
|
285
|
+
},
|
|
286
|
+
}, async (params) => {
|
|
287
|
+
try {
|
|
288
|
+
const parsed = messagingSchema.safeParse(params);
|
|
289
|
+
if (!parsed.success)
|
|
290
|
+
return formatError(parsed.error);
|
|
291
|
+
const account = getAccount();
|
|
292
|
+
if (!account)
|
|
293
|
+
return formatError(new Error("No wallet configured."));
|
|
294
|
+
const message = {
|
|
295
|
+
from: account,
|
|
296
|
+
to: parsed.data.to,
|
|
297
|
+
content: parsed.data.content,
|
|
298
|
+
taskId: parsed.data.taskId,
|
|
299
|
+
messageType: parsed.data.messageType || "general",
|
|
300
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
301
|
+
id: keccak256(toBytes(`${account}-${parsed.data.to}-${Date.now()}`)),
|
|
302
|
+
};
|
|
303
|
+
// In production: encrypt with recipient's public key, store on IPFS
|
|
304
|
+
return formatReadResult({
|
|
305
|
+
messageId: message.id,
|
|
306
|
+
from: account,
|
|
307
|
+
to: parsed.data.to,
|
|
308
|
+
type: message.messageType,
|
|
309
|
+
timestamp: new Date(message.timestamp * 1000).toISOString(),
|
|
310
|
+
note: "Message stored offchain. In production: encrypted with ECDH, stored on IPFS.",
|
|
311
|
+
}, "Message Sent");
|
|
312
|
+
}
|
|
313
|
+
catch (e) {
|
|
314
|
+
const parsed = parseContractError(e);
|
|
315
|
+
return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
// ──────────────────────────────────────────────────────────
|
|
319
|
+
// corven_marketplace_list
|
|
320
|
+
// ──────────────────────────────────────────────────────────
|
|
321
|
+
server.registerTool("corven_marketplace_list", {
|
|
322
|
+
title: "Marketplace Discovery",
|
|
323
|
+
description: "Search the agent marketplace. Combines onchain reputation " +
|
|
324
|
+
"with offchain profiles for discovery.\n" +
|
|
325
|
+
"USE WHEN: You want to browse the agent marketplace — filter by capabilities, reputation, rate, or availability.\n" +
|
|
326
|
+
"REQUIRES: At least one agent with a marketplace listing (corven_marketplace_register).\n" +
|
|
327
|
+
"RETURNS: Filtered and sorted listings with address, capabilities, hourlyRate, availability, completedTasks, reputation, and featured status.\n" +
|
|
328
|
+
"COMES BEFORE: corven_create_task or corven_message_send (hire or message a discovered agent).\n" +
|
|
329
|
+
"COMES AFTER: corven_marketplace_register (agents must register their listings first).\n" +
|
|
330
|
+
"NOTE: In-memory store. Use corven_find_workers for on-chain capability search.",
|
|
331
|
+
inputSchema: {
|
|
332
|
+
capabilities: z.array(z.string()).optional().describe("Required capabilities"),
|
|
333
|
+
minReputation: z.number().optional().describe("Minimum reputation (0-1000)"),
|
|
334
|
+
maxRate: z.string().optional().describe("Max hourly rate in ETH"),
|
|
335
|
+
availability: z.enum(["available", "busy", "offline"]).optional(),
|
|
336
|
+
sortBy: z.enum(["reputation", "rate", "tasks"]).optional(),
|
|
337
|
+
},
|
|
338
|
+
}, async (params) => {
|
|
339
|
+
try {
|
|
340
|
+
const parsed = marketplaceSchema.safeParse(params);
|
|
341
|
+
if (!parsed.success)
|
|
342
|
+
return formatError(parsed.error);
|
|
343
|
+
const { capabilities, minReputation, sortBy } = parsed.data;
|
|
344
|
+
let listings = Array.from(profileStore.entries()).map(([addr, profile]) => ({
|
|
345
|
+
address: addr,
|
|
346
|
+
name: profile.name,
|
|
347
|
+
capabilities: profile.capabilities,
|
|
348
|
+
reputation: 0,
|
|
349
|
+
tasksCompleted: 0,
|
|
350
|
+
}));
|
|
351
|
+
// Enrich with onchain data
|
|
352
|
+
for (let i = 0; i < listings.length; i++) {
|
|
353
|
+
try {
|
|
354
|
+
const data = await readContract(CONTRACTS.AgentRegistry, REGISTRY_ABI, "getAgent", [listings[i].address]).catch(() => null);
|
|
355
|
+
if (data) {
|
|
356
|
+
const d = data;
|
|
357
|
+
listings[i].reputation = Number(d[2]);
|
|
358
|
+
listings[i].tasksCompleted = Number(d[4]);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
catch {
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
// Apply filters
|
|
366
|
+
if (capabilities && capabilities.length > 0) {
|
|
367
|
+
listings = listings.filter(l => capabilities.some(c => l.capabilities.includes(c)));
|
|
368
|
+
}
|
|
369
|
+
if (minReputation) {
|
|
370
|
+
listings = listings.filter(l => l.reputation >= minReputation);
|
|
371
|
+
}
|
|
372
|
+
// Sort
|
|
373
|
+
if (sortBy === "reputation") {
|
|
374
|
+
listings.sort((a, b) => b.reputation - a.reputation);
|
|
375
|
+
}
|
|
376
|
+
else if (sortBy === "tasks") {
|
|
377
|
+
listings.sort((a, b) => b.tasksCompleted - a.tasksCompleted);
|
|
378
|
+
}
|
|
379
|
+
return formatReadResult({
|
|
380
|
+
total: listings.length,
|
|
381
|
+
filters: { capabilities, minReputation, sortBy },
|
|
382
|
+
listings: listings.slice(0, 20).map((l, i) => `#${i + 1} ${l.name} (${l.address.slice(0, 10)}...) | Rep: ${l.reputation} | Tasks: ${l.tasksCompleted} | Caps: ${l.capabilities.join(", ")}`).join("\n") || "No agents found",
|
|
383
|
+
}, "Marketplace Results");
|
|
384
|
+
}
|
|
385
|
+
catch (e) {
|
|
386
|
+
const parsed = parseContractError(e);
|
|
387
|
+
return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
|
|
388
|
+
}
|
|
389
|
+
});
|
|
390
|
+
// ──────────────────────────────────────────────────────────
|
|
391
|
+
// corven_collective_propose
|
|
392
|
+
// ──────────────────────────────────────────────────────────
|
|
393
|
+
server.registerTool("corven_collective_propose", {
|
|
394
|
+
title: "Propose Collective Task",
|
|
395
|
+
description: "Propose a task for collective execution. Uses offchain coordination " +
|
|
396
|
+
"with Merkle root anchor for deliverables.\n" +
|
|
397
|
+
"USE WHEN: You want to propose a collaborative task to a group of agents before committing on-chain.\n" +
|
|
398
|
+
"REQUIRES: Wallet configured. At least one agent address in the agents array.\n" +
|
|
399
|
+
"RETURNS: Proposal hash (keccak256), task description, estimated payment, required capabilities, and participant list.\n" +
|
|
400
|
+
"COMES BEFORE: corven_create_batch or corven_create_collective (convert proposal to on-chain action).\n" +
|
|
401
|
+
"COMES AFTER: Nothing — this is the offchain planning step.",
|
|
402
|
+
inputSchema: {
|
|
403
|
+
title: z.string().describe("Task title"),
|
|
404
|
+
description: z.string().describe("Task description"),
|
|
405
|
+
requiredCapabilities: z.array(z.string()).describe("Required capabilities"),
|
|
406
|
+
maxMembers: z.number().int().min(2).max(50).describe("Max collective size"),
|
|
407
|
+
paymentPerMember: z.string().describe("Payment per member in ETH"),
|
|
408
|
+
},
|
|
409
|
+
}, async (params) => {
|
|
410
|
+
try {
|
|
411
|
+
const account = getAccount();
|
|
412
|
+
if (!account)
|
|
413
|
+
return formatError(new Error("No wallet configured."));
|
|
414
|
+
const proposal = {
|
|
415
|
+
proposer: account,
|
|
416
|
+
title: params.title,
|
|
417
|
+
description: params.description,
|
|
418
|
+
requiredCapabilities: params.requiredCapabilities,
|
|
419
|
+
maxMembers: params.maxMembers,
|
|
420
|
+
paymentPerMember: params.paymentPerMember,
|
|
421
|
+
createdAt: Math.floor(Date.now() / 1000),
|
|
422
|
+
status: "open",
|
|
423
|
+
};
|
|
424
|
+
// In production: store on IPFS, anchor Merkle root onchain
|
|
425
|
+
return formatReadResult({
|
|
426
|
+
proposal,
|
|
427
|
+
note: "Proposal created offchain. In production: stored on IPFS, Merkle root anchored onchain via AgentCollective.",
|
|
428
|
+
}, "Collective Proposal");
|
|
429
|
+
}
|
|
430
|
+
catch (e) {
|
|
431
|
+
const parsed = parseContractError(e);
|
|
432
|
+
return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
|
|
433
|
+
}
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
//# sourceMappingURL=offchain-coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offchain-coordinator.js","sourceRoot":"","sources":["../../src/tools/offchain-coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/tools/protocol.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/tools/protocol.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgJ7D"}
|
package/dist/tools/protocol.js
CHANGED
|
@@ -9,6 +9,7 @@ import { formatEther } from "viem";
|
|
|
9
9
|
import { loadAbi, CONTRACTS } from "../config.js";
|
|
10
10
|
import { readContract } from "../handlers/wallet.js";
|
|
11
11
|
import { formatReadResult, formatError } from "../handlers/transactions.js";
|
|
12
|
+
import { parseContractError, formatStructuredError } from "../lib/formatResponse.js";
|
|
12
13
|
const registryAbi = loadAbi("AgentRegistry");
|
|
13
14
|
const escrowAbi = loadAbi("TaskEscrow");
|
|
14
15
|
// Input validation schemas
|
|
@@ -23,7 +24,12 @@ export function registerProtocolTools(server) {
|
|
|
23
24
|
server.registerTool("corven_get_stats", {
|
|
24
25
|
title: "Protocol Statistics",
|
|
25
26
|
description: "Get aggregate COVENANT protocol stats: total agents, tasks created, " +
|
|
26
|
-
"tasks completed, total volume, fees collected, and active agents
|
|
27
|
+
"tasks completed, total volume, fees collected, and active agents.\n" +
|
|
28
|
+
"USE WHEN: You need a high-level overview of protocol health, activity level, or growth metrics.\n" +
|
|
29
|
+
"REQUIRES: None. Read-only query against AgentRegistry and TaskEscrow contracts.\n" +
|
|
30
|
+
"RETURNS: Object with totalAgents, totalTasks, and totalFeesEth.\n" +
|
|
31
|
+
"COMES BEFORE: corven_get_leaderboard (use stats to decide if leaderboard is worth querying).\n" +
|
|
32
|
+
"COMES AFTER: Nothing — this is a standalone read.",
|
|
27
33
|
inputSchema: {},
|
|
28
34
|
}, async () => {
|
|
29
35
|
try {
|
|
@@ -34,7 +40,7 @@ export function registerProtocolTools(server) {
|
|
|
34
40
|
}
|
|
35
41
|
// Fetch stats from both contracts in parallel
|
|
36
42
|
const [totalAgents, totalTasks, accumulatedFees] = await Promise.all([
|
|
37
|
-
readContract(CONTRACTS.AgentRegistry, registryAbi, "
|
|
43
|
+
readContract(CONTRACTS.AgentRegistry, registryAbi, "agentCount", []),
|
|
38
44
|
readContract(CONTRACTS.TaskEscrow, escrowAbi, "taskCounter", []),
|
|
39
45
|
readContract(CONTRACTS.TaskEscrow, escrowAbi, "accumulatedFees", []),
|
|
40
46
|
]);
|
|
@@ -46,7 +52,8 @@ export function registerProtocolTools(server) {
|
|
|
46
52
|
return formatReadResult(stats, "COVENANT Protocol Statistics");
|
|
47
53
|
}
|
|
48
54
|
catch (e) {
|
|
49
|
-
|
|
55
|
+
const parsed = parseContractError(e);
|
|
56
|
+
return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
|
|
50
57
|
}
|
|
51
58
|
});
|
|
52
59
|
// ──────────────────────────────────────────────────────────────
|
|
@@ -55,7 +62,12 @@ export function registerProtocolTools(server) {
|
|
|
55
62
|
server.registerTool("corven_get_leaderboard", {
|
|
56
63
|
title: "Agent Leaderboard",
|
|
57
64
|
description: "Retrieve the top N agents ranked by reputation score. " +
|
|
58
|
-
"Returns agent address, name, reputation, tasks completed/failed, and stake
|
|
65
|
+
"Returns agent address, name, reputation, tasks completed/failed, and stake.\n" +
|
|
66
|
+
"USE WHEN: You want to discover the highest-reputation agents on the protocol, compare agents, or populate a leaderboard UI.\n" +
|
|
67
|
+
"REQUIRES: At least one registered agent on AgentRegistry. Returns empty list if none exist.\n" +
|
|
68
|
+
"RETURNS: Array of agents sorted by reputation (desc) with rank, address, name, reputation, tasksCompleted, tasksFailed, stakedEth, and capabilities.\n" +
|
|
69
|
+
"COMES BEFORE: corven_get_agent (drill down into a specific agent from the leaderboard).\n" +
|
|
70
|
+
"COMES AFTER: Nothing — standalone read. Optionally follow with corven_find_workers for capability-specific search.",
|
|
59
71
|
inputSchema: {
|
|
60
72
|
limit: z
|
|
61
73
|
.number()
|
|
@@ -72,7 +84,7 @@ export function registerProtocolTools(server) {
|
|
|
72
84
|
const { limit: validatedLimit } = validationResult.data;
|
|
73
85
|
const topN = Math.min(validatedLimit ?? 10, 50);
|
|
74
86
|
// Get total agent count
|
|
75
|
-
const totalAgents = Number(await readContract(CONTRACTS.AgentRegistry, registryAbi, "
|
|
87
|
+
const totalAgents = Number(await readContract(CONTRACTS.AgentRegistry, registryAbi, "agentCount", []));
|
|
76
88
|
if (totalAgents === 0) {
|
|
77
89
|
return formatReadResult({ agents: [], totalAgents: 0 }, "No registered agents yet");
|
|
78
90
|
}
|
|
@@ -107,7 +119,8 @@ export function registerProtocolTools(server) {
|
|
|
107
119
|
return formatReadResult({ totalAgents, showing: topAgents.length, agents: topAgents }, "COVENANT Agent Leaderboard");
|
|
108
120
|
}
|
|
109
121
|
catch (e) {
|
|
110
|
-
|
|
122
|
+
const parsed = parseContractError(e);
|
|
123
|
+
return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
|
|
111
124
|
}
|
|
112
125
|
});
|
|
113
126
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/tools/protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/tools/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"receipts.d.ts","sourceRoot":"","sources":["../../src/tools/receipts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"receipts.d.ts","sourceRoot":"","sources":["../../src/tools/receipts.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsBzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2J5D"}
|