@nookplot/runtime 0.5.137 → 0.5.139
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__/autonomous.dedup.test.js +11 -0
- package/dist/__tests__/autonomous.dedup.test.js.map +1 -1
- package/dist/__tests__/autonomous.getAvailableActions.test.js +13 -1
- package/dist/__tests__/autonomous.getAvailableActions.test.js.map +1 -1
- package/dist/__tests__/autonomous.goalBootstrap.test.d.ts +2 -0
- package/dist/__tests__/autonomous.goalBootstrap.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.goalBootstrap.test.js +148 -0
- package/dist/__tests__/autonomous.goalBootstrap.test.js.map +1 -0
- package/dist/__tests__/autonomous.miningTrack.test.d.ts +2 -0
- package/dist/__tests__/autonomous.miningTrack.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.miningTrack.test.js +38 -0
- package/dist/__tests__/autonomous.miningTrack.test.js.map +1 -0
- package/dist/__tests__/autonomous.workspaceOpportunity.test.d.ts +2 -0
- package/dist/__tests__/autonomous.workspaceOpportunity.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.workspaceOpportunity.test.js +200 -0
- package/dist/__tests__/autonomous.workspaceOpportunity.test.js.map +1 -0
- package/dist/__tests__/codegen-drift.test.js +3 -1
- package/dist/__tests__/codegen-drift.test.js.map +1 -1
- package/dist/__tests__/connection.autoReauth.test.d.ts +19 -0
- package/dist/__tests__/connection.autoReauth.test.d.ts.map +1 -0
- package/dist/__tests__/connection.autoReauth.test.js +182 -0
- package/dist/__tests__/connection.autoReauth.test.js.map +1 -0
- package/dist/__tests__/conversation/modelThresholdsParity.test.js +6 -11
- package/dist/__tests__/conversation/modelThresholdsParity.test.js.map +1 -1
- package/dist/__tests__/goalLoop.test.d.ts +2 -0
- package/dist/__tests__/goalLoop.test.d.ts.map +1 -0
- package/dist/__tests__/goalLoop.test.js +335 -0
- package/dist/__tests__/goalLoop.test.js.map +1 -0
- package/dist/__tests__/helpers/mockRuntime.d.ts.map +1 -1
- package/dist/__tests__/helpers/mockRuntime.js +7 -0
- package/dist/__tests__/helpers/mockRuntime.js.map +1 -1
- package/dist/__tests__/loadProfile.test.d.ts +8 -0
- package/dist/__tests__/loadProfile.test.d.ts.map +1 -0
- package/dist/__tests__/loadProfile.test.js +134 -0
- package/dist/__tests__/loadProfile.test.js.map +1 -0
- package/dist/__tests__/mining.test.d.ts +2 -0
- package/dist/__tests__/mining.test.d.ts.map +1 -0
- package/dist/__tests__/mining.test.js +306 -0
- package/dist/__tests__/mining.test.js.map +1 -0
- package/dist/__tests__/presetLoader.test.d.ts +2 -0
- package/dist/__tests__/presetLoader.test.d.ts.map +1 -0
- package/dist/__tests__/presetLoader.test.js +749 -0
- package/dist/__tests__/presetLoader.test.js.map +1 -0
- package/dist/__tests__/sandbox.test.js +24 -24
- package/dist/actionCatalog.generated.d.ts +1 -1
- package/dist/actionCatalog.generated.d.ts.map +1 -1
- package/dist/actionCatalog.generated.js +158 -19
- package/dist/actionCatalog.generated.js.map +1 -1
- package/dist/autonomous.d.ts +16 -1
- package/dist/autonomous.d.ts.map +1 -1
- package/dist/autonomous.js +232 -37
- package/dist/autonomous.js.map +1 -1
- package/dist/connection.d.ts +26 -2
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +110 -5
- package/dist/connection.js.map +1 -1
- package/dist/contentSafety.d.ts +1 -1
- package/dist/contentSafety.d.ts.map +1 -1
- package/dist/contentSafety.js +6 -2
- package/dist/contentSafety.js.map +1 -1
- package/dist/conversation/modelLimits.js +17 -17
- package/dist/discovery.js +1 -1
- package/dist/discovery.js.map +1 -1
- package/dist/goal/goalLoop.d.ts +78 -0
- package/dist/goal/goalLoop.d.ts.map +1 -0
- package/dist/goal/goalLoop.js +376 -0
- package/dist/goal/goalLoop.js.map +1 -0
- package/dist/goal/goalPrompts.d.ts +20 -0
- package/dist/goal/goalPrompts.d.ts.map +1 -0
- package/dist/goal/goalPrompts.js +54 -0
- package/dist/goal/goalPrompts.js.map +1 -0
- package/dist/goal/types.d.ts +98 -0
- package/dist/goal/types.d.ts.map +1 -0
- package/dist/goal/types.js +7 -0
- package/dist/goal/types.js.map +1 -0
- package/dist/identity.d.ts +51 -0
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +50 -0
- package/dist/identity.js.map +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/loadProfile.d.ts +100 -0
- package/dist/loadProfile.d.ts.map +1 -0
- package/dist/loadProfile.js +221 -0
- package/dist/loadProfile.js.map +1 -0
- package/dist/presetLoader.d.ts +130 -0
- package/dist/presetLoader.d.ts.map +1 -0
- package/dist/presetLoader.js +734 -0
- package/dist/presetLoader.js.map +1 -0
- package/dist/signalActionMap.d.ts.map +1 -1
- package/dist/signalActionMap.js +9 -0
- package/dist/signalActionMap.js.map +1 -1
- package/dist/swarms.d.ts +13 -0
- package/dist/swarms.d.ts.map +1 -1
- package/dist/swarms.js +4 -0
- package/dist/swarms.js.map +1 -1
- package/dist/tools.js +1 -1
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage for A13 — auto-reauth on 401 "Invalid or revoked API key".
|
|
3
|
+
*
|
|
4
|
+
* The contract these tests enforce:
|
|
5
|
+
* 1. With a privateKey configured, a 401 with the magic message triggers
|
|
6
|
+
* a wallet-session refresh, the effective Bearer key rotates to the
|
|
7
|
+
* newly-issued session key, and the original request is retried once.
|
|
8
|
+
* 2. The retry uses the NEW key in the Authorization header.
|
|
9
|
+
* 3. If the refresh fails (e.g., wallet-session declines), the original
|
|
10
|
+
* 401 is surfaced — we never silently swallow.
|
|
11
|
+
* 4. Without a privateKey, the 401 path-through is unchanged.
|
|
12
|
+
* 5. `disableAutoReauth: true` opt-out works.
|
|
13
|
+
* 6. The retry only fires ONCE — if the new key STILL hits 401, we throw.
|
|
14
|
+
*
|
|
15
|
+
* `fetch` is mocked per-test so we can simulate the gateway responses
|
|
16
|
+
* with full control over status codes + Set-Cookie headers.
|
|
17
|
+
*/
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=connection.autoReauth.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.autoReauth.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/connection.autoReauth.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage for A13 — auto-reauth on 401 "Invalid or revoked API key".
|
|
3
|
+
*
|
|
4
|
+
* The contract these tests enforce:
|
|
5
|
+
* 1. With a privateKey configured, a 401 with the magic message triggers
|
|
6
|
+
* a wallet-session refresh, the effective Bearer key rotates to the
|
|
7
|
+
* newly-issued session key, and the original request is retried once.
|
|
8
|
+
* 2. The retry uses the NEW key in the Authorization header.
|
|
9
|
+
* 3. If the refresh fails (e.g., wallet-session declines), the original
|
|
10
|
+
* 401 is surfaced — we never silently swallow.
|
|
11
|
+
* 4. Without a privateKey, the 401 path-through is unchanged.
|
|
12
|
+
* 5. `disableAutoReauth: true` opt-out works.
|
|
13
|
+
* 6. The retry only fires ONCE — if the new key STILL hits 401, we throw.
|
|
14
|
+
*
|
|
15
|
+
* `fetch` is mocked per-test so we can simulate the gateway responses
|
|
16
|
+
* with full control over status codes + Set-Cookie headers.
|
|
17
|
+
*/
|
|
18
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
19
|
+
import { ConnectionManager } from "../connection.js";
|
|
20
|
+
const TEST_PRIVKEY = "0x" + "ab".repeat(32); // arbitrary 32-byte hex
|
|
21
|
+
const TEST_BASE = "https://gateway.example.com";
|
|
22
|
+
function makeMockFetch(handlers) {
|
|
23
|
+
let i = 0;
|
|
24
|
+
return vi.fn(async (urlOrReq, init) => {
|
|
25
|
+
const req = new Request(typeof urlOrReq === "string" ? urlOrReq : urlOrReq.toString(), init);
|
|
26
|
+
const handler = handlers[i] ?? handlers[handlers.length - 1];
|
|
27
|
+
i++;
|
|
28
|
+
return handler(req);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
beforeEach(() => {
|
|
32
|
+
vi.restoreAllMocks();
|
|
33
|
+
});
|
|
34
|
+
describe("ConnectionManager — A13 auto-reauth", () => {
|
|
35
|
+
it("rotates the Bearer key + retries when 401 fires with a privateKey configured", async () => {
|
|
36
|
+
let calls = 0;
|
|
37
|
+
const fetchSpy = makeMockFetch([
|
|
38
|
+
// 1st call → 401 Invalid or revoked
|
|
39
|
+
async () => {
|
|
40
|
+
calls++;
|
|
41
|
+
return new Response(JSON.stringify({ message: "Invalid or revoked API key." }), { status: 401, headers: { "Content-Type": "application/json" } });
|
|
42
|
+
},
|
|
43
|
+
// 2nd call → wallet-session refresh succeeds, Set-Cookie carries new key
|
|
44
|
+
async () => {
|
|
45
|
+
calls++;
|
|
46
|
+
return new Response(JSON.stringify({ authenticated: true, agent: { apiKeyPrefix: "nk_new" } }), {
|
|
47
|
+
status: 200,
|
|
48
|
+
headers: {
|
|
49
|
+
"Content-Type": "application/json",
|
|
50
|
+
"Set-Cookie": "nookplot_session=nk_freshRotatedKey1234567890; Path=/; HttpOnly",
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
// 3rd call → retry of the original request with NEW key succeeds
|
|
55
|
+
async (req) => {
|
|
56
|
+
calls++;
|
|
57
|
+
// The retry should carry the NEW Bearer key.
|
|
58
|
+
expect(req.headers.get("Authorization")).toBe("Bearer nk_freshRotatedKey1234567890");
|
|
59
|
+
return new Response(JSON.stringify({ ok: true }), { status: 200, headers: { "Content-Type": "application/json" } });
|
|
60
|
+
},
|
|
61
|
+
]);
|
|
62
|
+
vi.stubGlobal("fetch", fetchSpy);
|
|
63
|
+
const conn = new ConnectionManager({
|
|
64
|
+
gatewayUrl: TEST_BASE,
|
|
65
|
+
apiKey: "nk_originalRevokedKey",
|
|
66
|
+
privateKey: TEST_PRIVKEY,
|
|
67
|
+
});
|
|
68
|
+
const result = await conn.request("GET", "/v1/agents/me");
|
|
69
|
+
expect(result).toEqual({ ok: true });
|
|
70
|
+
expect(calls).toBe(3);
|
|
71
|
+
expect(conn.apiKey).toBe("nk_freshRotatedKey1234567890");
|
|
72
|
+
});
|
|
73
|
+
it("re-throws the original 401 when wallet-session refresh fails (no recovery possible)", async () => {
|
|
74
|
+
const fetchSpy = makeMockFetch([
|
|
75
|
+
// 1st call → 401
|
|
76
|
+
async () => new Response(JSON.stringify({ message: "Invalid or revoked API key." }), { status: 401, headers: { "Content-Type": "application/json" } }),
|
|
77
|
+
// 2nd call → wallet-session refresh fails (gateway 403)
|
|
78
|
+
async () => new Response(JSON.stringify({ error: "Wallet not registered" }), { status: 403, headers: { "Content-Type": "application/json" } }),
|
|
79
|
+
]);
|
|
80
|
+
vi.stubGlobal("fetch", fetchSpy);
|
|
81
|
+
const conn = new ConnectionManager({
|
|
82
|
+
gatewayUrl: TEST_BASE,
|
|
83
|
+
apiKey: "nk_originalRevokedKey",
|
|
84
|
+
privateKey: TEST_PRIVKEY,
|
|
85
|
+
});
|
|
86
|
+
await expect(conn.request("GET", "/v1/agents/me")).rejects.toThrow(/401|Invalid or revoked/i);
|
|
87
|
+
// effectiveApiKey should NOT have rotated — refresh failed.
|
|
88
|
+
expect(conn.apiKey).toBe("nk_originalRevokedKey");
|
|
89
|
+
});
|
|
90
|
+
it("does NOT attempt reauth when no privateKey is configured", async () => {
|
|
91
|
+
let calls = 0;
|
|
92
|
+
const fetchSpy = makeMockFetch([
|
|
93
|
+
async () => {
|
|
94
|
+
calls++;
|
|
95
|
+
return new Response(JSON.stringify({ message: "Invalid or revoked API key." }), { status: 401, headers: { "Content-Type": "application/json" } });
|
|
96
|
+
},
|
|
97
|
+
]);
|
|
98
|
+
vi.stubGlobal("fetch", fetchSpy);
|
|
99
|
+
const conn = new ConnectionManager({
|
|
100
|
+
gatewayUrl: TEST_BASE,
|
|
101
|
+
apiKey: "nk_originalRevokedKey",
|
|
102
|
+
// NO privateKey
|
|
103
|
+
});
|
|
104
|
+
await expect(conn.request("GET", "/v1/agents/me")).rejects.toThrow(/Gateway request failed \(401\)/);
|
|
105
|
+
// No reauth attempted: only 1 fetch call (the original 401).
|
|
106
|
+
expect(calls).toBe(1);
|
|
107
|
+
});
|
|
108
|
+
it("respects disableAutoReauth opt-out flag", async () => {
|
|
109
|
+
let calls = 0;
|
|
110
|
+
const fetchSpy = makeMockFetch([
|
|
111
|
+
async () => {
|
|
112
|
+
calls++;
|
|
113
|
+
return new Response(JSON.stringify({ message: "Invalid or revoked API key." }), { status: 401, headers: { "Content-Type": "application/json" } });
|
|
114
|
+
},
|
|
115
|
+
]);
|
|
116
|
+
vi.stubGlobal("fetch", fetchSpy);
|
|
117
|
+
const conn = new ConnectionManager({
|
|
118
|
+
gatewayUrl: TEST_BASE,
|
|
119
|
+
apiKey: "nk_originalRevokedKey",
|
|
120
|
+
privateKey: TEST_PRIVKEY,
|
|
121
|
+
disableAutoReauth: true,
|
|
122
|
+
});
|
|
123
|
+
await expect(conn.request("GET", "/v1/agents/me")).rejects.toThrow(/401|Invalid or revoked/i);
|
|
124
|
+
// Opt-out: only 1 fetch call (the original 401).
|
|
125
|
+
expect(calls).toBe(1);
|
|
126
|
+
});
|
|
127
|
+
it("retries only ONCE — a second 401 after rotation throws", async () => {
|
|
128
|
+
let calls = 0;
|
|
129
|
+
const fetchSpy = makeMockFetch([
|
|
130
|
+
// 1st: 401
|
|
131
|
+
async () => {
|
|
132
|
+
calls++;
|
|
133
|
+
return new Response(JSON.stringify({ message: "Invalid or revoked API key." }), { status: 401, headers: { "Content-Type": "application/json" } });
|
|
134
|
+
},
|
|
135
|
+
// 2nd: wallet-session refresh succeeds
|
|
136
|
+
async () => {
|
|
137
|
+
calls++;
|
|
138
|
+
return new Response(JSON.stringify({ authenticated: true }), {
|
|
139
|
+
status: 200,
|
|
140
|
+
headers: {
|
|
141
|
+
"Content-Type": "application/json",
|
|
142
|
+
"Set-Cookie": "nookplot_session=nk_newKeyButStillRevoked123456789012; Path=/; HttpOnly",
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
},
|
|
146
|
+
// 3rd: retry with new key STILL 401 (something else is wrong)
|
|
147
|
+
async () => {
|
|
148
|
+
calls++;
|
|
149
|
+
return new Response(JSON.stringify({ message: "Invalid or revoked API key." }), { status: 401, headers: { "Content-Type": "application/json" } });
|
|
150
|
+
},
|
|
151
|
+
]);
|
|
152
|
+
vi.stubGlobal("fetch", fetchSpy);
|
|
153
|
+
const conn = new ConnectionManager({
|
|
154
|
+
gatewayUrl: TEST_BASE,
|
|
155
|
+
apiKey: "nk_originalRevokedKey",
|
|
156
|
+
privateKey: TEST_PRIVKEY,
|
|
157
|
+
});
|
|
158
|
+
await expect(conn.request("GET", "/v1/agents/me")).rejects.toThrow(/401|Invalid or revoked/i);
|
|
159
|
+
// Original (401) + refresh (200) + retry (401) = 3 calls. NO 4th
|
|
160
|
+
// attempt — that would be the infinite-loop bug we're guarding against.
|
|
161
|
+
expect(calls).toBe(3);
|
|
162
|
+
});
|
|
163
|
+
it("ignores 401s with non-matching messages (no reauth, just throw)", async () => {
|
|
164
|
+
let calls = 0;
|
|
165
|
+
const fetchSpy = makeMockFetch([
|
|
166
|
+
async () => {
|
|
167
|
+
calls++;
|
|
168
|
+
return new Response(JSON.stringify({ message: "Owner only — agent's wallet required." }), { status: 401, headers: { "Content-Type": "application/json" } });
|
|
169
|
+
},
|
|
170
|
+
]);
|
|
171
|
+
vi.stubGlobal("fetch", fetchSpy);
|
|
172
|
+
const conn = new ConnectionManager({
|
|
173
|
+
gatewayUrl: TEST_BASE,
|
|
174
|
+
apiKey: "nk_validButOwnerCheckFails",
|
|
175
|
+
privateKey: TEST_PRIVKEY,
|
|
176
|
+
});
|
|
177
|
+
await expect(conn.request("GET", "/v1/some-owner-only-route")).rejects.toThrow(/Owner only/);
|
|
178
|
+
// No reauth on a non-key-revoked 401.
|
|
179
|
+
expect(calls).toBe(1);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
//# sourceMappingURL=connection.autoReauth.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.autoReauth.test.js","sourceRoot":"","sources":["../../src/__tests__/connection.autoReauth.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* point is that it catches the drift.
|
|
15
15
|
*/
|
|
16
16
|
import { describe, it, expect } from "vitest";
|
|
17
|
-
import { readFileSync
|
|
17
|
+
import { readFileSync } from "node:fs";
|
|
18
18
|
import { resolve } from "node:path";
|
|
19
19
|
import { MODEL_THRESHOLDS as SDK_THRESHOLDS } from "../../conversation/modelLimits.js";
|
|
20
20
|
/**
|
|
@@ -37,22 +37,18 @@ function parseThresholds(source, varName) {
|
|
|
37
37
|
}
|
|
38
38
|
return out;
|
|
39
39
|
}
|
|
40
|
-
|
|
41
|
-
const
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
// this guard just ensures the suite auto-activates once the gateway catches up.
|
|
46
|
-
describe.skipIf(!gatewayExists)("MODEL_THRESHOLDS parity", () => {
|
|
40
|
+
describe("MODEL_THRESHOLDS parity", () => {
|
|
41
|
+
const repoRoot = resolve(__dirname, "..", "..", "..", "..");
|
|
42
|
+
const gatewayPath = resolve(repoRoot, "gateway", "src", "services", "sessionCompactor.ts");
|
|
43
|
+
const gatewaySource = readFileSync(gatewayPath, "utf8");
|
|
44
|
+
const gatewayThresholds = parseThresholds(gatewaySource, "MODEL_THRESHOLDS");
|
|
47
45
|
it("gateway entries are a subset of SDK entries", () => {
|
|
48
|
-
const gatewayThresholds = parseThresholds(readFileSync(gatewayPath, "utf8"), "MODEL_THRESHOLDS");
|
|
49
46
|
for (const [model, gatewayT] of Object.entries(gatewayThresholds)) {
|
|
50
47
|
expect(SDK_THRESHOLDS).toHaveProperty(model);
|
|
51
48
|
expect(SDK_THRESHOLDS[model]).toEqual(gatewayT);
|
|
52
49
|
}
|
|
53
50
|
});
|
|
54
51
|
it("gateway has at least one known entry (sanity check on the parser)", () => {
|
|
55
|
-
const gatewayThresholds = parseThresholds(readFileSync(gatewayPath, "utf8"), "MODEL_THRESHOLDS");
|
|
56
52
|
expect(Object.keys(gatewayThresholds).length).toBeGreaterThan(5);
|
|
57
53
|
expect(gatewayThresholds["claude-opus-4-6"]).toEqual({
|
|
58
54
|
compactAt: 24000,
|
|
@@ -60,7 +56,6 @@ describe.skipIf(!gatewayExists)("MODEL_THRESHOLDS parity", () => {
|
|
|
60
56
|
});
|
|
61
57
|
});
|
|
62
58
|
it("SDK has every gateway entry with byte-identical values", () => {
|
|
63
|
-
const gatewayThresholds = parseThresholds(readFileSync(gatewayPath, "utf8"), "MODEL_THRESHOLDS");
|
|
64
59
|
const missing = [];
|
|
65
60
|
const mismatched = [];
|
|
66
61
|
for (const [model, gatewayT] of Object.entries(gatewayThresholds)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelThresholdsParity.test.js","sourceRoot":"","sources":["../../../src/__tests__/conversation/modelThresholdsParity.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"modelThresholdsParity.test.js","sourceRoot":"","sources":["../../../src/__tests__/conversation/modelThresholdsParity.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goalLoop.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/goalLoop.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for the L3 GoalLoop.
|
|
3
|
+
*
|
|
4
|
+
* Mocks the inference call directly via the inferenceCall option — the
|
|
5
|
+
* loop is exercised in isolation from any real LLM or gateway network.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
8
|
+
import { createMockRuntime } from "./helpers/mockRuntime.js";
|
|
9
|
+
import { GoalLoop, parseGoalAction } from "../goal/goalLoop.js";
|
|
10
|
+
let runtime;
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
vi.clearAllMocks();
|
|
13
|
+
runtime = createMockRuntime().runtime;
|
|
14
|
+
// The loop calls connection.request for action execution — default to
|
|
15
|
+
// a successful off-chain tool result.
|
|
16
|
+
runtime.connection.request.mockResolvedValue({
|
|
17
|
+
status: "completed",
|
|
18
|
+
result: "search result",
|
|
19
|
+
costNook: 5,
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
describe("parseGoalAction", () => {
|
|
23
|
+
it("parses a complete action", () => {
|
|
24
|
+
const result = parseGoalAction(JSON.stringify({
|
|
25
|
+
type: "complete",
|
|
26
|
+
title: "Done",
|
|
27
|
+
body: "Deliverable body",
|
|
28
|
+
domain: "research",
|
|
29
|
+
description: "finished",
|
|
30
|
+
}));
|
|
31
|
+
expect(result).not.toBeNull();
|
|
32
|
+
expect(result.type).toBe("complete");
|
|
33
|
+
if (result?.type === "complete") {
|
|
34
|
+
expect(result.title).toBe("Done");
|
|
35
|
+
expect(result.body).toBe("Deliverable body");
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
it("parses an action with params", () => {
|
|
39
|
+
const result = parseGoalAction(JSON.stringify({
|
|
40
|
+
type: "action",
|
|
41
|
+
action_name: "web_search",
|
|
42
|
+
action_params: { query: "base l2 protocols" },
|
|
43
|
+
description: "search for Base L2 protocols",
|
|
44
|
+
}));
|
|
45
|
+
expect(result).not.toBeNull();
|
|
46
|
+
if (result?.type === "action") {
|
|
47
|
+
expect(result.actionName).toBe("web_search");
|
|
48
|
+
expect(result.actionParams.query).toBe("base l2 protocols");
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
it("returns null for malformed JSON", () => {
|
|
52
|
+
expect(parseGoalAction("not json at all")).toBeNull();
|
|
53
|
+
expect(parseGoalAction("{incomplete")).toBeNull();
|
|
54
|
+
});
|
|
55
|
+
it("returns null when type is missing", () => {
|
|
56
|
+
expect(parseGoalAction(JSON.stringify({ title: "x" }))).toBeNull();
|
|
57
|
+
});
|
|
58
|
+
it("returns null when action_name is missing from an action", () => {
|
|
59
|
+
expect(parseGoalAction(JSON.stringify({ type: "action", description: "do stuff" }))).toBeNull();
|
|
60
|
+
});
|
|
61
|
+
it("parses needs_capability", () => {
|
|
62
|
+
const result = parseGoalAction(JSON.stringify({
|
|
63
|
+
type: "needs_capability",
|
|
64
|
+
description: "I need a python interpreter",
|
|
65
|
+
suggested_preset: "python-runner",
|
|
66
|
+
}));
|
|
67
|
+
expect(result).not.toBeNull();
|
|
68
|
+
if (result?.type === "needs_capability") {
|
|
69
|
+
expect(result.suggestedPreset).toBe("python-runner");
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
it("extracts JSON block even when prose wraps it", () => {
|
|
73
|
+
const result = parseGoalAction('Here is my decision:\n{"type":"noop","description":"waiting"}\nDone.');
|
|
74
|
+
expect(result?.type).toBe("noop");
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe("GoalLoop.run", () => {
|
|
78
|
+
it("returns complete on first turn when LLM says complete", async () => {
|
|
79
|
+
const loop = new GoalLoop({
|
|
80
|
+
runtime,
|
|
81
|
+
goal: "Find top 3 protocols",
|
|
82
|
+
budgetNook: 500n,
|
|
83
|
+
inferenceCall: vi.fn().mockResolvedValue({
|
|
84
|
+
content: JSON.stringify({
|
|
85
|
+
type: "complete",
|
|
86
|
+
title: "Top 3 Protocols",
|
|
87
|
+
body: "1. ProtoA\n2. ProtoB\n3. ProtoC",
|
|
88
|
+
domain: "defi",
|
|
89
|
+
description: "done",
|
|
90
|
+
}),
|
|
91
|
+
}),
|
|
92
|
+
verbose: false,
|
|
93
|
+
});
|
|
94
|
+
const result = await loop.run();
|
|
95
|
+
expect(result.outcome).toBe("complete");
|
|
96
|
+
if (result.outcome === "complete") {
|
|
97
|
+
expect(result.artifact.title).toBe("Top 3 Protocols");
|
|
98
|
+
expect(result.stepsExecuted).toBe(0);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
it("returns blocked_stuck when same step repeats 3x", async () => {
|
|
102
|
+
const loop = new GoalLoop({
|
|
103
|
+
runtime,
|
|
104
|
+
goal: "Find something",
|
|
105
|
+
budgetNook: 500n,
|
|
106
|
+
maxSteps: 10,
|
|
107
|
+
maxReformulations: 3,
|
|
108
|
+
inferenceCall: vi.fn().mockResolvedValue({
|
|
109
|
+
content: JSON.stringify({
|
|
110
|
+
type: "action",
|
|
111
|
+
action_name: "web_search",
|
|
112
|
+
action_params: { query: "base" },
|
|
113
|
+
description: "searching for base protocols",
|
|
114
|
+
}),
|
|
115
|
+
}),
|
|
116
|
+
verbose: false,
|
|
117
|
+
});
|
|
118
|
+
const result = await loop.run();
|
|
119
|
+
expect(result.outcome).toBe("blocked_stuck");
|
|
120
|
+
if (result.outcome === "blocked_stuck") {
|
|
121
|
+
expect(result.stuckReason).toContain("searching");
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
it("returns blocked_capability when LLM declares a gap", async () => {
|
|
125
|
+
const loop = new GoalLoop({
|
|
126
|
+
runtime,
|
|
127
|
+
goal: "Run python code",
|
|
128
|
+
budgetNook: 500n,
|
|
129
|
+
inferenceCall: vi.fn().mockResolvedValue({
|
|
130
|
+
content: JSON.stringify({
|
|
131
|
+
type: "needs_capability",
|
|
132
|
+
description: "I need a python sandbox",
|
|
133
|
+
suggested_preset: "python-runner",
|
|
134
|
+
}),
|
|
135
|
+
}),
|
|
136
|
+
verbose: false,
|
|
137
|
+
});
|
|
138
|
+
const result = await loop.run();
|
|
139
|
+
expect(result.outcome).toBe("blocked_capability");
|
|
140
|
+
if (result.outcome === "blocked_capability") {
|
|
141
|
+
expect(result.capabilityNeeded).toContain("python");
|
|
142
|
+
expect(result.suggestedPreset).toBe("python-runner");
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
it("treats 3 no-ops as complete (fallback artifact)", async () => {
|
|
146
|
+
const loop = new GoalLoop({
|
|
147
|
+
runtime,
|
|
148
|
+
goal: "Do stuff",
|
|
149
|
+
budgetNook: 500n,
|
|
150
|
+
maxSteps: 10,
|
|
151
|
+
maxConsecutiveNoops: 3,
|
|
152
|
+
inferenceCall: vi.fn().mockResolvedValue({
|
|
153
|
+
content: JSON.stringify({ type: "noop", description: "nothing to do" }),
|
|
154
|
+
}),
|
|
155
|
+
verbose: false,
|
|
156
|
+
});
|
|
157
|
+
const result = await loop.run();
|
|
158
|
+
expect(result.outcome).toBe("complete");
|
|
159
|
+
if (result.outcome === "complete") {
|
|
160
|
+
// No steps executed — fallback body uses the "no progress" branch
|
|
161
|
+
expect(result.artifact.body).toContain("Goal loop terminated");
|
|
162
|
+
expect(result.artifact.body).toContain("no-ops");
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
it("hits maxSteps cap and returns complete with summary", async () => {
|
|
166
|
+
let turn = 0;
|
|
167
|
+
const loop = new GoalLoop({
|
|
168
|
+
runtime,
|
|
169
|
+
goal: "Research",
|
|
170
|
+
budgetNook: 10000n,
|
|
171
|
+
maxSteps: 3,
|
|
172
|
+
maxReformulations: 99, // disable stuck detection
|
|
173
|
+
inferenceCall: vi.fn().mockImplementation(async () => ({
|
|
174
|
+
content: JSON.stringify({
|
|
175
|
+
type: "action",
|
|
176
|
+
action_name: "web_search",
|
|
177
|
+
action_params: { query: `round ${turn++}` },
|
|
178
|
+
description: `round ${turn}`,
|
|
179
|
+
}),
|
|
180
|
+
})),
|
|
181
|
+
verbose: false,
|
|
182
|
+
});
|
|
183
|
+
const result = await loop.run();
|
|
184
|
+
expect(result.outcome).toBe("complete");
|
|
185
|
+
if (result.outcome === "complete") {
|
|
186
|
+
expect(result.stepsExecuted).toBe(3);
|
|
187
|
+
expect(result.artifact.body).toContain("Steps executed");
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
it("records each step via recordGoalStep", async () => {
|
|
191
|
+
let turn = 0;
|
|
192
|
+
const loop = new GoalLoop({
|
|
193
|
+
runtime,
|
|
194
|
+
goal: "Research",
|
|
195
|
+
budgetNook: 10000n,
|
|
196
|
+
maxSteps: 2,
|
|
197
|
+
maxReformulations: 99,
|
|
198
|
+
inferenceCall: vi.fn().mockImplementation(async () => ({
|
|
199
|
+
content: JSON.stringify({
|
|
200
|
+
type: "action",
|
|
201
|
+
action_name: "web_search",
|
|
202
|
+
action_params: {},
|
|
203
|
+
description: `round ${turn++}`,
|
|
204
|
+
}),
|
|
205
|
+
})),
|
|
206
|
+
verbose: false,
|
|
207
|
+
});
|
|
208
|
+
await loop.run();
|
|
209
|
+
expect(runtime.identity.recordGoalStep).toHaveBeenCalledTimes(2);
|
|
210
|
+
});
|
|
211
|
+
it("falls through to complete on unparseable output after 3 tries", async () => {
|
|
212
|
+
const loop = new GoalLoop({
|
|
213
|
+
runtime,
|
|
214
|
+
goal: "Research",
|
|
215
|
+
budgetNook: 500n,
|
|
216
|
+
maxConsecutiveNoops: 3,
|
|
217
|
+
inferenceCall: vi.fn().mockResolvedValue({ content: "garbage not json" }),
|
|
218
|
+
verbose: false,
|
|
219
|
+
});
|
|
220
|
+
const result = await loop.run();
|
|
221
|
+
expect(result.outcome).toBe("complete");
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
describe("GoalLoop — doom-loop integration", () => {
|
|
225
|
+
// Spec: ROADMAP_ml-intern-integrations.md Phase 2
|
|
226
|
+
it("injects a corrective prompt after detecting 3 identical tool calls", async () => {
|
|
227
|
+
const capturedPrompts = [];
|
|
228
|
+
let turn = 0;
|
|
229
|
+
const loop = new GoalLoop({
|
|
230
|
+
runtime,
|
|
231
|
+
goal: "Research",
|
|
232
|
+
budgetNook: 10000n,
|
|
233
|
+
maxSteps: 4,
|
|
234
|
+
maxReformulations: 99,
|
|
235
|
+
inferenceCall: vi.fn().mockImplementation(async (input) => {
|
|
236
|
+
capturedPrompts.push(input.userPrompt);
|
|
237
|
+
turn++;
|
|
238
|
+
// Same action+params, varying description so description-check doesn't fire.
|
|
239
|
+
return {
|
|
240
|
+
content: JSON.stringify({
|
|
241
|
+
type: "action",
|
|
242
|
+
action_name: "web_search",
|
|
243
|
+
action_params: { query: "same" },
|
|
244
|
+
description: `variant-${turn}`,
|
|
245
|
+
}),
|
|
246
|
+
};
|
|
247
|
+
}),
|
|
248
|
+
verbose: false,
|
|
249
|
+
});
|
|
250
|
+
await loop.run();
|
|
251
|
+
expect(capturedPrompts.length).toBeGreaterThanOrEqual(4);
|
|
252
|
+
expect(capturedPrompts[0]).not.toContain("Doom loop");
|
|
253
|
+
expect(capturedPrompts[1]).not.toContain("Doom loop");
|
|
254
|
+
expect(capturedPrompts[2]).not.toContain("Doom loop");
|
|
255
|
+
expect(capturedPrompts[3]).toContain("Doom loop detected");
|
|
256
|
+
expect(capturedPrompts[3]).toContain("web_search");
|
|
257
|
+
});
|
|
258
|
+
it("short-circuits to blocked_stuck after 3 doom-loop triggers with varying description", async () => {
|
|
259
|
+
let turn = 0;
|
|
260
|
+
const loop = new GoalLoop({
|
|
261
|
+
runtime,
|
|
262
|
+
goal: "Research",
|
|
263
|
+
budgetNook: 10000n,
|
|
264
|
+
maxSteps: 10,
|
|
265
|
+
maxReformulations: 99,
|
|
266
|
+
inferenceCall: vi.fn().mockImplementation(async () => {
|
|
267
|
+
turn++;
|
|
268
|
+
return {
|
|
269
|
+
content: JSON.stringify({
|
|
270
|
+
type: "action",
|
|
271
|
+
action_name: "web_search",
|
|
272
|
+
action_params: { query: "same" },
|
|
273
|
+
description: `variant-${turn}`,
|
|
274
|
+
}),
|
|
275
|
+
};
|
|
276
|
+
}),
|
|
277
|
+
verbose: false,
|
|
278
|
+
});
|
|
279
|
+
const result = await loop.run();
|
|
280
|
+
expect(result.outcome).toBe("blocked_stuck");
|
|
281
|
+
if (result.outcome === "blocked_stuck") {
|
|
282
|
+
expect(result.stuckReason?.toLowerCase()).toContain("doom loop");
|
|
283
|
+
expect(result.stuckReason).toContain("web_search");
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
it("different action breaks the loop — no blocked_stuck", async () => {
|
|
287
|
+
let turn = 0;
|
|
288
|
+
const loop = new GoalLoop({
|
|
289
|
+
runtime,
|
|
290
|
+
goal: "Research",
|
|
291
|
+
budgetNook: 10000n,
|
|
292
|
+
maxSteps: 10,
|
|
293
|
+
maxReformulations: 99,
|
|
294
|
+
inferenceCall: vi.fn().mockImplementation(async () => {
|
|
295
|
+
turn++;
|
|
296
|
+
if (turn <= 3) {
|
|
297
|
+
return {
|
|
298
|
+
content: JSON.stringify({
|
|
299
|
+
type: "action",
|
|
300
|
+
action_name: "web_search",
|
|
301
|
+
action_params: { query: "same" },
|
|
302
|
+
description: `variant-${turn}`,
|
|
303
|
+
}),
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
if (turn === 4) {
|
|
307
|
+
return {
|
|
308
|
+
content: JSON.stringify({
|
|
309
|
+
type: "action",
|
|
310
|
+
action_name: "search_knowledge",
|
|
311
|
+
action_params: { q: "switched" },
|
|
312
|
+
description: "changed approach",
|
|
313
|
+
}),
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
return {
|
|
317
|
+
content: JSON.stringify({
|
|
318
|
+
type: "complete",
|
|
319
|
+
title: "Done",
|
|
320
|
+
body: "Final answer.",
|
|
321
|
+
domain: "research",
|
|
322
|
+
description: "done",
|
|
323
|
+
}),
|
|
324
|
+
};
|
|
325
|
+
}),
|
|
326
|
+
verbose: false,
|
|
327
|
+
});
|
|
328
|
+
const result = await loop.run();
|
|
329
|
+
expect(result.outcome).toBe("complete");
|
|
330
|
+
if (result.outcome === "complete") {
|
|
331
|
+
expect(result.artifact.title).toBe("Done");
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
//# sourceMappingURL=goalLoop.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goalLoop.test.js","sourceRoot":"","sources":["../../src/__tests__/goalLoop.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mockRuntime.d.ts","sourceRoot":"","sources":["../../../src/__tests__/helpers/mockRuntime.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKtD,6EAA6E;AAC7E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5C,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;CAC7C;AAED,wBAAgB,iBAAiB,IAAI;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,iBAAiB,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"mockRuntime.d.ts","sourceRoot":"","sources":["../../../src/__tests__/helpers/mockRuntime.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKtD,6EAA6E;AAC7E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5C,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;CAC7C;AAED,wBAAgB,iBAAiB,IAAI;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,iBAAiB,CAAA;CAAE,CAgJ9F"}
|