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