@elizaos/plugin-vincent 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/TradingProfileCard.d.ts +8 -0
- package/dist/TradingProfileCard.d.ts.map +1 -0
- package/dist/TradingProfileCard.js +70 -0
- package/dist/TradingProfileCard.js.map +1 -0
- package/dist/TradingStrategyPanel.d.ts +10 -0
- package/dist/TradingStrategyPanel.d.ts.map +1 -0
- package/dist/TradingStrategyPanel.js +133 -0
- package/dist/TradingStrategyPanel.js.map +1 -0
- package/dist/VincentAppView.d.ts +4 -0
- package/dist/VincentAppView.d.ts.map +1 -0
- package/dist/VincentAppView.helpers.d.ts +10 -0
- package/dist/VincentAppView.helpers.d.ts.map +1 -0
- package/dist/VincentAppView.helpers.js +21 -0
- package/dist/VincentAppView.helpers.js.map +1 -0
- package/dist/VincentAppView.interact.d.ts +2 -0
- package/dist/VincentAppView.interact.d.ts.map +1 -0
- package/dist/VincentAppView.interact.js +45 -0
- package/dist/VincentAppView.interact.js.map +1 -0
- package/dist/VincentAppView.js +145 -0
- package/dist/VincentAppView.js.map +1 -0
- package/dist/VincentConnectionCard.d.ts +9 -0
- package/dist/VincentConnectionCard.d.ts.map +1 -0
- package/dist/VincentConnectionCard.js +121 -0
- package/dist/VincentConnectionCard.js.map +1 -0
- package/dist/VincentView.d.ts +13 -0
- package/dist/VincentView.d.ts.map +1 -0
- package/dist/VincentView.js +86 -0
- package/dist/VincentView.js.map +1 -0
- package/dist/WalletStatusCard.d.ts +12 -0
- package/dist/WalletStatusCard.d.ts.map +1 -0
- package/dist/WalletStatusCard.js +203 -0
- package/dist/WalletStatusCard.js.map +1 -0
- package/dist/client.d.ts +21 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +31 -0
- package/dist/client.js.map +1 -0
- package/dist/components/VincentSpatialView.d.ts +32 -0
- package/dist/components/VincentSpatialView.d.ts.map +1 -0
- package/dist/components/VincentSpatialView.js +191 -0
- package/dist/components/VincentSpatialView.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +14 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +98 -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 +28 -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 +6 -0
- package/dist/register.js.map +1 -0
- package/dist/routes.d.ts +24 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +429 -0
- package/dist/routes.js.map +1 -0
- package/dist/ui.d.ts +11 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +16 -0
- package/dist/ui.js.map +1 -0
- package/dist/useVincentDashboard.d.ts +21 -0
- package/dist/useVincentDashboard.d.ts.map +1 -0
- package/dist/useVincentDashboard.js +105 -0
- package/dist/useVincentDashboard.js.map +1 -0
- package/dist/useVincentState.d.ts +15 -0
- package/dist/useVincentState.d.ts.map +1 -0
- package/dist/useVincentState.js +116 -0
- package/dist/useVincentState.js.map +1 -0
- package/dist/views/bundle.js +500 -0
- package/dist/views/bundle.js.map +1 -0
- package/dist/vincent-app.d.ts +10 -0
- package/dist/vincent-app.d.ts.map +1 -0
- package/dist/vincent-app.js +16 -0
- package/dist/vincent-app.js.map +1 -0
- package/dist/vincent-contracts.d.ts +52 -0
- package/dist/vincent-contracts.d.ts.map +1 -0
- package/dist/vincent-contracts.js +8 -0
- package/dist/vincent-contracts.js.map +1 -0
- package/dist/vincent-view-bundle.d.ts +3 -0
- package/dist/vincent-view-bundle.d.ts.map +1 -0
- package/dist/vincent-view-bundle.js +7 -0
- package/dist/vincent-view-bundle.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.js","names":[],"sources":["../../src/client.ts","../../src/VincentAppView.helpers.ts","../../src/VincentAppView.interact.ts","../../src/components/VincentSpatialView.tsx","../../src/useVincentDashboard.ts","../../src/useVincentState.ts","../../src/VincentView.tsx"],"sourcesContent":["/**\n * Vincent domain methods — OAuth status, dashboard, and strategy settings.\n */\n\n/**\n * Frontend client extensions are installed on the UI package's ElizaClient\n * prototype and exposed through a locally typed client wrapper.\n */\nimport { client as baseClient, ElizaClient } from \"@elizaos/ui\";\nimport type {\n VincentStartLoginResponse,\n VincentStatusResponse,\n VincentStrategyResponse,\n VincentStrategyUpdateRequest,\n VincentStrategyUpdateResponse,\n VincentTradingProfileResponse,\n} from \"./vincent-contracts\";\n\nexport interface VincentClientMethods {\n vincentStartLogin(appName?: string): Promise<VincentStartLoginResponse>;\n vincentStatus(): Promise<VincentStatusResponse>;\n vincentDisconnect(): Promise<{ ok: boolean }>;\n vincentStrategy(): Promise<VincentStrategyResponse>;\n vincentUpdateStrategy(\n request: VincentStrategyUpdateRequest,\n ): Promise<VincentStrategyUpdateResponse>;\n vincentTradingProfile(): Promise<VincentTradingProfileResponse>;\n}\n\nconst vincentPrototype = ElizaClient.prototype as ElizaClient &\n VincentClientMethods;\n\n// ── Implementation ────────────────────────────────────────────────────\n\nvincentPrototype.vincentStartLogin = async function (appName?: string) {\n return this.fetch(\"/api/vincent/start-login\", {\n method: \"POST\",\n body: JSON.stringify({ appName: appName ?? \"Eliza\" }),\n });\n};\n\nvincentPrototype.vincentStatus = async function () {\n return this.fetch(\"/api/vincent/status\");\n};\n\nvincentPrototype.vincentDisconnect = async function () {\n return this.fetch(\"/api/vincent/disconnect\", { method: \"POST\" });\n};\n\nvincentPrototype.vincentStrategy = async function () {\n return this.fetch(\"/api/vincent/strategy\");\n};\n\nvincentPrototype.vincentUpdateStrategy = async function (\n request: VincentStrategyUpdateRequest,\n) {\n return this.fetch(\"/api/vincent/strategy\", {\n method: \"POST\",\n body: JSON.stringify(request),\n });\n};\n\nvincentPrototype.vincentTradingProfile = async function () {\n return this.fetch(\"/api/vincent/trading-profile\");\n};\n\nexport const vincentClient = baseClient as typeof baseClient &\n VincentClientMethods;\n","// Shared data helper for the Vincent terminal `interact` capability handler\n// (in VincentAppView.interact.ts), which loads the full dashboard snapshot for\n// the terminal-vincent-state / start-login / disconnect / update-strategy\n// capabilities. Kept out of the .tsx so that file exports only React components\n// and stays Fast-Refresh-compatible in dev.\nimport type { WalletAddresses, WalletBalancesResponse } from \"@elizaos/shared\";\nimport { vincentClient } from \"./client\";\nimport type {\n VincentStatusResponse,\n VincentStrategyResponse,\n VincentTradingProfileResponse,\n} from \"./vincent-contracts\";\n\nexport async function loadVincentTuiState(): Promise<{\n status: VincentStatusResponse;\n walletAddresses: WalletAddresses | null;\n walletBalances: WalletBalancesResponse | null;\n strategy: VincentStrategyResponse;\n tradingProfile: VincentTradingProfileResponse;\n}> {\n const status = await vincentClient.vincentStatus();\n const [walletAddresses, walletBalances, strategy, tradingProfile] =\n await Promise.allSettled([\n vincentClient.getWalletAddresses(),\n vincentClient.getWalletBalances(),\n vincentClient.vincentStrategy(),\n vincentClient.vincentTradingProfile(),\n ]);\n\n return {\n status,\n walletAddresses:\n walletAddresses.status === \"fulfilled\" ? walletAddresses.value : null,\n walletBalances:\n walletBalances.status === \"fulfilled\" ? walletBalances.value : null,\n strategy:\n strategy.status === \"fulfilled\"\n ? strategy.value\n : { connected: status.connected, strategy: null },\n tradingProfile:\n tradingProfile.status === \"fulfilled\"\n ? tradingProfile.value\n : { connected: status.connected, profile: null },\n };\n}\n","// View-bundle `interact` capability handler, split out of VincentAppView.tsx\n// so that file exports only React components and stays Fast-Refresh-compatible\n// (Vite would full-reload a component file that also exports a plain function).\n// The view bundle re-exports `interact` via ./vincent-view-bundle.ts.\nimport { vincentClient } from \"./client\";\nimport { loadVincentTuiState } from \"./VincentAppView.helpers\";\nimport type { VincentStrategyUpdateRequest } from \"./vincent-contracts\";\n\nexport async function interact(\n capability: string,\n params?: Record<string, unknown>,\n): Promise<unknown> {\n if (capability === \"terminal-vincent-state\") {\n return { viewType: \"tui\", ...(await loadVincentTuiState()) };\n }\n\n if (capability === \"terminal-vincent-start-login\") {\n return {\n viewType: \"tui\",\n login: await vincentClient.vincentStartLogin(\n typeof params?.appName === \"string\" ? params.appName : \"Eliza\",\n ),\n };\n }\n\n if (capability === \"terminal-vincent-disconnect\") {\n return {\n viewType: \"tui\",\n disconnected: await vincentClient.vincentDisconnect(),\n };\n }\n\n if (capability === \"terminal-vincent-update-strategy\") {\n const request: VincentStrategyUpdateRequest = {};\n if (typeof params?.strategy === \"string\") {\n request.strategy =\n params.strategy as VincentStrategyUpdateRequest[\"strategy\"];\n }\n if (params?.params && typeof params.params === \"object\") {\n request.params = params.params as Record<string, unknown>;\n }\n if (typeof params?.intervalSeconds === \"number\") {\n request.intervalSeconds = params.intervalSeconds;\n }\n if (typeof params?.dryRun === \"boolean\") {\n request.dryRun = params.dryRun;\n }\n return {\n viewType: \"tui\",\n update: await vincentClient.vincentUpdateStrategy(request),\n };\n }\n\n throw new Error(`Unsupported capability \"${capability}\"`);\n}\n","/**\n * VincentSpatialView - the Vincent trading 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 wallet and Vincent contracts, so it is safe to render in the Node agent\n * process where the terminal lives (no client/Capacitor runtime import).\n */\n\nimport type { WalletAddresses, WalletBalancesResponse } from \"@elizaos/shared\";\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 VincentStrategy,\n VincentTradingProfile,\n} from \"../vincent-contracts.ts\";\n\nexport interface VincentSnapshot {\n vincentConnected: boolean;\n vincentConnectedAt: number | null;\n walletAddresses: WalletAddresses | null;\n walletBalances: WalletBalancesResponse | null;\n strategy: VincentStrategy | null;\n tradingProfile: VincentTradingProfile | null;\n loading?: boolean;\n error?: string | null;\n}\n\nfunction shortAddress(address: string | null): string {\n if (!address) return \"not set\";\n if (address.length <= 14) return address;\n return `${address.slice(0, 6)}..${address.slice(-4)}`;\n}\n\nfunction strategyTone(strategy: VincentStrategy | null): SpatialTone {\n if (!strategy) return \"muted\";\n if (strategy.running) return \"success\";\n return \"warning\";\n}\n\nfunction pnlTone(totalPnl: string): SpatialTone {\n const value = Number.parseFloat(totalPnl);\n if (!Number.isFinite(value) || value === 0) return \"muted\";\n return value > 0 ? \"success\" : \"danger\";\n}\n\nfunction formatPnl(totalPnl: string): string {\n const value = Number.parseFloat(totalPnl);\n if (!Number.isFinite(value)) return totalPnl;\n const sign = value > 0 ? \"+\" : \"\";\n return `${sign}${totalPnl}`;\n}\n\nfunction formatWinRate(winRate: number): string {\n if (!Number.isFinite(winRate)) return \"--\";\n return `${Math.round(winRate * 100)}%`;\n}\n\nexport interface VincentSpatialViewProps {\n snapshot: VincentSnapshot;\n /** Dispatch by agent id: `connect`, `disconnect`, `refresh`, `start`, `stop`. */\n onAction?: (action: string) => void;\n}\n\nexport function VincentSpatialView({\n snapshot,\n onAction,\n}: VincentSpatialViewProps) {\n const dispatch = (action: string) => () => onAction?.(action);\n const {\n vincentConnected,\n walletAddresses,\n strategy,\n tradingProfile,\n loading,\n error,\n } = snapshot;\n\n return (\n <Card gap={1} padding={1}>\n <HStack gap={1} align=\"center\">\n <Text\n style=\"caption\"\n tone={vincentConnected ? \"success\" : \"muted\"}\n grow={1}\n >\n {vincentConnected ? \"connected\" : \"disconnected\"}\n </Text>\n <Text style=\"caption\" tone=\"muted\">\n {loading ? \"loading\" : \"trading\"}\n </Text>\n </HStack>\n\n {error ? (\n <Text tone=\"danger\" style=\"caption\">\n {error}\n </Text>\n ) : null}\n\n <Divider label=\"access\" />\n {vincentConnected ? (\n <List gap={0}>\n <HStack gap={1} align=\"center\" agent=\"wallet-evm\">\n <Text style=\"caption\" tone=\"muted\" width={8}>\n evm\n </Text>\n <Text grow={1} wrap={false}>\n {shortAddress(walletAddresses?.evmAddress ?? null)}\n </Text>\n {walletAddresses?.evmAddress ? (\n <Button\n variant=\"ghost\"\n tone=\"default\"\n agent=\"copy-evm\"\n onPress={dispatch(\"copy-evm\")}\n >\n Copy\n </Button>\n ) : null}\n </HStack>\n <HStack gap={1} align=\"center\" agent=\"wallet-solana\">\n <Text style=\"caption\" tone=\"muted\" width={8}>\n sol\n </Text>\n <Text grow={1} wrap={false}>\n {shortAddress(walletAddresses?.solanaAddress ?? null)}\n </Text>\n {walletAddresses?.solanaAddress ? (\n <Button\n variant=\"ghost\"\n tone=\"default\"\n agent=\"copy-solana\"\n onPress={dispatch(\"copy-solana\")}\n >\n Copy\n </Button>\n ) : null}\n </HStack>\n </List>\n ) : (\n <Text tone=\"muted\" style=\"caption\">\n Connect Vincent to trade on Hyperliquid and Polymarket.\n </Text>\n )}\n <HStack gap={1} wrap>\n {vincentConnected ? (\n <Button\n variant=\"outline\"\n tone=\"danger\"\n grow={1}\n agent=\"disconnect\"\n onPress={dispatch(\"disconnect\")}\n >\n Disconnect\n </Button>\n ) : (\n <Button grow={1} agent=\"connect\" onPress={dispatch(\"connect\")}>\n Connect\n </Button>\n )}\n <Button\n variant=\"ghost\"\n tone=\"default\"\n agent=\"refresh\"\n onPress={dispatch(\"refresh\")}\n >\n Refresh\n </Button>\n </HStack>\n\n <Divider label=\"strategy\" />\n {strategy ? (\n <VStack gap={0}>\n <HStack gap={1} align=\"center\">\n <Text bold grow={1} wrap={false}>\n {strategy.name}\n </Text>\n <Text style=\"caption\" tone={strategyTone(strategy)}>\n {strategy.running ? \"running\" : \"idle\"}\n </Text>\n </HStack>\n <HStack gap={1} align=\"center\">\n <Text style=\"caption\" tone=\"muted\" grow={1} wrap={false}>\n {strategy.venues.join(\", \") || \"no venues\"}\n </Text>\n <Text style=\"caption\" tone={strategy.dryRun ? \"warning\" : \"muted\"}>\n {strategy.dryRun ? \"dry-run\" : \"live\"}\n </Text>\n </HStack>\n <Text style=\"caption\" tone=\"muted\">\n interval {strategy.intervalSeconds}s\n </Text>\n {tradingProfile ? (\n <List gap={0}>\n <HStack gap={1} align=\"center\">\n <Text style=\"caption\" tone=\"muted\" grow={1}>\n pnl\n </Text>\n <Text\n style=\"caption\"\n tone={pnlTone(tradingProfile.totalPnl)}\n bold\n >\n {formatPnl(tradingProfile.totalPnl)}\n </Text>\n </HStack>\n <HStack gap={1} align=\"center\">\n <Text style=\"caption\" tone=\"muted\" grow={1}>\n win rate\n </Text>\n <Text style=\"caption\">\n {formatWinRate(tradingProfile.winRate)}\n </Text>\n </HStack>\n <HStack gap={1} align=\"center\">\n <Text style=\"caption\" tone=\"muted\" grow={1}>\n swaps / vol24h\n </Text>\n <Text style=\"caption\">\n {tradingProfile.totalSwaps} / {tradingProfile.volume24h}\n </Text>\n </HStack>\n {tradingProfile.tokenBreakdown.length > 0 ? (\n <List gap={0}>\n {tradingProfile.tokenBreakdown.slice(0, 6).map((token) => (\n <HStack\n key={token.symbol}\n gap={1}\n align=\"center\"\n agent={`token-${token.symbol}`}\n >\n <Text bold width={10} wrap={false}>\n {token.symbol}\n </Text>\n <Text grow={1} tone={pnlTone(token.pnl)} wrap={false}>\n {formatPnl(token.pnl)}\n </Text>\n <Text style=\"caption\" tone=\"muted\">\n {token.swaps} swaps\n </Text>\n </HStack>\n ))}\n </List>\n ) : null}\n </List>\n ) : (\n <Text tone=\"muted\" style=\"caption\">\n No P&L\n </Text>\n )}\n <HStack gap={1} wrap>\n <Button\n variant=\"outline\"\n tone=\"default\"\n agent=\"open-vincent\"\n onPress={dispatch(\"open-vincent\")}\n >\n Open Vincent\n </Button>\n </HStack>\n </VStack>\n ) : (\n <Text tone=\"muted\" align=\"center\" style=\"caption\">\n None\n </Text>\n )}\n </Card>\n );\n}\n","/**\n * useVincentDashboard — aggregated data hook for the Vincent overlay app.\n *\n * Polls Vincent-specific endpoints every 15 s when connected, and fetches\n * the agent wallet addresses and balances for dashboard context.\n */\n\nimport type { WalletAddresses, WalletBalancesResponse } from \"@elizaos/shared\";\nimport { ApiError } from \"@elizaos/ui\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { vincentClient } from \"./client\";\nimport type {\n VincentStrategy,\n VincentTradingProfile,\n} from \"./vincent-contracts\";\n\nexport interface VincentDashboardState {\n vincentConnected: boolean;\n vincentConnectedAt: number | null;\n\n walletAddresses: WalletAddresses | null;\n walletBalances: WalletBalancesResponse | null;\n\n strategy: VincentStrategy | null;\n\n tradingProfile: VincentTradingProfile | null;\n\n loading: boolean;\n error: string | null;\n\n refresh: () => void;\n}\n\nconst POLL_INTERVAL_MS = 15_000;\n\nexport function useVincentDashboard(): VincentDashboardState {\n const [vincentConnected, setVincentConnected] = useState(false);\n const [vincentConnectedAt, setVincentConnectedAt] = useState<number | null>(\n null,\n );\n const [walletAddresses, setWalletAddresses] =\n useState<WalletAddresses | null>(null);\n const [walletBalances, setWalletBalances] =\n useState<WalletBalancesResponse | null>(null);\n const [strategy, setStrategy] = useState<VincentStrategy | null>(null);\n const [tradingProfile, setTradingProfile] =\n useState<VincentTradingProfile | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const mountedRef = useRef(true);\n\n const fetchAll = useCallback(async () => {\n try {\n // Always check Vincent OAuth status first\n const vincentStatusResult = await vincentClient.vincentStatus();\n if (!mountedRef.current) return;\n setVincentConnected(vincentStatusResult.connected);\n setVincentConnectedAt(vincentStatusResult.connectedAt);\n\n // Fetch internal wallet + Vincent data in parallel\n const [\n addressResult,\n balanceResult,\n strategyResult,\n tradingProfileResult,\n ] = await Promise.allSettled([\n vincentClient.getWalletAddresses(),\n vincentClient.getWalletBalances(),\n vincentClient.vincentStrategy(),\n vincentClient.vincentTradingProfile(),\n ]);\n\n if (!mountedRef.current) return;\n\n if (addressResult.status === \"fulfilled\") {\n setWalletAddresses(addressResult.value);\n }\n if (balanceResult.status === \"fulfilled\") {\n setWalletBalances(balanceResult.value);\n }\n if (strategyResult.status === \"fulfilled\") {\n setStrategy(strategyResult.value.strategy);\n }\n if (tradingProfileResult.status === \"fulfilled\") {\n setTradingProfile(tradingProfileResult.value.profile);\n }\n\n setError(null);\n } catch (err) {\n if (!mountedRef.current) return;\n // Vincent is an opt-in server-launch app: its routes only mount once the\n // app is launched. On the un-launched base agent the status call 404s,\n // which is the normal \"disconnected\" state — not a real error. Show the\n // Connect CTA instead of a hard error banner.\n if (err instanceof ApiError && err.status === 404) {\n setVincentConnected(false);\n setError(null);\n return;\n }\n setError(err instanceof Error ? err.message : \"Failed to load data\");\n } finally {\n if (mountedRef.current) setLoading(false);\n }\n }, []);\n\n // Initial load\n useEffect(() => {\n mountedRef.current = true;\n void fetchAll();\n return () => {\n mountedRef.current = false;\n };\n }, [fetchAll]);\n\n // Start polling when connected, stop when disconnected\n useEffect(() => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n if (vincentConnected) {\n intervalRef.current = setInterval(\n () => void fetchAll(),\n POLL_INTERVAL_MS,\n );\n }\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n }, [vincentConnected, fetchAll]);\n\n const refresh = useCallback(() => {\n setLoading(true);\n void fetchAll();\n }, [fetchAll]);\n\n return {\n vincentConnected,\n vincentConnectedAt,\n walletAddresses,\n walletBalances,\n strategy,\n tradingProfile,\n loading,\n error,\n refresh,\n };\n}\n","import { openExternalUrl } from \"@elizaos/ui\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { vincentClient } from \"./client\";\n\ninterface VincentStateParams {\n setActionNotice: (\n text: string,\n tone?: \"info\" | \"success\" | \"error\",\n ttlMs?: number,\n ) => void;\n t: (key: string, opts?: Record<string, unknown>) => string;\n}\n\nexport function useVincentState({ setActionNotice, t }: VincentStateParams) {\n const [vincentConnected, setVincentConnected] = useState(false);\n const [vincentLoginBusy, setVincentLoginBusy] = useState(false);\n const [vincentLoginError, setVincentLoginError] = useState<string | null>(\n null,\n );\n const [vincentConnectedAt, setVincentConnectedAt] = useState<number | null>(\n null,\n );\n const busyRef = useRef(false);\n const loginPollRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const pollVincentStatus = useCallback(async () => {\n try {\n const status = await vincentClient.vincentStatus();\n setVincentConnected(status.connected);\n setVincentConnectedAt(status.connectedAt);\n return status.connected;\n } catch {\n return false;\n }\n }, []);\n\n useEffect(() => {\n void pollVincentStatus();\n return () => {\n if (loginPollRef.current) {\n clearInterval(loginPollRef.current);\n loginPollRef.current = null;\n }\n };\n }, [pollVincentStatus]);\n\n const handleVincentLogin = useCallback(async () => {\n if (vincentConnected || busyRef.current || vincentLoginBusy) return;\n busyRef.current = true;\n setVincentLoginBusy(true);\n setVincentLoginError(null);\n\n try {\n const { authUrl } = await vincentClient.vincentStartLogin(\"Eliza\");\n await openExternalUrl(authUrl);\n\n if (loginPollRef.current) clearInterval(loginPollRef.current);\n let pollAttempts = 0;\n const maxPollAttempts = 24;\n loginPollRef.current = setInterval(async () => {\n pollAttempts++;\n const connected = await pollVincentStatus();\n if (connected) {\n if (loginPollRef.current) clearInterval(loginPollRef.current);\n loginPollRef.current = null;\n setVincentLoginBusy(false);\n busyRef.current = false;\n setVincentLoginError(null);\n setActionNotice(\n t(\"vincent.connected\", { defaultValue: \"Vincent connected\" }),\n \"success\",\n 5000,\n );\n return;\n }\n if (pollAttempts >= maxPollAttempts) {\n if (loginPollRef.current) clearInterval(loginPollRef.current);\n loginPollRef.current = null;\n setVincentLoginBusy(false);\n busyRef.current = false;\n setVincentLoginError(\n t(\"vincent.loginTimeout\", {\n defaultValue:\n \"Login timed out. Close the auth window and try again.\",\n }),\n );\n }\n }, 5000);\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Vincent login failed\";\n setVincentLoginError(msg);\n setVincentLoginBusy(false);\n busyRef.current = false;\n }\n }, [\n pollVincentStatus,\n setActionNotice,\n t,\n vincentConnected,\n vincentLoginBusy,\n ]);\n\n const handleVincentDisconnect = useCallback(async () => {\n try {\n await vincentClient.vincentDisconnect();\n setVincentConnected(false);\n setVincentConnectedAt(null);\n setVincentLoginError(null);\n setActionNotice(\n t(\"vincent.disconnected\", { defaultValue: \"Vincent disconnected\" }),\n \"info\",\n 3000,\n );\n } catch (err) {\n setVincentLoginError(\n err instanceof Error ? err.message : \"Disconnect failed\",\n );\n }\n }, [setActionNotice, t]);\n\n return {\n vincentConnected,\n vincentLoginBusy,\n vincentLoginError,\n vincentConnectedAt,\n handleVincentLogin,\n handleVincentDisconnect,\n pollVincentStatus,\n };\n}\n","/**\n * VincentView — the single GUI/XR data wrapper for the Vincent surface.\n *\n * It owns the live Vincent data (OAuth status, agent wallet addresses, strategy\n * and trading-profile polling, plus the connect/disconnect OAuth flow) and\n * renders the one presentational {@link VincentSpatialView} 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 `VincentSpatialView`\n * through the terminal registry (see `register-terminal-view.tsx`).\n */\n\nimport { openExternalUrl, useAppSelector } from \"@elizaos/ui\";\nimport { SpatialSurface } from \"@elizaos/ui/spatial\";\nimport { useCallback } from \"react\";\nimport {\n type VincentSnapshot,\n VincentSpatialView,\n} from \"./components/VincentSpatialView.tsx\";\nimport { useVincentDashboard } from \"./useVincentDashboard.ts\";\nimport { useVincentState } from \"./useVincentState.ts\";\n\nconst VINCENT_DASHBOARD_URL = \"https://heyvincent.ai\";\n\n/** Minimal i18n passthrough — the standalone view has no OverlayAppContext. */\nfunction defaultTranslate(\n _key: string,\n opts?: Record<string, unknown>,\n): string {\n return typeof opts?.defaultValue === \"string\" ? opts.defaultValue : _key;\n}\n\nexport function VincentView() {\n const setActionNotice = useAppSelector((s) => s.setActionNotice);\n\n const {\n vincentConnected,\n vincentConnectedAt,\n walletAddresses,\n walletBalances,\n strategy,\n tradingProfile,\n loading,\n error,\n refresh,\n } = useVincentDashboard();\n\n const { handleVincentLogin, handleVincentDisconnect } = useVincentState({\n setActionNotice,\n t: defaultTranslate,\n });\n\n const copyAddress = useCallback(\n (address: string | null | undefined, label: string) => {\n if (!address) return;\n void navigator.clipboard.writeText(address).then(() => {\n setActionNotice(`${label} address copied`, \"success\", 2000);\n });\n },\n [setActionNotice],\n );\n\n const onAction = useCallback(\n (action: string) => {\n switch (action) {\n case \"connect\":\n void handleVincentLogin();\n return;\n case \"disconnect\":\n void handleVincentDisconnect();\n return;\n case \"refresh\":\n refresh();\n return;\n case \"open-vincent\":\n void openExternalUrl(VINCENT_DASHBOARD_URL);\n return;\n case \"copy-evm\":\n copyAddress(walletAddresses?.evmAddress, \"EVM\");\n return;\n case \"copy-solana\":\n copyAddress(walletAddresses?.solanaAddress, \"Solana\");\n return;\n }\n },\n [\n copyAddress,\n handleVincentDisconnect,\n handleVincentLogin,\n refresh,\n walletAddresses,\n ],\n );\n\n const snapshot: VincentSnapshot = {\n vincentConnected,\n vincentConnectedAt,\n walletAddresses,\n walletBalances,\n strategy,\n tradingProfile,\n loading,\n error,\n };\n\n return (\n <SpatialSurface>\n <VincentSpatialView snapshot={snapshot} onAction={onAction} />\n </SpatialSurface>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vincent App — @elizaos/plugin-vincent
|
|
3
|
+
*
|
|
4
|
+
* Full-screen overlay app for Vincent Hyperliquid and Polymarket trading
|
|
5
|
+
* access.
|
|
6
|
+
*/
|
|
7
|
+
import type { OverlayApp } from "@elizaos/ui";
|
|
8
|
+
export declare const VINCENT_APP_NAME = "@elizaos/plugin-vincent";
|
|
9
|
+
export declare const vincentApp: OverlayApp;
|
|
10
|
+
//# sourceMappingURL=vincent-app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vincent-app.d.ts","sourceRoot":"","sources":["../src/vincent-app.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,eAAO,MAAM,gBAAgB,4BAA4B,CAAC;AAE1D,eAAO,MAAM,UAAU,EAAE,UAQxB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { registerOverlayApp } from "@elizaos/ui";
|
|
2
|
+
const VINCENT_APP_NAME = "@elizaos/plugin-vincent";
|
|
3
|
+
const vincentApp = {
|
|
4
|
+
name: VINCENT_APP_NAME,
|
|
5
|
+
displayName: "Vincent",
|
|
6
|
+
description: "Connect Vincent to trade on Hyperliquid and Polymarket",
|
|
7
|
+
category: "trading",
|
|
8
|
+
icon: null,
|
|
9
|
+
loader: () => import("./VincentAppView.js").then((m) => ({ default: m.VincentAppView }))
|
|
10
|
+
};
|
|
11
|
+
registerOverlayApp(vincentApp);
|
|
12
|
+
export {
|
|
13
|
+
VINCENT_APP_NAME,
|
|
14
|
+
vincentApp
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=vincent-app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/vincent-app.ts"],"sourcesContent":["/**\n * Vincent App — @elizaos/plugin-vincent\n *\n * Full-screen overlay app for Vincent Hyperliquid and Polymarket trading\n * access.\n */\n\nimport type { OverlayApp } from \"@elizaos/ui\";\nimport { registerOverlayApp } from \"@elizaos/ui\";\n\nexport const VINCENT_APP_NAME = \"@elizaos/plugin-vincent\";\n\nexport const vincentApp: OverlayApp = {\n name: VINCENT_APP_NAME,\n displayName: \"Vincent\",\n description: \"Connect Vincent to trade on Hyperliquid and Polymarket\",\n category: \"trading\",\n icon: null,\n loader: () =>\n import(\"./VincentAppView.js\").then((m) => ({ default: m.VincentAppView })),\n};\n\n// Self-register at import time\nregisterOverlayApp(vincentApp);\n"],"mappings":"AAQA,SAAS,0BAA0B;AAE5B,MAAM,mBAAmB;AAEzB,MAAM,aAAyB;AAAA,EACpC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,EACb,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ,MACN,OAAO,qBAAqB,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE;AAC7E;AAGA,mBAAmB,UAAU;","names":[]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export type VincentStrategyName = "dca" | "rebalance" | "threshold" | "manual";
|
|
2
|
+
export type VincentTradingVenue = "hyperliquid" | "polymarket";
|
|
3
|
+
export declare const VINCENT_TRADING_VENUES: readonly VincentTradingVenue[];
|
|
4
|
+
export interface VincentStartLoginResponse {
|
|
5
|
+
authUrl: string;
|
|
6
|
+
state: string;
|
|
7
|
+
redirectUri: string;
|
|
8
|
+
}
|
|
9
|
+
export interface VincentStatusResponse {
|
|
10
|
+
connected: boolean;
|
|
11
|
+
connectedAt: number | null;
|
|
12
|
+
tradingVenues: readonly VincentTradingVenue[];
|
|
13
|
+
}
|
|
14
|
+
export interface VincentStrategy {
|
|
15
|
+
name: VincentStrategyName;
|
|
16
|
+
venues: readonly VincentTradingVenue[];
|
|
17
|
+
params: Record<string, unknown>;
|
|
18
|
+
intervalSeconds: number;
|
|
19
|
+
dryRun: boolean;
|
|
20
|
+
running: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface VincentStrategyResponse {
|
|
23
|
+
connected: boolean;
|
|
24
|
+
strategy: VincentStrategy | null;
|
|
25
|
+
}
|
|
26
|
+
export interface VincentStrategyUpdateRequest {
|
|
27
|
+
strategy?: VincentStrategyName;
|
|
28
|
+
params?: Record<string, unknown>;
|
|
29
|
+
intervalSeconds?: number;
|
|
30
|
+
dryRun?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface VincentStrategyUpdateResponse {
|
|
33
|
+
ok: boolean;
|
|
34
|
+
strategy: VincentStrategy | null;
|
|
35
|
+
}
|
|
36
|
+
export interface VincentTradingProfileTokenBreakdownItem {
|
|
37
|
+
symbol: string;
|
|
38
|
+
pnl: string;
|
|
39
|
+
swaps: number;
|
|
40
|
+
}
|
|
41
|
+
export interface VincentTradingProfile {
|
|
42
|
+
totalPnl: string;
|
|
43
|
+
winRate: number;
|
|
44
|
+
totalSwaps: number;
|
|
45
|
+
volume24h: string;
|
|
46
|
+
tokenBreakdown: VincentTradingProfileTokenBreakdownItem[];
|
|
47
|
+
}
|
|
48
|
+
export interface VincentTradingProfileResponse {
|
|
49
|
+
connected: boolean;
|
|
50
|
+
profile: VincentTradingProfile | null;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=vincent-contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vincent-contracts.d.ts","sourceRoot":"","sources":["../src/vincent-contracts.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE/E,MAAM,MAAM,mBAAmB,GAAG,aAAa,GAAG,YAAY,CAAC;AAE/D,eAAO,MAAM,sBAAsB,EAAE,SAAS,mBAAmB,EAGvD,CAAC;AAEX,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC/C;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,6BAA6B;IAC5C,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,uCAAuC;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,uCAAuC,EAAE,CAAC;CAC3D;AAED,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACvC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/vincent-contracts.ts"],"sourcesContent":["export type VincentStrategyName = \"dca\" | \"rebalance\" | \"threshold\" | \"manual\";\n\nexport type VincentTradingVenue = \"hyperliquid\" | \"polymarket\";\n\nexport const VINCENT_TRADING_VENUES: readonly VincentTradingVenue[] = [\n \"hyperliquid\",\n \"polymarket\",\n] as const;\n\nexport interface VincentStartLoginResponse {\n authUrl: string;\n state: string;\n redirectUri: string;\n}\n\nexport interface VincentStatusResponse {\n connected: boolean;\n connectedAt: number | null;\n tradingVenues: readonly VincentTradingVenue[];\n}\n\nexport interface VincentStrategy {\n name: VincentStrategyName;\n venues: readonly VincentTradingVenue[];\n params: Record<string, unknown>;\n intervalSeconds: number;\n dryRun: boolean;\n running: boolean;\n}\n\nexport interface VincentStrategyResponse {\n connected: boolean;\n strategy: VincentStrategy | null;\n}\n\nexport interface VincentStrategyUpdateRequest {\n strategy?: VincentStrategyName;\n params?: Record<string, unknown>;\n intervalSeconds?: number;\n dryRun?: boolean;\n}\n\nexport interface VincentStrategyUpdateResponse {\n ok: boolean;\n strategy: VincentStrategy | null;\n}\n\nexport interface VincentTradingProfileTokenBreakdownItem {\n symbol: string;\n pnl: string;\n swaps: number;\n}\n\nexport interface VincentTradingProfile {\n totalPnl: string;\n winRate: number;\n totalSwaps: number;\n volume24h: string;\n tokenBreakdown: VincentTradingProfileTokenBreakdownItem[];\n}\n\nexport interface VincentTradingProfileResponse {\n connected: boolean;\n profile: VincentTradingProfile | null;\n}\n"],"mappings":"AAIO,MAAM,yBAAyD;AAAA,EACpE;AAAA,EACA;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vincent-view-bundle.d.ts","sourceRoot":"","sources":["../src/vincent-view-bundle.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/vincent-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 (`VincentView`, `interact`).\n// Kept separate from VincentView.tsx so that file exports only React components\n// and stays Fast-Refresh-compatible.\nexport { interact } from \"./VincentAppView.interact\";\nexport { VincentView } from \"./VincentView.js\";\n"],"mappings":"AAKA,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elizaos/plugin-vincent",
|
|
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,11 +32,11 @@
|
|
|
32
32
|
}
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@elizaos/agent": "2.0.3-beta.
|
|
36
|
-
"@elizaos/app-core": "2.0.3-beta.
|
|
37
|
-
"@elizaos/core": "2.0.3-beta.
|
|
38
|
-
"@elizaos/shared": "2.0.3-beta.
|
|
39
|
-
"@elizaos/ui": "2.0.3-beta.
|
|
35
|
+
"@elizaos/agent": "2.0.3-beta.7",
|
|
36
|
+
"@elizaos/app-core": "2.0.3-beta.7",
|
|
37
|
+
"@elizaos/core": "2.0.3-beta.7",
|
|
38
|
+
"@elizaos/shared": "2.0.3-beta.7",
|
|
39
|
+
"@elizaos/ui": "2.0.3-beta.7",
|
|
40
40
|
"lucide-react": "^1.0.0",
|
|
41
41
|
"react": "^19.0.0"
|
|
42
42
|
},
|
|
@@ -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
|
}
|