@haven_ai/cli 0.1.37-alpha.0 → 0.2.0-alpha.0

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.cjs CHANGED
@@ -604,7 +604,10 @@ async function runConnector(connectorCommand, spawner, onStderr) {
604
604
 
605
605
  // src/commands.ts
606
606
  var DEFAULT_API = "https://havenbackend-production-8a00.up.railway.app";
607
- var CLI_VERSION = "0.1.37-alpha.0";
607
+ var CLI_VERSION = "0.2.0-alpha.0";
608
+ function accountAddressOf(s) {
609
+ return s.account_address ?? s.safe_address ?? "";
610
+ }
608
611
  async function run(argv, deps = {}) {
609
612
  const out = deps.out ?? ((l) => process.stdout.write(`${l}
610
613
  `));
@@ -875,35 +878,35 @@ async function cmdWhoami(args, d) {
875
878
  }
876
879
  async function cmdWalletsList(args, d) {
877
880
  const { api } = await authed(args, d);
878
- const { safes } = await api.get("/user/safes");
881
+ const { safes } = await api.get("/user/accounts");
879
882
  emit(
880
883
  d,
881
884
  args.flags.json,
882
885
  safes,
883
886
  () => safes.length === 0 ? "No Haven wallets yet." : table(
884
887
  ["NAME", "NETWORK", "ADDRESS", "DEFAULT"],
885
- safes.map((s) => [s.name, chainName(s.chain_id), truncateAddress(s.safe_address), s.is_default ? "\u2713" : ""])
888
+ safes.map((s) => [s.name, chainName(s.chain_id), truncateAddress(accountAddressOf(s)), s.is_default ? "\u2713" : ""])
886
889
  )
887
890
  );
888
891
  return EXIT.ok;
889
892
  }
890
893
  async function cmdWalletsBalances(args, d) {
891
894
  const { api } = await authed(args, d);
892
- const { safes } = await api.get("/user/safes");
895
+ const { safes } = await api.get("/user/accounts");
893
896
  const safe = pickSafe(safes, args.flags.safe);
894
897
  if (!safe) {
895
898
  if (args.flags.safe) throw new UsageError(`No wallet matches "${args.flags.safe}".`);
896
899
  throw new CliApiError("No Haven wallet found.", 404);
897
900
  }
898
901
  const { balances } = await api.get(
899
- `/balances/${safe.safe_address}?chain_id=${safe.chain_id}`
902
+ `/balances/${accountAddressOf(safe)}?chain_id=${safe.chain_id}`
900
903
  );
901
904
  emit(
902
905
  d,
903
906
  args.flags.json,
904
- { safe: safe.name, chainId: safe.chain_id, balances },
907
+ { account: safe.name, safe: safe.name, chainId: safe.chain_id, balances },
905
908
  () => [
906
- `${safe.name} \xB7 ${chainName(safe.chain_id)} \xB7 ${truncateAddress(safe.safe_address)}`,
909
+ `${safe.name} \xB7 ${chainName(safe.chain_id)} \xB7 ${truncateAddress(accountAddressOf(safe))}`,
907
910
  balances.length === 0 ? " (no balances)" : table(["TOKEN", "BALANCE"], balances.map((b) => [b.symbol, b.formatted]))
908
911
  ].join("\n")
909
912
  );
@@ -912,17 +915,17 @@ async function cmdWalletsBalances(args, d) {
912
915
  function pickSafe(safes, ref) {
913
916
  if (!ref) return safes.find((s) => s.is_default) ?? safes[0];
914
917
  const lower = ref.toLowerCase();
915
- return safes.find((s) => s.id === ref || s.safe_address.toLowerCase() === lower);
918
+ return safes.find((s) => s.id === ref || accountAddressOf(s).toLowerCase() === lower);
916
919
  }
917
920
  async function cmdWalletsFunding(args, d) {
918
921
  const { api } = await authed(args, d);
919
- const { safes } = await api.get("/user/safes");
922
+ const { safes } = await api.get("/user/accounts");
920
923
  const safe = pickSafe(safes, args.flags.safe);
921
924
  if (!safe) {
922
925
  if (args.flags.safe) throw new UsageError(`No wallet matches "${args.flags.safe}".`);
923
926
  throw new CliApiError("No Haven wallet found.", 404);
924
927
  }
925
- const funding = await api.get(`/user/safes/${safe.id}/funding`);
928
+ const funding = await api.get(`/user/accounts/${safe.id}/funding`);
926
929
  if (!args.flags.wait) {
927
930
  emitFunding(d, funding);
928
931
  return EXIT.ok;
@@ -943,7 +946,7 @@ async function cmdWalletsFunding(args, d) {
943
946
  );
944
947
  }
945
948
  await d.sleep(pollMs);
946
- current = await api.get(`/user/safes/${safe.id}/funding`);
949
+ current = await api.get(`/user/accounts/${safe.id}/funding`);
947
950
  if (current.funded) break;
948
951
  d.o.note(`Still waiting after ${elapsedLabel(Date.now() - started)} \u2014 funded: no.`);
949
952
  }
@@ -1060,11 +1063,13 @@ async function cmdBudgetGrant(args, d) {
1060
1063
  EXIT.refused
1061
1064
  );
1062
1065
  }
1063
- if (!agent.safe_address || !agent.safe_chain_id) {
1066
+ const accountAddress = agent.account_address ?? agent.safe_address;
1067
+ const accountChainId = agent.account_chain_id ?? agent.safe_chain_id;
1068
+ if (!accountAddress || !accountChainId) {
1064
1069
  throw new HavenCliError(`Agent ${id} has no wallet assigned yet \u2014 connect it first.`, EXIT.refused);
1065
1070
  }
1066
1071
  const { balances } = await api.get(
1067
- `/balances/${agent.safe_address}?chain_id=${agent.safe_chain_id}`
1072
+ `/balances/${accountAddress}?chain_id=${accountChainId}`
1068
1073
  );
1069
1074
  const wanted = args.flags.token.trim().toUpperCase();
1070
1075
  const token = balances.find((b) => b.symbol.toUpperCase() === wanted);
@@ -1233,13 +1238,13 @@ async function cmdWalletRename(args, d) {
1233
1238
  const name = nameParts.join(" ").trim();
1234
1239
  if (!id || !name) throw new UsageError("Usage: haven wallets rename <id> <name>");
1235
1240
  const { api } = await authed(args, d);
1236
- await api.put(`/user/safes/${id}`, { name });
1237
- emit(d, args.flags.json, { ok: true, safe_id: id, name }, () => `Wallet ${id} renamed to "${name}".`);
1241
+ await api.put(`/user/accounts/${id}`, { name });
1242
+ emit(d, args.flags.json, { ok: true, account_id: id, safe_id: id, name }, () => `Wallet ${id} renamed to "${name}".`);
1238
1243
  return EXIT.ok;
1239
1244
  }
1240
1245
  async function resolveSafeId(args, api) {
1241
1246
  if (!args.flags.safe) return void 0;
1242
- const { safes } = await api.get("/user/safes");
1247
+ const { safes } = await api.get("/user/accounts");
1243
1248
  const safe = pickSafe(safes, args.flags.safe);
1244
1249
  if (!safe) throw new UsageError(`No wallet matches "${args.flags.safe}".`);
1245
1250
  return safe.id;
@@ -1251,7 +1256,10 @@ async function cmdActivityList(args, d) {
1251
1256
  offset: String(args.flags.offset ?? 0),
1252
1257
  limit: String(args.flags.limit ?? 25)
1253
1258
  });
1254
- if (safeId) params.set("safeId", safeId);
1259
+ if (safeId) {
1260
+ params.set("accountId", safeId);
1261
+ params.set("safeId", safeId);
1262
+ }
1255
1263
  if (args.flags.agent) params.set("agentId", args.flags.agent);
1256
1264
  const { transactions } = await api.get(`/transactions?${params.toString()}`);
1257
1265
  const visible = args.flags.direction ? transactions.filter((t) => t.direction === args.flags.direction) : transactions;
@@ -1280,7 +1288,10 @@ async function cmdActivityExport(args, d) {
1280
1288
  offset: String(args.flags.offset ?? 0),
1281
1289
  limit: String(args.flags.limit ?? 1e3)
1282
1290
  });
1283
- if (safeId) params.set("safeId", safeId);
1291
+ if (safeId) {
1292
+ params.set("accountId", safeId);
1293
+ params.set("safeId", safeId);
1294
+ }
1284
1295
  if (args.flags.agent) params.set("agentId", args.flags.agent);
1285
1296
  const { transactions } = await api.get(`/transactions?${params.toString()}`);
1286
1297
  const visible = args.flags.direction ? transactions.filter((t) => t.direction === args.flags.direction) : transactions;
@@ -1296,7 +1307,8 @@ async function cmdActivityExport(args, d) {
1296
1307
  "safe_address",
1297
1308
  "agent_name",
1298
1309
  "tx_hash",
1299
- "chain_id"
1310
+ "chain_id",
1311
+ "account_address"
1300
1312
  ];
1301
1313
  const rows = visible.map((t) => [
1302
1314
  new Date(t.timestamp * 1e3).toISOString(),
@@ -1307,10 +1319,11 @@ async function cmdActivityExport(args, d) {
1307
1319
  t.tokenSymbol ?? t.asset ?? "",
1308
1320
  t.tokenAddress ?? "",
1309
1321
  (t.direction === "in" ? t.from : t.to) ?? "",
1310
- t.safeAddress ?? "",
1322
+ t.accountAddress ?? t.safeAddress ?? "",
1311
1323
  t.agentName ?? "",
1312
1324
  t.hash,
1313
- t.chainId != null ? String(t.chainId) : ""
1325
+ t.chainId != null ? String(t.chainId) : "",
1326
+ t.accountAddress ?? t.safeAddress ?? ""
1314
1327
  ]);
1315
1328
  d.o.text(toCsv(headers, rows), { format: "csv", rows: rows.length });
1316
1329
  return EXIT.ok;
@@ -1351,14 +1364,14 @@ async function cmdCatalogList(args, d) {
1351
1364
  return EXIT.ok;
1352
1365
  }
1353
1366
  async function resolveWalletAndToken(args, api, symbol) {
1354
- const { safes } = await api.get("/user/safes");
1367
+ const { safes } = await api.get("/user/accounts");
1355
1368
  if (safes.length === 0) {
1356
1369
  throw new HavenCliError("No wallet on this account yet \u2014 finish onboarding first.", EXIT.refused);
1357
1370
  }
1358
- const safe = args.flags.safe ? safes.find((s) => s.id === args.flags.safe || s.safe_address === args.flags.safe) : safes.find((s) => s.is_default) ?? safes[0];
1371
+ const safe = args.flags.safe ? safes.find((s) => s.id === args.flags.safe || accountAddressOf(s) === args.flags.safe) : safes.find((s) => s.is_default) ?? safes[0];
1359
1372
  if (!safe) throw new UsageError(`No wallet matches --safe ${args.flags.safe}`);
1360
1373
  const { balances } = await api.get(
1361
- `/balances/${safe.safe_address}?chain_id=${safe.chain_id}`
1374
+ `/balances/${accountAddressOf(safe)}?chain_id=${safe.chain_id}`
1362
1375
  );
1363
1376
  const wanted = symbol.trim().toUpperCase();
1364
1377
  const token = balances.find((b) => b.symbol.toUpperCase() === wanted);
@@ -1405,6 +1418,10 @@ async function cmdAgentsConnect(args, d) {
1405
1418
  if (!amount.ok) throw new UsageError(amount.message);
1406
1419
  const setup = await api.post("/agent-connection-setups", {
1407
1420
  name,
1421
+ // #2908: both id keys for the window — `account_id` is the #2907 twin
1422
+ // (landing in P0's second round), `safe_id` is what a server without it
1423
+ // reads; the request works against either.
1424
+ account_id: safeId,
1408
1425
  safe_id: safeId,
1409
1426
  allowances: [
1410
1427
  {