dorkfuncli 0.0.1
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/.env.example +6 -0
- package/dist/commands/agent.d.ts +2 -0
- package/dist/commands/agent.js +163 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.js +124 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/config/configFile.d.ts +6 -0
- package/dist/config/configFile.js +43 -0
- package/dist/config/configFile.js.map +1 -0
- package/dist/config/defaults.d.ts +10 -0
- package/dist/config/defaults.js +19 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.js +5 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/resolve.d.ts +3 -0
- package/dist/config/resolve.js +24 -0
- package/dist/config/resolve.js.map +1 -0
- package/dist/config/runtime.d.ts +3 -0
- package/dist/config/runtime.js +13 -0
- package/dist/config/runtime.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +230 -0
- package/dist/index.js.map +1 -0
- package/dist/transport/httpClient.d.ts +13 -0
- package/dist/transport/httpClient.js +91 -0
- package/dist/transport/httpClient.js.map +1 -0
- package/dist/transport/wsClient.d.ts +30 -0
- package/dist/transport/wsClient.js +196 -0
- package/dist/transport/wsClient.js.map +1 -0
- package/dist/tui/App.d.ts +6 -0
- package/dist/tui/App.js +40 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/components/ChatPanel.d.ts +12 -0
- package/dist/tui/components/ChatPanel.js +18 -0
- package/dist/tui/components/ChatPanel.js.map +1 -0
- package/dist/tui/components/ColoredBoard.d.ts +7 -0
- package/dist/tui/components/ColoredBoard.js +73 -0
- package/dist/tui/components/ColoredBoard.js.map +1 -0
- package/dist/tui/components/PlayerInfo.d.ts +10 -0
- package/dist/tui/components/PlayerInfo.js +10 -0
- package/dist/tui/components/PlayerInfo.js.map +1 -0
- package/dist/tui/components/StatusBar.d.ts +7 -0
- package/dist/tui/components/StatusBar.js +13 -0
- package/dist/tui/components/StatusBar.js.map +1 -0
- package/dist/tui/components/TicTacToeBoard.d.ts +6 -0
- package/dist/tui/components/TicTacToeBoard.js +19 -0
- package/dist/tui/components/TicTacToeBoard.js.map +1 -0
- package/dist/tui/hooks/useEnsNames.d.ts +5 -0
- package/dist/tui/hooks/useEnsNames.js +33 -0
- package/dist/tui/hooks/useEnsNames.js.map +1 -0
- package/dist/tui/screens/GameBoard.d.ts +10 -0
- package/dist/tui/screens/GameBoard.js +245 -0
- package/dist/tui/screens/GameBoard.js.map +1 -0
- package/dist/tui/screens/GameOver.d.ts +10 -0
- package/dist/tui/screens/GameOver.js +21 -0
- package/dist/tui/screens/GameOver.js.map +1 -0
- package/dist/tui/screens/Leaderboard.d.ts +5 -0
- package/dist/tui/screens/Leaderboard.js +102 -0
- package/dist/tui/screens/Leaderboard.js.map +1 -0
- package/dist/tui/screens/Lobby.d.ts +8 -0
- package/dist/tui/screens/Lobby.js +113 -0
- package/dist/tui/screens/Lobby.js.map +1 -0
- package/dist/tui/screens/Matchmaking.d.ts +9 -0
- package/dist/tui/screens/Matchmaking.js +66 -0
- package/dist/tui/screens/Matchmaking.js.map +1 -0
- package/dist/tui/screens/WatchGame.d.ts +7 -0
- package/dist/tui/screens/WatchGame.js +99 -0
- package/dist/tui/screens/WatchGame.js.map +1 -0
- package/dist/tui/screens/WatchList.d.ts +6 -0
- package/dist/tui/screens/WatchList.js +49 -0
- package/dist/tui/screens/WatchList.js.map +1 -0
- package/dist/tui/theme.d.ts +30 -0
- package/dist/tui/theme.js +31 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/wallet/signer.d.ts +13 -0
- package/dist/wallet/signer.js +41 -0
- package/dist/wallet/signer.js.map +1 -0
- package/package.json +43 -0
- package/play-agents.cjs +444 -0
- package/src/commands/agent.ts +175 -0
- package/src/commands/config.ts +162 -0
- package/src/config/configFile.ts +55 -0
- package/src/config/defaults.ts +28 -0
- package/src/config/index.ts +15 -0
- package/src/config/resolve.ts +33 -0
- package/src/config/runtime.ts +18 -0
- package/src/index.ts +237 -0
- package/src/transport/httpClient.ts +104 -0
- package/src/transport/wsClient.ts +214 -0
- package/src/tui/App.tsx +130 -0
- package/src/tui/components/ChatPanel.tsx +53 -0
- package/src/tui/components/ColoredBoard.tsx +98 -0
- package/src/tui/components/PlayerInfo.tsx +31 -0
- package/src/tui/components/StatusBar.tsx +35 -0
- package/src/tui/hooks/useEnsNames.ts +35 -0
- package/src/tui/screens/GameBoard.tsx +434 -0
- package/src/tui/screens/GameOver.tsx +83 -0
- package/src/tui/screens/Leaderboard.tsx +196 -0
- package/src/tui/screens/Lobby.tsx +197 -0
- package/src/tui/screens/Matchmaking.tsx +107 -0
- package/src/tui/screens/WatchGame.tsx +182 -0
- package/src/tui/screens/WatchList.tsx +99 -0
- package/src/tui/theme.ts +31 -0
- package/src/wallet/signer.ts +54 -0
- package/tsconfig.json +17 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { Box, Text, useInput } from "ink";
|
|
4
|
+
import { formatAddress } from "@dorkfun/core";
|
|
5
|
+
import { colors } from "../theme.js";
|
|
6
|
+
import * as api from "../../transport/httpClient.js";
|
|
7
|
+
const PAGE_SIZE = 20;
|
|
8
|
+
export function Leaderboard({ onBack }) {
|
|
9
|
+
const [tabs, setTabs] = useState([{ id: "overall", label: "Overall" }]);
|
|
10
|
+
const [activeTab, setActiveTab] = useState(0);
|
|
11
|
+
const [entries, setEntries] = useState([]);
|
|
12
|
+
const [selectedRow, setSelectedRow] = useState(0);
|
|
13
|
+
const [loading, setLoading] = useState(true);
|
|
14
|
+
const [error, setError] = useState("");
|
|
15
|
+
const [page, setPage] = useState(0);
|
|
16
|
+
const [total, setTotal] = useState(0);
|
|
17
|
+
const [sortBy, setSortBy] = useState("rating");
|
|
18
|
+
// Fetch game list on mount to populate tabs
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
api
|
|
21
|
+
.listGames()
|
|
22
|
+
.then((res) => {
|
|
23
|
+
const gameTabs = (res.games || []).map((g) => ({
|
|
24
|
+
id: g.id,
|
|
25
|
+
label: g.name,
|
|
26
|
+
}));
|
|
27
|
+
setTabs([{ id: "overall", label: "Overall" }, ...gameTabs]);
|
|
28
|
+
})
|
|
29
|
+
.catch(() => { });
|
|
30
|
+
}, []);
|
|
31
|
+
// Fetch leaderboard data when tab, page, or sort changes
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
setLoading(true);
|
|
34
|
+
setError("");
|
|
35
|
+
const currentTab = tabs[activeTab];
|
|
36
|
+
if (!currentTab)
|
|
37
|
+
return;
|
|
38
|
+
const fetchFn = currentTab.id === "overall"
|
|
39
|
+
? api.getLeaderboard(PAGE_SIZE, page * PAGE_SIZE, sortBy)
|
|
40
|
+
: api.getGameLeaderboard(currentTab.id, PAGE_SIZE, page * PAGE_SIZE, sortBy);
|
|
41
|
+
fetchFn
|
|
42
|
+
.then((res) => {
|
|
43
|
+
setEntries(res.players || []);
|
|
44
|
+
setTotal(res.total || 0);
|
|
45
|
+
setSelectedRow(0);
|
|
46
|
+
setLoading(false);
|
|
47
|
+
})
|
|
48
|
+
.catch((err) => {
|
|
49
|
+
setError(err.message);
|
|
50
|
+
setLoading(false);
|
|
51
|
+
});
|
|
52
|
+
}, [activeTab, page, tabs, sortBy]);
|
|
53
|
+
useInput((input, key) => {
|
|
54
|
+
if (key.escape) {
|
|
55
|
+
onBack();
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// Tab switching
|
|
59
|
+
if (key.tab || key.rightArrow) {
|
|
60
|
+
setActiveTab((t) => (t + 1) % tabs.length);
|
|
61
|
+
setPage(0);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (key.leftArrow) {
|
|
65
|
+
setActiveTab((t) => (t - 1 + tabs.length) % tabs.length);
|
|
66
|
+
setPage(0);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// Row navigation
|
|
70
|
+
if (key.upArrow)
|
|
71
|
+
setSelectedRow((s) => Math.max(0, s - 1));
|
|
72
|
+
if (key.downArrow)
|
|
73
|
+
setSelectedRow((s) => Math.min(entries.length - 1, s + 1));
|
|
74
|
+
// Pagination
|
|
75
|
+
if (input === "n" && (page + 1) * PAGE_SIZE < total)
|
|
76
|
+
setPage((p) => p + 1);
|
|
77
|
+
if (input === "p" && page > 0)
|
|
78
|
+
setPage((p) => p - 1);
|
|
79
|
+
// Sort toggle
|
|
80
|
+
if (input === "s") {
|
|
81
|
+
setSortBy((s) => (s === "rating" ? "earnings" : "rating"));
|
|
82
|
+
setPage(0);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
const formatWei = (wei) => {
|
|
86
|
+
try {
|
|
87
|
+
const eth = (Number(wei) / 1e18).toFixed(6);
|
|
88
|
+
return eth.replace(/\.?0+$/, "");
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return "0";
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const totalPages = Math.max(1, Math.ceil(total / PAGE_SIZE));
|
|
95
|
+
return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [_jsx(Text, { color: colors.primary, bold: true, children: "═══ LEADERBOARD ═══" }), _jsx(Text, { children: "" }), _jsxs(Box, { flexDirection: "row", gap: 2, children: [tabs.map((tab, i) => (_jsx(Text, { color: i === activeTab ? colors.primary : colors.dimmed, bold: i === activeTab, children: i === activeTab ? `[${tab.label}]` : ` ${tab.label} ` }, tab.id))), _jsx(Text, { color: colors.dimmed, children: " | " }), _jsx(Text, { color: sortBy === "rating" ? colors.primary : colors.dimmed, bold: sortBy === "rating", children: sortBy === "rating" ? "[Rating]" : " Rating " }), _jsx(Text, { color: sortBy === "earnings" ? colors.primary : colors.dimmed, bold: sortBy === "earnings", children: sortBy === "earnings" ? "[Earnings]" : " Earnings " })] }), _jsx(Text, { children: "" }), _jsx(Text, { color: colors.secondary, bold: true, children: " # Player Rating W D L GP Earnings" }), _jsx(Text, { color: colors.border, children: " ─── ─────────────── ────── ──── ──── ──── ──── ──────────" }), loading && _jsx(Text, { color: colors.dimmed, children: " Loading..." }), error && _jsxs(Text, { color: colors.error, children: [" Error: ", error] }), !loading && !error && entries.length === 0 && (_jsx(Text, { color: colors.warning, children: " No players ranked yet." })), !loading &&
|
|
96
|
+
!error &&
|
|
97
|
+
entries.map((e, i) => {
|
|
98
|
+
const earnings = e.totalEarningsWei !== "0" ? formatWei(e.totalEarningsWei) + " ETH" : "-";
|
|
99
|
+
return (_jsx(Box, { flexDirection: "row", children: _jsxs(Text, { color: i === selectedRow ? colors.primary : colors.text, children: [i === selectedRow ? " ▸ " : " ", String(e.rank).padStart(3), " ", (e.ensName || e.displayName || formatAddress(e.address)).padEnd(15), " ", String(e.rating).padStart(6), " ", String(e.gamesWon).padStart(3), " ", String(e.gamesDrawn).padStart(3), " ", String(e.gamesLost).padStart(3), " ", String(e.gamesPlayed).padStart(3), " ", earnings.padStart(10)] }) }, e.address));
|
|
100
|
+
}), _jsx(Text, { children: "" }), _jsxs(Text, { color: colors.dimmed, children: [" ", "Page ", page + 1, "/", totalPages, " | \u2190\u2192/Tab: switch view | \u2191\u2193: navigate | n/p: page | s: sort (", sortBy, ") | Esc: back"] })] }));
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=Leaderboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Leaderboard.js","sourceRoot":"","sources":["../../../src/tui/screens/Leaderboard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface LobbyProps {
|
|
2
|
+
defaultStakeWei?: string;
|
|
3
|
+
onPlay: (gameId: string, stakeWei?: string) => void;
|
|
4
|
+
onWatch: () => void;
|
|
5
|
+
onLeaderboard: () => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function Lobby({ defaultStakeWei, onPlay, onWatch, onLeaderboard }: LobbyProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { Box, Text, useInput } from "ink";
|
|
4
|
+
import { formatEther, parseEther } from "ethers";
|
|
5
|
+
import { colors } from "../theme.js";
|
|
6
|
+
import * as api from "../../transport/httpClient.js";
|
|
7
|
+
export function Lobby({ defaultStakeWei, onPlay, onWatch, onLeaderboard }) {
|
|
8
|
+
const [games, setGames] = useState([]);
|
|
9
|
+
const [selected, setSelected] = useState(0);
|
|
10
|
+
const [error, setError] = useState("");
|
|
11
|
+
const [statusMsg, setStatusMsg] = useState("");
|
|
12
|
+
// Stake input sub-state
|
|
13
|
+
const [stakeMode, setStakeMode] = useState(false);
|
|
14
|
+
const [stakeGameId, setStakeGameId] = useState("");
|
|
15
|
+
const [stakeInput, setStakeInput] = useState(defaultStakeWei ? formatEther(defaultStakeWei) : "");
|
|
16
|
+
// Stake confirmation sub-state
|
|
17
|
+
const [confirmMode, setConfirmMode] = useState(false);
|
|
18
|
+
const [pendingStakeWei, setPendingStakeWei] = useState(undefined);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
api
|
|
21
|
+
.listGames()
|
|
22
|
+
.then((res) => setGames(res.games))
|
|
23
|
+
.catch((err) => setError(err.message));
|
|
24
|
+
}, []);
|
|
25
|
+
const handleWatch = async () => {
|
|
26
|
+
setStatusMsg("");
|
|
27
|
+
try {
|
|
28
|
+
const result = await api.listMatches();
|
|
29
|
+
if (result.matches.length === 0) {
|
|
30
|
+
setStatusMsg("No active games to watch right now.");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
onWatch();
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
setStatusMsg(`Failed to fetch matches: ${err.message}`);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const handleSelectGame = (gameId) => {
|
|
40
|
+
setStakeGameId(gameId);
|
|
41
|
+
setStakeMode(true);
|
|
42
|
+
setStatusMsg("");
|
|
43
|
+
};
|
|
44
|
+
const handleConfirmStake = () => {
|
|
45
|
+
const trimmed = stakeInput.trim();
|
|
46
|
+
if (!trimmed || trimmed === "0") {
|
|
47
|
+
onPlay(stakeGameId);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// Check if staking is available for this game
|
|
51
|
+
const game = games.find((g) => g.id === stakeGameId);
|
|
52
|
+
if (game && game.stakingEnabled === false) {
|
|
53
|
+
setStatusMsg("Staking is not available for this game (settlement not configured on server).");
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const wei = parseEther(trimmed).toString();
|
|
58
|
+
setPendingStakeWei(wei);
|
|
59
|
+
setConfirmMode(true);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
setStatusMsg(`Invalid amount: "${trimmed}". Enter a decimal ETH value (e.g. 0.01)`);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const handleFinalConfirm = () => {
|
|
66
|
+
onPlay(stakeGameId, pendingStakeWei);
|
|
67
|
+
};
|
|
68
|
+
const handleCancelConfirm = () => {
|
|
69
|
+
setConfirmMode(false);
|
|
70
|
+
setPendingStakeWei(undefined);
|
|
71
|
+
};
|
|
72
|
+
const options = [
|
|
73
|
+
...games.map((g) => ({ label: `Play ${g.name}`, action: () => handleSelectGame(g.id) })),
|
|
74
|
+
{ label: "Watch live games", action: handleWatch },
|
|
75
|
+
{ label: "Leaderboard", action: () => onLeaderboard() },
|
|
76
|
+
];
|
|
77
|
+
useInput((input, key) => {
|
|
78
|
+
if (confirmMode) {
|
|
79
|
+
if (input === "y" || input === "Y") {
|
|
80
|
+
handleFinalConfirm();
|
|
81
|
+
}
|
|
82
|
+
else if (input === "n" || input === "N" || key.escape) {
|
|
83
|
+
handleCancelConfirm();
|
|
84
|
+
}
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (stakeMode) {
|
|
88
|
+
if (key.return) {
|
|
89
|
+
handleConfirmStake();
|
|
90
|
+
}
|
|
91
|
+
else if (key.escape) {
|
|
92
|
+
setStakeMode(false);
|
|
93
|
+
setStakeInput(defaultStakeWei ? formatEther(defaultStakeWei) : "");
|
|
94
|
+
setStatusMsg("");
|
|
95
|
+
}
|
|
96
|
+
else if (key.backspace || key.delete) {
|
|
97
|
+
setStakeInput((prev) => prev.slice(0, -1));
|
|
98
|
+
}
|
|
99
|
+
else if (input && !key.ctrl && !key.meta) {
|
|
100
|
+
setStakeInput((prev) => prev + input);
|
|
101
|
+
}
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (key.upArrow)
|
|
105
|
+
setSelected((s) => Math.max(0, s - 1));
|
|
106
|
+
if (key.downArrow)
|
|
107
|
+
setSelected((s) => Math.min(options.length - 1, s + 1));
|
|
108
|
+
if (key.return)
|
|
109
|
+
options[selected]?.action();
|
|
110
|
+
});
|
|
111
|
+
return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [_jsx(Text, { color: colors.primary, bold: true, children: "═══ LOBBY ═══" }), _jsx(Text, { color: colors.dimmed, children: "" }), confirmMode && pendingStakeWei ? (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: colors.warning, bold: true, children: "Confirm Stake" }), _jsx(Text, { children: "" }), _jsxs(Text, { color: colors.white, children: ["You are about to enter matchmaking with a stake of ", formatEther(pendingStakeWei), " ETH"] }), _jsxs(Text, { color: colors.error, children: ["If you lose the game, you will lose ", formatEther(pendingStakeWei), " ETH"] }), _jsx(Text, { children: "" }), _jsx(Text, { color: colors.primary, bold: true, children: "Press [Y] to confirm, [N] to go back" })] })) : stakeMode ? (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: colors.white, children: ["Stake for ", stakeGameId, ":"] }), _jsx(Text, { color: colors.dimmed, children: "Enter ETH amount (or press Enter for free play)" }), _jsx(Text, { children: "" }), _jsxs(Box, { children: [_jsx(Text, { color: colors.secondary, children: "> " }), _jsx(Text, { color: colors.text, children: stakeInput || "0" }), _jsx(Text, { color: colors.dimmed, children: " ETH" }), _jsx(Text, { color: colors.dimmed, children: "_" })] }), _jsx(Text, { children: "" }), _jsx(Text, { color: colors.dimmed, children: "Enter to confirm, Esc to go back" })] })) : error ? (_jsxs(Text, { color: colors.error, children: ["Error: ", error] })) : (options.map((opt, i) => (_jsxs(Text, { color: i === selected ? colors.primary : colors.dimmed, children: [i === selected ? " ▸ " : " ", opt.label] }, i)))), statusMsg && (_jsxs(_Fragment, { children: [_jsx(Text, { color: colors.dimmed, children: "" }), _jsxs(Text, { color: colors.warning, children: [" ", statusMsg] })] })), !stakeMode && (_jsxs(_Fragment, { children: [_jsx(Text, { color: colors.dimmed, children: "" }), _jsx(Text, { color: colors.dimmed, children: "Use \u2191\u2193 to select, Enter to confirm, q to quit" })] }))] }));
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=Lobby.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Lobby.js","sourceRoot":"","sources":["../../../src/tui/screens/Lobby.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface MatchmakingProps {
|
|
2
|
+
playerId: string;
|
|
3
|
+
gameId: string;
|
|
4
|
+
stakeWei?: string;
|
|
5
|
+
onMatched: (matchId: string, wsToken: string, opponent: string) => void;
|
|
6
|
+
onCancel: () => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function Matchmaking({ playerId, gameId, stakeWei, onMatched, onCancel }: MatchmakingProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { Box, Text } from "ink";
|
|
4
|
+
import { formatEther } from "ethers";
|
|
5
|
+
import Spinner from "ink-spinner";
|
|
6
|
+
import { colors } from "../theme.js";
|
|
7
|
+
import * as api from "../../transport/httpClient.js";
|
|
8
|
+
export function Matchmaking({ playerId, gameId, stakeWei, onMatched, onCancel }) {
|
|
9
|
+
const [status, setStatus] = useState("Searching for opponent...");
|
|
10
|
+
const [elapsed, setElapsed] = useState(0);
|
|
11
|
+
const [error, setError] = useState("");
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
let cancelled = false;
|
|
14
|
+
let ticket = "";
|
|
15
|
+
const poll = async () => {
|
|
16
|
+
try {
|
|
17
|
+
const result = await api.joinQueue(playerId, gameId, undefined, stakeWei);
|
|
18
|
+
if (result.status === "matched") {
|
|
19
|
+
if (!cancelled) {
|
|
20
|
+
onMatched(result.matchId, result.wsToken, result.opponent);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
ticket = result.ticket;
|
|
25
|
+
setStatus("In queue, waiting for opponent...");
|
|
26
|
+
// Poll every 2 seconds, reusing the same ticket
|
|
27
|
+
const interval = setInterval(async () => {
|
|
28
|
+
if (cancelled) {
|
|
29
|
+
clearInterval(interval);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const retry = await api.joinQueue(playerId, gameId, ticket, stakeWei);
|
|
34
|
+
if (retry.status === "matched") {
|
|
35
|
+
clearInterval(interval);
|
|
36
|
+
if (!cancelled) {
|
|
37
|
+
onMatched(retry.matchId, retry.wsToken, retry.opponent);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Ignore poll errors
|
|
43
|
+
}
|
|
44
|
+
}, 2000);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
setError(err.message);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
poll();
|
|
52
|
+
const timer = setInterval(() => {
|
|
53
|
+
if (!cancelled)
|
|
54
|
+
setElapsed((e) => e + 1);
|
|
55
|
+
}, 1000);
|
|
56
|
+
return () => {
|
|
57
|
+
cancelled = true;
|
|
58
|
+
clearInterval(timer);
|
|
59
|
+
if (ticket)
|
|
60
|
+
api.leaveQueue(ticket).catch(() => { });
|
|
61
|
+
};
|
|
62
|
+
}, [playerId, gameId, stakeWei]);
|
|
63
|
+
const stakeDisplay = stakeWei ? `${formatEther(stakeWei)} ETH` : "free";
|
|
64
|
+
return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [_jsx(Text, { color: colors.primary, bold: true, children: "═══ MATCHMAKING ═══" }), _jsx(Text, { children: "" }), error ? (_jsxs(Text, { color: colors.error, children: ["Error: ", error] })) : (_jsxs(Box, { children: [_jsx(Text, { color: colors.secondary, children: _jsx(Spinner, { type: "dots" }) }), _jsxs(Text, { color: colors.white, children: [" ", status, " (", elapsed, "s)"] })] })), _jsx(Text, { children: "" }), _jsxs(Text, { color: colors.dimmed, children: ["Game: ", gameId] }), stakeWei && stakeWei !== "0" ? (_jsxs(Text, { color: colors.warning, bold: true, children: ["Stake: ", stakeDisplay] })) : (_jsxs(Text, { color: colors.dimmed, children: ["Stake: ", stakeDisplay] })), stakeWei && stakeWei !== "0" && (_jsx(Text, { color: colors.dimmed, children: "Only opponents with matching stake will be paired" })), _jsx(Text, { color: colors.dimmed, children: "Press Ctrl+C to cancel" })] }));
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=Matchmaking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Matchmaking.js","sourceRoot":"","sources":["../../../src/tui/screens/Matchmaking.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,OAAO,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,GAAG,MAAM,+BAA+B,CAAC;AAUrD,MAAM,UAAU,WAAW,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAoB;IAC/F,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,2BAA2B,CAAC,CAAC;IAClE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;YACtB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAE1E,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAChC,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;oBAC7D,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;oBACvB,SAAS,CAAC,mCAAmC,CAAC,CAAC;oBAE/C,gDAAgD;oBAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;wBACtC,IAAI,SAAS,EAAE,CAAC;4BACd,aAAa,CAAC,QAAQ,CAAC,CAAC;4BACxB,OAAO;wBACT,CAAC;wBACD,IAAI,CAAC;4BACH,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;4BACtE,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gCAC/B,aAAa,CAAC,QAAQ,CAAC,CAAC;gCACxB,IAAI,CAAC,SAAS,EAAE,CAAC;oCACf,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gCAC1D,CAAC;4BACH,CAAC;wBACH,CAAC;wBAAC,MAAM,CAAC;4BACP,qBAAqB;wBACvB,CAAC;oBACH,CAAC,EAAE,IAAI,CAAC,CAAC;gBACX,CAAC;YACH,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,EAAE,CAAC;QAEP,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,IAAI,CAAC,SAAS;gBAAE,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;YACjB,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,IAAI,MAAM;gBAAE,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEjC,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAExE,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,aAClD,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,kBAC9B,qBAAqB,GACjB,EACP,KAAC,IAAI,cAAE,EAAE,GAAQ,EAEhB,KAAK,CAAC,CAAC,CAAC,CACP,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,wBAAU,KAAK,IAAQ,CACjD,CAAC,CAAC,CAAC,CACF,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,SAAS,YAC3B,KAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,GAClB,EACP,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,kBAAI,MAAM,QAAI,OAAO,UAAU,IACpD,CACP,EAED,KAAC,IAAI,cAAE,EAAE,GAAQ,EACjB,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,uBAAS,MAAM,IAAQ,EAChD,QAAQ,IAAI,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,CAC9B,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,8BAAS,YAAY,IAAQ,CAC/D,CAAC,CAAC,CAAC,CACF,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,wBAAU,YAAY,IAAQ,CACzD,EACA,QAAQ,IAAI,QAAQ,KAAK,GAAG,IAAI,CAC/B,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,kEAA0D,CACrF,EACD,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,uCAA+B,IACrD,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { Box, Text, useInput } from "ink";
|
|
4
|
+
import { formatAddress } from "@dorkfun/core";
|
|
5
|
+
import { getGameUI } from "@dorkfun/game-ui";
|
|
6
|
+
import { colors } from "../theme.js";
|
|
7
|
+
import { ColoredBoard } from "../components/ColoredBoard.js";
|
|
8
|
+
import { useEnsNames } from "../hooks/useEnsNames.js";
|
|
9
|
+
import { GameWebSocket } from "../../transport/wsClient.js";
|
|
10
|
+
export function WatchGame({ matchId, gameId, onBack }) {
|
|
11
|
+
const [publicData, setPublicData] = useState({});
|
|
12
|
+
const [currentPlayer, setCurrentPlayer] = useState("");
|
|
13
|
+
const [players, setPlayers] = useState([]);
|
|
14
|
+
const [turnNumber, setTurnNumber] = useState(0);
|
|
15
|
+
const [status, setStatus] = useState("connecting");
|
|
16
|
+
const [gameOver, setGameOver] = useState(false);
|
|
17
|
+
const [winner, setWinner] = useState(null);
|
|
18
|
+
const [reason, setReason] = useState("");
|
|
19
|
+
const [error, setError] = useState("");
|
|
20
|
+
const [wsRef] = useState(() => new GameWebSocket());
|
|
21
|
+
const allAddresses = [...players, winner, currentPlayer].filter(Boolean);
|
|
22
|
+
const ensNames = useEnsNames(allAddresses);
|
|
23
|
+
const ui = getGameUI(gameId);
|
|
24
|
+
const shortId = matchId.slice(0, 8);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
const connect = async () => {
|
|
27
|
+
try {
|
|
28
|
+
await wsRef.connect(matchId, "spectate");
|
|
29
|
+
setStatus("connected");
|
|
30
|
+
wsRef.sendSpectateJoin(matchId, "spectator");
|
|
31
|
+
wsRef.on("SPECTATE_STATE", (msg) => {
|
|
32
|
+
const payload = msg.payload;
|
|
33
|
+
if (payload.observation) {
|
|
34
|
+
applyObservation(payload.observation);
|
|
35
|
+
}
|
|
36
|
+
if (payload.players)
|
|
37
|
+
setPlayers(payload.players);
|
|
38
|
+
if (payload.status)
|
|
39
|
+
setStatus(payload.status);
|
|
40
|
+
});
|
|
41
|
+
wsRef.on("STEP_RESULT", (msg) => {
|
|
42
|
+
const payload = msg.payload;
|
|
43
|
+
if (payload.observation) {
|
|
44
|
+
applyObservation(payload.observation);
|
|
45
|
+
}
|
|
46
|
+
if (payload.nextPlayer) {
|
|
47
|
+
setCurrentPlayer(payload.nextPlayer);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
wsRef.on("GAME_STATE", (msg) => {
|
|
51
|
+
const payload = msg.payload;
|
|
52
|
+
if (payload.observation) {
|
|
53
|
+
applyObservation(payload.observation);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
wsRef.on("GAME_OVER", (msg) => {
|
|
57
|
+
const payload = msg.payload;
|
|
58
|
+
setGameOver(true);
|
|
59
|
+
setWinner(payload.winner);
|
|
60
|
+
setReason(payload.reason);
|
|
61
|
+
setStatus("finished");
|
|
62
|
+
});
|
|
63
|
+
wsRef.on("close", () => {
|
|
64
|
+
setStatus("disconnected");
|
|
65
|
+
});
|
|
66
|
+
wsRef.on("reconnecting", () => {
|
|
67
|
+
setStatus("reconnecting");
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
setError(`Connection failed: ${err.message}`);
|
|
72
|
+
setStatus("disconnected");
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
connect();
|
|
76
|
+
return () => wsRef.close();
|
|
77
|
+
}, [matchId]);
|
|
78
|
+
function applyObservation(obs) {
|
|
79
|
+
if (obs.publicData)
|
|
80
|
+
setPublicData(obs.publicData);
|
|
81
|
+
if (obs.currentPlayer)
|
|
82
|
+
setCurrentPlayer(obs.currentPlayer);
|
|
83
|
+
if (obs.players?.length)
|
|
84
|
+
setPlayers(obs.players);
|
|
85
|
+
if (obs.turnNumber !== undefined)
|
|
86
|
+
setTurnNumber(obs.turnNumber);
|
|
87
|
+
}
|
|
88
|
+
useInput((_input, key) => {
|
|
89
|
+
if (key.escape)
|
|
90
|
+
onBack();
|
|
91
|
+
});
|
|
92
|
+
const boardHtml = ui?.renderBoard(publicData) || `[No renderer for ${gameId}]`;
|
|
93
|
+
const statusStr = ui?.renderStatus(publicData);
|
|
94
|
+
const turnDisplay = ui?.maxTurns ? `${turnNumber}/${ui.maxTurns}` : `${turnNumber}`;
|
|
95
|
+
return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [_jsxs(Text, { children: [_jsx(Text, { color: colors.primary, children: "$ " }), _jsxs(Text, { children: ["watch ", shortId] })] }), _jsxs(Text, { children: [_jsx(Text, { color: colors.dimmed, children: "> game: " }), _jsx(Text, { children: gameId })] }), players.length > 0 && ui && (_jsxs(Text, { children: [_jsx(Text, { color: colors.dimmed, children: "> players: " }), _jsxs(Text, { color: colors.cyan, children: [formatAddress(players[0], ensNames[players[0]], "medium"), " (", ui.getPlayerLabel(players[0], publicData), ")"] }), _jsx(Text, { color: colors.dimmed, children: " vs " }), _jsxs(Text, { color: colors.secondary, children: [formatAddress(players[1], ensNames[players[1]], "medium"), " (", ui.getPlayerLabel(players[1], publicData), ")"] })] })), _jsxs(Text, { children: [_jsx(Text, { color: colors.dimmed, children: "> move: " }), _jsx(Text, { children: turnDisplay })] }), _jsx(Text, { children: "" }), error ? (_jsx(Text, { color: colors.error, children: error })) : (_jsxs(Box, { flexDirection: "column", children: [_jsx(ColoredBoard, { html: boardHtml }), statusStr && (_jsx(Text, { color: colors.warning, bold: true, children: statusStr })), _jsx(Text, { children: "" }), gameOver ? (_jsxs(Text, { children: [_jsx(Text, { color: colors.primary, children: "> " }), _jsxs(Text, { color: colors.secondary, bold: true, children: ["GAME OVER - ", winner
|
|
96
|
+
? `Winner: ${formatAddress(winner, ensNames[winner], "medium")} (${reason})`
|
|
97
|
+
: `Draw (${reason})`] })] })) : status === "connected" || status === "ACTIVE" ? (_jsxs(Text, { children: [_jsx(Text, { color: colors.primary, children: "> " }), _jsxs(Text, { color: colors.dimmed, children: ["waiting for ", currentPlayer ? formatAddress(currentPlayer, ensNames[currentPlayer], "medium") : "...", "... "] }), _jsx(Text, { children: "█" })] })) : (_jsx(Text, { color: colors.error, children: "connecting..." }))] })), _jsx(Text, { children: "" }), _jsx(Text, { color: colors.dimmed, children: "Press Esc to return to lobby" })] }));
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=WatchGame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WatchGame.js","sourceRoot":"","sources":["../../../src/tui/screens/WatchGame.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { Box, Text, useInput } from "ink";
|
|
4
|
+
import { formatAddress } from "@dorkfun/core";
|
|
5
|
+
import { colors } from "../theme.js";
|
|
6
|
+
import { useEnsNames } from "../hooks/useEnsNames.js";
|
|
7
|
+
import * as api from "../../transport/httpClient.js";
|
|
8
|
+
export function WatchList({ onSelect, onBack }) {
|
|
9
|
+
const [matches, setMatches] = useState([]);
|
|
10
|
+
const [selected, setSelected] = useState(0);
|
|
11
|
+
const [loading, setLoading] = useState(true);
|
|
12
|
+
const [error, setError] = useState("");
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
api
|
|
15
|
+
.listMatches()
|
|
16
|
+
.then((res) => {
|
|
17
|
+
setMatches(res.matches);
|
|
18
|
+
setLoading(false);
|
|
19
|
+
})
|
|
20
|
+
.catch((err) => {
|
|
21
|
+
setError(err.message);
|
|
22
|
+
setLoading(false);
|
|
23
|
+
});
|
|
24
|
+
}, []);
|
|
25
|
+
useInput((_input, key) => {
|
|
26
|
+
if (key.escape) {
|
|
27
|
+
onBack();
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (matches.length === 0)
|
|
31
|
+
return;
|
|
32
|
+
if (key.upArrow)
|
|
33
|
+
setSelected((s) => Math.max(0, s - 1));
|
|
34
|
+
if (key.downArrow)
|
|
35
|
+
setSelected((s) => Math.min(matches.length - 1, s + 1));
|
|
36
|
+
if (key.return) {
|
|
37
|
+
const m = matches[selected];
|
|
38
|
+
if (m)
|
|
39
|
+
onSelect(m.matchId, m.gameId);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
const allPlayers = matches.flatMap((m) => m.players);
|
|
43
|
+
const ensNames = useEnsNames(allPlayers);
|
|
44
|
+
const formatPlayer = (addr) => formatAddress(addr, ensNames[addr]);
|
|
45
|
+
return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [_jsx(Text, { color: colors.primary, bold: true, children: "═══ LIVE GAMES ═══" }), _jsx(Text, { color: colors.dimmed, children: "" }), loading && _jsx(Text, { color: colors.dimmed, children: "Loading matches..." }), error && _jsxs(Text, { color: colors.error, children: ["Error: ", error] }), !loading && !error && matches.length === 0 && (_jsx(Text, { color: colors.warning, children: "No active games to watch right now." })), matches.map((m, i) => (_jsxs(Box, { flexDirection: "row", children: [_jsx(Text, { color: i === selected ? colors.primary : colors.dimmed, children: i === selected ? " ▸ " : " " }), _jsx(Text, { color: i === selected ? colors.primary : colors.text, children: m.gameId }), _jsxs(Text, { color: colors.dimmed, children: [" ", m.players.map(formatPlayer).join(" vs ")] }), _jsxs(Text, { color: colors.dimmed, children: [" ", "[", m.status, "]"] })] }, m.matchId))), _jsx(Text, { color: colors.dimmed, children: "" }), _jsx(Text, { color: colors.dimmed, children: matches.length > 0
|
|
46
|
+
? "Use ↑↓ to select, Enter to watch, Esc to go back"
|
|
47
|
+
: "Press Esc to go back" })] }));
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=WatchList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WatchList.js","sourceRoot":"","sources":["../../../src/tui/screens/WatchList.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export declare const colors: {
|
|
2
|
+
primary: string;
|
|
3
|
+
secondary: string;
|
|
4
|
+
dimmed: string;
|
|
5
|
+
error: string;
|
|
6
|
+
warning: string;
|
|
7
|
+
text: string;
|
|
8
|
+
bg: string;
|
|
9
|
+
border: string;
|
|
10
|
+
white: string;
|
|
11
|
+
cyan: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const symbols: {
|
|
14
|
+
topLeft: string;
|
|
15
|
+
topRight: string;
|
|
16
|
+
bottomLeft: string;
|
|
17
|
+
bottomRight: string;
|
|
18
|
+
horizontal: string;
|
|
19
|
+
vertical: string;
|
|
20
|
+
cross: string;
|
|
21
|
+
tee: string;
|
|
22
|
+
teeRight: string;
|
|
23
|
+
teeDown: string;
|
|
24
|
+
teeUp: string;
|
|
25
|
+
bullet: string;
|
|
26
|
+
arrow: string;
|
|
27
|
+
check: string;
|
|
28
|
+
x: string;
|
|
29
|
+
spinner: string[];
|
|
30
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export const colors = {
|
|
2
|
+
primary: "#00ff41", // Matrix green
|
|
3
|
+
secondary: "#ffb000", // Amber
|
|
4
|
+
dimmed: "#666666",
|
|
5
|
+
error: "#ff3333",
|
|
6
|
+
warning: "#ffaa00",
|
|
7
|
+
text: "#cccccc",
|
|
8
|
+
bg: "#0a0a0a",
|
|
9
|
+
border: "#333333",
|
|
10
|
+
white: "#ffffff",
|
|
11
|
+
cyan: "#00ffff",
|
|
12
|
+
};
|
|
13
|
+
export const symbols = {
|
|
14
|
+
topLeft: "┌",
|
|
15
|
+
topRight: "┐",
|
|
16
|
+
bottomLeft: "└",
|
|
17
|
+
bottomRight: "┘",
|
|
18
|
+
horizontal: "─",
|
|
19
|
+
vertical: "│",
|
|
20
|
+
cross: "┼",
|
|
21
|
+
tee: "├",
|
|
22
|
+
teeRight: "┤",
|
|
23
|
+
teeDown: "┬",
|
|
24
|
+
teeUp: "┴",
|
|
25
|
+
bullet: "●",
|
|
26
|
+
arrow: "▸",
|
|
27
|
+
check: "✔",
|
|
28
|
+
x: "✘",
|
|
29
|
+
spinner: ["◐", "◓", "◑", "◒"],
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,OAAO,EAAE,SAAS,EAAO,eAAe;IACxC,SAAS,EAAE,SAAS,EAAK,QAAQ;IACjC,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,SAAS;IACf,EAAE,EAAE,SAAS;IACb,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,UAAU,EAAE,GAAG;IACf,WAAW,EAAE,GAAG;IAChB,UAAU,EAAE,GAAG;IACf,QAAQ,EAAE,GAAG;IACb,KAAK,EAAE,GAAG;IACV,GAAG,EAAE,GAAG;IACR,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,GAAG;IACZ,KAAK,EAAE,GAAG;IACV,MAAM,EAAE,GAAG;IACX,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,GAAG;IACV,CAAC,EAAE,GAAG;IACN,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CAC9B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Wallet } from "ethers";
|
|
2
|
+
export declare function getWallet(): Wallet;
|
|
3
|
+
export declare function getAddress(): string;
|
|
4
|
+
export declare function signMessage(message: string): Promise<string>;
|
|
5
|
+
/**
|
|
6
|
+
* Submit an escrow deposit transaction on-chain.
|
|
7
|
+
* Returns the transaction hash.
|
|
8
|
+
*/
|
|
9
|
+
export declare function sendEscrowDeposit(escrow: {
|
|
10
|
+
address: string;
|
|
11
|
+
stakeWei: string;
|
|
12
|
+
matchIdBytes32: string;
|
|
13
|
+
}): Promise<string>;
|