httpcat-cli 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/.claude/settings.local.json +11 -0
  2. package/README.md +796 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +149 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/commands/buy.d.ts.map +1 -0
  7. package/dist/commands/buy.js +37 -0
  8. package/dist/commands/buy.js.map +1 -0
  9. package/dist/commands/create.d.ts.map +1 -0
  10. package/dist/commands/create.js +28 -0
  11. package/dist/commands/create.js.map +1 -0
  12. package/dist/commands/health.d.ts.map +1 -0
  13. package/dist/commands/health.js +33 -0
  14. package/dist/commands/health.js.map +1 -0
  15. package/dist/commands/info.d.ts.map +1 -0
  16. package/dist/commands/info.js +43 -0
  17. package/dist/commands/info.js.map +1 -0
  18. package/dist/commands/list.d.ts.map +1 -0
  19. package/dist/commands/list.js +49 -0
  20. package/dist/commands/list.js.map +1 -0
  21. package/dist/commands/sell.d.ts.map +1 -0
  22. package/dist/commands/sell.js +64 -0
  23. package/dist/commands/sell.js.map +1 -0
  24. package/dist/config.d.ts.map +1 -0
  25. package/dist/config.js +194 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/headless/json-output.d.ts.map +1 -0
  28. package/dist/headless/json-output.js +73 -0
  29. package/dist/headless/json-output.js.map +1 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +478 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/interactive/art.d.ts.map +1 -0
  34. package/dist/interactive/art.js +136 -0
  35. package/dist/interactive/art.js.map +1 -0
  36. package/dist/interactive/shell.d.ts.map +1 -0
  37. package/dist/interactive/shell.js +223 -0
  38. package/dist/interactive/shell.js.map +1 -0
  39. package/dist/utils/errors.d.ts.map +1 -0
  40. package/dist/utils/errors.js +119 -0
  41. package/dist/utils/errors.js.map +1 -0
  42. package/dist/utils/formatting.d.ts.map +1 -0
  43. package/dist/utils/formatting.js +77 -0
  44. package/dist/utils/formatting.js.map +1 -0
  45. package/dist/utils/token-resolver.d.ts.map +1 -0
  46. package/dist/utils/token-resolver.js +41 -0
  47. package/dist/utils/token-resolver.js.map +1 -0
  48. package/dist/utils/validation.d.ts.map +1 -0
  49. package/dist/utils/validation.js +31 -0
  50. package/dist/utils/validation.js.map +1 -0
  51. package/package.json +52 -0
package/dist/config.js ADDED
@@ -0,0 +1,194 @@
1
+ import Conf from 'conf';
2
+ import { createInterface } from 'readline';
3
+ import chalk from 'chalk';
4
+ const DEFAULT_ENVIRONMENTS = {
5
+ local: {
6
+ name: 'local',
7
+ agentUrl: 'http://localhost:8787',
8
+ network: 'base-sepolia',
9
+ },
10
+ sepolia: {
11
+ name: 'sepolia',
12
+ agentUrl: 'http://209.97.152.182:8787',
13
+ network: 'base-sepolia',
14
+ },
15
+ };
16
+ const DEFAULT_CONFIG = {
17
+ network: 'base-sepolia',
18
+ agentUrl: 'http://209.97.152.182:8787',
19
+ facilitatorUrl: 'https://facilitators.x402scan.com',
20
+ defaultMaxPayment: '10.00',
21
+ environment: 'sepolia',
22
+ environments: DEFAULT_ENVIRONMENTS,
23
+ preferences: {
24
+ enableAsciiArt: true,
25
+ colorOutput: true,
26
+ verboseLogging: false,
27
+ },
28
+ };
29
+ export class ConfigManager {
30
+ store;
31
+ constructor() {
32
+ this.store = new Conf({
33
+ projectName: 'httpcat',
34
+ defaults: DEFAULT_CONFIG,
35
+ });
36
+ }
37
+ get(key) {
38
+ return this.store.get(key);
39
+ }
40
+ set(key, value) {
41
+ this.store.set(key, value);
42
+ }
43
+ getAll() {
44
+ return this.store.store;
45
+ }
46
+ has(key) {
47
+ return this.store.has(key);
48
+ }
49
+ delete(key) {
50
+ this.store.delete(key);
51
+ }
52
+ clear() {
53
+ this.store.clear();
54
+ }
55
+ getConfigPath() {
56
+ return this.store.path;
57
+ }
58
+ isConfigured() {
59
+ return this.has('privateKey') && !!this.get('privateKey');
60
+ }
61
+ async runSetupWizard(options = {}) {
62
+ console.log(chalk.cyan('='.repeat(80)));
63
+ console.log(chalk.cyan.bold('🐱 httpcat Configuration Setup'));
64
+ console.log(chalk.cyan('='.repeat(80)));
65
+ console.log();
66
+ if (!options.skipPrivateKey) {
67
+ // Private key
68
+ console.log(chalk.yellow('⚠️ WARNING: Your private key will be stored locally'));
69
+ console.log(chalk.dim(` Config location: ${this.getConfigPath()}`));
70
+ console.log(chalk.dim(' Alternative: Use HTTPCAT_PRIVATE_KEY environment variable'));
71
+ console.log();
72
+ const privateKey = await this.prompt('Enter your private key (with 0x prefix): ');
73
+ if (!privateKey || !privateKey.startsWith('0x') || privateKey.length !== 66) {
74
+ throw new Error('Invalid private key format. Must start with 0x and be 66 characters long.');
75
+ }
76
+ this.set('privateKey', privateKey);
77
+ console.log(chalk.green('✅ Private key saved\n'));
78
+ }
79
+ // Network selection
80
+ console.log(chalk.bold('Select network:'));
81
+ console.log(' 1. base-sepolia (testnet)');
82
+ console.log(' 2. base (mainnet)');
83
+ const networkChoice = await this.prompt('Choice [1]: ', '1');
84
+ const network = networkChoice === '2' ? 'base' : 'base-sepolia';
85
+ this.set('network', network);
86
+ console.log(chalk.green(`✅ Network set to: ${network}\n`));
87
+ // Agent URL
88
+ const defaultUrl = network === 'base-sepolia'
89
+ ? 'http://209.97.152.182:8787'
90
+ : 'http://209.97.152.182:8787';
91
+ const agentUrl = await this.prompt(`Agent URL [${defaultUrl}]: `, defaultUrl);
92
+ this.set('agentUrl', agentUrl);
93
+ console.log(chalk.green(`✅ Agent URL set to: ${agentUrl}\n`));
94
+ // ASCII art preference
95
+ const asciiArt = await this.prompt('Enable ASCII art? [Y/n]: ', 'y');
96
+ this.set('preferences', {
97
+ ...this.get('preferences'),
98
+ enableAsciiArt: asciiArt.toLowerCase() !== 'n',
99
+ });
100
+ console.log();
101
+ console.log(chalk.cyan('='.repeat(80)));
102
+ console.log(chalk.green.bold('✅ Configuration complete!'));
103
+ console.log(chalk.cyan('='.repeat(80)));
104
+ console.log();
105
+ console.log(chalk.dim(`Config saved to: ${this.getConfigPath()}`));
106
+ console.log();
107
+ }
108
+ prompt(question, defaultValue) {
109
+ return new Promise((resolve) => {
110
+ const rl = createInterface({
111
+ input: process.stdin,
112
+ output: process.stdout,
113
+ });
114
+ rl.question(question, (answer) => {
115
+ rl.close();
116
+ resolve(answer.trim() || defaultValue || '');
117
+ });
118
+ });
119
+ }
120
+ getPrivateKey() {
121
+ // Check environment variable first
122
+ const envKey = process.env.HTTPCAT_PRIVATE_KEY;
123
+ if (envKey) {
124
+ if (!envKey.startsWith('0x') || envKey.length !== 66) {
125
+ throw new Error('Invalid HTTPCAT_PRIVATE_KEY format in environment variable');
126
+ }
127
+ return envKey;
128
+ }
129
+ // Fall back to config
130
+ const configKey = this.get('privateKey');
131
+ if (!configKey) {
132
+ throw new Error('No private key configured. Run "httpcat config" or set HTTPCAT_PRIVATE_KEY environment variable.');
133
+ }
134
+ return configKey;
135
+ }
136
+ // Environment management methods
137
+ getEnvironments() {
138
+ const envs = this.get('environments');
139
+ if (!envs) {
140
+ // Initialize with defaults if not set
141
+ this.set('environments', DEFAULT_ENVIRONMENTS);
142
+ return DEFAULT_ENVIRONMENTS;
143
+ }
144
+ return envs;
145
+ }
146
+ getCurrentEnvironment() {
147
+ return this.get('environment');
148
+ }
149
+ getEnvironmentConfig(name) {
150
+ const envs = this.getEnvironments();
151
+ return envs[name];
152
+ }
153
+ setEnvironment(name) {
154
+ const envs = this.getEnvironments();
155
+ const env = envs[name];
156
+ if (!env) {
157
+ throw new Error(`Environment "${name}" not found. Use "httpcat env list" to see available environments.`);
158
+ }
159
+ // Update current environment
160
+ this.set('environment', name);
161
+ // Update agentUrl and network from environment
162
+ this.set('agentUrl', env.agentUrl);
163
+ this.set('network', env.network);
164
+ }
165
+ addEnvironment(name, agentUrl, network = 'base-sepolia') {
166
+ const envs = this.getEnvironments();
167
+ if (envs[name]) {
168
+ throw new Error(`Environment "${name}" already exists. Use a different name.`);
169
+ }
170
+ envs[name] = {
171
+ name,
172
+ agentUrl,
173
+ network,
174
+ };
175
+ this.set('environments', envs);
176
+ }
177
+ getAgentUrl() {
178
+ // Priority: Env var > Current environment > Config default
179
+ const envUrl = process.env.HTTPCAT_AGENT_URL;
180
+ if (envUrl) {
181
+ return envUrl;
182
+ }
183
+ const currentEnv = this.getCurrentEnvironment();
184
+ if (currentEnv) {
185
+ const envConfig = this.getEnvironmentConfig(currentEnv);
186
+ if (envConfig) {
187
+ return envConfig.agentUrl;
188
+ }
189
+ }
190
+ return this.get('agentUrl');
191
+ }
192
+ }
193
+ export const config = new ConfigManager();
194
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-output.d.ts","sourceRoot":"","sources":["../../src/headless/json-output.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,GAAG;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,GAAG,CAAC;KACf,CAAC;IACF,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,wBAAgB,UAAU,CAAC,CAAC,EAC1B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5B,IAAI,CASN;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,KAAK,EACZ,IAAI,SAAI,GACP,IAAI,CA+DN"}
@@ -0,0 +1,73 @@
1
+ export function outputJson(operation, data, payment) {
2
+ const output = {
3
+ success: true,
4
+ operation,
5
+ data,
6
+ payment,
7
+ };
8
+ console.log(JSON.stringify(output, null, 2));
9
+ }
10
+ export function outputError(operation, error, code = 1) {
11
+ // Extract error message, handling cases where message might be an object
12
+ let errorMessage = error.message;
13
+ let errorDetails = error.details;
14
+ // If message is "[object Object]", try to extract from details or stringify the error
15
+ if (errorMessage === '[object Object]' || !errorMessage) {
16
+ if (errorDetails) {
17
+ // Try to extract a meaningful message from details
18
+ if (typeof errorDetails === 'object') {
19
+ errorMessage = errorDetails.message || errorDetails.error?.message || JSON.stringify(errorDetails);
20
+ // If we used details as message, don't duplicate it
21
+ if (errorDetails.message || errorDetails.error?.message) {
22
+ errorDetails = errorDetails.error || errorDetails;
23
+ }
24
+ }
25
+ else {
26
+ errorMessage = String(errorDetails);
27
+ errorDetails = undefined;
28
+ }
29
+ }
30
+ else {
31
+ // Last resort: stringify the error object
32
+ try {
33
+ const errorObj = { ...error };
34
+ errorMessage = JSON.stringify(errorObj);
35
+ }
36
+ catch {
37
+ errorMessage = 'Unknown error occurred';
38
+ }
39
+ }
40
+ }
41
+ // Ensure details is serializable
42
+ if (errorDetails && typeof errorDetails === 'object') {
43
+ try {
44
+ // Test if it's serializable
45
+ JSON.stringify(errorDetails);
46
+ }
47
+ catch {
48
+ // If not serializable, convert to string
49
+ errorDetails = String(errorDetails);
50
+ }
51
+ }
52
+ // For 500 errors, include endpoint info in JSON output
53
+ const output = {
54
+ success: false,
55
+ operation,
56
+ error: {
57
+ message: errorMessage,
58
+ code,
59
+ details: errorDetails,
60
+ },
61
+ };
62
+ // Add helpful context for server errors
63
+ if (code === 3 && errorDetails?.endpoint) {
64
+ output.error.endpoint = errorDetails.endpoint;
65
+ output.error.suggestions = [
66
+ 'Check if the agent is running: httpcat health',
67
+ 'Verify your network configuration: httpcat config --show',
68
+ 'Use --verbose for more details'
69
+ ];
70
+ }
71
+ console.log(JSON.stringify(output, null, 2));
72
+ }
73
+ //# sourceMappingURL=json-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-output.js","sourceRoot":"","sources":["../../src/headless/json-output.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,UAAU,CACxB,SAAiB,EACjB,IAAO,EACP,OAA6B;IAE7B,MAAM,MAAM,GAAkB;QAC5B,OAAO,EAAE,IAAI;QACb,SAAS;QACT,IAAI;QACJ,OAAO;KACR,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,SAAiB,EACjB,KAAY,EACZ,IAAI,GAAG,CAAC;IAER,yEAAyE;IACzE,IAAI,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC;IACjC,IAAI,YAAY,GAAS,KAAa,CAAC,OAAO,CAAC;IAE/C,sFAAsF;IACtF,IAAI,YAAY,KAAK,iBAAiB,IAAI,CAAC,YAAY,EAAE,CAAC;QACxD,IAAI,YAAY,EAAE,CAAC;YACjB,mDAAmD;YACnD,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACrC,YAAY,GAAG,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;gBACnG,oDAAoD;gBACpD,IAAI,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;oBACxD,YAAY,GAAG,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC;gBACpD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;gBACpC,YAAY,GAAG,SAAS,CAAC;YAC3B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,0CAA0C;YAC1C,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;gBAC9B,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY,GAAG,wBAAwB,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,IAAI,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;QACrD,IAAI,CAAC;YACH,4BAA4B;YAC5B,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;YACzC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,MAAM,MAAM,GAAe;QACzB,OAAO,EAAE,KAAK;QACd,SAAS;QACT,KAAK,EAAE;YACL,OAAO,EAAE,YAAY;YACrB,IAAI;YACJ,OAAO,EAAE,YAAY;SACtB;KACF,CAAC;IAEF,wCAAwC;IACxC,IAAI,IAAI,KAAK,CAAC,IAAI,YAAY,EAAE,QAAQ,EAAE,CAAC;QACxC,MAAM,CAAC,KAAa,CAAC,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC;QACtD,MAAM,CAAC,KAAa,CAAC,WAAW,GAAG;YAClC,+CAA+C;YAC/C,0DAA0D;YAC1D,gCAAgC;SACjC,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}