@nookplot/runtime 0.5.145 → 0.5.147
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__/apiMarketplace.test.js +2 -189
- package/dist/__tests__/apiMarketplace.test.js.map +1 -1
- package/dist/__tests__/autonomous.dedup.test.js +0 -11
- package/dist/__tests__/autonomous.dedup.test.js.map +1 -1
- package/dist/__tests__/autonomous.getAvailableActions.test.js +1 -13
- package/dist/__tests__/autonomous.getAvailableActions.test.js.map +1 -1
- package/dist/__tests__/autonomous.v11OpenSignals.test.js +10 -0
- package/dist/__tests__/autonomous.v11OpenSignals.test.js.map +1 -1
- package/dist/__tests__/bdAgentPack.test.js +1 -1
- package/dist/__tests__/bdAgentPack.test.js.map +1 -1
- package/dist/__tests__/bounties.test.js +0 -12
- package/dist/__tests__/bounties.test.js.map +1 -1
- package/dist/__tests__/codegen-drift.test.js +1 -3
- package/dist/__tests__/codegen-drift.test.js.map +1 -1
- package/dist/__tests__/conversation/modelThresholdsParity.test.js +14 -19
- package/dist/__tests__/conversation/modelThresholdsParity.test.js.map +1 -1
- package/dist/__tests__/economy.frontierInference.test.d.ts +2 -0
- package/dist/__tests__/economy.frontierInference.test.d.ts.map +1 -0
- package/dist/__tests__/economy.frontierInference.test.js +61 -0
- package/dist/__tests__/economy.frontierInference.test.js.map +1 -0
- package/dist/__tests__/economy.surplusBranch.test.js +2 -66
- package/dist/__tests__/economy.surplusBranch.test.js.map +1 -1
- package/dist/__tests__/helpers/mockRuntime.d.ts.map +1 -1
- package/dist/__tests__/helpers/mockRuntime.js +0 -7
- package/dist/__tests__/helpers/mockRuntime.js.map +1 -1
- package/dist/__tests__/pack.test.js +14 -14
- package/dist/__tests__/packLoader.test.js +4 -4
- package/dist/__tests__/presetLoader.test.js +42 -42
- package/dist/__tests__/sandbox.test.js +24 -24
- package/dist/__tests__/surplusInference.test.js +54 -8
- package/dist/__tests__/surplusInference.test.js.map +1 -1
- package/dist/actionCatalog.d.ts.map +1 -1
- package/dist/actionCatalog.generated.d.ts +1 -1
- package/dist/actionCatalog.generated.d.ts.map +1 -1
- package/dist/actionCatalog.generated.js +27 -152
- package/dist/actionCatalog.generated.js.map +1 -1
- package/dist/actionCatalog.js +10 -0
- package/dist/actionCatalog.js.map +1 -1
- package/dist/api-marketplace.d.ts +0 -146
- package/dist/api-marketplace.d.ts.map +1 -1
- package/dist/api-marketplace.js +0 -218
- package/dist/api-marketplace.js.map +1 -1
- package/dist/autonomous.d.ts +9 -16
- package/dist/autonomous.d.ts.map +1 -1
- package/dist/autonomous.js +59 -276
- package/dist/autonomous.js.map +1 -1
- package/dist/bounties.d.ts +0 -8
- package/dist/bounties.d.ts.map +1 -1
- package/dist/bounties.js +0 -2
- package/dist/bounties.js.map +1 -1
- package/dist/contentSafety.d.ts +1 -1
- package/dist/contentSafety.d.ts.map +1 -1
- package/dist/contentSafety.js +2 -6
- 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/economy.d.ts +15 -10
- package/dist/economy.d.ts.map +1 -1
- package/dist/economy.js +29 -16
- package/dist/economy.js.map +1 -1
- package/dist/frontierPass.d.ts +30 -0
- package/dist/frontierPass.d.ts.map +1 -0
- package/dist/frontierPass.js +42 -0
- package/dist/frontierPass.js.map +1 -0
- package/dist/identity.d.ts +0 -51
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +0 -50
- package/dist/identity.js.map +1 -1
- package/dist/index.d.ts +3 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -15
- package/dist/index.js.map +1 -1
- package/dist/inference/surplusInference.d.ts +29 -1
- package/dist/inference/surplusInference.d.ts.map +1 -1
- package/dist/inference/surplusInference.js +132 -15
- package/dist/inference/surplusInference.js.map +1 -1
- package/dist/signalActionMap.d.ts.map +1 -1
- package/dist/signalActionMap.js +13 -15
- package/dist/signalActionMap.js.map +1 -1
- package/dist/swarms.d.ts +0 -13
- package/dist/swarms.d.ts.map +1 -1
- package/dist/swarms.js +0 -4
- 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 +1 -22
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/__tests__/autonomous.goalBootstrap.test.d.ts +0 -2
- package/dist/__tests__/autonomous.goalBootstrap.test.d.ts.map +0 -1
- package/dist/__tests__/autonomous.goalBootstrap.test.js +0 -148
- package/dist/__tests__/autonomous.goalBootstrap.test.js.map +0 -1
- package/dist/__tests__/autonomous.miningTrack.test.d.ts +0 -2
- package/dist/__tests__/autonomous.miningTrack.test.d.ts.map +0 -1
- package/dist/__tests__/autonomous.miningTrack.test.js +0 -38
- package/dist/__tests__/autonomous.miningTrack.test.js.map +0 -1
- package/dist/__tests__/autonomous.payApi.test.d.ts +0 -2
- package/dist/__tests__/autonomous.payApi.test.d.ts.map +0 -1
- package/dist/__tests__/autonomous.payApi.test.js +0 -73
- package/dist/__tests__/autonomous.payApi.test.js.map +0 -1
- package/dist/__tests__/autonomous.workspaceOpportunity.test.d.ts +0 -2
- package/dist/__tests__/autonomous.workspaceOpportunity.test.d.ts.map +0 -1
- package/dist/__tests__/autonomous.workspaceOpportunity.test.js +0 -212
- package/dist/__tests__/autonomous.workspaceOpportunity.test.js.map +0 -1
- package/dist/__tests__/goalLoop.test.d.ts +0 -2
- package/dist/__tests__/goalLoop.test.d.ts.map +0 -1
- package/dist/__tests__/goalLoop.test.js +0 -358
- package/dist/__tests__/goalLoop.test.js.map +0 -1
- package/dist/__tests__/loadProfile.test.d.ts +0 -8
- package/dist/__tests__/loadProfile.test.d.ts.map +0 -1
- package/dist/__tests__/loadProfile.test.js +0 -134
- package/dist/__tests__/loadProfile.test.js.map +0 -1
- package/dist/__tests__/mining.test.d.ts +0 -2
- package/dist/__tests__/mining.test.d.ts.map +0 -1
- package/dist/__tests__/mining.test.js +0 -306
- package/dist/__tests__/mining.test.js.map +0 -1
- package/dist/__tests__/signalActionMap.test.d.ts +0 -17
- package/dist/__tests__/signalActionMap.test.d.ts.map +0 -1
- package/dist/__tests__/signalActionMap.test.js +0 -165
- package/dist/__tests__/signalActionMap.test.js.map +0 -1
- package/dist/__tests__/usdcBudget.test.d.ts +0 -2
- package/dist/__tests__/usdcBudget.test.d.ts.map +0 -1
- package/dist/__tests__/usdcBudget.test.js +0 -128
- package/dist/__tests__/usdcBudget.test.js.map +0 -1
- package/dist/__tests__/x402.test.d.ts +0 -2
- package/dist/__tests__/x402.test.d.ts.map +0 -1
- package/dist/__tests__/x402.test.js +0 -117
- package/dist/__tests__/x402.test.js.map +0 -1
- package/dist/goal/goalLoop.d.ts +0 -78
- package/dist/goal/goalLoop.d.ts.map +0 -1
- package/dist/goal/goalLoop.js +0 -388
- package/dist/goal/goalLoop.js.map +0 -1
- package/dist/goal/goalPrompts.d.ts +0 -20
- package/dist/goal/goalPrompts.d.ts.map +0 -1
- package/dist/goal/goalPrompts.js +0 -54
- package/dist/goal/goalPrompts.js.map +0 -1
- package/dist/goal/types.d.ts +0 -102
- package/dist/goal/types.d.ts.map +0 -1
- package/dist/goal/types.js +0 -7
- package/dist/goal/types.js.map +0 -1
- package/dist/loadProfile.d.ts +0 -100
- package/dist/loadProfile.d.ts.map +0 -1
- package/dist/loadProfile.js +0 -221
- package/dist/loadProfile.js.map +0 -1
- package/dist/usdcBudget.d.ts +0 -90
- package/dist/usdcBudget.d.ts.map +0 -1
- package/dist/usdcBudget.js +0 -155
- package/dist/usdcBudget.js.map +0 -1
- package/dist/x402.d.ts +0 -69
- package/dist/x402.d.ts.map +0 -1
- package/dist/x402.js +0 -139
- package/dist/x402.js.map +0 -1
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for the UsdcBudget primitive (the hard-stop x402 spend cap).
|
|
3
|
-
*/
|
|
4
|
-
import { describe, it, expect } from "vitest";
|
|
5
|
-
import { UsdcBudget, createUsdcBudget, parseUsdcToBaseUnits, formatUsdc, DEFAULT_DAILY_USDC_CAP_BASE_UNITS, } from "../usdcBudget.js";
|
|
6
|
-
const USDC = 1000000n; // 1 USDC in base units
|
|
7
|
-
describe("parseUsdcToBaseUnits", () => {
|
|
8
|
-
it("parses whole and fractional USDC", () => {
|
|
9
|
-
expect(parseUsdcToBaseUnits("10")).toBe(10n * USDC);
|
|
10
|
-
expect(parseUsdcToBaseUnits("0.5")).toBe(500000n);
|
|
11
|
-
expect(parseUsdcToBaseUnits("1.234567")).toBe(1234567n);
|
|
12
|
-
});
|
|
13
|
-
it("truncates beyond 6 decimals", () => {
|
|
14
|
-
expect(parseUsdcToBaseUnits("1.2345678")).toBe(1234567n);
|
|
15
|
-
});
|
|
16
|
-
it("returns 0n (unlimited) for empty / invalid input", () => {
|
|
17
|
-
expect(parseUsdcToBaseUnits(undefined)).toBe(0n);
|
|
18
|
-
expect(parseUsdcToBaseUnits("")).toBe(0n);
|
|
19
|
-
expect(parseUsdcToBaseUnits("abc")).toBe(0n);
|
|
20
|
-
expect(parseUsdcToBaseUnits("-5")).toBe(0n);
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
describe("formatUsdc", () => {
|
|
24
|
-
it("formats base units to a $ string", () => {
|
|
25
|
-
expect(formatUsdc(10n * USDC)).toBe("$10");
|
|
26
|
-
expect(formatUsdc(500000n)).toBe("$0.5");
|
|
27
|
-
expect(formatUsdc(1230000n)).toBe("$1.23");
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
describe("UsdcBudget", () => {
|
|
31
|
-
it("unlimited (cap 0n) never blocks or exhausts", () => {
|
|
32
|
-
const b = new UsdcBudget({ dailyCapBaseUnits: 0n });
|
|
33
|
-
expect(b.check(1000n * USDC).allowed).toBe(true);
|
|
34
|
-
expect(b.maxForNextCall()).toBeUndefined();
|
|
35
|
-
b.record(1000n * USDC);
|
|
36
|
-
expect(b.isExhausted()).toBe(false);
|
|
37
|
-
expect(b.remaining()).toBe(-1n);
|
|
38
|
-
});
|
|
39
|
-
it("enforces the daily cap with zero overshoot via maxForNextCall", () => {
|
|
40
|
-
const b = new UsdcBudget({ dailyCapBaseUnits: 2n * USDC });
|
|
41
|
-
expect(b.maxForNextCall()).toBe(2n * USDC);
|
|
42
|
-
// first $1.50 call fits
|
|
43
|
-
expect(b.check(1500000n).allowed).toBe(true);
|
|
44
|
-
b.record(1500000n);
|
|
45
|
-
// remaining is $0.50 → a second $1.50 call is refused by the ceiling
|
|
46
|
-
expect(b.maxForNextCall()).toBe(500000n);
|
|
47
|
-
expect(b.check(1500000n).allowed).toBe(false);
|
|
48
|
-
expect(b.remaining()).toBe(500000n);
|
|
49
|
-
});
|
|
50
|
-
it("isExhausted flips once the cap is fully consumed", () => {
|
|
51
|
-
const b = new UsdcBudget({ dailyCapBaseUnits: 1n * USDC });
|
|
52
|
-
expect(b.isExhausted()).toBe(false);
|
|
53
|
-
b.record(1n * USDC);
|
|
54
|
-
expect(b.isExhausted()).toBe(true);
|
|
55
|
-
expect(b.maxForNextCall()).toBe(0n);
|
|
56
|
-
});
|
|
57
|
-
it("honors a per-call ceiling independent of the daily cap", () => {
|
|
58
|
-
const b = new UsdcBudget({ dailyCapBaseUnits: 100n * USDC, perCallCapBaseUnits: 2n * USDC });
|
|
59
|
-
expect(b.check(3n * USDC).allowed).toBe(false); // exceeds per-call ceiling
|
|
60
|
-
expect(b.check(2n * USDC).allowed).toBe(true);
|
|
61
|
-
// maxForNextCall = min(perCall 2, remaining 100) = 2
|
|
62
|
-
expect(b.maxForNextCall()).toBe(2n * USDC);
|
|
63
|
-
});
|
|
64
|
-
it("rolls the window after the period elapses", () => {
|
|
65
|
-
let t = 1_000_000;
|
|
66
|
-
const b = new UsdcBudget({ dailyCapBaseUnits: 1n * USDC, windowMs: 1000, now: () => t });
|
|
67
|
-
b.record(1n * USDC);
|
|
68
|
-
expect(b.isExhausted()).toBe(true);
|
|
69
|
-
t += 1001; // advance past the window
|
|
70
|
-
expect(b.isExhausted()).toBe(false);
|
|
71
|
-
expect(b.spent).toBe(0n);
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
describe("createUsdcBudget", () => {
|
|
75
|
-
it("defaults to the conservative daily cap when nothing is configured", () => {
|
|
76
|
-
const prevDaily = process.env.X402_DAILY_USDC_CAP;
|
|
77
|
-
const prevPer = process.env.X402_PER_CALL_USDC_CAP;
|
|
78
|
-
delete process.env.X402_DAILY_USDC_CAP;
|
|
79
|
-
delete process.env.X402_PER_CALL_USDC_CAP;
|
|
80
|
-
try {
|
|
81
|
-
const b = createUsdcBudget();
|
|
82
|
-
expect(b.dailyCapBaseUnits).toBe(DEFAULT_DAILY_USDC_CAP_BASE_UNITS);
|
|
83
|
-
expect(b.perCallCapBaseUnits).toBe(0n);
|
|
84
|
-
}
|
|
85
|
-
finally {
|
|
86
|
-
if (prevDaily !== undefined)
|
|
87
|
-
process.env.X402_DAILY_USDC_CAP = prevDaily;
|
|
88
|
-
if (prevPer !== undefined)
|
|
89
|
-
process.env.X402_PER_CALL_USDC_CAP = prevPer;
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
it("reads caps from env (USDC display units)", () => {
|
|
93
|
-
const prevDaily = process.env.X402_DAILY_USDC_CAP;
|
|
94
|
-
const prevPer = process.env.X402_PER_CALL_USDC_CAP;
|
|
95
|
-
process.env.X402_DAILY_USDC_CAP = "25";
|
|
96
|
-
process.env.X402_PER_CALL_USDC_CAP = "0.5";
|
|
97
|
-
try {
|
|
98
|
-
const b = createUsdcBudget();
|
|
99
|
-
expect(b.dailyCapBaseUnits).toBe(25n * USDC);
|
|
100
|
-
expect(b.perCallCapBaseUnits).toBe(500000n);
|
|
101
|
-
}
|
|
102
|
-
finally {
|
|
103
|
-
if (prevDaily !== undefined)
|
|
104
|
-
process.env.X402_DAILY_USDC_CAP = prevDaily;
|
|
105
|
-
else
|
|
106
|
-
delete process.env.X402_DAILY_USDC_CAP;
|
|
107
|
-
if (prevPer !== undefined)
|
|
108
|
-
process.env.X402_PER_CALL_USDC_CAP = prevPer;
|
|
109
|
-
else
|
|
110
|
-
delete process.env.X402_PER_CALL_USDC_CAP;
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
it("explicit options win over env", () => {
|
|
114
|
-
const prev = process.env.X402_DAILY_USDC_CAP;
|
|
115
|
-
process.env.X402_DAILY_USDC_CAP = "25";
|
|
116
|
-
try {
|
|
117
|
-
const b = createUsdcBudget({ dailyCapBaseUnits: 0n });
|
|
118
|
-
expect(b.dailyCapBaseUnits).toBe(0n); // explicit unlimited beats env
|
|
119
|
-
}
|
|
120
|
-
finally {
|
|
121
|
-
if (prev !== undefined)
|
|
122
|
-
process.env.X402_DAILY_USDC_CAP = prev;
|
|
123
|
-
else
|
|
124
|
-
delete process.env.X402_DAILY_USDC_CAP;
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
//# sourceMappingURL=usdcBudget.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"usdcBudget.test.js","sourceRoot":"","sources":["../../src/__tests__/usdcBudget.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"x402.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/x402.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, afterEach } from "vitest";
|
|
2
|
-
import { ethers } from "ethers";
|
|
3
|
-
import { X402Manager } from "../x402.js";
|
|
4
|
-
const SPLITTER = "0x5555555555555555555555555555555555555555";
|
|
5
|
-
const USDC = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
|
|
6
|
-
const GATEWAY = "https://gw.example.com";
|
|
7
|
-
const RECEIVE_TYPES = {
|
|
8
|
-
ReceiveWithAuthorization: [
|
|
9
|
-
{ name: "from", type: "address" },
|
|
10
|
-
{ name: "to", type: "address" },
|
|
11
|
-
{ name: "value", type: "uint256" },
|
|
12
|
-
{ name: "validAfter", type: "uint256" },
|
|
13
|
-
{ name: "validBefore", type: "uint256" },
|
|
14
|
-
{ name: "nonce", type: "bytes32" },
|
|
15
|
-
],
|
|
16
|
-
};
|
|
17
|
-
function challenge() {
|
|
18
|
-
return {
|
|
19
|
-
x402Version: 2,
|
|
20
|
-
accepts: [
|
|
21
|
-
{
|
|
22
|
-
scheme: "exact",
|
|
23
|
-
network: "eip155:8453",
|
|
24
|
-
asset: USDC,
|
|
25
|
-
payTo: SPLITTER,
|
|
26
|
-
maxAmountRequired: "1000000",
|
|
27
|
-
maxTimeoutSeconds: 600,
|
|
28
|
-
extra: { listingId: "42" },
|
|
29
|
-
},
|
|
30
|
-
],
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
function res(status, body) {
|
|
34
|
-
return new Response(typeof body === "string" ? body : JSON.stringify(body), {
|
|
35
|
-
status,
|
|
36
|
-
headers: { "content-type": "application/json" },
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
describe("X402Manager.payAndCall", () => {
|
|
40
|
-
afterEach(() => vi.unstubAllGlobals());
|
|
41
|
-
it("probes, signs EIP-3009, and re-sends a gateway-recoverable authorization", async () => {
|
|
42
|
-
const wallet = ethers.Wallet.createRandom();
|
|
43
|
-
const fetchFn = vi
|
|
44
|
-
.fn()
|
|
45
|
-
.mockResolvedValueOnce(res(402, challenge()))
|
|
46
|
-
.mockResolvedValueOnce(res(200, { ok: "upstream" }));
|
|
47
|
-
vi.stubGlobal("fetch", fetchFn);
|
|
48
|
-
const mgr = new X402Manager(GATEWAY);
|
|
49
|
-
const result = await mgr.payAndCall({ listingId: 42, path: "chat", method: "POST", body: { q: "hi" } }, wallet);
|
|
50
|
-
expect(result.paid).toBe(true);
|
|
51
|
-
expect(result.status).toBe(200);
|
|
52
|
-
expect(result.body).toEqual({ ok: "upstream" });
|
|
53
|
-
expect(fetchFn).toHaveBeenCalledTimes(2);
|
|
54
|
-
expect(fetchFn.mock.calls[0][0]).toBe(`${GATEWAY}/v1/api-x402/42/chat`);
|
|
55
|
-
// The re-send carries the encoded payment header.
|
|
56
|
-
const init2 = fetchFn.mock.calls[1][1];
|
|
57
|
-
const header = init2.headers["PAYMENT-SIGNATURE"];
|
|
58
|
-
expect(header).toBeTruthy();
|
|
59
|
-
// Decode it and confirm the EIP-3009 signature recovers to the buyer — i.e.
|
|
60
|
-
// exactly what the gateway facilitator's verify() will check.
|
|
61
|
-
const decoded = JSON.parse(Buffer.from(header, "base64").toString("utf8"));
|
|
62
|
-
const auth = decoded.payload.authorization;
|
|
63
|
-
expect(auth.from).toBe(wallet.address);
|
|
64
|
-
expect(auth.to).toBe(SPLITTER);
|
|
65
|
-
expect(auth.value).toBe("1000000");
|
|
66
|
-
const recovered = ethers.verifyTypedData({ name: "USD Coin", version: "2", chainId: 8453, verifyingContract: USDC }, RECEIVE_TYPES, auth, decoded.payload.signature);
|
|
67
|
-
expect(recovered).toBe(wallet.address);
|
|
68
|
-
});
|
|
69
|
-
it("returns immediately (no signing) when the gateway does not answer 402", async () => {
|
|
70
|
-
const wallet = ethers.Wallet.createRandom();
|
|
71
|
-
const fetchFn = vi.fn().mockResolvedValueOnce(res(404, { error: "listing not available for x402" }));
|
|
72
|
-
vi.stubGlobal("fetch", fetchFn);
|
|
73
|
-
const result = await new X402Manager(GATEWAY).payAndCall({ listingId: 9, path: "x" }, wallet);
|
|
74
|
-
expect(result.paid).toBe(false);
|
|
75
|
-
expect(result.status).toBe(404);
|
|
76
|
-
expect(fetchFn).toHaveBeenCalledTimes(1);
|
|
77
|
-
});
|
|
78
|
-
it("throws when the 402 offers no supported 'exact' scheme", async () => {
|
|
79
|
-
const wallet = ethers.Wallet.createRandom();
|
|
80
|
-
const fetchFn = vi.fn().mockResolvedValueOnce(res(402, { x402Version: 2, accepts: [{ scheme: "weird" }] }));
|
|
81
|
-
vi.stubGlobal("fetch", fetchFn);
|
|
82
|
-
await expect(new X402Manager(GATEWAY).payAndCall({ listingId: 1, path: "x" }, wallet)).rejects.toThrow(/exact/);
|
|
83
|
-
});
|
|
84
|
-
it("aborts BEFORE signing when the quote exceeds maxAmountBaseUnits (spend cap)", async () => {
|
|
85
|
-
const wallet = ethers.Wallet.createRandom();
|
|
86
|
-
const fetchFn = vi.fn().mockResolvedValueOnce(res(402, challenge())); // quote = 1_000_000
|
|
87
|
-
vi.stubGlobal("fetch", fetchFn);
|
|
88
|
-
await expect(new X402Manager(GATEWAY).payAndCall({ listingId: 42, path: "x", maxAmountBaseUnits: 500000n }, // ceiling below quote
|
|
89
|
-
wallet)).rejects.toThrow(/spend blocked/i);
|
|
90
|
-
// Only the probe ran — no payment was signed or submitted.
|
|
91
|
-
expect(fetchFn).toHaveBeenCalledTimes(1);
|
|
92
|
-
});
|
|
93
|
-
it("returns amountPaidBaseUnits on a paid call within the ceiling", async () => {
|
|
94
|
-
const wallet = ethers.Wallet.createRandom();
|
|
95
|
-
const fetchFn = vi.fn().mockResolvedValueOnce(res(402, challenge())).mockResolvedValueOnce(res(200, {}));
|
|
96
|
-
vi.stubGlobal("fetch", fetchFn);
|
|
97
|
-
const result = await new X402Manager(GATEWAY).payAndCall({ listingId: 42, path: "x", maxAmountBaseUnits: 1000000n }, // == quote, allowed
|
|
98
|
-
wallet);
|
|
99
|
-
expect(result.paid).toBe(true);
|
|
100
|
-
expect(result.amountPaidBaseUnits).toBe("1000000");
|
|
101
|
-
expect(fetchFn).toHaveBeenCalledTimes(2);
|
|
102
|
-
});
|
|
103
|
-
it("derives chainId from the 402 network and honors an override", async () => {
|
|
104
|
-
const wallet = ethers.Wallet.createRandom();
|
|
105
|
-
const ch = challenge();
|
|
106
|
-
ch.accepts[0].network = "base-sepolia";
|
|
107
|
-
const fetchFn = vi.fn().mockResolvedValueOnce(res(402, ch)).mockResolvedValueOnce(res(200, {}));
|
|
108
|
-
vi.stubGlobal("fetch", fetchFn);
|
|
109
|
-
await new X402Manager(GATEWAY).payAndCall({ listingId: 42, path: "x" }, wallet);
|
|
110
|
-
const header = fetchFn.mock.calls[1][1].headers;
|
|
111
|
-
const decoded = JSON.parse(Buffer.from(header["PAYMENT-SIGNATURE"], "base64").toString("utf8"));
|
|
112
|
-
// Signature recovers only under chainId 84532 (base-sepolia).
|
|
113
|
-
const recovered = ethers.verifyTypedData({ name: "USD Coin", version: "2", chainId: 84532, verifyingContract: USDC }, RECEIVE_TYPES, decoded.payload.authorization, decoded.payload.signature);
|
|
114
|
-
expect(recovered).toBe(wallet.address);
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
//# sourceMappingURL=x402.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"x402.test.js","sourceRoot":"","sources":["../../src/__tests__/x402.test.ts"],"names":[],"mappings":"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"}
|
package/dist/goal/goalLoop.d.ts
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GoalLoop — the L3 step-by-step execution engine for goal-driven agents.
|
|
3
|
-
*
|
|
4
|
-
* Invoked by `AutonomousAgent.bootstrapGoal()` when an agent was forged
|
|
5
|
-
* with `initial_goal` set (typically via an L1 swarm suggestion).
|
|
6
|
-
*
|
|
7
|
-
* The loop:
|
|
8
|
-
* 1. Asks the LLM "what's the next step?" given the goal + recent history
|
|
9
|
-
* 2. Parses a JSON decision from the response
|
|
10
|
-
* 3. Executes or records the decision
|
|
11
|
-
* 4. Checks termination conditions (complete, budget, stuck, capability gap)
|
|
12
|
-
*
|
|
13
|
-
* Design choices (see ROADMAP_orchestrator-swarm-autodeploy.md §3):
|
|
14
|
-
* - Atomic goals, no project decomposition (v1 simplification)
|
|
15
|
-
* - Budget is soft — the real gate is owner NOOK balance, not the goal cap
|
|
16
|
-
* - 3 reformulations of the same step → blocked_stuck
|
|
17
|
-
* - 3 consecutive no-ops → treat as complete (the agent has nothing else to do)
|
|
18
|
-
*
|
|
19
|
-
* @module goal/goalLoop
|
|
20
|
-
*/
|
|
21
|
-
import type { GoalAction, GoalResult, GoalLoopOptions } from "./types.js";
|
|
22
|
-
export declare class GoalLoop {
|
|
23
|
-
private readonly runtime;
|
|
24
|
-
private readonly goal;
|
|
25
|
-
private readonly budgetNook;
|
|
26
|
-
private readonly maxSteps;
|
|
27
|
-
private readonly maxNoops;
|
|
28
|
-
private readonly maxReformulations;
|
|
29
|
-
private readonly verbose;
|
|
30
|
-
private readonly inferenceCall;
|
|
31
|
-
private readonly parentSwarmId;
|
|
32
|
-
private recentSteps;
|
|
33
|
-
private spentNook;
|
|
34
|
-
private stepsExecuted;
|
|
35
|
-
private toolSignatures;
|
|
36
|
-
private doomLoopTriggers;
|
|
37
|
-
private doomLoopNote;
|
|
38
|
-
constructor(opts: GoalLoopOptions);
|
|
39
|
-
/**
|
|
40
|
-
* Run the loop to completion. Returns exactly one of four outcomes.
|
|
41
|
-
* Never throws for normal termination — only throws for unrecoverable
|
|
42
|
-
* infrastructure errors (e.g. runtime not connected).
|
|
43
|
-
*/
|
|
44
|
-
run(): Promise<GoalResult>;
|
|
45
|
-
private askLLMForNextAction;
|
|
46
|
-
/**
|
|
47
|
-
* Default inference caller — uses the runtime's inference API if available,
|
|
48
|
-
* otherwise returns a noop response. Consumers with custom inference wiring
|
|
49
|
-
* should pass `inferenceCall` in GoalLoopOptions.
|
|
50
|
-
*/
|
|
51
|
-
private defaultInferenceCall;
|
|
52
|
-
/**
|
|
53
|
-
* Execute one action via the runtime's action dispatch pipeline.
|
|
54
|
-
*
|
|
55
|
-
* All actions go through `POST /v1/actions/execute` which handles both
|
|
56
|
-
* off-chain (direct) and on-chain (sign-required) action types. This
|
|
57
|
-
* preserves the CLAUDE.md Rule 5 invariant that all on-chain state
|
|
58
|
-
* changes go through prepare → sign → relay.
|
|
59
|
-
*/
|
|
60
|
-
private executeAction;
|
|
61
|
-
private recordStepRemotely;
|
|
62
|
-
/**
|
|
63
|
-
* Treat the current state as a completed goal. Used when the LLM stalls
|
|
64
|
-
* or the max step count is exceeded. Produces a summary artifact from
|
|
65
|
-
* the recent step history so the user has something to review.
|
|
66
|
-
*/
|
|
67
|
-
private finalizeFallback;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Parse a goal action from an LLM response. Tries to extract the first
|
|
71
|
-
* `{...}` JSON block from the content and coerce it into a GoalAction.
|
|
72
|
-
*
|
|
73
|
-
* Exported for unit testing.
|
|
74
|
-
*/
|
|
75
|
-
export declare function parseGoalAction(content: string): (GoalAction & {
|
|
76
|
-
description: string;
|
|
77
|
-
}) | null;
|
|
78
|
-
//# sourceMappingURL=goalLoop.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"goalLoop.d.ts","sourceRoot":"","sources":["../../src/goal/goalLoop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,eAAe,EAEhB,MAAM,YAAY,CAAC;AAqBpB,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgD;IAC9E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAE9C,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,YAAY,CAAuB;gBAE/B,IAAI,EAAE,eAAe;IAYjC;;;;OAIG;IACG,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;YAyIlB,mBAAmB;IA4BjC;;;;OAIG;YACW,oBAAoB;IA6BlC;;;;;;;OAOG;YACW,aAAa;YAyDb,kBAAkB;IAuBhC;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;CA6BzB;AAMD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,UAAU,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,CAgD9F"}
|