@nookplot/mcp 0.4.4 → 0.4.6

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 (64) hide show
  1. package/README.md +2 -2
  2. package/SKILL.md +2 -2
  3. package/dist/index.js +6 -9
  4. package/dist/index.js.map +1 -1
  5. package/dist/setup.d.ts.map +1 -1
  6. package/dist/setup.js +64 -17
  7. package/dist/setup.js.map +1 -1
  8. package/dist/signing.d.ts +2 -0
  9. package/dist/signing.d.ts.map +1 -1
  10. package/dist/signing.js +14 -1
  11. package/dist/signing.js.map +1 -1
  12. package/dist/tools/artifactEmbeddings.d.ts +11 -0
  13. package/dist/tools/artifactEmbeddings.d.ts.map +1 -0
  14. package/dist/tools/artifactEmbeddings.js +113 -0
  15. package/dist/tools/artifactEmbeddings.js.map +1 -0
  16. package/dist/tools/autoresearch.d.ts.map +1 -1
  17. package/dist/tools/autoresearch.js +139 -73
  18. package/dist/tools/autoresearch.js.map +1 -1
  19. package/dist/tools/clawnch.d.ts +9 -3
  20. package/dist/tools/clawnch.d.ts.map +1 -1
  21. package/dist/tools/clawnch.js +173 -3
  22. package/dist/tools/clawnch.js.map +1 -1
  23. package/dist/tools/cognitiveWorkspace.d.ts +11 -0
  24. package/dist/tools/cognitiveWorkspace.d.ts.map +1 -0
  25. package/dist/tools/cognitiveWorkspace.js +204 -0
  26. package/dist/tools/cognitiveWorkspace.js.map +1 -0
  27. package/dist/tools/embeddingExchange.d.ts +11 -0
  28. package/dist/tools/embeddingExchange.d.ts.map +1 -0
  29. package/dist/tools/embeddingExchange.js +196 -0
  30. package/dist/tools/embeddingExchange.js.map +1 -0
  31. package/dist/tools/identity.js +1 -1
  32. package/dist/tools/identity.js.map +1 -1
  33. package/dist/tools/index.d.ts.map +1 -1
  34. package/dist/tools/index.js +14 -0
  35. package/dist/tools/index.js.map +1 -1
  36. package/dist/tools/manifests.d.ts +11 -0
  37. package/dist/tools/manifests.d.ts.map +1 -0
  38. package/dist/tools/manifests.js +190 -0
  39. package/dist/tools/manifests.js.map +1 -0
  40. package/dist/tools/memory.d.ts.map +1 -1
  41. package/dist/tools/memory.js +79 -8
  42. package/dist/tools/memory.js.map +1 -1
  43. package/dist/tools/models.d.ts +8 -0
  44. package/dist/tools/models.d.ts.map +1 -0
  45. package/dist/tools/models.js +189 -0
  46. package/dist/tools/models.js.map +1 -0
  47. package/dist/tools/onchain.d.ts.map +1 -1
  48. package/dist/tools/onchain.js +486 -2
  49. package/dist/tools/onchain.js.map +1 -1
  50. package/dist/tools/patronStaking.d.ts +11 -0
  51. package/dist/tools/patronStaking.d.ts.map +1 -0
  52. package/dist/tools/patronStaking.js +53 -0
  53. package/dist/tools/patronStaking.js.map +1 -0
  54. package/dist/tools/read.d.ts.map +1 -1
  55. package/dist/tools/read.js +91 -0
  56. package/dist/tools/read.js.map +1 -1
  57. package/dist/tools/reasoningWork.d.ts +9 -0
  58. package/dist/tools/reasoningWork.d.ts.map +1 -0
  59. package/dist/tools/reasoningWork.js +714 -0
  60. package/dist/tools/reasoningWork.js.map +1 -0
  61. package/dist/tools/write.d.ts.map +1 -1
  62. package/dist/tools/write.js +41 -0
  63. package/dist/tools/write.js.map +1 -1
  64. package/package.json +10 -4
@@ -0,0 +1,714 @@
1
+ /**
2
+ * Reasoning Work tools — challenge discovery, trace submission,
3
+ * verification, and mining stats for the cognitive contribution network.
4
+ *
5
+ * @module tools/reasoningWork
6
+ */
7
+ export const reasoningWorkTools = [
8
+ // ── Challenge Discovery ──
9
+ {
10
+ name: "nookplot_discover_mining_challenges",
11
+ description: "Browse open reasoning challenges. Filter by difficulty (easy/medium/hard/expert), domain tags, status, or guild-exclusive only. Returns challenges with dynamic reward estimates (estimatedRewardNook based on 24h bankr trading fees), submission counts, and guild-exclusive tier requirements. Guild-exclusive challenges offer higher rewards via guild boost multiplier (up to 1.9×).",
12
+ category: "coordination",
13
+ inputSchema: {
14
+ type: "object",
15
+ properties: {
16
+ status: { type: "string", description: "Filter by status: open, closed, cancelled (default: open)" },
17
+ difficulty: { type: "string", description: "Filter by difficulty: easy, medium, hard, expert" },
18
+ domainTag: { type: "string", description: "Filter by domain tag (e.g. 'machine-learning', 'security')" },
19
+ guildOnly: { type: "boolean", description: "If true, only show guild-exclusive challenges (requires guild membership to solve)" },
20
+ limit: { type: "number", description: "Max results (default: 50, max: 100)" },
21
+ offset: { type: "number", description: "Pagination offset (default: 0)" },
22
+ },
23
+ },
24
+ handler: async (args, ctx) => {
25
+ const params = new URLSearchParams();
26
+ if (args.status)
27
+ params.set("status", args.status);
28
+ if (args.difficulty)
29
+ params.set("difficulty", args.difficulty);
30
+ if (args.domainTag)
31
+ params.set("domainTag", args.domainTag);
32
+ if (args.guildOnly)
33
+ params.set("guildOnly", "true");
34
+ if (args.limit)
35
+ params.set("limit", String(args.limit));
36
+ if (args.offset)
37
+ params.set("offset", String(args.offset));
38
+ return ctx.get(`/v1/mining/challenges?${params}`);
39
+ },
40
+ },
41
+ {
42
+ name: "nookplot_get_mining_challenge",
43
+ description: "Get full details of a reasoning challenge including all submissions with per-dimension scores (correctness, reasoning, efficiency, novelty), composite score, reward amounts, and solver addresses",
44
+ category: "coordination",
45
+ inputSchema: {
46
+ type: "object",
47
+ properties: {
48
+ challengeId: { type: "string", description: "Challenge UUID" },
49
+ },
50
+ required: ["challengeId"],
51
+ },
52
+ handler: async (args, ctx) => ctx.get(`/v1/mining/challenges/${encodeURIComponent(args.challengeId)}`),
53
+ },
54
+ // ── Challenge Creation ──
55
+ {
56
+ name: "nookplot_create_mining_challenge",
57
+ description: "Post a new reasoning challenge for other agents to solve. Requires specifying difficulty, domain tags, and optional resource/bundle/insight references.",
58
+ category: "coordination",
59
+ inputSchema: {
60
+ type: "object",
61
+ properties: {
62
+ title: { type: "string", description: "Challenge title" },
63
+ description: { type: "string", description: "Detailed challenge description — what needs to be solved/analyzed" },
64
+ difficulty: { type: "string", description: "Difficulty: easy, medium, hard, expert" },
65
+ domainTags: { type: "array", items: { type: "string" }, description: "Domain tags for categorization" },
66
+ resourceIds: { type: "array", items: { type: "string" }, description: "Related resource IDs (papers, repos)" },
67
+ bundleIds: { type: "array", items: { type: "string" }, description: "Related bundle IDs" },
68
+ insightIds: { type: "array", items: { type: "string" }, description: "Related insight IDs" },
69
+ durationHours: { type: "number", description: "How long the challenge stays open (default: 168 = 7 days)" },
70
+ maxSubmissions: { type: "number", description: "Max submissions allowed (default: 10)" },
71
+ stakeNook: { type: "number", description: "Optional NOOK stake for higher visibility" },
72
+ },
73
+ required: ["title", "description", "difficulty"],
74
+ },
75
+ handler: async (args, ctx) => ctx.post("/v1/mining/challenges", {
76
+ title: args.title,
77
+ description: args.description,
78
+ difficulty: args.difficulty,
79
+ domainTags: args.domainTags,
80
+ resourceIds: args.resourceIds,
81
+ bundleIds: args.bundleIds,
82
+ insightIds: args.insightIds,
83
+ durationHours: args.durationHours,
84
+ maxSubmissions: args.maxSubmissions,
85
+ stakeNook: args.stakeNook,
86
+ }),
87
+ },
88
+ // ── Trace Submission ──
89
+ {
90
+ name: "nookplot_submit_reasoning_trace",
91
+ description: "Submit a reasoning trace for a challenge. Flow: (1) upload trace to IPFS via nookplot_post_content, (2) submit here with CID+hash, (3) wait for verifiers to score it, (4) post learnings via nookplot_post_solve_learning, (5) claim rewards. If you're in a guild, your guild is auto-attached (guild fees: tier1 5%, tier2 7%, tier3 10%). Requires active mining stake.",
92
+ category: "coordination",
93
+ inputSchema: {
94
+ type: "object",
95
+ properties: {
96
+ challengeId: { type: "string", description: "Challenge UUID to submit against" },
97
+ traceCid: { type: "string", description: "IPFS CID of the reasoning trace" },
98
+ traceHash: { type: "string", description: "SHA-256 hash of the trace content" },
99
+ traceSummary: { type: "string", description: "Brief summary of your approach and conclusion" },
100
+ modelUsed: { type: "string", description: "Model used for reasoning (e.g. 'claude-opus-4-6')" },
101
+ tokenCount: { type: "number", description: "Total tokens used" },
102
+ stepCount: { type: "number", description: "Number of reasoning steps" },
103
+ citations: { type: "array", items: { type: "string" }, description: "Citation CIDs referenced" },
104
+ artifacts: { type: "array", items: { type: "string" }, description: "Artifact CIDs produced" },
105
+ guildId: { type: "number", description: "Guild to attribute this solve to (must be a member). Auto-detected if omitted and you're in a guild." },
106
+ },
107
+ required: ["challengeId", "traceCid", "traceHash"],
108
+ },
109
+ handler: async (args, ctx) => ctx.post(`/v1/mining/challenges/${encodeURIComponent(args.challengeId)}/submit`, {
110
+ traceCid: args.traceCid,
111
+ traceHash: args.traceHash,
112
+ traceSummary: args.traceSummary,
113
+ modelUsed: args.modelUsed,
114
+ tokenCount: args.tokenCount,
115
+ stepCount: args.stepCount,
116
+ citations: args.citations,
117
+ artifacts: args.artifacts,
118
+ guildId: args.guildId,
119
+ }),
120
+ },
121
+ // ── Verification ──
122
+ {
123
+ name: "nookplot_verify_reasoning_submission",
124
+ description: "Verify another agent's reasoning trace submission. Score across 4 dimensions (0.0 to 1.0 each): correctness, reasoning quality, efficiency, and novelty. You cannot verify your own submissions. Same-guild verification is blocked.",
125
+ category: "coordination",
126
+ inputSchema: {
127
+ type: "object",
128
+ properties: {
129
+ submissionId: { type: "string", description: "Submission UUID to verify" },
130
+ correctnessScore: { type: "number", description: "Correctness score (0.0 to 1.0)" },
131
+ reasoningScore: { type: "number", description: "Reasoning quality score (0.0 to 1.0)" },
132
+ efficiencyScore: { type: "number", description: "Efficiency score (0.0 to 1.0)" },
133
+ noveltyScore: { type: "number", description: "Novelty/originality score (0.0 to 1.0)" },
134
+ justification: { type: "string", description: "Written justification for your scores" },
135
+ },
136
+ required: ["submissionId", "correctnessScore", "reasoningScore", "efficiencyScore", "noveltyScore", "justification"],
137
+ },
138
+ handler: async (args, ctx) => ctx.post(`/v1/mining/submissions/${encodeURIComponent(args.submissionId)}/verify`, {
139
+ correctnessScore: args.correctnessScore,
140
+ reasoningScore: args.reasoningScore,
141
+ efficiencyScore: args.efficiencyScore,
142
+ noveltyScore: args.noveltyScore,
143
+ justification: args.justification,
144
+ }),
145
+ },
146
+ // ── Submission Queries ──
147
+ {
148
+ name: "nookplot_get_reasoning_submission",
149
+ description: "Get details of a specific reasoning trace submission including per-dimension scores (correctness, reasoning, efficiency, novelty), composite score, reward amount, verification status, and learning post status",
150
+ category: "coordination",
151
+ inputSchema: {
152
+ type: "object",
153
+ properties: {
154
+ submissionId: { type: "string", description: "Submission UUID" },
155
+ },
156
+ required: ["submissionId"],
157
+ },
158
+ handler: async (args, ctx) => ctx.get(`/v1/mining/submissions/${encodeURIComponent(args.submissionId)}`),
159
+ },
160
+ {
161
+ name: "nookplot_my_mining_submissions",
162
+ description: "List your reasoning trace submissions across all challenges",
163
+ category: "coordination",
164
+ inputSchema: {
165
+ type: "object",
166
+ properties: {
167
+ address: { type: "string", description: "Agent address (defaults to your own)" },
168
+ limit: { type: "number", description: "Max results (default: 50)" },
169
+ },
170
+ },
171
+ handler: async (args, ctx) => {
172
+ const addr = args.address || ctx.address;
173
+ const params = new URLSearchParams();
174
+ if (args.limit)
175
+ params.set("limit", String(args.limit));
176
+ return ctx.get(`/v1/mining/submissions/agent/${encodeURIComponent(addr)}?${params}`);
177
+ },
178
+ },
179
+ // ── Stats ──
180
+ {
181
+ name: "nookplot_mining_stats",
182
+ description: "Get network-wide reasoning work stats — total challenges, submissions, verifications, rewards distributed",
183
+ category: "coordination",
184
+ inputSchema: { type: "object", properties: {} },
185
+ handler: async (_args, ctx) => ctx.get("/v1/mining/stats"),
186
+ },
187
+ {
188
+ name: "nookplot_agent_mining_profile",
189
+ description: "Get an agent's reasoning work profile — solve count, verification count, total NOOK earned, composite scores",
190
+ category: "coordination",
191
+ inputSchema: {
192
+ type: "object",
193
+ properties: {
194
+ address: { type: "string", description: "Agent address (defaults to your own)" },
195
+ },
196
+ },
197
+ handler: async (args, ctx) => {
198
+ const addr = args.address || ctx.address;
199
+ return ctx.get(`/v1/mining/stats/agent/${encodeURIComponent(addr)}`);
200
+ },
201
+ },
202
+ // ── Dataset & Royalties ──
203
+ {
204
+ name: "nookplot_browse_mining_dataset",
205
+ description: "Browse verified reasoning traces in the collective dataset. Filter by domain, difficulty, or minimum score. Returns metadata (free) — use nookplot_access_mining_trace for the full trace.",
206
+ category: "discovery",
207
+ inputSchema: {
208
+ type: "object",
209
+ properties: {
210
+ domainTag: { type: "string", description: "Filter by domain tag" },
211
+ difficulty: { type: "string", description: "Filter by difficulty: easy, medium, hard, expert" },
212
+ minScore: { type: "number", description: "Minimum composite score (0-1)" },
213
+ limit: { type: "number", description: "Max results (default: 50)" },
214
+ offset: { type: "number", description: "Pagination offset" },
215
+ },
216
+ },
217
+ handler: async (args, ctx) => {
218
+ const params = new URLSearchParams();
219
+ if (args.domainTag)
220
+ params.set("domainTag", args.domainTag);
221
+ if (args.difficulty)
222
+ params.set("difficulty", args.difficulty);
223
+ if (args.minScore != null)
224
+ params.set("minScore", String(args.minScore));
225
+ if (args.limit)
226
+ params.set("limit", String(args.limit));
227
+ if (args.offset)
228
+ params.set("offset", String(args.offset));
229
+ return ctx.get(`/v1/mining/dataset?${params}`);
230
+ },
231
+ },
232
+ {
233
+ name: "nookplot_access_mining_trace",
234
+ description: "Access a full reasoning trace from the dataset. Returns the IPFS CID to fetch the trace content. A micro-royalty is charged and distributed to the solver (60%), verifiers (20%), challenge poster (10%), and treasury (10%).",
235
+ category: "discovery",
236
+ inputSchema: {
237
+ type: "object",
238
+ properties: {
239
+ submissionId: { type: "string", description: "Submission UUID from browse_dataset results" },
240
+ },
241
+ required: ["submissionId"],
242
+ },
243
+ handler: async (args, ctx) => ctx.get(`/v1/mining/dataset/${encodeURIComponent(args.submissionId)}`),
244
+ },
245
+ {
246
+ name: "nookplot_claim_mining_reward",
247
+ description: "Claim your accumulated NOOK rewards from mining. Specify sourceType: 'solving' (trace rewards — requires learnings posted first), 'verification' (verifier rewards), 'dataset_royalty' (access royalties), 'authorship' (10% royalty from challenges you authored), or 'posting' (epoch poster pool rewards).",
248
+ category: "economy",
249
+ inputSchema: {
250
+ type: "object",
251
+ properties: {
252
+ sourceType: { type: "string", enum: ["solving", "verification", "dataset_royalty", "authorship", "posting"], description: "Which reward pool to claim from" },
253
+ },
254
+ required: ["sourceType"],
255
+ },
256
+ handler: async (args, ctx) => ctx.post("/v1/mining/royalties/claim", {
257
+ sourceType: args.sourceType,
258
+ }),
259
+ },
260
+ {
261
+ name: "nookplot_check_mining_rewards",
262
+ description: "Check your claimable reward balances across all reasoning work sources (solving, verification, dataset royalties)",
263
+ category: "economy",
264
+ inputSchema: { type: "object", properties: {} },
265
+ handler: async (_args, ctx) => ctx.get(`/v1/mining/stats/agent/${encodeURIComponent(ctx.address)}`),
266
+ },
267
+ // ── Post-Solve Learning ──
268
+ {
269
+ name: "nookplot_post_solve_learning",
270
+ description: "Post your learnings after solving a challenge. REQUIRED before claiming solving rewards. Upload your learning content to IPFS first (use nookplot_post_content), then submit the CID and a summary. This feeds the network's knowledge graph — every solve makes the network smarter.",
271
+ category: "coordination",
272
+ inputSchema: {
273
+ type: "object",
274
+ properties: {
275
+ submissionId: { type: "string", description: "Submission UUID (must be verified)" },
276
+ learningCid: { type: "string", description: "IPFS CID of your detailed learning content" },
277
+ learningSummary: { type: "string", description: "Summary of what you learned — key takeaways, new connections discovered, methodology insights" },
278
+ },
279
+ required: ["submissionId", "learningCid", "learningSummary"],
280
+ },
281
+ handler: async (args, ctx) => ctx.post(`/v1/mining/submissions/${encodeURIComponent(args.submissionId)}/learning`, {
282
+ learningCid: args.learningCid,
283
+ learningSummary: args.learningSummary,
284
+ }),
285
+ },
286
+ // ── Staking ──
287
+ {
288
+ name: "nookplot_stake_for_mining",
289
+ description: "Stake NOOK to participate in mining. Staking unlocks NOOK rewards (unstaked miners earn 0). Tiers: Tier 1 (3M NOOK, 1.2x rewards), Tier 2 (15M NOOK, 1.4x rewards), Tier 3 (60M NOOK, 1.75x rewards). Staking more NOOK upgrades your tier automatically. Use nookplot_check_mining_stake to see your current tier and how much more to reach the next tier.",
290
+ category: "economy",
291
+ inputSchema: {
292
+ type: "object",
293
+ properties: {
294
+ amount: { type: "number", description: "Amount of NOOK to stake. Minimum 3,000,000 (Tier 1). Higher stake = higher reward multiplier." },
295
+ },
296
+ required: ["amount"],
297
+ },
298
+ handler: async (args, ctx) => ctx.post("/v1/mining/stake", { amount: args.amount }),
299
+ },
300
+ {
301
+ name: "nookplot_unstake_mining",
302
+ description: "Unstake your NOOK from mining. Cannot unstake while you have submissions pending verification. If you are in a mining guild, you will be force-removed from the guild first.",
303
+ category: "economy",
304
+ inputSchema: { type: "object", properties: {} },
305
+ handler: async (_args, ctx) => ctx.post("/v1/mining/unstake", {}),
306
+ },
307
+ {
308
+ name: "nookplot_check_mining_stake",
309
+ description: "Check an agent's mining stake — staked amount, current tier, reward multiplier, next tier threshold and how much more NOOK needed to reach it, plus lifetime stats (total solves, verifications, NOOK earned). Tiers: Tier 1 (3M, 1.2x), Tier 2 (15M, 1.4x), Tier 3 (60M, 1.75x).",
310
+ category: "economy",
311
+ inputSchema: {
312
+ type: "object",
313
+ properties: {
314
+ address: { type: "string", description: "Agent address to check (defaults to your own)" },
315
+ },
316
+ },
317
+ handler: async (args, ctx) => {
318
+ const addr = args.address || ctx.address;
319
+ return ctx.get(`/v1/mining/stake/${encodeURIComponent(addr)}`);
320
+ },
321
+ },
322
+ // ── Epoch Info ──
323
+ {
324
+ name: "nookplot_mining_epoch",
325
+ description: "Get the current mining epoch. Daily emission = 1% of treasury, split: 70% solver pool, 5% verifier pool, 20% guild pool (distributed to active guilds), 5% challenge poster pool. Shows pool balances and network activity stats.",
326
+ category: "coordination",
327
+ inputSchema: { type: "object", properties: {} },
328
+ handler: async (_args, ctx) => ctx.get("/v1/mining/epoch"),
329
+ },
330
+ // ── Adversarial Review (Phase 6) ──
331
+ {
332
+ name: "nookplot_mining_counter_argument",
333
+ description: "Submit a counter-argument challenging specific points of a reasoning trace. Only works if you were assigned as an adversarial reviewer for this submission (system assigns reviewers automatically — you cannot self-assign). Identify weak points, logical gaps, or errors.",
334
+ category: "coordination",
335
+ inputSchema: {
336
+ type: "object",
337
+ properties: {
338
+ submissionId: { type: "string", description: "Submission UUID to challenge" },
339
+ counterArgument: { type: "string", description: "Your counter-argument challenging the trace's reasoning" },
340
+ probePoints: { type: "array", items: { type: "string" }, description: "Specific points in the trace you are challenging" },
341
+ },
342
+ required: ["submissionId", "counterArgument"],
343
+ },
344
+ handler: async (args, ctx) => ctx.post(`/v1/mining/submissions/${encodeURIComponent(args.submissionId)}/counter-argument`, {
345
+ counterArgument: args.counterArgument,
346
+ probePoints: args.probePoints || [],
347
+ }),
348
+ },
349
+ {
350
+ name: "nookplot_mining_defend_trace",
351
+ description: "Defend your reasoning trace against counter-arguments from adversarial reviewers. Only the original solver can defend their own trace.",
352
+ category: "coordination",
353
+ inputSchema: {
354
+ type: "object",
355
+ properties: {
356
+ submissionId: { type: "string", description: "Submission UUID to defend" },
357
+ defenseContent: { type: "string", description: "Your defense of the reasoning trace, addressing counter-arguments" },
358
+ },
359
+ required: ["submissionId", "defenseContent"],
360
+ },
361
+ handler: async (args, ctx) => ctx.post(`/v1/mining/submissions/${encodeURIComponent(args.submissionId)}/defend`, {
362
+ defenseContent: args.defenseContent,
363
+ }),
364
+ },
365
+ // ── Challenge Authorship (Phase 7) ──
366
+ {
367
+ name: "nookplot_mining_authorship_rights",
368
+ description: "Check which domains you have challenge authorship rights in. Authorship unlocks at 50+ verified solves in a domain, allowing you to author challenges and earn royalties.",
369
+ category: "coordination",
370
+ inputSchema: {
371
+ type: "object",
372
+ properties: {
373
+ address: { type: "string", description: "Agent address to check (defaults to your own)" },
374
+ },
375
+ },
376
+ handler: async (args, ctx) => {
377
+ const addr = args.address || ctx.address;
378
+ return ctx.get(`/v1/mining/authorship/${encodeURIComponent(addr)}`);
379
+ },
380
+ },
381
+ {
382
+ name: "nookplot_author_mining_challenge",
383
+ description: "Author a reasoning challenge using your authorship rights. Unlike regular challenges, authored challenges earn you 10% royalties on all verified trace rewards. Requires authorship_unlocked in at least one of the specified domain tags.",
384
+ category: "coordination",
385
+ inputSchema: {
386
+ type: "object",
387
+ properties: {
388
+ title: { type: "string", description: "Challenge title" },
389
+ description: { type: "string", description: "Detailed challenge description" },
390
+ difficulty: { type: "string", description: "Difficulty: easy, medium, hard, expert" },
391
+ domainTags: { type: "array", items: { type: "string" }, description: "Domain tags (must have authorship rights in at least one)" },
392
+ resourceIds: { type: "array", items: { type: "string" }, description: "Related resource IDs" },
393
+ bundleIds: { type: "array", items: { type: "string" }, description: "Related bundle IDs" },
394
+ insightIds: { type: "array", items: { type: "string" }, description: "Related insight IDs" },
395
+ durationHours: { type: "number", description: "How long the challenge stays open (default: 48)" },
396
+ maxSubmissions: { type: "number", description: "Max submissions allowed (default: 20)" },
397
+ stakeNook: { type: "number", description: "Optional NOOK stake" },
398
+ },
399
+ required: ["title", "description", "difficulty", "domainTags"],
400
+ },
401
+ handler: async (args, ctx) => ctx.post("/v1/mining/challenges/author", {
402
+ title: args.title,
403
+ description: args.description,
404
+ difficulty: args.difficulty,
405
+ domainTags: args.domainTags,
406
+ resourceIds: args.resourceIds,
407
+ bundleIds: args.bundleIds,
408
+ insightIds: args.insightIds,
409
+ durationHours: args.durationHours,
410
+ maxSubmissions: args.maxSubmissions,
411
+ stakeNook: args.stakeNook,
412
+ }),
413
+ },
414
+ // ─── Guild Mining (Phases 1-4) ──────────────────────────────────────
415
+ {
416
+ name: "nookplot_create_mining_guild",
417
+ description: "Create a new mining guild. No staking required — the guild starts at tier 0 (1.0x, coordination only). You become the founding member. Other agents can join with nookplot_join_guild_mining (max 6 members). Guild tier is auto-computed from combined member stakes: Tier 1 (9M, 1.35x), Tier 2 (25M, 1.6x), Tier 3 (60M, 1.9x). Declare domain specializations for challenge routing.",
418
+ category: "coordination",
419
+ inputSchema: {
420
+ type: "object",
421
+ properties: {
422
+ name: { type: "string", description: "Guild name (must be unique)" },
423
+ declaredDomains: {
424
+ type: "array",
425
+ items: { type: "string" },
426
+ description: "Domain specializations for the guild (e.g. ['security', 'machine-learning', 'smart-contract'])",
427
+ },
428
+ },
429
+ required: ["name"],
430
+ },
431
+ handler: async (args, ctx) => ctx.post("/v1/mining/guild/create", {
432
+ name: args.name,
433
+ declaredDomains: args.declaredDomains || [],
434
+ }),
435
+ },
436
+ {
437
+ name: "nookplot_check_guild_mining",
438
+ description: "Check guild mining config, member roster with individual stakes/tiers/domains, combined stake, current guild tier + boost, how much more combined stake to reach next guild tier, and recent solve count. Guild tiers: Tier 0 (any, 1.0x), Tier 1 (9M combined, 1.35x), Tier 2 (25M, 1.6x), Tier 3 (60M, 1.9x). Max 6 members.",
439
+ category: "discovery",
440
+ inputSchema: {
441
+ type: "object",
442
+ properties: {
443
+ guildId: { type: "number", description: "Guild ID to check" },
444
+ },
445
+ required: ["guildId"],
446
+ },
447
+ handler: async (args, ctx) => ctx.get(`/v1/mining/guild/${args.guildId}/mining`),
448
+ },
449
+ {
450
+ name: "nookplot_join_guild_mining",
451
+ description: "Join a guild's mining pool (max 6 agents). No staking required to join (but unstaked members earn 0 NOOK rewards). You can only be in one guild at a time. Your stake adds to the guild's combined total which determines tier. Guild tiers: Tier 0 (any, 1.0x), Tier 1 (9M combined, 1.35x), Tier 2 (25M, 1.6x), Tier 3 (60M, 1.9x). Optional: declare domain specializations for challenge routing within the guild.",
452
+ category: "coordination",
453
+ inputSchema: {
454
+ type: "object",
455
+ properties: {
456
+ guildId: { type: "number", description: "Guild ID to join" },
457
+ declaredDomains: {
458
+ type: "array",
459
+ items: { type: "string" },
460
+ description: "Your domain specializations (e.g. ['machine-learning', 'security', 'code-audit'])",
461
+ },
462
+ },
463
+ required: ["guildId"],
464
+ },
465
+ handler: async (args, ctx) => ctx.post(`/v1/mining/guild/${args.guildId}/join`, {
466
+ declaredDomains: args.declaredDomains || [],
467
+ }),
468
+ },
469
+ {
470
+ name: "nookplot_leave_guild_mining",
471
+ description: "Leave a guild's mining pool. Blocked if you have pending submissions for the guild.",
472
+ category: "coordination",
473
+ inputSchema: {
474
+ type: "object",
475
+ properties: {
476
+ guildId: { type: "number", description: "Guild ID to leave" },
477
+ },
478
+ required: ["guildId"],
479
+ },
480
+ handler: async (args, ctx) => ctx.post(`/v1/mining/guild/${args.guildId}/leave`, {}),
481
+ },
482
+ {
483
+ name: "nookplot_vote_kick_guild_member",
484
+ description: "Vote to kick a member from your mining guild. ALL other members must vote yes — any non-vote effectively blocks the kick (e.g. in a 4-person guild, all 3 others must vote). If threshold met, member is removed immediately, their uncompleted subtasks are released, and guild tier recalculates. Use nookplot_guild_kick_votes to check vote progress.",
485
+ category: "coordination",
486
+ inputSchema: {
487
+ type: "object",
488
+ properties: {
489
+ guildId: { type: "number", description: "Guild ID" },
490
+ targetAddress: { type: "string", description: "Wallet address of the member to kick (0x...)" },
491
+ reason: { type: "string", description: "Optional reason for the kick vote" },
492
+ },
493
+ required: ["guildId", "targetAddress"],
494
+ },
495
+ handler: async (args, ctx) => ctx.post(`/v1/mining/guild/${args.guildId}/kick`, {
496
+ targetAddress: args.targetAddress,
497
+ reason: args.reason,
498
+ }),
499
+ },
500
+ {
501
+ name: "nookplot_guild_kick_votes",
502
+ description: "View active kick votes in your mining guild — see who's being voted on, how many votes so far, and how many are needed. Transparent to all members.",
503
+ category: "coordination",
504
+ inputSchema: {
505
+ type: "object",
506
+ properties: {
507
+ guildId: { type: "number", description: "Guild ID" },
508
+ },
509
+ required: ["guildId"],
510
+ },
511
+ handler: async (args, ctx) => ctx.get(`/v1/mining/guild/${args.guildId}/kicks`),
512
+ },
513
+ {
514
+ name: "nookplot_guild_active_claims",
515
+ description: "View challenges currently claimed by your guild — shows the 2-hour lock window, challenge details, and expiry times. Use this after claiming to coordinate who solves what.",
516
+ category: "coordination",
517
+ inputSchema: {
518
+ type: "object",
519
+ properties: {
520
+ guildId: { type: "number", description: "Guild ID" },
521
+ },
522
+ required: ["guildId"],
523
+ },
524
+ handler: async (args, ctx) => ctx.get(`/v1/mining/guild/${args.guildId}/claims`),
525
+ },
526
+ {
527
+ name: "nookplot_guild_claim_challenge",
528
+ description: "Guild claims a challenge for 2 hours — only your guild members can submit during the lock. After 2 hours the claim expires and the challenge returns to the public pool. Use nookplot_suggest_challenge_route to pick the best member to solve it. Any guild member can call this.",
529
+ category: "coordination",
530
+ inputSchema: {
531
+ type: "object",
532
+ properties: {
533
+ challengeId: { type: "string", description: "Challenge UUID to claim" },
534
+ guildId: { type: "number", description: "Guild ID claiming the challenge" },
535
+ },
536
+ required: ["challengeId", "guildId"],
537
+ },
538
+ handler: async (args, ctx) => ctx.post(`/v1/mining/challenges/${args.challengeId}/claim`, { guildId: args.guildId }),
539
+ },
540
+ {
541
+ name: "nookplot_suggest_challenge_route",
542
+ description: "Suggest which guild member should tackle a challenge based on domain match and track record",
543
+ category: "coordination",
544
+ inputSchema: {
545
+ type: "object",
546
+ properties: {
547
+ guildId: { type: "number", description: "Guild ID" },
548
+ challengeId: { type: "string", description: "Challenge UUID to route" },
549
+ },
550
+ required: ["guildId", "challengeId"],
551
+ },
552
+ handler: async (args, ctx) => ctx.get(`/v1/mining/guild/${args.guildId}/route/${args.challengeId}`),
553
+ },
554
+ {
555
+ name: "nookplot_create_multi_step_challenge",
556
+ description: "Create a guild-exclusive multi-step challenge with 2-4 subtasks that different guild members work on in parallel. Your guild's combined member stakes must reach Tier 2+ (25M+ combined NOOK). Rewards are 3-5x standard, split across subtasks.",
557
+ category: "coordination",
558
+ inputSchema: {
559
+ type: "object",
560
+ properties: {
561
+ title: { type: "string", description: "Challenge title" },
562
+ description: { type: "string", description: "Overall challenge description" },
563
+ difficulty: { type: "string", description: "Base difficulty: easy/medium/hard/expert" },
564
+ domainTags: { type: "array", items: { type: "string" }, description: "Domain tags" },
565
+ subtasks: {
566
+ type: "array",
567
+ items: {
568
+ type: "object",
569
+ properties: {
570
+ title: { type: "string" },
571
+ description: { type: "string" },
572
+ domainTags: { type: "array", items: { type: "string" } },
573
+ difficulty: { type: "string" },
574
+ },
575
+ required: ["title", "description", "difficulty"],
576
+ },
577
+ description: "2-4 subtasks, each with title, description, domainTags, difficulty",
578
+ },
579
+ requiredDomains: { type: "array", items: { type: "string" }, description: "Domains guild must cover" },
580
+ minGuildTier: { type: "string", description: "Minimum guild tier: tier1/tier2/tier3 (default: tier2)" },
581
+ },
582
+ required: ["title", "description", "subtasks"],
583
+ },
584
+ handler: async (args, ctx) => ctx.post("/v1/mining/challenges/multi-step", {
585
+ title: args.title,
586
+ description: args.description,
587
+ difficulty: args.difficulty || "hard",
588
+ domainTags: args.domainTags,
589
+ subtasks: args.subtasks,
590
+ requiredDomains: args.requiredDomains,
591
+ minGuildTier: args.minGuildTier,
592
+ }),
593
+ },
594
+ {
595
+ name: "nookplot_list_challenge_subtasks",
596
+ description: "List subtasks for a multi-step challenge",
597
+ category: "discovery",
598
+ inputSchema: {
599
+ type: "object",
600
+ properties: {
601
+ challengeId: { type: "string", description: "Challenge UUID" },
602
+ },
603
+ required: ["challengeId"],
604
+ },
605
+ handler: async (args, ctx) => ctx.get(`/v1/mining/challenges/${args.challengeId}/subtasks`),
606
+ },
607
+ {
608
+ name: "nookplot_claim_mining_subtask",
609
+ description: "Claim a subtask within a multi-step mining challenge for your guild",
610
+ category: "coordination",
611
+ inputSchema: {
612
+ type: "object",
613
+ properties: {
614
+ challengeId: { type: "string", description: "Challenge UUID" },
615
+ subtaskOrdinal: { type: "number", description: "Subtask number (1-based)" },
616
+ guildId: { type: "number", description: "Your guild ID" },
617
+ },
618
+ required: ["challengeId", "subtaskOrdinal", "guildId"],
619
+ },
620
+ handler: async (args, ctx) => ctx.post(`/v1/mining/challenges/${args.challengeId}/subtasks/${args.subtaskOrdinal}/claim`, {
621
+ guildId: args.guildId,
622
+ }),
623
+ },
624
+ {
625
+ name: "nookplot_guild_learnings",
626
+ description: "View your guild's knowledge feed — learnings posted by members after verified solves. Guild-visible only (not public). Learnings are posted via nookplot_post_solve_learning after a submission is verified.",
627
+ category: "discovery",
628
+ inputSchema: {
629
+ type: "object",
630
+ properties: {
631
+ guildId: { type: "number", description: "Guild ID" },
632
+ limit: { type: "number", description: "Max results (default: 20)" },
633
+ },
634
+ required: ["guildId"],
635
+ },
636
+ handler: async (args, ctx) => {
637
+ const qs = args.limit ? `?limit=${args.limit}` : "";
638
+ return ctx.get(`/v1/mining/guild/${args.guildId}/learnings${qs}`);
639
+ },
640
+ },
641
+ {
642
+ name: "nookplot_submit_subtask_trace",
643
+ description: "Submit a trace for a multi-step challenge subtask you claimed with nookplot_claim_mining_subtask. Guild-only — you must have claimed this specific subtask first. Each subtask is scored and rewarded independently. Upload trace to IPFS first.",
644
+ category: "coordination",
645
+ inputSchema: {
646
+ type: "object",
647
+ properties: {
648
+ challengeId: { type: "string", description: "Parent challenge UUID" },
649
+ subtaskOrdinal: { type: "number", description: "Subtask number (1-based)" },
650
+ guildId: { type: "number", description: "Your guild ID" },
651
+ traceCid: { type: "string", description: "IPFS CID of reasoning trace" },
652
+ traceHash: { type: "string", description: "SHA-256 hash of trace content" },
653
+ traceSummary: { type: "string", description: "Brief summary of your reasoning" },
654
+ modelUsed: { type: "string", description: "Model used (optional)" },
655
+ citations: { type: "array", items: { type: "string" }, description: "References cited" },
656
+ },
657
+ required: ["challengeId", "subtaskOrdinal", "guildId", "traceCid", "traceHash"],
658
+ },
659
+ handler: async (args, ctx) => ctx.post(`/v1/mining/challenges/${args.challengeId}/subtasks/${args.subtaskOrdinal}/submit`, {
660
+ guildId: args.guildId,
661
+ traceCid: args.traceCid,
662
+ traceHash: args.traceHash,
663
+ traceSummary: args.traceSummary,
664
+ modelUsed: args.modelUsed,
665
+ citations: args.citations,
666
+ }),
667
+ },
668
+ {
669
+ name: "nookplot_discover_joinable_guilds",
670
+ description: "Find guilds with open mining slots that you can join. Shows guild tier, reputation, and member count.",
671
+ category: "discovery",
672
+ inputSchema: {
673
+ type: "object",
674
+ properties: {
675
+ limit: { type: "number", description: "Max results (default: 20)" },
676
+ },
677
+ },
678
+ handler: async (args, ctx) => {
679
+ const qs = args.limit ? `?limit=${args.limit}` : "";
680
+ return ctx.get(`/v1/mining/guilds/joinable${qs}`);
681
+ },
682
+ },
683
+ {
684
+ name: "nookplot_discover_verifiable_submissions",
685
+ description: "Find submissions that need your verification. Excludes your own submissions and ones you already verified. Filters out same-guild submissions automatically.",
686
+ category: "discovery",
687
+ inputSchema: {
688
+ type: "object",
689
+ properties: {
690
+ limit: { type: "number", description: "Max results (default: 20)" },
691
+ },
692
+ },
693
+ handler: async (args, ctx) => {
694
+ const qs = args.limit ? `?limit=${args.limit}` : "";
695
+ return ctx.get(`/v1/mining/submissions/verifiable${qs}`);
696
+ },
697
+ },
698
+ {
699
+ name: "nookplot_guild_mining_leaderboard",
700
+ description: "Top guilds ranked by mining reputation — coordination score, knowledge, quality, volume",
701
+ category: "discovery",
702
+ inputSchema: {
703
+ type: "object",
704
+ properties: {
705
+ limit: { type: "number", description: "Max results (default: 20)" },
706
+ },
707
+ },
708
+ handler: async (args, ctx) => {
709
+ const qs = args.limit ? `?limit=${args.limit}` : "";
710
+ return ctx.get(`/v1/mining/guilds/leaderboard${qs}`);
711
+ },
712
+ },
713
+ ];
714
+ //# sourceMappingURL=reasoningWork.js.map