@codespar/cli 0.4.0 → 0.5.1
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 +4 -32
- package/dist/commands/charge.js.map +1 -1
- package/dist/commands/connect.js +30 -7
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/discover.js +1 -1
- package/dist/commands/discover.js.map +1 -1
- 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 +1 -2
- package/dist/commands/payment-status.js.map +1 -1
- package/dist/commands/ship.js +4 -32
- package/dist/commands/ship.js.map +1 -1
- package/dist/commands/spend.js +41 -0
- package/dist/commands/spend.js.map +1 -0
- package/dist/commands/verification-status.js +1 -2
- package/dist/commands/verification-status.js.map +1 -1
- package/dist/commands/wizard.js +1 -1
- package/dist/commands/wizard.js.map +1 -1
- package/dist/index.js +102 -53
- 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
package/README.md
CHANGED
|
@@ -43,6 +43,14 @@ codespar init my-agent
|
|
|
43
43
|
| `tools list` | List tools (filter by `--server`) |
|
|
44
44
|
| `tools show <name>` | Show a tool's full input/output schema |
|
|
45
45
|
| `execute <tool>` | Run a single tool call in a throwaway session |
|
|
46
|
+
| `discover <query>` | Search the catalog for tools matching a use case |
|
|
47
|
+
| `charge` | Issue an inbound charge via `codespar_charge` |
|
|
48
|
+
| `ship` | Generate label / quote rates / track via `codespar_ship` |
|
|
49
|
+
| `ledger` | Post entries / read balances / create accounts via `codespar_ledger` |
|
|
50
|
+
| `issue` | Issue / freeze / read agent spend cards via `codespar_issue` |
|
|
51
|
+
| `payment-status <id>` | Poll async settlement status (add `--stream`) |
|
|
52
|
+
| `verification-status <id>` | Poll async KYC status (add `--stream`) |
|
|
53
|
+
| `wizard [server]` | Connection wizard — required secrets, connect URL, next steps |
|
|
46
54
|
| `sessions list` | List recent sessions (filter by `--status`, `--limit`) |
|
|
47
55
|
| `sessions show <id>` | Show session details (add `--logs` for tool calls) |
|
|
48
56
|
| `sessions close <id>` | Close an active session |
|
|
@@ -59,13 +67,14 @@ codespar init my-agent
|
|
|
59
67
|
| `--json` | Machine-readable JSON output (pipe into `jq`) |
|
|
60
68
|
| `--api-key <key>` | Override the stored key |
|
|
61
69
|
| `--base-url <url>` | Point at a custom API (staging, self-hosted) |
|
|
70
|
+
| `--project <id>` | Scope requests to a project (multi-project orgs) |
|
|
62
71
|
|
|
63
72
|
## Configuration
|
|
64
73
|
|
|
65
74
|
Resolution order (first match wins):
|
|
66
75
|
|
|
67
|
-
1. Command-line flags (`--api-key`, `--base-url`)
|
|
68
|
-
2. Environment variables (`CODESPAR_API_KEY`, `CODESPAR_BASE_URL`)
|
|
76
|
+
1. Command-line flags (`--api-key`, `--base-url`, `--project`)
|
|
77
|
+
2. Environment variables (`CODESPAR_API_KEY`, `CODESPAR_BASE_URL`, `CODESPAR_PROJECT`)
|
|
69
78
|
3. Config file at `~/.codespar/config.json` (chmod 600)
|
|
70
79
|
|
|
71
80
|
## Templates
|
package/dist/api.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { CliError } from "./config.js";
|
|
2
|
+
import { VERSION } from "./version.js";
|
|
2
3
|
/**
|
|
3
4
|
* Thin fetch wrapper around the CodeSpar REST API. The SDK doesn't expose
|
|
4
5
|
* every endpoint the CLI needs (catalog listings, session bookkeeping),
|
|
@@ -6,8 +7,10 @@ import { CliError } from "./config.js";
|
|
|
6
7
|
*/
|
|
7
8
|
export class ApiClient {
|
|
8
9
|
config;
|
|
10
|
+
timeoutMs;
|
|
9
11
|
constructor(config) {
|
|
10
12
|
this.config = config;
|
|
13
|
+
this.timeoutMs = config.timeoutMs ?? 30_000;
|
|
11
14
|
}
|
|
12
15
|
async get(path, query) {
|
|
13
16
|
return this.request("GET", path, undefined, query);
|
|
@@ -26,21 +29,33 @@ export class ApiClient {
|
|
|
26
29
|
url.searchParams.set(k, v);
|
|
27
30
|
}
|
|
28
31
|
}
|
|
32
|
+
const headers = {
|
|
33
|
+
Authorization: `Bearer ${this.config.apiKey}`,
|
|
34
|
+
"Content-Type": "application/json",
|
|
35
|
+
"User-Agent": `codespar-cli/${VERSION}`,
|
|
36
|
+
};
|
|
37
|
+
if (this.config.project)
|
|
38
|
+
headers["x-codespar-project"] = this.config.project;
|
|
39
|
+
const controller = new AbortController();
|
|
40
|
+
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
29
41
|
let res;
|
|
30
42
|
try {
|
|
31
43
|
res = await fetch(url, {
|
|
32
44
|
method,
|
|
33
|
-
headers
|
|
34
|
-
Authorization: `Bearer ${this.config.apiKey}`,
|
|
35
|
-
"Content-Type": "application/json",
|
|
36
|
-
"User-Agent": "codespar-cli/0.1.0",
|
|
37
|
-
},
|
|
45
|
+
headers,
|
|
38
46
|
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
47
|
+
signal: controller.signal,
|
|
39
48
|
});
|
|
40
49
|
}
|
|
41
50
|
catch (err) {
|
|
51
|
+
if (err.name === "AbortError") {
|
|
52
|
+
throw new CliError(`Request to ${method} ${url.pathname} timed out after ${this.timeoutMs}ms.`);
|
|
53
|
+
}
|
|
42
54
|
throw new CliError(`Network error calling ${method} ${url.pathname}: ${err.message}`);
|
|
43
55
|
}
|
|
56
|
+
finally {
|
|
57
|
+
clearTimeout(timer);
|
|
58
|
+
}
|
|
44
59
|
if (!res.ok) {
|
|
45
60
|
let detail = "";
|
|
46
61
|
try {
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/charge.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import { readFile } from "node:fs/promises";
|
|
2
1
|
import { CodeSpar } from "@codespar/sdk";
|
|
3
2
|
import { CliError } from "../config.js";
|
|
4
3
|
import { info, json, success } from "../output.js";
|
|
4
|
+
import { resolveMetaInput } from "./meta-input.js";
|
|
5
|
+
const EXAMPLE = '{"amount":50,"currency":"BRL","method":"pix","description":"Test","buyer":{"name":"Ana"}}';
|
|
5
6
|
/**
|
|
6
7
|
* Wraps `session.charge(args)`. The meta-tool router picks the rail,
|
|
7
8
|
* so no `--server` is needed — we open the session with `servers: []`.
|
|
8
9
|
* Args are read from `--input` (JSON string) or `--input-file` (path).
|
|
9
10
|
*/
|
|
10
11
|
export async function chargeCommand(opts) {
|
|
11
|
-
const args = await
|
|
12
|
+
const args = (await resolveMetaInput(opts, "charge", EXAMPLE));
|
|
12
13
|
validateChargeArgs(args);
|
|
13
14
|
const userId = opts.user ?? "cli-user";
|
|
14
|
-
const cs = new CodeSpar({ apiKey: opts.apiKey, baseUrl: opts.baseUrl });
|
|
15
|
+
const cs = new CodeSpar({ apiKey: opts.apiKey, baseUrl: opts.baseUrl, projectId: opts.project });
|
|
15
16
|
const session = await cs.create(userId, { servers: [] });
|
|
16
17
|
try {
|
|
17
18
|
const result = await session.charge(args);
|
|
@@ -29,40 +30,11 @@ export async function chargeCommand(opts) {
|
|
|
29
30
|
info("Pix copy-paste:");
|
|
30
31
|
process.stdout.write(`\n${result.pix_copy_paste}\n\n`);
|
|
31
32
|
}
|
|
32
|
-
process.stdout.write(JSON.stringify(result, null, 2) + "\n");
|
|
33
33
|
}
|
|
34
34
|
finally {
|
|
35
35
|
await session.close();
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
async function resolveChargeInput(opts) {
|
|
39
|
-
if (opts.input && opts.inputFile) {
|
|
40
|
-
throw new CliError("Pass either --input or --input-file, not both.");
|
|
41
|
-
}
|
|
42
|
-
if (!opts.input && !opts.inputFile) {
|
|
43
|
-
throw new CliError("charge requires --input '<json>' or --input-file <path>. " +
|
|
44
|
-
'Example: --input \'{"amount":50,"currency":"BRL","method":"pix","description":"Test","buyer":{"name":"Ana"}}\'');
|
|
45
|
-
}
|
|
46
|
-
const raw = opts.inputFile
|
|
47
|
-
? await readFile(opts.inputFile, "utf-8")
|
|
48
|
-
: opts.input;
|
|
49
|
-
const source = opts.inputFile ?? "--input";
|
|
50
|
-
return parseJsonObject(raw, source);
|
|
51
|
-
}
|
|
52
|
-
function parseJsonObject(raw, source) {
|
|
53
|
-
try {
|
|
54
|
-
const parsed = JSON.parse(raw);
|
|
55
|
-
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
56
|
-
throw new CliError(`${source} must be a JSON object.`);
|
|
57
|
-
}
|
|
58
|
-
return parsed;
|
|
59
|
-
}
|
|
60
|
-
catch (err) {
|
|
61
|
-
if (err instanceof CliError)
|
|
62
|
-
throw err;
|
|
63
|
-
throw new CliError(`${source} is not valid JSON: ${err.message}`);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
38
|
function validateChargeArgs(args) {
|
|
67
39
|
if (typeof args.amount !== "number") {
|
|
68
40
|
throw new CliError("charge.amount must be a number (major units).");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"charge.js","sourceRoot":"","sources":["../../src/commands/charge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"charge.js","sourceRoot":"","sources":["../../src/commands/charge.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/connect.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
2
|
import { promisify } from "node:util";
|
|
3
3
|
import { CliError } from "../config.js";
|
|
4
4
|
import { info, json, success, table } from "../output.js";
|
|
5
|
-
const
|
|
5
|
+
const execFileAsync = promisify(execFile);
|
|
6
6
|
export async function listConnectionsCommand(client, opts) {
|
|
7
7
|
const data = await client.get("/v1/connections", {
|
|
8
8
|
user_id: opts.user,
|
|
@@ -94,12 +94,35 @@ export async function revokeConnectCommand(client, serverOrId, opts) {
|
|
|
94
94
|
* `xdg-open` on Linux, `start` on Windows. Intentionally minimal — we
|
|
95
95
|
* don't bring in `open`/`openurl` npm packages just for this.
|
|
96
96
|
*/
|
|
97
|
+
/**
|
|
98
|
+
* Parse + validate that `url` is a real http(s) URL before handing it to the
|
|
99
|
+
* OS browser-opener. Rejects malformed URLs and non-http(s) schemes
|
|
100
|
+
* (file://, javascript:, ...). Exported for testing.
|
|
101
|
+
*/
|
|
102
|
+
export function assertHttpUrl(url) {
|
|
103
|
+
let parsed;
|
|
104
|
+
try {
|
|
105
|
+
parsed = new URL(url);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
throw new CliError(`Refusing to open a malformed URL: ${url}`);
|
|
109
|
+
}
|
|
110
|
+
if (parsed.protocol !== "https:" && parsed.protocol !== "http:") {
|
|
111
|
+
throw new CliError(`Refusing to open a non-http(s) URL (${parsed.protocol}).`);
|
|
112
|
+
}
|
|
113
|
+
return parsed;
|
|
114
|
+
}
|
|
97
115
|
async function openInBrowser(url) {
|
|
98
|
-
|
|
99
|
-
|
|
116
|
+
// Pass the URL as a literal argv (execFile, no shell) so a Connect Link
|
|
117
|
+
// carrying shell metacharacters — `$(...)`, backticks — can't inject a
|
|
118
|
+
// command. Double-quoting it under exec() did NOT prevent that ($ and
|
|
119
|
+
// backticks are still live inside double quotes).
|
|
120
|
+
const parsed = assertHttpUrl(url);
|
|
121
|
+
const [cmd, args] = process.platform === "darwin"
|
|
122
|
+
? ["open", [parsed.href]]
|
|
100
123
|
: process.platform === "win32"
|
|
101
|
-
?
|
|
102
|
-
:
|
|
103
|
-
await
|
|
124
|
+
? ["cmd", ["/c", "start", "", parsed.href]]
|
|
125
|
+
: ["xdg-open", [parsed.href]];
|
|
126
|
+
await execFileAsync(cmd, args);
|
|
104
127
|
}
|
|
105
128
|
//# sourceMappingURL=connect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAE1D,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAyB1C,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,MAAiB,EAAE,IAAiB;IAC/E,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAgC,iBAAiB,EAAE;QAC9E,OAAO,EAAE,IAAI,CAAC,IAAI;QAClB,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvB,OAAO;IACT,CAAC;IAED,KAAK,CACH,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,EAC1D,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC1B,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG;QAC1E,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG;KACvE,CAAC,CACH,CAAC;AACJ,CAAC;AAUD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAiB,EACjB,MAAc,EACd,IAAkB;IAElB,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,QAAQ,CAAC,iEAAiE,CAAC,CAAC;IAEnG,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC;IACvC,qEAAqE;IACrE,iEAAiE;IACjE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,uCAAuC,CAAC;IAEhF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAgB,mBAAmB,EAAE;QAChE,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,MAAM;QACf,YAAY,EAAE,WAAW;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO;IACT,CAAC;IAED,IAAI,CAAC,WAAW,MAAM,aAAa,MAAM,GAAG,CAAC,CAAC;IAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,aAAa,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAElE,sEAAsE;IACtE,qEAAqE;IACrE,mEAAmE;IACnE,kEAAkE;IAClE,MAAM,UAAU,GACd,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEvD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YAChD,iDAAiD;QACnD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,0EAA0E,CAAC,CAAC;IACnF,CAAC;SAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,oEAAoE,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AAOD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAiB,EACjB,UAAkB,EAClB,IAAmB;IAEnB,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,QAAQ,CAAC,yEAAyE,CAAC,CAAC;IAE/G,wEAAwE;IACxE,sEAAsE;IACtE,0EAA0E;IAC1E,IAAI,YAAY,GAAG,UAAU,CAAC;IAC9B,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAgC,iBAAiB,EAAE;YAC9E,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,UAAU;YACrB,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,QAAQ,CAAC,oCAAoC,UAAU,eAAe,MAAM,IAAI,CAAC,CAAC;QAC9F,CAAC;QACD,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,MAAM,CAAC,IAAI,CAAC,mBAAmB,kBAAkB,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACpF,OAAO,CAAC,sBAAsB,YAAY,GAAG,CAAC,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAAC,qCAAqC,GAAG,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChE,MAAM,IAAI,QAAQ,CAAC,uCAAuC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,GAAW;IACtC,wEAAwE;IACxE,uEAAuE;IACvE,sEAAsE;IACtE,kDAAkD;IAClD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GACf,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAC3B,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC5B,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACpC,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -15,7 +15,7 @@ export async function discoverCommand(query, opts) {
|
|
|
15
15
|
throw new CliError("--limit must be a positive integer.");
|
|
16
16
|
}
|
|
17
17
|
const userId = opts.user ?? "cli-user";
|
|
18
|
-
const cs = new CodeSpar({ apiKey: opts.apiKey, baseUrl: opts.baseUrl });
|
|
18
|
+
const cs = new CodeSpar({ apiKey: opts.apiKey, baseUrl: opts.baseUrl, projectId: opts.project });
|
|
19
19
|
const session = await cs.create(userId, { servers: [] });
|
|
20
20
|
try {
|
|
21
21
|
const discoverOpts = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/commands/discover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/commands/discover.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/execute.js
CHANGED
|
@@ -13,7 +13,7 @@ export async function executeCommand(toolName, opts) {
|
|
|
13
13
|
throw new CliError("--server is required (e.g. --server asaas)");
|
|
14
14
|
const input = await resolveInput(opts);
|
|
15
15
|
const userId = opts.user ?? "cli-user";
|
|
16
|
-
const cs = new CodeSpar({ apiKey: opts.apiKey, baseUrl: opts.baseUrl });
|
|
16
|
+
const cs = new CodeSpar({ apiKey: opts.apiKey, baseUrl: opts.baseUrl, projectId: opts.project });
|
|
17
17
|
const session = await cs.create(userId, { servers: [opts.server] });
|
|
18
18
|
try {
|
|
19
19
|
const result = await session.execute(toolName, input);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
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":"card-virtual","cardholder_id":"usr_123","program_id":"afg_123"}';
|
|
6
|
+
/**
|
|
7
|
+
* Wraps `session.issue(args)` — issue a virtual/physical agent spend card,
|
|
8
|
+
* freeze/unfreeze/cancel one, or read a card's status (Pomelo). The
|
|
9
|
+
* meta-tool router resolves the rail, so no `--server`.
|
|
10
|
+
*/
|
|
11
|
+
export async function issueCommand(opts) {
|
|
12
|
+
const args = (await resolveMetaInput(opts, "issue", EXAMPLE));
|
|
13
|
+
validateIssueArgs(args);
|
|
14
|
+
const userId = opts.user ?? "cli-user";
|
|
15
|
+
const cs = new CodeSpar({
|
|
16
|
+
apiKey: opts.apiKey,
|
|
17
|
+
baseUrl: opts.baseUrl,
|
|
18
|
+
projectId: opts.project,
|
|
19
|
+
});
|
|
20
|
+
const session = await cs.create(userId, { servers: [] });
|
|
21
|
+
try {
|
|
22
|
+
const result = await session.issue(args);
|
|
23
|
+
if (opts.json) {
|
|
24
|
+
json(result);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
success(`issue ${args.action} → ${result.status ?? "ok"}`);
|
|
28
|
+
if (result.id)
|
|
29
|
+
info(`Card id: ${result.id}`);
|
|
30
|
+
if (result.card_type)
|
|
31
|
+
info(`Type: ${result.card_type}`);
|
|
32
|
+
if (result.last_four)
|
|
33
|
+
info(`Last four: ${result.last_four}`);
|
|
34
|
+
if (result.cardholder_id)
|
|
35
|
+
info(`Cardholder: ${result.cardholder_id}`);
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
await session.close();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function validateIssueArgs(args) {
|
|
42
|
+
const actions = ["card-virtual", "card-physical", "card-control", "card-get"];
|
|
43
|
+
if (!args.action || !actions.includes(args.action)) {
|
|
44
|
+
throw new CliError(`issue.action must be one of: ${actions.join(", ")}.`);
|
|
45
|
+
}
|
|
46
|
+
if (args.action === "card-virtual" || args.action === "card-physical") {
|
|
47
|
+
if (!args.cardholder_id)
|
|
48
|
+
throw new CliError("issue.cardholder_id is required to issue a card.");
|
|
49
|
+
if (!args.program_id)
|
|
50
|
+
throw new CliError("issue.program_id is required to issue a card.");
|
|
51
|
+
}
|
|
52
|
+
if (args.action === "card-physical" && !args.shipping_address) {
|
|
53
|
+
throw new CliError("issue.shipping_address is required when action=card-physical.");
|
|
54
|
+
}
|
|
55
|
+
if ((args.action === "card-control" || args.action === "card-get") && !args.card_id) {
|
|
56
|
+
throw new CliError("issue.card_id is required when action=card-control | card-get.");
|
|
57
|
+
}
|
|
58
|
+
if (args.action === "card-control" && !args.control) {
|
|
59
|
+
throw new CliError("issue.control (freeze | unfreeze | cancel) is required when action=card-control.");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=issue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue.js","sourceRoot":"","sources":["../../src/commands/issue.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;AAYnD,MAAM,OAAO,GACX,4EAA4E,CAAC;AAE/E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAyB;IAC1D,MAAM,IAAI,GAAG,CAAC,MAAM,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAyB,CAAC;IACtF,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAExB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC;IACvC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC;QACtB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS,EAAE,IAAI,CAAC,OAAO;KACxB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAEzD,IAAI,CAAC;QACH,MAAM,MAAM,GAAgB,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEtD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,CAAC;YACb,OAAO;QACT,CAAC;QAED,OAAO,CAAC,SAAS,IAAI,CAAC,MAAM,MAAM,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,EAAE;YAAE,IAAI,CAAC,YAAY,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,SAAS;YAAE,IAAI,CAAC,SAAS,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,SAAS;YAAE,IAAI,CAAC,cAAc,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,aAAa;YAAE,IAAI,CAAC,eAAe,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IACxE,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAe;IAC/C,MAAM,OAAO,GAAG,CAAC,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;IAC9E,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,QAAQ,CAAC,gCAAgC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,cAAc,IAAI,IAAI,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,MAAM,IAAI,QAAQ,CAAC,kDAAkD,CAAC,CAAC;QAChG,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,QAAQ,CAAC,+CAA+C,CAAC,CAAC;IAC5F,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,eAAe,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9D,MAAM,IAAI,QAAQ,CAAC,+DAA+D,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,cAAc,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACpF,MAAM,IAAI,QAAQ,CAAC,gEAAgE,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,cAAc,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACpD,MAAM,IAAI,QAAQ,CAAC,kFAAkF,CAAC,CAAC;IACzG,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
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":"entry","asset":"BRL","source":[{"account":"@external/BRL","amount":12500}],"destination":[{"account":"@wallet/user_1","amount":12500}],"description":"top-up"}';
|
|
6
|
+
/**
|
|
7
|
+
* Wraps `session.ledger(args)` — post a double-entry transaction, read an
|
|
8
|
+
* account balance, or create an account against the tenant's self-hosted
|
|
9
|
+
* Midaz ledger. The meta-tool router resolves the rail, so no `--server`.
|
|
10
|
+
*/
|
|
11
|
+
export async function ledgerCommand(opts) {
|
|
12
|
+
const args = (await resolveMetaInput(opts, "ledger", EXAMPLE));
|
|
13
|
+
validateLedgerArgs(args);
|
|
14
|
+
const userId = opts.user ?? "cli-user";
|
|
15
|
+
const cs = new CodeSpar({
|
|
16
|
+
apiKey: opts.apiKey,
|
|
17
|
+
baseUrl: opts.baseUrl,
|
|
18
|
+
projectId: opts.project,
|
|
19
|
+
});
|
|
20
|
+
const session = await cs.create(userId, { servers: [] });
|
|
21
|
+
try {
|
|
22
|
+
const result = await session.ledger(args);
|
|
23
|
+
if (opts.json) {
|
|
24
|
+
json(result);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
success(`ledger ${args.action} → ${result.status ?? "ok"}`);
|
|
28
|
+
if (result.id)
|
|
29
|
+
info(`Id: ${result.id}`);
|
|
30
|
+
if (result.account_id)
|
|
31
|
+
info(`Account: ${result.account_id}`);
|
|
32
|
+
if (result.alias)
|
|
33
|
+
info(`Alias: ${result.alias}`);
|
|
34
|
+
if (result.balances !== undefined) {
|
|
35
|
+
info("Balances:");
|
|
36
|
+
process.stdout.write(JSON.stringify(result.balances, null, 2) + "\n");
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
await session.close();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function validateLedgerArgs(args) {
|
|
44
|
+
if (!args.action || !["entry", "balance", "account"].includes(args.action)) {
|
|
45
|
+
throw new CliError("ledger.action must be one of: entry, balance, account.");
|
|
46
|
+
}
|
|
47
|
+
if (args.action === "entry") {
|
|
48
|
+
if (!args.asset)
|
|
49
|
+
throw new CliError("ledger.asset is required when action=entry.");
|
|
50
|
+
if (!args.source || args.source.length === 0) {
|
|
51
|
+
throw new CliError("ledger.source must be a non-empty array when action=entry.");
|
|
52
|
+
}
|
|
53
|
+
if (!args.destination || args.destination.length === 0) {
|
|
54
|
+
throw new CliError("ledger.destination must be a non-empty array when action=entry.");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (args.action === "balance" && !args.account) {
|
|
58
|
+
throw new CliError("ledger.account (id) is required when action=balance.");
|
|
59
|
+
}
|
|
60
|
+
if (args.action === "account" && !args.asset) {
|
|
61
|
+
throw new CliError("ledger.asset is required when action=account.");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/commands/ledger.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/login.js
CHANGED
|
@@ -3,6 +3,37 @@ import { stdin as input, stdout as output } from "node:process";
|
|
|
3
3
|
import { saveConfig, CliError } from "../config.js";
|
|
4
4
|
import { ApiClient } from "../api.js";
|
|
5
5
|
import { success, info } from "../output.js";
|
|
6
|
+
/**
|
|
7
|
+
* Read a secret from the TTY without echoing it. The API key is a
|
|
8
|
+
* credential — echoing it leaves the key in terminal scrollback and any
|
|
9
|
+
* screen-share. Overrides readline's `_writeToOutput` to show the prompt
|
|
10
|
+
* once and swallow the echoed keystrokes (the standard dependency-free
|
|
11
|
+
* Node password-prompt technique). On non-TTY input (a piped key) there is
|
|
12
|
+
* no echo to suppress, so we read plainly.
|
|
13
|
+
*/
|
|
14
|
+
async function promptSecret(promptText) {
|
|
15
|
+
const rl = createInterface({ input, output });
|
|
16
|
+
if (output.isTTY) {
|
|
17
|
+
const rlAny = rl;
|
|
18
|
+
let shownPrompt = false;
|
|
19
|
+
rlAny._writeToOutput = (s) => {
|
|
20
|
+
void s;
|
|
21
|
+
if (!shownPrompt) {
|
|
22
|
+
output.write(promptText);
|
|
23
|
+
shownPrompt = true;
|
|
24
|
+
}
|
|
25
|
+
// Everything after the prompt is the echoed secret — swallow it.
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
return await rl.question(promptText);
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
if (output.isTTY)
|
|
33
|
+
output.write("\n");
|
|
34
|
+
rl.close();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
6
37
|
/**
|
|
7
38
|
* Store an API key on disk. If `--api-key` is passed we use it directly;
|
|
8
39
|
* otherwise we prompt the user interactively. After saving we call
|
|
@@ -13,13 +44,7 @@ export async function loginCommand(opts) {
|
|
|
13
44
|
let apiKey = opts.apiKey;
|
|
14
45
|
if (!apiKey) {
|
|
15
46
|
info("Get your API key at https://codespar.dev/dashboard/settings?tab=api-keys");
|
|
16
|
-
|
|
17
|
-
try {
|
|
18
|
-
apiKey = (await rl.question("API key: ")).trim();
|
|
19
|
-
}
|
|
20
|
-
finally {
|
|
21
|
-
rl.close();
|
|
22
|
-
}
|
|
47
|
+
apiKey = (await promptSecret("API key: ")).trim();
|
|
23
48
|
}
|
|
24
49
|
if (!apiKey)
|
|
25
50
|
throw new CliError("API key is required.");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAO7C
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAO7C;;;;;;;GAOG;AACH,KAAK,UAAU,YAAY,CAAC,UAAkB;IAC5C,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,EAAyD,CAAC;QACxE,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,KAAK,CAAC,cAAc,GAAG,CAAC,CAAS,EAAQ,EAAE;YACzC,KAAK,CAAC,CAAC;YACP,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACzB,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;YACD,iEAAiE;QACnE,CAAC,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;YAAS,CAAC;QACT,IAAI,MAAM,CAAC,KAAK;YAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAkB;IACnD,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAEzB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,CAAC,0EAA0E,CAAC,CAAC;QACjF,MAAM,GAAG,CAAC,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,CAAC;IAED,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,QAAQ,CAAC,sBAAsB,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,QAAQ,CAChB,qFAAqF,CACtF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,0BAA0B,CAAC;IAE5F,qDAAqD;IACrD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAClD,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAiB,YAAY,CAAC,CAAC;IAE1D,MAAM,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAEtC,OAAO,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,cAAc,EAAE,CAAC,CAAC;IAC3E,IAAI,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,iBAAiB,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAiB,EAAE,MAAe;IACpE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAiB,YAAY,CAAC,CAAC;IAE1D,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QAC9C,IAAI,CAAC,EAAE,CAAC,CAAC;QACT,OAAO;IACT,CAAC;IAED,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IAC5C,EAAE,CAAC;QACD,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,WAAW,CAAC;QACtD,CAAC,cAAc,EAAE,EAAE,CAAC,YAAY,EAAE,IAAI,IAAI,QAAQ,CAAC;QACnD,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,IAAI,QAAQ,CAAC;QAC3D,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,EAAE,WAAW,IAAI,WAAW,CAAC;QAC/C,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC;KAClD,CAAC,CAAC;AACL,CAAC"}
|
package/dist/commands/logs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAqBvC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAA6D,EAC7D,IAAiB;IAEjB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,IAAI,CAAC,MAAM;QAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7D,IAAI,IAAI,CAAC,MAAM;QAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7D,IAAI,IAAI,CAAC,IAAI;QAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,IAAI,CAAC,KAAK;QAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAE1D,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YACrB,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;gBACxC,MAAM,EAAE,mBAAmB;gBAC3B,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpE;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAAC,sBAAuB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACzB,kEAAkE;QAClE,mEAAmE;QACnE,qDAAqD;QACrD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,QAAQ,CAChB,qDAAqD;gBACnD,6DAA6D;gBAC7D,+DAA+D,CAClE,CAAC;QACJ,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC7C,MAAM,IAAI,QAAQ,CAChB,gBAAgB,GAAG,CAAC,MAAM,sCAAsC;gBAC9D,mBAAmB,CACtB,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,QAAQ,CAChB,uBAAuB,GAAG,CAAC,MAAM,IAAI;YACnC,gFAAgF,CACnF,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;IAEvE,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI;YAAE,MAAM;QAEhB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAElD,mDAAmD;QACnD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,GAAG,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAE5B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,KAAK;iBACpB,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;iBACrC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAErC,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAa,CAAC;gBAC3D,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,kDAAkD;YACpD,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAe,EAAE,MAAe;IAClD,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC,KAAK,CAAC,CAAC;QACZ,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAClG,MAAM,WAAW,GACf,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACrF,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtE,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACpF,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,WAAW,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,MAAM,IAAI,CACjI,CAAC;AACJ,CAAC"}
|
|
@@ -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
|