@newyorkcompute/kalshi-tui 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.
Files changed (82) hide show
  1. package/README.md +105 -0
  2. package/dist/App.d.ts +5 -0
  3. package/dist/App.d.ts.map +1 -0
  4. package/dist/App.js +49 -0
  5. package/dist/App.js.map +1 -0
  6. package/dist/cli.d.ts +9 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +64 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/components/Header.d.ts +5 -0
  11. package/dist/components/Header.d.ts.map +1 -0
  12. package/dist/components/Header.js +14 -0
  13. package/dist/components/Header.js.map +1 -0
  14. package/dist/components/HelpModal.d.ts +5 -0
  15. package/dist/components/HelpModal.d.ts.map +1 -0
  16. package/dist/components/HelpModal.js +19 -0
  17. package/dist/components/HelpModal.js.map +1 -0
  18. package/dist/components/MarketList.d.ts +5 -0
  19. package/dist/components/MarketList.d.ts.map +1 -0
  20. package/dist/components/MarketList.js +68 -0
  21. package/dist/components/MarketList.js.map +1 -0
  22. package/dist/components/OrderEntry.d.ts +9 -0
  23. package/dist/components/OrderEntry.d.ts.map +1 -0
  24. package/dist/components/OrderEntry.js +77 -0
  25. package/dist/components/OrderEntry.js.map +1 -0
  26. package/dist/components/Orderbook.d.ts +9 -0
  27. package/dist/components/Orderbook.d.ts.map +1 -0
  28. package/dist/components/Orderbook.js +43 -0
  29. package/dist/components/Orderbook.js.map +1 -0
  30. package/dist/components/Positions.d.ts +5 -0
  31. package/dist/components/Positions.d.ts.map +1 -0
  32. package/dist/components/Positions.js +22 -0
  33. package/dist/components/Positions.js.map +1 -0
  34. package/dist/components/SearchBar.d.ts +5 -0
  35. package/dist/components/SearchBar.d.ts.map +1 -0
  36. package/dist/components/SearchBar.js +27 -0
  37. package/dist/components/SearchBar.js.map +1 -0
  38. package/dist/components/StatusBar.d.ts +5 -0
  39. package/dist/components/StatusBar.d.ts.map +1 -0
  40. package/dist/components/StatusBar.js +9 -0
  41. package/dist/components/StatusBar.js.map +1 -0
  42. package/dist/components/index.d.ts +11 -0
  43. package/dist/components/index.d.ts.map +1 -0
  44. package/dist/components/index.js +12 -0
  45. package/dist/components/index.js.map +1 -0
  46. package/dist/components/ui/Box.d.ts +14 -0
  47. package/dist/components/ui/Box.d.ts.map +1 -0
  48. package/dist/components/ui/Box.js +9 -0
  49. package/dist/components/ui/Box.js.map +1 -0
  50. package/dist/components/ui/Sparkline.d.ts +11 -0
  51. package/dist/components/ui/Sparkline.d.ts.map +1 -0
  52. package/dist/components/ui/Sparkline.js +32 -0
  53. package/dist/components/ui/Sparkline.js.map +1 -0
  54. package/dist/hooks/index.d.ts +5 -0
  55. package/dist/hooks/index.d.ts.map +1 -0
  56. package/dist/hooks/index.js +5 -0
  57. package/dist/hooks/index.js.map +1 -0
  58. package/dist/hooks/useKalshi.d.ts +16 -0
  59. package/dist/hooks/useKalshi.d.ts.map +1 -0
  60. package/dist/hooks/useKalshi.js +31 -0
  61. package/dist/hooks/useKalshi.js.map +1 -0
  62. package/dist/hooks/useMarkets.d.ts +13 -0
  63. package/dist/hooks/useMarkets.d.ts.map +1 -0
  64. package/dist/hooks/useMarkets.js +89 -0
  65. package/dist/hooks/useMarkets.js.map +1 -0
  66. package/dist/hooks/useOrderbook.d.ts +13 -0
  67. package/dist/hooks/useOrderbook.d.ts.map +1 -0
  68. package/dist/hooks/useOrderbook.js +81 -0
  69. package/dist/hooks/useOrderbook.js.map +1 -0
  70. package/dist/hooks/usePortfolio.d.ts +18 -0
  71. package/dist/hooks/usePortfolio.d.ts.map +1 -0
  72. package/dist/hooks/usePortfolio.js +84 -0
  73. package/dist/hooks/usePortfolio.js.map +1 -0
  74. package/dist/stores/app-store.d.ts +17 -0
  75. package/dist/stores/app-store.d.ts.map +1 -0
  76. package/dist/stores/app-store.js +21 -0
  77. package/dist/stores/app-store.js.map +1 -0
  78. package/dist/theme.d.ts +31 -0
  79. package/dist/theme.d.ts.map +1 -0
  80. package/dist/theme.js +37 -0
  81. package/dist/theme.js.map +1 -0
  82. package/package.json +64 -0
package/README.md ADDED
@@ -0,0 +1,105 @@
1
+ # @newyorkcompute/kalshi-tui
2
+
3
+ [![npm version](https://img.shields.io/npm/v/@newyorkcompute/kalshi-tui)](https://www.npmjs.com/package/@newyorkcompute/kalshi-tui)
4
+ [![license](https://img.shields.io/npm/l/@newyorkcompute/kalshi-tui)](https://github.com/newyorkcompute/kalshi/blob/main/LICENSE)
5
+
6
+ **Free. Open source. Beautiful.**
7
+
8
+ A terminal so polished that the screenshot alone is the pitch. Real-time market data, orderbook visualization, portfolio management, and trading — all without leaving your terminal.
9
+
10
+ No AI. No gimmicks. Pure craft.
11
+
12
+ ## Installation
13
+
14
+ ```bash
15
+ npx @newyorkcompute/kalshi-tui
16
+ ```
17
+
18
+ Or install globally:
19
+
20
+ ```bash
21
+ npm install -g @newyorkcompute/kalshi-tui
22
+ ```
23
+
24
+ ## Screenshot
25
+
26
+ ```
27
+ ┌──────────────────────────────────────────────────────────────────────────────┐
28
+ │ ▓ KALSHI Balance: $1,234.56 ◉ │
29
+ │ NEW YORK COMPUTE │
30
+ ├────────────────────────────────────┬─────────────────────────────────────────┤
31
+ │ MARKETS [F1] │ ORDERBOOK: KXBTC-25JAN-B100 │
32
+ │ ──────────────────────────────────│ ───────────────────────────────────── │
33
+ │ KXBTC-25JAN-B100 45¢ ▲ +2 │ ASK ████████████████ 52¢ (120) │
34
+ │ KXBTC-25JAN-B105 32¢ ▼ -1 │ ASK ████████████ 50¢ (85) │
35
+ │ KXETH-25JAN-B4000 67¢ ━ 0 │ BID ██████████ 46¢ (60) │
36
+ │ TRUMP-WIN-2024 52¢ ▲ +5 │ BID ████████████████ 42¢ (150) │
37
+ ├───────────────────────────────────┼─────────────────────────────────────────┤
38
+ │ POSITIONS [F2] │ QUICK TRADE [F4] │
39
+ │ ──────────────────────────────────│ ───────────────────────────────────── │
40
+ │ KXBTC-25JAN-B100 +10 YES $45 │ Ticker: KXBTC-25JAN-B100 │
41
+ │ TRUMP-WIN-2024 -5 NO $26 │ Side: [YES] NO │
42
+ │ ──────────────────────────────────│ Qty: 10 Price: 45¢ │
43
+ │ Total Exposure: $71 │ Cost: $4.50 [BUY] │
44
+ ├───────────────────────────────────┴─────────────────────────────────────────┤
45
+ │ Built by New York Compute • newyorkcompute.xyz [?] Help [q] Quit │
46
+ └──────────────────────────────────────────────────────────────────────────────┘
47
+ ```
48
+
49
+ ## Features
50
+
51
+ - **Market Watch** - Real-time prices with keyboard navigation
52
+ - **Orderbook** - Visual depth chart for selected market
53
+ - **Portfolio** - Live balance and position tracking
54
+ - **Quick Trade** - Place orders without leaving the terminal
55
+ - **Keyboard-first** - Full navigation without a mouse
56
+
57
+ ## Keybindings
58
+
59
+ | Key | Action |
60
+ |-----|--------|
61
+ | `↑` / `↓` | Navigate markets |
62
+ | `Enter` | Select market |
63
+ | `Tab` | Toggle YES/NO side |
64
+ | `[` / `]` | Adjust quantity |
65
+ | `-` / `+` | Adjust price |
66
+ | `?` | Show help |
67
+ | `q` | Quit |
68
+
69
+ ## Environment Variables
70
+
71
+ | Variable | Required | Description |
72
+ |----------|----------|-------------|
73
+ | `KALSHI_API_KEY` | Yes | Your Kalshi API key ID |
74
+ | `KALSHI_PRIVATE_KEY` | Yes | RSA private key (PEM format) |
75
+ | `KALSHI_BASE_PATH` | No | API base URL (default: production) |
76
+
77
+ ## Usage
78
+
79
+ ```bash
80
+ # With environment variables
81
+ export KALSHI_API_KEY="your-api-key"
82
+ export KALSHI_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
83
+ ...
84
+ -----END RSA PRIVATE KEY-----"
85
+
86
+ kalshi-tui
87
+ ```
88
+
89
+ ## Getting API Keys
90
+
91
+ 1. Log into your [Kalshi account](https://kalshi.com)
92
+ 2. Go to Account Settings → API
93
+ 3. Generate a new API key (you'll create an RSA key pair)
94
+ 4. Save your API Key ID and private key securely
95
+
96
+ ## Built By
97
+
98
+ **New York Compute** — Command-native tools for quantitative research, execution, and market intelligence.
99
+
100
+ Want this for equities? [Request early access →](https://newyorkcompute.xyz)
101
+
102
+ ## License
103
+
104
+ MIT © [NewYorkCompute](https://github.com/newyorkcompute)
105
+
package/dist/App.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Main application component
3
+ */
4
+ export declare function App(): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=App.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"AAaA;;GAEG;AACH,wBAAgB,GAAG,4CA0FlB"}
package/dist/App.js ADDED
@@ -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, useApp, useInput } from "ink";
4
+ import { Header } from "./components/Header.js";
5
+ import { MarketList } from "./components/MarketList.js";
6
+ import { Orderbook } from "./components/Orderbook.js";
7
+ import { Positions } from "./components/Positions.js";
8
+ import { OrderEntry } from "./components/OrderEntry.js";
9
+ import { StatusBar } from "./components/StatusBar.js";
10
+ import { HelpModal } from "./components/HelpModal.js";
11
+ import { SearchBar } from "./components/SearchBar.js";
12
+ import { useAppStore } from "./stores/app-store.js";
13
+ import { useKalshi } from "./hooks/useKalshi.js";
14
+ /**
15
+ * Main application component
16
+ */
17
+ export function App() {
18
+ const { exit } = useApp();
19
+ const [error, setError] = useState(null);
20
+ const { isConfigured, configError } = useKalshi();
21
+ const selectedMarket = useAppStore((state) => state.selectedMarket);
22
+ // Handle keyboard input
23
+ useInput((input, key) => {
24
+ // Quit on 'q' or Ctrl+C
25
+ if (input === "q" || (key.ctrl && input === "c")) {
26
+ exit();
27
+ }
28
+ // Help on '?'
29
+ if (input === "?") {
30
+ useAppStore.getState().toggleHelp();
31
+ }
32
+ });
33
+ // Check configuration on mount
34
+ useEffect(() => {
35
+ if (configError) {
36
+ setError(configError);
37
+ }
38
+ }, [configError]);
39
+ // Show error screen if not configured
40
+ if (error) {
41
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "red", bold: true, children: "Configuration Error" }) }), _jsx(Text, { color: "gray", children: error }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Set KALSHI_API_KEY and KALSHI_PRIVATE_KEY environment variables." }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Run `kalshi-tui --help` for more information." }) })] }));
42
+ }
43
+ // Loading state
44
+ if (!isConfigured) {
45
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Text, { color: "green", children: "\u2593" }), _jsx(Text, { children: " Connecting to Kalshi..." })] }));
46
+ }
47
+ return (_jsxs(Box, { flexDirection: "column", width: "100%", children: [_jsx(Header, {}), _jsx(SearchBar, {}), _jsxs(Box, { flexDirection: "row", flexGrow: 1, children: [_jsxs(Box, { flexDirection: "column", width: "50%", children: [_jsx(MarketList, {}), _jsx(Positions, {})] }), _jsxs(Box, { flexDirection: "column", width: "50%", children: [_jsx(Orderbook, { ticker: selectedMarket }), _jsx(OrderEntry, { ticker: selectedMarket })] })] }), _jsx(StatusBar, {}), _jsx(HelpModal, {})] }));
48
+ }
49
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Kalshi TUI - Terminal Trading Dashboard
4
+ *
5
+ * A beautiful terminal interface for Kalshi prediction markets.
6
+ * Built by New York Compute.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":";AACA;;;;;GAKG"}
package/dist/cli.js ADDED
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env node
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { render } from "ink";
4
+ import { App } from "./App.js";
5
+ // Handle --help and --version flags
6
+ const args = process.argv.slice(2);
7
+ if (args.includes("--help") || args.includes("-h")) {
8
+ console.log(`
9
+ Kalshi TUI - Terminal Trading Dashboard
10
+
11
+ Usage:
12
+ kalshi-tui [options]
13
+
14
+ Options:
15
+ --help, -h Show this help message
16
+ --version, -v Show version number
17
+ --about Show about information
18
+
19
+ Environment Variables:
20
+ KALSHI_API_KEY Your Kalshi API key ID (required)
21
+ KALSHI_PRIVATE_KEY RSA private key in PEM format (required)
22
+ KALSHI_BASE_PATH API base URL (optional, defaults to production)
23
+
24
+ Examples:
25
+ $ kalshi-tui
26
+ $ KALSHI_API_KEY=xxx KALSHI_PRIVATE_KEY="..." kalshi-tui
27
+
28
+ Built by New York Compute
29
+ https://newyorkcompute.xyz
30
+ `);
31
+ process.exit(0);
32
+ }
33
+ if (args.includes("--version") || args.includes("-v")) {
34
+ console.log("0.1.0");
35
+ process.exit(0);
36
+ }
37
+ if (args.includes("--about")) {
38
+ console.log(`
39
+ ┌──────────────────────────────────────────────────────────┐
40
+ │ │
41
+ │ ▓ KALSHI TUI │
42
+ │ NEW YORK COMPUTE │
43
+ │ │
44
+ │ Free. Open source. Beautiful. │
45
+ │ │
46
+ │ A terminal so polished that the screenshot alone │
47
+ │ is the pitch. No AI. No gimmicks. Pure craft. │
48
+ │ │
49
+ │ Version: 0.1.0 │
50
+ │ License: MIT │
51
+ │ │
52
+ │ GitHub: github.com/newyorkcompute/kalshi │
53
+ │ Website: newyorkcompute.xyz │
54
+ │ │
55
+ │ Want this for equities? Request early access: │
56
+ │ → newyorkcompute.xyz │
57
+ │ │
58
+ └──────────────────────────────────────────────────────────┘
59
+ `);
60
+ process.exit(0);
61
+ }
62
+ // Render the app
63
+ render(_jsx(App, {}));
64
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":";;AASA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,oCAAoC;AACpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;CAsBb,CAAC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;CAqBb,CAAC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,iBAAiB;AACjB,MAAM,CAAC,KAAC,GAAG,KAAG,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Header component with branding and balance
3
+ */
4
+ export declare function Header(): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=Header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../src/components/Header.tsx"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAgB,MAAM,4CA4CrB"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { formatCurrency } from "@newyorkcompute/kalshi-core";
4
+ import { usePortfolio } from "../hooks/usePortfolio.js";
5
+ import { useAppStore } from "../stores/app-store.js";
6
+ /**
7
+ * Header component with branding and balance
8
+ */
9
+ export function Header() {
10
+ const { balance } = usePortfolio();
11
+ const isConnected = useAppStore((state) => state.isConnected);
12
+ return (_jsxs(Box, { borderStyle: "single", borderColor: "gray", paddingX: 1, justifyContent: "space-between", children: [_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: "green", bold: true, children: "\u2593" }), _jsx(Text, { bold: true, children: " KALSHI" })] }), _jsx(Text, { color: "gray", dimColor: true, children: "NEW YORK COMPUTE" })] }), _jsxs(Box, { flexDirection: "column", alignItems: "flex-end", children: [_jsxs(Box, { children: [_jsx(Text, { children: "Balance: " }), _jsx(Text, { color: "white", bold: true, children: balance ? formatCurrency(balance.balance) : "—" })] }), _jsxs(Box, { children: [_jsx(Text, { color: isConnected ? "green" : "red", children: isConnected ? "◉" : "○" }), _jsxs(Text, { color: "gray", dimColor: true, children: [" ", isConnected ? "connected" : "disconnected"] })] })] })] }));
13
+ }
14
+ //# sourceMappingURL=Header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.js","sourceRoot":"","sources":["../../src/components/Header.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,MAAM;IACpB,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE,CAAC;IACnC,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAE9D,OAAO,CACL,MAAC,GAAG,IACF,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,cAAc,EAAC,eAAe,aAG9B,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,6BAEjB,EACP,KAAC,IAAI,IAAC,IAAI,8BAAe,IACrB,EACN,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,uCAEpB,IACH,EAGN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,UAAU,aAC/C,MAAC,GAAG,eACF,KAAC,IAAI,4BAAiB,EACtB,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,kBACrB,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAC3C,IACH,EACN,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,YACvC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GACnB,EACP,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,mBACxB,GAAG,EACH,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,IACtC,IACH,IACF,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Help modal showing keybindings and commands
3
+ */
4
+ export declare function HelpModal(): import("react/jsx-runtime").JSX.Element | null;
5
+ //# sourceMappingURL=HelpModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HelpModal.d.ts","sourceRoot":"","sources":["../../src/components/HelpModal.tsx"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAgB,SAAS,mDAuGxB"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text, useInput } from "ink";
3
+ import { useAppStore } from "../stores/app-store.js";
4
+ /**
5
+ * Help modal showing keybindings and commands
6
+ */
7
+ export function HelpModal() {
8
+ const showHelp = useAppStore((state) => state.showHelp);
9
+ const toggleHelp = useAppStore((state) => state.toggleHelp);
10
+ useInput((input, key) => {
11
+ if (showHelp && (input === "?" || key.escape || input === "q")) {
12
+ toggleHelp();
13
+ }
14
+ });
15
+ if (!showHelp)
16
+ return null;
17
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "double", borderColor: "green", padding: 1, position: "absolute", marginLeft: 10, marginTop: 5, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "green", bold: true, children: "\u2593 KALSHI TUI \u2014 HELP" }) }), _jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: "white", bold: true, children: "Navigation" }), _jsxs(Box, { marginLeft: 2, flexDirection: "column", children: [_jsxs(Text, { children: [_jsx(Text, { color: "green", children: "\u2191 / \u2193" }), _jsx(Text, { color: "gray", children: " \u2014 Navigate markets" })] }), _jsxs(Text, { children: [_jsx(Text, { color: "green", children: "Enter" }), _jsx(Text, { color: "gray", children: " \u2014 Select market" })] }), _jsxs(Text, { children: [_jsx(Text, { color: "green", children: "F1-F4" }), _jsx(Text, { color: "gray", children: " \u2014 Switch panels" })] }), _jsxs(Text, { children: [_jsx(Text, { color: "green", children: "/" }), _jsx(Text, { color: "gray", children: " \u2014 Search markets" })] })] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "white", bold: true, children: "Trading" }) }), _jsxs(Box, { marginLeft: 2, flexDirection: "column", children: [_jsxs(Text, { children: [_jsx(Text, { color: "green", children: "Tab" }), _jsx(Text, { color: "gray", children: " \u2014 Toggle YES/NO side" })] }), _jsxs(Text, { children: [_jsx(Text, { color: "green", children: "[ / ]" }), _jsx(Text, { color: "gray", children: " \u2014 Adjust quantity" })] }), _jsxs(Text, { children: [_jsx(Text, { color: "green", children: "- / +" }), _jsx(Text, { color: "gray", children: " \u2014 Adjust price" })] }), _jsxs(Text, { children: [_jsx(Text, { color: "green", children: "Enter" }), _jsx(Text, { color: "gray", children: " \u2014 Place order" })] })] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "white", bold: true, children: "General" }) }), _jsxs(Box, { marginLeft: 2, flexDirection: "column", children: [_jsxs(Text, { children: [_jsx(Text, { color: "green", children: "r" }), _jsx(Text, { color: "gray", children: " \u2014 Refresh data" })] }), _jsxs(Text, { children: [_jsx(Text, { color: "green", children: "?" }), _jsx(Text, { color: "gray", children: " \u2014 Toggle this help" })] }), _jsxs(Text, { children: [_jsx(Text, { color: "green", children: "q" }), _jsx(Text, { color: "gray", children: " \u2014 Quit" })] })] })] }), _jsx(Box, { marginTop: 1, justifyContent: "center", children: _jsx(Text, { color: "gray", dimColor: true, children: "Press ? or Esc to close" }) })] }));
18
+ }
19
+ //# sourceMappingURL=HelpModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HelpModal.js","sourceRoot":"","sources":["../../src/components/HelpModal.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Market list panel with scrollable market data
3
+ */
4
+ export declare function MarketList(): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=MarketList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarketList.d.ts","sourceRoot":"","sources":["../../src/components/MarketList.tsx"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAgB,UAAU,4CAgJzB"}
@@ -0,0 +1,68 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useState } from "react";
3
+ import { Box, Text, useInput } from "ink";
4
+ import { formatPrice, truncate } from "@newyorkcompute/kalshi-core";
5
+ import { useMarkets } from "../hooks/useMarkets.js";
6
+ import { useAppStore } from "../stores/app-store.js";
7
+ /**
8
+ * Market list panel with scrollable market data
9
+ */
10
+ export function MarketList() {
11
+ const { markets, isLoading, error } = useMarkets();
12
+ const [selectedIndex, setSelectedIndex] = useState(0);
13
+ const [scrollOffset, setScrollOffset] = useState(0);
14
+ const setSelectedMarket = useAppStore((state) => state.setSelectedMarket);
15
+ const activePanel = useAppStore((state) => state.activePanel);
16
+ const searchQuery = useAppStore((state) => state.searchQuery);
17
+ const isActive = activePanel === "markets";
18
+ const visibleRows = 8;
19
+ // Filter markets by search query
20
+ const filteredMarkets = markets.filter((m) => m.ticker?.toLowerCase().includes(searchQuery.toLowerCase()) ||
21
+ m.title?.toLowerCase().includes(searchQuery.toLowerCase()));
22
+ // Handle keyboard navigation
23
+ useInput((input, key) => {
24
+ if (!isActive)
25
+ return;
26
+ if (key.upArrow) {
27
+ const newIndex = Math.max(0, selectedIndex - 1);
28
+ setSelectedIndex(newIndex);
29
+ if (newIndex < scrollOffset) {
30
+ setScrollOffset(newIndex);
31
+ }
32
+ if (filteredMarkets[newIndex]) {
33
+ setSelectedMarket(filteredMarkets[newIndex].ticker || null);
34
+ }
35
+ }
36
+ if (key.downArrow) {
37
+ const newIndex = Math.min(filteredMarkets.length - 1, selectedIndex + 1);
38
+ setSelectedIndex(newIndex);
39
+ if (newIndex >= scrollOffset + visibleRows) {
40
+ setScrollOffset(newIndex - visibleRows + 1);
41
+ }
42
+ if (filteredMarkets[newIndex]) {
43
+ setSelectedMarket(filteredMarkets[newIndex].ticker || null);
44
+ }
45
+ }
46
+ if (key.return && filteredMarkets[selectedIndex]) {
47
+ setSelectedMarket(filteredMarkets[selectedIndex].ticker || null);
48
+ }
49
+ }, { isActive });
50
+ // Select first market on initial load
51
+ React.useEffect(() => {
52
+ if (filteredMarkets.length > 0 && !useAppStore.getState().selectedMarket) {
53
+ setSelectedMarket(filteredMarkets[0].ticker || null);
54
+ }
55
+ }, [filteredMarkets, setSelectedMarket]);
56
+ const visibleMarkets = filteredMarkets.slice(scrollOffset, scrollOffset + visibleRows);
57
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: isActive ? "green" : "gray", flexGrow: 1, children: [_jsxs(Box, { paddingX: 1, justifyContent: "space-between", children: [_jsx(Text, { bold: true, color: isActive ? "green" : "white", children: "MARKETS" }), _jsx(Text, { color: "gray", dimColor: true, children: "[F1]" })] }), _jsx(Box, { paddingX: 1, children: _jsx(Text, { color: "gray", children: "─".repeat(40) }) }), _jsxs(Box, { flexDirection: "column", paddingX: 1, flexGrow: 1, children: [isLoading && (_jsx(Text, { color: "gray", children: "Loading markets..." })), error && (_jsx(Text, { color: "red", children: error })), !isLoading && !error && filteredMarkets.length === 0 && (_jsx(Text, { color: "gray", children: "No markets found" })), visibleMarkets.map((market, index) => {
58
+ const actualIndex = scrollOffset + index;
59
+ const isSelected = actualIndex === selectedIndex;
60
+ const yesBid = market.yes_bid ?? 0;
61
+ // Calculate price change (mock for now - would need historical data)
62
+ const change = 0;
63
+ const changeColor = change > 0 ? "green" : change < 0 ? "red" : "gray";
64
+ const changeSymbol = change > 0 ? "▲" : change < 0 ? "▼" : "━";
65
+ return (_jsxs(Box, { justifyContent: "space-between", children: [_jsxs(Text, { color: isSelected ? "green" : "white", bold: isSelected, inverse: isSelected, children: [" ", truncate(market.ticker || "", 20)] }), _jsxs(Box, { children: [_jsx(Text, { color: "white", children: formatPrice(yesBid) }), _jsxs(Text, { color: changeColor, children: [" ", changeSymbol, " ", change >= 0 ? "+" : "", change] })] })] }, market.ticker));
66
+ }), filteredMarkets.length > visibleRows && (_jsx(Box, { justifyContent: "center", marginTop: 1, children: _jsxs(Text, { color: "gray", dimColor: true, children: [scrollOffset + 1, "-", Math.min(scrollOffset + visibleRows, filteredMarkets.length), " of", " ", filteredMarkets.length] }) }))] })] }));
67
+ }
68
+ //# sourceMappingURL=MarketList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarketList.js","sourceRoot":"","sources":["../../src/components/MarketList.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ interface OrderEntryProps {
2
+ ticker: string | null;
3
+ }
4
+ /**
5
+ * Order entry form for placing trades
6
+ */
7
+ export declare function OrderEntry({ ticker }: OrderEntryProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=OrderEntry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderEntry.d.ts","sourceRoot":"","sources":["../../src/components/OrderEntry.tsx"],"names":[],"mappings":"AAMA,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,eAAe,2CA4LrD"}
@@ -0,0 +1,77 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { Box, Text, useInput } from "ink";
4
+ import { formatPrice, formatCurrency } from "@newyorkcompute/kalshi-core";
5
+ import { useAppStore } from "../stores/app-store.js";
6
+ import { useKalshi } from "../hooks/useKalshi.js";
7
+ /**
8
+ * Order entry form for placing trades
9
+ */
10
+ export function OrderEntry({ ticker }) {
11
+ const { ordersApi } = useKalshi();
12
+ const activePanel = useAppStore((state) => state.activePanel);
13
+ const isActive = activePanel === "order";
14
+ const [side, setSide] = useState("yes");
15
+ const [quantity, setQuantity] = useState(10);
16
+ const [price, setPrice] = useState(50);
17
+ const [isSubmitting, setIsSubmitting] = useState(false);
18
+ const [message, setMessage] = useState(null);
19
+ // Calculate cost
20
+ const cost = (quantity * price) / 100;
21
+ // Handle keyboard input
22
+ useInput((input, key) => {
23
+ if (!isActive || !ticker)
24
+ return;
25
+ // Toggle side with Tab
26
+ if (key.tab) {
27
+ setSide((s) => (s === "yes" ? "no" : "yes"));
28
+ }
29
+ // Adjust quantity with [ and ]
30
+ if (input === "[") {
31
+ setQuantity((q) => Math.max(1, q - 1));
32
+ }
33
+ if (input === "]") {
34
+ setQuantity((q) => q + 1);
35
+ }
36
+ // Adjust price with - and +
37
+ if (input === "-") {
38
+ setPrice((p) => Math.max(1, p - 1));
39
+ }
40
+ if (input === "=" || input === "+") {
41
+ setPrice((p) => Math.min(99, p + 1));
42
+ }
43
+ // Submit with Enter
44
+ if (key.return && !isSubmitting) {
45
+ handleSubmit();
46
+ }
47
+ }, { isActive });
48
+ const handleSubmit = async () => {
49
+ if (!ordersApi || !ticker)
50
+ return;
51
+ setIsSubmitting(true);
52
+ setMessage(null);
53
+ try {
54
+ await ordersApi.createOrder({
55
+ ticker,
56
+ side: side === "yes" ? "yes" : "no",
57
+ action: "buy",
58
+ count: quantity,
59
+ type: "limit",
60
+ yes_price: side === "yes" ? price : undefined,
61
+ no_price: side === "no" ? price : undefined,
62
+ });
63
+ setMessage({ type: "success", text: "Order placed successfully" });
64
+ }
65
+ catch (error) {
66
+ setMessage({
67
+ type: "error",
68
+ text: error instanceof Error ? error.message : "Failed to place order",
69
+ });
70
+ }
71
+ finally {
72
+ setIsSubmitting(false);
73
+ }
74
+ };
75
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: isActive ? "green" : "gray", height: 10, children: [_jsxs(Box, { paddingX: 1, justifyContent: "space-between", children: [_jsx(Text, { bold: true, color: isActive ? "green" : "white", children: "QUICK TRADE" }), _jsx(Text, { color: "gray", dimColor: true, children: "[F4]" })] }), _jsx(Box, { paddingX: 1, children: _jsx(Text, { color: "gray", children: "─".repeat(40) }) }), _jsxs(Box, { flexDirection: "column", paddingX: 1, flexGrow: 1, children: [!ticker && (_jsx(Text, { color: "gray", children: "Select a market to trade" })), ticker && (_jsxs(_Fragment, { children: [_jsxs(Box, { children: [_jsx(Text, { color: "gray", children: "Ticker: " }), _jsx(Text, { color: "white", children: ticker })] }), _jsxs(Box, { children: [_jsx(Text, { color: "gray", children: "Side: " }), _jsx(Text, { color: side === "yes" ? "green" : "gray", bold: side === "yes", inverse: side === "yes", children: "[YES]" }), _jsx(Text, { children: " " }), _jsx(Text, { color: side === "no" ? "red" : "gray", bold: side === "no", inverse: side === "no", children: "[NO]" }), _jsxs(Text, { color: "gray", dimColor: true, children: [" ", "(Tab)"] })] }), _jsxs(Box, { justifyContent: "space-between", children: [_jsxs(Box, { children: [_jsx(Text, { color: "gray", children: "Qty: " }), _jsx(Text, { color: "white", children: quantity }), _jsxs(Text, { color: "gray", dimColor: true, children: [" ", "([/])"] })] }), _jsxs(Box, { children: [_jsx(Text, { color: "gray", children: "Price: " }), _jsx(Text, { color: "white", children: formatPrice(price) }), _jsxs(Text, { color: "gray", dimColor: true, children: [" ", "(-/+)"] })] })] }), _jsxs(Box, { justifyContent: "space-between", marginTop: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: "gray", children: "Cost: " }), _jsx(Text, { color: "white", bold: true, children: formatCurrency(cost * 100) })] }), _jsx(Box, { children: _jsx(Text, { color: isSubmitting ? "gray" : "green", bold: true, inverse: !isSubmitting, children: isSubmitting ? " PLACING... " : " [BUY] " }) })] }), message && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: message.type === "success" ? "green" : "red", children: message.text }) }))] }))] })] }));
76
+ }
77
+ //# sourceMappingURL=OrderEntry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderEntry.js","sourceRoot":"","sources":["../../src/components/OrderEntry.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ interface OrderbookProps {
2
+ ticker: string | null;
3
+ }
4
+ /**
5
+ * Orderbook visualization with depth bars
6
+ */
7
+ export declare function Orderbook({ ticker }: OrderbookProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=Orderbook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Orderbook.d.ts","sourceRoot":"","sources":["../../src/components/Orderbook.tsx"],"names":[],"mappings":"AAMA,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,cAAc,2CA0HnD"}
@@ -0,0 +1,43 @@
1
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { formatPrice } from "@newyorkcompute/kalshi-core";
4
+ import { useOrderbook } from "../hooks/useOrderbook.js";
5
+ import { useAppStore } from "../stores/app-store.js";
6
+ /**
7
+ * Orderbook visualization with depth bars
8
+ */
9
+ export function Orderbook({ ticker }) {
10
+ const { orderbook, isLoading, error } = useOrderbook(ticker);
11
+ const activePanel = useAppStore((state) => state.activePanel);
12
+ const isActive = activePanel === "orderbook";
13
+ // Calculate max quantity for bar scaling
14
+ const yesQtys = orderbook?.yes?.map((level) => level[1]) || [];
15
+ const noQtys = orderbook?.no?.map((level) => level[1]) || [];
16
+ const allQuantities = [...yesQtys, ...noQtys];
17
+ const maxQty = Math.max(...allQuantities, 1);
18
+ // Render a depth bar
19
+ const renderBar = (quantity, side, maxWidth = 20) => {
20
+ const barWidth = Math.round((quantity / maxQty) * maxWidth);
21
+ const bar = "█".repeat(barWidth);
22
+ const padding = " ".repeat(maxWidth - barWidth);
23
+ if (side === "ask") {
24
+ return (_jsxs(Text, { color: "red", children: [padding, bar] }));
25
+ }
26
+ else {
27
+ return _jsx(Text, { color: "green", children: bar });
28
+ }
29
+ };
30
+ // Get asks (sorted high to low) and bids (sorted high to low)
31
+ const asks = (orderbook?.no || [])
32
+ .slice(0, 5)
33
+ .sort((a, b) => b[0] - a[0]);
34
+ const bids = (orderbook?.yes || [])
35
+ .slice(0, 5)
36
+ .sort((a, b) => b[0] - a[0]);
37
+ // Calculate spread
38
+ const bestAsk = asks.length > 0 ? asks[asks.length - 1][0] : null;
39
+ const bestBid = bids.length > 0 ? bids[0][0] : null;
40
+ const spread = bestAsk && bestBid ? bestAsk - bestBid : null;
41
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: isActive ? "green" : "gray", flexGrow: 1, children: [_jsxs(Box, { paddingX: 1, justifyContent: "space-between", children: [_jsxs(Box, { children: [_jsx(Text, { bold: true, color: isActive ? "green" : "white", children: "ORDERBOOK" }), ticker && (_jsxs(Text, { color: "gray", dimColor: true, children: [": ", ticker] }))] }), _jsx(Text, { color: "gray", dimColor: true, children: "[F2]" })] }), _jsx(Box, { paddingX: 1, children: _jsx(Text, { color: "gray", children: "─".repeat(40) }) }), _jsxs(Box, { flexDirection: "column", paddingX: 1, flexGrow: 1, children: [!ticker && (_jsx(Text, { color: "gray", children: "Select a market to view orderbook" })), ticker && isLoading && (_jsx(Text, { color: "gray", children: "Loading orderbook..." })), ticker && error && _jsx(Text, { color: "red", children: error }), ticker && orderbook && !isLoading && (_jsxs(_Fragment, { children: [asks.map(([price, qty], index) => (_jsxs(Box, { justifyContent: "space-between", children: [_jsx(Text, { color: "gray", children: "ASK" }), renderBar(qty, "ask"), _jsx(Text, { color: "red", children: formatPrice(100 - price) }), _jsxs(Text, { color: "gray", dimColor: true, children: ["(", qty, ")"] })] }, `ask-${index}`))), _jsx(Box, { justifyContent: "center", marginY: 1, children: _jsxs(Text, { color: "gray", children: ["─── SPREAD: ", spread !== null ? `${spread}¢` : "—", " ───"] }) }), bids.map(([price, qty], index) => (_jsxs(Box, { justifyContent: "space-between", children: [_jsx(Text, { color: "gray", children: "BID" }), renderBar(qty, "bid"), _jsx(Text, { color: "green", children: formatPrice(price) }), _jsxs(Text, { color: "gray", dimColor: true, children: ["(", qty, ")"] })] }, `bid-${index}`)))] }))] })] }));
42
+ }
43
+ //# sourceMappingURL=Orderbook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Orderbook.js","sourceRoot":"","sources":["../../src/components/Orderbook.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Positions panel showing current holdings
3
+ */
4
+ export declare function Positions(): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=Positions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Positions.d.ts","sourceRoot":"","sources":["../../src/components/Positions.tsx"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAgB,SAAS,4CA6ExB"}