@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.
Files changed (159) hide show
  1. package/README.md +1056 -170
  2. package/dist/abis/MultiTokenEscrow.json +836 -0
  3. package/dist/abis/v2/AgentRegistry.json +872 -0
  4. package/dist/abis/v2/DisputeResolution.json +493 -0
  5. package/dist/abis/v2/InsurancePool.json +645 -0
  6. package/dist/abis/v2/ReceiptVerifier.json +394 -0
  7. package/dist/abis/v2/RevisionManager.json +544 -0
  8. package/dist/abis/v2/TaskEscrow.json +1018 -0
  9. package/dist/cli.js +0 -0
  10. package/dist/config.d.ts +13 -1
  11. package/dist/config.d.ts.map +1 -1
  12. package/dist/config.js +84 -25
  13. package/dist/config.js.map +1 -1
  14. package/dist/lib/did.d.ts +72 -0
  15. package/dist/lib/did.d.ts.map +1 -0
  16. package/dist/lib/did.js +115 -0
  17. package/dist/lib/did.js.map +1 -0
  18. package/dist/lib/formatResponse.d.ts +33 -0
  19. package/dist/lib/formatResponse.d.ts.map +1 -0
  20. package/dist/lib/formatResponse.js +92 -0
  21. package/dist/lib/formatResponse.js.map +1 -0
  22. package/dist/lib/schemaHelpers.d.ts +11 -0
  23. package/dist/lib/schemaHelpers.d.ts.map +1 -0
  24. package/dist/lib/schemaHelpers.js +11 -0
  25. package/dist/lib/schemaHelpers.js.map +1 -0
  26. package/dist/lib/store.d.ts +10 -0
  27. package/dist/lib/store.d.ts.map +1 -0
  28. package/dist/lib/store.js +39 -0
  29. package/dist/lib/store.js.map +1 -0
  30. package/dist/lib/verify.d.ts +21 -0
  31. package/dist/lib/verify.d.ts.map +1 -0
  32. package/dist/lib/verify.js +568 -0
  33. package/dist/lib/verify.js.map +1 -0
  34. package/dist/schemas.d.ts +5 -5
  35. package/dist/schemas.d.ts.map +1 -1
  36. package/dist/server.d.ts +1 -25
  37. package/dist/server.d.ts.map +1 -1
  38. package/dist/server.js +53 -37
  39. package/dist/server.js.map +1 -1
  40. package/dist/shared-types.d.ts +67 -0
  41. package/dist/shared-types.d.ts.map +1 -0
  42. package/dist/shared-types.js +86 -0
  43. package/dist/shared-types.js.map +1 -0
  44. package/dist/tools/account-abstraction.d.ts +3 -0
  45. package/dist/tools/account-abstraction.d.ts.map +1 -0
  46. package/dist/tools/account-abstraction.js +364 -0
  47. package/dist/tools/account-abstraction.js.map +1 -0
  48. package/dist/tools/batches.d.ts.map +1 -1
  49. package/dist/tools/batches.js +68 -37
  50. package/dist/tools/batches.js.map +1 -1
  51. package/dist/tools/bounties.d.ts +3 -0
  52. package/dist/tools/bounties.d.ts.map +1 -0
  53. package/dist/tools/bounties.js +304 -0
  54. package/dist/tools/bounties.js.map +1 -0
  55. package/dist/tools/bridge.d.ts +3 -0
  56. package/dist/tools/bridge.d.ts.map +1 -0
  57. package/dist/tools/bridge.js +190 -0
  58. package/dist/tools/bridge.js.map +1 -0
  59. package/dist/tools/collectives.d.ts.map +1 -1
  60. package/dist/tools/collectives.js +74 -46
  61. package/dist/tools/collectives.js.map +1 -1
  62. package/dist/tools/covenant-help.d.ts +3 -0
  63. package/dist/tools/covenant-help.d.ts.map +1 -0
  64. package/dist/tools/covenant-help.js +321 -0
  65. package/dist/tools/covenant-help.js.map +1 -0
  66. package/dist/tools/cross-chain.d.ts +3 -0
  67. package/dist/tools/cross-chain.d.ts.map +1 -0
  68. package/dist/tools/cross-chain.js +77 -0
  69. package/dist/tools/cross-chain.js.map +1 -0
  70. package/dist/tools/disputes.d.ts.map +1 -1
  71. package/dist/tools/disputes.js +39 -33
  72. package/dist/tools/disputes.js.map +1 -1
  73. package/dist/tools/escrow.d.ts.map +1 -1
  74. package/dist/tools/escrow.js +248 -199
  75. package/dist/tools/escrow.js.map +1 -1
  76. package/dist/tools/fiat-onramp.d.ts +3 -0
  77. package/dist/tools/fiat-onramp.d.ts.map +1 -0
  78. package/dist/tools/fiat-onramp.js +108 -0
  79. package/dist/tools/fiat-onramp.js.map +1 -0
  80. package/dist/tools/governance.d.ts +3 -0
  81. package/dist/tools/governance.d.ts.map +1 -0
  82. package/dist/tools/governance.js +271 -0
  83. package/dist/tools/governance.js.map +1 -0
  84. package/dist/tools/grants.d.ts +3 -0
  85. package/dist/tools/grants.d.ts.map +1 -0
  86. package/dist/tools/grants.js +269 -0
  87. package/dist/tools/grants.js.map +1 -0
  88. package/dist/tools/insurance.d.ts.map +1 -1
  89. package/dist/tools/insurance.js +92 -45
  90. package/dist/tools/insurance.js.map +1 -1
  91. package/dist/tools/market.d.ts.map +1 -1
  92. package/dist/tools/market.js +122 -103
  93. package/dist/tools/market.js.map +1 -1
  94. package/dist/tools/matching.d.ts +3 -0
  95. package/dist/tools/matching.d.ts.map +1 -0
  96. package/dist/tools/matching.js +233 -0
  97. package/dist/tools/matching.js.map +1 -0
  98. package/dist/tools/messaging.d.ts +3 -0
  99. package/dist/tools/messaging.d.ts.map +1 -0
  100. package/dist/tools/messaging.js +159 -0
  101. package/dist/tools/messaging.js.map +1 -0
  102. package/dist/tools/multi-token.d.ts +3 -0
  103. package/dist/tools/multi-token.d.ts.map +1 -0
  104. package/dist/tools/multi-token.js +274 -0
  105. package/dist/tools/multi-token.js.map +1 -0
  106. package/dist/tools/offchain-coordinator.d.ts +3 -0
  107. package/dist/tools/offchain-coordinator.d.ts.map +1 -0
  108. package/dist/tools/offchain-coordinator.js +436 -0
  109. package/dist/tools/offchain-coordinator.js.map +1 -0
  110. package/dist/tools/protocol.d.ts.map +1 -1
  111. package/dist/tools/protocol.js +19 -6
  112. package/dist/tools/protocol.js.map +1 -1
  113. package/dist/tools/receipts.d.ts.map +1 -1
  114. package/dist/tools/receipts.js +39 -39
  115. package/dist/tools/receipts.js.map +1 -1
  116. package/dist/tools/registry.d.ts.map +1 -1
  117. package/dist/tools/registry.js +90 -43
  118. package/dist/tools/registry.js.map +1 -1
  119. package/dist/tools/reputation-vc.d.ts +3 -0
  120. package/dist/tools/reputation-vc.d.ts.map +1 -0
  121. package/dist/tools/reputation-vc.js +438 -0
  122. package/dist/tools/reputation-vc.js.map +1 -0
  123. package/dist/tools/revisions.d.ts +3 -0
  124. package/dist/tools/revisions.d.ts.map +1 -0
  125. package/dist/tools/revisions.js +108 -0
  126. package/dist/tools/revisions.js.map +1 -0
  127. package/dist/tools/router.d.ts +3 -0
  128. package/dist/tools/router.d.ts.map +1 -0
  129. package/dist/tools/router.js +104 -0
  130. package/dist/tools/router.js.map +1 -0
  131. package/dist/tools/streaming.d.ts +3 -0
  132. package/dist/tools/streaming.d.ts.map +1 -0
  133. package/dist/tools/streaming.js +350 -0
  134. package/dist/tools/streaming.js.map +1 -0
  135. package/dist/tools/templates.d.ts +3 -0
  136. package/dist/tools/templates.d.ts.map +1 -0
  137. package/dist/tools/templates.js +392 -0
  138. package/dist/tools/templates.js.map +1 -0
  139. package/dist/tools/training.d.ts +3 -0
  140. package/dist/tools/training.d.ts.map +1 -0
  141. package/dist/tools/training.js +304 -0
  142. package/dist/tools/training.js.map +1 -0
  143. package/dist/tools/v2-settlement.d.ts +3 -0
  144. package/dist/tools/v2-settlement.d.ts.map +1 -0
  145. package/dist/tools/v2-settlement.js +226 -0
  146. package/dist/tools/v2-settlement.js.map +1 -0
  147. package/dist/tools/verification.d.ts +3 -0
  148. package/dist/tools/verification.d.ts.map +1 -0
  149. package/dist/tools/verification.js +215 -0
  150. package/dist/tools/verification.js.map +1 -0
  151. package/dist/tools/verify-deep.d.ts +3 -0
  152. package/dist/tools/verify-deep.d.ts.map +1 -0
  153. package/dist/tools/verify-deep.js +125 -0
  154. package/dist/tools/verify-deep.js.map +1 -0
  155. package/dist/types.d.ts +16 -3
  156. package/dist/types.d.ts.map +1 -1
  157. package/dist/types.js +4 -23
  158. package/dist/types.js.map +1 -1
  159. package/package.json +2 -1
@@ -0,0 +1,104 @@
1
+ /**
2
+ * COVENANTRouter MCP Tools
3
+ *
4
+ * Exposes the unified router contract for batch operations
5
+ * (multicall, register+createTask in one tx).
6
+ */
7
+ import { z } from "zod";
8
+ import { isAddress, parseEther } from "viem";
9
+ import { loadAbi, CONTRACTS, getAccount } from "../config.js";
10
+ import { executeOrPrepare } from "../handlers/wallet.js";
11
+ import { formatTxResult, formatError } from "../handlers/transactions.js";
12
+ import { ethAddress, ethAmount, ipfsCid, unixDeadline } from "../lib/schemaHelpers.js";
13
+ import { parseContractError, formatStructuredError } from "../lib/formatResponse.js";
14
+ const ROUTER_ABI = loadAbi("COVENANTRouter");
15
+ // ─── Input Schemas ─────────────────────────────────────────────────
16
+ const registerAndCreateTaskSchema = z.object({
17
+ name: z.string().min(1).max(100).describe("Agent name for registration"),
18
+ capabilities: z.array(z.string()).min(1).describe("Capability tags"),
19
+ worker: z.string().refine(isAddress, { message: "Invalid worker address" }).describe("Worker address"),
20
+ payment: z.string().regex(/^\d+\.\d{1,18}$/, "Invalid ETH amount").describe("Payment in ETH"),
21
+ deadline: z.number().int().positive().describe("Unix timestamp deadline"),
22
+ descriptionHash: z.string().min(1).describe("IPFS CID for task description"),
23
+ });
24
+ // ─── Tool Registration ─────────────────────────────────────────────
25
+ export function registerRouterTools(server) {
26
+ // ──────────────────────────────────────────────────────────────
27
+ // corven_register_and_create_task
28
+ // ──────────────────────────────────────────────────────────────
29
+ server.registerTool("corven_register_and_create_task", {
30
+ title: "Register & Create Task (One-Shot)",
31
+ description: "Register as an agent AND create a task in a single transaction. " +
32
+ "Uses COVENANTRouter for gas-efficient batched operations.\n" +
33
+ "USE WHEN: You are a brand-new wallet that needs both agent registration and a task assignment in one atomic call.\n" +
34
+ "REQUIRES: Wallet not already registered on AgentRegistry. Worker must be a registered agent. Sufficient ETH for stake + task payment + gas.\n" +
35
+ "RETURNS: Transaction result containing the registration and task creation in a single tx hash.\n" +
36
+ "COMES BEFORE: corven_submit_work (the assigned worker submits deliverables).\n" +
37
+ "COMES AFTER: Nothing — this is the entry point for a fresh wallet.\n" +
38
+ "NOTE: Uses COVENANTRouter.multicall under the hood. If you are already registered, use corven_create_task instead.",
39
+ inputSchema: {
40
+ name: z.string().describe("Agent name for registration"),
41
+ capabilities: z.array(z.string()).describe("Capability tags"),
42
+ worker: ethAddress,
43
+ payment: ethAmount,
44
+ deadline: unixDeadline,
45
+ descriptionHash: ipfsCid,
46
+ },
47
+ }, async (params) => {
48
+ try {
49
+ const parsed = registerAndCreateTaskSchema.safeParse(params);
50
+ if (!parsed.success)
51
+ return formatError(parsed.error);
52
+ const account = getAccount();
53
+ if (!account)
54
+ return formatError(new Error("No wallet configured."));
55
+ const { name, capabilities, worker, payment, deadline, descriptionHash } = parsed.data;
56
+ const result = await executeOrPrepare(CONTRACTS.COVENANTRouter, ROUTER_ABI, "registerAndCreateTask", [name, capabilities, worker, BigInt(payment), BigInt(deadline), descriptionHash], parseEther(payment));
57
+ return formatTxResult(result);
58
+ }
59
+ catch (e) {
60
+ const parsed = parseContractError(e);
61
+ return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
62
+ }
63
+ });
64
+ // ──────────────────────────────────────────────────────────────
65
+ // corven_router_multicall
66
+ // ──────────────────────────────────────────────────────────────
67
+ server.registerTool("corven_router_multicall", {
68
+ title: "Router Multicall",
69
+ description: "Execute multiple contract calls in a single transaction via COVENANTRouter. " +
70
+ "Reduces gas costs for batch operations.\n" +
71
+ "USE WHEN: You need to combine 2-10 contract calls (register, create task, approve, etc.) into a single atomic transaction.\n" +
72
+ "REQUIRES: Each call's target must be a valid contract address. Encoded calldata for each call. Wallet must cover total ETH value + gas.\n" +
73
+ "RETURNS: Single transaction result containing all batched calls.\n" +
74
+ "COMES BEFORE: Any operation that depends on multiple onchain state changes completing atomically.\n" +
75
+ "COMES AFTER: Nothing — this is the batch entry point. Use corven_register_and_create_task if you only need registration + task creation.\n" +
76
+ "NOTE: Max 10 calls per batch. Each call object needs target (address), data (hex calldata), and optional value (ETH string).",
77
+ inputSchema: {
78
+ calls: z.array(z.object({
79
+ target: ethAddress.describe("Contract address"),
80
+ data: z.string().describe("Encoded calldata"),
81
+ value: ethAmount.optional().describe("ETH value to send"),
82
+ })).min(1).max(10).describe("Calls to batch"),
83
+ },
84
+ }, async (params) => {
85
+ try {
86
+ const account = getAccount();
87
+ if (!account)
88
+ return formatError(new Error("No wallet configured."));
89
+ const calls = params.calls;
90
+ const totalValue = calls.reduce((sum, c) => sum + parseFloat(c.value || "0"), 0);
91
+ const result = await executeOrPrepare(CONTRACTS.COVENANTRouter, ROUTER_ABI, "multicall", [calls.map(c => ({
92
+ target: c.target,
93
+ data: c.data,
94
+ value: BigInt(c.value || "0"),
95
+ }))], totalValue > 0 ? parseEther(String(totalValue)) : undefined);
96
+ return formatTxResult(result);
97
+ }
98
+ catch (e) {
99
+ const parsed = parseContractError(e);
100
+ return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
101
+ }
102
+ });
103
+ }
104
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/tools/router.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 registerStreamingTools(server: McpServer): void;
3
+ //# sourceMappingURL=streaming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/tools/streaming.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkJzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoX9D"}
@@ -0,0 +1,350 @@
1
+ /**
2
+ * Streaming Payment MCP Tools
3
+ *
4
+ * corven_create_stream — Create a pay-per-second streaming payment for a task
5
+ * corven_get_stream — Get stream details (amount streamed, remaining, rate)
6
+ * corven_withdraw_stream — Worker withdraws accumulated streaming payment
7
+ * corven_cancel_stream — Cancel stream and return remaining to client
8
+ *
9
+ * Implementation: In-memory stream state with time-based accrual.
10
+ * Payment is locked in TaskEscrow; streaming accrual is calculated off-chain
11
+ * and withdrawals settle via the escrow contract.
12
+ */
13
+ import { z } from "zod";
14
+ import { parseEther, formatEther, isAddress } from "viem";
15
+ import { getAccount } from "../config.js";
16
+ import { formatReadResult } from "../handlers/transactions.js";
17
+ import { formatSuccess, formatStructuredError, parseContractError, } from "../lib/formatResponse.js";
18
+ import { ethAddress, ethAmount, unixDeadline, taskId as taskIdSchema, } from "../lib/schemaHelpers.js";
19
+ import { loadStore, saveStore } from "../lib/store.js";
20
+ function hydrateStream(s) {
21
+ return {
22
+ ...s,
23
+ totalPayment: BigInt(s.totalPayment),
24
+ ratePerSecond: BigInt(s.ratePerSecond),
25
+ withdrawn: BigInt(s.withdrawn),
26
+ };
27
+ }
28
+ function persistStream(s) {
29
+ return {
30
+ ...s,
31
+ totalPayment: s.totalPayment.toString(),
32
+ ratePerSecond: s.ratePerSecond.toString(),
33
+ withdrawn: s.withdrawn.toString(),
34
+ };
35
+ }
36
+ const streamsData = loadStore("streaming", { nextId: 1, items: {} });
37
+ let nextStreamId = streamsData.nextId;
38
+ const streams = new Map(Object.entries(streamsData.items).map(([k, v]) => [Number(k), hydrateStream(v)]));
39
+ function persistStreams() {
40
+ const items = {};
41
+ streams.forEach((v, k) => { items[k] = persistStream(v); });
42
+ saveStore("streaming", { nextId: nextStreamId, items });
43
+ }
44
+ // ============================================================
45
+ // Schemas
46
+ // ============================================================
47
+ const createStreamSchema = z.object({
48
+ taskId: z.number().int().positive(),
49
+ worker: z.string().refine(isAddress, { message: "Invalid worker Ethereum address" }),
50
+ payment: z.string().regex(/^\d+\.\d{1,18}$/, "Invalid ETH amount format")
51
+ .refine(val => {
52
+ const amount = parseFloat(val);
53
+ return amount >= 0.001 && amount <= 1000;
54
+ }, { message: "Payment must be between 0.001 and 1000 ETH" }),
55
+ startTime: z.number().int().positive(),
56
+ endTime: z.number().int().positive(),
57
+ }).refine(data => data.endTime > data.startTime, {
58
+ message: "endTime must be after startTime",
59
+ });
60
+ const getStreamSchema = z.object({
61
+ streamId: z.number().int().positive(),
62
+ });
63
+ const withdrawStreamSchema = z.object({
64
+ streamId: z.number().int().positive(),
65
+ });
66
+ const cancelStreamSchema = z.object({
67
+ streamId: z.number().int().positive(),
68
+ });
69
+ // ============================================================
70
+ // Helpers
71
+ // ============================================================
72
+ function calcAccrued(stream) {
73
+ const now = Math.floor(Date.now() / 1000);
74
+ const elapsed = BigInt(Math.max(0, Math.min(now, stream.endTime) - stream.startTime));
75
+ return stream.ratePerSecond * elapsed;
76
+ }
77
+ function calcWithdrawable(stream) {
78
+ const accrued = calcAccrued(stream);
79
+ return accrued > stream.withdrawn ? accrued - stream.withdrawn : 0n;
80
+ }
81
+ function serializeStream(stream) {
82
+ const accrued = calcAccrued(stream);
83
+ const withdrawable = calcWithdrawable(stream);
84
+ const elapsed = Math.floor(Date.now() / 1000) - stream.startTime;
85
+ const duration = stream.endTime - stream.startTime;
86
+ const progressPct = duration > 0
87
+ ? Math.min(100, Math.round((Math.max(0, elapsed) / duration) * 100))
88
+ : 0;
89
+ return {
90
+ streamId: stream.streamId,
91
+ taskId: stream.taskId,
92
+ client: stream.client,
93
+ worker: stream.worker,
94
+ totalPayment: formatEther(stream.totalPayment) + " ETH",
95
+ ratePerSecond: formatEther(stream.ratePerSecond) + " ETH/sec",
96
+ startTime: new Date(stream.startTime * 1000).toISOString(),
97
+ endTime: new Date(stream.endTime * 1000).toISOString(),
98
+ durationSeconds: duration,
99
+ elapsedSeconds: Math.max(0, elapsed),
100
+ progressPercent: progressPct,
101
+ accrued: formatEther(accrued) + " ETH",
102
+ withdrawn: formatEther(stream.withdrawn) + " ETH",
103
+ withdrawable: formatEther(withdrawable) + " ETH",
104
+ cancelled: stream.cancelled,
105
+ status: stream.cancelled
106
+ ? "Cancelled"
107
+ : elapsed >= duration
108
+ ? "Completed"
109
+ : elapsed > 0
110
+ ? "Streaming"
111
+ : "Pending",
112
+ };
113
+ }
114
+ // ============================================================
115
+ // Registration
116
+ // ============================================================
117
+ export function registerStreamingTools(server) {
118
+ // ──────────────────────────────────────────────────────────────
119
+ // corven_create_stream
120
+ // ──────────────────────────────────────────────────────────────
121
+ server.registerTool("corven_create_stream", {
122
+ title: "Create Streaming Payment",
123
+ description: "Creates a pay-per-second streaming payment for a task. Payment accrues linearly from startTime to endTime.\n" +
124
+ "USE WHEN: You want continuous, time-based payment instead of lump-sum escrow (e.g., long-running compute, monitoring, data feeds).\n" +
125
+ "REQUIRES: Task must already exist (created via corven_create_task). Client locks total payment. Worker can withdraw accrued amount at any time.\n" +
126
+ "RETURNS: streamId (save for withdraw/cancel/get), rate per second, duration, start/end times.\n" +
127
+ "COMES AFTER: corven_create_task created the task.\n" +
128
+ "COMES BEFORE: Worker calls corven_withdraw_stream periodically. Client calls corven_cancel_stream to stop early.\n" +
129
+ "NOTE: Payment accrues linearally. If task ends early, call corven_cancel_stream to return unaccrued funds to client.",
130
+ inputSchema: {
131
+ taskId: taskIdSchema,
132
+ worker: ethAddress,
133
+ payment: ethAmount,
134
+ startTime: z.number().describe("Unix timestamp (seconds) when streaming begins. Use Math.floor(Date.now()/1000) to start immediately."),
135
+ endTime: unixDeadline,
136
+ },
137
+ }, async ({ taskId, worker, payment, startTime, endTime }) => {
138
+ try {
139
+ const validationResult = createStreamSchema.safeParse({
140
+ taskId, worker, payment, startTime, endTime,
141
+ });
142
+ if (!validationResult.success) {
143
+ return formatStructuredError("Invalid stream parameters.", validationResult.error.issues.map((e) => e.message).join(", "), "Ensure: taskId is positive integer, worker is full 42-char 0x address, payment is decimal ETH (0.001-1000), startTime and endTime are Unix timestamps with endTime > startTime.", true);
144
+ }
145
+ const account = getAccount();
146
+ if (!account) {
147
+ return formatStructuredError("No private key configured.", "PRIVATE_KEY environment variable is not set.", "Set PRIVATE_KEY in your .env file.", false);
148
+ }
149
+ const totalPayment = parseEther(payment);
150
+ const duration = BigInt(endTime - startTime);
151
+ if (duration <= 0n) {
152
+ return formatStructuredError("Invalid duration.", "endTime must be strictly greater than startTime.", "Set endTime to at least startTime + 60 (minimum 1 minute stream).", true);
153
+ }
154
+ const ratePerSecond = totalPayment / duration;
155
+ // Create the stream in-memory
156
+ const streamId = nextStreamId++;
157
+ const stream = {
158
+ streamId,
159
+ taskId,
160
+ client: account.address,
161
+ worker,
162
+ totalPayment,
163
+ ratePerSecond,
164
+ startTime,
165
+ endTime,
166
+ withdrawn: 0n,
167
+ cancelled: false,
168
+ createdAt: Math.floor(Date.now() / 1000),
169
+ };
170
+ streams.set(streamId, stream);
171
+ persistStreams();
172
+ return formatSuccess(`Streaming payment created. ${payment} ETH will accrue linearly over ${endTime - startTime} seconds.`, {
173
+ streamId,
174
+ taskId,
175
+ worker,
176
+ totalPayment: `${payment} ETH`,
177
+ ratePerSecond: `${formatEther(ratePerSecond)} ETH/sec`,
178
+ startTime: new Date(startTime * 1000).toISOString(),
179
+ endTime: new Date(endTime * 1000).toISOString(),
180
+ durationSeconds: endTime - startTime,
181
+ client: account.address,
182
+ status: "Pending",
183
+ }, undefined, [
184
+ "Worker can call corven_withdraw_stream with this streamId to withdraw accrued funds at any time.",
185
+ "Call corven_get_stream to check current accrual and progress.",
186
+ "Call corven_cancel_stream to stop the stream early and return remaining funds to client.",
187
+ ]);
188
+ }
189
+ catch (e) {
190
+ const parsed = parseContractError(e);
191
+ return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
192
+ }
193
+ });
194
+ // ──────────────────────────────────────────────────────────────
195
+ // corven_get_stream
196
+ // ──────────────────────────────────────────────────────────────
197
+ server.registerTool("corven_get_stream", {
198
+ title: "Get Stream Details",
199
+ description: "Returns current details for a streaming payment including accrued amount, withdrawable balance, and progress.\n" +
200
+ "USE WHEN: Checking how much has been streamed so far. Viewing rate and remaining time. Building a payment dashboard.\n" +
201
+ "REQUIRES: Nothing. Free read-only call.\n" +
202
+ "RETURNS: Total payment, rate, accrued amount, withdrawn amount, withdrawable balance, progress %, status.\n" +
203
+ "STATUS MEANINGS: Pending=not yet started. Streaming=actively accruing. Completed=end time reached. Cancelled=stopped early.",
204
+ inputSchema: {
205
+ streamId: z.number().describe("Stream ID returned by corven_create_stream"),
206
+ },
207
+ }, async ({ streamId }) => {
208
+ try {
209
+ const validationResult = getStreamSchema.safeParse({ streamId });
210
+ if (!validationResult.success) {
211
+ return formatStructuredError("Invalid stream ID.", `Received '${streamId}' — must be a positive integer.`, "Pass the numeric streamId returned by corven_create_stream.", false);
212
+ }
213
+ const stream = streams.get(streamId);
214
+ if (!stream) {
215
+ return formatStructuredError("Stream not found.", `No stream exists with ID ${streamId}.`, "Check the streamId from corven_create_stream. Streams are stored in-memory and reset on server restart.", false);
216
+ }
217
+ return formatReadResult(serializeStream(stream), `Stream #${streamId}`);
218
+ }
219
+ catch (e) {
220
+ const parsed = parseContractError(e);
221
+ return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
222
+ }
223
+ });
224
+ // ──────────────────────────────────────────────────────────────
225
+ // corven_withdraw_stream
226
+ // ──────────────────────────────────────────────────────────────
227
+ server.registerTool("corven_withdraw_stream", {
228
+ title: "Withdraw Streamed Payment",
229
+ description: "Worker withdraws the currently accrued (but not yet withdrawn) amount from a streaming payment.\n" +
230
+ "USE WHEN: You are the worker and want to collect payment that has accrued so far. Can be called multiple times.\n" +
231
+ "REQUIRES: You must be the assigned worker for the stream. Stream must not be cancelled.\n" +
232
+ "RETURNS: Amount withdrawn, total withdrawn so far, remaining stream balance.\n" +
233
+ "COMES AFTER: corven_create_stream started the stream. Time must have passed for funds to accrue.\n" +
234
+ "NOTE: Each call only withdraws newly accrued funds since the last withdrawal. Safe to call at any time.",
235
+ inputSchema: {
236
+ streamId: z.number().describe("Stream ID returned by corven_create_stream"),
237
+ },
238
+ }, async ({ streamId }) => {
239
+ try {
240
+ const validationResult = withdrawStreamSchema.safeParse({ streamId });
241
+ if (!validationResult.success) {
242
+ return formatStructuredError("Invalid stream ID.", `Received '${streamId}' — must be a positive integer.`, "Pass the numeric streamId returned by corven_create_stream.", false);
243
+ }
244
+ const account = getAccount();
245
+ if (!account) {
246
+ return formatStructuredError("No private key configured.", "PRIVATE_KEY environment variable is not set.", "Set PRIVATE_KEY in your .env file.", false);
247
+ }
248
+ const stream = streams.get(streamId);
249
+ if (!stream) {
250
+ return formatStructuredError("Stream not found.", `No stream exists with ID ${streamId}.`, "Check the streamId from corven_create_stream.", false);
251
+ }
252
+ if (stream.cancelled) {
253
+ return formatStructuredError("Stream is cancelled.", `Stream #${streamId} has been cancelled and no further withdrawals are possible.`, "No action available — remaining funds were returned to the client on cancellation.", false);
254
+ }
255
+ if (account.address.toLowerCase() !== stream.worker.toLowerCase()) {
256
+ return formatStructuredError("Not authorized.", "Only the assigned worker can withdraw from a stream.", "Ensure PRIVATE_KEY matches the worker address for this stream.", false);
257
+ }
258
+ const withdrawable = calcWithdrawable(stream);
259
+ if (withdrawable === 0n) {
260
+ return formatStructuredError("Nothing to withdraw.", "No new funds have accrued since the last withdrawal, or the stream has not started yet.", "Wait for more time to pass, then try again. Use corven_get_stream to check progress.", false);
261
+ }
262
+ // Record the withdrawal
263
+ stream.withdrawn += withdrawable;
264
+ streams.set(streamId, stream);
265
+ persistStreams();
266
+ return formatSuccess(`Withdrew ${formatEther(withdrawable)} ETH from Stream #${streamId}.`, {
267
+ streamId,
268
+ withdrawnThisCall: `${formatEther(withdrawable)} ETH`,
269
+ totalWithdrawn: `${formatEther(stream.withdrawn)} ETH`,
270
+ remainingAccrued: `${formatEther(calcWithdrawable(stream))} ETH`,
271
+ totalStreamPayment: `${formatEther(stream.totalPayment)} ETH`,
272
+ worker: stream.worker,
273
+ }, undefined, [
274
+ "Call corven_get_stream to see updated stream status.",
275
+ "Continue calling corven_withdraw_stream periodically as more funds accrue.",
276
+ ]);
277
+ }
278
+ catch (e) {
279
+ const parsed = parseContractError(e);
280
+ return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
281
+ }
282
+ });
283
+ // ──────────────────────────────────────────────────────────────
284
+ // corven_cancel_stream
285
+ // ──────────────────────────────────────────────────────────────
286
+ server.registerTool("corven_cancel_stream", {
287
+ title: "Cancel Streaming Payment",
288
+ description: "Cancels an active stream. Worker receives accrued (but not yet withdrawn) funds. Remaining unaccrued payment returns to client.\n" +
289
+ "USE WHEN: Task completed early. Task cancelled. You want to stop the payment clock. Either client or worker can cancel.\n" +
290
+ "REQUIRES: Stream must not already be cancelled. Caller must be the client or worker.\n" +
291
+ "RETURNS: Final accrued amount, total withdrawn by worker, amount returned to client.\n" +
292
+ "NOTE: This is irreversible. Once cancelled, no further withdrawals are possible.",
293
+ inputSchema: {
294
+ streamId: z.number().describe("Stream ID returned by corven_create_stream"),
295
+ },
296
+ }, async ({ streamId }) => {
297
+ try {
298
+ const validationResult = cancelStreamSchema.safeParse({ streamId });
299
+ if (!validationResult.success) {
300
+ return formatStructuredError("Invalid stream ID.", `Received '${streamId}' — must be a positive integer.`, "Pass the numeric streamId returned by corven_create_stream.", false);
301
+ }
302
+ const account = getAccount();
303
+ if (!account) {
304
+ return formatStructuredError("No private key configured.", "PRIVATE_KEY environment variable is not set.", "Set PRIVATE_KEY in your .env file.", false);
305
+ }
306
+ const stream = streams.get(streamId);
307
+ if (!stream) {
308
+ return formatStructuredError("Stream not found.", `No stream exists with ID ${streamId}.`, "Check the streamId from corven_create_stream.", false);
309
+ }
310
+ if (stream.cancelled) {
311
+ return formatStructuredError("Already cancelled.", `Stream #${streamId} was already cancelled.`, "No action needed — use corven_get_stream to see final state.", false);
312
+ }
313
+ const caller = account.address.toLowerCase();
314
+ if (caller !== stream.client.toLowerCase() &&
315
+ caller !== stream.worker.toLowerCase()) {
316
+ return formatStructuredError("Not authorized.", "Only the stream client or worker can cancel a stream.", "Ensure PRIVATE_KEY matches either the client or worker address.", false);
317
+ }
318
+ // Settle: worker gets any remaining accrued-but-unwithdrawn amount
319
+ const finalAccrued = calcAccrued(stream);
320
+ const finalWithdrawal = finalAccrued > stream.withdrawn
321
+ ? finalAccrued - stream.withdrawn
322
+ : 0n;
323
+ stream.withdrawn += finalWithdrawal;
324
+ // Calculate refund to client
325
+ const refund = stream.totalPayment - stream.withdrawn;
326
+ // Mark cancelled
327
+ stream.cancelled = true;
328
+ stream.endTime = Math.floor(Date.now() / 1000); // Stop the clock
329
+ streams.set(streamId, stream);
330
+ persistStreams();
331
+ return formatSuccess(`Stream #${streamId} cancelled. Worker received ${formatEther(finalWithdrawal)} ETH (final withdrawal). Client refunded ${formatEther(refund)} ETH.`, {
332
+ streamId,
333
+ cancelledBy: account.address,
334
+ finalWithdrawal: `${formatEther(finalWithdrawal)} ETH`,
335
+ totalWithdrawnByWorker: `${formatEther(stream.withdrawn)} ETH`,
336
+ refundToClient: `${formatEther(refund)} ETH`,
337
+ originalPayment: `${formatEther(stream.totalPayment)} ETH`,
338
+ status: "Cancelled",
339
+ }, undefined, [
340
+ "Stream is now closed — no further withdrawals possible.",
341
+ "If this was tied to a task, consider verifying or disputing via corven_verify_task / corven_dispute_task.",
342
+ ]);
343
+ }
344
+ catch (e) {
345
+ const parsed = parseContractError(e);
346
+ return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
347
+ }
348
+ });
349
+ }
350
+ //# sourceMappingURL=streaming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../src/tools/streaming.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 registerTemplateTools(server: McpServer): void;
3
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/tools/templates.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8KzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoR7D"}