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.
- package/.claude/settings.local.json +10 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +41 -6
- package/dist/client.js.map +1 -1
- package/dist/commands/account.d.ts.map +1 -0
- package/dist/commands/account.js +229 -0
- package/dist/commands/account.js.map +1 -0
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +39 -33
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/info.d.ts.map +1 -1
- package/dist/commands/info.js +15 -3
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/positions.d.ts.map +1 -1
- package/dist/commands/positions.js +2 -2
- package/dist/commands/positions.js.map +1 -1
- package/dist/commands/transactions.d.ts.map +1 -0
- package/dist/commands/transactions.js +59 -0
- package/dist/commands/transactions.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +295 -7
- package/dist/config.js.map +1 -1
- package/dist/index.js +302 -16
- package/dist/index.js.map +1 -1
- package/dist/interactive/shell.d.ts.map +1 -1
- package/dist/interactive/shell.js +6 -1
- package/dist/interactive/shell.js.map +1 -1
- package/dist/mcp/chat-state.d.ts.map +1 -1
- package/dist/mcp/chat-state.js +17 -3
- package/dist/mcp/chat-state.js.map +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +31 -6
- package/dist/mcp/tools.js.map +1 -1
- package/dist/utils/privateKeyPrompt.d.ts.map +1 -1
- package/dist/utils/privateKeyPrompt.js +238 -32
- package/dist/utils/privateKeyPrompt.js.map +1 -1
- package/dist/utils/token-resolver.d.ts.map +1 -1
- package/dist/utils/token-resolver.js +15 -4
- package/dist/utils/token-resolver.js.map +1 -1
- package/dist/utils/wallet.d.ts.map +1 -0
- package/dist/utils/wallet.js +134 -0
- package/dist/utils/wallet.js.map +1 -0
- package/homebrew-httpcat/Formula/httpcat.rb +3 -3
- package/homebrew-httpcat/homebrew-httpcat/Formula/httpcat.rb +3 -3
- 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": []
|
package/dist/client.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAWrC,MAAM,OAAO,aAAa;IAChB,gBAAgB,CAAe;IAC/B,QAAQ,CAAS;IACjB,OAAO,CAAS;IAExB,YACE,gBAA8B,EAC9B,QAAgB,EAChB,OAAe;QAEf,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAgB;QAClC,MAAM,EAAE,GAAG,UAAU,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,2CAA2C;QAClF,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAEnD,gDAAgD;QAChD,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,wBAAwB,OAAO,sDAAsD,CACtF,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAE/C,mCAAmC;QACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,qCAAqC;QAChG,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAEvE,OAAO,IAAI,aAAa,CAAC,gBAAgB,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,MAAM,CACV,UAAkB,EAClB,KAAa;QAEb,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,QAAQ,gBAAgB,UAAU,SAAS,CAAC;QAErE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE;YACrD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;SAChC,CAAC,CAAC;QAEH,oCAAoC;QACpC,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACjE,MAAM,OAAO,GAA4B,aAAa;YACpD,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE;YAC3B,CAAC,CAAC,SAAS,CAAC;QAEd,iBAAiB;QACjB,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAE3C,gCAAgC;QAChC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,sEAAsE;YACtE,IAAI,YAAiB,CAAC;YACtB,IAAI,YAAoB,CAAC;YAEzB,IAAI,CAAC;gBACH,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACxC,+CAA+C;gBAC/C,YAAY;
|
|
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;
|
|
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"}
|
package/dist/commands/chat.js
CHANGED
|
@@ -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
|
-
|
|
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);
|