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
package/dist/index.js ADDED
@@ -0,0 +1,230 @@
1
+ #!/usr/bin/env node
2
+ import dotenv from "dotenv";
3
+ dotenv.config({ quiet: true });
4
+ import { program } from "commander";
5
+ import { parseEther } from "ethers";
6
+ import { formatAddress } from "@dorkfun/core";
7
+ import React from "react";
8
+ import { render } from "ink";
9
+ import { App } from "./tui/App.js";
10
+ import { getAddress } from "./wallet/signer.js";
11
+ import * as api from "./transport/httpClient.js";
12
+ import { initConfig, setCliOverride } from "./config/index.js";
13
+ import { registerConfigCommand } from "./commands/config.js";
14
+ import { runWizard } from "./commands/config.js";
15
+ import { registerAgentCommand } from "./commands/agent.js";
16
+ program
17
+ .name("dork")
18
+ .description("dork.fun - Play games with AI agents and humans")
19
+ .version("0.1.0", "-v, --version");
20
+ registerConfigCommand(program);
21
+ registerAgentCommand(program);
22
+ program
23
+ .command("play")
24
+ .description("Connect to the server and play a game")
25
+ .option("-g, --game <gameId>", "Game to play", "tictactoe")
26
+ .option("-k, --key <privateKey>", "Ethereum private key")
27
+ .option("--stake <ETH>", "Stake amount in ETH (e.g. 0.01 for 0.01 ETH, 1 for 1 ETH)")
28
+ .action(async (opts) => {
29
+ if (opts.key) {
30
+ setCliOverride("privateKey", opts.key);
31
+ }
32
+ let config = await initConfig();
33
+ // Auto-run setup wizard if no private key is configured
34
+ if (!config.privateKey) {
35
+ console.log("No private key configured. Let's set things up.\n");
36
+ await runWizard();
37
+ config = await initConfig();
38
+ }
39
+ // Convert ETH input to wei for the protocol
40
+ let stakeWei;
41
+ if (opts.stake) {
42
+ try {
43
+ stakeWei = parseEther(opts.stake).toString();
44
+ }
45
+ catch {
46
+ console.error(`Invalid stake amount: "${opts.stake}". Use a decimal ETH value (e.g. 0.01, 1.5)`);
47
+ process.exit(1);
48
+ }
49
+ }
50
+ try {
51
+ const address = getAddress();
52
+ console.log(`Connected as ${address}`);
53
+ console.log(`Server: ${config.serverUrl}`);
54
+ if (stakeWei) {
55
+ console.log(`Stake: ${opts.stake} ETH`);
56
+ }
57
+ console.log("");
58
+ render(React.createElement(App, { playerId: address, stakeWei }));
59
+ }
60
+ catch (err) {
61
+ console.error(`Error: ${err.message}`);
62
+ process.exit(1);
63
+ }
64
+ });
65
+ program
66
+ .command("games")
67
+ .description("List available games")
68
+ .action(async () => {
69
+ await initConfig();
70
+ try {
71
+ const result = await api.listGames();
72
+ console.log("\nAvailable Games:");
73
+ console.log("────────────────");
74
+ for (const game of result.games) {
75
+ console.log(` ${game.name} (${game.id})`);
76
+ console.log(` ${game.description}`);
77
+ console.log(` Players: ${game.minPlayers}-${game.maxPlayers}`);
78
+ console.log("");
79
+ }
80
+ }
81
+ catch (err) {
82
+ console.error(`Error: ${err.message}`);
83
+ }
84
+ });
85
+ program
86
+ .command("matches")
87
+ .description("List active matches")
88
+ .action(async () => {
89
+ await initConfig();
90
+ try {
91
+ const result = await api.listMatches();
92
+ console.log("\nActive Matches:");
93
+ console.log("───────────────");
94
+ if (result.matches.length === 0) {
95
+ console.log(" No active matches");
96
+ }
97
+ const pn = result.matches[0]?.playerNames || {};
98
+ for (const match of result.matches) {
99
+ console.log(` ${match.matchId.slice(0, 8)} ${match.gameId} ${match.status}`);
100
+ console.log(` Players: ${match.players.map((p) => formatAddress(p, pn[p], "medium")).join(", ")}`);
101
+ console.log("");
102
+ }
103
+ }
104
+ catch (err) {
105
+ console.error(`Error: ${err.message}`);
106
+ }
107
+ });
108
+ program
109
+ .command("queue")
110
+ .description("Show players waiting in game queues")
111
+ .action(async () => {
112
+ await initConfig();
113
+ try {
114
+ const result = await api.listQueues();
115
+ console.log("\nQueue Status:");
116
+ console.log("─────────────");
117
+ let totalWaiting = 0;
118
+ for (const q of result.queues) {
119
+ const count = q.entries.length;
120
+ totalWaiting += count;
121
+ console.log(` ${q.gameName} (${q.gameId}): ${count} waiting`);
122
+ const qn = result.playerNames || {};
123
+ for (const entry of q.entries) {
124
+ const name = qn[entry.playerId] || entry.displayName;
125
+ console.log(` - ${name} (${entry.playerId.slice(0, 10)}...)`);
126
+ }
127
+ if (count === 0) {
128
+ console.log(" (empty)");
129
+ }
130
+ console.log("");
131
+ }
132
+ if (totalWaiting === 0) {
133
+ console.log(" No players waiting in any queue");
134
+ }
135
+ }
136
+ catch (err) {
137
+ console.error(`Error: ${err.message}`);
138
+ }
139
+ });
140
+ program
141
+ .command("archive")
142
+ .description("List completed/archived matches")
143
+ .option("-g, --game <gameId>", "Filter by game")
144
+ .option("-l, --limit <count>", "Number of matches to show", "20")
145
+ .action(async (opts) => {
146
+ await initConfig();
147
+ try {
148
+ const limit = parseInt(opts.limit) || 20;
149
+ const result = await api.listArchive(opts.game, limit, 0);
150
+ console.log("\nMatch Archive:");
151
+ console.log("──────────────");
152
+ if (result.matches.length === 0) {
153
+ console.log(" No archived matches found");
154
+ }
155
+ const archiveNames = result.playerNames || {};
156
+ for (const match of result.matches) {
157
+ const outcome = match.winner
158
+ ? `Winner: ${formatAddress(match.winner, archiveNames[match.winner], "medium")}`
159
+ : "Draw";
160
+ const date = match.completedAt
161
+ ? new Date(match.completedAt).toLocaleString()
162
+ : "-";
163
+ console.log(` ${match.matchId.slice(0, 8)} ${match.gameId} ${match.status}`);
164
+ console.log(` Players: ${match.players.map((p) => formatAddress(p, archiveNames[p], "medium")).join(" vs ")}`);
165
+ console.log(` Outcome: ${outcome}`);
166
+ console.log(` Ended: ${date}`);
167
+ console.log("");
168
+ }
169
+ console.log(` Showing ${result.matches.length} of ${result.total} total`);
170
+ }
171
+ catch (err) {
172
+ console.error(`Error: ${err.message}`);
173
+ }
174
+ });
175
+ program
176
+ .command("watch")
177
+ .description("Watch a live or archived game")
178
+ .argument("[matchId]", "Match ID to watch")
179
+ .action(async (matchId) => {
180
+ await initConfig();
181
+ if (!matchId) {
182
+ const result = await api.listMatches();
183
+ if (result.matches.length === 0) {
184
+ console.log("No active matches to watch");
185
+ return;
186
+ }
187
+ console.log("\nActive matches:");
188
+ for (const match of result.matches) {
189
+ console.log(` ${match.matchId} (${match.gameId})`);
190
+ }
191
+ return;
192
+ }
193
+ try {
194
+ const match = await api.getMatch(matchId);
195
+ console.log(`\nWatching: ${match.matchId}`);
196
+ console.log(`Game: ${match.gameId}`);
197
+ console.log(`Status: ${match.status}`);
198
+ const watchNames = match.playerNames || {};
199
+ console.log(`Players: ${match.players.map((p) => formatAddress(p, watchNames[p], "medium")).join(" vs ")}`);
200
+ if (match.observation) {
201
+ const board = match.observation.publicData?.board;
202
+ if (board) {
203
+ console.log("\nBoard:");
204
+ for (let r = 0; r < 3; r++) {
205
+ const row = board.slice(r * 3, r * 3 + 3).map((c) => c || ".").join(" | ");
206
+ console.log(` ${row}`);
207
+ if (r < 2)
208
+ console.log(" ──┼───┼──");
209
+ }
210
+ }
211
+ }
212
+ if (["completed", "settled", "disputed"].includes(match.status)) {
213
+ const outcome = match.winner
214
+ ? `Winner: ${formatAddress(match.winner, watchNames[match.winner], "medium")}`
215
+ : "Draw";
216
+ console.log(`\nResult: ${outcome}`);
217
+ if (match.completedAt) {
218
+ console.log(`Ended: ${new Date(match.completedAt).toLocaleString()}`);
219
+ }
220
+ if (match.transcript) {
221
+ console.log(`Moves: ${match.transcript.length}`);
222
+ }
223
+ }
224
+ }
225
+ catch (err) {
226
+ console.error(`Error: ${err.message}`);
227
+ }
228
+ });
229
+ program.parse();
230
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare function listGames(): Promise<any>;
2
+ export declare function listMatches(): Promise<any>;
3
+ export declare function getMatch(matchId: string): Promise<any>;
4
+ export declare function joinQueue(playerId: string, gameId: string, ticket?: string, stakeWei?: string): Promise<any>;
5
+ export declare function leaveQueue(ticket: string): Promise<any>;
6
+ export declare function createPrivateMatch(playerId: string, gameId: string, stakeWei?: string): Promise<any>;
7
+ export declare function acceptPrivateMatch(playerId: string, inviteCode: string): Promise<any>;
8
+ export declare function checkActiveMatch(playerId: string): Promise<any>;
9
+ export declare function listQueues(): Promise<any>;
10
+ export declare function listArchive(gameId?: string, limit?: number, offset?: number): Promise<any>;
11
+ export declare function getLeaderboard(limit?: number, offset?: number, sort?: "rating" | "earnings"): Promise<any>;
12
+ export declare function getGameLeaderboard(gameId: string, limit?: number, offset?: number, sort?: "rating" | "earnings"): Promise<any>;
13
+ export declare function resolveEns(addresses: string[]): Promise<Record<string, string | null>>;
@@ -0,0 +1,91 @@
1
+ import { buildAuthMessage } from "@dorkfun/core";
2
+ import { getConfig } from "../config/runtime.js";
3
+ import { signMessage } from "../wallet/signer.js";
4
+ async function request(path, opts) {
5
+ const base = getConfig().serverUrl;
6
+ const res = await fetch(`${base}${path}`, {
7
+ ...opts,
8
+ headers: { "Content-Type": "application/json", ...opts?.headers },
9
+ });
10
+ if (!res.ok) {
11
+ const body = await res.json().catch(() => ({}));
12
+ throw new Error(body.error || `HTTP ${res.status}`);
13
+ }
14
+ return res.json();
15
+ }
16
+ /**
17
+ * Build the authentication payload for endpoints that require proof of
18
+ * EVM address ownership: { playerId, signature, timestamp }.
19
+ */
20
+ async function buildAuth(playerId) {
21
+ const timestamp = Date.now();
22
+ const message = buildAuthMessage(playerId, timestamp);
23
+ const signature = await signMessage(message);
24
+ return { playerId, signature, timestamp };
25
+ }
26
+ export async function listGames() {
27
+ return request("/api/games");
28
+ }
29
+ export async function listMatches() {
30
+ return request("/api/matches");
31
+ }
32
+ export async function getMatch(matchId) {
33
+ return request(`/api/matches/${matchId}`);
34
+ }
35
+ export async function joinQueue(playerId, gameId, ticket, stakeWei) {
36
+ const auth = await buildAuth(playerId);
37
+ return request("/api/matchmaking/join", {
38
+ method: "POST",
39
+ body: JSON.stringify({ ...auth, gameId, ticket, stakeWei }),
40
+ });
41
+ }
42
+ export async function leaveQueue(ticket) {
43
+ return request("/api/matchmaking/leave", {
44
+ method: "POST",
45
+ body: JSON.stringify({ ticket }),
46
+ });
47
+ }
48
+ export async function createPrivateMatch(playerId, gameId, stakeWei) {
49
+ const auth = await buildAuth(playerId);
50
+ return request("/api/matches/private", {
51
+ method: "POST",
52
+ body: JSON.stringify({ ...auth, gameId, stakeWei }),
53
+ });
54
+ }
55
+ export async function acceptPrivateMatch(playerId, inviteCode) {
56
+ const auth = await buildAuth(playerId);
57
+ return request("/api/matches/accept", {
58
+ method: "POST",
59
+ body: JSON.stringify({ ...auth, inviteCode }),
60
+ });
61
+ }
62
+ export async function checkActiveMatch(playerId) {
63
+ const auth = await buildAuth(playerId);
64
+ return request("/api/matches/active", {
65
+ method: "POST",
66
+ body: JSON.stringify(auth),
67
+ });
68
+ }
69
+ export async function listQueues() {
70
+ return request("/api/queues");
71
+ }
72
+ export async function listArchive(gameId, limit = 50, offset = 0) {
73
+ const params = new URLSearchParams({ limit: String(limit), offset: String(offset) });
74
+ if (gameId)
75
+ params.set("gameId", gameId);
76
+ return request(`/api/archive?${params}`);
77
+ }
78
+ export async function getLeaderboard(limit = 50, offset = 0, sort = "rating") {
79
+ return request(`/api/leaderboard?limit=${limit}&offset=${offset}&sort=${sort}`);
80
+ }
81
+ export async function getGameLeaderboard(gameId, limit = 50, offset = 0, sort = "rating") {
82
+ return request(`/api/leaderboard/${gameId}?limit=${limit}&offset=${offset}&sort=${sort}`);
83
+ }
84
+ export async function resolveEns(addresses) {
85
+ const result = await request("/api/ens/resolve", {
86
+ method: "POST",
87
+ body: JSON.stringify({ addresses }),
88
+ });
89
+ return result.names;
90
+ }
91
+ //# sourceMappingURL=httpClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpClient.js","sourceRoot":"","sources":["../../src/transport/httpClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { WsMessage } from "@dorkfun/core";
2
+ export type MessageHandler = (msg: WsMessage) => void;
3
+ export declare class GameWebSocket {
4
+ private ws;
5
+ private handlers;
6
+ private matchId;
7
+ private reconnectAttempts;
8
+ private closed;
9
+ private helloToken;
10
+ private helloPlayerId;
11
+ private wsPath;
12
+ connect(matchId: string, path?: string): Promise<void>;
13
+ private doConnect;
14
+ private tryReconnect;
15
+ on(type: string, handler: MessageHandler): void;
16
+ private emit;
17
+ sendHello(token: string, playerId: string): void;
18
+ /** Send a HELLO with signature-based auth (used for reconnection). */
19
+ sendHelloWithSignature(playerId: string, signature: string, timestamp: number): void;
20
+ sendAction(matchId: string, action: {
21
+ type: string;
22
+ data: Record<string, unknown>;
23
+ }): void;
24
+ sendSpectateJoin(matchId: string, displayName: string): void;
25
+ sendSyncRequest(matchId: string, clientIsMyTurn: boolean): void;
26
+ sendChat(matchId: string, message: string): void;
27
+ private send;
28
+ close(): void;
29
+ get isConnected(): boolean;
30
+ }
@@ -0,0 +1,196 @@
1
+ import WebSocket from "ws";
2
+ import { buildAuthMessage } from "@dorkfun/core";
3
+ import { getConfig } from "../config/runtime.js";
4
+ import { signMessage } from "../wallet/signer.js";
5
+ const MAX_RECONNECT_ATTEMPTS = 5;
6
+ const RECONNECT_DELAY_MS = 2000;
7
+ export class GameWebSocket {
8
+ ws = null;
9
+ handlers = new Map();
10
+ matchId = "";
11
+ reconnectAttempts = 0;
12
+ closed = false;
13
+ helloToken = "";
14
+ helloPlayerId = "";
15
+ wsPath = "game";
16
+ connect(matchId, path = "game") {
17
+ this.matchId = matchId;
18
+ this.wsPath = path;
19
+ this.closed = false;
20
+ return this.doConnect();
21
+ }
22
+ doConnect() {
23
+ return new Promise((resolve, reject) => {
24
+ const url = `${getConfig().wsUrl}/ws/${this.wsPath}/${this.matchId}`;
25
+ this.ws = new WebSocket(url);
26
+ this.ws.on("open", async () => {
27
+ this.reconnectAttempts = 0;
28
+ // Re-authenticate on reconnect
29
+ if (this.helloPlayerId) {
30
+ if (this.helloToken) {
31
+ // First connection — use the one-time token
32
+ this.sendHello(this.helloToken, this.helloPlayerId);
33
+ }
34
+ else {
35
+ // Reconnection — generate a fresh signature
36
+ try {
37
+ const timestamp = Date.now();
38
+ const message = buildAuthMessage(this.helloPlayerId, timestamp);
39
+ const signature = await signMessage(message);
40
+ this.sendHelloWithSignature(this.helloPlayerId, signature, timestamp);
41
+ }
42
+ catch {
43
+ // Signing failed — can't reconnect
44
+ }
45
+ }
46
+ }
47
+ resolve();
48
+ });
49
+ this.ws.on("error", (err) => {
50
+ if (this.reconnectAttempts === 0 && !this.closed) {
51
+ reject(err);
52
+ }
53
+ });
54
+ this.ws.on("message", (raw) => {
55
+ try {
56
+ const msg = JSON.parse(raw.toString());
57
+ this.emit(msg.type, msg);
58
+ this.emit("*", msg);
59
+ }
60
+ catch {
61
+ // Ignore parse errors
62
+ }
63
+ });
64
+ this.ws.on("close", () => {
65
+ if (this.closed)
66
+ return;
67
+ this.tryReconnect();
68
+ });
69
+ });
70
+ }
71
+ tryReconnect() {
72
+ if (this.closed)
73
+ return;
74
+ if (this.reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {
75
+ this.emit("close", {
76
+ type: "ERROR",
77
+ matchId: this.matchId,
78
+ payload: { error: "Connection lost after max retries" },
79
+ sequence: 0,
80
+ prevHash: "",
81
+ timestamp: Date.now(),
82
+ });
83
+ return;
84
+ }
85
+ this.reconnectAttempts++;
86
+ this.emit("reconnecting", {
87
+ type: "ERROR",
88
+ matchId: this.matchId,
89
+ payload: { error: `Reconnecting... (attempt ${this.reconnectAttempts})` },
90
+ sequence: 0,
91
+ prevHash: "",
92
+ timestamp: Date.now(),
93
+ });
94
+ setTimeout(() => {
95
+ if (this.closed)
96
+ return;
97
+ this.doConnect().catch(() => {
98
+ this.tryReconnect();
99
+ });
100
+ }, RECONNECT_DELAY_MS);
101
+ }
102
+ on(type, handler) {
103
+ if (!this.handlers.has(type)) {
104
+ this.handlers.set(type, []);
105
+ }
106
+ this.handlers.get(type).push(handler);
107
+ }
108
+ emit(type, msg) {
109
+ const handlers = this.handlers.get(type) || [];
110
+ for (const handler of handlers) {
111
+ handler(msg);
112
+ }
113
+ }
114
+ sendHello(token, playerId) {
115
+ this.helloToken = token;
116
+ this.helloPlayerId = playerId;
117
+ this.send({
118
+ type: "HELLO",
119
+ matchId: "",
120
+ payload: { token, playerId },
121
+ sequence: 0,
122
+ prevHash: "",
123
+ timestamp: Date.now(),
124
+ });
125
+ }
126
+ /** Send a HELLO with signature-based auth (used for reconnection). */
127
+ sendHelloWithSignature(playerId, signature, timestamp) {
128
+ this.helloPlayerId = playerId;
129
+ // Clear token so future reconnects use signature path
130
+ this.helloToken = "";
131
+ this.send({
132
+ type: "HELLO",
133
+ matchId: "",
134
+ payload: { playerId, signature, timestamp },
135
+ sequence: 0,
136
+ prevHash: "",
137
+ timestamp: Date.now(),
138
+ });
139
+ }
140
+ sendAction(matchId, action) {
141
+ this.send({
142
+ type: "ACTION_COMMIT",
143
+ matchId,
144
+ payload: { action },
145
+ sequence: 0,
146
+ prevHash: "",
147
+ timestamp: Date.now(),
148
+ });
149
+ }
150
+ sendSpectateJoin(matchId, displayName) {
151
+ this.send({
152
+ type: "SPECTATE_JOIN",
153
+ matchId,
154
+ payload: { displayName },
155
+ sequence: 0,
156
+ prevHash: "",
157
+ timestamp: Date.now(),
158
+ });
159
+ }
160
+ sendSyncRequest(matchId, clientIsMyTurn) {
161
+ this.send({
162
+ type: "SYNC_REQUEST",
163
+ matchId,
164
+ payload: { clientIsMyTurn },
165
+ sequence: 0,
166
+ prevHash: "",
167
+ timestamp: Date.now(),
168
+ });
169
+ }
170
+ sendChat(matchId, message) {
171
+ this.send({
172
+ type: "CHAT",
173
+ matchId,
174
+ payload: { message },
175
+ sequence: 0,
176
+ prevHash: "",
177
+ timestamp: Date.now(),
178
+ });
179
+ }
180
+ send(msg) {
181
+ if (this.ws && this.ws.readyState === WebSocket.OPEN) {
182
+ this.ws.send(JSON.stringify(msg));
183
+ }
184
+ }
185
+ close() {
186
+ this.closed = true;
187
+ if (this.ws) {
188
+ this.ws.close();
189
+ this.ws = null;
190
+ }
191
+ }
192
+ get isConnected() {
193
+ return this.ws !== null && this.ws.readyState === WebSocket.OPEN;
194
+ }
195
+ }
196
+ //# sourceMappingURL=wsClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsClient.js","sourceRoot":"","sources":["../../src/transport/wsClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface AppProps {
2
+ playerId: string;
3
+ stakeWei?: string;
4
+ }
5
+ export declare function App({ playerId, stakeWei: initialStakeWei }: AppProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from "react";
3
+ import { Box, useInput, useApp } from "ink";
4
+ import { StatusBar } from "./components/StatusBar.js";
5
+ import { Lobby } from "./screens/Lobby.js";
6
+ import { Matchmaking } from "./screens/Matchmaking.js";
7
+ import { GameBoard } from "./screens/GameBoard.js";
8
+ import { GameOver } from "./screens/GameOver.js";
9
+ import { WatchList } from "./screens/WatchList.js";
10
+ import { WatchGame } from "./screens/WatchGame.js";
11
+ import { Leaderboard } from "./screens/Leaderboard.js";
12
+ import { getConfig } from "../config/runtime.js";
13
+ import * as api from "../transport/httpClient.js";
14
+ export function App({ playerId, stakeWei: initialStakeWei }) {
15
+ const { exit } = useApp();
16
+ const [screen, setScreen] = useState({ type: "lobby" });
17
+ // On startup, check if the player has an active match to reconnect to
18
+ useEffect(() => {
19
+ api.checkActiveMatch(playerId).then((res) => {
20
+ if (res.hasActiveMatch && res.matchId && res.wsToken) {
21
+ setScreen({
22
+ type: "game",
23
+ matchId: res.matchId,
24
+ wsToken: res.wsToken,
25
+ gameId: res.gameId || "unknown",
26
+ stakeWei: res.stakeWei && res.stakeWei !== "0" ? res.stakeWei : undefined,
27
+ });
28
+ }
29
+ }).catch(() => {
30
+ // Ignore — server might not be reachable yet
31
+ });
32
+ }, [playerId]);
33
+ useInput((input) => {
34
+ if (input === "q" && screen.type === "lobby") {
35
+ exit();
36
+ }
37
+ });
38
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(StatusBar, { playerAddress: playerId, serverUrl: getConfig().serverUrl, connected: true }), screen.type === "lobby" && (_jsx(Lobby, { defaultStakeWei: initialStakeWei, onPlay: (gameId, stakeWei) => setScreen({ type: "matchmaking", gameId, stakeWei }), onWatch: () => setScreen({ type: "watchlist" }), onLeaderboard: () => setScreen({ type: "leaderboard" }) })), screen.type === "leaderboard" && (_jsx(Leaderboard, { onBack: () => setScreen({ type: "lobby" }) })), screen.type === "matchmaking" && (_jsx(Matchmaking, { playerId: playerId, gameId: screen.gameId, stakeWei: screen.stakeWei, onMatched: (matchId, wsToken, _opponent) => setScreen({ type: "game", matchId, wsToken, gameId: screen.gameId, stakeWei: screen.stakeWei }), onCancel: () => setScreen({ type: "lobby" }) })), screen.type === "game" && (_jsx(GameBoard, { matchId: screen.matchId, wsToken: screen.wsToken, playerId: playerId, gameId: screen.gameId, stakeWei: screen.stakeWei, onGameOver: (winner, reason) => setScreen({ type: "gameover", winner, reason, stakeWei: screen.stakeWei }) })), screen.type === "gameover" && (_jsx(GameOver, { winner: screen.winner, reason: screen.reason, playerId: playerId, stakeWei: screen.stakeWei, onRematch: () => setScreen({ type: "lobby" }), onQuit: () => setScreen({ type: "lobby" }) })), screen.type === "watchlist" && (_jsx(WatchList, { onSelect: (matchId, gameId) => setScreen({ type: "watching", matchId, gameId }), onBack: () => setScreen({ type: "lobby" }) })), screen.type === "watching" && (_jsx(WatchGame, { matchId: screen.matchId, gameId: screen.gameId, onBack: () => setScreen({ type: "watchlist" }) }))] }));
39
+ }
40
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"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"}