pmxt 1.3.1__tar.gz → 1.3.2__tar.gz

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 (71) hide show
  1. {pmxt-1.3.1 → pmxt-1.3.2}/PKG-INFO +1 -1
  2. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/__init__.py +1 -1
  3. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/api_client.py +1 -1
  4. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/configuration.py +1 -1
  5. {pmxt-1.3.1 → pmxt-1.3.2}/pmxt/__init__.py +1 -1
  6. {pmxt-1.3.1 → pmxt-1.3.2}/pmxt/_server/server/bundled.js +265 -25
  7. {pmxt-1.3.1 → pmxt-1.3.2}/pmxt.egg-info/PKG-INFO +1 -1
  8. {pmxt-1.3.1 → pmxt-1.3.2}/pyproject.toml +1 -1
  9. {pmxt-1.3.1 → pmxt-1.3.2}/tests/test_integration.py +3 -2
  10. {pmxt-1.3.1 → pmxt-1.3.2}/README.md +0 -0
  11. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/api/__init__.py +0 -0
  12. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/api/default_api.py +0 -0
  13. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/api_response.py +0 -0
  14. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/exceptions.py +0 -0
  15. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/__init__.py +0 -0
  16. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/balance.py +0 -0
  17. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/base_request.py +0 -0
  18. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/base_response.py +0 -0
  19. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/cancel_order_request.py +0 -0
  20. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/create_order200_response.py +0 -0
  21. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/create_order_params.py +0 -0
  22. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/create_order_request.py +0 -0
  23. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/error_detail.py +0 -0
  24. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/error_response.py +0 -0
  25. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/exchange_credentials.py +0 -0
  26. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/fetch_balance200_response.py +0 -0
  27. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/fetch_markets200_response.py +0 -0
  28. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/fetch_markets_request.py +0 -0
  29. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/fetch_ohlcv200_response.py +0 -0
  30. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/fetch_ohlcv_request.py +0 -0
  31. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/fetch_ohlcv_request_args_inner.py +0 -0
  32. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/fetch_open_orders200_response.py +0 -0
  33. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/fetch_open_orders_request.py +0 -0
  34. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/fetch_order_book200_response.py +0 -0
  35. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/fetch_order_book_request.py +0 -0
  36. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/fetch_positions200_response.py +0 -0
  37. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/fetch_positions_request.py +0 -0
  38. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/fetch_trades200_response.py +0 -0
  39. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/fetch_trades_request.py +0 -0
  40. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/get_markets_by_slug_request.py +0 -0
  41. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/health_check200_response.py +0 -0
  42. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/history_filter_params.py +0 -0
  43. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/market_filter_params.py +0 -0
  44. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/market_outcome.py +0 -0
  45. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/order.py +0 -0
  46. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/order_book.py +0 -0
  47. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/order_level.py +0 -0
  48. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/position.py +0 -0
  49. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/price_candle.py +0 -0
  50. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/search_events200_response.py +0 -0
  51. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/search_events_request.py +0 -0
  52. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/search_markets_request.py +0 -0
  53. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/search_markets_request_args_inner.py +0 -0
  54. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/trade.py +0 -0
  55. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/unified_event.py +0 -0
  56. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/unified_market.py +0 -0
  57. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/watch_order_book_request.py +0 -0
  58. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/watch_order_book_request_args_inner.py +0 -0
  59. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/models/watch_trades_request.py +0 -0
  60. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/py.typed +0 -0
  61. {pmxt-1.3.1 → pmxt-1.3.2}/generated/pmxt_internal/rest.py +0 -0
  62. {pmxt-1.3.1 → pmxt-1.3.2}/pmxt/_server/__init__.py +0 -0
  63. {pmxt-1.3.1 → pmxt-1.3.2}/pmxt/_server/bin/pmxt-ensure-server +0 -0
  64. {pmxt-1.3.1 → pmxt-1.3.2}/pmxt/client.py +0 -0
  65. {pmxt-1.3.1 → pmxt-1.3.2}/pmxt/models.py +0 -0
  66. {pmxt-1.3.1 → pmxt-1.3.2}/pmxt/server_manager.py +0 -0
  67. {pmxt-1.3.1 → pmxt-1.3.2}/pmxt.egg-info/SOURCES.txt +0 -0
  68. {pmxt-1.3.1 → pmxt-1.3.2}/pmxt.egg-info/dependency_links.txt +0 -0
  69. {pmxt-1.3.1 → pmxt-1.3.2}/pmxt.egg-info/requires.txt +0 -0
  70. {pmxt-1.3.1 → pmxt-1.3.2}/pmxt.egg-info/top_level.txt +0 -0
  71. {pmxt-1.3.1 → pmxt-1.3.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pmxt
3
- Version: 1.3.1
3
+ Version: 1.3.2
4
4
  Summary: Unified prediction market data API - The ccxt for prediction markets
5
5
  Author: PMXT Contributors
6
6
  License: MIT
@@ -14,7 +14,7 @@
14
14
  """ # noqa: E501
15
15
 
16
16
 
17
- __version__ = "1.3.1"
17
+ __version__ = "1.3.2"
18
18
 
19
19
  # Define package exports
20
20
  __all__ = [
@@ -91,7 +91,7 @@ class ApiClient:
91
91
  self.default_headers[header_name] = header_value
92
92
  self.cookie = cookie
93
93
  # Set default User-Agent.
94
- self.user_agent = 'OpenAPI-Generator/1.3.1/python'
94
+ self.user_agent = 'OpenAPI-Generator/1.3.2/python'
95
95
  self.client_side_validation = configuration.client_side_validation
96
96
 
97
97
  def __enter__(self):
@@ -506,7 +506,7 @@ class Configuration:
506
506
  "OS: {env}\n"\
507
507
  "Python Version: {pyversion}\n"\
508
508
  "Version of the API: 0.4.4\n"\
509
- "SDK Package Version: 1.3.1".\
509
+ "SDK Package Version: 1.3.2".\
510
510
  format(env=sys.platform, pyversion=sys.version)
511
511
 
512
512
  def get_host_settings(self) -> List[HostSetting]:
@@ -33,7 +33,7 @@ from .models import (
33
33
  CreateOrderParams,
34
34
  )
35
35
 
36
- __version__ = "1.3.1"
36
+ __version__ = "1.3.2"
37
37
  __all__ = [
38
38
  # Exchanges
39
39
  "Polymarket",
@@ -24369,6 +24369,15 @@ var require_BaseExchange = __commonJS({
24369
24369
  constructor(credentials) {
24370
24370
  this.credentials = credentials;
24371
24371
  }
24372
+ /**
24373
+ * Search for events matching a keyword query.
24374
+ * Returns grouped events, each containing related markets.
24375
+ * @param query - Search term
24376
+ * @param params - Optional filter parameters
24377
+ */
24378
+ async searchEvents(query, params) {
24379
+ throw new Error("Method searchEvents not implemented.");
24380
+ }
24372
24381
  /**
24373
24382
  * Fetch historical price data for a specific market outcome.
24374
24383
  * @param id - The Outcome ID (MarketOutcome.id). This should be the ID of the specific tradeable asset.
@@ -38020,6 +38029,44 @@ var require_axios = __commonJS({
38020
38029
  }
38021
38030
  });
38022
38031
 
38032
+ // dist/utils/market-utils.js
38033
+ var require_market_utils = __commonJS({
38034
+ "dist/utils/market-utils.js"(exports2) {
38035
+ "use strict";
38036
+ Object.defineProperty(exports2, "__esModule", { value: true });
38037
+ exports2.addBinaryOutcomes = addBinaryOutcomes;
38038
+ function addBinaryOutcomes(market) {
38039
+ const outcomes = market.outcomes;
38040
+ if (outcomes.length !== 2)
38041
+ return;
38042
+ const o1 = outcomes[0];
38043
+ const o2 = outcomes[1];
38044
+ const l1 = o1.label.toLowerCase();
38045
+ const l2 = o2.label.toLowerCase();
38046
+ const isYes = (l) => l === "yes" || l === "up" || l === "over";
38047
+ const isNo = (l) => l === "no" || l === "down" || l === "under";
38048
+ if (isYes(l1) || isNo(l2)) {
38049
+ market.yes = o1;
38050
+ market.no = o2;
38051
+ } else if (isYes(l2) || isNo(l1)) {
38052
+ market.yes = o2;
38053
+ market.no = o1;
38054
+ } else if (l2.startsWith("not ")) {
38055
+ market.yes = o1;
38056
+ market.no = o2;
38057
+ } else if (l1.startsWith("not ")) {
38058
+ market.yes = o2;
38059
+ market.no = o1;
38060
+ } else {
38061
+ market.yes = o1;
38062
+ market.no = o2;
38063
+ }
38064
+ market.up = market.yes;
38065
+ market.down = market.no;
38066
+ }
38067
+ }
38068
+ });
38069
+
38023
38070
  // dist/exchanges/polymarket/utils.js
38024
38071
  var require_utils4 = __commonJS({
38025
38072
  "dist/exchanges/polymarket/utils.js"(exports2) {
@@ -38028,6 +38075,7 @@ var require_utils4 = __commonJS({
38028
38075
  exports2.CLOB_API_URL = exports2.GAMMA_API_URL = void 0;
38029
38076
  exports2.mapMarketToUnified = mapMarketToUnified;
38030
38077
  exports2.mapIntervalToFidelity = mapIntervalToFidelity;
38078
+ var market_utils_1 = require_market_utils();
38031
38079
  exports2.GAMMA_API_URL = "https://gamma-api.polymarket.com/events";
38032
38080
  exports2.CLOB_API_URL = "https://clob.polymarket.com";
38033
38081
  function mapMarketToUnified(event, market, options = {}) {
@@ -38079,7 +38127,7 @@ var require_utils4 = __commonJS({
38079
38127
  });
38080
38128
  });
38081
38129
  }
38082
- return {
38130
+ const um = {
38083
38131
  id: market.id,
38084
38132
  title: market.question ? `${event.title} - ${market.question}` : event.title,
38085
38133
  description: market.description || event.description,
@@ -38094,6 +38142,8 @@ var require_utils4 = __commonJS({
38094
38142
  category: event.category || event.tags?.[0]?.label,
38095
38143
  tags: event.tags?.map((t) => t.label) || []
38096
38144
  };
38145
+ (0, market_utils_1.addBinaryOutcomes)(um);
38146
+ return um;
38097
38147
  }
38098
38148
  function mapIntervalToFidelity(interval) {
38099
38149
  const mapping = {
@@ -38206,6 +38256,76 @@ var require_searchMarkets = __commonJS({
38206
38256
  }
38207
38257
  });
38208
38258
 
38259
+ // dist/exchanges/polymarket/searchEvents.js
38260
+ var require_searchEvents = __commonJS({
38261
+ "dist/exchanges/polymarket/searchEvents.js"(exports2) {
38262
+ "use strict";
38263
+ var __importDefault = exports2 && exports2.__importDefault || function(mod) {
38264
+ return mod && mod.__esModule ? mod : { "default": mod };
38265
+ };
38266
+ Object.defineProperty(exports2, "__esModule", { value: true });
38267
+ exports2.searchEvents = searchEvents;
38268
+ var axios_1 = __importDefault(require_axios());
38269
+ var utils_1 = require_utils4();
38270
+ async function searchEvents(query, params) {
38271
+ const searchLimit = 1e5;
38272
+ try {
38273
+ const response = await axios_1.default.get(utils_1.GAMMA_API_URL, {
38274
+ params: {
38275
+ active: "true",
38276
+ closed: "false",
38277
+ limit: searchLimit
38278
+ }
38279
+ });
38280
+ const events = response.data || [];
38281
+ const lowerQuery = query.toLowerCase();
38282
+ const searchIn = params?.searchIn || "title";
38283
+ const filtered = events.filter((event) => {
38284
+ const titleMatch = (event.title || "").toLowerCase().includes(lowerQuery);
38285
+ const descMatch = (event.description || "").toLowerCase().includes(lowerQuery);
38286
+ if (searchIn === "title")
38287
+ return titleMatch;
38288
+ if (searchIn === "description")
38289
+ return descMatch;
38290
+ return titleMatch || descMatch;
38291
+ });
38292
+ const unifiedEvents = filtered.map((event) => {
38293
+ const markets = [];
38294
+ if (event.markets) {
38295
+ for (const market of event.markets) {
38296
+ const unifiedMarket = (0, utils_1.mapMarketToUnified)(event, market, { useQuestionAsCandidateFallback: true });
38297
+ if (unifiedMarket) {
38298
+ markets.push(unifiedMarket);
38299
+ }
38300
+ }
38301
+ }
38302
+ const unifiedEvent = {
38303
+ id: event.id || event.slug,
38304
+ title: event.title,
38305
+ description: event.description || "",
38306
+ slug: event.slug,
38307
+ markets,
38308
+ url: `https://polymarket.com/event/${event.slug}`,
38309
+ image: event.image || `https://polymarket.com/api/og?slug=${event.slug}`,
38310
+ category: event.category || event.tags?.[0]?.label,
38311
+ tags: event.tags?.map((t) => t.label) || [],
38312
+ searchMarkets: function(marketQuery) {
38313
+ const lowerMarketQuery = marketQuery.toLowerCase();
38314
+ return this.markets.filter((m) => m.title.toLowerCase().includes(lowerMarketQuery) || m.description.toLowerCase().includes(lowerMarketQuery) || m.outcomes.some((o) => o.label.toLowerCase().includes(lowerMarketQuery)));
38315
+ }
38316
+ };
38317
+ return unifiedEvent;
38318
+ });
38319
+ const limit = params?.limit || 20;
38320
+ return unifiedEvents.slice(0, limit);
38321
+ } catch (error) {
38322
+ console.error("Error searching Polymarket events:", error);
38323
+ return [];
38324
+ }
38325
+ }
38326
+ }
38327
+ });
38328
+
38209
38329
  // dist/exchanges/polymarket/getMarketsBySlug.js
38210
38330
  var require_getMarketsBySlug = __commonJS({
38211
38331
  "dist/exchanges/polymarket/getMarketsBySlug.js"(exports2) {
@@ -38263,9 +38383,20 @@ var require_fetchOHLCV = __commonJS({
38263
38383
  try {
38264
38384
  const fidelity = (0, utils_1.mapIntervalToFidelity)(params.resolution);
38265
38385
  const nowTs = Math.floor(Date.now() / 1e3);
38266
- let startTs = params.start ? Math.floor(params.start.getTime() / 1e3) : 0;
38267
- let endTs = params.end ? Math.floor(params.end.getTime() / 1e3) : nowTs;
38268
- if (!params.start) {
38386
+ const ensureDate = (d) => {
38387
+ if (typeof d === "string") {
38388
+ if (!d.endsWith("Z") && !d.match(/[+-]\d{2}:\d{2}$/)) {
38389
+ return /* @__PURE__ */ new Date(d + "Z");
38390
+ }
38391
+ return new Date(d);
38392
+ }
38393
+ return d;
38394
+ };
38395
+ const pStart = params.start ? ensureDate(params.start) : void 0;
38396
+ const pEnd = params.end ? ensureDate(params.end) : void 0;
38397
+ let startTs = pStart ? Math.floor(pStart.getTime() / 1e3) : 0;
38398
+ let endTs = pEnd ? Math.floor(pEnd.getTime() / 1e3) : nowTs;
38399
+ if (!pStart) {
38269
38400
  const count = params.limit || 100;
38270
38401
  const durationSeconds = count * fidelity * 60;
38271
38402
  startTs = endTs - durationSeconds;
@@ -38281,19 +38412,30 @@ var require_fetchOHLCV = __commonJS({
38281
38412
  });
38282
38413
  const history = response.data.history || [];
38283
38414
  const resolutionMs = fidelity * 60 * 1e3;
38284
- const candles = history.map((item) => {
38415
+ const buckets = /* @__PURE__ */ new Map();
38416
+ history.forEach((item) => {
38285
38417
  const rawMs = item.t * 1e3;
38286
38418
  const snappedMs = Math.floor(rawMs / resolutionMs) * resolutionMs;
38287
- return {
38288
- timestamp: snappedMs,
38289
- // Aligned timestamp
38290
- open: item.p,
38291
- high: item.p,
38292
- low: item.p,
38293
- close: item.p,
38294
- volume: void 0
38295
- };
38419
+ const price = Number(item.p);
38420
+ const volume = Number(item.s || item.v || 0);
38421
+ if (!buckets.has(snappedMs)) {
38422
+ buckets.set(snappedMs, {
38423
+ timestamp: snappedMs,
38424
+ open: price,
38425
+ high: price,
38426
+ low: price,
38427
+ close: price,
38428
+ volume
38429
+ });
38430
+ } else {
38431
+ const candle = buckets.get(snappedMs);
38432
+ candle.high = Math.max(candle.high, price);
38433
+ candle.low = Math.min(candle.low, price);
38434
+ candle.close = price;
38435
+ candle.volume = (candle.volume || 0) + volume;
38436
+ }
38296
38437
  });
38438
+ const candles = Array.from(buckets.values()).sort((a, b) => a.timestamp - b.timestamp);
38297
38439
  if (params.limit && candles.length > params.limit) {
38298
38440
  return candles.slice(-params.limit);
38299
38441
  }
@@ -104573,6 +104715,7 @@ var require_polymarket = __commonJS({
104573
104715
  var BaseExchange_1 = require_BaseExchange();
104574
104716
  var fetchMarkets_1 = require_fetchMarkets();
104575
104717
  var searchMarkets_1 = require_searchMarkets();
104718
+ var searchEvents_1 = require_searchEvents();
104576
104719
  var getMarketsBySlug_1 = require_getMarketsBySlug();
104577
104720
  var fetchOHLCV_1 = require_fetchOHLCV();
104578
104721
  var fetchOrderBook_1 = require_fetchOrderBook();
@@ -104606,6 +104749,9 @@ var require_polymarket = __commonJS({
104606
104749
  async searchMarkets(query, params) {
104607
104750
  return (0, searchMarkets_1.searchMarkets)(query, params);
104608
104751
  }
104752
+ async searchEvents(query, params) {
104753
+ return (0, searchEvents_1.searchEvents)(query, params);
104754
+ }
104609
104755
  async getMarketsBySlug(slug) {
104610
104756
  return (0, getMarketsBySlug_1.getMarketsBySlug)(slug);
104611
104757
  }
@@ -104805,6 +104951,7 @@ var require_utils10 = __commonJS({
104805
104951
  exports2.KALSHI_SERIES_URL = exports2.KALSHI_API_URL = void 0;
104806
104952
  exports2.mapMarketToUnified = mapMarketToUnified;
104807
104953
  exports2.mapIntervalToKalshi = mapIntervalToKalshi;
104954
+ var market_utils_1 = require_market_utils();
104808
104955
  exports2.KALSHI_API_URL = "https://api.elections.kalshi.com/trade-api/v2/events";
104809
104956
  exports2.KALSHI_SERIES_URL = "https://api.elections.kalshi.com/trade-api/v2/series";
104810
104957
  function mapMarketToUnified(event, market) {
@@ -104854,7 +105001,7 @@ var require_utils10 = __commonJS({
104854
105001
  }
104855
105002
  }
104856
105003
  }
104857
- return {
105004
+ const um = {
104858
105005
  id: market.ticker,
104859
105006
  title: event.title,
104860
105007
  description: market.rules_primary || market.rules_secondary || "",
@@ -104869,6 +105016,8 @@ var require_utils10 = __commonJS({
104869
105016
  category: event.category,
104870
105017
  tags: unifiedTags
104871
105018
  };
105019
+ (0, market_utils_1.addBinaryOutcomes)(um);
105020
+ return um;
104872
105021
  }
104873
105022
  function mapIntervalToKalshi(interval) {
104874
105023
  const mapping = {
@@ -105046,6 +105195,68 @@ var require_searchMarkets2 = __commonJS({
105046
105195
  }
105047
105196
  });
105048
105197
 
105198
+ // dist/exchanges/kalshi/searchEvents.js
105199
+ var require_searchEvents2 = __commonJS({
105200
+ "dist/exchanges/kalshi/searchEvents.js"(exports2) {
105201
+ "use strict";
105202
+ var __importDefault = exports2 && exports2.__importDefault || function(mod) {
105203
+ return mod && mod.__esModule ? mod : { "default": mod };
105204
+ };
105205
+ Object.defineProperty(exports2, "__esModule", { value: true });
105206
+ exports2.searchEvents = searchEvents;
105207
+ var axios_1 = __importDefault(require_axios());
105208
+ var utils_1 = require_utils10();
105209
+ async function searchEvents(query, params) {
105210
+ try {
105211
+ const queryParams = {
105212
+ limit: 200,
105213
+ // Reasonable batch for search
105214
+ with_nested_markets: true,
105215
+ status: "open"
105216
+ };
105217
+ const response = await axios_1.default.get(utils_1.KALSHI_API_URL, { params: queryParams });
105218
+ const events = response.data.events || [];
105219
+ const lowerQuery = query.toLowerCase();
105220
+ const filtered = events.filter((event) => {
105221
+ return (event.title || "").toLowerCase().includes(lowerQuery);
105222
+ });
105223
+ const unifiedEvents = filtered.map((event) => {
105224
+ const markets = [];
105225
+ if (event.markets) {
105226
+ for (const market of event.markets) {
105227
+ const unifiedMarket = (0, utils_1.mapMarketToUnified)(event, market);
105228
+ if (unifiedMarket) {
105229
+ markets.push(unifiedMarket);
105230
+ }
105231
+ }
105232
+ }
105233
+ const unifiedEvent = {
105234
+ id: event.event_ticker,
105235
+ title: event.title,
105236
+ description: event.mututals_description || "",
105237
+ slug: event.event_ticker,
105238
+ markets,
105239
+ url: `https://kalshi.com/events/${event.event_ticker}`,
105240
+ image: event.image_url,
105241
+ category: event.category,
105242
+ tags: event.tags || [],
105243
+ searchMarkets: function(marketQuery) {
105244
+ const lowerMarketQuery = marketQuery.toLowerCase();
105245
+ return this.markets.filter((m) => m.title.toLowerCase().includes(lowerMarketQuery) || m.outcomes.some((o) => o.label.toLowerCase().includes(lowerMarketQuery)));
105246
+ }
105247
+ };
105248
+ return unifiedEvent;
105249
+ });
105250
+ const limit = params?.limit || 20;
105251
+ return unifiedEvents.slice(0, limit);
105252
+ } catch (error) {
105253
+ console.error("Error searching Kalshi events:", error);
105254
+ return [];
105255
+ }
105256
+ }
105257
+ }
105258
+ });
105259
+
105049
105260
  // dist/exchanges/kalshi/getMarketsBySlug.js
105050
105261
  var require_getMarketsBySlug2 = __commonJS({
105051
105262
  "dist/exchanges/kalshi/getMarketsBySlug.js"(exports2) {
@@ -105130,12 +105341,23 @@ var require_fetchOHLCV2 = __commonJS({
105130
105341
  const now = Math.floor(Date.now() / 1e3);
105131
105342
  let startTs = now - 24 * 60 * 60;
105132
105343
  let endTs = now;
105133
- if (params.start) {
105134
- startTs = Math.floor(params.start.getTime() / 1e3);
105344
+ const ensureDate = (d) => {
105345
+ if (typeof d === "string") {
105346
+ if (!d.endsWith("Z") && !d.match(/[+-]\d{2}:\d{2}$/)) {
105347
+ return /* @__PURE__ */ new Date(d + "Z");
105348
+ }
105349
+ return new Date(d);
105350
+ }
105351
+ return d;
105352
+ };
105353
+ const pStart = params.start ? ensureDate(params.start) : void 0;
105354
+ const pEnd = params.end ? ensureDate(params.end) : void 0;
105355
+ if (pStart) {
105356
+ startTs = Math.floor(pStart.getTime() / 1e3);
105135
105357
  }
105136
- if (params.end) {
105137
- endTs = Math.floor(params.end.getTime() / 1e3);
105138
- if (!params.start) {
105358
+ if (pEnd) {
105359
+ endTs = Math.floor(pEnd.getTime() / 1e3);
105360
+ if (!pStart) {
105139
105361
  startTs = endTs - 24 * 60 * 60;
105140
105362
  }
105141
105363
  }
@@ -105664,6 +105886,7 @@ var require_kalshi = __commonJS({
105664
105886
  var BaseExchange_1 = require_BaseExchange();
105665
105887
  var fetchMarkets_1 = require_fetchMarkets2();
105666
105888
  var searchMarkets_1 = require_searchMarkets2();
105889
+ var searchEvents_1 = require_searchEvents2();
105667
105890
  var getMarketsBySlug_1 = require_getMarketsBySlug2();
105668
105891
  var fetchOHLCV_1 = require_fetchOHLCV2();
105669
105892
  var fetchOrderBook_1 = require_fetchOrderBook2();
@@ -105707,6 +105930,9 @@ var require_kalshi = __commonJS({
105707
105930
  async searchMarkets(query, params) {
105708
105931
  return (0, searchMarkets_1.searchMarkets)(query, params);
105709
105932
  }
105933
+ async searchEvents(query, params) {
105934
+ return (0, searchEvents_1.searchEvents)(query, params);
105935
+ }
105710
105936
  async getMarketsBySlug(slug) {
105711
105937
  return (0, getMarketsBySlug_1.getMarketsBySlug)(slug);
105712
105938
  }
@@ -106203,14 +106429,28 @@ var crypto_2 = require("crypto");
106203
106429
  var fs_1 = require("fs");
106204
106430
  var path_1 = require("path");
106205
106431
  function getServerVersion() {
106206
- let baseVersion = "1.0.0";
106432
+ let baseVersion = "1.0.0-b4";
106207
106433
  let packageJson;
106208
106434
  try {
106209
- const packageCtx = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, "../../package.json"), "utf-8");
106210
- packageJson = JSON.parse(packageCtx);
106211
- baseVersion = packageJson.version;
106435
+ const possiblePaths = [
106436
+ (0, path_1.join)(__dirname, "../../package.json"),
106437
+ // From dist/server/
106438
+ (0, path_1.join)(__dirname, "../../../package.json"),
106439
+ // From dist/server/bundled
106440
+ (0, path_1.join)(__dirname, "package.json")
106441
+ // Same directory (unlikely)
106442
+ ];
106443
+ for (const pkgPath of possiblePaths) {
106444
+ try {
106445
+ const packageCtx = (0, fs_1.readFileSync)(pkgPath, "utf-8");
106446
+ packageJson = JSON.parse(packageCtx);
106447
+ baseVersion = packageJson.version;
106448
+ break;
106449
+ } catch {
106450
+ continue;
106451
+ }
106452
+ }
106212
106453
  } catch (e) {
106213
- baseVersion = "1.0.0";
106214
106454
  }
106215
106455
  const isDev = process.env.NODE_ENV === "development" || process.env.PMXT_ALWAYS_RESTART === "1" || __dirname.includes("/core/src/") && !!packageJson || __dirname.includes("/core/dist/") && !!packageJson;
106216
106456
  if (!isDev) {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pmxt
3
- Version: 1.3.1
3
+ Version: 1.3.2
4
4
  Summary: Unified prediction market data API - The ccxt for prediction markets
5
5
  Author: PMXT Contributors
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pmxt"
7
- version = "1.3.1"
7
+ version = "1.3.2"
8
8
  description = "Unified prediction market data API - The ccxt for prediction markets"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
@@ -124,10 +124,11 @@ class TestCrossExchangeConsistency:
124
124
 
125
125
  def test_both_exchanges_return_same_structure(self):
126
126
  """Verify Polymarket and Kalshi return identically structured data"""
127
+ # Initialize one at a time to ensure valid tokens
127
128
  poly = pmxt.Polymarket()
128
- kalshi = pmxt.Kalshi()
129
-
130
129
  poly_markets = poly.fetch_markets()
130
+
131
+ kalshi = pmxt.Kalshi()
131
132
  kalshi_markets = kalshi.fetch_markets()
132
133
 
133
134
  # Both should return lists
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes