@codespar/cli 0.3.0 → 0.5.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/README.md +11 -2
- package/dist/api.js +20 -5
- package/dist/api.js.map +1 -1
- package/dist/commands/charge.js +55 -0
- package/dist/commands/charge.js.map +1 -0
- package/dist/commands/connect.js +30 -7
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/discover.js +78 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/execute.js +1 -1
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/issue.js +62 -0
- package/dist/commands/issue.js.map +1 -0
- package/dist/commands/ledger.js +64 -0
- package/dist/commands/ledger.js.map +1 -0
- package/dist/commands/login.js +32 -7
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logs.js +1 -0
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/mandate.js +85 -0
- package/dist/commands/mandate.js.map +1 -0
- package/dist/commands/meta-input.js +33 -0
- package/dist/commands/meta-input.js.map +1 -0
- package/dist/commands/payment-status.js +80 -0
- package/dist/commands/payment-status.js.map +1 -0
- package/dist/commands/ship.js +53 -0
- package/dist/commands/ship.js.map +1 -0
- package/dist/commands/spend.js +41 -0
- package/dist/commands/spend.js.map +1 -0
- package/dist/commands/verification-status.js +82 -0
- package/dist/commands/verification-status.js.map +1 -0
- package/dist/commands/wizard.js +107 -0
- package/dist/commands/wizard.js.map +1 -0
- package/dist/index.js +184 -17
- package/dist/index.js.map +1 -1
- package/dist/version.js +8 -0
- package/dist/version.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { ApiClient } from "../api.js";
|
|
2
|
+
import { CliError } from "../config.js";
|
|
3
|
+
import { info, json, kv, success } from "../output.js";
|
|
4
|
+
/**
|
|
5
|
+
* Create a consumer mandate — the agent's "allowance / wallet" — end to end.
|
|
6
|
+
*
|
|
7
|
+
* Runs the directed-pay consent flow the way an org backend would:
|
|
8
|
+
* 1. POST /v1/consents/init (authed) mints a one-shot token carrying the
|
|
9
|
+
* intent (purpose, caps, currency, allowlist).
|
|
10
|
+
* 2. POST /v1/consents/:token/submit (public) provisions the consumer funding
|
|
11
|
+
* source and signs the mandate with the consumer secret.
|
|
12
|
+
* Prints the mandate id you then hand to `codespar spend`. The consumer's
|
|
13
|
+
* on-chain wallet (for usdc-onchain) is derived from the consumer id, so the
|
|
14
|
+
* same consumer keeps the same wallet across mandates.
|
|
15
|
+
*/
|
|
16
|
+
export async function mandateCreateCommand(opts) {
|
|
17
|
+
if (!opts.consumer)
|
|
18
|
+
throw new CliError("--consumer <id> is required.");
|
|
19
|
+
if (!opts.agent)
|
|
20
|
+
throw new CliError("--agent <id> is required.");
|
|
21
|
+
if (!opts.purpose)
|
|
22
|
+
throw new CliError("--purpose <text> is required.");
|
|
23
|
+
const allowlist = (opts.payee ?? "")
|
|
24
|
+
.split(",")
|
|
25
|
+
.map((s) => s.trim())
|
|
26
|
+
.filter(Boolean);
|
|
27
|
+
if (allowlist.length === 0) {
|
|
28
|
+
throw new CliError("--payee is required (allowlisted payee: x402 URL, EVM address, or Pix key; comma-separated for several).");
|
|
29
|
+
}
|
|
30
|
+
const capMinor = Number(opts.cap);
|
|
31
|
+
const perTxMinor = Number(opts.perTxCap);
|
|
32
|
+
const ttl = Number(opts.ttl);
|
|
33
|
+
if (!Number.isInteger(capMinor) || capMinor <= 0) {
|
|
34
|
+
throw new CliError("--cap must be a positive integer in minor units (cents).");
|
|
35
|
+
}
|
|
36
|
+
if (!Number.isInteger(perTxMinor) || perTxMinor <= 0) {
|
|
37
|
+
throw new CliError("--per-tx-cap must be a positive integer in minor units (cents).");
|
|
38
|
+
}
|
|
39
|
+
if (!Number.isInteger(ttl) || ttl <= 0) {
|
|
40
|
+
throw new CliError("--ttl must be a positive integer (seconds).");
|
|
41
|
+
}
|
|
42
|
+
const client = new ApiClient({
|
|
43
|
+
apiKey: opts.apiKey,
|
|
44
|
+
baseUrl: opts.baseUrl,
|
|
45
|
+
project: opts.project,
|
|
46
|
+
});
|
|
47
|
+
// 1. Mint the consent token (authed).
|
|
48
|
+
const init = await client.post("/v1/consents/init", {
|
|
49
|
+
agent_id: opts.agent,
|
|
50
|
+
intent: {
|
|
51
|
+
purpose: opts.purpose,
|
|
52
|
+
cap_minor: capMinor,
|
|
53
|
+
per_tx_cap_minor: perTxMinor,
|
|
54
|
+
currency: opts.currency,
|
|
55
|
+
mandate_ttl_seconds: ttl,
|
|
56
|
+
merchant_allowlist: allowlist,
|
|
57
|
+
merchant_pin_kind: opts.pinKind,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
// 2. Submit the consumer side → funding source + signed mandate (public; the
|
|
61
|
+
// token in the URL is the auth, so an extra bearer header is ignored).
|
|
62
|
+
const submit = await client.post(`/v1/consents/${encodeURIComponent(init.token)}/submit`, {
|
|
63
|
+
consumer_id: opts.consumer,
|
|
64
|
+
rail: opts.rail,
|
|
65
|
+
provider_token: opts.providerToken ?? `${opts.rail}:${opts.consumer}`,
|
|
66
|
+
});
|
|
67
|
+
if (opts.json) {
|
|
68
|
+
json(submit);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const mandateId = submit.mandate_id ?? "(unknown)";
|
|
72
|
+
success("mandate created");
|
|
73
|
+
kv([
|
|
74
|
+
["mandate", mandateId],
|
|
75
|
+
["consumer", opts.consumer],
|
|
76
|
+
["agent", opts.agent],
|
|
77
|
+
["purpose", opts.purpose],
|
|
78
|
+
["allowlist", allowlist.join(", ")],
|
|
79
|
+
["per-tx cap", `${perTxMinor} ${opts.currency} (minor)`],
|
|
80
|
+
["total cap", `${capMinor} ${opts.currency} (minor)`],
|
|
81
|
+
["rail", opts.rail],
|
|
82
|
+
]);
|
|
83
|
+
info(`Spend against it:\n codespar spend --mandate ${mandateId} --payee ${allowlist[0]} --amount 1 --agent ${opts.agent}`);
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=mandate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mandate.js","sourceRoot":"","sources":["../../src/commands/mandate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { CliError } from "../config.js";
|
|
3
|
+
/**
|
|
4
|
+
* Resolve a meta-tool command's args from `--input '<json>'` or
|
|
5
|
+
* `--input-file <path>`. Shared by the `ledger` / `issue` commands (and
|
|
6
|
+
* a good target for charge/ship to migrate onto). Returns a parsed JSON
|
|
7
|
+
* object or throws a CliError with an actionable message.
|
|
8
|
+
*/
|
|
9
|
+
export async function resolveMetaInput(opts, name, example) {
|
|
10
|
+
if (opts.input && opts.inputFile) {
|
|
11
|
+
throw new CliError("Pass either --input or --input-file, not both.");
|
|
12
|
+
}
|
|
13
|
+
if (!opts.input && !opts.inputFile) {
|
|
14
|
+
throw new CliError(`${name} requires --input '<json>' or --input-file <path>. Example: --input '${example}'`);
|
|
15
|
+
}
|
|
16
|
+
const raw = opts.inputFile
|
|
17
|
+
? await readFile(opts.inputFile, "utf-8")
|
|
18
|
+
: opts.input;
|
|
19
|
+
const source = opts.inputFile ?? "--input";
|
|
20
|
+
try {
|
|
21
|
+
const parsed = JSON.parse(raw);
|
|
22
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
23
|
+
throw new CliError(`${source} must be a JSON object.`);
|
|
24
|
+
}
|
|
25
|
+
return parsed;
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
if (err instanceof CliError)
|
|
29
|
+
throw err;
|
|
30
|
+
throw new CliError(`${source} is not valid JSON: ${err.message}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=meta-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta-input.js","sourceRoot":"","sources":["../../src/commands/meta-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAA4C,EAC5C,IAAY,EACZ,OAAe;IAEf,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,QAAQ,CAAC,gDAAgD,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACnC,MAAM,IAAI,QAAQ,CAChB,GAAG,IAAI,wEAAwE,OAAO,GAAG,CAC1F,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS;QACxB,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;QACzC,CAAC,CAAE,IAAI,CAAC,KAAgB,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QAC1C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,QAAQ,CAAC,GAAG,MAAM,yBAAyB,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,MAAiC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ;YAAE,MAAM,GAAG,CAAC;QACvC,MAAM,IAAI,QAAQ,CAAC,GAAG,MAAM,uBAAwB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { CodeSpar } from "@codespar/sdk";
|
|
2
|
+
import { CliError } from "../config.js";
|
|
3
|
+
import { info, json, success, warn } from "../output.js";
|
|
4
|
+
const DEFAULT_TIMEOUT_MS = 600_000;
|
|
5
|
+
/**
|
|
6
|
+
* Wraps `session.paymentStatus(toolCallId)` (default: poll once) and
|
|
7
|
+
* `session.paymentStatusStream(toolCallId, ...)` when `--stream` is
|
|
8
|
+
* passed. Ctrl+C aborts the stream cleanly via AbortController.
|
|
9
|
+
*/
|
|
10
|
+
export async function paymentStatusCommand(toolCallId, opts) {
|
|
11
|
+
if (!toolCallId) {
|
|
12
|
+
throw new CliError("tool-call id is required. Example: `codespar payment-status tcl_abc123`");
|
|
13
|
+
}
|
|
14
|
+
const timeoutMs = opts.timeout ? Number(opts.timeout) : DEFAULT_TIMEOUT_MS;
|
|
15
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
|
|
16
|
+
throw new CliError("--timeout must be a positive integer (milliseconds).");
|
|
17
|
+
}
|
|
18
|
+
const userId = opts.user ?? "cli-user";
|
|
19
|
+
const cs = new CodeSpar({ apiKey: opts.apiKey, baseUrl: opts.baseUrl, projectId: opts.project });
|
|
20
|
+
const session = await cs.create(userId, { servers: [] });
|
|
21
|
+
try {
|
|
22
|
+
if (opts.stream) {
|
|
23
|
+
await runStream(session, toolCallId, timeoutMs, Boolean(opts.json));
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
const result = await session.paymentStatus(toolCallId);
|
|
27
|
+
renderResult(result, Boolean(opts.json));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
await session.close();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function runStream(session, toolCallId, timeoutMs, asJson) {
|
|
35
|
+
const controller = new AbortController();
|
|
36
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
37
|
+
const onSigint = () => {
|
|
38
|
+
warn("Aborted by user.");
|
|
39
|
+
controller.abort();
|
|
40
|
+
};
|
|
41
|
+
process.on("SIGINT", onSigint);
|
|
42
|
+
try {
|
|
43
|
+
let updates = 0;
|
|
44
|
+
const final = await session.paymentStatusStream(toolCallId, {
|
|
45
|
+
signal: controller.signal,
|
|
46
|
+
onUpdate: (envelope) => {
|
|
47
|
+
updates++;
|
|
48
|
+
if (asJson) {
|
|
49
|
+
json(envelope);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
info(`update #${updates}: payment_status=${envelope.payment_status} events=${envelope.events.length}`);
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
renderResult(final, asJson);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
if (err.name === "AbortError") {
|
|
60
|
+
throw new CliError("payment-status stream timed out or was aborted.");
|
|
61
|
+
}
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
clearTimeout(timer);
|
|
66
|
+
process.off("SIGINT", onSigint);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function renderResult(result, asJson) {
|
|
70
|
+
if (asJson) {
|
|
71
|
+
json(result);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
success(`payment_status: ${result.payment_status}`);
|
|
75
|
+
info(`tool_call_id: ${result.tool_call_id}`);
|
|
76
|
+
info(`original_status: ${result.original_status}`);
|
|
77
|
+
info(`idempotency_key: ${result.idempotency_key ?? "-"}`);
|
|
78
|
+
info(`events: ${result.events.length}`);
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=payment-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-status.js","sourceRoot":"","sources":["../../src/commands/payment-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { CodeSpar } from "@codespar/sdk";
|
|
2
|
+
import { CliError } from "../config.js";
|
|
3
|
+
import { info, json, success } from "../output.js";
|
|
4
|
+
import { resolveMetaInput } from "./meta-input.js";
|
|
5
|
+
const EXAMPLE = '{"action":"quote","origin":{"postal_code":"01310100"},"destination":{"postal_code":"22041011"},"items":[{"weight_g":500}]}';
|
|
6
|
+
/**
|
|
7
|
+
* Wraps `session.ship(args)`. Three actions over a unified envelope —
|
|
8
|
+
* `label`, `quote`, `track`. Like charge, the meta-tool picks the
|
|
9
|
+
* carrier so no `--server` is required.
|
|
10
|
+
*/
|
|
11
|
+
export async function shipCommand(opts) {
|
|
12
|
+
const args = (await resolveMetaInput(opts, "ship", EXAMPLE));
|
|
13
|
+
validateShipArgs(args);
|
|
14
|
+
const userId = opts.user ?? "cli-user";
|
|
15
|
+
const cs = new CodeSpar({ apiKey: opts.apiKey, baseUrl: opts.baseUrl, projectId: opts.project });
|
|
16
|
+
const session = await cs.create(userId, { servers: [] });
|
|
17
|
+
try {
|
|
18
|
+
const result = await session.ship(args);
|
|
19
|
+
if (opts.json) {
|
|
20
|
+
json(result);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
success(`ship ${result.id} → ${result.status}`);
|
|
24
|
+
if (result.tracking_code)
|
|
25
|
+
info(`Tracking: ${result.tracking_code}`);
|
|
26
|
+
if (result.carrier)
|
|
27
|
+
info(`Carrier: ${result.carrier}`);
|
|
28
|
+
if (result.label_url)
|
|
29
|
+
info(`Label URL: ${result.label_url}`);
|
|
30
|
+
if (result.estimated_delivery)
|
|
31
|
+
info(`ETA: ${result.estimated_delivery}`);
|
|
32
|
+
if (typeof result.cost_minor === "number")
|
|
33
|
+
info(`Cost (minor units): ${result.cost_minor}`);
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
await session.close();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function validateShipArgs(args) {
|
|
40
|
+
if (!args.action || !["label", "quote", "track"].includes(args.action)) {
|
|
41
|
+
throw new CliError("ship.action must be one of: label, quote, track.");
|
|
42
|
+
}
|
|
43
|
+
if (args.action === "track" && !args.tracking_code) {
|
|
44
|
+
throw new CliError("ship.tracking_code is required when action=track.");
|
|
45
|
+
}
|
|
46
|
+
if ((args.action === "label" || args.action === "quote") && (!args.origin || !args.destination)) {
|
|
47
|
+
throw new CliError("ship.origin and ship.destination are required when action=label|quote.");
|
|
48
|
+
}
|
|
49
|
+
if ((args.action === "label" || args.action === "quote") && (!args.items || args.items.length === 0)) {
|
|
50
|
+
throw new CliError("ship.items must contain at least one item when action=label|quote.");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=ship.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship.js","sourceRoot":"","sources":["../../src/commands/ship.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,OAAO,GACX,4HAA4H,CAAC;AAY/H;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAwB;IACxD,MAAM,IAAI,GAAG,CAAC,MAAM,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAwB,CAAC;IACpF,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAEvB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC;IACvC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACjG,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAEzD,IAAI,CAAC;QACH,MAAM,MAAM,GAAe,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEpD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,CAAC;YACb,OAAO;QACT,CAAC;QAED,OAAO,CAAC,QAAQ,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,aAAa;YAAE,IAAI,CAAC,aAAa,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QACpE,IAAI,MAAM,CAAC,OAAO;YAAE,IAAI,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,SAAS;YAAE,IAAI,CAAC,cAAc,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,kBAAkB;YAAE,IAAI,CAAC,QAAQ,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACzE,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;YAAE,IAAI,CAAC,uBAAuB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9F,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAc;IACtC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,QAAQ,CAAC,kDAAkD,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnD,MAAM,IAAI,QAAQ,CAAC,mDAAmD,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAChG,MAAM,IAAI,QAAQ,CAAC,wEAAwE,CAAC,CAAC;IAC/F,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACrG,MAAM,IAAI,QAAQ,CAAC,oEAAoE,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ApiClient } from "../api.js";
|
|
2
|
+
import { CliError } from "../config.js";
|
|
3
|
+
import { info, json, success } from "../output.js";
|
|
4
|
+
/**
|
|
5
|
+
* Execute an agentic spend against a consumer mandate:
|
|
6
|
+
* POST /v1/consumers/mandates/:id/spend { amount_minor, payee, agent_id }
|
|
7
|
+
*
|
|
8
|
+
* The SDK doesn't expose the consumer-mandate spend flow, so we hit the REST
|
|
9
|
+
* endpoint directly. The backend reconstructs + signs the stored mandate,
|
|
10
|
+
* runs the per-tx cap gate, and dispatches the rail by payee shape:
|
|
11
|
+
* - Pix key / BR Code → Pix (pix-celcoin / PSP)
|
|
12
|
+
* - EVM address → direct USDC transfer on Base (CDP)
|
|
13
|
+
* - http(s) URL → x402 pay-per-call (USDC on Base, settled on-chain)
|
|
14
|
+
*/
|
|
15
|
+
export async function spendCommand(opts) {
|
|
16
|
+
if (!opts.mandate)
|
|
17
|
+
throw new CliError("--mandate <id> is required.");
|
|
18
|
+
if (!opts.payee) {
|
|
19
|
+
throw new CliError("--payee is required (a Pix key, EVM address, or x402 resource URL).");
|
|
20
|
+
}
|
|
21
|
+
const amountMinor = Number(opts.amount);
|
|
22
|
+
if (!Number.isInteger(amountMinor) || amountMinor <= 0) {
|
|
23
|
+
throw new CliError("--amount must be a positive integer in minor units (cents).");
|
|
24
|
+
}
|
|
25
|
+
if (!opts.agent)
|
|
26
|
+
throw new CliError("--agent <id> is required.");
|
|
27
|
+
const client = new ApiClient({
|
|
28
|
+
apiKey: opts.apiKey,
|
|
29
|
+
baseUrl: opts.baseUrl,
|
|
30
|
+
project: opts.project,
|
|
31
|
+
});
|
|
32
|
+
const result = await client.post(`/v1/consumers/mandates/${encodeURIComponent(opts.mandate)}/spend`, { amount_minor: amountMinor, payee: opts.payee, agent_id: opts.agent });
|
|
33
|
+
if (opts.json) {
|
|
34
|
+
json(result);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
success("spend executed");
|
|
38
|
+
info("The on-chain tx / receipt is in the response below:");
|
|
39
|
+
json(result);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=spend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spend.js","sourceRoot":"","sources":["../../src/commands/spend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAanD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAyB;IAC1D,IAAI,CAAC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,QAAQ,CAAC,6BAA6B,CAAC,CAAC;IACrE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,QAAQ,CAChB,qEAAqE,CACtE,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,QAAQ,CAAC,6DAA6D,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,QAAQ,CAAC,2BAA2B,CAAC,CAAC;IAEjE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAC9B,0BAA0B,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAClE,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,CACvE,CAAC;IAEF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,CAAC,MAAM,CAAC,CAAC;QACb,OAAO;IACT,CAAC;IACD,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC1B,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAC5D,IAAI,CAAC,MAAM,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { CodeSpar } from "@codespar/sdk";
|
|
2
|
+
import { CliError } from "../config.js";
|
|
3
|
+
import { info, json, success, warn } from "../output.js";
|
|
4
|
+
const DEFAULT_TIMEOUT_MS = 600_000;
|
|
5
|
+
/**
|
|
6
|
+
* KYC sibling of payment-status. Default poll once; `--stream` opens
|
|
7
|
+
* an SSE channel and prints each `update` until the terminal frame.
|
|
8
|
+
* Ctrl+C cancels via AbortController.
|
|
9
|
+
*/
|
|
10
|
+
export async function verificationStatusCommand(toolCallId, opts) {
|
|
11
|
+
if (!toolCallId) {
|
|
12
|
+
throw new CliError("tool-call id is required. Example: `codespar verification-status tcl_abc123`");
|
|
13
|
+
}
|
|
14
|
+
const timeoutMs = opts.timeout ? Number(opts.timeout) : DEFAULT_TIMEOUT_MS;
|
|
15
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
|
|
16
|
+
throw new CliError("--timeout must be a positive integer (milliseconds).");
|
|
17
|
+
}
|
|
18
|
+
const userId = opts.user ?? "cli-user";
|
|
19
|
+
const cs = new CodeSpar({ apiKey: opts.apiKey, baseUrl: opts.baseUrl, projectId: opts.project });
|
|
20
|
+
const session = await cs.create(userId, { servers: [] });
|
|
21
|
+
try {
|
|
22
|
+
if (opts.stream) {
|
|
23
|
+
await runStream(session, toolCallId, timeoutMs, Boolean(opts.json));
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
const result = await session.verificationStatus(toolCallId);
|
|
27
|
+
renderResult(result, Boolean(opts.json));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
await session.close();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function runStream(session, toolCallId, timeoutMs, asJson) {
|
|
35
|
+
const controller = new AbortController();
|
|
36
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
37
|
+
const onSigint = () => {
|
|
38
|
+
warn("Aborted by user.");
|
|
39
|
+
controller.abort();
|
|
40
|
+
};
|
|
41
|
+
process.on("SIGINT", onSigint);
|
|
42
|
+
try {
|
|
43
|
+
let updates = 0;
|
|
44
|
+
const final = await session.verificationStatusStream(toolCallId, {
|
|
45
|
+
signal: controller.signal,
|
|
46
|
+
onUpdate: (envelope) => {
|
|
47
|
+
updates++;
|
|
48
|
+
if (asJson) {
|
|
49
|
+
json(envelope);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
info(`update #${updates}: verification_status=${envelope.verification_status} events=${envelope.events.length}`);
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
renderResult(final, asJson);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
if (err.name === "AbortError") {
|
|
60
|
+
throw new CliError("verification-status stream timed out or was aborted.");
|
|
61
|
+
}
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
clearTimeout(timer);
|
|
66
|
+
process.off("SIGINT", onSigint);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function renderResult(result, asJson) {
|
|
70
|
+
if (asJson) {
|
|
71
|
+
json(result);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
success(`verification_status: ${result.verification_status}`);
|
|
75
|
+
info(`tool_call_id: ${result.tool_call_id}`);
|
|
76
|
+
info(`original_status: ${result.original_status}`);
|
|
77
|
+
info(`idempotency_key: ${result.idempotency_key ?? "-"}`);
|
|
78
|
+
if (result.hosted_url)
|
|
79
|
+
info(`hosted_url: ${result.hosted_url}`);
|
|
80
|
+
info(`events: ${result.events.length}`);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=verification-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification-status.js","sourceRoot":"","sources":["../../src/commands/verification-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { CodeSpar } from "@codespar/sdk";
|
|
2
|
+
import { CliError } from "../config.js";
|
|
3
|
+
import { c, info, json, kv, success, table } from "../output.js";
|
|
4
|
+
/**
|
|
5
|
+
* Wraps `session.connectionWizard(options)`. The SDK expects a
|
|
6
|
+
* `ConnectionWizardOptions` (action defaults to "list" without a
|
|
7
|
+
* server_id, "status" with one). The CLI takes the server-id as the
|
|
8
|
+
* positional argument; pass nothing to list all connections.
|
|
9
|
+
*/
|
|
10
|
+
export async function wizardCommand(serverId, opts) {
|
|
11
|
+
if (opts.action && !["list", "status", "initiate"].includes(opts.action)) {
|
|
12
|
+
throw new CliError("--action must be one of: list, status, initiate.");
|
|
13
|
+
}
|
|
14
|
+
if (opts.environment && !["live", "test"].includes(opts.environment)) {
|
|
15
|
+
throw new CliError("--environment must be 'live' or 'test'.");
|
|
16
|
+
}
|
|
17
|
+
const wizardOpts = {};
|
|
18
|
+
if (serverId)
|
|
19
|
+
wizardOpts.server_id = serverId;
|
|
20
|
+
if (opts.action)
|
|
21
|
+
wizardOpts.action = opts.action;
|
|
22
|
+
if (opts.country)
|
|
23
|
+
wizardOpts.country = opts.country;
|
|
24
|
+
if (opts.environment)
|
|
25
|
+
wizardOpts.environment = opts.environment;
|
|
26
|
+
if (opts.returnTo)
|
|
27
|
+
wizardOpts.return_to = opts.returnTo;
|
|
28
|
+
const userId = opts.user ?? "cli-user";
|
|
29
|
+
const cs = new CodeSpar({ apiKey: opts.apiKey, baseUrl: opts.baseUrl, projectId: opts.project });
|
|
30
|
+
const session = await cs.create(userId, { servers: [] });
|
|
31
|
+
try {
|
|
32
|
+
const result = await session.connectionWizard(wizardOpts);
|
|
33
|
+
if (opts.json) {
|
|
34
|
+
json(result);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
renderWizardResult(result);
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
await session.close();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function renderWizardResult(result) {
|
|
44
|
+
if (result.action === "list") {
|
|
45
|
+
if (result.connections.length === 0) {
|
|
46
|
+
process.stderr.write(c.dim("(no connections)\n"));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
table(["SERVER", "AUTH", "STATUS", "DIFFICULTY", "CONNECTED"], result.connections.map((row) => [
|
|
50
|
+
row.server_id,
|
|
51
|
+
row.auth_type,
|
|
52
|
+
row.status,
|
|
53
|
+
row.difficulty,
|
|
54
|
+
row.connected_at ? new Date(row.connected_at).toISOString().slice(0, 10) : "-",
|
|
55
|
+
]));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (result.action === "status") {
|
|
59
|
+
if (!result.status) {
|
|
60
|
+
process.stderr.write(c.dim("(no status returned)\n"));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const s = result.status;
|
|
64
|
+
success(`${s.server_id} → ${s.status}`);
|
|
65
|
+
kv([
|
|
66
|
+
["display_name", s.display_name],
|
|
67
|
+
["auth_type", s.auth_type],
|
|
68
|
+
["difficulty", s.difficulty],
|
|
69
|
+
["connected_at", s.connected_at ?? "-"],
|
|
70
|
+
]);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (result.action === "initiate") {
|
|
74
|
+
if (!result.initiate) {
|
|
75
|
+
process.stderr.write(c.dim("(no instructions returned)\n"));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const i = result.initiate;
|
|
79
|
+
success(`${i.display_name} (${i.auth_type}) → ${i.status}`);
|
|
80
|
+
kv([
|
|
81
|
+
["server_id", i.server_id],
|
|
82
|
+
["difficulty", i.difficulty],
|
|
83
|
+
["connect_url", i.connect_url],
|
|
84
|
+
["next_action", i.next_action],
|
|
85
|
+
]);
|
|
86
|
+
if (i.required_secrets.length > 0) {
|
|
87
|
+
process.stdout.write("\n");
|
|
88
|
+
info("Required secrets:");
|
|
89
|
+
for (const s of i.required_secrets) {
|
|
90
|
+
process.stdout.write(` - ${s.name}${s.hint ? ` ${c.dim(`(${s.hint})`)}` : ""}\n`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (i.instructions.length > 0) {
|
|
94
|
+
process.stdout.write("\n");
|
|
95
|
+
info("Instructions:");
|
|
96
|
+
i.instructions.forEach((line, idx) => process.stdout.write(` ${idx + 1}. ${line}\n`));
|
|
97
|
+
}
|
|
98
|
+
if (i.known_pitfalls.length > 0) {
|
|
99
|
+
process.stdout.write("\n");
|
|
100
|
+
info("Known pitfalls:");
|
|
101
|
+
for (const p of i.known_pitfalls) {
|
|
102
|
+
process.stdout.write(` - ${p}\n`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/commands/wizard.ts"],"names":[],"mappings":"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"}
|