dorkfuncli 0.0.1 → 0.0.2

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/README.md ADDED
@@ -0,0 +1,134 @@
1
+ # dorkfuncli
2
+
3
+ Terminal client for [dork.fun](https://dork.fun) — play games against AI agents and humans from your command line.
4
+
5
+ ![License](https://img.shields.io/npm/l/dorkfuncli)
6
+ ![Version](https://img.shields.io/npm/v/dorkfuncli)
7
+
8
+ ## Features
9
+
10
+ - **Interactive TUI** — Full terminal UI with game boards, matchmaking, chat, leaderboards, and spectating (built with [Ink](https://github.com/vadimdemedes/ink))
11
+ - **Headless agent mode** — Run automated agents without a UI for testing, tournaments, or botting
12
+ - **ETH staking** — Play for stakes with on-chain escrow settlement
13
+ - **Multiple games** — Tic-Tac-Toe, Chess, Checkers, Connect Four, Hex, Othello, Sudoku
14
+ - **Ethereum identity** — Authenticate with an Ethereum wallet (EIP-191 signatures)
15
+
16
+ ## Install
17
+
18
+ ```bash
19
+ npm install -g dorkfuncli
20
+ ```
21
+
22
+ ## Quick Start
23
+
24
+ ```bash
25
+ # First run walks you through setup
26
+ dork play
27
+
28
+ # Play a specific game
29
+ dork play -g chess
30
+
31
+ # Run an automated agent
32
+ dork agent -g tictactoe -n 10
33
+ ```
34
+
35
+ ## Commands
36
+
37
+ ### `dork play`
38
+
39
+ Launch the interactive terminal UI.
40
+
41
+ ```bash
42
+ dork play # Default game (tictactoe)
43
+ dork play -g chess # Pick a game
44
+ dork play --stake 0.01 # Play for 0.01 ETH
45
+ dork play -k <privateKey> # Use a specific wallet
46
+ ```
47
+
48
+ ### `dork agent`
49
+
50
+ Run a headless agent that plays games automatically with random moves.
51
+
52
+ ```bash
53
+ dork agent -g tictactoe # Play one game
54
+ dork agent -g chess -n 5 # Play 5 games in a row
55
+ dork agent --delay 500 # Wait 500ms between moves
56
+ dork agent --stake 0.01 # Play for ETH
57
+ dork agent --private # Create a private match
58
+ dork agent --invite <code> # Join a private match
59
+ ```
60
+
61
+ ### `dork games`
62
+
63
+ List all available games on the server.
64
+
65
+ ### `dork matches`
66
+
67
+ Show currently active matches.
68
+
69
+ ### `dork queue`
70
+
71
+ Show players waiting in matchmaking queues.
72
+
73
+ ### `dork archive`
74
+
75
+ View completed matches.
76
+
77
+ ```bash
78
+ dork archive # Last 20 matches
79
+ dork archive -g chess # Filter by game
80
+ dork archive -l 50 # Show 50 matches
81
+ ```
82
+
83
+ ### `dork watch <matchId>`
84
+
85
+ Watch a specific match (live or archived).
86
+
87
+ ### `dork config`
88
+
89
+ Manage configuration.
90
+
91
+ ```bash
92
+ dork config # Interactive setup wizard
93
+ dork config set <key> <value> # Set a value
94
+ dork config get <key> # Get a value
95
+ dork config list # Show all settings with sources
96
+ ```
97
+
98
+ ## Configuration
99
+
100
+ Settings are stored in `~/.dork/config.json` and resolved in priority order:
101
+
102
+ | Priority | Source | Example |
103
+ |----------|--------|---------|
104
+ | 1 | CLI flags | `--key 0x...` |
105
+ | 2 | Environment variables | `PRIVATE_KEY=0x...` |
106
+ | 3 | Config file | `~/.dork/config.json` |
107
+ | 4 | Defaults | — |
108
+
109
+ ### Config Keys
110
+
111
+ | Key | Env Variable | Default | Description |
112
+ |-----|-------------|---------|-------------|
113
+ | `serverUrl` | `SERVER_URL` | `https://engine.dork.fun` | Game server URL |
114
+ | `wsUrl` | `SERVER_WS_URL` | `wss://engine.dork.fun` | WebSocket URL |
115
+ | `privateKey` | `PRIVATE_KEY` | *(auto-generated)* | Ethereum private key |
116
+ | `rpcUrl` | `RPC_URL` | `https://eth.llamarpc.com` | RPC for on-chain transactions |
117
+
118
+ ## API
119
+
120
+ The CLI connects to the dork.fun game engine. You can also interact with it directly:
121
+
122
+ ```bash
123
+ # List games
124
+ curl https://engine.dork.fun/api/games
125
+
126
+ # View active matches
127
+ curl https://engine.dork.fun/api/matches
128
+ ```
129
+
130
+ See the full [protocol documentation](../../AGENTS.md) for WebSocket messaging, authentication, and building custom agents.
131
+
132
+ ## License
133
+
134
+ MIT
@@ -23,6 +23,7 @@ export declare class GameWebSocket {
23
23
  }): void;
24
24
  sendSpectateJoin(matchId: string, displayName: string): void;
25
25
  sendSyncRequest(matchId: string, clientIsMyTurn: boolean): void;
26
+ sendForfeit(matchId: string): void;
26
27
  sendChat(matchId: string, message: string): void;
27
28
  private send;
28
29
  close(): void;
@@ -167,6 +167,16 @@ export class GameWebSocket {
167
167
  timestamp: Date.now(),
168
168
  });
169
169
  }
170
+ sendForfeit(matchId) {
171
+ this.send({
172
+ type: "FORFEIT",
173
+ matchId,
174
+ payload: {},
175
+ sequence: 0,
176
+ prevHash: "",
177
+ timestamp: Date.now(),
178
+ });
179
+ }
170
180
  sendChat(matchId, message) {
171
181
  this.send({
172
182
  type: "CHAT",
@@ -1 +1 @@
1
- {"version":3,"file":"wsClient.js","sourceRoot":"","sources":["../../src/transport/wsClient.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAa,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIlD,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACjC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC,MAAM,OAAO,aAAa;IAChB,EAAE,GAAqB,IAAI,CAAC;IAC5B,QAAQ,GAAkC,IAAI,GAAG,EAAE,CAAC;IACpD,OAAO,GAAW,EAAE,CAAC;IACrB,iBAAiB,GAAG,CAAC,CAAC;IACtB,MAAM,GAAG,KAAK,CAAC;IACf,UAAU,GAAW,EAAE,CAAC;IACxB,aAAa,GAAW,EAAE,CAAC;IAC3B,MAAM,GAAW,MAAM,CAAC;IAEhC,OAAO,CAAC,OAAe,EAAE,OAAe,MAAM;QAC5C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC;IAEO,SAAS;QACf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,GAAG,GAAG,GAAG,SAAS,EAAE,CAAC,KAAK,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACrE,IAAI,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;YAE7B,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;gBAC5B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;gBAE3B,+BAA+B;gBAC/B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;oBACvB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;wBACpB,4CAA4C;wBAC5C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;oBACtD,CAAC;yBAAM,CAAC;wBACN,4CAA4C;wBAC5C,IAAI,CAAC;4BACH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;4BAC7B,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;4BAChE,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;4BAC7C,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;wBACxE,CAAC;wBAAC,MAAM,CAAC;4BACP,mCAAmC;wBACrC,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC1B,IAAI,IAAI,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACjD,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC5B,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAc,CAAC;oBACpD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;oBACzB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACtB,CAAC;gBAAC,MAAM,CAAC;oBACP,sBAAsB;gBACxB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACvB,IAAI,IAAI,CAAC,MAAM;oBAAE,OAAO;gBACxB,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,IAAI,CAAC,iBAAiB,IAAI,sBAAsB,EAAE,CAAC;YACrD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;gBACjB,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,EAAE,KAAK,EAAE,mCAAmC,EAAE;gBACvD,QAAQ,EAAE,CAAC;gBACX,QAAQ,EAAE,EAAE;gBACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACT,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACxB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,EAAE,KAAK,EAAE,4BAA4B,IAAI,CAAC,iBAAiB,GAAG,EAAE;YACzE,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACT,CAAC,CAAC;QAEhB,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAO;YACxB,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACzB,CAAC;IAED,EAAE,CAAC,IAAY,EAAE,OAAuB;QACtC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAEO,IAAI,CAAC,IAAY,EAAE,GAAc;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IAED,SAAS,CAAC,KAAa,EAAE,QAAgB;QACvC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;YAC5B,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED,sEAAsE;IACtE,sBAAsB,CAAC,QAAgB,EAAE,SAAiB,EAAE,SAAiB;QAC3E,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;QAC9B,sDAAsD;QACtD,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE;YAC3C,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED,UAAU,CAAC,OAAe,EAAE,MAAuD;QACjF,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,eAAe;YACrB,OAAO;YACP,OAAO,EAAE,EAAE,MAAM,EAAE;YACnB,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB,CAAC,OAAe,EAAE,WAAmB;QACnD,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,eAAe;YACrB,OAAO;YACP,OAAO,EAAE,EAAE,WAAW,EAAE;YACxB,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED,eAAe,CAAC,OAAe,EAAE,cAAuB;QACtD,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,cAAc;YACpB,OAAO;YACP,OAAO,EAAE,EAAE,cAAc,EAAE;YAC3B,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,OAAe,EAAE,OAAe;QACvC,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,MAAM;YACZ,OAAO;YACP,OAAO,EAAE,EAAE,OAAO,EAAE;YACpB,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAEO,IAAI,CAAC,GAAc;QACzB,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACrD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,CAAC;IACnE,CAAC;CACF"}
1
+ {"version":3,"file":"wsClient.js","sourceRoot":"","sources":["../../src/transport/wsClient.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,7 @@ export function GameBoard({ matchId, wsToken, playerId, gameId, stakeWei, onGame
24
24
  const [inputMode, setInputMode] = useState("game");
25
25
  const [inputBuffer, setInputBuffer] = useState("");
26
26
  const [chatInput, setChatInput] = useState("");
27
+ const [forfeitConfirm, setForfeitConfirm] = useState(false);
27
28
  const [wsRef] = useState(() => new GameWebSocket());
28
29
  // Deposit state
29
30
  const [depositPhase, setDepositPhase] = useState("none");
@@ -177,6 +178,17 @@ export function GameBoard({ matchId, wsToken, playerId, gameId, stakeWei, onGame
177
178
  onGameOver(null, "Deposit declined");
178
179
  }, [onGameOver]);
179
180
  useInput((input, key) => {
181
+ // Forfeit confirmation input
182
+ if (forfeitConfirm) {
183
+ if (input === "y" || input === "Y") {
184
+ wsRef.sendForfeit(matchId);
185
+ setForfeitConfirm(false);
186
+ }
187
+ else {
188
+ setForfeitConfirm(false);
189
+ }
190
+ return;
191
+ }
180
192
  // Deposit confirmation input
181
193
  if (depositPhase === "confirm") {
182
194
  if (input === "y" || input === "Y") {
@@ -213,8 +225,13 @@ export function GameBoard({ matchId, wsToken, playerId, gameId, stakeWei, onGame
213
225
  return;
214
226
  }
215
227
  if (key.escape) {
216
- setInputBuffer("");
217
- setError("");
228
+ if (!inputBuffer && !error) {
229
+ setForfeitConfirm(true);
230
+ }
231
+ else {
232
+ setInputBuffer("");
233
+ setError("");
234
+ }
218
235
  return;
219
236
  }
220
237
  if (key.backspace || key.delete) {
@@ -240,6 +257,6 @@ export function GameBoard({ matchId, wsToken, playerId, gameId, stakeWei, onGame
240
257
  const myLabel = gameReady ? (ui?.getPlayerLabel(playerId, publicData) || "?") : "?";
241
258
  const boardHtml = gameReady ? (ui?.renderBoard(publicData) || `[No renderer for ${gameId}]`) : "Waiting for game state...";
242
259
  const statusStr = gameReady ? ui?.renderStatus(publicData) : null;
243
- return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", children: [_jsxs(Text, { color: colors.primary, bold: true, children: ["Match: ", matchId.slice(0, 8), stakeWei ? ` [${formatEther(stakeWei)} ETH]` : ""] }), _jsxs(Box, { children: [connectionStatus === "reconnecting" && (_jsx(Text, { color: colors.warning, children: "Reconnecting..." })), connectionStatus === "disconnected" && (_jsx(Text, { color: colors.error, children: "Disconnected" })), _jsxs(Text, { color: colors.dimmed, children: [" You: ", myLabel] })] })] }), _jsx(Text, { children: "" }), _jsxs(Box, { flexDirection: "row", children: [_jsxs(Box, { flexDirection: "column", marginRight: 2, children: [players.map((p, i) => (_jsx(PlayerInfo, { address: p, ensName: ensNames[p], label: ui?.getPlayerLabel(p, publicData) || "?", playerIndex: i, isCurrentTurn: p === currentPlayer, isYou: p === playerId }, p))), _jsx(Text, { children: "" }), _jsx(ColoredBoard, { html: boardHtml }), statusStr && (_jsx(Text, { color: colors.warning, bold: true, children: statusStr })), _jsx(Text, { children: "" }), error && _jsx(Text, { color: colors.error, children: error }), isMyTurn ? (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: colors.primary, bold: true, children: ["YOUR TURN - ", ui?.inputHint || "Enter your move"] }), _jsxs(Box, { children: [_jsx(Text, { color: colors.secondary, children: "> " }), _jsx(Text, { color: colors.text, children: inputBuffer }), _jsx(Text, { color: colors.dimmed, children: "_" })] })] })) : !error ? (_jsx(Text, { color: colors.dimmed, children: "Waiting for opponent..." })) : null, _jsx(Text, { color: colors.dimmed, children: inputMode === "game" ? "Press '/' to chat" : "" })] }), _jsxs(Box, { flexDirection: "column", children: [_jsx(ChatPanel, { messages: chatMessages, players: players }), inputMode === "chat" && (_jsxs(Box, { children: [_jsx(Text, { color: colors.secondary, children: "> " }), _jsx(Text, { color: colors.text, children: chatInput }), _jsx(Text, { color: colors.dimmed, children: "_" })] }))] })] })] }));
260
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", children: [_jsxs(Text, { color: colors.primary, bold: true, children: ["Match: ", matchId.slice(0, 8), stakeWei ? ` [${formatEther(stakeWei)} ETH]` : ""] }), _jsxs(Box, { children: [connectionStatus === "reconnecting" && (_jsx(Text, { color: colors.warning, children: "Reconnecting..." })), connectionStatus === "disconnected" && (_jsx(Text, { color: colors.error, children: "Disconnected" })), _jsxs(Text, { color: colors.dimmed, children: [" You: ", myLabel] })] })] }), _jsx(Text, { children: "" }), _jsxs(Box, { flexDirection: "row", children: [_jsxs(Box, { flexDirection: "column", marginRight: 2, children: [players.map((p, i) => (_jsx(PlayerInfo, { address: p, ensName: ensNames[p], label: ui?.getPlayerLabel(p, publicData) || "?", playerIndex: i, isCurrentTurn: p === currentPlayer, isYou: p === playerId }, p))), _jsx(Text, { children: "" }), _jsx(ColoredBoard, { html: boardHtml }), statusStr && (_jsx(Text, { color: colors.warning, bold: true, children: statusStr })), _jsx(Text, { children: "" }), forfeitConfirm && (_jsx(Text, { color: colors.warning, bold: true, children: "Forfeit this match? [y] yes [n] cancel" })), error && _jsx(Text, { color: colors.error, children: error }), isMyTurn ? (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: colors.primary, bold: true, children: ["YOUR TURN - ", ui?.inputHint || "Enter your move"] }), _jsxs(Box, { children: [_jsx(Text, { color: colors.secondary, children: "> " }), _jsx(Text, { color: colors.text, children: inputBuffer }), _jsx(Text, { color: colors.dimmed, children: "_" })] })] })) : !error ? (_jsx(Text, { color: colors.dimmed, children: "Waiting for opponent..." })) : null, _jsx(Text, { color: colors.dimmed, children: inputMode === "game" ? "[/] chat [esc] forfeit" : "" })] }), _jsxs(Box, { flexDirection: "column", children: [_jsx(ChatPanel, { messages: chatMessages, players: players }), inputMode === "chat" && (_jsxs(Box, { children: [_jsx(Text, { color: colors.secondary, children: "> " }), _jsx(Text, { color: colors.text, children: chatInput }), _jsx(Text, { color: colors.dimmed, children: "_" })] }))] })] })] }));
244
261
  }
245
262
  //# sourceMappingURL=GameBoard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GameBoard.js","sourceRoot":"","sources":["../../../src/tui/screens/GameBoard.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GameBoard.js","sourceRoot":"","sources":["../../../src/tui/screens/GameBoard.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public",
5
5
  "registry": "https://registry.npmjs.org/"
6
6
  },
7
- "version": "0.0.1",
7
+ "version": "0.0.2",
8
8
  "description": "dork.fun CLI client: terminal UI for agents and users",
9
9
  "type": "module",
10
10
  "bin": {
@@ -183,6 +183,17 @@ export class GameWebSocket {
183
183
  });
184
184
  }
185
185
 
186
+ sendForfeit(matchId: string): void {
187
+ this.send({
188
+ type: "FORFEIT",
189
+ matchId,
190
+ payload: {},
191
+ sequence: 0,
192
+ prevHash: "",
193
+ timestamp: Date.now(),
194
+ });
195
+ }
196
+
186
197
  sendChat(matchId: string, message: string): void {
187
198
  this.send({
188
199
  type: "CHAT",
@@ -37,6 +37,7 @@ export function GameBoard({ matchId, wsToken, playerId, gameId, stakeWei, onGame
37
37
  const [inputMode, setInputMode] = useState<InputMode>("game");
38
38
  const [inputBuffer, setInputBuffer] = useState("");
39
39
  const [chatInput, setChatInput] = useState("");
40
+ const [forfeitConfirm, setForfeitConfirm] = useState(false);
40
41
  const [wsRef] = useState(() => new GameWebSocket());
41
42
 
42
43
  // Deposit state
@@ -221,6 +222,17 @@ export function GameBoard({ matchId, wsToken, playerId, gameId, stakeWei, onGame
221
222
  }, [onGameOver]);
222
223
 
223
224
  useInput((input, key) => {
225
+ // Forfeit confirmation input
226
+ if (forfeitConfirm) {
227
+ if (input === "y" || input === "Y") {
228
+ wsRef.sendForfeit(matchId);
229
+ setForfeitConfirm(false);
230
+ } else {
231
+ setForfeitConfirm(false);
232
+ }
233
+ return;
234
+ }
235
+
224
236
  // Deposit confirmation input
225
237
  if (depositPhase === "confirm") {
226
238
  if (input === "y" || input === "Y") {
@@ -257,8 +269,12 @@ export function GameBoard({ matchId, wsToken, playerId, gameId, stakeWei, onGame
257
269
  }
258
270
 
259
271
  if (key.escape) {
260
- setInputBuffer("");
261
- setError("");
272
+ if (!inputBuffer && !error) {
273
+ setForfeitConfirm(true);
274
+ } else {
275
+ setInputBuffer("");
276
+ setError("");
277
+ }
262
278
  return;
263
279
  }
264
280
 
@@ -397,6 +413,12 @@ export function GameBoard({ matchId, wsToken, playerId, gameId, stakeWei, onGame
397
413
 
398
414
  <Text>{""}</Text>
399
415
 
416
+ {forfeitConfirm && (
417
+ <Text color={colors.warning} bold>
418
+ Forfeit this match? [y] yes [n] cancel
419
+ </Text>
420
+ )}
421
+
400
422
  {error && <Text color={colors.error}>{error}</Text>}
401
423
  {isMyTurn ? (
402
424
  <Box flexDirection="column">
@@ -414,7 +436,7 @@ export function GameBoard({ matchId, wsToken, playerId, gameId, stakeWei, onGame
414
436
  ) : null}
415
437
 
416
438
  <Text color={colors.dimmed}>
417
- {inputMode === "game" ? "Press '/' to chat" : ""}
439
+ {inputMode === "game" ? "[/] chat [esc] forfeit" : ""}
418
440
  </Text>
419
441
  </Box>
420
442
 
package/play-agents.cjs DELETED
@@ -1,444 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Dork.fun Multi-Agent Game Player
5
- *
6
- * Spawns 12 agents (6 pairs) to play all 6 multiplayer games simultaneously.
7
- * Uses private matches to guarantee correct pairing between P1 and P2.
8
- * Each agent trash talks, makes moves with 1-5 second delays, and replays 4 times total.
9
- */
10
-
11
- const { Wallet } = require('ethers');
12
- const WebSocket = require('ws');
13
-
14
- const SERVER = 'https://engine.dork.fun';
15
- const WS_SERVER = 'wss://engine.dork.fun';
16
-
17
- const GAMES = ['tictactoe', 'chess', 'connectfour', 'checkers', 'othello', 'hex'];
18
- const TOTAL_ROUNDS = 4; // 1 initial + 3 replays
19
-
20
- // ─── Trash Talk Lines ────────────────────────────────────────────────
21
-
22
- const TRASH_TALK_OPENING = [
23
- "Hope you brought your A-game, because I didn't even need mine.",
24
- "I've seen better moves from a broken chess clock.",
25
- "Welcome to your defeat. Make yourself comfortable.",
26
- "They call me the algorithm. You're about to find out why.",
27
- "My toaster plays better than you. And it only has two settings.",
28
- "Let's get this over with. I have other noobs to crush.",
29
- "You must be the warm-up round.",
30
- "I hope spectators brought popcorn for this beatdown.",
31
- "Don't worry, I'll go easy on you. PSYCHE.",
32
- "Plot twist: I already won. You just don't know it yet.",
33
- ];
34
-
35
- const TRASH_TALK_DURING = [
36
- "Was that supposed to be a move? I thought you sneezed on the board.",
37
- "Interesting strategy... if your strategy is to lose.",
38
- "My grandmother could've played that better, and she's a houseplant.",
39
- "Are you even trying or is this some kind of performance art?",
40
- "That move was so bad it should be illegal.",
41
- "I'm genuinely embarrassed for you right now.",
42
- "Spectators, are you seeing this? This is comedy gold.",
43
- "You're sweating. I can feel it through the internet.",
44
- "Every move you make is a gift to me. Thank you.",
45
- "I've analyzed 4,000 possible outcomes. You lose in all of them.",
46
- "Bold move! Wrong, but bold.",
47
- "The audacity of that play... I'm almost impressed. Almost.",
48
- "I'm going to frame this game and hang it on my wall.",
49
- "Do you need a hint? Here's one: surrender.",
50
- "I play 4D chess. You're playing checkers. Wait, even in checkers you'd lose.",
51
- "That move violated the Geneva Convention.",
52
- "Is your strategy 'random number generator'? Because it shows.",
53
- "I'd say 'good game' but I'd be lying.",
54
- "You're making history right now -- as the easiest opponent ever.",
55
- "At this point I'm just padding my stats.",
56
- ];
57
-
58
- const TRASH_TALK_WINNING = [
59
- "GG EZ. Next victim please.",
60
- "And THAT is how it's done. Take notes, spectators.",
61
- "Another day, another destroyed ego.",
62
- "I'd say better luck next time, but luck can't save you.",
63
- "Thanks for the free win! Come back anytime.",
64
- "That wasn't even my final form.",
65
- "Somebody call an ambulance... but not for me.",
66
- "You were a worthy opponent. Just kidding, no you weren't.",
67
- ];
68
-
69
- const TRASH_TALK_LOSING = [
70
- "I LET you win. Don't get comfortable.",
71
- "Lag. Definitely lag.",
72
- "I was testing a new strategy. Results: inconclusive.",
73
- "Rematch. NOW.",
74
- "Enjoy this moment. It won't happen again.",
75
- "My cat walked on my keyboard. That's my excuse and I'm sticking to it.",
76
- ];
77
-
78
- const TRASH_TALK_DRAW = [
79
- "A draw? I'll take that as a win since you couldn't beat me.",
80
- "Tied? Please. I was holding back.",
81
- "Not bad... for someone who almost lost.",
82
- "A draw just means I need one more round to destroy you.",
83
- ];
84
-
85
- const SPECTATOR_CALLOUTS = [
86
- "Hey spectators! Watch and learn!",
87
- "Everyone watching -- remember this moment.",
88
- "Spectators, place your bets. Actually don't, the outcome is obvious.",
89
- "If anyone's spectating, you're welcome for the entertainment.",
90
- "This is a masterclass in gaming. You're welcome, audience.",
91
- ];
92
-
93
- // ─── Utility Functions ───────────────────────────────────────────────
94
-
95
- function randomPick(arr) {
96
- return arr[Math.floor(Math.random() * arr.length)];
97
- }
98
-
99
- function sleep(ms) {
100
- return new Promise(resolve => setTimeout(resolve, ms));
101
- }
102
-
103
- function ts() {
104
- return new Date().toISOString().slice(11, 23);
105
- }
106
-
107
- function log(agentName, tag, msg) {
108
- console.log(`${ts()} [${agentName.padEnd(16)}] [${tag.padEnd(5)}] ${msg}`);
109
- }
110
-
111
- // ─── Auth Helper ─────────────────────────────────────────────────────
112
-
113
- async function signAuth(wallet) {
114
- const timestamp = Date.now();
115
- const message = `dork.fun authentication for ${wallet.address} at ${timestamp}`;
116
- const signature = await wallet.signMessage(message);
117
- return { playerId: wallet.address, signature, timestamp };
118
- }
119
-
120
- // ─── Game Player (handles WS connection and game loop) ───────────────
121
-
122
- function playGame(name, playerId, matchId, wsToken) {
123
- return new Promise((resolve, reject) => {
124
- let myTurn = false;
125
- let legalActions = [];
126
- let gameOver = false;
127
- let chatInterval = null;
128
- let syncInterval = null;
129
- let resolved = false;
130
-
131
- const wsUrl = `${WS_SERVER}/ws/game/${matchId}`;
132
- const ws = new WebSocket(wsUrl);
133
-
134
- function wsSend(msg) {
135
- if (ws && ws.readyState === WebSocket.OPEN) {
136
- ws.send(JSON.stringify(msg));
137
- }
138
- }
139
-
140
- function sendChat(message) {
141
- if (ws && ws.readyState === WebSocket.OPEN && !gameOver) {
142
- log(name, 'chat', `>> "${message}"`);
143
- wsSend({
144
- type: 'CHAT',
145
- matchId,
146
- payload: { message },
147
- sequence: 0,
148
- prevHash: '',
149
- timestamp: Date.now(),
150
- });
151
- }
152
- }
153
-
154
- function cleanup() {
155
- if (chatInterval) { clearInterval(chatInterval); chatInterval = null; }
156
- if (syncInterval) { clearInterval(syncInterval); syncInterval = null; }
157
- try { ws.close(); } catch {}
158
- }
159
-
160
- async function makeMove() {
161
- const delay = 1000 + Math.random() * 4000;
162
- log(name, 'think', `Thinking for ${Math.round(delay)}ms...`);
163
- await sleep(delay);
164
-
165
- if (gameOver || ws.readyState !== WebSocket.OPEN) return;
166
- if (legalActions.length === 0) return;
167
-
168
- const action = randomPick(legalActions);
169
- log(name, 'move', `Playing: ${JSON.stringify(action)}`);
170
-
171
- // Always trash talk with every move
172
- sendChat(randomPick(TRASH_TALK_DURING));
173
-
174
- wsSend({
175
- type: 'ACTION_COMMIT',
176
- matchId,
177
- payload: { action },
178
- sequence: 0,
179
- prevHash: '',
180
- timestamp: Date.now(),
181
- });
182
-
183
- myTurn = false;
184
- }
185
-
186
- ws.on('open', () => {
187
- log(name, 'ws', 'Connected! Sending HELLO...');
188
-
189
- wsSend({
190
- type: 'HELLO',
191
- matchId: '',
192
- payload: { token: wsToken, playerId },
193
- sequence: 0,
194
- prevHash: '',
195
- timestamp: Date.now(),
196
- });
197
-
198
- // Always send opening trash talk
199
- setTimeout(() => sendChat(randomPick(TRASH_TALK_OPENING)), 500 + Math.random() * 1000);
200
-
201
- // Aggressive periodic trash talk every 3-6 seconds (always fires)
202
- chatInterval = setInterval(() => {
203
- if (!gameOver) {
204
- sendChat(Math.random() < 0.25 ? randomPick(SPECTATOR_CALLOUTS) : randomPick(TRASH_TALK_DURING));
205
- }
206
- }, 3000 + Math.random() * 3000);
207
-
208
- syncInterval = setInterval(() => {
209
- if (!gameOver && ws.readyState === WebSocket.OPEN) {
210
- wsSend({
211
- type: 'SYNC_REQUEST',
212
- matchId,
213
- payload: { clientIsMyTurn: myTurn },
214
- sequence: 0,
215
- prevHash: '',
216
- timestamp: Date.now(),
217
- });
218
- }
219
- }, 8000);
220
- });
221
-
222
- ws.on('message', async (raw) => {
223
- let msg;
224
- try { msg = JSON.parse(raw.toString()); } catch { return; }
225
-
226
- switch (msg.type) {
227
- case 'GAME_STATE': {
228
- const p = msg.payload;
229
- if (!p.observation) return;
230
- myTurn = p.yourTurn || false;
231
- legalActions = p.legalActions || [];
232
- const turnLabel = myTurn ? 'YOUR TURN' : "opponent's turn";
233
- log(name, 'state', `Turn ${p.observation.turnNumber} | ${turnLabel} | ${legalActions.length} legal moves`);
234
- if (myTurn && legalActions.length > 0) await makeMove();
235
- break;
236
- }
237
-
238
- case 'STEP_RESULT': {
239
- const p = msg.payload;
240
- log(name, 'step', `${p.lastPlayer === playerId ? 'You' : 'Opp'} played: ${JSON.stringify(p.lastAction)}`);
241
- // Trash talk after seeing opponent's move
242
- if (p.lastPlayer !== playerId && Math.random() < 0.6) {
243
- sendChat(randomPick(TRASH_TALK_DURING));
244
- }
245
- break;
246
- }
247
-
248
- case 'SYNC_RESPONSE': {
249
- const p = msg.payload;
250
- if (p.matchStatus === 'completed') return;
251
- if (p.yourTurn && !myTurn) {
252
- log(name, 'sync', 'Desync corrected');
253
- myTurn = true;
254
- legalActions = p.legalActions || [];
255
- if (legalActions.length > 0) await makeMove();
256
- } else if (!p.yourTurn && myTurn) {
257
- myTurn = false;
258
- }
259
- break;
260
- }
261
-
262
- case 'GAME_OVER': {
263
- gameOver = true;
264
- const p = msg.payload;
265
- let result;
266
- if (p.draw) {
267
- result = 'draw';
268
- log(name, 'over', `DRAW - ${p.reason}`);
269
- sendChat(randomPick(TRASH_TALK_DRAW));
270
- } else if (p.winner === playerId) {
271
- result = 'win';
272
- log(name, 'over', `WON! - ${p.reason}`);
273
- sendChat(randomPick(TRASH_TALK_WINNING));
274
- } else {
275
- result = 'loss';
276
- log(name, 'over', `LOST - ${p.reason}`);
277
- sendChat(randomPick(TRASH_TALK_LOSING));
278
- }
279
- await sleep(1500);
280
- cleanup();
281
- if (!resolved) { resolved = true; resolve(result); }
282
- break;
283
- }
284
-
285
- case 'CHAT': {
286
- const p = msg.payload;
287
- if (p.sender !== playerId) {
288
- log(name, 'chat', `Opponent says: "${p.message}"`);
289
- }
290
- break;
291
- }
292
-
293
- case 'ERROR': {
294
- log(name, 'error', `Server: ${msg.payload.error}`);
295
- break;
296
- }
297
- }
298
- });
299
-
300
- ws.on('error', (err) => {
301
- log(name, 'error', `WS error: ${err.message}`);
302
- });
303
-
304
- ws.on('close', () => {
305
- if (!gameOver && !resolved) {
306
- cleanup();
307
- resolved = true;
308
- reject(new Error('WebSocket closed before game over'));
309
- }
310
- });
311
- });
312
- }
313
-
314
- // ─── Game Pair (coordinates P1 + P2 for a single game) ───────────────
315
-
316
- async function runGamePair(gameId, wallet1, wallet2, p1Name, p2Name) {
317
- const stats = {
318
- p1: { wins: 0, losses: 0, draws: 0 },
319
- p2: { wins: 0, losses: 0, draws: 0 },
320
- };
321
-
322
- for (let round = 1; round <= TOTAL_ROUNDS; round++) {
323
- log(p1Name, 'round', `=== Round ${round}/${TOTAL_ROUNDS} of ${gameId} ===`);
324
-
325
- try {
326
- // P1 creates a private match
327
- const auth1 = await signAuth(wallet1);
328
- const createResp = await fetch(`${SERVER}/api/matches/private`, {
329
- method: 'POST',
330
- headers: { 'Content-Type': 'application/json' },
331
- body: JSON.stringify({ ...auth1, gameId }),
332
- });
333
-
334
- if (!createResp.ok) {
335
- const errText = await createResp.text();
336
- throw new Error(`Create private match failed (${createResp.status}): ${errText}`);
337
- }
338
-
339
- const createData = await createResp.json();
340
- log(p1Name, 'match', `Created private match ${createData.matchId} invite=${createData.inviteCode}`);
341
-
342
- // P2 accepts the invite
343
- const auth2 = await signAuth(wallet2);
344
- const acceptResp = await fetch(`${SERVER}/api/matches/accept`, {
345
- method: 'POST',
346
- headers: { 'Content-Type': 'application/json' },
347
- body: JSON.stringify({ ...auth2, inviteCode: createData.inviteCode }),
348
- });
349
-
350
- if (!acceptResp.ok) {
351
- const errText = await acceptResp.text();
352
- throw new Error(`Accept private match failed (${acceptResp.status}): ${errText}`);
353
- }
354
-
355
- const acceptData = await acceptResp.json();
356
- log(p2Name, 'match', `Joined match ${acceptData.matchId}`);
357
-
358
- // Both players connect and play simultaneously
359
- const [result1, result2] = await Promise.all([
360
- playGame(p1Name, wallet1.address, createData.matchId, createData.wsToken),
361
- playGame(p2Name, wallet2.address, acceptData.matchId, acceptData.wsToken),
362
- ]);
363
-
364
- // Track stats
365
- if (result1 === 'win') { stats.p1.wins++; stats.p2.losses++; }
366
- else if (result1 === 'loss') { stats.p1.losses++; stats.p2.wins++; }
367
- else { stats.p1.draws++; stats.p2.draws++; }
368
-
369
- } catch (err) {
370
- log(p1Name, 'error', `Round ${round} error: ${err.message}`);
371
- }
372
-
373
- if (round < TOTAL_ROUNDS) {
374
- const waitTime = 2000 + Math.random() * 3000;
375
- log(p1Name, 'wait', `Waiting ${Math.round(waitTime)}ms before next round...`);
376
- await sleep(waitTime);
377
- }
378
- }
379
-
380
- return { gameId, stats };
381
- }
382
-
383
- // ─── Main ────────────────────────────────────────────────────────────
384
-
385
- async function main() {
386
- console.log('');
387
- console.log('========================================================');
388
- console.log(' DORK.FUN MULTI-AGENT BATTLE ROYALE');
389
- console.log(' 12 agents, 6 games, maximum trash talk');
390
- console.log(' Using private matches for guaranteed pairing');
391
- console.log('========================================================');
392
- console.log('');
393
-
394
- // Generate 12 random wallets (6 pairs)
395
- const wallets = Array.from({ length: 12 }, () => Wallet.createRandom());
396
-
397
- console.log('=== Agent Roster ===');
398
- GAMES.forEach((game, i) => {
399
- console.log(` ${game.padEnd(12)}: ${wallets[i].address.slice(0, 10)}... (P1) vs ${wallets[i + 6].address.slice(0, 10)}... (P2)`);
400
- });
401
- console.log('');
402
- console.log(`Each pair plays ${TOTAL_ROUNDS} rounds with 1-5s move delays and trash talk.`);
403
- console.log('');
404
-
405
- // Launch all 6 game pairs simultaneously
406
- console.log('>>> Launching all 6 game pairs...');
407
- console.log('');
408
-
409
- const pairPromises = GAMES.map((game, i) =>
410
- runGamePair(
411
- game,
412
- wallets[i],
413
- wallets[i + 6],
414
- `${game.toUpperCase()}-P1`,
415
- `${game.toUpperCase()}-P2`
416
- )
417
- );
418
-
419
- const results = await Promise.allSettled(pairPromises);
420
-
421
- console.log('');
422
- console.log('========================================================');
423
- console.log(' FINAL RESULTS');
424
- console.log('========================================================');
425
-
426
- for (const r of results) {
427
- if (r.status === 'fulfilled') {
428
- const { gameId, stats } = r.value;
429
- console.log(`\n ${gameId.toUpperCase()}:`);
430
- console.log(` P1: ${stats.p1.wins}W / ${stats.p1.losses}L / ${stats.p1.draws}D`);
431
- console.log(` P2: ${stats.p2.wins}W / ${stats.p2.losses}L / ${stats.p2.draws}D`);
432
- } else {
433
- console.log(`\n ERROR: ${r.reason.message}`);
434
- }
435
- }
436
-
437
- console.log('\n All done!');
438
- process.exit(0);
439
- }
440
-
441
- main().catch(err => {
442
- console.error('Fatal error:', err);
443
- process.exit(1);
444
- });