@nookplot/runtime 0.5.144 → 0.5.145

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 (151) hide show
  1. package/dist/__tests__/apiMarketplace.test.js +189 -2
  2. package/dist/__tests__/apiMarketplace.test.js.map +1 -1
  3. package/dist/__tests__/autonomous.dedup.test.js +11 -0
  4. package/dist/__tests__/autonomous.dedup.test.js.map +1 -1
  5. package/dist/__tests__/autonomous.getAvailableActions.test.js +13 -1
  6. package/dist/__tests__/autonomous.getAvailableActions.test.js.map +1 -1
  7. package/dist/__tests__/autonomous.goalBootstrap.test.d.ts +2 -0
  8. package/dist/__tests__/autonomous.goalBootstrap.test.d.ts.map +1 -0
  9. package/dist/__tests__/autonomous.goalBootstrap.test.js +148 -0
  10. package/dist/__tests__/autonomous.goalBootstrap.test.js.map +1 -0
  11. package/dist/__tests__/autonomous.miningTrack.test.d.ts +2 -0
  12. package/dist/__tests__/autonomous.miningTrack.test.d.ts.map +1 -0
  13. package/dist/__tests__/autonomous.miningTrack.test.js +38 -0
  14. package/dist/__tests__/autonomous.miningTrack.test.js.map +1 -0
  15. package/dist/__tests__/autonomous.payApi.test.d.ts +2 -0
  16. package/dist/__tests__/autonomous.payApi.test.d.ts.map +1 -0
  17. package/dist/__tests__/autonomous.payApi.test.js +73 -0
  18. package/dist/__tests__/autonomous.payApi.test.js.map +1 -0
  19. package/dist/__tests__/autonomous.workspaceOpportunity.test.d.ts +2 -0
  20. package/dist/__tests__/autonomous.workspaceOpportunity.test.d.ts.map +1 -0
  21. package/dist/__tests__/autonomous.workspaceOpportunity.test.js +212 -0
  22. package/dist/__tests__/autonomous.workspaceOpportunity.test.js.map +1 -0
  23. package/dist/__tests__/bdAgentPack.test.js +1 -1
  24. package/dist/__tests__/bdAgentPack.test.js.map +1 -1
  25. package/dist/__tests__/bounties.test.d.ts +11 -0
  26. package/dist/__tests__/bounties.test.d.ts.map +1 -0
  27. package/dist/__tests__/bounties.test.js +78 -0
  28. package/dist/__tests__/bounties.test.js.map +1 -0
  29. package/dist/__tests__/codegen-drift.test.js +3 -1
  30. package/dist/__tests__/codegen-drift.test.js.map +1 -1
  31. package/dist/__tests__/conversation/modelThresholdsParity.test.js +19 -14
  32. package/dist/__tests__/conversation/modelThresholdsParity.test.js.map +1 -1
  33. package/dist/__tests__/economy.surplusBranch.test.js +64 -0
  34. package/dist/__tests__/economy.surplusBranch.test.js.map +1 -1
  35. package/dist/__tests__/goalLoop.test.d.ts +2 -0
  36. package/dist/__tests__/goalLoop.test.d.ts.map +1 -0
  37. package/dist/__tests__/goalLoop.test.js +358 -0
  38. package/dist/__tests__/goalLoop.test.js.map +1 -0
  39. package/dist/__tests__/helpers/mockRuntime.d.ts.map +1 -1
  40. package/dist/__tests__/helpers/mockRuntime.js +7 -0
  41. package/dist/__tests__/helpers/mockRuntime.js.map +1 -1
  42. package/dist/__tests__/loadProfile.test.d.ts +8 -0
  43. package/dist/__tests__/loadProfile.test.d.ts.map +1 -0
  44. package/dist/__tests__/loadProfile.test.js +134 -0
  45. package/dist/__tests__/loadProfile.test.js.map +1 -0
  46. package/dist/__tests__/mining.test.d.ts +2 -0
  47. package/dist/__tests__/mining.test.d.ts.map +1 -0
  48. package/dist/__tests__/mining.test.js +306 -0
  49. package/dist/__tests__/mining.test.js.map +1 -0
  50. package/dist/__tests__/pack.test.js +14 -14
  51. package/dist/__tests__/packLoader.test.js +4 -4
  52. package/dist/__tests__/presetLoader.test.js +42 -42
  53. package/dist/__tests__/runtimeConstructor.test.d.ts +18 -0
  54. package/dist/__tests__/runtimeConstructor.test.d.ts.map +1 -0
  55. package/dist/__tests__/runtimeConstructor.test.js +57 -0
  56. package/dist/__tests__/runtimeConstructor.test.js.map +1 -0
  57. package/dist/__tests__/sandbox.test.js +24 -24
  58. package/dist/__tests__/signalActionMap.test.d.ts +17 -0
  59. package/dist/__tests__/signalActionMap.test.d.ts.map +1 -0
  60. package/dist/__tests__/signalActionMap.test.js +165 -0
  61. package/dist/__tests__/signalActionMap.test.js.map +1 -0
  62. package/dist/__tests__/usdcBudget.test.d.ts +2 -0
  63. package/dist/__tests__/usdcBudget.test.d.ts.map +1 -0
  64. package/dist/__tests__/usdcBudget.test.js +128 -0
  65. package/dist/__tests__/usdcBudget.test.js.map +1 -0
  66. package/dist/__tests__/x402.test.d.ts +2 -0
  67. package/dist/__tests__/x402.test.d.ts.map +1 -0
  68. package/dist/__tests__/x402.test.js +117 -0
  69. package/dist/__tests__/x402.test.js.map +1 -0
  70. package/dist/actionCatalog.d.ts.map +1 -1
  71. package/dist/actionCatalog.generated.d.ts +1 -1
  72. package/dist/actionCatalog.generated.d.ts.map +1 -1
  73. package/dist/actionCatalog.generated.js +154 -29
  74. package/dist/actionCatalog.generated.js.map +1 -1
  75. package/dist/actionCatalog.js +0 -10
  76. package/dist/actionCatalog.js.map +1 -1
  77. package/dist/api-marketplace.d.ts +146 -0
  78. package/dist/api-marketplace.d.ts.map +1 -1
  79. package/dist/api-marketplace.js +218 -0
  80. package/dist/api-marketplace.js.map +1 -1
  81. package/dist/autonomous.d.ts +16 -9
  82. package/dist/autonomous.d.ts.map +1 -1
  83. package/dist/autonomous.js +278 -59
  84. package/dist/autonomous.js.map +1 -1
  85. package/dist/bounties.d.ts +21 -1
  86. package/dist/bounties.d.ts.map +1 -1
  87. package/dist/bounties.js +5 -1
  88. package/dist/bounties.js.map +1 -1
  89. package/dist/contentSafety.d.ts +1 -1
  90. package/dist/contentSafety.d.ts.map +1 -1
  91. package/dist/contentSafety.js +6 -2
  92. package/dist/contentSafety.js.map +1 -1
  93. package/dist/conversation/modelLimits.js +17 -17
  94. package/dist/discovery.js +1 -1
  95. package/dist/discovery.js.map +1 -1
  96. package/dist/economy.d.ts +10 -15
  97. package/dist/economy.d.ts.map +1 -1
  98. package/dist/economy.js +16 -29
  99. package/dist/economy.js.map +1 -1
  100. package/dist/goal/goalLoop.d.ts +78 -0
  101. package/dist/goal/goalLoop.d.ts.map +1 -0
  102. package/dist/goal/goalLoop.js +388 -0
  103. package/dist/goal/goalLoop.js.map +1 -0
  104. package/dist/goal/goalPrompts.d.ts +20 -0
  105. package/dist/goal/goalPrompts.d.ts.map +1 -0
  106. package/dist/goal/goalPrompts.js +54 -0
  107. package/dist/goal/goalPrompts.js.map +1 -0
  108. package/dist/goal/types.d.ts +102 -0
  109. package/dist/goal/types.d.ts.map +1 -0
  110. package/dist/goal/types.js +7 -0
  111. package/dist/goal/types.js.map +1 -0
  112. package/dist/identity.d.ts +51 -0
  113. package/dist/identity.d.ts.map +1 -1
  114. package/dist/identity.js +50 -0
  115. package/dist/identity.js.map +1 -1
  116. package/dist/index.d.ts +18 -3
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/index.js +27 -2
  119. package/dist/index.js.map +1 -1
  120. package/dist/loadProfile.d.ts +100 -0
  121. package/dist/loadProfile.d.ts.map +1 -0
  122. package/dist/loadProfile.js +221 -0
  123. package/dist/loadProfile.js.map +1 -0
  124. package/dist/signalActionMap.d.ts.map +1 -1
  125. package/dist/signalActionMap.js +16 -5
  126. package/dist/signalActionMap.js.map +1 -1
  127. package/dist/swarms.d.ts +13 -0
  128. package/dist/swarms.d.ts.map +1 -1
  129. package/dist/swarms.js +4 -0
  130. package/dist/swarms.js.map +1 -1
  131. package/dist/tools.js +1 -1
  132. package/dist/tools.js.map +1 -1
  133. package/dist/types.d.ts +21 -0
  134. package/dist/types.d.ts.map +1 -1
  135. package/dist/usdcBudget.d.ts +90 -0
  136. package/dist/usdcBudget.d.ts.map +1 -0
  137. package/dist/usdcBudget.js +155 -0
  138. package/dist/usdcBudget.js.map +1 -0
  139. package/dist/x402.d.ts +69 -0
  140. package/dist/x402.d.ts.map +1 -0
  141. package/dist/x402.js +139 -0
  142. package/dist/x402.js.map +1 -0
  143. package/package.json +1 -1
  144. package/dist/__tests__/economy.frontierInference.test.d.ts +0 -2
  145. package/dist/__tests__/economy.frontierInference.test.d.ts.map +0 -1
  146. package/dist/__tests__/economy.frontierInference.test.js +0 -61
  147. package/dist/__tests__/economy.frontierInference.test.js.map +0 -1
  148. package/dist/frontierPass.d.ts +0 -30
  149. package/dist/frontierPass.d.ts.map +0 -1
  150. package/dist/frontierPass.js +0 -42
  151. package/dist/frontierPass.js.map +0 -1
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Tests for the SDK's loadProfile helper.
3
+ *
4
+ * Parallel to @nookplot/mcp's auth-profile.test.ts and @nookplot/cli's
5
+ * profile.test.ts — same resolution order, same backward-compat guarantees.
6
+ */
7
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
8
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
9
+ import { tmpdir } from "node:os";
10
+ import { join } from "node:path";
11
+ let testHome;
12
+ vi.mock("node:os", async () => {
13
+ const actual = await vi.importActual("node:os");
14
+ return {
15
+ ...actual,
16
+ homedir: () => testHome,
17
+ };
18
+ });
19
+ const { loadProfile, listProfiles, resolveActiveProfileName } = await import("../loadProfile.js");
20
+ const BASE_CREDS = {
21
+ apiKey: "nk_" + "a".repeat(64),
22
+ privateKey: "0x" + "1".repeat(64),
23
+ address: "0xcreator0000000000000000000000000000aaaa",
24
+ gatewayUrl: "https://gateway.nookplot.com",
25
+ displayName: "Test Creator",
26
+ };
27
+ function seedCreds() {
28
+ const dir = join(testHome, ".nookplot");
29
+ mkdirSync(dir, { recursive: true });
30
+ writeFileSync(join(dir, "credentials.json"), JSON.stringify(BASE_CREDS));
31
+ }
32
+ function seedProfile(name, overrides = {}) {
33
+ const dir = join(testHome, ".nookplot", "profiles", name);
34
+ mkdirSync(dir, { recursive: true });
35
+ writeFileSync(join(dir, "profile.json"), JSON.stringify({
36
+ scopedAgentAddress: "0x" + name.padEnd(40, "f").slice(0, 40),
37
+ ...overrides,
38
+ }));
39
+ }
40
+ beforeEach(() => {
41
+ testHome = mkdtempSync(join(tmpdir(), "sdk-profile-"));
42
+ delete process.env.NOOKPLOT_PROFILE;
43
+ delete process.env.NOOKPLOT_GATEWAY_URL;
44
+ });
45
+ afterEach(() => {
46
+ rmSync(testHome, { recursive: true, force: true });
47
+ delete process.env.NOOKPLOT_PROFILE;
48
+ delete process.env.NOOKPLOT_GATEWAY_URL;
49
+ });
50
+ describe("loadProfile — default-path backward compat", () => {
51
+ it("returns null when no credentials.json exists", () => {
52
+ expect(loadProfile()).toBeNull();
53
+ });
54
+ it("returns flat creds when no profile is active (IDENTICAL to pre-change shape)", () => {
55
+ seedCreds();
56
+ const creds = loadProfile();
57
+ expect(creds).not.toBeNull();
58
+ expect(creds.apiKey).toBe(BASE_CREDS.apiKey);
59
+ expect(creds.address).toBe(BASE_CREDS.address);
60
+ expect(creds.gatewayUrl).toBe(BASE_CREDS.gatewayUrl);
61
+ // Scope fields absent — SDK users who switch to this helper without
62
+ // opting into profiles see no behavior change.
63
+ expect(creds.scopedAgentAddress).toBeUndefined();
64
+ expect(creds.profileName).toBeUndefined();
65
+ });
66
+ it("honors NOOKPLOT_GATEWAY_URL env override (existing SDK convention)", () => {
67
+ seedCreds();
68
+ process.env.NOOKPLOT_GATEWAY_URL = "http://127.0.0.1:4321";
69
+ expect(loadProfile().gatewayUrl).toBe("http://127.0.0.1:4321");
70
+ });
71
+ });
72
+ describe("loadProfile — profile scope merging", () => {
73
+ it("merges scopedAgentAddress from a named profile", () => {
74
+ seedCreds();
75
+ seedProfile("researcher");
76
+ const creds = loadProfile("researcher");
77
+ expect(creds.apiKey).toBe(BASE_CREDS.apiKey); // unchanged
78
+ expect(creds.scopedAgentAddress).toMatch(/^0xresearcher/);
79
+ expect(creds.profileName).toBe("researcher");
80
+ });
81
+ it("falls back gracefully when the profile doesn't exist (doesn't break scripts)", () => {
82
+ seedCreds();
83
+ const creds = loadProfile("ghost");
84
+ expect(creds).not.toBeNull();
85
+ expect(creds.scopedAgentAddress).toBeUndefined();
86
+ });
87
+ it("falls back gracefully on malformed profile.json", () => {
88
+ seedCreds();
89
+ const dir = join(testHome, ".nookplot", "profiles", "broken");
90
+ mkdirSync(dir, { recursive: true });
91
+ writeFileSync(join(dir, "profile.json"), "not json at all");
92
+ const creds = loadProfile("broken");
93
+ expect(creds).not.toBeNull();
94
+ expect(creds.scopedAgentAddress).toBeUndefined();
95
+ });
96
+ it("never touches the creator credentials.json (additive-only guarantee)", () => {
97
+ seedCreds();
98
+ seedProfile("a");
99
+ loadProfile("a");
100
+ const raw = require("node:fs").readFileSync(join(testHome, ".nookplot", "credentials.json"), "utf-8");
101
+ expect(JSON.parse(raw)).toEqual(BASE_CREDS);
102
+ });
103
+ });
104
+ describe("resolveActiveProfileName — priority order", () => {
105
+ beforeEach(() => seedCreds());
106
+ it("explicit argument beats env beats sticky default", () => {
107
+ writeFileSync(join(testHome, ".nookplot", "active-profile"), "sticky");
108
+ process.env.NOOKPLOT_PROFILE = "env";
109
+ expect(resolveActiveProfileName("explicit")).toBe("explicit");
110
+ expect(resolveActiveProfileName()).toBe("env");
111
+ delete process.env.NOOKPLOT_PROFILE;
112
+ expect(resolveActiveProfileName()).toBe("sticky");
113
+ });
114
+ it("returns null when nothing is set", () => {
115
+ expect(resolveActiveProfileName()).toBeNull();
116
+ });
117
+ });
118
+ describe("listProfiles", () => {
119
+ it("returns empty when no profiles dir exists", () => {
120
+ seedCreds();
121
+ expect(listProfiles()).toEqual([]);
122
+ });
123
+ it("enumerates valid profiles sorted alphabetically, skips invalid", () => {
124
+ seedCreds();
125
+ seedProfile("writer");
126
+ seedProfile("researcher");
127
+ const badDir = join(testHome, ".nookplot", "profiles", "bad");
128
+ mkdirSync(badDir, { recursive: true });
129
+ writeFileSync(join(badDir, "profile.json"), "{}");
130
+ const profiles = listProfiles();
131
+ expect(profiles.map((p) => p.name)).toEqual(["researcher", "writer"]);
132
+ });
133
+ });
134
+ //# sourceMappingURL=loadProfile.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadProfile.test.js","sourceRoot":"","sources":["../../src/__tests__/loadProfile.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mining.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mining.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/mining.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,306 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import { MiningManager, trackOf } from "../mining.js";
3
+ // ─── Mock builders ────────────────────────────────────────────────────
4
+ function createMockConnection() {
5
+ return {
6
+ request: vi.fn(),
7
+ gatewayUrl: "https://gateway.nookplot.com",
8
+ apiKey: "test-api-key",
9
+ };
10
+ }
11
+ function createMockEconomy() {
12
+ return {
13
+ inference: vi.fn().mockResolvedValue({ content: "x".repeat(200) }),
14
+ };
15
+ }
16
+ function setupResponses(connection, knowledgeIds, rlmIds = [], embedIds = []) {
17
+ connection.request.mockImplementation(async (method, path) => {
18
+ if (method === "GET" && path.startsWith("/v1/mining/earnings-preview")) {
19
+ return {
20
+ tracks: [
21
+ { track: "knowledge", openCount: knowledgeIds.length },
22
+ { track: "embedding", openCount: embedIds.length },
23
+ { track: "rlm", openCount: rlmIds.length },
24
+ ],
25
+ };
26
+ }
27
+ if (method === "GET" && path.startsWith("/v1/mining/challenges?status=open&sourceType=rlm_trajectory")) {
28
+ return {
29
+ challenges: rlmIds.map((id, i) => ({
30
+ id, title: `RLM ${i}`, difficulty: "medium",
31
+ estimatedRewardNook: 50_000, sourceType: "rlm_trajectory", closesAt: "2030-01-01T00:00:00Z",
32
+ })),
33
+ };
34
+ }
35
+ if (method === "GET" && path.startsWith("/v1/mining/challenges?status=open")) {
36
+ return {
37
+ challenges: knowledgeIds.map((id, i) => ({
38
+ id, title: `Knowledge ${i}`, difficulty: i === 0 ? "expert" : "easy",
39
+ estimatedRewardNook: 100_000 - i * 1000, sourceType: "agent_authored",
40
+ closesAt: "2030-01-01T00:00:00Z",
41
+ })),
42
+ };
43
+ }
44
+ if (method === "GET" && path.startsWith("/v1/mining/embedding-challenges?status=open")) {
45
+ return {
46
+ challenges: embedIds.map((id, i) => ({
47
+ id, title: `Embedding ${i}`, difficulty: "easy",
48
+ estimatedRewardNook: 5_000, sourceType: "embedding_generation", closesAt: "2030-01-01T00:00:00Z",
49
+ })),
50
+ };
51
+ }
52
+ if (method === "GET" && path.startsWith("/v1/mining/embedding-challenges/")) {
53
+ return { prompts: ["a", "b"], dimensions: 768 };
54
+ }
55
+ if (method === "POST" && path.startsWith("/v1/mining/submissions/")) {
56
+ return { submissionId: `sub-${path.split("/").pop()}` };
57
+ }
58
+ if (method === "POST" && path.includes("/v1/mining/embedding-challenges/") && path.endsWith("/submit")) {
59
+ return { submissionId: `embed-sub` };
60
+ }
61
+ throw new Error(`Unmocked request: ${method} ${path}`);
62
+ });
63
+ }
64
+ // ─── Tests ────────────────────────────────────────────────────────────
65
+ describe("trackOf", () => {
66
+ it("classifies known source types", () => {
67
+ expect(trackOf("embedding_generation")).toBe("embedding");
68
+ expect(trackOf("rlm_trajectory")).toBe("rlm");
69
+ expect(trackOf("rlm_audit")).toBe("rlm");
70
+ expect(trackOf("agent_authored")).toBe("knowledge");
71
+ expect(trackOf("paper_reproduction")).toBe("knowledge");
72
+ });
73
+ });
74
+ describe("MiningManager.runOnce", () => {
75
+ let connection;
76
+ let economy;
77
+ let manager;
78
+ beforeEach(() => {
79
+ connection = createMockConnection();
80
+ economy = createMockEconomy();
81
+ manager = new MiningManager(connection, economy);
82
+ });
83
+ it("submits the highest-ranked challenge across enabled tracks", async () => {
84
+ setupResponses(connection, ["k1", "k2"], [], []);
85
+ const results = await manager.runOnce({ tracks: ["knowledge"] });
86
+ expect(results).toHaveLength(1);
87
+ expect(results[0].track).toBe("knowledge");
88
+ expect(results[0].status).toBe("submitted");
89
+ // k1 is "expert" difficulty so it ranks above k2.
90
+ expect(results[0].challengeId).toBe("k1");
91
+ expect(economy.inference).toHaveBeenCalledOnce();
92
+ });
93
+ it("dry-run does not submit", async () => {
94
+ setupResponses(connection, ["k1"], [], []);
95
+ const results = await manager.runOnce({ tracks: ["knowledge"], dryRun: true });
96
+ expect(results[0].status).toBe("skipped");
97
+ expect(results[0].reason).toBe("dry-run");
98
+ // No POST.
99
+ const posts = connection.request.mock.calls.filter((c) => c[0] === "POST");
100
+ expect(posts).toHaveLength(0);
101
+ });
102
+ it("returns empty array when no tracks have open challenges", async () => {
103
+ setupResponses(connection, [], [], []);
104
+ const results = await manager.runOnce({ tracks: ["knowledge", "embedding", "rlm"] });
105
+ expect(results).toEqual([]);
106
+ });
107
+ it("isolates per-track discovery failures (one track erroring does not poison others)", async () => {
108
+ connection.request.mockImplementation(async (method, path) => {
109
+ if (method === "GET" && path.startsWith("/v1/mining/embedding-challenges?")) {
110
+ throw new Error("embedding endpoint exploded");
111
+ }
112
+ if (method === "GET" && path.startsWith("/v1/mining/challenges?status=open&sourceType=rlm_trajectory")) {
113
+ return { challenges: [] };
114
+ }
115
+ if (method === "GET" && path.startsWith("/v1/mining/challenges?status=open")) {
116
+ return {
117
+ challenges: [{
118
+ id: "k1", title: "K", difficulty: "easy",
119
+ estimatedRewardNook: 1000, sourceType: "agent_authored", closesAt: "2030-01-01T00:00:00Z",
120
+ }],
121
+ };
122
+ }
123
+ if (method === "POST" && path.startsWith("/v1/mining/submissions/")) {
124
+ return { submissionId: "sub-k1" };
125
+ }
126
+ throw new Error(`unexpected ${method} ${path}`);
127
+ });
128
+ const results = await manager.runOnce({ tracks: ["knowledge", "embedding"] });
129
+ expect(results).toHaveLength(1);
130
+ expect(results[0].track).toBe("knowledge");
131
+ expect(results[0].status).toBe("submitted");
132
+ });
133
+ it("auto-resolves tracks via earnings-preview when tracks: 'auto'", async () => {
134
+ setupResponses(connection, ["k1"], [], []);
135
+ const results = await manager.runOnce({ tracks: "auto" });
136
+ expect(results[0].track).toBe("knowledge");
137
+ const previewCall = connection.request.mock.calls.find((c) => typeof c[1] === "string" && c[1].startsWith("/v1/mining/earnings-preview"));
138
+ expect(previewCall).toBeTruthy();
139
+ });
140
+ it("skips embedding when no generateEmbeddings callback is provided", async () => {
141
+ setupResponses(connection, [], [], ["e1"]);
142
+ const results = await manager.runOnce({ tracks: ["embedding"] });
143
+ expect(results[0].track).toBe("embedding");
144
+ expect(results[0].status).toBe("skipped");
145
+ expect(results[0].reason).toMatch(/generateEmbeddings/);
146
+ });
147
+ it("submits embedding via callback when provided", async () => {
148
+ setupResponses(connection, [], [], ["e1"]);
149
+ const generateEmbeddings = vi.fn().mockResolvedValue([Array(768).fill(0.1), Array(768).fill(0.2)]);
150
+ const results = await manager.runOnce({ tracks: ["embedding"], generateEmbeddings });
151
+ expect(results[0].status).toBe("submitted");
152
+ expect(generateEmbeddings).toHaveBeenCalledWith(["a", "b"], 768);
153
+ });
154
+ it("skips RLM by default with a deferred reason; uses solveRlm callback when provided", async () => {
155
+ setupResponses(connection, [], ["r1"], []);
156
+ const defaultResults = await manager.runOnce({ tracks: ["rlm"] });
157
+ expect(defaultResults[0].status).toBe("skipped");
158
+ expect(defaultResults[0].reason).toMatch(/RLM/);
159
+ const solveRlm = vi.fn().mockResolvedValue({
160
+ track: "rlm", challengeId: "r1", status: "submitted",
161
+ submissionId: "rlm-sub",
162
+ });
163
+ const customResults = await manager.runOnce({ tracks: ["rlm"], solveRlm });
164
+ expect(customResults[0].status).toBe("submitted");
165
+ expect(solveRlm).toHaveBeenCalledOnce();
166
+ });
167
+ });
168
+ describe("MiningManager.start", () => {
169
+ let connection;
170
+ let economy;
171
+ let manager;
172
+ beforeEach(() => {
173
+ connection = createMockConnection();
174
+ economy = createMockEconomy();
175
+ manager = new MiningManager(connection, economy);
176
+ });
177
+ it("once mode runs until queue drains and then resolves done", async () => {
178
+ let calls = 0;
179
+ connection.request.mockImplementation(async (method, path) => {
180
+ if (method === "GET" && path.startsWith("/v1/mining/challenges?status=open&sourceType=rlm_trajectory")) {
181
+ return { challenges: [] };
182
+ }
183
+ if (method === "GET" && path.startsWith("/v1/mining/challenges?status=open")) {
184
+ calls++;
185
+ if (calls === 1) {
186
+ return {
187
+ challenges: [{
188
+ id: "k1", title: "K", difficulty: "easy",
189
+ estimatedRewardNook: 1000, sourceType: "agent_authored", closesAt: "2030-01-01T00:00:00Z",
190
+ }],
191
+ };
192
+ }
193
+ return { challenges: [] };
194
+ }
195
+ if (method === "POST" && path.startsWith("/v1/mining/submissions/")) {
196
+ return { submissionId: "sub-k1" };
197
+ }
198
+ throw new Error(`unexpected ${method} ${path}`);
199
+ });
200
+ const session = await manager.start({ tracks: ["knowledge"], once: true, tickIntervalMs: 5 });
201
+ await session.done;
202
+ const stats = session.stats();
203
+ expect(stats.submitted).toBe(1);
204
+ expect(stats.byTrack.knowledge.submitted).toBe(1);
205
+ });
206
+ it("respects maxCredits — stops when budget is exhausted", async () => {
207
+ let challengeIdx = 0;
208
+ connection.request.mockImplementation(async (method, path) => {
209
+ if (method === "GET" && path.startsWith("/v1/mining/challenges?status=open&sourceType=rlm_trajectory")) {
210
+ return { challenges: [] };
211
+ }
212
+ if (method === "GET" && path.startsWith("/v1/mining/challenges?status=open")) {
213
+ return {
214
+ challenges: [{
215
+ id: `k${challengeIdx++}`, title: "K", difficulty: "easy",
216
+ estimatedRewardNook: 1000, sourceType: "agent_authored", closesAt: "2030-01-01T00:00:00Z",
217
+ }],
218
+ };
219
+ }
220
+ if (method === "POST" && path.startsWith("/v1/mining/submissions/")) {
221
+ return { submissionId: "sub" };
222
+ }
223
+ throw new Error(`unexpected ${method} ${path}`);
224
+ });
225
+ const session = await manager.start({
226
+ tracks: ["knowledge"],
227
+ maxCredits: 100, // each knowledge solve charges 50 → loop should stop after 2 solves
228
+ tickIntervalMs: 5,
229
+ });
230
+ // Wait briefly for the loop to spin and then stop on budget.
231
+ await new Promise((r) => setTimeout(r, 80));
232
+ await session.stop();
233
+ const stats = session.stats();
234
+ expect(stats.creditsSpent).toBeGreaterThanOrEqual(100);
235
+ expect(stats.submitted).toBeGreaterThanOrEqual(2);
236
+ });
237
+ it("rejects a second start() while a session is active", async () => {
238
+ setupResponses(connection, [], [], []);
239
+ const session = await manager.start({ tracks: ["knowledge"], tickIntervalMs: 5 });
240
+ await expect(manager.start({ tracks: ["knowledge"] })).rejects.toThrow(/already active/);
241
+ await session.stop();
242
+ });
243
+ it("dry-run skips count separately from real skips in stats.dryRun", async () => {
244
+ // Drains after one tick: discover returns k1 the first time, then [].
245
+ // (Real gateway moves a claimed challenge out of the open list; the mock
246
+ // simulates that so once-mode doesn't loop on the same challenge forever.)
247
+ let knowledgeCalls = 0;
248
+ connection.request.mockImplementation(async (method, path) => {
249
+ if (method === "GET" && path.startsWith("/v1/mining/challenges?status=open&sourceType=rlm_trajectory")) {
250
+ return { challenges: [] };
251
+ }
252
+ if (method === "GET" && path.startsWith("/v1/mining/challenges?status=open")) {
253
+ knowledgeCalls++;
254
+ if (knowledgeCalls === 1) {
255
+ return { challenges: [{
256
+ id: "k1", title: "K", difficulty: "easy",
257
+ estimatedRewardNook: 1000, sourceType: "agent_authored",
258
+ closesAt: "2030-01-01T00:00:00Z",
259
+ }] };
260
+ }
261
+ return { challenges: [] };
262
+ }
263
+ throw new Error(`unexpected ${method} ${path}`);
264
+ });
265
+ const session = await manager.start({
266
+ tracks: ["knowledge"],
267
+ dryRun: true,
268
+ once: true,
269
+ tickIntervalMs: 5,
270
+ });
271
+ await session.done;
272
+ const stats = session.stats();
273
+ expect(stats.dryRun).toBe(1);
274
+ expect(stats.skipped).toBe(0);
275
+ expect(stats.submitted).toBe(0);
276
+ });
277
+ });
278
+ describe("MiningManager.runOnce — explain mode", () => {
279
+ it("logs scoring math when explain: true", async () => {
280
+ const connection = createMockConnection();
281
+ const economy = createMockEconomy();
282
+ const logs = [];
283
+ const manager = new MiningManager(connection, economy);
284
+ setupResponses(connection, ["k1", "k2", "k3"]);
285
+ await manager.runOnce({
286
+ tracks: ["knowledge"],
287
+ explain: true,
288
+ log: (m) => logs.push(m),
289
+ });
290
+ const rankLines = logs.filter((l) => l.startsWith("[mining][rank]"));
291
+ expect(rankLines.length).toBeGreaterThan(0);
292
+ expect(rankLines[0]).toMatch(/score=/);
293
+ });
294
+ });
295
+ // Type sanity check
296
+ describe("ChallengeSummary type", () => {
297
+ it("compiles with expected fields", () => {
298
+ const s = {
299
+ id: "x", track: "knowledge", title: "t", difficulty: "easy",
300
+ estimatedRewardNook: 0, domainTags: [], sourceType: "agent_authored",
301
+ closesAt: "2030-01-01T00:00:00Z",
302
+ };
303
+ expect(s.track).toBe("knowledge");
304
+ });
305
+ });
306
+ //# sourceMappingURL=mining.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mining.test.js","sourceRoot":"","sources":["../../src/__tests__/mining.test.ts"],"names":[],"mappings":"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"}
@@ -161,20 +161,20 @@ describe("schemaVersion (pack-format gate)", () => {
161
161
  });
162
162
  describe("parsePack", () => {
163
163
  it("parses a YAML pack document", () => {
164
- const result = parsePack(`
165
- name: notion-research-agent
166
- version: 1.0.0
167
- tools: [search_knowledge, send_dm]
168
- mcpServers:
169
- - name: notion
170
- url: https://mcp.notion.com/mcp
171
- connection: notion
172
- connections:
173
- - service: notion
174
- owner: agent
175
- connectors:
176
- - platform: email
177
- mode: outbound
164
+ const result = parsePack(`
165
+ name: notion-research-agent
166
+ version: 1.0.0
167
+ tools: [search_knowledge, send_dm]
168
+ mcpServers:
169
+ - name: notion
170
+ url: https://mcp.notion.com/mcp
171
+ connection: notion
172
+ connections:
173
+ - service: notion
174
+ owner: agent
175
+ connectors:
176
+ - platform: email
177
+ mode: outbound
178
178
  `);
179
179
  expect(result.errors).toEqual([]);
180
180
  expect(result.ok).toBe(true);
@@ -234,10 +234,10 @@ describe("preset delegation", () => {
234
234
  });
235
235
  describe("pack file loading", () => {
236
236
  it("reads + parses the pack from packPath", async () => {
237
- mockReadFile.mockResolvedValueOnce(`
238
- name: from-file
239
- version: 1.0.0
240
- tools: [search_knowledge]
237
+ mockReadFile.mockResolvedValueOnce(`
238
+ name: from-file
239
+ version: 1.0.0
240
+ tools: [search_knowledge]
241
241
  `);
242
242
  const { runtime } = makeRuntime();
243
243
  const report = await new PackLoader(runtime, { packPath: "./my.pack.yaml" }).load();
@@ -27,28 +27,28 @@ function createMockRuntime() {
27
27
  identity: { getAddress: vi.fn().mockReturnValue("0xtest") },
28
28
  };
29
29
  }
30
- const SAMPLE_YAML = `
31
- version: "1.0"
32
- gateway: https://gateway.nookplot.com
33
- agent:
34
- name: TestAgent
35
- preset:
36
- id: "research-biology"
37
- version: 1
38
- trustLevel: "verified"
39
- failurePolicy: "continue"
40
- maxCostNook: 5000000
41
- sources:
42
- - type: "mining"
43
- label: "Biology traces"
44
- config:
45
- domainTags: ["biology"]
46
- minScore: 0.6
47
- maxTraces: 10
48
- - type: "bundle"
49
- label: "Bio papers"
50
- config:
51
- bundleId: 42
30
+ const SAMPLE_YAML = `
31
+ version: "1.0"
32
+ gateway: https://gateway.nookplot.com
33
+ agent:
34
+ name: TestAgent
35
+ preset:
36
+ id: "research-biology"
37
+ version: 1
38
+ trustLevel: "verified"
39
+ failurePolicy: "continue"
40
+ maxCostNook: 5000000
41
+ sources:
42
+ - type: "mining"
43
+ label: "Biology traces"
44
+ config:
45
+ domainTags: ["biology"]
46
+ minScore: 0.6
47
+ maxTraces: 10
48
+ - type: "bundle"
49
+ label: "Bio papers"
50
+ config:
51
+ bundleId: 42
52
52
  `;
53
53
  const FETCH_RESPONSE = {
54
54
  presetId: "research-biology",
@@ -713,26 +713,26 @@ describe("E2E: forge data/fetch → KG batch ingest → self-model memory", () =
713
713
  totalItems: 2,
714
714
  totalCostNook: 50000,
715
715
  };
716
- const YAML_WITH_AGG = `
717
- version: "1.0"
718
- gateway: https://gateway.nookplot.com
719
- agent:
720
- name: GenomicsAgent
721
- preset:
722
- id: "genomics-researcher"
723
- version: 1
724
- trustLevel: "verified"
725
- failurePolicy: "continue"
726
- maxCostNook: 5000000
727
- sources:
728
- - type: "mining"
729
- label: "Genomics traces"
730
- config:
731
- domainTags: ["genomics"]
732
- - type: "aggregate"
733
- label: "Genomics aggregates"
734
- config:
735
- domainTags: ["genomics"]
716
+ const YAML_WITH_AGG = `
717
+ version: "1.0"
718
+ gateway: https://gateway.nookplot.com
719
+ agent:
720
+ name: GenomicsAgent
721
+ preset:
722
+ id: "genomics-researcher"
723
+ version: 1
724
+ trustLevel: "verified"
725
+ failurePolicy: "continue"
726
+ maxCostNook: 5000000
727
+ sources:
728
+ - type: "mining"
729
+ label: "Genomics traces"
730
+ config:
731
+ domainTags: ["genomics"]
732
+ - type: "aggregate"
733
+ label: "Genomics aggregates"
734
+ config:
735
+ domainTags: ["genomics"]
736
736
  `;
737
737
  setupReadFileMocks(YAML_WITH_AGG);
738
738
  setupKgAvailable(runtime, AGGREGATE_FETCH_RESPONSE);
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Constructor-time config validation for `NookplotRuntime`.
3
+ *
4
+ * The surplus guard mirrors the CLI's `validateConfig` startup check: surplus
5
+ * inference signs each x402 payment with the agent's OWN key, so an
6
+ * API-key-only agent would construct fine but throw a keyless `SurplusError`
7
+ * on the FIRST inference call — deep in the autonomous loop, easily mistaken
8
+ * for an outage. Failing fast at construction turns that into an actionable
9
+ * startup error.
10
+ *
11
+ * Note: the call-time keyless behavior is covered separately in
12
+ * economy.surplusBranch.test.ts (which constructs ConnectionManager/
13
+ * EconomyManager directly, BELOW this top-level guard — so a per-call
14
+ * `inferenceSource: "surplus"` override on a platform-default runtime still
15
+ * validates at call time, unaffected by this constructor check).
16
+ */
17
+ export {};
18
+ //# sourceMappingURL=runtimeConstructor.test.d.ts.map