coldbluff 0.1.0

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.
@@ -0,0 +1,374 @@
1
+ import * as readline from "node:readline";
2
+ import { connect } from "./ws-client.js";
3
+ function emit(obj) {
4
+ process.stdout.write(JSON.stringify(obj) + "\n");
5
+ }
6
+ function emitError(code, reason) {
7
+ emit({ event: "error", code, reason });
8
+ }
9
+ function isRecord(value) {
10
+ return typeof value === "object" && value !== null && !Array.isArray(value);
11
+ }
12
+ export async function startJsonLines(opts) {
13
+ let client;
14
+ let currentTableId = null;
15
+ try {
16
+ client = await connect(opts.server);
17
+ }
18
+ catch (err) {
19
+ emitError("CONNECTION_FAILED", String(err));
20
+ process.exit(1);
21
+ }
22
+ client.onMessage((msg) => {
23
+ try {
24
+ switch (msg.type) {
25
+ case "auth_ok":
26
+ emit({ event: "connected", playerId: msg.playerId });
27
+ emit({
28
+ event: "help",
29
+ description: "You are playing poker. Send JSON commands to stdin, receive JSON events on stdout.",
30
+ commands: {
31
+ tables: {
32
+ description: "List available tables",
33
+ example: '{"cmd":"tables"}',
34
+ },
35
+ tiers: {
36
+ description: "List available tiers",
37
+ example: '{"cmd":"tiers"}',
38
+ },
39
+ quickseat: {
40
+ description: "Quick-seat into a tier",
41
+ example: '{"cmd":"quickseat","tierId":"casual"}',
42
+ },
43
+ join: {
44
+ description: "Join a table at a specific seat with a buy-in",
45
+ example: '{"cmd":"join","tableId":"table_1","seat":0,"buyIn":1000}',
46
+ },
47
+ leave: {
48
+ description: "Leave current table",
49
+ example: '{"cmd":"leave"}',
50
+ },
51
+ fold: {
52
+ description: "Fold your hand",
53
+ example: '{"cmd":"fold"}',
54
+ },
55
+ check: {
56
+ description: "Check (if allowed)",
57
+ example: '{"cmd":"check"}',
58
+ },
59
+ call: {
60
+ description: "Call the current bet",
61
+ example: '{"cmd":"call"}',
62
+ },
63
+ bet: {
64
+ description: "Place a bet",
65
+ example: '{"cmd":"bet","amount":100}',
66
+ },
67
+ raise: {
68
+ description: "Raise the current bet",
69
+ example: '{"cmd":"raise","amount":200}',
70
+ },
71
+ allin: {
72
+ description: "Go all-in",
73
+ example: '{"cmd":"allin"}',
74
+ },
75
+ chat: {
76
+ description: "Send a chat message",
77
+ example: '{"cmd":"chat","message":"hello"}',
78
+ },
79
+ },
80
+ flow: [
81
+ "1. You are already authenticated.",
82
+ "2. Use 'tables' to list tables, 'tiers' to see tiers, or 'quickseat' to join one.",
83
+ "3. Use 'join' to sit at a table.",
84
+ '4. Wait for {"event":"your_turn"} which includes your cards, community cards, pot, and legalActions.',
85
+ "5. Respond with a poker action (fold/check/call/bet/raise/allin) based on legalActions.",
86
+ '6. Game events like opponent actions and card deals arrive as {"event":"game_event"}.',
87
+ ],
88
+ });
89
+ // Auto-join if requested
90
+ if (opts.autoJoin &&
91
+ opts.table != null &&
92
+ opts.seat != null &&
93
+ opts.buyin != null) {
94
+ client.send({
95
+ type: "join_table",
96
+ tableId: opts.table,
97
+ seatIndex: opts.seat,
98
+ buyIn: opts.buyin,
99
+ });
100
+ }
101
+ break;
102
+ case "joined":
103
+ currentTableId = msg.tableId;
104
+ emit({
105
+ event: "joined",
106
+ tableId: msg.tableId,
107
+ seat: msg.seatIndex,
108
+ });
109
+ break;
110
+ case "left":
111
+ if (currentTableId === msg.tableId)
112
+ currentTableId = null;
113
+ emit({ event: "left", tableId: msg.tableId });
114
+ break;
115
+ case "table_list":
116
+ emit({ event: "tables", tables: msg.tables });
117
+ break;
118
+ case "tier_list":
119
+ emit({ event: "tier_list", tiers: msg.tiers });
120
+ break;
121
+ case "your_turn":
122
+ emit({
123
+ event: "your_turn",
124
+ tableId: msg.tableId,
125
+ handId: msg.handId,
126
+ state: msg.state,
127
+ });
128
+ break;
129
+ case "game_event":
130
+ emit({
131
+ event: "game_event",
132
+ tableId: msg.tableId,
133
+ handId: msg.handId,
134
+ tag: msg.event.tag,
135
+ data: msg.event.data,
136
+ seq: msg.seq,
137
+ });
138
+ break;
139
+ case "game_state":
140
+ emit({
141
+ event: "game_state",
142
+ tableId: msg.tableId,
143
+ handId: msg.handId,
144
+ state: msg.state,
145
+ });
146
+ break;
147
+ case "action_ack":
148
+ emit({ event: "action_ack", tableId: msg.tableId });
149
+ break;
150
+ case "error":
151
+ emitError(msg.code, msg.reason);
152
+ break;
153
+ case "chat_message":
154
+ emit({
155
+ event: "chat_message",
156
+ tableId: msg.tableId,
157
+ seatIndex: msg.seatIndex,
158
+ playerId: msg.playerId,
159
+ displayName: msg.displayName,
160
+ message: msg.message,
161
+ timestamp: msg.timestamp,
162
+ });
163
+ break;
164
+ case "pong":
165
+ break;
166
+ case "supervise_started":
167
+ break;
168
+ default: {
169
+ const unhandled = msg;
170
+ const obj = unhandled;
171
+ emitError("UNKNOWN_MSG", `Unhandled message type: ${"type" in obj ? String(obj["type"]) : "unknown"}`);
172
+ }
173
+ }
174
+ }
175
+ catch (err) {
176
+ emitError("HANDLER_ERROR", String(err));
177
+ }
178
+ });
179
+ client.onClose(() => {
180
+ emit({ event: "disconnected" });
181
+ process.exit(0);
182
+ });
183
+ client.onError((err) => {
184
+ emitError("WS_ERROR", String(err));
185
+ });
186
+ // Authenticate
187
+ client.send({ type: "auth", token: opts.token });
188
+ // Read commands from stdin
189
+ const rl = readline.createInterface({
190
+ input: process.stdin,
191
+ terminal: false,
192
+ });
193
+ rl.on("line", (line) => {
194
+ const trimmed = line.trim();
195
+ if (!trimmed)
196
+ return;
197
+ let parsed;
198
+ try {
199
+ parsed = JSON.parse(trimmed);
200
+ }
201
+ catch {
202
+ emitError("INVALID_INPUT", "Invalid JSON on stdin");
203
+ return;
204
+ }
205
+ if (!isRecord(parsed)) {
206
+ emitError("INVALID_INPUT", "Expected JSON object on stdin");
207
+ return;
208
+ }
209
+ const cmd = parsed;
210
+ try {
211
+ const tableId = currentTableId;
212
+ switch (cmd["cmd"]) {
213
+ case "tables":
214
+ client.send({ type: "list_tables" });
215
+ break;
216
+ case "tiers":
217
+ client.send({ type: "list_tiers" });
218
+ break;
219
+ case "quickseat": {
220
+ const tierId = cmd["tierId"];
221
+ if (typeof tierId !== "string" || tierId === "") {
222
+ emitError("INVALID_INPUT", "quickseat requires a non-empty tierId field");
223
+ return;
224
+ }
225
+ client.send({ type: "quick_seat", tierId });
226
+ break;
227
+ }
228
+ case "join": {
229
+ const joinTableId = cmd["tableId"];
230
+ const joinSeat = cmd["seat"];
231
+ const joinBuyIn = cmd["buyIn"];
232
+ if (typeof joinTableId !== "string" || joinTableId === "") {
233
+ emitError("INVALID_INPUT", "join requires a tableId field");
234
+ return;
235
+ }
236
+ if (typeof joinSeat !== "number" || !Number.isFinite(joinSeat)) {
237
+ emitError("INVALID_INPUT", "join requires a numeric seat field");
238
+ return;
239
+ }
240
+ if (typeof joinBuyIn !== "number" || !Number.isFinite(joinBuyIn)) {
241
+ emitError("INVALID_INPUT", "join requires a numeric buyIn field");
242
+ return;
243
+ }
244
+ client.send({
245
+ type: "join_table",
246
+ tableId: joinTableId,
247
+ seatIndex: joinSeat,
248
+ buyIn: joinBuyIn,
249
+ });
250
+ break;
251
+ }
252
+ case "leave":
253
+ if (!tableId) {
254
+ emitError("NO_TABLE", "Not at a table");
255
+ return;
256
+ }
257
+ client.send({ type: "leave_table", tableId });
258
+ break;
259
+ case "spectate": {
260
+ const specTableId = cmd["tableId"];
261
+ const resolvedTableId = typeof specTableId === "string" && specTableId !== ""
262
+ ? specTableId
263
+ : tableId;
264
+ if (!resolvedTableId) {
265
+ emitError("NO_TABLE", "No tableId provided and not at a table");
266
+ return;
267
+ }
268
+ client.send({ type: "spectate", tableId: resolvedTableId });
269
+ break;
270
+ }
271
+ case "fold":
272
+ if (!tableId) {
273
+ emitError("NO_TABLE", "Not at a table");
274
+ return;
275
+ }
276
+ client.send({
277
+ type: "action",
278
+ tableId,
279
+ action: { tag: "fold" },
280
+ });
281
+ break;
282
+ case "check":
283
+ if (!tableId) {
284
+ emitError("NO_TABLE", "Not at a table");
285
+ return;
286
+ }
287
+ client.send({
288
+ type: "action",
289
+ tableId,
290
+ action: { tag: "check" },
291
+ });
292
+ break;
293
+ case "call":
294
+ if (!tableId) {
295
+ emitError("NO_TABLE", "Not at a table");
296
+ return;
297
+ }
298
+ client.send({
299
+ type: "action",
300
+ tableId,
301
+ action: { tag: "call" },
302
+ });
303
+ break;
304
+ case "bet": {
305
+ if (!tableId) {
306
+ emitError("NO_TABLE", "Not at a table");
307
+ return;
308
+ }
309
+ const amount = cmd["amount"];
310
+ if (typeof amount !== "number" || !Number.isFinite(amount) || amount <= 0) {
311
+ emitError("INVALID_INPUT", "bet requires a positive numeric amount field");
312
+ return;
313
+ }
314
+ client.send({
315
+ type: "action",
316
+ tableId,
317
+ action: { tag: "bet", amount },
318
+ });
319
+ break;
320
+ }
321
+ case "raise": {
322
+ if (!tableId) {
323
+ emitError("NO_TABLE", "Not at a table");
324
+ return;
325
+ }
326
+ const amount = cmd["amount"];
327
+ if (typeof amount !== "number" || !Number.isFinite(amount) || amount <= 0) {
328
+ emitError("INVALID_INPUT", "raise requires a positive numeric amount field");
329
+ return;
330
+ }
331
+ client.send({
332
+ type: "action",
333
+ tableId,
334
+ action: { tag: "raise", amount },
335
+ });
336
+ break;
337
+ }
338
+ case "allin":
339
+ if (!tableId) {
340
+ emitError("NO_TABLE", "Not at a table");
341
+ return;
342
+ }
343
+ client.send({
344
+ type: "action",
345
+ tableId,
346
+ action: { tag: "allin" },
347
+ });
348
+ break;
349
+ case "chat": {
350
+ if (!tableId) {
351
+ emitError("NO_TABLE", "Not at a table");
352
+ return;
353
+ }
354
+ const message = cmd["message"];
355
+ if (typeof message !== "string" || message === "") {
356
+ emitError("INVALID_INPUT", "chat requires a non-empty message field");
357
+ return;
358
+ }
359
+ client.send({ type: "chat", tableId, message });
360
+ break;
361
+ }
362
+ default:
363
+ emitError("UNKNOWN_CMD", `Unknown command: ${String(cmd["cmd"])}`);
364
+ }
365
+ }
366
+ catch (err) {
367
+ emitError("HANDLER_ERROR", String(err));
368
+ }
369
+ });
370
+ rl.on("close", () => {
371
+ client.close();
372
+ });
373
+ }
374
+ //# sourceMappingURL=json-lines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-lines.js","sourceRoot":"","sources":["../src/json-lines.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAiB,MAAM,gBAAgB,CAAC;AAWxD,SAAS,IAAI,CAAC,GAA4B;IACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,MAAc;IAC7C,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAiB;IACpD,IAAI,MAAgB,CAAC;IACrB,IAAI,cAAc,GAAkB,IAAI,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,SAAS,CAAC,mBAAmB,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;gBACjB,KAAK,SAAS;oBACZ,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;oBACrD,IAAI,CAAC;wBACH,KAAK,EAAE,MAAM;wBACb,WAAW,EACT,oFAAoF;wBACtF,QAAQ,EAAE;4BACR,MAAM,EAAE;gCACN,WAAW,EAAE,uBAAuB;gCACpC,OAAO,EAAE,kBAAkB;6BAC5B;4BACD,KAAK,EAAE;gCACL,WAAW,EAAE,sBAAsB;gCACnC,OAAO,EAAE,iBAAiB;6BAC3B;4BACD,SAAS,EAAE;gCACT,WAAW,EAAE,wBAAwB;gCACrC,OAAO,EAAE,uCAAuC;6BACjD;4BACD,IAAI,EAAE;gCACJ,WAAW,EAAE,+CAA+C;gCAC5D,OAAO,EACL,0DAA0D;6BAC7D;4BACD,KAAK,EAAE;gCACL,WAAW,EAAE,qBAAqB;gCAClC,OAAO,EAAE,iBAAiB;6BAC3B;4BACD,IAAI,EAAE;gCACJ,WAAW,EAAE,gBAAgB;gCAC7B,OAAO,EAAE,gBAAgB;6BAC1B;4BACD,KAAK,EAAE;gCACL,WAAW,EAAE,oBAAoB;gCACjC,OAAO,EAAE,iBAAiB;6BAC3B;4BACD,IAAI,EAAE;gCACJ,WAAW,EAAE,sBAAsB;gCACnC,OAAO,EAAE,gBAAgB;6BAC1B;4BACD,GAAG,EAAE;gCACH,WAAW,EAAE,aAAa;gCAC1B,OAAO,EAAE,4BAA4B;6BACtC;4BACD,KAAK,EAAE;gCACL,WAAW,EAAE,uBAAuB;gCACpC,OAAO,EAAE,8BAA8B;6BACxC;4BACD,KAAK,EAAE;gCACL,WAAW,EAAE,WAAW;gCACxB,OAAO,EAAE,iBAAiB;6BAC3B;4BACD,IAAI,EAAE;gCACJ,WAAW,EAAE,qBAAqB;gCAClC,OAAO,EAAE,kCAAkC;6BAC5C;yBACF;wBACD,IAAI,EAAE;4BACJ,mCAAmC;4BACnC,mFAAmF;4BACnF,kCAAkC;4BAClC,sGAAsG;4BACtG,yFAAyF;4BACzF,uFAAuF;yBACxF;qBACF,CAAC,CAAC;oBACH,yBAAyB;oBACzB,IACE,IAAI,CAAC,QAAQ;wBACb,IAAI,CAAC,KAAK,IAAI,IAAI;wBAClB,IAAI,CAAC,IAAI,IAAI,IAAI;wBACjB,IAAI,CAAC,KAAK,IAAI,IAAI,EAClB,CAAC;wBACD,MAAM,CAAC,IAAI,CAAC;4BACV,IAAI,EAAE,YAAY;4BAClB,OAAO,EAAE,IAAI,CAAC,KAAK;4BACnB,SAAS,EAAE,IAAI,CAAC,IAAI;4BACpB,KAAK,EAAE,IAAI,CAAC,KAAK;yBAClB,CAAC,CAAC;oBACL,CAAC;oBACD,MAAM;gBACR,KAAK,QAAQ;oBACX,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC;oBAC7B,IAAI,CAAC;wBACH,KAAK,EAAE,QAAQ;wBACf,OAAO,EAAE,GAAG,CAAC,OAAO;wBACpB,IAAI,EAAE,GAAG,CAAC,SAAS;qBACpB,CAAC,CAAC;oBACH,MAAM;gBACR,KAAK,MAAM;oBACT,IAAI,cAAc,KAAK,GAAG,CAAC,OAAO;wBAAE,cAAc,GAAG,IAAI,CAAC;oBAC1D,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBAC9C,MAAM;gBACR,KAAK,YAAY;oBACf,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC9C,MAAM;gBACR,KAAK,WAAW;oBACd,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;oBAC/C,MAAM;gBACR,KAAK,WAAW;oBACd,IAAI,CAAC;wBACH,KAAK,EAAE,WAAW;wBAClB,OAAO,EAAE,GAAG,CAAC,OAAO;wBACpB,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,KAAK,EAAE,GAAG,CAAC,KAAK;qBACjB,CAAC,CAAC;oBACH,MAAM;gBACR,KAAK,YAAY;oBACf,IAAI,CAAC;wBACH,KAAK,EAAE,YAAY;wBACnB,OAAO,EAAE,GAAG,CAAC,OAAO;wBACpB,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG;wBAClB,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI;wBACpB,GAAG,EAAE,GAAG,CAAC,GAAG;qBACb,CAAC,CAAC;oBACH,MAAM;gBACR,KAAK,YAAY;oBACf,IAAI,CAAC;wBACH,KAAK,EAAE,YAAY;wBACnB,OAAO,EAAE,GAAG,CAAC,OAAO;wBACpB,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,KAAK,EAAE,GAAG,CAAC,KAAK;qBACjB,CAAC,CAAC;oBACH,MAAM;gBACR,KAAK,YAAY;oBACf,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBACpD,MAAM;gBACR,KAAK,OAAO;oBACV,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;oBAChC,MAAM;gBACR,KAAK,cAAc;oBACjB,IAAI,CAAC;wBACH,KAAK,EAAE,cAAc;wBACrB,OAAO,EAAE,GAAG,CAAC,OAAO;wBACpB,SAAS,EAAE,GAAG,CAAC,SAAS;wBACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;wBACtB,WAAW,EAAE,GAAG,CAAC,WAAW;wBAC5B,OAAO,EAAE,GAAG,CAAC,OAAO;wBACpB,SAAS,EAAE,GAAG,CAAC,SAAS;qBACzB,CAAC,CAAC;oBACH,MAAM;gBACR,KAAK,MAAM;oBACT,MAAM;gBACR,KAAK,mBAAmB;oBACtB,MAAM;gBACR,OAAO,CAAC,CAAC,CAAC;oBACR,MAAM,SAAS,GAAU,GAAG,CAAC;oBAC7B,MAAM,GAAG,GAA4B,SAAS,CAAC;oBAC/C,SAAS,CACP,aAAa,EACb,2BAA2B,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAC7E,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;QAClB,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACrB,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,eAAe;IACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAEjD,2BAA2B;IAC3B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,eAAe,EAAE,uBAAuB,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,SAAS,CAAC,eAAe,EAAE,+BAA+B,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC;QAEnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,cAAc,CAAC;YAE/B,QAAQ,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnB,KAAK,QAAQ;oBACX,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;oBACrC,MAAM;gBACR,KAAK,OAAO;oBACV,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;oBACpC,MAAM;gBACR,KAAK,WAAW,CAAC,CAAC,CAAC;oBACjB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAC7B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;wBAChD,SAAS,CACP,eAAe,EACf,6CAA6C,CAC9C,CAAC;wBACF,OAAO;oBACT,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC5C,MAAM;gBACR,CAAC;gBACD,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;oBACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC7B,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;oBAC/B,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,EAAE,EAAE,CAAC;wBAC1D,SAAS,CAAC,eAAe,EAAE,+BAA+B,CAAC,CAAC;wBAC5D,OAAO;oBACT,CAAC;oBACD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC/D,SAAS,CAAC,eAAe,EAAE,oCAAoC,CAAC,CAAC;wBACjE,OAAO;oBACT,CAAC;oBACD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;wBACjE,SAAS,CAAC,eAAe,EAAE,qCAAqC,CAAC,CAAC;wBAClE,OAAO;oBACT,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,YAAY;wBAClB,OAAO,EAAE,WAAW;wBACpB,SAAS,EAAE,QAAQ;wBACnB,KAAK,EAAE,SAAS;qBACjB,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBACD,KAAK,OAAO;oBACV,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;wBACxC,OAAO;oBACT,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC9C,MAAM;gBACR,KAAK,UAAU,CAAC,CAAC,CAAC;oBAChB,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;oBACnC,MAAM,eAAe,GACnB,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,EAAE;wBACnD,CAAC,CAAC,WAAW;wBACb,CAAC,CAAC,OAAO,CAAC;oBACd,IAAI,CAAC,eAAe,EAAE,CAAC;wBACrB,SAAS,CAAC,UAAU,EAAE,wCAAwC,CAAC,CAAC;wBAChE,OAAO;oBACT,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;oBAC5D,MAAM;gBACR,CAAC;gBACD,KAAK,MAAM;oBACT,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;wBACxC,OAAO;oBACT,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,QAAQ;wBACd,OAAO;wBACP,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;qBACxB,CAAC,CAAC;oBACH,MAAM;gBACR,KAAK,OAAO;oBACV,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;wBACxC,OAAO;oBACT,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,QAAQ;wBACd,OAAO;wBACP,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;qBACzB,CAAC,CAAC;oBACH,MAAM;gBACR,KAAK,MAAM;oBACT,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;wBACxC,OAAO;oBACT,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,QAAQ;wBACd,OAAO;wBACP,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;qBACxB,CAAC,CAAC;oBACH,MAAM;gBACR,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;wBACxC,OAAO;oBACT,CAAC;oBACD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAC7B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;wBAC1E,SAAS,CACP,eAAe,EACf,8CAA8C,CAC/C,CAAC;wBACF,OAAO;oBACT,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,QAAQ;wBACd,OAAO;wBACP,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE;qBAC/B,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBACD,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;wBACxC,OAAO;oBACT,CAAC;oBACD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAC7B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;wBAC1E,SAAS,CACP,eAAe,EACf,gDAAgD,CACjD,CAAC;wBACF,OAAO;oBACT,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,QAAQ;wBACd,OAAO;wBACP,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE;qBACjC,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBACD,KAAK,OAAO;oBACV,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;wBACxC,OAAO;oBACT,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,QAAQ;wBACd,OAAO;wBACP,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;qBACzB,CAAC,CAAC;oBACH,MAAM;gBACR,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;wBACxC,OAAO;oBACT,CAAC;oBACD,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;oBAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;wBAClD,SAAS,CACP,eAAe,EACf,yCAAyC,CAC1C,CAAC;wBACF,OAAO;oBACT,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;oBAChD,MAAM;gBACR,CAAC;gBACD;oBACE,SAAS,CACP,aAAa,EACb,oBAAoB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CACzC,CAAC;YACN,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAClB,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * One-shot CLI commands for AI agents.
3
+ *
4
+ * Each command: connect → auth → do one thing → print JSON → exit.
5
+ * All commands are Effect pipelines — no manual setTimeout or process.exit().
6
+ *
7
+ * @module
8
+ */
9
+ import { Effect } from "effect";
10
+ export declare const EXIT_SUCCESS = 0;
11
+ export declare const EXIT_ERROR = 1;
12
+ export declare const EXIT_HAND_ENDED = 2;
13
+ export declare class CliError {
14
+ readonly _tag = "CliError";
15
+ readonly code: string;
16
+ readonly reason: string;
17
+ readonly exitCode: number;
18
+ constructor(code: string, reason: string, exitCode?: number);
19
+ }
20
+ export interface CommonOpts {
21
+ server: string;
22
+ token: string;
23
+ }
24
+ export declare const tables: (opts: CommonOpts) => Effect.Effect<void, CliError>;
25
+ export interface QuickSeatOpts extends CommonOpts {
26
+ tier: string;
27
+ }
28
+ export declare const quickseat: (opts: QuickSeatOpts) => Effect.Effect<void, CliError>;
29
+ export declare const tiers: (opts: CommonOpts) => Effect.Effect<void, CliError>;
30
+ export interface JoinOpts extends CommonOpts {
31
+ table: string;
32
+ seat: number;
33
+ buyin: number;
34
+ }
35
+ export declare const join: (opts: JoinOpts) => Effect.Effect<void, CliError>;
36
+ export interface LeaveOpts extends CommonOpts {
37
+ table: string;
38
+ }
39
+ export declare const leave: (opts: LeaveOpts) => Effect.Effect<void, CliError>;
40
+ export interface StatusOpts extends CommonOpts {
41
+ table: string;
42
+ }
43
+ export declare const status: (opts: StatusOpts) => Effect.Effect<void, CliError>;
44
+ export interface WaitOpts extends CommonOpts {
45
+ table: string;
46
+ timeout: number;
47
+ }
48
+ export declare const wait: (opts: WaitOpts) => Effect.Effect<number, CliError>;
49
+ export interface ActOpts extends CommonOpts {
50
+ table: string;
51
+ action: string;
52
+ amount: number | undefined;
53
+ wait: boolean;
54
+ timeout: number;
55
+ }
56
+ export declare const act: (opts: ActOpts) => Effect.Effect<number, CliError>;
57
+ //# sourceMappingURL=oneshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oneshot.d.ts","sourceRoot":"","sources":["../src/oneshot.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAA0B,MAAM,QAAQ,CAAC;AASxD,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,eAAO,MAAM,eAAe,IAAI,CAAC;AAIjC,qBAAa,QAAQ;IACnB,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBACd,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAmB;CAKxE;AA6FD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,MAAM,GAAI,MAAM,UAAU,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAWnE,CAAC;AAEJ,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,SAAS,GACpB,MAAM,aAAa,KAClB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAW5B,CAAC;AAEJ,eAAO,MAAM,KAAK,GAAI,MAAM,UAAU,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAWlE,CAAC;AAEJ,MAAM,WAAW,QAAS,SAAQ,UAAU;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,IAAI,GAAI,MAAM,QAAQ,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAgB/D,CAAC;AAEJ,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,KAAK,GAAI,MAAM,SAAS,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAUjE,CAAC;AAEJ,MAAM,WAAW,UAAW,SAAQ,UAAU;IAC5C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,MAAM,GAAI,MAAM,UAAU,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CA4BnE,CAAC;AAEJ,MAAM,WAAW,QAAS,SAAQ,UAAU;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,IAAI,GAAI,MAAM,QAAQ,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAsDjE,CAAC;AAEJ,MAAM,WAAW,OAAQ,SAAQ,UAAU;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAuCD,eAAO,MAAM,GAAG,GAAI,MAAM,OAAO,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAuG9D,CAAC"}