httpcat-cli 0.0.21 → 0.0.23

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 (47) hide show
  1. package/.claude/settings.local.json +10 -1
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +41 -6
  4. package/dist/client.js.map +1 -1
  5. package/dist/commands/account.d.ts.map +1 -0
  6. package/dist/commands/account.js +229 -0
  7. package/dist/commands/account.js.map +1 -0
  8. package/dist/commands/chat.d.ts.map +1 -1
  9. package/dist/commands/chat.js +39 -33
  10. package/dist/commands/chat.js.map +1 -1
  11. package/dist/commands/info.d.ts.map +1 -1
  12. package/dist/commands/info.js +15 -3
  13. package/dist/commands/info.js.map +1 -1
  14. package/dist/commands/positions.d.ts.map +1 -1
  15. package/dist/commands/positions.js +2 -2
  16. package/dist/commands/positions.js.map +1 -1
  17. package/dist/commands/transactions.d.ts.map +1 -0
  18. package/dist/commands/transactions.js +59 -0
  19. package/dist/commands/transactions.js.map +1 -0
  20. package/dist/config.d.ts.map +1 -1
  21. package/dist/config.js +295 -7
  22. package/dist/config.js.map +1 -1
  23. package/dist/index.js +302 -16
  24. package/dist/index.js.map +1 -1
  25. package/dist/interactive/shell.d.ts.map +1 -1
  26. package/dist/interactive/shell.js +6 -1
  27. package/dist/interactive/shell.js.map +1 -1
  28. package/dist/mcp/chat-state.d.ts.map +1 -1
  29. package/dist/mcp/chat-state.js +17 -3
  30. package/dist/mcp/chat-state.js.map +1 -1
  31. package/dist/mcp/server.js +1 -1
  32. package/dist/mcp/server.js.map +1 -1
  33. package/dist/mcp/tools.d.ts.map +1 -1
  34. package/dist/mcp/tools.js +31 -6
  35. package/dist/mcp/tools.js.map +1 -1
  36. package/dist/utils/privateKeyPrompt.d.ts.map +1 -1
  37. package/dist/utils/privateKeyPrompt.js +238 -32
  38. package/dist/utils/privateKeyPrompt.js.map +1 -1
  39. package/dist/utils/token-resolver.d.ts.map +1 -1
  40. package/dist/utils/token-resolver.js +15 -4
  41. package/dist/utils/token-resolver.js.map +1 -1
  42. package/dist/utils/wallet.d.ts.map +1 -0
  43. package/dist/utils/wallet.js +134 -0
  44. package/dist/utils/wallet.js.map +1 -0
  45. package/homebrew-httpcat/Formula/httpcat.rb +3 -3
  46. package/homebrew-httpcat/homebrew-httpcat/Formula/httpcat.rb +3 -3
  47. package/package.json +4 -2
@@ -24,7 +24,16 @@
24
24
  "Bash(gh pr view:*)",
25
25
  "Bash(gh pr diff:*)",
26
26
  "Bash(gh pr merge:*)",
27
- "Bash(cat:*)"
27
+ "Bash(cat:*)",
28
+ "Bash(git pull:*)",
29
+ "Bash(git rebase:*)",
30
+ "Bash(bun test:*)",
31
+ "Bash(gh run list:*)",
32
+ "Bash(gh run:*)",
33
+ "Bash(ssh:*)",
34
+ "Bash(md5sum:*)",
35
+ "Bash(xargs:*)",
36
+ "Bash(jq)"
28
37
  ],
29
38
  "deny": [],
30
39
  "ask": []
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAGhC,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,GAAG;IACzC,MAAM,EAAE,CAAC,CAAC;CACX;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,gBAAgB,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO;WAUM,MAAM,CAAC,UAAU,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC;IAqBvD,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG,EACtC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,WAAW,CAAA;KAAE,CAAC;IAiF9C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAsCrC,WAAW,IAAI,MAAM;IAIrB,UAAU,IAAI,MAAM;CAGrB;AAED,qBAAa,YAAa,SAAQ,KAAK;IACD,MAAM,EAAE,MAAM;IAAS,OAAO,CAAC,EAAE,GAAG;gBAA5D,OAAO,EAAE,MAAM,EAAS,MAAM,EAAE,MAAM,EAAS,OAAO,CAAC,EAAE,GAAG,YAAA;CAIzE"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAGhC,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,GAAG;IACzC,MAAM,EAAE,CAAC,CAAC;CACX;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,gBAAgB,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO;WAUM,MAAM,CAAC,UAAU,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC;IAqBvD,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG,EACtC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,WAAW,CAAA;KAAE,CAAC;IA2G9C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAsCrC,WAAW,IAAI,MAAM;IAIrB,UAAU,IAAI,MAAM;CAGrB;AAED,qBAAa,YAAa,SAAQ,KAAK;IACD,MAAM,EAAE,MAAM;IAAS,OAAO,CAAC,EAAE,GAAG;gBAA5D,OAAO,EAAE,MAAM,EAAS,MAAM,EAAE,MAAM,EAAS,OAAO,CAAC,EAAE,GAAG,YAAA;CAIzE"}
package/dist/client.js CHANGED
@@ -48,12 +48,47 @@ export class HttpcatClient {
48
48
  try {
49
49
  errorDetails = JSON.parse(responseText);
50
50
  // Extract message from nested error structures
51
- errorMessage =
52
- errorDetails.error?.message ||
53
- errorDetails.error ||
54
- errorDetails.message ||
55
- errorDetails.details?.message ||
56
- `Request failed with status ${response.status}`;
51
+ // Handle various error formats
52
+ if (typeof errorDetails === 'string') {
53
+ errorMessage = errorDetails;
54
+ }
55
+ else if (errorDetails.error) {
56
+ if (typeof errorDetails.error === 'string') {
57
+ errorMessage = errorDetails.error;
58
+ }
59
+ else if (errorDetails.error.message) {
60
+ errorMessage = errorDetails.error.message;
61
+ }
62
+ else if (typeof errorDetails.error === 'object') {
63
+ // Try to stringify the error object
64
+ const errorStr = JSON.stringify(errorDetails.error);
65
+ if (errorStr !== '{}') {
66
+ errorMessage = errorStr;
67
+ }
68
+ else {
69
+ errorMessage = errorDetails.message || `Request failed with status ${response.status}`;
70
+ }
71
+ }
72
+ else {
73
+ errorMessage = String(errorDetails.error);
74
+ }
75
+ }
76
+ else if (errorDetails.message) {
77
+ errorMessage = errorDetails.message;
78
+ }
79
+ else if (errorDetails.details?.message) {
80
+ errorMessage = errorDetails.details.message;
81
+ }
82
+ else {
83
+ // Last resort: try to stringify the whole object
84
+ const errorStr = JSON.stringify(errorDetails);
85
+ if (errorStr !== '{}' && errorStr.length < 500) {
86
+ errorMessage = errorStr;
87
+ }
88
+ else {
89
+ errorMessage = `Request failed with status ${response.status}`;
90
+ }
91
+ }
57
92
  // For 500 errors, try to extract more context
58
93
  if (response.status >= 500 && errorDetails.error) {
59
94
  // If error is an object, try to stringify it for more info
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../src/commands/account.ts"],"names":[],"mappings":"AAQA,OAAO,EAAgB,WAAW,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAkC,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA0DpF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CA8C9D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CA+BnC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAejD;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAgGhD"}
@@ -0,0 +1,229 @@
1
+ import chalk from "chalk";
2
+ import { config } from "../config.js";
3
+ import { HttpcatClient } from "../client.js";
4
+ import { formatAddress, createTable } from "../utils/formatting.js";
5
+ import { checkBalance } from "./balance.js";
6
+ import { getPositions, displayPositions } from "./positions.js";
7
+ import { decryptData } from "../utils/wallet.js";
8
+ /**
9
+ * Get account information including address, balances, and positions
10
+ */
11
+ export async function getAccountInfo(accountIndex) {
12
+ const index = accountIndex !== undefined ? accountIndex : config.getActiveAccountIndex();
13
+ const accounts = config.getAllAccounts();
14
+ const account = accounts.find((acc) => acc.index === index);
15
+ if (!account) {
16
+ throw new Error(`Account at index ${index} not found. Use "httpcat account list" to see available accounts.`);
17
+ }
18
+ // Get private key for this account
19
+ const privateKey = config.getAccountPrivateKey(index);
20
+ // Derive address from private key to ensure we're using the correct one
21
+ const { privateKeyToAccount } = await import("viem/accounts");
22
+ const derivedAccount = privateKeyToAccount(privateKey);
23
+ const derivedAddress = derivedAccount.address;
24
+ // Verify the address matches the stored account address
25
+ if (account.address.toLowerCase() !== derivedAddress.toLowerCase()) {
26
+ console.warn(`⚠️ Address mismatch: stored ${account.address} but derived ${derivedAddress}`);
27
+ }
28
+ // Get balance
29
+ const balance = await checkBalance(privateKey);
30
+ // Get positions if we have a client - use derived address to ensure correctness
31
+ let positions;
32
+ try {
33
+ const client = await HttpcatClient.create(privateKey);
34
+ // Log which address we're querying (for debugging)
35
+ console.log(chalk.dim(` Querying positions for address: ${formatAddress(derivedAddress, 12)}`));
36
+ positions = await getPositions(client, derivedAddress);
37
+ // The API should filter by userAddress, so positions returned should be for this address
38
+ // If positions exist but balances are 0, that's suspicious - log a warning
39
+ if (positions && positions.positions.length > 0) {
40
+ const ethBalance = parseFloat(balance.ethFormatted);
41
+ const usdcBalance = parseFloat(balance.usdcFormatted.replace('$', ''));
42
+ if (ethBalance === 0 && usdcBalance === 0) {
43
+ console.log(chalk.yellow(` ⚠️ Warning: Found ${positions.positions.length} position(s) but account has 0 ETH and 0 USDC.`));
44
+ console.log(chalk.yellow(` This might indicate positions are for a different address.`));
45
+ }
46
+ }
47
+ }
48
+ catch (error) {
49
+ // If positions fail, just continue without them
50
+ console.warn("Could not fetch positions:", error);
51
+ }
52
+ return {
53
+ account,
54
+ balance,
55
+ positions,
56
+ };
57
+ }
58
+ /**
59
+ * Display account information
60
+ */
61
+ export function displayAccountInfo(data) {
62
+ const { account, balance, positions } = data;
63
+ console.log();
64
+ console.log(chalk.cyan("=".repeat(80)));
65
+ console.log(chalk.cyan.bold("👤 Account Information"));
66
+ console.log(chalk.cyan("=".repeat(80)));
67
+ console.log();
68
+ // Account details
69
+ const accountTable = createTable(["Property", "Value"]);
70
+ accountTable.push(["Account Index", account.index.toString()], ["Type", account.type === "custom" ? "Custom (Private Key)" : "Seed-Derived"], ["Address", formatAddress(account.address, 12)], ["Full Address", account.address]);
71
+ if (account.label) {
72
+ accountTable.push(["Label", account.label]);
73
+ }
74
+ console.log(accountTable.toString());
75
+ console.log();
76
+ // Balance information
77
+ console.log(chalk.cyan.bold("💰 Balances"));
78
+ console.log();
79
+ const balanceTable = createTable(["Asset", "Balance"]);
80
+ balanceTable.push(["ETH", chalk.yellow(balance.ethFormatted)], ["USDC", chalk.green(`$${balance.usdcFormatted}`)]);
81
+ console.log(balanceTable.toString());
82
+ console.log();
83
+ // Positions if available
84
+ if (positions && positions.positions.length > 0) {
85
+ console.log(chalk.cyan.bold("💼 Positions"));
86
+ console.log();
87
+ displayPositions(positions);
88
+ }
89
+ else if (positions) {
90
+ console.log(chalk.cyan.bold("💼 Positions"));
91
+ console.log();
92
+ console.log(chalk.dim("No positions found."));
93
+ console.log();
94
+ }
95
+ }
96
+ /**
97
+ * List all accounts
98
+ */
99
+ export function listAccounts() {
100
+ const accounts = config.getAllAccounts();
101
+ const activeIndex = config.getActiveAccountIndex();
102
+ console.log();
103
+ console.log(chalk.cyan.bold("📋 All Accounts"));
104
+ console.log();
105
+ if (accounts.length === 0) {
106
+ console.log(chalk.yellow("No accounts configured."));
107
+ console.log();
108
+ console.log(chalk.dim('Run "httpcat config" to set up your wallet.'));
109
+ console.log();
110
+ return;
111
+ }
112
+ const table = createTable(["Index", "Type", "Address", "Status"]);
113
+ for (const account of accounts) {
114
+ const isActive = account.index === activeIndex;
115
+ const status = isActive ? chalk.green("● Active") : chalk.dim("○ Inactive");
116
+ const type = account.type === "custom" ? "Custom" : "Seed-Derived";
117
+ const address = formatAddress(account.address, 12);
118
+ table.push([account.index.toString(), type, address, status]);
119
+ }
120
+ console.log(table.toString());
121
+ console.log();
122
+ console.log(chalk.dim(`Active account: ${chalk.green(activeIndex.toString())}`));
123
+ console.log();
124
+ }
125
+ /**
126
+ * Switch active account
127
+ */
128
+ export function switchAccount(index) {
129
+ const accounts = config.getAllAccounts();
130
+ const account = accounts.find((acc) => acc.index === index);
131
+ if (!account) {
132
+ throw new Error(`Account at index ${index} not found. Use "httpcat account list" to see available accounts.`);
133
+ }
134
+ config.setActiveAccount(index);
135
+ console.log();
136
+ console.log(chalk.green(`✅ Switched to account ${index}`));
137
+ console.log(chalk.dim(` Address: ${formatAddress(account.address, 12)}`));
138
+ console.log();
139
+ }
140
+ /**
141
+ * Add a new seed-derived account
142
+ */
143
+ export async function addAccount() {
144
+ const accounts = config.getAllAccounts();
145
+ const hasSeedPhrase = !!config.get("encryptedSeedPhrase");
146
+ const password = config.getPassword() || "";
147
+ // Check if we already have a seed phrase
148
+ if (hasSeedPhrase) {
149
+ // Find the highest seed-derived account index
150
+ const seedAccounts = accounts.filter((acc) => acc.type === "seed");
151
+ const maxIndex = seedAccounts.length > 0
152
+ ? Math.max(...seedAccounts.map((acc) => acc.index))
153
+ : 0;
154
+ // Next account index
155
+ const nextIndex = maxIndex + 1;
156
+ const seedIndex = nextIndex - 1; // Seed index is account index - 1
157
+ // Get seed phrase
158
+ config.ensureSessionValid();
159
+ const encrypted = config.get("encryptedSeedPhrase");
160
+ let seedPhrase;
161
+ if (password) {
162
+ if (!config.isSessionValid()) {
163
+ throw new Error("Session expired. Please unlock your wallet.");
164
+ }
165
+ seedPhrase = decryptData(encrypted, password);
166
+ }
167
+ else {
168
+ seedPhrase = encrypted;
169
+ }
170
+ // Derive new account
171
+ const { seedPhraseToPrivateKey, getAddressFromPrivateKey } = await import("../utils/wallet.js");
172
+ const privateKey = seedPhraseToPrivateKey(seedPhrase, seedIndex);
173
+ const address = getAddressFromPrivateKey(privateKey);
174
+ // Add account
175
+ config.addAccount({
176
+ type: "seed",
177
+ index: nextIndex,
178
+ address,
179
+ });
180
+ console.log();
181
+ console.log(chalk.green(`✅ Added account ${nextIndex}`));
182
+ console.log(chalk.dim(` Address: ${formatAddress(address, 12)}`));
183
+ console.log();
184
+ }
185
+ else {
186
+ // No seed phrase - need to generate or import one
187
+ console.log();
188
+ console.log(chalk.yellow("⚠️ No seed phrase found."));
189
+ console.log(chalk.dim(" To add more accounts, you need to set up a seed phrase."));
190
+ console.log();
191
+ const inquirer = (await import("inquirer")).default;
192
+ const { handleGenerateSeedPhrase, handleImportSeedPhrase } = await import("../utils/privateKeyPrompt.js");
193
+ const choice = await inquirer.prompt([
194
+ {
195
+ type: "list",
196
+ name: "option",
197
+ message: "How would you like to add accounts?",
198
+ choices: [
199
+ { name: "Generate new seed phrase", value: "generate" },
200
+ { name: "Import existing seed phrase", value: "import" },
201
+ ],
202
+ },
203
+ ]);
204
+ let seedPhrase;
205
+ if (choice.option === "generate") {
206
+ seedPhrase = await handleGenerateSeedPhrase();
207
+ }
208
+ else {
209
+ seedPhrase = await handleImportSeedPhrase();
210
+ }
211
+ // Save seed phrase
212
+ config.setEncryptedSeedPhrase(seedPhrase, password);
213
+ // Create Account 1 (first seed-derived account)
214
+ const { seedPhraseToPrivateKey, getAddressFromPrivateKey } = await import("../utils/wallet.js");
215
+ const account1PrivateKey = seedPhraseToPrivateKey(seedPhrase, 0);
216
+ const account1Address = getAddressFromPrivateKey(account1PrivateKey);
217
+ config.addAccount({
218
+ type: "seed",
219
+ index: 1,
220
+ address: account1Address,
221
+ });
222
+ console.log();
223
+ console.log(chalk.green("✅ Seed phrase saved"));
224
+ console.log(chalk.green(`✅ Added account 1`));
225
+ console.log(chalk.dim(` Address: ${formatAddress(account1Address, 12)}`));
226
+ console.log();
227
+ }
228
+ }
229
+ //# sourceMappingURL=account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.js","sourceRoot":"","sources":["../../src/commands/account.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAW7C,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,SAAS,GAAG,eAAe,GAAG,OAAO,CAAC;IAC5C,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAaD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkC7E;AAED,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,aAAa,EACrB,eAAe,CAAC,EAAE,MAAM,EACxB,MAAM,GAAE,OAAe,GACtB,OAAO,CAAC,cAAc,CAAC,CA+BzB;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,CAAC,CAa5B;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,CAAC,CAS/B;AAgND,wBAAsB,eAAe,CACnC,MAAM,EAAE,aAAa,EACrB,QAAQ,GAAE,OAAe,EACzB,eAAe,CAAC,EAAE,MAAM,EACxB,WAAW,GAAE,MAAM,GAAG,aAAsB,GAC3C,OAAO,CAAC,IAAI,CAAC,CAm2Df;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAQjE"}
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAW7C,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,SAAS,GAAG,eAAe,GAAG,OAAO,CAAC;IAC5C,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAaD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkC7E;AAED,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,EACnB,eAAe,CAAC,EAAE,MAAM,EACxB,MAAM,GAAE,OAAe,GACtB,OAAO,CAAC,cAAc,CAAC,CAoCzB;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,iBAAiB,CAAC,CAa5B;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,CAAC,CAS/B;AAiND,wBAAsB,eAAe,CACnC,MAAM,EAAE,aAAa,EACrB,QAAQ,GAAE,OAAe,EACzB,eAAe,CAAC,EAAE,MAAM,EACxB,WAAW,GAAE,MAAM,GAAG,aAAsB,GAC3C,OAAO,CAAC,IAAI,CAAC,CAq2Df;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAQjE"}
@@ -55,7 +55,7 @@ export function normalizeWebSocketUrl(wsUrl, agentUrl) {
55
55
  return wsUrl;
56
56
  }
57
57
  }
58
- export async function joinChat(client, tokenIdentifier, silent = false) {
58
+ export async function joinChat(client, userAddress, tokenIdentifier, silent = false) {
59
59
  let tokenId;
60
60
  // If token identifier provided, resolve it to tokenId
61
61
  if (tokenIdentifier) {
@@ -70,7 +70,11 @@ export async function joinChat(client, tokenIdentifier, silent = false) {
70
70
  tokenId = await resolveTokenId(tokenIdentifier, client, silent);
71
71
  }
72
72
  }
73
- const input = tokenId ? { tokenId } : {};
73
+ // Validate userAddress is defined
74
+ if (!userAddress || typeof userAddress !== 'string') {
75
+ throw new Error(`userAddress is required but got: ${typeof userAddress} - ${userAddress}`);
76
+ }
77
+ const input = tokenId ? { tokenId, userAddress } : { userAddress };
74
78
  const { data } = await client.invoke(CHAT_JOIN_ENTRYPOINT, input);
75
79
  // Format author addresses for last messages
76
80
  data.lastMessages = data.lastMessages.map((msg) => ({
@@ -79,16 +83,16 @@ export async function joinChat(client, tokenIdentifier, silent = false) {
79
83
  }));
80
84
  return data;
81
85
  }
82
- export async function sendChatMessage(client, message, leaseId) {
86
+ export async function sendChatMessage(client, message, leaseId, userAddress) {
83
87
  if (!message.trim()) {
84
88
  throw new Error("Message cannot be empty");
85
89
  }
86
- const input = { message, leaseId };
90
+ const input = { message, leaseId, userAddress };
87
91
  const { data } = await client.invoke(CHAT_MESSAGE_ENTRYPOINT, input);
88
92
  return data;
89
93
  }
90
- export async function renewLease(client, leaseId) {
91
- const input = leaseId ? { leaseId } : {};
94
+ export async function renewLease(client, userAddress, leaseId) {
95
+ const input = leaseId ? { leaseId, userAddress } : { userAddress };
92
96
  const { data } = await client.invoke(CHAT_RENEW_LEASE_ENTRYPOINT, input);
93
97
  return data;
94
98
  }
@@ -236,7 +240,7 @@ function updateHeaderBox(headerBox, leaseInfo, tokenName, isConnected = false) {
236
240
  // Clear and set content to prevent overlapping
237
241
  headerBox.setContent(lines.join("\n"));
238
242
  }
239
- async function ensureLeaseValid(client, leaseInfo, messageLogBox, screen) {
243
+ async function ensureLeaseValid(client, userAddress, leaseInfo, messageLogBox, screen) {
240
244
  if (!leaseInfo || leaseInfo.leaseExpiresAt.getTime() <= Date.now()) {
241
245
  // Lease expired or doesn't exist, renew it
242
246
  if (messageLogBox) {
@@ -248,7 +252,7 @@ async function ensureLeaseValid(client, leaseInfo, messageLogBox, screen) {
248
252
  clearLine();
249
253
  console.log(chalk.yellow("⏱️ Lease expired. Renewing..."));
250
254
  }
251
- const renewal = await renewLease(client, leaseInfo?.leaseId);
255
+ const renewal = await renewLease(client, userAddress, leaseInfo?.leaseId);
252
256
  return {
253
257
  leaseId: renewal.leaseId,
254
258
  leaseExpiresAt: new Date(renewal.leaseExpiresAt),
@@ -276,6 +280,23 @@ export async function startChatStream(client, jsonMode = false, tokenIdentifier,
276
280
  let headerBox = null;
277
281
  let messageLogBox = null;
278
282
  let inputBox = null;
283
+ // Get userAddress from private key first (required for all chat operations)
284
+ try {
285
+ const privateKey = config.getPrivateKey();
286
+ if (privateKey) {
287
+ const account = privateKeyToAccount(privateKey);
288
+ userAddress = account.address;
289
+ }
290
+ else {
291
+ throw new Error("Private key not configured. Please run 'httpcat config' or set HTTPCAT_PRIVATE_KEY environment variable.");
292
+ }
293
+ }
294
+ catch (error) {
295
+ if (error instanceof Error && error.message.includes("Private key")) {
296
+ throw error;
297
+ }
298
+ throw new Error("Failed to get user address from private key. Please check your configuration.");
299
+ }
279
300
  // Join chat
280
301
  try {
281
302
  if (!jsonMode) {
@@ -286,24 +307,11 @@ export async function startChatStream(client, jsonMode = false, tokenIdentifier,
286
307
  console.log(chalk.dim("Joining general chat room..."));
287
308
  }
288
309
  }
289
- const joinResult = await joinChat(client, tokenIdentifier, jsonMode);
310
+ const joinResult = await joinChat(client, userAddress, tokenIdentifier, jsonMode);
290
311
  leaseInfo = {
291
312
  leaseId: joinResult.leaseId,
292
313
  leaseExpiresAt: new Date(joinResult.leaseExpiresAt),
293
314
  };
294
- // Initialize userAddress from config if available (fallback until first message)
295
- if (!userAddress) {
296
- try {
297
- const privateKey = config.getPrivateKey();
298
- if (privateKey) {
299
- const account = privateKeyToAccount(privateKey);
300
- userAddress = account.address;
301
- }
302
- }
303
- catch (error) {
304
- // Ignore - will be set from first message send
305
- }
306
- }
307
315
  if (jsonMode) {
308
316
  // JSON mode: output join result and stream messages as JSON
309
317
  console.log(JSON.stringify({
@@ -918,7 +926,7 @@ export async function startChatStream(client, jsonMode = false, tokenIdentifier,
918
926
  try {
919
927
  inputBox?.setValue("⏱️ Renewing lease...");
920
928
  screen?.render();
921
- const renewal = await renewLease(client, leaseInfo?.leaseId);
929
+ const renewal = await renewLease(client, userAddress, leaseInfo?.leaseId);
922
930
  leaseInfo = {
923
931
  leaseId: renewal.leaseId,
924
932
  leaseExpiresAt: new Date(renewal.leaseExpiresAt),
@@ -1260,7 +1268,7 @@ export async function startChatStream(client, jsonMode = false, tokenIdentifier,
1260
1268
  pulseIntervals.set(tempMessageId, pulseInterval);
1261
1269
  try {
1262
1270
  // Ensure lease is valid before sending
1263
- leaseInfo = await ensureLeaseValid(client, leaseInfo, messageLogBox || undefined, screen || undefined);
1271
+ leaseInfo = await ensureLeaseValid(client, userAddress, leaseInfo, messageLogBox || undefined, screen || undefined);
1264
1272
  if (headerBox) {
1265
1273
  updateHeaderBox(headerBox, leaseInfo, tokenIdentifier, true);
1266
1274
  screen?.render();
@@ -1270,7 +1278,7 @@ export async function startChatStream(client, jsonMode = false, tokenIdentifier,
1270
1278
  if (!ws || ws.readyState !== 1) {
1271
1279
  throw new Error("WebSocket connection lost. Please wait for reconnection.");
1272
1280
  }
1273
- const result = await sendChatMessage(client, trimmed, leaseInfo.leaseId);
1281
+ const result = await sendChatMessage(client, trimmed, leaseInfo.leaseId, userAddress);
1274
1282
  userAddress = result.author;
1275
1283
  // Track this message
1276
1284
  pendingMessages.set(result.messageId, tempMessageId);
@@ -1330,7 +1338,7 @@ export async function startChatStream(client, jsonMode = false, tokenIdentifier,
1330
1338
  case "/renew": {
1331
1339
  try {
1332
1340
  console.log(chalk.yellow("⏱️ Renewing lease..."));
1333
- const renewal = await renewLease(client, leaseInfo?.leaseId);
1341
+ const renewal = await renewLease(client, userAddress, leaseInfo?.leaseId);
1334
1342
  leaseInfo = {
1335
1343
  leaseId: renewal.leaseId,
1336
1344
  leaseExpiresAt: new Date(renewal.leaseExpiresAt),
@@ -1553,13 +1561,12 @@ export async function startChatStream(client, jsonMode = false, tokenIdentifier,
1553
1561
  currentInput = trimmed;
1554
1562
  try {
1555
1563
  // Ensure lease is valid before sending
1556
- leaseInfo = await ensureLeaseValid(client, leaseInfo, undefined, undefined);
1564
+ leaseInfo = await ensureLeaseValid(client, userAddress, leaseInfo, undefined, undefined);
1557
1565
  // Double-check websocket is still connected
1558
1566
  if (!ws || ws.readyState !== 1) {
1559
1567
  throw new Error("WebSocket connection lost. Please wait for reconnection.");
1560
1568
  }
1561
- const result = await sendChatMessage(client, trimmed, leaseInfo.leaseId);
1562
- userAddress = result.author;
1569
+ const result = await sendChatMessage(client, trimmed, leaseInfo.leaseId, userAddress);
1563
1570
  // Track this message
1564
1571
  const tempMessageId = `pending-${Date.now()}-${Math.random()}`;
1565
1572
  pendingMessages.set(result.messageId, tempMessageId);
@@ -1689,7 +1696,7 @@ export async function startChatStream(client, jsonMode = false, tokenIdentifier,
1689
1696
  case '/renew': {
1690
1697
  try {
1691
1698
  console.log(JSON.stringify({ type: 'renewing_lease' }));
1692
- const renewal = await renewLease(client, leaseInfo?.leaseId);
1699
+ const renewal = await renewLease(client, userAddress, leaseInfo?.leaseId);
1693
1700
  leaseInfo = {
1694
1701
  leaseId: renewal.leaseId,
1695
1702
  leaseExpiresAt: new Date(renewal.leaseExpiresAt),
@@ -1835,12 +1842,11 @@ export async function startChatStream(client, jsonMode = false, tokenIdentifier,
1835
1842
  // Send message
1836
1843
  isSending = true;
1837
1844
  try {
1838
- leaseInfo = await ensureLeaseValid(client, leaseInfo, undefined, undefined);
1845
+ leaseInfo = await ensureLeaseValid(client, userAddress, leaseInfo, undefined, undefined);
1839
1846
  if (!ws || ws.readyState !== 1) {
1840
1847
  throw new Error("WebSocket connection lost. Please wait for reconnection.");
1841
1848
  }
1842
- const result = await sendChatMessage(client, messageText, leaseInfo.leaseId);
1843
- userAddress = result.author;
1849
+ const result = await sendChatMessage(client, messageText, leaseInfo.leaseId, userAddress);
1844
1850
  // Track this message
1845
1851
  const tempMessageId = `pending-${Date.now()}-${Math.random()}`;
1846
1852
  pendingMessages.set(result.messageId, tempMessageId);