@codespar/cli 0.6.2 → 0.8.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 +40 -0
- 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/meta-input.js +11 -0
- package/dist/commands/meta-input.js.map +1 -1
- package/dist/commands/meta-tool.js +167 -0
- package/dist/commands/meta-tool.js.map +1 -0
- package/dist/commands/resource.js +74 -0
- package/dist/commands/resource.js.map +1 -0
- 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 +113 -14
- package/dist/index.js.map +1 -1
- package/dist/output.js +100 -0
- package/dist/output.js.map +1 -1
- package/dist/surface.js +473 -0
- package/dist/surface.js.map +1 -0
- package/dist/version.js +18 -5
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -41,6 +41,19 @@ codespar spend --mandate <id> --amount 1 --agent buyer \
|
|
|
41
41
|
# ramp trade at the real rate). Omit --execute to just plan it.
|
|
42
42
|
codespar transfer shopper --from BRL --to USDC --amount 15000
|
|
43
43
|
|
|
44
|
+
# Every published meta-tool is invocable by name; the actions come from the
|
|
45
|
+
# published definition, so an unknown one is refused before anything is sent
|
|
46
|
+
codespar tools meta
|
|
47
|
+
codespar tool codespar_wallet --action balance --arg consumer_id=con_0000
|
|
48
|
+
codespar pay --action status --arg reference=pay_0000
|
|
49
|
+
|
|
50
|
+
# Resource groups are derived from the served OpenAPI document: each
|
|
51
|
+
# subcommand is one operation, its path parameters are the positionals
|
|
52
|
+
codespar sellers status slr_0000
|
|
53
|
+
codespar wallets list --query status=active
|
|
54
|
+
codespar triggers create --input '{"url":"https://example.test/hook","events":["payment.settled"]}'
|
|
55
|
+
codespar boletos list con_0000
|
|
56
|
+
|
|
44
57
|
# Manage sessions and logs
|
|
45
58
|
codespar sessions list
|
|
46
59
|
codespar logs tail --server stripe
|
|
@@ -60,6 +73,15 @@ codespar init my-agent
|
|
|
60
73
|
| `servers show <id>` | Show a server's details and tools |
|
|
61
74
|
| `tools list` | List tools (filter by `--server`) |
|
|
62
75
|
| `tools show <name>` | Show a tool's full input/output schema |
|
|
76
|
+
| `tools meta [name]` | The 15 published meta-tool definitions — actions, required input, vocabularies |
|
|
77
|
+
| `tool <name>` | Invoke any published meta-tool: `--action`, `--arg key=value`, `--input` |
|
|
78
|
+
| `pay` / `kyc` | Shorthand for `tool codespar_pay` / `tool codespar_kyc` |
|
|
79
|
+
| `consumers <sub>` | Consumers: profile, Pix keys, Pix lookups, receipts, contact verification |
|
|
80
|
+
| `boletos <sub>` | DDA: subscribe a document, list the boletos it receives |
|
|
81
|
+
| `sellers <sub>` | Sellers: onboarding status, custody, pending settlement, ledger |
|
|
82
|
+
| `mcp-servers <sub>` | Tenant MCP servers: register, validate, patch a tool, sweep platform fees |
|
|
83
|
+
| `wallets <sub>` | Wallets: balances, ledger, funding sources, execute, transfer, custody |
|
|
84
|
+
| `triggers <sub>` | Triggers (webhooks): endpoints, deliveries, DLQ, secret rotation, redelivery |
|
|
63
85
|
| `execute <tool>` | Run a single tool call in a throwaway session |
|
|
64
86
|
| `discover <query>` | Search the catalog for tools matching a use case |
|
|
65
87
|
| `mandate create` | Create a consumer mandate — the agent's allowance. `--slot CURRENCY:METHOD:CAP:PER_TX` (repeatable, e.g. `BRL:pix:50000:1500`) for a unified multi-currency wallet; per-currency caps, no FX |
|
|
@@ -91,6 +113,24 @@ codespar init my-agent
|
|
|
91
113
|
| `--base-url <url>` | Point at a custom API (staging, self-hosted) |
|
|
92
114
|
| `--project <id>` | Scope requests to a project (multi-project orgs) |
|
|
93
115
|
|
|
116
|
+
Resource-group subcommands also take `-q, --query key=value` (repeatable),
|
|
117
|
+
`--timeout <ms>`, and — when the operation declares a request body —
|
|
118
|
+
`-i, --input '<json>'` or `-f, --input-file <path>`.
|
|
119
|
+
|
|
120
|
+
## Where the commands come from
|
|
121
|
+
|
|
122
|
+
The resource groups and the meta-tool commands are not written one by one.
|
|
123
|
+
`codespar sellers`, `consumers`, `boletos`, `mcp-servers`, `wallets` and
|
|
124
|
+
`triggers` are derived from `API_OPERATIONS` — the operation table
|
|
125
|
+
`@codespar/sdk` generates from the served OpenAPI document — so a
|
|
126
|
+
subcommand is one operation, and the request behind it is the one the
|
|
127
|
+
document declares. `codespar tool <name>` reads the 15 shared meta-tool
|
|
128
|
+
definitions from `@codespar/types`: the names, the actions and the
|
|
129
|
+
required input are the published ones, checked before anything is sent.
|
|
130
|
+
|
|
131
|
+
A resource family with no command needs a written exception with a date
|
|
132
|
+
(`src/surface.ts`), and the coverage test refuses to let that list grow.
|
|
133
|
+
|
|
94
134
|
## Configuration
|
|
95
135
|
|
|
96
136
|
Resolution order (first match wins):
|
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":"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"}
|