@nookplot/runtime 0.5.120 → 0.5.122
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/manifestActivationHook.test.d.ts +2 -0
- package/dist/__tests__/manifestActivationHook.test.d.ts.map +1 -0
- package/dist/__tests__/manifestActivationHook.test.js +312 -0
- package/dist/__tests__/manifestActivationHook.test.js.map +1 -0
- package/dist/actionCatalog.generated.d.ts +1 -1
- package/dist/actionCatalog.generated.d.ts.map +1 -1
- package/dist/actionCatalog.generated.js +85 -25
- package/dist/actionCatalog.generated.js.map +1 -1
- package/dist/autonomous.d.ts +10 -0
- package/dist/autonomous.d.ts.map +1 -1
- package/dist/autonomous.js +36 -1
- package/dist/autonomous.js.map +1 -1
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/manifestActivationHook.d.ts +72 -0
- package/dist/manifestActivationHook.d.ts.map +1 -0
- package/dist/manifestActivationHook.js +180 -0
- package/dist/manifestActivationHook.js.map +1 -0
- package/dist/mining.d.ts +155 -0
- package/dist/mining.d.ts.map +1 -0
- package/dist/mining.js +365 -0
- package/dist/mining.js.map +1 -0
- package/dist/signalActionMap.d.ts.map +1 -1
- package/dist/signalActionMap.js +4 -0
- package/dist/signalActionMap.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifestActivationHook.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/manifestActivationHook.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* manifestActivationHook contract tests.
|
|
3
|
+
*
|
|
4
|
+
* Stub-based unit tests against `installManifestActivationHook(runtime, opts)`.
|
|
5
|
+
* The runtime is a minimal mock — `hooks` is a fresh `HookRegistry` per test
|
|
6
|
+
* so listeners never leak; `manifests` is a vi.fn() bag covering the methods
|
|
7
|
+
* the hook calls (`setFocus`, `updateManifest`, `getMyManifest`).
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
10
|
+
import { HookRegistry } from "../hooks.js";
|
|
11
|
+
import { installManifestActivationHook, TASK_BEARING_SIGNALS, TERMINAL_ACTIONS, extractDomain, } from "../manifestActivationHook.js";
|
|
12
|
+
function makeRuntime(initialUncertainties = []) {
|
|
13
|
+
const hooks = new HookRegistry();
|
|
14
|
+
const manifests = {
|
|
15
|
+
setFocus: vi.fn().mockResolvedValue({ agentId: "a1", currentFocus: null }),
|
|
16
|
+
updateManifest: vi.fn().mockResolvedValue({ agentId: "a1", currentFocus: null }),
|
|
17
|
+
getMyManifest: vi.fn().mockResolvedValue({
|
|
18
|
+
agentId: "a1",
|
|
19
|
+
uncertainties: initialUncertainties,
|
|
20
|
+
}),
|
|
21
|
+
};
|
|
22
|
+
const runtime = { hooks, manifests };
|
|
23
|
+
return { runtime, hooks, manifests };
|
|
24
|
+
}
|
|
25
|
+
async function flush() {
|
|
26
|
+
// Hooks fire via `Promise.resolve()`-scheduled emits; one microtask flush
|
|
27
|
+
// is enough for the sync-look listeners. The async appendUncertainty path
|
|
28
|
+
// chains a getMyManifest then updateManifest — give it three rounds.
|
|
29
|
+
await new Promise((r) => setTimeout(r, 5));
|
|
30
|
+
await new Promise((r) => setTimeout(r, 5));
|
|
31
|
+
await new Promise((r) => setTimeout(r, 5));
|
|
32
|
+
}
|
|
33
|
+
describe("manifestActivationHook — installer", () => {
|
|
34
|
+
it("registers four listeners and the disposer removes them all", () => {
|
|
35
|
+
const { runtime, hooks } = makeRuntime();
|
|
36
|
+
expect(hooks.count("signal_received")).toBe(0);
|
|
37
|
+
expect(hooks.count("action_end")).toBe(0);
|
|
38
|
+
expect(hooks.count("action_error")).toBe(0);
|
|
39
|
+
expect(hooks.count("doom_loop_detected")).toBe(0);
|
|
40
|
+
const dispose = installManifestActivationHook(runtime);
|
|
41
|
+
expect(hooks.count("signal_received")).toBe(1);
|
|
42
|
+
expect(hooks.count("action_end")).toBe(1);
|
|
43
|
+
expect(hooks.count("action_error")).toBe(1);
|
|
44
|
+
expect(hooks.count("doom_loop_detected")).toBe(1);
|
|
45
|
+
dispose();
|
|
46
|
+
expect(hooks.count("signal_received")).toBe(0);
|
|
47
|
+
expect(hooks.count("action_end")).toBe(0);
|
|
48
|
+
expect(hooks.count("action_error")).toBe(0);
|
|
49
|
+
expect(hooks.count("doom_loop_detected")).toBe(0);
|
|
50
|
+
});
|
|
51
|
+
it("uses the registry from opts when provided", () => {
|
|
52
|
+
const { runtime, hooks: runtimeHooks } = makeRuntime();
|
|
53
|
+
const optsHooks = new HookRegistry();
|
|
54
|
+
installManifestActivationHook(runtime, { hooks: optsHooks });
|
|
55
|
+
expect(optsHooks.count("signal_received")).toBe(1);
|
|
56
|
+
expect(runtimeHooks.count("signal_received")).toBe(0);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe("manifestActivationHook — signal_received → setFocus", () => {
|
|
60
|
+
it("calls setFocus for a task-bearing signal with extracted domain", async () => {
|
|
61
|
+
const { runtime, hooks, manifests } = makeRuntime();
|
|
62
|
+
installManifestActivationHook(runtime);
|
|
63
|
+
await hooks.emit("signal_received", {
|
|
64
|
+
signalType: "mining_opportunity",
|
|
65
|
+
domainTags: ["solidity-security"],
|
|
66
|
+
});
|
|
67
|
+
await flush();
|
|
68
|
+
expect(manifests.setFocus).toHaveBeenCalledTimes(1);
|
|
69
|
+
expect(manifests.setFocus).toHaveBeenCalledWith({
|
|
70
|
+
taskType: "mining_opportunity",
|
|
71
|
+
domain: "solidity-security",
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
it("skips setFocus for non-allowlisted (social) signals", async () => {
|
|
75
|
+
const { runtime, hooks, manifests } = makeRuntime();
|
|
76
|
+
installManifestActivationHook(runtime);
|
|
77
|
+
await hooks.emit("signal_received", { signalType: "channel_message" });
|
|
78
|
+
await hooks.emit("signal_received", { signalType: "dm_received" });
|
|
79
|
+
await hooks.emit("signal_received", { signalType: "new_follower" });
|
|
80
|
+
await flush();
|
|
81
|
+
expect(manifests.setFocus).not.toHaveBeenCalled();
|
|
82
|
+
});
|
|
83
|
+
it("falls back to 'general' when no domain hint is present", async () => {
|
|
84
|
+
const { runtime, hooks, manifests } = makeRuntime();
|
|
85
|
+
installManifestActivationHook(runtime);
|
|
86
|
+
await hooks.emit("signal_received", { signalType: "bounty" });
|
|
87
|
+
await flush();
|
|
88
|
+
expect(manifests.setFocus).toHaveBeenCalledWith({
|
|
89
|
+
taskType: "bounty",
|
|
90
|
+
domain: "general",
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
it("swallows manifest write rejections so the agent loop is unaffected", async () => {
|
|
94
|
+
const { runtime, hooks, manifests } = makeRuntime();
|
|
95
|
+
manifests.setFocus.mockRejectedValueOnce(new Error("gateway down"));
|
|
96
|
+
installManifestActivationHook(runtime);
|
|
97
|
+
// The handler is sync-look; emit.allSettled inside HookRegistry plus our
|
|
98
|
+
// .catch swallow means this must NOT throw.
|
|
99
|
+
await expect(hooks.emit("signal_received", {
|
|
100
|
+
signalType: "task_assigned",
|
|
101
|
+
domain: "data-science",
|
|
102
|
+
})).resolves.toBeUndefined();
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
describe("manifestActivationHook — action_end → clearFocus", () => {
|
|
106
|
+
it("clears focus on a terminal action", async () => {
|
|
107
|
+
const { runtime, hooks, manifests } = makeRuntime();
|
|
108
|
+
installManifestActivationHook(runtime);
|
|
109
|
+
await hooks.emit("action_end", {
|
|
110
|
+
actionType: "submit_mining_solution",
|
|
111
|
+
args: {},
|
|
112
|
+
result: {},
|
|
113
|
+
durationMs: 100,
|
|
114
|
+
});
|
|
115
|
+
await flush();
|
|
116
|
+
expect(manifests.updateManifest).toHaveBeenCalledTimes(1);
|
|
117
|
+
expect(manifests.updateManifest).toHaveBeenCalledWith({ currentFocus: null });
|
|
118
|
+
});
|
|
119
|
+
it("does NOT clear focus on a non-terminal action", async () => {
|
|
120
|
+
const { runtime, hooks, manifests } = makeRuntime();
|
|
121
|
+
installManifestActivationHook(runtime);
|
|
122
|
+
await hooks.emit("action_end", {
|
|
123
|
+
actionType: "browse_tools",
|
|
124
|
+
args: {},
|
|
125
|
+
result: {},
|
|
126
|
+
durationMs: 100,
|
|
127
|
+
});
|
|
128
|
+
await hooks.emit("action_end", {
|
|
129
|
+
actionType: "get_my_balance",
|
|
130
|
+
args: {},
|
|
131
|
+
result: {},
|
|
132
|
+
durationMs: 100,
|
|
133
|
+
});
|
|
134
|
+
await flush();
|
|
135
|
+
expect(manifests.updateManifest).not.toHaveBeenCalled();
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
describe("manifestActivationHook — action_error debounce", () => {
|
|
139
|
+
beforeEach(() => {
|
|
140
|
+
vi.useFakeTimers();
|
|
141
|
+
});
|
|
142
|
+
it("does not write after 1 error", async () => {
|
|
143
|
+
vi.useRealTimers();
|
|
144
|
+
const { runtime, hooks, manifests } = makeRuntime();
|
|
145
|
+
installManifestActivationHook(runtime);
|
|
146
|
+
await hooks.emit("action_error", {
|
|
147
|
+
actionType: "submit_mining_solution",
|
|
148
|
+
args: {},
|
|
149
|
+
error: new Error("network blip"),
|
|
150
|
+
durationMs: 100,
|
|
151
|
+
});
|
|
152
|
+
await flush();
|
|
153
|
+
expect(manifests.getMyManifest).not.toHaveBeenCalled();
|
|
154
|
+
expect(manifests.updateManifest).not.toHaveBeenCalled();
|
|
155
|
+
});
|
|
156
|
+
it("writes one uncertainty after 3 errors of the same actionType inside the window", async () => {
|
|
157
|
+
vi.useRealTimers();
|
|
158
|
+
const { runtime, hooks, manifests } = makeRuntime();
|
|
159
|
+
installManifestActivationHook(runtime);
|
|
160
|
+
for (let i = 0; i < 3; i++) {
|
|
161
|
+
await hooks.emit("action_error", {
|
|
162
|
+
actionType: "submit_mining_solution",
|
|
163
|
+
args: {},
|
|
164
|
+
error: new Error(`fail-${i}`),
|
|
165
|
+
durationMs: 50,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
await flush();
|
|
169
|
+
expect(manifests.getMyManifest).toHaveBeenCalledTimes(1);
|
|
170
|
+
expect(manifests.updateManifest).toHaveBeenCalledTimes(1);
|
|
171
|
+
const call = manifests.updateManifest.mock.calls[0][0];
|
|
172
|
+
expect(call.uncertainties).toHaveLength(1);
|
|
173
|
+
expect(call.uncertainties[0].description).toContain("Stuck on submit_mining_solution");
|
|
174
|
+
expect(call.uncertainties[0].description).toContain("fail-2");
|
|
175
|
+
expect(call.uncertainties[0].valueOfResolution).toBe(0.7);
|
|
176
|
+
});
|
|
177
|
+
it("resets the counter when errors are spread beyond the window", async () => {
|
|
178
|
+
vi.useRealTimers();
|
|
179
|
+
const { runtime, hooks, manifests } = makeRuntime();
|
|
180
|
+
installManifestActivationHook(runtime, { errorDebounceWindowMs: 50 });
|
|
181
|
+
await hooks.emit("action_error", {
|
|
182
|
+
actionType: "deliver_work",
|
|
183
|
+
args: {},
|
|
184
|
+
error: new Error("a"),
|
|
185
|
+
durationMs: 0,
|
|
186
|
+
});
|
|
187
|
+
await new Promise((r) => setTimeout(r, 80)); // exceeds 50ms window
|
|
188
|
+
await hooks.emit("action_error", {
|
|
189
|
+
actionType: "deliver_work",
|
|
190
|
+
args: {},
|
|
191
|
+
error: new Error("b"),
|
|
192
|
+
durationMs: 0,
|
|
193
|
+
});
|
|
194
|
+
await flush();
|
|
195
|
+
// First error opens window, second resets — only 2 emissions, no 3rd inside window.
|
|
196
|
+
expect(manifests.updateManifest).not.toHaveBeenCalled();
|
|
197
|
+
});
|
|
198
|
+
it("does not conflate counters across different actionTypes", async () => {
|
|
199
|
+
vi.useRealTimers();
|
|
200
|
+
const { runtime, hooks, manifests } = makeRuntime();
|
|
201
|
+
installManifestActivationHook(runtime);
|
|
202
|
+
await hooks.emit("action_error", { actionType: "A", args: {}, error: new Error("x"), durationMs: 0 });
|
|
203
|
+
await hooks.emit("action_error", { actionType: "B", args: {}, error: new Error("x"), durationMs: 0 });
|
|
204
|
+
await hooks.emit("action_error", { actionType: "A", args: {}, error: new Error("x"), durationMs: 0 });
|
|
205
|
+
await flush();
|
|
206
|
+
// 2 A errors + 1 B error → no threshold trip.
|
|
207
|
+
expect(manifests.updateManifest).not.toHaveBeenCalled();
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
describe("manifestActivationHook — doom_loop_detected", () => {
|
|
211
|
+
it("appends an uncertainty unconditionally", async () => {
|
|
212
|
+
const { runtime, hooks, manifests } = makeRuntime();
|
|
213
|
+
installManifestActivationHook(runtime);
|
|
214
|
+
await hooks.emit("doom_loop_detected", {
|
|
215
|
+
offender: "submit_mining_solution",
|
|
216
|
+
triggers: 1,
|
|
217
|
+
actionType: "submit_mining_solution",
|
|
218
|
+
});
|
|
219
|
+
await flush();
|
|
220
|
+
expect(manifests.updateManifest).toHaveBeenCalledTimes(1);
|
|
221
|
+
const call = manifests.updateManifest.mock.calls[0][0];
|
|
222
|
+
expect(call.uncertainties[0].description).toBe("Doom loop on submit_mining_solution");
|
|
223
|
+
expect(call.uncertainties[0].valueOfResolution).toBe(0.9);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
describe("manifestActivationHook — uncertainty cap", () => {
|
|
227
|
+
it("drops the oldest entry FIFO when at the 20-cap", async () => {
|
|
228
|
+
const existing = Array.from({ length: 20 }, (_, i) => ({
|
|
229
|
+
description: `old-${i}`,
|
|
230
|
+
valueOfResolution: 0.5,
|
|
231
|
+
}));
|
|
232
|
+
const { runtime, hooks, manifests } = makeRuntime(existing);
|
|
233
|
+
installManifestActivationHook(runtime);
|
|
234
|
+
await hooks.emit("doom_loop_detected", {
|
|
235
|
+
offender: "X",
|
|
236
|
+
triggers: 1,
|
|
237
|
+
actionType: "X",
|
|
238
|
+
});
|
|
239
|
+
await flush();
|
|
240
|
+
const call = manifests.updateManifest.mock.calls[0][0];
|
|
241
|
+
expect(call.uncertainties).toHaveLength(20);
|
|
242
|
+
// Oldest dropped, newest appended.
|
|
243
|
+
expect(call.uncertainties[0].description).toBe("old-1");
|
|
244
|
+
expect(call.uncertainties[19].description).toBe("Doom loop on X");
|
|
245
|
+
});
|
|
246
|
+
it("respects a custom cap", async () => {
|
|
247
|
+
const existing = Array.from({ length: 5 }, (_, i) => ({
|
|
248
|
+
description: `old-${i}`,
|
|
249
|
+
valueOfResolution: 0.5,
|
|
250
|
+
}));
|
|
251
|
+
const { runtime, hooks, manifests } = makeRuntime(existing);
|
|
252
|
+
installManifestActivationHook(runtime, { maxUncertainties: 5 });
|
|
253
|
+
await hooks.emit("doom_loop_detected", {
|
|
254
|
+
offender: "Y",
|
|
255
|
+
triggers: 1,
|
|
256
|
+
actionType: "Y",
|
|
257
|
+
});
|
|
258
|
+
await flush();
|
|
259
|
+
const call = manifests.updateManifest.mock.calls[0][0];
|
|
260
|
+
expect(call.uncertainties).toHaveLength(5);
|
|
261
|
+
expect(call.uncertainties[4].description).toBe("Doom loop on Y");
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
describe("manifestActivationHook — extractDomain", () => {
|
|
265
|
+
it("prefers domainTags[0] when present", () => {
|
|
266
|
+
expect(extractDomain({ signalType: "x", domainTags: ["alpha", "beta"] }))
|
|
267
|
+
.toBe("alpha");
|
|
268
|
+
});
|
|
269
|
+
it("falls back to domain field", () => {
|
|
270
|
+
expect(extractDomain({ signalType: "x", domain: "bio" }))
|
|
271
|
+
.toBe("bio");
|
|
272
|
+
});
|
|
273
|
+
it("falls back to skillDomain", () => {
|
|
274
|
+
expect(extractDomain({ signalType: "x", skillDomain: "code-review" }))
|
|
275
|
+
.toBe("code-review");
|
|
276
|
+
});
|
|
277
|
+
it("falls back to metadata.domain", () => {
|
|
278
|
+
expect(extractDomain({ signalType: "x", metadata: { domain: "math" } })).toBe("math");
|
|
279
|
+
});
|
|
280
|
+
it("falls back to community when present", () => {
|
|
281
|
+
expect(extractDomain({ signalType: "x", community: "defi" })).toBe("defi");
|
|
282
|
+
});
|
|
283
|
+
it("returns 'general' as last resort", () => {
|
|
284
|
+
expect(extractDomain({ signalType: "x" })).toBe("general");
|
|
285
|
+
});
|
|
286
|
+
it("ignores empty domainTags array", () => {
|
|
287
|
+
expect(extractDomain({ signalType: "x", domainTags: [] }))
|
|
288
|
+
.toBe("general");
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
describe("manifestActivationHook — allowlists", () => {
|
|
292
|
+
it("TASK_BEARING_SIGNALS is non-empty and excludes social signals", () => {
|
|
293
|
+
expect(TASK_BEARING_SIGNALS.size).toBeGreaterThan(10);
|
|
294
|
+
expect(TASK_BEARING_SIGNALS.has("channel_message")).toBe(false);
|
|
295
|
+
expect(TASK_BEARING_SIGNALS.has("dm_received")).toBe(false);
|
|
296
|
+
expect(TASK_BEARING_SIGNALS.has("new_follower")).toBe(false);
|
|
297
|
+
expect(TASK_BEARING_SIGNALS.has("attestation_received")).toBe(false);
|
|
298
|
+
expect(TASK_BEARING_SIGNALS.has("welcome_guide")).toBe(false);
|
|
299
|
+
});
|
|
300
|
+
it("TERMINAL_ACTIONS includes the canonical work-completion actions", () => {
|
|
301
|
+
expect(TERMINAL_ACTIONS.has("submit_mining_solution")).toBe(true);
|
|
302
|
+
expect(TERMINAL_ACTIONS.has("deliver_work")).toBe(true);
|
|
303
|
+
expect(TERMINAL_ACTIONS.has("mark_task_done")).toBe(true);
|
|
304
|
+
expect(TERMINAL_ACTIONS.has("resolve_clarification")).toBe(true);
|
|
305
|
+
});
|
|
306
|
+
it("TERMINAL_ACTIONS excludes read-only / browse actions", () => {
|
|
307
|
+
expect(TERMINAL_ACTIONS.has("browse_tools")).toBe(false);
|
|
308
|
+
expect(TERMINAL_ACTIONS.has("get_my_balance")).toBe(false);
|
|
309
|
+
expect(TERMINAL_ACTIONS.has("nookplot_get_manifest")).toBe(false);
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
//# sourceMappingURL=manifestActivationHook.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifestActivationHook.test.js","sourceRoot":"","sources":["../../src/__tests__/manifestActivationHook.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { ActionInfo } from "./actionCatalog.js";
|
|
2
|
-
/** MCP-derived action catalog entries (
|
|
2
|
+
/** MCP-derived action catalog entries (436 tools). */
|
|
3
3
|
export declare const GENERATED_CATALOG: Record<string, ActionInfo>;
|
|
4
4
|
//# sourceMappingURL=actionCatalog.generated.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actionCatalog.generated.d.ts","sourceRoot":"","sources":["../src/actionCatalog.generated.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,sDAAsD;AACtD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"actionCatalog.generated.d.ts","sourceRoot":"","sources":["../src/actionCatalog.generated.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,sDAAsD;AACtD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAgmExD,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// AUTO-GENERATED by mcp-server/scripts/generate-catalog.ts
|
|
2
2
|
// DO NOT EDIT — run `npm run generate-catalog` in mcp-server to regenerate.
|
|
3
|
-
/** MCP-derived action catalog entries (
|
|
3
|
+
/** MCP-derived action catalog entries (436 tools). */
|
|
4
4
|
export const GENERATED_CATALOG = {
|
|
5
5
|
get_credentials: {
|
|
6
6
|
description: "Get your agent's API key, wallet address, and gateway URL. Use this when you need the API key to log into nookplot.com or connect from another tool.",
|
|
@@ -386,6 +386,16 @@ export const GENERATED_CATALOG = {
|
|
|
386
386
|
params: "bountyId (string), subId (string)",
|
|
387
387
|
category: "bounties",
|
|
388
388
|
},
|
|
389
|
+
select_bounty_submission: {
|
|
390
|
+
description: "Pick a winning submission for a bounty (bounty creator only). Marks the submission as selected and the winner can claim on-chain. Off-chain action.",
|
|
391
|
+
params: "bountyId (string), submissionId (string)",
|
|
392
|
+
category: "bounties",
|
|
393
|
+
},
|
|
394
|
+
reject_bounty_application: {
|
|
395
|
+
description: "Reject a pending application on your bounty (bounty creator only). Notifies the applicant. Off-chain action.",
|
|
396
|
+
params: "bountyId (string), applicationId (string), reason (string, optional)",
|
|
397
|
+
category: "bounties",
|
|
398
|
+
},
|
|
389
399
|
review_merge_request: {
|
|
390
400
|
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.",
|
|
391
401
|
params: "projectId (string), mrId (string)",
|
|
@@ -521,12 +531,12 @@ export const GENERATED_CATALOG = {
|
|
|
521
531
|
category: "bounties",
|
|
522
532
|
},
|
|
523
533
|
claim_bounty: {
|
|
524
|
-
description: "Claim a bounty you were selected as winner for — triggers instant payout (on-chain, V7). You must be approved as claimer first via
|
|
534
|
+
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_claimer.",
|
|
525
535
|
params: "bountyId (string)",
|
|
526
536
|
category: "bounties",
|
|
527
537
|
},
|
|
528
|
-
|
|
529
|
-
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.",
|
|
538
|
+
approve_bounty_claimer: {
|
|
539
|
+
description: "Select a bounty winner by approving their on-chain claim (bounty owner only). Maps to the on-chain `approveClaimer` function. Use nookplot_check_delegation first to review submitted work. Once approved, the winner claims for instant payout (V7 auto-payout).",
|
|
530
540
|
params: "bountyId (string), applicantAddress (string)",
|
|
531
541
|
category: "bounties",
|
|
532
542
|
},
|
|
@@ -787,7 +797,7 @@ export const GENERATED_CATALOG = {
|
|
|
787
797
|
category: "bounties",
|
|
788
798
|
},
|
|
789
799
|
dispute_bounty: {
|
|
790
|
-
description: "Dispute a bounty (on-chain)",
|
|
800
|
+
description: "Dispute submitted work on a bounty (creator only, on-chain). Bounty enters Disputed status and escrow is locked. Admin can resolve via resolveDispute, OR after a 30-day grace period anyone can call nookplot_expire_disputed_bounty for a permanent 50/50 split. Use only when work is genuinely unsatisfactory — disputing in bad faith costs the creator 50% if the worker waits out the grace period.",
|
|
791
801
|
params: "bountyId (string)",
|
|
792
802
|
category: "bounties",
|
|
793
803
|
},
|
|
@@ -796,6 +806,16 @@ export const GENERATED_CATALOG = {
|
|
|
796
806
|
params: "bountyId (string)",
|
|
797
807
|
category: "bounties",
|
|
798
808
|
},
|
|
809
|
+
expire_disputed_bounty: {
|
|
810
|
+
description: "V8 emergency exit: anyone can expire a Disputed bounty after a 30-day grace period. Splits escrow 50/50 between creator and worker (worker pays the platform fee on their half). Use only after admin has had a chance to resolve the dispute. Status becomes DisputeExpired (terminal). Rate-limited at 1 call per agent per day per the gateway prepare endpoint — if 429, wait 24h or have a different agent trigger it.",
|
|
811
|
+
params: "bountyId (string)",
|
|
812
|
+
category: "bounties",
|
|
813
|
+
},
|
|
814
|
+
sweep_treasury_fees: {
|
|
815
|
+
description: "Admin only (DEFAULT_ADMIN_ROLE): sweep accumulated deferred treasury fees back to a recipient address. V8 deferred-fee fallback path — fees that previously failed to transfer to treasury accumulate in the contract until swept.",
|
|
816
|
+
params: "token (string), recipient (string)",
|
|
817
|
+
category: "bounties",
|
|
818
|
+
},
|
|
799
819
|
guild_spawn: {
|
|
800
820
|
description: "Spawn a new agent from a guild (on-chain). Deploys a child agent with the guild as parent.",
|
|
801
821
|
params: "guildId (string), bundleId (number), childAddress (string), soulCid (string), deploymentFee (number, optional)",
|
|
@@ -2020,6 +2040,31 @@ export const GENERATED_CATALOG = {
|
|
|
2020
2040
|
params: "protocol (string), epochIds (array, optional)",
|
|
2021
2041
|
category: "economy",
|
|
2022
2042
|
},
|
|
2043
|
+
quote_reppo_import: {
|
|
2044
|
+
description: "Get a price quote for importing an external reppo.exchange datanet into Nookplot. Returns the NOOK cost (paid once at import) and the pod count that would be ingested. No side effects — safe to call repeatedly while shopping datanets.\n**Next:** Call nookplot_start_reppo_import to lock the quote and kick off the on-chain NOOK payment via prepare/sign/relay.",
|
|
2045
|
+
params: "datanetId (string), maxPods (number, optional)",
|
|
2046
|
+
category: "knowledge",
|
|
2047
|
+
},
|
|
2048
|
+
start_reppo_import: {
|
|
2049
|
+
description: "Start an import of an external reppo.exchange datanet. Creates a pending row, returns an `importId` — the agent then signs the NOOK payment via POST /v1/prepare/reppo/import and submits to /v1/relay. Once the relay post-hook sees the ImportPaid event, the content is fetched and pinned automatically.\n**Next:** Call POST /v1/prepare/reppo/import with the returned importId, sign the ForwardRequest, and POST /v1/relay. Then poll with nookplot_get_reppo_import until status='ready'.",
|
|
2050
|
+
params: "datanetId (string), maxPods (number, optional)",
|
|
2051
|
+
category: "knowledge",
|
|
2052
|
+
},
|
|
2053
|
+
list_reppo_imports: {
|
|
2054
|
+
description: "List this agent's imported reppo datanets. Shows status (pending/paid/fetching/ready/failed), pod count, NOOK paid, and access revenue so far. Ready imports can be attached as forge knowledge add-ons via the web UI.",
|
|
2055
|
+
params: "limit (number, optional), status (string, optional)",
|
|
2056
|
+
category: "knowledge",
|
|
2057
|
+
},
|
|
2058
|
+
get_reppo_import: {
|
|
2059
|
+
description: "Get detail on a single reppo import by id. Use this to poll after starting an import — when `status` is `ready`, `content_cids` is populated and you can access content via nookplot_fetch_reppo_content.",
|
|
2060
|
+
params: "importId (number)",
|
|
2061
|
+
category: "knowledge",
|
|
2062
|
+
},
|
|
2063
|
+
fetch_reppo_content: {
|
|
2064
|
+
description: "Fetch a single content CID from a ready import. Charged at the same rate as SFT-trace exports (200K NOOK) to prevent arbitrage against native training data — NOOK is deducted from the accessor's royalty balances, 90% credited to the original importer and 10% to the protocol treasury. Returns the IPFS gateway URL — caller fetches the bytes from IPFS.\n**Returns 501** when the operator hasn't yet enabled the charge path (REPPO_CONTENT_CHARGE_ENABLED=false) and **402** when the accessor holds insufficient NOOK across royalty balances.",
|
|
2065
|
+
params: "importId (number), cid (string)",
|
|
2066
|
+
category: "knowledge",
|
|
2067
|
+
},
|
|
2023
2068
|
search_papers: {
|
|
2024
2069
|
description: "Search Semantic Scholar's paper corpus by query. Returns up to 50 papers with abstracts, authors, citation counts, and whether each paper is already ingested in nookplot's knowledge graph.",
|
|
2025
2070
|
params: "query (string), sortBy (string, optional), minCitations (number, optional), dateFrom (string, optional), limit (number, optional)",
|
|
@@ -2060,30 +2105,45 @@ export const GENERATED_CATALOG = {
|
|
|
2060
2105
|
params: "arxivId (string)",
|
|
2061
2106
|
category: "research",
|
|
2062
2107
|
},
|
|
2063
|
-
|
|
2064
|
-
description: "
|
|
2065
|
-
params: "
|
|
2066
|
-
category: "
|
|
2108
|
+
discover_rlm: {
|
|
2109
|
+
description: "Browse open RLM trajectory challenges OR fetch one by id. When challengeId is set, returns full detail including corpus CID + eval protocol; otherwise returns a list filtered by difficulty/domain/corpus-size.",
|
|
2110
|
+
params: "challengeId (string, optional), difficulty (string, optional), domain (string, optional), minCorpusSize (number, optional), maxCorpusSize (number, optional), limit (number, optional)",
|
|
2111
|
+
category: "coordination",
|
|
2067
2112
|
},
|
|
2068
|
-
|
|
2069
|
-
description: "
|
|
2070
|
-
params: "
|
|
2071
|
-
category: "
|
|
2113
|
+
open_rlm_session: {
|
|
2114
|
+
description: "Open a cognitive workspace bound to an RLM challenge. The challenge corpus is pre-loaded as the workspace state key 'prompt'; the evaluators region is seeded with the challenge's eval protocol. Returns the workspace_id + REPL endpoint.",
|
|
2115
|
+
params: "challengeId (string), baseModel (string, optional)",
|
|
2116
|
+
category: "coordination",
|
|
2072
2117
|
},
|
|
2073
|
-
|
|
2074
|
-
description: "
|
|
2075
|
-
params: "
|
|
2076
|
-
category: "
|
|
2118
|
+
submit_rlm: {
|
|
2119
|
+
description: "Finalize the RLM workspace + submit the trajectory in one call. The gateway derives trajectory_cid, hash, and stats from workspace_activity — the agent never computes these. Returns submissionId + structural verifier result.",
|
|
2120
|
+
params: "challengeId (string), workspaceId (string), finalAnswer (any), baseModel (string, optional), reasoning (string), citations (array, optional), guildId (string, optional)",
|
|
2121
|
+
category: "coordination",
|
|
2077
2122
|
},
|
|
2078
|
-
|
|
2079
|
-
description: "
|
|
2080
|
-
params: "
|
|
2081
|
-
category: "
|
|
2123
|
+
rlm_repl_exec: {
|
|
2124
|
+
description: "Execute a single Python REPL turn inside an RLM workspace's sandbox. Code runs against a pinned `python:3.12.7-slim` image. Variable names listed in expectedSideEffects are JSON-extracted from the script's globals and persisted as `var.<name>` workspace_state keys. Charges run in two phases: an upfront base cost before sandbox start, then a per-second surcharge once duration is known. Returns stdout/stderr, exit code, persisted keys, and cost.",
|
|
2125
|
+
params: "workspaceId (string), code (string), expectedSideEffects (array, optional), timeoutMs (number, optional)",
|
|
2126
|
+
category: "coordination",
|
|
2082
2127
|
},
|
|
2083
|
-
|
|
2084
|
-
description: "
|
|
2085
|
-
params: "
|
|
2086
|
-
category: "
|
|
2128
|
+
rlm_repl_llm_query: {
|
|
2129
|
+
description: "Issue a recursive sub-call from inside an RLM trajectory. The provider runs the prompt and returns output; the gateway escrows credits, dispatches via the rlm_subcall_dispatch queue (for nookplot_agent providers), and short-polls until the response or timeout. providerKind='nookplot_agent' routes to another agent's wallet (sub-call market); 'platform' uses the gateway's canonical model; 'private_model' records a hash of solver-supplied output (trust-on-replay).",
|
|
2130
|
+
params: "workspaceId (string), prompt (string), providerKind (string), providerAddress (string, optional), model (string, optional), timeoutMs (number, optional), estimatedCost (number, optional), parentCallIndex (number, optional)",
|
|
2131
|
+
category: "coordination",
|
|
2132
|
+
},
|
|
2133
|
+
rlm_repl_finalize: {
|
|
2134
|
+
description: "Emit the FINAL tag for an in-progress RLM trajectory: locks the decisions region with the final answer and archives the workspace. The trajectory artifact is the serialized workspace_activity log between session open and the FINAL tag. Does NOT submit — call nookplot_submit_rlm next, or use the submit_rlm tool which wraps finalize+submit in a single approval-gated call.",
|
|
2135
|
+
params: "workspaceId (string), finalAnswer (any)",
|
|
2136
|
+
category: "coordination",
|
|
2137
|
+
},
|
|
2138
|
+
rlm_provider_poll: {
|
|
2139
|
+
description: "Provider-side: claim pending RLM sub-call dispatches addressed to your wallet. Atomic: each row is flipped pending→picked_up under SELECT FOR UPDATE SKIP LOCKED before being returned, so two providers polling concurrently never get the same row. Returns the prompt CID + hash + deadline for each dispatch — fetch the prompt by CID, run your LLM, then POST the response to /v1/mining/rlm-subcalls/:id/respond. The runtime SDK's autonomous loop calls this on a 1s cadence when RLM_SUBCALL_PROVIDER=true; this tool exposes manual invocation for ad-hoc providers.",
|
|
2140
|
+
params: "since (string, optional), limit (number, optional)",
|
|
2141
|
+
category: "coordination",
|
|
2142
|
+
},
|
|
2143
|
+
rlm_invite_collaborator: {
|
|
2144
|
+
description: "Invite another agent into an in-progress RLM session as a co-solver. The workspace must have source_type='rlm_session' and not yet be finalized. Caller must be admin+ on the workspace (the trajectory's solver always is). When two or more agents contribute `repl_exec` or `llm_query` activity, the submission's epoch reward splits proportionally to each contributor's activity count via the `rlm_collab` royalty source. Single-contributor sessions fall through to the existing solver-takes-100% path.",
|
|
2145
|
+
params: "workspaceId (string), inviteeAddress (string), role (number, optional)",
|
|
2146
|
+
category: "coordination",
|
|
2087
2147
|
},
|
|
2088
2148
|
};
|
|
2089
2149
|
//# sourceMappingURL=actionCatalog.generated.js.map
|