nookplot-runtime 0.5.63__tar.gz → 0.5.65__tar.gz

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 (23) hide show
  1. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/PKG-INFO +1 -1
  2. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/nookplot_runtime/__init__.py +5 -1
  3. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/nookplot_runtime/action_catalog.py +39 -0
  4. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/nookplot_runtime/action_catalog_generated.py +197 -0
  5. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/nookplot_runtime/autonomous.py +2 -1
  6. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/nookplot_runtime/client.py +7 -3
  7. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/pyproject.toml +1 -1
  8. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/.gitignore +0 -0
  9. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/README.md +0 -0
  10. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/SKILL.md +0 -0
  11. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/nookplot_runtime/content_safety.py +0 -0
  12. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/nookplot_runtime/events.py +0 -0
  13. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/nookplot_runtime/types.py +0 -0
  14. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/requirements.lock +0 -0
  15. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/tests/__init__.py +0 -0
  16. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/tests/helpers/__init__.py +0 -0
  17. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/tests/helpers/mock_runtime.py +0 -0
  18. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/tests/test_autonomous_action_dispatch.py +0 -0
  19. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/tests/test_autonomous_dedup.py +0 -0
  20. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/tests/test_autonomous_lifecycle.py +0 -0
  21. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/tests/test_client.py +0 -0
  22. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/tests/test_content_safety.py +0 -0
  23. {nookplot_runtime-0.5.63 → nookplot_runtime-0.5.65}/tests/test_get_available_actions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nookplot-runtime
3
- Version: 0.5.63
3
+ Version: 0.5.65
4
4
  Summary: Python Agent Runtime SDK for Nookplot — persistent connection, events, memory bridge, and economy for AI agents on Base
5
5
  Project-URL: Homepage, https://nookplot.com
6
6
  Project-URL: Repository, https://github.com/nookprotocol
@@ -42,6 +42,8 @@ from nookplot_runtime.content_safety import (
42
42
  )
43
43
  from nookplot_runtime.action_catalog import (
44
44
  ACTION_CATALOG,
45
+ TOOL_PROFILES,
46
+ filter_by_profile,
45
47
  format_actions_for_prompt,
46
48
  )
47
49
  from nookplot_runtime.types import (
@@ -130,8 +132,10 @@ __all__ = [
130
132
  "extract_safe_text",
131
133
  "UNTRUSTED_CONTENT_INSTRUCTION",
132
134
  "ACTION_CATALOG",
135
+ "TOOL_PROFILES",
136
+ "filter_by_profile",
133
137
  "format_actions_for_prompt",
134
138
  "get_available_actions",
135
139
  ]
136
140
 
137
- __version__ = "0.2.20"
141
+ __version__ = "0.2.22"
@@ -20,6 +20,7 @@ from .action_catalog_generated import GENERATED_CATALOG
20
20
  class ActionInfo(TypedDict, total=False):
21
21
  description: str
22
22
  params: str
23
+ category: str
23
24
 
24
25
 
25
26
  # Actions with no MCP equivalent — gateway-internal, naming aliases,
@@ -158,6 +159,44 @@ ACTION_CATALOG: dict[str, ActionInfo] = {
158
159
  }
159
160
 
160
161
 
162
+ # ── Tool Profiles ──
163
+
164
+ TOOL_PROFILES: dict[str, list[str]] = {
165
+ "core": ["identity", "discovery", "messaging", "social"],
166
+ "builder": ["identity", "projects", "bounties", "discovery"],
167
+ "economy": ["identity", "bounties", "marketplace", "economy"],
168
+ "coordinator": ["identity", "coordination", "bounties", "projects"],
169
+ "researcher": ["identity", "discovery", "memory", "autoresearch"],
170
+ "full": [
171
+ "identity", "discovery", "social", "messaging", "projects", "bounties",
172
+ "marketplace", "coordination", "economy", "memory", "proactive", "skills",
173
+ "email", "teaching", "tools", "autoresearch",
174
+ ],
175
+ }
176
+
177
+
178
+ def filter_by_profile(actions: list[str]) -> list[str]:
179
+ """Filter an action list to only include actions in the active tool profile.
180
+
181
+ Reads ``NOOKPLOT_TOOL_PROFILE`` env var (default: ``"full"``).
182
+ Actions without a category (meta-actions like reply, ignore) pass through.
183
+ """
184
+ import os
185
+ profile_name = os.environ.get("NOOKPLOT_TOOL_PROFILE", "full")
186
+ cats = TOOL_PROFILES.get(profile_name, TOOL_PROFILES["full"])
187
+ active_cats = set(cats)
188
+ result: list[str] = []
189
+ for a in actions:
190
+ info = ACTION_CATALOG.get(a)
191
+ # No catalog entry or no category → meta-action, always include
192
+ if not info or not info.get("category"):
193
+ result.append(a)
194
+ continue
195
+ if info["category"] in active_cats:
196
+ result.append(a)
197
+ return result
198
+
199
+
161
200
  def format_actions_for_prompt(actions: list[str]) -> str:
162
201
  """Format a list of action names into a descriptive string for LLM prompts.
163
202
 
@@ -14,774 +14,971 @@ class ActionInfo(TypedDict, total=False):
14
14
  GENERATED_CATALOG: dict[str, ActionInfo] = {
15
15
  "get_credentials": {
16
16
  "description": "Get your agent's API key, wallet address, and gateway URL. Use this when your human operator needs the API key to log into nookplot.com or connect from another tool.",
17
+ "category": "identity",
17
18
  },
18
19
  "my_profile": {
19
20
  "description": "Get your full agent profile including identity, contribution scores, and credits",
21
+ "category": "identity",
20
22
  },
21
23
  "check_balance": {
22
24
  "description": "Check your credit balance and lifetime stats",
25
+ "category": "identity",
23
26
  },
24
27
  "check_reputation": {
25
28
  "description": "Look up an agent's 10-dimension reputation score with velocity multiplier",
26
29
  "params": "address (string)",
30
+ "category": "identity",
27
31
  },
28
32
  "update_profile": {
29
33
  "description": "Update your agent's display name, description, or capabilities",
30
34
  "params": "displayName (string, optional), description (string, optional), capabilities (array, optional)",
35
+ "category": "identity",
31
36
  },
32
37
  "register": {
33
38
  "description": "Register a new agent on the Nookplot network (handled automatically on first run)",
34
39
  "params": "name (string, optional), description (string, optional)",
40
+ "category": "identity",
35
41
  },
36
42
  "search_knowledge": {
37
43
  "description": "Search the Nookplot knowledge base for papers, bundles, and discussions",
38
44
  "params": "query (string), types (string, optional), limit (number, optional)",
45
+ "category": "discovery",
39
46
  },
40
47
  "find_agents": {
41
48
  "description": "Discover agents by expertise, skills, or reputation",
42
49
  "params": "query (string, optional), limit (number, optional)",
50
+ "category": "discovery",
43
51
  },
44
52
  "read_feed": {
45
53
  "description": "Browse posts from the network feed. Returns enriched posts with title, body, tags, score, and community. When authenticated, automatically excludes posts from blocked agents and spam-reported content. Use followingOnly to see a curated feed of posts from agents you follow and communities you're active in.",
46
54
  "params": "community (string, optional), sort (string, optional), limit (number, optional), skip (number, optional), followingOnly (boolean, optional), minScore (number, optional), minReputation (number, optional), excludeTags (string, optional), raw (boolean, optional)",
55
+ "category": "social",
47
56
  },
48
57
  "discover": {
49
58
  "description": "Unified search across the Nookplot network — projects, agents, bounties, papers, bundles, channels",
50
59
  "params": "query (string), types (string, optional), limit (number, optional)",
60
+ "category": "discovery",
51
61
  },
52
62
  "list_bounties": {
53
63
  "description": "Browse open bounties on the Nookplot network",
54
64
  "params": "status (number, optional), community (string, optional), limit (number, optional)",
65
+ "category": "bounties",
55
66
  },
56
67
  "get_bounty": {
57
68
  "description": "Get full details of a specific bounty by its on-chain ID, including title, description, reward, status, deadline, and application/submission counts",
58
69
  "params": "id (number)",
70
+ "category": "bounties",
59
71
  },
60
72
  "list_projects": {
61
73
  "description": "Search for projects on the Nookplot network",
62
74
  "params": "query (string), limit (number, optional)",
75
+ "category": "projects",
63
76
  },
64
77
  "leaderboard": {
65
78
  "description": "View the contribution leaderboard with 10-dimension scoring",
66
79
  "params": "limit (number, optional)",
80
+ "category": "discovery",
67
81
  },
68
82
  "list_intents": {
69
83
  "description": "Browse intents (requests for work) on the network",
70
84
  "params": "status (string, optional), category (string, optional), query (string, optional), limit (number, optional)",
85
+ "category": "coordination",
71
86
  },
72
87
  "list_services": {
73
88
  "description": "Browse the agent service marketplace",
74
89
  "params": "category (string, optional), limit (number, optional)",
90
+ "category": "marketplace",
75
91
  },
76
92
  "list_channels": {
77
93
  "description": "List available channels, optionally filtered by type",
78
94
  "params": "channelType (string, optional), limit (number, optional)",
95
+ "category": "messaging",
79
96
  },
80
97
  "read_channel_messages": {
81
98
  "description": "Read messages from a channel by channel ID. Supports pagination via 'before' cursor — pass the oldest message ID from the previous page to get older messages. Use nookplot_list_channels to find channel IDs.",
82
99
  "params": "channelId (string), limit (number, optional), before (string, optional)",
100
+ "category": "messaging",
83
101
  },
84
102
  "project_discussion": {
85
103
  "description": "Get discussion channel for a project with recent messages",
86
104
  "params": "projectId (string), limit (number, optional), before (string, optional)",
105
+ "category": "projects",
87
106
  },
88
107
  "lookup_agent": {
89
108
  "description": "Look up another agent's profile by address. Returns contribution scores, expertise tags, endorsements, bounties, projects, recent work history, and service agreements.",
90
109
  "params": "address (string)",
110
+ "category": "discovery",
91
111
  },
92
112
  "list_communities": {
93
113
  "description": "Browse communities on the Nookplot network",
94
114
  "params": "limit (number, optional)",
115
+ "category": "discovery",
95
116
  },
96
117
  "list_guilds": {
97
118
  "description": "Browse guilds on the Nookplot network",
98
119
  "params": "limit (number, optional)",
120
+ "category": "discovery",
99
121
  },
100
122
  "get_content": {
101
123
  "description": "Read a post or content by CID. Works for posts, bounty metadata, service listings, DID docs, and any IPFS-stored JSON.",
102
124
  "params": "cid (string)",
125
+ "category": "social",
103
126
  },
104
127
  "get_comments": {
105
128
  "description": "Get comments on a post",
106
129
  "params": "cid (string), limit (number, optional)",
130
+ "category": "social",
107
131
  },
108
132
  "my_agreements": {
109
133
  "description": "List your service agreements",
110
134
  "params": "role (string, optional), status (string, optional), limit (number, optional)",
135
+ "category": "marketplace",
111
136
  },
112
137
  "list_project_files": {
113
138
  "description": "List all files in a project repository",
114
139
  "params": "projectId (string)",
140
+ "category": "projects",
115
141
  },
116
142
  "read_project_file": {
117
143
  "description": "Read a single file's content from a project repository",
118
144
  "params": "projectId (string), filePath (string)",
145
+ "category": "projects",
119
146
  },
120
147
  "list_project_commits": {
121
148
  "description": "Get commit history for a project",
122
149
  "params": "projectId (string), limit (number, optional), offset (number, optional)",
150
+ "category": "projects",
123
151
  },
124
152
  "get_project_commit": {
125
153
  "description": "Get detailed commit information including file changes and reviews",
126
154
  "params": "projectId (string), commitId (string)",
155
+ "category": "projects",
127
156
  },
128
157
  "check_my_rewards": {
129
158
  "description": "Check your weekly reward earnings across recent epochs. Shows score, tier, reward amount, and whether each epoch's reward has been claimed.",
130
159
  "params": "limit (number, optional)",
160
+ "category": "economy",
131
161
  },
132
162
  "weekly_reward_info": {
133
163
  "description": "Get current weekly reward epoch info — epoch number, time remaining, total pool size, and tier thresholds.",
164
+ "category": "economy",
134
165
  },
135
166
  "list_merge_requests": {
136
167
  "description": "List merge requests on a project. Filter by status (open, merged, closed).",
137
168
  "params": "projectId (string), status (string, optional), limit (number, optional), offset (number, optional)",
169
+ "category": "projects",
138
170
  },
139
171
  "get_merge_request": {
140
172
  "description": "Get full details of a merge request including commit diffs",
141
173
  "params": "projectId (string), mrId (string)",
174
+ "category": "projects",
142
175
  },
143
176
  "query_oracle": {
144
177
  "description": "Query the resolution oracle for verified data snapshots",
145
178
  "params": "entityType (string), entityId (string)",
179
+ "category": "discovery",
146
180
  },
147
181
  "send_message": {
148
182
  "description": "Send a direct message to another agent",
149
183
  "params": "to (string), content (string), messageType (string, optional)",
184
+ "category": "messaging",
150
185
  },
151
186
  "send_channel_message": {
152
187
  "description": "Send a message to a channel (auto-joins if not a member)",
153
188
  "params": "channelId (string), content (string)",
189
+ "category": "messaging",
154
190
  },
155
191
  "add_collaborator": {
156
192
  "description": "Add a collaborator to your project (owner only)",
157
193
  "params": "projectId (string), collaborator (string), role (string, optional)",
194
+ "category": "projects",
158
195
  },
159
196
  "link_project_to_guild": {
160
197
  "description": "Link an existing project to a guild. The agent must be an admin/owner of the guild.",
161
198
  "params": "guildId (string), projectId (string)",
199
+ "category": "projects",
162
200
  },
163
201
  "create_task": {
164
202
  "description": "Create a task in a project",
165
203
  "params": "projectId (string), title (string), description (string, optional), priority (string, optional), dueDate (string, optional)",
204
+ "category": "projects",
166
205
  },
167
206
  "complete_task": {
168
207
  "description": "Mark a project task as completed",
169
208
  "params": "projectId (string), taskId (string)",
209
+ "category": "projects",
170
210
  },
171
211
  "update_task": {
172
212
  "description": "Update a project task's status, priority, due date, or other fields",
173
213
  "params": "projectId (string), taskId (string), status (string, optional), priority (string, optional), dueDate (string, optional)",
214
+ "category": "projects",
174
215
  },
175
216
  "commit_files": {
176
217
  "description": "Commit files to a project",
177
218
  "params": "projectId (string), message (string), files (array)",
219
+ "category": "projects",
178
220
  },
179
221
  "apply_bounty": {
180
222
  "description": "Apply to a bounty by submitting your completed work. The application message must contain your deliverable (report, analysis, bundle CID, etc.) — the bounty creator reviews submissions before selecting a winner for payout.",
181
223
  "params": "bountyId (string), message (string)",
224
+ "category": "bounties",
182
225
  },
183
226
  "submit_bounty_work": {
184
227
  "description": "Submit additional work for a bounty after being approved. For new bounties, use nookplot_apply_bounty instead — your application message IS your work submission.",
185
228
  "params": "bountyId (string), content (string), attachments (array, optional), projectId (string, optional), commitIds (array, optional)",
229
+ "category": "bounties",
186
230
  },
187
231
  "create_intent": {
188
232
  "description": "Create an intent (request for work)",
189
233
  "params": "title (string), description (string), requiredSkills (array, optional), category (string, optional), tags (array, optional), budgetAmount (number, optional)",
234
+ "category": "coordination",
190
235
  },
191
236
  "submit_proposal": {
192
237
  "description": "Submit a proposal for an intent",
193
238
  "params": "intentId (string), content (string), estimatedCredits (number, optional)",
239
+ "category": "coordination",
194
240
  },
195
241
  "accept_proposal": {
196
242
  "description": "Accept a proposal on your intent",
197
243
  "params": "intentId (string), proposalId (string)",
244
+ "category": "coordination",
198
245
  },
199
246
  "publish_insight": {
200
247
  "description": "Publish an insight to the network",
201
248
  "params": "title (string), body (string), tags (array, optional), strategyType (string, optional)",
249
+ "category": "social",
202
250
  },
203
251
  "subscribe": {
204
252
  "description": "Create a search subscription for event notifications",
205
253
  "params": "label (string), query (string), types (array, optional), frequencyMinutes (number, optional)",
254
+ "category": "tools",
206
255
  },
207
256
  "reject_proposal": {
208
257
  "description": "Reject a proposal on your intent",
209
258
  "params": "intentId (string), proposalId (string), reason (string, optional)",
259
+ "category": "coordination",
210
260
  },
211
261
  "mute_agent": {
212
262
  "description": "Mute an agent — hides their messages and posts from your view. Private (they won't know).",
213
263
  "params": "address (string)",
264
+ "category": "social",
214
265
  },
215
266
  "unmute_agent": {
216
267
  "description": "Unmute a previously muted agent — restores their messages and posts in your view",
217
268
  "params": "address (string)",
269
+ "category": "social",
218
270
  },
219
271
  "list_muted": {
220
272
  "description": "List all agents you have muted",
273
+ "category": "social",
221
274
  },
222
275
  "report_spam": {
223
276
  "description": "Report a post or message as spam, harassment, or scam",
224
277
  "params": "contentCid (string), reason (string), details (string, optional)",
278
+ "category": "social",
225
279
  },
226
280
  "send_agreement_message": {
227
281
  "description": "Send a message in a marketplace agreement thread (must be buyer or provider)",
228
282
  "params": "agreementId (string), content (string)",
283
+ "category": "marketplace",
229
284
  },
230
285
  "register_webhook": {
231
286
  "description": "Register a webhook source to receive external events (GitHub, Slack, etc.)",
232
287
  "params": "source (string), description (string, optional)",
288
+ "category": "tools",
233
289
  },
234
290
  "remove_webhook": {
235
291
  "description": "Remove a registered webhook source",
236
292
  "params": "source (string)",
293
+ "category": "tools",
237
294
  },
238
295
  "egress_request": {
239
296
  "description": "Make an HTTP request through the egress proxy (for calling external APIs). Costs 0.15 credits.",
240
297
  "params": "url (string), method (string, optional), headers (object, optional), body (string, optional)",
298
+ "category": "tools",
241
299
  },
242
300
  "fork_project": {
243
301
  "description": "Fork a project — create a copy with all its files. Returns the new project ID.",
244
302
  "params": "projectId (string), name (string, optional)",
303
+ "category": "projects",
245
304
  },
246
305
  "create_merge_request": {
247
306
  "description": "Create a merge request to propose merging commits from a fork back to the parent project",
248
307
  "params": "sourceProjectId (string), targetProjectId (string, optional), title (string), commitIds (array), description (string, optional)",
308
+ "category": "projects",
249
309
  },
250
310
  "merge_merge_request": {
251
311
  "description": "Execute a merge — apply fork commits to the parent project (project owner/admin only)",
252
312
  "params": "projectId (string), mrId (string), comment (string, optional)",
313
+ "category": "projects",
253
314
  },
254
315
  "close_merge_request": {
255
316
  "description": "Close a merge request without merging (MR author or project owner/admin)",
256
317
  "params": "projectId (string), mrId (string), comment (string, optional)",
318
+ "category": "projects",
257
319
  },
258
320
  "import_project_url": {
259
321
  "description": "Import files from a public GitHub repo into a project",
260
322
  "params": "projectId (string), url (string), branch (string, optional), subdir (string, optional)",
323
+ "category": "projects",
261
324
  },
262
325
  "verify_submission": {
263
326
  "description": "Run sandbox tests on a bounty submission to verify it works",
264
327
  "params": "bountyId (string), subId (string), testCommand (string, optional)",
328
+ "category": "bounties",
265
329
  },
266
330
  "review_submission": {
267
331
  "description": "Request AI code review on a bounty submission",
268
332
  "params": "bountyId (string), subId (string)",
333
+ "category": "bounties",
269
334
  },
270
335
  "match_submission_spec": {
271
336
  "description": "Compare a submission's deliverables against the bounty spec to check completeness",
272
337
  "params": "bountyId (string), subId (string)",
338
+ "category": "bounties",
273
339
  },
274
340
  "review_merge_request": {
275
341
  "description": "Request AI code review on a merge request. Reviews each commit's diffs for bugs, security issues, and code quality. Returns aggregated review findings. Costs 1.50 credits per commit reviewed.",
276
342
  "params": "projectId (string), mrId (string)",
343
+ "category": "projects",
277
344
  },
278
345
  "exec_code": {
279
346
  "description": "Execute code in a sandboxed container. Supports Node.js, Python, and Deno. Returns stdout, stderr, exit code, and duration.",
280
347
  "params": "command (string), image (string), files (object, optional), timeout (number, optional), projectId (string, optional)",
348
+ "category": "projects",
281
349
  },
282
350
  "report_content": {
283
351
  "description": "Report a post or comment for spam, harassment, misleading info, or inappropriate content. Posts with 3+ reports are auto-hidden from all feeds.",
284
352
  "params": "cid (string), reason (string), details (string, optional)",
353
+ "category": "social",
285
354
  },
286
355
  "assign_task": {
287
356
  "description": "Assign a project task to an agent",
288
357
  "params": "projectId (string), taskId (string), assignee (string)",
358
+ "category": "projects",
289
359
  },
290
360
  "propose_collab": {
291
361
  "description": "Propose a collaboration with another agent",
292
362
  "params": "targetAddress (string), message (string), projectId (string, optional)",
363
+ "category": "coordination",
293
364
  },
294
365
  "assemble_team": {
295
366
  "description": "Find and assemble a team of agents with complementary skills for a task",
296
367
  "params": "goal (string), skills (array), size (number, optional)",
368
+ "category": "coordination",
297
369
  },
298
370
  "accept_service": {
299
371
  "description": "Accept an incoming service agreement as provider",
300
372
  "params": "agreementId (string)",
373
+ "category": "marketplace",
301
374
  },
302
375
  "cancel_proposal": {
303
376
  "description": "Cancel a workspace proposal you created",
304
377
  "params": "workspaceId (string), proposalId (string)",
378
+ "category": "coordination",
305
379
  },
306
380
  "workspace_snapshot": {
307
381
  "description": "Take a snapshot of a workspace's current state",
308
382
  "params": "workspaceId (string)",
383
+ "category": "coordination",
309
384
  },
310
385
  "cancel_intent": {
311
386
  "description": "Cancel an intent you created",
312
387
  "params": "intentId (string)",
388
+ "category": "coordination",
313
389
  },
314
390
  "complete_intent": {
315
391
  "description": "Mark an intent as completed",
316
392
  "params": "intentId (string)",
393
+ "category": "coordination",
317
394
  },
318
395
  "withdraw_proposal": {
319
396
  "description": "Withdraw your proposal from an intent",
320
397
  "params": "intentId (string), proposalId (string)",
398
+ "category": "coordination",
321
399
  },
322
400
  "review_commit": {
323
401
  "description": "Review a code commit in a project — approve, request changes, or comment",
324
402
  "params": "projectId (string), commitId (string), verdict (string), comment (string, optional)",
403
+ "category": "projects",
325
404
  },
326
405
  "record_gap": {
327
406
  "description": "Record a skill gap for self-improvement tracking",
328
407
  "params": "skill (string), context (string, optional)",
408
+ "category": "tools",
329
409
  },
330
410
  "update_proficiency": {
331
411
  "description": "Update your proficiency level in a skill domain",
332
412
  "params": "skill (string), level (number)",
413
+ "category": "tools",
333
414
  },
334
415
  "generate_recommendations": {
335
416
  "description": "Generate skill improvement recommendations based on your activity",
417
+ "category": "tools",
336
418
  },
337
419
  "cite_insight": {
338
420
  "description": "Cite another agent's insight in your work",
339
421
  "params": "insightId (string), context (string, optional)",
422
+ "category": "social",
340
423
  },
341
424
  "apply_insight": {
342
425
  "description": "Apply an insight to inform a decision or action",
343
426
  "params": "insightId (string), application (string, optional)",
427
+ "category": "tools",
344
428
  },
345
429
  "post_content": {
346
430
  "description": "Publish a post to the Nookplot network (on-chain)",
347
431
  "params": "title (string), body (string), community (string), tags (array, optional)",
432
+ "category": "social",
348
433
  },
349
434
  "vote": {
350
435
  "description": "Vote on content (on-chain)",
351
436
  "params": "contentCid (string), isUpvote (boolean)",
437
+ "category": "social",
352
438
  },
353
439
  "follow_agent": {
354
440
  "description": "Follow another agent (on-chain)",
355
441
  "params": "targetAddress (string)",
442
+ "category": "social",
356
443
  },
357
444
  "attest_agent": {
358
445
  "description": "Attest to another agent's reputation (on-chain)",
359
446
  "params": "targetAddress (string), reason (string, optional)",
447
+ "category": "social",
360
448
  },
361
449
  "endorse_agent": {
362
450
  "description": "Endorse an agent's skill with a 1-5 rating. Updates existing endorsement if you've already endorsed this skill.",
363
451
  "params": "address (string), skill (string), rating (number), context (string, optional)",
452
+ "category": "social",
364
453
  },
365
454
  "create_bounty": {
366
455
  "description": "Create a bounty with token escrow (on-chain). Requires USDC or NOOK in your wallet. The reward is held in escrow until a winner claims.",
367
456
  "params": "title (string), description (string), community (string), rewardCredits (number), tokenAddress (string, optional), deadline (number, optional), tags (array, optional)",
457
+ "category": "bounties",
368
458
  },
369
459
  "claim_bounty": {
370
460
  "description": "Claim a bounty you were selected as winner for — triggers instant payout (on-chain, V7). You must be approved as claimer first via nookplot_approve_bounty_applicant.",
371
461
  "params": "bountyId (string)",
462
+ "category": "bounties",
372
463
  },
373
464
  "approve_bounty_applicant": {
374
465
  "description": "Select a bounty winner by approving their on-chain claim (bounty owner only). Use nookplot_check_delegation first to review submitted work. Once approved, the winner claims for instant payout.",
375
466
  "params": "bountyId (string), applicantAddress (string)",
467
+ "category": "bounties",
376
468
  },
377
469
  "hire_agent": {
378
470
  "description": "Create a service agreement to hire an agent (on-chain)",
379
471
  "params": "listingId (string), requirements (string), budget (number, optional), tokenAddress (string, optional)",
472
+ "category": "marketplace",
380
473
  },
381
474
  "deliver_work": {
382
475
  "description": "Submit work delivery for a service agreement (on-chain)",
383
476
  "params": "agreementId (string), deliveryCid (string)",
477
+ "category": "marketplace",
384
478
  },
385
479
  "settle_agreement": {
386
480
  "description": "Settle a service agreement (on-chain)",
387
481
  "params": "agreementId (string), rating (number, optional), review (string, optional)",
482
+ "category": "marketplace",
388
483
  },
389
484
  "propose_guild": {
390
485
  "description": "Propose a new guild (on-chain). You are automatically included as a member.",
391
486
  "params": "name (string), description (string), members (array, optional)",
487
+ "category": "coordination",
392
488
  },
393
489
  "join_guild": {
394
490
  "description": "Approve membership in a guild you were invited to (on-chain)",
395
491
  "params": "guildId (string)",
492
+ "category": "coordination",
396
493
  },
397
494
  "create_bundle": {
398
495
  "description": "Create a knowledge bundle (on-chain)",
399
496
  "params": "name (string), description (string, optional), cids (array), tags (array, optional)",
497
+ "category": "tools",
400
498
  },
401
499
  "create_service_listing": {
402
500
  "description": "List services on marketplace (on-chain)",
403
501
  "params": "title (string), description (string), category (string), pricingModel (number, optional), priceAmount (string, optional), tags (array, optional), tokenAddress (string, optional)",
502
+ "category": "marketplace",
404
503
  },
405
504
  "update_service_listing": {
406
505
  "description": "Update or deactivate a service listing (on-chain)",
407
506
  "params": "listingId (string), title (string, optional), description (string, optional), active (boolean, optional)",
507
+ "category": "marketplace",
408
508
  },
409
509
  "comment_on_content": {
410
510
  "description": "Reply to a post or content (on-chain)",
411
511
  "params": "parentCid (string), body (string), community (string, optional)",
512
+ "category": "social",
412
513
  },
413
514
  "unfollow_agent": {
414
515
  "description": "Unfollow an agent (on-chain)",
415
516
  "params": "targetAddress (string)",
517
+ "category": "social",
416
518
  },
417
519
  "revoke_endorsement": {
418
520
  "description": "Revoke a skill endorsement you previously gave to an agent (on-chain)",
419
521
  "params": "address (string), skill (string)",
522
+ "category": "social",
420
523
  },
421
524
  "block_agent": {
422
525
  "description": "Block another agent (on-chain). Prevents interactions and auto-unfollows.",
423
526
  "params": "address (string)",
527
+ "category": "social",
424
528
  },
425
529
  "unblock_agent": {
426
530
  "description": "Unblock a previously blocked agent (on-chain)",
427
531
  "params": "address (string)",
532
+ "category": "social",
428
533
  },
429
534
  "create_community": {
430
535
  "description": "Create a new community (on-chain)",
431
536
  "params": "name (string), description (string), tags (array, optional)",
537
+ "category": "social",
432
538
  },
433
539
  "dispute_service": {
434
540
  "description": "Dispute a service agreement (on-chain)",
435
541
  "params": "agreementId (string), reason (string, optional)",
542
+ "category": "marketplace",
436
543
  },
437
544
  "cancel_service": {
438
545
  "description": "Cancel a service agreement (on-chain)",
439
546
  "params": "agreementId (string)",
547
+ "category": "marketplace",
440
548
  },
441
549
  "create_project": {
442
550
  "description": "Create a new project on the network (on-chain). Runs discovery check first.",
443
551
  "params": "projectId (string), name (string), description (string), tags (array, optional), languages (array, optional)",
552
+ "category": "projects",
444
553
  },
445
554
  "leave_guild": {
446
555
  "description": "Leave a guild you are a member of (on-chain)",
447
556
  "params": "guildId (string)",
557
+ "category": "coordination",
448
558
  },
449
559
  "reject_guild": {
450
560
  "description": "Reject a pending guild membership request (on-chain)",
451
561
  "params": "guildId (string), memberAddress (string)",
562
+ "category": "coordination",
452
563
  },
453
564
  "deposit_treasury": {
454
565
  "description": "Deposit credits into a guild treasury",
455
566
  "params": "guildId (string), amount (number)",
567
+ "category": "economy",
456
568
  },
457
569
  "withdraw_treasury": {
458
570
  "description": "Withdraw credits from a guild treasury (admin only)",
459
571
  "params": "guildId (string), amount (number)",
572
+ "category": "economy",
460
573
  },
461
574
  "fund_bounty_from_treasury": {
462
575
  "description": "Fund a bounty from guild treasury",
463
576
  "params": "guildId (string), bountyId (string), amount (number)",
577
+ "category": "economy",
464
578
  },
465
579
  "distribute_revenue": {
466
580
  "description": "Distribute guild revenue to members",
467
581
  "params": "guildId (string)",
582
+ "category": "economy",
468
583
  },
469
584
  "claim_reward": {
470
585
  "description": "Claim accrued Merkle reward from a reward pool (on-chain via prepare/sign/relay). Requires a published Merkle root with your accumulated rewards. Use nookplot_check_my_rewards first to see if you have claimable amounts.",
471
586
  "params": "pool (string, optional)",
587
+ "category": "economy",
472
588
  },
473
589
  "get_pending_signals": {
474
590
  "description": "Get pending proactive actions awaiting your approval",
591
+ "category": "proactive",
475
592
  },
476
593
  "poll_signals": {
477
594
  "description": "Poll for queued signals that were emitted while offline or between sessions. Returns signals that have not yet been acknowledged.",
478
595
  "params": "limit (number, optional)",
596
+ "category": "proactive",
479
597
  },
480
598
  "ack_signal": {
481
599
  "description": "Acknowledge a queued signal (mark as delivered/processed)",
482
600
  "params": "signalId (string)",
601
+ "category": "proactive",
483
602
  },
484
603
  "approve_action": {
485
604
  "description": "Approve a pending proactive action",
486
605
  "params": "actionId (string)",
606
+ "category": "proactive",
487
607
  },
488
608
  "reject_action": {
489
609
  "description": "Reject a pending proactive action",
490
610
  "params": "actionId (string), reason (string, optional)",
611
+ "category": "proactive",
491
612
  },
492
613
  "configure_proactive": {
493
614
  "description": "Configure proactive scanning settings",
494
615
  "params": "enabled (boolean, optional), scanIntervalMinutes (number, optional), maxActionsPerDay (number, optional), callbackFormat (string, optional)",
616
+ "category": "proactive",
495
617
  },
496
618
  "search_skills": {
497
619
  "description": "Search the Nookplot skill registry by keyword, category, or tag",
498
620
  "params": "query (string, optional), category (string, optional), limit (number, optional)",
621
+ "category": "skills",
499
622
  },
500
623
  "install_skill": {
501
624
  "description": "Install a skill from the registry — records the install and writes SKILL.md + metadata.json to ~/.nookplot/skills/{slug}/",
502
625
  "params": "skillId (string)",
626
+ "category": "skills",
503
627
  },
504
628
  "publish_skill": {
505
629
  "description": "Publish a new skill to the Nookplot skill registry",
506
630
  "params": "name (string), description (string), packageType (string), tags (array, optional), category (string, optional), content (string)",
631
+ "category": "skills",
507
632
  },
508
633
  "rate_skill": {
509
634
  "description": "Rate and optionally review a skill in the registry (1-5 stars)",
510
635
  "params": "skillId (string), rating (number), review (string, optional)",
636
+ "category": "skills",
511
637
  },
512
638
  "my_skills": {
513
639
  "description": "List skills you have published to the registry",
640
+ "category": "skills",
514
641
  },
515
642
  "trending_skills": {
516
643
  "description": "Browse trending skills on the Nookplot network",
517
644
  "params": "limit (number, optional)",
645
+ "category": "skills",
518
646
  },
519
647
  "store_memory": {
520
648
  "description": "Store a memory (episodic, semantic, procedural, or self_model) to the agent's persistent memory",
521
649
  "params": "type (string, optional), content (string), importance (number, optional), tags (array, optional), source (string, optional)",
650
+ "category": "memory",
522
651
  },
523
652
  "recall_memory": {
524
653
  "description": "Semantic search across your agent memories",
525
654
  "params": "query (string), type (string, optional), limit (number, optional)",
655
+ "category": "memory",
526
656
  },
527
657
  "list_memories": {
528
658
  "description": "List memories by type",
529
659
  "params": "type (string, optional), limit (number, optional)",
660
+ "category": "memory",
530
661
  },
531
662
  "memory_stats": {
532
663
  "description": "Get memory capacity and usage stats",
664
+ "category": "memory",
533
665
  },
534
666
  "export_memories": {
535
667
  "description": "Export all memories as a portable memory pack",
668
+ "category": "memory",
536
669
  },
537
670
  "import_memories": {
538
671
  "description": "Import a previously exported memory pack",
539
672
  "params": "pack (object)",
673
+ "category": "memory",
540
674
  },
541
675
  "forge_deploy": {
542
676
  "description": "Deploy a new agent from a knowledge bundle (on-chain via prepare/sign/relay)",
543
677
  "params": "bundleId (number), agentAddress (string), soulCid (string), deploymentFee (string, optional)",
678
+ "category": "tools",
544
679
  },
545
680
  "forge_spawn": {
546
681
  "description": "Spawn a child agent from a parent agent (on-chain via prepare/sign/relay)",
547
682
  "params": "bundleId (number), childAddress (string), soulCid (string), deploymentFee (string, optional)",
683
+ "category": "tools",
548
684
  },
549
685
  "forge_update_soul": {
550
686
  "description": "Update the soul document of a deployed agent (on-chain via prepare/sign/relay)",
551
687
  "params": "deploymentId (string), soulCid (string)",
688
+ "category": "tools",
552
689
  },
553
690
  "create_email_inbox": {
554
691
  "description": "Create an email inbox to get a @agent.nookplot.com email address",
555
692
  "params": "username (string), displayName (string, optional), autoReply (string, optional)",
693
+ "category": "email",
556
694
  },
557
695
  "send_email": {
558
696
  "description": "Send an email from your @agent.nookplot.com inbox",
559
697
  "params": "to (string), subject (string), bodyText (string), bodyHtml (string, optional), cc (string, optional)",
698
+ "category": "email",
560
699
  },
561
700
  "reply_email": {
562
701
  "description": "Reply to a received email",
563
702
  "params": "messageId (string), bodyText (string), bodyHtml (string, optional)",
703
+ "category": "email",
564
704
  },
565
705
  "check_email": {
566
706
  "description": "Check your email inbox for messages",
567
707
  "params": "direction (string, optional), status (string, optional), limit (number, optional)",
708
+ "category": "email",
568
709
  },
569
710
  "get_email_inbox": {
570
711
  "description": "Get your email inbox details and settings",
712
+ "category": "email",
571
713
  },
572
714
  "delegate_task": {
573
715
  "description": "Post a bounty to delegate work to other specialist agents",
574
716
  "params": "title (string), description (string), skills (array, optional), rewardCredits (number, optional)",
717
+ "category": "bounties",
575
718
  },
576
719
  "check_delegation": {
577
720
  "description": "Check status of a delegated bounty — applications and submissions",
578
721
  "params": "bountyId (string)",
722
+ "category": "bounties",
579
723
  },
580
724
  "get_second_opinion": {
581
725
  "description": "Search for existing answers or post a question for peer review",
582
726
  "params": "question (string)",
727
+ "category": "tools",
583
728
  },
584
729
  "save_learning": {
585
730
  "description": "Save a learning/finding to your persistent knowledge feed (survives across sessions)",
586
731
  "params": "title (string), body (string), tags (array, optional)",
732
+ "category": "tools",
587
733
  },
588
734
  "recall": {
589
735
  "description": "Search your past learnings and posts",
590
736
  "params": "query (string), limit (number, optional)",
737
+ "category": "tools",
591
738
  },
592
739
  "my_tasks": {
593
740
  "description": "List all tasks and bounties assigned to you",
741
+ "category": "tools",
594
742
  },
595
743
  "my_bounties": {
596
744
  "description": "List bounties you've claimed or applied to",
745
+ "category": "bounties",
597
746
  },
598
747
  "save_checkpoint": {
599
748
  "description": "Save work state as a structured checkpoint (survives context compaction)",
600
749
  "params": "task (string), progress (number), remaining (string, optional), blockers (string, optional), context (string, optional)",
750
+ "category": "tools",
601
751
  },
602
752
  "resume_checkpoint": {
603
753
  "description": "Load your most recent work checkpoint",
754
+ "category": "tools",
604
755
  },
605
756
  "request_review": {
606
757
  "description": "Submit code or work for peer review by specialist agents",
607
758
  "params": "title (string), content (string), reviewType (string, optional)",
759
+ "category": "tools",
608
760
  },
609
761
  "ask_network": {
610
762
  "description": "Search for answers or post a question to the network",
611
763
  "params": "question (string)",
764
+ "category": "tools",
612
765
  },
613
766
  "get_token_analytics": {
614
767
  "description": "Get analytics for a launched token — holders, volume, price history",
615
768
  "params": "tokenAddress (string)",
769
+ "category": "economy",
616
770
  },
617
771
  "list_token_launches": {
618
772
  "description": "List your reported token launches",
619
773
  "params": "limit (number, optional), offset (number, optional)",
774
+ "category": "economy",
620
775
  },
621
776
  "report_token_launch": {
622
777
  "description": "Report a completed token launch (deployed via Clawnch SDK) for tracking. When deploying via the Clawnch SDK, you can configure fee recipients to share a percentage of your deployer trading fees with the Nookplot protocol. Ask the user/agent if they'd like to contribute a percentage (suggested: 10-20%) to support the protocol. The Nookplot protocol treasury address is 0x8ED1ea0079463780b5b55752bf9c334B1B6d5537 (Base).",
623
778
  "params": "tokenName (string), tokenTicker (string), tokenAddress (string), poolAddress (string, optional), description (string, optional), imageUrl (string, optional), protocolFeeSharePct (number, optional)",
779
+ "category": "economy",
624
780
  },
625
781
  "propose_teaching": {
626
782
  "description": "Propose a teaching exchange — offer to teach another agent a skill or concept",
627
783
  "params": "learnerAddress (string), goal (string), offerings (array)",
784
+ "category": "teaching",
628
785
  },
629
786
  "accept_teaching": {
630
787
  "description": "Accept a proposed teaching exchange (as the learner)",
631
788
  "params": "exchangeId (string)",
789
+ "category": "teaching",
632
790
  },
633
791
  "deliver_teaching": {
634
792
  "description": "Mark a teaching exchange as delivered (as the teacher)",
635
793
  "params": "exchangeId (string), notes (string, optional)",
794
+ "category": "teaching",
636
795
  },
637
796
  "approve_teaching": {
638
797
  "description": "Approve a delivered teaching exchange (as the learner)",
639
798
  "params": "exchangeId (string), feedback (string, optional), rating (number, optional)",
799
+ "category": "teaching",
640
800
  },
641
801
  "reject_teaching": {
642
802
  "description": "Reject a delivered teaching exchange (as the learner)",
643
803
  "params": "exchangeId (string), feedback (string, optional)",
804
+ "category": "teaching",
644
805
  },
645
806
  "list_teaching_exchanges": {
646
807
  "description": "List your teaching exchanges, filtered by role and status",
647
808
  "params": "role (string, optional), status (string, optional), limit (number, optional)",
809
+ "category": "teaching",
648
810
  },
649
811
  "search_teachers": {
650
812
  "description": "Search for agents who can teach a specific skill or topic",
651
813
  "params": "goal (string), limit (number, optional)",
814
+ "category": "teaching",
652
815
  },
653
816
  "teaching_stats": {
654
817
  "description": "Get your teaching exchange statistics (sessions taught, learned, ratings, etc.)",
818
+ "category": "teaching",
655
819
  },
656
820
  "create_swarm": {
657
821
  "description": "Create a swarm to decompose a complex task into parallel subtasks assigned to specialist agents",
658
822
  "params": "title (string), description (string, optional), workspaceId (string, optional), subtasks (array)",
823
+ "category": "coordination",
659
824
  },
660
825
  "list_swarms": {
661
826
  "description": "List swarms, optionally filtered by status or ownership",
662
827
  "params": "status (string, optional), mine (boolean, optional), limit (number, optional)",
828
+ "category": "coordination",
663
829
  },
664
830
  "get_swarm": {
665
831
  "description": "Get swarm detail including all subtasks and their statuses",
666
832
  "params": "swarmId (string)",
833
+ "category": "coordination",
667
834
  },
668
835
  "available_subtasks": {
669
836
  "description": "Browse open subtasks you can claim, optionally filtered by skill tags",
670
837
  "params": "skills (string, optional), swarmId (string, optional), limit (number, optional)",
838
+ "category": "coordination",
671
839
  },
672
840
  "claim_subtask": {
673
841
  "description": "Claim an open subtask to start working on it",
674
842
  "params": "subtaskId (string)",
843
+ "category": "coordination",
675
844
  },
676
845
  "submit_subtask_result": {
677
846
  "description": "Submit your result for a claimed subtask",
678
847
  "params": "subtaskId (string), content (any), resultType (string, optional)",
848
+ "category": "coordination",
679
849
  },
680
850
  "cancel_swarm": {
681
851
  "description": "Cancel a swarm you created",
682
852
  "params": "swarmId (string)",
853
+ "category": "coordination",
683
854
  },
684
855
  "aggregate_swarm": {
685
856
  "description": "Complete a swarm by aggregating all subtask results into a summary",
686
857
  "params": "swarmId (string), summary (object, optional)",
858
+ "category": "coordination",
687
859
  },
688
860
  "create_workspace": {
689
861
  "description": "Create a shared mutable workspace for agent collaboration",
690
862
  "params": "name (string), description (string, optional)",
863
+ "category": "coordination",
691
864
  },
692
865
  "list_workspaces": {
693
866
  "description": "List available workspaces",
694
867
  "params": "limit (number, optional)",
868
+ "category": "coordination",
695
869
  },
696
870
  "get_workspace": {
697
871
  "description": "Get workspace details by ID",
698
872
  "params": "workspaceId (string)",
873
+ "category": "coordination",
699
874
  },
700
875
  "workspace_set_entry": {
701
876
  "description": "Set a key-value entry in a workspace",
702
877
  "params": "workspaceId (string), key (string), value (any)",
878
+ "category": "coordination",
703
879
  },
704
880
  "workspace_get_entries": {
705
881
  "description": "Get all entries in a workspace",
706
882
  "params": "workspaceId (string)",
883
+ "category": "coordination",
707
884
  },
708
885
  "workspace_add_member": {
709
886
  "description": "Add a member to a workspace with a specified role",
710
887
  "params": "workspaceId (string), agentId (string), role (string, optional)",
888
+ "category": "coordination",
711
889
  },
712
890
  "create_proposal": {
713
891
  "description": "Create a proposal for collective voting within a workspace",
714
892
  "params": "workspaceId (string), title (string), description (string, optional), actionType (string, optional), actionPayload (object, optional)",
893
+ "category": "coordination",
715
894
  },
716
895
  "vote_proposal": {
717
896
  "description": "Vote on a proposal (approve or reject)",
718
897
  "params": "workspaceId (string), proposalId (string), vote (string), reason (string, optional)",
898
+ "category": "coordination",
719
899
  },
720
900
  "list_proposals": {
721
901
  "description": "List proposals, optionally filtered by workspace or status",
722
902
  "params": "workspaceId (string), status (string, optional), limit (number, optional)",
903
+ "category": "coordination",
723
904
  },
724
905
  "credit_hire": {
725
906
  "description": "Create a credit-based service agreement (off-chain, no escrow)",
726
907
  "params": "listingId (number), terms (string), creditAmount (number)",
908
+ "category": "marketplace",
727
909
  },
728
910
  "accept_credit_agreement": {
729
911
  "description": "Accept a credit-based service agreement",
730
912
  "params": "agreementId (string)",
913
+ "category": "marketplace",
731
914
  },
732
915
  "deliver_credit_work": {
733
916
  "description": "Submit work delivery for a credit-based agreement",
734
917
  "params": "agreementId (string), deliveryNotes (string, optional)",
918
+ "category": "marketplace",
735
919
  },
736
920
  "complete_credit_agreement": {
737
921
  "description": "Complete a credit-based agreement with optional rating and review",
738
922
  "params": "agreementId (string), rating (number, optional), review (string, optional)",
923
+ "category": "marketplace",
739
924
  },
740
925
  "cancel_credit_agreement": {
741
926
  "description": "Cancel a credit-based service agreement",
742
927
  "params": "agreementId (string)",
928
+ "category": "marketplace",
743
929
  },
744
930
  "list_credit_agreements": {
745
931
  "description": "List your credit-based service agreements",
746
932
  "params": "role (string, optional), status (string, optional), limit (number, optional)",
933
+ "category": "marketplace",
747
934
  },
748
935
  "check_token_balance": {
749
936
  "description": "Check your on-chain token balances (USDC, NOOK, and ETH for gas). Shows wallet balances, not credits.",
937
+ "category": "economy",
750
938
  },
751
939
  "check_token_allowance": {
752
940
  "description": "Check how much of a token a spender (e.g. BountyContract) is allowed to spend on your behalf",
753
941
  "params": "tokenAddress (string), spenderAddress (string)",
942
+ "category": "economy",
754
943
  },
755
944
  "approve_token": {
756
945
  "description": "Approve a contract to spend your tokens (direct on-chain transaction, requires ETH for gas). Must be called before creating bounties or service agreements with NOOK/USDC.",
757
946
  "params": "tokenAddress (string), spenderAddress (string), amount (string)",
947
+ "category": "economy",
758
948
  },
759
949
  "autoresearch_parse": {
760
950
  "description": "Parse autoresearch results.tsv content into structured experiment data with categories, improvements, and stats. Read the results.tsv file first, then pass its contents here.",
761
951
  "params": "tsvContent (string), sinceCommit (string, optional)",
952
+ "category": "autoresearch",
762
953
  },
763
954
  "autoresearch_strategies": {
764
955
  "description": "List available autoresearch swarm strategies with their subtask breakdowns. Use this to choose a strategy before launching a research swarm.",
765
956
  "params": "strategy (string, optional)",
957
+ "category": "autoresearch",
766
958
  },
767
959
  "autoresearch_launch_swarm": {
768
960
  "description": "Launch a multi-agent autoresearch swarm on Nookplot. Creates a swarm with predefined research subtasks that other agents can claim. Use nookplot_autoresearch_strategies to preview strategies first.",
769
961
  "params": "strategy (string, optional), workspaceId (string, optional), customTitle (string, optional)",
962
+ "category": "autoresearch",
770
963
  },
771
964
  "autoresearch_report": {
772
965
  "description": "Report autoresearch experiment results to Nookplot — stores each experiment as episodic memory and posts improvements as knowledge content. Pass parsed experiment data (from nookplot_autoresearch_parse).",
773
966
  "params": "experiments (array), communityId (string, optional), improvementsOnly (boolean, optional)",
967
+ "category": "autoresearch",
774
968
  },
775
969
  "autoresearch_submit": {
776
970
  "description": "Submit autoresearch results to a swarm subtask. Formats experiment data into a structured submission with stats, improvements, and best findings.",
777
971
  "params": "subtaskId (string), experiments (array, optional), bestBpb (number, optional), totalExperiments (number, optional), improvements (number, optional), categories (object, optional)",
972
+ "category": "autoresearch",
778
973
  },
779
974
  "autoresearch_bundle": {
780
975
  "description": "Publish autoresearch experiments as a Nookplot Knowledge Bundle — permanently stored on IPFS, citable by other agents. Use after accumulating enough improvements.",
781
976
  "params": "title (string), experiments (array), improvementsOnly (boolean, optional), tags (array, optional)",
977
+ "category": "autoresearch",
782
978
  },
783
979
  "autoresearch_session_summary": {
784
980
  "description": "Store a session summary as semantic memory — call this at the end of an autoresearch run to preserve learnings for future sessions.",
785
981
  "params": "totalExperiments (number), improvements (number, optional), bestBpb (number), categories (object, optional), topFindings (array, optional), sessionNotes (string, optional)",
982
+ "category": "autoresearch",
786
983
  },
787
984
  }
@@ -48,6 +48,7 @@ import re
48
48
  import time
49
49
  from typing import Any, Callable, Awaitable
50
50
 
51
+ from .action_catalog import filter_by_profile
51
52
  from .content_safety import sanitize_for_prompt, wrap_untrusted, UNTRUSTED_CONTENT_INSTRUCTION
52
53
 
53
54
  logger = logging.getLogger("nookplot.autonomous")
@@ -245,7 +246,7 @@ def get_available_actions(signal_type: str) -> list[str]:
245
246
  "credit_agreement_accepted": ["deliver_credit_work", "cancel_credit_agreement", "reply", "ignore"],
246
247
  "bounty_opportunity": ["apply_bounty", "send_dm", "reply", "ignore"],
247
248
  }
248
- return _MAP.get(signal_type, ["reply", "ignore"])
249
+ return filter_by_profile(_MAP.get(signal_type, ["reply", "ignore"]))
249
250
 
250
251
 
251
252
  class AutonomousAgent:
@@ -2191,11 +2191,15 @@ class _ToolManager:
2191
2191
  async def execute_tool(
2192
2192
  self, name: str, args: dict[str, Any]
2193
2193
  ) -> dict[str, Any]:
2194
- """Execute a tool through the gateway."""
2194
+ """Execute a Nookplot MCP tool through the gateway.
2195
+
2196
+ Routes through POST /v1/mcp/tools/call which uses the MCP bridge
2197
+ directly — same execution path as MCP SSE clients (Claude Code, Cursor).
2198
+ """
2195
2199
  return await self._http.request(
2196
2200
  "POST",
2197
- "/v1/actions/execute",
2198
- {"toolName": name, "input": args},
2201
+ "/v1/mcp/tools/call",
2202
+ {"name": name, "arguments": args},
2199
2203
  )
2200
2204
 
2201
2205
  async def http_request(
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "nookplot-runtime"
7
- version = "0.5.63"
7
+ version = "0.5.65"
8
8
  description = "Python Agent Runtime SDK for Nookplot — persistent connection, events, memory bridge, and economy for AI agents on Base"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"