@agg-build/sdk 1.2.13 → 2.0.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/index.mjs CHANGED
@@ -94,8 +94,14 @@ var OrderStatus = /* @__PURE__ */ ((OrderStatus2) => {
94
94
  OrderStatus2["pending_bridge"] = "pending_bridge";
95
95
  OrderStatus2["submitting"] = "submitting";
96
96
  OrderStatus2["submitted"] = "submitted";
97
+ OrderStatus2["open"] = "open";
98
+ OrderStatus2["partially_filled_open"] = "partially_filled_open";
99
+ OrderStatus2["cancel_pending"] = "cancel_pending";
97
100
  OrderStatus2["filled"] = "filled";
98
101
  OrderStatus2["partial_fill"] = "partial_fill";
102
+ OrderStatus2["failed"] = "failed";
103
+ OrderStatus2["expired"] = "expired";
104
+ OrderStatus2["cancelled"] = "cancelled";
99
105
  return OrderStatus2;
100
106
  })(OrderStatus || {});
101
107
  var TradeSide = /* @__PURE__ */ ((TradeSide2) => {
@@ -103,6 +109,20 @@ var TradeSide = /* @__PURE__ */ ((TradeSide2) => {
103
109
  TradeSide2["Sell"] = "sell";
104
110
  return TradeSide2;
105
111
  })(TradeSide || {});
112
+ var OrderType = /* @__PURE__ */ ((OrderType2) => {
113
+ OrderType2["Market"] = "market";
114
+ OrderType2["Limit"] = "limit";
115
+ return OrderType2;
116
+ })(OrderType || {});
117
+ var TimeInForce = /* @__PURE__ */ ((TimeInForce2) => {
118
+ TimeInForce2["GTC"] = "GTC";
119
+ TimeInForce2["GTD"] = "GTD";
120
+ TimeInForce2["FOK"] = "FOK";
121
+ TimeInForce2["FAK"] = "FAK";
122
+ TimeInForce2["IOC"] = "IOC";
123
+ TimeInForce2["ALO"] = "ALO";
124
+ return TimeInForce2;
125
+ })(TimeInForce || {});
106
126
 
107
127
  // ../common/src/utils/format-market-display.ts
108
128
  function formatOutcomeLabel(venue, outcome, _market) {
@@ -727,7 +747,14 @@ var AggWebSocket = class {
727
747
  this.pendingFlushUnsubs = /* @__PURE__ */ new Set();
728
748
  this.pendingFlushTradeSubs = /* @__PURE__ */ new Set();
729
749
  this.pendingFlushTradeUnsubs = /* @__PURE__ */ new Set();
750
+ this.pendingFlushArbSubs = /* @__PURE__ */ new Set();
751
+ this.pendingFlushArbUnsubs = /* @__PURE__ */ new Set();
730
752
  this.flushScheduled = false;
753
+ // ── Arb subscriptions ──
754
+ this.arbSubs = /* @__PURE__ */ new Map();
755
+ this.arbFeedCbs = /* @__PURE__ */ new Set();
756
+ /** Latest arb market update per marketId (last-value-wins, loss-tolerant). */
757
+ this.latestArb = /* @__PURE__ */ new Map();
731
758
  // ── Orderbook state per market ──
732
759
  this.books = /* @__PURE__ */ new Map();
733
760
  /** Markets currently resyncing (awaiting snapshot after seq gap / checksum mismatch). */
@@ -759,6 +786,69 @@ var AggWebSocket = class {
759
786
  isResyncing(outcomeId) {
760
787
  return this.resyncing.has(outcomeId);
761
788
  }
789
+ /** Get the latest arb update for a market (or null if none received yet). */
790
+ getArb(marketId) {
791
+ var _a;
792
+ return (_a = this.latestArb.get(marketId)) != null ? _a : null;
793
+ }
794
+ /**
795
+ * Subscribe to per-market arb updates for a given marketId.
796
+ * Ref-counted: multiple callers for the same marketId share one server subscription.
797
+ * Returns an unsubscribe function.
798
+ */
799
+ subscribeArb(marketId, cb) {
800
+ let entry = this.arbSubs.get(marketId);
801
+ if (!entry) {
802
+ entry = { refCount: 0, cbs: /* @__PURE__ */ new Set() };
803
+ this.arbSubs.set(marketId, entry);
804
+ this.ensureConnected();
805
+ if (this._connected) {
806
+ this.pendingFlushArbUnsubs.delete(marketId);
807
+ this.pendingFlushArbSubs.add(marketId);
808
+ this.scheduleFlush();
809
+ }
810
+ }
811
+ entry.cbs.add(cb);
812
+ entry.refCount++;
813
+ return () => {
814
+ const e = this.arbSubs.get(marketId);
815
+ if (!e) return;
816
+ e.cbs.delete(cb);
817
+ e.refCount--;
818
+ if (e.refCount <= 0) {
819
+ this.arbSubs.delete(marketId);
820
+ if (this._connected) {
821
+ if (this.pendingFlushArbSubs.has(marketId)) {
822
+ this.pendingFlushArbSubs.delete(marketId);
823
+ } else {
824
+ this.pendingFlushArbUnsubs.add(marketId);
825
+ this.scheduleFlush();
826
+ }
827
+ }
828
+ }
829
+ };
830
+ }
831
+ /**
832
+ * Subscribe to the global arb-feed batches.
833
+ * Only one server subscription is maintained regardless of how many callers.
834
+ * Returns an unsubscribe function.
835
+ */
836
+ subscribeArbFeed(cb) {
837
+ const wasEmpty = this.arbFeedCbs.size === 0;
838
+ this.arbFeedCbs.add(cb);
839
+ if (wasEmpty) {
840
+ this.ensureConnected();
841
+ if (this._connected) {
842
+ this.send({ action: "subscribe", channel: "arb-feed" });
843
+ }
844
+ }
845
+ return () => {
846
+ this.arbFeedCbs.delete(cb);
847
+ if (this.arbFeedCbs.size === 0 && this._connected) {
848
+ this.send({ action: "unsubscribe", channel: "arb-feed" });
849
+ }
850
+ };
851
+ }
762
852
  /**
763
853
  * Subscribe to a feed by outcome ID.
764
854
  * @param outcomeId The venueMarketOutcomeId to subscribe to.
@@ -896,6 +986,11 @@ var AggWebSocket = class {
896
986
  this.pendingFlushUnsubs.clear();
897
987
  this.pendingFlushTradeSubs.clear();
898
988
  this.pendingFlushTradeUnsubs.clear();
989
+ this.arbSubs.clear();
990
+ this.arbFeedCbs.clear();
991
+ this.latestArb.clear();
992
+ this.pendingFlushArbSubs.clear();
993
+ this.pendingFlushArbUnsubs.clear();
899
994
  this.flushScheduled = false;
900
995
  }
901
996
  /** Update callbacks (e.g., after React re-render). */
@@ -941,7 +1036,7 @@ var AggWebSocket = class {
941
1036
  if (wasConnected) {
942
1037
  (_b = (_a = this.callbacks).onConnectionStateChange) == null ? void 0 : _b.call(_a, false);
943
1038
  }
944
- if (!this.destroyed && this.subs.size > 0) {
1039
+ if (!this.destroyed && (this.subs.size > 0 || this.arbSubs.size > 0 || this.arbFeedCbs.size > 0)) {
945
1040
  this.scheduleReconnect();
946
1041
  }
947
1042
  };
@@ -986,7 +1081,7 @@ var AggWebSocket = class {
986
1081
  }
987
1082
  // ── Message handling ──
988
1083
  handleMessage(raw) {
989
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
1084
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
990
1085
  const type = raw.type;
991
1086
  switch (type) {
992
1087
  case "orderbook_snapshot":
@@ -1034,6 +1129,22 @@ var AggWebSocket = class {
1034
1129
  case "withdrawal_lifecycle":
1035
1130
  (_l = (_k = this.callbacks).onWithdrawalLifecycle) == null ? void 0 : _l.call(_k, raw);
1036
1131
  break;
1132
+ case "arb_market_update": {
1133
+ const arbMsg = raw;
1134
+ this.latestArb.set(arbMsg.marketId, arbMsg);
1135
+ const arbEntry = this.arbSubs.get(arbMsg.marketId);
1136
+ if (arbEntry) {
1137
+ for (const cb of arbEntry.cbs) cb(arbMsg);
1138
+ }
1139
+ (_n = (_m = this.callbacks).onArbMarket) == null ? void 0 : _n.call(_m, arbMsg);
1140
+ break;
1141
+ }
1142
+ case "arb_feed_batch": {
1143
+ const feedMsg = raw;
1144
+ for (const cb of this.arbFeedCbs) cb(feedMsg);
1145
+ (_p = (_o = this.callbacks).onArbFeed) == null ? void 0 : _p.call(_o, feedMsg);
1146
+ break;
1147
+ }
1037
1148
  }
1038
1149
  }
1039
1150
  /**
@@ -1070,6 +1181,17 @@ var AggWebSocket = class {
1070
1181
  this.send({ action: "resnapshot", channel: "orderbook", outcomeIds: resnapshotIds });
1071
1182
  }
1072
1183
  this.pendingResnapshots.clear();
1184
+ const arbSet = new Set(this.activeArbMarkets());
1185
+ this.pendingFlushArbSubs.forEach((id) => arbSet.add(id));
1186
+ const arbIds = Array.from(arbSet);
1187
+ if (arbIds.length > 0) {
1188
+ this.send({ action: "subscribe", channel: "arb", marketIds: arbIds });
1189
+ }
1190
+ this.pendingFlushArbSubs.clear();
1191
+ this.pendingFlushArbUnsubs.clear();
1192
+ if (this.arbFeedCbs.size > 0) {
1193
+ this.send({ action: "subscribe", channel: "arb-feed" });
1194
+ }
1073
1195
  }
1074
1196
  handleSnapshot(raw) {
1075
1197
  var _a, _b;
@@ -1241,6 +1363,8 @@ var AggWebSocket = class {
1241
1363
  this.pendingFlushUnsubs.clear();
1242
1364
  this.pendingFlushTradeSubs.clear();
1243
1365
  this.pendingFlushTradeUnsubs.clear();
1366
+ this.pendingFlushArbSubs.clear();
1367
+ this.pendingFlushArbUnsubs.clear();
1244
1368
  return;
1245
1369
  }
1246
1370
  this.flushPending();
@@ -1287,6 +1411,28 @@ var AggWebSocket = class {
1287
1411
  });
1288
1412
  this.pendingFlushTradeUnsubs.clear();
1289
1413
  }
1414
+ for (const id of [...this.pendingFlushArbSubs]) {
1415
+ if (this.pendingFlushArbUnsubs.has(id)) {
1416
+ this.pendingFlushArbSubs.delete(id);
1417
+ this.pendingFlushArbUnsubs.delete(id);
1418
+ }
1419
+ }
1420
+ if (this.pendingFlushArbSubs.size > 0) {
1421
+ this.send({
1422
+ action: "subscribe",
1423
+ channel: "arb",
1424
+ marketIds: Array.from(this.pendingFlushArbSubs)
1425
+ });
1426
+ this.pendingFlushArbSubs.clear();
1427
+ }
1428
+ if (this.pendingFlushArbUnsubs.size > 0) {
1429
+ this.send({
1430
+ action: "unsubscribe",
1431
+ channel: "arb",
1432
+ marketIds: Array.from(this.pendingFlushArbUnsubs)
1433
+ });
1434
+ this.pendingFlushArbUnsubs.clear();
1435
+ }
1290
1436
  }
1291
1437
  sendSubscribe(outcomeIds) {
1292
1438
  this.send({ action: "subscribe", channel: "orderbook", outcomeIds });
@@ -1311,6 +1457,9 @@ var AggWebSocket = class {
1311
1457
  });
1312
1458
  return markets;
1313
1459
  }
1460
+ activeArbMarkets() {
1461
+ return Array.from(this.arbSubs.keys());
1462
+ }
1314
1463
  emitDiagnostic(event) {
1315
1464
  var _a, _b;
1316
1465
  (_b = (_a = this.callbacks).onDiagnostics) == null ? void 0 : _b.call(_a, event);
@@ -1992,6 +2141,7 @@ Issued At: ${issuedAt}`;
1992
2141
  if (params.orderId) query.orderId = params.orderId;
1993
2142
  if (params.quoteId) query.quoteId = params.quoteId;
1994
2143
  if (params.status) query.status = params.status;
2144
+ if (params.mode) query.mode = params.mode;
1995
2145
  if (params.cursor) query.cursor = params.cursor;
1996
2146
  if (params.limit != null) query.limit = String(params.limit);
1997
2147
  return this.request("/execution/orders", {
@@ -2018,6 +2168,7 @@ Issued At: ${issuedAt}`;
2018
2168
  if (params.cursor) query.cursor = params.cursor;
2019
2169
  if (params.limit != null) query.limit = String(params.limit);
2020
2170
  if (params.status) query.status = params.status;
2171
+ if (params.mode) query.mode = params.mode;
2021
2172
  return this.request("/execution/positions", {
2022
2173
  query: Object.keys(query).length ? query : void 0
2023
2174
  });
@@ -2025,8 +2176,12 @@ Issued At: ${issuedAt}`;
2025
2176
  }
2026
2177
  /** Get managed wallet balances, including per-chain cash balances and per-venue position balances. */
2027
2178
  getManagedBalances() {
2028
- return __async(this, null, function* () {
2029
- return this.request("/execution/balances");
2179
+ return __async(this, arguments, function* (params = {}) {
2180
+ const query = {};
2181
+ if (params.mode) query.mode = params.mode;
2182
+ return this.request("/execution/balances", {
2183
+ query: Object.keys(query).length ? query : void 0
2184
+ });
2030
2185
  });
2031
2186
  }
2032
2187
  /** Cancel a pending managed execution by order id. */
@@ -2076,6 +2231,92 @@ Issued At: ${issuedAt}`;
2076
2231
  });
2077
2232
  });
2078
2233
  }
2234
+ /** List deterministic recurring crypto window markets across venues. Requires appId or admin auth. */
2235
+ listRecurringCryptoMarkets(options) {
2236
+ return __async(this, null, function* () {
2237
+ const query = {};
2238
+ if ((options == null ? void 0 : options.assets) && options.assets.length > 0) query.assets = options.assets;
2239
+ if ((options == null ? void 0 : options.durations) && options.durations.length > 0) query.durations = options.durations;
2240
+ if (options == null ? void 0 : options.interval) query.interval = options.interval;
2241
+ if (options == null ? void 0 : options.window) query.window = options.window;
2242
+ if ((options == null ? void 0 : options.venues) && options.venues.length > 0) query.venues = options.venues;
2243
+ if ((options == null ? void 0 : options.status) && options.status.length > 0) query.status = options.status;
2244
+ if (options == null ? void 0 : options.windowStartFrom) query.windowStartFrom = options.windowStartFrom;
2245
+ if (options == null ? void 0 : options.windowStartTo) query.windowStartTo = options.windowStartTo;
2246
+ if (options == null ? void 0 : options.cursor) query.cursor = options.cursor;
2247
+ if ((options == null ? void 0 : options.limit) != null) query.limit = String(options.limit);
2248
+ if ((options == null ? void 0 : options.includeOrderbookPrices) != null) {
2249
+ query.includeOrderbookPrices = String(options.includeOrderbookPrices);
2250
+ }
2251
+ if ((options == null ? void 0 : options.includeReferencePrices) != null) {
2252
+ query.includeReferencePrices = String(options.includeReferencePrices);
2253
+ }
2254
+ if ((options == null ? void 0 : options.includeDirectVenueMarkets) != null) {
2255
+ query.includeDirectVenueMarkets = String(options.includeDirectVenueMarkets);
2256
+ }
2257
+ return this.request("/crypto/recurring-markets", {
2258
+ query: Object.keys(query).length > 0 ? query : void 0,
2259
+ signal: options == null ? void 0 : options.signal
2260
+ });
2261
+ });
2262
+ }
2263
+ /** Poll fresh reference prices for recurring crypto markets. Requires appId or admin auth. */
2264
+ getCryptoReferencePrices(options) {
2265
+ return __async(this, null, function* () {
2266
+ var _a, _b, _c, _d, _e, _f;
2267
+ const targets = [
2268
+ ...(_a = options.targets) != null ? _a : [],
2269
+ ...((_b = options.venueMarketIds) != null ? _b : []).map((venueMarketId) => ({
2270
+ type: "venueMarket",
2271
+ venueMarketId
2272
+ })),
2273
+ ...((_c = options.venueEventIds) != null ? _c : []).map((venueEventId) => ({
2274
+ type: "venueEvent",
2275
+ venueEventId
2276
+ })),
2277
+ ...((_d = options.externalMarkets) != null ? _d : []).map((market) => ({
2278
+ type: "externalVenueMarket",
2279
+ venue: market.venue,
2280
+ externalMarketId: market.externalMarketId
2281
+ })),
2282
+ ...((_e = options.markets) != null ? _e : []).map((market) => {
2283
+ var _a2;
2284
+ return {
2285
+ type: "market",
2286
+ venue: market.venue,
2287
+ venueEventId: market.venueEventId,
2288
+ venueMarketId: market.venueMarketId,
2289
+ externalEventId: market.externalEventId,
2290
+ externalMarketId: market.externalMarketId,
2291
+ asset: market.asset,
2292
+ quoteAsset: (_a2 = market.quoteAsset) != null ? _a2 : "USD",
2293
+ resolution: market.resolution
2294
+ };
2295
+ }),
2296
+ ...((_f = options.windowMarkets) != null ? _f : []).flatMap(
2297
+ (windowMarket) => windowMarket.markets.map((market) => ({
2298
+ type: "market",
2299
+ venue: market.venue,
2300
+ venueEventId: market.venueEventId,
2301
+ venueMarketId: market.venueMarketId,
2302
+ externalEventId: market.externalEventId,
2303
+ externalMarketId: market.externalMarketId,
2304
+ asset: windowMarket.asset,
2305
+ quoteAsset: windowMarket.quoteAsset,
2306
+ resolution: market.resolution
2307
+ }))
2308
+ )
2309
+ ];
2310
+ if (targets.length === 0) {
2311
+ throw new Error("getCryptoReferencePrices requires at least one target");
2312
+ }
2313
+ return this.request("/crypto/reference-prices", {
2314
+ method: "POST",
2315
+ body: JSON.stringify({ targets }),
2316
+ signal: options.signal
2317
+ });
2318
+ });
2319
+ }
2079
2320
  /** List venue markets with optional filters. Requires appId or admin auth. Supports cursor-based pagination. */
2080
2321
  getVenueMarkets(options) {
2081
2322
  return __async(this, null, function* () {
@@ -2274,6 +2515,7 @@ Issued At: ${issuedAt}`;
2274
2515
  if (params.compareVenues) query.compareVenues = "true";
2275
2516
  if ((_c = params.allowedVenues) == null ? void 0 : _c.length) query.allowedVenues = params.allowedVenues.map(String);
2276
2517
  if (params.tradeSide) query.side = params.tradeSide;
2518
+ if (params.mode) query.mode = params.mode;
2277
2519
  if (params.deepEstimate) query.deepEstimate = "true";
2278
2520
  const response = yield this.request(
2279
2521
  `/orderbook/${encodeURIComponent(venueMarketOutcomeId)}/route`,
@@ -2375,6 +2617,7 @@ Issued At: ${issuedAt}`;
2375
2617
  if (params == null ? void 0 : params.cursor) query.cursor = params.cursor;
2376
2618
  if ((params == null ? void 0 : params.limit) != null) query.limit = String(params.limit);
2377
2619
  if (params == null ? void 0 : params.status) query.status = params.status;
2620
+ if (params == null ? void 0 : params.mode) query.mode = params.mode;
2378
2621
  return this.request("/execution/positions", {
2379
2622
  query: Object.keys(query).length > 0 ? query : void 0
2380
2623
  });
@@ -2413,6 +2656,18 @@ Issued At: ${issuedAt}`;
2413
2656
  // src/best-split.ts
2414
2657
  var computeBestSplitsByAmount2 = computeBestSplitsByAmount;
2415
2658
 
2659
+ // src/types.ts
2660
+ var RECURRENCE_CADENCES = [
2661
+ "PT5M",
2662
+ "PT10M",
2663
+ "PT15M",
2664
+ "PT1H",
2665
+ "P1D",
2666
+ "P1W",
2667
+ "P1M",
2668
+ "P1Y"
2669
+ ];
2670
+
2416
2671
  // src/errors.ts
2417
2672
  var TurnstileChallengeError = class extends Error {
2418
2673
  constructor(siteKey) {
@@ -2624,6 +2879,9 @@ export {
2624
2879
  MatchStatus,
2625
2880
  MatchType,
2626
2881
  OrderStatus,
2882
+ OrderType,
2883
+ RECURRENCE_CADENCES,
2884
+ TimeInForce,
2627
2885
  TradeSide,
2628
2886
  TurnstileChallengeError,
2629
2887
  VENUES,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agg-build/sdk",
3
- "version": "1.2.13",
3
+ "version": "2.0.0",
4
4
  "description": "Vanilla TypeScript client for the AGG prediction market aggregator (auth, markets, orderbooks, charts, trading, managed execution, WebSockets). Works in browsers, Node.js, and React Native.",
5
5
  "sideEffects": false,
6
6
  "license": "MIT",