@elizaos/plugin-hyperliquid-app 2.0.3-beta.5 → 2.0.3-beta.7
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/HyperliquidAppView.d.ts +4 -0
- package/dist/HyperliquidAppView.d.ts.map +1 -0
- package/dist/HyperliquidAppView.interact.d.ts +10 -0
- package/dist/HyperliquidAppView.interact.d.ts.map +1 -0
- package/dist/HyperliquidAppView.interact.js +70 -0
- package/dist/HyperliquidAppView.interact.js.map +1 -0
- package/dist/HyperliquidAppView.js +199 -0
- package/dist/HyperliquidAppView.js.map +1 -0
- package/dist/HyperliquidPositionsPanel.d.ts +12 -0
- package/dist/HyperliquidPositionsPanel.d.ts.map +1 -0
- package/dist/HyperliquidPositionsPanel.js +194 -0
- package/dist/HyperliquidPositionsPanel.js.map +1 -0
- package/dist/HyperliquidView.d.ts +14 -0
- package/dist/HyperliquidView.d.ts.map +1 -0
- package/dist/HyperliquidView.js +56 -0
- package/dist/HyperliquidView.js.map +1 -0
- package/dist/__fixtures__/contract.d.ts +5 -0
- package/dist/__fixtures__/contract.d.ts.map +1 -0
- package/dist/__fixtures__/contract.js +87 -0
- package/dist/__fixtures__/contract.js.map +1 -0
- package/dist/actions/perpetual-market.d.ts +38 -0
- package/dist/actions/perpetual-market.d.ts.map +1 -0
- package/dist/actions/perpetual-market.js +653 -0
- package/dist/actions/perpetual-market.js.map +1 -0
- package/dist/client.d.ts +9 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +15 -0
- package/dist/client.js.map +1 -0
- package/dist/components/HyperliquidSpatialView.d.ts +46 -0
- package/dist/components/HyperliquidSpatialView.d.ts.map +1 -0
- package/dist/components/HyperliquidSpatialView.js +214 -0
- package/dist/components/HyperliquidSpatialView.js.map +1 -0
- package/dist/hyperliquid-app-view-bundle.d.ts +3 -0
- package/dist/hyperliquid-app-view-bundle.d.ts.map +1 -0
- package/dist/hyperliquid-app-view-bundle.js +7 -0
- package/dist/hyperliquid-app-view-bundle.js.map +1 -0
- package/dist/hyperliquid-app.d.ts +4 -0
- package/dist/hyperliquid-app.d.ts.map +1 -0
- package/dist/hyperliquid-app.js +18 -0
- package/dist/hyperliquid-app.js.map +1 -0
- package/dist/hyperliquid-contracts.d.ts +152 -0
- package/dist/hyperliquid-contracts.d.ts.map +1 -0
- package/dist/hyperliquid-contracts.js +17 -0
- package/dist/hyperliquid-contracts.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +3 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +130 -0
- package/dist/plugin.js.map +1 -0
- package/dist/register-routes.d.ts +2 -0
- package/dist/register-routes.d.ts.map +1 -0
- package/dist/register-routes.js +6 -0
- package/dist/register-routes.js.map +1 -0
- package/dist/register-terminal-view.d.ts +15 -0
- package/dist/register-terminal-view.d.ts.map +1 -0
- package/dist/register-terminal-view.js +34 -0
- package/dist/register-terminal-view.js.map +1 -0
- package/dist/register.d.ts +2 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +17 -0
- package/dist/register.js.map +1 -0
- package/dist/routes.d.ts +25 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +485 -0
- package/dist/routes.js.map +1 -0
- package/dist/ui.d.ts +6 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +12 -0
- package/dist/ui.js.map +1 -0
- package/dist/useHyperliquidState.d.ts +20 -0
- package/dist/useHyperliquidState.d.ts.map +1 -0
- package/dist/useHyperliquidState.js +72 -0
- package/dist/useHyperliquidState.js.map +1 -0
- package/dist/views/bundle.js +463 -0
- package/dist/views/bundle.js.map +1 -0
- package/package.json +6 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/actions/perpetual-market.ts"],"sourcesContent":["import type {\n Action,\n ActionResult,\n Content,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n ProviderDataRecord,\n State,\n} from \"@elizaos/core\";\nimport { Service } from \"@elizaos/core\";\nimport { resolveApiToken, resolveDesktopApiPort } from \"@elizaos/shared\";\nimport type {\n HyperliquidFundingRate,\n HyperliquidFundingResponse,\n HyperliquidMarket,\n HyperliquidMarketsResponse,\n HyperliquidOrdersResponse,\n HyperliquidPositionsResponse,\n HyperliquidStatusResponse,\n} from \"../hyperliquid-contracts.js\";\n\nconst ACTION_TIMEOUT_MS = 15_000;\nexport const PERPETUAL_MARKET_SERVICE_TYPE = \"perpetual-market\" as const;\nconst HYPERLIQUID_CONTEXTS = [\"finance\", \"crypto\", \"trading\"] as const;\nconst HYPERLIQUID_ACTION_CONTEXTS = [\n ...HYPERLIQUID_CONTEXTS,\n \"payments\",\n] as const;\nconst PERPETUAL_MARKET_ACTION_NAME = \"PERPETUAL_MARKET\";\nconst HYPERLIQUID_READ_COMPAT_NAME = \"HYPERLIQUID_READ\";\nconst HYPERLIQUID_PLACE_ORDER_COMPAT_NAME = \"HYPERLIQUID_PLACE_ORDER\";\n\nfunction toCallbackData(data: ProviderDataRecord): Content[\"data\"] {\n return data as Content[\"data\"];\n}\nconst HYPERLIQUID_READ_KEYWORDS = [\n \"hyperliquid\",\n \"perp\",\n \"perps\",\n \"perpetual\",\n \"perpetuals\",\n \"funding\",\n \"funding rate\",\n \"futures\",\n \"leverage\",\n \"liquidation\",\n \"perpétuel\",\n \"perpetuo\",\n \"perpetuelle\",\n \"ewig\",\n \"永続\",\n \"永久\",\n \"永续\",\n \"선물\",\n \"무기한\",\n] as const;\nconst HYPERLIQUID_TRADE_KEYWORDS = [\n ...HYPERLIQUID_READ_KEYWORDS,\n \"buy\",\n \"sell\",\n \"trade\",\n \"order\",\n \"long\",\n \"short\",\n \"open position\",\n \"close position\",\n \"comprar\",\n \"vender\",\n \"orden\",\n \"acheter\",\n \"vendre\",\n \"ordre\",\n \"kaufen\",\n \"verkaufen\",\n \"auftrag\",\n \"comprare\",\n \"vendere\",\n \"注文\",\n \"買う\",\n \"売る\",\n \"买入\",\n \"卖出\",\n \"订单\",\n \"매수\",\n \"매도\",\n] as const;\n\nconst READ_KINDS = [\n \"status\",\n \"markets\",\n \"market\",\n \"positions\",\n \"funding\",\n] as const;\ntype HyperliquidReadKind = (typeof READ_KINDS)[number];\nconst HYPERLIQUID_OPS = [\"read\", \"place_order\"] as const;\ntype HyperliquidOp = (typeof HYPERLIQUID_OPS)[number];\nconst HYPERLIQUID_READ_COMPAT_SIMILES = [\n \"HYPERLIQUID\",\n \"PERP_MARKET\",\n HYPERLIQUID_READ_COMPAT_NAME,\n \"HYPERLIQUID_STATUS\",\n \"HYPERLIQUID_READINESS\",\n \"HYPERLIQUID_HEALTH\",\n \"HYPERLIQUID_GET_MARKETS\",\n \"HYPERLIQUID_MARKETS\",\n \"HYPERLIQUID_GET_MARKET\",\n \"HYPERLIQUID_MARKET\",\n \"HYPERLIQUID_GET_POSITIONS\",\n \"HYPERLIQUID_POSITIONS\",\n \"HYPERLIQUID_FUNDING\",\n] as const;\nconst HYPERLIQUID_PLACE_ORDER_COMPAT_SIMILES = [\n HYPERLIQUID_PLACE_ORDER_COMPAT_NAME,\n \"HYPERLIQUID_TRADE\",\n \"HYPERLIQUID_BUY\",\n \"HYPERLIQUID_SELL\",\n \"HYPERLIQUID_LONG\",\n \"HYPERLIQUID_SHORT\",\n // HyperliquidBench Rust plan-step kinds (packages/benchmarks/HyperliquidBench/types.py)\n // — keep these as similes so retrieval/fine-tune transfer covers the bench's vocabulary.\n \"HYPERLIQUID_PERP_ORDERS\",\n \"HYPERLIQUID_CANCEL_LAST\",\n \"HYPERLIQUID_CANCEL_OIDS\",\n \"HYPERLIQUID_CANCEL_ALL\",\n \"HYPERLIQUID_USD_CLASS_TRANSFER\",\n \"HYPERLIQUID_SET_LEVERAGE\",\n] as const;\nconst HYPERLIQUID_READ_OP_ALIASES = new Set([\n ...READ_KINDS,\n ...HYPERLIQUID_READ_COMPAT_SIMILES.map((name) => name.toLowerCase()),\n]);\nconst HYPERLIQUID_PLACE_ORDER_OP_ALIASES = new Set([\n ...HYPERLIQUID_PLACE_ORDER_COMPAT_SIMILES.map((name) => name.toLowerCase()),\n \"trade\",\n \"order\",\n \"buy\",\n \"sell\",\n \"long\",\n \"short\",\n]);\n\nconst PLACE_ORDER_DISABLED_REASON =\n \"Signed Hyperliquid exchange execution is disabled in the native app. Use the Hyperliquid UI or a dedicated signer to place orders.\";\n\nfunction getApiBase(): string {\n return `http://127.0.0.1:${resolveDesktopApiPort(process.env)}`;\n}\n\nfunction buildAuthHeaders(): Record<string, string> {\n const token = resolveApiToken(process.env);\n if (!token) return {};\n return {\n Authorization: /^Bearer\\s+/i.test(token) ? token : `Bearer ${token}`,\n };\n}\n\nfunction readParam(\n options: HandlerOptions | Record<string, unknown> | undefined,\n key: string,\n): unknown {\n const maybeOptions = options as { parameters?: Record<string, unknown> };\n if (maybeOptions?.parameters && key in maybeOptions.parameters) {\n return maybeOptions.parameters[key];\n }\n return (options as Record<string, unknown> | undefined)?.[key];\n}\n\nfunction readStringParam(\n options: HandlerOptions | Record<string, unknown> | undefined,\n key: string,\n): string | null {\n const value = readParam(options, key);\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction readKind(\n options: HandlerOptions | Record<string, unknown> | undefined,\n): HyperliquidReadKind | null {\n const raw = readStringParam(options, \"kind\");\n if (!raw) return null;\n const normalized = raw.toLowerCase() as HyperliquidReadKind;\n return (READ_KINDS as readonly string[]).includes(normalized)\n ? normalized\n : null;\n}\n\nfunction normalizeOp(value: unknown): HyperliquidOp | null {\n if (typeof value !== \"string\") return null;\n const normalized = value\n .trim()\n .toLowerCase()\n .replace(/[\\s-]+/g, \"_\");\n if ((HYPERLIQUID_OPS as readonly string[]).includes(normalized)) {\n return normalized as HyperliquidOp;\n }\n if (HYPERLIQUID_READ_OP_ALIASES.has(normalized)) {\n return \"read\";\n }\n if (HYPERLIQUID_PLACE_ORDER_OP_ALIASES.has(normalized)) {\n return \"place_order\";\n }\n return null;\n}\n\nfunction readOp(\n options: HandlerOptions | Record<string, unknown> | undefined,\n): HyperliquidOp | null {\n const rawOp =\n readStringParam(options, \"action\") ??\n readStringParam(options, \"subaction\") ??\n readStringParam(options, \"op\") ??\n readStringParam(options, \"operation\") ??\n readStringParam(options, \"name\");\n const explicit = normalizeOp(rawOp);\n if (explicit) return explicit;\n if (readKind(options)) return \"read\";\n if (\n readStringParam(options, \"side\") ||\n readStringParam(options, \"coin\") ||\n readStringParam(options, \"asset\") ||\n readParam(options, \"size\") !== undefined\n ) {\n return \"place_order\";\n }\n return null;\n}\n\nfunction hasSelectedContext(\n state: State | undefined,\n contexts: readonly string[] = HYPERLIQUID_ACTION_CONTEXTS,\n): boolean {\n const selected = new Set<string>();\n const collect = (value: unknown) => {\n if (!Array.isArray(value)) return;\n for (const item of value) {\n if (typeof item === \"string\") selected.add(item);\n }\n };\n collect(\n (state?.values as Record<string, unknown> | undefined)?.selectedContexts,\n );\n collect(\n (state?.data as Record<string, unknown> | undefined)?.selectedContexts,\n );\n const contextObject = (state?.data as Record<string, unknown> | undefined)\n ?.contextObject as\n | {\n trajectoryPrefix?: { selectedContexts?: unknown };\n metadata?: { selectedContexts?: unknown };\n }\n | undefined;\n collect(contextObject?.trajectoryPrefix?.selectedContexts);\n collect(contextObject?.metadata?.selectedContexts);\n return contexts.some((context) => selected.has(context));\n}\n\nfunction hasKeywordIntent(\n message: Memory,\n state: State | undefined,\n keywords: readonly string[],\n): boolean {\n const text = [\n typeof message.content?.text === \"string\" ? message.content.text : \"\",\n typeof state?.values?.recentMessages === \"string\"\n ? state.values.recentMessages\n : \"\",\n ]\n .join(\"\\n\")\n .toLowerCase();\n return keywords.some((keyword) => text.includes(keyword.toLowerCase()));\n}\n\nasync function fetchHyperliquidJson<T>(path: string): Promise<T> {\n const response = await fetch(`${getApiBase()}${path}`, {\n headers: { accept: \"application/json\", ...buildAuthHeaders() },\n signal: AbortSignal.timeout(ACTION_TIMEOUT_MS),\n });\n const payload = (await response.json().catch(() => null)) as T;\n if (!response.ok) {\n const message =\n payload && typeof payload === \"object\" && \"error\" in payload\n ? String((payload as { error?: unknown }).error)\n : `Hyperliquid API request failed with ${response.status}`;\n throw new Error(message);\n }\n return payload;\n}\n\nasync function emit(\n callback: HandlerCallback | undefined,\n text: string,\n data: ProviderDataRecord,\n): Promise<ActionResult> {\n if (callback) {\n await callback({\n text,\n actions: [PERPETUAL_MARKET_ACTION_NAME],\n data: toCallbackData(data),\n });\n }\n return {\n success: true,\n text,\n data: { actionName: PERPETUAL_MARKET_ACTION_NAME, ...data },\n };\n}\n\nasync function emitFailure(\n callback: HandlerCallback | undefined,\n text: string,\n error: string,\n data: ProviderDataRecord,\n): Promise<ActionResult> {\n if (callback) {\n await callback({\n text,\n actions: [PERPETUAL_MARKET_ACTION_NAME],\n data: toCallbackData(data),\n });\n }\n return { success: false, text, error, data };\n}\n\nfunction marketLine(market: HyperliquidMarket): string {\n const leverage =\n market.maxLeverage !== null ? ` maxLeverage ${market.maxLeverage}x` : \"\";\n const isolated = market.onlyIsolated ? \" isolated-only\" : \"\";\n return `- ${market.name}${leverage}${isolated}`;\n}\n\nfunction formatMarkets(markets: readonly HyperliquidMarket[]): string {\n if (markets.length === 0) return \"No active Hyperliquid markets found.\";\n const active = markets.filter((m) => !m.isDelisted);\n return `Hyperliquid perpetual markets (${active.length} active):\\n${active\n .slice(0, 20)\n .map(marketLine)\n .join(\"\\n\")}`;\n}\n\nfunction formatMarket(market: HyperliquidMarket | null): string {\n if (!market) return \"No matching Hyperliquid market found.\";\n return [\n `Hyperliquid ${market.name} perpetual`,\n `Status: ${market.isDelisted ? \"delisted\" : \"active\"}`,\n `Size decimals: ${market.szDecimals}`,\n `Max leverage: ${market.maxLeverage ?? \"n/a\"}`,\n `Isolated only: ${market.onlyIsolated ? \"yes\" : \"no\"}`,\n ].join(\"\\n\");\n}\n\nfunction fundingLine(rate: HyperliquidFundingRate): string {\n const premium = rate.premium ? ` premium ${rate.premium}` : \"\";\n const openInterest = rate.openInterest ? ` OI ${rate.openInterest}` : \"\";\n const mark = rate.markPx ? ` mark ${rate.markPx}` : \"\";\n return `- ${rate.coin}: funding ${rate.funding}${premium}${openInterest}${mark}`;\n}\n\nfunction formatFundingRates(rates: readonly HyperliquidFundingRate[]): string {\n if (rates.length === 0) return \"No Hyperliquid funding rates found.\";\n return `Hyperliquid current funding rates:\\n${rates\n .slice(0, 20)\n .map(fundingLine)\n .join(\"\\n\")}`;\n}\n\nasync function handleStatus(\n callback: HandlerCallback | undefined,\n): Promise<ActionResult> {\n const status = await fetchHyperliquidJson<HyperliquidStatusResponse>(\n \"/api/hyperliquid/status\",\n );\n const text = [\n `Hyperliquid public reads: ${status.publicReadReady ? \"ready\" : \"not ready\"}`,\n `Account reads: ${status.readiness.accountReads ? \"ready\" : \"not ready\"}`,\n `Signer: ${status.signerReady ? \"ready\" : \"not ready\"}`,\n `Execution: disabled`,\n status.executionBlockedReason\n ? `Reason: ${status.executionBlockedReason}`\n : null,\n `Credential mode: ${status.credentialMode}`,\n status.accountAddress ? `Account: ${status.accountAddress}` : null,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\");\n return emit(callback, text, {\n op: \"read\" satisfies HyperliquidOp,\n compatActionName: HYPERLIQUID_READ_COMPAT_NAME,\n kind: \"status\" satisfies HyperliquidReadKind,\n status,\n });\n}\n\nasync function handleMarkets(\n callback: HandlerCallback | undefined,\n): Promise<ActionResult> {\n const response = await fetchHyperliquidJson<HyperliquidMarketsResponse>(\n \"/api/hyperliquid/markets\",\n );\n return emit(callback, formatMarkets(response.markets), {\n op: \"read\" satisfies HyperliquidOp,\n compatActionName: HYPERLIQUID_READ_COMPAT_NAME,\n kind: \"markets\" satisfies HyperliquidReadKind,\n markets: response.markets,\n source: response.source,\n fetchedAt: response.fetchedAt,\n });\n}\n\nasync function handleMarket(\n options: HandlerOptions | Record<string, unknown> | undefined,\n callback: HandlerCallback | undefined,\n): Promise<ActionResult> {\n const coin =\n readStringParam(options, \"coin\") ??\n readStringParam(options, \"asset\") ??\n readStringParam(options, \"name\") ??\n readStringParam(options, \"symbol\");\n if (!coin) {\n const text =\n \"Provide a Hyperliquid coin/asset symbol (e.g. BTC, ETH, SOL).\";\n return emitFailure(callback, text, \"missing_market_identifier\", {\n actionName: PERPETUAL_MARKET_ACTION_NAME,\n op: \"read\" satisfies HyperliquidOp,\n compatActionName: HYPERLIQUID_READ_COMPAT_NAME,\n kind: \"market\" satisfies HyperliquidReadKind,\n });\n }\n const response = await fetchHyperliquidJson<HyperliquidMarketsResponse>(\n \"/api/hyperliquid/markets\",\n );\n const target = coin.toUpperCase();\n const market =\n response.markets.find((m) => m.name.toUpperCase() === target) ?? null;\n return emit(callback, formatMarket(market), {\n op: \"read\" satisfies HyperliquidOp,\n compatActionName: HYPERLIQUID_READ_COMPAT_NAME,\n kind: \"market\" satisfies HyperliquidReadKind,\n market,\n source: response.source,\n fetchedAt: response.fetchedAt,\n });\n}\n\nasync function handlePositions(\n callback: HandlerCallback | undefined,\n): Promise<ActionResult> {\n const response = await fetchHyperliquidJson<HyperliquidPositionsResponse>(\n \"/api/hyperliquid/positions\",\n );\n if (!response.accountAddress) {\n const text = response.readBlockedReason\n ? `Hyperliquid positions unavailable: ${response.readBlockedReason}`\n : \"Hyperliquid positions unavailable: no account address configured.\";\n return emit(callback, text, {\n op: \"read\" satisfies HyperliquidOp,\n compatActionName: HYPERLIQUID_READ_COMPAT_NAME,\n kind: \"positions\" satisfies HyperliquidReadKind,\n accountAddress: null,\n positions: [],\n readBlockedReason: response.readBlockedReason,\n });\n }\n const text =\n response.positions.length === 0\n ? `No Hyperliquid positions for ${response.accountAddress}.`\n : `Hyperliquid positions for ${response.accountAddress}:\\n${response.positions\n .slice(0, 12)\n .map(\n (position) =>\n `- ${position.coin}: size ${position.size}` +\n (position.entryPx ? ` entry ${position.entryPx}` : \"\") +\n (position.unrealizedPnl\n ? ` uPnL ${position.unrealizedPnl}`\n : \"\") +\n (position.leverageValue !== null\n ? ` ${position.leverageType ?? \"leverage\"} ${position.leverageValue}x`\n : \"\"),\n )\n .join(\"\\n\")}`;\n return emit(callback, text, {\n op: \"read\" satisfies HyperliquidOp,\n compatActionName: HYPERLIQUID_READ_COMPAT_NAME,\n kind: \"positions\" satisfies HyperliquidReadKind,\n accountAddress: response.accountAddress,\n positions: response.positions,\n fetchedAt: response.fetchedAt,\n });\n}\n\nasync function handleFunding(\n options: HandlerOptions | Record<string, unknown> | undefined,\n callback: HandlerCallback | undefined,\n): Promise<ActionResult> {\n const coin =\n readStringParam(options, \"coin\") ??\n readStringParam(options, \"asset\") ??\n readStringParam(options, \"symbol\");\n const response = await fetchHyperliquidJson<HyperliquidFundingResponse>(\n \"/api/hyperliquid/funding\",\n );\n const rates = coin\n ? response.rates.filter(\n (rate) => rate.coin.toUpperCase() === coin.toUpperCase(),\n )\n : response.rates;\n return emit(callback, formatFundingRates(rates), {\n op: \"read\" satisfies HyperliquidOp,\n compatActionName: HYPERLIQUID_READ_COMPAT_NAME,\n kind: \"funding\" satisfies HyperliquidReadKind,\n rates,\n source: response.source,\n fetchedAt: response.fetchedAt,\n ...(coin ? { coin } : {}),\n });\n}\n\nasync function handleReadOperation(\n options: HandlerOptions | Record<string, unknown> | undefined,\n callback: HandlerCallback | undefined,\n): Promise<ActionResult> {\n const kind = readKind(options);\n if (!kind) {\n const text =\n \"Provide kind: status | markets | market | positions | funding.\";\n return emitFailure(callback, text, \"missing_or_invalid_kind\", {\n actionName: PERPETUAL_MARKET_ACTION_NAME,\n op: \"read\" satisfies HyperliquidOp,\n compatActionName: HYPERLIQUID_READ_COMPAT_NAME,\n availableKinds: [...READ_KINDS],\n });\n }\n try {\n switch (kind) {\n case \"status\":\n return await handleStatus(callback);\n case \"markets\":\n return await handleMarkets(callback);\n case \"market\":\n return await handleMarket(options, callback);\n case \"positions\":\n return await handlePositions(callback);\n case \"funding\":\n return await handleFunding(options, callback);\n }\n } catch (error) {\n const text = error instanceof Error ? error.message : String(error);\n return emitFailure(callback, text, text, {\n actionName: PERPETUAL_MARKET_ACTION_NAME,\n op: \"read\" satisfies HyperliquidOp,\n compatActionName: HYPERLIQUID_READ_COMPAT_NAME,\n kind,\n });\n }\n}\n\nasync function handlePlaceOrderOperation(\n callback: HandlerCallback | undefined,\n): Promise<ActionResult> {\n let status: HyperliquidStatusResponse | null = null;\n try {\n status = await fetchHyperliquidJson<HyperliquidStatusResponse>(\n \"/api/hyperliquid/status\",\n );\n } catch {\n status = null;\n }\n const reason = status?.executionBlockedReason ?? PLACE_ORDER_DISABLED_REASON;\n const text = `Hyperliquid order placement is disabled.\\nReason: ${reason}`;\n return {\n ...(await emit(callback, text, {\n op: \"place_order\" satisfies HyperliquidOp,\n compatActionName: HYPERLIQUID_PLACE_ORDER_COMPAT_NAME,\n trading: {\n enabled: false,\n reason,\n credentialMode: status?.credentialMode ?? \"none\",\n signerReady: status?.signerReady ?? false,\n },\n })),\n success: false,\n error: reason,\n };\n}\n\nasync function handleOrders(\n callback: HandlerCallback | undefined,\n): Promise<ActionResult | null> {\n return await emit(\n callback,\n \"Hyperliquid open-order reads (kind=orders) are not exposed in this read action; use kind=positions for held perps or the Hyperliquid UI for working orders.\",\n {\n op: \"read\" satisfies HyperliquidOp,\n compatActionName: HYPERLIQUID_READ_COMPAT_NAME,\n kind: \"orders\",\n notExposed: true,\n },\n );\n}\n\nvoid handleOrders;\nvoid ({} as HyperliquidOrdersResponse);\n\ninterface PerpetualMarketProviderMetadata {\n readonly name: string;\n readonly aliases: readonly string[];\n readonly supportedSubactions: readonly HyperliquidOp[];\n readonly description?: string;\n}\n\ninterface PerpetualMarketProvider extends PerpetualMarketProviderMetadata {\n execute(context: {\n readonly options?: HandlerOptions | Record<string, unknown>;\n readonly op: HyperliquidOp;\n readonly callback?: HandlerCallback;\n }): Promise<ActionResult>;\n}\n\nfunction normalizeProviderKey(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/[\\s_-]+/g, \"\");\n}\n\nfunction readTarget(\n options: HandlerOptions | Record<string, unknown> | undefined,\n): string {\n return (\n readStringParam(options, \"target\") ??\n readStringParam(options, \"provider\") ??\n \"hyperliquid\"\n );\n}\n\nfunction createHyperliquidProvider(): PerpetualMarketProvider {\n return {\n name: \"hyperliquid\",\n aliases: [\"hl\", \"hyperliquid-perps\"],\n supportedSubactions: [\"read\", \"place_order\"],\n description:\n \"Hyperliquid perpetual market discovery, position reads, and execution readiness.\",\n execute: async ({ options, op, callback }) => {\n switch (op) {\n case \"read\":\n return await handleReadOperation(options, callback);\n case \"place_order\":\n return await handlePlaceOrderOperation(callback);\n }\n },\n };\n}\n\nexport class PerpetualMarketService extends Service {\n static override serviceType = PERPETUAL_MARKET_SERVICE_TYPE;\n\n override capabilityDescription =\n \"Perpetual market provider registry; currently registers Hyperliquid\";\n\n private readonly providers = new Map<string, PerpetualMarketProvider>();\n private readonly aliases = new Map<string, string>();\n\n static override async start(\n runtime: IAgentRuntime,\n ): Promise<PerpetualMarketService> {\n const service = new PerpetualMarketService(runtime);\n service.registerProvider(createHyperliquidProvider());\n return service;\n }\n\n registerProvider(provider: PerpetualMarketProvider): void {\n const key = normalizeProviderKey(provider.name);\n this.providers.set(key, provider);\n for (const alias of [provider.name, ...provider.aliases]) {\n this.aliases.set(normalizeProviderKey(alias), key);\n }\n }\n\n listProviders(): PerpetualMarketProviderMetadata[] {\n return [...this.providers.values()].map((provider) => ({\n name: provider.name,\n aliases: [...provider.aliases],\n supportedSubactions: [...provider.supportedSubactions],\n description: provider.description,\n }));\n }\n\n async route(args: {\n readonly target?: string;\n readonly op: HyperliquidOp;\n readonly options?: HandlerOptions | Record<string, unknown>;\n readonly callback?: HandlerCallback;\n }): Promise<ActionResult> {\n const target = args.target ?? \"hyperliquid\";\n const key = this.aliases.get(normalizeProviderKey(target));\n const provider = key ? this.providers.get(key) : undefined;\n if (!provider) {\n const text = `Unsupported perpetual market provider \"${target}\".`;\n const data: ProviderDataRecord = {\n actionName: PERPETUAL_MARKET_ACTION_NAME,\n error: \"UNSUPPORTED_PROVIDER\",\n providers: this.listProviders(),\n };\n await args.callback?.({\n text,\n actions: [PERPETUAL_MARKET_ACTION_NAME],\n data: toCallbackData(data),\n });\n return {\n success: false,\n text,\n error: \"UNSUPPORTED_PROVIDER\",\n data,\n };\n }\n if (!provider.supportedSubactions.includes(args.op)) {\n const text = `${provider.name} does not support ${args.op}.`;\n await args.callback?.({\n text,\n actions: [PERPETUAL_MARKET_ACTION_NAME],\n data: {\n actionName: PERPETUAL_MARKET_ACTION_NAME,\n error: \"UNSUPPORTED_SUBACTION\",\n provider: provider.name,\n },\n });\n return {\n success: false,\n text,\n error: \"UNSUPPORTED_SUBACTION\",\n data: {\n actionName: PERPETUAL_MARKET_ACTION_NAME,\n provider: provider.name,\n },\n };\n }\n\n const result = await provider.execute(args);\n return {\n ...result,\n data: {\n ...(result.data ?? {}),\n actionName: PERPETUAL_MARKET_ACTION_NAME,\n target: provider.name,\n supportedProviders: this.listProviders(),\n },\n };\n }\n\n override async stop(): Promise<void> {\n this.providers.clear();\n this.aliases.clear();\n }\n}\n\nexport const perpetualMarketAction: Action = {\n name: \"PERPETUAL_MARKET\",\n contexts: [...HYPERLIQUID_ACTION_CONTEXTS],\n contextGate: { anyOf: [...HYPERLIQUID_ACTION_CONTEXTS] },\n roleGate: { minRole: \"USER\" },\n similes: [\n ...HYPERLIQUID_READ_COMPAT_SIMILES,\n ...HYPERLIQUID_PLACE_ORDER_COMPAT_SIMILES,\n ],\n description:\n \"Use registered perpetual market providers. target selects the provider; Hyperliquid is registered today. action=read reads public state with kind: status, markets, market, positions, or funding. action=place_order reports trading readiness; signed order placement is disabled in this read-only app.\",\n descriptionCompressed:\n \"Perpetual market router: target hyperliquid; action read or place_order.\",\n parameters: [\n {\n name: \"target\",\n description: \"Perpetual market provider.\",\n required: false,\n schema: {\n type: \"string\",\n enum: [\"hyperliquid\"],\n default: \"hyperliquid\",\n },\n },\n {\n name: \"action\",\n description: \"Perpetual market operation: read or place_order.\",\n required: false,\n schema: { type: \"string\", enum: [\"read\", \"place_order\"] },\n },\n {\n name: \"subaction\",\n description: \"Alias for action (read | place_order | place-order).\",\n required: false,\n schema: { type: \"string\", enum: [\"read\", \"place_order\", \"place-order\"] },\n },\n {\n name: \"kind\",\n description:\n \"read only: status | markets | market | positions | funding.\",\n required: false,\n schema: {\n type: \"string\",\n enum: [\"status\", \"markets\", \"market\", \"positions\", \"funding\"],\n },\n },\n {\n name: \"coin\",\n description: \"market only: Hyperliquid coin/asset symbol (e.g. BTC).\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"side\",\n description: \"place_order only: intended side, buy or sell.\",\n required: false,\n schema: { type: \"string\", enum: [\"buy\", \"sell\"] },\n },\n {\n name: \"asset\",\n description: \"place_order only: Hyperliquid asset symbol.\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"size\",\n description: \"place_order only: intended order size.\",\n required: false,\n schema: { type: \"number\" },\n },\n ],\n validate: async (_runtime, message: Memory, state?: State) =>\n hasSelectedContext(state) ||\n hasKeywordIntent(message, state, HYPERLIQUID_READ_KEYWORDS) ||\n hasKeywordIntent(message, state, HYPERLIQUID_TRADE_KEYWORDS),\n handler: async (runtime, _message, _state, options, callback) => {\n const op = readOp(options);\n if (!op) {\n const text =\n \"Provide action: read | place_order. For read, also provide kind: status | markets | market | positions | funding.\";\n return emitFailure(callback, text, \"missing_or_invalid_op\", {\n actionName: PERPETUAL_MARKET_ACTION_NAME,\n availableActions: [...HYPERLIQUID_OPS],\n });\n }\n const service = runtime.getService(\n PERPETUAL_MARKET_SERVICE_TYPE,\n ) as PerpetualMarketService | null;\n if (!service || typeof service.route !== \"function\") {\n const text = \"Perpetual market service is not available.\";\n return emitFailure(callback, text, \"service_unavailable\", {\n actionName: PERPETUAL_MARKET_ACTION_NAME,\n });\n }\n return service.route({\n target: readTarget(options),\n op,\n options,\n callback,\n });\n },\n};\n\nexport const hyperliquidActions: Action[] = [perpetualMarketAction];\n"],"mappings":"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","names":["text"]}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ElizaClient } from "@elizaos/ui";
|
|
2
|
+
import type { HyperliquidMarketsResponse, HyperliquidOrdersResponse, HyperliquidPositionsResponse, HyperliquidStatusResponse } from "./hyperliquid-contracts";
|
|
3
|
+
export type HyperliquidClient = ElizaClient & {
|
|
4
|
+
hyperliquidStatus(): Promise<HyperliquidStatusResponse>;
|
|
5
|
+
hyperliquidMarkets(): Promise<HyperliquidMarketsResponse>;
|
|
6
|
+
hyperliquidPositions(): Promise<HyperliquidPositionsResponse>;
|
|
7
|
+
hyperliquidOrders(): Promise<HyperliquidOrdersResponse>;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EACV,0BAA0B,EAC1B,yBAAyB,EACzB,4BAA4B,EAC5B,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG;IAC5C,iBAAiB,IAAI,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACxD,kBAAkB,IAAI,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAC1D,oBAAoB,IAAI,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAC9D,iBAAiB,IAAI,OAAO,CAAC,yBAAyB,CAAC,CAAC;CACzD,CAAC"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ElizaClient } from "@elizaos/ui";
|
|
2
|
+
const elizaClientPrototype = ElizaClient.prototype;
|
|
3
|
+
elizaClientPrototype.hyperliquidStatus = async function() {
|
|
4
|
+
return this.fetch("/api/hyperliquid/status");
|
|
5
|
+
};
|
|
6
|
+
elizaClientPrototype.hyperliquidMarkets = async function() {
|
|
7
|
+
return this.fetch("/api/hyperliquid/markets");
|
|
8
|
+
};
|
|
9
|
+
elizaClientPrototype.hyperliquidPositions = async function() {
|
|
10
|
+
return this.fetch("/api/hyperliquid/positions");
|
|
11
|
+
};
|
|
12
|
+
elizaClientPrototype.hyperliquidOrders = async function() {
|
|
13
|
+
return this.fetch("/api/hyperliquid/orders");
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client.ts"],"sourcesContent":["import { ElizaClient } from \"@elizaos/ui\";\nimport type {\n HyperliquidMarketsResponse,\n HyperliquidOrdersResponse,\n HyperliquidPositionsResponse,\n HyperliquidStatusResponse,\n} from \"./hyperliquid-contracts.js\";\n\nexport type HyperliquidClient = ElizaClient & {\n hyperliquidStatus(): Promise<HyperliquidStatusResponse>;\n hyperliquidMarkets(): Promise<HyperliquidMarketsResponse>;\n hyperliquidPositions(): Promise<HyperliquidPositionsResponse>;\n hyperliquidOrders(): Promise<HyperliquidOrdersResponse>;\n};\n\nconst elizaClientPrototype =\n ElizaClient.prototype as HyperliquidClient;\n\nelizaClientPrototype.hyperliquidStatus = async function () {\n return this.fetch(\"/api/hyperliquid/status\");\n};\n\nelizaClientPrototype.hyperliquidMarkets = async function () {\n return this.fetch(\"/api/hyperliquid/markets\");\n};\n\nelizaClientPrototype.hyperliquidPositions = async function () {\n return this.fetch(\"/api/hyperliquid/positions\");\n};\n\nelizaClientPrototype.hyperliquidOrders = async function () {\n return this.fetch(\"/api/hyperliquid/orders\");\n};\n"],"mappings":"AAAA,SAAS,mBAAmB;AAe5B,MAAM,uBACJ,YAAY;AAEd,qBAAqB,oBAAoB,iBAAkB;AACzD,SAAO,KAAK,MAAM,yBAAyB;AAC7C;AAEA,qBAAqB,qBAAqB,iBAAkB;AAC1D,SAAO,KAAK,MAAM,0BAA0B;AAC9C;AAEA,qBAAqB,uBAAuB,iBAAkB;AAC5D,SAAO,KAAK,MAAM,4BAA4B;AAChD;AAEA,qBAAqB,oBAAoB,iBAAkB;AACzD,SAAO,KAAK,MAAM,yBAAyB;AAC7C;","names":[]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HyperliquidSpatialView - the Hyperliquid dashboard authored once with the
|
|
3
|
+
* spatial vocabulary, so it renders correctly wherever it is displayed:
|
|
4
|
+
*
|
|
5
|
+
* - GUI / XR - mounted in `<SpatialSurface>` (DOM; XR scales up).
|
|
6
|
+
* - TUI - rendered to real terminal lines by the agent terminal, via
|
|
7
|
+
* `registerSpatialTerminalView` (see `register-terminal-view.tsx`).
|
|
8
|
+
*
|
|
9
|
+
* It is purely presentational (a snapshot + an action callback in, primitives
|
|
10
|
+
* out) and imports only the cross-modality primitives plus type-only views of
|
|
11
|
+
* the Hyperliquid contracts, so it is safe to render in the Node agent process
|
|
12
|
+
* where the terminal lives (no app-core/React-DOM runtime import).
|
|
13
|
+
*/
|
|
14
|
+
import type { HyperliquidCredentialMode, HyperliquidMarket, HyperliquidOrder, HyperliquidPosition } from "../hyperliquid-contracts.ts";
|
|
15
|
+
export interface HyperliquidStatusSnapshot {
|
|
16
|
+
publicReadReady: boolean;
|
|
17
|
+
signerReady: boolean;
|
|
18
|
+
executionReady: boolean;
|
|
19
|
+
credentialMode: HyperliquidCredentialMode;
|
|
20
|
+
accountAddress: string | null;
|
|
21
|
+
vaultReady: boolean;
|
|
22
|
+
executionBlockedReason: string | null;
|
|
23
|
+
/** Vault-connection guidance, shown when the vault is not ready and no local key is set. */
|
|
24
|
+
vaultGuidance?: string | null;
|
|
25
|
+
}
|
|
26
|
+
export interface HyperliquidSnapshot {
|
|
27
|
+
status: HyperliquidStatusSnapshot;
|
|
28
|
+
markets: HyperliquidMarket[];
|
|
29
|
+
positions: HyperliquidPosition[];
|
|
30
|
+
orders: HyperliquidOrder[];
|
|
31
|
+
/** Reason positions are unreadable (e.g. no connected account); null when readable. */
|
|
32
|
+
positionsBlockedReason?: string | null;
|
|
33
|
+
/** Reason orders are unreadable (e.g. no connected account); null when readable. */
|
|
34
|
+
ordersBlockedReason?: string | null;
|
|
35
|
+
/** True when the routes are not mounted on this surface (mobile bundle); shows an unavailable state. */
|
|
36
|
+
unavailable?: boolean;
|
|
37
|
+
loading?: boolean;
|
|
38
|
+
error?: string | null;
|
|
39
|
+
}
|
|
40
|
+
export interface HyperliquidSpatialViewProps {
|
|
41
|
+
snapshot: HyperliquidSnapshot;
|
|
42
|
+
/** Dispatch by agent id: `refresh`, `back`. */
|
|
43
|
+
onAction?: (action: string) => void;
|
|
44
|
+
}
|
|
45
|
+
export declare function HyperliquidSpatialView({ snapshot, onAction, }: HyperliquidSpatialViewProps): import("react/jsx-runtime").JSX.Element;
|
|
46
|
+
//# sourceMappingURL=HyperliquidSpatialView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HyperliquidSpatialView.d.ts","sourceRoot":"","sources":["../../src/components/HyperliquidSpatialView.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAYH,OAAO,KAAK,EACV,yBAAyB,EACzB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,yBAAyB;IACxC,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,yBAAyB,CAAC;IAC1C,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,4FAA4F;IAC5F,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,yBAAyB,CAAC;IAClC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,uFAAuF;IACvF,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,oFAAoF;IACpF,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,wGAAwG;IACxG,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAwCD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED,wBAAgB,sBAAsB,CAAC,EACrC,QAAQ,EACR,QAAQ,GACT,EAAE,2BAA2B,2CA0O7B"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import {
|
|
3
|
+
Button,
|
|
4
|
+
Card,
|
|
5
|
+
Divider,
|
|
6
|
+
HStack,
|
|
7
|
+
List,
|
|
8
|
+
Text,
|
|
9
|
+
VStack
|
|
10
|
+
} from "@elizaos/ui/spatial";
|
|
11
|
+
function credentialModeLabel(mode) {
|
|
12
|
+
switch (mode) {
|
|
13
|
+
case "managed_vault":
|
|
14
|
+
return "Managed vault";
|
|
15
|
+
case "local_key":
|
|
16
|
+
return "Local key";
|
|
17
|
+
default:
|
|
18
|
+
return "Read-only";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function readinessTone(ready) {
|
|
22
|
+
return ready ? "success" : "muted";
|
|
23
|
+
}
|
|
24
|
+
function readinessMark(ready) {
|
|
25
|
+
return ready ? "[ok]" : "[--]";
|
|
26
|
+
}
|
|
27
|
+
function StatusTile({ label, ready }) {
|
|
28
|
+
return /* @__PURE__ */ jsxs(HStack, { gap: 1, align: "center", grow: 1, children: [
|
|
29
|
+
/* @__PURE__ */ jsx(Text, { tone: readinessTone(ready), wrap: false, children: readinessMark(ready) }),
|
|
30
|
+
/* @__PURE__ */ jsx(Text, { bold: true, grow: 1, wrap: false, children: label })
|
|
31
|
+
] });
|
|
32
|
+
}
|
|
33
|
+
function shortAddress(address) {
|
|
34
|
+
if (!address) return "not configured";
|
|
35
|
+
if (address.length <= 13) return address;
|
|
36
|
+
return `${address.slice(0, 6)}..${address.slice(-4)}`;
|
|
37
|
+
}
|
|
38
|
+
function HyperliquidSpatialView({
|
|
39
|
+
snapshot,
|
|
40
|
+
onAction
|
|
41
|
+
}) {
|
|
42
|
+
const dispatch = (action) => () => onAction?.(action);
|
|
43
|
+
const { status } = snapshot;
|
|
44
|
+
const accountReady = Boolean(status.accountAddress);
|
|
45
|
+
if (snapshot.unavailable) {
|
|
46
|
+
return /* @__PURE__ */ jsxs(Card, { gap: 1, padding: 1, children: [
|
|
47
|
+
/* @__PURE__ */ jsx(Text, { tone: "muted", align: "center", children: "Unavailable" }),
|
|
48
|
+
/* @__PURE__ */ jsx(Divider, {}),
|
|
49
|
+
/* @__PURE__ */ jsxs(HStack, { gap: 1, wrap: true, children: [
|
|
50
|
+
/* @__PURE__ */ jsx(Button, { grow: 1, agent: "refresh", onPress: dispatch("refresh"), children: "Refresh" }),
|
|
51
|
+
/* @__PURE__ */ jsx(
|
|
52
|
+
Button,
|
|
53
|
+
{
|
|
54
|
+
variant: "outline",
|
|
55
|
+
tone: "default",
|
|
56
|
+
agent: "back",
|
|
57
|
+
onPress: dispatch("back"),
|
|
58
|
+
children: "Back"
|
|
59
|
+
}
|
|
60
|
+
)
|
|
61
|
+
] })
|
|
62
|
+
] });
|
|
63
|
+
}
|
|
64
|
+
return /* @__PURE__ */ jsxs(Card, { gap: 1, padding: 1, children: [
|
|
65
|
+
/* @__PURE__ */ jsxs(HStack, { gap: 1, align: "center", children: [
|
|
66
|
+
/* @__PURE__ */ jsx(
|
|
67
|
+
Text,
|
|
68
|
+
{
|
|
69
|
+
style: "caption",
|
|
70
|
+
tone: status.publicReadReady ? "success" : "danger",
|
|
71
|
+
grow: 1,
|
|
72
|
+
children: snapshot.loading ? "loading" : status.publicReadReady ? "read-ready" : "read-blocked"
|
|
73
|
+
}
|
|
74
|
+
),
|
|
75
|
+
/* @__PURE__ */ jsxs(Text, { style: "caption", tone: "muted", wrap: false, children: [
|
|
76
|
+
snapshot.markets.length,
|
|
77
|
+
"m / ",
|
|
78
|
+
snapshot.positions.length,
|
|
79
|
+
"p /",
|
|
80
|
+
" ",
|
|
81
|
+
snapshot.orders.length,
|
|
82
|
+
"o"
|
|
83
|
+
] })
|
|
84
|
+
] }),
|
|
85
|
+
snapshot.error ? /* @__PURE__ */ jsx(Text, { tone: "danger", style: "caption", children: snapshot.error }) : null,
|
|
86
|
+
/* @__PURE__ */ jsx(Divider, { label: "status" }),
|
|
87
|
+
/* @__PURE__ */ jsxs(VStack, { gap: 0, children: [
|
|
88
|
+
/* @__PURE__ */ jsx(StatusTile, { label: "Reads", ready: status.publicReadReady }),
|
|
89
|
+
/* @__PURE__ */ jsx(
|
|
90
|
+
StatusTile,
|
|
91
|
+
{
|
|
92
|
+
label: credentialModeLabel(status.credentialMode),
|
|
93
|
+
ready: status.signerReady
|
|
94
|
+
}
|
|
95
|
+
),
|
|
96
|
+
/* @__PURE__ */ jsx(StatusTile, { label: "Account", ready: accountReady })
|
|
97
|
+
] }),
|
|
98
|
+
status.executionBlockedReason ? /* @__PURE__ */ jsx(Text, { style: "caption", tone: "warning", children: status.executionBlockedReason }) : null,
|
|
99
|
+
!status.vaultReady && status.credentialMode !== "local_key" && status.vaultGuidance ? /* @__PURE__ */ jsx(Text, { style: "caption", tone: "muted", children: status.vaultGuidance }) : null,
|
|
100
|
+
/* @__PURE__ */ jsx(Divider, { label: "markets" }),
|
|
101
|
+
snapshot.markets.length === 0 ? /* @__PURE__ */ jsx(Text, { tone: "muted", align: "center", style: "caption", children: "None" }) : /* @__PURE__ */ jsx(List, { gap: 0, children: snapshot.markets.slice(0, 12).map((market) => /* @__PURE__ */ jsxs(
|
|
102
|
+
HStack,
|
|
103
|
+
{
|
|
104
|
+
gap: 1,
|
|
105
|
+
align: "center",
|
|
106
|
+
agent: `market-${market.name}`,
|
|
107
|
+
children: [
|
|
108
|
+
/* @__PURE__ */ jsx(
|
|
109
|
+
Text,
|
|
110
|
+
{
|
|
111
|
+
bold: true,
|
|
112
|
+
grow: 1,
|
|
113
|
+
wrap: false,
|
|
114
|
+
tone: market.isDelisted ? "muted" : "default",
|
|
115
|
+
children: market.name
|
|
116
|
+
}
|
|
117
|
+
),
|
|
118
|
+
/* @__PURE__ */ jsx(Text, { style: "caption", tone: "primary", wrap: false, children: market.maxLeverage ? `${market.maxLeverage}x` : "n/a" }),
|
|
119
|
+
/* @__PURE__ */ jsxs(Text, { style: "caption", tone: "muted", wrap: false, children: [
|
|
120
|
+
"sz",
|
|
121
|
+
market.szDecimals,
|
|
122
|
+
market.onlyIsolated ? " iso" : ""
|
|
123
|
+
] })
|
|
124
|
+
]
|
|
125
|
+
},
|
|
126
|
+
market.name
|
|
127
|
+
)) }),
|
|
128
|
+
/* @__PURE__ */ jsx(Divider, { label: "account" }),
|
|
129
|
+
/* @__PURE__ */ jsxs(HStack, { gap: 1, align: "center", children: [
|
|
130
|
+
/* @__PURE__ */ jsx(Text, { style: "caption", tone: "muted", grow: 1, wrap: false, children: shortAddress(status.accountAddress) }),
|
|
131
|
+
/* @__PURE__ */ jsx(
|
|
132
|
+
Text,
|
|
133
|
+
{
|
|
134
|
+
style: "caption",
|
|
135
|
+
tone: status.executionReady ? "success" : "muted",
|
|
136
|
+
wrap: false,
|
|
137
|
+
children: status.executionReady ? "exec-ready" : "exec-off"
|
|
138
|
+
}
|
|
139
|
+
)
|
|
140
|
+
] }),
|
|
141
|
+
/* @__PURE__ */ jsx(Text, { style: "caption", tone: "primary", children: "positions" }),
|
|
142
|
+
snapshot.positionsBlockedReason ? /* @__PURE__ */ jsx(Text, { style: "caption", tone: "warning", agent: "positions-blocked", children: snapshot.positionsBlockedReason }) : snapshot.positions.length === 0 ? /* @__PURE__ */ jsx(Text, { tone: "muted", style: "caption", children: "none" }) : /* @__PURE__ */ jsx(List, { gap: 0, children: snapshot.positions.slice(0, 6).map((position) => /* @__PURE__ */ jsxs(
|
|
143
|
+
HStack,
|
|
144
|
+
{
|
|
145
|
+
gap: 1,
|
|
146
|
+
align: "center",
|
|
147
|
+
agent: `position-${position.coin}`,
|
|
148
|
+
children: [
|
|
149
|
+
/* @__PURE__ */ jsx(Text, { bold: true, grow: 1, wrap: false, children: position.coin }),
|
|
150
|
+
/* @__PURE__ */ jsxs(Text, { style: "caption", tone: "muted", wrap: false, children: [
|
|
151
|
+
"sz ",
|
|
152
|
+
position.size
|
|
153
|
+
] }),
|
|
154
|
+
position.unrealizedPnl ? /* @__PURE__ */ jsx(
|
|
155
|
+
Text,
|
|
156
|
+
{
|
|
157
|
+
style: "caption",
|
|
158
|
+
tone: position.unrealizedPnl.trim().startsWith("-") ? "danger" : "success",
|
|
159
|
+
wrap: false,
|
|
160
|
+
children: position.unrealizedPnl
|
|
161
|
+
}
|
|
162
|
+
) : null
|
|
163
|
+
]
|
|
164
|
+
},
|
|
165
|
+
position.coin
|
|
166
|
+
)) }),
|
|
167
|
+
/* @__PURE__ */ jsx(Text, { style: "caption", tone: "primary", children: "orders" }),
|
|
168
|
+
snapshot.ordersBlockedReason ? /* @__PURE__ */ jsx(Text, { style: "caption", tone: "warning", agent: "orders-blocked", children: snapshot.ordersBlockedReason }) : snapshot.orders.length === 0 ? /* @__PURE__ */ jsx(Text, { tone: "muted", style: "caption", children: "none" }) : /* @__PURE__ */ jsx(List, { gap: 0, children: snapshot.orders.slice(0, 6).map((order) => /* @__PURE__ */ jsxs(
|
|
169
|
+
HStack,
|
|
170
|
+
{
|
|
171
|
+
gap: 1,
|
|
172
|
+
align: "center",
|
|
173
|
+
agent: `order-${order.oid}`,
|
|
174
|
+
children: [
|
|
175
|
+
/* @__PURE__ */ jsx(Text, { bold: true, wrap: false, children: order.coin }),
|
|
176
|
+
/* @__PURE__ */ jsx(
|
|
177
|
+
Text,
|
|
178
|
+
{
|
|
179
|
+
style: "caption",
|
|
180
|
+
tone: order.side.toLowerCase().startsWith("b") ? "success" : "danger",
|
|
181
|
+
wrap: false,
|
|
182
|
+
children: order.side
|
|
183
|
+
}
|
|
184
|
+
),
|
|
185
|
+
/* @__PURE__ */ jsxs(Text, { style: "caption", tone: "muted", grow: 1, wrap: false, children: [
|
|
186
|
+
order.size,
|
|
187
|
+
" @ ",
|
|
188
|
+
order.limitPx
|
|
189
|
+
] }),
|
|
190
|
+
order.reduceOnly ? /* @__PURE__ */ jsx(Text, { style: "caption", tone: "warning", wrap: false, children: "ro" }) : null
|
|
191
|
+
]
|
|
192
|
+
},
|
|
193
|
+
order.oid
|
|
194
|
+
)) }),
|
|
195
|
+
/* @__PURE__ */ jsx(Divider, {}),
|
|
196
|
+
/* @__PURE__ */ jsxs(HStack, { gap: 1, wrap: true, children: [
|
|
197
|
+
/* @__PURE__ */ jsx(Button, { grow: 1, agent: "refresh", onPress: dispatch("refresh"), children: "Refresh" }),
|
|
198
|
+
/* @__PURE__ */ jsx(
|
|
199
|
+
Button,
|
|
200
|
+
{
|
|
201
|
+
variant: "outline",
|
|
202
|
+
tone: "default",
|
|
203
|
+
agent: "back",
|
|
204
|
+
onPress: dispatch("back"),
|
|
205
|
+
children: "Back"
|
|
206
|
+
}
|
|
207
|
+
)
|
|
208
|
+
] })
|
|
209
|
+
] });
|
|
210
|
+
}
|
|
211
|
+
export {
|
|
212
|
+
HyperliquidSpatialView
|
|
213
|
+
};
|
|
214
|
+
//# sourceMappingURL=HyperliquidSpatialView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/HyperliquidSpatialView.tsx"],"sourcesContent":["/**\n * HyperliquidSpatialView - the Hyperliquid dashboard authored once with the\n * spatial vocabulary, so it renders correctly wherever it is displayed:\n *\n * - GUI / XR - mounted in `<SpatialSurface>` (DOM; XR scales up).\n * - TUI - rendered to real terminal lines by the agent terminal, via\n * `registerSpatialTerminalView` (see `register-terminal-view.tsx`).\n *\n * It is purely presentational (a snapshot + an action callback in, primitives\n * out) and imports only the cross-modality primitives plus type-only views of\n * the Hyperliquid contracts, so it is safe to render in the Node agent process\n * where the terminal lives (no app-core/React-DOM runtime import).\n */\n\nimport {\n Button,\n Card,\n Divider,\n HStack,\n List,\n type SpatialTone,\n Text,\n VStack,\n} from \"@elizaos/ui/spatial\";\nimport type {\n HyperliquidCredentialMode,\n HyperliquidMarket,\n HyperliquidOrder,\n HyperliquidPosition,\n} from \"../hyperliquid-contracts.js\";\n\nexport interface HyperliquidStatusSnapshot {\n publicReadReady: boolean;\n signerReady: boolean;\n executionReady: boolean;\n credentialMode: HyperliquidCredentialMode;\n accountAddress: string | null;\n vaultReady: boolean;\n executionBlockedReason: string | null;\n /** Vault-connection guidance, shown when the vault is not ready and no local key is set. */\n vaultGuidance?: string | null;\n}\n\nexport interface HyperliquidSnapshot {\n status: HyperliquidStatusSnapshot;\n markets: HyperliquidMarket[];\n positions: HyperliquidPosition[];\n orders: HyperliquidOrder[];\n /** Reason positions are unreadable (e.g. no connected account); null when readable. */\n positionsBlockedReason?: string | null;\n /** Reason orders are unreadable (e.g. no connected account); null when readable. */\n ordersBlockedReason?: string | null;\n /** True when the routes are not mounted on this surface (mobile bundle); shows an unavailable state. */\n unavailable?: boolean;\n loading?: boolean;\n error?: string | null;\n}\n\nfunction credentialModeLabel(mode: HyperliquidCredentialMode): string {\n switch (mode) {\n case \"managed_vault\":\n return \"Managed vault\";\n case \"local_key\":\n return \"Local key\";\n default:\n return \"Read-only\";\n }\n}\n\nfunction readinessTone(ready: boolean): SpatialTone {\n return ready ? \"success\" : \"muted\";\n}\n\nfunction readinessMark(ready: boolean): string {\n return ready ? \"[ok]\" : \"[--]\";\n}\n\nfunction StatusTile({ label, ready }: { label: string; ready: boolean }) {\n return (\n <HStack gap={1} align=\"center\" grow={1}>\n <Text tone={readinessTone(ready)} wrap={false}>\n {readinessMark(ready)}\n </Text>\n <Text bold grow={1} wrap={false}>\n {label}\n </Text>\n </HStack>\n );\n}\n\nfunction shortAddress(address: string | null): string {\n if (!address) return \"not configured\";\n if (address.length <= 13) return address;\n return `${address.slice(0, 6)}..${address.slice(-4)}`;\n}\n\nexport interface HyperliquidSpatialViewProps {\n snapshot: HyperliquidSnapshot;\n /** Dispatch by agent id: `refresh`, `back`. */\n onAction?: (action: string) => void;\n}\n\nexport function HyperliquidSpatialView({\n snapshot,\n onAction,\n}: HyperliquidSpatialViewProps) {\n const dispatch = (action: string) => () => onAction?.(action);\n const { status } = snapshot;\n const accountReady = Boolean(status.accountAddress);\n\n if (snapshot.unavailable) {\n return (\n <Card gap={1} padding={1}>\n <Text tone=\"muted\" align=\"center\">\n Unavailable\n </Text>\n <Divider />\n <HStack gap={1} wrap>\n <Button grow={1} agent=\"refresh\" onPress={dispatch(\"refresh\")}>\n Refresh\n </Button>\n <Button\n variant=\"outline\"\n tone=\"default\"\n agent=\"back\"\n onPress={dispatch(\"back\")}\n >\n Back\n </Button>\n </HStack>\n </Card>\n );\n }\n\n return (\n <Card gap={1} padding={1}>\n <HStack gap={1} align=\"center\">\n <Text\n style=\"caption\"\n tone={status.publicReadReady ? \"success\" : \"danger\"}\n grow={1}\n >\n {snapshot.loading\n ? \"loading\"\n : status.publicReadReady\n ? \"read-ready\"\n : \"read-blocked\"}\n </Text>\n <Text style=\"caption\" tone=\"muted\" wrap={false}>\n {snapshot.markets.length}m / {snapshot.positions.length}p /{\" \"}\n {snapshot.orders.length}o\n </Text>\n </HStack>\n\n {snapshot.error ? (\n <Text tone=\"danger\" style=\"caption\">\n {snapshot.error}\n </Text>\n ) : null}\n\n <Divider label=\"status\" />\n <VStack gap={0}>\n <StatusTile label=\"Reads\" ready={status.publicReadReady} />\n <StatusTile\n label={credentialModeLabel(status.credentialMode)}\n ready={status.signerReady}\n />\n <StatusTile label=\"Account\" ready={accountReady} />\n </VStack>\n\n {status.executionBlockedReason ? (\n <Text style=\"caption\" tone=\"warning\">\n {status.executionBlockedReason}\n </Text>\n ) : null}\n\n {!status.vaultReady &&\n status.credentialMode !== \"local_key\" &&\n status.vaultGuidance ? (\n <Text style=\"caption\" tone=\"muted\">\n {status.vaultGuidance}\n </Text>\n ) : null}\n\n <Divider label=\"markets\" />\n {snapshot.markets.length === 0 ? (\n <Text tone=\"muted\" align=\"center\" style=\"caption\">\n None\n </Text>\n ) : (\n <List gap={0}>\n {snapshot.markets.slice(0, 12).map((market) => (\n <HStack\n key={market.name}\n gap={1}\n align=\"center\"\n agent={`market-${market.name}`}\n >\n <Text\n bold\n grow={1}\n wrap={false}\n tone={market.isDelisted ? \"muted\" : \"default\"}\n >\n {market.name}\n </Text>\n <Text style=\"caption\" tone=\"primary\" wrap={false}>\n {market.maxLeverage ? `${market.maxLeverage}x` : \"n/a\"}\n </Text>\n <Text style=\"caption\" tone=\"muted\" wrap={false}>\n sz{market.szDecimals}\n {market.onlyIsolated ? \" iso\" : \"\"}\n </Text>\n </HStack>\n ))}\n </List>\n )}\n\n <Divider label=\"account\" />\n <HStack gap={1} align=\"center\">\n <Text style=\"caption\" tone=\"muted\" grow={1} wrap={false}>\n {shortAddress(status.accountAddress)}\n </Text>\n <Text\n style=\"caption\"\n tone={status.executionReady ? \"success\" : \"muted\"}\n wrap={false}\n >\n {status.executionReady ? \"exec-ready\" : \"exec-off\"}\n </Text>\n </HStack>\n\n <Text style=\"caption\" tone=\"primary\">\n positions\n </Text>\n {snapshot.positionsBlockedReason ? (\n <Text style=\"caption\" tone=\"warning\" agent=\"positions-blocked\">\n {snapshot.positionsBlockedReason}\n </Text>\n ) : snapshot.positions.length === 0 ? (\n <Text tone=\"muted\" style=\"caption\">\n none\n </Text>\n ) : (\n <List gap={0}>\n {snapshot.positions.slice(0, 6).map((position) => (\n <HStack\n key={position.coin}\n gap={1}\n align=\"center\"\n agent={`position-${position.coin}`}\n >\n <Text bold grow={1} wrap={false}>\n {position.coin}\n </Text>\n <Text style=\"caption\" tone=\"muted\" wrap={false}>\n sz {position.size}\n </Text>\n {position.unrealizedPnl ? (\n <Text\n style=\"caption\"\n tone={\n position.unrealizedPnl.trim().startsWith(\"-\")\n ? \"danger\"\n : \"success\"\n }\n wrap={false}\n >\n {position.unrealizedPnl}\n </Text>\n ) : null}\n </HStack>\n ))}\n </List>\n )}\n\n <Text style=\"caption\" tone=\"primary\">\n orders\n </Text>\n {snapshot.ordersBlockedReason ? (\n <Text style=\"caption\" tone=\"warning\" agent=\"orders-blocked\">\n {snapshot.ordersBlockedReason}\n </Text>\n ) : snapshot.orders.length === 0 ? (\n <Text tone=\"muted\" style=\"caption\">\n none\n </Text>\n ) : (\n <List gap={0}>\n {snapshot.orders.slice(0, 6).map((order) => (\n <HStack\n key={order.oid}\n gap={1}\n align=\"center\"\n agent={`order-${order.oid}`}\n >\n <Text bold wrap={false}>\n {order.coin}\n </Text>\n <Text\n style=\"caption\"\n tone={\n order.side.toLowerCase().startsWith(\"b\")\n ? \"success\"\n : \"danger\"\n }\n wrap={false}\n >\n {order.side}\n </Text>\n <Text style=\"caption\" tone=\"muted\" grow={1} wrap={false}>\n {order.size} @ {order.limitPx}\n </Text>\n {order.reduceOnly ? (\n <Text style=\"caption\" tone=\"warning\" wrap={false}>\n ro\n </Text>\n ) : null}\n </HStack>\n ))}\n </List>\n )}\n\n <Divider />\n <HStack gap={1} wrap>\n <Button grow={1} agent=\"refresh\" onPress={dispatch(\"refresh\")}>\n Refresh\n </Button>\n <Button\n variant=\"outline\"\n tone=\"default\"\n agent=\"back\"\n onPress={dispatch(\"back\")}\n >\n Back\n </Button>\n </HStack>\n </Card>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hyperliquid-app-view-bundle.d.ts","sourceRoot":"","sources":["../src/hyperliquid-app-view-bundle.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hyperliquid-app-view-bundle.ts"],"sourcesContent":["// Vite view-bundle entry. Re-exports the unified spatial view component plus\n// the `interact` capability handler so the built bundle (dist/views/bundle.js)\n// exposes the named exports the view loader reads (`HyperliquidView`,\n// `interact`). Kept separate from HyperliquidView.tsx so that file exports only\n// React components and stays Fast-Refresh-compatible in dev.\n\nexport { interact } from \"./HyperliquidAppView.interact.js\";\nexport { HyperliquidView } from \"./HyperliquidView.js\";\n"],"mappings":"AAMA,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hyperliquid-app.d.ts","sourceRoot":"","sources":["../src/hyperliquid-app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,eAAO,MAAM,oBAAoB,oCAAoC,CAAC;AAEtE,eAAO,MAAM,cAAc,EAAE,UAU5B,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { registerOverlayApp } from "@elizaos/app-core";
|
|
2
|
+
const HYPERLIQUID_APP_NAME = "@elizaos/plugin-hyperliquid-app";
|
|
3
|
+
const hyperliquidApp = {
|
|
4
|
+
name: HYPERLIQUID_APP_NAME,
|
|
5
|
+
displayName: "Hyperliquid",
|
|
6
|
+
description: "Native Hyperliquid market, position, and order status",
|
|
7
|
+
category: "trading",
|
|
8
|
+
icon: null,
|
|
9
|
+
loader: () => import("./HyperliquidAppView.js").then((m) => ({
|
|
10
|
+
default: m.HyperliquidAppView
|
|
11
|
+
}))
|
|
12
|
+
};
|
|
13
|
+
registerOverlayApp(hyperliquidApp);
|
|
14
|
+
export {
|
|
15
|
+
HYPERLIQUID_APP_NAME,
|
|
16
|
+
hyperliquidApp
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=hyperliquid-app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hyperliquid-app.ts"],"sourcesContent":["import type { OverlayApp } from \"@elizaos/app-core\";\nimport { registerOverlayApp } from \"@elizaos/app-core\";\n\nexport const HYPERLIQUID_APP_NAME = \"@elizaos/plugin-hyperliquid-app\";\n\nexport const hyperliquidApp: OverlayApp = {\n name: HYPERLIQUID_APP_NAME,\n displayName: \"Hyperliquid\",\n description: \"Native Hyperliquid market, position, and order status\",\n category: \"trading\",\n icon: null,\n loader: () =>\n import(\"./HyperliquidAppView.js\").then((m) => ({\n default: m.HyperliquidAppView,\n })),\n};\n\nregisterOverlayApp(hyperliquidApp);\n"],"mappings":"AACA,SAAS,0BAA0B;AAE5B,MAAM,uBAAuB;AAE7B,MAAM,iBAA6B;AAAA,EACxC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,EACb,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ,MACN,OAAO,yBAAyB,EAAE,KAAK,CAAC,OAAO;AAAA,IAC7C,SAAS,EAAE;AAAA,EACb,EAAE;AACN;AAEA,mBAAmB,cAAc;","names":[]}
|