@haven_ai/cli 0.1.28-alpha.0 → 0.1.29-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 +1 -1
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/args.ts","../src/api.ts","../src/session.ts","../src/format.ts","../src/csv.ts","../src/commands.ts"],"names":["resolve","homedir","join","readFile","mkdir","writeFile","chmod","rm"],"mappings":"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","file":"index.cjs","sourcesContent":["export interface ParsedArgs {\n command?: string\n sub?: string\n positionals: string[]\n flags: {\n json: boolean\n help: boolean\n version: boolean\n yes: boolean\n api?: string\n email?: string\n safe?: string\n agent?: string\n limit?: number\n offset?: number\n direction?: 'in' | 'out'\n format?: string\n from?: string\n to?: string\n company?: string\n }\n}\n\nconst VALUE_FLAGS = new Set([\n '--api', '--email', '--safe', '--agent', '--limit', '--offset', '--direction',\n '--format', '--from', '--to', '--company',\n])\n\n/**\n * `haven <command> [sub] [positionals] [--flags]`. Deliberately small — no\n * dependency, no clever aliasing. Unknown flags throw so typos fail loudly.\n */\nexport function parseArgs(argv: string[]): ParsedArgs {\n const positionals: string[] = []\n const flags: ParsedArgs['flags'] = { json: false, help: false, version: false, yes: false }\n\n for (let i = 0; i < argv.length; i += 1) {\n const arg = argv[i]\n if (arg === '--json') flags.json = true\n else if (arg === '--help' || arg === '-h') flags.help = true\n else if (arg === '--version' || arg === '-v') flags.version = true\n else if (arg === '--yes' || arg === '-y') flags.yes = true\n else if (VALUE_FLAGS.has(arg)) {\n const value = argv[++i]\n if (value === undefined || value.startsWith('--')) {\n throw new Error(`Missing value for ${arg}`)\n }\n if (arg === '--api') flags.api = value\n else if (arg === '--email') flags.email = value\n else if (arg === '--safe') flags.safe = value\n else if (arg === '--agent') flags.agent = value\n else if (arg === '--limit') {\n const n = Number(value)\n if (!Number.isInteger(n) || n <= 0) throw new Error('--limit must be a positive integer')\n flags.limit = n\n } else if (arg === '--offset') {\n const n = Number(value)\n if (!Number.isInteger(n) || n < 0) throw new Error('--offset must be a non-negative integer')\n flags.offset = n\n } else if (arg === '--direction') {\n if (value !== 'in' && value !== 'out') throw new Error('--direction must be \"in\" or \"out\"')\n flags.direction = value\n } else if (arg === '--format') {\n if (value !== 'csv' && value !== 'sie') throw new Error('--format must be \"csv\" or \"sie\"')\n flags.format = value\n } else if (arg === '--from') flags.from = value\n else if (arg === '--to') flags.to = value\n else if (arg === '--company') flags.company = value\n } else if (arg.startsWith('--')) {\n throw new Error(`Unknown option: ${arg}`)\n } else {\n positionals.push(arg)\n }\n }\n\n const [command, sub, ...rest] = positionals\n return { command, sub, positionals: rest, flags }\n}\n\nexport function helpText(): string {\n return [\n 'haven — terminal-native companion to the Haven dashboard',\n '',\n 'Usage: haven <command> [subcommand] [options]',\n '',\n 'Auth:',\n ' login [--email <e>] Sign in (password via prompt or HAVEN_PASSWORD)',\n ' logout Clear the saved session',\n ' whoami Show the signed-in user',\n '',\n 'Read:',\n ' wallets list List your Haven wallets',\n ' wallets balances [--safe <id|address>] Token balances for a wallet',\n ' agents list List your agents',\n ' agents show <id> Show one agent + its budget',\n ' budget show <agentId> Show an agent\\'s configured budget',\n ' activity list [--safe <id|address>] [--agent <id>] [--direction in|out] [--limit <n>] [--offset <n>]',\n ' activity export [filters] Emit CSV to stdout (--format csv, default)',\n ' activity export --format sie [--from <ISO>] [--to <ISO>] [--company <name>]',\n ' Bookkeeping-ready SIE 4I (Fortnox/Visma/Bokio)',\n ' catalog list List payable services',\n ' contacts list List your address book',\n '',\n 'Manage (backend-only — no on-chain signing):',\n ' agents pause|resume <id>',\n ' agents revoke <id> --yes Permanently revoke an agent',\n ' agents rotate-key <id> Issue a new API key (shown once)',\n ' agents rename <id> <name>',\n ' wallets rename <id> <name>',\n ' contacts add <name> <address> | contacts remove <id>',\n '',\n 'Options:',\n ' --json Machine-readable output (for scripting)',\n ' --yes, -y Skip the confirmation prompt for destructive actions',\n ' --api <url> Backend URL (default: HAVEN_API_URL or http://localhost:3001)',\n ' --help, --version',\n '',\n 'On-chain actions (deploy, budgets, approvers, send) are signed in the',\n 'dashboard — this CLI reads and manages; it never holds your keys.',\n ].join('\\n')\n}\n","export class CliApiError extends Error {\n status: number\n constructor(message: string, status: number) {\n super(message)\n this.name = 'CliApiError'\n this.status = status\n }\n}\n\nexport interface CliApi {\n get<T>(path: string): Promise<T>\n post<T>(path: string, body?: unknown): Promise<T>\n put<T>(path: string, body?: unknown): Promise<T>\n del<T>(path: string): Promise<T>\n /** GET a non-JSON body (e.g. an export file) as raw text. */\n getText(path: string): Promise<string>\n}\n\nexport interface CreateCliApiOptions {\n baseUrl: string\n token?: string\n fetchImpl?: typeof fetch\n}\n\n/**\n * Minimal JSON client for the Haven backend. Sends the user JWT as a Bearer\n * token when present, and surfaces backend `{ error }` messages as\n * `CliApiError` so commands can print something human.\n */\nexport function createCliApi({ baseUrl, token, fetchImpl = fetch }: CreateCliApiOptions): CliApi {\n const root = baseUrl.replace(/\\/+$/, '')\n\n async function request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const headers: Record<string, string> = { Accept: 'application/json' }\n if (token) headers.Authorization = `Bearer ${token}`\n if (body !== undefined) headers['Content-Type'] = 'application/json'\n\n let res: Response\n try {\n res = await fetchImpl(`${root}${path}`, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n } catch (err) {\n throw new CliApiError(\n `Could not reach Haven at ${root}: ${err instanceof Error ? err.message : String(err)}`,\n 0,\n )\n }\n\n if (res.status === 401) {\n throw new CliApiError('Not authenticated. Run `haven login` first.', 401)\n }\n\n const text = await res.text()\n const payload = text ? safeParse(text) : undefined\n\n if (!res.ok) {\n const message =\n (payload && typeof payload === 'object' && 'error' in payload && typeof payload.error === 'string'\n ? payload.error\n : null) ?? `Request failed (HTTP ${res.status}).`\n throw new CliApiError(message, res.status)\n }\n\n return payload as T\n }\n\n async function requestText(path: string): Promise<string> {\n const headers: Record<string, string> = { Accept: 'text/plain' }\n if (token) headers.Authorization = `Bearer ${token}`\n\n let res: Response\n try {\n res = await fetchImpl(`${root}${path}`, { method: 'GET', headers })\n } catch (err) {\n throw new CliApiError(\n `Could not reach Haven at ${root}: ${err instanceof Error ? err.message : String(err)}`,\n 0,\n )\n }\n\n if (res.status === 401) {\n throw new CliApiError('Not authenticated. Run `haven login` first.', 401)\n }\n\n const text = await res.text()\n if (!res.ok) {\n const payload = text ? safeParse(text) : undefined\n const message =\n (payload && typeof payload === 'object' && 'error' in payload && typeof payload.error === 'string'\n ? payload.error\n : null) ?? `Request failed (HTTP ${res.status}).`\n throw new CliApiError(message, res.status)\n }\n return text\n }\n\n return {\n get: <T>(path: string) => request<T>('GET', path),\n post: <T>(path: string, body?: unknown) => request<T>('POST', path, body),\n put: <T>(path: string, body?: unknown) => request<T>('PUT', path, body),\n del: <T>(path: string) => request<T>('DELETE', path),\n getText: (path: string) => requestText(path),\n }\n}\n\nfunction safeParse(text: string): unknown {\n try {\n return JSON.parse(text)\n } catch {\n return undefined\n }\n}\n","import { mkdir, readFile, rm, writeFile, chmod } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { join, resolve } from 'node:path'\n\n/**\n * The signed-in user session. The token is a *user* JWT (same credential the\n * dashboard holds) — treat it like a secret: stored owner-only, never logged,\n * never sent anywhere but the Haven API. `apiBaseUrl` is pinned at login so\n * later commands talk to the same backend.\n */\nexport interface Session {\n token: string\n apiBaseUrl: string\n user: { id: string; email: string; name: string | null }\n}\n\nexport interface SessionStore {\n load(): Promise<Session | null>\n save(session: Session): Promise<void>\n clear(): Promise<void>\n path: string\n}\n\nfunction sessionDir(homeDir: string): string {\n return resolve(homeDir, '.haven')\n}\n\nexport function sessionPath(homeDir: string = homedir()): string {\n return join(sessionDir(homeDir), 'session.json')\n}\n\n/** File-backed session store, owner-only perms (0600 file in a 0700 dir). */\nexport function createSessionStore(homeDir: string = homedir()): SessionStore {\n const path = sessionPath(homeDir)\n return {\n path,\n async load() {\n try {\n const raw = await readFile(path, 'utf8')\n const parsed = JSON.parse(raw) as Partial<Session>\n if (!parsed.token || !parsed.apiBaseUrl || !parsed.user) return null\n return parsed as Session\n } catch {\n return null\n }\n },\n async save(session) {\n await mkdir(sessionDir(homeDir), { recursive: true, mode: 0o700 })\n await writeFile(path, `${JSON.stringify(session, null, 2)}\\n`, { mode: 0o600 })\n await chmod(path, 0o600).catch(() => undefined)\n },\n async clear() {\n await rm(path, { force: true })\n },\n }\n}\n","/** Tiny fixed-width table for human output. Scriptable callers use `--json`. */\nexport function table(headers: string[], rows: string[][]): string {\n const widths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => (r[i] ?? '').length)),\n )\n const line = (cells: string[]) =>\n cells.map((c, i) => (c ?? '').padEnd(widths[i])).join(' ').trimEnd()\n return [line(headers), line(widths.map((w) => '-'.repeat(w))), ...rows.map(line)].join('\\n')\n}\n\nexport function truncateAddress(address: string): string {\n if (!address || address.length <= 12) return address\n return `${address.slice(0, 6)}…${address.slice(-4)}`\n}\n\nconst CHAIN_NAMES: Record<number, string> = { 100: 'Gnosis', 8453: 'Base' }\n\nexport function chainName(chainId: number): string {\n return CHAIN_NAMES[chainId] ?? `chain ${chainId}`\n}\n","/**\n * CSV serialization for `haven activity export`. Mirrors the dashboard export\n * (#411): RFC 4180 quoting, CRLF line endings, and a spreadsheet\n * formula-injection guard. Kept self-contained so the CLI has no @haven_ai/*\n * runtime dependency.\n */\n\n/** Quote per RFC 4180 and neutralise leading =,+,-,@ (Excel formula injection). */\nfunction csvField(value: string): string {\n let v = value\n if (/^[=+\\-@\\t\\r]/.test(v)) v = `'${v}`\n return `\"${v.replace(/\"/g, '\"\"')}\"`\n}\n\nexport function toCsv(headers: string[], rows: string[][]): string {\n const lines = [headers.join(','), ...rows.map((r) => r.map(csvField).join(','))]\n return lines.join('\\r\\n')\n}\n","import { parseArgs, helpText, type ParsedArgs } from './args.js'\nimport { createCliApi, CliApiError, type CliApi } from './api.js'\nimport { createSessionStore, type Session, type SessionStore } from './session.js'\nimport { chainName, table, truncateAddress } from './format.js'\nimport { toCsv } from './csv.js'\n\n// Hosted Haven backend. Override with `--api <url>` or HAVEN_API_URL (e.g. a\n// local backend at http://localhost:3001, or your own domain once self-hosted).\nconst DEFAULT_API = 'https://havenbackend-production-8a00.up.railway.app'\n// Self-reported CLI version. Owned by scripts/release-bump.mjs, which rewrites\n// the string literal below on every release — keep it a bare quoted literal.\nexport const CLI_VERSION = '0.1.28-alpha.0'\n\nexport interface RunDeps {\n sessionStore?: SessionStore\n /** Build an API client; injected so tests can stub the backend. */\n makeApi?: (baseUrl: string, token?: string) => CliApi\n promptPassword?: () => Promise<string>\n out?: (line: string) => void\n err?: (line: string) => void\n env?: NodeJS.ProcessEnv\n}\n\ninterface ResolvedDeps {\n sessionStore: SessionStore\n makeApi: (baseUrl: string, token?: string) => CliApi\n promptPassword: () => Promise<string>\n out: (line: string) => void\n err: (line: string) => void\n env: NodeJS.ProcessEnv\n}\n\n// ── Backend response shapes (subset the CLI needs) ──────────────────\ninterface Safe { id: string; safe_address: string; chain_id: number; name: string; is_default: boolean }\ninterface Allowance { token_symbol: string; allowance_amount: string; reset_period_min: number }\ninterface Agent { id: string; name: string; status: string; allowances?: Allowance[] }\ninterface Balance { symbol: string; formatted: string; balance: string }\ninterface Txn {\n hash: string; direction: 'in' | 'out'; valueFormatted: string; asset: string\n source?: string; timestamp: number; safeName?: string\n from?: string; to?: string; isError?: boolean\n tokenSymbol?: string; tokenAddress?: string; chainId?: number; safeAddress?: string\n agentName?: string; paymentFlowStatus?: string | null; activityType?: string\n}\ninterface CatalogEntry { name: string; category: string; rail: string; price_display?: string | null; status: string }\ninterface Contact { id: string; name: string; address: string }\n\n/** Entry point. Returns a process exit code; never throws for expected errors. */\nexport async function run(argv: string[], deps: RunDeps = {}): Promise<number> {\n const d: ResolvedDeps = {\n sessionStore: deps.sessionStore ?? createSessionStore(),\n makeApi: deps.makeApi ?? ((baseUrl, token) => createCliApi({ baseUrl, token })),\n promptPassword: deps.promptPassword ?? (() => Promise.reject(new Error('No password input available'))),\n out: deps.out ?? ((l) => process.stdout.write(`${l}\\n`)),\n err: deps.err ?? ((l) => process.stderr.write(`${l}\\n`)),\n env: deps.env ?? process.env,\n }\n\n let args: ParsedArgs\n try {\n args = parseArgs(argv)\n } catch (e) {\n d.err(e instanceof Error ? e.message : String(e))\n return 1\n }\n\n if (args.flags.version) {\n d.out(CLI_VERSION)\n return 0\n }\n if (args.flags.help || !args.command) {\n d.out(helpText())\n return 0\n }\n\n try {\n return await dispatch(args, d)\n } catch (e) {\n if (e instanceof CliApiError) {\n d.err(e.message)\n return e.status === 401 ? 2 : 1\n }\n d.err(e instanceof Error ? e.message : String(e))\n return 1\n }\n}\n\nasync function dispatch(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const key = args.sub ? `${args.command} ${args.sub}` : args.command\n switch (key) {\n case 'login': return cmdLogin(args, d)\n case 'logout': return cmdLogout(d)\n case 'whoami': return cmdWhoami(args, d)\n case 'wallets list': return cmdWalletsList(args, d)\n case 'wallets balances': return cmdWalletsBalances(args, d)\n case 'agents list': return cmdAgentsList(args, d)\n case 'agents show': return cmdAgentsShow(args, d)\n case 'agents pause': return cmdAgentLifecycle(args, d, 'pause')\n case 'agents resume': return cmdAgentLifecycle(args, d, 'resume')\n case 'agents revoke': return cmdAgentRevoke(args, d)\n case 'agents rotate-key': return cmdAgentRotateKey(args, d)\n case 'agents rename': return cmdAgentRename(args, d)\n case 'budget show': return cmdBudgetShow(args, d)\n case 'wallets rename': return cmdWalletRename(args, d)\n case 'activity list': return cmdActivityList(args, d)\n case 'activity export': return cmdActivityExport(args, d)\n case 'catalog list': return cmdCatalogList(args, d)\n case 'contacts list': return cmdContactsList(args, d)\n case 'contacts add': return cmdContactsAdd(args, d)\n case 'contacts remove': return cmdContactsRemove(args, d)\n default:\n d.err(`Unknown command: ${key}. Run \\`haven --help\\`.`)\n return 1\n }\n}\n\nfunction baseUrlFor(args: ParsedArgs, d: ResolvedDeps, session: Session | null): string {\n return args.flags.api ?? session?.apiBaseUrl ?? d.env.HAVEN_API_URL ?? DEFAULT_API\n}\n\nasync function authed(args: ParsedArgs, d: ResolvedDeps): Promise<{ session: Session; api: CliApi }> {\n const session = await d.sessionStore.load()\n if (!session) throw new CliApiError('Not authenticated. Run `haven login` first.', 401)\n return { session, api: d.makeApi(baseUrlFor(args, d, session), session.token) }\n}\n\nfunction emit(d: ResolvedDeps, json: boolean, data: unknown, human: () => string): void {\n d.out(json ? JSON.stringify(data, null, 2) : human())\n}\n\n// ── Auth ────────────────────────────────────────────────────────────\n\nasync function cmdLogin(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const email = args.flags.email ?? d.env.HAVEN_EMAIL\n if (!email) {\n d.err('Provide an email with --email (or HAVEN_EMAIL).')\n return 1\n }\n const password = d.env.HAVEN_PASSWORD ?? (await d.promptPassword())\n if (!password) {\n d.err('A password is required.')\n return 1\n }\n const baseUrl = baseUrlFor(args, d, null)\n const api = d.makeApi(baseUrl)\n const res = await api.post<{ token: string; user: Session['user'] }>('/auth/login', { email, password })\n await d.sessionStore.save({ token: res.token, apiBaseUrl: baseUrl, user: res.user })\n emit(d, args.flags.json, { user: res.user, apiBaseUrl: baseUrl }, () => `Signed in as ${res.user.email}.`)\n return 0\n}\n\nasync function cmdLogout(d: ResolvedDeps): Promise<number> {\n await d.sessionStore.clear()\n d.out('Signed out.')\n return 0\n}\n\nasync function cmdWhoami(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const { api } = await authed(args, d)\n const user = await api.get<Session['user']>('/auth/me')\n emit(d, args.flags.json, user, () => `${user.email}${user.name ? ` (${user.name})` : ''}`)\n return 0\n}\n\n// ── Wallets ─────────────────────────────────────────────────────────\n\nasync function cmdWalletsList(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const { api } = await authed(args, d)\n const { safes } = await api.get<{ safes: Safe[] }>('/user/safes')\n emit(d, args.flags.json, safes, () =>\n safes.length === 0\n ? 'No Haven wallets yet.'\n : table(\n ['NAME', 'NETWORK', 'ADDRESS', 'DEFAULT'],\n safes.map((s) => [s.name, chainName(s.chain_id), truncateAddress(s.safe_address), s.is_default ? '✓' : '']),\n ),\n )\n return 0\n}\n\nasync function cmdWalletsBalances(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const { api } = await authed(args, d)\n const { safes } = await api.get<{ safes: Safe[] }>('/user/safes')\n const safe = pickSafe(safes, args.flags.safe)\n if (!safe) {\n d.err(args.flags.safe ? `No wallet matches \"${args.flags.safe}\".` : 'No Haven wallet found.')\n return 1\n }\n const { balances } = await api.get<{ balances: Balance[] }>(\n `/balances/${safe.safe_address}?chain_id=${safe.chain_id}`,\n )\n emit(d, args.flags.json, { safe: safe.name, chainId: safe.chain_id, balances }, () =>\n [\n `${safe.name} · ${chainName(safe.chain_id)} · ${truncateAddress(safe.safe_address)}`,\n balances.length === 0\n ? ' (no balances)'\n : table(['TOKEN', 'BALANCE'], balances.map((b) => [b.symbol, b.formatted])),\n ].join('\\n'),\n )\n return 0\n}\n\nfunction pickSafe(safes: Safe[], ref?: string): Safe | undefined {\n if (!ref) return safes.find((s) => s.is_default) ?? safes[0]\n const lower = ref.toLowerCase()\n return safes.find((s) => s.id === ref || s.safe_address.toLowerCase() === lower)\n}\n\n// ── Agents & budget ─────────────────────────────────────────────────\n\nasync function cmdAgentsList(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const { api } = await authed(args, d)\n const { agents } = await api.get<{ agents: Agent[] }>('/agents')\n emit(d, args.flags.json, agents, () =>\n agents.length === 0\n ? 'No agents yet.'\n : table(\n ['ID', 'NAME', 'STATUS', 'BUDGETS'],\n agents.map((a) => [a.id, a.name, a.status, budgetSummary(a.allowances)]),\n ),\n )\n return 0\n}\n\nasync function cmdAgentsShow(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const id = args.positionals[0]\n if (!id) { d.err('Usage: haven agents show <id>'); return 1 }\n const { api } = await authed(args, d)\n const agent = await api.get<Agent>(`/agents/${id}`)\n emit(d, args.flags.json, agent, () =>\n [\n `${agent.name} [${agent.status}]`,\n `id: ${agent.id}`,\n `budget: ${budgetSummary(agent.allowances)}`,\n ].join('\\n'),\n )\n return 0\n}\n\nasync function cmdBudgetShow(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const id = args.positionals[0]\n if (!id) { d.err('Usage: haven budget show <agentId>'); return 1 }\n const { api } = await authed(args, d)\n const agent = await api.get<Agent>(`/agents/${id}`)\n const allowances = agent.allowances ?? []\n emit(d, args.flags.json, allowances, () =>\n allowances.length === 0\n ? `${agent.name} has no configured budget.`\n : table(\n ['TOKEN', 'AMOUNT', 'RESETS'],\n allowances.map((a) => [a.token_symbol, a.allowance_amount, resetLabel(a.reset_period_min)]),\n ),\n )\n return 0\n}\n\nfunction budgetSummary(allowances?: Allowance[]): string {\n if (!allowances || allowances.length === 0) return '—'\n return allowances.map((a) => `${a.allowance_amount} ${a.token_symbol}`).join(', ')\n}\n\nfunction resetLabel(mins: number): string {\n if (mins === 0) return 'one-time'\n if (mins === 1440) return 'daily'\n if (mins === 10080) return 'weekly'\n if (mins === 43200) return 'monthly'\n return `every ${mins}m`\n}\n\nasync function cmdAgentLifecycle(args: ParsedArgs, d: ResolvedDeps, action: 'pause' | 'resume'): Promise<number> {\n const id = args.positionals[0]\n if (!id) { d.err(`Usage: haven agents ${action} <id>`); return 1 }\n const { api } = await authed(args, d)\n await api.post(`/agents/${id}/${action}`)\n d.out(`Agent ${id} ${action === 'pause' ? 'paused' : 'resumed'}.`)\n return 0\n}\n\nasync function cmdAgentRevoke(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const id = args.positionals[0]\n if (!id) { d.err('Usage: haven agents revoke <id> --yes'); return 1 }\n // Revoke is terminal (status can't go back to active). Require explicit --yes\n // so it can't happen by accident in a script.\n if (!args.flags.yes) {\n d.err(`This permanently revokes agent ${id}. Re-run with --yes to confirm.`)\n return 1\n }\n const { api } = await authed(args, d)\n await api.post(`/agents/${id}/revoke`)\n d.out(`Agent ${id} revoked. To also remove its on-chain allowance, use the dashboard.`)\n return 0\n}\n\nasync function cmdAgentRotateKey(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const id = args.positionals[0]\n if (!id) { d.err('Usage: haven agents rotate-key <id>'); return 1 }\n const { api } = await authed(args, d)\n const res = await api.post<{ api_key: string; api_key_prefix: string }>(`/agents/${id}/rotate-key`)\n if (args.flags.json) {\n d.out(JSON.stringify(res, null, 2))\n } else {\n d.out('New API key (shown once — store it now; the old key stops working):')\n d.out(res.api_key)\n }\n return 0\n}\n\nasync function cmdAgentRename(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const [id, ...nameParts] = args.positionals\n const name = nameParts.join(' ').trim()\n if (!id || !name) { d.err('Usage: haven agents rename <id> <name>'); return 1 }\n const { api } = await authed(args, d)\n await api.put(`/agents/${id}`, { name })\n d.out(`Agent ${id} renamed to \"${name}\".`)\n return 0\n}\n\nasync function cmdWalletRename(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const [id, ...nameParts] = args.positionals\n const name = nameParts.join(' ').trim()\n if (!id || !name) { d.err('Usage: haven wallets rename <id> <name>'); return 1 }\n const { api } = await authed(args, d)\n await api.put(`/user/safes/${id}`, { name })\n d.out(`Wallet ${id} renamed to \"${name}\".`)\n return 0\n}\n\n// ── Activity ────────────────────────────────────────────────────────\n\n/**\n * Resolve `--safe` (id or address) to a Safe id for the `/transactions` filter,\n * mirroring `wallets balances`. Throws if `--safe` was given but matches no\n * wallet, so a typo'd filter fails loudly instead of silently returning all rows.\n */\nasync function resolveSafeId(args: ParsedArgs, api: CliApi): Promise<string | undefined> {\n if (!args.flags.safe) return undefined\n const { safes } = await api.get<{ safes: Safe[] }>('/user/safes')\n const safe = pickSafe(safes, args.flags.safe)\n if (!safe) throw new CliApiError(`No wallet matches \"${args.flags.safe}\".`, 1)\n return safe.id\n}\n\nasync function cmdActivityList(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const { api } = await authed(args, d)\n const safeId = await resolveSafeId(args, api)\n const params = new URLSearchParams({\n offset: String(args.flags.offset ?? 0),\n limit: String(args.flags.limit ?? 25),\n })\n if (safeId) params.set('safeId', safeId)\n if (args.flags.agent) params.set('agentId', args.flags.agent)\n const { transactions } = await api.get<{ transactions: Txn[] }>(`/transactions?${params.toString()}`)\n const visible = args.flags.direction\n ? transactions.filter((t) => t.direction === args.flags.direction)\n : transactions\n emit(d, args.flags.json, visible, () =>\n visible.length === 0\n ? 'No activity.'\n : table(\n ['DATE', 'DIR', 'AMOUNT', 'TYPE', 'ACCOUNT'],\n visible.map((t) => [\n new Date(t.timestamp * 1000).toISOString().slice(0, 10),\n t.direction === 'in' ? 'in' : 'out',\n `${t.direction === 'in' ? '+' : '-'}${t.valueFormatted} ${t.asset}`,\n t.source ?? 'transfer',\n t.safeName ?? '',\n ]),\n ),\n )\n return 0\n}\n\nasync function cmdActivityExport(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n if (args.flags.format === 'sie') return exportSie(args, d)\n const { api } = await authed(args, d)\n const safeId = await resolveSafeId(args, api)\n const params = new URLSearchParams({\n offset: String(args.flags.offset ?? 0),\n limit: String(args.flags.limit ?? 1000),\n })\n if (safeId) params.set('safeId', safeId)\n if (args.flags.agent) params.set('agentId', args.flags.agent)\n const { transactions } = await api.get<{ transactions: Txn[] }>(`/transactions?${params.toString()}`)\n const visible = args.flags.direction\n ? transactions.filter((t) => t.direction === args.flags.direction)\n : transactions\n\n // Same columns as the dashboard export (#411), minus counterparty_name\n // (no contacts join in the CLI yet).\n const headers = [\n 'date', 'type', 'status', 'direction', 'amount', 'token_symbol', 'token_address',\n 'counterparty_address', 'safe_address', 'agent_name', 'tx_hash', 'chain_id',\n ]\n const rows = visible.map((t) => [\n new Date(t.timestamp * 1000).toISOString(),\n exportType(t),\n exportStatus(t),\n t.direction,\n t.valueFormatted,\n t.tokenSymbol ?? t.asset ?? '',\n t.tokenAddress ?? '',\n (t.direction === 'in' ? t.from : t.to) ?? '',\n t.safeAddress ?? '',\n t.agentName ?? '',\n t.hash,\n t.chainId != null ? String(t.chainId) : '',\n ])\n d.out(toCsv(headers, rows))\n return 0\n}\n\nfunction exportType(t: Txn): string {\n if (t.activityType === 'delegate_sweep') return 'allowance funding'\n if (t.source === 'x402') return 'x402'\n if (t.source === 'mpp_demo') return 'mpp'\n return t.direction === 'in' ? 'receive' : 'send'\n}\n\nfunction exportStatus(t: Txn): string {\n if (t.isError) return 'failed'\n if (t.paymentFlowStatus === 'confirming_merchant') return 'pending'\n return 'executed'\n}\n\n/** SIE 4I export: the backend builds the verifikat file (book-time SEK + BAS). */\nasync function exportSie(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const { api } = await authed(args, d)\n const params = new URLSearchParams({ format: 'sie' })\n if (args.flags.from) params.set('from', args.flags.from)\n if (args.flags.to) params.set('to', args.flags.to)\n if (args.flags.company) params.set('company', args.flags.company)\n const content = await api.getText(`/accounting/export?${params.toString()}`)\n d.out(content)\n return 0\n}\n\n// ── Catalog ─────────────────────────────────────────────────────────\n\nasync function cmdCatalogList(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const { api } = await authed(args, d)\n const { entries } = await api.get<{ entries: CatalogEntry[] }>('/catalog')\n emit(d, args.flags.json, entries, () =>\n entries.length === 0\n ? 'Catalog is empty.'\n : table(\n ['NAME', 'CATEGORY', 'RAIL', 'PRICE', 'STATUS'],\n entries.map((e) => [e.name, e.category, e.rail, e.price_display ?? '—', e.status]),\n ),\n )\n return 0\n}\n\n// ── Contacts ────────────────────────────────────────────────────────\n\nasync function cmdContactsList(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const { api } = await authed(args, d)\n const { contacts } = await api.get<{ contacts: Contact[] }>('/contacts')\n emit(d, args.flags.json, contacts, () =>\n contacts.length === 0\n ? 'No contacts yet.'\n : table(['ID', 'NAME', 'ADDRESS'], contacts.map((c) => [c.id, c.name, truncateAddress(c.address)])),\n )\n return 0\n}\n\nasync function cmdContactsAdd(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const [address, ...nameParts] = [...args.positionals].reverse()\n // positionals are <name...> <address>; address is last, name is the rest.\n const name = nameParts.reverse().join(' ').trim()\n if (!name || !address) { d.err('Usage: haven contacts add <name> <address>'); return 1 }\n const { api } = await authed(args, d)\n const contact = await api.post<Contact>('/contacts', { name, address })\n emit(d, args.flags.json, contact, () => `Added contact \"${contact.name}\" (${truncateAddress(contact.address)}).`)\n return 0\n}\n\nasync function cmdContactsRemove(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const id = args.positionals[0]\n if (!id) { d.err('Usage: haven contacts remove <id>'); return 1 }\n const { api } = await authed(args, d)\n await api.del(`/contacts/${id}`)\n d.out(`Contact ${id} removed.`)\n return 0\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/args.ts","../src/api.ts","../src/session.ts","../src/format.ts","../src/csv.ts","../src/commands.ts"],"names":["resolve","homedir","join","readFile","mkdir","writeFile","chmod","rm"],"mappings":"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","file":"index.cjs","sourcesContent":["export interface ParsedArgs {\n command?: string\n sub?: string\n positionals: string[]\n flags: {\n json: boolean\n help: boolean\n version: boolean\n yes: boolean\n api?: string\n email?: string\n safe?: string\n agent?: string\n limit?: number\n offset?: number\n direction?: 'in' | 'out'\n format?: string\n from?: string\n to?: string\n company?: string\n }\n}\n\nconst VALUE_FLAGS = new Set([\n '--api', '--email', '--safe', '--agent', '--limit', '--offset', '--direction',\n '--format', '--from', '--to', '--company',\n])\n\n/**\n * `haven <command> [sub] [positionals] [--flags]`. Deliberately small — no\n * dependency, no clever aliasing. Unknown flags throw so typos fail loudly.\n */\nexport function parseArgs(argv: string[]): ParsedArgs {\n const positionals: string[] = []\n const flags: ParsedArgs['flags'] = { json: false, help: false, version: false, yes: false }\n\n for (let i = 0; i < argv.length; i += 1) {\n const arg = argv[i]\n if (arg === '--json') flags.json = true\n else if (arg === '--help' || arg === '-h') flags.help = true\n else if (arg === '--version' || arg === '-v') flags.version = true\n else if (arg === '--yes' || arg === '-y') flags.yes = true\n else if (VALUE_FLAGS.has(arg)) {\n const value = argv[++i]\n if (value === undefined || value.startsWith('--')) {\n throw new Error(`Missing value for ${arg}`)\n }\n if (arg === '--api') flags.api = value\n else if (arg === '--email') flags.email = value\n else if (arg === '--safe') flags.safe = value\n else if (arg === '--agent') flags.agent = value\n else if (arg === '--limit') {\n const n = Number(value)\n if (!Number.isInteger(n) || n <= 0) throw new Error('--limit must be a positive integer')\n flags.limit = n\n } else if (arg === '--offset') {\n const n = Number(value)\n if (!Number.isInteger(n) || n < 0) throw new Error('--offset must be a non-negative integer')\n flags.offset = n\n } else if (arg === '--direction') {\n if (value !== 'in' && value !== 'out') throw new Error('--direction must be \"in\" or \"out\"')\n flags.direction = value\n } else if (arg === '--format') {\n if (value !== 'csv' && value !== 'sie') throw new Error('--format must be \"csv\" or \"sie\"')\n flags.format = value\n } else if (arg === '--from') flags.from = value\n else if (arg === '--to') flags.to = value\n else if (arg === '--company') flags.company = value\n } else if (arg.startsWith('--')) {\n throw new Error(`Unknown option: ${arg}`)\n } else {\n positionals.push(arg)\n }\n }\n\n const [command, sub, ...rest] = positionals\n return { command, sub, positionals: rest, flags }\n}\n\nexport function helpText(): string {\n return [\n 'haven — terminal-native companion to the Haven dashboard',\n '',\n 'Usage: haven <command> [subcommand] [options]',\n '',\n 'Auth:',\n ' login [--email <e>] Sign in (password via prompt or HAVEN_PASSWORD)',\n ' logout Clear the saved session',\n ' whoami Show the signed-in user',\n '',\n 'Read:',\n ' wallets list List your Haven wallets',\n ' wallets balances [--safe <id|address>] Token balances for a wallet',\n ' agents list List your agents',\n ' agents show <id> Show one agent + its budget',\n ' budget show <agentId> Show an agent\\'s configured budget',\n ' activity list [--safe <id|address>] [--agent <id>] [--direction in|out] [--limit <n>] [--offset <n>]',\n ' activity export [filters] Emit CSV to stdout (--format csv, default)',\n ' activity export --format sie [--from <ISO>] [--to <ISO>] [--company <name>]',\n ' Bookkeeping-ready SIE 4I (Fortnox/Visma/Bokio)',\n ' catalog list List payable services',\n ' contacts list List your address book',\n '',\n 'Manage (backend-only — no on-chain signing):',\n ' agents pause|resume <id>',\n ' agents revoke <id> --yes Permanently revoke an agent',\n ' agents rotate-key <id> Issue a new API key (shown once)',\n ' agents rename <id> <name>',\n ' wallets rename <id> <name>',\n ' contacts add <name> <address> | contacts remove <id>',\n '',\n 'Options:',\n ' --json Machine-readable output (for scripting)',\n ' --yes, -y Skip the confirmation prompt for destructive actions',\n ' --api <url> Backend URL (default: HAVEN_API_URL or http://localhost:3001)',\n ' --help, --version',\n '',\n 'On-chain actions (deploy, budgets, approvers, send) are signed in the',\n 'dashboard — this CLI reads and manages; it never holds your keys.',\n ].join('\\n')\n}\n","export class CliApiError extends Error {\n status: number\n constructor(message: string, status: number) {\n super(message)\n this.name = 'CliApiError'\n this.status = status\n }\n}\n\nexport interface CliApi {\n get<T>(path: string): Promise<T>\n post<T>(path: string, body?: unknown): Promise<T>\n put<T>(path: string, body?: unknown): Promise<T>\n del<T>(path: string): Promise<T>\n /** GET a non-JSON body (e.g. an export file) as raw text. */\n getText(path: string): Promise<string>\n}\n\nexport interface CreateCliApiOptions {\n baseUrl: string\n token?: string\n fetchImpl?: typeof fetch\n}\n\n/**\n * Minimal JSON client for the Haven backend. Sends the user JWT as a Bearer\n * token when present, and surfaces backend `{ error }` messages as\n * `CliApiError` so commands can print something human.\n */\nexport function createCliApi({ baseUrl, token, fetchImpl = fetch }: CreateCliApiOptions): CliApi {\n const root = baseUrl.replace(/\\/+$/, '')\n\n async function request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const headers: Record<string, string> = { Accept: 'application/json' }\n if (token) headers.Authorization = `Bearer ${token}`\n if (body !== undefined) headers['Content-Type'] = 'application/json'\n\n let res: Response\n try {\n res = await fetchImpl(`${root}${path}`, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n } catch (err) {\n throw new CliApiError(\n `Could not reach Haven at ${root}: ${err instanceof Error ? err.message : String(err)}`,\n 0,\n )\n }\n\n if (res.status === 401) {\n throw new CliApiError('Not authenticated. Run `haven login` first.', 401)\n }\n\n const text = await res.text()\n const payload = text ? safeParse(text) : undefined\n\n if (!res.ok) {\n const message =\n (payload && typeof payload === 'object' && 'error' in payload && typeof payload.error === 'string'\n ? payload.error\n : null) ?? `Request failed (HTTP ${res.status}).`\n throw new CliApiError(message, res.status)\n }\n\n return payload as T\n }\n\n async function requestText(path: string): Promise<string> {\n const headers: Record<string, string> = { Accept: 'text/plain' }\n if (token) headers.Authorization = `Bearer ${token}`\n\n let res: Response\n try {\n res = await fetchImpl(`${root}${path}`, { method: 'GET', headers })\n } catch (err) {\n throw new CliApiError(\n `Could not reach Haven at ${root}: ${err instanceof Error ? err.message : String(err)}`,\n 0,\n )\n }\n\n if (res.status === 401) {\n throw new CliApiError('Not authenticated. Run `haven login` first.', 401)\n }\n\n const text = await res.text()\n if (!res.ok) {\n const payload = text ? safeParse(text) : undefined\n const message =\n (payload && typeof payload === 'object' && 'error' in payload && typeof payload.error === 'string'\n ? payload.error\n : null) ?? `Request failed (HTTP ${res.status}).`\n throw new CliApiError(message, res.status)\n }\n return text\n }\n\n return {\n get: <T>(path: string) => request<T>('GET', path),\n post: <T>(path: string, body?: unknown) => request<T>('POST', path, body),\n put: <T>(path: string, body?: unknown) => request<T>('PUT', path, body),\n del: <T>(path: string) => request<T>('DELETE', path),\n getText: (path: string) => requestText(path),\n }\n}\n\nfunction safeParse(text: string): unknown {\n try {\n return JSON.parse(text)\n } catch {\n return undefined\n }\n}\n","import { mkdir, readFile, rm, writeFile, chmod } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { join, resolve } from 'node:path'\n\n/**\n * The signed-in user session. The token is a *user* JWT (same credential the\n * dashboard holds) — treat it like a secret: stored owner-only, never logged,\n * never sent anywhere but the Haven API. `apiBaseUrl` is pinned at login so\n * later commands talk to the same backend.\n */\nexport interface Session {\n token: string\n apiBaseUrl: string\n user: { id: string; email: string; name: string | null }\n}\n\nexport interface SessionStore {\n load(): Promise<Session | null>\n save(session: Session): Promise<void>\n clear(): Promise<void>\n path: string\n}\n\nfunction sessionDir(homeDir: string): string {\n return resolve(homeDir, '.haven')\n}\n\nexport function sessionPath(homeDir: string = homedir()): string {\n return join(sessionDir(homeDir), 'session.json')\n}\n\n/** File-backed session store, owner-only perms (0600 file in a 0700 dir). */\nexport function createSessionStore(homeDir: string = homedir()): SessionStore {\n const path = sessionPath(homeDir)\n return {\n path,\n async load() {\n try {\n const raw = await readFile(path, 'utf8')\n const parsed = JSON.parse(raw) as Partial<Session>\n if (!parsed.token || !parsed.apiBaseUrl || !parsed.user) return null\n return parsed as Session\n } catch {\n return null\n }\n },\n async save(session) {\n await mkdir(sessionDir(homeDir), { recursive: true, mode: 0o700 })\n await writeFile(path, `${JSON.stringify(session, null, 2)}\\n`, { mode: 0o600 })\n await chmod(path, 0o600).catch(() => undefined)\n },\n async clear() {\n await rm(path, { force: true })\n },\n }\n}\n","/** Tiny fixed-width table for human output. Scriptable callers use `--json`. */\nexport function table(headers: string[], rows: string[][]): string {\n const widths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => (r[i] ?? '').length)),\n )\n const line = (cells: string[]) =>\n cells.map((c, i) => (c ?? '').padEnd(widths[i])).join(' ').trimEnd()\n return [line(headers), line(widths.map((w) => '-'.repeat(w))), ...rows.map(line)].join('\\n')\n}\n\nexport function truncateAddress(address: string): string {\n if (!address || address.length <= 12) return address\n return `${address.slice(0, 6)}…${address.slice(-4)}`\n}\n\nconst CHAIN_NAMES: Record<number, string> = { 100: 'Gnosis', 8453: 'Base' }\n\nexport function chainName(chainId: number): string {\n return CHAIN_NAMES[chainId] ?? `chain ${chainId}`\n}\n","/**\n * CSV serialization for `haven activity export`. Mirrors the dashboard export\n * (#411): RFC 4180 quoting, CRLF line endings, and a spreadsheet\n * formula-injection guard. Kept self-contained so the CLI has no @haven_ai/*\n * runtime dependency.\n */\n\n/** Quote per RFC 4180 and neutralise leading =,+,-,@ (Excel formula injection). */\nfunction csvField(value: string): string {\n let v = value\n if (/^[=+\\-@\\t\\r]/.test(v)) v = `'${v}`\n return `\"${v.replace(/\"/g, '\"\"')}\"`\n}\n\nexport function toCsv(headers: string[], rows: string[][]): string {\n const lines = [headers.join(','), ...rows.map((r) => r.map(csvField).join(','))]\n return lines.join('\\r\\n')\n}\n","import { parseArgs, helpText, type ParsedArgs } from './args.js'\nimport { createCliApi, CliApiError, type CliApi } from './api.js'\nimport { createSessionStore, type Session, type SessionStore } from './session.js'\nimport { chainName, table, truncateAddress } from './format.js'\nimport { toCsv } from './csv.js'\n\n// Hosted Haven backend. Override with `--api <url>` or HAVEN_API_URL (e.g. a\n// local backend at http://localhost:3001, or your own domain once self-hosted).\nconst DEFAULT_API = 'https://havenbackend-production-8a00.up.railway.app'\n// Self-reported CLI version. Owned by scripts/release-bump.mjs, which rewrites\n// the string literal below on every release — keep it a bare quoted literal.\nexport const CLI_VERSION = '0.1.29-alpha.0'\n\nexport interface RunDeps {\n sessionStore?: SessionStore\n /** Build an API client; injected so tests can stub the backend. */\n makeApi?: (baseUrl: string, token?: string) => CliApi\n promptPassword?: () => Promise<string>\n out?: (line: string) => void\n err?: (line: string) => void\n env?: NodeJS.ProcessEnv\n}\n\ninterface ResolvedDeps {\n sessionStore: SessionStore\n makeApi: (baseUrl: string, token?: string) => CliApi\n promptPassword: () => Promise<string>\n out: (line: string) => void\n err: (line: string) => void\n env: NodeJS.ProcessEnv\n}\n\n// ── Backend response shapes (subset the CLI needs) ──────────────────\ninterface Safe { id: string; safe_address: string; chain_id: number; name: string; is_default: boolean }\ninterface Allowance { token_symbol: string; allowance_amount: string; reset_period_min: number }\ninterface Agent { id: string; name: string; status: string; allowances?: Allowance[] }\ninterface Balance { symbol: string; formatted: string; balance: string }\ninterface Txn {\n hash: string; direction: 'in' | 'out'; valueFormatted: string; asset: string\n source?: string; timestamp: number; safeName?: string\n from?: string; to?: string; isError?: boolean\n tokenSymbol?: string; tokenAddress?: string; chainId?: number; safeAddress?: string\n agentName?: string; paymentFlowStatus?: string | null; activityType?: string\n}\ninterface CatalogEntry { name: string; category: string; rail: string; price_display?: string | null; status: string }\ninterface Contact { id: string; name: string; address: string }\n\n/** Entry point. Returns a process exit code; never throws for expected errors. */\nexport async function run(argv: string[], deps: RunDeps = {}): Promise<number> {\n const d: ResolvedDeps = {\n sessionStore: deps.sessionStore ?? createSessionStore(),\n makeApi: deps.makeApi ?? ((baseUrl, token) => createCliApi({ baseUrl, token })),\n promptPassword: deps.promptPassword ?? (() => Promise.reject(new Error('No password input available'))),\n out: deps.out ?? ((l) => process.stdout.write(`${l}\\n`)),\n err: deps.err ?? ((l) => process.stderr.write(`${l}\\n`)),\n env: deps.env ?? process.env,\n }\n\n let args: ParsedArgs\n try {\n args = parseArgs(argv)\n } catch (e) {\n d.err(e instanceof Error ? e.message : String(e))\n return 1\n }\n\n if (args.flags.version) {\n d.out(CLI_VERSION)\n return 0\n }\n if (args.flags.help || !args.command) {\n d.out(helpText())\n return 0\n }\n\n try {\n return await dispatch(args, d)\n } catch (e) {\n if (e instanceof CliApiError) {\n d.err(e.message)\n return e.status === 401 ? 2 : 1\n }\n d.err(e instanceof Error ? e.message : String(e))\n return 1\n }\n}\n\nasync function dispatch(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const key = args.sub ? `${args.command} ${args.sub}` : args.command\n switch (key) {\n case 'login': return cmdLogin(args, d)\n case 'logout': return cmdLogout(d)\n case 'whoami': return cmdWhoami(args, d)\n case 'wallets list': return cmdWalletsList(args, d)\n case 'wallets balances': return cmdWalletsBalances(args, d)\n case 'agents list': return cmdAgentsList(args, d)\n case 'agents show': return cmdAgentsShow(args, d)\n case 'agents pause': return cmdAgentLifecycle(args, d, 'pause')\n case 'agents resume': return cmdAgentLifecycle(args, d, 'resume')\n case 'agents revoke': return cmdAgentRevoke(args, d)\n case 'agents rotate-key': return cmdAgentRotateKey(args, d)\n case 'agents rename': return cmdAgentRename(args, d)\n case 'budget show': return cmdBudgetShow(args, d)\n case 'wallets rename': return cmdWalletRename(args, d)\n case 'activity list': return cmdActivityList(args, d)\n case 'activity export': return cmdActivityExport(args, d)\n case 'catalog list': return cmdCatalogList(args, d)\n case 'contacts list': return cmdContactsList(args, d)\n case 'contacts add': return cmdContactsAdd(args, d)\n case 'contacts remove': return cmdContactsRemove(args, d)\n default:\n d.err(`Unknown command: ${key}. Run \\`haven --help\\`.`)\n return 1\n }\n}\n\nfunction baseUrlFor(args: ParsedArgs, d: ResolvedDeps, session: Session | null): string {\n return args.flags.api ?? session?.apiBaseUrl ?? d.env.HAVEN_API_URL ?? DEFAULT_API\n}\n\nasync function authed(args: ParsedArgs, d: ResolvedDeps): Promise<{ session: Session; api: CliApi }> {\n const session = await d.sessionStore.load()\n if (!session) throw new CliApiError('Not authenticated. Run `haven login` first.', 401)\n return { session, api: d.makeApi(baseUrlFor(args, d, session), session.token) }\n}\n\nfunction emit(d: ResolvedDeps, json: boolean, data: unknown, human: () => string): void {\n d.out(json ? JSON.stringify(data, null, 2) : human())\n}\n\n// ── Auth ────────────────────────────────────────────────────────────\n\nasync function cmdLogin(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const email = args.flags.email ?? d.env.HAVEN_EMAIL\n if (!email) {\n d.err('Provide an email with --email (or HAVEN_EMAIL).')\n return 1\n }\n const password = d.env.HAVEN_PASSWORD ?? (await d.promptPassword())\n if (!password) {\n d.err('A password is required.')\n return 1\n }\n const baseUrl = baseUrlFor(args, d, null)\n const api = d.makeApi(baseUrl)\n const res = await api.post<{ token: string; user: Session['user'] }>('/auth/login', { email, password })\n await d.sessionStore.save({ token: res.token, apiBaseUrl: baseUrl, user: res.user })\n emit(d, args.flags.json, { user: res.user, apiBaseUrl: baseUrl }, () => `Signed in as ${res.user.email}.`)\n return 0\n}\n\nasync function cmdLogout(d: ResolvedDeps): Promise<number> {\n await d.sessionStore.clear()\n d.out('Signed out.')\n return 0\n}\n\nasync function cmdWhoami(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const { api } = await authed(args, d)\n const user = await api.get<Session['user']>('/auth/me')\n emit(d, args.flags.json, user, () => `${user.email}${user.name ? ` (${user.name})` : ''}`)\n return 0\n}\n\n// ── Wallets ─────────────────────────────────────────────────────────\n\nasync function cmdWalletsList(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const { api } = await authed(args, d)\n const { safes } = await api.get<{ safes: Safe[] }>('/user/safes')\n emit(d, args.flags.json, safes, () =>\n safes.length === 0\n ? 'No Haven wallets yet.'\n : table(\n ['NAME', 'NETWORK', 'ADDRESS', 'DEFAULT'],\n safes.map((s) => [s.name, chainName(s.chain_id), truncateAddress(s.safe_address), s.is_default ? '✓' : '']),\n ),\n )\n return 0\n}\n\nasync function cmdWalletsBalances(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const { api } = await authed(args, d)\n const { safes } = await api.get<{ safes: Safe[] }>('/user/safes')\n const safe = pickSafe(safes, args.flags.safe)\n if (!safe) {\n d.err(args.flags.safe ? `No wallet matches \"${args.flags.safe}\".` : 'No Haven wallet found.')\n return 1\n }\n const { balances } = await api.get<{ balances: Balance[] }>(\n `/balances/${safe.safe_address}?chain_id=${safe.chain_id}`,\n )\n emit(d, args.flags.json, { safe: safe.name, chainId: safe.chain_id, balances }, () =>\n [\n `${safe.name} · ${chainName(safe.chain_id)} · ${truncateAddress(safe.safe_address)}`,\n balances.length === 0\n ? ' (no balances)'\n : table(['TOKEN', 'BALANCE'], balances.map((b) => [b.symbol, b.formatted])),\n ].join('\\n'),\n )\n return 0\n}\n\nfunction pickSafe(safes: Safe[], ref?: string): Safe | undefined {\n if (!ref) return safes.find((s) => s.is_default) ?? safes[0]\n const lower = ref.toLowerCase()\n return safes.find((s) => s.id === ref || s.safe_address.toLowerCase() === lower)\n}\n\n// ── Agents & budget ─────────────────────────────────────────────────\n\nasync function cmdAgentsList(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const { api } = await authed(args, d)\n const { agents } = await api.get<{ agents: Agent[] }>('/agents')\n emit(d, args.flags.json, agents, () =>\n agents.length === 0\n ? 'No agents yet.'\n : table(\n ['ID', 'NAME', 'STATUS', 'BUDGETS'],\n agents.map((a) => [a.id, a.name, a.status, budgetSummary(a.allowances)]),\n ),\n )\n return 0\n}\n\nasync function cmdAgentsShow(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const id = args.positionals[0]\n if (!id) { d.err('Usage: haven agents show <id>'); return 1 }\n const { api } = await authed(args, d)\n const agent = await api.get<Agent>(`/agents/${id}`)\n emit(d, args.flags.json, agent, () =>\n [\n `${agent.name} [${agent.status}]`,\n `id: ${agent.id}`,\n `budget: ${budgetSummary(agent.allowances)}`,\n ].join('\\n'),\n )\n return 0\n}\n\nasync function cmdBudgetShow(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const id = args.positionals[0]\n if (!id) { d.err('Usage: haven budget show <agentId>'); return 1 }\n const { api } = await authed(args, d)\n const agent = await api.get<Agent>(`/agents/${id}`)\n const allowances = agent.allowances ?? []\n emit(d, args.flags.json, allowances, () =>\n allowances.length === 0\n ? `${agent.name} has no configured budget.`\n : table(\n ['TOKEN', 'AMOUNT', 'RESETS'],\n allowances.map((a) => [a.token_symbol, a.allowance_amount, resetLabel(a.reset_period_min)]),\n ),\n )\n return 0\n}\n\nfunction budgetSummary(allowances?: Allowance[]): string {\n if (!allowances || allowances.length === 0) return '—'\n return allowances.map((a) => `${a.allowance_amount} ${a.token_symbol}`).join(', ')\n}\n\nfunction resetLabel(mins: number): string {\n if (mins === 0) return 'one-time'\n if (mins === 1440) return 'daily'\n if (mins === 10080) return 'weekly'\n if (mins === 43200) return 'monthly'\n return `every ${mins}m`\n}\n\nasync function cmdAgentLifecycle(args: ParsedArgs, d: ResolvedDeps, action: 'pause' | 'resume'): Promise<number> {\n const id = args.positionals[0]\n if (!id) { d.err(`Usage: haven agents ${action} <id>`); return 1 }\n const { api } = await authed(args, d)\n await api.post(`/agents/${id}/${action}`)\n d.out(`Agent ${id} ${action === 'pause' ? 'paused' : 'resumed'}.`)\n return 0\n}\n\nasync function cmdAgentRevoke(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const id = args.positionals[0]\n if (!id) { d.err('Usage: haven agents revoke <id> --yes'); return 1 }\n // Revoke is terminal (status can't go back to active). Require explicit --yes\n // so it can't happen by accident in a script.\n if (!args.flags.yes) {\n d.err(`This permanently revokes agent ${id}. Re-run with --yes to confirm.`)\n return 1\n }\n const { api } = await authed(args, d)\n await api.post(`/agents/${id}/revoke`)\n d.out(`Agent ${id} revoked. To also remove its on-chain allowance, use the dashboard.`)\n return 0\n}\n\nasync function cmdAgentRotateKey(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const id = args.positionals[0]\n if (!id) { d.err('Usage: haven agents rotate-key <id>'); return 1 }\n const { api } = await authed(args, d)\n const res = await api.post<{ api_key: string; api_key_prefix: string }>(`/agents/${id}/rotate-key`)\n if (args.flags.json) {\n d.out(JSON.stringify(res, null, 2))\n } else {\n d.out('New API key (shown once — store it now; the old key stops working):')\n d.out(res.api_key)\n }\n return 0\n}\n\nasync function cmdAgentRename(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const [id, ...nameParts] = args.positionals\n const name = nameParts.join(' ').trim()\n if (!id || !name) { d.err('Usage: haven agents rename <id> <name>'); return 1 }\n const { api } = await authed(args, d)\n await api.put(`/agents/${id}`, { name })\n d.out(`Agent ${id} renamed to \"${name}\".`)\n return 0\n}\n\nasync function cmdWalletRename(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const [id, ...nameParts] = args.positionals\n const name = nameParts.join(' ').trim()\n if (!id || !name) { d.err('Usage: haven wallets rename <id> <name>'); return 1 }\n const { api } = await authed(args, d)\n await api.put(`/user/safes/${id}`, { name })\n d.out(`Wallet ${id} renamed to \"${name}\".`)\n return 0\n}\n\n// ── Activity ────────────────────────────────────────────────────────\n\n/**\n * Resolve `--safe` (id or address) to a Safe id for the `/transactions` filter,\n * mirroring `wallets balances`. Throws if `--safe` was given but matches no\n * wallet, so a typo'd filter fails loudly instead of silently returning all rows.\n */\nasync function resolveSafeId(args: ParsedArgs, api: CliApi): Promise<string | undefined> {\n if (!args.flags.safe) return undefined\n const { safes } = await api.get<{ safes: Safe[] }>('/user/safes')\n const safe = pickSafe(safes, args.flags.safe)\n if (!safe) throw new CliApiError(`No wallet matches \"${args.flags.safe}\".`, 1)\n return safe.id\n}\n\nasync function cmdActivityList(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const { api } = await authed(args, d)\n const safeId = await resolveSafeId(args, api)\n const params = new URLSearchParams({\n offset: String(args.flags.offset ?? 0),\n limit: String(args.flags.limit ?? 25),\n })\n if (safeId) params.set('safeId', safeId)\n if (args.flags.agent) params.set('agentId', args.flags.agent)\n const { transactions } = await api.get<{ transactions: Txn[] }>(`/transactions?${params.toString()}`)\n const visible = args.flags.direction\n ? transactions.filter((t) => t.direction === args.flags.direction)\n : transactions\n emit(d, args.flags.json, visible, () =>\n visible.length === 0\n ? 'No activity.'\n : table(\n ['DATE', 'DIR', 'AMOUNT', 'TYPE', 'ACCOUNT'],\n visible.map((t) => [\n new Date(t.timestamp * 1000).toISOString().slice(0, 10),\n t.direction === 'in' ? 'in' : 'out',\n `${t.direction === 'in' ? '+' : '-'}${t.valueFormatted} ${t.asset}`,\n t.source ?? 'transfer',\n t.safeName ?? '',\n ]),\n ),\n )\n return 0\n}\n\nasync function cmdActivityExport(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n if (args.flags.format === 'sie') return exportSie(args, d)\n const { api } = await authed(args, d)\n const safeId = await resolveSafeId(args, api)\n const params = new URLSearchParams({\n offset: String(args.flags.offset ?? 0),\n limit: String(args.flags.limit ?? 1000),\n })\n if (safeId) params.set('safeId', safeId)\n if (args.flags.agent) params.set('agentId', args.flags.agent)\n const { transactions } = await api.get<{ transactions: Txn[] }>(`/transactions?${params.toString()}`)\n const visible = args.flags.direction\n ? transactions.filter((t) => t.direction === args.flags.direction)\n : transactions\n\n // Same columns as the dashboard export (#411), minus counterparty_name\n // (no contacts join in the CLI yet).\n const headers = [\n 'date', 'type', 'status', 'direction', 'amount', 'token_symbol', 'token_address',\n 'counterparty_address', 'safe_address', 'agent_name', 'tx_hash', 'chain_id',\n ]\n const rows = visible.map((t) => [\n new Date(t.timestamp * 1000).toISOString(),\n exportType(t),\n exportStatus(t),\n t.direction,\n t.valueFormatted,\n t.tokenSymbol ?? t.asset ?? '',\n t.tokenAddress ?? '',\n (t.direction === 'in' ? t.from : t.to) ?? '',\n t.safeAddress ?? '',\n t.agentName ?? '',\n t.hash,\n t.chainId != null ? String(t.chainId) : '',\n ])\n d.out(toCsv(headers, rows))\n return 0\n}\n\nfunction exportType(t: Txn): string {\n if (t.activityType === 'delegate_sweep') return 'allowance funding'\n if (t.source === 'x402') return 'x402'\n if (t.source === 'mpp_demo') return 'mpp'\n return t.direction === 'in' ? 'receive' : 'send'\n}\n\nfunction exportStatus(t: Txn): string {\n if (t.isError) return 'failed'\n if (t.paymentFlowStatus === 'confirming_merchant') return 'pending'\n return 'executed'\n}\n\n/** SIE 4I export: the backend builds the verifikat file (book-time SEK + BAS). */\nasync function exportSie(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const { api } = await authed(args, d)\n const params = new URLSearchParams({ format: 'sie' })\n if (args.flags.from) params.set('from', args.flags.from)\n if (args.flags.to) params.set('to', args.flags.to)\n if (args.flags.company) params.set('company', args.flags.company)\n const content = await api.getText(`/accounting/export?${params.toString()}`)\n d.out(content)\n return 0\n}\n\n// ── Catalog ─────────────────────────────────────────────────────────\n\nasync function cmdCatalogList(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const { api } = await authed(args, d)\n const { entries } = await api.get<{ entries: CatalogEntry[] }>('/catalog')\n emit(d, args.flags.json, entries, () =>\n entries.length === 0\n ? 'Catalog is empty.'\n : table(\n ['NAME', 'CATEGORY', 'RAIL', 'PRICE', 'STATUS'],\n entries.map((e) => [e.name, e.category, e.rail, e.price_display ?? '—', e.status]),\n ),\n )\n return 0\n}\n\n// ── Contacts ────────────────────────────────────────────────────────\n\nasync function cmdContactsList(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const { api } = await authed(args, d)\n const { contacts } = await api.get<{ contacts: Contact[] }>('/contacts')\n emit(d, args.flags.json, contacts, () =>\n contacts.length === 0\n ? 'No contacts yet.'\n : table(['ID', 'NAME', 'ADDRESS'], contacts.map((c) => [c.id, c.name, truncateAddress(c.address)])),\n )\n return 0\n}\n\nasync function cmdContactsAdd(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const [address, ...nameParts] = [...args.positionals].reverse()\n // positionals are <name...> <address>; address is last, name is the rest.\n const name = nameParts.reverse().join(' ').trim()\n if (!name || !address) { d.err('Usage: haven contacts add <name> <address>'); return 1 }\n const { api } = await authed(args, d)\n const contact = await api.post<Contact>('/contacts', { name, address })\n emit(d, args.flags.json, contact, () => `Added contact \"${contact.name}\" (${truncateAddress(contact.address)}).`)\n return 0\n}\n\nasync function cmdContactsRemove(args: ParsedArgs, d: ResolvedDeps): Promise<number> {\n const id = args.positionals[0]\n if (!id) { d.err('Usage: haven contacts remove <id>'); return 1 }\n const { api } = await authed(args, d)\n await api.del(`/contacts/${id}`)\n d.out(`Contact ${id} removed.`)\n return 0\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -242,7 +242,7 @@ function toCsv(headers, rows) {
|
|
|
242
242
|
|
|
243
243
|
// src/commands.ts
|
|
244
244
|
var DEFAULT_API = "https://havenbackend-production-8a00.up.railway.app";
|
|
245
|
-
var CLI_VERSION = "0.1.
|
|
245
|
+
var CLI_VERSION = "0.1.29-alpha.0";
|
|
246
246
|
async function run(argv, deps = {}) {
|
|
247
247
|
const d = {
|
|
248
248
|
sessionStore: deps.sessionStore ?? createSessionStore(),
|