@forgecharts/sdk 1.3.12 → 1.4.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.
@@ -1 +1 @@
1
- {"version":3,"file":"ChartCanvas.d.ts","sourceRoot":"","sources":["../../../src/react/canvas/ChartCanvas.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChartCanvas.d.ts","sourceRoot":"","sources":["../../../src/react/canvas/ChartCanvas.tsx"],"names":[],"mappings":"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"}
@@ -22679,7 +22679,10 @@ var ChartCanvas = forwardRef(
22679
22679
  const order = chart.getTradingOverlayStore()?.getOrders().find((o) => o.id === orderId);
22680
22680
  const isBracketLeg = order?.role === "take_profit" || order?.role === "stop_loss";
22681
22681
  if (isBracketLeg) {
22682
- if (!canUseBracketOrders()) return;
22682
+ if (!canUseBracketOrders()) {
22683
+ console.warn("[ForgeCharts] TP/SL drag ignored \u2014 the `bracketOrders` feature is not enabled on the active license, so no bracket_adjust intent was dispatched.");
22684
+ return;
22685
+ }
22683
22686
  void bridge.onBracketAdjustIntent?.({
22684
22687
  type: "bracket_adjust",
22685
22688
  entryOrderId: order?.groupId ?? orderId,
@@ -22688,7 +22691,10 @@ var ChartCanvas = forwardRef(
22688
22691
  timestamp: Date.now()
22689
22692
  });
22690
22693
  } else {
22691
- if (!canUseDraggableOrders()) return;
22694
+ if (!canUseDraggableOrders()) {
22695
+ console.warn("[ForgeCharts] Order drag ignored \u2014 the `draggableOrders` feature is not enabled on the active license, so no modify intent was dispatched.");
22696
+ return;
22697
+ }
22692
22698
  void bridge.onModifyOrderIntent?.({
22693
22699
  type: "modify",
22694
22700
  orderId,
@@ -22704,7 +22710,11 @@ var ChartCanvas = forwardRef(
22704
22710
  return;
22705
22711
  }
22706
22712
  const bridge = tradingBridgeRef.current;
22707
- if (!bridge || !canUseBracketOrders()) return;
22713
+ if (!bridge) return;
22714
+ if (!canUseBracketOrders()) {
22715
+ console.warn("[ForgeCharts] TP/SL pill drag ignored \u2014 the `bracketOrders` feature is not enabled on the active license, so no bracket_adjust intent was dispatched.");
22716
+ return;
22717
+ }
22708
22718
  void bridge.onBracketAdjustIntent?.({
22709
22719
  type: "bracket_adjust",
22710
22720
  entryOrderId,
@@ -26089,6 +26099,161 @@ function RightToolbar({
26089
26099
  }
26090
26100
  );
26091
26101
  }
26102
+
26103
+ // src/react/agent/contractUtils.ts
26104
+ var MONTH_CODE_MAP = {
26105
+ F: "January",
26106
+ G: "February",
26107
+ H: "March",
26108
+ J: "April",
26109
+ K: "May",
26110
+ M: "June",
26111
+ N: "July",
26112
+ Q: "August",
26113
+ U: "September",
26114
+ V: "October",
26115
+ X: "November",
26116
+ Z: "December"
26117
+ };
26118
+ var PRODUCTS = {
26119
+ // CME Equity Index
26120
+ ES: { exchange: "CME", months: ["H", "M", "U", "Z"] },
26121
+ MES: { exchange: "CME", months: ["H", "M", "U", "Z"] },
26122
+ NQ: { exchange: "CME", months: ["H", "M", "U", "Z"] },
26123
+ MNQ: { exchange: "CME", months: ["H", "M", "U", "Z"] },
26124
+ RTY: { exchange: "CME", months: ["H", "M", "U", "Z"] },
26125
+ M2K: { exchange: "CME", months: ["H", "M", "U", "Z"] },
26126
+ NKD: { exchange: "CME", months: ["H", "M", "U", "Z"] },
26127
+ // CBOT Equity Index
26128
+ YM: { exchange: "CBOT", months: ["H", "M", "U", "Z"] },
26129
+ MYM: { exchange: "CBOT", months: ["H", "M", "U", "Z"] },
26130
+ // CME FX
26131
+ "6E": { exchange: "CME", months: ["H", "M", "U", "Z"] },
26132
+ "6B": { exchange: "CME", months: ["H", "M", "U", "Z"] },
26133
+ "6J": { exchange: "CME", months: ["H", "M", "U", "Z"] },
26134
+ "6A": { exchange: "CME", months: ["H", "M", "U", "Z"] },
26135
+ "6C": { exchange: "CME", months: ["H", "M", "U", "Z"] },
26136
+ // NYMEX Energy
26137
+ CL: { exchange: "NYMEX", months: ["F", "G", "H", "J", "K", "M", "N", "Q", "U", "V", "X", "Z"] },
26138
+ QM: { exchange: "NYMEX", months: ["F", "G", "H", "J", "K", "M", "N", "Q", "U", "V", "X", "Z"] },
26139
+ MCL: { exchange: "NYMEX", months: ["F", "G", "H", "J", "K", "M", "N", "Q", "U", "V", "X", "Z"] },
26140
+ NG: { exchange: "NYMEX", months: ["F", "G", "H", "J", "K", "M", "N", "Q", "U", "V", "X", "Z"] },
26141
+ HO: { exchange: "NYMEX", months: ["F", "G", "H", "J", "K", "M", "N", "Q", "U", "V", "X", "Z"] },
26142
+ RB: { exchange: "NYMEX", months: ["F", "G", "H", "J", "K", "M", "N", "Q", "U", "V", "X", "Z"] },
26143
+ // COMEX Metals
26144
+ GC: { exchange: "COMEX", months: ["G", "J", "M", "Q", "V", "Z"] },
26145
+ MGC: { exchange: "COMEX", months: ["G", "J", "M", "Q", "V", "Z"] },
26146
+ SI: { exchange: "COMEX", months: ["H", "K", "N", "U", "Z"] },
26147
+ HG: { exchange: "COMEX", months: ["H", "K", "N", "U", "Z"] },
26148
+ // CBOT Grains
26149
+ ZC: { exchange: "CBOT", months: ["H", "K", "N", "U", "Z"] },
26150
+ ZS: { exchange: "CBOT", months: ["F", "H", "K", "N", "Q", "U", "X"] },
26151
+ ZW: { exchange: "CBOT", months: ["H", "K", "N", "U", "Z"] },
26152
+ // CBOT Interest Rates
26153
+ ZB: { exchange: "CBOT", months: ["H", "M", "U", "Z"] },
26154
+ ZN: { exchange: "CBOT", months: ["H", "M", "U", "Z"] },
26155
+ ZF: { exchange: "CBOT", months: ["H", "M", "U", "Z"] },
26156
+ ZT: { exchange: "CBOT", months: ["H", "M", "U", "Z"] }
26157
+ };
26158
+ var MC_INDEX = {
26159
+ F: 0,
26160
+ G: 1,
26161
+ H: 2,
26162
+ J: 3,
26163
+ K: 4,
26164
+ M: 5,
26165
+ N: 6,
26166
+ Q: 7,
26167
+ U: 8,
26168
+ V: 9,
26169
+ X: 10,
26170
+ Z: 11
26171
+ };
26172
+ function parseContractInfo(symbol) {
26173
+ let input = symbol.trim().toUpperCase();
26174
+ let exchangeHint;
26175
+ if (input.includes(":")) {
26176
+ const colon = input.indexOf(":");
26177
+ exchangeHint = input.slice(0, colon);
26178
+ input = input.slice(colon + 1);
26179
+ }
26180
+ const contMatch = input.match(/^([A-Z0-9]+?)(\d+)!$/);
26181
+ if (contMatch) {
26182
+ const product = contMatch[1];
26183
+ const info = PRODUCTS[product];
26184
+ if (!info) return null;
26185
+ const exchange = exchangeHint ?? info.exchange;
26186
+ const front = _guessFrontMonth(product, info.months);
26187
+ return {
26188
+ isContinuous: true,
26189
+ product,
26190
+ exchange,
26191
+ frontMonthContract: `${exchange}:${front}`,
26192
+ continuousSymbol: `${exchange}:${product}1!`,
26193
+ availableMonths: info.months
26194
+ };
26195
+ }
26196
+ const specificMatch = input.match(/^([A-Z0-9]+?)([FGHJKMNQUVXZ])(\d{1,4})$/);
26197
+ if (specificMatch) {
26198
+ const product = specificMatch[1];
26199
+ const info = PRODUCTS[product];
26200
+ if (!info) return null;
26201
+ const exchange = exchangeHint ?? info.exchange;
26202
+ const front = _guessFrontMonth(product, info.months);
26203
+ return {
26204
+ isContinuous: false,
26205
+ product,
26206
+ exchange,
26207
+ frontMonthContract: `${exchange}:${front}`,
26208
+ continuousSymbol: `${exchange}:${product}1!`,
26209
+ availableMonths: info.months
26210
+ };
26211
+ }
26212
+ if (PRODUCTS[input]) {
26213
+ const info = PRODUCTS[input];
26214
+ const exchange = exchangeHint ?? info.exchange;
26215
+ const front = _guessFrontMonth(input, info.months);
26216
+ return {
26217
+ isContinuous: false,
26218
+ product: input,
26219
+ exchange,
26220
+ frontMonthContract: `${exchange}:${front}`,
26221
+ continuousSymbol: `${exchange}:${input}1!`,
26222
+ availableMonths: info.months
26223
+ };
26224
+ }
26225
+ return null;
26226
+ }
26227
+ function getUpcomingContracts(product, exchange, months, count = 6) {
26228
+ const now = /* @__PURE__ */ new Date();
26229
+ const currentMonth = now.getMonth();
26230
+ const currentYear = now.getFullYear();
26231
+ const contracts = [];
26232
+ for (let yearOffset = 0; yearOffset <= 2 && contracts.length < count; yearOffset++) {
26233
+ const year = currentYear + yearOffset;
26234
+ for (const mc of months) {
26235
+ if (contracts.length >= count) break;
26236
+ const monthIdx = MC_INDEX[mc];
26237
+ if (monthIdx === void 0) continue;
26238
+ if (year === currentYear && monthIdx < currentMonth) continue;
26239
+ contracts.push(`${exchange}:${product}${mc}${year}`);
26240
+ }
26241
+ }
26242
+ return contracts;
26243
+ }
26244
+ function _guessFrontMonth(product, months) {
26245
+ const now = /* @__PURE__ */ new Date();
26246
+ const currentMonth = now.getMonth();
26247
+ const currentYear = now.getFullYear();
26248
+ for (const mc of months) {
26249
+ const monthIdx = MC_INDEX[mc];
26250
+ if (monthIdx === void 0) continue;
26251
+ if (monthIdx >= currentMonth) {
26252
+ return `${product}${mc}${currentYear}`;
26253
+ }
26254
+ }
26255
+ return `${product}${months[0]}${currentYear + 1}`;
26256
+ }
26092
26257
  var TIMEZONE_OPTIONS = [
26093
26258
  { label: "UTC", value: "UTC" },
26094
26259
  { label: "Exchange", value: "exchange" },
@@ -26252,7 +26417,8 @@ var CRYPTO_EXCHANGES = /* @__PURE__ */ new Set([
26252
26417
  ]);
26253
26418
  function symbolSupportsSession(symbol) {
26254
26419
  const exchange = symbol.includes(":") ? symbol.split(":")[0].toUpperCase() : "";
26255
- return exchange !== "" && !CRYPTO_EXCHANGES.has(exchange);
26420
+ if (exchange !== "") return !CRYPTO_EXCHANGES.has(exchange);
26421
+ return parseContractInfo(symbol) !== null;
26256
26422
  }
26257
26423
  function useClockTime(timezone) {
26258
26424
  const [time, setTime] = useState(() => _formatClock(timezone));
@@ -32319,161 +32485,6 @@ function AssistantPanel({ onClose, chartContext }) {
32319
32485
  ] });
32320
32486
  }
32321
32487
 
32322
- // src/react/agent/contractUtils.ts
32323
- var MONTH_CODE_MAP = {
32324
- F: "January",
32325
- G: "February",
32326
- H: "March",
32327
- J: "April",
32328
- K: "May",
32329
- M: "June",
32330
- N: "July",
32331
- Q: "August",
32332
- U: "September",
32333
- V: "October",
32334
- X: "November",
32335
- Z: "December"
32336
- };
32337
- var PRODUCTS = {
32338
- // CME Equity Index
32339
- ES: { exchange: "CME", months: ["H", "M", "U", "Z"] },
32340
- MES: { exchange: "CME", months: ["H", "M", "U", "Z"] },
32341
- NQ: { exchange: "CME", months: ["H", "M", "U", "Z"] },
32342
- MNQ: { exchange: "CME", months: ["H", "M", "U", "Z"] },
32343
- RTY: { exchange: "CME", months: ["H", "M", "U", "Z"] },
32344
- M2K: { exchange: "CME", months: ["H", "M", "U", "Z"] },
32345
- NKD: { exchange: "CME", months: ["H", "M", "U", "Z"] },
32346
- // CBOT Equity Index
32347
- YM: { exchange: "CBOT", months: ["H", "M", "U", "Z"] },
32348
- MYM: { exchange: "CBOT", months: ["H", "M", "U", "Z"] },
32349
- // CME FX
32350
- "6E": { exchange: "CME", months: ["H", "M", "U", "Z"] },
32351
- "6B": { exchange: "CME", months: ["H", "M", "U", "Z"] },
32352
- "6J": { exchange: "CME", months: ["H", "M", "U", "Z"] },
32353
- "6A": { exchange: "CME", months: ["H", "M", "U", "Z"] },
32354
- "6C": { exchange: "CME", months: ["H", "M", "U", "Z"] },
32355
- // NYMEX Energy
32356
- CL: { exchange: "NYMEX", months: ["F", "G", "H", "J", "K", "M", "N", "Q", "U", "V", "X", "Z"] },
32357
- QM: { exchange: "NYMEX", months: ["F", "G", "H", "J", "K", "M", "N", "Q", "U", "V", "X", "Z"] },
32358
- MCL: { exchange: "NYMEX", months: ["F", "G", "H", "J", "K", "M", "N", "Q", "U", "V", "X", "Z"] },
32359
- NG: { exchange: "NYMEX", months: ["F", "G", "H", "J", "K", "M", "N", "Q", "U", "V", "X", "Z"] },
32360
- HO: { exchange: "NYMEX", months: ["F", "G", "H", "J", "K", "M", "N", "Q", "U", "V", "X", "Z"] },
32361
- RB: { exchange: "NYMEX", months: ["F", "G", "H", "J", "K", "M", "N", "Q", "U", "V", "X", "Z"] },
32362
- // COMEX Metals
32363
- GC: { exchange: "COMEX", months: ["G", "J", "M", "Q", "V", "Z"] },
32364
- MGC: { exchange: "COMEX", months: ["G", "J", "M", "Q", "V", "Z"] },
32365
- SI: { exchange: "COMEX", months: ["H", "K", "N", "U", "Z"] },
32366
- HG: { exchange: "COMEX", months: ["H", "K", "N", "U", "Z"] },
32367
- // CBOT Grains
32368
- ZC: { exchange: "CBOT", months: ["H", "K", "N", "U", "Z"] },
32369
- ZS: { exchange: "CBOT", months: ["F", "H", "K", "N", "Q", "U", "X"] },
32370
- ZW: { exchange: "CBOT", months: ["H", "K", "N", "U", "Z"] },
32371
- // CBOT Interest Rates
32372
- ZB: { exchange: "CBOT", months: ["H", "M", "U", "Z"] },
32373
- ZN: { exchange: "CBOT", months: ["H", "M", "U", "Z"] },
32374
- ZF: { exchange: "CBOT", months: ["H", "M", "U", "Z"] },
32375
- ZT: { exchange: "CBOT", months: ["H", "M", "U", "Z"] }
32376
- };
32377
- var MC_INDEX = {
32378
- F: 0,
32379
- G: 1,
32380
- H: 2,
32381
- J: 3,
32382
- K: 4,
32383
- M: 5,
32384
- N: 6,
32385
- Q: 7,
32386
- U: 8,
32387
- V: 9,
32388
- X: 10,
32389
- Z: 11
32390
- };
32391
- function parseContractInfo(symbol) {
32392
- let input = symbol.trim().toUpperCase();
32393
- let exchangeHint;
32394
- if (input.includes(":")) {
32395
- const colon = input.indexOf(":");
32396
- exchangeHint = input.slice(0, colon);
32397
- input = input.slice(colon + 1);
32398
- }
32399
- const contMatch = input.match(/^([A-Z0-9]+?)(\d+)!$/);
32400
- if (contMatch) {
32401
- const product = contMatch[1];
32402
- const info = PRODUCTS[product];
32403
- if (!info) return null;
32404
- const exchange = exchangeHint ?? info.exchange;
32405
- const front = _guessFrontMonth(product, info.months);
32406
- return {
32407
- isContinuous: true,
32408
- product,
32409
- exchange,
32410
- frontMonthContract: `${exchange}:${front}`,
32411
- continuousSymbol: `${exchange}:${product}1!`,
32412
- availableMonths: info.months
32413
- };
32414
- }
32415
- const specificMatch = input.match(/^([A-Z0-9]+?)([FGHJKMNQUVXZ])(\d{1,4})$/);
32416
- if (specificMatch) {
32417
- const product = specificMatch[1];
32418
- const info = PRODUCTS[product];
32419
- if (!info) return null;
32420
- const exchange = exchangeHint ?? info.exchange;
32421
- const front = _guessFrontMonth(product, info.months);
32422
- return {
32423
- isContinuous: false,
32424
- product,
32425
- exchange,
32426
- frontMonthContract: `${exchange}:${front}`,
32427
- continuousSymbol: `${exchange}:${product}1!`,
32428
- availableMonths: info.months
32429
- };
32430
- }
32431
- if (PRODUCTS[input]) {
32432
- const info = PRODUCTS[input];
32433
- const exchange = exchangeHint ?? info.exchange;
32434
- const front = _guessFrontMonth(input, info.months);
32435
- return {
32436
- isContinuous: false,
32437
- product: input,
32438
- exchange,
32439
- frontMonthContract: `${exchange}:${front}`,
32440
- continuousSymbol: `${exchange}:${input}1!`,
32441
- availableMonths: info.months
32442
- };
32443
- }
32444
- return null;
32445
- }
32446
- function getUpcomingContracts(product, exchange, months, count = 6) {
32447
- const now = /* @__PURE__ */ new Date();
32448
- const currentMonth = now.getMonth();
32449
- const currentYear = now.getFullYear();
32450
- const contracts = [];
32451
- for (let yearOffset = 0; yearOffset <= 2 && contracts.length < count; yearOffset++) {
32452
- const year = currentYear + yearOffset;
32453
- for (const mc of months) {
32454
- if (contracts.length >= count) break;
32455
- const monthIdx = MC_INDEX[mc];
32456
- if (monthIdx === void 0) continue;
32457
- if (year === currentYear && monthIdx < currentMonth) continue;
32458
- contracts.push(`${exchange}:${product}${mc}${year}`);
32459
- }
32460
- }
32461
- return contracts;
32462
- }
32463
- function _guessFrontMonth(product, months) {
32464
- const now = /* @__PURE__ */ new Date();
32465
- const currentMonth = now.getMonth();
32466
- const currentYear = now.getFullYear();
32467
- for (const mc of months) {
32468
- const monthIdx = MC_INDEX[mc];
32469
- if (monthIdx === void 0) continue;
32470
- if (monthIdx >= currentMonth) {
32471
- return `${product}${mc}${currentYear}`;
32472
- }
32473
- }
32474
- return `${product}${months[0]}${currentYear + 1}`;
32475
- }
32476
-
32477
32488
  // src/react/agent/CommandDispatcher.ts
32478
32489
  var CommandDispatcher = class {
32479
32490
  constructor(chart) {