@rubicon-caliga/cli 0.1.0 → 0.1.2
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/circle.d.ts +48 -0
- package/dist/circle.d.ts.map +1 -0
- package/dist/circle.js +198 -0
- package/dist/circle.js.map +1 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +9 -1
- package/dist/errors.js.map +1 -1
- package/dist/format.d.ts +5 -0
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js +81 -6
- package/dist/format.js.map +1 -1
- package/dist/index.js +236 -39
- package/dist/index.js.map +1 -1
- package/dist/payments.d.ts +1 -0
- package/dist/payments.d.ts.map +1 -1
- package/dist/payments.js +3 -1
- package/dist/payments.js.map +1 -1
- package/dist/quickstart.d.ts +30 -0
- package/dist/quickstart.d.ts.map +1 -0
- package/dist/quickstart.js +270 -0
- package/dist/quickstart.js.map +1 -0
- package/dist/quickstart.test.d.ts +2 -0
- package/dist/quickstart.test.d.ts.map +1 -0
- package/dist/quickstart.test.js +229 -0
- package/dist/quickstart.test.js.map +1 -0
- package/package.json +12 -10
- package/src/circle.ts +232 -0
- package/src/errors.ts +16 -1
- package/src/format.ts +87 -6
- package/src/index.ts +248 -37
- package/src/payments.ts +4 -1
- package/src/quickstart.test.ts +264 -0
- package/src/quickstart.ts +330 -0
- package/LICENSE +0 -21
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { parseUsdcToAtomic, settlementNetworkInfo } from "@rubicon-caliga/core";
|
|
2
|
+
import { stringFlag } from "./args.js";
|
|
3
|
+
import { circleAgentWallet, circleAuthStatus, classifyCircleError, circleGatewayBalance, circleGatewayFaucet, circleGuidance, circleVersion, } from "./circle.js";
|
|
4
|
+
import { HOSTED_GATEWAY_URL, writeConfig } from "./config.js";
|
|
5
|
+
import { CliError } from "./errors.js";
|
|
6
|
+
import { articleJson, formatAtomic } from "./format.js";
|
|
7
|
+
import { saveReceipt } from "./receipts.js";
|
|
8
|
+
export async function runDoctor(runtime, deps = {}) {
|
|
9
|
+
const checks = [];
|
|
10
|
+
checks.push({
|
|
11
|
+
name: "cliVersion",
|
|
12
|
+
ok: true,
|
|
13
|
+
status: "ok",
|
|
14
|
+
value: deps.cliVersion ?? "unknown",
|
|
15
|
+
});
|
|
16
|
+
checks.push({
|
|
17
|
+
name: "gatewayConfig",
|
|
18
|
+
ok: Boolean(runtime.config.gatewayUrl || process.env.RUBICON_GATEWAY_URL || runtime.gatewayUrl),
|
|
19
|
+
status: runtime.config.gatewayUrl || process.env.RUBICON_GATEWAY_URL ? "ok" : "warning",
|
|
20
|
+
value: runtime.gatewayUrl,
|
|
21
|
+
guidance: runtime.config.gatewayUrl || process.env.RUBICON_GATEWAY_URL
|
|
22
|
+
? undefined
|
|
23
|
+
: `No gateway config found; using hosted default ${HOSTED_GATEWAY_URL}. Run rubicon config set gateway-url <url> to pin it.`,
|
|
24
|
+
});
|
|
25
|
+
try {
|
|
26
|
+
const fetcher = deps.fetch ?? fetch;
|
|
27
|
+
const response = await fetcher(`${runtime.gatewayUrl}/health`);
|
|
28
|
+
checks.push({
|
|
29
|
+
name: "gatewayReachability",
|
|
30
|
+
ok: response.ok,
|
|
31
|
+
status: response.ok ? "ok" : "error",
|
|
32
|
+
value: { status: response.status },
|
|
33
|
+
guidance: response.ok ? undefined : "Gateway health check failed. Confirm the URL and network access.",
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
checks.push({
|
|
38
|
+
name: "gatewayReachability",
|
|
39
|
+
ok: false,
|
|
40
|
+
status: "error",
|
|
41
|
+
value: errorMessage(error),
|
|
42
|
+
guidance: "Gateway is not reachable from this context. Retry in a network-capable shell or configure a reachable gateway.",
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
await addCircleCheck(checks, "circleCli", () => circleVersion(circleInput(runtime, deps)));
|
|
46
|
+
await addCircleCheck(checks, "circleAuth", () => circleAuthStatus(circleInput(runtime, deps)));
|
|
47
|
+
const chain = runtime.circleChain ?? runtime.config.circleChain ?? "ARC-TESTNET";
|
|
48
|
+
let walletAddress;
|
|
49
|
+
await addCircleCheck(checks, "arcTestnetWallet", async () => {
|
|
50
|
+
const wallet = await circleAgentWallet({
|
|
51
|
+
...circleInput(runtime, deps),
|
|
52
|
+
chain,
|
|
53
|
+
configuredAddress: runtime.config.agentWalletAddress ?? envAddress("CIRCLE_AGENT_WALLET_ADDRESS"),
|
|
54
|
+
});
|
|
55
|
+
walletAddress = wallet.address;
|
|
56
|
+
return wallet.address;
|
|
57
|
+
});
|
|
58
|
+
if (walletAddress) {
|
|
59
|
+
await addCircleCheck(checks, "arcTestnetBalance", async () => circleGatewayBalance({ ...circleInput(runtime, deps), chain, address: walletAddress }));
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
checks.push({
|
|
63
|
+
name: "arcTestnetBalance",
|
|
64
|
+
ok: false,
|
|
65
|
+
status: "warning",
|
|
66
|
+
guidance: "Balance check skipped because no Arc Testnet Agent Wallet was found.",
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
const balance = checks.find((check) => check.name === "arcTestnetBalance")?.value;
|
|
70
|
+
checks.push({
|
|
71
|
+
name: "testnetTokenStatus",
|
|
72
|
+
ok: Boolean(balance?.balanceAtomic && BigInt(balance.balanceAtomic) > 0n),
|
|
73
|
+
status: balance?.balanceAtomic && BigInt(balance.balanceAtomic) > 0n ? "ok" : "warning",
|
|
74
|
+
value: balance?.balanceAtomic ? { balanceAtomic: balance.balanceAtomic, balanceUsdc: formatAtomic(balance.balanceAtomic) } : undefined,
|
|
75
|
+
guidance: balance?.balanceAtomic && BigInt(balance.balanceAtomic) > 0n
|
|
76
|
+
? undefined
|
|
77
|
+
: "Arc Testnet reads can be funded with the Circle testnet faucet / Gateway testnet funding flow. Do not send mainnet funds for testnet articles.",
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
success: checks.every((check) => check.status !== "error"),
|
|
81
|
+
gatewayUrl: runtime.gatewayUrl,
|
|
82
|
+
paymentMode: runtime.paymentMode,
|
|
83
|
+
checks,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export async function runQuickstartRead(runtime, deps = {}) {
|
|
87
|
+
if (runtime.parsed.positionals[1] !== "--first" && !runtime.parsed.flags.first) {
|
|
88
|
+
throw new CliError("MISSING_FIRST", "rubicon quickstart-read currently requires --first.");
|
|
89
|
+
}
|
|
90
|
+
const goal = stringFlag(runtime.parsed.flags, "goal");
|
|
91
|
+
if (!goal)
|
|
92
|
+
throw new CliError("MISSING_GOAL", "rubicon quickstart-read requires --goal.");
|
|
93
|
+
const maxSpendAtomic = parseQuickstartBudget(runtime.parsed);
|
|
94
|
+
const approvedBudgetUsdc = formatAtomic(maxSpendAtomic);
|
|
95
|
+
const wroteGatewayConfig = await ensureGatewayConfig(runtime);
|
|
96
|
+
const repository = await runtime.client.getRepository();
|
|
97
|
+
const article = repository.articles[0];
|
|
98
|
+
if (!article)
|
|
99
|
+
throw new CliError("NO_ARTICLES", "No public articles are available from the configured gateway.");
|
|
100
|
+
const navigation = await runtime.client.getNavigation(article.articleId, goal);
|
|
101
|
+
const sectionId = navigation.navigation.sellerAgent.recommendedSectionId;
|
|
102
|
+
const estimate = estimateRead(article, sectionId, maxSpendAtomic);
|
|
103
|
+
if (!estimate.withinBudget) {
|
|
104
|
+
throw new CliError("DRY_RUN_OVER_BUDGET", `Dry-run estimate is ${formatAtomic(estimate.estimatedMaxCostAtomic)} USDC, which exceeds the approved ${approvedBudgetUsdc} USDC budget.`);
|
|
105
|
+
}
|
|
106
|
+
const networkInfo = settlementNetworkInfo(article.paymentTerms?.network);
|
|
107
|
+
const chain = article.paymentTerms?.circleChain ?? networkInfo.circleChain ?? runtime.circleChain ?? "ARC-TESTNET";
|
|
108
|
+
const environment = article.paymentTerms?.environment ?? networkInfo.environment;
|
|
109
|
+
let circleWalletAddress;
|
|
110
|
+
let balanceAtomic;
|
|
111
|
+
if (runtime.paymentMode === "circle-cli") {
|
|
112
|
+
try {
|
|
113
|
+
await circleAuthStatus(circleInput(runtime, deps));
|
|
114
|
+
const wallet = await circleAgentWallet({
|
|
115
|
+
...circleInput(runtime, deps),
|
|
116
|
+
chain,
|
|
117
|
+
configuredAddress: runtime.config.agentWalletAddress ?? envAddress("CIRCLE_AGENT_WALLET_ADDRESS"),
|
|
118
|
+
});
|
|
119
|
+
circleWalletAddress = wallet.address;
|
|
120
|
+
let balance = await circleGatewayBalance({ ...circleInput(runtime, deps), chain, address: wallet.address });
|
|
121
|
+
balanceAtomic = balance.balanceAtomic;
|
|
122
|
+
if (BigInt(balance.balanceAtomic) < BigInt(estimate.estimatedMaxCostAtomic)) {
|
|
123
|
+
if (environment !== "testnet") {
|
|
124
|
+
throw new CliError("INSUFFICIENT_FUNDS", "Wallet balance is below the dry-run estimate. Refusing to suggest mainnet funding for this article.");
|
|
125
|
+
}
|
|
126
|
+
await circleGatewayFaucet({ ...circleInput(runtime, deps), chain, address: wallet.address });
|
|
127
|
+
balance = await circleGatewayBalance({ ...circleInput(runtime, deps), chain, address: wallet.address });
|
|
128
|
+
balanceAtomic = balance.balanceAtomic;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
if (error instanceof CliError)
|
|
133
|
+
throw error;
|
|
134
|
+
const guidance = circleGuidance(error) ?? circleGuidance(classifyCircleError(error));
|
|
135
|
+
if (guidance)
|
|
136
|
+
throw new CliError(guidance.code.toUpperCase(), `${guidance.message} ${guidance.guidance}`);
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const receipt = await runtime.client.run({
|
|
141
|
+
articleId: article.articleId,
|
|
142
|
+
goal,
|
|
143
|
+
sectionId,
|
|
144
|
+
maxSpendAtomic,
|
|
145
|
+
chunkWords: 32,
|
|
146
|
+
streamMode: "bundled",
|
|
147
|
+
metadata: { quickstart: true, stopAfterSection: true },
|
|
148
|
+
});
|
|
149
|
+
const stored = await saveReceipt(receipt);
|
|
150
|
+
return {
|
|
151
|
+
success: true,
|
|
152
|
+
gatewayUrl: runtime.gatewayUrl,
|
|
153
|
+
gatewayConfigured: wroteGatewayConfig || Boolean(runtime.config.gatewayUrl || process.env.RUBICON_GATEWAY_URL),
|
|
154
|
+
selectedArticle: articleJson(article),
|
|
155
|
+
navigation: navigation.navigation,
|
|
156
|
+
dryRun: {
|
|
157
|
+
...estimate,
|
|
158
|
+
estimatedMaxCostUsdc: formatAtomic(estimate.estimatedMaxCostAtomic),
|
|
159
|
+
},
|
|
160
|
+
wallet: {
|
|
161
|
+
chain,
|
|
162
|
+
environment,
|
|
163
|
+
circleWalletAddress,
|
|
164
|
+
balanceAtomic,
|
|
165
|
+
balanceUsdc: balanceAtomic ? formatAtomic(balanceAtomic) : undefined,
|
|
166
|
+
},
|
|
167
|
+
receiptId: stored.receiptId,
|
|
168
|
+
savedAt: stored.savedAt,
|
|
169
|
+
receipt: finalReceiptJson({
|
|
170
|
+
receipt,
|
|
171
|
+
article,
|
|
172
|
+
receiptId: stored.receiptId,
|
|
173
|
+
goal,
|
|
174
|
+
approvedBudgetUsdc,
|
|
175
|
+
circleWalletAddress,
|
|
176
|
+
}),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
async function ensureGatewayConfig(runtime) {
|
|
180
|
+
if (runtime.config.gatewayUrl || process.env.RUBICON_GATEWAY_URL)
|
|
181
|
+
return false;
|
|
182
|
+
runtime.config.gatewayUrl = runtime.gatewayUrl;
|
|
183
|
+
await writeConfig(runtime.config);
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
export function finalReceiptJson(input) {
|
|
187
|
+
const paymentIds = input.receipt.payments.map((payment) => payment.paymentId).filter(Boolean);
|
|
188
|
+
const buyerWalletAddress = input.receipt.buyerWalletAddress;
|
|
189
|
+
const mismatch = buyerWalletAddress && input.circleWalletAddress && buyerWalletAddress.toLowerCase() !== input.circleWalletAddress.toLowerCase();
|
|
190
|
+
return {
|
|
191
|
+
articleId: input.article.articleId,
|
|
192
|
+
title: input.article.title,
|
|
193
|
+
author: input.article.author,
|
|
194
|
+
sessionId: input.receipt.sessionId,
|
|
195
|
+
receiptId: input.receiptId,
|
|
196
|
+
goal: input.goal,
|
|
197
|
+
approvedBudgetUsdc: input.approvedBudgetUsdc,
|
|
198
|
+
amountPaidAtomic: input.receipt.amountPaidAtomic,
|
|
199
|
+
amountPaidUsdc: formatAtomic(input.receipt.amountPaidAtomic),
|
|
200
|
+
wordsRead: input.receipt.wordsRead,
|
|
201
|
+
completed: input.receipt.completed,
|
|
202
|
+
stopReason: input.receipt.stopReason,
|
|
203
|
+
paymentIds,
|
|
204
|
+
settlementIds: input.receipt.settlementIds,
|
|
205
|
+
transactionHashes: input.receipt.transactionHashes,
|
|
206
|
+
buyerWalletAddress,
|
|
207
|
+
circleWalletAddress: input.circleWalletAddress,
|
|
208
|
+
walletAddressMismatchExplanation: mismatch
|
|
209
|
+
? "Circle CLI signs with the Agent Wallet, while x402/Gateway receipts can show the Gateway backing EOA that actually authorizes settlement."
|
|
210
|
+
: undefined,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
function estimateRead(article, sectionId, maxSpendAtomic) {
|
|
214
|
+
const section = sectionId ? article.sections.find((candidate) => candidate.sectionId === sectionId) : undefined;
|
|
215
|
+
const estimatedWords = section?.wordCount ?? article.totalWords;
|
|
216
|
+
const estimatedMaxCostAtomic = `${BigInt(article.pricePerWordAtomic) * BigInt(estimatedWords)}`;
|
|
217
|
+
return {
|
|
218
|
+
sectionId,
|
|
219
|
+
estimatedWords,
|
|
220
|
+
estimatedMaxCostAtomic,
|
|
221
|
+
withinBudget: BigInt(maxSpendAtomic) >= BigInt(estimatedMaxCostAtomic),
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
function parseQuickstartBudget(parsed) {
|
|
225
|
+
const maxUsdc = stringFlag(parsed.flags, "max-usdc");
|
|
226
|
+
const maxAtomic = stringFlag(parsed.flags, "max-atomic");
|
|
227
|
+
if (!maxUsdc && !maxAtomic) {
|
|
228
|
+
throw new CliError("MISSING_BUDGET", "rubicon quickstart-read refuses paid reads without explicit --max-usdc or --max-atomic.");
|
|
229
|
+
}
|
|
230
|
+
if (maxUsdc && maxAtomic) {
|
|
231
|
+
throw new CliError("MULTIPLE_BUDGETS", "Use either --max-usdc or --max-atomic, not both.");
|
|
232
|
+
}
|
|
233
|
+
if (maxAtomic) {
|
|
234
|
+
if (!/^\d+$/.test(maxAtomic))
|
|
235
|
+
throw new CliError("INVALID_BUDGET", "--max-atomic must be an integer.");
|
|
236
|
+
return maxAtomic;
|
|
237
|
+
}
|
|
238
|
+
try {
|
|
239
|
+
return `${parseUsdcToAtomic(maxUsdc)}`;
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
throw new CliError("INVALID_BUDGET", "--max-usdc must be a decimal USDC amount.");
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
async function addCircleCheck(checks, name, task) {
|
|
246
|
+
try {
|
|
247
|
+
checks.push({ name, ok: true, status: "ok", value: await task() });
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
const guidance = circleGuidance(error) ?? circleGuidance(classifyCircleError(error));
|
|
251
|
+
checks.push({
|
|
252
|
+
name,
|
|
253
|
+
ok: false,
|
|
254
|
+
status: name === "circleCli" ? "error" : "warning",
|
|
255
|
+
value: errorMessage(error),
|
|
256
|
+
guidance: guidance?.guidance ?? "Check Circle CLI setup and retry.",
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
function circleInput(_runtime, deps) {
|
|
261
|
+
return { command: deps.circleCommand, runner: deps.circleRunner };
|
|
262
|
+
}
|
|
263
|
+
function envAddress(name) {
|
|
264
|
+
const value = process.env[name];
|
|
265
|
+
return value?.startsWith("0x") ? value : undefined;
|
|
266
|
+
}
|
|
267
|
+
function errorMessage(error) {
|
|
268
|
+
return error instanceof Error ? error.message : String(error);
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=quickstart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickstart.js","sourceRoot":"","sources":["../src/quickstart.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickstart.test.d.ts","sourceRoot":"","sources":["../src/quickstart.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { mkdtempSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { test } from "node:test";
|
|
5
|
+
import assert from "node:assert/strict";
|
|
6
|
+
import { parseArgs } from "./args.js";
|
|
7
|
+
import { CliError } from "./errors.js";
|
|
8
|
+
import { finalReceiptJson, runDoctor, runQuickstartRead } from "./quickstart.js";
|
|
9
|
+
test("doctor reports missing gateway config and Circle CLI missing", async () => {
|
|
10
|
+
const runtime = runtimeFor();
|
|
11
|
+
const result = await runDoctor(runtime, {
|
|
12
|
+
cliVersion: "0.1.1",
|
|
13
|
+
fetch: okFetch,
|
|
14
|
+
circleRunner: async () => {
|
|
15
|
+
throw new Error("spawn circle ENOENT");
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
const checks = result.checks;
|
|
19
|
+
assert.equal(checks.find((check) => check.name === "gatewayConfig")?.status, "warning");
|
|
20
|
+
assert.match(checks.find((check) => check.name === "gatewayConfig")?.guidance ?? "", /hosted default/);
|
|
21
|
+
assert.equal(checks.find((check) => check.name === "circleCli")?.status, "error");
|
|
22
|
+
assert.match(checks.find((check) => check.name === "circleCli")?.guidance ?? "", /Install Circle CLI/);
|
|
23
|
+
});
|
|
24
|
+
test("doctor explains Circle CLI not logged in and sandbox network failures", async () => {
|
|
25
|
+
const notLoggedIn = await runDoctor(runtimeFor(), {
|
|
26
|
+
fetch: okFetch,
|
|
27
|
+
circleRunner: async (_command, args) => {
|
|
28
|
+
if (args[0] === "--version")
|
|
29
|
+
return "circle 1.0.0";
|
|
30
|
+
throw new Error("unauthorized: please login");
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
const notLoggedChecks = notLoggedIn.checks;
|
|
34
|
+
assert.match(notLoggedChecks.find((check) => check.name === "circleAuth")?.guidance ?? "", /login/);
|
|
35
|
+
const networkFailure = await runDoctor(runtimeFor(), {
|
|
36
|
+
fetch: (async () => {
|
|
37
|
+
throw new Error("fetch failed");
|
|
38
|
+
}),
|
|
39
|
+
circleRunner: async () => "circle 1.0.0",
|
|
40
|
+
});
|
|
41
|
+
const networkChecks = networkFailure.checks;
|
|
42
|
+
assert.match(networkChecks.find((check) => check.name === "gatewayReachability")?.guidance ?? "", /network-capable/);
|
|
43
|
+
});
|
|
44
|
+
test("quickstart refuses paid reads without explicit budget", async () => {
|
|
45
|
+
await assert.rejects(() => runQuickstartRead(runtimeFor({ argv: ["quickstart-read", "--first", "--goal", "answer"] })), (error) => error instanceof CliError && error.code === "MISSING_BUDGET");
|
|
46
|
+
});
|
|
47
|
+
test("quickstart detects expired OTP request IDs", async () => {
|
|
48
|
+
await assert.rejects(() => runQuickstartRead(runtimeFor(), {
|
|
49
|
+
circleRunner: async (_command, args) => {
|
|
50
|
+
if (args[0] === "auth")
|
|
51
|
+
throw new Error("OTP request id expired");
|
|
52
|
+
return circleOutput(args, "1000000");
|
|
53
|
+
},
|
|
54
|
+
}), (error) => error instanceof CliError && error.code === "OTP_EXPIRED" && /fresh Circle auth OTP/.test(error.message));
|
|
55
|
+
});
|
|
56
|
+
test("quickstart stops when dry-run estimate exceeds budget", async () => {
|
|
57
|
+
await assert.rejects(() => runQuickstartRead(runtimeFor({ article: article({ pricePerWordAtomic: "1000000" }) })), (error) => error instanceof CliError && error.code === "DRY_RUN_OVER_BUDGET");
|
|
58
|
+
});
|
|
59
|
+
test("quickstart uses existing Arc Testnet balance without faucet", async () => {
|
|
60
|
+
const calls = [];
|
|
61
|
+
const result = await runQuickstartRead(runtimeFor(), {
|
|
62
|
+
circleRunner: async (_command, args) => {
|
|
63
|
+
calls.push(args);
|
|
64
|
+
return circleOutput(args, "1000000");
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
assert.equal(result.receipt.amountPaidAtomic, "2");
|
|
68
|
+
assert.equal(calls.some((args) => args[0] === "gateway" && args[1] === "faucet"), false);
|
|
69
|
+
});
|
|
70
|
+
test("quickstart faucet-funds only the testnet path when needed", async () => {
|
|
71
|
+
const calls = [];
|
|
72
|
+
let funded = false;
|
|
73
|
+
const result = await runQuickstartRead(runtimeFor(), {
|
|
74
|
+
circleRunner: async (_command, args) => {
|
|
75
|
+
calls.push(args);
|
|
76
|
+
if (args[0] === "gateway" && args[1] === "faucet") {
|
|
77
|
+
funded = true;
|
|
78
|
+
return JSON.stringify({ ok: true });
|
|
79
|
+
}
|
|
80
|
+
return circleOutput(args, funded ? "1000000" : "0");
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
assert.equal(calls.some((args) => args[0] === "gateway" && args[1] === "faucet"), true);
|
|
84
|
+
assert.equal(result.wallet.balanceAtomic, "1000000");
|
|
85
|
+
});
|
|
86
|
+
test("quickstart refuses to suggest mainnet funding", async () => {
|
|
87
|
+
await assert.rejects(() => runQuickstartRead(runtimeFor({ article: article({ environment: "mainnet", network: "eip155:1", circleChain: "ETH" }) }), {
|
|
88
|
+
circleRunner: async (_command, args) => circleOutput(args, "0"),
|
|
89
|
+
}), (error) => error instanceof CliError && error.code === "INSUFFICIENT_FUNDS" && /Refusing to suggest mainnet funding/.test(error.message));
|
|
90
|
+
});
|
|
91
|
+
test("final receipt schema includes buyer/Circle wallet mismatch explanation", () => {
|
|
92
|
+
const shaped = finalReceiptJson({
|
|
93
|
+
article: article(),
|
|
94
|
+
receipt: receipt(),
|
|
95
|
+
receiptId: "receipt_1",
|
|
96
|
+
goal: "answer",
|
|
97
|
+
approvedBudgetUsdc: "0.01",
|
|
98
|
+
circleWalletAddress: "0x1111111111111111111111111111111111111111",
|
|
99
|
+
});
|
|
100
|
+
assert.deepEqual(Object.keys(shaped), [
|
|
101
|
+
"articleId",
|
|
102
|
+
"title",
|
|
103
|
+
"author",
|
|
104
|
+
"sessionId",
|
|
105
|
+
"receiptId",
|
|
106
|
+
"goal",
|
|
107
|
+
"approvedBudgetUsdc",
|
|
108
|
+
"amountPaidAtomic",
|
|
109
|
+
"amountPaidUsdc",
|
|
110
|
+
"wordsRead",
|
|
111
|
+
"completed",
|
|
112
|
+
"stopReason",
|
|
113
|
+
"paymentIds",
|
|
114
|
+
"settlementIds",
|
|
115
|
+
"transactionHashes",
|
|
116
|
+
"buyerWalletAddress",
|
|
117
|
+
"circleWalletAddress",
|
|
118
|
+
"walletAddressMismatchExplanation",
|
|
119
|
+
]);
|
|
120
|
+
assert.match(String(shaped.walletAddressMismatchExplanation), /Gateway backing EOA/);
|
|
121
|
+
});
|
|
122
|
+
function runtimeFor(input = {}) {
|
|
123
|
+
process.env.HOME = mkdtempSync(join(tmpdir(), "rubicon-cli-test-"));
|
|
124
|
+
const articleFixture = input.article ?? article();
|
|
125
|
+
const client = {
|
|
126
|
+
async getRepository() {
|
|
127
|
+
return { repository: "articles", articles: [articleFixture] };
|
|
128
|
+
},
|
|
129
|
+
async getNavigation() {
|
|
130
|
+
return {
|
|
131
|
+
article: articleFixture,
|
|
132
|
+
navigation: {
|
|
133
|
+
articleId: articleFixture.articleId,
|
|
134
|
+
sections: articleFixture.sections,
|
|
135
|
+
sellerAgent: {
|
|
136
|
+
recommendedSectionId: "intro",
|
|
137
|
+
alternativeSectionIds: [],
|
|
138
|
+
rationale: "Start here.",
|
|
139
|
+
safeHints: [],
|
|
140
|
+
withheld: [],
|
|
141
|
+
},
|
|
142
|
+
stopConditions: [],
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
},
|
|
146
|
+
async run() {
|
|
147
|
+
return receipt();
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
return {
|
|
151
|
+
parsed: parseArgs(input.argv ?? ["quickstart-read", "--first", "--goal", "answer", "--max-usdc", "0.01"]),
|
|
152
|
+
config: {},
|
|
153
|
+
gatewayUrl: "https://rubicon.test",
|
|
154
|
+
paymentMode: "circle-cli",
|
|
155
|
+
circleChain: "ARC-TESTNET",
|
|
156
|
+
client,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
function article(input = {}) {
|
|
160
|
+
return {
|
|
161
|
+
articleId: "article_1",
|
|
162
|
+
creatorId: "creator_1",
|
|
163
|
+
creatorUsername: "creator",
|
|
164
|
+
title: "Rubicon Field Notes",
|
|
165
|
+
author: "Ada",
|
|
166
|
+
state: "live",
|
|
167
|
+
totalWords: 2,
|
|
168
|
+
pricePerWordAtomic: input.pricePerWordAtomic ?? "1",
|
|
169
|
+
maxArticlePriceAtomic: `${BigInt(input.pricePerWordAtomic ?? "1") * 2n}`,
|
|
170
|
+
paymentTerms: {
|
|
171
|
+
asset: "USDC",
|
|
172
|
+
network: input.network ?? "eip155:5042002",
|
|
173
|
+
circleChain: input.circleChain ?? "ARC-TESTNET",
|
|
174
|
+
environment: input.environment ?? "testnet",
|
|
175
|
+
fundingMethod: "Circle testnet faucet.",
|
|
176
|
+
payTo: "0x3333333333333333333333333333333333333333",
|
|
177
|
+
pricePerWordAtomic: input.pricePerWordAtomic ?? "1",
|
|
178
|
+
meteringUnit: "word",
|
|
179
|
+
},
|
|
180
|
+
sections: [{ sectionId: "intro", heading: "Intro", level: 1, wordStart: 0, wordCount: 2 }],
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
function receipt() {
|
|
184
|
+
return {
|
|
185
|
+
sessionId: "session_1",
|
|
186
|
+
articleId: "article_1",
|
|
187
|
+
conversationId: "conversation_1",
|
|
188
|
+
wordsRead: 2,
|
|
189
|
+
amountPaidAtomic: "2",
|
|
190
|
+
payments: [
|
|
191
|
+
{
|
|
192
|
+
paymentId: "payment_1",
|
|
193
|
+
sessionId: "session_1",
|
|
194
|
+
articleId: "article_1",
|
|
195
|
+
sequence: 0,
|
|
196
|
+
meteringUnit: "word",
|
|
197
|
+
amountAtomic: "2",
|
|
198
|
+
currency: "USDC",
|
|
199
|
+
settlementIds: ["settlement_1"],
|
|
200
|
+
transactionHashes: ["0xtx"],
|
|
201
|
+
buyerWalletAddress: "0x2222222222222222222222222222222222222222",
|
|
202
|
+
settledAt: "2026-06-19T12:00:00.000Z",
|
|
203
|
+
},
|
|
204
|
+
],
|
|
205
|
+
transactionHashes: ["0xtx"],
|
|
206
|
+
settlementIds: ["settlement_1"],
|
|
207
|
+
buyerWalletAddress: "0x2222222222222222222222222222222222222222",
|
|
208
|
+
sellerPayTo: "0x3333333333333333333333333333333333333333",
|
|
209
|
+
network: "eip155:5042002",
|
|
210
|
+
text: "hello world",
|
|
211
|
+
completed: true,
|
|
212
|
+
stopReason: "article_completed",
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function circleOutput(args, balanceAtomic) {
|
|
216
|
+
if (args[0] === "--version")
|
|
217
|
+
return "circle 1.0.0";
|
|
218
|
+
if (args[0] === "auth")
|
|
219
|
+
return JSON.stringify({ loggedIn: true });
|
|
220
|
+
if (args[0] === "wallet") {
|
|
221
|
+
return JSON.stringify({ data: { wallets: [{ address: "0x1111111111111111111111111111111111111111" }] } });
|
|
222
|
+
}
|
|
223
|
+
if (args[0] === "gateway" && args[1] === "balance") {
|
|
224
|
+
return JSON.stringify({ data: { balanceAtomic, backingEOA: "0x2222222222222222222222222222222222222222" } });
|
|
225
|
+
}
|
|
226
|
+
return JSON.stringify({ ok: true });
|
|
227
|
+
}
|
|
228
|
+
const okFetch = (async () => new Response("ok", { status: 200 }));
|
|
229
|
+
//# sourceMappingURL=quickstart.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickstart.test.js","sourceRoot":"","sources":["../src/quickstart.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rubicon-caliga/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Terminal-native Rubicon CLI for buyer agents consuming pay-per-word articles.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -27,19 +27,21 @@
|
|
|
27
27
|
"publishConfig": {
|
|
28
28
|
"access": "public"
|
|
29
29
|
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc -p tsconfig.json",
|
|
32
|
+
"dev": "tsx src/index.ts",
|
|
33
|
+
"lint": "tsc -p tsconfig.json --noEmit",
|
|
34
|
+
"test": "node --import tsx --test src/**/*.test.ts",
|
|
35
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
36
|
+
"prepublishOnly": "pnpm run build"
|
|
37
|
+
},
|
|
30
38
|
"dependencies": {
|
|
31
|
-
"@rubicon-caliga/agent-sdk": "
|
|
32
|
-
"@rubicon-caliga/core": "
|
|
39
|
+
"@rubicon-caliga/agent-sdk": "workspace:*",
|
|
40
|
+
"@rubicon-caliga/core": "workspace:*"
|
|
33
41
|
},
|
|
34
42
|
"devDependencies": {
|
|
35
43
|
"@types/node": "^22.10.2",
|
|
36
44
|
"tsx": "^4.19.2",
|
|
37
45
|
"typescript": "^5.7.2"
|
|
38
|
-
},
|
|
39
|
-
"scripts": {
|
|
40
|
-
"build": "tsc -p tsconfig.json",
|
|
41
|
-
"dev": "tsx src/index.ts",
|
|
42
|
-
"lint": "tsc -p tsconfig.json --noEmit",
|
|
43
|
-
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
44
46
|
}
|
|
45
|
-
}
|
|
47
|
+
}
|