@exagent/agent 0.1.22 → 0.1.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/dist/cli.js CHANGED
@@ -1659,7 +1659,7 @@ function classifyTradeError(message) {
1659
1659
  if (lower.includes("notauthorizedforagent") || lower.includes("not authorized")) {
1660
1660
  return {
1661
1661
  category: "not_authorized",
1662
- userMessage: "Wallet not authorized for this agent. Ensure your wallet is linked via the registry."
1662
+ userMessage: 'Wallet not authorized for this agent. This wallet is not linked to your agent on-chain, so the router rejected the trade. To fix: (1) Open your command center at exagent.io, (2) Use the Wallet Management panel to check linked wallets, (3) If you lost your old wallet, unlink it first then re-run the agent to link the new one. Run "npx @exagent/agent export-key" to verify which wallet this agent is using.'
1663
1663
  };
1664
1664
  }
1665
1665
  if (lower.includes("aggregatornotwhitelisted")) {
@@ -3702,7 +3702,7 @@ function loadSecureEnv(basePath, passphrase) {
3702
3702
  }
3703
3703
 
3704
3704
  // src/index.ts
3705
- var AGENT_VERSION = "0.1.22";
3705
+ var AGENT_VERSION = "0.1.23";
3706
3706
 
3707
3707
  // src/relay.ts
3708
3708
  var RelayClient = class {
@@ -5306,6 +5306,37 @@ async function checkFirstRunSetup(configPath) {
5306
5306
  let privateKey;
5307
5307
  let walletAddress;
5308
5308
  if (walletSetup === "generate") {
5309
+ console.log("");
5310
+ console.log("!".repeat(60));
5311
+ console.log(" WALLET BACKUP \u2014 READ BEFORE CONTINUING");
5312
+ console.log("!".repeat(60));
5313
+ console.log("");
5314
+ console.log(" WHY THIS MATTERS:");
5315
+ console.log(" Exagent is non-custodial. Your trading wallet key is");
5316
+ console.log(" generated here on your machine and never leaves it.");
5317
+ console.log(" We do not store it. No one else has a copy.");
5318
+ console.log("");
5319
+ console.log(" WHAT THIS MEANS:");
5320
+ console.log(" The private key will live ONLY in the .env file");
5321
+ console.log(" in this folder. If you delete this folder, your");
5322
+ console.log(" wallet and ALL FUNDS in it are permanently lost.");
5323
+ console.log(" There is NO recovery \u2014 Exagent cannot help.");
5324
+ console.log("");
5325
+ console.log(" BEFORE CONTINUING:");
5326
+ console.log(" - Know where this folder is on your computer");
5327
+ console.log(" - Plan to back up .env (or .env.enc) after setup");
5328
+ console.log(" - Store your passphrase in a password manager");
5329
+ console.log(" - View your key anytime: npx @exagent/agent export-key");
5330
+ console.log("");
5331
+ console.log("!".repeat(60));
5332
+ console.log("");
5333
+ const ack = await prompt(' Type "I understand" to continue: ');
5334
+ if (ack.trim().toLowerCase() !== "i understand") {
5335
+ console.log("");
5336
+ console.log(" Setup cancelled. Run the agent again when ready.");
5337
+ process.exit(0);
5338
+ }
5339
+ console.log("");
5309
5340
  console.log("[WALLET] Generating a new wallet for your agent...");
5310
5341
  console.log("");
5311
5342
  const generatedKey = (0, import_accounts6.generatePrivateKey)();
@@ -5319,8 +5350,9 @@ async function checkFirstRunSetup(configPath) {
5319
5350
  console.log(" | " + walletAddress.padEnd(56) + " |");
5320
5351
  console.log(" +" + "-".repeat(58) + "+");
5321
5352
  console.log("");
5322
- console.log(" IMPORTANT: Your private key has been saved to .env");
5323
- console.log(" Back up this file securely. If lost, your funds are gone.");
5353
+ console.log(" CRITICAL: Back up your .env file now.");
5354
+ console.log(" Export your key anytime: npx @exagent/agent export-key");
5355
+ console.log(" If you lose .env AND your backup, funds are unrecoverable.");
5324
5356
  console.log("");
5325
5357
  const confirmed = await prompt(" Press Enter to continue, or Ctrl+C to cancel...");
5326
5358
  } else {
@@ -5649,4 +5681,56 @@ program.command("encrypt").description("Encrypt .env file to .env.enc for secure
5649
5681
  process.exit(1);
5650
5682
  }
5651
5683
  });
5684
+ program.command("export-key").description("Display your trading wallet private key for backup").option("-d, --dir <path>", "Directory containing .env or .env.enc file", ".").option("-p, --passphrase <passphrase>", "Passphrase to decrypt .env.enc").action(async (options) => {
5685
+ try {
5686
+ const dir = options.dir.startsWith("/") ? options.dir : path2.join(process.cwd(), options.dir);
5687
+ let passphrase = options.passphrase || process.env.EXAGENT_PASSPHRASE;
5688
+ const encPath = path2.join(dir, ".env.enc");
5689
+ const envPath = path2.join(dir, ".env");
5690
+ if (fs2.existsSync(encPath) && !passphrase) {
5691
+ console.log("");
5692
+ console.log(" Encrypted config found (.env.enc)");
5693
+ console.log("");
5694
+ passphrase = await prompt(" Enter passphrase: ", true);
5695
+ console.log("");
5696
+ }
5697
+ const usedEncrypted = loadSecureEnv(dir, passphrase);
5698
+ if (!usedEncrypted && fs2.existsSync(envPath)) {
5699
+ const { config: loadDotenv } = await import("dotenv");
5700
+ loadDotenv({ path: envPath, override: true });
5701
+ }
5702
+ const privateKey = process.env.EXAGENT_PRIVATE_KEY;
5703
+ if (!privateKey) {
5704
+ console.error("");
5705
+ console.error(" No private key found. Make sure .env or .env.enc exists in this directory.");
5706
+ console.error("");
5707
+ process.exit(1);
5708
+ }
5709
+ const { privateKeyToAccount: privateKeyToAccount7 } = await import("viem/accounts");
5710
+ const account = privateKeyToAccount7(privateKey);
5711
+ console.log("");
5712
+ console.log("=".repeat(60));
5713
+ console.log(" WALLET PRIVATE KEY EXPORT");
5714
+ console.log("=".repeat(60));
5715
+ console.log("");
5716
+ console.log(" +" + "-".repeat(58) + "+");
5717
+ console.log(" | WALLET ADDRESS: |");
5718
+ console.log(" | " + account.address.padEnd(56) + " |");
5719
+ console.log(" +" + "-".repeat(58) + "+");
5720
+ console.log(" | PRIVATE KEY: |");
5721
+ console.log(" | " + privateKey.padEnd(56) + " |");
5722
+ console.log(" +" + "-".repeat(58) + "+");
5723
+ console.log("");
5724
+ console.log(" WARNING: Anyone with this key controls your wallet.");
5725
+ console.log(" Store it in a password manager. Never share it.");
5726
+ console.log(" Never paste it in a browser, email, or chat.");
5727
+ console.log("");
5728
+ console.log("=".repeat(60));
5729
+ console.log("");
5730
+ process.exit(0);
5731
+ } catch (error) {
5732
+ console.error("Error:", error instanceof Error ? error.message : error);
5733
+ process.exit(1);
5734
+ }
5735
+ });
5652
5736
  program.parse();
package/dist/cli.mjs CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  loadConfig,
7
7
  loadSecureEnv,
8
8
  validateConfig
9
- } from "./chunk-EJHDRG5Y.mjs";
9
+ } from "./chunk-NENK6U55.mjs";
10
10
 
11
11
  // src/cli.ts
12
12
  import { Command } from "commander";
@@ -89,6 +89,37 @@ async function checkFirstRunSetup(configPath) {
89
89
  let privateKey;
90
90
  let walletAddress;
91
91
  if (walletSetup === "generate") {
92
+ console.log("");
93
+ console.log("!".repeat(60));
94
+ console.log(" WALLET BACKUP \u2014 READ BEFORE CONTINUING");
95
+ console.log("!".repeat(60));
96
+ console.log("");
97
+ console.log(" WHY THIS MATTERS:");
98
+ console.log(" Exagent is non-custodial. Your trading wallet key is");
99
+ console.log(" generated here on your machine and never leaves it.");
100
+ console.log(" We do not store it. No one else has a copy.");
101
+ console.log("");
102
+ console.log(" WHAT THIS MEANS:");
103
+ console.log(" The private key will live ONLY in the .env file");
104
+ console.log(" in this folder. If you delete this folder, your");
105
+ console.log(" wallet and ALL FUNDS in it are permanently lost.");
106
+ console.log(" There is NO recovery \u2014 Exagent cannot help.");
107
+ console.log("");
108
+ console.log(" BEFORE CONTINUING:");
109
+ console.log(" - Know where this folder is on your computer");
110
+ console.log(" - Plan to back up .env (or .env.enc) after setup");
111
+ console.log(" - Store your passphrase in a password manager");
112
+ console.log(" - View your key anytime: npx @exagent/agent export-key");
113
+ console.log("");
114
+ console.log("!".repeat(60));
115
+ console.log("");
116
+ const ack = await prompt(' Type "I understand" to continue: ');
117
+ if (ack.trim().toLowerCase() !== "i understand") {
118
+ console.log("");
119
+ console.log(" Setup cancelled. Run the agent again when ready.");
120
+ process.exit(0);
121
+ }
122
+ console.log("");
92
123
  console.log("[WALLET] Generating a new wallet for your agent...");
93
124
  console.log("");
94
125
  const generatedKey = generatePrivateKey();
@@ -102,8 +133,9 @@ async function checkFirstRunSetup(configPath) {
102
133
  console.log(" | " + walletAddress.padEnd(56) + " |");
103
134
  console.log(" +" + "-".repeat(58) + "+");
104
135
  console.log("");
105
- console.log(" IMPORTANT: Your private key has been saved to .env");
106
- console.log(" Back up this file securely. If lost, your funds are gone.");
136
+ console.log(" CRITICAL: Back up your .env file now.");
137
+ console.log(" Export your key anytime: npx @exagent/agent export-key");
138
+ console.log(" If you lose .env AND your backup, funds are unrecoverable.");
107
139
  console.log("");
108
140
  const confirmed = await prompt(" Press Enter to continue, or Ctrl+C to cancel...");
109
141
  } else {
@@ -432,4 +464,56 @@ program.command("encrypt").description("Encrypt .env file to .env.enc for secure
432
464
  process.exit(1);
433
465
  }
434
466
  });
467
+ program.command("export-key").description("Display your trading wallet private key for backup").option("-d, --dir <path>", "Directory containing .env or .env.enc file", ".").option("-p, --passphrase <passphrase>", "Passphrase to decrypt .env.enc").action(async (options) => {
468
+ try {
469
+ const dir = options.dir.startsWith("/") ? options.dir : path.join(process.cwd(), options.dir);
470
+ let passphrase = options.passphrase || process.env.EXAGENT_PASSPHRASE;
471
+ const encPath = path.join(dir, ".env.enc");
472
+ const envPath = path.join(dir, ".env");
473
+ if (fs.existsSync(encPath) && !passphrase) {
474
+ console.log("");
475
+ console.log(" Encrypted config found (.env.enc)");
476
+ console.log("");
477
+ passphrase = await prompt(" Enter passphrase: ", true);
478
+ console.log("");
479
+ }
480
+ const usedEncrypted = loadSecureEnv(dir, passphrase);
481
+ if (!usedEncrypted && fs.existsSync(envPath)) {
482
+ const { config: loadDotenv } = await import("dotenv");
483
+ loadDotenv({ path: envPath, override: true });
484
+ }
485
+ const privateKey = process.env.EXAGENT_PRIVATE_KEY;
486
+ if (!privateKey) {
487
+ console.error("");
488
+ console.error(" No private key found. Make sure .env or .env.enc exists in this directory.");
489
+ console.error("");
490
+ process.exit(1);
491
+ }
492
+ const { privateKeyToAccount: privateKeyToAccount2 } = await import("viem/accounts");
493
+ const account = privateKeyToAccount2(privateKey);
494
+ console.log("");
495
+ console.log("=".repeat(60));
496
+ console.log(" WALLET PRIVATE KEY EXPORT");
497
+ console.log("=".repeat(60));
498
+ console.log("");
499
+ console.log(" +" + "-".repeat(58) + "+");
500
+ console.log(" | WALLET ADDRESS: |");
501
+ console.log(" | " + account.address.padEnd(56) + " |");
502
+ console.log(" +" + "-".repeat(58) + "+");
503
+ console.log(" | PRIVATE KEY: |");
504
+ console.log(" | " + privateKey.padEnd(56) + " |");
505
+ console.log(" +" + "-".repeat(58) + "+");
506
+ console.log("");
507
+ console.log(" WARNING: Anyone with this key controls your wallet.");
508
+ console.log(" Store it in a password manager. Never share it.");
509
+ console.log(" Never paste it in a browser, email, or chat.");
510
+ console.log("");
511
+ console.log("=".repeat(60));
512
+ console.log("");
513
+ process.exit(0);
514
+ } catch (error) {
515
+ console.error("Error:", error instanceof Error ? error.message : error);
516
+ process.exit(1);
517
+ }
518
+ });
435
519
  program.parse();
package/dist/index.d.mts CHANGED
@@ -339,9 +339,9 @@ declare const AgentConfigSchema: z.ZodObject<{
339
339
  }>>;
340
340
  allowedTokens: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
341
341
  }, "strip", z.ZodTypeAny, {
342
+ agentId: string | number;
342
343
  name: string;
343
344
  network: "mainnet";
344
- agentId: string | number;
345
345
  llm: {
346
346
  provider: "custom" | "openai" | "anthropic" | "google" | "deepseek" | "mistral" | "groq" | "together" | "ollama";
347
347
  temperature: number;
@@ -388,8 +388,8 @@ declare const AgentConfigSchema: z.ZodObject<{
388
388
  } | undefined;
389
389
  allowedTokens?: string[] | undefined;
390
390
  }, {
391
- name: string;
392
391
  agentId: string | number;
392
+ name: string;
393
393
  llm: {
394
394
  provider: "custom" | "openai" | "anthropic" | "google" | "deepseek" | "mistral" | "groq" | "together" | "ollama";
395
395
  model?: string | undefined;
@@ -2103,6 +2103,6 @@ declare function decryptEnvFile(encPath: string, passphrase: string): Record<str
2103
2103
  declare function loadSecureEnv(basePath: string, passphrase?: string): boolean;
2104
2104
 
2105
2105
  /** @exagent/agent package version — update alongside package.json */
2106
- declare const AGENT_VERSION = "0.1.22";
2106
+ declare const AGENT_VERSION = "0.1.23";
2107
2107
 
2108
2108
  export { AGENT_VERSION, type AccountSummary, type AgentConfig, AgentConfigSchema, type AgentMode, AgentRuntime, type AgentStatusPayload, AnthropicAdapter, BaseLLMAdapter, type CommandType, DeepSeekAdapter, FileStore, type FillCallback, type FundingCallback, type FundingPayment, GoogleAdapter, GroqAdapter, HYPERLIQUID_DOMAIN, HyperliquidClient, HyperliquidSigner, HyperliquidWebSocket, type LLMAdapter, type LLMConfig, LLMConfigSchema, type LLMMessage, type LLMMetadata, type LLMProvider, LLMProviderSchema, type LLMResponse, type LiquidationCallback, type MarketData, MarketDataService, type MessageLevel, type MessageType, MistralAdapter, OllamaAdapter, type OnboardingStatus, OpenAIAdapter, OrderManager, type OrderResult, type PerpAction, type PerpConfig$1 as PerpConfig, PerpConfigSchema, type PerpFill, type PerpMarketData, PerpOnboarding, type PerpPosition, type PerpStrategyFunction, PerpTradeRecorder, type PerpTradeSignal, type PerpConfig as PerpTradingConfig, PositionManager, type PositionSummary, PositionTracker, type RecordPerpTradeParams, RelayClient, type RelayCommand, type RelayConfig$1 as RelayConfig, RelayConfigSchema, RiskManager, type RiskState, type RiskUniverse, RiskUniverseSchema, type RuntimeConfig, STRATEGY_TEMPLATES, type StrategyContext, type StrategyFunction, type StrategyStore, type StrategyTemplate, TogetherAdapter, type TrackedPosition, TradeExecutor, type TradeRecord, type TradeSignal, type TradingConfig, TradingConfigSchema, type VaultConfig, VaultConfigSchema, VaultManager, type VaultManagerConfig, type VaultPolicy, VaultPolicySchema, type VaultStatus, createLLMAdapter, createSampleConfig, decryptEnvFile, encryptEnvFile, fillHashToBytes32, fillOidToBytes32, getAllStrategyTemplates, getNextNonce, getStrategyTemplate, loadConfig, loadSecureEnv, loadStrategy, validateConfig, validateStrategy };
package/dist/index.d.ts CHANGED
@@ -339,9 +339,9 @@ declare const AgentConfigSchema: z.ZodObject<{
339
339
  }>>;
340
340
  allowedTokens: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
341
341
  }, "strip", z.ZodTypeAny, {
342
+ agentId: string | number;
342
343
  name: string;
343
344
  network: "mainnet";
344
- agentId: string | number;
345
345
  llm: {
346
346
  provider: "custom" | "openai" | "anthropic" | "google" | "deepseek" | "mistral" | "groq" | "together" | "ollama";
347
347
  temperature: number;
@@ -388,8 +388,8 @@ declare const AgentConfigSchema: z.ZodObject<{
388
388
  } | undefined;
389
389
  allowedTokens?: string[] | undefined;
390
390
  }, {
391
- name: string;
392
391
  agentId: string | number;
392
+ name: string;
393
393
  llm: {
394
394
  provider: "custom" | "openai" | "anthropic" | "google" | "deepseek" | "mistral" | "groq" | "together" | "ollama";
395
395
  model?: string | undefined;
@@ -2103,6 +2103,6 @@ declare function decryptEnvFile(encPath: string, passphrase: string): Record<str
2103
2103
  declare function loadSecureEnv(basePath: string, passphrase?: string): boolean;
2104
2104
 
2105
2105
  /** @exagent/agent package version — update alongside package.json */
2106
- declare const AGENT_VERSION = "0.1.22";
2106
+ declare const AGENT_VERSION = "0.1.23";
2107
2107
 
2108
2108
  export { AGENT_VERSION, type AccountSummary, type AgentConfig, AgentConfigSchema, type AgentMode, AgentRuntime, type AgentStatusPayload, AnthropicAdapter, BaseLLMAdapter, type CommandType, DeepSeekAdapter, FileStore, type FillCallback, type FundingCallback, type FundingPayment, GoogleAdapter, GroqAdapter, HYPERLIQUID_DOMAIN, HyperliquidClient, HyperliquidSigner, HyperliquidWebSocket, type LLMAdapter, type LLMConfig, LLMConfigSchema, type LLMMessage, type LLMMetadata, type LLMProvider, LLMProviderSchema, type LLMResponse, type LiquidationCallback, type MarketData, MarketDataService, type MessageLevel, type MessageType, MistralAdapter, OllamaAdapter, type OnboardingStatus, OpenAIAdapter, OrderManager, type OrderResult, type PerpAction, type PerpConfig$1 as PerpConfig, PerpConfigSchema, type PerpFill, type PerpMarketData, PerpOnboarding, type PerpPosition, type PerpStrategyFunction, PerpTradeRecorder, type PerpTradeSignal, type PerpConfig as PerpTradingConfig, PositionManager, type PositionSummary, PositionTracker, type RecordPerpTradeParams, RelayClient, type RelayCommand, type RelayConfig$1 as RelayConfig, RelayConfigSchema, RiskManager, type RiskState, type RiskUniverse, RiskUniverseSchema, type RuntimeConfig, STRATEGY_TEMPLATES, type StrategyContext, type StrategyFunction, type StrategyStore, type StrategyTemplate, TogetherAdapter, type TrackedPosition, TradeExecutor, type TradeRecord, type TradeSignal, type TradingConfig, TradingConfigSchema, type VaultConfig, VaultConfigSchema, VaultManager, type VaultManagerConfig, type VaultPolicy, VaultPolicySchema, type VaultStatus, createLLMAdapter, createSampleConfig, decryptEnvFile, encryptEnvFile, fillHashToBytes32, fillOidToBytes32, getAllStrategyTemplates, getNextNonce, getStrategyTemplate, loadConfig, loadSecureEnv, loadStrategy, validateConfig, validateStrategy };
package/dist/index.js CHANGED
@@ -1747,7 +1747,7 @@ function classifyTradeError(message) {
1747
1747
  if (lower.includes("notauthorizedforagent") || lower.includes("not authorized")) {
1748
1748
  return {
1749
1749
  category: "not_authorized",
1750
- userMessage: "Wallet not authorized for this agent. Ensure your wallet is linked via the registry."
1750
+ userMessage: 'Wallet not authorized for this agent. This wallet is not linked to your agent on-chain, so the router rejected the trade. To fix: (1) Open your command center at exagent.io, (2) Use the Wallet Management panel to check linked wallets, (3) If you lost your old wallet, unlink it first then re-run the agent to link the new one. Run "npx @exagent/agent export-key" to verify which wallet this agent is using.'
1751
1751
  };
1752
1752
  }
1753
1753
  if (lower.includes("aggregatornotwhitelisted")) {
@@ -5317,7 +5317,7 @@ function loadSecureEnv(basePath, passphrase) {
5317
5317
  }
5318
5318
 
5319
5319
  // src/index.ts
5320
- var AGENT_VERSION = "0.1.22";
5320
+ var AGENT_VERSION = "0.1.23";
5321
5321
  // Annotate the CommonJS export names for ESM import in node:
5322
5322
  0 && (module.exports = {
5323
5323
  AGENT_VERSION,
package/dist/index.mjs CHANGED
@@ -49,7 +49,7 @@ import {
49
49
  loadStrategy,
50
50
  validateConfig,
51
51
  validateStrategy
52
- } from "./chunk-EJHDRG5Y.mjs";
52
+ } from "./chunk-NENK6U55.mjs";
53
53
  export {
54
54
  AGENT_VERSION,
55
55
  AgentConfigSchema,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exagent/agent",
3
- "version": "0.1.22",
3
+ "version": "0.1.23",
4
4
  "description": "Autonomous trading agent runtime for Exagent",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",