@grip-foundation/agent-sdk
v0.1.1
Published
Grip Agent SDK — agent operator CLI/runtime for Base wallet ops, policy checks, and key management.
Readme
@grip-foundation/agent-sdk
Operator-side CLI/runtime for Grip agents on Base.
This package is intentionally distinct from @grip-labs/sdk:
@grip-labs/sdk: builder-facing SDK used inside agent/application code.@grip-foundation/agent-sdk: operator-facing runtime/CLI used to provision keys under~/.grip-keys/, inspect balances, and execute USDC payments with local policy checks.
Install
npm install -g @grip-foundation/agent-sdkCLI commands
grip-agent-install [userId]
grip-agent-balance [userId]
grip-agent-pay <to> <amountUsd> [--user <id>] [--memo <text>] [--force]Local development
npm test
npm run test:live
node bin/install.mjs
node bin/balance.mjsEnvironment
BASE_RPC_URL: optional Base RPC overrideGRIP_KEYS_DIR: optional override for the key directory during tests or isolated runs
npm test runs the hermetic/unit suite. npm run test:live runs the read-only Base mainnet integration check for usdcBalance().
Telegram approval cards
The approval-card module is intentionally transport-light: it persists approval requests,
returns Telegram inline_keyboard payloads, and resolves callback queries, but it does
not send messages or execute payments for you.
import { createClient } from "@supabase/supabase-js"
import {
createApprovalCard,
handleApprovalCallback,
SupabaseApprovalStore,
} from "@grip-foundation/agent-sdk/approval"
const supabase = createClient(process.env.SUPABASE_URL, process.env.SUPABASE_SERVICE_ROLE_KEY)
const store = new SupabaseApprovalStore(supabase)
const { request, message } = await createApprovalCard({
userId: "bia",
approverId: 12345,
to: "0x000000000000000000000000000000000000dEaD",
amountUsd: 25.75,
memo: "demo dinner",
reasons: ["exceeds per-tx cap ($20)"],
policy: { perTxUsd: 20, dailyUsd: 100 },
spentTodayUsd: 90,
afterDailyUsd: 115.75,
principalAddress: "0x1111111111111111111111111111111111111111",
}, { store })
// send `message` via Telegram Bot API yourself
const callbackResult = await handleApprovalCallback(update.callback_query, { store })
if (callbackResult.handled && callbackResult.ok && callbackResult.code === "approved") {
// execute the payment with --force or your equivalent transport logic
}Use sql/approval_requests.sql to provision the default Supabase table.
