@forgecharts/sdk 1.5.36 → 1.5.38

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/internal.js CHANGED
@@ -11106,6 +11106,62 @@ var LicenseManager = class _LicenseManager {
11106
11106
  }
11107
11107
  };
11108
11108
 
11109
+ // src/licensing/packageFeatures.ts
11110
+ var KIT_FEATURE_TO_CAPABILITY = {
11111
+ // charting
11112
+ drawing_tools: "drawingTools",
11113
+ extended_drawing_tools: "extendedDrawings",
11114
+ indicators: "indicators",
11115
+ multi_pane: "multiPane",
11116
+ chart_types: "chartTypes",
11117
+ bar_replay: "barReplay",
11118
+ custom_timeframes: "customTimeframes",
11119
+ overlays: "overlays",
11120
+ // data
11121
+ historical_data: "historicalData",
11122
+ realtime_data: "realtimeData",
11123
+ multiple_providers: "multipleProviders",
11124
+ data_export: "dataExport",
11125
+ continuous_contracts: "continuousContracts",
11126
+ session_hours: "sessionHours",
11127
+ // trading
11128
+ order_entry: "orderEntry",
11129
+ positions_overlay: "positionsOverlay",
11130
+ bracket_orders: "bracketOrders",
11131
+ trailing_stops: "trailingStops",
11132
+ draggable_orders: "draggableOrders",
11133
+ // scripting
11134
+ forgescript: "forgeScript",
11135
+ custom_indicators: "customIndicators",
11136
+ ai_agent: "aiAgent",
11137
+ // workspace
11138
+ saved_layouts: "savedLayouts",
11139
+ multiple_workspaces: "multipleWorkspaces",
11140
+ watchlists: "watchlists",
11141
+ alerts: "alerts",
11142
+ multi_chart_layout: "multiChartLayout"
11143
+ };
11144
+ var UNMAPPED_KIT_FEATURES = [
11145
+ "delayed_data",
11146
+ "ai_script_conversion"
11147
+ ];
11148
+ var PACKAGE_GATED_CAPABILITIES = new Set(
11149
+ Object.values(KIT_FEATURE_TO_CAPABILITY)
11150
+ );
11151
+ function toCapabilityFlags(kitFlags) {
11152
+ const out = {};
11153
+ for (const [kitKey, enabled] of Object.entries(kitFlags)) {
11154
+ const capability = KIT_FEATURE_TO_CAPABILITY[kitKey];
11155
+ if (capability) out[capability] = enabled === true;
11156
+ }
11157
+ return out;
11158
+ }
11159
+ function packageAllows(flags, capability) {
11160
+ if (flags === null) return true;
11161
+ if (!PACKAGE_GATED_CAPABILITIES.has(capability)) return true;
11162
+ return flags[capability] === true;
11163
+ }
11164
+
11109
11165
  // src/licensing/ChartRuntimeResolver.ts
11110
11166
  var ChartRuntimeResolver = class _ChartRuntimeResolver {
11111
11167
  static instance = null;
@@ -11251,6 +11307,7 @@ var ChartRuntimeResolver = class _ChartRuntimeResolver {
11251
11307
  #capabilityWithOverride(name) {
11252
11308
  const ceiling = this.lm.getCapabilities()[name];
11253
11309
  if (!ceiling) return false;
11310
+ if (!packageAllows(this.#userPackageFeatures, name)) return false;
11254
11311
  const explicit = this.lm.getFeatures()[name];
11255
11312
  return explicit === void 0 ? true : explicit === true;
11256
11313
  }
@@ -11476,10 +11533,44 @@ var ChartRuntimeResolver = class _ChartRuntimeResolver {
11476
11533
  */
11477
11534
  #featureOrDefault(name, defaultValue) {
11478
11535
  if (this.lm.isLockedDown()) return false;
11536
+ if (!packageAllows(this.#userPackageFeatures, name)) return false;
11479
11537
  const features = this.lm.getFeatures();
11480
11538
  const flag = features[name];
11481
11539
  return flag === void 0 ? defaultValue : flag === true;
11482
11540
  }
11541
+ // ── Per-user package gating ─────────────────────────────────────────────────
11542
+ /**
11543
+ * Capability flags from the signed-in user's Kit package, or null when none
11544
+ * has been loaded. Null is the default and means "licence only", so every
11545
+ * deployment predating package gating behaves exactly as it did.
11546
+ */
11547
+ #userPackageFeatures = null;
11548
+ /**
11549
+ * Apply the user's Kit package to capability resolution.
11550
+ *
11551
+ * Pass the `features` map from `GET /api/packages/me` verbatim — snake_case
11552
+ * Kit keys are translated here. Pass null to clear (e.g. on sign-out), which
11553
+ * restores licence-only behaviour.
11554
+ *
11555
+ * This can only ever narrow: a package cannot grant a capability the
11556
+ * deployment licence withholds. Both resolvers below consult the licence
11557
+ * regardless of what the package says.
11558
+ */
11559
+ setUserPackageFeatures(kitFlags) {
11560
+ this.#userPackageFeatures = kitFlags === null ? null : toCapabilityFlags(kitFlags);
11561
+ }
11562
+ /** The resolved capability flags from the user's package, for diagnostics. */
11563
+ getUserPackageFeatures() {
11564
+ return this.#userPackageFeatures;
11565
+ }
11566
+ /**
11567
+ * True when a package has been applied. Useful for telling "this user has no
11568
+ * package" apart from "package gating is not in use", which otherwise look
11569
+ * identical from the outside.
11570
+ */
11571
+ hasUserPackage() {
11572
+ return this.#userPackageFeatures !== null;
11573
+ }
11483
11574
  };
11484
11575
  var resolver = () => ChartRuntimeResolver.getInstance();
11485
11576
  var isManagedMode = () => resolver().isManagedMode();
@@ -18462,6 +18553,52 @@ function useHostLicense(apiUrl, getAuthToken) {
18462
18553
  };
18463
18554
  }, [apiUrl, getAuthToken]);
18464
18555
  }
18556
+ function useUserPackage(apiUrl, getAuthToken) {
18557
+ useEffect(() => {
18558
+ const resolver3 = ChartRuntimeResolver.getInstance();
18559
+ if (!apiUrl || !getAuthToken) {
18560
+ resolver3.setUserPackageFeatures(null);
18561
+ return;
18562
+ }
18563
+ let cancelled = false;
18564
+ void (async () => {
18565
+ try {
18566
+ let token = "";
18567
+ try {
18568
+ token = await getAuthToken();
18569
+ } catch {
18570
+ if (!cancelled) resolver3.setUserPackageFeatures(null);
18571
+ return;
18572
+ }
18573
+ if (cancelled) return;
18574
+ if (!token) {
18575
+ resolver3.setUserPackageFeatures(null);
18576
+ return;
18577
+ }
18578
+ const res = await fetch(`${apiUrl.replace(/\/+$/, "")}/api/packages/me`, {
18579
+ headers: { Authorization: `Bearer ${token}` }
18580
+ });
18581
+ if (cancelled) return;
18582
+ if (!res.ok) {
18583
+ resolver3.setUserPackageFeatures(null);
18584
+ return;
18585
+ }
18586
+ const data = await res.json();
18587
+ if (cancelled) return;
18588
+ if (!data.package) {
18589
+ resolver3.setUserPackageFeatures(null);
18590
+ return;
18591
+ }
18592
+ resolver3.setUserPackageFeatures(data.features ?? {});
18593
+ } catch {
18594
+ if (!cancelled) resolver3.setUserPackageFeatures(null);
18595
+ }
18596
+ })();
18597
+ return () => {
18598
+ cancelled = true;
18599
+ };
18600
+ }, [apiUrl, getAuthToken]);
18601
+ }
18465
18602
  function LicenseRequiredOverlay({
18466
18603
  reason,
18467
18604
  onOpenLicenseSettings
@@ -23042,6 +23179,7 @@ var ChartCanvas = forwardRef(
23042
23179
  const capabilities = useChartCapabilities();
23043
23180
  const dataBlocked = useLicenseDataBlocked();
23044
23181
  useHostLicense(apiUrl, getAuthToken);
23182
+ useUserPackage(apiUrl, getAuthToken);
23045
23183
  const [indicators, setIndicators] = useState([]);
23046
23184
  const [totalHeight, setTotalHeight] = useState(600);
23047
23185
  const [activeTool, setActiveTool] = useState(initialActiveTool ?? "cursor");
@@ -25384,6 +25522,6 @@ var demonstrationTool = {
25384
25522
  cursorStyle: DEMONSTRATION_STYLE
25385
25523
  };
25386
25524
 
25387
- export { CROSSHAIR_LABEL, CROSSHAIR_STYLE, CURRENT_SCHEMA_VERSION, CURSOR_LABEL, CURSOR_STYLE, CandleEngine, Chart, ChartRuntimeResolver, CoordTransform, Crosshair, DEFAULT_SYNC_OPTIONS, DEMONSTRATION_COLOR, DEMONSTRATION_FILL, DEMONSTRATION_LABEL, DEMONSTRATION_RADIUS, DEMONSTRATION_STROKE, DEMONSTRATION_STYLE, DOT_COLOR, DOT_LABEL, DOT_RADIUS, DOT_STYLE, DatafeedConnector, DirtyFlags, ForgeScriptIndicator, ForgeScriptRuntime, Series2 as ForgeScriptSeries, GridChartContainer, GridSyncProvider, IndicatorDAG, InteractionManager, LayerName, LayoutTemplateSelector, LicenseManager, ManagedTradingController, PRODUCT_TIERS, PaneManager, PixiBenchmark, PixiChart, PixiLayerManager, PriceScale, ReferenceAPI, Series, TChart, TimeScale, TradingOverlayStore, UnmanagedIngestion, assertCanPlaceOrders, assertCanUseBrackets, assertCanUseDraggableOrders, assertCanUseManagedTrading, assertManagedMode, canPlaceBrackets, canPlaceOrders, canRenderBracketControls, canRenderBuySellButtons, canRenderCandles, canRenderDrawings, canRenderExternalOverlayOnlyMode, canRenderFills, canRenderIndicators, canRenderManagedTradingControls, canRenderOrderEntry, canRenderOrderModificationControls, canRenderOrderTicket, canRenderOverlays, canRenderPositions, canUseAiAgent, canUseAlerts, canUseBarReplay, canUseBracketOrders, canUseChartTypes, canUseCustomIndicators, canUseCustomTimeframes, canUseDataExport, canUseDraggable, canUseDraggableOrders, canUseDrawingTools, canUseExtendedDrawings, canUseExternalIngestion, canUseForgeScript, canUseHistoricalData, canUseIndicators, canUseManagedTrading, canUseManagedTradingHook, canUseMultiChartLayout, canUseMultiPane, canUseMultipleProviders, canUseMultipleWorkspaces, canUseOrderEntry, canUsePositionsOverlay, canUseRealtimeData, canUseSavedLayouts, canUseTrailingStops, canUseWatchlists, clearTelemetryListeners, computeEMA, computeEMAFromSeries, computeMACD, computeRSI, computeSMA, computeSMAFromSeries, computeVolume, computeWMAFromSeries, createChart, crosshairTool, cursorTool, demonstrationTool, detectLanguage, detectLanguageWithFallback, dotTool, evaluateSaveGate, exchangeNow, extractField, getBucketStart2 as getBucketStart, getCapabilities, getDefaultCapabilities, getDefaultStyle, getGridTemplate, getGroupedTemplates, getMissingBarCount, getStyleSlots, hasFeature, initServerClock, isManagedCapable, isManagedMode, isUnmanagedMode, isValidCombination, lineStyleToDash, mergeBars, migrateLegacyPayload, onConversionEvent, resolveStyle, runSandbox, serverClockOffset, serverNow, timeframeToMs2 as timeframeToMs, useGridSync, validateForgeScript, validateLicensePolicy };
25525
+ export { CROSSHAIR_LABEL, CROSSHAIR_STYLE, CURRENT_SCHEMA_VERSION, CURSOR_LABEL, CURSOR_STYLE, CandleEngine, Chart, ChartRuntimeResolver, CoordTransform, Crosshair, DEFAULT_SYNC_OPTIONS, DEMONSTRATION_COLOR, DEMONSTRATION_FILL, DEMONSTRATION_LABEL, DEMONSTRATION_RADIUS, DEMONSTRATION_STROKE, DEMONSTRATION_STYLE, DOT_COLOR, DOT_LABEL, DOT_RADIUS, DOT_STYLE, DatafeedConnector, DirtyFlags, ForgeScriptIndicator, ForgeScriptRuntime, Series2 as ForgeScriptSeries, GridChartContainer, GridSyncProvider, IndicatorDAG, InteractionManager, KIT_FEATURE_TO_CAPABILITY, LayerName, LayoutTemplateSelector, LicenseManager, ManagedTradingController, PACKAGE_GATED_CAPABILITIES, PRODUCT_TIERS, PaneManager, PixiBenchmark, PixiChart, PixiLayerManager, PriceScale, ReferenceAPI, Series, TChart, TimeScale, TradingOverlayStore, UNMAPPED_KIT_FEATURES, UnmanagedIngestion, assertCanPlaceOrders, assertCanUseBrackets, assertCanUseDraggableOrders, assertCanUseManagedTrading, assertManagedMode, canPlaceBrackets, canPlaceOrders, canRenderBracketControls, canRenderBuySellButtons, canRenderCandles, canRenderDrawings, canRenderExternalOverlayOnlyMode, canRenderFills, canRenderIndicators, canRenderManagedTradingControls, canRenderOrderEntry, canRenderOrderModificationControls, canRenderOrderTicket, canRenderOverlays, canRenderPositions, canUseAiAgent, canUseAlerts, canUseBarReplay, canUseBracketOrders, canUseChartTypes, canUseCustomIndicators, canUseCustomTimeframes, canUseDataExport, canUseDraggable, canUseDraggableOrders, canUseDrawingTools, canUseExtendedDrawings, canUseExternalIngestion, canUseForgeScript, canUseHistoricalData, canUseIndicators, canUseManagedTrading, canUseManagedTradingHook, canUseMultiChartLayout, canUseMultiPane, canUseMultipleProviders, canUseMultipleWorkspaces, canUseOrderEntry, canUsePositionsOverlay, canUseRealtimeData, canUseSavedLayouts, canUseTrailingStops, canUseWatchlists, clearTelemetryListeners, computeEMA, computeEMAFromSeries, computeMACD, computeRSI, computeSMA, computeSMAFromSeries, computeVolume, computeWMAFromSeries, createChart, crosshairTool, cursorTool, demonstrationTool, detectLanguage, detectLanguageWithFallback, dotTool, evaluateSaveGate, exchangeNow, extractField, getBucketStart2 as getBucketStart, getCapabilities, getDefaultCapabilities, getDefaultStyle, getGridTemplate, getGroupedTemplates, getMissingBarCount, getStyleSlots, hasFeature, initServerClock, isManagedCapable, isManagedMode, isUnmanagedMode, isValidCombination, lineStyleToDash, mergeBars, migrateLegacyPayload, onConversionEvent, packageAllows, resolveStyle, runSandbox, serverClockOffset, serverNow, timeframeToMs2 as timeframeToMs, toCapabilityFlags, useGridSync, validateForgeScript, validateLicensePolicy };
25388
25526
  //# sourceMappingURL=internal.js.map
25389
25527
  //# sourceMappingURL=internal.js.map