@newyorkcompute/kalshi-tui 0.6.0 → 0.7.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.
package/dist/App.d.ts CHANGED
@@ -2,7 +2,5 @@
2
2
  * Kalshi TUI - Main Application
3
3
  * Clean, minimal, beautiful terminal trading
4
4
  */
5
- /** Available sort options for markets list */
6
- export type SortOption = 'volume' | 'volume_24h' | 'open_interest' | 'price';
7
5
  export declare function App(): import("react/jsx-runtime").JSX.Element;
8
6
  //# sourceMappingURL=App.d.ts.map
package/dist/App.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,8CAA8C;AAC9C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,eAAe,GAAG,OAAO,CAAC;AAY7E,wBAAgB,GAAG,4CA4JlB"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAsBH,wBAAgB,GAAG,4CA4LlB"}
package/dist/App.js CHANGED
@@ -4,8 +4,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
4
  * Clean, minimal, beautiful terminal trading
5
5
  */
6
6
  import { Box, useApp, useInput, useStdout } from 'ink';
7
- import { useState, useEffect, useMemo } from 'react';
8
- const SORT_OPTIONS = ['volume', 'volume_24h', 'open_interest', 'price'];
7
+ import { useState, useEffect, useMemo, useCallback } from 'react';
9
8
  import { Header } from './components/Header.js';
10
9
  import { Markets } from './components/Markets.js';
11
10
  import { Orderbook } from './components/Orderbook.js';
@@ -14,20 +13,32 @@ import { Arbitrage } from './components/Arbitrage.js';
14
13
  import { Footer } from './components/Footer.js';
15
14
  import { PriceChart } from './components/PriceChart.js';
16
15
  import { useKalshi } from './hooks/useKalshi.js';
16
+ import { loadConfig, saveConfig, toggleFavorite } from './config.js';
17
+ const SORT_OPTIONS = ['volume', 'volume_24h', 'open_interest', 'price'];
17
18
  export function App() {
18
19
  const { exit } = useApp();
19
20
  const { stdout } = useStdout();
20
21
  const [selectedIndex, setSelectedIndex] = useState(0);
21
- const [sortOption, setSortOption] = useState('volume');
22
+ // Load config from disk on startup
23
+ const [config, setConfig] = useState(() => loadConfig());
24
+ // Save config whenever it changes
25
+ const updateConfig = useCallback((updates) => {
26
+ setConfig(prev => {
27
+ const newConfig = { ...prev, ...updates };
28
+ saveConfig(newConfig);
29
+ return newConfig;
30
+ });
31
+ }, []);
22
32
  // Get terminal dimensions
23
33
  const width = stdout?.columns ?? 120;
24
34
  const height = stdout?.rows ?? 40;
25
35
  // Fetch data from Kalshi
26
36
  const { markets: rawMarkets, orderbook, balance, positions, isConnected, isRateLimited, isOffline, isRealtime, error, selectMarket, priceHistory, loading, lastUpdateTime, arbitrage, } = useKalshi();
27
- // Sort markets based on selected option
37
+ // Sort markets based on selected option, with favorites first
28
38
  const markets = useMemo(() => {
29
39
  const sorted = [...rawMarkets];
30
- switch (sortOption) {
40
+ // First sort by the selected option
41
+ switch (config.sortBy) {
31
42
  case 'volume':
32
43
  sorted.sort((a, b) => (b.volume || 0) - (a.volume || 0));
33
44
  break;
@@ -41,8 +52,16 @@ export function App() {
41
52
  sorted.sort((a, b) => (b.yes_bid || 0) - (a.yes_bid || 0));
42
53
  break;
43
54
  }
55
+ // Then put favorites at top if enabled
56
+ if (config.favoritesFirst && config.favorites.length > 0) {
57
+ sorted.sort((a, b) => {
58
+ const aFav = config.favorites.includes(a.ticker) ? 1 : 0;
59
+ const bFav = config.favorites.includes(b.ticker) ? 1 : 0;
60
+ return bFav - aFav; // Favorites first
61
+ });
62
+ }
44
63
  return sorted;
45
- }, [rawMarkets, sortOption]);
64
+ }, [rawMarkets, config.sortBy, config.favorites, config.favoritesFirst]);
46
65
  // Update orderbook when selection changes
47
66
  useEffect(() => {
48
67
  const ticker = markets[selectedIndex]?.ticker;
@@ -57,14 +76,21 @@ export function App() {
57
76
  }
58
77
  // Cycle sort option with 's' key
59
78
  if (input === 's') {
60
- setSortOption(current => {
61
- const currentIndex = SORT_OPTIONS.indexOf(current);
62
- const nextIndex = (currentIndex + 1) % SORT_OPTIONS.length;
63
- return SORT_OPTIONS[nextIndex];
64
- });
79
+ const currentIndex = SORT_OPTIONS.indexOf(config.sortBy);
80
+ const nextIndex = (currentIndex + 1) % SORT_OPTIONS.length;
81
+ updateConfig({ sortBy: SORT_OPTIONS[nextIndex] });
65
82
  // Reset selection to top when sort changes
66
83
  setSelectedIndex(0);
67
84
  }
85
+ // Toggle favorite with 'f' key
86
+ if (input === 'f') {
87
+ const selectedTicker = markets[selectedIndex]?.ticker;
88
+ if (selectedTicker) {
89
+ updateConfig({
90
+ favorites: toggleFavorite(config.favorites, selectedTicker)
91
+ });
92
+ }
93
+ }
68
94
  if (key.upArrow) {
69
95
  setSelectedIndex(i => Math.max(0, i - 1));
70
96
  }
@@ -85,6 +111,6 @@ export function App() {
85
111
  const chartHeight = contentHeight - orderbookHeight;
86
112
  // Get selected market for orderbook/chart
87
113
  const selectedMarket = markets[selectedIndex] ?? null;
88
- return (_jsxs(Box, { flexDirection: "column", width: width, height: height, children: [_jsx(Header, { balance: balance, isConnected: isConnected, isRateLimited: isRateLimited, isOffline: isOffline, isRealtime: isRealtime, error: error, lastUpdateTime: lastUpdateTime }), _jsxs(Box, { flexDirection: "row", height: contentHeight, children: [_jsxs(Box, { flexDirection: "column", width: leftWidth, children: [_jsx(Markets, { markets: markets, selectedIndex: selectedIndex, height: marketsHeight, isLoading: loading.markets, sortBy: sortOption }), _jsx(Arbitrage, { opportunities: arbitrage, height: arbitrageHeight, isLoading: loading.markets }), _jsx(Positions, { positions: positions, height: positionsHeight, isLoading: loading.portfolio })] }), _jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsx(Orderbook, { market: selectedMarket, orderbook: orderbook, height: orderbookHeight, isLoading: loading.orderbook }), _jsx(PriceChart, { ticker: selectedMarket?.ticker ?? null, priceHistory: priceHistory, height: chartHeight, width: rightWidth })] })] }), _jsx(Footer, {})] }));
114
+ return (_jsxs(Box, { flexDirection: "column", width: width, height: height, children: [_jsx(Header, { balance: balance, isConnected: isConnected, isRateLimited: isRateLimited, isOffline: isOffline, isRealtime: isRealtime, error: error, lastUpdateTime: lastUpdateTime }), _jsxs(Box, { flexDirection: "row", height: contentHeight, children: [_jsxs(Box, { flexDirection: "column", width: leftWidth, children: [_jsx(Markets, { markets: markets, selectedIndex: selectedIndex, height: marketsHeight, isLoading: loading.markets, sortBy: config.sortBy, favorites: config.favorites }), _jsx(Arbitrage, { opportunities: arbitrage, height: arbitrageHeight, isLoading: loading.markets }), _jsx(Positions, { positions: positions, height: positionsHeight, isLoading: loading.portfolio })] }), _jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsx(Orderbook, { market: selectedMarket, orderbook: orderbook, height: orderbookHeight, isLoading: loading.orderbook }), _jsx(PriceChart, { ticker: selectedMarket?.ticker ?? null, priceHistory: priceHistory, height: chartHeight, width: rightWidth })] })] }), _jsx(Footer, {})] }));
89
115
  }
90
116
  //# sourceMappingURL=App.js.map
package/dist/App.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"App.js","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"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"}
@@ -5,6 +5,6 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
5
  */
6
6
  import { Box, Text } from 'ink';
7
7
  export function Footer() {
8
- return (_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", borderStyle: "single", borderColor: "gray", paddingX: 1, height: 3, width: "100%", children: [_jsxs(Text, { children: ["Built by ", _jsx(Text, { bold: true, children: "New York Compute" }), " \u2022 ", _jsx(Text, { color: "green", children: "newyorkcompute.xyz" })] }), _jsx(Text, { color: "gray", children: "[\u2191\u2193] Navigate [s] Sort [q] Quit" })] }));
8
+ return (_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", borderStyle: "single", borderColor: "gray", paddingX: 1, height: 3, width: "100%", children: [_jsxs(Text, { children: ["Built by ", _jsx(Text, { bold: true, children: "New York Compute" }), " \u2022 ", _jsx(Text, { color: "green", children: "newyorkcompute.xyz" })] }), _jsx(Text, { color: "gray", children: "[\u2191\u2193] Navigate [s] Sort [f] Favorite [q] Quit" })] }));
9
9
  }
10
10
  //# sourceMappingURL=Footer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Footer.js","sourceRoot":"","sources":["../../src/components/Footer.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,MAAM,UAAU,MAAM;IACpB,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,KAAK,EACnB,cAAc,EAAC,eAAe,EAC9B,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,MAAM,EAAE,CAAC,EACT,KAAK,EAAC,MAAM,aAEZ,MAAC,IAAI,4BACM,KAAC,IAAI,IAAC,IAAI,uCAAwB,cAAG,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,mCAA0B,IACtF,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,0DAAuC,IACrD,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"Footer.js","sourceRoot":"","sources":["../../src/components/Footer.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,MAAM,UAAU,MAAM;IACpB,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,KAAK,EACnB,cAAc,EAAC,eAAe,EAC9B,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,MAAM,EAAE,CAAC,EACT,KAAK,EAAC,MAAM,aAEZ,MAAC,IAAI,4BACM,KAAC,IAAI,IAAC,IAAI,uCAAwB,cAAG,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,mCAA0B,IACtF,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,uEAAoD,IAClE,CACP,CAAC;AACJ,CAAC"}
@@ -2,6 +2,7 @@
2
2
  * Markets Component
3
3
  * Displays a scrollable list of markets with selection
4
4
  */
5
+ import type { SortOption } from '../config.js';
5
6
  interface Market {
6
7
  ticker: string;
7
8
  title: string;
@@ -13,14 +14,14 @@ interface Market {
13
14
  close_time?: string;
14
15
  previousYesBid?: number;
15
16
  }
16
- type SortOption = 'volume' | 'volume_24h' | 'open_interest' | 'price';
17
17
  interface MarketsProps {
18
18
  markets: Market[];
19
19
  selectedIndex: number;
20
20
  height: number;
21
21
  isLoading?: boolean;
22
22
  sortBy?: SortOption;
23
+ favorites?: string[];
23
24
  }
24
- export declare function Markets({ markets, selectedIndex, height, isLoading, sortBy }: MarketsProps): import("react/jsx-runtime").JSX.Element;
25
+ export declare function Markets({ markets, selectedIndex, height, isLoading, sortBy, favorites }: MarketsProps): import("react/jsx-runtime").JSX.Element;
25
26
  export {};
26
27
  //# sourceMappingURL=Markets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Markets.d.ts","sourceRoot":"","sources":["../../src/components/Markets.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,UAAU,MAAM;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,KAAK,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,eAAe,GAAG,OAAO,CAAC;AAEtE,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,wBAAgB,OAAO,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAiB,EAAE,EAAE,YAAY,2CAiGrG"}
1
+ {"version":3,"file":"Markets.d.ts","sourceRoot":"","sources":["../../src/components/Markets.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,UAAU,MAAM;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wBAAgB,OAAO,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAiB,EAAE,SAAc,EAAE,EAAE,YAAY,2CAqGrH"}
@@ -6,7 +6,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
6
  import { Box, Text } from 'ink';
7
7
  import { formatExpiry, getPriceChange, formatPrice, formatVolume } from '../utils.js';
8
8
  import { Spinner } from './Spinner.js';
9
- export function Markets({ markets, selectedIndex, height, isLoading, sortBy = 'volume' }) {
9
+ export function Markets({ markets, selectedIndex, height, isLoading, sortBy = 'volume', favorites = [] }) {
10
10
  // Calculate visible window (scroll with selection)
11
11
  const visibleRows = height - 4; // Border + title + padding
12
12
  const halfWindow = Math.floor(visibleRows / 2);
@@ -17,9 +17,10 @@ export function Markets({ markets, selectedIndex, height, isLoading, sortBy = 'v
17
17
  return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "green", height: height, width: "100%", children: [_jsxs(Box, { paddingX: 1, justifyContent: "space-between", children: [_jsx(Text, { color: "green", bold: true, children: " MARKETS " }), _jsxs(Box, { children: [_jsx(Text, { color: sortBy === 'volume' ? 'cyan' : 'gray', bold: sortBy === 'volume', dimColor: sortBy !== 'volume', children: ' Vol' }), _jsx(Text, { color: sortBy === 'volume_24h' ? 'yellow' : 'gray', bold: sortBy === 'volume_24h', dimColor: sortBy !== 'volume_24h', children: ' 24h' }), _jsx(Text, { color: sortBy === 'open_interest' ? 'magenta' : 'gray', bold: sortBy === 'open_interest', dimColor: sortBy !== 'open_interest', children: ' OI' }), _jsx(Text, { color: "gray", dimColor: true, children: ' Exp' }), _jsx(Text, { color: sortBy === 'price' ? 'green' : 'gray', bold: sortBy === 'price', dimColor: sortBy !== 'price', children: ' Price' })] })] }), _jsx(Box, { flexDirection: "column", paddingX: 1, flexGrow: 1, children: markets.length === 0 && isLoading ? (_jsx(Spinner, { label: "Loading markets..." })) : markets.length === 0 ? (_jsx(Text, { color: "gray", children: "No markets found" })) : (visibleMarkets.map((market, i) => {
18
18
  const actualIndex = startIndex + i;
19
19
  const isSelected = actualIndex === selectedIndex;
20
+ const isFavorite = favorites.includes(market.ticker);
20
21
  const priceChange = getPriceChange(market.yes_bid, market.previousYesBid);
21
22
  const expiry = formatExpiry(market.close_time);
22
- return (_jsxs(Box, { justifyContent: "space-between", children: [_jsxs(Box, { children: [_jsx(Text, { color: isSelected ? 'green' : 'gray', children: isSelected ? '▶ ' : ' ' }), _jsx(Text, { color: isSelected ? 'green' : 'white', bold: isSelected, children: market.ticker.slice(0, 22) })] }), _jsxs(Box, { children: [_jsx(Text, { color: "cyan", dimColor: true, children: formatVolume(market.volume).padStart(6) }), _jsxs(Text, { color: "gray", dimColor: true, children: [' ', formatVolume(market.volume_24h).padStart(5)] }), _jsxs(Text, { color: "magenta", dimColor: true, children: [' ', formatVolume(market.open_interest).padStart(5)] }), _jsxs(Text, { color: "gray", dimColor: true, children: [' ', (expiry || '').padStart(6)] }), _jsxs(Text, { color: isSelected ? 'green' : 'white', children: [' ', formatPrice(market.yes_bid).padStart(4)] }), _jsxs(Text, { color: priceChange.color, children: [" ", priceChange.text] })] })] }, market.ticker));
23
+ return (_jsxs(Box, { justifyContent: "space-between", children: [_jsxs(Box, { children: [_jsx(Text, { color: isSelected ? 'green' : 'gray', children: isSelected ? '▶' : ' ' }), _jsx(Text, { color: "yellow", children: isFavorite ? '' : ' ' }), _jsx(Text, { color: isSelected ? 'green' : 'white', bold: isSelected, children: market.ticker.slice(0, 21) })] }), _jsxs(Box, { children: [_jsx(Text, { color: "cyan", dimColor: true, children: formatVolume(market.volume).padStart(6) }), _jsxs(Text, { color: "gray", dimColor: true, children: [' ', formatVolume(market.volume_24h).padStart(5)] }), _jsxs(Text, { color: "magenta", dimColor: true, children: [' ', formatVolume(market.open_interest).padStart(5)] }), _jsxs(Text, { color: "gray", dimColor: true, children: [' ', (expiry || '').padStart(6)] }), _jsxs(Text, { color: isSelected ? 'green' : 'white', children: [' ', formatPrice(market.yes_bid).padStart(4)] }), _jsxs(Text, { color: priceChange.color, children: [" ", priceChange.text] })] })] }, market.ticker));
23
24
  })) }), markets.length > 0 && (_jsx(Box, { justifyContent: "center", paddingX: 1, children: _jsxs(Text, { color: "gray", children: [selectedIndex + 1, " of ", markets.length] }) }))] }));
24
25
  }
25
26
  //# sourceMappingURL=Markets.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Markets.js","sourceRoot":"","sources":["../../src/components/Markets.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Markets.js","sourceRoot":"","sources":["../../src/components/Markets.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * TUI Configuration
3
+ *
4
+ * Handles reading/writing user preferences to ~/.kalshi-tui/config.json
5
+ */
6
+ /** Sort options for markets list */
7
+ export type SortOption = 'volume' | 'volume_24h' | 'open_interest' | 'price';
8
+ /** User configuration schema */
9
+ export interface TuiConfig {
10
+ /** Current sort preference */
11
+ sortBy: SortOption;
12
+ /** List of favorited market tickers */
13
+ favorites: string[];
14
+ /** Refresh interval in milliseconds */
15
+ refreshInterval: number;
16
+ /** Show favorites at top of list */
17
+ favoritesFirst: boolean;
18
+ }
19
+ /**
20
+ * Load configuration from disk
21
+ * Returns default config if file doesn't exist
22
+ */
23
+ export declare function loadConfig(): TuiConfig;
24
+ /**
25
+ * Save configuration to disk
26
+ * Creates config directory if it doesn't exist
27
+ */
28
+ export declare function saveConfig(config: TuiConfig): void;
29
+ /**
30
+ * Toggle a market in favorites
31
+ * Returns the updated favorites list
32
+ */
33
+ export declare function toggleFavorite(favorites: string[], ticker: string): string[];
34
+ /**
35
+ * Check if a market is favorited
36
+ */
37
+ export declare function isFavorite(favorites: string[], ticker: string): boolean;
38
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,oCAAoC;AACpC,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,eAAe,GAAG,OAAO,CAAC;AAE7E,gCAAgC;AAChC,MAAM,WAAW,SAAS;IACxB,8BAA8B;IAC9B,MAAM,EAAE,UAAU,CAAC;IACnB,uCAAuC;IACvC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,uCAAuC;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,oCAAoC;IACpC,cAAc,EAAE,OAAO,CAAC;CACzB;AAgBD;;;GAGG;AACH,wBAAgB,UAAU,IAAI,SAAS,CAkBtC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAWlD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAK5E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAEvE"}
package/dist/config.js ADDED
@@ -0,0 +1,74 @@
1
+ /**
2
+ * TUI Configuration
3
+ *
4
+ * Handles reading/writing user preferences to ~/.kalshi-tui/config.json
5
+ */
6
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';
7
+ import { homedir } from 'os';
8
+ import { join } from 'path';
9
+ /** Default configuration */
10
+ const DEFAULT_CONFIG = {
11
+ sortBy: 'volume',
12
+ favorites: [],
13
+ refreshInterval: 10000,
14
+ favoritesFirst: true,
15
+ };
16
+ /** Config directory path */
17
+ const CONFIG_DIR = join(homedir(), '.kalshi-tui');
18
+ /** Config file path */
19
+ const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
20
+ /**
21
+ * Load configuration from disk
22
+ * Returns default config if file doesn't exist
23
+ */
24
+ export function loadConfig() {
25
+ try {
26
+ if (!existsSync(CONFIG_FILE)) {
27
+ return { ...DEFAULT_CONFIG };
28
+ }
29
+ const data = readFileSync(CONFIG_FILE, 'utf-8');
30
+ const parsed = JSON.parse(data);
31
+ // Merge with defaults to handle missing fields
32
+ return {
33
+ ...DEFAULT_CONFIG,
34
+ ...parsed,
35
+ };
36
+ }
37
+ catch {
38
+ // Return defaults on any error
39
+ return { ...DEFAULT_CONFIG };
40
+ }
41
+ }
42
+ /**
43
+ * Save configuration to disk
44
+ * Creates config directory if it doesn't exist
45
+ */
46
+ export function saveConfig(config) {
47
+ try {
48
+ // Ensure directory exists
49
+ if (!existsSync(CONFIG_DIR)) {
50
+ mkdirSync(CONFIG_DIR, { recursive: true });
51
+ }
52
+ writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf-8');
53
+ }
54
+ catch {
55
+ // Silently fail - config is not critical
56
+ }
57
+ }
58
+ /**
59
+ * Toggle a market in favorites
60
+ * Returns the updated favorites list
61
+ */
62
+ export function toggleFavorite(favorites, ticker) {
63
+ if (favorites.includes(ticker)) {
64
+ return favorites.filter(t => t !== ticker);
65
+ }
66
+ return [...favorites, ticker];
67
+ }
68
+ /**
69
+ * Check if a market is favorited
70
+ */
71
+ export function isFavorite(favorites, ticker) {
72
+ return favorites.includes(ticker);
73
+ }
74
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAiB5B,4BAA4B;AAC5B,MAAM,cAAc,GAAc;IAChC,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,EAAE;IACb,eAAe,EAAE,KAAK;IACtB,cAAc,EAAE,IAAI;CACrB,CAAC;AAEF,4BAA4B;AAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAElD,uBAAuB;AACvB,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;QAC/B,CAAC;QAED,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEhC,+CAA+C;QAC/C,OAAO;YACL,GAAG,cAAc;YACjB,GAAG,MAAM;SACV,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;QAC/B,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAiB;IAC1C,IAAI,CAAC;QACH,0BAA0B;QAC1B,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAAmB,EAAE,MAAc;IAChE,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,CAAC,GAAG,SAAS,EAAE,MAAM,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,SAAmB,EAAE,MAAc;IAC5D,OAAO,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,126 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { loadConfig, saveConfig, toggleFavorite, isFavorite } from './config.js';
3
+ import * as fs from 'fs';
4
+ vi.mock('fs');
5
+ vi.mock('os', () => ({
6
+ homedir: () => '/home/testuser',
7
+ }));
8
+ describe('config', () => {
9
+ beforeEach(() => {
10
+ vi.clearAllMocks();
11
+ });
12
+ afterEach(() => {
13
+ vi.restoreAllMocks();
14
+ });
15
+ describe('loadConfig', () => {
16
+ it('should return default config when file does not exist', () => {
17
+ vi.mocked(fs.existsSync).mockReturnValue(false);
18
+ const config = loadConfig();
19
+ expect(config.sortBy).toBe('volume');
20
+ expect(config.favorites).toEqual([]);
21
+ expect(config.refreshInterval).toBe(10000);
22
+ expect(config.favoritesFirst).toBe(true);
23
+ });
24
+ it('should load config from file when it exists', () => {
25
+ const savedConfig = {
26
+ sortBy: 'price',
27
+ favorites: ['KXBTC-123'],
28
+ refreshInterval: 5000,
29
+ favoritesFirst: false,
30
+ };
31
+ vi.mocked(fs.existsSync).mockReturnValue(true);
32
+ vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(savedConfig));
33
+ const config = loadConfig();
34
+ expect(config.sortBy).toBe('price');
35
+ expect(config.favorites).toEqual(['KXBTC-123']);
36
+ expect(config.refreshInterval).toBe(5000);
37
+ expect(config.favoritesFirst).toBe(false);
38
+ });
39
+ it('should merge with defaults for missing fields', () => {
40
+ const partialConfig = {
41
+ sortBy: 'volume_24h',
42
+ };
43
+ vi.mocked(fs.existsSync).mockReturnValue(true);
44
+ vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(partialConfig));
45
+ const config = loadConfig();
46
+ expect(config.sortBy).toBe('volume_24h');
47
+ expect(config.favorites).toEqual([]); // Default
48
+ expect(config.refreshInterval).toBe(10000); // Default
49
+ });
50
+ it('should return defaults on parse error', () => {
51
+ vi.mocked(fs.existsSync).mockReturnValue(true);
52
+ vi.mocked(fs.readFileSync).mockReturnValue('invalid json');
53
+ const config = loadConfig();
54
+ expect(config.sortBy).toBe('volume');
55
+ });
56
+ });
57
+ describe('saveConfig', () => {
58
+ it('should create directory if it does not exist', () => {
59
+ vi.mocked(fs.existsSync).mockReturnValue(false);
60
+ vi.mocked(fs.mkdirSync).mockReturnValue(undefined);
61
+ vi.mocked(fs.writeFileSync).mockReturnValue(undefined);
62
+ const config = {
63
+ sortBy: 'price',
64
+ favorites: ['KXBTC'],
65
+ refreshInterval: 10000,
66
+ favoritesFirst: true,
67
+ };
68
+ saveConfig(config);
69
+ expect(fs.mkdirSync).toHaveBeenCalledWith('/home/testuser/.kalshi-tui', { recursive: true });
70
+ });
71
+ it('should write config to file', () => {
72
+ vi.mocked(fs.existsSync).mockReturnValue(true);
73
+ vi.mocked(fs.writeFileSync).mockReturnValue(undefined);
74
+ const config = {
75
+ sortBy: 'open_interest',
76
+ favorites: ['KXBTC', 'KXINX'],
77
+ refreshInterval: 5000,
78
+ favoritesFirst: false,
79
+ };
80
+ saveConfig(config);
81
+ expect(fs.writeFileSync).toHaveBeenCalledWith('/home/testuser/.kalshi-tui/config.json', expect.stringContaining('"sortBy": "open_interest"'), 'utf-8');
82
+ });
83
+ it('should silently fail on write error', () => {
84
+ vi.mocked(fs.existsSync).mockReturnValue(true);
85
+ vi.mocked(fs.writeFileSync).mockImplementation(() => {
86
+ throw new Error('Permission denied');
87
+ });
88
+ // Should not throw
89
+ expect(() => saveConfig({
90
+ sortBy: 'volume',
91
+ favorites: [],
92
+ refreshInterval: 10000,
93
+ favoritesFirst: true,
94
+ })).not.toThrow();
95
+ });
96
+ });
97
+ describe('toggleFavorite', () => {
98
+ it('should add ticker to favorites if not present', () => {
99
+ const favorites = ['KXBTC'];
100
+ const result = toggleFavorite(favorites, 'KXINX');
101
+ expect(result).toEqual(['KXBTC', 'KXINX']);
102
+ });
103
+ it('should remove ticker from favorites if present', () => {
104
+ const favorites = ['KXBTC', 'KXINX'];
105
+ const result = toggleFavorite(favorites, 'KXBTC');
106
+ expect(result).toEqual(['KXINX']);
107
+ });
108
+ it('should not mutate original array', () => {
109
+ const favorites = ['KXBTC'];
110
+ toggleFavorite(favorites, 'KXINX');
111
+ expect(favorites).toEqual(['KXBTC']);
112
+ });
113
+ });
114
+ describe('isFavorite', () => {
115
+ it('should return true if ticker is in favorites', () => {
116
+ expect(isFavorite(['KXBTC', 'KXINX'], 'KXBTC')).toBe(true);
117
+ });
118
+ it('should return false if ticker is not in favorites', () => {
119
+ expect(isFavorite(['KXBTC'], 'KXINX')).toBe(false);
120
+ });
121
+ it('should return false for empty favorites', () => {
122
+ expect(isFavorite([], 'KXBTC')).toBe(false);
123
+ });
124
+ });
125
+ });
126
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@newyorkcompute/kalshi-tui",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Beautiful terminal UI for Kalshi prediction markets — real-time data, trading, and portfolio management",
5
5
  "author": "NewYorkCompute",
6
6
  "license": "MIT",