@codespar/cli 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api.js +78 -19
- package/dist/api.js.map +1 -1
- package/dist/commands/connect.js +26 -13
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/login.js +6 -6
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logs.js +73 -77
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/mandate.js +47 -16
- package/dist/commands/mandate.js.map +1 -1
- package/dist/commands/servers.js +40 -14
- package/dist/commands/servers.js.map +1 -1
- package/dist/commands/sessions.js +50 -27
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/spend.js +4 -1
- package/dist/commands/spend.js.map +1 -1
- package/dist/commands/tools.js +38 -21
- package/dist/commands/tools.js.map +1 -1
- package/dist/commands/transfer.js +4 -1
- package/dist/commands/transfer.js.map +1 -1
- package/dist/commands/wallet.js +3 -1
- package/dist/commands/wallet.js.map +1 -1
- package/dist/commands/wizard.js +2 -2
- package/dist/commands/wizard.js.map +1 -1
- package/dist/index.js +17 -14
- package/dist/index.js.map +1 -1
- package/dist/output.js +18 -0
- package/dist/output.js.map +1 -1
- package/dist/surface.js +14 -1
- package/dist/surface.js.map +1 -1
- package/dist/version.js +18 -5
- package/dist/version.js.map +1 -1
- package/package.json +2 -2
package/dist/api.js
CHANGED
|
@@ -1,9 +1,40 @@
|
|
|
1
1
|
import { CliError } from "./config.js";
|
|
2
2
|
import { VERSION } from "./version.js";
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Expand `{name}` segments with encoded values, refusing before the request
|
|
5
|
+
* when one is missing: an unexpanded `{id}` reaches the backend as a literal
|
|
6
|
+
* and 404s in a way that reads to the user like a bad id.
|
|
7
|
+
*/
|
|
8
|
+
function expandPath(template, params) {
|
|
9
|
+
const values = params ?? {};
|
|
10
|
+
const missing = [];
|
|
11
|
+
const expanded = template.replace(/\{([^}]+)\}/g, (_, name) => {
|
|
12
|
+
const value = values[name];
|
|
13
|
+
if (value === undefined || value === null || value === "") {
|
|
14
|
+
missing.push(name);
|
|
15
|
+
return "";
|
|
16
|
+
}
|
|
17
|
+
return encodeURIComponent(String(value));
|
|
18
|
+
});
|
|
19
|
+
if (missing.length > 0) {
|
|
20
|
+
throw new CliError(`${template}: missing path parameter${missing.length > 1 ? "s" : ""} ${missing.join(", ")}.`);
|
|
21
|
+
}
|
|
22
|
+
return expanded;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The CLI's REST client, typed by the served OpenAPI document.
|
|
26
|
+
*
|
|
27
|
+
* `path` is a path TEMPLATE the document declares, and the response type is
|
|
28
|
+
* the one the document declares for it — so a route that does not exist, and
|
|
29
|
+
* a field the payload does not carry, are both compile errors rather than a
|
|
30
|
+
* 404 or a `Cannot read properties of undefined` in the user's terminal.
|
|
31
|
+
* Both had shipped: `codespar servers list` read `data.data` from a payload
|
|
32
|
+
* whose array is `servers`, and crashed for every user who ran it (core#130).
|
|
33
|
+
*
|
|
34
|
+
* It stays separate from the SDK's `cs.api`, which the derived resource
|
|
35
|
+
* commands dispatch through, for one reason: the `codespar-cli/<version>`
|
|
36
|
+
* User-Agent and the CliError message shape. The typing here is the SDK's,
|
|
37
|
+
* imported, not a second copy.
|
|
7
38
|
*/
|
|
8
39
|
export class ApiClient {
|
|
9
40
|
config;
|
|
@@ -12,21 +43,45 @@ export class ApiClient {
|
|
|
12
43
|
this.config = config;
|
|
13
44
|
this.timeoutMs = config.timeoutMs ?? 30_000;
|
|
14
45
|
}
|
|
15
|
-
|
|
16
|
-
return this.request("GET", path,
|
|
46
|
+
get(path, ...args) {
|
|
47
|
+
return this.request("GET", path, args[0]);
|
|
48
|
+
}
|
|
49
|
+
post(path, ...args) {
|
|
50
|
+
return this.request("POST", path, args[0]);
|
|
17
51
|
}
|
|
18
|
-
|
|
19
|
-
return this.request("
|
|
52
|
+
patch(path, ...args) {
|
|
53
|
+
return this.request("PATCH", path, args[0]);
|
|
20
54
|
}
|
|
21
|
-
|
|
22
|
-
return this.request("DELETE", path);
|
|
55
|
+
delete(path, ...args) {
|
|
56
|
+
return this.request("DELETE", path, args[0]);
|
|
23
57
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
58
|
+
/**
|
|
59
|
+
* Call a route the served document does not declare.
|
|
60
|
+
*
|
|
61
|
+
* Two of these exist and both are real: `POST /v1/consents/{id}/submit` and
|
|
62
|
+
* `POST /v1/consumers/{id}/wallet/transfer` answer in production (400 and
|
|
63
|
+
* 401 to an unauthenticated probe, against 404 for a route that is absent),
|
|
64
|
+
* but the OpenAPI document the backend serves never mentions them, so
|
|
65
|
+
* neither the generated table nor these types can check the call.
|
|
66
|
+
*
|
|
67
|
+
* It is deliberately not `get`/`post`: every use is debt registered in
|
|
68
|
+
* OFF_SPEC_PATHS, and the name is what makes the debt visible at the call
|
|
69
|
+
* site. The fix for each is in codespar-enterprise — declare the route —
|
|
70
|
+
* after which the call moves to the typed methods above and the entry
|
|
71
|
+
* leaves the register.
|
|
72
|
+
*/
|
|
73
|
+
offSpec(method, path, body) {
|
|
74
|
+
return this.request(method, path, body === undefined ? {} : { body });
|
|
75
|
+
}
|
|
76
|
+
async request(method, template, options = {}) {
|
|
77
|
+
const url = new URL(expandPath(template, options.path), this.config.baseUrl);
|
|
78
|
+
for (const [key, value] of Object.entries(options.query ?? {})) {
|
|
79
|
+
if (value === undefined || value === null)
|
|
80
|
+
continue;
|
|
81
|
+
for (const item of Array.isArray(value) ? value : [value]) {
|
|
82
|
+
if (item === undefined || item === null)
|
|
83
|
+
continue;
|
|
84
|
+
url.searchParams.append(key, typeof item === "object" ? JSON.stringify(item) : String(item));
|
|
30
85
|
}
|
|
31
86
|
}
|
|
32
87
|
const headers = {
|
|
@@ -36,20 +91,25 @@ export class ApiClient {
|
|
|
36
91
|
};
|
|
37
92
|
if (this.config.project)
|
|
38
93
|
headers["x-codespar-project"] = this.config.project;
|
|
94
|
+
for (const [key, value] of Object.entries(options.header ?? {})) {
|
|
95
|
+
if (value !== undefined && value !== null)
|
|
96
|
+
headers[key] = String(value);
|
|
97
|
+
}
|
|
98
|
+
const timeoutMs = options.timeout ?? this.timeoutMs;
|
|
39
99
|
const controller = new AbortController();
|
|
40
|
-
const timer = setTimeout(() => controller.abort(),
|
|
100
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
41
101
|
let res;
|
|
42
102
|
try {
|
|
43
103
|
res = await fetch(url, {
|
|
44
104
|
method,
|
|
45
105
|
headers,
|
|
46
|
-
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
106
|
+
body: options.body !== undefined ? JSON.stringify(options.body) : undefined,
|
|
47
107
|
signal: controller.signal,
|
|
48
108
|
});
|
|
49
109
|
}
|
|
50
110
|
catch (err) {
|
|
51
111
|
if (err.name === "AbortError") {
|
|
52
|
-
throw new CliError(`Request to ${method} ${url.pathname} timed out after ${
|
|
112
|
+
throw new CliError(`Request to ${method} ${url.pathname} timed out after ${timeoutMs}ms.`);
|
|
53
113
|
}
|
|
54
114
|
throw new CliError(`Network error calling ${method} ${url.pathname}: ${err.message}`);
|
|
55
115
|
}
|
|
@@ -76,7 +136,6 @@ export class ApiClient {
|
|
|
76
136
|
const prefix = `${method} ${url.pathname} → ${res.status}`;
|
|
77
137
|
throw new CliError(detail ? `${prefix}: ${detail}` : prefix);
|
|
78
138
|
}
|
|
79
|
-
// 204 No Content
|
|
80
139
|
if (res.status === 204)
|
|
81
140
|
return undefined;
|
|
82
141
|
return (await res.json());
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/connect.js
CHANGED
|
@@ -1,12 +1,25 @@
|
|
|
1
1
|
import { execFile } from "node:child_process";
|
|
2
2
|
import { promisify } from "node:util";
|
|
3
3
|
import { CliError } from "../config.js";
|
|
4
|
-
import { info, json, success, table } from "../output.js";
|
|
4
|
+
import { info, isoDay, json, success, table } from "../output.js";
|
|
5
5
|
const execFileAsync = promisify(execFile);
|
|
6
|
+
/**
|
|
7
|
+
* The connection statuses the listing declares. Assigned into the query below,
|
|
8
|
+
* so a vocabulary change on the API is a type error here. `--status revogada`
|
|
9
|
+
* used to travel to the server as-is.
|
|
10
|
+
*/
|
|
11
|
+
const CONNECTION_STATUSES = ["pending", "connected", "revoked", "expired"];
|
|
12
|
+
function parseStatus(raw) {
|
|
13
|
+
if (raw === undefined)
|
|
14
|
+
return undefined;
|
|
15
|
+
if (!CONNECTION_STATUSES.includes(raw)) {
|
|
16
|
+
throw new CliError(`--status expects one of ${CONNECTION_STATUSES.join(", ")}, got "${raw}".`);
|
|
17
|
+
}
|
|
18
|
+
return raw;
|
|
19
|
+
}
|
|
6
20
|
export async function listConnectionsCommand(client, opts) {
|
|
7
21
|
const data = await client.get("/v1/connections", {
|
|
8
|
-
user_id: opts.user,
|
|
9
|
-
status: opts.status,
|
|
22
|
+
query: { user_id: opts.user, status: parseStatus(opts.status) },
|
|
10
23
|
});
|
|
11
24
|
if (opts.json) {
|
|
12
25
|
json(data.connections);
|
|
@@ -17,8 +30,8 @@ export async function listConnectionsCommand(client, opts) {
|
|
|
17
30
|
c.server_id,
|
|
18
31
|
c.user_id,
|
|
19
32
|
c.status,
|
|
20
|
-
|
|
21
|
-
|
|
33
|
+
isoDay(c.connected_at),
|
|
34
|
+
isoDay(c.expires_at),
|
|
22
35
|
]));
|
|
23
36
|
}
|
|
24
37
|
/**
|
|
@@ -34,10 +47,12 @@ export async function startConnectCommand(client, server, opts) {
|
|
|
34
47
|
// a hosted UI. Users with a real app should pass --redirect-uri.
|
|
35
48
|
const redirectUri = opts.redirectUri ?? "http://localhost:3000/connect/success";
|
|
36
49
|
const res = await client.post("/v1/connect/start", {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
50
|
+
body: {
|
|
51
|
+
server_id: server,
|
|
52
|
+
user_id: userId,
|
|
53
|
+
redirect_uri: redirectUri,
|
|
54
|
+
scopes: opts.scopes,
|
|
55
|
+
},
|
|
41
56
|
});
|
|
42
57
|
if (opts.json) {
|
|
43
58
|
json(res);
|
|
@@ -77,16 +92,14 @@ export async function revokeConnectCommand(client, serverOrId, opts) {
|
|
|
77
92
|
if (!serverOrId.startsWith("ca_")) {
|
|
78
93
|
const userId = opts.user ?? "cli-user";
|
|
79
94
|
const list = await client.get("/v1/connections", {
|
|
80
|
-
user_id: userId,
|
|
81
|
-
server_id: serverOrId,
|
|
82
|
-
status: "connected",
|
|
95
|
+
query: { user_id: userId, server_id: serverOrId, status: "connected" },
|
|
83
96
|
});
|
|
84
97
|
if (list.connections.length === 0) {
|
|
85
98
|
throw new CliError(`No active connection for server "${serverOrId}" and user "${userId}".`);
|
|
86
99
|
}
|
|
87
100
|
connectionId = list.connections[0].id;
|
|
88
101
|
}
|
|
89
|
-
await client.post(
|
|
102
|
+
await client.post("/v1/connections/{id}/revoke", { path: { id: connectionId } });
|
|
90
103
|
success(`Revoked connection ${connectionId}.`);
|
|
91
104
|
}
|
|
92
105
|
/**
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/login.js
CHANGED
|
@@ -56,7 +56,7 @@ export async function loginCommand(opts) {
|
|
|
56
56
|
const client = new ApiClient({ apiKey, baseUrl });
|
|
57
57
|
const me = await client.get("/v1/whoami");
|
|
58
58
|
await saveConfig({ apiKey, baseUrl });
|
|
59
|
-
success(`Logged in as ${me.user?.email ??
|
|
59
|
+
success(`Logged in as ${me.user?.email ?? "unknown user"}`);
|
|
60
60
|
if (me.organization?.name) {
|
|
61
61
|
info(`Organization: ${me.organization.name}`);
|
|
62
62
|
}
|
|
@@ -70,11 +70,11 @@ export async function whoamiCommand(client, asJson) {
|
|
|
70
70
|
}
|
|
71
71
|
const { kv } = await import("../output.js");
|
|
72
72
|
kv([
|
|
73
|
-
["User", me.user?.email ??
|
|
74
|
-
["Organization", me.organization
|
|
75
|
-
["Project", me.project
|
|
76
|
-
["Key env", me.key
|
|
77
|
-
["Scopes", me.key
|
|
73
|
+
["User", me.user?.email ?? "(unknown)"],
|
|
74
|
+
["Organization", me.organization.name ?? "(none)"],
|
|
75
|
+
["Project", me.project.name ?? me.project.id],
|
|
76
|
+
["Key env", me.key.environment ?? "(unknown)"],
|
|
77
|
+
["Scopes", me.key.scopes.join(", ") || "(all)"],
|
|
78
78
|
]);
|
|
79
79
|
}
|
|
80
80
|
//# sourceMappingURL=login.js.map
|
|
@@ -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;;;;;;;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,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/logs.js
CHANGED
|
@@ -1,88 +1,84 @@
|
|
|
1
1
|
import { CliError } from "../config.js";
|
|
2
|
-
import { c, json } from "../output.js";
|
|
3
|
-
/**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
if (
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
url.searchParams.set("tool", opts.tool);
|
|
16
|
-
if (opts.limit)
|
|
17
|
-
url.searchParams.set("limit", opts.limit);
|
|
18
|
-
let res;
|
|
19
|
-
try {
|
|
20
|
-
res = await fetch(url, {
|
|
21
|
-
headers: {
|
|
22
|
-
Authorization: `Bearer ${config.apiKey}`,
|
|
23
|
-
Accept: "text/event-stream",
|
|
24
|
-
...(config.project ? { "x-codespar-project": config.project } : {}),
|
|
25
|
-
},
|
|
26
|
-
});
|
|
2
|
+
import { c, isoTime, json } from "../output.js";
|
|
3
|
+
/** The filters the API cannot apply. Kept client-side, and counted out loud. */
|
|
4
|
+
export function applyFilters(rows, opts) {
|
|
5
|
+
return rows.filter((row) => (!opts.server || row.server_id === opts.server) &&
|
|
6
|
+
(!opts.status || row.status === opts.status) &&
|
|
7
|
+
(!opts.tool || row.tool_name === opts.tool));
|
|
8
|
+
}
|
|
9
|
+
function parseLimit(raw) {
|
|
10
|
+
if (raw === undefined)
|
|
11
|
+
return 20;
|
|
12
|
+
const value = Number(raw);
|
|
13
|
+
if (!Number.isInteger(value) || value <= 0) {
|
|
14
|
+
throw new CliError(`--limit expects a positive whole number, got "${raw}".`);
|
|
27
15
|
}
|
|
28
|
-
|
|
29
|
-
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
export async function tailLogsCommand(client, opts) {
|
|
19
|
+
const limit = parseLimit(opts.limit);
|
|
20
|
+
const filtered = Boolean(opts.server || opts.status || opts.tool);
|
|
21
|
+
const page = await fetchPage(client, { limit });
|
|
22
|
+
const rows = [...page].reverse(); // newest-first from the API; read oldest-first
|
|
23
|
+
const shown = applyFilters(rows, opts);
|
|
24
|
+
for (const row of shown)
|
|
25
|
+
printRow(row, opts.json ?? false);
|
|
26
|
+
if (!opts.json && filtered) {
|
|
27
|
+
// The API takes no server/status/tool filter, so these are applied to the
|
|
28
|
+
// page that was fetched. Saying which page keeps "no matches" from
|
|
29
|
+
// reading as "nothing happened".
|
|
30
|
+
process.stderr.write(c.dim(`\n${shown.length} of the ${rows.length} most recent tool calls match the filters.\n`));
|
|
30
31
|
}
|
|
31
|
-
if (!
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
"use `codespar sessions show <id> --logs` for a one-shot dump.");
|
|
39
|
-
}
|
|
40
|
-
if (res.status === 401 || res.status === 403) {
|
|
41
|
-
throw new CliError(`Auth failed (${res.status}). Check CODESPAR_API_KEY or re-run ` +
|
|
42
|
-
"`codespar login`.");
|
|
43
|
-
}
|
|
44
|
-
throw new CliError(`Log stream returned ${res.status}. ` +
|
|
45
|
-
"Try again; if it persists, report at github.com/codespar/codespar-core/issues.");
|
|
32
|
+
if (!opts.follow)
|
|
33
|
+
return;
|
|
34
|
+
const interval = opts.intervalMs ?? 3000;
|
|
35
|
+
const seen = new Set(rows.map((row) => row.id));
|
|
36
|
+
let since = newestTimestamp(rows);
|
|
37
|
+
if (!opts.json) {
|
|
38
|
+
process.stderr.write(c.dim(`\nPolling every ${Math.round(interval / 1000)}s — press Ctrl-C to stop\n\n`));
|
|
46
39
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const frames = buffer.split("\n\n");
|
|
58
|
-
buffer = frames.pop() ?? "";
|
|
59
|
-
for (const frame of frames) {
|
|
60
|
-
const dataLines = frame
|
|
61
|
-
.split("\n")
|
|
62
|
-
.filter((l) => l.startsWith("data: "))
|
|
63
|
-
.map((l) => l.slice(6));
|
|
64
|
-
if (dataLines.length === 0)
|
|
65
|
-
continue;
|
|
66
|
-
try {
|
|
67
|
-
const entry = JSON.parse(dataLines.join("\n"));
|
|
68
|
-
printEntry(entry, opts.json ?? false);
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
// Ignore malformed frames (keep-alives, comments)
|
|
72
|
-
}
|
|
73
|
-
}
|
|
40
|
+
for (;;) {
|
|
41
|
+
await sleep(interval);
|
|
42
|
+
const next = await fetchPage(client, { limit, since });
|
|
43
|
+
// `since` is inclusive, so the row it names comes back on every poll.
|
|
44
|
+
const fresh = [...next].reverse().filter((row) => !seen.has(row.id));
|
|
45
|
+
for (const row of applyFilters(fresh, opts))
|
|
46
|
+
printRow(row, opts.json ?? false);
|
|
47
|
+
for (const row of fresh)
|
|
48
|
+
seen.add(row.id);
|
|
49
|
+
since = newestTimestamp(fresh) ?? since;
|
|
74
50
|
}
|
|
75
51
|
}
|
|
76
|
-
function
|
|
52
|
+
function newestTimestamp(rows) {
|
|
53
|
+
let newest;
|
|
54
|
+
for (const row of rows) {
|
|
55
|
+
if (row.called_at && (newest === undefined || row.called_at > newest))
|
|
56
|
+
newest = row.called_at;
|
|
57
|
+
}
|
|
58
|
+
return newest;
|
|
59
|
+
}
|
|
60
|
+
async function fetchPage(client, query) {
|
|
61
|
+
const data = await client.get("/v1/tool-calls", { query });
|
|
62
|
+
// The operation also answers `{ total }` when called with count_only; this
|
|
63
|
+
// command never asks for that, and the narrowing says so rather than
|
|
64
|
+
// assuming it.
|
|
65
|
+
if (!("tool_calls" in data))
|
|
66
|
+
return [];
|
|
67
|
+
return data.tool_calls;
|
|
68
|
+
}
|
|
69
|
+
function sleep(ms) {
|
|
70
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
71
|
+
}
|
|
72
|
+
function printRow(row, asJson) {
|
|
77
73
|
if (asJson) {
|
|
78
|
-
json(
|
|
74
|
+
json(row);
|
|
79
75
|
return;
|
|
80
76
|
}
|
|
81
|
-
const time =
|
|
82
|
-
const
|
|
83
|
-
const
|
|
84
|
-
const
|
|
85
|
-
const suffix =
|
|
86
|
-
process.stdout.write(`${c.gray(time)} ${
|
|
77
|
+
const time = isoTime(row.called_at);
|
|
78
|
+
const status = row.status ?? "unknown";
|
|
79
|
+
const colour = status === "success" ? c.green : status === "error" ? c.red : c.yellow;
|
|
80
|
+
const duration = row.duration_ms !== undefined && row.duration_ms !== null ? `${row.duration_ms}ms` : "";
|
|
81
|
+
const suffix = row.error_code ? ` ${c.red(row.error_code)}` : "";
|
|
82
|
+
process.stdout.write(`${c.gray(time)} ${colour(status.toUpperCase().padEnd(7))} ${row.tool_name.padEnd(24)} ${c.dim((row.server_id ?? "-").padEnd(16))} ${c.dim(duration)}${suffix}\n`);
|
|
87
83
|
}
|
|
88
84
|
//# sourceMappingURL=logs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAsChD,gFAAgF;AAChF,MAAM,UAAU,YAAY,CAAC,IAA4B,EAAE,IAAiB;IAC1E,OAAO,IAAI,CAAC,MAAM,CAChB,CAAC,GAAG,EAAE,EAAE,CACN,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,MAAM,CAAC;QAC/C,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;QAC5C,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,IAAI,CAAC,CAC9C,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,GAAuB;IACzC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,QAAQ,CAAC,iDAAiD,GAAG,IAAI,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAiB,EAAE,IAAiB;IACxE,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IAElE,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,+CAA+C;IACjF,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAEvC,KAAK,MAAM,GAAG,IAAI,KAAK;QAAE,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC;IAE3D,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC3B,0EAA0E;QAC1E,mEAAmE;QACnE,iCAAiC;QACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,CAAC,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,WAAW,IAAI,CAAC,MAAM,8CAA8C,CAAC,CAC7F,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO;IAEzB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,IAAI,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,CAAC,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,8BAA8B,CAAC,CACpF,CAAC;IACJ,CAAC;IAED,SAAS,CAAC;QACR,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,sEAAsE;QACtE,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACrE,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC;YAAE,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC;QAC/E,KAAK,MAAM,GAAG,IAAI,KAAK;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1C,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAA4B;IACnD,IAAI,MAA0B,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,SAAS,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC;YAAE,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC;IAChG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,MAAiB,EACjB,KAAwC;IAExC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,2EAA2E;IAC3E,qEAAqE;IACrE,eAAe;IACf,IAAI,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,OAAO,IAAI,CAAC,UAAU,CAAC;AACzB,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,QAAQ,CAAC,GAAgB,EAAE,MAAe;IACjD,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,SAAS,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACtF,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACzG,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,MAAM,IAAI,CACtK,CAAC;AACJ,CAAC"}
|
package/dist/commands/mandate.js
CHANGED
|
@@ -1,6 +1,28 @@
|
|
|
1
1
|
import { ApiClient } from "../api.js";
|
|
2
2
|
import { CliError } from "../config.js";
|
|
3
3
|
import { info, json, kv, success } from "../output.js";
|
|
4
|
+
/**
|
|
5
|
+
* The currencies and pin kinds the consent intent declares.
|
|
6
|
+
*
|
|
7
|
+
* Written here as `const`, and assigned into the request body below, so the
|
|
8
|
+
* compiler compares them with the document's own enum on every build: a
|
|
9
|
+
* currency the API drops, or one it adds, shows up as a type error rather
|
|
10
|
+
* than as a 400 the user sees at the end of a mandate ceremony.
|
|
11
|
+
*/
|
|
12
|
+
const CURRENCIES = ["BRL", "USD", "MXN", "COP", "ARS", "USDC", "BRLA"];
|
|
13
|
+
const PIN_KINDS = ["pix-key", "merchant-id", "mcc"];
|
|
14
|
+
function parseCurrency(raw, where) {
|
|
15
|
+
if (!CURRENCIES.includes(raw)) {
|
|
16
|
+
throw new CliError(`${where} expects one of ${CURRENCIES.join(", ")}, got "${raw}".`);
|
|
17
|
+
}
|
|
18
|
+
return raw;
|
|
19
|
+
}
|
|
20
|
+
function parsePinKind(raw) {
|
|
21
|
+
if (!PIN_KINDS.includes(raw)) {
|
|
22
|
+
throw new CliError(`--pin-kind expects one of ${PIN_KINDS.join(", ")}, got "${raw}".`);
|
|
23
|
+
}
|
|
24
|
+
return raw;
|
|
25
|
+
}
|
|
4
26
|
/**
|
|
5
27
|
* Parse `--slot CURRENCY:RAIL:CAP:PER_TX_CAP` specs into the intent.slots shape.
|
|
6
28
|
* Rails never contain a colon (e.g. usdc-onchain, pix-celcoin), so a 4-way
|
|
@@ -24,7 +46,12 @@ function parseSlots(specs) {
|
|
|
24
46
|
if (!Number.isInteger(per_tx_cap_minor) || per_tx_cap_minor <= 0) {
|
|
25
47
|
throw new CliError(`--slot ${spec}: per-tx cap must be a positive integer (minor units).`);
|
|
26
48
|
}
|
|
27
|
-
return {
|
|
49
|
+
return {
|
|
50
|
+
currency: parseCurrency(currency, `--slot ${spec}`),
|
|
51
|
+
rail,
|
|
52
|
+
cap_minor,
|
|
53
|
+
per_tx_cap_minor,
|
|
54
|
+
};
|
|
28
55
|
});
|
|
29
56
|
}
|
|
30
57
|
/**
|
|
@@ -79,7 +106,7 @@ export async function mandateCreateCommand(opts) {
|
|
|
79
106
|
else {
|
|
80
107
|
primaryCapMinor = Number(opts.cap);
|
|
81
108
|
primaryPerTxMinor = Number(opts.perTxCap);
|
|
82
|
-
primaryCurrency = opts.currency;
|
|
109
|
+
primaryCurrency = parseCurrency(opts.currency, "--currency");
|
|
83
110
|
if (!Number.isInteger(primaryCapMinor) || primaryCapMinor <= 0) {
|
|
84
111
|
throw new CliError("--cap must be a positive integer in minor units (or use --slot for a multi-currency mandate).");
|
|
85
112
|
}
|
|
@@ -93,27 +120,31 @@ export async function mandateCreateCommand(opts) {
|
|
|
93
120
|
project: opts.project,
|
|
94
121
|
});
|
|
95
122
|
// 1. Mint the consent token (authed). slots ride along in the intent.
|
|
96
|
-
|
|
97
|
-
purpose: opts.purpose,
|
|
98
|
-
cap_minor: primaryCapMinor,
|
|
99
|
-
per_tx_cap_minor: primaryPerTxMinor,
|
|
100
|
-
currency: primaryCurrency,
|
|
101
|
-
mandate_ttl_seconds: ttl,
|
|
102
|
-
merchant_allowlist: allowlist,
|
|
103
|
-
merchant_pin_kind: opts.pinKind,
|
|
104
|
-
};
|
|
105
|
-
if (slots)
|
|
106
|
-
intent.slots = slots;
|
|
123
|
+
// The body is built inline so the document checks every field of it.
|
|
107
124
|
const init = await client.post("/v1/consents/init", {
|
|
108
|
-
|
|
109
|
-
|
|
125
|
+
body: {
|
|
126
|
+
agent_id: opts.agent,
|
|
127
|
+
intent: {
|
|
128
|
+
purpose: opts.purpose,
|
|
129
|
+
cap_minor: primaryCapMinor,
|
|
130
|
+
per_tx_cap_minor: primaryPerTxMinor,
|
|
131
|
+
currency: primaryCurrency,
|
|
132
|
+
mandate_ttl_seconds: ttl,
|
|
133
|
+
merchant_allowlist: allowlist,
|
|
134
|
+
merchant_pin_kind: parsePinKind(opts.pinKind),
|
|
135
|
+
...(slots ? { slots } : {}),
|
|
136
|
+
},
|
|
137
|
+
},
|
|
110
138
|
});
|
|
111
139
|
// 2. Submit the consumer side → funding source(s) + signed mandate (public;
|
|
112
140
|
// the token in the URL is the auth, so an extra bearer header is ignored).
|
|
113
141
|
// For a multi-slot mandate the backend derives one funding source per slot
|
|
114
142
|
// from intent.slots; the rail/provider_token here only satisfy the submit
|
|
115
143
|
// schema (a valid rail value), so the --rail default is fine.
|
|
116
|
-
|
|
144
|
+
// `POST /v1/consents/{token}/submit` answers in production but the served
|
|
145
|
+
// OpenAPI document does not declare it, so this call cannot be checked by
|
|
146
|
+
// the generated table. It is one of the two entries in OFF_SPEC_PATHS.
|
|
147
|
+
const submit = await client.offSpec("POST", `/v1/consents/${encodeURIComponent(init.token)}/submit`, {
|
|
117
148
|
consumer_id: opts.consumer,
|
|
118
149
|
rail: opts.rail,
|
|
119
150
|
provider_token: opts.providerToken ?? `${opts.rail}:${opts.consumer}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mandate.js","sourceRoot":"","sources":["../../src/commands/mandate.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,EAAE,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"mandate.js","sourceRoot":"","sources":["../../src/commands/mandate.ts"],"names":[],"mappings":"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"}
|