@sensiblestats/widget-react 0.68.0 → 0.69.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.cjs CHANGED
@@ -72,6 +72,12 @@ var STRINGS = {
72
72
  showMore: (n) => `Show ${n} more`,
73
73
  oddsLabel: "Odds",
74
74
  liveLabel: "Live",
75
+ liveCard: {
76
+ stale: (time) => `Prices from ${time}`,
77
+ suspended: "Market suspended",
78
+ noPrice: "No live price available",
79
+ fullTime: "Full time"
80
+ },
75
81
  yourMarketTag: "Your market",
76
82
  marketFloorLabel: "Market price \xB7 not a value pick",
77
83
  addToSlip: "Add to slip",
@@ -372,6 +378,12 @@ var STRINGS = {
372
378
  showMore: (n) => `${n} tane daha g\xF6ster`,
373
379
  oddsLabel: "Oran",
374
380
  liveLabel: "Canl\u0131",
381
+ liveCard: {
382
+ stale: (time) => `${time} itibar\u0131yla fiyatlar`,
383
+ suspended: "Market ask\u0131ya al\u0131nd\u0131",
384
+ noPrice: "Canl\u0131 fiyat mevcut de\u011Fil",
385
+ fullTime: "Ma\xE7 bitti"
386
+ },
375
387
  yourMarketTag: "\u0130lgilendi\u011Fin bahis",
376
388
  marketFloorLabel: "Piyasa oran\u0131 \xB7 de\u011Fer bahsi de\u011Fil",
377
389
  addToSlip: "Kupona ekle",
@@ -673,6 +685,7 @@ function normalizeUi(cfg) {
673
685
  accent: cfg.accent,
674
686
  logoUrl: cfg.logoUrl,
675
687
  headerTitle: cfg.headerTitle,
688
+ locale: cfg.locale ?? "en",
676
689
  rawBettingLabels: isEnglishLocale(cfg.locale),
677
690
  cta: cfg.cta,
678
691
  surface: cfg.surface,
@@ -779,7 +792,8 @@ function normalizeUi(cfg) {
779
792
  gamePlay: strings.gamePlay,
780
793
  gameLocked: strings.gameLocked,
781
794
  gameVoided: strings.gameVoided,
782
- games: strings.games
795
+ games: strings.games,
796
+ liveCard: strings.liveCard
783
797
  };
784
798
  }
785
799
  function toClientOptions(cfg) {
@@ -791,115 +805,456 @@ function toUserContext(cfg) {
791
805
  return cfg.userContext && Object.keys(cfg.userContext).length > 0 ? cfg.userContext : void 0;
792
806
  }
793
807
 
794
- // src/slip.ts
795
- var ADD_TO_SLIP_TIMEOUT_MS = 1e4;
796
- var MAX_SELECTION = 64;
797
- var MAX_LINE = 32;
798
- var MAX_ODDS = 1e4;
799
- function slipPickFields(selection, label, line) {
800
- const fields = {};
801
- if (Number.isSafeInteger(selection.matchId) && selection.matchId > 0) fields.matchId = selection.matchId;
802
- if (label && label.trim() && label.length <= MAX_SELECTION) fields.selection = label;
803
- if (line && line.trim() && line.length <= MAX_LINE) fields.line = line;
804
- const odds = selection.oddsDecimal;
805
- if (Number.isFinite(odds) && odds > 1 && odds <= MAX_ODDS) fields.odds = odds;
806
- return fields;
807
- }
808
- function chipSelection(market, matchId, conversationId) {
809
- if (!market || !market.addToSlipEnabled || typeof market.matchOddsId !== "number" || typeof market.price !== "number") return null;
810
- const selection = { matchOddsId: market.matchOddsId, matchId, oddsDecimal: market.price };
811
- if (conversationId !== void 0) selection.conversationId = conversationId;
812
- return selection;
808
+ // src/chart.ts
809
+ var CHART_VIEW_W = 320;
810
+ var CHART_VIEW_H = 140;
811
+ var PLOT_X0 = 40;
812
+ var PLOT_X1 = 312;
813
+ var PLOT_Y0 = 10;
814
+ var PLOT_Y1 = 110;
815
+ var MARKER_MAX_POINTS = 8;
816
+ var FLAT_DOMAIN_PAD = 0.05;
817
+ var round2 = (n) => Math.round(n * 100) / 100;
818
+ function projectSeries(samples) {
819
+ if (samples.length < 2) return null;
820
+ const tMin = samples[0].atMs;
821
+ const tMax = samples[samples.length - 1].atMs;
822
+ if (tMax <= tMin) return null;
823
+ const prices = samples.map((s) => s.price);
824
+ const pMin = Math.min(...prices);
825
+ const pMax = Math.max(...prices);
826
+ let yMin;
827
+ let yMax;
828
+ if (pMax === pMin) {
829
+ yMin = pMin - FLAT_DOMAIN_PAD;
830
+ yMax = pMax + FLAT_DOMAIN_PAD;
831
+ } else {
832
+ const pad = (pMax - pMin) * 0.1;
833
+ yMin = pMin - pad;
834
+ yMax = pMax + pad;
835
+ }
836
+ const x = (atMs) => round2(PLOT_X0 + (atMs - tMin) / (tMax - tMin) * (PLOT_X1 - PLOT_X0));
837
+ const y = (price) => round2(PLOT_Y1 - (price - yMin) / (yMax - yMin) * (PLOT_Y1 - PLOT_Y0));
838
+ const projected = samples.map((s) => ({ x: x(s.atMs), y: y(s.price) }));
839
+ const path = projected.map((p, i) => `${i === 0 ? "M" : "L"}${p.x} ${p.y}`).join(" ");
840
+ return {
841
+ path,
842
+ markers: samples.length <= MARKER_MAX_POINTS ? projected : [],
843
+ // The real extremes, never the padded bounds: a gridline label is a price, and the padded
844
+ // bounds are prices nobody was ever offered. A flat series has one real extreme, not two —
845
+ // two identical gridlines would collide on both React key and rendered text.
846
+ gridlines: pMax === pMin ? [{ y: y(pMax), price: pMax }] : [
847
+ { y: y(pMax), price: pMax },
848
+ { y: y(pMin), price: pMin }
849
+ ],
850
+ viewBox: `0 0 ${CHART_VIEW_W} ${CHART_VIEW_H}`,
851
+ startMs: tMin,
852
+ endMs: tMax
853
+ };
813
854
  }
814
- function wasAdded(result) {
815
- if (!result) return true;
816
- if (result.status === "price_changed") return result.accepted;
817
- return result.status === "added";
855
+
856
+ // src/model.ts
857
+ function str(v) {
858
+ return typeof v === "string" && v.length > 0 ? v : void 0;
818
859
  }
819
- function isTerminal(result) {
820
- if (!result) return true;
821
- if (result.status === "price_changed") return result.accepted;
822
- return result.status === "added" || result.status === "duplicate";
860
+ function num(v) {
861
+ return typeof v === "number" && Number.isFinite(v) ? String(v) : void 0;
823
862
  }
824
- function slipOutcome(result) {
825
- if (!result) return "added";
826
- switch (result.status) {
827
- case "added":
828
- case "duplicate":
829
- return result.status;
830
- case "price_changed":
831
- return result.accepted ? "added" : "price_changed";
832
- case "rejected":
833
- return result.reason;
863
+ function readStatCells(raw) {
864
+ if (!Array.isArray(raw)) return [];
865
+ const cells = [];
866
+ for (const entry of raw) {
867
+ const label = str(entry.label);
868
+ const value = num(entry.value) ?? str(entry.value);
869
+ if (label !== void 0 && value !== void 0) cells.push({ label, value });
834
870
  }
871
+ return cells;
835
872
  }
836
- function resultToToast(result, shownOdds, ui) {
837
- if (!result) return { kind: "success", text: ui.slipAdded };
838
- switch (result.status) {
839
- case "added":
840
- return { kind: "success", text: ui.slipAdded };
841
- case "duplicate":
842
- return { kind: "success", text: ui.slipDuplicate };
843
- case "price_changed":
844
- return result.accepted ? { kind: "success", text: ui.slipPriceChanged(shownOdds, result.newOddsDecimal.toFixed(2)) } : { kind: "error", text: ui.slipPriceNotAccepted(shownOdds, result.newOddsDecimal.toFixed(2)) };
845
- case "rejected":
846
- if (result.reason === "login_required") return { kind: "error", text: ui.slipLoginRequired };
847
- if (result.reason === "suspended") return { kind: "error", text: ui.slipSuspended };
848
- return { kind: "error", text: result.message ?? ui.slipFailed };
849
- }
873
+ function toCardVM(card) {
874
+ const entityType = str(card.entityType)?.toLowerCase();
875
+ const kind = entityType === "player" ? "player" : entityType === "team" ? "team" : "generic";
876
+ const scopes = Array.isArray(card.scopes) ? card.scopes.map((s) => {
877
+ const label = str(s.label);
878
+ if (!label) return null;
879
+ return {
880
+ competitionId: typeof s.competitionId === "number" ? s.competitionId : null,
881
+ label,
882
+ image: str(s.imagePath),
883
+ stats: readStatCells(s.stats)
884
+ };
885
+ }).filter((s) => s !== null) : [];
886
+ return {
887
+ id: String(card.entityId),
888
+ kind,
889
+ name: card.canonicalName,
890
+ image: str(card.imagePath) ?? str(card.imageUrl) ?? str(card.image_url) ?? str(card.logoUrl) ?? str(card.logo),
891
+ sub: str(card.subtitle) ?? str(card.teamName) ?? str(card.leagueName) ?? str(card.position),
892
+ season: str(card.seasonName),
893
+ scopes
894
+ };
850
895
  }
851
-
852
- // src/useHostEvents.ts
853
- var import_react40 = require("react");
854
-
855
- // src/components/ChatPanel.tsx
856
- var import_react39 = require("react");
857
-
858
- // src/components/ChatHeader.tsx
859
- var import_react2 = require("react");
860
-
861
- // src/assets/logo.ts
862
- var SS_LOGO_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAYAAAAuSOLAAAAAAXNSR0IArs4c6QAAAJplWElmTU0AKgAAAAgAAwESAAMAAAABAAEAAAExAAIAAAA9AAAAModpAAQAAAABAAAAcAAAAABBZG9iZSBQaG90b3Nob3AgMjYuMTAgKDIwMjUwNzMwLm0uMzE2NiAwN2IxMjM0KSAgKE1hY2ludG9zaCkAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAI6oAMABAAAAAEAAAI6AAAAACwGtVwAAAQwaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6QzBGRTM5NjM5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6QzBGRTM5NjI5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0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";
863
-
864
- // src/components/Icons.tsx
865
- var import_jsx_runtime = require("react/jsx-runtime");
866
- function SsMark({ className }) {
867
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", { className, src: SS_LOGO_DATA_URI, alt: "", "aria-hidden": "true" });
896
+ function toActionVM(action) {
897
+ const label = str(action.actionLabel) ?? str(action.label) ?? str(action.text) ?? str(action.title) ?? "Continue";
898
+ const actionId = str(action.actionId) ?? str(action.id);
899
+ const actionRef = str(action.actionRef);
900
+ const message = str(action.actionValue) ?? str(action.message) ?? str(action.query) ?? label;
901
+ return { label, actionId, actionRef, message };
868
902
  }
869
- function SendIcon() {
870
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: "currentColor", d: "M3 20l18-8L3 4v6l12 2-12 2z" }) });
903
+ function toChipVM(intent) {
904
+ const text = str(intent.text) ?? str(intent.label) ?? str(intent.title);
905
+ return text ? { text } : null;
871
906
  }
872
- function CloseIcon() {
873
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: "none", d: "M18 6L6 18M6 6l12 12", stroke: "currentColor", strokeWidth: "2" }) });
907
+ function chipFromText(text) {
908
+ return { text };
874
909
  }
875
- function ChevronIcon() {
876
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) });
910
+ function joinSelection(label, line) {
911
+ if (label && line && label.includes(line)) return label;
912
+ return [label, line].filter(Boolean).join(" ") || void 0;
877
913
  }
878
- function KebabIcon() {
879
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("g", { fill: "currentColor", children: [
880
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "5", r: "1.6" }),
881
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "1.6" }),
882
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "19", r: "1.6" })
883
- ] }) });
914
+ function toInsightVM(insight) {
915
+ const market = str(insight.marketLabel) ?? str(insight.marketDeveloperName) ?? "";
916
+ const selectionLabel = str(insight.selectionLabel);
917
+ const selectionLine = str(insight.line);
918
+ const selection = joinSelection(selectionLabel, selectionLine);
919
+ const value = insight.odds?.value;
920
+ const odds = typeof value === "number" && Number.isFinite(value) ? value.toFixed(2) : void 0;
921
+ const oddsValue = insight.odds?.value;
922
+ const matchOddsId = typeof insight.odds?.matchOddsId === "number" ? insight.odds.matchOddsId : void 0;
923
+ const home = str(insight.homeTeamName);
924
+ const away = str(insight.awayTeamName);
925
+ const fixture = home && away ? `${home} vs ${away}` : void 0;
926
+ const competition = str(insight.competitionName);
927
+ const previousValue = insight.odds?.previousValue;
928
+ const previous = typeof previousValue === "number" && Number.isFinite(previousValue) ? previousValue : void 0;
929
+ const direction = insight.odds?.movementDirection === "shortened" || insight.odds?.movementDirection === "drifted" ? insight.odds.movementDirection : void 0;
930
+ return {
931
+ id: str(insight.insightId) ?? `${str(insight.ruleId) ?? "insight"}:${num(insight.matchId) ?? ""}`,
932
+ market,
933
+ selection,
934
+ odds,
935
+ // The wire payload carries bookmakerId (not a name); render a name only if one is present.
936
+ bookmaker: str(insight.odds?.bookmakerName),
937
+ isLive: insight.odds?.isLive === true,
938
+ phase: str(insight.phase),
939
+ fixture,
940
+ competition,
941
+ text: str(insight.text) ?? "",
942
+ disclaimer: str(insight.disclaimer),
943
+ matchId: typeof insight.matchId === "number" ? insight.matchId : 0,
944
+ matchOddsId,
945
+ marketDeveloperName: str(insight.marketDeveloperName),
946
+ selectionLabel: str(insight.selectionLabel),
947
+ line: str(insight.line),
948
+ addToSlipEnabled: insight.addToSlipEnabled === true,
949
+ pinEnabled: insight.pinEnabled === true,
950
+ isMarketFloor: insight.isMarketFloor === true,
951
+ oddsDecimal: typeof oddsValue === "number" && Number.isFinite(oddsValue) ? oddsValue : void 0,
952
+ quotedAtUtc: str(insight.odds?.quotedAtUtc),
953
+ previousOdds: previous !== void 0 && direction !== void 0 ? previous.toFixed(2) : void 0,
954
+ movementDirection: previous !== void 0 && direction !== void 0 ? direction : void 0,
955
+ homeTeamName: home,
956
+ awayTeamName: away,
957
+ homeCrest: str(insight.homeTeamImagePath),
958
+ awayCrest: str(insight.awayTeamImagePath),
959
+ competitionCrest: str(insight.competitionImagePath),
960
+ kickoffUtc: str(insight.kickoffUtc),
961
+ kickoffLabel: str(insight.kickoffLabel)
962
+ };
884
963
  }
885
- var DASHBOARD_EMOJI = {
886
- football: "\u26BD",
887
- "goal-net": "\u{1F945}",
888
- btts: "\u{1F91D}",
889
- card: "\u{1F7E8}",
890
- "corner-flag": "\u{1F6A9}",
891
- player: "\u{1F464}",
892
- target: "\u{1F3AF}",
893
- trophy: "\u{1F3C6}",
894
- "chart-line": "\u{1F4C8}",
895
- "chart-bar": "\u{1F4CA}",
896
- chat: "\u{1F4AC}",
897
- fire: "\u{1F525}",
898
- sparkle: "\u2728"
899
- };
900
- function DashboardIcon({ name }) {
901
- const glyph = Object.prototype.hasOwnProperty.call(DASHBOARD_EMOJI, name) ? DASHBOARD_EMOJI[name] : DASHBOARD_EMOJI.target;
902
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "ss-w-dash-emoji", "aria-hidden": "true", children: glyph });
964
+ function toSlipSelection(vm, conversationId) {
965
+ if (vm.matchOddsId === void 0 || vm.oddsDecimal === void 0) return null;
966
+ const selection = {
967
+ matchOddsId: vm.matchOddsId,
968
+ matchId: vm.matchId,
969
+ oddsDecimal: vm.oddsDecimal
970
+ };
971
+ if (vm.quotedAtUtc !== void 0) selection.quotedAtUtc = vm.quotedAtUtc;
972
+ if (vm.id !== void 0) selection.insightId = vm.id;
973
+ if (conversationId !== void 0) selection.conversationId = conversationId;
974
+ return selection;
975
+ }
976
+ function toMarketOddsVM(card) {
977
+ const rows = Array.isArray(card.rows) ? card.rows : [];
978
+ const toRow = (r, i) => {
979
+ const selection = joinSelection(str(r.selectionLabel), str(r.line)) ?? "";
980
+ const price = typeof r.price === "number" && Number.isFinite(r.price) ? r.price : void 0;
981
+ const previous = typeof r.previousPrice === "number" && Number.isFinite(r.previousPrice) ? r.previousPrice : void 0;
982
+ const direction = r.movementDirection === "shortened" || r.movementDirection === "drifted" ? r.movementDirection : void 0;
983
+ return {
984
+ key: `${selection}:${str(r.line) ?? ""}:${i}`,
985
+ selection,
986
+ selectionLabel: str(r.selectionLabel),
987
+ line: str(r.line),
988
+ odds: price !== void 0 ? price.toFixed(2) : "",
989
+ oddsDecimal: price,
990
+ matchOddsId: typeof r.matchOddsId === "number" ? r.matchOddsId : void 0,
991
+ quotedAtUtc: str(r.quotedAtUtc),
992
+ isMain: r.isMainLine !== false,
993
+ // === true, not !== false: a server that has not shipped the field yet leaves it undefined,
994
+ // and undefined must read as open rather than hiding every price on the card.
995
+ isSuspended: r.isSuspended === true,
996
+ previousOdds: previous !== void 0 && direction !== void 0 ? previous.toFixed(2) : void 0,
997
+ movementDirection: previous !== void 0 && direction !== void 0 ? direction : void 0
998
+ };
999
+ };
1000
+ const vms = rows.map(toRow).filter((r) => r.selection && r.odds && !r.isSuspended);
1001
+ const home = str(card.homeTeamName);
1002
+ const away = str(card.awayTeamName);
1003
+ const updated = rows.map((r) => str(r.quotedAtUtc)).filter((v) => !!v).sort();
1004
+ return {
1005
+ id: `${typeof card.matchId === "number" ? card.matchId : 0}:${str(card.marketDeveloperName) ?? ""}`,
1006
+ market: str(card.marketLabel) ?? str(card.marketDeveloperName) ?? "",
1007
+ fixture: home && away ? `${home} vs ${away}` : void 0,
1008
+ homeTeamName: home,
1009
+ awayTeamName: away,
1010
+ homeCrest: str(card.homeTeamImagePath),
1011
+ awayCrest: str(card.awayTeamImagePath),
1012
+ competitionCrest: str(card.competitionImagePath),
1013
+ competition: str(card.competitionName),
1014
+ kickoffUtc: str(card.kickoffUtc),
1015
+ kickoffLabel: str(card.kickoffLabel),
1016
+ bookmaker: rows.map((r) => str(r.bookmakerName)).find(Boolean),
1017
+ updatedAt: updated.length > 0 ? updated[updated.length - 1] : void 0,
1018
+ isLive: rows.some((r) => r.isLive === true),
1019
+ matchId: typeof card.matchId === "number" ? card.matchId : 0,
1020
+ mainRows: vms.filter((r) => r.isMain),
1021
+ moreRows: vms.filter((r) => !r.isMain),
1022
+ disclaimer: str(card.disclaimer),
1023
+ addToSlipEnabled: card.addToSlipEnabled === true,
1024
+ marketDeveloperName: str(card.marketDeveloperName),
1025
+ mainLine: str(card.mainLine),
1026
+ pinEnabled: card.pinEnabled === true,
1027
+ statText: card.insight && typeof card.insight === "object" ? str(card.insight.text) : void 0,
1028
+ tag: card.tag === "your_market" ? "your_market" : void 0,
1029
+ live: card.live ?? null
1030
+ };
1031
+ }
1032
+ function toOddsMovementVM(card) {
1033
+ const raw = Array.isArray(card.points) ? card.points : [];
1034
+ const samples = [];
1035
+ for (const p of raw) {
1036
+ const price = typeof p.price === "number" && Number.isFinite(p.price) ? p.price : void 0;
1037
+ const atMs = typeof p.atUtc === "string" ? Date.parse(p.atUtc) : NaN;
1038
+ if (price === void 0 || Number.isNaN(atMs)) continue;
1039
+ samples.push({ atMs, price });
1040
+ }
1041
+ samples.sort((a, b) => a.atMs - b.atMs);
1042
+ const asNumber = (v) => typeof v === "number" && Number.isFinite(v) ? v : void 0;
1043
+ const opening = asNumber(card.openingPrice);
1044
+ const current = asNumber(card.currentPrice);
1045
+ const home = str(card.homeTeamName);
1046
+ const away = str(card.awayTeamName);
1047
+ const selection = joinSelection(str(card.selectionLabel), str(card.line)) ?? "";
1048
+ const bookmakerId = typeof card.bookmakerId === "number" ? card.bookmakerId : "";
1049
+ return {
1050
+ id: `${typeof card.matchId === "number" ? card.matchId : 0}:${str(card.marketDeveloperName) ?? ""}:${selection}:${bookmakerId}`,
1051
+ matchId: typeof card.matchId === "number" ? card.matchId : 0,
1052
+ market: str(card.marketLabel) ?? str(card.marketDeveloperName) ?? "",
1053
+ marketDeveloperName: str(card.marketDeveloperName),
1054
+ selection,
1055
+ selectionLabel: str(card.selectionLabel),
1056
+ line: str(card.line),
1057
+ fixture: home && away ? `${home} vs ${away}` : void 0,
1058
+ competition: str(card.competitionName),
1059
+ bookmaker: str(card.bookmakerName),
1060
+ opening: opening !== void 0 ? opening.toFixed(2) : "",
1061
+ current: current !== void 0 ? current.toFixed(2) : "",
1062
+ direction: card.movementDirection === "shortened" || card.movementDirection === "drifted" ? card.movementDirection : void 0,
1063
+ windowHours: asNumber(card.windowHours) ?? 0,
1064
+ excludedCount: asNumber(card.excludedSuspendedCount) ?? 0,
1065
+ isSuspended: card.isSuspended === true,
1066
+ disclaimer: str(card.disclaimer),
1067
+ geometry: projectSeries(samples),
1068
+ observationCount: samples.length,
1069
+ pinEnabled: card.pinEnabled === true,
1070
+ matchOddsId: typeof card.matchOddsId === "number" ? card.matchOddsId : void 0
1071
+ };
1072
+ }
1073
+ function marketOddsRowToSlipSelection(vm, row, conversationId) {
1074
+ if (row.matchOddsId === void 0 || row.oddsDecimal === void 0) return null;
1075
+ const selection = { matchOddsId: row.matchOddsId, matchId: vm.matchId, oddsDecimal: row.oddsDecimal };
1076
+ if (row.quotedAtUtc !== void 0) selection.quotedAtUtc = row.quotedAtUtc;
1077
+ if (conversationId !== void 0) selection.conversationId = conversationId;
1078
+ return selection;
1079
+ }
1080
+ function finite(v) {
1081
+ return typeof v === "number" && Number.isFinite(v) ? v : void 0;
1082
+ }
1083
+ function toComboLegVM(leg) {
1084
+ if (!leg || typeof leg !== "object") return null;
1085
+ const price = finite(leg.price);
1086
+ const matchOddsId = finite(leg.matchOddsId);
1087
+ const matchId = finite(leg.matchId);
1088
+ const home = str(leg.homeTeamName);
1089
+ const away = str(leg.awayTeamName);
1090
+ const selectionLabel = str(leg.selectionLabel);
1091
+ const insight = leg.insight && typeof leg.insight === "object" ? leg.insight : void 0;
1092
+ const insightId = str(insight?.insightId);
1093
+ const statText = str(insight?.text);
1094
+ if (price === void 0 || matchOddsId === void 0 || matchId === void 0 || !home || !away || !selectionLabel || !insightId || !statText) return null;
1095
+ const line = str(leg.line);
1096
+ return {
1097
+ key: `${matchOddsId}`,
1098
+ matchId,
1099
+ homeTeamName: home,
1100
+ awayTeamName: away,
1101
+ homeCrest: str(leg.homeTeamImagePath),
1102
+ awayCrest: str(leg.awayTeamImagePath),
1103
+ competition: str(leg.competitionName),
1104
+ kickoffUtc: str(leg.kickoffUtc),
1105
+ kickoffLabel: str(leg.kickoffLabel),
1106
+ market: str(leg.marketLabel) ?? str(leg.marketDeveloperName) ?? "",
1107
+ marketDeveloperName: str(leg.marketDeveloperName) ?? "",
1108
+ selection: joinSelection(selectionLabel, line) ?? selectionLabel,
1109
+ selectionLabel,
1110
+ line,
1111
+ odds: price.toFixed(2),
1112
+ oddsDecimal: price,
1113
+ matchOddsId,
1114
+ quotedAtUtc: str(leg.quotedAtUtc),
1115
+ insightId,
1116
+ statText
1117
+ };
1118
+ }
1119
+ function toComboCardVM(card) {
1120
+ const rawLegs = Array.isArray(card?.legs) ? card.legs : [];
1121
+ const multiplication = str(card?.multiplication);
1122
+ if (rawLegs.length < 2 || !multiplication) return null;
1123
+ const legs = [];
1124
+ for (const raw of rawLegs) {
1125
+ const vm = toComboLegVM(raw);
1126
+ if (!vm) return null;
1127
+ legs.push(vm);
1128
+ }
1129
+ return {
1130
+ id: str(card.comboId) ?? legs.map((l) => l.matchOddsId).join("-"),
1131
+ legs,
1132
+ multiplication,
1133
+ replacedNote: str(card.replacedNote),
1134
+ addToSlipEnabled: card.addToSlipEnabled === true
1135
+ };
1136
+ }
1137
+ function comboLegToSlipSelection(leg, conversationId) {
1138
+ const selection = {
1139
+ matchOddsId: leg.matchOddsId,
1140
+ matchId: leg.matchId,
1141
+ oddsDecimal: leg.oddsDecimal,
1142
+ insightId: leg.insightId
1143
+ };
1144
+ if (leg.quotedAtUtc !== void 0) selection.quotedAtUtc = leg.quotedAtUtc;
1145
+ if (conversationId !== void 0) selection.conversationId = conversationId;
1146
+ return selection;
1147
+ }
1148
+
1149
+ // src/slip.ts
1150
+ var ADD_TO_SLIP_TIMEOUT_MS = 1e4;
1151
+ var MAX_SELECTION = 64;
1152
+ var MAX_LINE = 32;
1153
+ var MAX_ODDS = 1e4;
1154
+ function slipPickFields(selection, label, line) {
1155
+ const fields = {};
1156
+ if (Number.isSafeInteger(selection.matchId) && selection.matchId > 0) fields.matchId = selection.matchId;
1157
+ if (label && label.trim() && label.length <= MAX_SELECTION) fields.selection = label;
1158
+ if (line && line.trim() && line.length <= MAX_LINE) fields.line = line;
1159
+ const odds = selection.oddsDecimal;
1160
+ if (Number.isFinite(odds) && odds > 1 && odds <= MAX_ODDS) fields.odds = odds;
1161
+ return fields;
1162
+ }
1163
+ function chipSelection(market, matchId, conversationId) {
1164
+ if (!market || !market.addToSlipEnabled || typeof market.matchOddsId !== "number" || typeof market.price !== "number") return null;
1165
+ const selection = { matchOddsId: market.matchOddsId, matchId, oddsDecimal: market.price };
1166
+ if (conversationId !== void 0) selection.conversationId = conversationId;
1167
+ return selection;
1168
+ }
1169
+ function wasAdded(result) {
1170
+ if (!result) return true;
1171
+ if (result.status === "price_changed") return result.accepted;
1172
+ return result.status === "added";
1173
+ }
1174
+ function isTerminal(result) {
1175
+ if (!result) return true;
1176
+ if (result.status === "price_changed") return result.accepted;
1177
+ return result.status === "added" || result.status === "duplicate";
1178
+ }
1179
+ function slipOutcome(result) {
1180
+ if (!result) return "added";
1181
+ switch (result.status) {
1182
+ case "added":
1183
+ case "duplicate":
1184
+ return result.status;
1185
+ case "price_changed":
1186
+ return result.accepted ? "added" : "price_changed";
1187
+ case "rejected":
1188
+ return result.reason;
1189
+ }
1190
+ }
1191
+ function resultToToast(result, shownOdds, ui) {
1192
+ if (!result) return { kind: "success", text: ui.slipAdded };
1193
+ switch (result.status) {
1194
+ case "added":
1195
+ return { kind: "success", text: ui.slipAdded };
1196
+ case "duplicate":
1197
+ return { kind: "success", text: ui.slipDuplicate };
1198
+ case "price_changed":
1199
+ return result.accepted ? { kind: "success", text: ui.slipPriceChanged(shownOdds, result.newOddsDecimal.toFixed(2)) } : { kind: "error", text: ui.slipPriceNotAccepted(shownOdds, result.newOddsDecimal.toFixed(2)) };
1200
+ case "rejected":
1201
+ if (result.reason === "login_required") return { kind: "error", text: ui.slipLoginRequired };
1202
+ if (result.reason === "suspended") return { kind: "error", text: ui.slipSuspended };
1203
+ return { kind: "error", text: result.message ?? ui.slipFailed };
1204
+ }
1205
+ }
1206
+
1207
+ // src/useHostEvents.ts
1208
+ var import_react40 = require("react");
1209
+
1210
+ // src/components/ChatPanel.tsx
1211
+ var import_react39 = require("react");
1212
+
1213
+ // src/components/ChatHeader.tsx
1214
+ var import_react2 = require("react");
1215
+
1216
+ // src/assets/logo.ts
1217
+ var SS_LOGO_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAYAAAAuSOLAAAAAAXNSR0IArs4c6QAAAJplWElmTU0AKgAAAAgAAwESAAMAAAABAAEAAAExAAIAAAA9AAAAModpAAQAAAABAAAAcAAAAABBZG9iZSBQaG90b3Nob3AgMjYuMTAgKDIwMjUwNzMwLm0uMzE2NiAwN2IxMjM0KSAgKE1hY2ludG9zaCkAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAI6oAMABAAAAAEAAAI6AAAAACwGtVwAAAQwaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6QzBGRTM5NjM5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6QzBGRTM5NjI5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0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";
1218
+
1219
+ // src/components/Icons.tsx
1220
+ var import_jsx_runtime = require("react/jsx-runtime");
1221
+ function SsMark({ className }) {
1222
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", { className, src: SS_LOGO_DATA_URI, alt: "", "aria-hidden": "true" });
1223
+ }
1224
+ function SendIcon() {
1225
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: "currentColor", d: "M3 20l18-8L3 4v6l12 2-12 2z" }) });
1226
+ }
1227
+ function CloseIcon() {
1228
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: "none", d: "M18 6L6 18M6 6l12 12", stroke: "currentColor", strokeWidth: "2" }) });
1229
+ }
1230
+ function ChevronIcon() {
1231
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) });
1232
+ }
1233
+ function KebabIcon() {
1234
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("g", { fill: "currentColor", children: [
1235
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "5", r: "1.6" }),
1236
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "1.6" }),
1237
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "19", r: "1.6" })
1238
+ ] }) });
1239
+ }
1240
+ var DASHBOARD_EMOJI = {
1241
+ football: "\u26BD",
1242
+ "goal-net": "\u{1F945}",
1243
+ btts: "\u{1F91D}",
1244
+ card: "\u{1F7E8}",
1245
+ "corner-flag": "\u{1F6A9}",
1246
+ player: "\u{1F464}",
1247
+ target: "\u{1F3AF}",
1248
+ trophy: "\u{1F3C6}",
1249
+ "chart-line": "\u{1F4C8}",
1250
+ "chart-bar": "\u{1F4CA}",
1251
+ chat: "\u{1F4AC}",
1252
+ fire: "\u{1F525}",
1253
+ sparkle: "\u2728"
1254
+ };
1255
+ function DashboardIcon({ name }) {
1256
+ const glyph = Object.prototype.hasOwnProperty.call(DASHBOARD_EMOJI, name) ? DASHBOARD_EMOJI[name] : DASHBOARD_EMOJI.target;
1257
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "ss-w-dash-emoji", "aria-hidden": "true", children: glyph });
903
1258
  }
904
1259
 
905
1260
  // src/components/BrandMark.tsx
@@ -976,523 +1331,183 @@ function ChatHeader({
976
1331
  type: "button",
977
1332
  className: "ss-w-menu-item",
978
1333
  role: "menuitem",
979
- ref: firstItemRef,
980
- onClick: runNewConversation,
981
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { children: newConversationLabel })
982
- }
983
- ) }) : null
984
- ] }) : null,
985
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { type: "button", className: "ss-w-close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CloseIcon, {}) })
986
- ] });
987
- }
988
-
989
- // src/components/MessageList.tsx
990
- var import_react21 = require("react");
991
-
992
- // src/presets.ts
993
- var CLIENT_CAPABILITIES = ["price_presets"];
994
- var PRICE_TILE_PREFIX = "goal-preset-";
995
- function isPriceTile(tile) {
996
- const id = tile.signal?.entityId;
997
- return typeof id === "string" && id.startsWith(PRICE_TILE_PREFIX);
998
- }
999
- function tileDisplayText(tile) {
1000
- const subtitle = tile.subtitle?.trim();
1001
- return isPriceTile(tile) && subtitle ? subtitle : tile.title;
1002
- }
1003
- var MAX_BUBBLE_ASKS = 2;
1004
- function bubbleAsks(messages) {
1005
- for (let i = messages.length - 1; i >= 0; i--) {
1006
- const m = messages[i];
1007
- if (!m || m.role !== "assistant" || !m.isGreeting) continue;
1008
- const dashboard = m.greetingDashboard;
1009
- if (!dashboard) return [];
1010
- const asks = [];
1011
- dashboard.tiles.forEach((tile, index) => {
1012
- const label = tile.subtitle?.trim();
1013
- if (asks.length < MAX_BUBBLE_ASKS && isPriceTile(tile) && label) asks.push({ tile, index, position: asks.length, layout: dashboard.layout, label });
1014
- });
1015
- return asks;
1016
- }
1017
- return [];
1018
- }
1019
- function runBubbleAsk(ask, deps) {
1020
- deps.log?.log({ name: "popup_ask_tap", outcome: String(ask.position) });
1021
- deps.open();
1022
- deps.setActiveTab("chat");
1023
- const displayText = tileDisplayText(ask.tile);
1024
- deps.send(ask.tile.actionValue, ask.tile.actionRef ? { actionRef: ask.tile.actionRef, displayText } : { displayText });
1025
- deps.onDashboardTap?.(ask.tile, ask.index, ask.layout);
1026
- }
1027
-
1028
- // src/components/Markdown.tsx
1029
- var import_react_markdown = __toESM(require("react-markdown"), 1);
1030
- var import_remark_gfm = __toESM(require("remark-gfm"), 1);
1031
- var import_jsx_runtime4 = require("react/jsx-runtime");
1032
- var components = {
1033
- a: ({ children, href }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("a", { href, target: "_blank", rel: "noopener noreferrer", className: "ss-w-md-link", children }),
1034
- table: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "ss-w-table-wrap", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("table", { className: "ss-w-md-table", children }) }),
1035
- ul: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("ul", { className: "ss-w-md-ul", children }),
1036
- ol: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("ol", { className: "ss-w-md-ol", children }),
1037
- code: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("code", { className: "ss-w-md-code", children })
1038
- };
1039
- function Markdown({ text }) {
1040
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "ss-w-md", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_markdown.default, { remarkPlugins: [import_remark_gfm.default], components, children: text }) });
1041
- }
1042
-
1043
- // src/components/EntityCardList.tsx
1044
- var import_react3 = require("react");
1045
- var import_jsx_runtime5 = require("react/jsx-runtime");
1046
- var MAX_VISIBLE = 3;
1047
- var RECORD_RE = /^(\d+)-(\d+)-(\d+)$/;
1048
- function initials(name) {
1049
- return name.split(/\s+/).slice(0, 2).map((w) => w[0] ?? "").join("").toUpperCase();
1050
- }
1051
- function shortSeason(season) {
1052
- return season.replace(/\d{4}/g, (year) => year.slice(2));
1053
- }
1054
- function Crest({ image, label }) {
1055
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1056
- "span",
1057
- {
1058
- className: "ss-w-ecard-crest",
1059
- style: { backgroundImage: `url(${image})` },
1060
- ...label ? { role: "img", title: label, "aria-label": label } : { "aria-hidden": "true" }
1061
- }
1062
- );
1063
- }
1064
- function FormBar({ w, d, l }) {
1065
- if (w + d + l === 0) return null;
1066
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "ss-w-form", "aria-hidden": "true", children: [
1067
- w > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-form-w", style: { flexGrow: w } }) : null,
1068
- d > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-form-d", style: { flexGrow: d } }) : null,
1069
- l > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-form-l", style: { flexGrow: l } }) : null
1070
- ] });
1071
- }
1072
- function StatCellView({ s }) {
1073
- const m = RECORD_RE.exec(s.value);
1074
- if (m) {
1075
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-ecard-cell", children: [
1076
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-cval", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(FormBar, { w: Number(m[1]), d: Number(m[2]), l: Number(m[3]) }) }),
1077
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-clabel", children: s.value })
1078
- ] });
1079
- }
1080
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-ecard-cell", children: [
1081
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-cval", children: s.value }),
1082
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-clabel", children: s.label })
1083
- ] });
1084
- }
1085
- function StatStrip({ stats }) {
1086
- if (stats.length === 0) return null;
1087
- const cols = Math.min(stats.length, 4);
1088
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "ss-w-ecard-strip", style: { gridTemplateColumns: `repeat(${cols}, 1fr)` }, children: stats.map((s) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(StatCellView, { s }, s.label + s.value)) });
1089
- }
1090
- function CardHeader({ c, showScopeCrest }) {
1091
- const onlyScope = c.scopes.length === 1 ? c.scopes[0] : null;
1092
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-ecard-hd", children: [
1093
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1094
- "span",
1095
- {
1096
- className: c.kind === "team" ? "ss-w-thumb ss-w-team" : "ss-w-thumb",
1097
- style: c.image ? { backgroundImage: `url(${c.image})` } : void 0,
1098
- children: c.image ? "" : initials(c.name)
1099
- }
1100
- ),
1101
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "ss-w-ecard-idtext", children: [
1102
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-nm", children: c.name }),
1103
- c.sub ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-sub", children: c.sub }) : null
1104
- ] }),
1105
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "ss-w-ecard-meta", children: [
1106
- showScopeCrest && onlyScope?.image ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Crest, { image: onlyScope.image, label: onlyScope.label }) : null,
1107
- c.season ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-season", children: shortSeason(c.season) }) : null
1108
- ] })
1109
- ] });
1110
- }
1111
- function ScopeTabs({ scopes, active, onSelect }) {
1112
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "ss-w-ecard-scopes", role: "tablist", children: scopes.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1113
- "button",
1114
- {
1115
- type: "button",
1116
- role: "tab",
1117
- className: "ss-w-ecard-scope",
1118
- "aria-selected": i === active,
1119
- "aria-label": s.label,
1120
- title: s.label,
1121
- onClick: () => onSelect(i),
1122
- children: s.image ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Crest, { image: s.image }) : s.label
1123
- },
1124
- String(s.competitionId ?? "all")
1125
- )) });
1126
- }
1127
- function EntityCardItem({ c }) {
1128
- const [active, setActive] = (0, import_react3.useState)(0);
1129
- const hasBody = c.scopes.length > 0;
1130
- if (!hasBody) {
1131
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "ss-w-ecard ss-w-ecard-bare", "data-kind": c.kind, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CardHeader, { c, showScopeCrest: false }) });
1132
- }
1133
- const multi = c.scopes.length > 1;
1134
- const scope = c.scopes[multi ? c.scopes[active] ? active : 0 : 0];
1135
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-ecard", "data-kind": c.kind, children: [
1136
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CardHeader, { c, showScopeCrest: !multi }),
1137
- multi ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ScopeTabs, { scopes: c.scopes, active, onSelect: setActive }) : null,
1138
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(StatStrip, { stats: scope.stats })
1139
- ] });
1140
- }
1141
- function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMoreLabel = (n) => `Show ${n} more` }) {
1142
- const [expanded, setExpanded] = (0, import_react3.useState)(false);
1143
- if (cards.length === 0) return null;
1144
- const visible = expanded ? cards : cards.slice(0, MAX_VISIBLE);
1145
- const overflow = cards.length - MAX_VISIBLE;
1146
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-cards", children: [
1147
- visible.map((c) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(EntityCardItem, { c }, c.id)),
1148
- overflow > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "ss-w-cards-more", disabled, onClick: () => setExpanded((v) => !v), children: expanded ? showLessLabel : showMoreLabel(overflow) }) : null
1334
+ ref: firstItemRef,
1335
+ onClick: runNewConversation,
1336
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { children: newConversationLabel })
1337
+ }
1338
+ ) }) : null
1339
+ ] }) : null,
1340
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { type: "button", className: "ss-w-close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CloseIcon, {}) })
1149
1341
  ] });
1150
1342
  }
1151
1343
 
1152
- // src/components/AddToSlipButton.tsx
1153
- var import_react7 = require("react");
1154
- var import_widget_sdk = require("@sensiblestats/widget-sdk");
1155
-
1156
- // src/chart.ts
1157
- var CHART_VIEW_W = 320;
1158
- var CHART_VIEW_H = 140;
1159
- var PLOT_X0 = 40;
1160
- var PLOT_X1 = 312;
1161
- var PLOT_Y0 = 10;
1162
- var PLOT_Y1 = 110;
1163
- var MARKER_MAX_POINTS = 8;
1164
- var FLAT_DOMAIN_PAD = 0.05;
1165
- var round2 = (n) => Math.round(n * 100) / 100;
1166
- function projectSeries(samples) {
1167
- if (samples.length < 2) return null;
1168
- const tMin = samples[0].atMs;
1169
- const tMax = samples[samples.length - 1].atMs;
1170
- if (tMax <= tMin) return null;
1171
- const prices = samples.map((s) => s.price);
1172
- const pMin = Math.min(...prices);
1173
- const pMax = Math.max(...prices);
1174
- let yMin;
1175
- let yMax;
1176
- if (pMax === pMin) {
1177
- yMin = pMin - FLAT_DOMAIN_PAD;
1178
- yMax = pMax + FLAT_DOMAIN_PAD;
1179
- } else {
1180
- const pad = (pMax - pMin) * 0.1;
1181
- yMin = pMin - pad;
1182
- yMax = pMax + pad;
1183
- }
1184
- const x = (atMs) => round2(PLOT_X0 + (atMs - tMin) / (tMax - tMin) * (PLOT_X1 - PLOT_X0));
1185
- const y = (price) => round2(PLOT_Y1 - (price - yMin) / (yMax - yMin) * (PLOT_Y1 - PLOT_Y0));
1186
- const projected = samples.map((s) => ({ x: x(s.atMs), y: y(s.price) }));
1187
- const path = projected.map((p, i) => `${i === 0 ? "M" : "L"}${p.x} ${p.y}`).join(" ");
1188
- return {
1189
- path,
1190
- markers: samples.length <= MARKER_MAX_POINTS ? projected : [],
1191
- // The real extremes, never the padded bounds: a gridline label is a price, and the padded
1192
- // bounds are prices nobody was ever offered. A flat series has one real extreme, not two —
1193
- // two identical gridlines would collide on both React key and rendered text.
1194
- gridlines: pMax === pMin ? [{ y: y(pMax), price: pMax }] : [
1195
- { y: y(pMax), price: pMax },
1196
- { y: y(pMin), price: pMin }
1197
- ],
1198
- viewBox: `0 0 ${CHART_VIEW_W} ${CHART_VIEW_H}`,
1199
- startMs: tMin,
1200
- endMs: tMax
1201
- };
1202
- }
1344
+ // src/components/MessageList.tsx
1345
+ var import_react21 = require("react");
1203
1346
 
1204
- // src/model.ts
1205
- function str(v) {
1206
- return typeof v === "string" && v.length > 0 ? v : void 0;
1347
+ // src/presets.ts
1348
+ var CLIENT_CAPABILITIES = ["price_presets"];
1349
+ var PRICE_TILE_PREFIX = "goal-preset-";
1350
+ function isPriceTile(tile) {
1351
+ const id = tile.signal?.entityId;
1352
+ return typeof id === "string" && id.startsWith(PRICE_TILE_PREFIX);
1207
1353
  }
1208
- function num(v) {
1209
- return typeof v === "number" && Number.isFinite(v) ? String(v) : void 0;
1354
+ function tileDisplayText(tile) {
1355
+ const subtitle = tile.subtitle?.trim();
1356
+ return isPriceTile(tile) && subtitle ? subtitle : tile.title;
1210
1357
  }
1211
- function readStatCells(raw) {
1212
- if (!Array.isArray(raw)) return [];
1213
- const cells = [];
1214
- for (const entry of raw) {
1215
- const label = str(entry.label);
1216
- const value = num(entry.value) ?? str(entry.value);
1217
- if (label !== void 0 && value !== void 0) cells.push({ label, value });
1358
+ var MAX_BUBBLE_ASKS = 2;
1359
+ function bubbleAsks(messages) {
1360
+ for (let i = messages.length - 1; i >= 0; i--) {
1361
+ const m = messages[i];
1362
+ if (!m || m.role !== "assistant" || !m.isGreeting) continue;
1363
+ const dashboard = m.greetingDashboard;
1364
+ if (!dashboard) return [];
1365
+ const asks = [];
1366
+ dashboard.tiles.forEach((tile, index) => {
1367
+ const label = tile.subtitle?.trim();
1368
+ if (asks.length < MAX_BUBBLE_ASKS && isPriceTile(tile) && label) asks.push({ tile, index, position: asks.length, layout: dashboard.layout, label });
1369
+ });
1370
+ return asks;
1218
1371
  }
1219
- return cells;
1220
- }
1221
- function toCardVM(card) {
1222
- const entityType = str(card.entityType)?.toLowerCase();
1223
- const kind = entityType === "player" ? "player" : entityType === "team" ? "team" : "generic";
1224
- const scopes = Array.isArray(card.scopes) ? card.scopes.map((s) => {
1225
- const label = str(s.label);
1226
- if (!label) return null;
1227
- return {
1228
- competitionId: typeof s.competitionId === "number" ? s.competitionId : null,
1229
- label,
1230
- image: str(s.imagePath),
1231
- stats: readStatCells(s.stats)
1232
- };
1233
- }).filter((s) => s !== null) : [];
1234
- return {
1235
- id: String(card.entityId),
1236
- kind,
1237
- name: card.canonicalName,
1238
- image: str(card.imagePath) ?? str(card.imageUrl) ?? str(card.image_url) ?? str(card.logoUrl) ?? str(card.logo),
1239
- sub: str(card.subtitle) ?? str(card.teamName) ?? str(card.leagueName) ?? str(card.position),
1240
- season: str(card.seasonName),
1241
- scopes
1242
- };
1243
- }
1244
- function toActionVM(action) {
1245
- const label = str(action.actionLabel) ?? str(action.label) ?? str(action.text) ?? str(action.title) ?? "Continue";
1246
- const actionId = str(action.actionId) ?? str(action.id);
1247
- const actionRef = str(action.actionRef);
1248
- const message = str(action.actionValue) ?? str(action.message) ?? str(action.query) ?? label;
1249
- return { label, actionId, actionRef, message };
1250
- }
1251
- function toChipVM(intent) {
1252
- const text = str(intent.text) ?? str(intent.label) ?? str(intent.title);
1253
- return text ? { text } : null;
1254
- }
1255
- function chipFromText(text) {
1256
- return { text };
1257
- }
1258
- function joinSelection(label, line) {
1259
- if (label && line && label.includes(line)) return label;
1260
- return [label, line].filter(Boolean).join(" ") || void 0;
1261
- }
1262
- function toInsightVM(insight) {
1263
- const market = str(insight.marketLabel) ?? str(insight.marketDeveloperName) ?? "";
1264
- const selectionLabel = str(insight.selectionLabel);
1265
- const selectionLine = str(insight.line);
1266
- const selection = joinSelection(selectionLabel, selectionLine);
1267
- const value = insight.odds?.value;
1268
- const odds = typeof value === "number" && Number.isFinite(value) ? value.toFixed(2) : void 0;
1269
- const oddsValue = insight.odds?.value;
1270
- const matchOddsId = typeof insight.odds?.matchOddsId === "number" ? insight.odds.matchOddsId : void 0;
1271
- const home = str(insight.homeTeamName);
1272
- const away = str(insight.awayTeamName);
1273
- const fixture = home && away ? `${home} vs ${away}` : void 0;
1274
- const competition = str(insight.competitionName);
1275
- const previousValue = insight.odds?.previousValue;
1276
- const previous = typeof previousValue === "number" && Number.isFinite(previousValue) ? previousValue : void 0;
1277
- const direction = insight.odds?.movementDirection === "shortened" || insight.odds?.movementDirection === "drifted" ? insight.odds.movementDirection : void 0;
1278
- return {
1279
- id: str(insight.insightId) ?? `${str(insight.ruleId) ?? "insight"}:${num(insight.matchId) ?? ""}`,
1280
- market,
1281
- selection,
1282
- odds,
1283
- // The wire payload carries bookmakerId (not a name); render a name only if one is present.
1284
- bookmaker: str(insight.odds?.bookmakerName),
1285
- isLive: insight.odds?.isLive === true,
1286
- phase: str(insight.phase),
1287
- fixture,
1288
- competition,
1289
- text: str(insight.text) ?? "",
1290
- disclaimer: str(insight.disclaimer),
1291
- matchId: typeof insight.matchId === "number" ? insight.matchId : 0,
1292
- matchOddsId,
1293
- marketDeveloperName: str(insight.marketDeveloperName),
1294
- selectionLabel: str(insight.selectionLabel),
1295
- line: str(insight.line),
1296
- addToSlipEnabled: insight.addToSlipEnabled === true,
1297
- pinEnabled: insight.pinEnabled === true,
1298
- isMarketFloor: insight.isMarketFloor === true,
1299
- oddsDecimal: typeof oddsValue === "number" && Number.isFinite(oddsValue) ? oddsValue : void 0,
1300
- quotedAtUtc: str(insight.odds?.quotedAtUtc),
1301
- previousOdds: previous !== void 0 && direction !== void 0 ? previous.toFixed(2) : void 0,
1302
- movementDirection: previous !== void 0 && direction !== void 0 ? direction : void 0,
1303
- homeTeamName: home,
1304
- awayTeamName: away,
1305
- homeCrest: str(insight.homeTeamImagePath),
1306
- awayCrest: str(insight.awayTeamImagePath),
1307
- competitionCrest: str(insight.competitionImagePath),
1308
- kickoffUtc: str(insight.kickoffUtc),
1309
- kickoffLabel: str(insight.kickoffLabel)
1310
- };
1311
- }
1312
- function toSlipSelection(vm, conversationId) {
1313
- if (vm.matchOddsId === void 0 || vm.oddsDecimal === void 0) return null;
1314
- const selection = {
1315
- matchOddsId: vm.matchOddsId,
1316
- matchId: vm.matchId,
1317
- oddsDecimal: vm.oddsDecimal
1318
- };
1319
- if (vm.quotedAtUtc !== void 0) selection.quotedAtUtc = vm.quotedAtUtc;
1320
- if (vm.id !== void 0) selection.insightId = vm.id;
1321
- if (conversationId !== void 0) selection.conversationId = conversationId;
1322
- return selection;
1372
+ return [];
1323
1373
  }
1324
- function toMarketOddsVM(card) {
1325
- const rows = Array.isArray(card.rows) ? card.rows : [];
1326
- const toRow = (r, i) => {
1327
- const selection = joinSelection(str(r.selectionLabel), str(r.line)) ?? "";
1328
- const price = typeof r.price === "number" && Number.isFinite(r.price) ? r.price : void 0;
1329
- const previous = typeof r.previousPrice === "number" && Number.isFinite(r.previousPrice) ? r.previousPrice : void 0;
1330
- const direction = r.movementDirection === "shortened" || r.movementDirection === "drifted" ? r.movementDirection : void 0;
1331
- return {
1332
- key: `${selection}:${str(r.line) ?? ""}:${i}`,
1333
- selection,
1334
- selectionLabel: str(r.selectionLabel),
1335
- line: str(r.line),
1336
- odds: price !== void 0 ? price.toFixed(2) : "",
1337
- oddsDecimal: price,
1338
- matchOddsId: typeof r.matchOddsId === "number" ? r.matchOddsId : void 0,
1339
- quotedAtUtc: str(r.quotedAtUtc),
1340
- isMain: r.isMainLine !== false,
1341
- // === true, not !== false: a server that has not shipped the field yet leaves it undefined,
1342
- // and undefined must read as open rather than hiding every price on the card.
1343
- isSuspended: r.isSuspended === true,
1344
- previousOdds: previous !== void 0 && direction !== void 0 ? previous.toFixed(2) : void 0,
1345
- movementDirection: previous !== void 0 && direction !== void 0 ? direction : void 0
1346
- };
1347
- };
1348
- const vms = rows.map(toRow).filter((r) => r.selection && r.odds && !r.isSuspended);
1349
- const home = str(card.homeTeamName);
1350
- const away = str(card.awayTeamName);
1351
- const updated = rows.map((r) => str(r.quotedAtUtc)).filter((v) => !!v).sort();
1352
- return {
1353
- id: `${typeof card.matchId === "number" ? card.matchId : 0}:${str(card.marketDeveloperName) ?? ""}`,
1354
- market: str(card.marketLabel) ?? str(card.marketDeveloperName) ?? "",
1355
- fixture: home && away ? `${home} vs ${away}` : void 0,
1356
- homeTeamName: home,
1357
- awayTeamName: away,
1358
- homeCrest: str(card.homeTeamImagePath),
1359
- awayCrest: str(card.awayTeamImagePath),
1360
- competitionCrest: str(card.competitionImagePath),
1361
- competition: str(card.competitionName),
1362
- kickoffUtc: str(card.kickoffUtc),
1363
- kickoffLabel: str(card.kickoffLabel),
1364
- bookmaker: rows.map((r) => str(r.bookmakerName)).find(Boolean),
1365
- updatedAt: updated.length > 0 ? updated[updated.length - 1] : void 0,
1366
- isLive: rows.some((r) => r.isLive === true),
1367
- matchId: typeof card.matchId === "number" ? card.matchId : 0,
1368
- mainRows: vms.filter((r) => r.isMain),
1369
- moreRows: vms.filter((r) => !r.isMain),
1370
- disclaimer: str(card.disclaimer),
1371
- addToSlipEnabled: card.addToSlipEnabled === true,
1372
- marketDeveloperName: str(card.marketDeveloperName),
1373
- mainLine: str(card.mainLine),
1374
- pinEnabled: card.pinEnabled === true,
1375
- statText: card.insight && typeof card.insight === "object" ? str(card.insight.text) : void 0,
1376
- tag: card.tag === "your_market" ? "your_market" : void 0
1377
- };
1374
+ function runBubbleAsk(ask, deps) {
1375
+ deps.log?.log({ name: "popup_ask_tap", outcome: String(ask.position) });
1376
+ deps.open();
1377
+ deps.setActiveTab("chat");
1378
+ const displayText = tileDisplayText(ask.tile);
1379
+ deps.send(ask.tile.actionValue, ask.tile.actionRef ? { actionRef: ask.tile.actionRef, displayText } : { displayText });
1380
+ deps.onDashboardTap?.(ask.tile, ask.index, ask.layout);
1378
1381
  }
1379
- function toOddsMovementVM(card) {
1380
- const raw = Array.isArray(card.points) ? card.points : [];
1381
- const samples = [];
1382
- for (const p of raw) {
1383
- const price = typeof p.price === "number" && Number.isFinite(p.price) ? p.price : void 0;
1384
- const atMs = typeof p.atUtc === "string" ? Date.parse(p.atUtc) : NaN;
1385
- if (price === void 0 || Number.isNaN(atMs)) continue;
1386
- samples.push({ atMs, price });
1382
+
1383
+ // src/components/Markdown.tsx
1384
+ var import_react_markdown = __toESM(require("react-markdown"), 1);
1385
+ var import_remark_gfm = __toESM(require("remark-gfm"), 1);
1386
+ var import_jsx_runtime4 = require("react/jsx-runtime");
1387
+ var components = {
1388
+ a: ({ children, href }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("a", { href, target: "_blank", rel: "noopener noreferrer", className: "ss-w-md-link", children }),
1389
+ table: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "ss-w-table-wrap", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("table", { className: "ss-w-md-table", children }) }),
1390
+ ul: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("ul", { className: "ss-w-md-ul", children }),
1391
+ ol: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("ol", { className: "ss-w-md-ol", children }),
1392
+ code: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("code", { className: "ss-w-md-code", children })
1393
+ };
1394
+ function Markdown({ text }) {
1395
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "ss-w-md", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_markdown.default, { remarkPlugins: [import_remark_gfm.default], components, children: text }) });
1396
+ }
1397
+
1398
+ // src/components/EntityCardList.tsx
1399
+ var import_react3 = require("react");
1400
+ var import_jsx_runtime5 = require("react/jsx-runtime");
1401
+ var MAX_VISIBLE = 3;
1402
+ var RECORD_RE = /^(\d+)-(\d+)-(\d+)$/;
1403
+ function initials(name) {
1404
+ return name.split(/\s+/).slice(0, 2).map((w) => w[0] ?? "").join("").toUpperCase();
1405
+ }
1406
+ function shortSeason(season) {
1407
+ return season.replace(/\d{4}/g, (year) => year.slice(2));
1408
+ }
1409
+ function Crest({ image, label }) {
1410
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1411
+ "span",
1412
+ {
1413
+ className: "ss-w-ecard-crest",
1414
+ style: { backgroundImage: `url(${image})` },
1415
+ ...label ? { role: "img", title: label, "aria-label": label } : { "aria-hidden": "true" }
1416
+ }
1417
+ );
1418
+ }
1419
+ function FormBar({ w, d, l }) {
1420
+ if (w + d + l === 0) return null;
1421
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "ss-w-form", "aria-hidden": "true", children: [
1422
+ w > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-form-w", style: { flexGrow: w } }) : null,
1423
+ d > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-form-d", style: { flexGrow: d } }) : null,
1424
+ l > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-form-l", style: { flexGrow: l } }) : null
1425
+ ] });
1426
+ }
1427
+ function StatCellView({ s }) {
1428
+ const m = RECORD_RE.exec(s.value);
1429
+ if (m) {
1430
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-ecard-cell", children: [
1431
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-cval", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(FormBar, { w: Number(m[1]), d: Number(m[2]), l: Number(m[3]) }) }),
1432
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-clabel", children: s.value })
1433
+ ] });
1387
1434
  }
1388
- samples.sort((a, b) => a.atMs - b.atMs);
1389
- const asNumber = (v) => typeof v === "number" && Number.isFinite(v) ? v : void 0;
1390
- const opening = asNumber(card.openingPrice);
1391
- const current = asNumber(card.currentPrice);
1392
- const home = str(card.homeTeamName);
1393
- const away = str(card.awayTeamName);
1394
- const selection = joinSelection(str(card.selectionLabel), str(card.line)) ?? "";
1395
- const bookmakerId = typeof card.bookmakerId === "number" ? card.bookmakerId : "";
1396
- return {
1397
- id: `${typeof card.matchId === "number" ? card.matchId : 0}:${str(card.marketDeveloperName) ?? ""}:${selection}:${bookmakerId}`,
1398
- matchId: typeof card.matchId === "number" ? card.matchId : 0,
1399
- market: str(card.marketLabel) ?? str(card.marketDeveloperName) ?? "",
1400
- marketDeveloperName: str(card.marketDeveloperName),
1401
- selection,
1402
- selectionLabel: str(card.selectionLabel),
1403
- line: str(card.line),
1404
- fixture: home && away ? `${home} vs ${away}` : void 0,
1405
- competition: str(card.competitionName),
1406
- bookmaker: str(card.bookmakerName),
1407
- opening: opening !== void 0 ? opening.toFixed(2) : "",
1408
- current: current !== void 0 ? current.toFixed(2) : "",
1409
- direction: card.movementDirection === "shortened" || card.movementDirection === "drifted" ? card.movementDirection : void 0,
1410
- windowHours: asNumber(card.windowHours) ?? 0,
1411
- excludedCount: asNumber(card.excludedSuspendedCount) ?? 0,
1412
- isSuspended: card.isSuspended === true,
1413
- disclaimer: str(card.disclaimer),
1414
- geometry: projectSeries(samples),
1415
- observationCount: samples.length,
1416
- pinEnabled: card.pinEnabled === true,
1417
- matchOddsId: typeof card.matchOddsId === "number" ? card.matchOddsId : void 0
1418
- };
1435
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-ecard-cell", children: [
1436
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-cval", children: s.value }),
1437
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-clabel", children: s.label })
1438
+ ] });
1419
1439
  }
1420
- function marketOddsRowToSlipSelection(vm, row, conversationId) {
1421
- if (row.matchOddsId === void 0 || row.oddsDecimal === void 0) return null;
1422
- const selection = { matchOddsId: row.matchOddsId, matchId: vm.matchId, oddsDecimal: row.oddsDecimal };
1423
- if (row.quotedAtUtc !== void 0) selection.quotedAtUtc = row.quotedAtUtc;
1424
- if (conversationId !== void 0) selection.conversationId = conversationId;
1425
- return selection;
1440
+ function StatStrip({ stats }) {
1441
+ if (stats.length === 0) return null;
1442
+ const cols = Math.min(stats.length, 4);
1443
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "ss-w-ecard-strip", style: { gridTemplateColumns: `repeat(${cols}, 1fr)` }, children: stats.map((s) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(StatCellView, { s }, s.label + s.value)) });
1426
1444
  }
1427
- function finite(v) {
1428
- return typeof v === "number" && Number.isFinite(v) ? v : void 0;
1445
+ function CardHeader({ c, showScopeCrest }) {
1446
+ const onlyScope = c.scopes.length === 1 ? c.scopes[0] : null;
1447
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-ecard-hd", children: [
1448
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1449
+ "span",
1450
+ {
1451
+ className: c.kind === "team" ? "ss-w-thumb ss-w-team" : "ss-w-thumb",
1452
+ style: c.image ? { backgroundImage: `url(${c.image})` } : void 0,
1453
+ children: c.image ? "" : initials(c.name)
1454
+ }
1455
+ ),
1456
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "ss-w-ecard-idtext", children: [
1457
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-nm", children: c.name }),
1458
+ c.sub ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-sub", children: c.sub }) : null
1459
+ ] }),
1460
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "ss-w-ecard-meta", children: [
1461
+ showScopeCrest && onlyScope?.image ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Crest, { image: onlyScope.image, label: onlyScope.label }) : null,
1462
+ c.season ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-season", children: shortSeason(c.season) }) : null
1463
+ ] })
1464
+ ] });
1429
1465
  }
1430
- function toComboLegVM(leg) {
1431
- if (!leg || typeof leg !== "object") return null;
1432
- const price = finite(leg.price);
1433
- const matchOddsId = finite(leg.matchOddsId);
1434
- const matchId = finite(leg.matchId);
1435
- const home = str(leg.homeTeamName);
1436
- const away = str(leg.awayTeamName);
1437
- const selectionLabel = str(leg.selectionLabel);
1438
- const insight = leg.insight && typeof leg.insight === "object" ? leg.insight : void 0;
1439
- const insightId = str(insight?.insightId);
1440
- const statText = str(insight?.text);
1441
- if (price === void 0 || matchOddsId === void 0 || matchId === void 0 || !home || !away || !selectionLabel || !insightId || !statText) return null;
1442
- const line = str(leg.line);
1443
- return {
1444
- key: `${matchOddsId}`,
1445
- matchId,
1446
- homeTeamName: home,
1447
- awayTeamName: away,
1448
- homeCrest: str(leg.homeTeamImagePath),
1449
- awayCrest: str(leg.awayTeamImagePath),
1450
- competition: str(leg.competitionName),
1451
- kickoffUtc: str(leg.kickoffUtc),
1452
- kickoffLabel: str(leg.kickoffLabel),
1453
- market: str(leg.marketLabel) ?? str(leg.marketDeveloperName) ?? "",
1454
- marketDeveloperName: str(leg.marketDeveloperName) ?? "",
1455
- selection: joinSelection(selectionLabel, line) ?? selectionLabel,
1456
- selectionLabel,
1457
- line,
1458
- odds: price.toFixed(2),
1459
- oddsDecimal: price,
1460
- matchOddsId,
1461
- quotedAtUtc: str(leg.quotedAtUtc),
1462
- insightId,
1463
- statText
1464
- };
1466
+ function ScopeTabs({ scopes, active, onSelect }) {
1467
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "ss-w-ecard-scopes", role: "tablist", children: scopes.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1468
+ "button",
1469
+ {
1470
+ type: "button",
1471
+ role: "tab",
1472
+ className: "ss-w-ecard-scope",
1473
+ "aria-selected": i === active,
1474
+ "aria-label": s.label,
1475
+ title: s.label,
1476
+ onClick: () => onSelect(i),
1477
+ children: s.image ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Crest, { image: s.image }) : s.label
1478
+ },
1479
+ String(s.competitionId ?? "all")
1480
+ )) });
1465
1481
  }
1466
- function toComboCardVM(card) {
1467
- const rawLegs = Array.isArray(card?.legs) ? card.legs : [];
1468
- const multiplication = str(card?.multiplication);
1469
- if (rawLegs.length < 2 || !multiplication) return null;
1470
- const legs = [];
1471
- for (const raw of rawLegs) {
1472
- const vm = toComboLegVM(raw);
1473
- if (!vm) return null;
1474
- legs.push(vm);
1482
+ function EntityCardItem({ c }) {
1483
+ const [active, setActive] = (0, import_react3.useState)(0);
1484
+ const hasBody = c.scopes.length > 0;
1485
+ if (!hasBody) {
1486
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "ss-w-ecard ss-w-ecard-bare", "data-kind": c.kind, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CardHeader, { c, showScopeCrest: false }) });
1475
1487
  }
1476
- return {
1477
- id: str(card.comboId) ?? legs.map((l) => l.matchOddsId).join("-"),
1478
- legs,
1479
- multiplication,
1480
- replacedNote: str(card.replacedNote),
1481
- addToSlipEnabled: card.addToSlipEnabled === true
1482
- };
1488
+ const multi = c.scopes.length > 1;
1489
+ const scope = c.scopes[multi ? c.scopes[active] ? active : 0 : 0];
1490
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-ecard", "data-kind": c.kind, children: [
1491
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CardHeader, { c, showScopeCrest: !multi }),
1492
+ multi ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ScopeTabs, { scopes: c.scopes, active, onSelect: setActive }) : null,
1493
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(StatStrip, { stats: scope.stats })
1494
+ ] });
1483
1495
  }
1484
- function comboLegToSlipSelection(leg, conversationId) {
1485
- const selection = {
1486
- matchOddsId: leg.matchOddsId,
1487
- matchId: leg.matchId,
1488
- oddsDecimal: leg.oddsDecimal,
1489
- insightId: leg.insightId
1490
- };
1491
- if (leg.quotedAtUtc !== void 0) selection.quotedAtUtc = leg.quotedAtUtc;
1492
- if (conversationId !== void 0) selection.conversationId = conversationId;
1493
- return selection;
1496
+ function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMoreLabel = (n) => `Show ${n} more` }) {
1497
+ const [expanded, setExpanded] = (0, import_react3.useState)(false);
1498
+ if (cards.length === 0) return null;
1499
+ const visible = expanded ? cards : cards.slice(0, MAX_VISIBLE);
1500
+ const overflow = cards.length - MAX_VISIBLE;
1501
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-cards", children: [
1502
+ visible.map((c) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(EntityCardItem, { c }, c.id)),
1503
+ overflow > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "ss-w-cards-more", disabled, onClick: () => setExpanded((v) => !v), children: expanded ? showLessLabel : showMoreLabel(overflow) }) : null
1504
+ ] });
1494
1505
  }
1495
1506
 
1507
+ // src/components/AddToSlipButton.tsx
1508
+ var import_react7 = require("react");
1509
+ var import_widget_sdk = require("@sensiblestats/widget-sdk");
1510
+
1496
1511
  // src/eventLogContext.ts
1497
1512
  var import_react4 = require("react");
1498
1513
  var EventLogContext = (0, import_react4.createContext)(null);
@@ -2050,8 +2065,8 @@ function ComboCardList({ cards, ui, slip }) {
2050
2065
  // src/components/MarketOddsCardList.tsx
2051
2066
  var import_react12 = require("react");
2052
2067
  var import_jsx_runtime15 = require("react/jsx-runtime");
2053
- function OddsRow({ vm, row, ui, slip, inSlipIds, history }) {
2054
- const selection = vm.addToSlipEnabled ? marketOddsRowToSlipSelection(vm, row, slip.conversationId) : null;
2068
+ function OddsRow({ vm, row, ui, slip, inSlipIds, history, suppressSlip }) {
2069
+ const selection = vm.addToSlipEnabled && !suppressSlip ? marketOddsRowToSlipSelection(vm, row, slip.conversationId) : null;
2055
2070
  const inSlip = !!inSlipIds && row.matchOddsId != null && !!inSlipIds[row.matchOddsId];
2056
2071
  return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "ss-w-mo-row", children: [
2057
2072
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "ss-w-mo-sel", children: row.selection }),
@@ -2069,17 +2084,34 @@ function OddsRow({ vm, row, ui, slip, inSlipIds, history }) {
2069
2084
  "\u2713 ",
2070
2085
  ui.inSlipLabel
2071
2086
  ] }) : null,
2072
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(SlipButton, { selection, shownOdds: row.odds, marketDeveloperName: vm.marketDeveloperName, selectionLabel: row.selectionLabel, line: row.line, slip, ui })
2087
+ !suppressSlip ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(SlipButton, { selection, shownOdds: row.odds, marketDeveloperName: vm.marketDeveloperName, selectionLabel: row.selectionLabel, line: row.line, slip, ui }) : null
2073
2088
  ] });
2074
2089
  }
2090
+ var STALE_AFTER_MS = 12e4;
2091
+ function fmtHhMm(iso, locale) {
2092
+ return new Date(iso).toLocaleTimeString(locale, { hour: "2-digit", minute: "2-digit", hour12: false });
2093
+ }
2075
2094
  function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }) {
2076
2095
  const [open, setOpen] = (0, import_react12.useState)(false);
2077
2096
  const kickoffFallback = vm.kickoffUtc && ui?.bettingKickoff ? ui.bettingKickoff(vm.kickoffUtc) : void 0;
2078
2097
  const kickoff = vm.kickoffLabel ?? (kickoffFallback ? `${kickoffFallback.dayLabel} ${kickoffFallback.time}` : void 0);
2079
2098
  const hasNamedTeams = !!vm.homeTeamName && !!vm.awayTeamName;
2080
- const showPin = !!monitor && vm.pinEnabled;
2099
+ const live = vm.live ?? null;
2100
+ const closedReason = live?.closedReason ?? null;
2101
+ const isClosed = closedReason !== null;
2102
+ const asOfMs = live ? new Date(live.asOfUtc).getTime() : NaN;
2103
+ const isStale = live != null && !isClosed && (vm.awaitingLiveUpdate === true || Date.now() - asOfMs > STALE_AFTER_MS);
2104
+ const staleTime = isStale && live ? fmtHhMm(live.asOfUtc, ui?.locale ?? "en") : null;
2105
+ const [, setStaleTick] = (0, import_react12.useState)(0);
2106
+ const watchStale = live != null && !isClosed && !isStale;
2107
+ (0, import_react12.useEffect)(() => {
2108
+ if (!watchStale) return;
2109
+ const id = window.setTimeout(() => setStaleTick((n) => n + 1), Math.max(0, asOfMs + STALE_AFTER_MS - Date.now()) + 1);
2110
+ return () => window.clearTimeout(id);
2111
+ }, [watchStale, asOfMs]);
2112
+ const showPin = !!monitor && vm.pinEnabled && !live;
2081
2113
  const history = showPin && !pinRef && !hideHeader ? monitor : void 0;
2082
- const showHeader = !!vm.competition || vm.isLive || !!kickoff || showPin;
2114
+ const showHeader = !!vm.competition || vm.isLive || !!kickoff || showPin || !!live;
2083
2115
  return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: hideHeader ? "ss-w-mocard ss-w-mocard--bare" : "ss-w-mocard", children: [
2084
2116
  !hideHeader && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
2085
2117
  showHeader ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "ss-w-bi-header", children: [
@@ -2088,7 +2120,14 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
2088
2120
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "ss-w-bi-comp", children: vm.competition })
2089
2121
  ] }) : null }),
2090
2122
  /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "ss-w-bi-header-right", children: [
2091
- vm.isLive ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "ss-w-bi-live", children: [
2123
+ live && !isClosed ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
2124
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "ss-w-bi-score", children: [
2125
+ live.homeScore,
2126
+ "\u2013",
2127
+ live.awayScore
2128
+ ] }),
2129
+ live.minuteLabel ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "ss-w-bi-min", children: live.minuteLabel }) : null
2130
+ ] }) : !live && vm.isLive ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "ss-w-bi-live", children: [
2092
2131
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "ss-w-bi-live-dot", "aria-hidden": "true" }),
2093
2132
  ui?.liveLabel ?? "Live"
2094
2133
  ] }) : null,
@@ -2118,14 +2157,17 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
2118
2157
  ] }) : null
2119
2158
  ] }),
2120
2159
  vm.statText && !hideHeader && !pinRef ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "ss-w-mo-stat", children: vm.statText }) : null,
2121
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "ss-w-mo-rows", children: [
2122
- vm.mainRows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(OddsRow, { vm, row, ui, slip, inSlipIds, history }, row.key)),
2123
- open ? vm.moreRows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(OddsRow, { vm, row, ui, slip, inSlipIds, history }, row.key)) : null
2160
+ isClosed ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "ss-w-mo-closed", children: closedReason === "suspended" ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: ui?.liveCard.suspended ?? "Market suspended" }) : closedReason === "no_live_price" ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: ui?.liveCard.noPrice ?? "No live price available" }) : closedReason === "full_time" ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: ui?.liveCard.fullTime ?? "Full time" }) : null }) : /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
2161
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "ss-w-mo-rows", children: [
2162
+ vm.mainRows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(OddsRow, { vm, row, ui, slip, inSlipIds, history, suppressSlip: isStale }, row.key)),
2163
+ open ? vm.moreRows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(OddsRow, { vm, row, ui, slip, inSlipIds, history, suppressSlip: isStale }, row.key)) : null
2164
+ ] }),
2165
+ vm.moreRows.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("button", { type: "button", className: "ss-w-mo-more", "aria-expanded": open, onClick: () => setOpen((v) => !v), children: [
2166
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: open ? ui?.hideLines ?? "Hide lines" : `${ui?.moreLines ?? "More lines"} (${vm.moreRows.length})` }),
2167
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: `ss-w-mo-more-chev${open ? " ss-w-mo-more-chev-up" : ""}`, "aria-hidden": "true" })
2168
+ ] }) : null,
2169
+ staleTime ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "ss-w-mo-stale", children: ui?.liveCard.stale(staleTime) ?? `Prices from ${staleTime}` }) : null
2124
2170
  ] }),
2125
- vm.moreRows.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("button", { type: "button", className: "ss-w-mo-more", "aria-expanded": open, onClick: () => setOpen((v) => !v), children: [
2126
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: open ? ui?.hideLines ?? "Hide lines" : `${ui?.moreLines ?? "More lines"} (${vm.moreRows.length})` }),
2127
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: `ss-w-mo-more-chev${open ? " ss-w-mo-more-chev-up" : ""}`, "aria-hidden": "true" })
2128
- ] }) : null,
2129
2171
  vm.bookmaker ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "ss-w-mo-foot", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: vm.bookmaker }) }) : null,
2130
2172
  vm.disclaimer ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "ss-w-bi-disc", children: vm.disclaimer }) : null
2131
2173
  ] });
@@ -7292,6 +7334,21 @@ var import_widget_sdk4 = require("@sensiblestats/widget-sdk");
7292
7334
  // src/reducer.ts
7293
7335
  var import_widget_sdk3 = require("@sensiblestats/widget-sdk");
7294
7336
  var POPUP_MAX = 160;
7337
+ function markAwaitingLiveUpdate(messages, held = []) {
7338
+ if (!messages.some((m) => m.role === "assistant" && m.marketOdds.some((vm) => vm.live != null))) return messages;
7339
+ const heldFlags = /* @__PURE__ */ new Map();
7340
+ for (const m of held) {
7341
+ if (m.role !== "assistant") continue;
7342
+ for (const vm of m.marketOdds) if (vm.live != null) heldFlags.set(`${m.id}|${vm.id}`, vm.awaitingLiveUpdate === true);
7343
+ }
7344
+ return messages.map((m) => {
7345
+ if (m.role !== "assistant" || !m.marketOdds.some((vm) => vm.live != null)) return m;
7346
+ return {
7347
+ ...m,
7348
+ marketOdds: m.marketOdds.map((vm) => vm.live != null ? { ...vm, awaitingLiveUpdate: heldFlags.get(`${m.id}|${vm.id}`) ?? true } : vm)
7349
+ };
7350
+ });
7351
+ }
7295
7352
  function initialState(starters) {
7296
7353
  return { isOpen: false, messages: [], isStreaming: false, status: null, actionsLoading: false, starters, configuredStarters: starters, error: null, lastUserInput: null, lastDisplayText: null, popupText: null, conversationId: null };
7297
7354
  }
@@ -7383,7 +7440,7 @@ function reducer(state, action) {
7383
7440
  case "RESTORE":
7384
7441
  return {
7385
7442
  ...state,
7386
- messages: action.messages,
7443
+ messages: markAwaitingLiveUpdate(action.messages, state.messages),
7387
7444
  conversationId: action.conversationId,
7388
7445
  isStreaming: false,
7389
7446
  status: null,
@@ -7397,6 +7454,22 @@ function reducer(state, action) {
7397
7454
  return { ...state, error: action.error, isStreaming: false, status: null, actionsLoading: false, messages: mapActive(state, (t) => ({ ...t, done: true })) };
7398
7455
  case "STOP":
7399
7456
  return { ...state, isStreaming: false, status: null, actionsLoading: false, messages: mapActive(state, (t) => ({ ...t, done: true })) };
7457
+ case "UPDATE_LIVE_CARD": {
7458
+ const { matchId, live, mainRows, moreRows, addToSlipEnabled } = action;
7459
+ return {
7460
+ ...state,
7461
+ messages: state.messages.map((m) => {
7462
+ if (m.role !== "assistant") return m;
7463
+ if (!m.marketOdds.some((vm) => vm.matchId === matchId && vm.live != null)) return m;
7464
+ return {
7465
+ ...m,
7466
+ marketOdds: m.marketOdds.map(
7467
+ (vm) => vm.matchId === matchId && vm.live != null ? { ...vm, live, mainRows, moreRows, addToSlipEnabled, awaitingLiveUpdate: false } : vm
7468
+ )
7469
+ };
7470
+ })
7471
+ };
7472
+ }
7400
7473
  case "LIVE_REFRESH":
7401
7474
  return {
7402
7475
  ...state,
@@ -7569,7 +7642,7 @@ function useChatStream(conversation, starterTexts, greetingMessage, storageKey)
7569
7642
  const restored = payload != null && payload !== "expired" && payload !== "corrupt";
7570
7643
  const base = initialState(starterTexts.map(chipFromText));
7571
7644
  if (restored) {
7572
- return { state: { ...base, messages: payload.messages, conversationId: payload.conversationId, starters: [] }, restored: true, stale: false };
7645
+ return { state: { ...base, messages: markAwaitingLiveUpdate(payload.messages), conversationId: payload.conversationId, starters: [] }, restored: true, stale: false };
7573
7646
  }
7574
7647
  return { state: base, restored: false, stale: payload === "expired" || payload === "corrupt" };
7575
7648
  }, []);
@@ -7742,7 +7815,7 @@ function useChatStream(conversation, starterTexts, greetingMessage, storageKey)
7742
7815
  }, [storageKey, conversation, clearFallbackTimer, fireGreeting]);
7743
7816
  const getLiveDashboard = (0, import_react42.useCallback)(() => conversation.getLiveDashboard(), [conversation]);
7744
7817
  useLiveDashboardPoll({ messages: state.messages, dispatch, getLiveDashboard });
7745
- return { state, open, close, stop, toggle, send, retry, dismissPopup, reset };
7818
+ return { state, open, close, stop, toggle, send, retry, dismissPopup, reset, _dispatch: dispatch };
7746
7819
  }
7747
7820
 
7748
7821
  // src/useLiveMonitor.ts
@@ -7759,6 +7832,7 @@ function useTabs(initial = "chat") {
7759
7832
  var GOAL_OR_RED = /* @__PURE__ */ new Set(["goal", "red"]);
7760
7833
  var MIN_POLL_MS = 5e3;
7761
7834
  var DEFAULT_POLL_MS = 6e4;
7835
+ var LIVE_WATCH_POLL_MS = 12e3;
7762
7836
  function eventIdentity(e) {
7763
7837
  return `${e.type}:${e.side}:${e.minuteLabel}:${e.player ?? ""}`;
7764
7838
  }
@@ -7790,6 +7864,8 @@ function useLiveMonitor(opts) {
7790
7864
  const [marketOdds, setMarketOdds] = (0, import_react44.useState)({});
7791
7865
  const pinsRef = (0, import_react44.useRef)(pins);
7792
7866
  pinsRef.current = pins;
7867
+ const watchesRef = (0, import_react44.useRef)(opts.watches ?? []);
7868
+ watchesRef.current = opts.watches ?? [];
7793
7869
  const activeTabRef = (0, import_react44.useRef)(activeTab);
7794
7870
  activeTabRef.current = activeTab;
7795
7871
  const snapshotRef = (0, import_react44.useRef)(snapshot);
@@ -7907,10 +7983,11 @@ function useLiveMonitor(opts) {
7907
7983
  const getLiveMonitorRef = (0, import_react44.useRef)(opts.getLiveMonitor);
7908
7984
  getLiveMonitorRef.current = opts.getLiveMonitor;
7909
7985
  const tick = (0, import_react44.useCallback)(async () => {
7910
- if (inFlightRef.current || disabledRef.current || pinsRef.current.length === 0) return;
7986
+ const allPins = [...pinsRef.current, ...watchesRef.current];
7987
+ if (inFlightRef.current || disabledRef.current || allPins.length === 0) return;
7911
7988
  inFlightRef.current = true;
7912
7989
  try {
7913
- const snap = await getLiveMonitorRef.current(pinsRef.current);
7990
+ const snap = await getLiveMonitorRef.current(allPins);
7914
7991
  if (!mountedRef.current) return;
7915
7992
  if (snap === null) {
7916
7993
  disabledRef.current = true;
@@ -7933,8 +8010,10 @@ function useLiveMonitor(opts) {
7933
8010
  });
7934
8011
  scheduleRef.current = () => {
7935
8012
  window.clearTimeout(timerRef.current);
7936
- if (!mountedRef.current || disabledRef.current || pinsRef.current.length === 0 || document.visibilityState === "hidden") return;
7937
- const hinted = (snapshotRef.current?.nextPollSeconds ?? DEFAULT_POLL_MS / 1e3) * 1e3;
8013
+ const hasWork = pinsRef.current.length > 0 || watchesRef.current.length > 0;
8014
+ if (!mountedRef.current || disabledRef.current || !hasWork || document.visibilityState === "hidden") return;
8015
+ const fallbackMs = watchesRef.current.length > 0 ? LIVE_WATCH_POLL_MS : DEFAULT_POLL_MS;
8016
+ const hinted = snapshotRef.current ? snapshotRef.current.nextPollSeconds * 1e3 : fallbackMs;
7938
8017
  timerRef.current = window.setTimeout(() => void tick(), Math.max(MIN_POLL_MS, hinted));
7939
8018
  };
7940
8019
  (0, import_react44.useEffect)(() => {
@@ -7945,14 +8024,21 @@ function useLiveMonitor(opts) {
7945
8024
  }, []);
7946
8025
  const prevPinsLengthRef = (0, import_react44.useRef)(0);
7947
8026
  (0, import_react44.useEffect)(() => {
7948
- const wasEmpty = prevPinsLengthRef.current === 0;
8027
+ const wasEmpty = prevPinsLengthRef.current === 0 && watchesRef.current.length === 0;
7949
8028
  prevPinsLengthRef.current = pins.length;
7950
- if (pins.length === 0) {
8029
+ if (pins.length === 0 && watchesRef.current.length === 0) {
7951
8030
  window.clearTimeout(timerRef.current);
7952
8031
  return;
7953
8032
  }
7954
8033
  if (wasEmpty) void tick();
7955
8034
  }, [pins.length, tick]);
8035
+ const prevWatchesLengthRef = (0, import_react44.useRef)(0);
8036
+ const watchesLength = opts.watches?.length ?? 0;
8037
+ (0, import_react44.useEffect)(() => {
8038
+ const wasEmpty = prevWatchesLengthRef.current === 0 && pinsRef.current.length === 0;
8039
+ prevWatchesLengthRef.current = watchesLength;
8040
+ if (wasEmpty && watchesLength > 0) void tick();
8041
+ }, [watchesLength, tick]);
7956
8042
  (0, import_react44.useEffect)(() => {
7957
8043
  const matchPins = pins.filter((p) => p.kind === "match").length;
7958
8044
  const marketPins = pins.length - matchPins;
@@ -8789,6 +8875,12 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
8789
8875
  .ss-w-mo-more-chev { width: 7px; height: 7px; border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor; transform: translateY(-2px) rotate(45deg); transition: transform .15s ease; }
8790
8876
  .ss-w-mo-more-chev-up { transform: translateY(1px) rotate(-135deg); }
8791
8877
  .ss-w-mo-rows { display: flex; flex-direction: column; gap: 4px; }
8878
+ /* Stage 4: live card score+minute in header (R18). */
8879
+ .ss-w-bi-score { font-size: 13px; font-weight: 700; color: var(--ss-w-ink); white-space: nowrap; }
8880
+ .ss-w-bi-min { font-size: 11px; font-weight: 600; color: var(--ss-w-faint); white-space: nowrap; }
8881
+ /* D12: closed state message row; D13: stale-price notice. */
8882
+ .ss-w-mo-closed { padding: 6px 0; font-size: 12.5px; color: var(--ss-w-faint); }
8883
+ .ss-w-mo-stale { margin: 0; font-size: 11px; color: var(--ss-w-faint); }
8792
8884
  /* The card's stat, in the Live tab accordion's insight style. No row below it is marked (R17). */
8793
8885
  .ss-w-mo-stat { font-size: 12px; color: var(--ss-w-ink); background: color-mix(in srgb, var(--ss-w-accent) 9%, var(--ss-w-panel)); border-radius: 8px; padding: 7px 9px; }
8794
8886
  .ss-w-mo-row { display: flex; align-items: center; gap: 10px; padding: 4px 0; border-bottom: 1px dashed var(--ss-w-line); }
@@ -9991,12 +10083,27 @@ function StatsWidget(props) {
9991
10083
  const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
9992
10084
  const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
9993
10085
  const [hasToday, setHasToday] = (0, import_react50.useState)(false);
10086
+ const liveCardWatches = (0, import_react50.useMemo)(() => {
10087
+ const seen = /* @__PURE__ */ new Set();
10088
+ const out = [];
10089
+ for (const msg of controller.state.messages) {
10090
+ if (msg.role !== "assistant") continue;
10091
+ for (const vm of msg.marketOdds) {
10092
+ if (vm.live == null || seen.has(vm.matchId)) continue;
10093
+ seen.add(vm.matchId);
10094
+ out.push({ key: `live:card:${vm.matchId}`, kind: "market", matchId: vm.matchId, marketDeveloperName: vm.marketDeveloperName ?? "FULLTIME_RESULT" });
10095
+ }
10096
+ }
10097
+ return out;
10098
+ }, [controller.state.messages]);
10099
+ const locale = cfg?.locale;
9994
10100
  const monitor = useLiveMonitor({
9995
- getLiveMonitor: (pins) => built ? built.conversation.getLiveMonitor(pins) : Promise.resolve(null),
10101
+ getLiveMonitor: (pins) => built ? built.conversation.getLiveMonitor(pins, locale) : Promise.resolve(null),
9996
10102
  getMarketOdds: (matchId, dev) => built ? built.conversation.getMarketOdds(matchId, dev) : Promise.resolve(null),
9997
10103
  storageKey: `ss-w-pins:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`,
9998
10104
  isOpen: controller.state.isOpen,
9999
- hasToday
10105
+ hasToday,
10106
+ watches: liveCardWatches
10000
10107
  });
10001
10108
  const getSchedule = (0, import_react50.useCallback)(
10002
10109
  (localDate, utcOffsetMinutes) => built ? built.conversation.getSchedule(localDate, utcOffsetMinutes) : Promise.resolve(null),
@@ -10021,6 +10128,41 @@ function StatsWidget(props) {
10021
10128
  (0, import_react50.useEffect)(() => {
10022
10129
  setHasToday(todayHasContent);
10023
10130
  }, [todayHasContent]);
10131
+ const prevLiveSnapshotRef = (0, import_react50.useRef)(monitor.snapshot);
10132
+ (0, import_react50.useEffect)(() => {
10133
+ const snap = monitor.snapshot;
10134
+ if (!snap || snap === prevLiveSnapshotRef.current) return;
10135
+ prevLiveSnapshotRef.current = snap;
10136
+ for (const market of snap.markets) {
10137
+ if (!market.key.startsWith("live:card:")) continue;
10138
+ const matchId = parseInt(market.key.slice("live:card:".length), 10);
10139
+ if (!Number.isFinite(matchId)) continue;
10140
+ let mainRows = [];
10141
+ let moreRows = [];
10142
+ let addToSlipEnabled = false;
10143
+ if (market.card) {
10144
+ const updated = toMarketOddsVM(market.card);
10145
+ mainRows = updated.mainRows;
10146
+ moreRows = updated.moreRows;
10147
+ addToSlipEnabled = updated.addToSlipEnabled;
10148
+ }
10149
+ let closedReason = null;
10150
+ if (market.phase === "fullTime" || market.phase === "postponed") closedReason = "full_time";
10151
+ else if (market.isSuspended) closedReason = "suspended";
10152
+ else if (!market.card) closedReason = "no_live_price";
10153
+ const live = {
10154
+ phase: market.phase,
10155
+ homeScore: market.homeScore ?? null,
10156
+ awayScore: market.awayScore ?? null,
10157
+ minuteLabel: market.minuteLabel ?? null,
10158
+ isSuspended: market.isSuspended,
10159
+ isSettled: market.isSettled,
10160
+ asOfUtc: market.asOfUtc,
10161
+ closedReason
10162
+ };
10163
+ controller._dispatch?.({ kind: "UPDATE_LIVE_CARD", matchId, live, mainRows, moreRows, addToSlipEnabled });
10164
+ }
10165
+ }, [monitor.snapshot]);
10024
10166
  const gamesResult = useGames(built?.conversation ?? null, { activeTab: monitor.activeTab });
10025
10167
  const leaderboardResult = useLeaderboard(built?.conversation ?? null, { activeTab: monitor.activeTab });
10026
10168
  const markTodayActivity = monitor.markTodayActivity;