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