@elizaos/plugin-hyperliquid-app 2.0.3-beta.6 → 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,72 @@
|
|
|
1
|
+
import { client } from "@elizaos/app-core";
|
|
2
|
+
import { ApiError } from "@elizaos/ui";
|
|
3
|
+
import { useCallback, useEffect, useState } from "react";
|
|
4
|
+
import "./client.js";
|
|
5
|
+
function useHyperliquidState() {
|
|
6
|
+
const [status, setStatus] = useState(null);
|
|
7
|
+
const [markets, setMarkets] = useState(
|
|
8
|
+
null
|
|
9
|
+
);
|
|
10
|
+
const [positions, setPositions] = useState(null);
|
|
11
|
+
const [orders, setOrders] = useState(null);
|
|
12
|
+
const [loading, setLoading] = useState(false);
|
|
13
|
+
const [error, setError] = useState(null);
|
|
14
|
+
const [unavailable, setUnavailable] = useState(false);
|
|
15
|
+
const refresh = useCallback(async () => {
|
|
16
|
+
setLoading(true);
|
|
17
|
+
setError(null);
|
|
18
|
+
setUnavailable(false);
|
|
19
|
+
const hyperliquidClient = client;
|
|
20
|
+
try {
|
|
21
|
+
const nextStatus = await hyperliquidClient.hyperliquidStatus();
|
|
22
|
+
setStatus(nextStatus);
|
|
23
|
+
if (!nextStatus.publicReadReady) {
|
|
24
|
+
setMarkets(null);
|
|
25
|
+
setPositions(null);
|
|
26
|
+
setOrders(null);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const [nextMarkets, nextPositions, nextOrders] = await Promise.all([
|
|
30
|
+
hyperliquidClient.hyperliquidMarkets(),
|
|
31
|
+
hyperliquidClient.hyperliquidPositions(),
|
|
32
|
+
hyperliquidClient.hyperliquidOrders()
|
|
33
|
+
]);
|
|
34
|
+
setMarkets(nextMarkets);
|
|
35
|
+
setPositions(nextPositions);
|
|
36
|
+
setOrders(nextOrders);
|
|
37
|
+
} catch (caught) {
|
|
38
|
+
if (caught instanceof ApiError && (caught.status === 404 || caught.status === 503)) {
|
|
39
|
+
setStatus(null);
|
|
40
|
+
setMarkets(null);
|
|
41
|
+
setPositions(null);
|
|
42
|
+
setOrders(null);
|
|
43
|
+
setUnavailable(true);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
setError(
|
|
47
|
+
caught instanceof Error ? caught.message : "Hyperliquid refresh failed"
|
|
48
|
+
);
|
|
49
|
+
} finally {
|
|
50
|
+
setLoading(false);
|
|
51
|
+
}
|
|
52
|
+
}, []);
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
void refresh();
|
|
55
|
+
const interval = setInterval(() => void refresh(), 15e3);
|
|
56
|
+
return () => clearInterval(interval);
|
|
57
|
+
}, [refresh]);
|
|
58
|
+
return {
|
|
59
|
+
status,
|
|
60
|
+
markets,
|
|
61
|
+
positions,
|
|
62
|
+
orders,
|
|
63
|
+
loading,
|
|
64
|
+
error,
|
|
65
|
+
unavailable,
|
|
66
|
+
refresh
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export {
|
|
70
|
+
useHyperliquidState
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=useHyperliquidState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/useHyperliquidState.ts"],"sourcesContent":["import { client } from \"@elizaos/app-core\";\nimport { ApiError } from \"@elizaos/ui\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport \"./client.js\";\nimport type { HyperliquidClient } from \"./client.js\";\nimport type {\n HyperliquidMarketsResponse,\n HyperliquidOrdersResponse,\n HyperliquidPositionsResponse,\n HyperliquidStatusResponse,\n} from \"./hyperliquid-contracts.js\";\n\nexport interface HyperliquidState {\n status: HyperliquidStatusResponse | null;\n markets: HyperliquidMarketsResponse | null;\n positions: HyperliquidPositionsResponse | null;\n orders: HyperliquidOrdersResponse | null;\n loading: boolean;\n error: string | null;\n /**\n * True when the Hyperliquid app routes are not mounted on this surface (the\n * read endpoints 404/503) — e.g. the mobile bundle that ships without the\n * app-route plugin. The view degrades to a clean \"unavailable\" state instead\n * of surfacing the raw fetch error.\n */\n unavailable: boolean;\n refresh: () => Promise<void>;\n}\n\nexport function useHyperliquidState(): HyperliquidState {\n const [status, setStatus] = useState<HyperliquidStatusResponse | null>(null);\n const [markets, setMarkets] = useState<HyperliquidMarketsResponse | null>(\n null,\n );\n const [positions, setPositions] =\n useState<HyperliquidPositionsResponse | null>(null);\n const [orders, setOrders] = useState<HyperliquidOrdersResponse | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [unavailable, setUnavailable] = useState(false);\n\n const refresh = useCallback(async () => {\n setLoading(true);\n setError(null);\n setUnavailable(false);\n const hyperliquidClient = client as HyperliquidClient;\n try {\n const nextStatus = await hyperliquidClient.hyperliquidStatus();\n setStatus(nextStatus);\n\n if (!nextStatus.publicReadReady) {\n setMarkets(null);\n setPositions(null);\n setOrders(null);\n return;\n }\n\n const [nextMarkets, nextPositions, nextOrders] = await Promise.all([\n hyperliquidClient.hyperliquidMarkets(),\n hyperliquidClient.hyperliquidPositions(),\n hyperliquidClient.hyperliquidOrders(),\n ]);\n setMarkets(nextMarkets);\n setPositions(nextPositions);\n setOrders(nextOrders);\n } catch (caught) {\n // The Hyperliquid app routes only mount where the app-route plugin is\n // loaded. On surfaces that ship without it (e.g. the mobile bundle) the\n // read endpoints 404, or 503 while the agent is still booting — neither is\n // a real failure, so degrade to a clean \"unavailable\" state rather than\n // surfacing the raw fetch error.\n if (\n caught instanceof ApiError &&\n (caught.status === 404 || caught.status === 503)\n ) {\n setStatus(null);\n setMarkets(null);\n setPositions(null);\n setOrders(null);\n setUnavailable(true);\n return;\n }\n setError(\n caught instanceof Error ? caught.message : \"Hyperliquid refresh failed\",\n );\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n void refresh();\n const interval = setInterval(() => void refresh(), 15000);\n return () => clearInterval(interval);\n }, [refresh]);\n\n return {\n status,\n markets,\n positions,\n orders,\n loading,\n error,\n unavailable,\n refresh,\n };\n}\n"],"mappings":"AAAA,SAAS,cAAc;AACvB,SAAS,gBAAgB;AACzB,SAAS,aAAa,WAAW,gBAAgB;AACjD,OAAO;AA0BA,SAAS,sBAAwC;AACtD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAA2C,IAAI;AAC3E,QAAM,CAAC,SAAS,UAAU,IAAI;AAAA,IAC5B;AAAA,EACF;AACA,QAAM,CAAC,WAAW,YAAY,IAC5B,SAA8C,IAAI;AACpD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAA2C,IAAI;AAC3E,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AACtD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AAEpD,QAAM,UAAU,YAAY,YAAY;AACtC,eAAW,IAAI;AACf,aAAS,IAAI;AACb,mBAAe,KAAK;AACpB,UAAM,oBAAoB;AAC1B,QAAI;AACF,YAAM,aAAa,MAAM,kBAAkB,kBAAkB;AAC7D,gBAAU,UAAU;AAEpB,UAAI,CAAC,WAAW,iBAAiB;AAC/B,mBAAW,IAAI;AACf,qBAAa,IAAI;AACjB,kBAAU,IAAI;AACd;AAAA,MACF;AAEA,YAAM,CAAC,aAAa,eAAe,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,QACjE,kBAAkB,mBAAmB;AAAA,QACrC,kBAAkB,qBAAqB;AAAA,QACvC,kBAAkB,kBAAkB;AAAA,MACtC,CAAC;AACD,iBAAW,WAAW;AACtB,mBAAa,aAAa;AAC1B,gBAAU,UAAU;AAAA,IACtB,SAAS,QAAQ;AAMf,UACE,kBAAkB,aACjB,OAAO,WAAW,OAAO,OAAO,WAAW,MAC5C;AACA,kBAAU,IAAI;AACd,mBAAW,IAAI;AACf,qBAAa,IAAI;AACjB,kBAAU,IAAI;AACd,uBAAe,IAAI;AACnB;AAAA,MACF;AACA;AAAA,QACE,kBAAkB,QAAQ,OAAO,UAAU;AAAA,MAC7C;AAAA,IACF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,SAAK,QAAQ;AACb,UAAM,WAAW,YAAY,MAAM,KAAK,QAAQ,GAAG,IAAK;AACxD,WAAO,MAAM,cAAc,QAAQ;AAAA,EACrC,GAAG,CAAC,OAAO,CAAC;AAEZ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
import { client as e } from "@elizaos/app-core";
|
|
2
|
+
import { ApiError as t, ElizaClient as n } from "@elizaos/ui";
|
|
3
|
+
import { Button as r, Card as i, Divider as a, HStack as o, List as s, SpatialSurface as c, Text as l, VStack as u } from "@elizaos/ui/spatial";
|
|
4
|
+
import { useCallback as d, useEffect as f, useState as p } from "react";
|
|
5
|
+
import { jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
6
|
+
//#region src/client.ts
|
|
7
|
+
var g = n.prototype;
|
|
8
|
+
g.hyperliquidStatus = async function() {
|
|
9
|
+
return this.fetch("/api/hyperliquid/status");
|
|
10
|
+
}, g.hyperliquidMarkets = async function() {
|
|
11
|
+
return this.fetch("/api/hyperliquid/markets");
|
|
12
|
+
}, g.hyperliquidPositions = async function() {
|
|
13
|
+
return this.fetch("/api/hyperliquid/positions");
|
|
14
|
+
}, g.hyperliquidOrders = async function() {
|
|
15
|
+
return this.fetch("/api/hyperliquid/orders");
|
|
16
|
+
};
|
|
17
|
+
//#endregion
|
|
18
|
+
//#region src/HyperliquidAppView.interact.ts
|
|
19
|
+
async function _() {
|
|
20
|
+
let t = e, n = await t.hyperliquidStatus();
|
|
21
|
+
if (!n.publicReadReady) return {
|
|
22
|
+
status: n,
|
|
23
|
+
markets: null,
|
|
24
|
+
positions: null,
|
|
25
|
+
orders: null
|
|
26
|
+
};
|
|
27
|
+
let [r, i, a] = await Promise.all([
|
|
28
|
+
t.hyperliquidMarkets(),
|
|
29
|
+
t.hyperliquidPositions(),
|
|
30
|
+
t.hyperliquidOrders()
|
|
31
|
+
]);
|
|
32
|
+
return {
|
|
33
|
+
status: n,
|
|
34
|
+
markets: r,
|
|
35
|
+
positions: i,
|
|
36
|
+
orders: a
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
async function v(e, t) {
|
|
40
|
+
let n = await fetch(e, {
|
|
41
|
+
method: "POST",
|
|
42
|
+
headers: { "Content-Type": "application/json" },
|
|
43
|
+
body: JSON.stringify(t)
|
|
44
|
+
}), r = await n.json().catch(() => ({}));
|
|
45
|
+
if (!n.ok) {
|
|
46
|
+
let e = typeof r == "object" && r && "error" in r && typeof r.error == "string" ? r.error : `Hyperliquid request failed with ${n.status}`;
|
|
47
|
+
throw Error(e);
|
|
48
|
+
}
|
|
49
|
+
return r;
|
|
50
|
+
}
|
|
51
|
+
async function y(e, t) {
|
|
52
|
+
if (e === "terminal-hyperliquid-state") {
|
|
53
|
+
let e = await _();
|
|
54
|
+
return {
|
|
55
|
+
viewType: "tui",
|
|
56
|
+
status: e.status,
|
|
57
|
+
markets: e.markets?.markets.slice(0, typeof t?.limit == "number" ? t.limit : 25) ?? [],
|
|
58
|
+
positions: e.positions,
|
|
59
|
+
orders: e.orders
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
if (e === "terminal-hyperliquid-market") {
|
|
63
|
+
let e = typeof t?.coin == "string" ? t.coin.trim().toUpperCase() : "";
|
|
64
|
+
if (!e) throw Error("coin is required");
|
|
65
|
+
return {
|
|
66
|
+
viewType: "tui",
|
|
67
|
+
market: (await _()).markets?.markets.find((t) => t.name.toUpperCase() === e) ?? null
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
if (e === "terminal-hyperliquid-execution-check") return {
|
|
71
|
+
viewType: "tui",
|
|
72
|
+
result: await v("/api/hyperliquid/orders/open", {
|
|
73
|
+
coin: typeof t?.coin == "string" ? t.coin : "BTC",
|
|
74
|
+
side: typeof t?.side == "string" ? t.side : "buy",
|
|
75
|
+
size: typeof t?.size == "string" ? t.size : "0"
|
|
76
|
+
})
|
|
77
|
+
};
|
|
78
|
+
throw Error(`Unsupported capability "${e}"`);
|
|
79
|
+
}
|
|
80
|
+
//#endregion
|
|
81
|
+
//#region src/components/HyperliquidSpatialView.tsx
|
|
82
|
+
function b(e) {
|
|
83
|
+
switch (e) {
|
|
84
|
+
case "managed_vault": return "Managed vault";
|
|
85
|
+
case "local_key": return "Local key";
|
|
86
|
+
default: return "Read-only";
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function x(e) {
|
|
90
|
+
return e ? "success" : "muted";
|
|
91
|
+
}
|
|
92
|
+
function S(e) {
|
|
93
|
+
return e ? "[ok]" : "[--]";
|
|
94
|
+
}
|
|
95
|
+
function C({ label: e, ready: t }) {
|
|
96
|
+
return /* @__PURE__ */ h(o, {
|
|
97
|
+
gap: 1,
|
|
98
|
+
align: "center",
|
|
99
|
+
grow: 1,
|
|
100
|
+
children: [/* @__PURE__ */ m(l, {
|
|
101
|
+
tone: x(t),
|
|
102
|
+
wrap: !1,
|
|
103
|
+
children: S(t)
|
|
104
|
+
}), /* @__PURE__ */ m(l, {
|
|
105
|
+
bold: !0,
|
|
106
|
+
grow: 1,
|
|
107
|
+
wrap: !1,
|
|
108
|
+
children: e
|
|
109
|
+
})]
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
function w(e) {
|
|
113
|
+
return e ? e.length <= 13 ? e : `${e.slice(0, 6)}..${e.slice(-4)}` : "not configured";
|
|
114
|
+
}
|
|
115
|
+
function T({ snapshot: e, onAction: t }) {
|
|
116
|
+
let n = (e) => () => t?.(e), { status: c } = e, d = !!c.accountAddress;
|
|
117
|
+
return e.unavailable ? /* @__PURE__ */ h(i, {
|
|
118
|
+
gap: 1,
|
|
119
|
+
padding: 1,
|
|
120
|
+
children: [
|
|
121
|
+
/* @__PURE__ */ m(l, {
|
|
122
|
+
tone: "muted",
|
|
123
|
+
align: "center",
|
|
124
|
+
children: "Unavailable"
|
|
125
|
+
}),
|
|
126
|
+
/* @__PURE__ */ m(a, {}),
|
|
127
|
+
/* @__PURE__ */ h(o, {
|
|
128
|
+
gap: 1,
|
|
129
|
+
wrap: !0,
|
|
130
|
+
children: [/* @__PURE__ */ m(r, {
|
|
131
|
+
grow: 1,
|
|
132
|
+
agent: "refresh",
|
|
133
|
+
onPress: n("refresh"),
|
|
134
|
+
children: "Refresh"
|
|
135
|
+
}), /* @__PURE__ */ m(r, {
|
|
136
|
+
variant: "outline",
|
|
137
|
+
tone: "default",
|
|
138
|
+
agent: "back",
|
|
139
|
+
onPress: n("back"),
|
|
140
|
+
children: "Back"
|
|
141
|
+
})]
|
|
142
|
+
})
|
|
143
|
+
]
|
|
144
|
+
}) : /* @__PURE__ */ h(i, {
|
|
145
|
+
gap: 1,
|
|
146
|
+
padding: 1,
|
|
147
|
+
children: [
|
|
148
|
+
/* @__PURE__ */ h(o, {
|
|
149
|
+
gap: 1,
|
|
150
|
+
align: "center",
|
|
151
|
+
children: [/* @__PURE__ */ m(l, {
|
|
152
|
+
style: "caption",
|
|
153
|
+
tone: c.publicReadReady ? "success" : "danger",
|
|
154
|
+
grow: 1,
|
|
155
|
+
children: e.loading ? "loading" : c.publicReadReady ? "read-ready" : "read-blocked"
|
|
156
|
+
}), /* @__PURE__ */ h(l, {
|
|
157
|
+
style: "caption",
|
|
158
|
+
tone: "muted",
|
|
159
|
+
wrap: !1,
|
|
160
|
+
children: [
|
|
161
|
+
e.markets.length,
|
|
162
|
+
"m / ",
|
|
163
|
+
e.positions.length,
|
|
164
|
+
"p /",
|
|
165
|
+
" ",
|
|
166
|
+
e.orders.length,
|
|
167
|
+
"o"
|
|
168
|
+
]
|
|
169
|
+
})]
|
|
170
|
+
}),
|
|
171
|
+
e.error ? /* @__PURE__ */ m(l, {
|
|
172
|
+
tone: "danger",
|
|
173
|
+
style: "caption",
|
|
174
|
+
children: e.error
|
|
175
|
+
}) : null,
|
|
176
|
+
/* @__PURE__ */ m(a, { label: "status" }),
|
|
177
|
+
/* @__PURE__ */ h(u, {
|
|
178
|
+
gap: 0,
|
|
179
|
+
children: [
|
|
180
|
+
/* @__PURE__ */ m(C, {
|
|
181
|
+
label: "Reads",
|
|
182
|
+
ready: c.publicReadReady
|
|
183
|
+
}),
|
|
184
|
+
/* @__PURE__ */ m(C, {
|
|
185
|
+
label: b(c.credentialMode),
|
|
186
|
+
ready: c.signerReady
|
|
187
|
+
}),
|
|
188
|
+
/* @__PURE__ */ m(C, {
|
|
189
|
+
label: "Account",
|
|
190
|
+
ready: d
|
|
191
|
+
})
|
|
192
|
+
]
|
|
193
|
+
}),
|
|
194
|
+
c.executionBlockedReason ? /* @__PURE__ */ m(l, {
|
|
195
|
+
style: "caption",
|
|
196
|
+
tone: "warning",
|
|
197
|
+
children: c.executionBlockedReason
|
|
198
|
+
}) : null,
|
|
199
|
+
!c.vaultReady && c.credentialMode !== "local_key" && c.vaultGuidance ? /* @__PURE__ */ m(l, {
|
|
200
|
+
style: "caption",
|
|
201
|
+
tone: "muted",
|
|
202
|
+
children: c.vaultGuidance
|
|
203
|
+
}) : null,
|
|
204
|
+
/* @__PURE__ */ m(a, { label: "markets" }),
|
|
205
|
+
e.markets.length === 0 ? /* @__PURE__ */ m(l, {
|
|
206
|
+
tone: "muted",
|
|
207
|
+
align: "center",
|
|
208
|
+
style: "caption",
|
|
209
|
+
children: "None"
|
|
210
|
+
}) : /* @__PURE__ */ m(s, {
|
|
211
|
+
gap: 0,
|
|
212
|
+
children: e.markets.slice(0, 12).map((e) => /* @__PURE__ */ h(o, {
|
|
213
|
+
gap: 1,
|
|
214
|
+
align: "center",
|
|
215
|
+
agent: `market-${e.name}`,
|
|
216
|
+
children: [
|
|
217
|
+
/* @__PURE__ */ m(l, {
|
|
218
|
+
bold: !0,
|
|
219
|
+
grow: 1,
|
|
220
|
+
wrap: !1,
|
|
221
|
+
tone: e.isDelisted ? "muted" : "default",
|
|
222
|
+
children: e.name
|
|
223
|
+
}),
|
|
224
|
+
/* @__PURE__ */ m(l, {
|
|
225
|
+
style: "caption",
|
|
226
|
+
tone: "primary",
|
|
227
|
+
wrap: !1,
|
|
228
|
+
children: e.maxLeverage ? `${e.maxLeverage}x` : "n/a"
|
|
229
|
+
}),
|
|
230
|
+
/* @__PURE__ */ h(l, {
|
|
231
|
+
style: "caption",
|
|
232
|
+
tone: "muted",
|
|
233
|
+
wrap: !1,
|
|
234
|
+
children: [
|
|
235
|
+
"sz",
|
|
236
|
+
e.szDecimals,
|
|
237
|
+
e.onlyIsolated ? " iso" : ""
|
|
238
|
+
]
|
|
239
|
+
})
|
|
240
|
+
]
|
|
241
|
+
}, e.name))
|
|
242
|
+
}),
|
|
243
|
+
/* @__PURE__ */ m(a, { label: "account" }),
|
|
244
|
+
/* @__PURE__ */ h(o, {
|
|
245
|
+
gap: 1,
|
|
246
|
+
align: "center",
|
|
247
|
+
children: [/* @__PURE__ */ m(l, {
|
|
248
|
+
style: "caption",
|
|
249
|
+
tone: "muted",
|
|
250
|
+
grow: 1,
|
|
251
|
+
wrap: !1,
|
|
252
|
+
children: w(c.accountAddress)
|
|
253
|
+
}), /* @__PURE__ */ m(l, {
|
|
254
|
+
style: "caption",
|
|
255
|
+
tone: c.executionReady ? "success" : "muted",
|
|
256
|
+
wrap: !1,
|
|
257
|
+
children: c.executionReady ? "exec-ready" : "exec-off"
|
|
258
|
+
})]
|
|
259
|
+
}),
|
|
260
|
+
/* @__PURE__ */ m(l, {
|
|
261
|
+
style: "caption",
|
|
262
|
+
tone: "primary",
|
|
263
|
+
children: "positions"
|
|
264
|
+
}),
|
|
265
|
+
e.positionsBlockedReason ? /* @__PURE__ */ m(l, {
|
|
266
|
+
style: "caption",
|
|
267
|
+
tone: "warning",
|
|
268
|
+
agent: "positions-blocked",
|
|
269
|
+
children: e.positionsBlockedReason
|
|
270
|
+
}) : e.positions.length === 0 ? /* @__PURE__ */ m(l, {
|
|
271
|
+
tone: "muted",
|
|
272
|
+
style: "caption",
|
|
273
|
+
children: "none"
|
|
274
|
+
}) : /* @__PURE__ */ m(s, {
|
|
275
|
+
gap: 0,
|
|
276
|
+
children: e.positions.slice(0, 6).map((e) => /* @__PURE__ */ h(o, {
|
|
277
|
+
gap: 1,
|
|
278
|
+
align: "center",
|
|
279
|
+
agent: `position-${e.coin}`,
|
|
280
|
+
children: [
|
|
281
|
+
/* @__PURE__ */ m(l, {
|
|
282
|
+
bold: !0,
|
|
283
|
+
grow: 1,
|
|
284
|
+
wrap: !1,
|
|
285
|
+
children: e.coin
|
|
286
|
+
}),
|
|
287
|
+
/* @__PURE__ */ h(l, {
|
|
288
|
+
style: "caption",
|
|
289
|
+
tone: "muted",
|
|
290
|
+
wrap: !1,
|
|
291
|
+
children: ["sz ", e.size]
|
|
292
|
+
}),
|
|
293
|
+
e.unrealizedPnl ? /* @__PURE__ */ m(l, {
|
|
294
|
+
style: "caption",
|
|
295
|
+
tone: e.unrealizedPnl.trim().startsWith("-") ? "danger" : "success",
|
|
296
|
+
wrap: !1,
|
|
297
|
+
children: e.unrealizedPnl
|
|
298
|
+
}) : null
|
|
299
|
+
]
|
|
300
|
+
}, e.coin))
|
|
301
|
+
}),
|
|
302
|
+
/* @__PURE__ */ m(l, {
|
|
303
|
+
style: "caption",
|
|
304
|
+
tone: "primary",
|
|
305
|
+
children: "orders"
|
|
306
|
+
}),
|
|
307
|
+
e.ordersBlockedReason ? /* @__PURE__ */ m(l, {
|
|
308
|
+
style: "caption",
|
|
309
|
+
tone: "warning",
|
|
310
|
+
agent: "orders-blocked",
|
|
311
|
+
children: e.ordersBlockedReason
|
|
312
|
+
}) : e.orders.length === 0 ? /* @__PURE__ */ m(l, {
|
|
313
|
+
tone: "muted",
|
|
314
|
+
style: "caption",
|
|
315
|
+
children: "none"
|
|
316
|
+
}) : /* @__PURE__ */ m(s, {
|
|
317
|
+
gap: 0,
|
|
318
|
+
children: e.orders.slice(0, 6).map((e) => /* @__PURE__ */ h(o, {
|
|
319
|
+
gap: 1,
|
|
320
|
+
align: "center",
|
|
321
|
+
agent: `order-${e.oid}`,
|
|
322
|
+
children: [
|
|
323
|
+
/* @__PURE__ */ m(l, {
|
|
324
|
+
bold: !0,
|
|
325
|
+
wrap: !1,
|
|
326
|
+
children: e.coin
|
|
327
|
+
}),
|
|
328
|
+
/* @__PURE__ */ m(l, {
|
|
329
|
+
style: "caption",
|
|
330
|
+
tone: e.side.toLowerCase().startsWith("b") ? "success" : "danger",
|
|
331
|
+
wrap: !1,
|
|
332
|
+
children: e.side
|
|
333
|
+
}),
|
|
334
|
+
/* @__PURE__ */ h(l, {
|
|
335
|
+
style: "caption",
|
|
336
|
+
tone: "muted",
|
|
337
|
+
grow: 1,
|
|
338
|
+
wrap: !1,
|
|
339
|
+
children: [
|
|
340
|
+
e.size,
|
|
341
|
+
" @ ",
|
|
342
|
+
e.limitPx
|
|
343
|
+
]
|
|
344
|
+
}),
|
|
345
|
+
e.reduceOnly ? /* @__PURE__ */ m(l, {
|
|
346
|
+
style: "caption",
|
|
347
|
+
tone: "warning",
|
|
348
|
+
wrap: !1,
|
|
349
|
+
children: "ro"
|
|
350
|
+
}) : null
|
|
351
|
+
]
|
|
352
|
+
}, e.oid))
|
|
353
|
+
}),
|
|
354
|
+
/* @__PURE__ */ m(a, {}),
|
|
355
|
+
/* @__PURE__ */ h(o, {
|
|
356
|
+
gap: 1,
|
|
357
|
+
wrap: !0,
|
|
358
|
+
children: [/* @__PURE__ */ m(r, {
|
|
359
|
+
grow: 1,
|
|
360
|
+
agent: "refresh",
|
|
361
|
+
onPress: n("refresh"),
|
|
362
|
+
children: "Refresh"
|
|
363
|
+
}), /* @__PURE__ */ m(r, {
|
|
364
|
+
variant: "outline",
|
|
365
|
+
tone: "default",
|
|
366
|
+
agent: "back",
|
|
367
|
+
onPress: n("back"),
|
|
368
|
+
children: "Back"
|
|
369
|
+
})]
|
|
370
|
+
})
|
|
371
|
+
]
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
//#endregion
|
|
375
|
+
//#region src/useHyperliquidState.ts
|
|
376
|
+
function E() {
|
|
377
|
+
let [n, r] = p(null), [i, a] = p(null), [o, s] = p(null), [c, l] = p(null), [u, m] = p(!1), [h, g] = p(null), [_, v] = p(!1), y = d(async () => {
|
|
378
|
+
m(!0), g(null), v(!1);
|
|
379
|
+
let n = e;
|
|
380
|
+
try {
|
|
381
|
+
let e = await n.hyperliquidStatus();
|
|
382
|
+
if (r(e), !e.publicReadReady) {
|
|
383
|
+
a(null), s(null), l(null);
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
let [t, i, o] = await Promise.all([
|
|
387
|
+
n.hyperliquidMarkets(),
|
|
388
|
+
n.hyperliquidPositions(),
|
|
389
|
+
n.hyperliquidOrders()
|
|
390
|
+
]);
|
|
391
|
+
a(t), s(i), l(o);
|
|
392
|
+
} catch (e) {
|
|
393
|
+
if (e instanceof t && (e.status === 404 || e.status === 503)) {
|
|
394
|
+
r(null), a(null), s(null), l(null), v(!0);
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
g(e instanceof Error ? e.message : "Hyperliquid refresh failed");
|
|
398
|
+
} finally {
|
|
399
|
+
m(!1);
|
|
400
|
+
}
|
|
401
|
+
}, []);
|
|
402
|
+
return f(() => {
|
|
403
|
+
y();
|
|
404
|
+
let e = setInterval(() => void y(), 15e3);
|
|
405
|
+
return () => clearInterval(e);
|
|
406
|
+
}, [y]), {
|
|
407
|
+
status: n,
|
|
408
|
+
markets: i,
|
|
409
|
+
positions: o,
|
|
410
|
+
orders: c,
|
|
411
|
+
loading: u,
|
|
412
|
+
error: h,
|
|
413
|
+
unavailable: _,
|
|
414
|
+
refresh: y
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
//#endregion
|
|
418
|
+
//#region src/HyperliquidView.tsx
|
|
419
|
+
function D() {
|
|
420
|
+
typeof window > "u" || window.dispatchEvent(new CustomEvent("eliza:navigate:view", { detail: {
|
|
421
|
+
viewId: "home",
|
|
422
|
+
viewPath: "/"
|
|
423
|
+
} }));
|
|
424
|
+
}
|
|
425
|
+
function O() {
|
|
426
|
+
let { status: e, markets: t, positions: n, orders: r, loading: i, error: a, unavailable: o, refresh: s } = E(), l = d((e) => {
|
|
427
|
+
switch (e) {
|
|
428
|
+
case "refresh":
|
|
429
|
+
s();
|
|
430
|
+
return;
|
|
431
|
+
case "back":
|
|
432
|
+
D();
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
}, [s]);
|
|
436
|
+
return /* @__PURE__ */ m(c, { children: /* @__PURE__ */ m(T, {
|
|
437
|
+
snapshot: {
|
|
438
|
+
status: {
|
|
439
|
+
publicReadReady: e?.publicReadReady ?? !1,
|
|
440
|
+
signerReady: e?.signerReady ?? !1,
|
|
441
|
+
executionReady: e?.executionReady ?? !1,
|
|
442
|
+
credentialMode: e?.credentialMode ?? "none",
|
|
443
|
+
accountAddress: e?.account.address ?? null,
|
|
444
|
+
vaultReady: e?.vault.ready ?? !1,
|
|
445
|
+
executionBlockedReason: e?.executionBlockedReason ?? null,
|
|
446
|
+
vaultGuidance: e?.vault.guidance ?? null
|
|
447
|
+
},
|
|
448
|
+
markets: t?.markets ?? [],
|
|
449
|
+
positions: n?.positions ?? [],
|
|
450
|
+
orders: r?.orders ?? [],
|
|
451
|
+
positionsBlockedReason: n?.readBlockedReason ?? null,
|
|
452
|
+
ordersBlockedReason: r?.readBlockedReason ?? null,
|
|
453
|
+
unavailable: o,
|
|
454
|
+
loading: i,
|
|
455
|
+
error: a
|
|
456
|
+
},
|
|
457
|
+
onAction: l
|
|
458
|
+
}) });
|
|
459
|
+
}
|
|
460
|
+
//#endregion
|
|
461
|
+
export { O as HyperliquidView, y as interact };
|
|
462
|
+
|
|
463
|
+
//# sourceMappingURL=bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.js","names":[],"sources":["../../src/client.ts","../../src/HyperliquidAppView.interact.ts","../../src/components/HyperliquidSpatialView.tsx","../../src/useHyperliquidState.ts","../../src/HyperliquidView.tsx"],"sourcesContent":["import { ElizaClient } from \"@elizaos/ui\";\nimport type {\n HyperliquidMarketsResponse,\n HyperliquidOrdersResponse,\n HyperliquidPositionsResponse,\n HyperliquidStatusResponse,\n} from \"./hyperliquid-contracts\";\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","// View-bundle `interact` capability handler plus the TUI state loaders it shares\n// with HyperliquidTuiView, split out of HyperliquidAppView.tsx so that file\n// exports only React components and stays Fast-Refresh-compatible (Vite would\n// full-reload a component file that also exports a plain function). The view\n// bundle re-exports `interact` via ./hyperliquid-app-view-bundle.ts.\n\nimport { client } from \"@elizaos/app-core\";\nimport \"./client\";\nimport type { HyperliquidClient } from \"./client\";\nimport type {\n HyperliquidMarketsResponse,\n HyperliquidOrdersResponse,\n HyperliquidPositionsResponse,\n HyperliquidStatusResponse,\n} from \"./hyperliquid-contracts\";\n\nexport async function loadHyperliquidTuiState(): Promise<{\n status: HyperliquidStatusResponse;\n markets: HyperliquidMarketsResponse | null;\n positions: HyperliquidPositionsResponse | null;\n orders: HyperliquidOrdersResponse | null;\n}> {\n const hyperliquidClient = client as HyperliquidClient;\n const status = await hyperliquidClient.hyperliquidStatus();\n if (!status.publicReadReady) {\n return { status, markets: null, positions: null, orders: null };\n }\n const [markets, positions, orders] = await Promise.all([\n hyperliquidClient.hyperliquidMarkets(),\n hyperliquidClient.hyperliquidPositions(),\n hyperliquidClient.hyperliquidOrders(),\n ]);\n return { status, markets, positions, orders };\n}\n\nasync function postHyperliquidCommand(\n path: string,\n body: Record<string, unknown>,\n): Promise<unknown> {\n const response = await fetch(path, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n const data = await response.json().catch(() => ({}));\n if (!response.ok) {\n const message =\n typeof data === \"object\" &&\n data !== null &&\n \"error\" in data &&\n typeof data.error === \"string\"\n ? data.error\n : `Hyperliquid request failed with ${response.status}`;\n throw new Error(message);\n }\n return data;\n}\n\nexport async function interact(\n capability: string,\n params?: Record<string, unknown>,\n): Promise<unknown> {\n if (capability === \"terminal-hyperliquid-state\") {\n const state = await loadHyperliquidTuiState();\n return {\n viewType: \"tui\",\n status: state.status,\n markets:\n state.markets?.markets.slice(\n 0,\n typeof params?.limit === \"number\" ? params.limit : 25,\n ) ?? [],\n positions: state.positions,\n orders: state.orders,\n };\n }\n\n if (capability === \"terminal-hyperliquid-market\") {\n const coin =\n typeof params?.coin === \"string\" ? params.coin.trim().toUpperCase() : \"\";\n if (!coin) throw new Error(\"coin is required\");\n const state = await loadHyperliquidTuiState();\n return {\n viewType: \"tui\",\n market:\n state.markets?.markets.find(\n (market) => market.name.toUpperCase() === coin,\n ) ?? null,\n };\n }\n\n if (capability === \"terminal-hyperliquid-execution-check\") {\n return {\n viewType: \"tui\",\n result: await postHyperliquidCommand(\"/api/hyperliquid/orders/open\", {\n coin: typeof params?.coin === \"string\" ? params.coin : \"BTC\",\n side: typeof params?.side === \"string\" ? params.side : \"buy\",\n size: typeof params?.size === \"string\" ? params.size : \"0\",\n }),\n };\n }\n\n throw new Error(`Unsupported capability \"${capability}\"`);\n}\n","/**\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.ts\";\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","import { client } from \"@elizaos/app-core\";\nimport { ApiError } from \"@elizaos/ui\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport \"./client\";\nimport type { HyperliquidClient } from \"./client\";\nimport type {\n HyperliquidMarketsResponse,\n HyperliquidOrdersResponse,\n HyperliquidPositionsResponse,\n HyperliquidStatusResponse,\n} from \"./hyperliquid-contracts\";\n\nexport interface HyperliquidState {\n status: HyperliquidStatusResponse | null;\n markets: HyperliquidMarketsResponse | null;\n positions: HyperliquidPositionsResponse | null;\n orders: HyperliquidOrdersResponse | null;\n loading: boolean;\n error: string | null;\n /**\n * True when the Hyperliquid app routes are not mounted on this surface (the\n * read endpoints 404/503) — e.g. the mobile bundle that ships without the\n * app-route plugin. The view degrades to a clean \"unavailable\" state instead\n * of surfacing the raw fetch error.\n */\n unavailable: boolean;\n refresh: () => Promise<void>;\n}\n\nexport function useHyperliquidState(): HyperliquidState {\n const [status, setStatus] = useState<HyperliquidStatusResponse | null>(null);\n const [markets, setMarkets] = useState<HyperliquidMarketsResponse | null>(\n null,\n );\n const [positions, setPositions] =\n useState<HyperliquidPositionsResponse | null>(null);\n const [orders, setOrders] = useState<HyperliquidOrdersResponse | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [unavailable, setUnavailable] = useState(false);\n\n const refresh = useCallback(async () => {\n setLoading(true);\n setError(null);\n setUnavailable(false);\n const hyperliquidClient = client as HyperliquidClient;\n try {\n const nextStatus = await hyperliquidClient.hyperliquidStatus();\n setStatus(nextStatus);\n\n if (!nextStatus.publicReadReady) {\n setMarkets(null);\n setPositions(null);\n setOrders(null);\n return;\n }\n\n const [nextMarkets, nextPositions, nextOrders] = await Promise.all([\n hyperliquidClient.hyperliquidMarkets(),\n hyperliquidClient.hyperliquidPositions(),\n hyperliquidClient.hyperliquidOrders(),\n ]);\n setMarkets(nextMarkets);\n setPositions(nextPositions);\n setOrders(nextOrders);\n } catch (caught) {\n // The Hyperliquid app routes only mount where the app-route plugin is\n // loaded. On surfaces that ship without it (e.g. the mobile bundle) the\n // read endpoints 404, or 503 while the agent is still booting — neither is\n // a real failure, so degrade to a clean \"unavailable\" state rather than\n // surfacing the raw fetch error.\n if (\n caught instanceof ApiError &&\n (caught.status === 404 || caught.status === 503)\n ) {\n setStatus(null);\n setMarkets(null);\n setPositions(null);\n setOrders(null);\n setUnavailable(true);\n return;\n }\n setError(\n caught instanceof Error ? caught.message : \"Hyperliquid refresh failed\",\n );\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n void refresh();\n const interval = setInterval(() => void refresh(), 15000);\n return () => clearInterval(interval);\n }, [refresh]);\n\n return {\n status,\n markets,\n positions,\n orders,\n loading,\n error,\n unavailable,\n refresh,\n };\n}\n","/**\n * HyperliquidView — the single GUI/XR data wrapper for the Hyperliquid surface.\n *\n * It owns the live data (status + markets + the agent's own positions + open\n * orders, plus a background poll via {@link useHyperliquidState}) and renders\n * the one presentational {@link HyperliquidSpatialView} inside a\n * {@link SpatialSurface}. Omitting the `modality` prop lets `SpatialSurface`\n * auto-detect GUI vs XR via `window.__elizaXRContext`, so the SAME component\n * serves both surfaces. The TUI surface renders the same\n * `HyperliquidSpatialView` through the terminal registry (see\n * `register-terminal-view.tsx`).\n */\n\nimport { SpatialSurface } from \"@elizaos/ui/spatial\";\nimport { useCallback } from \"react\";\nimport {\n type HyperliquidSnapshot,\n HyperliquidSpatialView,\n} from \"./components/HyperliquidSpatialView.tsx\";\nimport { useHyperliquidState } from \"./useHyperliquidState.ts\";\n\n/** Return to the apps/home surface via the navigation bus. */\nfunction navigateHome(): void {\n if (typeof window === \"undefined\") return;\n window.dispatchEvent(\n new CustomEvent(\"eliza:navigate:view\", {\n detail: { viewId: \"home\", viewPath: \"/\" },\n }),\n );\n}\n\nexport function HyperliquidView() {\n const { status, markets, positions, orders, loading, error, unavailable, refresh } =\n useHyperliquidState();\n\n const onAction = useCallback(\n (action: string) => {\n switch (action) {\n case \"refresh\":\n void refresh();\n return;\n case \"back\":\n navigateHome();\n return;\n }\n },\n [refresh],\n );\n\n const snapshot: HyperliquidSnapshot = {\n status: {\n publicReadReady: status?.publicReadReady ?? false,\n signerReady: status?.signerReady ?? false,\n executionReady: status?.executionReady ?? false,\n credentialMode: status?.credentialMode ?? \"none\",\n accountAddress: status?.account.address ?? null,\n vaultReady: status?.vault.ready ?? false,\n executionBlockedReason: status?.executionBlockedReason ?? null,\n vaultGuidance: status?.vault.guidance ?? null,\n },\n markets: markets?.markets ?? [],\n positions: positions?.positions ?? [],\n orders: orders?.orders ?? [],\n positionsBlockedReason: positions?.readBlockedReason ?? null,\n ordersBlockedReason: orders?.readBlockedReason ?? null,\n unavailable,\n loading,\n error,\n };\n\n return (\n <SpatialSurface>\n <HyperliquidSpatialView snapshot={snapshot} onAction={onAction} />\n </SpatialSurface>\n );\n}\n"],"mappings":";;;;;;AAeA,IAAM,IACJ,EAAY;AAEd,EAAqB,oBAAoB,iBAAkB;CACzD,OAAO,KAAK,MAAM,yBAAyB;AAC7C,GAEA,EAAqB,qBAAqB,iBAAkB;CAC1D,OAAO,KAAK,MAAM,0BAA0B;AAC9C,GAEA,EAAqB,uBAAuB,iBAAkB;CAC5D,OAAO,KAAK,MAAM,4BAA4B;AAChD,GAEA,EAAqB,oBAAoB,iBAAkB;CACzD,OAAO,KAAK,MAAM,yBAAyB;AAC7C;;;AChBA,eAAsB,IAKnB;CACD,IAAM,IAAoB,GACpB,IAAS,MAAM,EAAkB,kBAAkB;CACzD,IAAI,CAAC,EAAO,iBACV,OAAO;EAAE;EAAQ,SAAS;EAAM,WAAW;EAAM,QAAQ;CAAK;CAEhE,IAAM,CAAC,GAAS,GAAW,KAAU,MAAM,QAAQ,IAAI;EACrD,EAAkB,mBAAmB;EACrC,EAAkB,qBAAqB;EACvC,EAAkB,kBAAkB;CACtC,CAAC;CACD,OAAO;EAAE;EAAQ;EAAS;EAAW;CAAO;AAC9C;AAEA,eAAe,EACb,GACA,GACkB;CAClB,IAAM,IAAW,MAAM,MAAM,GAAM;EACjC,QAAQ;EACR,SAAS,EAAE,gBAAgB,mBAAmB;EAC9C,MAAM,KAAK,UAAU,CAAI;CAC3B,CAAC,GACK,IAAO,MAAM,EAAS,KAAK,EAAE,aAAa,CAAC,EAAE;CACnD,IAAI,CAAC,EAAS,IAAI;EAChB,IAAM,IACJ,OAAO,KAAS,YAChB,KACA,WAAW,KACX,OAAO,EAAK,SAAU,WAClB,EAAK,QACL,mCAAmC,EAAS;EAClD,MAAU,MAAM,CAAO;CACzB;CACA,OAAO;AACT;AAEA,eAAsB,EACpB,GACA,GACkB;CAClB,IAAI,MAAe,8BAA8B;EAC/C,IAAM,IAAQ,MAAM,EAAwB;EAC5C,OAAO;GACL,UAAU;GACV,QAAQ,EAAM;GACd,SACE,EAAM,SAAS,QAAQ,MACrB,GACA,OAAO,GAAQ,SAAU,WAAW,EAAO,QAAQ,EACrD,KAAK,CAAC;GACR,WAAW,EAAM;GACjB,QAAQ,EAAM;EAChB;CACF;CAEA,IAAI,MAAe,+BAA+B;EAChD,IAAM,IACJ,OAAO,GAAQ,QAAS,WAAW,EAAO,KAAK,KAAK,EAAE,YAAY,IAAI;EACxE,IAAI,CAAC,GAAM,MAAU,MAAM,kBAAkB;EAE7C,OAAO;GACL,UAAU;GACV,SACE,MAJgB,EAAwB,GAIlC,SAAS,QAAQ,MACpB,MAAW,EAAO,KAAK,YAAY,MAAM,CAC5C,KAAK;EACT;CACF;CAEA,IAAI,MAAe,wCACjB,OAAO;EACL,UAAU;EACV,QAAQ,MAAM,EAAuB,gCAAgC;GACnE,MAAM,OAAO,GAAQ,QAAS,WAAW,EAAO,OAAO;GACvD,MAAM,OAAO,GAAQ,QAAS,WAAW,EAAO,OAAO;GACvD,MAAM,OAAO,GAAQ,QAAS,WAAW,EAAO,OAAO;EACzD,CAAC;CACH;CAGF,MAAU,MAAM,2BAA2B,EAAW,EAAE;AAC1D;;;AC7CA,SAAS,EAAoB,GAAyC;CACpE,QAAQ,GAAR;EACE,KAAK,iBACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAEA,SAAS,EAAc,GAA6B;CAClD,OAAO,IAAQ,YAAY;AAC7B;AAEA,SAAS,EAAc,GAAwB;CAC7C,OAAO,IAAQ,SAAS;AAC1B;AAEA,SAAS,EAAW,EAAE,UAAO,YAA4C;CACvE,OACE,kBAAC,GAAD;EAAQ,KAAK;EAAG,OAAM;EAAS,MAAM;YAArC,CACE,kBAAC,GAAD;GAAM,MAAM,EAAc,CAAK;GAAG,MAAM;aACrC,EAAc,CAAK;EAChB,CAAA,GACN,kBAAC,GAAD;GAAM,MAAA;GAAK,MAAM;GAAG,MAAM;aACvB;EACG,CAAA,CACA;;AAEZ;AAEA,SAAS,EAAa,GAAgC;CAGpD,OAFK,IACD,EAAQ,UAAU,KAAW,IAC1B,GAAG,EAAQ,MAAM,GAAG,CAAC,EAAE,IAAI,EAAQ,MAAM,EAAE,MAF7B;AAGvB;AAQA,SAAgB,EAAuB,EACrC,aACA,eAC8B;CAC9B,IAAM,KAAY,YAAyB,IAAW,CAAM,GACtD,EAAE,cAAW,GACb,IAAe,EAAQ,EAAO;CA0BpC,OAxBI,EAAS,cAET,kBAAC,GAAD;EAAM,KAAK;EAAG,SAAS;YAAvB;GACE,kBAAC,GAAD;IAAM,MAAK;IAAQ,OAAM;cAAS;GAE5B,CAAA;GACN,kBAAC,GAAD,CAAU,CAAA;GACV,kBAAC,GAAD;IAAQ,KAAK;IAAG,MAAA;cAAhB,CACE,kBAAC,GAAD;KAAQ,MAAM;KAAG,OAAM;KAAU,SAAS,EAAS,SAAS;eAAG;IAEvD,CAAA,GACR,kBAAC,GAAD;KACE,SAAQ;KACR,MAAK;KACL,OAAM;KACN,SAAS,EAAS,MAAM;eACzB;IAEO,CAAA,CACF;;EACJ;MAKR,kBAAC,GAAD;EAAM,KAAK;EAAG,SAAS;YAAvB;GACE,kBAAC,GAAD;IAAQ,KAAK;IAAG,OAAM;cAAtB,CACE,kBAAC,GAAD;KACE,OAAM;KACN,MAAM,EAAO,kBAAkB,YAAY;KAC3C,MAAM;eAEL,EAAS,UACN,YACA,EAAO,kBACL,eACA;IACF,CAAA,GACN,kBAAC,GAAD;KAAM,OAAM;KAAU,MAAK;KAAQ,MAAM;eAAzC;MACG,EAAS,QAAQ;MAAO;MAAK,EAAS,UAAU;MAAO;MAAI;MAC3D,EAAS,OAAO;MAAO;KACpB;MACA;;GAEP,EAAS,QACR,kBAAC,GAAD;IAAM,MAAK;IAAS,OAAM;cACvB,EAAS;GACN,CAAA,IACJ;GAEJ,kBAAC,GAAD,EAAS,OAAM,SAAU,CAAA;GACzB,kBAAC,GAAD;IAAQ,KAAK;cAAb;KACE,kBAAC,GAAD;MAAY,OAAM;MAAQ,OAAO,EAAO;KAAkB,CAAA;KAC1D,kBAAC,GAAD;MACE,OAAO,EAAoB,EAAO,cAAc;MAChD,OAAO,EAAO;KACf,CAAA;KACD,kBAAC,GAAD;MAAY,OAAM;MAAU,OAAO;KAAe,CAAA;IAC5C;;GAEP,EAAO,yBACN,kBAAC,GAAD;IAAM,OAAM;IAAU,MAAK;cACxB,EAAO;GACJ,CAAA,IACJ;GAEH,CAAC,EAAO,cACT,EAAO,mBAAmB,eAC1B,EAAO,gBACL,kBAAC,GAAD;IAAM,OAAM;IAAU,MAAK;cACxB,EAAO;GACJ,CAAA,IACJ;GAEJ,kBAAC,GAAD,EAAS,OAAM,UAAW,CAAA;GACzB,EAAS,QAAQ,WAAW,IAC3B,kBAAC,GAAD;IAAM,MAAK;IAAQ,OAAM;IAAS,OAAM;cAAU;GAE5C,CAAA,IAEN,kBAAC,GAAD;IAAM,KAAK;cACR,EAAS,QAAQ,MAAM,GAAG,EAAE,EAAE,KAAK,MAClC,kBAAC,GAAD;KAEE,KAAK;KACL,OAAM;KACN,OAAO,UAAU,EAAO;eAJ1B;MAME,kBAAC,GAAD;OACE,MAAA;OACA,MAAM;OACN,MAAM;OACN,MAAM,EAAO,aAAa,UAAU;iBAEnC,EAAO;MACJ,CAAA;MACN,kBAAC,GAAD;OAAM,OAAM;OAAU,MAAK;OAAU,MAAM;iBACxC,EAAO,cAAc,GAAG,EAAO,YAAY,KAAK;MAC7C,CAAA;MACN,kBAAC,GAAD;OAAM,OAAM;OAAU,MAAK;OAAQ,MAAM;iBAAzC;QAAgD;QAC3C,EAAO;QACT,EAAO,eAAe,SAAS;OAC5B;;KACA;OApBD,EAAO,IAoBN,CACT;GACG,CAAA;GAGR,kBAAC,GAAD,EAAS,OAAM,UAAW,CAAA;GAC1B,kBAAC,GAAD;IAAQ,KAAK;IAAG,OAAM;cAAtB,CACE,kBAAC,GAAD;KAAM,OAAM;KAAU,MAAK;KAAQ,MAAM;KAAG,MAAM;eAC/C,EAAa,EAAO,cAAc;IAC/B,CAAA,GACN,kBAAC,GAAD;KACE,OAAM;KACN,MAAM,EAAO,iBAAiB,YAAY;KAC1C,MAAM;eAEL,EAAO,iBAAiB,eAAe;IACpC,CAAA,CACA;;GAER,kBAAC,GAAD;IAAM,OAAM;IAAU,MAAK;cAAU;GAE/B,CAAA;GACL,EAAS,yBACR,kBAAC,GAAD;IAAM,OAAM;IAAU,MAAK;IAAU,OAAM;cACxC,EAAS;GACN,CAAA,IACJ,EAAS,UAAU,WAAW,IAChC,kBAAC,GAAD;IAAM,MAAK;IAAQ,OAAM;cAAU;GAE7B,CAAA,IAEN,kBAAC,GAAD;IAAM,KAAK;cACR,EAAS,UAAU,MAAM,GAAG,CAAC,EAAE,KAAK,MACnC,kBAAC,GAAD;KAEE,KAAK;KACL,OAAM;KACN,OAAO,YAAY,EAAS;eAJ9B;MAME,kBAAC,GAAD;OAAM,MAAA;OAAK,MAAM;OAAG,MAAM;iBACvB,EAAS;MACN,CAAA;MACN,kBAAC,GAAD;OAAM,OAAM;OAAU,MAAK;OAAQ,MAAM;iBAAzC,CAAgD,OAC1C,EAAS,IACT;;MACL,EAAS,gBACR,kBAAC,GAAD;OACE,OAAM;OACN,MACE,EAAS,cAAc,KAAK,EAAE,WAAW,GAAG,IACxC,WACA;OAEN,MAAM;iBAEL,EAAS;MACN,CAAA,IACJ;KACE;OAxBD,EAAS,IAwBR,CACT;GACG,CAAA;GAGR,kBAAC,GAAD;IAAM,OAAM;IAAU,MAAK;cAAU;GAE/B,CAAA;GACL,EAAS,sBACR,kBAAC,GAAD;IAAM,OAAM;IAAU,MAAK;IAAU,OAAM;cACxC,EAAS;GACN,CAAA,IACJ,EAAS,OAAO,WAAW,IAC7B,kBAAC,GAAD;IAAM,MAAK;IAAQ,OAAM;cAAU;GAE7B,CAAA,IAEN,kBAAC,GAAD;IAAM,KAAK;cACR,EAAS,OAAO,MAAM,GAAG,CAAC,EAAE,KAAK,MAChC,kBAAC,GAAD;KAEE,KAAK;KACL,OAAM;KACN,OAAO,SAAS,EAAM;eAJxB;MAME,kBAAC,GAAD;OAAM,MAAA;OAAK,MAAM;iBACd,EAAM;MACH,CAAA;MACN,kBAAC,GAAD;OACE,OAAM;OACN,MACE,EAAM,KAAK,YAAY,EAAE,WAAW,GAAG,IACnC,YACA;OAEN,MAAM;iBAEL,EAAM;MACH,CAAA;MACN,kBAAC,GAAD;OAAM,OAAM;OAAU,MAAK;OAAQ,MAAM;OAAG,MAAM;iBAAlD;QACG,EAAM;QAAK;QAAI,EAAM;OAClB;;MACL,EAAM,aACL,kBAAC,GAAD;OAAM,OAAM;OAAU,MAAK;OAAU,MAAM;iBAAO;MAE5C,CAAA,IACJ;KACE;OA3BD,EAAM,GA2BL,CACT;GACG,CAAA;GAGR,kBAAC,GAAD,CAAU,CAAA;GACV,kBAAC,GAAD;IAAQ,KAAK;IAAG,MAAA;cAAhB,CACE,kBAAC,GAAD;KAAQ,MAAM;KAAG,OAAM;KAAU,SAAS,EAAS,SAAS;eAAG;IAEvD,CAAA,GACR,kBAAC,GAAD;KACE,SAAQ;KACR,MAAK;KACL,OAAM;KACN,SAAS,EAAS,MAAM;eACzB;IAEO,CAAA,CACF;;EACJ;;AAEV;;;ACtTA,SAAgB,IAAwC;CACtD,IAAM,CAAC,GAAQ,KAAa,EAA2C,IAAI,GACrE,CAAC,GAAS,KAAc,EAC5B,IACF,GACM,CAAC,GAAW,KAChB,EAA8C,IAAI,GAC9C,CAAC,GAAQ,KAAa,EAA2C,IAAI,GACrE,CAAC,GAAS,KAAc,EAAS,EAAK,GACtC,CAAC,GAAO,KAAY,EAAwB,IAAI,GAChD,CAAC,GAAa,KAAkB,EAAS,EAAK,GAE9C,IAAU,EAAY,YAAY;EAGtC,AAFA,EAAW,EAAI,GACf,EAAS,IAAI,GACb,EAAe,EAAK;EACpB,IAAM,IAAoB;EAC1B,IAAI;GACF,IAAM,IAAa,MAAM,EAAkB,kBAAkB;GAG7D,IAFA,EAAU,CAAU,GAEhB,CAAC,EAAW,iBAAiB;IAG/B,AAFA,EAAW,IAAI,GACf,EAAa,IAAI,GACjB,EAAU,IAAI;IACd;GACF;GAEA,IAAM,CAAC,GAAa,GAAe,KAAc,MAAM,QAAQ,IAAI;IACjE,EAAkB,mBAAmB;IACrC,EAAkB,qBAAqB;IACvC,EAAkB,kBAAkB;GACtC,CAAC;GAGD,AAFA,EAAW,CAAW,GACtB,EAAa,CAAa,GAC1B,EAAU,CAAU;EACtB,SAAS,GAAQ;GAMf,IACE,aAAkB,MACjB,EAAO,WAAW,OAAO,EAAO,WAAW,MAC5C;IAKA,AAJA,EAAU,IAAI,GACd,EAAW,IAAI,GACf,EAAa,IAAI,GACjB,EAAU,IAAI,GACd,EAAe,EAAI;IACnB;GACF;GACA,EACE,aAAkB,QAAQ,EAAO,UAAU,4BAC7C;EACF,UAAU;GACR,EAAW,EAAK;EAClB;CACF,GAAG,CAAC,CAAC;CAQL,OANA,QAAgB;EACd,EAAa;EACb,IAAM,IAAW,kBAAkB,KAAK,EAAQ,GAAG,IAAK;EACxD,aAAa,cAAc,CAAQ;CACrC,GAAG,CAAC,CAAO,CAAC,GAEL;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;;ACpFA,SAAS,IAAqB;CACxB,OAAO,SAAW,OACtB,OAAO,cACL,IAAI,YAAY,uBAAuB,EACrC,QAAQ;EAAE,QAAQ;EAAQ,UAAU;CAAI,EAC1C,CAAC,CACH;AACF;AAEA,SAAgB,IAAkB;CAChC,IAAM,EAAE,WAAQ,YAAS,cAAW,WAAQ,YAAS,UAAO,gBAAa,eACvE,EAAoB,GAEhB,IAAW,GACd,MAAmB;EAClB,QAAQ,GAAR;GACE,KAAK;IACH,EAAa;IACb;GACF,KAAK;IACH,EAAa;IACb;EACJ;CACF,GACA,CAAC,CAAO,CACV;CAuBA,OACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EAAkC,UAAA;GAtBpC,QAAQ;IACN,iBAAiB,GAAQ,mBAAmB;IAC5C,aAAa,GAAQ,eAAe;IACpC,gBAAgB,GAAQ,kBAAkB;IAC1C,gBAAgB,GAAQ,kBAAkB;IAC1C,gBAAgB,GAAQ,QAAQ,WAAW;IAC3C,YAAY,GAAQ,MAAM,SAAS;IACnC,wBAAwB,GAAQ,0BAA0B;IAC1D,eAAe,GAAQ,MAAM,YAAY;GAC3C;GACA,SAAS,GAAS,WAAW,CAAC;GAC9B,WAAW,GAAW,aAAa,CAAC;GACpC,QAAQ,GAAQ,UAAU,CAAC;GAC3B,wBAAwB,GAAW,qBAAqB;GACxD,qBAAqB,GAAQ,qBAAqB;GAClD;GACA;GACA;EAKoC;EAAoB;CAAW,CAAA,EACnD,CAAA;AAEpB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elizaos/plugin-hyperliquid-app",
|
|
3
|
-
"version": "2.0.3-beta.
|
|
3
|
+
"version": "2.0.3-beta.7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -32,10 +32,10 @@
|
|
|
32
32
|
}
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@elizaos/app-core": "2.0.3-beta.
|
|
36
|
-
"@elizaos/core": "2.0.3-beta.
|
|
37
|
-
"@elizaos/shared": "2.0.3-beta.
|
|
38
|
-
"@elizaos/ui": "2.0.3-beta.
|
|
35
|
+
"@elizaos/app-core": "2.0.3-beta.7",
|
|
36
|
+
"@elizaos/core": "2.0.3-beta.7",
|
|
37
|
+
"@elizaos/shared": "2.0.3-beta.7",
|
|
38
|
+
"@elizaos/ui": "2.0.3-beta.7",
|
|
39
39
|
"lucide-react": "^1.0.0",
|
|
40
40
|
"react": "^19.0.0"
|
|
41
41
|
},
|
|
@@ -74,5 +74,5 @@
|
|
|
74
74
|
"vite": "^8.0.0",
|
|
75
75
|
"vitest": "^4.1.5"
|
|
76
76
|
},
|
|
77
|
-
"gitHead": "
|
|
77
|
+
"gitHead": "61094f10458d11055c75b3dd0bae374e3f66bac5"
|
|
78
78
|
}
|