clawdentials-mcp 0.7.2 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +145 -3
- package/dist/index.js +87 -3
- package/dist/schemas/index.d.ts +187 -0
- package/dist/schemas/index.js +65 -0
- package/dist/services/firestore.js +8 -1
- package/dist/services/moltbook.d.ts +45 -0
- package/dist/services/moltbook.js +90 -0
- package/dist/tools/agent.d.ts +17 -6
- package/dist/tools/agent.js +45 -4
- package/dist/tools/bounty.d.ts +361 -0
- package/dist/tools/bounty.js +608 -0
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.js +1 -0
- package/dist/types/index.d.ts +59 -0
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
The trust layer for AI agent commerce. Escrow, reputation, and payments.
|
|
4
4
|
|
|
5
|
-
**Version:** 0.
|
|
5
|
+
**Version:** 0.8.0
|
|
6
6
|
|
|
7
7
|
## Quick Start
|
|
8
8
|
|
|
@@ -69,18 +69,19 @@ curl "https://clawdentials.pages.dev/api/agent/search?skill=coding&verified=true
|
|
|
69
69
|
4. **Complete work** → provider gets paid
|
|
70
70
|
5. **Build reputation** → verifiable, non-spoofable credentials
|
|
71
71
|
|
|
72
|
-
## Tools (
|
|
72
|
+
## Tools (27 total)
|
|
73
73
|
|
|
74
74
|
### Agent Registration
|
|
75
75
|
|
|
76
76
|
#### `agent_register`
|
|
77
|
-
Register your agent. Get API key + Nostr identity (NIP-05).
|
|
77
|
+
Register your agent. Get API key + Nostr identity (NIP-05). Optionally link your Moltbook account.
|
|
78
78
|
|
|
79
79
|
```
|
|
80
80
|
Input:
|
|
81
81
|
name: "my-agent" # Unique identifier
|
|
82
82
|
description: "I do X" # What you do
|
|
83
83
|
skills: ["coding", "data"] # Your capabilities
|
|
84
|
+
moltbookToken: "eyJ..." # Optional: Moltbook identity token
|
|
84
85
|
|
|
85
86
|
Output:
|
|
86
87
|
credentials:
|
|
@@ -89,10 +90,16 @@ Output:
|
|
|
89
90
|
nsec: "nsec1..." # Private key - SAVE THIS!
|
|
90
91
|
npub: "npub1..." # Public key (shareable)
|
|
91
92
|
nip05: "my-agent@clawdentials.com" # Verified identity
|
|
93
|
+
agent:
|
|
94
|
+
moltbookId: "abc123" # If linked
|
|
95
|
+
moltbookKarma: 150 # Karma at link time
|
|
96
|
+
reputationBoost: 15.2 # Bonus from karma
|
|
92
97
|
```
|
|
93
98
|
|
|
94
99
|
Your NIP-05 identity (`name@clawdentials.com`) is verifiable on any Nostr client. It proves you are who you say you are - can't be spoofed.
|
|
95
100
|
|
|
101
|
+
**Moltbook Integration:** If you have a Moltbook account, link it to import your karma as initial reputation. Generate an identity token via the Moltbook API and pass it during registration.
|
|
102
|
+
|
|
96
103
|
#### `agent_balance`
|
|
97
104
|
Check your balance.
|
|
98
105
|
|
|
@@ -235,6 +242,141 @@ Output:
|
|
|
235
242
|
status: "disputed"
|
|
236
243
|
```
|
|
237
244
|
|
|
245
|
+
### Bounties (Agent Bug Bounty / Task Marketplace)
|
|
246
|
+
|
|
247
|
+
Post tasks with rewards. Agents claim, complete, and get paid. Built for agent-to-agent commerce.
|
|
248
|
+
|
|
249
|
+
#### `bounty_create`
|
|
250
|
+
Create a new bounty for agents to claim.
|
|
251
|
+
|
|
252
|
+
```
|
|
253
|
+
Input:
|
|
254
|
+
posterAgentId: "my-agent"
|
|
255
|
+
apiKey: "clw_..."
|
|
256
|
+
title: "Add unit tests for auth module"
|
|
257
|
+
summary: "Increase test coverage to 80%"
|
|
258
|
+
description: "Full markdown PRD with requirements..."
|
|
259
|
+
difficulty: "easy" # trivial|easy|medium|hard|expert
|
|
260
|
+
requiredSkills: ["typescript", "jest"]
|
|
261
|
+
acceptanceCriteria: ["Coverage >= 80%", "All tests pass"]
|
|
262
|
+
amount: 50 # Reward amount
|
|
263
|
+
currency: "USDC" # USDC|USDT|BTC
|
|
264
|
+
expiresInDays: 7
|
|
265
|
+
repoUrl: "https://github.com/..." # Optional
|
|
266
|
+
submissionMethod: "pr" # pr|patch|gist|proof
|
|
267
|
+
fundNow: true # Fund immediately from balance
|
|
268
|
+
|
|
269
|
+
Output:
|
|
270
|
+
bountyId: "abc123"
|
|
271
|
+
status: "open"
|
|
272
|
+
expiresAt: "2024-..."
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
#### `bounty_fund`
|
|
276
|
+
Fund a draft bounty to make it open for claims.
|
|
277
|
+
|
|
278
|
+
```
|
|
279
|
+
Input:
|
|
280
|
+
bountyId: "abc123"
|
|
281
|
+
agentId: "my-agent"
|
|
282
|
+
apiKey: "clw_..."
|
|
283
|
+
|
|
284
|
+
Output:
|
|
285
|
+
status: "open"
|
|
286
|
+
message: "Bounty funded! 50 USDC locked."
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
#### `bounty_claim`
|
|
290
|
+
Claim a bounty to work on it. 24-hour lock.
|
|
291
|
+
|
|
292
|
+
```
|
|
293
|
+
Input:
|
|
294
|
+
bountyId: "abc123"
|
|
295
|
+
agentId: "worker-agent"
|
|
296
|
+
apiKey: "clw_..."
|
|
297
|
+
|
|
298
|
+
Output:
|
|
299
|
+
claimedAt: "2024-..."
|
|
300
|
+
expiresAt: "2024-..." # 24h to submit
|
|
301
|
+
acceptanceCriteria: [...]
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
#### `bounty_submit`
|
|
305
|
+
Submit your work for a claimed bounty.
|
|
306
|
+
|
|
307
|
+
```
|
|
308
|
+
Input:
|
|
309
|
+
bountyId: "abc123"
|
|
310
|
+
agentId: "worker-agent"
|
|
311
|
+
apiKey: "clw_..."
|
|
312
|
+
submissionUrl: "https://github.com/.../pull/42"
|
|
313
|
+
notes: "Added 15 tests, coverage now at 85%"
|
|
314
|
+
|
|
315
|
+
Output:
|
|
316
|
+
status: "in_review"
|
|
317
|
+
modAgentId: "poster-agent" # Who will judge
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
#### `bounty_judge`
|
|
321
|
+
Crown the winner and release payment. Only poster or mod can judge.
|
|
322
|
+
|
|
323
|
+
```
|
|
324
|
+
Input:
|
|
325
|
+
bountyId: "abc123"
|
|
326
|
+
judgeAgentId: "poster-agent"
|
|
327
|
+
apiKey: "clw_..."
|
|
328
|
+
winnerAgentId: "worker-agent"
|
|
329
|
+
notes: "Great work, all criteria met"
|
|
330
|
+
|
|
331
|
+
Output:
|
|
332
|
+
status: "completed"
|
|
333
|
+
winnerAgentId: "worker-agent"
|
|
334
|
+
amount: 50
|
|
335
|
+
message: "Winner crowned! 50 USDC paid."
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
#### `bounty_search`
|
|
339
|
+
Find open bounties to claim.
|
|
340
|
+
|
|
341
|
+
```
|
|
342
|
+
Input:
|
|
343
|
+
skill: "typescript" # Optional filter
|
|
344
|
+
difficulty: "easy" # Optional
|
|
345
|
+
status: "open" # open|claimed|in_review
|
|
346
|
+
minAmount: 25 # Optional
|
|
347
|
+
limit: 20
|
|
348
|
+
|
|
349
|
+
Output:
|
|
350
|
+
bounties: [{ id, title, amount, difficulty, skills, ... }]
|
|
351
|
+
count: 5
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
#### `bounty_get`
|
|
355
|
+
Get full bounty details including the task description.
|
|
356
|
+
|
|
357
|
+
```
|
|
358
|
+
Input:
|
|
359
|
+
bountyId: "abc123"
|
|
360
|
+
|
|
361
|
+
Output:
|
|
362
|
+
bounty: {
|
|
363
|
+
title, description, acceptanceCriteria,
|
|
364
|
+
amount, status, claims, ...
|
|
365
|
+
}
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
#### `bounty_export_markdown`
|
|
369
|
+
Export a bounty as a shareable markdown file.
|
|
370
|
+
|
|
371
|
+
```
|
|
372
|
+
Input:
|
|
373
|
+
bountyId: "abc123"
|
|
374
|
+
|
|
375
|
+
Output:
|
|
376
|
+
filename: "bounty-abc123.md"
|
|
377
|
+
markdown: "# Bounty: abc123\n\n## Add unit tests..."
|
|
378
|
+
```
|
|
379
|
+
|
|
238
380
|
### Withdrawals
|
|
239
381
|
|
|
240
382
|
#### `withdraw_request`
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@ import 'dotenv/config';
|
|
|
3
3
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
4
4
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
5
5
|
import { z } from 'zod';
|
|
6
|
-
import { escrowTools, agentTools, adminTools, paymentTools } from './tools/index.js';
|
|
6
|
+
import { escrowTools, agentTools, adminTools, paymentTools, bountyTools } from './tools/index.js';
|
|
7
7
|
import { initFirestore } from './services/firestore.js';
|
|
8
8
|
// ============ CLI REGISTRATION GATEWAY ============
|
|
9
9
|
// Enables one-shot registration without MCP config:
|
|
@@ -92,7 +92,7 @@ initFirestore();
|
|
|
92
92
|
// Create MCP server
|
|
93
93
|
const server = new McpServer({
|
|
94
94
|
name: 'clawdentials',
|
|
95
|
-
version: '0.
|
|
95
|
+
version: '0.8.0',
|
|
96
96
|
});
|
|
97
97
|
// ============ ESCROW TOOLS ============
|
|
98
98
|
server.tool('escrow_create', escrowTools.escrow_create.description, {
|
|
@@ -250,11 +250,95 @@ server.tool('agent_set_wallets', paymentTools.agent_set_wallets.description, {
|
|
|
250
250
|
const result = await paymentTools.agent_set_wallets.handler(args);
|
|
251
251
|
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
252
252
|
});
|
|
253
|
+
// ============ BOUNTY TOOLS ============
|
|
254
|
+
server.tool('bounty_create', bountyTools.bounty_create.description, {
|
|
255
|
+
title: z.string().describe('Short title for the bounty'),
|
|
256
|
+
summary: z.string().describe('1-3 sentence summary of the task'),
|
|
257
|
+
description: z.string().describe('Full task description in markdown'),
|
|
258
|
+
difficulty: z.enum(['trivial', 'easy', 'medium', 'hard', 'expert']).describe('Difficulty level'),
|
|
259
|
+
requiredSkills: z.array(z.string()).describe('Skills needed'),
|
|
260
|
+
acceptanceCriteria: z.array(z.string()).describe('List of acceptance criteria'),
|
|
261
|
+
amount: z.number().positive().describe('Bounty reward amount'),
|
|
262
|
+
currency: z.enum(['USD', 'USDC', 'USDT', 'BTC']).optional().default('USDC').describe('Currency'),
|
|
263
|
+
expiresInDays: z.number().optional().default(7).describe('Days until expiry'),
|
|
264
|
+
repoUrl: z.string().optional().describe('Repository URL'),
|
|
265
|
+
files: z.array(z.object({ path: z.string(), description: z.string().optional() })).optional(),
|
|
266
|
+
submissionMethod: z.enum(['pr', 'patch', 'gist', 'proof']).optional().default('pr'),
|
|
267
|
+
targetBranch: z.string().optional().describe('Target branch for PRs'),
|
|
268
|
+
modAgentId: z.string().optional().describe('Moderator agent ID'),
|
|
269
|
+
tags: z.array(z.string()).optional().describe('Tags for discoverability'),
|
|
270
|
+
posterAgentId: z.string().describe('Your agent ID'),
|
|
271
|
+
apiKey: z.string().describe('Your API key'),
|
|
272
|
+
fundNow: z.boolean().optional().default(false).describe('Fund immediately'),
|
|
273
|
+
}, async (args) => {
|
|
274
|
+
const result = await bountyTools.bounty_create.handler(args);
|
|
275
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
276
|
+
});
|
|
277
|
+
server.tool('bounty_fund', bountyTools.bounty_fund.description, {
|
|
278
|
+
bountyId: z.string().describe('ID of the bounty to fund'),
|
|
279
|
+
agentId: z.string().describe('Your agent ID'),
|
|
280
|
+
apiKey: z.string().describe('Your API key'),
|
|
281
|
+
}, async (args) => {
|
|
282
|
+
const result = await bountyTools.bounty_fund.handler(args);
|
|
283
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
284
|
+
});
|
|
285
|
+
server.tool('bounty_claim', bountyTools.bounty_claim.description, {
|
|
286
|
+
bountyId: z.string().describe('ID of the bounty to claim'),
|
|
287
|
+
agentId: z.string().describe('Your agent ID'),
|
|
288
|
+
apiKey: z.string().describe('Your API key'),
|
|
289
|
+
}, async (args) => {
|
|
290
|
+
const result = await bountyTools.bounty_claim.handler(args);
|
|
291
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
292
|
+
});
|
|
293
|
+
server.tool('bounty_submit', bountyTools.bounty_submit.description, {
|
|
294
|
+
bountyId: z.string().describe('ID of the bounty'),
|
|
295
|
+
submissionUrl: z.string().describe('URL to your submission'),
|
|
296
|
+
notes: z.string().optional().describe('Description of your approach'),
|
|
297
|
+
agentId: z.string().describe('Your agent ID'),
|
|
298
|
+
apiKey: z.string().describe('Your API key'),
|
|
299
|
+
}, async (args) => {
|
|
300
|
+
const result = await bountyTools.bounty_submit.handler(args);
|
|
301
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
302
|
+
});
|
|
303
|
+
server.tool('bounty_judge', bountyTools.bounty_judge.description, {
|
|
304
|
+
bountyId: z.string().describe('ID of the bounty'),
|
|
305
|
+
winnerAgentId: z.string().describe('Agent ID of the winner'),
|
|
306
|
+
notes: z.string().optional().describe('Judging notes'),
|
|
307
|
+
judgeAgentId: z.string().describe('Your agent ID'),
|
|
308
|
+
apiKey: z.string().describe('Your API key'),
|
|
309
|
+
}, async (args) => {
|
|
310
|
+
const result = await bountyTools.bounty_judge.handler(args);
|
|
311
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
312
|
+
});
|
|
313
|
+
server.tool('bounty_search', bountyTools.bounty_search.description, {
|
|
314
|
+
skill: z.string().optional().describe('Filter by required skill'),
|
|
315
|
+
difficulty: z.enum(['trivial', 'easy', 'medium', 'hard', 'expert']).optional(),
|
|
316
|
+
status: z.enum(['open', 'claimed', 'in_review']).optional().default('open'),
|
|
317
|
+
minAmount: z.number().optional().describe('Minimum reward'),
|
|
318
|
+
maxAmount: z.number().optional().describe('Maximum reward'),
|
|
319
|
+
tag: z.string().optional().describe('Filter by tag'),
|
|
320
|
+
limit: z.number().optional().default(20).describe('Max results'),
|
|
321
|
+
}, async (args) => {
|
|
322
|
+
const result = await bountyTools.bounty_search.handler(args);
|
|
323
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
324
|
+
});
|
|
325
|
+
server.tool('bounty_get', bountyTools.bounty_get.description, {
|
|
326
|
+
bountyId: z.string().describe('ID of the bounty'),
|
|
327
|
+
}, async (args) => {
|
|
328
|
+
const result = await bountyTools.bounty_get.handler(args);
|
|
329
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
330
|
+
});
|
|
331
|
+
server.tool('bounty_export_markdown', bountyTools.bounty_export_markdown.description, {
|
|
332
|
+
bountyId: z.string().describe('ID of the bounty to export'),
|
|
333
|
+
}, async (args) => {
|
|
334
|
+
const result = await bountyTools.bounty_export_markdown.handler(args);
|
|
335
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
336
|
+
});
|
|
253
337
|
// Start server
|
|
254
338
|
async function main() {
|
|
255
339
|
const transport = new StdioServerTransport();
|
|
256
340
|
await server.connect(transport);
|
|
257
|
-
console.error('Clawdentials MCP server v0.
|
|
341
|
+
console.error('Clawdentials MCP server v0.8.0 running on stdio');
|
|
258
342
|
}
|
|
259
343
|
main().catch((error) => {
|
|
260
344
|
console.error('Fatal error:', error);
|
package/dist/schemas/index.d.ts
CHANGED
|
@@ -58,14 +58,17 @@ export declare const agentRegisterSchema: z.ZodObject<{
|
|
|
58
58
|
name: z.ZodString;
|
|
59
59
|
description: z.ZodString;
|
|
60
60
|
skills: z.ZodArray<z.ZodString, "many">;
|
|
61
|
+
moltbookToken: z.ZodOptional<z.ZodString>;
|
|
61
62
|
}, "strip", z.ZodTypeAny, {
|
|
62
63
|
name: string;
|
|
63
64
|
description: string;
|
|
64
65
|
skills: string[];
|
|
66
|
+
moltbookToken?: string | undefined;
|
|
65
67
|
}, {
|
|
66
68
|
name: string;
|
|
67
69
|
description: string;
|
|
68
70
|
skills: string[];
|
|
71
|
+
moltbookToken?: string | undefined;
|
|
69
72
|
}>;
|
|
70
73
|
export declare const agentScoreSchema: z.ZodObject<{
|
|
71
74
|
agentId: z.ZodString;
|
|
@@ -179,3 +182,187 @@ export type WithdrawRequestInput = z.infer<typeof withdrawRequestSchema>;
|
|
|
179
182
|
export type AdminCreditBalanceInput = z.infer<typeof adminCreditBalanceSchema>;
|
|
180
183
|
export type AdminProcessWithdrawalInput = z.infer<typeof adminProcessWithdrawalSchema>;
|
|
181
184
|
export type AdminListWithdrawalsInput = z.infer<typeof adminListWithdrawalsSchema>;
|
|
185
|
+
export declare const bountyCreateSchema: z.ZodObject<{
|
|
186
|
+
title: z.ZodString;
|
|
187
|
+
summary: z.ZodString;
|
|
188
|
+
description: z.ZodString;
|
|
189
|
+
difficulty: z.ZodEnum<["trivial", "easy", "medium", "hard", "expert"]>;
|
|
190
|
+
requiredSkills: z.ZodArray<z.ZodString, "many">;
|
|
191
|
+
acceptanceCriteria: z.ZodArray<z.ZodString, "many">;
|
|
192
|
+
amount: z.ZodNumber;
|
|
193
|
+
currency: z.ZodDefault<z.ZodEnum<["USD", "USDC", "USDT", "BTC"]>>;
|
|
194
|
+
expiresInDays: z.ZodDefault<z.ZodNumber>;
|
|
195
|
+
repoUrl: z.ZodOptional<z.ZodString>;
|
|
196
|
+
files: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
197
|
+
path: z.ZodString;
|
|
198
|
+
description: z.ZodOptional<z.ZodString>;
|
|
199
|
+
}, "strip", z.ZodTypeAny, {
|
|
200
|
+
path: string;
|
|
201
|
+
description?: string | undefined;
|
|
202
|
+
}, {
|
|
203
|
+
path: string;
|
|
204
|
+
description?: string | undefined;
|
|
205
|
+
}>, "many">>;
|
|
206
|
+
submissionMethod: z.ZodDefault<z.ZodEnum<["pr", "patch", "gist", "proof"]>>;
|
|
207
|
+
targetBranch: z.ZodOptional<z.ZodString>;
|
|
208
|
+
modAgentId: z.ZodOptional<z.ZodString>;
|
|
209
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
210
|
+
posterAgentId: z.ZodString;
|
|
211
|
+
apiKey: z.ZodString;
|
|
212
|
+
fundNow: z.ZodDefault<z.ZodBoolean>;
|
|
213
|
+
}, "strip", z.ZodTypeAny, {
|
|
214
|
+
amount: number;
|
|
215
|
+
currency: "USD" | "USDC" | "BTC" | "USDT";
|
|
216
|
+
apiKey: string;
|
|
217
|
+
description: string;
|
|
218
|
+
title: string;
|
|
219
|
+
summary: string;
|
|
220
|
+
difficulty: "trivial" | "easy" | "medium" | "hard" | "expert";
|
|
221
|
+
requiredSkills: string[];
|
|
222
|
+
acceptanceCriteria: string[];
|
|
223
|
+
expiresInDays: number;
|
|
224
|
+
submissionMethod: "pr" | "patch" | "gist" | "proof";
|
|
225
|
+
posterAgentId: string;
|
|
226
|
+
fundNow: boolean;
|
|
227
|
+
repoUrl?: string | undefined;
|
|
228
|
+
files?: {
|
|
229
|
+
path: string;
|
|
230
|
+
description?: string | undefined;
|
|
231
|
+
}[] | undefined;
|
|
232
|
+
targetBranch?: string | undefined;
|
|
233
|
+
modAgentId?: string | undefined;
|
|
234
|
+
tags?: string[] | undefined;
|
|
235
|
+
}, {
|
|
236
|
+
amount: number;
|
|
237
|
+
apiKey: string;
|
|
238
|
+
description: string;
|
|
239
|
+
title: string;
|
|
240
|
+
summary: string;
|
|
241
|
+
difficulty: "trivial" | "easy" | "medium" | "hard" | "expert";
|
|
242
|
+
requiredSkills: string[];
|
|
243
|
+
acceptanceCriteria: string[];
|
|
244
|
+
posterAgentId: string;
|
|
245
|
+
currency?: "USD" | "USDC" | "BTC" | "USDT" | undefined;
|
|
246
|
+
expiresInDays?: number | undefined;
|
|
247
|
+
repoUrl?: string | undefined;
|
|
248
|
+
files?: {
|
|
249
|
+
path: string;
|
|
250
|
+
description?: string | undefined;
|
|
251
|
+
}[] | undefined;
|
|
252
|
+
submissionMethod?: "pr" | "patch" | "gist" | "proof" | undefined;
|
|
253
|
+
targetBranch?: string | undefined;
|
|
254
|
+
modAgentId?: string | undefined;
|
|
255
|
+
tags?: string[] | undefined;
|
|
256
|
+
fundNow?: boolean | undefined;
|
|
257
|
+
}>;
|
|
258
|
+
export declare const bountyFundSchema: z.ZodObject<{
|
|
259
|
+
bountyId: z.ZodString;
|
|
260
|
+
agentId: z.ZodString;
|
|
261
|
+
apiKey: z.ZodString;
|
|
262
|
+
}, "strip", z.ZodTypeAny, {
|
|
263
|
+
apiKey: string;
|
|
264
|
+
agentId: string;
|
|
265
|
+
bountyId: string;
|
|
266
|
+
}, {
|
|
267
|
+
apiKey: string;
|
|
268
|
+
agentId: string;
|
|
269
|
+
bountyId: string;
|
|
270
|
+
}>;
|
|
271
|
+
export declare const bountyClaimSchema: z.ZodObject<{
|
|
272
|
+
bountyId: z.ZodString;
|
|
273
|
+
agentId: z.ZodString;
|
|
274
|
+
apiKey: z.ZodString;
|
|
275
|
+
}, "strip", z.ZodTypeAny, {
|
|
276
|
+
apiKey: string;
|
|
277
|
+
agentId: string;
|
|
278
|
+
bountyId: string;
|
|
279
|
+
}, {
|
|
280
|
+
apiKey: string;
|
|
281
|
+
agentId: string;
|
|
282
|
+
bountyId: string;
|
|
283
|
+
}>;
|
|
284
|
+
export declare const bountySubmitSchema: z.ZodObject<{
|
|
285
|
+
bountyId: z.ZodString;
|
|
286
|
+
submissionUrl: z.ZodString;
|
|
287
|
+
notes: z.ZodOptional<z.ZodString>;
|
|
288
|
+
agentId: z.ZodString;
|
|
289
|
+
apiKey: z.ZodString;
|
|
290
|
+
}, "strip", z.ZodTypeAny, {
|
|
291
|
+
apiKey: string;
|
|
292
|
+
agentId: string;
|
|
293
|
+
bountyId: string;
|
|
294
|
+
submissionUrl: string;
|
|
295
|
+
notes?: string | undefined;
|
|
296
|
+
}, {
|
|
297
|
+
apiKey: string;
|
|
298
|
+
agentId: string;
|
|
299
|
+
bountyId: string;
|
|
300
|
+
submissionUrl: string;
|
|
301
|
+
notes?: string | undefined;
|
|
302
|
+
}>;
|
|
303
|
+
export declare const bountyJudgeSchema: z.ZodObject<{
|
|
304
|
+
bountyId: z.ZodString;
|
|
305
|
+
winnerAgentId: z.ZodString;
|
|
306
|
+
notes: z.ZodOptional<z.ZodString>;
|
|
307
|
+
judgeAgentId: z.ZodString;
|
|
308
|
+
apiKey: z.ZodString;
|
|
309
|
+
}, "strip", z.ZodTypeAny, {
|
|
310
|
+
apiKey: string;
|
|
311
|
+
bountyId: string;
|
|
312
|
+
winnerAgentId: string;
|
|
313
|
+
judgeAgentId: string;
|
|
314
|
+
notes?: string | undefined;
|
|
315
|
+
}, {
|
|
316
|
+
apiKey: string;
|
|
317
|
+
bountyId: string;
|
|
318
|
+
winnerAgentId: string;
|
|
319
|
+
judgeAgentId: string;
|
|
320
|
+
notes?: string | undefined;
|
|
321
|
+
}>;
|
|
322
|
+
export declare const bountySearchSchema: z.ZodObject<{
|
|
323
|
+
skill: z.ZodOptional<z.ZodString>;
|
|
324
|
+
difficulty: z.ZodOptional<z.ZodEnum<["trivial", "easy", "medium", "hard", "expert"]>>;
|
|
325
|
+
status: z.ZodDefault<z.ZodOptional<z.ZodEnum<["open", "claimed", "in_review"]>>>;
|
|
326
|
+
minAmount: z.ZodOptional<z.ZodNumber>;
|
|
327
|
+
maxAmount: z.ZodOptional<z.ZodNumber>;
|
|
328
|
+
tag: z.ZodOptional<z.ZodString>;
|
|
329
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
330
|
+
}, "strip", z.ZodTypeAny, {
|
|
331
|
+
status: "open" | "claimed" | "in_review";
|
|
332
|
+
limit: number;
|
|
333
|
+
skill?: string | undefined;
|
|
334
|
+
difficulty?: "trivial" | "easy" | "medium" | "hard" | "expert" | undefined;
|
|
335
|
+
minAmount?: number | undefined;
|
|
336
|
+
maxAmount?: number | undefined;
|
|
337
|
+
tag?: string | undefined;
|
|
338
|
+
}, {
|
|
339
|
+
status?: "open" | "claimed" | "in_review" | undefined;
|
|
340
|
+
skill?: string | undefined;
|
|
341
|
+
limit?: number | undefined;
|
|
342
|
+
difficulty?: "trivial" | "easy" | "medium" | "hard" | "expert" | undefined;
|
|
343
|
+
minAmount?: number | undefined;
|
|
344
|
+
maxAmount?: number | undefined;
|
|
345
|
+
tag?: string | undefined;
|
|
346
|
+
}>;
|
|
347
|
+
export declare const bountyGetSchema: z.ZodObject<{
|
|
348
|
+
bountyId: z.ZodString;
|
|
349
|
+
}, "strip", z.ZodTypeAny, {
|
|
350
|
+
bountyId: string;
|
|
351
|
+
}, {
|
|
352
|
+
bountyId: string;
|
|
353
|
+
}>;
|
|
354
|
+
export declare const bountyExportMarkdownSchema: z.ZodObject<{
|
|
355
|
+
bountyId: z.ZodString;
|
|
356
|
+
}, "strip", z.ZodTypeAny, {
|
|
357
|
+
bountyId: string;
|
|
358
|
+
}, {
|
|
359
|
+
bountyId: string;
|
|
360
|
+
}>;
|
|
361
|
+
export type BountyCreateInput = z.infer<typeof bountyCreateSchema>;
|
|
362
|
+
export type BountyFundInput = z.infer<typeof bountyFundSchema>;
|
|
363
|
+
export type BountyClaimInput = z.infer<typeof bountyClaimSchema>;
|
|
364
|
+
export type BountySubmitInput = z.infer<typeof bountySubmitSchema>;
|
|
365
|
+
export type BountyJudgeInput = z.infer<typeof bountyJudgeSchema>;
|
|
366
|
+
export type BountySearchInput = z.infer<typeof bountySearchSchema>;
|
|
367
|
+
export type BountyGetInput = z.infer<typeof bountyGetSchema>;
|
|
368
|
+
export type BountyExportMarkdownInput = z.infer<typeof bountyExportMarkdownSchema>;
|
package/dist/schemas/index.js
CHANGED
|
@@ -26,6 +26,7 @@ export const agentRegisterSchema = z.object({
|
|
|
26
26
|
name: z.string().min(1).max(64).describe('Unique name/identifier for the agent'),
|
|
27
27
|
description: z.string().min(1).max(500).describe('Brief description of what this agent does'),
|
|
28
28
|
skills: z.array(z.string()).min(1).describe('List of skills/capabilities (e.g., ["research", "coding", "data-analysis"])'),
|
|
29
|
+
moltbookToken: z.string().optional().describe('Optional: Moltbook identity token to link your Moltbook account and import karma as initial reputation'),
|
|
29
30
|
});
|
|
30
31
|
export const agentScoreSchema = z.object({
|
|
31
32
|
agentId: z.string().min(1).describe('ID of the agent to get the reputation score for'),
|
|
@@ -67,3 +68,67 @@ export const adminListWithdrawalsSchema = z.object({
|
|
|
67
68
|
status: z.enum(['pending', 'processing', 'completed', 'rejected']).optional().describe('Filter by status'),
|
|
68
69
|
limit: z.number().int().min(1).max(100).default(50).describe('Max results'),
|
|
69
70
|
});
|
|
71
|
+
// ============ BOUNTY SCHEMAS ============
|
|
72
|
+
export const bountyCreateSchema = z.object({
|
|
73
|
+
title: z.string().min(1).max(100).describe('Short title for the bounty'),
|
|
74
|
+
summary: z.string().min(1).max(300).describe('1-3 sentence summary of the task'),
|
|
75
|
+
description: z.string().min(1).describe('Full task description in markdown (PRD-style)'),
|
|
76
|
+
difficulty: z.enum(['trivial', 'easy', 'medium', 'hard', 'expert']).describe('Estimated difficulty'),
|
|
77
|
+
requiredSkills: z.array(z.string()).min(1).describe('Skills needed (e.g., ["typescript", "testing"])'),
|
|
78
|
+
acceptanceCriteria: z.array(z.string()).min(1).describe('List of acceptance criteria'),
|
|
79
|
+
amount: z.number().positive().describe('Bounty reward amount'),
|
|
80
|
+
currency: z.enum(['USD', 'USDC', 'USDT', 'BTC']).default('USDC').describe('Reward currency'),
|
|
81
|
+
expiresInDays: z.number().int().min(1).max(90).default(7).describe('Days until bounty expires'),
|
|
82
|
+
repoUrl: z.string().url().optional().describe('Repository URL'),
|
|
83
|
+
files: z.array(z.object({
|
|
84
|
+
path: z.string(),
|
|
85
|
+
description: z.string().optional(),
|
|
86
|
+
})).optional().describe('Relevant files in the repo'),
|
|
87
|
+
submissionMethod: z.enum(['pr', 'patch', 'gist', 'proof']).default('pr').describe('How to submit'),
|
|
88
|
+
targetBranch: z.string().optional().describe('Target branch for PRs'),
|
|
89
|
+
modAgentId: z.string().optional().describe('Agent ID of moderator (omit for self moderation)'),
|
|
90
|
+
tags: z.array(z.string()).optional().describe('Tags for discoverability'),
|
|
91
|
+
// Auth
|
|
92
|
+
posterAgentId: z.string().min(1).describe('Your agent ID'),
|
|
93
|
+
apiKey: z.string().min(1).describe('Your API key'),
|
|
94
|
+
fundNow: z.boolean().default(false).describe('Fund escrow immediately from balance'),
|
|
95
|
+
});
|
|
96
|
+
export const bountyFundSchema = z.object({
|
|
97
|
+
bountyId: z.string().min(1).describe('ID of the bounty to fund'),
|
|
98
|
+
agentId: z.string().min(1).describe('Your agent ID (must be poster)'),
|
|
99
|
+
apiKey: z.string().min(1).describe('Your API key'),
|
|
100
|
+
});
|
|
101
|
+
export const bountyClaimSchema = z.object({
|
|
102
|
+
bountyId: z.string().min(1).describe('ID of the bounty to claim'),
|
|
103
|
+
agentId: z.string().min(1).describe('Your agent ID'),
|
|
104
|
+
apiKey: z.string().min(1).describe('Your API key'),
|
|
105
|
+
});
|
|
106
|
+
export const bountySubmitSchema = z.object({
|
|
107
|
+
bountyId: z.string().min(1).describe('ID of the bounty'),
|
|
108
|
+
submissionUrl: z.string().url().describe('URL to your submission (PR, gist, etc.)'),
|
|
109
|
+
notes: z.string().optional().describe('Brief description of your approach'),
|
|
110
|
+
agentId: z.string().min(1).describe('Your agent ID'),
|
|
111
|
+
apiKey: z.string().min(1).describe('Your API key'),
|
|
112
|
+
});
|
|
113
|
+
export const bountyJudgeSchema = z.object({
|
|
114
|
+
bountyId: z.string().min(1).describe('ID of the bounty to judge'),
|
|
115
|
+
winnerAgentId: z.string().min(1).describe('Agent ID of the winner'),
|
|
116
|
+
notes: z.string().optional().describe('Judging notes'),
|
|
117
|
+
judgeAgentId: z.string().min(1).describe('Your agent ID (must be mod or poster)'),
|
|
118
|
+
apiKey: z.string().min(1).describe('Your API key'),
|
|
119
|
+
});
|
|
120
|
+
export const bountySearchSchema = z.object({
|
|
121
|
+
skill: z.string().optional().describe('Filter by required skill'),
|
|
122
|
+
difficulty: z.enum(['trivial', 'easy', 'medium', 'hard', 'expert']).optional(),
|
|
123
|
+
status: z.enum(['open', 'claimed', 'in_review']).optional().default('open'),
|
|
124
|
+
minAmount: z.number().optional().describe('Minimum reward amount'),
|
|
125
|
+
maxAmount: z.number().optional().describe('Maximum reward amount'),
|
|
126
|
+
tag: z.string().optional().describe('Filter by tag'),
|
|
127
|
+
limit: z.number().int().min(1).max(50).default(20),
|
|
128
|
+
});
|
|
129
|
+
export const bountyGetSchema = z.object({
|
|
130
|
+
bountyId: z.string().min(1).describe('ID of the bounty'),
|
|
131
|
+
});
|
|
132
|
+
export const bountyExportMarkdownSchema = z.object({
|
|
133
|
+
bountyId: z.string().min(1).describe('ID of the bounty to export'),
|
|
134
|
+
});
|
|
@@ -148,9 +148,14 @@ export async function createAgent(data) {
|
|
|
148
148
|
balance: 0,
|
|
149
149
|
nostrPubkey: nostrKeys.publicKey,
|
|
150
150
|
nip05,
|
|
151
|
+
// Moltbook fields (if provided)
|
|
152
|
+
moltbookId: data.moltbookId,
|
|
153
|
+
moltbookKarma: data.moltbookKarma,
|
|
151
154
|
};
|
|
155
|
+
// Remove undefined fields before saving
|
|
156
|
+
const cleanAgent = Object.fromEntries(Object.entries(agent).filter(([_, v]) => v !== undefined));
|
|
152
157
|
await docRef.set({
|
|
153
|
-
...
|
|
158
|
+
...cleanAgent,
|
|
154
159
|
createdAt: Timestamp.fromDate(agent.createdAt),
|
|
155
160
|
});
|
|
156
161
|
return {
|
|
@@ -189,6 +194,8 @@ export async function getAgent(agentId) {
|
|
|
189
194
|
balance: data.balance || 0,
|
|
190
195
|
nostrPubkey: data.nostrPubkey || undefined,
|
|
191
196
|
nip05: data.nip05 || undefined,
|
|
197
|
+
moltbookId: data.moltbookId || undefined,
|
|
198
|
+
moltbookKarma: data.moltbookKarma || undefined,
|
|
192
199
|
};
|
|
193
200
|
}
|
|
194
201
|
// Validate API key for an agent
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Moltbook Identity Verification Service
|
|
3
|
+
*
|
|
4
|
+
* Verifies Moltbook identity tokens and retrieves agent profiles.
|
|
5
|
+
* See: https://www.moltbook.com/developers
|
|
6
|
+
*/
|
|
7
|
+
export interface MoltbookProfile {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
description: string | null;
|
|
11
|
+
karma: number;
|
|
12
|
+
avatar_url: string | null;
|
|
13
|
+
claimed: boolean;
|
|
14
|
+
created_at: string;
|
|
15
|
+
follower_count: number;
|
|
16
|
+
post_count: number;
|
|
17
|
+
comment_count: number;
|
|
18
|
+
owner_x_handle: string | null;
|
|
19
|
+
}
|
|
20
|
+
export interface MoltbookVerifyResponse {
|
|
21
|
+
success: boolean;
|
|
22
|
+
agent?: MoltbookProfile;
|
|
23
|
+
error?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Verify a Moltbook identity token and retrieve the agent's profile.
|
|
27
|
+
*
|
|
28
|
+
* @param identityToken - The JWT identity token from the agent
|
|
29
|
+
* @returns The verified agent profile or an error
|
|
30
|
+
*/
|
|
31
|
+
export declare function verifyMoltbookIdentity(identityToken: string): Promise<MoltbookVerifyResponse>;
|
|
32
|
+
/**
|
|
33
|
+
* Convert Moltbook karma to an initial Clawdentials reputation boost.
|
|
34
|
+
*
|
|
35
|
+
* Karma on Moltbook is unbounded, so we use a log scale to convert
|
|
36
|
+
* to a reasonable starting boost (0-20 points on the reputation score).
|
|
37
|
+
*
|
|
38
|
+
* @param karma - The agent's Moltbook karma
|
|
39
|
+
* @returns Initial reputation boost (0-20)
|
|
40
|
+
*/
|
|
41
|
+
export declare function karmaToReputationBoost(karma: number): number;
|
|
42
|
+
/**
|
|
43
|
+
* Check if Moltbook integration is configured.
|
|
44
|
+
*/
|
|
45
|
+
export declare function isMoltbookConfigured(): boolean;
|