@usepraxis/sdk 0.1.1 → 0.5.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/README.md +37 -4
- package/dist/index.cjs +189 -24
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +239 -14
- package/dist/index.d.ts +239 -14
- package/dist/index.js +189 -24
- package/dist/index.js.map +1 -1
- package/package.json +16 -4
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/signer.ts","../src/units.ts","../src/types.ts"],"names":["bs58","nacl","ActionKind","RejectReason"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Thrown when the Praxis API returns a non-2xx response. The backend's error\n * envelope is `{ error: string, type: string }` with a meaningful HTTP status\n * (400 input, 401 auth, 404 not-found, 429 rate-limit, 503 config, 500 other).\n */\nexport class PraxisApiError extends Error {\n readonly status: number;\n /** The backend error class name, e.g. \"PraxisAuthError\", \"PraxisRateLimitError\". */\n readonly type: string;\n\n constructor(status: number, type: string, message: string) {\n super(message);\n this.name = \"PraxisApiError\";\n this.status = status;\n this.type = type;\n // Restore prototype chain for instanceof across transpile targets.\n Object.setPrototypeOf(this, PraxisApiError.prototype);\n }\n\n get isAuth(): boolean {\n return this.status === 401;\n }\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n get isInput(): boolean {\n return this.status === 400;\n }\n}\n\n/** Thrown for SDK-side misconfiguration (no fetch, no signer, bad key, …). */\nexport class PraxisConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PraxisConfigError\";\n Object.setPrototypeOf(this, PraxisConfigError.prototype);\n }\n}\n","import bs58 from \"bs58\";\n\nimport { PraxisApiError, PraxisConfigError } from \"./errors\";\nimport type { PraxisSigner } from \"./signer\";\nimport type {\n ActionProposal,\n ActivityEntry,\n AddressBookEntry,\n AgentMessage,\n AllowListKind,\n BaseUnitString,\n OwnerAction,\n PolicyUpdate,\n PolicyView,\n SessionInfo,\n Thread,\n TokenEnvelopeConfig,\n UnsignedOwnerTransaction,\n WalletChallenge,\n} from \"./types\";\n\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\nexport interface PraxisClientOptions {\n /** Base origin of the Praxis deployment, e.g. \"http://localhost:3000\". */\n baseUrl: string;\n /** Wallet signer for `connect()`. Optional if you only call public reads after an external login. */\n signer?: PraxisSigner;\n /** Custom fetch (defaults to global fetch). Required in runtimes without one. */\n fetch?: FetchLike;\n /** Per-request timeout in ms (default 20_000). */\n timeoutMs?: number;\n}\n\n/** Result of {@link PraxisClient.ask} — the agent's reply, distilled. */\nexport interface AskResult {\n threadId: string;\n /** The agent's reply message (prose / clarify / proposal / research blocks). */\n message: AgentMessage;\n /** Any action proposals the agent produced, hydrated for convenience. */\n proposals: ActionProposal[];\n}\n\nconst API_PREFIX = \"/api/praxis\";\n\n/**\n * Typed client for a hosted Praxis agent. The agent's LLM, scoped agent key, and\n * Aegis policy enforcement all live server-side; this SDK is an authenticated\n * client of the `/api/praxis/*` surface.\n *\n * ```ts\n * const praxis = new PraxisClient({ baseUrl, signer: keypairSigner(secret) });\n * await praxis.connect();\n * const { proposals } = await praxis.ask(\"send 0.5 SOL to maya\");\n * if (proposals[0]?.check.allowed) await praxis.signProposal(proposals[0].id);\n * ```\n */\nexport class PraxisClient {\n private readonly baseUrl: string;\n private readonly signer?: PraxisSigner;\n private readonly fetchImpl: FetchLike;\n private readonly timeoutMs: number;\n /** Manual cookie jar — Node's fetch does not persist Set-Cookie across calls. */\n private sessionCookie?: string;\n\n constructor(options: PraxisClientOptions) {\n if (!options.baseUrl) throw new PraxisConfigError(\"baseUrl is required\");\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.signer = options.signer;\n const resolvedFetch = options.fetch ?? (globalThis.fetch as FetchLike | undefined);\n if (!resolvedFetch) {\n throw new PraxisConfigError(\"No fetch available; pass options.fetch (Node <18 or non-browser runtime).\");\n }\n this.fetchImpl = resolvedFetch;\n this.timeoutMs = options.timeoutMs ?? 20_000;\n }\n\n // --- auth ----------------------------------------------------------------\n\n /** The signer's wallet address, if a signer was provided. */\n get address(): string | undefined {\n return this.signer?.address;\n }\n\n /**\n * Run the wallet-ownership handshake: request a challenge, sign its message,\n * verify it, and store the resulting session cookie. Idempotent.\n */\n async connect(): Promise<SessionInfo> {\n if (!this.signer) {\n throw new PraxisConfigError(\"connect() requires a signer. Pass one to the constructor.\");\n }\n const challenge = await this.post<WalletChallenge>(\"/auth/challenge\", {\n address: this.signer.address,\n });\n const signature = await this.signer.signMessage(new TextEncoder().encode(challenge.message));\n return this.post<SessionInfo>(\"/auth/verify\", {\n address: this.signer.address,\n nonce: challenge.nonce,\n signature: bs58.encode(signature),\n });\n }\n\n /** Current session, or `null` if not signed in. */\n async session(): Promise<SessionInfo | null> {\n try {\n return await this.get<SessionInfo>(\"/auth/session\");\n } catch (error) {\n if (error instanceof PraxisApiError && error.isAuth) return null;\n throw error;\n }\n }\n\n /** Clear the session (server-side cookie + local jar). */\n async logout(): Promise<void> {\n await this.request<unknown>(\"DELETE\", \"/auth/session\");\n this.sessionCookie = undefined;\n }\n\n // --- conversation --------------------------------------------------------\n\n /** Send a line to the agent. Creates a thread when `threadId` is omitted. */\n send(text: string, threadId: string | null = null): Promise<{ threadId: string }> {\n return this.post<{ threadId: string }>(\"/send\", { text, threadId });\n }\n\n /**\n * Send a line and return the agent's reply in one call. The API resolves\n * `send` only after the agent has finished, so this needs no polling.\n */\n async ask(text: string, threadId: string | null = null): Promise<AskResult> {\n const { threadId: tid } = await this.send(text, threadId);\n const thread = await this.getThread(tid);\n const message = lastAgentMessage(thread);\n if (!message) {\n throw new PraxisApiError(500, \"Error\", \"Agent produced no reply message.\");\n }\n const proposalIds = message.blocks\n .filter((b): b is Extract<typeof b, { type: \"proposal\" }> => b.type === \"proposal\")\n .map((b) => b.proposalId);\n const proposals = await Promise.all(proposalIds.map((id) => this.getProposal(id)));\n return { threadId: tid, message, proposals };\n }\n\n newThread(threadId?: string): Promise<{ threadId: string }> {\n return this.post<{ threadId: string }>(\"/new-thread\", threadId ? { threadId } : {});\n }\n\n signProposal(proposalId: string): Promise<void> {\n return this.post<void>(\"/sign-proposal\", { proposalId });\n }\n\n cancelProposal(proposalId: string): Promise<void> {\n return this.post<void>(\"/cancel-proposal\", { proposalId });\n }\n\n // --- reads ---------------------------------------------------------------\n\n getThreads(): Promise<Thread[]> {\n return this.get<Thread[]>(\"/get-threads\");\n }\n getThread(id: string): Promise<Thread> {\n return this.get<Thread>(\"/get-thread\", { id });\n }\n getProposal(id: string): Promise<ActionProposal> {\n return this.get<ActionProposal>(\"/get-proposal\", { id });\n }\n getPolicy(): Promise<PolicyView> {\n return this.get<PolicyView>(\"/get-policy\");\n }\n getActivity(): Promise<ActivityEntry[]> {\n return this.get<ActivityEntry[]>(\"/get-activity\");\n }\n getAddressBook(): Promise<AddressBookEntry[]> {\n return this.get<AddressBookEntry[]>(\"/get-address-book\");\n }\n isThinking(threadId: string): Promise<boolean> {\n return this.get<boolean>(\"/is-thinking\", { threadId });\n }\n getVersion(): Promise<number> {\n return this.get<number>(\"/get-version\");\n }\n\n // --- policy / owner mutations (server-key mode) --------------------------\n\n bootstrapPolicy(fundLamports?: BaseUnitString): Promise<void> {\n return this.post<void>(\"/bootstrap-policy\", fundLamports ? { fundLamports } : {});\n }\n updatePolicy(patch: PolicyUpdate): Promise<void> {\n return this.post<void>(\"/update-policy\", { patch });\n }\n configureToken(config: TokenEnvelopeConfig): Promise<void> {\n return this.post<void>(\"/configure-token\", { config });\n }\n prepareTokenAccounts(recipientAddresses?: string[]): Promise<void> {\n return this.post<void>(\"/prepare-token-accounts\", recipientAddresses ? { recipientAddresses } : {});\n }\n revokeAgent(): Promise<void> {\n return this.post<void>(\"/revoke-agent\", {});\n }\n rotateAgent(): Promise<void> {\n return this.post<void>(\"/rotate-agent\", {});\n }\n addToAllowList(kind: AllowListKind, address: string): Promise<void> {\n return this.post<void>(\"/add-to-allow-list\", { kind, address });\n }\n removeFromAllowList(kind: AllowListKind, address: string): Promise<void> {\n return this.post<void>(\"/remove-from-allow-list\", { kind, address });\n }\n\n // --- owner wallet-signed transaction path --------------------------------\n\n /** Build an unsigned owner transaction for the wallet to sign. */\n buildOwnerTransaction(action: OwnerAction): Promise<UnsignedOwnerTransaction> {\n return this.post<UnsignedOwnerTransaction>(\"/owner/build\", { action });\n }\n /** Submit a wallet-signed owner transaction. */\n submitOwnerTransaction(signed: UnsignedOwnerTransaction): Promise<{ sig: string }> {\n return this.post<{ sig: string }>(\"/owner/submit\", signed);\n }\n\n // --- transport -----------------------------------------------------------\n\n private get<T>(path: string, query?: Record<string, string>): Promise<T> {\n return this.request<T>(\"GET\", path, { query });\n }\n\n private post<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"POST\", path, { body });\n }\n\n private async request<T>(\n method: string,\n path: string,\n opts: { body?: unknown; query?: Record<string, string> } = {},\n ): Promise<T> {\n const url = new URL(this.baseUrl + API_PREFIX + path);\n for (const [k, v] of Object.entries(opts.query ?? {})) url.searchParams.set(k, v);\n\n const headers: Record<string, string> = { accept: \"application/json\" };\n if (opts.body !== undefined) headers[\"content-type\"] = \"application/json\";\n if (this.sessionCookie) headers[\"cookie\"] = this.sessionCookie;\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n let res: Response;\n try {\n res = await this.fetchImpl(url.toString(), {\n method,\n headers,\n body: opts.body === undefined ? undefined : JSON.stringify(opts.body),\n // Browser same-origin: let the HttpOnly cookie ride along.\n credentials: \"include\",\n signal: controller.signal,\n } as RequestInit);\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new PraxisApiError(0, \"TimeoutError\", `Praxis request timed out after ${this.timeoutMs}ms`);\n }\n throw error;\n } finally {\n clearTimeout(timer);\n }\n\n this.captureCookie(res);\n\n const text = await res.text();\n const parsed = text ? safeJsonParse(text) : undefined;\n\n if (!res.ok) {\n const message =\n (parsed && typeof parsed === \"object\" && \"error\" in parsed && typeof parsed.error === \"string\"\n ? parsed.error\n : undefined) ?? `Praxis API error ${res.status}`;\n const type =\n parsed && typeof parsed === \"object\" && \"type\" in parsed && typeof parsed.type === \"string\"\n ? parsed.type\n : \"Error\";\n throw new PraxisApiError(res.status, type, message);\n }\n\n return parsed as T;\n }\n\n private captureCookie(res: Response): void {\n // Node 18.14+ exposes getSetCookie(); fall back to the combined header.\n const anyHeaders = res.headers as Headers & { getSetCookie?: () => string[] };\n const cookies = anyHeaders.getSetCookie?.() ?? splitSetCookie(res.headers.get(\"set-cookie\"));\n for (const cookie of cookies) {\n const [pair] = cookie.split(\";\");\n if (pair && pair.trim().startsWith(\"praxis_session=\")) {\n this.sessionCookie = pair.trim();\n }\n }\n }\n}\n\nfunction lastAgentMessage(thread: Thread): AgentMessage | undefined {\n for (let i = thread.messages.length - 1; i >= 0; i--) {\n const m = thread.messages[i];\n if (m.role === \"agent\") return m;\n }\n return undefined;\n}\n\nfunction safeJsonParse(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction splitSetCookie(header: string | null): string[] {\n if (!header) return [];\n // Split on commas that precede a new cookie name=value pair, not commas inside\n // Expires dates (\"Wed, 01 Jan ...\").\n return header.split(/,(?=\\s*[^;,\\s]+=)/);\n}\n","import bs58 from \"bs58\";\nimport nacl from \"tweetnacl\";\n\nimport { PraxisConfigError } from \"./errors\";\n\n/**\n * Signs the wallet-ownership challenge. Implement this to bridge any wallet:\n * - Node / backend agents: use {@link keypairSigner} with a secret key.\n * - Browser: wrap a wallet-adapter, e.g.\n * `{ address: wallet.publicKey.toBase58(), signMessage: (m) => wallet.signMessage(m) }`.\n *\n * `signMessage` must return the raw 64-byte Ed25519 signature; the SDK base58-\n * encodes it for the API.\n */\nexport interface PraxisSigner {\n /** base58-encoded Solana public key. */\n readonly address: string;\n signMessage(message: Uint8Array): Promise<Uint8Array> | Uint8Array;\n}\n\nexport type SecretKeyInput = Uint8Array | number[] | string;\n\n/**\n * Build a {@link PraxisSigner} from a Solana secret key — a 64-byte keypair or a\n * 32-byte seed, as raw bytes, a number array, or a base58 string (Phantom /\n * `solana-keygen` export). Node and browser friendly; no `@solana/web3.js`\n * dependency.\n */\nexport function keypairSigner(secret: SecretKeyInput): PraxisSigner {\n const bytes = normalizeSecret(secret);\n const pair =\n bytes.length === 64\n ? nacl.sign.keyPair.fromSecretKey(bytes)\n : nacl.sign.keyPair.fromSeed(bytes);\n const address = bs58.encode(pair.publicKey);\n const secretKey = pair.secretKey;\n\n return {\n address,\n signMessage: (message: Uint8Array) => nacl.sign.detached(message, secretKey),\n };\n}\n\nfunction normalizeSecret(secret: SecretKeyInput): Uint8Array {\n let bytes: Uint8Array;\n if (typeof secret === \"string\") {\n try {\n bytes = bs58.decode(secret.trim());\n } catch {\n throw new PraxisConfigError(\"secret key string must be base58-encoded\");\n }\n } else if (Array.isArray(secret)) {\n bytes = Uint8Array.from(secret);\n } else {\n bytes = secret;\n }\n\n if (bytes.length !== 64 && bytes.length !== 32) {\n throw new PraxisConfigError(\n `secret key must be 64 bytes (keypair) or 32 bytes (seed), got ${bytes.length}`,\n );\n }\n return bytes;\n}\n","/**\n * Money helpers. Praxis money crosses the wire as decimal strings of integer\n * base units (lamports / token base units). These convert to/from `bigint` and\n * human decimal amounts without floats.\n */\n\n/** Parse a base-unit string (or bigint) into a bigint. */\nexport function toBaseUnits(value: string | bigint): bigint {\n return typeof value === \"bigint\" ? value : BigInt(value.trim());\n}\n\n/** Serialize a bigint (or number of whole base units) into a base-unit string. */\nexport function fromBaseUnits(value: bigint | number): string {\n return BigInt(value).toString();\n}\n\n/** Convert a human decimal amount (\"0.5\") into base units for `decimals` places. */\nexport function humanToBaseUnits(amount: string, decimals: number): string {\n const trimmed = amount.trim();\n if (!/^\\d+(\\.\\d+)?$/.test(trimmed)) {\n throw new Error(`invalid decimal amount: \"${amount}\"`);\n }\n const [whole, fraction = \"\"] = trimmed.split(\".\");\n if (fraction.length > decimals) {\n throw new Error(`\"${amount}\" has more than ${decimals} decimal places`);\n }\n const padded = fraction.padEnd(decimals, \"0\");\n return (BigInt(whole) * 10n ** BigInt(decimals) + BigInt(padded || \"0\")).toString();\n}\n\n/** Convert base units into a human decimal string for `decimals` places. */\nexport function baseUnitsToHuman(value: string | bigint, decimals: number): string {\n const units = toBaseUnits(value);\n const negative = units < 0n;\n const abs = negative ? -units : units;\n const divisor = 10n ** BigInt(decimals);\n const whole = abs / divisor;\n const fraction = (abs % divisor).toString().padStart(decimals, \"0\").replace(/0+$/, \"\");\n const sign = negative ? \"-\" : \"\";\n return fraction ? `${sign}${whole}.${fraction}` : `${sign}${whole}`;\n}\n","/**\n * Praxis SDK wire types — the JSON contract exposed by `/api/praxis/*`.\n *\n * MONEY RULE: every monetary value crosses the wire as a **decimal string of\n * integer base units** (lamports for SOL, token base units for SPL) — never a\n * float. On the server these are `bigint`; the API serializes them to strings.\n * The SDK keeps them as strings and leaves bigint conversion to the caller\n * (see `toBaseUnits` / `fromBaseUnits` in `units.ts`). This file intentionally\n * mirrors `@praxis/shared` but with `string` money, so the SDK ships a\n * self-contained type contract with no internal workspace dependency.\n */\n\n/** A base58-encoded Solana public key. */\nexport type Address = string;\n\n/** Integer base units as a decimal string (e.g. \"500000000\" = 0.5 SOL). */\nexport type BaseUnitString = string;\n\n/** Mirrors the on-chain `ActionKind` discriminants. */\nexport enum ActionKind {\n Transfer = 0,\n TransferSpl = 1,\n}\n\n/** Why Aegis rejected an agent action. Mirrors the on-chain enum order. */\nexport enum RejectReason {\n Unauthorized = 0,\n Paused = 1,\n Expired = 2,\n OverPerTx = 3,\n OverDaily = 4,\n RecipientNotAllowed = 5,\n Overflow = 6,\n MintNotAllowed = 7,\n}\n\n// --- Auth ------------------------------------------------------------------\n\n/** Returned by `POST /auth/challenge`; sign `message` to prove wallet ownership. */\nexport interface WalletChallenge {\n address: Address;\n /** Opaque signed token echoed back to `/auth/verify`. */\n nonce: string;\n /** The exact UTF-8 string the wallet must sign. */\n message: string;\n /** ISO-8601 expiry of the challenge. */\n expiresAt: string;\n}\n\nexport interface SessionInfo {\n authenticated: boolean;\n walletAddress: Address;\n}\n\n// --- Tokens / address book -------------------------------------------------\n\nexport interface TokenInfo {\n symbol: string;\n mint: Address;\n decimals: number;\n verified: boolean;\n}\n\nexport interface AddressBookEntry {\n label: string;\n name: string;\n address: Address;\n note?: string;\n}\n\n// --- Policy ----------------------------------------------------------------\n\nexport interface PolicyView {\n address: Address;\n owner: Address;\n /** `11111…1111` (default) once the agent key is revoked. */\n agentAuthority: Address;\n maxPerTx: BaseUnitString;\n dailyLimit: BaseUnitString;\n spentToday: BaseUnitString;\n dayStartTs: number;\n allowedPrograms: Address[];\n /** Empty array means \"any recipient allowed\". */\n allowedRecipients: Address[];\n allowedMints: Address[];\n expiryTs: number;\n paused: boolean;\n vaultBalance: BaseUnitString;\n tokenMint: Address;\n tokenMaxPerTx: BaseUnitString;\n tokenDailyLimit: BaseUnitString;\n tokenSpentToday: BaseUnitString;\n tokenDayStartTs: number;\n}\n\nexport interface PolicyCheckResult {\n allowed: boolean;\n reason?: string;\n reasonCode?: RejectReason;\n spentToday: BaseUnitString;\n dailyLimit: BaseUnitString;\n remaining: BaseUnitString;\n}\n\nexport interface PolicyUpdate {\n maxPerTx?: BaseUnitString;\n dailyLimit?: BaseUnitString;\n expiryTs?: number;\n paused?: boolean;\n}\n\nexport interface TokenEnvelopeConfig {\n tokenMint: Address;\n tokenMaxPerTx: BaseUnitString;\n tokenDailyLimit: BaseUnitString;\n}\n\nexport type AllowListKind = \"programs\" | \"recipients\" | \"mints\";\n\n// --- Proposals -------------------------------------------------------------\n\nexport interface TransferDetail {\n kind: \"transfer\";\n amount: BaseUnitString;\n asset: TokenInfo;\n recipientName: string;\n recipientAddress: Address;\n recipientNote?: string;\n}\n\nexport interface SwapDetail {\n kind: \"swap\";\n amountIn: BaseUnitString;\n assetIn: TokenInfo;\n estAmountOut: BaseUnitString;\n assetOut: TokenInfo;\n route: string;\n priceImpactBps: number;\n}\n\nexport type ProposalDetail = TransferDetail | SwapDetail;\n\nexport type ProposalState = \"pending\" | \"signing\" | \"signed\" | \"blocked\" | \"cancelled\";\n\nexport interface ActionProposal {\n id: string;\n detail: ProposalDetail;\n networkFee: BaseUnitString;\n simulation: string;\n check: PolicyCheckResult;\n state: ProposalState;\n sig?: string;\n}\n\n// --- Conversation ----------------------------------------------------------\n\nexport interface ClarifyOption {\n label: string;\n value: string;\n hint?: string;\n}\n\nexport interface ResearchMetric {\n label: string;\n value: string;\n trend?: \"up\" | \"down\" | \"flat\";\n}\n\nexport interface ResearchData {\n token: string;\n mint: Address;\n metrics: ResearchMetric[];\n summary: string;\n}\n\nexport type AgentBlock =\n | { type: \"prose\"; text: string }\n | { type: \"clarify\"; text: string; options: ClarifyOption[] }\n | { type: \"proposal\"; text: string; proposalId: string }\n | { type: \"research\"; text: string; data: ResearchData };\n\nexport type UserMessage = { id: string; role: \"user\"; ts: number; text: string };\nexport type AgentMessage = { id: string; role: \"agent\"; ts: number; blocks: AgentBlock[] };\nexport type Message = UserMessage | AgentMessage;\n\nexport interface Thread {\n id: string;\n title: string;\n messages: Message[];\n updatedAt: number;\n}\n\n// --- Activity --------------------------------------------------------------\n\nexport interface ActivityEntry {\n id: string;\n kind: \"transfer\" | \"swap\";\n label: string;\n asset: string;\n amount: BaseUnitString;\n decimals: number;\n result: \"allowed\" | \"rejected\";\n reason?: string;\n reasonCode?: RejectReason;\n ts: number;\n sig?: string;\n}\n\n// --- Owner transactions (wallet-signed path) -------------------------------\n\nexport interface UnsignedOwnerTransaction {\n /** base64-encoded unsigned transaction for the owner wallet to sign. */\n transaction: string;\n blockhash: string;\n lastValidBlockHeight: number;\n}\n\n/** Typed owner action accepted by `POST /owner/build`. */\nexport type OwnerAction =\n | { kind: \"bootstrapPolicy\"; fundLamports?: BaseUnitString }\n | { kind: \"fundVault\"; amount: BaseUnitString }\n | { kind: \"withdrawVault\"; amount: BaseUnitString }\n | { kind: \"closePolicy\" }\n | { kind: \"revoke\" }\n | { kind: \"rotate\" }\n | { kind: \"updatePolicy\"; patch: PolicyUpdate }\n | { kind: \"allowList\"; listKind: AllowListKind; address: Address; mode: \"add\" | \"remove\" };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/signer.ts","../src/units.ts","../src/types.ts"],"names":["bs58","nacl","ActionKind","RejectReason"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * A stable, machine-readable classification of a backend failure. Branch on\n * this rather than on `message`, which is human prose and free to change.\n * `client_error` is synthesized SDK-side for failures with no HTTP response\n * (timeout, DNS, TLS).\n */\nexport type PraxisErrorCode =\n | \"config_error\"\n | \"unauthorized\"\n | \"invalid_input\"\n | \"not_found\"\n /** The wallet has no Aegis policy account yet — call `bootstrapPolicy`. */\n | \"policy_not_found\"\n | \"rate_limited\"\n /** A concurrent writer changed this wallet's state first; reload and retry. */\n | \"conflict\"\n | \"internal_error\"\n | \"client_error\";\n\n/**\n * Thrown when the Praxis API returns a non-2xx response. The backend's error\n * envelope is `{ error, type, code, details? }` with a meaningful HTTP status\n * (400 input, 401 auth, 404 not-found, 429 rate-limit, 503 config, 500 other).\n */\nexport class PraxisApiError extends Error {\n readonly status: number;\n /** The backend error class name, e.g. \"PraxisAuthError\", \"PraxisRateLimitError\". */\n readonly type: string;\n /** Stable error classification — the field to branch on. */\n readonly code: PraxisErrorCode;\n /** Structured facts about the failure, e.g. `{ policyAddress }` for `policy_not_found`. */\n readonly details?: Record<string, string | number | boolean>;\n\n constructor(\n status: number,\n type: string,\n message: string,\n options?: {\n cause?: unknown;\n code?: PraxisErrorCode;\n details?: Record<string, string | number | boolean>;\n },\n ) {\n super(message, options);\n this.name = \"PraxisApiError\";\n this.status = status;\n this.type = type;\n this.code = options?.code ?? codeFromStatus(status);\n this.details = options?.details;\n // Restore prototype chain for instanceof across transpile targets.\n Object.setPrototypeOf(this, PraxisApiError.prototype);\n }\n\n get isAuth(): boolean {\n return this.status === 401;\n }\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n get isInput(): boolean {\n return this.status === 400;\n }\n /** Resource not found (404). */\n get isNotFound(): boolean {\n return this.status === 404;\n }\n /** Server reported a configuration problem (503) — usually transient. */\n get isConfig(): boolean {\n return this.status === 503;\n }\n /** The request timed out client-side before any HTTP response. */\n get isTimeout(): boolean {\n return this.status === 0 && this.type === \"TimeoutError\";\n }\n /** A connection-level failure (DNS, refused, TLS) before any HTTP response. */\n get isNetwork(): boolean {\n return this.status === 0 && this.type === \"NetworkError\";\n }\n /** Any server-side failure (HTTP >= 500). */\n get isServer(): boolean {\n return this.status >= 500;\n }\n /** The wallet has no Aegis policy yet — the first-run state, not a fault. */\n get isPolicyNotFound(): boolean {\n return this.code === \"policy_not_found\";\n }\n /** A concurrent writer won; the call is safe to retry after a reload. */\n get isConflict(): boolean {\n return this.code === \"conflict\";\n }\n}\n\n/** Fallback classification for responses from an older backend with no `code`. */\nfunction codeFromStatus(status: number): PraxisErrorCode {\n if (status === 400) return \"invalid_input\";\n if (status === 401) return \"unauthorized\";\n if (status === 404) return \"not_found\";\n if (status === 409) return \"conflict\";\n if (status === 429) return \"rate_limited\";\n if (status === 503) return \"config_error\";\n if (status === 0) return \"client_error\";\n return \"internal_error\";\n}\n\n/** Thrown for SDK-side misconfiguration (no fetch, no signer, bad key, …). */\nexport class PraxisConfigError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"PraxisConfigError\";\n Object.setPrototypeOf(this, PraxisConfigError.prototype);\n }\n}\n","import bs58 from \"bs58\";\n\nimport { PraxisApiError, PraxisConfigError, type PraxisErrorCode } from \"./errors\";\nimport type { PraxisSigner } from \"./signer\";\nimport type {\n ActionProposal,\n ActivityEntry,\n AddressBookEntry,\n AgentMessage,\n AllowListKind,\n BaseUnitString,\n DcaSchedule,\n OwnerAction,\n PolicyUpdate,\n PolicyView,\n ResearchData,\n SessionInfo,\n SignedOwnerTransaction,\n StockUniverseEntry,\n Thread,\n TokenEnvelopeConfig,\n UnsignedOwnerTransaction,\n WalletChallenge,\n} from \"./types\";\n\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\nexport interface PraxisClientOptions {\n /** Base origin of the Praxis deployment, e.g. \"http://localhost:3000\". */\n baseUrl: string;\n /** Wallet signer for `connect()`. Optional if you only call public reads after an external login. */\n signer?: PraxisSigner;\n /** Custom fetch (defaults to global fetch). Required in runtimes without one. */\n fetch?: FetchLike;\n /** Per-request timeout in ms for reads/mutations (default 20_000). */\n timeoutMs?: number;\n /**\n * Per-request timeout in ms for agent conversation turns (`send`/`ask`), which\n * block on the full LLM round-trip (default 60_000). Effective value is never\n * below `timeoutMs`.\n */\n agentTimeoutMs?: number;\n}\n\n/** Result of {@link PraxisClient.ask} — the agent's reply, distilled. */\nexport interface AskResult {\n threadId: string;\n /** The agent's reply message (prose / clarify / proposal / research blocks). */\n message: AgentMessage;\n /** Any action proposals the agent produced, hydrated for convenience. */\n proposals: ActionProposal[];\n}\n\nconst API_PREFIX = \"/api/praxis\";\n\n/**\n * Typed client for a hosted Praxis agent. The agent's LLM, scoped agent key, and\n * Aegis policy enforcement all live server-side; this SDK is an authenticated\n * client of the `/api/praxis/*` surface.\n *\n * ```ts\n * const praxis = new PraxisClient({ baseUrl, signer: keypairSigner(secret) });\n * await praxis.connect();\n * const { proposals } = await praxis.ask(\"send 0.5 SOL to maya\");\n * if (proposals[0]?.check.allowed) await praxis.signProposal(proposals[0].id);\n * ```\n */\nexport class PraxisClient {\n private readonly baseUrl: string;\n private readonly signer?: PraxisSigner;\n private readonly fetchImpl: FetchLike;\n private readonly timeoutMs: number;\n private readonly agentTimeoutMs: number;\n /** Manual cookie jar — Node's fetch does not persist Set-Cookie across calls. */\n private sessionCookie?: string;\n\n constructor(options: PraxisClientOptions) {\n if (!options.baseUrl) throw new PraxisConfigError(\"baseUrl is required\");\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.signer = options.signer;\n const resolvedFetch = options.fetch ?? (globalThis.fetch as FetchLike | undefined);\n if (!resolvedFetch) {\n throw new PraxisConfigError(\"No fetch available; pass options.fetch (Node <18 or non-browser runtime).\");\n }\n this.fetchImpl = resolvedFetch;\n this.timeoutMs = options.timeoutMs ?? 20_000;\n this.agentTimeoutMs = Math.max(options.agentTimeoutMs ?? 60_000, this.timeoutMs);\n }\n\n // --- auth ----------------------------------------------------------------\n\n /** The signer's wallet address, if a signer was provided. */\n get address(): string | undefined {\n return this.signer?.address;\n }\n\n /**\n * Run the wallet-ownership handshake: request a challenge, sign its message,\n * verify it, and store the resulting session cookie. Safe to call again to\n * refresh the session (each call issues a new challenge + cookie).\n */\n async connect(): Promise<SessionInfo> {\n if (!this.signer) {\n throw new PraxisConfigError(\"connect() requires a signer. Pass one to the constructor.\");\n }\n const challenge = await this.post<WalletChallenge>(\"/auth/challenge\", {\n address: this.signer.address,\n });\n const signature = await this.signer.signMessage(new TextEncoder().encode(challenge.message));\n return this.post<SessionInfo>(\"/auth/verify\", {\n address: this.signer.address,\n nonce: challenge.nonce,\n signature: bs58.encode(signature),\n });\n }\n\n /**\n * Current session, or `null` if not signed in. The endpoint answers `200`\n * with `{ authenticated: false }` when signed out, so this normalizes both\n * that shape and a `401` to `null`.\n */\n async session(): Promise<SessionInfo | null> {\n try {\n const info = await this.get<SessionInfo>(\"/auth/session\");\n return info && info.authenticated ? info : null;\n } catch (error) {\n if (error instanceof PraxisApiError && error.isAuth) return null;\n throw error;\n }\n }\n\n /**\n * Clear the session (server-side cookie + local jar). Idempotent: if there is\n * no active session, the local jar is still cleared and no error is thrown.\n */\n async logout(): Promise<void> {\n try {\n await this.request<unknown>(\"DELETE\", \"/auth/session\");\n } catch (error) {\n // Already signed out (missing / expired session) is a successful logout.\n if (!(error instanceof PraxisApiError && error.isAuth)) throw error;\n } finally {\n this.sessionCookie = undefined;\n }\n }\n\n // --- conversation --------------------------------------------------------\n\n /** Send a line to the agent. Creates a thread when `threadId` is omitted. */\n send(text: string, threadId: string | null = null): Promise<{ threadId: string }> {\n // Conversation turns block on the agent's LLM round-trip — give them the\n // longer agent budget rather than the shorter read/mutation timeout.\n return this.post<{ threadId: string }>(\"/send\", { text, threadId }, this.agentTimeoutMs);\n }\n\n /**\n * Send a line and return the agent's reply in one call. The API resolves\n * `send` only after the agent has finished, so this needs no polling.\n */\n async ask(text: string, threadId: string | null = null): Promise<AskResult> {\n const { threadId: tid } = await this.send(text, threadId);\n const thread = await this.getThread(tid);\n const message = lastAgentMessage(thread);\n if (!message) {\n throw new PraxisApiError(500, \"Error\", \"Agent produced no reply message.\");\n }\n const proposalIds = message.blocks\n .filter((b): b is Extract<typeof b, { type: \"proposal\" }> => b.type === \"proposal\")\n .map((b) => b.proposalId);\n if (proposalIds.length === 0) return { threadId: tid, message, proposals: [] };\n\n // One batch read rather than one request per card: a basket reply carries\n // eight proposals, and eight round-trips per turn is how a caller hits the\n // read limit doing nothing wrong.\n const byId = new Map((await this.getProposals()).map((p) => [p.id, p]));\n const proposals = proposalIds\n .map((id) => byId.get(id))\n .filter((p): p is ActionProposal => p !== undefined);\n return { threadId: tid, message, proposals };\n }\n\n newThread(threadId?: string): Promise<{ threadId: string }> {\n return this.post<{ threadId: string }>(\"/new-thread\", threadId ? { threadId } : {});\n }\n\n signProposal(proposalId: string): Promise<void> {\n return this.post<void>(\"/sign-proposal\", { proposalId });\n }\n\n cancelProposal(proposalId: string): Promise<void> {\n return this.post<void>(\"/cancel-proposal\", { proposalId });\n }\n\n /** List recurring-buy schedules (each fire emits one proposal; never signs). */\n getSchedules(): Promise<DcaSchedule[]> {\n return this.get<DcaSchedule[]>(\"/get-schedules\");\n }\n\n /** Stop a recurring-buy schedule. Unknown ids are a no-op (idempotent). */\n cancelSchedule(scheduleId: string): Promise<void> {\n return this.post<void>(\"/cancel-schedule\", { scheduleId });\n }\n\n /** Save (or rename) an address-book contact. Labels have no signing power. */\n addContact(label: string, address: string): Promise<void> {\n return this.post<void>(\"/add-contact\", { label, address });\n }\n\n /** Remove a contact by address or label (case-insensitive, idempotent). */\n removeContact(key: string): Promise<void> {\n return this.post<void>(\"/remove-contact\", { key });\n }\n\n // --- reads ---------------------------------------------------------------\n\n getThreads(): Promise<Thread[]> {\n return this.get<Thread[]>(\"/get-threads\");\n }\n getThread(id: string): Promise<Thread> {\n return this.get<Thread>(\"/get-thread\", { id });\n }\n getProposal(id: string): Promise<ActionProposal> {\n return this.get<ActionProposal>(\"/get-proposal\", { id });\n }\n /**\n * Every proposal this wallet holds, in one request. Prefer this over a loop\n * of {@link getProposal}: a per-id fetch is what trips the read rate limit\n * on a busy thread.\n */\n getProposals(): Promise<ActionProposal[]> {\n return this.get<ActionProposal[]>(\"/get-proposals\");\n }\n getPolicy(): Promise<PolicyView> {\n return this.get<PolicyView>(\"/get-policy\");\n }\n getActivity(): Promise<ActivityEntry[]> {\n return this.get<ActivityEntry[]>(\"/get-activity\");\n }\n getAddressBook(): Promise<AddressBookEntry[]> {\n return this.get<AddressBookEntry[]>(\"/get-address-book\");\n }\n getVersion(): Promise<number> {\n return this.get<number>(\"/get-version\");\n }\n\n // --- stocks (PreStocks universe; empty unless the server enables it) ------\n\n /**\n * The server's stock universe (`[]` when `PRAXIS_STOCKS_ENABLED` is off).\n * Read-only; symbols/mints here are the only pre-IPO stocks Praxis will\n * touch (bounty exclusivity is enforced server-side).\n */\n getTokenUniverse(): Promise<StockUniverseEntry[]> {\n return this.get<StockUniverseEntry[]>(\"/get-stock-universe\");\n }\n\n /**\n * Read-only research for a stock symbol, via the agent (`research <symbol>`).\n * Returns neutral market data — never advice. Throws when the agent has no\n * research to show (unknown symbol or unavailable quotes).\n */\n async getStockResearch(symbol: string): Promise<ResearchData> {\n const { message } = await this.ask(`research ${symbol}`);\n const block = message.blocks.find((b) => b.type === \"research\");\n if (!block || block.type !== \"research\") {\n throw new PraxisApiError(404, \"NotFound\", `No research available for ${symbol}.`);\n }\n return block.data;\n }\n\n // --- policy / owner mutations (server-key mode) --------------------------\n\n bootstrapPolicy(fundLamports?: BaseUnitString): Promise<void> {\n return this.post<void>(\"/bootstrap-policy\", fundLamports ? { fundLamports } : {});\n }\n /** Deposit SOL (lamports, base-unit string) from the owner into the vault. */\n fundVault(amount: BaseUnitString): Promise<void> {\n return this.post<void>(\"/fund-vault\", { amount });\n }\n /** Withdraw SOL (lamports, base-unit string) from the vault to the owner. */\n withdrawVault(amount: BaseUnitString): Promise<void> {\n return this.post<void>(\"/withdraw-vault\", { amount });\n }\n /** Tear the agent down — drain the vault and close the policy. Irreversible. */\n deleteAgent(): Promise<void> {\n return this.post<void>(\"/delete-agent\", {});\n }\n updatePolicy(patch: PolicyUpdate): Promise<void> {\n return this.post<void>(\"/update-policy\", { patch });\n }\n configureToken(config: TokenEnvelopeConfig): Promise<void> {\n return this.post<void>(\"/configure-token\", { config });\n }\n prepareTokenAccounts(recipientAddresses?: string[]): Promise<void> {\n return this.post<void>(\"/prepare-token-accounts\", recipientAddresses ? { recipientAddresses } : {});\n }\n revokeAgent(): Promise<void> {\n return this.post<void>(\"/revoke-agent\", {});\n }\n rotateAgent(): Promise<void> {\n return this.post<void>(\"/rotate-agent\", {});\n }\n addToAllowList(kind: AllowListKind, address: string): Promise<void> {\n return this.post<void>(\"/add-to-allow-list\", { kind, address });\n }\n removeFromAllowList(kind: AllowListKind, address: string): Promise<void> {\n return this.post<void>(\"/remove-from-allow-list\", { kind, address });\n }\n\n // --- owner wallet-signed transaction path --------------------------------\n\n /**\n * Build an unsigned owner transaction for the wallet to sign. The caller signs\n * the returned base64 `transaction` with a transaction-capable wallet, then\n * passes the result to {@link submitOwnerTransaction}. (The SDK's\n * `keypairSigner` signs sign-in messages only, not transactions.)\n */\n buildOwnerTransaction(action: OwnerAction): Promise<UnsignedOwnerTransaction> {\n return this.post<UnsignedOwnerTransaction>(\"/owner/build\", { action });\n }\n /** Submit a wallet-signed owner transaction; resolves with its signature. */\n submitOwnerTransaction(signed: SignedOwnerTransaction): Promise<{ sig: string }> {\n return this.post<{ sig: string }>(\"/owner/submit\", signed);\n }\n\n // --- transport -----------------------------------------------------------\n\n private get<T>(path: string, query?: Record<string, string>): Promise<T> {\n return this.request<T>(\"GET\", path, { query });\n }\n\n private post<T>(path: string, body: unknown, timeoutMs?: number): Promise<T> {\n return this.request<T>(\"POST\", path, { body, timeoutMs });\n }\n\n /**\n * Run a request, and if the session has expired, sign in again and retry it\n * once.\n *\n * Sessions are deliberately short — holding one is enough to move value\n * within the Aegis envelope — so a long-lived agent process WILL outlive its\n * cookie. Without this, every caller writes the same catch-401-and-reconnect\n * block, and the ones who do not simply stop working after a day. Retried\n * once only, never for the auth endpoints themselves, and only when a signer\n * is configured; without one there is nothing to re-authenticate with and the\n * 401 is the honest answer.\n */\n private async request<T>(\n method: string,\n path: string,\n opts: { body?: unknown; query?: Record<string, string>; timeoutMs?: number } = {},\n ): Promise<T> {\n try {\n return await this.send1<T>(method, path, opts);\n } catch (error) {\n const recoverable =\n error instanceof PraxisApiError\n && error.isAuth\n && Boolean(this.signer)\n && !path.startsWith(\"/auth/\");\n if (!recoverable) throw error;\n this.sessionCookie = undefined;\n await this.connect();\n return this.send1<T>(method, path, opts);\n }\n }\n\n private async send1<T>(\n method: string,\n path: string,\n opts: { body?: unknown; query?: Record<string, string>; timeoutMs?: number } = {},\n ): Promise<T> {\n const url = new URL(this.baseUrl + API_PREFIX + path);\n for (const [k, v] of Object.entries(opts.query ?? {})) url.searchParams.set(k, v);\n\n const headers: Record<string, string> = { accept: \"application/json\" };\n if (opts.body !== undefined) headers[\"content-type\"] = \"application/json\";\n if (this.sessionCookie) headers[\"cookie\"] = this.sessionCookie;\n\n const timeoutMs = opts.timeoutMs ?? this.timeoutMs;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n let res: Response;\n try {\n res = await this.fetchImpl(url.toString(), {\n method,\n headers,\n body: opts.body === undefined ? undefined : JSON.stringify(opts.body),\n // Browser same-origin: let the HttpOnly cookie ride along.\n credentials: \"include\",\n signal: controller.signal,\n } as RequestInit);\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new PraxisApiError(0, \"TimeoutError\", `Praxis request timed out after ${timeoutMs}ms`, {\n cause: error,\n });\n }\n if (error instanceof PraxisApiError) throw error;\n // Connection-level failures (DNS, ECONNREFUSED, TLS) surface uniformly as\n // a PraxisApiError so callers have a single error type to catch.\n const detail = error instanceof Error ? error.message : String(error);\n throw new PraxisApiError(0, \"NetworkError\", `Praxis request failed: ${detail}`, { cause: error });\n } finally {\n clearTimeout(timer);\n }\n\n this.captureCookie(res);\n\n const text = await res.text();\n const parsed = text ? safeJsonParse(text) : undefined;\n\n if (!res.ok) {\n const message =\n (parsed && typeof parsed === \"object\" && \"error\" in parsed && typeof parsed.error === \"string\"\n ? parsed.error\n : undefined) ?? `Praxis API error ${res.status}`;\n const type =\n parsed && typeof parsed === \"object\" && \"type\" in parsed && typeof parsed.type === \"string\"\n ? parsed.type\n : \"Error\";\n // `code`/`details` are the stable contract; both are optional so an older\n // backend still yields a well-formed error (code derived from status).\n const record = parsed && typeof parsed === \"object\" ? (parsed as Record<string, unknown>) : undefined;\n const code = typeof record?.code === \"string\" ? (record.code as PraxisErrorCode) : undefined;\n const details =\n record?.details && typeof record.details === \"object\" && !Array.isArray(record.details)\n ? (record.details as Record<string, string | number | boolean>)\n : undefined;\n throw new PraxisApiError(res.status, type, message, { code, details });\n }\n\n return parsed as T;\n }\n\n private captureCookie(res: Response): void {\n // Node 18.14+ exposes getSetCookie(); fall back to the combined header.\n const anyHeaders = res.headers as Headers & { getSetCookie?: () => string[] };\n const cookies = anyHeaders.getSetCookie?.() ?? splitSetCookie(res.headers.get(\"set-cookie\"));\n for (const cookie of cookies) {\n const [pair] = cookie.split(\";\");\n if (pair && pair.trim().startsWith(\"praxis_session=\")) {\n this.sessionCookie = pair.trim();\n }\n }\n }\n}\n\nfunction lastAgentMessage(thread: Thread): AgentMessage | undefined {\n for (let i = thread.messages.length - 1; i >= 0; i--) {\n const m = thread.messages[i];\n if (m.role === \"agent\") return m;\n }\n return undefined;\n}\n\nfunction safeJsonParse(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction splitSetCookie(header: string | null): string[] {\n if (!header) return [];\n // Split on commas that precede a new cookie name=value pair, not commas inside\n // Expires dates (\"Wed, 01 Jan ...\").\n return header.split(/,(?=\\s*[^;,\\s]+=)/);\n}\n","import bs58 from \"bs58\";\nimport nacl from \"tweetnacl\";\n\nimport { PraxisConfigError } from \"./errors\";\n\n/**\n * Signs the wallet-ownership challenge. Implement this to bridge any wallet:\n * - Node / backend agents: use {@link keypairSigner} with a secret key.\n * - Browser: wrap a wallet-adapter, e.g.\n * `{ address: wallet.publicKey.toBase58(), signMessage: (m) => wallet.signMessage(m) }`.\n *\n * `signMessage` must return the raw 64-byte Ed25519 signature; the SDK base58-\n * encodes it for the API.\n */\nexport interface PraxisSigner {\n /** base58-encoded Solana public key. */\n readonly address: string;\n signMessage(message: Uint8Array): Promise<Uint8Array> | Uint8Array;\n}\n\nexport type SecretKeyInput = Uint8Array | number[] | string;\n\n/**\n * Build a {@link PraxisSigner} from a Solana secret key — a 64-byte keypair or a\n * 32-byte seed, as raw bytes, a number array, or a base58 string (Phantom /\n * `solana-keygen` export). Node and browser friendly; no `@solana/web3.js`\n * dependency.\n */\nexport function keypairSigner(secret: SecretKeyInput): PraxisSigner {\n const bytes = normalizeSecret(secret);\n const pair =\n bytes.length === 64\n ? nacl.sign.keyPair.fromSecretKey(bytes)\n : nacl.sign.keyPair.fromSeed(bytes);\n const address = bs58.encode(pair.publicKey);\n const secretKey = pair.secretKey;\n\n return {\n address,\n signMessage: (message: Uint8Array) => nacl.sign.detached(message, secretKey),\n };\n}\n\nfunction normalizeSecret(secret: SecretKeyInput): Uint8Array {\n let bytes: Uint8Array;\n if (typeof secret === \"string\") {\n try {\n bytes = bs58.decode(secret.trim());\n } catch {\n throw new PraxisConfigError(\"secret key string must be base58-encoded\");\n }\n } else if (Array.isArray(secret)) {\n if (!secret.every((b) => Number.isInteger(b) && b >= 0 && b <= 255)) {\n throw new PraxisConfigError(\"secret key array must contain only byte values (integers 0–255)\");\n }\n bytes = Uint8Array.from(secret);\n } else {\n bytes = secret;\n }\n\n if (bytes.length !== 64 && bytes.length !== 32) {\n throw new PraxisConfigError(\n `secret key must be 64 bytes (keypair) or 32 bytes (seed), got ${bytes.length}`,\n );\n }\n return bytes;\n}\n","/**\n * Money helpers. Praxis money crosses the wire as decimal strings of integer\n * base units (lamports / token base units). These convert to/from `bigint` and\n * human decimal amounts without floats.\n */\n\n/** An optionally-signed decimal integer — the only valid base-unit string. */\nconst INTEGER_RE = /^-?\\d+$/;\n\n/**\n * Parse a base-unit string (or bigint) into a bigint. Rejects floats, hex, and\n * other non-decimal-integer input so the SDK and server agree on what a valid\n * base-unit string is (mirrors the server's `parseUnits`).\n */\nexport function toBaseUnits(value: string | bigint): bigint {\n if (typeof value === \"bigint\") return value;\n const trimmed = value.trim();\n if (!INTEGER_RE.test(trimmed)) {\n throw new Error(`toBaseUnits: expected an integer base-unit string, got \"${value}\"`);\n }\n return BigInt(trimmed);\n}\n\n/**\n * Serialize a bigint (or a whole, safe-integer number of base units) into a\n * base-unit string. A non-integer or unsafe `number` throws rather than\n * silently losing precision.\n */\nexport function fromBaseUnits(value: bigint | number): string {\n if (typeof value === \"number\" && !Number.isSafeInteger(value)) {\n throw new Error(`fromBaseUnits: number must be a safe integer, got ${value}`);\n }\n return BigInt(value).toString();\n}\n\n/** Convert a human decimal amount (\"0.5\") into base units for `decimals` places. */\nexport function humanToBaseUnits(amount: string, decimals: number): string {\n const trimmed = amount.trim();\n if (!/^\\d+(\\.\\d+)?$/.test(trimmed)) {\n throw new Error(`invalid decimal amount: \"${amount}\"`);\n }\n const [whole, fraction = \"\"] = trimmed.split(\".\");\n if (fraction.length > decimals) {\n throw new Error(`\"${amount}\" has more than ${decimals} decimal places`);\n }\n const padded = fraction.padEnd(decimals, \"0\");\n return (BigInt(whole) * 10n ** BigInt(decimals) + BigInt(padded || \"0\")).toString();\n}\n\n/** Convert base units into a human decimal string for `decimals` places. */\nexport function baseUnitsToHuman(value: string | bigint, decimals: number): string {\n const units = toBaseUnits(value);\n const negative = units < 0n;\n const abs = negative ? -units : units;\n const divisor = 10n ** BigInt(decimals);\n const whole = abs / divisor;\n const fraction = (abs % divisor).toString().padStart(decimals, \"0\").replace(/0+$/, \"\");\n const sign = negative ? \"-\" : \"\";\n return fraction ? `${sign}${whole}.${fraction}` : `${sign}${whole}`;\n}\n","/**\n * Praxis SDK wire types — the JSON contract exposed by `/api/praxis/*`.\n *\n * MONEY RULE: every monetary value crosses the wire as a **decimal string of\n * integer base units** (lamports for SOL, token base units for SPL) — never a\n * float. On the server these are `bigint`; the API serializes them to strings.\n * The SDK keeps them as strings and leaves bigint conversion to the caller\n * (see `toBaseUnits` / `fromBaseUnits` in `units.ts`). This file intentionally\n * mirrors `@praxis/shared` but with `string` money, so the SDK ships a\n * self-contained type contract with no internal workspace dependency.\n */\n\n/** A base58-encoded Solana public key. */\nexport type Address = string;\n\n/** Integer base units as a decimal string (e.g. \"500000000\" = 0.5 SOL). */\nexport type BaseUnitString = string;\n\n/** Mirrors the on-chain `ActionKind` discriminants. */\nexport enum ActionKind {\n Transfer = 0,\n TransferSpl = 1,\n}\n\n/** Why Aegis rejected an agent action. Mirrors the on-chain enum order. */\nexport enum RejectReason {\n Unauthorized = 0,\n Paused = 1,\n Expired = 2,\n OverPerTx = 3,\n OverDaily = 4,\n RecipientNotAllowed = 5,\n Overflow = 6,\n MintNotAllowed = 7,\n}\n\n// --- Auth ------------------------------------------------------------------\n\n/** Returned by `POST /auth/challenge`; sign `message` to prove wallet ownership. */\nexport interface WalletChallenge {\n address: Address;\n /** Opaque signed token echoed back to `/auth/verify`. */\n nonce: string;\n /** The exact UTF-8 string the wallet must sign. */\n message: string;\n /** ISO-8601 expiry of the challenge. */\n expiresAt: string;\n}\n\nexport interface SessionInfo {\n authenticated: boolean;\n /** The signed-in wallet (owner). Present whenever `authenticated` is true. */\n walletAddress: Address;\n /** Unix seconds at which the session expires (from `GET /auth/session`). */\n expiresAt?: number;\n}\n\n// --- Tokens / address book -------------------------------------------------\n\nexport interface TokenInfo {\n symbol: string;\n mint: Address;\n decimals: number;\n verified: boolean;\n}\n\nexport interface AddressBookEntry {\n label: string;\n name: string;\n address: Address;\n note?: string;\n}\n\n// --- Policy ----------------------------------------------------------------\n\nexport interface PolicyView {\n address: Address;\n owner: Address;\n /** `11111…1111` (default) once the agent key is revoked. */\n agentAuthority: Address;\n maxPerTx: BaseUnitString;\n dailyLimit: BaseUnitString;\n spentToday: BaseUnitString;\n dayStartTs: number;\n allowedPrograms: Address[];\n /** Empty array means \"any recipient allowed\". */\n allowedRecipients: Address[];\n allowedMints: Address[];\n expiryTs: number;\n paused: boolean;\n vaultBalance: BaseUnitString;\n tokenMint: Address;\n tokenMaxPerTx: BaseUnitString;\n tokenDailyLimit: BaseUnitString;\n tokenSpentToday: BaseUnitString;\n tokenDayStartTs: number;\n}\n\nexport interface PolicyCheckResult {\n allowed: boolean;\n reason?: string;\n reasonCode?: RejectReason;\n spentToday: BaseUnitString;\n dailyLimit: BaseUnitString;\n remaining: BaseUnitString;\n}\n\nexport interface PolicyUpdate {\n maxPerTx?: BaseUnitString;\n dailyLimit?: BaseUnitString;\n expiryTs?: number;\n paused?: boolean;\n}\n\nexport interface TokenEnvelopeConfig {\n tokenMint: Address;\n tokenMaxPerTx: BaseUnitString;\n tokenDailyLimit: BaseUnitString;\n}\n\nexport type AllowListKind = \"programs\" | \"recipients\" | \"mints\";\n\n// --- Proposals -------------------------------------------------------------\n\nexport interface TransferDetail {\n kind: \"transfer\";\n amount: BaseUnitString;\n asset: TokenInfo;\n recipientName: string;\n recipientAddress: Address;\n recipientNote?: string;\n /** The destination is the owner's own wallet (derived from the address). */\n toSelf?: true;\n /**\n * Server-computed USD value of `amount`, as a decimal string, when a real\n * price is available. Absent means \"not known\" — display only, and never an\n * input to base-unit math.\n */\n usdEstimate?: string;\n}\n\nexport interface SwapDetail {\n kind: \"swap\";\n amountIn: BaseUnitString;\n assetIn: TokenInfo;\n estAmountOut: BaseUnitString;\n assetOut: TokenInfo;\n route: string;\n priceImpactBps: number;\n}\n\nexport type ProposalDetail = TransferDetail | SwapDetail;\n\nexport type ProposalState = \"pending\" | \"signing\" | \"signed\" | \"blocked\" | \"cancelled\";\n\nexport interface ActionProposal {\n id: string;\n /**\n * Unix seconds when the proposal was produced. The signature gate refuses a\n * proposal older than a week: the amount is fixed and Aegis enforces the\n * envelope live, but the readings on it (fee, simulation, remaining\n * envelope, USD figure) drift. Ask again for a fresh one. Absent on\n * proposals created before this field existed.\n */\n createdAt?: number;\n detail: ProposalDetail;\n networkFee: BaseUnitString;\n simulation: string;\n check: PolicyCheckResult;\n state: ProposalState;\n sig?: string;\n}\n\n// --- Conversation ----------------------------------------------------------\n\nexport interface ClarifyOption {\n label: string;\n value: string;\n hint?: string;\n}\n\nexport interface ResearchMetric {\n label: string;\n /** Already display-formatted, and abbreviated where a raw figure is unreadable. */\n value: string;\n /** The full-precision figure behind an abbreviated `value`, when one was cut. */\n exact?: string;\n /** Why the metric is missing, or what it measures. */\n note?: string;\n trend?: \"up\" | \"down\" | \"flat\";\n}\n\n/**\n * One step in how a research card was produced. A card whose whole claim is\n * \"data, no advice\" has to be able to show its working: \"unavailable\" means\n * something different when an indexer has no pair than when an RPC refused\n * the query.\n */\nexport interface ResearchSource {\n /** \"Solana RPC\", \"Market data (…)\", \"PreStocks\", \"Token resolution\". */\n label: string;\n status: \"ok\" | \"partial\" | \"unavailable\";\n detail: string;\n}\n\nexport interface ResearchData {\n token: string;\n /** Project name from the indexer, when it differs from the ticker. */\n name?: string;\n mint: Address;\n metrics: ResearchMetric[];\n /** How the card was produced, in the order the steps ran. */\n sources?: ResearchSource[];\n summary: string;\n}\n\n/**\n * Stocklana C07: one PreStocks entry from `GET /get-stock-universe`.\n * Empty unless the server runs with `PRAXIS_STOCKS_ENABLED=1`.\n */\nexport interface StockUniverseEntry {\n symbol: string;\n name: string;\n mint: Address;\n decimals: number;\n}\n\nexport interface PolicyChangeRow {\n label: string;\n from: string;\n to: string;\n}\n\nexport type AgentBlock =\n | { type: \"prose\"; text: string }\n | { type: \"clarify\"; text: string; options: ClarifyOption[] }\n | { type: \"proposal\"; text: string; proposalId: string }\n | { type: \"research\"; text: string; data: ResearchData }\n | { type: \"notice\"; tone: \"success\" | \"info\"; text: string }\n | {\n type: \"policy_change\";\n text: string;\n patch: PolicyUpdate;\n changes: PolicyChangeRow[];\n applied: boolean;\n };\n\nexport type UserMessage = { id: string; role: \"user\"; ts: number; text: string };\nexport type AgentMessage = { id: string; role: \"agent\"; ts: number; blocks: AgentBlock[] };\nexport type Message = UserMessage | AgentMessage;\n\nexport interface Thread {\n id: string;\n title: string;\n messages: Message[];\n updatedAt: number;\n}\n\n// --- Activity --------------------------------------------------------------\n\nexport interface ActivityEntry {\n id: string;\n kind: \"transfer\" | \"swap\";\n label: string;\n /** Destination address for a transfer. Stable where `label` is a lookup. */\n target?: Address;\n asset: string;\n amount: BaseUnitString;\n decimals: number;\n result: \"allowed\" | \"rejected\";\n reason?: string;\n reasonCode?: RejectReason;\n ts: number;\n sig?: string;\n}\n\n// --- Recurring buys ----------------------------------------------------------\n\n/** When a recurring buy fires. `weekday`: 0=Sunday..6=Saturday (UTC). */\nexport type DcaCadence =\n | { type: \"daily\" }\n | { type: \"weekly\"; weekday: number }\n | { type: \"monthly\"; day: number };\n\n/**\n * One recurring-buy schedule from `GET /get-schedules`. Each fire emits one\n * transfer proposal through the same policy checks as a one-off buy — nothing\n * ever auto-signs. Money is a base-unit string per the money rule above.\n */\nexport interface DcaSchedule {\n id: string;\n asset: string;\n amount: BaseUnitString;\n decimals: number;\n recipientAddress: Address;\n recipientName: string;\n cadence: DcaCadence;\n /** Unix milliseconds of the next fire. */\n nextFireTs: number;\n createdAt: number;\n threadId: string;\n}\n\n// --- Owner transactions (wallet-signed path) -------------------------------\n\nexport interface UnsignedOwnerTransaction {\n /** base64-encoded unsigned transaction for the owner wallet to sign. */\n transaction: string;\n blockhash: string;\n lastValidBlockHeight: number;\n /**\n * Opaque, backend-signed fingerprint of this draft. Echo it back verbatim in\n * {@link SignedOwnerTransaction}: the relay refuses any transaction that is\n * not the one Praxis built, which is what keeps the server-side checks for\n * this action from being skippable.\n */\n draft: string;\n}\n\n/**\n * An {@link UnsignedOwnerTransaction} after the owner wallet has signed it — the\n * base64 `transaction` now carries the owner's signature. This is what you pass\n * to {@link PraxisClient.submitOwnerTransaction}. Signing a Solana transaction\n * requires a transaction-capable wallet (browser wallet adapter / `@solana/web3.js`);\n * the SDK's `keypairSigner` only signs the sign-in *message*, not transactions.\n */\nexport type SignedOwnerTransaction = UnsignedOwnerTransaction;\n\n/** Typed owner action accepted by `POST /owner/build`. */\nexport type OwnerAction =\n | { kind: \"bootstrapPolicy\"; fundLamports?: BaseUnitString }\n | { kind: \"fundVault\"; amount: BaseUnitString }\n | { kind: \"withdrawVault\"; amount: BaseUnitString }\n | { kind: \"closePolicy\" }\n | { kind: \"revoke\" }\n | { kind: \"rotate\" }\n | { kind: \"updatePolicy\"; patch: PolicyUpdate }\n | { kind: \"allowList\"; listKind: AllowListKind; address: Address; mode: \"add\" | \"remove\" }\n | {\n kind: \"configureToken\";\n tokenMint: Address;\n tokenMaxPerTx: BaseUnitString;\n tokenDailyLimit: BaseUnitString;\n }\n | { kind: \"prepareTokenAccounts\"; recipientAddresses?: Address[] };\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -64,7 +64,10 @@ interface WalletChallenge {
|
|
|
64
64
|
}
|
|
65
65
|
interface SessionInfo {
|
|
66
66
|
authenticated: boolean;
|
|
67
|
+
/** The signed-in wallet (owner). Present whenever `authenticated` is true. */
|
|
67
68
|
walletAddress: Address;
|
|
69
|
+
/** Unix seconds at which the session expires (from `GET /auth/session`). */
|
|
70
|
+
expiresAt?: number;
|
|
68
71
|
}
|
|
69
72
|
interface TokenInfo {
|
|
70
73
|
symbol: string;
|
|
@@ -127,6 +130,14 @@ interface TransferDetail {
|
|
|
127
130
|
recipientName: string;
|
|
128
131
|
recipientAddress: Address;
|
|
129
132
|
recipientNote?: string;
|
|
133
|
+
/** The destination is the owner's own wallet (derived from the address). */
|
|
134
|
+
toSelf?: true;
|
|
135
|
+
/**
|
|
136
|
+
* Server-computed USD value of `amount`, as a decimal string, when a real
|
|
137
|
+
* price is available. Absent means "not known" — display only, and never an
|
|
138
|
+
* input to base-unit math.
|
|
139
|
+
*/
|
|
140
|
+
usdEstimate?: string;
|
|
130
141
|
}
|
|
131
142
|
interface SwapDetail {
|
|
132
143
|
kind: "swap";
|
|
@@ -141,6 +152,14 @@ type ProposalDetail = TransferDetail | SwapDetail;
|
|
|
141
152
|
type ProposalState = "pending" | "signing" | "signed" | "blocked" | "cancelled";
|
|
142
153
|
interface ActionProposal {
|
|
143
154
|
id: string;
|
|
155
|
+
/**
|
|
156
|
+
* Unix seconds when the proposal was produced. The signature gate refuses a
|
|
157
|
+
* proposal older than a week: the amount is fixed and Aegis enforces the
|
|
158
|
+
* envelope live, but the readings on it (fee, simulation, remaining
|
|
159
|
+
* envelope, USD figure) drift. Ask again for a fresh one. Absent on
|
|
160
|
+
* proposals created before this field existed.
|
|
161
|
+
*/
|
|
162
|
+
createdAt?: number;
|
|
144
163
|
detail: ProposalDetail;
|
|
145
164
|
networkFee: BaseUnitString;
|
|
146
165
|
simulation: string;
|
|
@@ -155,15 +174,51 @@ interface ClarifyOption {
|
|
|
155
174
|
}
|
|
156
175
|
interface ResearchMetric {
|
|
157
176
|
label: string;
|
|
177
|
+
/** Already display-formatted, and abbreviated where a raw figure is unreadable. */
|
|
158
178
|
value: string;
|
|
179
|
+
/** The full-precision figure behind an abbreviated `value`, when one was cut. */
|
|
180
|
+
exact?: string;
|
|
181
|
+
/** Why the metric is missing, or what it measures. */
|
|
182
|
+
note?: string;
|
|
159
183
|
trend?: "up" | "down" | "flat";
|
|
160
184
|
}
|
|
185
|
+
/**
|
|
186
|
+
* One step in how a research card was produced. A card whose whole claim is
|
|
187
|
+
* "data, no advice" has to be able to show its working: "unavailable" means
|
|
188
|
+
* something different when an indexer has no pair than when an RPC refused
|
|
189
|
+
* the query.
|
|
190
|
+
*/
|
|
191
|
+
interface ResearchSource {
|
|
192
|
+
/** "Solana RPC", "Market data (…)", "PreStocks", "Token resolution". */
|
|
193
|
+
label: string;
|
|
194
|
+
status: "ok" | "partial" | "unavailable";
|
|
195
|
+
detail: string;
|
|
196
|
+
}
|
|
161
197
|
interface ResearchData {
|
|
162
198
|
token: string;
|
|
199
|
+
/** Project name from the indexer, when it differs from the ticker. */
|
|
200
|
+
name?: string;
|
|
163
201
|
mint: Address;
|
|
164
202
|
metrics: ResearchMetric[];
|
|
203
|
+
/** How the card was produced, in the order the steps ran. */
|
|
204
|
+
sources?: ResearchSource[];
|
|
165
205
|
summary: string;
|
|
166
206
|
}
|
|
207
|
+
/**
|
|
208
|
+
* Stocklana C07: one PreStocks entry from `GET /get-stock-universe`.
|
|
209
|
+
* Empty unless the server runs with `PRAXIS_STOCKS_ENABLED=1`.
|
|
210
|
+
*/
|
|
211
|
+
interface StockUniverseEntry {
|
|
212
|
+
symbol: string;
|
|
213
|
+
name: string;
|
|
214
|
+
mint: Address;
|
|
215
|
+
decimals: number;
|
|
216
|
+
}
|
|
217
|
+
interface PolicyChangeRow {
|
|
218
|
+
label: string;
|
|
219
|
+
from: string;
|
|
220
|
+
to: string;
|
|
221
|
+
}
|
|
167
222
|
type AgentBlock = {
|
|
168
223
|
type: "prose";
|
|
169
224
|
text: string;
|
|
@@ -179,6 +234,16 @@ type AgentBlock = {
|
|
|
179
234
|
type: "research";
|
|
180
235
|
text: string;
|
|
181
236
|
data: ResearchData;
|
|
237
|
+
} | {
|
|
238
|
+
type: "notice";
|
|
239
|
+
tone: "success" | "info";
|
|
240
|
+
text: string;
|
|
241
|
+
} | {
|
|
242
|
+
type: "policy_change";
|
|
243
|
+
text: string;
|
|
244
|
+
patch: PolicyUpdate;
|
|
245
|
+
changes: PolicyChangeRow[];
|
|
246
|
+
applied: boolean;
|
|
182
247
|
};
|
|
183
248
|
type UserMessage = {
|
|
184
249
|
id: string;
|
|
@@ -203,6 +268,8 @@ interface ActivityEntry {
|
|
|
203
268
|
id: string;
|
|
204
269
|
kind: "transfer" | "swap";
|
|
205
270
|
label: string;
|
|
271
|
+
/** Destination address for a transfer. Stable where `label` is a lookup. */
|
|
272
|
+
target?: Address;
|
|
206
273
|
asset: string;
|
|
207
274
|
amount: BaseUnitString;
|
|
208
275
|
decimals: number;
|
|
@@ -212,12 +279,55 @@ interface ActivityEntry {
|
|
|
212
279
|
ts: number;
|
|
213
280
|
sig?: string;
|
|
214
281
|
}
|
|
282
|
+
/** When a recurring buy fires. `weekday`: 0=Sunday..6=Saturday (UTC). */
|
|
283
|
+
type DcaCadence = {
|
|
284
|
+
type: "daily";
|
|
285
|
+
} | {
|
|
286
|
+
type: "weekly";
|
|
287
|
+
weekday: number;
|
|
288
|
+
} | {
|
|
289
|
+
type: "monthly";
|
|
290
|
+
day: number;
|
|
291
|
+
};
|
|
292
|
+
/**
|
|
293
|
+
* One recurring-buy schedule from `GET /get-schedules`. Each fire emits one
|
|
294
|
+
* transfer proposal through the same policy checks as a one-off buy — nothing
|
|
295
|
+
* ever auto-signs. Money is a base-unit string per the money rule above.
|
|
296
|
+
*/
|
|
297
|
+
interface DcaSchedule {
|
|
298
|
+
id: string;
|
|
299
|
+
asset: string;
|
|
300
|
+
amount: BaseUnitString;
|
|
301
|
+
decimals: number;
|
|
302
|
+
recipientAddress: Address;
|
|
303
|
+
recipientName: string;
|
|
304
|
+
cadence: DcaCadence;
|
|
305
|
+
/** Unix milliseconds of the next fire. */
|
|
306
|
+
nextFireTs: number;
|
|
307
|
+
createdAt: number;
|
|
308
|
+
threadId: string;
|
|
309
|
+
}
|
|
215
310
|
interface UnsignedOwnerTransaction {
|
|
216
311
|
/** base64-encoded unsigned transaction for the owner wallet to sign. */
|
|
217
312
|
transaction: string;
|
|
218
313
|
blockhash: string;
|
|
219
314
|
lastValidBlockHeight: number;
|
|
315
|
+
/**
|
|
316
|
+
* Opaque, backend-signed fingerprint of this draft. Echo it back verbatim in
|
|
317
|
+
* {@link SignedOwnerTransaction}: the relay refuses any transaction that is
|
|
318
|
+
* not the one Praxis built, which is what keeps the server-side checks for
|
|
319
|
+
* this action from being skippable.
|
|
320
|
+
*/
|
|
321
|
+
draft: string;
|
|
220
322
|
}
|
|
323
|
+
/**
|
|
324
|
+
* An {@link UnsignedOwnerTransaction} after the owner wallet has signed it — the
|
|
325
|
+
* base64 `transaction` now carries the owner's signature. This is what you pass
|
|
326
|
+
* to {@link PraxisClient.submitOwnerTransaction}. Signing a Solana transaction
|
|
327
|
+
* requires a transaction-capable wallet (browser wallet adapter / `@solana/web3.js`);
|
|
328
|
+
* the SDK's `keypairSigner` only signs the sign-in *message*, not transactions.
|
|
329
|
+
*/
|
|
330
|
+
type SignedOwnerTransaction = UnsignedOwnerTransaction;
|
|
221
331
|
/** Typed owner action accepted by `POST /owner/build`. */
|
|
222
332
|
type OwnerAction = {
|
|
223
333
|
kind: "bootstrapPolicy";
|
|
@@ -242,6 +352,14 @@ type OwnerAction = {
|
|
|
242
352
|
listKind: AllowListKind;
|
|
243
353
|
address: Address;
|
|
244
354
|
mode: "add" | "remove";
|
|
355
|
+
} | {
|
|
356
|
+
kind: "configureToken";
|
|
357
|
+
tokenMint: Address;
|
|
358
|
+
tokenMaxPerTx: BaseUnitString;
|
|
359
|
+
tokenDailyLimit: BaseUnitString;
|
|
360
|
+
} | {
|
|
361
|
+
kind: "prepareTokenAccounts";
|
|
362
|
+
recipientAddresses?: Address[];
|
|
245
363
|
};
|
|
246
364
|
|
|
247
365
|
type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;
|
|
@@ -252,8 +370,14 @@ interface PraxisClientOptions {
|
|
|
252
370
|
signer?: PraxisSigner;
|
|
253
371
|
/** Custom fetch (defaults to global fetch). Required in runtimes without one. */
|
|
254
372
|
fetch?: FetchLike;
|
|
255
|
-
/** Per-request timeout in ms (default 20_000). */
|
|
373
|
+
/** Per-request timeout in ms for reads/mutations (default 20_000). */
|
|
256
374
|
timeoutMs?: number;
|
|
375
|
+
/**
|
|
376
|
+
* Per-request timeout in ms for agent conversation turns (`send`/`ask`), which
|
|
377
|
+
* block on the full LLM round-trip (default 60_000). Effective value is never
|
|
378
|
+
* below `timeoutMs`.
|
|
379
|
+
*/
|
|
380
|
+
agentTimeoutMs?: number;
|
|
257
381
|
}
|
|
258
382
|
/** Result of {@link PraxisClient.ask} — the agent's reply, distilled. */
|
|
259
383
|
interface AskResult {
|
|
@@ -280,6 +404,7 @@ declare class PraxisClient {
|
|
|
280
404
|
private readonly signer?;
|
|
281
405
|
private readonly fetchImpl;
|
|
282
406
|
private readonly timeoutMs;
|
|
407
|
+
private readonly agentTimeoutMs;
|
|
283
408
|
/** Manual cookie jar — Node's fetch does not persist Set-Cookie across calls. */
|
|
284
409
|
private sessionCookie?;
|
|
285
410
|
constructor(options: PraxisClientOptions);
|
|
@@ -287,12 +412,20 @@ declare class PraxisClient {
|
|
|
287
412
|
get address(): string | undefined;
|
|
288
413
|
/**
|
|
289
414
|
* Run the wallet-ownership handshake: request a challenge, sign its message,
|
|
290
|
-
* verify it, and store the resulting session cookie.
|
|
415
|
+
* verify it, and store the resulting session cookie. Safe to call again to
|
|
416
|
+
* refresh the session (each call issues a new challenge + cookie).
|
|
291
417
|
*/
|
|
292
418
|
connect(): Promise<SessionInfo>;
|
|
293
|
-
/**
|
|
419
|
+
/**
|
|
420
|
+
* Current session, or `null` if not signed in. The endpoint answers `200`
|
|
421
|
+
* with `{ authenticated: false }` when signed out, so this normalizes both
|
|
422
|
+
* that shape and a `401` to `null`.
|
|
423
|
+
*/
|
|
294
424
|
session(): Promise<SessionInfo | null>;
|
|
295
|
-
/**
|
|
425
|
+
/**
|
|
426
|
+
* Clear the session (server-side cookie + local jar). Idempotent: if there is
|
|
427
|
+
* no active session, the local jar is still cleared and no error is thrown.
|
|
428
|
+
*/
|
|
296
429
|
logout(): Promise<void>;
|
|
297
430
|
/** Send a line to the agent. Creates a thread when `threadId` is omitted. */
|
|
298
431
|
send(text: string, threadId?: string | null): Promise<{
|
|
@@ -308,15 +441,46 @@ declare class PraxisClient {
|
|
|
308
441
|
}>;
|
|
309
442
|
signProposal(proposalId: string): Promise<void>;
|
|
310
443
|
cancelProposal(proposalId: string): Promise<void>;
|
|
444
|
+
/** List recurring-buy schedules (each fire emits one proposal; never signs). */
|
|
445
|
+
getSchedules(): Promise<DcaSchedule[]>;
|
|
446
|
+
/** Stop a recurring-buy schedule. Unknown ids are a no-op (idempotent). */
|
|
447
|
+
cancelSchedule(scheduleId: string): Promise<void>;
|
|
448
|
+
/** Save (or rename) an address-book contact. Labels have no signing power. */
|
|
449
|
+
addContact(label: string, address: string): Promise<void>;
|
|
450
|
+
/** Remove a contact by address or label (case-insensitive, idempotent). */
|
|
451
|
+
removeContact(key: string): Promise<void>;
|
|
311
452
|
getThreads(): Promise<Thread[]>;
|
|
312
453
|
getThread(id: string): Promise<Thread>;
|
|
313
454
|
getProposal(id: string): Promise<ActionProposal>;
|
|
455
|
+
/**
|
|
456
|
+
* Every proposal this wallet holds, in one request. Prefer this over a loop
|
|
457
|
+
* of {@link getProposal}: a per-id fetch is what trips the read rate limit
|
|
458
|
+
* on a busy thread.
|
|
459
|
+
*/
|
|
460
|
+
getProposals(): Promise<ActionProposal[]>;
|
|
314
461
|
getPolicy(): Promise<PolicyView>;
|
|
315
462
|
getActivity(): Promise<ActivityEntry[]>;
|
|
316
463
|
getAddressBook(): Promise<AddressBookEntry[]>;
|
|
317
|
-
isThinking(threadId: string): Promise<boolean>;
|
|
318
464
|
getVersion(): Promise<number>;
|
|
465
|
+
/**
|
|
466
|
+
* The server's stock universe (`[]` when `PRAXIS_STOCKS_ENABLED` is off).
|
|
467
|
+
* Read-only; symbols/mints here are the only pre-IPO stocks Praxis will
|
|
468
|
+
* touch (bounty exclusivity is enforced server-side).
|
|
469
|
+
*/
|
|
470
|
+
getTokenUniverse(): Promise<StockUniverseEntry[]>;
|
|
471
|
+
/**
|
|
472
|
+
* Read-only research for a stock symbol, via the agent (`research <symbol>`).
|
|
473
|
+
* Returns neutral market data — never advice. Throws when the agent has no
|
|
474
|
+
* research to show (unknown symbol or unavailable quotes).
|
|
475
|
+
*/
|
|
476
|
+
getStockResearch(symbol: string): Promise<ResearchData>;
|
|
319
477
|
bootstrapPolicy(fundLamports?: BaseUnitString): Promise<void>;
|
|
478
|
+
/** Deposit SOL (lamports, base-unit string) from the owner into the vault. */
|
|
479
|
+
fundVault(amount: BaseUnitString): Promise<void>;
|
|
480
|
+
/** Withdraw SOL (lamports, base-unit string) from the vault to the owner. */
|
|
481
|
+
withdrawVault(amount: BaseUnitString): Promise<void>;
|
|
482
|
+
/** Tear the agent down — drain the vault and close the policy. Irreversible. */
|
|
483
|
+
deleteAgent(): Promise<void>;
|
|
320
484
|
updatePolicy(patch: PolicyUpdate): Promise<void>;
|
|
321
485
|
configureToken(config: TokenEnvelopeConfig): Promise<void>;
|
|
322
486
|
prepareTokenAccounts(recipientAddresses?: string[]): Promise<void>;
|
|
@@ -324,35 +488,88 @@ declare class PraxisClient {
|
|
|
324
488
|
rotateAgent(): Promise<void>;
|
|
325
489
|
addToAllowList(kind: AllowListKind, address: string): Promise<void>;
|
|
326
490
|
removeFromAllowList(kind: AllowListKind, address: string): Promise<void>;
|
|
327
|
-
/**
|
|
491
|
+
/**
|
|
492
|
+
* Build an unsigned owner transaction for the wallet to sign. The caller signs
|
|
493
|
+
* the returned base64 `transaction` with a transaction-capable wallet, then
|
|
494
|
+
* passes the result to {@link submitOwnerTransaction}. (The SDK's
|
|
495
|
+
* `keypairSigner` signs sign-in messages only, not transactions.)
|
|
496
|
+
*/
|
|
328
497
|
buildOwnerTransaction(action: OwnerAction): Promise<UnsignedOwnerTransaction>;
|
|
329
|
-
/** Submit a wallet-signed owner transaction. */
|
|
330
|
-
submitOwnerTransaction(signed:
|
|
498
|
+
/** Submit a wallet-signed owner transaction; resolves with its signature. */
|
|
499
|
+
submitOwnerTransaction(signed: SignedOwnerTransaction): Promise<{
|
|
331
500
|
sig: string;
|
|
332
501
|
}>;
|
|
333
502
|
private get;
|
|
334
503
|
private post;
|
|
504
|
+
/**
|
|
505
|
+
* Run a request, and if the session has expired, sign in again and retry it
|
|
506
|
+
* once.
|
|
507
|
+
*
|
|
508
|
+
* Sessions are deliberately short — holding one is enough to move value
|
|
509
|
+
* within the Aegis envelope — so a long-lived agent process WILL outlive its
|
|
510
|
+
* cookie. Without this, every caller writes the same catch-401-and-reconnect
|
|
511
|
+
* block, and the ones who do not simply stop working after a day. Retried
|
|
512
|
+
* once only, never for the auth endpoints themselves, and only when a signer
|
|
513
|
+
* is configured; without one there is nothing to re-authenticate with and the
|
|
514
|
+
* 401 is the honest answer.
|
|
515
|
+
*/
|
|
335
516
|
private request;
|
|
517
|
+
private send1;
|
|
336
518
|
private captureCookie;
|
|
337
519
|
}
|
|
338
520
|
|
|
521
|
+
/**
|
|
522
|
+
* A stable, machine-readable classification of a backend failure. Branch on
|
|
523
|
+
* this rather than on `message`, which is human prose and free to change.
|
|
524
|
+
* `client_error` is synthesized SDK-side for failures with no HTTP response
|
|
525
|
+
* (timeout, DNS, TLS).
|
|
526
|
+
*/
|
|
527
|
+
type PraxisErrorCode = "config_error" | "unauthorized" | "invalid_input" | "not_found"
|
|
528
|
+
/** The wallet has no Aegis policy account yet — call `bootstrapPolicy`. */
|
|
529
|
+
| "policy_not_found" | "rate_limited"
|
|
530
|
+
/** A concurrent writer changed this wallet's state first; reload and retry. */
|
|
531
|
+
| "conflict" | "internal_error" | "client_error";
|
|
339
532
|
/**
|
|
340
533
|
* Thrown when the Praxis API returns a non-2xx response. The backend's error
|
|
341
|
-
* envelope is `{ error
|
|
534
|
+
* envelope is `{ error, type, code, details? }` with a meaningful HTTP status
|
|
342
535
|
* (400 input, 401 auth, 404 not-found, 429 rate-limit, 503 config, 500 other).
|
|
343
536
|
*/
|
|
344
537
|
declare class PraxisApiError extends Error {
|
|
345
538
|
readonly status: number;
|
|
346
539
|
/** The backend error class name, e.g. "PraxisAuthError", "PraxisRateLimitError". */
|
|
347
540
|
readonly type: string;
|
|
348
|
-
|
|
541
|
+
/** Stable error classification — the field to branch on. */
|
|
542
|
+
readonly code: PraxisErrorCode;
|
|
543
|
+
/** Structured facts about the failure, e.g. `{ policyAddress }` for `policy_not_found`. */
|
|
544
|
+
readonly details?: Record<string, string | number | boolean>;
|
|
545
|
+
constructor(status: number, type: string, message: string, options?: {
|
|
546
|
+
cause?: unknown;
|
|
547
|
+
code?: PraxisErrorCode;
|
|
548
|
+
details?: Record<string, string | number | boolean>;
|
|
549
|
+
});
|
|
349
550
|
get isAuth(): boolean;
|
|
350
551
|
get isRateLimited(): boolean;
|
|
351
552
|
get isInput(): boolean;
|
|
553
|
+
/** Resource not found (404). */
|
|
554
|
+
get isNotFound(): boolean;
|
|
555
|
+
/** Server reported a configuration problem (503) — usually transient. */
|
|
556
|
+
get isConfig(): boolean;
|
|
557
|
+
/** The request timed out client-side before any HTTP response. */
|
|
558
|
+
get isTimeout(): boolean;
|
|
559
|
+
/** A connection-level failure (DNS, refused, TLS) before any HTTP response. */
|
|
560
|
+
get isNetwork(): boolean;
|
|
561
|
+
/** Any server-side failure (HTTP >= 500). */
|
|
562
|
+
get isServer(): boolean;
|
|
563
|
+
/** The wallet has no Aegis policy yet — the first-run state, not a fault. */
|
|
564
|
+
get isPolicyNotFound(): boolean;
|
|
565
|
+
/** A concurrent writer won; the call is safe to retry after a reload. */
|
|
566
|
+
get isConflict(): boolean;
|
|
352
567
|
}
|
|
353
568
|
/** Thrown for SDK-side misconfiguration (no fetch, no signer, bad key, …). */
|
|
354
569
|
declare class PraxisConfigError extends Error {
|
|
355
|
-
constructor(message: string
|
|
570
|
+
constructor(message: string, options?: {
|
|
571
|
+
cause?: unknown;
|
|
572
|
+
});
|
|
356
573
|
}
|
|
357
574
|
|
|
358
575
|
/**
|
|
@@ -360,13 +577,21 @@ declare class PraxisConfigError extends Error {
|
|
|
360
577
|
* base units (lamports / token base units). These convert to/from `bigint` and
|
|
361
578
|
* human decimal amounts without floats.
|
|
362
579
|
*/
|
|
363
|
-
/**
|
|
580
|
+
/**
|
|
581
|
+
* Parse a base-unit string (or bigint) into a bigint. Rejects floats, hex, and
|
|
582
|
+
* other non-decimal-integer input so the SDK and server agree on what a valid
|
|
583
|
+
* base-unit string is (mirrors the server's `parseUnits`).
|
|
584
|
+
*/
|
|
364
585
|
declare function toBaseUnits(value: string | bigint): bigint;
|
|
365
|
-
/**
|
|
586
|
+
/**
|
|
587
|
+
* Serialize a bigint (or a whole, safe-integer number of base units) into a
|
|
588
|
+
* base-unit string. A non-integer or unsafe `number` throws rather than
|
|
589
|
+
* silently losing precision.
|
|
590
|
+
*/
|
|
366
591
|
declare function fromBaseUnits(value: bigint | number): string;
|
|
367
592
|
/** Convert a human decimal amount ("0.5") into base units for `decimals` places. */
|
|
368
593
|
declare function humanToBaseUnits(amount: string, decimals: number): string;
|
|
369
594
|
/** Convert base units into a human decimal string for `decimals` places. */
|
|
370
595
|
declare function baseUnitsToHuman(value: string | bigint, decimals: number): string;
|
|
371
596
|
|
|
372
|
-
export { ActionKind, type ActionProposal, type ActivityEntry, type Address, type AddressBookEntry, type AgentBlock, type AgentMessage, type AllowListKind, type AskResult, type BaseUnitString, type ClarifyOption, type FetchLike, type Message, type OwnerAction, type PolicyCheckResult, type PolicyUpdate, type PolicyView, PraxisApiError, PraxisClient, type PraxisClientOptions, PraxisConfigError, type PraxisSigner, type ProposalDetail, type ProposalState, RejectReason, type ResearchData, type ResearchMetric, type SecretKeyInput, type SessionInfo, type SwapDetail, type Thread, type TokenEnvelopeConfig, type TokenInfo, type TransferDetail, type UnsignedOwnerTransaction, type UserMessage, type WalletChallenge, baseUnitsToHuman, fromBaseUnits, humanToBaseUnits, keypairSigner, toBaseUnits };
|
|
597
|
+
export { ActionKind, type ActionProposal, type ActivityEntry, type Address, type AddressBookEntry, type AgentBlock, type AgentMessage, type AllowListKind, type AskResult, type BaseUnitString, type ClarifyOption, type DcaCadence, type DcaSchedule, type FetchLike, type Message, type OwnerAction, type PolicyChangeRow, type PolicyCheckResult, type PolicyUpdate, type PolicyView, PraxisApiError, PraxisClient, type PraxisClientOptions, PraxisConfigError, type PraxisErrorCode, type PraxisSigner, type ProposalDetail, type ProposalState, RejectReason, type ResearchData, type ResearchMetric, type ResearchSource, type SecretKeyInput, type SessionInfo, type SignedOwnerTransaction, type StockUniverseEntry, type SwapDetail, type Thread, type TokenEnvelopeConfig, type TokenInfo, type TransferDetail, type UnsignedOwnerTransaction, type UserMessage, type WalletChallenge, baseUnitsToHuman, fromBaseUnits, humanToBaseUnits, keypairSigner, toBaseUnits };
|