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.
Files changed (110) hide show
  1. package/.env.example +6 -0
  2. package/dist/commands/agent.d.ts +2 -0
  3. package/dist/commands/agent.js +163 -0
  4. package/dist/commands/agent.js.map +1 -0
  5. package/dist/commands/config.d.ts +3 -0
  6. package/dist/commands/config.js +124 -0
  7. package/dist/commands/config.js.map +1 -0
  8. package/dist/config/configFile.d.ts +6 -0
  9. package/dist/config/configFile.js +43 -0
  10. package/dist/config/configFile.js.map +1 -0
  11. package/dist/config/defaults.d.ts +10 -0
  12. package/dist/config/defaults.js +19 -0
  13. package/dist/config/defaults.js.map +1 -0
  14. package/dist/config/index.d.ts +4 -0
  15. package/dist/config/index.js +5 -0
  16. package/dist/config/index.js.map +1 -0
  17. package/dist/config/resolve.d.ts +3 -0
  18. package/dist/config/resolve.js +24 -0
  19. package/dist/config/resolve.js.map +1 -0
  20. package/dist/config/runtime.d.ts +3 -0
  21. package/dist/config/runtime.js +13 -0
  22. package/dist/config/runtime.js.map +1 -0
  23. package/dist/config.d.ts +6 -0
  24. package/dist/config.js +6 -0
  25. package/dist/config.js.map +1 -0
  26. package/dist/index.d.ts +2 -0
  27. package/dist/index.js +230 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/transport/httpClient.d.ts +13 -0
  30. package/dist/transport/httpClient.js +91 -0
  31. package/dist/transport/httpClient.js.map +1 -0
  32. package/dist/transport/wsClient.d.ts +30 -0
  33. package/dist/transport/wsClient.js +196 -0
  34. package/dist/transport/wsClient.js.map +1 -0
  35. package/dist/tui/App.d.ts +6 -0
  36. package/dist/tui/App.js +40 -0
  37. package/dist/tui/App.js.map +1 -0
  38. package/dist/tui/components/ChatPanel.d.ts +12 -0
  39. package/dist/tui/components/ChatPanel.js +18 -0
  40. package/dist/tui/components/ChatPanel.js.map +1 -0
  41. package/dist/tui/components/ColoredBoard.d.ts +7 -0
  42. package/dist/tui/components/ColoredBoard.js +73 -0
  43. package/dist/tui/components/ColoredBoard.js.map +1 -0
  44. package/dist/tui/components/PlayerInfo.d.ts +10 -0
  45. package/dist/tui/components/PlayerInfo.js +10 -0
  46. package/dist/tui/components/PlayerInfo.js.map +1 -0
  47. package/dist/tui/components/StatusBar.d.ts +7 -0
  48. package/dist/tui/components/StatusBar.js +13 -0
  49. package/dist/tui/components/StatusBar.js.map +1 -0
  50. package/dist/tui/components/TicTacToeBoard.d.ts +6 -0
  51. package/dist/tui/components/TicTacToeBoard.js +19 -0
  52. package/dist/tui/components/TicTacToeBoard.js.map +1 -0
  53. package/dist/tui/hooks/useEnsNames.d.ts +5 -0
  54. package/dist/tui/hooks/useEnsNames.js +33 -0
  55. package/dist/tui/hooks/useEnsNames.js.map +1 -0
  56. package/dist/tui/screens/GameBoard.d.ts +10 -0
  57. package/dist/tui/screens/GameBoard.js +245 -0
  58. package/dist/tui/screens/GameBoard.js.map +1 -0
  59. package/dist/tui/screens/GameOver.d.ts +10 -0
  60. package/dist/tui/screens/GameOver.js +21 -0
  61. package/dist/tui/screens/GameOver.js.map +1 -0
  62. package/dist/tui/screens/Leaderboard.d.ts +5 -0
  63. package/dist/tui/screens/Leaderboard.js +102 -0
  64. package/dist/tui/screens/Leaderboard.js.map +1 -0
  65. package/dist/tui/screens/Lobby.d.ts +8 -0
  66. package/dist/tui/screens/Lobby.js +113 -0
  67. package/dist/tui/screens/Lobby.js.map +1 -0
  68. package/dist/tui/screens/Matchmaking.d.ts +9 -0
  69. package/dist/tui/screens/Matchmaking.js +66 -0
  70. package/dist/tui/screens/Matchmaking.js.map +1 -0
  71. package/dist/tui/screens/WatchGame.d.ts +7 -0
  72. package/dist/tui/screens/WatchGame.js +99 -0
  73. package/dist/tui/screens/WatchGame.js.map +1 -0
  74. package/dist/tui/screens/WatchList.d.ts +6 -0
  75. package/dist/tui/screens/WatchList.js +49 -0
  76. package/dist/tui/screens/WatchList.js.map +1 -0
  77. package/dist/tui/theme.d.ts +30 -0
  78. package/dist/tui/theme.js +31 -0
  79. package/dist/tui/theme.js.map +1 -0
  80. package/dist/wallet/signer.d.ts +13 -0
  81. package/dist/wallet/signer.js +41 -0
  82. package/dist/wallet/signer.js.map +1 -0
  83. package/package.json +43 -0
  84. package/play-agents.cjs +444 -0
  85. package/src/commands/agent.ts +175 -0
  86. package/src/commands/config.ts +162 -0
  87. package/src/config/configFile.ts +55 -0
  88. package/src/config/defaults.ts +28 -0
  89. package/src/config/index.ts +15 -0
  90. package/src/config/resolve.ts +33 -0
  91. package/src/config/runtime.ts +18 -0
  92. package/src/index.ts +237 -0
  93. package/src/transport/httpClient.ts +104 -0
  94. package/src/transport/wsClient.ts +214 -0
  95. package/src/tui/App.tsx +130 -0
  96. package/src/tui/components/ChatPanel.tsx +53 -0
  97. package/src/tui/components/ColoredBoard.tsx +98 -0
  98. package/src/tui/components/PlayerInfo.tsx +31 -0
  99. package/src/tui/components/StatusBar.tsx +35 -0
  100. package/src/tui/hooks/useEnsNames.ts +35 -0
  101. package/src/tui/screens/GameBoard.tsx +434 -0
  102. package/src/tui/screens/GameOver.tsx +83 -0
  103. package/src/tui/screens/Leaderboard.tsx +196 -0
  104. package/src/tui/screens/Lobby.tsx +197 -0
  105. package/src/tui/screens/Matchmaking.tsx +107 -0
  106. package/src/tui/screens/WatchGame.tsx +182 -0
  107. package/src/tui/screens/WatchList.tsx +99 -0
  108. package/src/tui/theme.ts +31 -0
  109. package/src/wallet/signer.ts +54 -0
  110. 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":"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"}
@@ -0,0 +1,7 @@
1
+ interface WatchGameProps {
2
+ matchId: string;
3
+ gameId: string;
4
+ onBack: () => void;
5
+ }
6
+ export declare function WatchGame({ matchId, gameId, onBack }: WatchGameProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -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,6 @@
1
+ interface WatchListProps {
2
+ onSelect: (matchId: string, gameId: string) => void;
3
+ onBack: () => void;
4
+ }
5
+ export declare function WatchList({ onSelect, onBack }: WatchListProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -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>;