@varun-ai07/covenant-mcp 1.2.2 → 1.3.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 (165) hide show
  1. package/README.md +128 -12
  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/handlers/wallet.d.ts.map +1 -1
  15. package/dist/handlers/wallet.js +1 -1
  16. package/dist/handlers/wallet.js.map +1 -1
  17. package/dist/lib/did.d.ts +72 -0
  18. package/dist/lib/did.d.ts.map +1 -0
  19. package/dist/lib/did.js +115 -0
  20. package/dist/lib/did.js.map +1 -0
  21. package/dist/lib/events.d.ts.map +1 -1
  22. package/dist/lib/events.js +2 -2
  23. package/dist/lib/events.js.map +1 -1
  24. package/dist/lib/formatResponse.d.ts +33 -0
  25. package/dist/lib/formatResponse.d.ts.map +1 -0
  26. package/dist/lib/formatResponse.js +92 -0
  27. package/dist/lib/formatResponse.js.map +1 -0
  28. package/dist/lib/schemaHelpers.d.ts +11 -0
  29. package/dist/lib/schemaHelpers.d.ts.map +1 -0
  30. package/dist/lib/schemaHelpers.js +11 -0
  31. package/dist/lib/schemaHelpers.js.map +1 -0
  32. package/dist/lib/store.d.ts +10 -0
  33. package/dist/lib/store.d.ts.map +1 -0
  34. package/dist/lib/store.js +39 -0
  35. package/dist/lib/store.js.map +1 -0
  36. package/dist/lib/verify.d.ts +21 -0
  37. package/dist/lib/verify.d.ts.map +1 -0
  38. package/dist/lib/verify.js +568 -0
  39. package/dist/lib/verify.js.map +1 -0
  40. package/dist/schemas.d.ts +5 -5
  41. package/dist/schemas.d.ts.map +1 -1
  42. package/dist/server.d.ts +1 -25
  43. package/dist/server.d.ts.map +1 -1
  44. package/dist/server.js +53 -37
  45. package/dist/server.js.map +1 -1
  46. package/dist/tools/account-abstraction.d.ts +3 -0
  47. package/dist/tools/account-abstraction.d.ts.map +1 -0
  48. package/dist/tools/account-abstraction.js +364 -0
  49. package/dist/tools/account-abstraction.js.map +1 -0
  50. package/dist/tools/batches.d.ts.map +1 -1
  51. package/dist/tools/batches.js +68 -37
  52. package/dist/tools/batches.js.map +1 -1
  53. package/dist/tools/bounties.d.ts +3 -0
  54. package/dist/tools/bounties.d.ts.map +1 -0
  55. package/dist/tools/bounties.js +304 -0
  56. package/dist/tools/bounties.js.map +1 -0
  57. package/dist/tools/bridge.d.ts +3 -0
  58. package/dist/tools/bridge.d.ts.map +1 -0
  59. package/dist/tools/bridge.js +190 -0
  60. package/dist/tools/bridge.js.map +1 -0
  61. package/dist/tools/collectives.d.ts.map +1 -1
  62. package/dist/tools/collectives.js +75 -48
  63. package/dist/tools/collectives.js.map +1 -1
  64. package/dist/tools/covenant-help.d.ts +3 -0
  65. package/dist/tools/covenant-help.d.ts.map +1 -0
  66. package/dist/tools/covenant-help.js +321 -0
  67. package/dist/tools/covenant-help.js.map +1 -0
  68. package/dist/tools/cross-chain.d.ts +3 -0
  69. package/dist/tools/cross-chain.d.ts.map +1 -0
  70. package/dist/tools/cross-chain.js +77 -0
  71. package/dist/tools/cross-chain.js.map +1 -0
  72. package/dist/tools/disputes.d.ts.map +1 -1
  73. package/dist/tools/disputes.js +39 -33
  74. package/dist/tools/disputes.js.map +1 -1
  75. package/dist/tools/escrow.d.ts.map +1 -1
  76. package/dist/tools/escrow.js +277 -202
  77. package/dist/tools/escrow.js.map +1 -1
  78. package/dist/tools/fiat-onramp.d.ts +3 -0
  79. package/dist/tools/fiat-onramp.d.ts.map +1 -0
  80. package/dist/tools/fiat-onramp.js +108 -0
  81. package/dist/tools/fiat-onramp.js.map +1 -0
  82. package/dist/tools/governance.d.ts +3 -0
  83. package/dist/tools/governance.d.ts.map +1 -0
  84. package/dist/tools/governance.js +271 -0
  85. package/dist/tools/governance.js.map +1 -0
  86. package/dist/tools/grants.d.ts +3 -0
  87. package/dist/tools/grants.d.ts.map +1 -0
  88. package/dist/tools/grants.js +269 -0
  89. package/dist/tools/grants.js.map +1 -0
  90. package/dist/tools/insurance.d.ts.map +1 -1
  91. package/dist/tools/insurance.js +92 -45
  92. package/dist/tools/insurance.js.map +1 -1
  93. package/dist/tools/market.d.ts.map +1 -1
  94. package/dist/tools/market.js +122 -103
  95. package/dist/tools/market.js.map +1 -1
  96. package/dist/tools/matching.d.ts +3 -0
  97. package/dist/tools/matching.d.ts.map +1 -0
  98. package/dist/tools/matching.js +233 -0
  99. package/dist/tools/matching.js.map +1 -0
  100. package/dist/tools/messaging.d.ts +3 -0
  101. package/dist/tools/messaging.d.ts.map +1 -0
  102. package/dist/tools/messaging.js +159 -0
  103. package/dist/tools/messaging.js.map +1 -0
  104. package/dist/tools/multi-token.d.ts +3 -0
  105. package/dist/tools/multi-token.d.ts.map +1 -0
  106. package/dist/tools/multi-token.js +274 -0
  107. package/dist/tools/multi-token.js.map +1 -0
  108. package/dist/tools/offchain-coordinator.d.ts +3 -0
  109. package/dist/tools/offchain-coordinator.d.ts.map +1 -0
  110. package/dist/tools/offchain-coordinator.js +436 -0
  111. package/dist/tools/offchain-coordinator.js.map +1 -0
  112. package/dist/tools/protocol.d.ts.map +1 -1
  113. package/dist/tools/protocol.js +19 -6
  114. package/dist/tools/protocol.js.map +1 -1
  115. package/dist/tools/receipts.d.ts.map +1 -1
  116. package/dist/tools/receipts.js +45 -22
  117. package/dist/tools/receipts.js.map +1 -1
  118. package/dist/tools/registry.d.ts.map +1 -1
  119. package/dist/tools/registry.js +90 -43
  120. package/dist/tools/registry.js.map +1 -1
  121. package/dist/tools/reputation-vc.d.ts +3 -0
  122. package/dist/tools/reputation-vc.d.ts.map +1 -0
  123. package/dist/tools/reputation-vc.js +438 -0
  124. package/dist/tools/reputation-vc.js.map +1 -0
  125. package/dist/tools/revisions.d.ts +3 -0
  126. package/dist/tools/revisions.d.ts.map +1 -0
  127. package/dist/tools/revisions.js +108 -0
  128. package/dist/tools/revisions.js.map +1 -0
  129. package/dist/tools/router.d.ts +3 -0
  130. package/dist/tools/router.d.ts.map +1 -0
  131. package/dist/tools/router.js +104 -0
  132. package/dist/tools/router.js.map +1 -0
  133. package/dist/tools/streaming.d.ts +3 -0
  134. package/dist/tools/streaming.d.ts.map +1 -0
  135. package/dist/tools/streaming.js +350 -0
  136. package/dist/tools/streaming.js.map +1 -0
  137. package/dist/tools/templates.d.ts +3 -0
  138. package/dist/tools/templates.d.ts.map +1 -0
  139. package/dist/tools/templates.js +392 -0
  140. package/dist/tools/templates.js.map +1 -0
  141. package/dist/tools/training.d.ts +3 -0
  142. package/dist/tools/training.d.ts.map +1 -0
  143. package/dist/tools/training.js +304 -0
  144. package/dist/tools/training.js.map +1 -0
  145. package/dist/tools/v2-settlement.d.ts +3 -0
  146. package/dist/tools/v2-settlement.d.ts.map +1 -0
  147. package/dist/tools/v2-settlement.js +226 -0
  148. package/dist/tools/v2-settlement.js.map +1 -0
  149. package/dist/tools/verification.d.ts +3 -0
  150. package/dist/tools/verification.d.ts.map +1 -0
  151. package/dist/tools/verification.js +215 -0
  152. package/dist/tools/verification.js.map +1 -0
  153. package/dist/tools/verify-deep.d.ts +3 -0
  154. package/dist/tools/verify-deep.d.ts.map +1 -0
  155. package/dist/tools/verify-deep.js +125 -0
  156. package/dist/tools/verify-deep.js.map +1 -0
  157. package/dist/types.d.ts +16 -3
  158. package/dist/types.d.ts.map +1 -1
  159. package/dist/types.js +4 -23
  160. package/dist/types.js.map +1 -1
  161. package/dist/utils.d.ts +2 -3
  162. package/dist/utils.d.ts.map +1 -1
  163. package/dist/utils.js +8 -34
  164. package/dist/utils.js.map +1 -1
  165. package/package.json +3 -1
@@ -0,0 +1,233 @@
1
+ /**
2
+ * COVENANT MCP — Smart Worker Matching
3
+ *
4
+ * corven_match_agents — Multi-factor scoring to find the best agents for a task.
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 { formatStructuredError, parseContractError } from "../lib/formatResponse.js";
12
+ const ABI = loadAbi("AgentRegistry");
13
+ // Scoring weights
14
+ const W_CAPABILITY = 0.30;
15
+ const W_SUCCESS_RATE = 0.20;
16
+ const W_PRICE = 0.15;
17
+ const W_REPUTATION = 0.55;
18
+ // Max reputation value on-chain
19
+ const MAX_REPUTATION = 1000;
20
+ // Input validation
21
+ const matchAgentsSchema = z.object({
22
+ capabilities: z
23
+ .array(z.string().min(1).max(50))
24
+ .min(1, "At least one capability is required")
25
+ .max(10, "Maximum 10 capabilities"),
26
+ min_reputation: z
27
+ .number()
28
+ .int()
29
+ .min(0)
30
+ .max(1000)
31
+ .optional(),
32
+ limit: z
33
+ .number()
34
+ .int()
35
+ .min(1)
36
+ .max(50)
37
+ .optional()
38
+ .default(5),
39
+ });
40
+ /**
41
+ * Compute the capability match ratio: how many of the required caps the agent has.
42
+ */
43
+ function capabilityMatchScore(agentCaps, requiredCaps) {
44
+ if (requiredCaps.length === 0)
45
+ return 1;
46
+ const agentSet = new Set(agentCaps.map((c) => c.toLowerCase()));
47
+ const matched = requiredCaps.filter((c) => agentSet.has(c.toLowerCase()));
48
+ return matched.length / requiredCaps.length;
49
+ }
50
+ /**
51
+ * Compute success rate: completed / (completed + failed), clamped to 0-1.
52
+ */
53
+ function successRateScore(completed, failed) {
54
+ const total = completed + failed;
55
+ if (total === 0)
56
+ return 0.5; // no history => neutral
57
+ return completed / total;
58
+ }
59
+ /**
60
+ * Compute price competitiveness using stake as a proxy.
61
+ * Higher stake => agent has more skin in the game => more competitive.
62
+ * Normalized against the max stake found in the candidate pool.
63
+ */
64
+ function priceCompetitivenessScore(stakeWei, maxStakeWei) {
65
+ if (maxStakeWei === 0n)
66
+ return 0.5;
67
+ return Number((stakeWei * 10000n) / maxStakeWei) / 10000;
68
+ }
69
+ /**
70
+ * Normalize reputation to 0-1.
71
+ */
72
+ function reputationScore(reputation) {
73
+ return Math.min(reputation / MAX_REPUTATION, 1);
74
+ }
75
+ export function registerMatchingTools(server) {
76
+ // ──────────────────────────────────────────────────────────────
77
+ // corven_match_agents
78
+ // ──────────────────────────────────────────────────────────────
79
+ server.registerTool("corven_match_agents", {
80
+ title: "Match Agents to Task",
81
+ description: "Finds the best agents for a task using multi-factor scoring across capability match, " +
82
+ "success rate, price competitiveness (stake proxy), and reputation.\n" +
83
+ "USE WHEN: You need to pick the optimal worker for a task. After corven_find_workers " +
84
+ "to get a ranked shortlist. Before corven_create_task or corven_post_open_task.\n" +
85
+ "REQUIRES: Nothing. Free read-only call. No gas cost.\n" +
86
+ "RETURNS: Sorted list of agents with composite scores and per-factor breakdowns.\n" +
87
+ "SCORING: capability_match(30%) + success_rate(20%) + price_competitiveness(15%) + reputation(55%).",
88
+ inputSchema: {
89
+ capabilities: z
90
+ .array(z.string())
91
+ .describe("Required capability tags, e.g. [\"data-analysis\", \"python\"]. " +
92
+ "Agents matching more capabilities score higher."),
93
+ min_reputation: z
94
+ .number()
95
+ .int()
96
+ .min(0)
97
+ .max(1000)
98
+ .optional()
99
+ .describe("Minimum reputation filter (0-1000). Agents below this are excluded. " +
100
+ "Default: no filter."),
101
+ limit: z
102
+ .number()
103
+ .int()
104
+ .min(1)
105
+ .max(50)
106
+ .optional()
107
+ .describe("Max results to return (1-50, default 5)."),
108
+ },
109
+ }, async ({ capabilities, min_reputation, limit }) => {
110
+ try {
111
+ // Validate input
112
+ const parsed = matchAgentsSchema.safeParse({
113
+ capabilities,
114
+ min_reputation,
115
+ limit,
116
+ });
117
+ if (!parsed.success) {
118
+ return formatStructuredError("Invalid input parameters.", parsed.error.issues.map((e) => e.message).join("; "), "Provide capabilities as a non-empty string array, min_reputation as 0-1000, limit as 1-50.", true);
119
+ }
120
+ const { capabilities: reqCaps, min_reputation: minRep, limit: maxResults } = parsed.data;
121
+ // Fetch all agent addresses
122
+ const addresses = (await readContract(CONTRACTS.AgentRegistry, ABI, "getAgentsPaginated", [0, 100]));
123
+ if (!addresses || addresses.length === 0) {
124
+ return formatReadResult({ count: 0, matches: [], query: { capabilities: reqCaps, min_reputation: minRep, limit: maxResults } }, "No agents registered on the protocol.");
125
+ }
126
+ // Fetch all agent profiles in parallel
127
+ const profiles = await Promise.all(addresses.map(async (addr) => {
128
+ try {
129
+ const agent = (await readContract(CONTRACTS.AgentRegistry, ABI, "getAgent", [addr]));
130
+ return { address: addr, ...agent };
131
+ }
132
+ catch {
133
+ return null; // skip agents that fail to load
134
+ }
135
+ }));
136
+ // Filter: must be active and meet min reputation
137
+ const candidates = profiles.filter((a) => {
138
+ if (!a)
139
+ return false;
140
+ const active = a.isActive === 1 || a.isActive === true;
141
+ if (!active)
142
+ return false;
143
+ if (minRep !== undefined && Number(a.reputation) < minRep)
144
+ return false;
145
+ return true;
146
+ });
147
+ if (candidates.length === 0) {
148
+ return formatReadResult({
149
+ count: 0,
150
+ matches: [],
151
+ query: { capabilities: reqCaps, min_reputation: minRep, limit: maxResults },
152
+ }, "No agents match the specified filters.");
153
+ }
154
+ // Find max stake for normalization
155
+ let maxStake = 0n;
156
+ for (const a of candidates) {
157
+ const s = BigInt(a.stakedAmount ?? 0);
158
+ if (s > maxStake)
159
+ maxStake = s;
160
+ }
161
+ // Score each candidate
162
+ const scored = candidates.map((a) => {
163
+ const caps = a.capabilities ?? [];
164
+ const completed = Number(a.tasksCompleted ?? 0);
165
+ const failed = Number(a.tasksFailed ?? 0);
166
+ const stake = BigInt(a.stakedAmount ?? 0);
167
+ const rep = Number(a.reputation ?? 0);
168
+ const capScore = capabilityMatchScore(caps, reqCaps);
169
+ const srScore = successRateScore(completed, failed);
170
+ const priceScore = priceCompetitivenessScore(stake, maxStake);
171
+ const repScore = reputationScore(rep);
172
+ const total = capScore * W_CAPABILITY +
173
+ srScore * W_SUCCESS_RATE +
174
+ priceScore * W_PRICE +
175
+ repScore * W_REPUTATION;
176
+ return {
177
+ address: a.address ?? a.wallet,
178
+ name: a.name ?? "Unknown",
179
+ reputation: rep,
180
+ capabilities: caps,
181
+ tasksCompleted: completed,
182
+ tasksFailed: failed,
183
+ stakedAmountWei: stake.toString(),
184
+ stakedAmountEth: (() => {
185
+ try {
186
+ return formatEther(stake);
187
+ }
188
+ catch {
189
+ return "0";
190
+ }
191
+ })(),
192
+ isActive: true,
193
+ score: Math.round(total * 10000) / 10000,
194
+ scoreBreakdown: {
195
+ capabilityMatch: Math.round(capScore * 10000) / 10000,
196
+ successRate: Math.round(srScore * 10000) / 10000,
197
+ priceCompetitiveness: Math.round(priceScore * 10000) / 10000,
198
+ reputation: Math.round(repScore * 10000) / 10000,
199
+ },
200
+ };
201
+ });
202
+ // Sort by score descending, then by reputation as tiebreaker
203
+ scored.sort((a, b) => {
204
+ if (b.score !== a.score)
205
+ return b.score - a.score;
206
+ return b.reputation - a.reputation;
207
+ });
208
+ // Apply limit
209
+ const top = scored.slice(0, maxResults);
210
+ return formatReadResult({
211
+ count: top.length,
212
+ totalCandidates: candidates.length,
213
+ query: {
214
+ capabilities: reqCaps,
215
+ min_reputation: minRep ?? null,
216
+ limit: maxResults,
217
+ },
218
+ weights: {
219
+ capabilityMatch: W_CAPABILITY,
220
+ successRate: W_SUCCESS_RATE,
221
+ priceCompetitiveness: W_PRICE,
222
+ reputation: W_REPUTATION,
223
+ },
224
+ matches: top,
225
+ }, `Top ${top.length} agent matches for [${reqCaps.join(", ")}]`);
226
+ }
227
+ catch (e) {
228
+ const parsed = parseContractError(e);
229
+ return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
230
+ }
231
+ });
232
+ }
233
+ //# sourceMappingURL=matching.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matching.js","sourceRoot":"","sources":["../../src/tools/matching.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 registerMessagingTools(server: McpServer): void;
3
+ //# sourceMappingURL=messaging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messaging.d.ts","sourceRoot":"","sources":["../../src/tools/messaging.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkCzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsL9D"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Agent Messaging MCP Tools
3
+ *
4
+ * send_message — Send a message to the other party in a task (client <-> worker)
5
+ * get_messages — Get messages for a task
6
+ * get_unread_count — Get count of unread messages for the current account
7
+ *
8
+ * MVP: in-memory store, no on-chain contract required.
9
+ */
10
+ import { z } from "zod";
11
+ import { getAccount } from "../config.js";
12
+ import { formatReadResult } from "../handlers/transactions.js";
13
+ import { formatStructuredError, parseContractError } from "../lib/formatResponse.js";
14
+ import { loadStore, saveStore } from "../lib/store.js";
15
+ import { ethAddress, taskId as taskIdSchema } from "../lib/schemaHelpers.js";
16
+ const messageData = loadStore("messaging", { counter: 0, items: {} });
17
+ let messageIdCounter = messageData.counter;
18
+ const messageStore = new Map(Object.entries(messageData.items).map(([k, v]) => [Number(k), v]));
19
+ function persistMessages() {
20
+ const items = {};
21
+ messageStore.forEach((v, k) => { items[k] = v; });
22
+ saveStore("messaging", { counter: messageIdCounter, items });
23
+ }
24
+ // ─── Registration ─────────────────────────────────────────────
25
+ export function registerMessagingTools(server) {
26
+ // ──────────────────────────────────────────────────────────────
27
+ // corven_send_message
28
+ // ──────────────────────────────────────────────────────────────
29
+ server.registerTool("corven_send_message", {
30
+ title: "Send Message",
31
+ description: "Send a message to the other party in a task (client <-> worker).\n" +
32
+ "USE WHEN: You need to coordinate with your task counterpart — ask questions, share updates, or negotiate.\n" +
33
+ "REQUIRES: You must be either the client or worker on the task. PRIVATE_KEY must be set.\n" +
34
+ "RETURNS: Message ID, sender, recipient, timestamp, content preview.\n" +
35
+ "COMES AFTER: A task has been created (corven_create_task or corven_post_open_task).\n" +
36
+ "NOTE: Messages are stored in-memory for the MCP session lifetime. Use corven_get_messages to retrieve.",
37
+ inputSchema: {
38
+ taskId: taskIdSchema,
39
+ to: ethAddress,
40
+ content: z.string().min(1).max(10000).describe("Message content (max 10,000 characters)"),
41
+ },
42
+ }, async ({ taskId, to, content }) => {
43
+ try {
44
+ const account = getAccount();
45
+ if (!account) {
46
+ return formatStructuredError("No private key configured.", "PRIVATE_KEY environment variable is not set.", "Set PRIVATE_KEY in your .env file.", false);
47
+ }
48
+ const sender = typeof account === "string" ? account : account.address;
49
+ const id = `msg_${++messageIdCounter}_${Date.now()}`;
50
+ const timestamp = Math.floor(Date.now() / 1000);
51
+ const message = {
52
+ id,
53
+ taskId,
54
+ from: sender.toLowerCase(),
55
+ to: to.toLowerCase(),
56
+ content,
57
+ timestamp,
58
+ read: false,
59
+ };
60
+ const existing = messageStore.get(taskId) ?? [];
61
+ existing.push(message);
62
+ messageStore.set(taskId, existing);
63
+ persistMessages();
64
+ return formatReadResult({
65
+ messageId: id,
66
+ taskId,
67
+ from: sender,
68
+ to,
69
+ timestamp,
70
+ contentPreview: content.length > 100 ? content.slice(0, 100) + "..." : content,
71
+ }, `Message sent on Task #${taskId}`);
72
+ }
73
+ catch (e) {
74
+ const parsed = parseContractError(e);
75
+ return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
76
+ }
77
+ });
78
+ // ──────────────────────────────────────────────────────────────
79
+ // corven_get_messages
80
+ // ──────────────────────────────────────────────────────────────
81
+ server.registerTool("corven_get_messages", {
82
+ title: "Get Messages",
83
+ description: "Retrieve messages for a task, optionally filtered by timestamp.\n" +
84
+ "USE WHEN: Checking for new messages from your task counterpart. Reviewing conversation history.\n" +
85
+ "REQUIRES: Nothing. Free read-only call.\n" +
86
+ "RETURNS: Array of messages with sender, recipient, content, timestamp, read status.\n" +
87
+ "NOTE: Returned messages are automatically marked as read for the current account.",
88
+ inputSchema: {
89
+ taskId: taskIdSchema,
90
+ since: z.number().optional().describe("Optional Unix timestamp — only return messages after this time"),
91
+ limit: z.number().optional().default(50).describe("Max messages to return (default 50)"),
92
+ },
93
+ }, async ({ taskId, since, limit }) => {
94
+ try {
95
+ const account = getAccount();
96
+ if (!account) {
97
+ return formatStructuredError("No private key configured.", "PRIVATE_KEY environment variable is not set.", "Set PRIVATE_KEY in your .env file.", false);
98
+ }
99
+ const viewer = (typeof account === "string" ? account : account.address).toLowerCase();
100
+ let messages = messageStore.get(taskId) ?? [];
101
+ if (since !== undefined) {
102
+ messages = messages.filter((m) => m.timestamp > since);
103
+ }
104
+ // Sort newest first and apply limit
105
+ messages = [...messages].sort((a, b) => b.timestamp - a.timestamp).slice(0, limit);
106
+ // Mark messages addressed to the viewer as read
107
+ for (const msg of messages) {
108
+ if (msg.to === viewer && !msg.read) {
109
+ msg.read = true;
110
+ }
111
+ }
112
+ return formatReadResult({
113
+ taskId,
114
+ messageCount: messages.length,
115
+ messages: messages.map((m) => ({
116
+ id: m.id,
117
+ from: m.from,
118
+ to: m.to,
119
+ content: m.content,
120
+ timestamp: m.timestamp,
121
+ read: m.read,
122
+ })),
123
+ }, `Messages for Task #${taskId}`);
124
+ }
125
+ catch (e) {
126
+ const parsed = parseContractError(e);
127
+ return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
128
+ }
129
+ });
130
+ // ──────────────────────────────────────────────────────────────
131
+ // corven_get_unread_count
132
+ // ──────────────────────────────────────────────────────────────
133
+ server.registerTool("corven_get_unread_count", {
134
+ title: "Get Unread Count",
135
+ description: "Get the count of unread messages for the current account on a task.\n" +
136
+ "USE WHEN: Polling for new messages. Checking if you have pending communications.\n" +
137
+ "REQUIRES: PRIVATE_KEY must be set.\n" +
138
+ "RETURNS: Task ID, unread count for the current account.",
139
+ inputSchema: {
140
+ taskId: taskIdSchema,
141
+ },
142
+ }, async ({ taskId }) => {
143
+ try {
144
+ const account = getAccount();
145
+ if (!account) {
146
+ return formatStructuredError("No private key configured.", "PRIVATE_KEY environment variable is not set.", "Set PRIVATE_KEY in your .env file.", false);
147
+ }
148
+ const viewer = (typeof account === "string" ? account : account.address).toLowerCase();
149
+ const messages = messageStore.get(taskId) ?? [];
150
+ const unread = messages.filter((m) => m.to === viewer && !m.read).length;
151
+ return formatReadResult({ taskId, unreadCount: unread }, `Unread messages for Task #${taskId}`);
152
+ }
153
+ catch (e) {
154
+ const parsed = parseContractError(e);
155
+ return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
156
+ }
157
+ });
158
+ }
159
+ //# sourceMappingURL=messaging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messaging.js","sourceRoot":"","sources":["../../src/tools/messaging.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAe,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAqB7E,MAAM,WAAW,GAAG,SAAS,CAAmB,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;AACxF,IAAI,gBAAgB,GAAG,WAAW,CAAC,OAAO,CAAC;AAC3C,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAClE,CAAC;AAEF,SAAS,eAAe;IACtB,MAAM,KAAK,GAA8B,EAAE,CAAC;IAC5C,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,SAAS,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,iEAAiE;AAEjE,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,iEAAiE;IACjE,sBAAsB;IACtB,iEAAiE;IACjE,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,oEAAoE;YACpE,6GAA6G;YAC7G,2FAA2F;YAC3F,uEAAuE;YACvE,uFAAuF;YACvF,wGAAwG;QAC1G,WAAW,EAAE;YACX,MAAM,EAAE,YAAY;YACpB,EAAE,EAAE,UAAU;YACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC;SAC1F;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,qBAAqB,CAC1B,4BAA4B,EAC5B,8CAA8C,EAC9C,oCAAoC,EACpC,KAAK,CACN,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;YACvE,MAAM,EAAE,GAAG,OAAO,EAAE,gBAAgB,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACrD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAEhD,MAAM,OAAO,GAAY;gBACvB,EAAE;gBACF,MAAM;gBACN,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE;gBAC1B,EAAE,EAAE,EAAE,CAAC,WAAW,EAAE;gBACpB,OAAO;gBACP,SAAS;gBACT,IAAI,EAAE,KAAK;aACZ,CAAC;YAEF,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAChD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACnC,eAAe,EAAE,CAAC;YAElB,OAAO,gBAAgB,CACrB;gBACE,SAAS,EAAE,EAAE;gBACb,MAAM;gBACN,IAAI,EAAE,MAAM;gBACZ,EAAE;gBACF,SAAS;gBACT,cAAc,EAAE,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO;aAC/E,EACD,yBAAyB,MAAM,EAAE,CAClC,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACzF,CAAC;IACH,CAAC,CACF,CAAC;IAEF,iEAAiE;IACjE,sBAAsB;IACtB,iEAAiE;IACjE,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,mEAAmE;YACnE,mGAAmG;YACnG,2CAA2C;YAC3C,uFAAuF;YACvF,mFAAmF;QACrF,WAAW,EAAE;YACX,MAAM,EAAE,YAAY;YACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;YACvG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,qCAAqC,CAAC;SACzF;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,qBAAqB,CAC1B,4BAA4B,EAC5B,8CAA8C,EAC9C,oCAAoC,EACpC,KAAK,CACN,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YACvF,IAAI,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAE9C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC;YACzD,CAAC;YAED,oCAAoC;YACpC,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAEnF,gDAAgD;YAChD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,IAAI,GAAG,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;oBACnC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,OAAO,gBAAgB,CACrB;gBACE,MAAM;gBACN,YAAY,EAAE,QAAQ,CAAC,MAAM;gBAC7B,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC7B,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,IAAI,EAAE,CAAC,CAAC,IAAI;iBACb,CAAC,CAAC;aACJ,EACD,sBAAsB,MAAM,EAAE,CAC/B,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACzF,CAAC;IACH,CAAC,CACF,CAAC;IAEF,iEAAiE;IACjE,0BAA0B;IAC1B,iEAAiE;IACjE,MAAM,CAAC,YAAY,CACjB,yBAAyB,EACzB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,uEAAuE;YACvE,oFAAoF;YACpF,sCAAsC;YACtC,yDAAyD;QAC3D,WAAW,EAAE;YACX,MAAM,EAAE,YAAY;SACrB;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,qBAAqB,CAC1B,4BAA4B,EAC5B,8CAA8C,EAC9C,oCAAoC,EACpC,KAAK,CACN,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YACvF,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YAEzE,OAAO,gBAAgB,CACrB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAC/B,6BAA6B,MAAM,EAAE,CACtC,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACzF,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerMultiTokenTools(server: McpServer): void;
3
+ //# sourceMappingURL=multi-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-token.d.ts","sourceRoot":"","sources":["../../src/tools/multi-token.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0CzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsT/D"}