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