@paysponge/sdk 0.1.40 → 0.1.42

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.
Files changed (42) hide show
  1. package/README.md +12 -0
  2. package/dist/api/generated/openapi/apis/default-api.d.ts +111 -32
  3. package/dist/api/generated/openapi/apis/default-api.d.ts.map +1 -1
  4. package/dist/api/generated/openapi/apis/default-api.js +110 -27
  5. package/dist/api/generated/openapi/apis/default-api.js.map +1 -1
  6. package/dist/api/generated/openapi/models/index.d.ts +1 -0
  7. package/dist/api/generated/openapi/models/index.d.ts.map +1 -1
  8. package/dist/api/generated/openapi/models/index.js +1 -0
  9. package/dist/api/generated/openapi/models/index.js.map +1 -1
  10. package/dist/api/generated/openapi/models/post-api-rain-card-request.d.ts +14 -0
  11. package/dist/api/generated/openapi/models/post-api-rain-card-request.d.ts.map +1 -1
  12. package/dist/api/generated/openapi/models/post-api-rain-card-request.js +11 -0
  13. package/dist/api/generated/openapi/models/post-api-rain-card-request.js.map +1 -1
  14. package/dist/api/generated/openapi/models/post-api-rain-contracts-by-contract-id-fund-request.d.ts +14 -0
  15. package/dist/api/generated/openapi/models/post-api-rain-contracts-by-contract-id-fund-request.d.ts.map +1 -1
  16. package/dist/api/generated/openapi/models/post-api-rain-contracts-by-contract-id-fund-request.js +11 -0
  17. package/dist/api/generated/openapi/models/post-api-rain-contracts-by-contract-id-fund-request.js.map +1 -1
  18. package/dist/api/generated/openapi/models/post-api-rain-contracts-by-contract-id-withdraw-request.d.ts +14 -0
  19. package/dist/api/generated/openapi/models/post-api-rain-contracts-by-contract-id-withdraw-request.d.ts.map +1 -1
  20. package/dist/api/generated/openapi/models/post-api-rain-contracts-by-contract-id-withdraw-request.js +11 -0
  21. package/dist/api/generated/openapi/models/post-api-rain-contracts-by-contract-id-withdraw-request.js.map +1 -1
  22. package/dist/api/generated/openapi/models/post-api-rain-customer-refresh-request.d.ts +41 -0
  23. package/dist/api/generated/openapi/models/post-api-rain-customer-refresh-request.d.ts.map +1 -0
  24. package/dist/api/generated/openapi/models/post-api-rain-customer-refresh-request.js +51 -0
  25. package/dist/api/generated/openapi/models/post-api-rain-customer-refresh-request.js.map +1 -0
  26. package/dist/api/generated/openapi/models/post-api-rain-customer-request.d.ts +14 -0
  27. package/dist/api/generated/openapi/models/post-api-rain-customer-request.d.ts.map +1 -1
  28. package/dist/api/generated/openapi/models/post-api-rain-customer-request.js +11 -0
  29. package/dist/api/generated/openapi/models/post-api-rain-customer-request.js.map +1 -1
  30. package/dist/auth/device-flow.d.ts.map +1 -1
  31. package/dist/auth/device-flow.js +87 -57
  32. package/dist/auth/device-flow.js.map +1 -1
  33. package/dist/cli.d.ts.map +1 -1
  34. package/dist/cli.js +88 -2
  35. package/dist/cli.js.map +1 -1
  36. package/dist/telemetry.d.ts +49 -0
  37. package/dist/telemetry.d.ts.map +1 -0
  38. package/dist/telemetry.js +156 -0
  39. package/dist/telemetry.js.map +1 -0
  40. package/dist/version.d.ts +1 -1
  41. package/dist/version.js +1 -1
  42. package/package.json +2 -1
@@ -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
- // Step 1: Request device code
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
- const clipboardy = await import("clipboardy");
31
- await clipboardy.default.write(deviceCodeResponse.userCode);
32
- console.log("(Code copied to clipboard)\n");
33
- }
34
- catch {
35
- // Clipboard not available, that's fine
36
- }
37
- // Try to open browser
38
- if (!options.noBrowser) {
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 open = await import("open");
41
- await open.default(deviceCodeResponse.verificationUri);
42
- console.log("Opening browser...\n");
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
- // Browser not available, that's fine
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
- console.log("Waiting for approval...");
49
- // Step 3: Poll for token
50
- const tokenResponse = await pollForToken(baseUrl, deviceCodeResponse.deviceCode, deviceCodeResponse.interval, deviceCodeResponse.expiresIn);
51
- // Step 4: Save credentials (only for agent keys with agentId)
52
- if (tokenResponse.agentId) {
53
- const credentials = {
54
- apiKey: tokenResponse.apiKey,
55
- agentId: tokenResponse.agentId,
56
- testnet: options.testnet,
57
- createdAt: new Date(),
58
- baseUrl: baseUrl !== DEFAULT_BASE_URL ? baseUrl : undefined,
59
- };
60
- saveCredentials(credentials, options.credentialsPath);
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":"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"}
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;AACvE,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AAEzB,MAAM,gBAAgB,GAAG,kCAAkC,CAAC;AAmB5D;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,UAA6B,EAAE;IAE/B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,gBAAgB,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,8BAA8B;QAC9B,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAE5C,MAAM,kBAAkB,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE;YAC1D,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QAEH,2DAA2D;QAC3D,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,kBAAkB,CAAC,eAAe,IAAI,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,oBAAoB,kBAAkB,CAAC,QAAQ,IAAI,CAAC,CAAC;QAEjE,2BAA2B;QAC3B,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;YAC9C,MAAM,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;QAED,sBAAsB;QACtB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;gBAClC,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,qCAAqC;YACvC,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QAEvC,yBAAyB;QACzB,MAAM,aAAa,GAAG,MAAM,YAAY,CACtC,OAAO,EACP,kBAAkB,CAAC,UAAU,EAC7B,kBAAkB,CAAC,QAAQ,EAC3B,kBAAkB,CAAC,SAAS,CAC7B,CAAC;QAEF,8DAA8D;QAC9D,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,WAAW,GAAgB;gBAC/B,MAAM,EAAE,aAAa,CAAC,MAAM;gBAC5B,OAAO,EAAE,aAAa,CAAC,OAAO;gBAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,OAAO,EAAE,OAAO,KAAK,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;aAC5D,CAAC;YACF,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;QACxD,CAAC;QAED,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,QAAQ,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,aAAa,CAAC,MAAM,IAAI,CAAC,CAAC;QACnF,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;YAC5E,OAAO,CAAC,GAAG,CAAC,yBAAyB,kBAAkB,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAEnC,MAAM,mBAAmB,CAAC;YACxB,MAAM,EAAE,WAAW;YACnB,SAAS,EAAE,aAAa;YACxB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YACnC,QAAQ,EAAE,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO;YAC3D,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;YACtC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;YACjC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;YAC1C,aAAa,EAAE,eAAe,CAAC,OAAO,CAAC;YACvC,kBAAkB,EAAE,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC;SACnD,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;QAE5B,OAAO,aAAa,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,mBAAmB,CAAC;YACxB,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,aAAa;YACxB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YACnC,QAAQ,EAAE,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO;YAC3D,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;YACtC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;YACjC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;YAC1C,aAAa,EAAE,eAAe,CAAC,OAAO,CAAC;YACvC,kBAAkB,EAAE,KAAK;YACzB,GAAG,yBAAyB,CAAC,KAAK,CAAC;SACpC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;QAE5B,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAC9B,OAAe,EACf,OAAgG;IAEhG,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,iCAAiC,EAAE;QACxE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,QAAQ,EAAE,kBAAkB;YAC5B,KAAK,EAAE,2CAA2C;YAClD,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,OAAO,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CACzB,OAAe,EACf,UAAkB,EAClB,eAAuB,EACvB,gBAAwB;IAExB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,SAAS,GAAG,gBAAgB,GAAG,IAAI,CAAC;IACtD,IAAI,QAAQ,GAAG,eAAe,GAAG,IAAI,CAAC;IAEtC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;QAC9B,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEtB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,yBAAyB,EAAE;gBAChE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,SAAS,EAAE,8CAA8C;oBACzD,UAAU;oBACV,QAAQ,EAAE,kBAAkB;iBAC7B,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,OAAO,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzC,CAAC;YAED,yBAAyB;YACzB,MAAM,SAAS,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAA4B,CAAC;YACvF,MAAM,KAAK,GAAG,SAAS,CAAC,KAAe,CAAC;YAExC,QAAQ,KAAK,EAAE,CAAC;gBACd,KAAK,uBAAuB;oBAC1B,eAAe;oBACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAC1B,MAAM;gBACR,KAAK,WAAW;oBACd,4BAA4B;oBAC5B,QAAQ,IAAI,IAAI,CAAC;oBACjB,MAAM;gBACR,KAAK,eAAe;oBAClB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAC3C,KAAK,eAAe;oBAClB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBAC5D;oBACE,MAAM,IAAI,KAAK,CACb,0BAA0B,SAAS,CAAC,gBAAgB,IAAI,KAAK,IAAI,eAAe,EAAE,CACnF,CAAC;YACN,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,KAAK,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;AAC5D,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"}
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;AAWlD,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,CAGf;AAy0DD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,QAapE"}
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
- await program.parseAsync(args, { from: "user" });
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";