@paysponge/sdk 0.1.39 → 0.1.41
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 +12 -0
- package/dist/api/generated/openapi/apis/default-api.d.ts +62 -0
- package/dist/api/generated/openapi/apis/default-api.d.ts.map +1 -1
- package/dist/api/generated/openapi/apis/default-api.js +60 -0
- package/dist/api/generated/openapi/apis/default-api.js.map +1 -1
- package/dist/auth/device-flow.d.ts.map +1 -1
- package/dist/auth/device-flow.js +87 -57
- package/dist/auth/device-flow.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +88 -2
- package/dist/cli.js.map +1 -1
- package/dist/telemetry.d.ts +49 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +156 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-flow.d.ts","sourceRoot":"","sources":["../../src/auth/device-flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,aAAa,EAEnB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"device-flow.d.ts","sourceRoot":"","sources":["../../src/auth/device-flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,aAAa,EAEnB,MAAM,qBAAqB,CAAC;AAU7B,MAAM,WAAW,iBAAiB;IAChC,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wBAAwB;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC7B,4CAA4C;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,aAAa,CAAC,CA4GxB"}
|
package/dist/auth/device-flow.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DeviceCodeResponseSchema, TokenResponseSchema, } from "../types/schemas.js";
|
|
2
2
|
import { saveCredentials, getCredentialsPath } from "./credentials.js";
|
|
3
|
+
import { captureCliAuthEvent, classifyBaseUrl, sanitizeErrorForTelemetry, } from "../telemetry.js";
|
|
3
4
|
const DEFAULT_BASE_URL = "https://api.wallet.paysponge.com";
|
|
4
5
|
/**
|
|
5
6
|
* Start the OAuth Device Flow authentication
|
|
@@ -13,70 +14,99 @@ const DEFAULT_BASE_URL = "https://api.wallet.paysponge.com";
|
|
|
13
14
|
*/
|
|
14
15
|
export async function deviceFlowAuth(options = {}) {
|
|
15
16
|
const baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;
|
|
16
|
-
|
|
17
|
-
console.log("Starting authentication...\n");
|
|
18
|
-
const deviceCodeResponse = await requestDeviceCode(baseUrl, {
|
|
19
|
-
testnet: options.testnet,
|
|
20
|
-
agentName: options.agentName,
|
|
21
|
-
keyType: options.keyType,
|
|
22
|
-
email: options.email,
|
|
23
|
-
});
|
|
24
|
-
// Step 2: Display instructions and optionally open browser
|
|
25
|
-
console.log("To authenticate, visit:");
|
|
26
|
-
console.log(` ${deviceCodeResponse.verificationUri}\n`);
|
|
27
|
-
console.log(`Enter this code: ${deviceCodeResponse.userCode}\n`);
|
|
28
|
-
// Try to copy to clipboard
|
|
17
|
+
const startedAt = Date.now();
|
|
29
18
|
try {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
19
|
+
// Step 1: Request device code
|
|
20
|
+
console.log("Starting authentication...\n");
|
|
21
|
+
const deviceCodeResponse = await requestDeviceCode(baseUrl, {
|
|
22
|
+
testnet: options.testnet,
|
|
23
|
+
agentName: options.agentName,
|
|
24
|
+
keyType: options.keyType,
|
|
25
|
+
email: options.email,
|
|
26
|
+
});
|
|
27
|
+
// Step 2: Display instructions and optionally open browser
|
|
28
|
+
console.log("To authenticate, visit:");
|
|
29
|
+
console.log(` ${deviceCodeResponse.verificationUri}\n`);
|
|
30
|
+
console.log(`Enter this code: ${deviceCodeResponse.userCode}\n`);
|
|
31
|
+
// Try to copy to clipboard
|
|
39
32
|
try {
|
|
40
|
-
const
|
|
41
|
-
await
|
|
42
|
-
console.log("
|
|
33
|
+
const clipboardy = await import("clipboardy");
|
|
34
|
+
await clipboardy.default.write(deviceCodeResponse.userCode);
|
|
35
|
+
console.log("(Code copied to clipboard)\n");
|
|
43
36
|
}
|
|
44
37
|
catch {
|
|
45
|
-
//
|
|
38
|
+
// Clipboard not available, that's fine
|
|
46
39
|
}
|
|
40
|
+
// Try to open browser
|
|
41
|
+
if (!options.noBrowser) {
|
|
42
|
+
try {
|
|
43
|
+
const open = await import("open");
|
|
44
|
+
await open.default(deviceCodeResponse.verificationUri);
|
|
45
|
+
console.log("Opening browser...\n");
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Browser not available, that's fine
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
console.log("Waiting for approval...");
|
|
52
|
+
// Step 3: Poll for token
|
|
53
|
+
const tokenResponse = await pollForToken(baseUrl, deviceCodeResponse.deviceCode, deviceCodeResponse.interval, deviceCodeResponse.expiresIn);
|
|
54
|
+
// Step 4: Save credentials (only for agent keys with agentId)
|
|
55
|
+
if (tokenResponse.agentId) {
|
|
56
|
+
const credentials = {
|
|
57
|
+
apiKey: tokenResponse.apiKey,
|
|
58
|
+
agentId: tokenResponse.agentId,
|
|
59
|
+
testnet: options.testnet,
|
|
60
|
+
createdAt: new Date(),
|
|
61
|
+
baseUrl: baseUrl !== DEFAULT_BASE_URL ? baseUrl : undefined,
|
|
62
|
+
};
|
|
63
|
+
saveCredentials(credentials, options.credentialsPath);
|
|
64
|
+
}
|
|
65
|
+
// Step 5: Display success message with API key
|
|
66
|
+
const isMaster = options.keyType === "master";
|
|
67
|
+
console.log("\n" + "=".repeat(60));
|
|
68
|
+
console.log("Authentication successful!\n");
|
|
69
|
+
console.log(`Your ${isMaster ? "master " : ""}API key: ${tokenResponse.apiKey}\n`);
|
|
70
|
+
if (isMaster) {
|
|
71
|
+
console.log("Use this key to create agents programmatically:");
|
|
72
|
+
console.log(" - Set SPONGE_MASTER_KEY environment variable, or");
|
|
73
|
+
console.log(" - Use as Bearer token with POST /api/agents\n");
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.log("Save this key for other machines/deployments:");
|
|
77
|
+
console.log(" - Set SPONGE_API_KEY environment variable, or");
|
|
78
|
+
console.log(" - Pass directly: SpongeWallet.connect({ apiKey: '...' })\n");
|
|
79
|
+
console.log(`Key cached locally at ${getCredentialsPath(options.credentialsPath)}`);
|
|
80
|
+
}
|
|
81
|
+
console.log("=".repeat(60) + "\n");
|
|
82
|
+
await captureCliAuthEvent({
|
|
83
|
+
status: "succeeded",
|
|
84
|
+
auth_flow: "device_code",
|
|
85
|
+
duration_ms: Date.now() - startedAt,
|
|
86
|
+
key_type: options.keyType === "master" ? "master" : "agent",
|
|
87
|
+
no_browser: Boolean(options.noBrowser),
|
|
88
|
+
has_email: Boolean(options.email),
|
|
89
|
+
has_agent_name: Boolean(options.agentName),
|
|
90
|
+
base_url_kind: classifyBaseUrl(baseUrl),
|
|
91
|
+
credentials_cached: Boolean(tokenResponse.agentId),
|
|
92
|
+
}, options.credentialsPath);
|
|
93
|
+
return tokenResponse;
|
|
47
94
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
// Step 5: Display success message with API key
|
|
63
|
-
const isMaster = options.keyType === "master";
|
|
64
|
-
console.log("\n" + "=".repeat(60));
|
|
65
|
-
console.log("Authentication successful!\n");
|
|
66
|
-
console.log(`Your ${isMaster ? "master " : ""}API key: ${tokenResponse.apiKey}\n`);
|
|
67
|
-
if (isMaster) {
|
|
68
|
-
console.log("Use this key to create agents programmatically:");
|
|
69
|
-
console.log(" - Set SPONGE_MASTER_KEY environment variable, or");
|
|
70
|
-
console.log(" - Use as Bearer token with POST /api/agents\n");
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
console.log("Save this key for other machines/deployments:");
|
|
74
|
-
console.log(" - Set SPONGE_API_KEY environment variable, or");
|
|
75
|
-
console.log(" - Pass directly: SpongeWallet.connect({ apiKey: '...' })\n");
|
|
76
|
-
console.log(`Key cached locally at ${getCredentialsPath(options.credentialsPath)}`);
|
|
95
|
+
catch (error) {
|
|
96
|
+
await captureCliAuthEvent({
|
|
97
|
+
status: "failed",
|
|
98
|
+
auth_flow: "device_code",
|
|
99
|
+
duration_ms: Date.now() - startedAt,
|
|
100
|
+
key_type: options.keyType === "master" ? "master" : "agent",
|
|
101
|
+
no_browser: Boolean(options.noBrowser),
|
|
102
|
+
has_email: Boolean(options.email),
|
|
103
|
+
has_agent_name: Boolean(options.agentName),
|
|
104
|
+
base_url_kind: classifyBaseUrl(baseUrl),
|
|
105
|
+
credentials_cached: false,
|
|
106
|
+
...sanitizeErrorForTelemetry(error),
|
|
107
|
+
}, options.credentialsPath);
|
|
108
|
+
throw error;
|
|
77
109
|
}
|
|
78
|
-
console.log("=".repeat(60) + "\n");
|
|
79
|
-
return tokenResponse;
|
|
80
110
|
}
|
|
81
111
|
/**
|
|
82
112
|
* Request a device code from the server
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-flow.js","sourceRoot":"","sources":["../../src/auth/device-flow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,mBAAmB,GAIpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"device-flow.js","sourceRoot":"","sources":["../../src/auth/device-flow.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAgB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAgB,MAAM,WAAW,CAAC;AAkBlD,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAC;AAkChC,UAAU,WAAW;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD,wBAAgB,eAAe,CAAC,QAAQ,GAAE,WAAgB,GAAG,OAAO,CA0EnE;AAED,wBAAsB,MAAM,CAC1B,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,GAAE,WAAgB,GACzB,OAAO,CAAC,IAAI,CAAC,CAaf;AAo7DD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,QAapE"}
|
package/dist/cli.js
CHANGED
|
@@ -2,8 +2,9 @@ import { Command, Help, Option } from "commander";
|
|
|
2
2
|
import * as p from "@clack/prompts";
|
|
3
3
|
import { SpongeWallet } from "./client.js";
|
|
4
4
|
import { deviceFlowAuth } from "./auth/device-flow.js";
|
|
5
|
-
import { deleteCredentials, getCredentialsPath, loadCredentials, saveCredentials, } from "./auth/credentials.js";
|
|
5
|
+
import { deleteCredentials, hasCredentials, getCredentialsPath, loadCredentials, saveCredentials, } from "./auth/credentials.js";
|
|
6
6
|
import { registerAgentFirst } from "./registration.js";
|
|
7
|
+
import { captureCliCommandEvent, classifyBaseUrl, sanitizeErrorForTelemetry, shutdownCliTelemetry, } from "./telemetry.js";
|
|
7
8
|
import { TOOL_DEFINITIONS, } from "./tools/definitions.js";
|
|
8
9
|
const DEFAULT_BASE_URL = "https://api.wallet.paysponge.com";
|
|
9
10
|
// ---------------------------------------------------------------------------
|
|
@@ -58,7 +59,18 @@ export function buildCliProgram(metadata = {}) {
|
|
|
58
59
|
}
|
|
59
60
|
export async function runCli(args, metadata = {}) {
|
|
60
61
|
const program = buildCliProgram(metadata);
|
|
61
|
-
|
|
62
|
+
const telemetry = attachCliTelemetry(program, args, metadata);
|
|
63
|
+
try {
|
|
64
|
+
await program.parseAsync(args, { from: "user" });
|
|
65
|
+
await telemetry.track("succeeded");
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
await telemetry.track("failed", error);
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
await shutdownCliTelemetry();
|
|
73
|
+
}
|
|
62
74
|
}
|
|
63
75
|
// ---------------------------------------------------------------------------
|
|
64
76
|
// Handlers
|
|
@@ -328,6 +340,80 @@ function commandPath(command) {
|
|
|
328
340
|
}
|
|
329
341
|
return parts;
|
|
330
342
|
}
|
|
343
|
+
function attachCliTelemetry(program, rawArgs, metadata) {
|
|
344
|
+
const state = {
|
|
345
|
+
actionCommand: null,
|
|
346
|
+
startedAt: 0,
|
|
347
|
+
tracked: false,
|
|
348
|
+
};
|
|
349
|
+
const register = (command) => {
|
|
350
|
+
command.hook("preAction", (_thisCommand, actionCommand) => {
|
|
351
|
+
state.actionCommand = actionCommand;
|
|
352
|
+
if (state.startedAt === 0) {
|
|
353
|
+
state.startedAt = Date.now();
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
for (const subcommand of command.commands) {
|
|
357
|
+
register(subcommand);
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
register(program);
|
|
361
|
+
return {
|
|
362
|
+
async track(status, error) {
|
|
363
|
+
if (state.tracked || !state.actionCommand) {
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
state.tracked = true;
|
|
367
|
+
const opts = getCommandTelemetryOptions(state.actionCommand);
|
|
368
|
+
const credentialsPath = opts.credentialsPath;
|
|
369
|
+
await captureCliCommandEvent({
|
|
370
|
+
status,
|
|
371
|
+
command_name: state.actionCommand.name(),
|
|
372
|
+
command_path: commandPath(state.actionCommand).slice(1).join(" "),
|
|
373
|
+
command_group: commandPath(state.actionCommand)[1] ?? state.actionCommand.name(),
|
|
374
|
+
duration_ms: Math.max(Date.now() - state.startedAt, 0),
|
|
375
|
+
raw_arg_count: rawArgs.length,
|
|
376
|
+
flags: extractFlagNames(rawArgs),
|
|
377
|
+
auth_source: getCliAuthSource(credentialsPath),
|
|
378
|
+
has_cached_credentials: hasCredentials(credentialsPath),
|
|
379
|
+
has_custom_credentials_path: Boolean(credentialsPath),
|
|
380
|
+
base_url_kind: classifyBaseUrl(opts.baseUrl),
|
|
381
|
+
package_name: metadata.packageName,
|
|
382
|
+
package_version: metadata.version,
|
|
383
|
+
command_name_override: metadata.commandName,
|
|
384
|
+
...sanitizeErrorForTelemetry(error),
|
|
385
|
+
}, credentialsPath);
|
|
386
|
+
},
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
function getCommandTelemetryOptions(command) {
|
|
390
|
+
const value = typeof command.optsWithGlobals === "function"
|
|
391
|
+
? command.optsWithGlobals()
|
|
392
|
+
: command.opts();
|
|
393
|
+
return {
|
|
394
|
+
baseUrl: typeof value.baseUrl === "string" ? value.baseUrl : undefined,
|
|
395
|
+
credentialsPath: typeof value.credentialsPath === "string" ? value.credentialsPath : undefined,
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
function getCliAuthSource(credentialsPath) {
|
|
399
|
+
if (process.env.SPONGE_API_KEY) {
|
|
400
|
+
return "env_api_key";
|
|
401
|
+
}
|
|
402
|
+
if (hasCredentials(credentialsPath)) {
|
|
403
|
+
return "cached_credentials";
|
|
404
|
+
}
|
|
405
|
+
return "interactive_or_public";
|
|
406
|
+
}
|
|
407
|
+
function extractFlagNames(rawArgs) {
|
|
408
|
+
const flags = new Set();
|
|
409
|
+
for (const arg of rawArgs) {
|
|
410
|
+
if (!arg.startsWith("-")) {
|
|
411
|
+
continue;
|
|
412
|
+
}
|
|
413
|
+
flags.add(arg.includes("=") ? arg.slice(0, arg.indexOf("=")) : arg);
|
|
414
|
+
}
|
|
415
|
+
return [...flags];
|
|
416
|
+
}
|
|
331
417
|
function buildHelpBanner(command, metadata) {
|
|
332
418
|
const path = commandPath(command);
|
|
333
419
|
const rootName = metadata.commandName ?? "spongewallet";
|