@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 +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.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.
|
|
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/
|
|
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
|
|
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/
|
|
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
|
|
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
|
|
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.
|
|
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/
|
|
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/
|
|
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/
|
|
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
|
-
|
|
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/${
|
|
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/
|
|
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/
|
|
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)
|
|
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)
|
|
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/
|
|
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
|
|
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
|
|
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
|
{
|