@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/cli.cjs +41 -24
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +41 -24
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +41 -24
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +41 -24
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
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
|
|
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/
|
|
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
|
|
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/
|
|
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
|
|
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
|
|
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.
|
|
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/
|
|
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/
|
|
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/
|
|
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
|
-
|
|
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/${
|
|
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/
|
|
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/
|
|
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)
|
|
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)
|
|
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/
|
|
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
|
|
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
|
|
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
|
{
|