spendctl 0.0.0-stage → 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.
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ // node:sqlite is used for the ledger; hide its one-line ExperimentalWarning on Node 22.
3
+ const emit = process.emitWarning.bind(process);
4
+ process.emitWarning = (warning, ...rest) => {
5
+ const text = typeof warning === "string" ? warning : (warning?.message ?? "");
6
+ if (text.includes("SQLite is an experimental feature")) return;
7
+ return emit(warning, ...rest);
8
+ };
9
+ const { main } = await import("../dist/index.js");
10
+ process.exitCode = await main(process.argv.slice(2));
@@ -0,0 +1,5 @@
1
+ export declare const VERSION = "0.1.0";
2
+ type Flags = Record<string, string | boolean | string[] | undefined>;
3
+ export declare function main(argv: string[]): Promise<number>;
4
+ export type { Flags };
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,OAAO,UAAU,CAAC;AAuC/B,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;AAogBrE,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA0B1D;AAED,YAAY,EAAE,KAAK,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,553 @@
1
+ import { spawn } from "node:child_process";
2
+ import { appendFileSync, existsSync, readFileSync, rmSync, writeFileSync } from "node:fs";
3
+ import { relative, resolve } from "node:path";
4
+ import { parseArgs } from "node:util";
5
+ import { AdminClient, readRefusal, wrapFetch } from "@spendctl/client";
6
+ import { ConfigError, formatUsd, Ledger, loadConfig, newToken } from "@spendctl/core";
7
+ import { createSigner, listen, requestTestnetUsdc, Sidecar } from "@spendctl/proxy";
8
+ import { ensureAdminToken, loadDotenv, paths, readAdminToken, readAgentTokens, sidecarUrl, tryLoadConfig, writeAgentTokens, } from "./state.js";
9
+ import { ENV_EXAMPLE, policyTemplate } from "./templates.js";
10
+ import { c, short, statusColor, table } from "./ui.js";
11
+ export const VERSION = "0.1.0";
12
+ const HELP = `${c.bold("spendctl")} ${VERSION} — budgets, approvals and receipts for AI agents that pay (x402, MPP)
13
+
14
+ ${c.bold("Usage")}
15
+ spendctl <command> [options]
16
+
17
+ ${c.bold("Setup")}
18
+ init [--signer mock|cdp|private-key] [--force] Create spendctl.yaml and .spendctl/
19
+ start [--dry-run] [--port N] Run the sidecar (agents send requests here)
20
+ mock Run a mock facilitator + two paid APIs (ports 4020-4022)
21
+
22
+ ${c.bold("Agents")}
23
+ fetch <url> [--agent A] [-X METHOD] [-d BODY] [-H 'K: V'] [--dry-run]
24
+ Make a request through the sidecar as an agent
25
+ run --agent A -- <command...> Run a command with HTTP_PROXY pointing at the sidecar
26
+ mcp Serve the MCP tools pay / check_budget / list_receipts (stdio)
27
+ token <agent> Create a per-agent token (for agentAuth: token)
28
+
29
+ ${c.bold("Humans")}
30
+ pending List payments waiting for approval
31
+ approve <id> | --latest | --all [--note TEXT] Approve
32
+ deny <id> | --latest [--note TEXT] Deny
33
+ budget [--agent A] Show budgets and what is left
34
+ ledger [--agent A] [--limit N] Show recent payment decisions
35
+ export [--format csv|json] [--out FILE] [--agent A] [--since ISO]
36
+ Export receipts for expense reports
37
+ trace <attempt-id> Show an agent→agent payment chain
38
+ resolve <attempt-id> --settled|--failed [--tx HASH]
39
+ Reconcile an attempt whose outcome was unknown
40
+ dashboard [--open] Print (or open) the local dashboard URL
41
+ wallet [address|fund] Show the signer address / request testnet USDC (CDP)
42
+
43
+ ${c.bold("Global options")}
44
+ -c, --config FILE Policy file (default ./spendctl.yaml or $SPENDCTL_CONFIG)
45
+ -h, --help Show help
46
+ -v, --version Show version
47
+ `;
48
+ function parse(argv, options = {}) {
49
+ const result = parseArgs({
50
+ args: argv,
51
+ allowPositionals: true,
52
+ strict: true,
53
+ options: {
54
+ config: { type: "string", short: "c" },
55
+ help: { type: "boolean", short: "h" },
56
+ ...options,
57
+ },
58
+ });
59
+ return { values: result.values, positionals: result.positionals };
60
+ }
61
+ function out(text = "") {
62
+ process.stdout.write(`${text}\n`);
63
+ }
64
+ function err(text) {
65
+ process.stderr.write(`${text}\n`);
66
+ }
67
+ function admin(p) {
68
+ return new AdminClient({ url: sidecarUrl(p), token: readAdminToken(p) });
69
+ }
70
+ function eventLine(event) {
71
+ const a = event.attempt;
72
+ const time = new Date().toTimeString().slice(0, 8);
73
+ if (event.type === "approval" && event.approval) {
74
+ const amount = event.approval.usdMicros !== undefined ? formatUsd(BigInt(event.approval.usdMicros)) : "";
75
+ return `${c.yellow("⏸")} ${c.gray(time)} ${event.approval.agent} ${a?.method ?? ""} ${event.approval.host}${event.approval.path} ${c.bold(amount)} ${c.yellow("needs approval")} ${c.bold(event.approval.id)}\n ${c.dim(event.approval.reasons.map((r) => r.message).join(" "))}\n ${c.dim("→ run:")} spendctl approve ${event.approval.id}`;
76
+ }
77
+ if (!a)
78
+ return event.type === "error" ? `${c.red("!")} ${c.gray(time)} ${event.message}` : undefined;
79
+ const amount = a.usdMicros !== undefined ? formatUsd(a.usdMicros) : "-";
80
+ const where = `${a.method} ${a.host}${a.path}`;
81
+ if (event.type === "settled") {
82
+ return `${c.green("✔")} ${c.gray(time)} ${a.agent} ${where} ${c.bold(amount)} ${statusColor("settled")} ${c.gray(short(a.txHash, 14))}`;
83
+ }
84
+ if (event.type === "failed") {
85
+ return `${c.red("✖")} ${c.gray(time)} ${a.agent} ${where} ${amount} ${statusColor(a.status)} ${c.dim(a.error ?? "")}`;
86
+ }
87
+ if (event.type === "decision" && (a.status === "denied" || a.status === "dry_run")) {
88
+ const icon = a.status === "dry_run" ? c.yellow("○") : c.red("✖");
89
+ return `${icon} ${c.gray(time)} ${a.agent} ${where} ${amount} ${statusColor(a.status)} ${c.dim(a.reasons[0]?.message ?? "")}`;
90
+ }
91
+ if (event.type === "decision" && a.status === "expired") {
92
+ // A held request that ended without a payment: the requester left, or holdMax passed.
93
+ return `${c.yellow("⏸")} ${c.gray(time)} ${a.agent} ${where} ${amount} ${statusColor("expired")} ${c.dim(event.message.replace(`${a.id} `, ""))}`;
94
+ }
95
+ return undefined;
96
+ }
97
+ // ---------------------------------------------------------------- commands
98
+ async function cmdInit(argv) {
99
+ const { values } = parse(argv, { signer: { type: "string" }, force: { type: "boolean" } });
100
+ const p = paths(values.config);
101
+ const signer = (values.signer ?? "mock");
102
+ if (!["mock", "cdp", "private-key"].includes(signer)) {
103
+ err(`Unknown signer "${signer}" (use mock, cdp or private-key)`);
104
+ return 1;
105
+ }
106
+ if (existsSync(p.config) && !values.force) {
107
+ err(`${relative(process.cwd(), p.config) || p.config} already exists (use --force to overwrite).`);
108
+ return 1;
109
+ }
110
+ writeFileSync(p.config, policyTemplate(signer));
111
+ ensureAdminToken(p);
112
+ const gitignore = resolve(p.root, ".gitignore");
113
+ const lines = existsSync(gitignore) ? readFileSync(gitignore, "utf8") : "";
114
+ const missing = [".spendctl/", ".env"].filter((entry) => !lines.split(/\r?\n/).includes(entry));
115
+ if (missing.length)
116
+ appendFileSync(gitignore, `${lines && !lines.endsWith("\n") ? "\n" : ""}${missing.join("\n")}\n`);
117
+ if (signer !== "mock" && !existsSync(resolve(p.root, ".env.example")))
118
+ writeFileSync(resolve(p.root, ".env.example"), ENV_EXAMPLE);
119
+ out(`${c.green("✔")} wrote ${relative(process.cwd(), p.config) || "spendctl.yaml"} (signer: ${signer})`);
120
+ out(`${c.green("✔")} created .spendctl/ (admin token, ledger) — git-ignored`);
121
+ out("");
122
+ out(c.bold("Next:"));
123
+ if (signer === "mock") {
124
+ out(` 1. ${c.cyan("npx spendctl mock")} # terminal 1: mock facilitator + paid APIs`);
125
+ out(` 2. ${c.cyan("npx spendctl start")} # terminal 2: the sidecar`);
126
+ out(` 3. ${c.cyan("npx spendctl fetch http://localhost:4021/weather --agent researcher")}`);
127
+ }
128
+ else {
129
+ out(` 1. Fill in .env (see .env.example)`);
130
+ out(` 2. ${c.cyan("npx spendctl wallet fund")} # testnet USDC from the CDP faucet`);
131
+ out(` 3. ${c.cyan("npx spendctl start")}`);
132
+ }
133
+ return 0;
134
+ }
135
+ async function cmdStart(argv) {
136
+ const { values } = parse(argv, {
137
+ "dry-run": { type: "boolean" },
138
+ port: { type: "string" },
139
+ host: { type: "string" },
140
+ });
141
+ const p = paths(values.config);
142
+ loadDotenv(p.root);
143
+ const config = loadConfig(p.config);
144
+ if (values.port)
145
+ config.server.port = Number(values.port);
146
+ if (values.host)
147
+ config.server.host = String(values.host);
148
+ const adminToken = ensureAdminToken(p);
149
+ const signer = await createSigner(config.signer);
150
+ const ledgerPath = resolve(p.root, config.ledger.path);
151
+ const ledger = await Ledger.open(ledgerPath);
152
+ const sidecar = new Sidecar({
153
+ config,
154
+ ledger,
155
+ evmSigner: signer.signer,
156
+ adminToken,
157
+ agentTokens: readAgentTokens(p),
158
+ dryRun: Boolean(values["dry-run"]),
159
+ onEvent: (event) => {
160
+ const line = eventLine(event);
161
+ if (line)
162
+ out(line);
163
+ },
164
+ });
165
+ const running = await listen(sidecar);
166
+ writeFileSync(p.sidecar, `${JSON.stringify({ url: running.url, pid: process.pid, startedAt: new Date().toISOString() })}\n`);
167
+ const agents = Object.keys(config.agents);
168
+ out(`${c.bold("spendctl")} ${VERSION} listening on ${c.cyan(running.url)}${values["dry-run"] ? c.yellow(" [DRY RUN — nothing will be paid]") : ""}`);
169
+ out(`${c.dim("signer ")} ${signer.kind} · ${signer.address} ${c.dim(`(${signer.description})`)}`);
170
+ out(`${c.dim("policy ")} ${relative(process.cwd(), p.config) || p.config} · ${agents.length} agent(s): ${agents.join(", ")}`);
171
+ out(`${c.dim("ledger ")} ${relative(process.cwd(), ledgerPath) || ledgerPath}`);
172
+ out(`${c.dim("agents ")} send requests to ${running.url}/<absolute-url> with header X-Spendctl-Agent`);
173
+ const stop = async () => {
174
+ await running.close();
175
+ ledger.close();
176
+ rmSync(p.sidecar, { force: true });
177
+ process.exit(0);
178
+ };
179
+ process.on("SIGINT", stop);
180
+ process.on("SIGTERM", stop);
181
+ setInterval(() => sidecar.broker.expireStale(), 5_000).unref();
182
+ await new Promise(() => undefined);
183
+ return 0;
184
+ }
185
+ async function cmdMock(argv) {
186
+ const { values } = parse(argv, { base: { type: "string" } });
187
+ const { startDemoServers } = await import("@spendctl/mock");
188
+ const base = Number(values.base ?? 4020);
189
+ const servers = await startDemoServers({ facilitator: base, weather: base + 1, search: base + 2 });
190
+ out(`${c.bold("spendctl mock")} — nothing here touches a real chain`);
191
+ out(`${c.dim("facilitator")} ${servers.facilitator.url} (verifies EIP-3009 signatures, fake settlement)`);
192
+ out(`${c.dim("weather ")} http://localhost:${servers.weather.port}/weather?city=Tokyo $0.01 x402 v2`);
193
+ out(`${c.dim("search ")} http://localhost:${servers.search.port}/search?q=x402 $0.02 x402 v1`);
194
+ const stop = async () => {
195
+ await servers.close();
196
+ process.exit(0);
197
+ };
198
+ process.on("SIGINT", stop);
199
+ process.on("SIGTERM", stop);
200
+ await new Promise(() => undefined);
201
+ return 0;
202
+ }
203
+ async function cmdFetch(argv) {
204
+ const { values, positionals } = parse(argv, {
205
+ agent: { type: "string", short: "a" },
206
+ method: { type: "string", short: "X" },
207
+ data: { type: "string", short: "d" },
208
+ header: { type: "string", short: "H", multiple: true },
209
+ "dry-run": { type: "boolean" },
210
+ quiet: { type: "boolean", short: "q" },
211
+ });
212
+ const url = positionals[0];
213
+ if (!url) {
214
+ err("Usage: spendctl fetch <url> [--agent A]");
215
+ return 1;
216
+ }
217
+ const p = paths(values.config);
218
+ const config = tryLoadConfig(p);
219
+ const agent = values.agent ?? process.env.SPENDCTL_AGENT ?? config?.defaultAgent;
220
+ const headers = new Headers();
221
+ for (const header of values.header ?? []) {
222
+ const i = header.indexOf(":");
223
+ if (i > 0)
224
+ headers.set(header.slice(0, i).trim(), header.slice(i + 1).trim());
225
+ }
226
+ if (values["dry-run"])
227
+ headers.set("x-spendctl-dry-run", "1");
228
+ const tokens = readAgentTokens(p);
229
+ const doFetch = wrapFetch({ url: sidecarUrl(p), agent, token: agent ? tokens[agent] : undefined });
230
+ const started = Date.now();
231
+ let response;
232
+ try {
233
+ response = await doFetch(url, {
234
+ method: values.method ?? (values.data ? "POST" : "GET"),
235
+ headers,
236
+ body: values.data,
237
+ });
238
+ }
239
+ catch (error) {
240
+ const cause = error.cause;
241
+ if (cause?.code === "UND_ERR_HEADERS_TIMEOUT") {
242
+ // Node's fetch stops waiting for response headers after 300 s; a held approval outlived it.
243
+ err(`${c.red("✖")} gave up after 5 minutes waiting for the sidecar's answer (Node's fetch limit). If a human approval is pending, run \`spendctl pending\`; keep approvals.holdMax under 5m.`);
244
+ return 1;
245
+ }
246
+ err(`${c.red("✖")} cannot reach the sidecar at ${sidecarUrl(p)} — is \`spendctl start\` running? (${error.message})`);
247
+ return 1;
248
+ }
249
+ const ms = Date.now() - started;
250
+ const refusal = await readRefusal(response);
251
+ const text = await response.text();
252
+ const decision = response.headers.get("x-spendctl-decision");
253
+ const amount = response.headers.get("x-spendctl-amount");
254
+ if (!values.quiet) {
255
+ if (refusal) {
256
+ const icon = refusal.error === "spendctl_dry_run"
257
+ ? c.yellow("○")
258
+ : refusal.error === "spendctl_approval_required"
259
+ ? c.yellow("⏸")
260
+ : c.red("✖");
261
+ out(`${icon} ${response.status} ${c.bold(refusal.error)} ${c.gray(`${ms}ms`)}`);
262
+ out(` ${refusal.message}`);
263
+ if (refusal.approval)
264
+ out(` ${c.dim("approve with:")} spendctl approve ${refusal.approval}`);
265
+ }
266
+ else {
267
+ const paid = decision === "settled"
268
+ ? `${c.green("paid")} ${c.bold(amount ?? "")}`
269
+ : decision
270
+ ? statusColor(decision)
271
+ : c.dim("no payment");
272
+ out(`${response.ok ? c.green("✔") : c.red("✖")} ${response.status} ${paid} ${c.gray(`${ms}ms`)}`);
273
+ }
274
+ }
275
+ if (!refusal) {
276
+ try {
277
+ out(JSON.stringify(JSON.parse(text), null, 2));
278
+ }
279
+ catch {
280
+ out(text);
281
+ }
282
+ }
283
+ return response.ok ? 0 : refusal ? 2 : 1;
284
+ }
285
+ async function cmdPending(argv) {
286
+ const { values } = parse(argv, { ids: { type: "boolean" } });
287
+ const p = paths(values.config);
288
+ const { pending } = await admin(p).pending();
289
+ if (values.ids) {
290
+ for (const item of pending)
291
+ out(item.id);
292
+ return 0;
293
+ }
294
+ if (!pending.length) {
295
+ out(c.dim("Nothing is waiting for approval."));
296
+ return 0;
297
+ }
298
+ out(table(pending.map((item) => [
299
+ c.bold(item.id),
300
+ item.agent,
301
+ `${item.host}${item.path}`,
302
+ item.usdMicros !== undefined ? formatUsd(BigInt(item.usdMicros)) : "-",
303
+ `${Math.max(0, Math.round((item.expiresAt - Date.now()) / 1000))}s`,
304
+ item.reasons.map((r) => r.message).join(" "),
305
+ ]), ["ID", "AGENT", "ENDPOINT", "AMOUNT", "EXPIRES", "WHY"]));
306
+ return 0;
307
+ }
308
+ async function cmdDecide(argv, action) {
309
+ const { values, positionals } = parse(argv, {
310
+ latest: { type: "boolean" },
311
+ all: { type: "boolean" },
312
+ note: { type: "string" },
313
+ });
314
+ const p = paths(values.config);
315
+ const client = admin(p);
316
+ let ids = positionals;
317
+ if (values.latest || values.all) {
318
+ const { pending } = await client.pending();
319
+ ids = values.all ? pending.map((item) => item.id) : pending.slice(0, 1).map((item) => item.id);
320
+ }
321
+ if (!ids.length) {
322
+ err(values.latest || values.all
323
+ ? "Nothing is waiting for approval."
324
+ : `Usage: spendctl ${action} <approval-id> | --latest`);
325
+ return 1;
326
+ }
327
+ for (const id of ids) {
328
+ const result = action === "approve"
329
+ ? await client.approve(id, values.note)
330
+ : await client.deny(id, values.note);
331
+ out(`${action === "approve" ? c.green("✔ approved") : c.red("✖ denied")} ${result.approval.id}`);
332
+ }
333
+ return 0;
334
+ }
335
+ async function cmdBudget(argv) {
336
+ const { values } = parse(argv, { agent: { type: "string", short: "a" } });
337
+ const p = paths(values.config);
338
+ const summary = await admin(p).summary();
339
+ const agents = summary.agents.filter((a) => !values.agent || a.agent === values.agent);
340
+ for (const agent of agents) {
341
+ out(`${c.bold(agent.agent)} ${c.dim(agent.mode)}${agent.perRequest ? c.dim(` · max ${agent.perRequest}/request`) : ""}${agent.requireApprovalAbove ? c.dim(` · approval ≥ ${agent.requireApprovalAbove}`) : ""}`);
342
+ if (!agent.windows.length)
343
+ out(c.dim(" no time-window budgets"));
344
+ for (const w of agent.windows)
345
+ out(` ${w.window.padEnd(8)} ${w.spent.padStart(10)} of ${w.limit.padEnd(10)} ${c.dim(`${w.remaining} left`)}`);
346
+ }
347
+ return 0;
348
+ }
349
+ async function cmdLedger(argv) {
350
+ const { values } = parse(argv, { agent: { type: "string", short: "a" }, limit: { type: "string", short: "n" } });
351
+ const p = paths(values.config);
352
+ const { attempts } = await admin(p).ledger({
353
+ agent: values.agent,
354
+ limit: Number(values.limit ?? 20),
355
+ });
356
+ if (!attempts.length) {
357
+ out(c.dim("The ledger is empty."));
358
+ return 0;
359
+ }
360
+ out(table(attempts.map((a) => [
361
+ c.gray(a.created_at_utc.replace("T", " ").slice(5, 19)),
362
+ a.id,
363
+ a.agent,
364
+ `${a.method} ${a.host}${a.path}`,
365
+ a.usd_value ? `$${a.usd_value}` : "-",
366
+ statusColor(a.status),
367
+ a.tx_hash ? c.gray(short(a.tx_hash, 16)) : c.dim(a.reasons),
368
+ ]), ["TIME (UTC)", "ID", "AGENT", "ENDPOINT", "USD", "STATUS", "TX / REASON"]));
369
+ return 0;
370
+ }
371
+ async function cmdExport(argv) {
372
+ const { values } = parse(argv, {
373
+ format: { type: "string", short: "f" },
374
+ out: { type: "string", short: "o" },
375
+ agent: { type: "string", short: "a" },
376
+ since: { type: "string" },
377
+ });
378
+ const p = paths(values.config);
379
+ const format = values.format === "json" ? "json" : "csv";
380
+ const body = await admin(p).export(format, {
381
+ agent: values.agent,
382
+ since: values.since,
383
+ });
384
+ const text = typeof body === "string" ? body : `${JSON.stringify(body, null, 2)}\n`;
385
+ if (values.out) {
386
+ writeFileSync(String(values.out), text);
387
+ const rows = format === "csv" ? Math.max(0, text.trim().split("\n").length - 1) : JSON.parse(text).length;
388
+ out(`${c.green("✔")} wrote ${rows} row(s) to ${values.out}`);
389
+ }
390
+ else {
391
+ process.stdout.write(text);
392
+ }
393
+ return 0;
394
+ }
395
+ async function cmdTrace(argv) {
396
+ const { values, positionals } = parse(argv);
397
+ if (!positionals[0]) {
398
+ err("Usage: spendctl trace <attempt-id>");
399
+ return 1;
400
+ }
401
+ const p = paths(values.config);
402
+ out((await admin(p).trace(positionals[0])).text);
403
+ return 0;
404
+ }
405
+ async function cmdResolve(argv) {
406
+ const { values, positionals } = parse(argv, {
407
+ settled: { type: "boolean" },
408
+ failed: { type: "boolean" },
409
+ tx: { type: "string" },
410
+ });
411
+ const id = positionals[0];
412
+ if (!id || values.settled === values.failed) {
413
+ err("Usage: spendctl resolve <attempt-id> --settled|--failed [--tx HASH]");
414
+ return 1;
415
+ }
416
+ const p = paths(values.config);
417
+ await admin(p).resolve(id, values.settled ? "settled" : "failed", values.tx);
418
+ out(`${c.green("✔")} ${id} marked ${values.settled ? "settled" : "failed"}`);
419
+ return 0;
420
+ }
421
+ async function cmdDashboard(argv) {
422
+ const { values } = parse(argv, { open: { type: "boolean" } });
423
+ const p = paths(values.config);
424
+ const url = `${sidecarUrl(p)}/_spendctl/dashboard#token=${readAdminToken(p)}`;
425
+ out(url);
426
+ if (values.open)
427
+ spawn(process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open", [url], {
428
+ stdio: "ignore",
429
+ detached: true,
430
+ }).unref();
431
+ return 0;
432
+ }
433
+ async function cmdRun(argv) {
434
+ const split = argv.indexOf("--");
435
+ const own = split === -1 ? argv : argv.slice(0, split);
436
+ const command = split === -1 ? [] : argv.slice(split + 1);
437
+ const { values } = parse(own, { agent: { type: "string", short: "a" } });
438
+ if (!command.length || !values.agent) {
439
+ err("Usage: spendctl run --agent <name> -- <command...>");
440
+ return 1;
441
+ }
442
+ const p = paths(values.config);
443
+ const base = new URL(sidecarUrl(p));
444
+ const token = readAgentTokens(p)[String(values.agent)];
445
+ const proxy = `${base.protocol}//${encodeURIComponent(String(values.agent))}${token ? `:${token}` : ""}@${base.host}`;
446
+ const child = spawn(command[0], command.slice(1), {
447
+ stdio: "inherit",
448
+ env: {
449
+ ...process.env,
450
+ HTTP_PROXY: proxy,
451
+ http_proxy: proxy,
452
+ NODE_USE_ENV_PROXY: "1",
453
+ SPENDCTL_URL: base.origin,
454
+ SPENDCTL_AGENT: String(values.agent),
455
+ ...(token ? { SPENDCTL_AGENT_TOKEN: token } : {}),
456
+ },
457
+ });
458
+ return new Promise((done) => child.on("exit", (code) => done(code ?? 1)));
459
+ }
460
+ async function cmdToken(argv) {
461
+ const { values, positionals } = parse(argv);
462
+ const agent = positionals[0];
463
+ if (!agent) {
464
+ err("Usage: spendctl token <agent>");
465
+ return 1;
466
+ }
467
+ const p = paths(values.config);
468
+ const tokens = readAgentTokens(p);
469
+ tokens[agent] ??= newToken(16);
470
+ writeAgentTokens(p, tokens);
471
+ out(tokens[agent]);
472
+ return 0;
473
+ }
474
+ async function cmdWallet(argv) {
475
+ const { values, positionals } = parse(argv, { amount: { type: "string" } });
476
+ const p = paths(values.config);
477
+ loadDotenv(p.root);
478
+ const config = loadConfig(p.config);
479
+ const action = positionals[0] ?? "address";
480
+ const signer = await createSigner(config.signer);
481
+ if (action === "address") {
482
+ out(`${signer.address} ${c.dim(signer.description)}`);
483
+ return 0;
484
+ }
485
+ if (action === "fund") {
486
+ if (config.signer.type !== "cdp") {
487
+ err("`wallet fund` uses the CDP faucet and needs signer.type: cdp.");
488
+ return 1;
489
+ }
490
+ const result = await requestTestnetUsdc(signer.address);
491
+ out(`${c.green("✔")} requested 1 testnet USDC for ${signer.address}`);
492
+ out(` https://sepolia.basescan.org/tx/${result.transactionHash}`);
493
+ return 0;
494
+ }
495
+ err("Usage: spendctl wallet [address|fund]");
496
+ return 1;
497
+ }
498
+ async function cmdMcp() {
499
+ const { serveStdio } = await import("@spendctl/mcp-server");
500
+ await serveStdio();
501
+ await new Promise(() => undefined);
502
+ return 0;
503
+ }
504
+ const COMMANDS = {
505
+ init: cmdInit,
506
+ start: cmdStart,
507
+ mock: cmdMock,
508
+ fetch: cmdFetch,
509
+ pending: cmdPending,
510
+ approve: (argv) => cmdDecide(argv, "approve"),
511
+ deny: (argv) => cmdDecide(argv, "deny"),
512
+ budget: cmdBudget,
513
+ ledger: cmdLedger,
514
+ export: cmdExport,
515
+ trace: cmdTrace,
516
+ resolve: cmdResolve,
517
+ dashboard: cmdDashboard,
518
+ run: cmdRun,
519
+ token: cmdToken,
520
+ wallet: cmdWallet,
521
+ mcp: cmdMcp,
522
+ };
523
+ export async function main(argv) {
524
+ const [command, ...rest] = argv;
525
+ if (!command || command === "-h" || command === "--help" || command === "help") {
526
+ out(HELP);
527
+ return 0;
528
+ }
529
+ if (command === "-v" || command === "--version") {
530
+ out(VERSION);
531
+ return 0;
532
+ }
533
+ const handler = COMMANDS[command];
534
+ if (!handler) {
535
+ err(`Unknown command "${command}". Run \`spendctl --help\`.`);
536
+ return 1;
537
+ }
538
+ if (rest.includes("--help") || rest.includes("-h")) {
539
+ out(HELP);
540
+ return 0;
541
+ }
542
+ try {
543
+ return await handler(rest);
544
+ }
545
+ catch (error) {
546
+ if (error instanceof ConfigError)
547
+ err(c.red(error.message));
548
+ else
549
+ err(`${c.red("✖")} ${error.message}`);
550
+ return 1;
551
+ }
552
+ }
553
+ //# 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,19 @@
1
+ import { type Config } from "@spendctl/core";
2
+ export interface Paths {
3
+ config: string;
4
+ root: string;
5
+ state: string;
6
+ adminToken: string;
7
+ agentTokens: string;
8
+ sidecar: string;
9
+ }
10
+ export declare function paths(configFlag?: string): Paths;
11
+ export declare function ensureAdminToken(p: Paths): string;
12
+ export declare function readAdminToken(p: Paths): string;
13
+ export declare function readAgentTokens(p: Paths): Record<string, string>;
14
+ export declare function writeAgentTokens(p: Paths, tokens: Record<string, string>): void;
15
+ export declare function loadDotenv(root: string): void;
16
+ export declare function tryLoadConfig(p: Paths): Config | undefined;
17
+ /** Where the running sidecar listens: $SPENDCTL_URL, the pid file, then the config. */
18
+ export declare function sidecarUrl(p: Paths): string;
19
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAwB,MAAM,gBAAgB,CAAC;AAEnE,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAYhD;AAQD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAMjD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAQ/C;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGhE;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAE/E;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAG7C;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAE1D;AAED,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAY3C"}