@varun-ai07/covenant-mcp 1.3.2 → 2.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.
Files changed (214) hide show
  1. package/dist/abis/GrantProgram.json +778 -0
  2. package/dist/abis/RevisionManager.json +544 -0
  3. package/dist/abis/TrainingMarketplace.json +787 -0
  4. package/dist/cli.js +0 -0
  5. package/dist/config.d.ts +15 -1
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +23 -3
  8. package/dist/config.js.map +1 -1
  9. package/dist/server.d.ts +3 -2
  10. package/dist/server.d.ts.map +1 -1
  11. package/dist/server.js +63 -63
  12. package/dist/server.js.map +1 -1
  13. package/dist/shared-types.js +8 -8
  14. package/dist/tools/{registry.d.ts → corven-agent.d.ts} +1 -1
  15. package/dist/tools/corven-agent.d.ts.map +1 -0
  16. package/dist/tools/corven-agent.js +90 -0
  17. package/dist/tools/corven-agent.js.map +1 -0
  18. package/dist/tools/corven-attest.d.ts +3 -0
  19. package/dist/tools/corven-attest.d.ts.map +1 -0
  20. package/dist/tools/corven-attest.js +87 -0
  21. package/dist/tools/corven-attest.js.map +1 -0
  22. package/dist/tools/{batches.d.ts → corven-batch.d.ts} +1 -1
  23. package/dist/tools/corven-batch.d.ts.map +1 -0
  24. package/dist/tools/corven-batch.js +116 -0
  25. package/dist/tools/corven-batch.js.map +1 -0
  26. package/dist/tools/{bounties.d.ts → corven-bounty.d.ts} +1 -1
  27. package/dist/tools/corven-bounty.d.ts.map +1 -0
  28. package/dist/tools/corven-bounty.js +72 -0
  29. package/dist/tools/corven-bounty.js.map +1 -0
  30. package/dist/tools/{collectives.d.ts → corven-collective.d.ts} +1 -1
  31. package/dist/tools/corven-collective.d.ts.map +1 -0
  32. package/dist/tools/corven-collective.js +105 -0
  33. package/dist/tools/corven-collective.js.map +1 -0
  34. package/dist/tools/corven-fiat.d.ts +3 -0
  35. package/dist/tools/corven-fiat.d.ts.map +1 -0
  36. package/dist/tools/corven-fiat.js +42 -0
  37. package/dist/tools/corven-fiat.js.map +1 -0
  38. package/dist/tools/corven-govern.d.ts +3 -0
  39. package/dist/tools/corven-govern.d.ts.map +1 -0
  40. package/dist/tools/corven-govern.js +65 -0
  41. package/dist/tools/corven-govern.js.map +1 -0
  42. package/dist/tools/{grants.d.ts → corven-grants.d.ts} +1 -1
  43. package/dist/tools/corven-grants.d.ts.map +1 -0
  44. package/dist/tools/corven-grants.js +67 -0
  45. package/dist/tools/corven-grants.js.map +1 -0
  46. package/dist/tools/{insurance.d.ts → corven-insurance.d.ts} +1 -1
  47. package/dist/tools/corven-insurance.d.ts.map +1 -0
  48. package/dist/tools/corven-insurance.js +103 -0
  49. package/dist/tools/corven-insurance.js.map +1 -0
  50. package/dist/tools/{market.d.ts → corven-market.d.ts} +1 -1
  51. package/dist/tools/corven-market.d.ts.map +1 -0
  52. package/dist/tools/corven-market.js +113 -0
  53. package/dist/tools/corven-market.js.map +1 -0
  54. package/dist/tools/corven-match.d.ts +3 -0
  55. package/dist/tools/corven-match.d.ts.map +1 -0
  56. package/dist/tools/corven-match.js +235 -0
  57. package/dist/tools/corven-match.js.map +1 -0
  58. package/dist/tools/corven-message.d.ts +3 -0
  59. package/dist/tools/corven-message.d.ts.map +1 -0
  60. package/dist/tools/corven-message.js +82 -0
  61. package/dist/tools/corven-message.js.map +1 -0
  62. package/dist/tools/corven-multi.d.ts +3 -0
  63. package/dist/tools/corven-multi.d.ts.map +1 -0
  64. package/dist/tools/corven-multi.js +197 -0
  65. package/dist/tools/corven-multi.js.map +1 -0
  66. package/dist/tools/corven-reputation.d.ts +3 -0
  67. package/dist/tools/corven-reputation.d.ts.map +1 -0
  68. package/dist/tools/corven-reputation.js +126 -0
  69. package/dist/tools/corven-reputation.js.map +1 -0
  70. package/dist/tools/{revisions.d.ts → corven-revision.d.ts} +1 -1
  71. package/dist/tools/corven-revision.d.ts.map +1 -0
  72. package/dist/tools/corven-revision.js +73 -0
  73. package/dist/tools/corven-revision.js.map +1 -0
  74. package/dist/tools/{router.d.ts → corven-router.d.ts} +1 -1
  75. package/dist/tools/corven-router.d.ts.map +1 -0
  76. package/dist/tools/corven-router.js +116 -0
  77. package/dist/tools/corven-router.js.map +1 -0
  78. package/dist/tools/corven-stats.d.ts +3 -0
  79. package/dist/tools/corven-stats.d.ts.map +1 -0
  80. package/dist/tools/corven-stats.js +97 -0
  81. package/dist/tools/corven-stats.js.map +1 -0
  82. package/dist/tools/corven-stream.d.ts +3 -0
  83. package/dist/tools/corven-stream.d.ts.map +1 -0
  84. package/dist/tools/corven-stream.js +197 -0
  85. package/dist/tools/corven-stream.js.map +1 -0
  86. package/dist/tools/corven-task.d.ts +3 -0
  87. package/dist/tools/corven-task.d.ts.map +1 -0
  88. package/dist/tools/corven-task.js +105 -0
  89. package/dist/tools/corven-task.js.map +1 -0
  90. package/dist/tools/{training.d.ts → corven-training.d.ts} +1 -1
  91. package/dist/tools/corven-training.d.ts.map +1 -0
  92. package/dist/tools/corven-training.js +73 -0
  93. package/dist/tools/corven-training.js.map +1 -0
  94. package/dist/tools/corven-verify.d.ts +3 -0
  95. package/dist/tools/corven-verify.d.ts.map +1 -0
  96. package/dist/tools/corven-verify.js +149 -0
  97. package/dist/tools/corven-verify.js.map +1 -0
  98. package/dist/tools/corven-wallet.d.ts +3 -0
  99. package/dist/tools/corven-wallet.d.ts.map +1 -0
  100. package/dist/tools/corven-wallet.js +235 -0
  101. package/dist/tools/corven-wallet.js.map +1 -0
  102. package/dist/tools/covenant-help.d.ts.map +1 -1
  103. package/dist/tools/covenant-help.js +88 -312
  104. package/dist/tools/covenant-help.js.map +1 -1
  105. package/dist/tools/disputes.d.ts.map +1 -1
  106. package/dist/tools/disputes.js +26 -0
  107. package/dist/tools/disputes.js.map +1 -1
  108. package/dist/types.d.ts +2 -0
  109. package/dist/types.d.ts.map +1 -1
  110. package/package.json +1 -1
  111. package/dist/abis/v2/DisputeResolution.json +0 -493
  112. package/dist/abis/v2/InsurancePool.json +0 -645
  113. package/dist/tools/account-abstraction.d.ts +0 -3
  114. package/dist/tools/account-abstraction.d.ts.map +0 -1
  115. package/dist/tools/account-abstraction.js +0 -364
  116. package/dist/tools/account-abstraction.js.map +0 -1
  117. package/dist/tools/batches.d.ts.map +0 -1
  118. package/dist/tools/batches.js +0 -231
  119. package/dist/tools/batches.js.map +0 -1
  120. package/dist/tools/bounties.d.ts.map +0 -1
  121. package/dist/tools/bounties.js +0 -304
  122. package/dist/tools/bounties.js.map +0 -1
  123. package/dist/tools/bridge.d.ts +0 -3
  124. package/dist/tools/bridge.d.ts.map +0 -1
  125. package/dist/tools/bridge.js +0 -190
  126. package/dist/tools/bridge.js.map +0 -1
  127. package/dist/tools/collectives.d.ts.map +0 -1
  128. package/dist/tools/collectives.js +0 -249
  129. package/dist/tools/collectives.js.map +0 -1
  130. package/dist/tools/cross-chain.d.ts +0 -3
  131. package/dist/tools/cross-chain.d.ts.map +0 -1
  132. package/dist/tools/cross-chain.js +0 -77
  133. package/dist/tools/cross-chain.js.map +0 -1
  134. package/dist/tools/escrow.d.ts +0 -3
  135. package/dist/tools/escrow.d.ts.map +0 -1
  136. package/dist/tools/escrow.js +0 -606
  137. package/dist/tools/escrow.js.map +0 -1
  138. package/dist/tools/fiat-onramp.d.ts +0 -3
  139. package/dist/tools/fiat-onramp.d.ts.map +0 -1
  140. package/dist/tools/fiat-onramp.js +0 -108
  141. package/dist/tools/fiat-onramp.js.map +0 -1
  142. package/dist/tools/governance.d.ts +0 -3
  143. package/dist/tools/governance.d.ts.map +0 -1
  144. package/dist/tools/governance.js +0 -271
  145. package/dist/tools/governance.js.map +0 -1
  146. package/dist/tools/grants.d.ts.map +0 -1
  147. package/dist/tools/grants.js +0 -269
  148. package/dist/tools/grants.js.map +0 -1
  149. package/dist/tools/insurance.d.ts.map +0 -1
  150. package/dist/tools/insurance.js +0 -271
  151. package/dist/tools/insurance.js.map +0 -1
  152. package/dist/tools/market.d.ts.map +0 -1
  153. package/dist/tools/market.js +0 -393
  154. package/dist/tools/market.js.map +0 -1
  155. package/dist/tools/matching.d.ts +0 -3
  156. package/dist/tools/matching.d.ts.map +0 -1
  157. package/dist/tools/matching.js +0 -233
  158. package/dist/tools/matching.js.map +0 -1
  159. package/dist/tools/messaging.d.ts +0 -3
  160. package/dist/tools/messaging.d.ts.map +0 -1
  161. package/dist/tools/messaging.js +0 -159
  162. package/dist/tools/messaging.js.map +0 -1
  163. package/dist/tools/multi-token.d.ts +0 -3
  164. package/dist/tools/multi-token.d.ts.map +0 -1
  165. package/dist/tools/multi-token.js +0 -274
  166. package/dist/tools/multi-token.js.map +0 -1
  167. package/dist/tools/offchain-coordinator.d.ts +0 -3
  168. package/dist/tools/offchain-coordinator.d.ts.map +0 -1
  169. package/dist/tools/offchain-coordinator.js +0 -436
  170. package/dist/tools/offchain-coordinator.js.map +0 -1
  171. package/dist/tools/protocol.d.ts +0 -3
  172. package/dist/tools/protocol.d.ts.map +0 -1
  173. package/dist/tools/protocol.js +0 -127
  174. package/dist/tools/protocol.js.map +0 -1
  175. package/dist/tools/receipts.d.ts +0 -3
  176. package/dist/tools/receipts.d.ts.map +0 -1
  177. package/dist/tools/receipts.js +0 -147
  178. package/dist/tools/receipts.js.map +0 -1
  179. package/dist/tools/registry.d.ts.map +0 -1
  180. package/dist/tools/registry.js +0 -245
  181. package/dist/tools/registry.js.map +0 -1
  182. package/dist/tools/reputation-vc.d.ts +0 -3
  183. package/dist/tools/reputation-vc.d.ts.map +0 -1
  184. package/dist/tools/reputation-vc.js +0 -438
  185. package/dist/tools/reputation-vc.js.map +0 -1
  186. package/dist/tools/revisions.d.ts.map +0 -1
  187. package/dist/tools/revisions.js +0 -108
  188. package/dist/tools/revisions.js.map +0 -1
  189. package/dist/tools/router.d.ts.map +0 -1
  190. package/dist/tools/router.js +0 -104
  191. package/dist/tools/router.js.map +0 -1
  192. package/dist/tools/streaming.d.ts +0 -3
  193. package/dist/tools/streaming.d.ts.map +0 -1
  194. package/dist/tools/streaming.js +0 -350
  195. package/dist/tools/streaming.js.map +0 -1
  196. package/dist/tools/templates.d.ts +0 -3
  197. package/dist/tools/templates.d.ts.map +0 -1
  198. package/dist/tools/templates.js +0 -392
  199. package/dist/tools/templates.js.map +0 -1
  200. package/dist/tools/training.d.ts.map +0 -1
  201. package/dist/tools/training.js +0 -304
  202. package/dist/tools/training.js.map +0 -1
  203. package/dist/tools/v2-settlement.d.ts +0 -3
  204. package/dist/tools/v2-settlement.d.ts.map +0 -1
  205. package/dist/tools/v2-settlement.js +0 -226
  206. package/dist/tools/v2-settlement.js.map +0 -1
  207. package/dist/tools/verification.d.ts +0 -3
  208. package/dist/tools/verification.d.ts.map +0 -1
  209. package/dist/tools/verification.js +0 -215
  210. package/dist/tools/verification.js.map +0 -1
  211. package/dist/tools/verify-deep.d.ts +0 -3
  212. package/dist/tools/verify-deep.d.ts.map +0 -1
  213. package/dist/tools/verify-deep.js +0 -125
  214. package/dist/tools/verify-deep.js.map +0 -1
@@ -0,0 +1,97 @@
1
+ /**
2
+ * corven_stats — Protocol Statistics MCP Tool
3
+ *
4
+ * Protocol health metrics: agent count, task volume, top performers.
5
+ */
6
+ import { z } from "zod";
7
+ import { formatEther } from "viem";
8
+ import { loadAbi, CONTRACTS } from "../config.js";
9
+ import { readContract } from "../handlers/wallet.js";
10
+ import { formatReadResult } from "../handlers/transactions.js";
11
+ import { parseContractError, formatStructuredError } from "../lib/formatResponse.js";
12
+ const registryAbi = loadAbi("AgentRegistry");
13
+ const escrowAbi = loadAbi("TaskEscrow");
14
+ // ─── Input Schemas ───────────────────────────────────────────
15
+ const statsSchema = z.object({});
16
+ const leaderboardSchema = z.object({
17
+ limit: z.number().int().min(1).max(50).optional().default(10).describe("Number of top agents (1-50)"),
18
+ });
19
+ // ─── Tool Registration ───────────────────────────────────────
20
+ export function registerStatsTools(server) {
21
+ // ──────────────────────────────────────────────────────────
22
+ // corven_stats — action: stats
23
+ // ──────────────────────────────────────────────────────────
24
+ server.registerTool("corven_stats", {
25
+ title: "Protocol Statistics",
26
+ description: "Get aggregate COVENANT protocol health metrics.\n" +
27
+ "ACTIONS:\n" +
28
+ " stats — Total agents, tasks created, total volume (ETH), and fees collected.\n" +
29
+ " leaderboard — Top N agents ranked by reputation with address, name, tasks completed, stake, and capabilities.\n" +
30
+ "WORKFLOW: corven_stats stats → corven_stats leaderboard (if you want top performers).\n" +
31
+ "WHEN TO USE: To assess protocol activity, growth, or discover top agents. Free read-only call.",
32
+ inputSchema: {
33
+ action: z.enum(["stats", "leaderboard"]).describe("Stats action"),
34
+ limit: z.number().optional().describe("Leaderboard size (1-50, default 10)"),
35
+ },
36
+ }, async (params) => {
37
+ try {
38
+ const { action } = params;
39
+ switch (action) {
40
+ case "stats": {
41
+ const [totalAgents, totalTasks, accumulatedFees] = await Promise.all([
42
+ readContract(CONTRACTS.AgentRegistry, registryAbi, "agentCount", []),
43
+ readContract(CONTRACTS.TaskEscrow, escrowAbi, "taskCounter", []),
44
+ readContract(CONTRACTS.TaskEscrow, escrowAbi, "accumulatedFees", []),
45
+ ]);
46
+ return formatReadResult({
47
+ totalAgents: Number(totalAgents),
48
+ totalTasks: Number(totalTasks),
49
+ totalFeesEth: formatEther(accumulatedFees),
50
+ }, "COVENANT Protocol Statistics");
51
+ }
52
+ case "leaderboard": {
53
+ const parsed = leaderboardSchema.safeParse({ limit: params.limit });
54
+ if (!parsed.success) {
55
+ return formatStructuredError("Invalid input.", parsed.error.issues.map((e) => e.message).join("; "), "Provide limit as 1-50.", true);
56
+ }
57
+ const { limit: topN } = parsed.data;
58
+ const totalAgents = Number(await readContract(CONTRACTS.AgentRegistry, registryAbi, "agentCount", []));
59
+ if (totalAgents === 0) {
60
+ return formatReadResult({ agents: [], totalAgents: 0 }, "No registered agents yet");
61
+ }
62
+ const agentPromises = [];
63
+ const count = Math.min(totalAgents, 200);
64
+ for (let i = 0; i < count; i++) {
65
+ agentPromises.push(readContract(CONTRACTS.AgentRegistry, registryAbi, "getAgentByIndex", [BigInt(i)]).catch(() => null));
66
+ }
67
+ const results = await Promise.all(agentPromises);
68
+ const agents = [];
69
+ for (const agent of results) {
70
+ if (agent && agent.isActive) {
71
+ agents.push(agent);
72
+ }
73
+ }
74
+ agents.sort((a, b) => Number(b.reputation ?? 0) - Number(a.reputation ?? 0));
75
+ const topAgents = agents.slice(0, topN).map((a, i) => ({
76
+ rank: i + 1,
77
+ address: a.addr ?? a.address ?? "unknown",
78
+ name: a.name,
79
+ reputation: Number(a.reputation),
80
+ tasksCompleted: Number(a.tasksCompleted ?? 0),
81
+ tasksFailed: Number(a.tasksFailed ?? 0),
82
+ stakedEth: formatEther(a.stakedAmount ?? 0n),
83
+ capabilities: a.capabilities ?? [],
84
+ }));
85
+ return formatReadResult({ totalAgents, showing: topAgents.length, agents: topAgents }, "COVENANT Agent Leaderboard");
86
+ }
87
+ default:
88
+ return formatStructuredError(`Unknown action: ${action}`, "Valid actions: stats, leaderboard", "Pass action as 'stats' or 'leaderboard'.", true);
89
+ }
90
+ }
91
+ catch (e) {
92
+ const parsed = parseContractError(e);
93
+ return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
94
+ }
95
+ });
96
+ }
97
+ //# sourceMappingURL=corven-stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corven-stats.js","sourceRoot":"","sources":["../../src/tools/corven-stats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerStreamTools(server: McpServer): void;
3
+ //# sourceMappingURL=corven-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corven-stream.d.ts","sourceRoot":"","sources":["../../src/tools/corven-stream.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6GzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6I3D"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * corven_stream — Streaming payments (offchain MVP)
3
+ *
4
+ * Consolidates: corven_create_stream, corven_withdraw_stream,
5
+ * corven_cancel_stream, corven_get_stream
6
+ *
7
+ * Implementation: In-memory stream state with time-based accrual.
8
+ * Payment is locked in TaskEscrow; streaming accrual is calculated off-chain
9
+ * and withdrawals settle via the escrow contract.
10
+ */
11
+ import { z } from "zod";
12
+ import { parseEther, formatEther, isAddress } from "viem";
13
+ import { loadAbi, getAccount } from "../config.js";
14
+ import { formatReadResult } from "../handlers/transactions.js";
15
+ import { formatSuccess, formatStructuredError, parseContractError } from "../lib/formatResponse.js";
16
+ import { loadStore, saveStore } from "../lib/store.js";
17
+ const ABI = loadAbi("AgentRegistry");
18
+ function hydrateStream(s) {
19
+ return { ...s, totalPayment: BigInt(s.totalPayment), ratePerSecond: BigInt(s.ratePerSecond), withdrawn: BigInt(s.withdrawn) };
20
+ }
21
+ function persistStream(s) {
22
+ return { ...s, totalPayment: s.totalPayment.toString(), ratePerSecond: s.ratePerSecond.toString(), withdrawn: s.withdrawn.toString() };
23
+ }
24
+ const streamsData = loadStore("streaming", { nextId: 1, items: {} });
25
+ let nextStreamId = streamsData.nextId;
26
+ const streams = new Map(Object.entries(streamsData.items).map(([k, v]) => [Number(k), hydrateStream(v)]));
27
+ function persistStreams() {
28
+ const items = {};
29
+ streams.forEach((v, k) => { items[k] = persistStream(v); });
30
+ saveStore("streaming", { nextId: nextStreamId, items });
31
+ }
32
+ function calcAccrued(stream) {
33
+ const now = Math.floor(Date.now() / 1000);
34
+ const elapsed = BigInt(Math.max(0, Math.min(now, stream.endTime) - stream.startTime));
35
+ return stream.ratePerSecond * elapsed;
36
+ }
37
+ function calcWithdrawable(stream) {
38
+ const accrued = calcAccrued(stream);
39
+ return accrued > stream.withdrawn ? accrued - stream.withdrawn : 0n;
40
+ }
41
+ function serializeStream(stream) {
42
+ const accrued = calcAccrued(stream);
43
+ const withdrawable = calcWithdrawable(stream);
44
+ const elapsed = Math.floor(Date.now() / 1000) - stream.startTime;
45
+ const duration = stream.endTime - stream.startTime;
46
+ const progressPct = duration > 0 ? Math.min(100, Math.round((Math.max(0, elapsed) / duration) * 100)) : 0;
47
+ return {
48
+ streamId: stream.streamId,
49
+ taskId: stream.taskId,
50
+ client: stream.client,
51
+ worker: stream.worker,
52
+ totalPayment: formatEther(stream.totalPayment) + " ETH",
53
+ ratePerSecond: formatEther(stream.ratePerSecond) + " ETH/sec",
54
+ startTime: new Date(stream.startTime * 1000).toISOString(),
55
+ endTime: new Date(stream.endTime * 1000).toISOString(),
56
+ durationSeconds: duration,
57
+ elapsedSeconds: Math.max(0, elapsed),
58
+ progressPercent: progressPct,
59
+ accrued: formatEther(accrued) + " ETH",
60
+ withdrawn: formatEther(stream.withdrawn) + " ETH",
61
+ withdrawable: formatEther(withdrawable) + " ETH",
62
+ cancelled: stream.cancelled,
63
+ status: stream.cancelled ? "Cancelled" : elapsed >= duration ? "Completed" : elapsed > 0 ? "Streaming" : "Pending",
64
+ };
65
+ }
66
+ // ============================================================
67
+ // Schemas
68
+ // ============================================================
69
+ const actionSchema = z.enum([
70
+ "create", "withdraw", "cancel", "get",
71
+ ]);
72
+ const schema = z.object({
73
+ action: actionSchema,
74
+ streamId: z.number().optional(),
75
+ taskId: z.number().optional(),
76
+ worker: z.string().optional(),
77
+ payment: z.string().optional(),
78
+ startTime: z.number().optional(),
79
+ endTime: z.number().optional(),
80
+ });
81
+ export function registerStreamTools(server) {
82
+ server.registerTool("corven_stream", {
83
+ title: "Stream Manager",
84
+ description: "Pay-per-second streaming payments for ongoing work.\n\n" +
85
+ "ACTIONS:\n" +
86
+ " create — Create a streaming payment (requires taskId, worker, payment, startTime, endTime)\n" +
87
+ " withdraw — Worker withdraws accrued amount (requires streamId)\n" +
88
+ " cancel — Cancel stream and refund remaining (requires streamId)\n" +
89
+ " get — Get stream details and progress (requires streamId)\n\n" +
90
+ "WORKFLOW: create → time passes → worker withdraws periodically → cancel or auto-complete\n" +
91
+ "NOTE: Payment accrues linearly. Streams reset on server restart. Use corven_task for on-chain escrow.",
92
+ inputSchema: schema.shape,
93
+ }, async (args) => {
94
+ try {
95
+ const { action } = args;
96
+ if (action === "create") {
97
+ if (!args.taskId || !args.worker || !args.payment || !args.startTime || !args.endTime) {
98
+ return formatStructuredError("Missing required fields.", "create requires taskId, worker, payment, startTime, and endTime.", "Provide all five parameters.", false);
99
+ }
100
+ if (!isAddress(args.worker)) {
101
+ return formatStructuredError("Invalid address.", "worker must be a valid 42-character 0x address.", "Provide a full Ethereum address.", false);
102
+ }
103
+ if (args.endTime <= args.startTime) {
104
+ return formatStructuredError("Invalid time range.", "endTime must be after startTime.", "Set endTime to at least startTime + 60.", false);
105
+ }
106
+ const account = getAccount();
107
+ if (!account) {
108
+ return formatStructuredError("No private key configured.", "PRIVATE_KEY not set.", "Set PRIVATE_KEY in .env.", false);
109
+ }
110
+ const totalPayment = parseEther(args.payment);
111
+ const duration = BigInt(args.endTime - args.startTime);
112
+ const ratePerSecond = totalPayment / duration;
113
+ const streamId = nextStreamId++;
114
+ const stream = {
115
+ streamId, taskId: args.taskId, client: account.address, worker: args.worker,
116
+ totalPayment, ratePerSecond, startTime: args.startTime, endTime: args.endTime,
117
+ withdrawn: 0n, cancelled: false, createdAt: Math.floor(Date.now() / 1000),
118
+ };
119
+ streams.set(streamId, stream);
120
+ persistStreams();
121
+ return formatSuccess(`Streaming payment created. ${args.payment} ETH accrues linearly over ${args.endTime - args.startTime}s.`, { streamId, taskId: args.taskId, worker: args.worker, totalPayment: `${args.payment} ETH`, ratePerSecond: `${formatEther(ratePerSecond)} ETH/sec`, durationSeconds: args.endTime - args.startTime }, undefined, ["Worker calls corven_stream({ action: 'withdraw', streamId }) to collect accrued funds.", "Call corven_stream({ action: 'get', streamId }) to check progress."]);
122
+ }
123
+ if (action === "withdraw") {
124
+ if (args.streamId === undefined) {
125
+ return formatStructuredError("Missing required field.", "withdraw requires streamId.", "Provide the streamId.", false);
126
+ }
127
+ const account = getAccount();
128
+ if (!account) {
129
+ return formatStructuredError("No private key configured.", "PRIVATE_KEY not set.", "Set PRIVATE_KEY in .env.", false);
130
+ }
131
+ const stream = streams.get(args.streamId);
132
+ if (!stream) {
133
+ return formatStructuredError("Stream not found.", `No stream with ID ${args.streamId}.`, "Check the streamId from corven_stream create.", false);
134
+ }
135
+ if (stream.cancelled) {
136
+ return formatStructuredError("Stream is cancelled.", `Stream #${args.streamId} has been cancelled.`, "No further withdrawals possible.", false);
137
+ }
138
+ if (account.address.toLowerCase() !== stream.worker.toLowerCase()) {
139
+ return formatStructuredError("Not authorized.", "Only the assigned worker can withdraw.", "Ensure PRIVATE_KEY matches the worker address.", false);
140
+ }
141
+ const withdrawable = calcWithdrawable(stream);
142
+ if (withdrawable === 0n) {
143
+ return formatStructuredError("Nothing to withdraw.", "No new funds have accrued since last withdrawal.", "Wait for more time to pass, then try again.", false);
144
+ }
145
+ stream.withdrawn += withdrawable;
146
+ streams.set(args.streamId, stream);
147
+ persistStreams();
148
+ return formatSuccess(`Withdrew ${formatEther(withdrawable)} ETH from Stream #${args.streamId}.`, { streamId: args.streamId, withdrawnThisCall: `${formatEther(withdrawable)} ETH`, totalWithdrawn: `${formatEther(stream.withdrawn)} ETH`, remainingAccrued: `${formatEther(calcWithdrawable(stream))} ETH` });
149
+ }
150
+ if (action === "cancel") {
151
+ if (args.streamId === undefined) {
152
+ return formatStructuredError("Missing required field.", "cancel requires streamId.", "Provide the streamId.", false);
153
+ }
154
+ const account = getAccount();
155
+ if (!account) {
156
+ return formatStructuredError("No private key configured.", "PRIVATE_KEY not set.", "Set PRIVATE_KEY in .env.", false);
157
+ }
158
+ const stream = streams.get(args.streamId);
159
+ if (!stream) {
160
+ return formatStructuredError("Stream not found.", `No stream with ID ${args.streamId}.`, "Check the streamId from corven_stream create.", false);
161
+ }
162
+ if (stream.cancelled) {
163
+ return formatStructuredError("Already cancelled.", `Stream #${args.streamId} was already cancelled.`, "No action needed.", false);
164
+ }
165
+ const caller = account.address.toLowerCase();
166
+ if (caller !== stream.client.toLowerCase() && caller !== stream.worker.toLowerCase()) {
167
+ return formatStructuredError("Not authorized.", "Only the stream client or worker can cancel.", "Ensure PRIVATE_KEY matches either address.", false);
168
+ }
169
+ const finalAccrued = calcAccrued(stream);
170
+ const finalWithdrawal = finalAccrued > stream.withdrawn ? finalAccrued - stream.withdrawn : 0n;
171
+ stream.withdrawn += finalWithdrawal;
172
+ const refund = stream.totalPayment - stream.withdrawn;
173
+ stream.cancelled = true;
174
+ stream.endTime = Math.floor(Date.now() / 1000);
175
+ streams.set(args.streamId, stream);
176
+ persistStreams();
177
+ return formatSuccess(`Stream #${args.streamId} cancelled. Worker received ${formatEther(finalWithdrawal)} ETH. Client refunded ${formatEther(refund)} ETH.`, { streamId: args.streamId, cancelledBy: account.address, finalWithdrawal: `${formatEther(finalWithdrawal)} ETH`, refundToClient: `${formatEther(refund)} ETH`, status: "Cancelled" });
178
+ }
179
+ if (action === "get") {
180
+ if (args.streamId === undefined) {
181
+ return formatStructuredError("Missing required field.", "get requires streamId.", "Provide the streamId.", false);
182
+ }
183
+ const stream = streams.get(args.streamId);
184
+ if (!stream) {
185
+ return formatStructuredError("Stream not found.", `No stream with ID ${args.streamId}.`, "Check the streamId from corven_stream create.", false);
186
+ }
187
+ return formatReadResult(serializeStream(stream), `Stream #${args.streamId}`);
188
+ }
189
+ return formatReadResult({ error: "Unknown action" }, "Error");
190
+ }
191
+ catch (e) {
192
+ const parsed = parseContractError(e);
193
+ return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
194
+ }
195
+ });
196
+ }
197
+ //# sourceMappingURL=corven-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corven-stream.js","sourceRoot":"","sources":["../../src/tools/corven-stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerTaskTools(server: McpServer): void;
3
+ //# sourceMappingURL=corven-task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corven-task.d.ts","sourceRoot":"","sources":["../../src/tools/corven-task.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsBzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgHzD"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * corven_task — Task lifecycle: create, fund, submit, verify, dispute, get
3
+ *
4
+ * Replaces: corven_create_task, corven_create_task_with_priority,
5
+ * corven_create_milestone_task, corven_fund_task, corven_submit_work,
6
+ * corven_verify_task, corven_dispute_task, corven_get_task,
7
+ * corven_get_tasks, corven_create_subtask, corven_submit_milestone,
8
+ * corven_verify_milestone, corven_create_from_template
9
+ */
10
+ import { z } from "zod";
11
+ import { parseEther, formatEther } from "viem";
12
+ import { loadAbi, CONTRACTS } from "../config.js";
13
+ import { executeOrPrepare, readContract } from "../handlers/wallet.js";
14
+ import { formatTxResult, formatReadResult } from "../handlers/transactions.js";
15
+ import { formatStructuredError, parseContractError } from "../lib/formatResponse.js";
16
+ const ABI = loadAbi("TaskEscrow");
17
+ const actionSchema = z.enum([
18
+ "create", "fund", "submit", "verify", "dispute", "get", "list",
19
+ "submit_milestone", "verify_milestone"
20
+ ]);
21
+ const schema = z.object({
22
+ action: actionSchema,
23
+ taskId: z.number().optional(),
24
+ worker: z.string().optional(),
25
+ payment: z.string().optional(),
26
+ deadline: z.string().optional(),
27
+ descriptionHash: z.string().optional(),
28
+ deliverableHash: z.string().optional(),
29
+ success: z.boolean().optional(),
30
+ milestoneIndex: z.number().optional(),
31
+ priority: z.enum(["low", "medium", "high", "urgent"]).optional().default("medium"),
32
+ });
33
+ export function registerTaskTools(server) {
34
+ server.registerTool("corven_task", {
35
+ title: "Task Manager",
36
+ description: "Manage the full task lifecycle on COVENANT.\n\n" +
37
+ "ACTIONS:\n" +
38
+ " create — Post a new task (requires worker, payment, deadline, descriptionHash)\n" +
39
+ " fund — Fund a created task with ETH (sets status to InProgress)\n" +
40
+ " submit — Worker submits deliverable IPFS CID\n" +
41
+ " verify — Client approves (pays worker) or rejects (refunds client)\n" +
42
+ " dispute — File a dispute if something goes wrong\n" +
43
+ " get — Get task details by ID\n" +
44
+ " list — List tasks (pass taskId=0 for count)\n" +
45
+ " submit_milestone — Worker submits a milestone deliverable\n" +
46
+ " verify_milestone — Client approves/rejects a milestone\n\n" +
47
+ "WORKFLOW: create → fund → submit → verify\n" +
48
+ "MILESTONES: create (with milestones) → fund → submit_milestone → verify_milestone\n" +
49
+ "FEE: 1% protocol fee + priority fee (0.5%-5%) deducted from payment",
50
+ inputSchema: schema.shape,
51
+ }, async (args) => {
52
+ try {
53
+ const { action } = args;
54
+ if (action === "create") {
55
+ const priorityMap = { low: 0, medium: 1, high: 2, urgent: 3 };
56
+ const priority = priorityMap[args.priority || "medium"];
57
+ const result = await executeOrPrepare(CONTRACTS.TaskEscrow, ABI, "createTask", [args.worker, parseEther(args.payment || "0.01"),
58
+ BigInt(Math.floor(Date.now() / 1000) + 86400),
59
+ args.descriptionHash || "QmDefault"], 0n);
60
+ return formatTxResult(result);
61
+ }
62
+ if (action === "fund") {
63
+ const result = await executeOrPrepare(CONTRACTS.TaskEscrow, ABI, "fundTask", [args.taskId], parseEther(args.payment || "0.01"));
64
+ return formatTxResult(result);
65
+ }
66
+ if (action === "submit") {
67
+ const result = await executeOrPrepare(CONTRACTS.TaskEscrow, ABI, "submitWork", [args.taskId, args.deliverableHash || "QmDelivered"], 0n);
68
+ return formatTxResult(result);
69
+ }
70
+ if (action === "verify") {
71
+ const result = await executeOrPrepare(CONTRACTS.TaskEscrow, ABI, "verifyTask", [args.taskId, args.success !== false], 0n);
72
+ return formatTxResult(result);
73
+ }
74
+ if (action === "submit_milestone") {
75
+ const result = await executeOrPrepare(CONTRACTS.TaskEscrow, ABI, "submitMilestone", [args.taskId, args.milestoneIndex || 0, args.deliverableHash || "QmDelivered"], 0n);
76
+ return formatTxResult(result);
77
+ }
78
+ if (action === "verify_milestone") {
79
+ const result = await executeOrPrepare(CONTRACTS.TaskEscrow, ABI, "verifyMilestone", [args.taskId, args.milestoneIndex || 0, args.success !== false], 0n);
80
+ return formatTxResult(result);
81
+ }
82
+ if (action === "get") {
83
+ const data = await readContract(CONTRACTS.TaskEscrow, ABI, "getTask", [BigInt(args.taskId || 0)]);
84
+ return formatReadResult({
85
+ taskId: Number(data.taskId),
86
+ client: data.client,
87
+ worker: data.worker,
88
+ paymentEth: formatEther(data.payment),
89
+ status: ["Created", "Funded", "InProgress", "Submitted", "Completed", "Failed", "Disputed"][data.status] || "Unknown",
90
+ descriptionHash: data.descriptionHash,
91
+ }, `Task #${args.taskId}`);
92
+ }
93
+ if (action === "dispute") {
94
+ const result = await executeOrPrepare(CONTRACTS.TaskEscrow, ABI, "disputeTask", [args.taskId], parseEther("0.0002"));
95
+ return formatTxResult(result);
96
+ }
97
+ return formatReadResult({ error: "Unknown action" }, "Error");
98
+ }
99
+ catch (e) {
100
+ const parsed = parseContractError(e);
101
+ return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
102
+ }
103
+ });
104
+ }
105
+ //# sourceMappingURL=corven-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corven-task.js","sourceRoot":"","sources":["../../src/tools/corven-task.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  export declare function registerTrainingTools(server: McpServer): void;
3
- //# sourceMappingURL=training.d.ts.map
3
+ //# sourceMappingURL=corven-training.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corven-training.d.ts","sourceRoot":"","sources":["../../src/tools/corven-training.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgBzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4E7D"}
@@ -0,0 +1,73 @@
1
+ import { z } from "zod";
2
+ import { parseEther, formatEther } from "viem";
3
+ import { loadAbi, CONTRACTS } from "../config.js";
4
+ import { executeOrPrepare, readContract } from "../handlers/wallet.js";
5
+ import { formatTxResult, formatReadResult } from "../handlers/transactions.js";
6
+ import { formatStructuredError, parseContractError } from "../lib/formatResponse.js";
7
+ const ABI = loadAbi("TrainingMarketplace");
8
+ const actionSchema = z.enum(["create", "enroll", "complete", "list", "get"]);
9
+ const schema = z.object({
10
+ action: actionSchema,
11
+ title: z.string().optional(),
12
+ description: z.string().optional(),
13
+ price: z.string().optional(),
14
+ capabilities: z.array(z.string()).optional(),
15
+ duration: z.number().optional(),
16
+ trainingId: z.number().optional(),
17
+ });
18
+ export function registerTrainingTools(server) {
19
+ server.registerTool("corven_training", {
20
+ title: "Training Marketplace",
21
+ description: "Create and sell agent training programs. 2.5% platform fee.\n\n" +
22
+ "ACTIONS:\n" +
23
+ " create — Create a training program (requires title, description, price, capabilities, duration)\n" +
24
+ " enroll — Enroll in a training program (requires trainingId)\n" +
25
+ " complete — Mark training as completed (requires trainingId)\n" +
26
+ " list — List available training programs\n" +
27
+ " get — Get training program details by ID (requires trainingId)\n\n" +
28
+ "WORKFLOW: create → enroll → complete → earn capabilities\n" +
29
+ "FEE: 2.5% platform fee on enrollment payments",
30
+ inputSchema: schema.shape,
31
+ }, async (args) => {
32
+ try {
33
+ const { action } = args;
34
+ if (action === "create") {
35
+ const result = await executeOrPrepare(CONTRACTS.TrainingMarketplace, ABI, "createProgram", [args.title, args.description, parseEther(args.price || "0.001"),
36
+ args.capabilities || [], args.duration || 10], 0n);
37
+ return formatTxResult(result);
38
+ }
39
+ if (action === "enroll") {
40
+ const program = await readContract(CONTRACTS.TrainingMarketplace, ABI, "getProgram", [BigInt(args.trainingId)]);
41
+ const result = await executeOrPrepare(CONTRACTS.TrainingMarketplace, ABI, "enroll", [BigInt(args.trainingId)], parseEther(program.price?.toString() || "0"));
42
+ return formatTxResult(result);
43
+ }
44
+ if (action === "complete") {
45
+ const result = await executeOrPrepare(CONTRACTS.TrainingMarketplace, ABI, "complete", [BigInt(args.trainingId)], 0n);
46
+ return formatTxResult(result);
47
+ }
48
+ if (action === "list") {
49
+ const count = await readContract(CONTRACTS.TrainingMarketplace, ABI, "getProgramCount", []);
50
+ return formatReadResult({ totalPrograms: Number(count) }, "Training Programs");
51
+ }
52
+ if (action === "get") {
53
+ const data = await readContract(CONTRACTS.TrainingMarketplace, ABI, "getProgram", [BigInt(args.trainingId)]);
54
+ return formatReadResult({
55
+ id: Number(data.id),
56
+ title: data.title,
57
+ description: data.description,
58
+ instructor: data.instructor,
59
+ price: formatEther(data.price),
60
+ capabilities: data.capabilities,
61
+ duration: Number(data.duration),
62
+ graduates: Number(data.graduates),
63
+ }, `Training #${args.trainingId}`);
64
+ }
65
+ return formatReadResult({ error: "Unknown action" }, "Error");
66
+ }
67
+ catch (e) {
68
+ const parsed = parseContractError(e);
69
+ return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
70
+ }
71
+ });
72
+ }
73
+ //# sourceMappingURL=corven-training.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corven-training.js","sourceRoot":"","sources":["../../src/tools/corven-training.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerVerifyTools(server: McpServer): void;
3
+ //# sourceMappingURL=corven-verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corven-verify.d.ts","sourceRoot":"","sources":["../../src/tools/corven-verify.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuDzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6K3D"}