@rubicon-caliga/cli 0.1.0

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/index.js ADDED
@@ -0,0 +1,375 @@
1
+ #!/usr/bin/env node
2
+ import { mkdir } from "node:fs/promises";
3
+ import { dirname } from "node:path";
4
+ import { RubiconClient } from "@rubicon-caliga/agent-sdk";
5
+ import { parseUsdcToAtomic } from "@rubicon-caliga/core";
6
+ import { parseArgs, booleanFlag, stringFlag } from "./args.js";
7
+ import { configPath, HOSTED_GATEWAY_URL, readConfig, writeConfig } from "./config.js";
8
+ import { CliError, toCliError } from "./errors.js";
9
+ import { articleJson, formatAtomic, humanArticle, humanNavigation, humanReceipt, printJson, printJsonEvent, } from "./format.js";
10
+ import { selectPaymentEngine } from "./payments.js";
11
+ import { listReceipts, loadReceipt, saveReceipt } from "./receipts.js";
12
+ async function main() {
13
+ const parsed = parseArgs(process.argv.slice(2));
14
+ const json = booleanFlag(parsed.flags, "json");
15
+ try {
16
+ const config = await readConfig();
17
+ const gatewayUrl = stringFlag(parsed.flags, "gateway-url") ??
18
+ process.env.RUBICON_GATEWAY_URL ??
19
+ config.gatewayUrl ??
20
+ HOSTED_GATEWAY_URL;
21
+ const apiKey = stringFlag(parsed.flags, "api-key") ?? process.env.RUBICON_AGENT_API_KEY ?? config.apiKey;
22
+ const payment = selectPaymentEngine({
23
+ requestedMode: stringFlag(parsed.flags, "payment-mode"),
24
+ gatewayUrl,
25
+ config,
26
+ });
27
+ const client = new RubiconClient({
28
+ baseUrl: gatewayUrl,
29
+ authorization: apiKey ? `Bearer ${apiKey}` : undefined,
30
+ paymentEngine: payment.engine,
31
+ });
32
+ await dispatch({ parsed, json, config, gatewayUrl, apiKey, paymentMode: payment.mode, client });
33
+ }
34
+ catch (error) {
35
+ const cliError = toCliError(error);
36
+ if (json) {
37
+ printJson({ success: false, error: { code: cliError.code, message: cliError.message } });
38
+ }
39
+ else {
40
+ process.stderr.write(`Error: ${cliError.message}\n`);
41
+ }
42
+ process.exitCode = cliError.exitCode;
43
+ }
44
+ }
45
+ async function dispatch(runtime) {
46
+ const [command, subcommand, ...rest] = runtime.parsed.positionals;
47
+ if (!command || command === "help" || booleanFlag(runtime.parsed.flags, "help")) {
48
+ showHelp(runtime.json);
49
+ return;
50
+ }
51
+ if (command === "repository") {
52
+ await repository(runtime);
53
+ return;
54
+ }
55
+ if (command === "search") {
56
+ await search(runtime, subcommand);
57
+ return;
58
+ }
59
+ if (command === "article" && subcommand === "show") {
60
+ await articleShow(runtime, rest[0]);
61
+ return;
62
+ }
63
+ if (command === "article" && subcommand === "navigation") {
64
+ await articleNavigation(runtime, rest[0]);
65
+ return;
66
+ }
67
+ if (command === "read") {
68
+ await readArticle(runtime, subcommand);
69
+ return;
70
+ }
71
+ if (command === "receipts" && subcommand === "list") {
72
+ await receiptsList(runtime);
73
+ return;
74
+ }
75
+ if (command === "receipts" && subcommand === "show") {
76
+ await receiptsShow(runtime, rest[0]);
77
+ return;
78
+ }
79
+ if (command === "config" && subcommand === "show") {
80
+ await configShow(runtime);
81
+ return;
82
+ }
83
+ if (command === "config" && subcommand === "set") {
84
+ await configSet(runtime, rest[0], rest[1]);
85
+ return;
86
+ }
87
+ throw new CliError("UNKNOWN_COMMAND", `Unknown command: ${runtime.parsed.positionals.join(" ")}`);
88
+ }
89
+ async function repository(runtime) {
90
+ const response = await runtime.client.getRepository();
91
+ if (runtime.json) {
92
+ printJson({ success: true, repository: response.repository, articles: response.articles.map(articleJson) });
93
+ return;
94
+ }
95
+ if (response.articles.length === 0) {
96
+ process.stdout.write("No public articles found.\n");
97
+ return;
98
+ }
99
+ process.stdout.write(response.articles
100
+ .map((article) => `${article.articleId} | ${article.title} | ${article.author} | ${article.totalWords} words`)
101
+ .join("\n") + "\n");
102
+ }
103
+ async function search(runtime, query) {
104
+ if (!query)
105
+ throw new CliError("MISSING_QUERY", "rubicon search requires a query.");
106
+ const response = await runtime.client.getRepository();
107
+ const matches = response.articles.filter((article) => matchesQuery(article, query));
108
+ if (runtime.json) {
109
+ printJson({ success: true, query, articles: matches.map(articleJson) });
110
+ return;
111
+ }
112
+ if (matches.length === 0) {
113
+ process.stdout.write("No matches.\n");
114
+ return;
115
+ }
116
+ process.stdout.write(matches.map((article) => `${article.articleId} | ${article.title} | ${article.author}`).join("\n") + "\n");
117
+ }
118
+ async function articleShow(runtime, articleId) {
119
+ const article = await findArticle(runtime, articleId);
120
+ if (runtime.json) {
121
+ printJson({ success: true, article: articleJson(article) });
122
+ return;
123
+ }
124
+ process.stdout.write(`${humanArticle(article)}\n`);
125
+ }
126
+ async function articleNavigation(runtime, articleId) {
127
+ if (!articleId)
128
+ throw new CliError("MISSING_ARTICLE_ID", "rubicon article navigation requires an article id.");
129
+ const goal = stringFlag(runtime.parsed.flags, "goal");
130
+ if (!goal)
131
+ throw new CliError("MISSING_GOAL", "rubicon article navigation requires --goal.");
132
+ const response = await runtime.client.getNavigation(articleId, goal);
133
+ if (runtime.json) {
134
+ printJson({ success: true, article: articleJson(response.article), navigation: response.navigation });
135
+ return;
136
+ }
137
+ process.stdout.write(`${humanArticle(response.article)}\n\n${humanNavigation(response.navigation)}\n`);
138
+ }
139
+ async function readArticle(runtime, articleId) {
140
+ if (!articleId)
141
+ throw new CliError("MISSING_ARTICLE_ID", "rubicon read requires an article id.");
142
+ const maxSpendAtomic = parseBudget(runtime.parsed);
143
+ const goal = stringFlag(runtime.parsed.flags, "goal");
144
+ const maxWordsFlag = stringFlag(runtime.parsed.flags, "max-words");
145
+ const maxWords = maxWordsFlag === undefined ? undefined : Number(maxWordsFlag);
146
+ if (maxWords !== undefined && (!Number.isInteger(maxWords) || maxWords < 1)) {
147
+ throw new CliError("INVALID_MAX_WORDS", "--max-words must be a positive integer.");
148
+ }
149
+ if (booleanFlag(runtime.parsed.flags, "dry-run")) {
150
+ await dryRun(runtime, articleId, maxSpendAtomic, goal, maxWords);
151
+ return;
152
+ }
153
+ let finalReceipt = undefined;
154
+ const stream = runtime.client.read({
155
+ articleId,
156
+ goal,
157
+ maxSpendAtomic,
158
+ maxWords,
159
+ });
160
+ for await (const event of stream) {
161
+ if (runtime.json) {
162
+ printJsonEvent("event", { event });
163
+ if (event.type === "article.completed") {
164
+ finalReceipt = event.receipt;
165
+ }
166
+ continue;
167
+ }
168
+ switch (event.type) {
169
+ case "seller.message":
170
+ process.stdout.write(`Seller: ${event.content}\n\n`);
171
+ break;
172
+ case "session.started":
173
+ process.stdout.write(`Session: ${event.session.sessionId}\n\n`);
174
+ break;
175
+ case "article.word":
176
+ process.stdout.write(`${event.word} `);
177
+ break;
178
+ case "article.error":
179
+ process.stderr.write(`\nError: ${event.message}\n`);
180
+ break;
181
+ case "article.completed":
182
+ finalReceipt = event.receipt;
183
+ process.stdout.write(`\n\n${humanReceipt(event.receipt)}\n`);
184
+ break;
185
+ case "article.usage":
186
+ break;
187
+ }
188
+ }
189
+ if (finalReceipt) {
190
+ const stored = await saveReceipt(finalReceipt);
191
+ if (runtime.json) {
192
+ printJson({ type: "receipt.saved", success: true, receiptId: stored.receiptId, savedAt: stored.savedAt, receipt: stored.receipt });
193
+ }
194
+ }
195
+ }
196
+ async function dryRun(runtime, articleId, maxSpendAtomic, goal, maxWords) {
197
+ const article = await findArticle(runtime, articleId);
198
+ if (runtime.json) {
199
+ printJson({
200
+ success: true,
201
+ dryRun: true,
202
+ gatewayUrl: runtime.gatewayUrl,
203
+ paymentMode: runtime.paymentMode,
204
+ budget: {
205
+ maxSpendAtomic,
206
+ maxSpendUsdc: formatAtomic(maxSpendAtomic),
207
+ maxWords,
208
+ },
209
+ goal,
210
+ article: articleJson(article),
211
+ });
212
+ return;
213
+ }
214
+ process.stdout.write([
215
+ "Dry run: no paid read started.",
216
+ `Gateway: ${runtime.gatewayUrl}`,
217
+ `Payment mode: ${runtime.paymentMode}`,
218
+ `Budget: ${formatAtomic(maxSpendAtomic)} USDC (${maxSpendAtomic} atomic)`,
219
+ maxWords ? `Max words: ${maxWords}` : undefined,
220
+ goal ? `Goal: ${goal}` : undefined,
221
+ "",
222
+ humanArticle(article),
223
+ "",
224
+ ]
225
+ .filter((line) => line !== undefined)
226
+ .join("\n"));
227
+ }
228
+ async function receiptsList(runtime) {
229
+ const receipts = await listReceipts();
230
+ if (runtime.json) {
231
+ printJson({ success: true, receipts });
232
+ return;
233
+ }
234
+ if (receipts.length === 0) {
235
+ process.stdout.write("No local receipts found.\n");
236
+ return;
237
+ }
238
+ process.stdout.write(receipts
239
+ .map((stored) => `${stored.receiptId} | ${stored.savedAt} | ${stored.receipt.articleId} | ${formatAtomic(stored.receipt.amountPaidAtomic)} USDC`)
240
+ .join("\n") + "\n");
241
+ }
242
+ async function receiptsShow(runtime, receiptId) {
243
+ if (!receiptId)
244
+ throw new CliError("MISSING_RECEIPT_ID", "rubicon receipts show requires a receipt id.");
245
+ const stored = await loadReceipt(receiptId);
246
+ if (runtime.json) {
247
+ printJson({ success: true, ...stored });
248
+ return;
249
+ }
250
+ process.stdout.write(`Receipt ID: ${stored.receiptId}\nSaved: ${stored.savedAt}\n${humanReceipt(stored.receipt)}\n`);
251
+ }
252
+ async function configShow(runtime) {
253
+ const shown = {
254
+ configPath: configPath(),
255
+ gatewayUrl: runtime.config.gatewayUrl,
256
+ apiKey: runtime.config.apiKey ? "set" : undefined,
257
+ paymentMode: runtime.config.paymentMode,
258
+ circleChain: runtime.config.circleChain,
259
+ agentWalletAddress: runtime.config.agentWalletAddress,
260
+ effective: {
261
+ gatewayUrl: runtime.gatewayUrl,
262
+ apiKey: runtime.apiKey ? "set" : undefined,
263
+ paymentMode: runtime.paymentMode,
264
+ },
265
+ };
266
+ if (runtime.json) {
267
+ printJson({ success: true, config: shown });
268
+ return;
269
+ }
270
+ process.stdout.write(`${JSON.stringify(shown, null, 2)}\n`);
271
+ }
272
+ async function configSet(runtime, key, value) {
273
+ if (!key || !value)
274
+ throw new CliError("MISSING_CONFIG_VALUE", "rubicon config set requires a key and value.");
275
+ const next = { ...runtime.config };
276
+ switch (key) {
277
+ case "gateway-url":
278
+ next.gatewayUrl = value;
279
+ break;
280
+ case "api-key":
281
+ next.apiKey = value;
282
+ break;
283
+ case "payment-mode":
284
+ if (value !== "static" && value !== "circle-cli") {
285
+ throw new CliError("INVALID_PAYMENT_MODE", "payment-mode must be static or circle-cli.");
286
+ }
287
+ next.paymentMode = value;
288
+ break;
289
+ case "circle-chain":
290
+ next.circleChain = value;
291
+ break;
292
+ case "agent-wallet-address":
293
+ if (!value.startsWith("0x"))
294
+ throw new CliError("INVALID_ADDRESS", "agent-wallet-address must start with 0x.");
295
+ next.agentWalletAddress = value;
296
+ break;
297
+ default:
298
+ throw new CliError("UNKNOWN_CONFIG_KEY", `Unknown config key: ${key}`);
299
+ }
300
+ await mkdir(dirname(configPath()), { recursive: true, mode: 0o700 });
301
+ await writeConfig(next);
302
+ if (runtime.json) {
303
+ printJson({ success: true, configPath: configPath(), key });
304
+ return;
305
+ }
306
+ process.stdout.write(`Updated ${key} in ${configPath()}\n`);
307
+ }
308
+ async function findArticle(runtime, articleId) {
309
+ if (!articleId)
310
+ throw new CliError("MISSING_ARTICLE_ID", "Article id is required.");
311
+ const repository = await runtime.client.getRepository();
312
+ const article = repository.articles.find((candidate) => candidate.articleId === articleId);
313
+ if (!article)
314
+ throw new CliError("ARTICLE_NOT_FOUND", `Article not found: ${articleId}`);
315
+ return article;
316
+ }
317
+ function parseBudget(parsed) {
318
+ const maxUsdc = stringFlag(parsed.flags, "max-usdc");
319
+ const maxAtomic = stringFlag(parsed.flags, "max-atomic");
320
+ if (!maxUsdc && !maxAtomic) {
321
+ throw new CliError("MISSING_BUDGET", "rubicon read requires --max-usdc or --max-atomic.");
322
+ }
323
+ if (maxUsdc && maxAtomic) {
324
+ throw new CliError("MULTIPLE_BUDGETS", "Use either --max-usdc or --max-atomic, not both.");
325
+ }
326
+ if (maxAtomic) {
327
+ if (!/^\d+$/.test(maxAtomic))
328
+ throw new CliError("INVALID_BUDGET", "--max-atomic must be an integer.");
329
+ return maxAtomic;
330
+ }
331
+ try {
332
+ return `${parseUsdcToAtomic(maxUsdc)}`;
333
+ }
334
+ catch {
335
+ throw new CliError("INVALID_BUDGET", "--max-usdc must be a decimal USDC amount.");
336
+ }
337
+ }
338
+ function matchesQuery(article, query) {
339
+ const haystack = [
340
+ article.articleId,
341
+ article.title,
342
+ article.author,
343
+ article.creatorUsername,
344
+ ...article.sections.map((section) => section.heading),
345
+ ...article.sections.map((section) => section.sectionId),
346
+ ]
347
+ .join(" ")
348
+ .toLowerCase();
349
+ return query
350
+ .toLowerCase()
351
+ .split(/\s+/)
352
+ .filter(Boolean)
353
+ .every((term) => haystack.includes(term));
354
+ }
355
+ function showHelp(json) {
356
+ const usage = [
357
+ "rubicon repository",
358
+ "rubicon search \"<query>\"",
359
+ "rubicon article show <article-id>",
360
+ "rubicon article navigation <article-id> --goal \"<goal>\"",
361
+ "rubicon read <article-id> --max-usdc 0.10 [--goal \"...\"] [--max-words 50] [--dry-run]",
362
+ "rubicon receipts list",
363
+ "rubicon receipts show <receipt-id>",
364
+ "rubicon config show",
365
+ "rubicon config set gateway-url <url>",
366
+ "rubicon config set api-key <key>",
367
+ ];
368
+ if (json) {
369
+ printJson({ success: true, usage });
370
+ return;
371
+ }
372
+ process.stdout.write(`${usage.join("\n")}\n`);
373
+ }
374
+ await main();
375
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type AgentPaymentEngine } from "@rubicon-caliga/agent-sdk";
2
+ import { type RubiconCliConfig } from "./config.js";
3
+ export type PaymentMode = "static" | "circle-cli";
4
+ export interface PaymentSelection {
5
+ mode: PaymentMode;
6
+ engine: AgentPaymentEngine;
7
+ }
8
+ export declare function selectPaymentEngine(input: {
9
+ requestedMode?: string;
10
+ gatewayUrl: string;
11
+ config: RubiconCliConfig;
12
+ }): PaymentSelection;
13
+ //# sourceMappingURL=payments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payments.d.ts","sourceRoot":"","sources":["../src/payments.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGxE,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,YAAY,CAAC;AAElD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,gBAAgB,CAAC;CAC1B,GAAG,gBAAgB,CAenB"}
@@ -0,0 +1,52 @@
1
+ import { CircleCliGatewayPaymentEngine, StaticPaymentEngine, } from "@rubicon-caliga/agent-sdk";
2
+ import { HOSTED_GATEWAY_URL } from "./config.js";
3
+ import { CliError } from "./errors.js";
4
+ export function selectPaymentEngine(input) {
5
+ const mode = normalizeMode(input.requestedMode ?? process.env.RUBICON_PAYMENT_MODE ?? input.config.paymentMode);
6
+ const selectedMode = mode ?? defaultPaymentMode(input.gatewayUrl);
7
+ if (selectedMode === "static") {
8
+ return { mode: selectedMode, engine: new StaticPaymentEngine() };
9
+ }
10
+ return {
11
+ mode: selectedMode,
12
+ engine: new CircleCliGatewayPaymentEngine({
13
+ agentWalletAddress: envAddress("CIRCLE_AGENT_WALLET_ADDRESS") ?? input.config.agentWalletAddress,
14
+ chain: process.env.CIRCLE_CLI_CHAIN ?? input.config.circleChain ?? "ARC-TESTNET",
15
+ }),
16
+ };
17
+ }
18
+ function normalizeMode(value) {
19
+ if (!value) {
20
+ if (process.env.CIRCLE_CLI_PAYMENT === "1")
21
+ return "circle-cli";
22
+ if (process.env.CIRCLE_AGENT_WALLET_ADDRESS)
23
+ return "circle-cli";
24
+ return undefined;
25
+ }
26
+ if (value === "static" || value === "circle-cli")
27
+ return value;
28
+ throw new CliError("INVALID_PAYMENT_MODE", "Payment mode must be static or circle-cli.");
29
+ }
30
+ function defaultPaymentMode(gatewayUrl) {
31
+ if (isLocalGateway(gatewayUrl))
32
+ return "static";
33
+ if (process.env.CIRCLE_CLI_PAYMENT === "1" || process.env.CIRCLE_AGENT_WALLET_ADDRESS)
34
+ return "circle-cli";
35
+ if (gatewayUrl === HOSTED_GATEWAY_URL)
36
+ return "circle-cli";
37
+ return "circle-cli";
38
+ }
39
+ function isLocalGateway(gatewayUrl) {
40
+ try {
41
+ const url = new URL(gatewayUrl);
42
+ return url.hostname === "localhost" || url.hostname === "127.0.0.1" || url.hostname === "::1";
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ }
48
+ function envAddress(name) {
49
+ const value = process.env[name];
50
+ return value?.startsWith("0x") ? value : undefined;
51
+ }
52
+ //# sourceMappingURL=payments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payments.js","sourceRoot":"","sources":["../src/payments.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,mBAAmB,GAEpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAyB,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AASvC,MAAM,UAAU,mBAAmB,CAAC,KAInC;IACC,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAChH,MAAM,YAAY,GAAG,IAAI,IAAI,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAElE,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,mBAAmB,EAAE,EAAE,CAAC;IACnE,CAAC;IAED,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,IAAI,6BAA6B,CAAC;YACxC,kBAAkB,EAAE,UAAU,CAAC,6BAA6B,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,kBAAkB;YAChG,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,KAAK,CAAC,MAAM,CAAC,WAAW,IAAI,aAAa;SACjF,CAAC;KACH,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAyB;IAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,GAAG;YAAE,OAAO,YAAY,CAAC;QAChE,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B;YAAE,OAAO,YAAY,CAAC;QACjE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,YAAY;QAAE,OAAO,KAAK,CAAC;IAC/D,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,4CAA4C,CAAC,CAAC;AAC3F,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,IAAI,cAAc,CAAC,UAAU,CAAC;QAAE,OAAO,QAAQ,CAAC;IAChD,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B;QAAE,OAAO,YAAY,CAAC;IAC3G,IAAI,UAAU,KAAK,kBAAkB;QAAE,OAAO,YAAY,CAAC;IAC3D,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;QAChC,OAAO,GAAG,CAAC,QAAQ,KAAK,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,KAAK,CAAC;IAChG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,KAAuB,CAAC,CAAC,CAAC,SAAS,CAAC;AACxE,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ReadReceipt } from "@rubicon-caliga/agent-sdk";
2
+ export interface StoredReceipt {
3
+ receiptId: string;
4
+ savedAt: string;
5
+ receipt: ReadReceipt;
6
+ }
7
+ export declare function receiptsDir(): string;
8
+ export declare function receiptId(receipt: ReadReceipt): string;
9
+ export declare function saveReceipt(receipt: ReadReceipt): Promise<StoredReceipt>;
10
+ export declare function listReceipts(): Promise<StoredReceipt[]>;
11
+ export declare function loadReceipt(id: string): Promise<StoredReceipt>;
12
+ //# sourceMappingURL=receipts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipts.d.ts","sourceRoot":"","sources":["../src/receipts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAG7D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAEtD;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAW9E;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAS7D;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAUpE"}
@@ -0,0 +1,43 @@
1
+ import { mkdir, readFile, readdir, writeFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { CliError } from "./errors.js";
5
+ export function receiptsDir() {
6
+ return join(homedir(), ".rubicon", "receipts");
7
+ }
8
+ export function receiptId(receipt) {
9
+ return `${receipt.sessionId}-${receipt.articleId}`.replace(/[^a-zA-Z0-9._-]/g, "_");
10
+ }
11
+ export async function saveReceipt(receipt) {
12
+ const stored = {
13
+ receiptId: receiptId(receipt),
14
+ savedAt: new Date().toISOString(),
15
+ receipt,
16
+ };
17
+ await mkdir(receiptsDir(), { recursive: true, mode: 0o700 });
18
+ await writeFile(join(receiptsDir(), `${stored.receiptId}.json`), `${JSON.stringify(stored, null, 2)}\n`, {
19
+ mode: 0o600,
20
+ });
21
+ return stored;
22
+ }
23
+ export async function listReceipts() {
24
+ await mkdir(receiptsDir(), { recursive: true, mode: 0o700 });
25
+ const names = await readdir(receiptsDir());
26
+ const receipts = await Promise.all(names
27
+ .filter((name) => name.endsWith(".json"))
28
+ .map(async (name) => JSON.parse(await readFile(join(receiptsDir(), name), "utf8"))));
29
+ return receipts.sort((left, right) => right.savedAt.localeCompare(left.savedAt));
30
+ }
31
+ export async function loadReceipt(id) {
32
+ const safeId = id.replace(/[^a-zA-Z0-9._-]/g, "_");
33
+ try {
34
+ return JSON.parse(await readFile(join(receiptsDir(), `${safeId}.json`), "utf8"));
35
+ }
36
+ catch (error) {
37
+ if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT") {
38
+ throw new CliError("RECEIPT_NOT_FOUND", `Receipt not found: ${id}`);
39
+ }
40
+ throw error;
41
+ }
42
+ }
43
+ //# sourceMappingURL=receipts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipts.js","sourceRoot":"","sources":["../src/receipts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAQvC,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAoB;IAC5C,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB;IACpD,MAAM,MAAM,GAAG;QACb,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC;QAC7B,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACjC,OAAO;KACR,CAAC;IACF,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,GAAG,MAAM,CAAC,SAAS,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACvG,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,KAAK;SACF,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SACxC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAkB,CAAC,CACvG,CAAC;IACF,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAU;IAC1C,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACnD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,GAAG,MAAM,OAAO,CAAC,EAAE,MAAM,CAAC,CAAkB,CAAC;IACpG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9F,MAAM,IAAI,QAAQ,CAAC,mBAAmB,EAAE,sBAAsB,EAAE,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@rubicon-caliga/cli",
3
+ "version": "0.1.0",
4
+ "description": "Terminal-native Rubicon CLI for buyer agents consuming pay-per-word articles.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "rubicon": "dist/index.js"
9
+ },
10
+ "main": "dist/index.js",
11
+ "types": "dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "src"
21
+ ],
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/michaelzoub/rubicon.git",
25
+ "directory": "packages/cli"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "dependencies": {
31
+ "@rubicon-caliga/agent-sdk": "0.1.2",
32
+ "@rubicon-caliga/core": "0.1.0"
33
+ },
34
+ "devDependencies": {
35
+ "@types/node": "^22.10.2",
36
+ "tsx": "^4.19.2",
37
+ "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
+ }
45
+ }
package/src/args.ts ADDED
@@ -0,0 +1,52 @@
1
+ import { CliError } from "./errors.js";
2
+
3
+ export interface ParsedArgs {
4
+ positionals: string[];
5
+ flags: Record<string, string | boolean>;
6
+ }
7
+
8
+ export function parseArgs(argv: string[]): ParsedArgs {
9
+ const positionals: string[] = [];
10
+ const flags: Record<string, string | boolean> = {};
11
+
12
+ for (let index = 0; index < argv.length; index += 1) {
13
+ const token = argv[index]!;
14
+ if (token === "--") continue;
15
+ if (!token.startsWith("--")) {
16
+ positionals.push(token);
17
+ continue;
18
+ }
19
+
20
+ const withoutPrefix = token.slice(2);
21
+ const [rawName, inlineValue] = withoutPrefix.split("=", 2);
22
+ const name = rawName;
23
+ if (!name) {
24
+ throw new CliError("INVALID_ARGUMENT", `Invalid flag: ${token}`);
25
+ }
26
+
27
+ if (inlineValue !== undefined) {
28
+ flags[name] = inlineValue;
29
+ continue;
30
+ }
31
+
32
+ const next = argv[index + 1];
33
+ if (next !== undefined && !next.startsWith("--")) {
34
+ flags[name] = next;
35
+ index += 1;
36
+ } else {
37
+ flags[name] = true;
38
+ }
39
+ }
40
+
41
+ return { positionals, flags };
42
+ }
43
+
44
+ export function stringFlag(flags: Record<string, string | boolean>, name: string): string | undefined {
45
+ const value = flags[name];
46
+ if (value === undefined || typeof value === "boolean") return undefined;
47
+ return value;
48
+ }
49
+
50
+ export function booleanFlag(flags: Record<string, string | boolean>, name: string): boolean {
51
+ return flags[name] === true;
52
+ }