@newyorkcompute/kalshi-tui 0.1.0 → 0.3.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 (113) hide show
  1. package/README.md +35 -0
  2. package/dist/App.d.ts +2 -1
  3. package/dist/App.d.ts.map +1 -1
  4. package/dist/App.js +43 -36
  5. package/dist/App.js.map +1 -1
  6. package/dist/cache.d.ts +34 -0
  7. package/dist/cache.d.ts.map +1 -0
  8. package/dist/cache.js +60 -0
  9. package/dist/cache.js.map +1 -0
  10. package/dist/cache.test.d.ts +2 -0
  11. package/dist/cache.test.d.ts.map +1 -0
  12. package/dist/cache.test.js +73 -0
  13. package/dist/cache.test.js.map +1 -0
  14. package/dist/cli.d.ts +2 -2
  15. package/dist/cli.js +31 -35
  16. package/dist/cli.js.map +1 -1
  17. package/dist/components/ErrorBoundary.d.ts +20 -0
  18. package/dist/components/ErrorBoundary.d.ts.map +1 -0
  19. package/dist/components/ErrorBoundary.js +28 -0
  20. package/dist/components/ErrorBoundary.js.map +1 -0
  21. package/dist/components/Footer.d.ts +6 -0
  22. package/dist/components/Footer.d.ts.map +1 -0
  23. package/dist/components/Footer.js +10 -0
  24. package/dist/components/Footer.js.map +1 -0
  25. package/dist/components/Header.d.ts +10 -2
  26. package/dist/components/Header.d.ts.map +1 -1
  27. package/dist/components/Header.js +18 -9
  28. package/dist/components/Header.js.map +1 -1
  29. package/dist/components/Markets.d.ts +21 -0
  30. package/dist/components/Markets.d.ts.map +1 -0
  31. package/dist/components/Markets.js +25 -0
  32. package/dist/components/Markets.js.map +1 -0
  33. package/dist/components/Orderbook.d.ts +18 -5
  34. package/dist/components/Orderbook.d.ts.map +1 -1
  35. package/dist/components/Orderbook.js +25 -36
  36. package/dist/components/Orderbook.js.map +1 -1
  37. package/dist/components/Positions.d.ts +13 -2
  38. package/dist/components/Positions.d.ts.map +1 -1
  39. package/dist/components/Positions.js +10 -17
  40. package/dist/components/Positions.js.map +1 -1
  41. package/dist/components/PriceChart.d.ts +18 -0
  42. package/dist/components/PriceChart.d.ts.map +1 -0
  43. package/dist/components/PriceChart.js +103 -0
  44. package/dist/components/PriceChart.js.map +1 -0
  45. package/dist/components/index.d.ts +10 -10
  46. package/dist/components/index.d.ts.map +1 -1
  47. package/dist/components/index.js +10 -11
  48. package/dist/components/index.js.map +1 -1
  49. package/dist/hooks/index.d.ts +4 -4
  50. package/dist/hooks/index.d.ts.map +1 -1
  51. package/dist/hooks/index.js +4 -4
  52. package/dist/hooks/index.js.map +1 -1
  53. package/dist/hooks/useKalshi.d.ts +30 -12
  54. package/dist/hooks/useKalshi.d.ts.map +1 -1
  55. package/dist/hooks/useKalshi.js +249 -19
  56. package/dist/hooks/useKalshi.js.map +1 -1
  57. package/dist/utils.d.ts +33 -0
  58. package/dist/utils.d.ts.map +1 -0
  59. package/dist/utils.js +88 -0
  60. package/dist/utils.js.map +1 -0
  61. package/dist/utils.test.d.ts +2 -0
  62. package/dist/utils.test.d.ts.map +1 -0
  63. package/dist/utils.test.js +115 -0
  64. package/dist/utils.test.js.map +1 -0
  65. package/package.json +8 -8
  66. package/dist/components/HelpModal.d.ts +0 -5
  67. package/dist/components/HelpModal.d.ts.map +0 -1
  68. package/dist/components/HelpModal.js +0 -19
  69. package/dist/components/HelpModal.js.map +0 -1
  70. package/dist/components/MarketList.d.ts +0 -5
  71. package/dist/components/MarketList.d.ts.map +0 -1
  72. package/dist/components/MarketList.js +0 -68
  73. package/dist/components/MarketList.js.map +0 -1
  74. package/dist/components/OrderEntry.d.ts +0 -9
  75. package/dist/components/OrderEntry.d.ts.map +0 -1
  76. package/dist/components/OrderEntry.js +0 -77
  77. package/dist/components/OrderEntry.js.map +0 -1
  78. package/dist/components/SearchBar.d.ts +0 -5
  79. package/dist/components/SearchBar.d.ts.map +0 -1
  80. package/dist/components/SearchBar.js +0 -27
  81. package/dist/components/SearchBar.js.map +0 -1
  82. package/dist/components/StatusBar.d.ts +0 -5
  83. package/dist/components/StatusBar.d.ts.map +0 -1
  84. package/dist/components/StatusBar.js +0 -9
  85. package/dist/components/StatusBar.js.map +0 -1
  86. package/dist/components/ui/Box.d.ts +0 -14
  87. package/dist/components/ui/Box.d.ts.map +0 -1
  88. package/dist/components/ui/Box.js +0 -9
  89. package/dist/components/ui/Box.js.map +0 -1
  90. package/dist/components/ui/Sparkline.d.ts +0 -11
  91. package/dist/components/ui/Sparkline.d.ts.map +0 -1
  92. package/dist/components/ui/Sparkline.js +0 -32
  93. package/dist/components/ui/Sparkline.js.map +0 -1
  94. package/dist/hooks/useMarkets.d.ts +0 -13
  95. package/dist/hooks/useMarkets.d.ts.map +0 -1
  96. package/dist/hooks/useMarkets.js +0 -89
  97. package/dist/hooks/useMarkets.js.map +0 -1
  98. package/dist/hooks/useOrderbook.d.ts +0 -13
  99. package/dist/hooks/useOrderbook.d.ts.map +0 -1
  100. package/dist/hooks/useOrderbook.js +0 -81
  101. package/dist/hooks/useOrderbook.js.map +0 -1
  102. package/dist/hooks/usePortfolio.d.ts +0 -18
  103. package/dist/hooks/usePortfolio.d.ts.map +0 -1
  104. package/dist/hooks/usePortfolio.js +0 -84
  105. package/dist/hooks/usePortfolio.js.map +0 -1
  106. package/dist/stores/app-store.d.ts +0 -17
  107. package/dist/stores/app-store.d.ts.map +0 -1
  108. package/dist/stores/app-store.js +0 -21
  109. package/dist/stores/app-store.js.map +0 -1
  110. package/dist/theme.d.ts +0 -31
  111. package/dist/theme.d.ts.map +0 -1
  112. package/dist/theme.js +0 -37
  113. package/dist/theme.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@newyorkcompute/kalshi-tui",
3
- "version": "0.1.0",
3
+ "version": "0.3.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",
@@ -45,20 +45,20 @@
45
45
  "dependencies": {
46
46
  "@inkjs/ui": "^2.0.0",
47
47
  "@newyorkcompute/kalshi-core": "*",
48
+ "asciichart": "^1.5.25",
48
49
  "ink": "^5.1.0",
49
50
  "kalshi-typescript": "^3.3.0",
50
- "react": "^18.3.1",
51
- "zustand": "^5.0.2"
51
+ "react": "^18.3.1"
52
52
  },
53
53
  "devDependencies": {
54
+ "@eslint/js": "^9.28.0",
55
+ "@types/asciichart": "^1.5.8",
54
56
  "@types/node": "^22.15.29",
55
- "@types/react": "^18.3.18",
57
+ "@types/react": "^18.3.12",
56
58
  "eslint": "^9.28.0",
57
- "@eslint/js": "^9.28.0",
58
- "eslint-plugin-react": "^7.37.5",
59
- "eslint-plugin-react-hooks": "^5.2.0",
59
+ "eslint-plugin-react": "^7.37.2",
60
+ "eslint-plugin-react-hooks": "^5.1.0",
60
61
  "typescript-eslint": "^8.33.1",
61
62
  "vitest": "^3.2.3"
62
63
  }
63
64
  }
64
-
@@ -1,5 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"HelpModal.d.ts","sourceRoot":"","sources":["../../src/components/HelpModal.tsx"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAgB,SAAS,mDAuGxB"}
@@ -1,19 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"HelpModal.js","sourceRoot":"","sources":["../../src/components/HelpModal.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarketList.d.ts","sourceRoot":"","sources":["../../src/components/MarketList.tsx"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAgB,UAAU,4CAgJzB"}
@@ -1,68 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarketList.js","sourceRoot":"","sources":["../../src/components/MarketList.tsx"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,77 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"OrderEntry.js","sourceRoot":"","sources":["../../src/components/OrderEntry.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Search bar for filtering markets
3
- */
4
- export declare function SearchBar(): import("react/jsx-runtime").JSX.Element | null;
5
- //# sourceMappingURL=SearchBar.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchBar.d.ts","sourceRoot":"","sources":["../../src/components/SearchBar.tsx"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAgB,SAAS,mDAyCxB"}
@@ -1,27 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Box, Text, useInput } from "ink";
3
- import { TextInput } from "@inkjs/ui";
4
- import { useAppStore } from "../stores/app-store.js";
5
- /**
6
- * Search bar for filtering markets
7
- */
8
- export function SearchBar() {
9
- const isSearching = useAppStore((state) => state.isSearching);
10
- const setIsSearching = useAppStore((state) => state.setIsSearching);
11
- const searchQuery = useAppStore((state) => state.searchQuery);
12
- const setSearchQuery = useAppStore((state) => state.setSearchQuery);
13
- // Toggle search with /
14
- useInput((input, key) => {
15
- if (!isSearching && input === "/") {
16
- setIsSearching(true);
17
- }
18
- if (isSearching && key.escape) {
19
- setIsSearching(false);
20
- setSearchQuery("");
21
- }
22
- });
23
- if (!isSearching && !searchQuery)
24
- return null;
25
- return (_jsxs(Box, { borderStyle: "single", borderColor: "green", paddingX: 1, children: [_jsx(Text, { color: "green", children: "/" }), _jsx(Text, { children: " " }), isSearching ? (_jsx(TextInput, { defaultValue: searchQuery, onChange: setSearchQuery, onSubmit: () => setIsSearching(false), placeholder: "Search markets..." })) : (_jsx(Text, { color: "white", children: searchQuery })), searchQuery && (_jsxs(Text, { color: "gray", dimColor: true, children: [" ", "(Esc to clear)"] }))] }));
26
- }
27
- //# sourceMappingURL=SearchBar.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchBar.js","sourceRoot":"","sources":["../../src/components/SearchBar.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACpE,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAEpE,uBAAuB;IACvB,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,CAAC,WAAW,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClC,cAAc,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAC9B,cAAc,CAAC,KAAK,CAAC,CAAC;YACtB,cAAc,CAAC,EAAE,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAE9C,OAAO,CACL,MAAC,GAAG,IAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,QAAQ,EAAE,CAAC,aACvD,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,kBAAS,EAC5B,KAAC,IAAI,oBAAS,EACb,WAAW,CAAC,CAAC,CAAC,CACb,KAAC,SAAS,IACR,YAAY,EAAE,WAAW,EACzB,QAAQ,EAAE,cAAc,EACxB,QAAQ,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,EACrC,WAAW,EAAC,mBAAmB,GAC/B,CACH,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YAAE,WAAW,GAAQ,CACzC,EACA,WAAW,IAAI,CACd,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,mBACxB,GAAG,sBAEC,CACR,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Status bar with keybindings and NYC branding
3
- */
4
- export declare function StatusBar(): import("react/jsx-runtime").JSX.Element;
5
- //# sourceMappingURL=StatusBar.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../src/components/StatusBar.tsx"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,SAAS,4CAwBxB"}
@@ -1,9 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Box, Text } from "ink";
3
- /**
4
- * Status bar with keybindings and NYC branding
5
- */
6
- export function StatusBar() {
7
- return (_jsxs(Box, { borderStyle: "single", borderColor: "gray", paddingX: 1, justifyContent: "space-between", children: [_jsxs(Box, { children: [_jsx(Text, { color: "gray", children: "Built by " }), _jsx(Text, { color: "white", children: "New York Compute" }), _jsx(Text, { color: "gray", children: " \u2022 " }), _jsx(Text, { color: "green", children: "newyorkcompute.xyz" })] }), _jsxs(Box, { children: [_jsx(Text, { color: "gray", children: "[?] Help" }), _jsx(Text, { color: "gray", children: " " }), _jsx(Text, { color: "gray", children: "[q] Quit" })] })] }));
8
- }
9
- //# sourceMappingURL=StatusBar.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../src/components/StatusBar.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,CACL,MAAC,GAAG,IACF,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,cAAc,EAAC,eAAe,aAG9B,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,0BAAiB,EACnC,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,iCAAwB,EAC3C,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,yBAAW,EAC7B,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,mCAA0B,IACzC,EAGN,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,yBAAgB,EAClC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kBAAS,EAC3B,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,yBAAgB,IAC9B,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -1,14 +0,0 @@
1
- import React from "react";
2
- import type { BoxProps as InkBoxProps } from "ink";
3
- interface PanelProps extends InkBoxProps {
4
- title?: string;
5
- titleRight?: string;
6
- isActive?: boolean;
7
- children: React.ReactNode;
8
- }
9
- /**
10
- * Styled panel component following NYC design guidelines
11
- */
12
- export declare function Panel({ title, titleRight, isActive, children, ...props }: PanelProps): import("react/jsx-runtime").JSX.Element;
13
- export {};
14
- //# sourceMappingURL=Box.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Box.d.ts","sourceRoot":"","sources":["../../../src/components/ui/Box.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,QAAQ,IAAI,WAAW,EAAE,MAAM,KAAK,CAAC;AAEnD,UAAU,UAAW,SAAQ,WAAW;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,UAAU,EACV,QAAgB,EAChB,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,UAAU,2CAqCZ"}
@@ -1,9 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Box as InkBox, Text } from "ink";
3
- /**
4
- * Styled panel component following NYC design guidelines
5
- */
6
- export function Panel({ title, titleRight, isActive = false, children, ...props }) {
7
- return (_jsxs(InkBox, { flexDirection: "column", borderStyle: "single", borderColor: isActive ? "green" : "gray", ...props, children: [(title || titleRight) && (_jsxs(InkBox, { paddingX: 1, justifyContent: "space-between", children: [title && (_jsx(Text, { bold: true, color: isActive ? "green" : "white", children: title })), titleRight && (_jsx(Text, { color: "gray", dimColor: true, children: titleRight }))] })), title && (_jsx(InkBox, { paddingX: 1, children: _jsx(Text, { color: "gray", children: "─".repeat(40) }) })), _jsx(InkBox, { flexDirection: "column", paddingX: 1, flexGrow: 1, children: children })] }));
8
- }
9
- //# sourceMappingURL=Box.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Box.js","sourceRoot":"","sources":["../../../src/components/ui/Box.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,IAAI,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAU1C;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,EACpB,KAAK,EACL,UAAU,EACV,QAAQ,GAAG,KAAK,EAChB,QAAQ,EACR,GAAG,KAAK,EACG;IACX,OAAO,CACL,MAAC,MAAM,IACL,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,KACpC,KAAK,aAGR,CAAC,KAAK,IAAI,UAAU,CAAC,IAAI,CACxB,MAAC,MAAM,IAAC,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAC,eAAe,aAChD,KAAK,IAAI,CACR,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,YAC3C,KAAK,GACD,CACR,EACA,UAAU,IAAI,CACb,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,kBACxB,UAAU,GACN,CACR,IACM,CACV,EAGA,KAAK,IAAI,CACR,KAAC,MAAM,IAAC,QAAQ,EAAE,CAAC,YACjB,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,GACnC,CACV,EAGD,KAAC,MAAM,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,YACpD,QAAQ,GACF,IACF,CACV,CAAC;AACJ,CAAC"}
@@ -1,11 +0,0 @@
1
- interface SparklineProps {
2
- data: number[];
3
- width?: number;
4
- color?: string;
5
- }
6
- /**
7
- * Sparkline component for visualizing price history
8
- */
9
- export declare function Sparkline({ data, width, color }: SparklineProps): import("react/jsx-runtime").JSX.Element;
10
- export {};
11
- //# sourceMappingURL=Sparkline.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Sparkline.d.ts","sourceRoot":"","sources":["../../../src/components/ui/Sparkline.tsx"],"names":[],"mappings":"AAGA,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD;;GAEG;AACH,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,KAAU,EAAE,KAAe,EAAE,EAAE,cAAc,2CA2B9E"}
@@ -1,32 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { Text } from "ink";
3
- // Sparkline characters (in order of fill level)
4
- const SPARK_CHARS = ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"];
5
- /**
6
- * Sparkline component for visualizing price history
7
- */
8
- export function Sparkline({ data, width = 10, color = "green" }) {
9
- if (data.length === 0) {
10
- return _jsx(Text, { color: "gray", children: "─".repeat(width) });
11
- }
12
- // Normalize data to fit in sparkline range
13
- const min = Math.min(...data);
14
- const max = Math.max(...data);
15
- const range = max - min || 1;
16
- // Sample data to fit width
17
- const sampledData = [];
18
- for (let i = 0; i < width; i++) {
19
- const index = Math.floor((i / width) * data.length);
20
- sampledData.push(data[index]);
21
- }
22
- // Convert to sparkline characters
23
- const sparkline = sampledData
24
- .map((value) => {
25
- const normalized = (value - min) / range;
26
- const charIndex = Math.floor(normalized * (SPARK_CHARS.length - 1));
27
- return SPARK_CHARS[charIndex];
28
- })
29
- .join("");
30
- return _jsx(Text, { color: color, children: sparkline });
31
- }
32
- //# sourceMappingURL=Sparkline.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Sparkline.js","sourceRoot":"","sources":["../../../src/components/ui/Sparkline.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAQ3B,gDAAgD;AAChD,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAE7D;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,GAAG,OAAO,EAAkB;IAC7E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAQ,CAAC;IACvD,CAAC;IAED,2CAA2C;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;IAE7B,2BAA2B;IAC3B,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,kCAAkC;IAClC,MAAM,SAAS,GAAG,WAAW;SAC1B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,UAAU,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YAAG,SAAS,GAAQ,CAAC;AAChD,CAAC"}
@@ -1,13 +0,0 @@
1
- import type { MarketDisplay } from "@newyorkcompute/kalshi-core";
2
- interface UseMarketsResult {
3
- markets: MarketDisplay[];
4
- isLoading: boolean;
5
- error: string | null;
6
- refresh: () => Promise<void>;
7
- }
8
- /**
9
- * Hook to fetch and poll market data
10
- */
11
- export declare function useMarkets(pollInterval?: number): UseMarketsResult;
12
- export {};
13
- //# sourceMappingURL=useMarkets.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useMarkets.d.ts","sourceRoot":"","sources":["../../src/hooks/useMarkets.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAejE,UAAU,gBAAgB;IACxB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,YAAY,SAAQ,GAAG,gBAAgB,CAuEjE"}
@@ -1,89 +0,0 @@
1
- import { useState, useEffect, useCallback, useRef } from "react";
2
- import { GetMarketsStatusEnum } from "@newyorkcompute/kalshi-core";
3
- import { useKalshi } from "./useKalshi.js";
4
- // Helper to check if markets data has changed (compares by ticker list and prices)
5
- function marketsChanged(prev, next) {
6
- if (prev.length !== next.length)
7
- return true;
8
- for (let i = 0; i < prev.length; i++) {
9
- if (prev[i].ticker !== next[i].ticker)
10
- return true;
11
- if (prev[i].yes_bid !== next[i].yes_bid)
12
- return true;
13
- if (prev[i].yes_ask !== next[i].yes_ask)
14
- return true;
15
- }
16
- return false;
17
- }
18
- /**
19
- * Hook to fetch and poll market data
20
- */
21
- export function useMarkets(pollInterval = 30000) {
22
- const { marketApi } = useKalshi();
23
- const [markets, setMarkets] = useState([]);
24
- const [isLoading, setIsLoading] = useState(true);
25
- const [error, setError] = useState(null);
26
- const marketsRef = useRef([]);
27
- const fetchMarkets = useCallback(async () => {
28
- if (!marketApi)
29
- return;
30
- try {
31
- // API signature: getMarkets(limit, cursor, eventTicker, seriesTicker, minCreatedTs, maxCreatedTs, maxCloseTs, minCloseTs, minSettledTs, maxSettledTs, status, tickers)
32
- const response = await marketApi.getMarkets(100, // limit
33
- undefined, // cursor
34
- undefined, // eventTicker
35
- undefined, // seriesTicker
36
- undefined, // minCreatedTs
37
- undefined, // maxCreatedTs
38
- undefined, // maxCloseTs
39
- undefined, // minCloseTs
40
- undefined, // minSettledTs
41
- undefined, // maxSettledTs
42
- GetMarketsStatusEnum.Open // status
43
- );
44
- // Map to our display type
45
- const marketData = (response.data.markets || []).map((m) => ({
46
- ticker: m.ticker || "",
47
- title: m.title || "",
48
- status: (m.status || "open"),
49
- yes_bid: m.yes_bid,
50
- yes_ask: m.yes_ask,
51
- no_bid: m.no_bid,
52
- no_ask: m.no_ask,
53
- volume: m.volume,
54
- open_interest: m.open_interest,
55
- close_time: m.close_time,
56
- }));
57
- // Only update state if data actually changed
58
- if (marketsChanged(marketsRef.current, marketData)) {
59
- marketsRef.current = marketData;
60
- setMarkets(marketData);
61
- }
62
- setError(null);
63
- }
64
- catch (err) {
65
- setError(err instanceof Error ? err.message : "Failed to fetch markets");
66
- }
67
- finally {
68
- setIsLoading(false);
69
- }
70
- }, [marketApi]);
71
- // Initial fetch
72
- useEffect(() => {
73
- fetchMarkets();
74
- }, [fetchMarkets]);
75
- // Polling
76
- useEffect(() => {
77
- if (!marketApi)
78
- return;
79
- const interval = setInterval(fetchMarkets, pollInterval);
80
- return () => clearInterval(interval);
81
- }, [marketApi, pollInterval, fetchMarkets]);
82
- return {
83
- markets,
84
- isLoading,
85
- error,
86
- refresh: fetchMarkets,
87
- };
88
- }
89
- //# sourceMappingURL=useMarkets.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useMarkets.js","sourceRoot":"","sources":["../../src/hooks/useMarkets.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- import type { OrderbookDisplay } from "@newyorkcompute/kalshi-core";
2
- interface UseOrderbookResult {
3
- orderbook: OrderbookDisplay | null;
4
- isLoading: boolean;
5
- error: string | null;
6
- refresh: () => Promise<void>;
7
- }
8
- /**
9
- * Hook to fetch and poll orderbook data for a specific market
10
- */
11
- export declare function useOrderbook(ticker: string | null, pollInterval?: number): UseOrderbookResult;
12
- export {};
13
- //# sourceMappingURL=useOrderbook.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useOrderbook.d.ts","sourceRoot":"","sources":["../../src/hooks/useOrderbook.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAapE,UAAU,kBAAkB;IAC1B,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,YAAY,SAAQ,GACnB,kBAAkB,CA0EpB"}