@syntrologie/runtime-sdk 2.13.0 → 2.14.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.
@@ -31,9 +31,9 @@ import {
31
31
  WaitZ,
32
32
  WidgetConfigZ,
33
33
  coreActionStepSchemas
34
- } from "../chunk-L6RJMBR2.js";
35
- import "../chunk-XDYJ64IN.js";
36
- import "../chunk-BU4Z6PD7.js";
34
+ } from "../chunk-77TNZ66J.js";
35
+ import "../chunk-IR6UOR63.js";
36
+ import "../chunk-YLLWLUQX.js";
37
37
  export {
38
38
  AddClassZ,
39
39
  AnchorIdZ,
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  NotificationDeepLinkZ
3
- } from "./chunk-XDYJ64IN.js";
3
+ } from "./chunk-IR6UOR63.js";
4
4
  import {
5
5
  TriggerWhenZ
6
- } from "./chunk-BU4Z6PD7.js";
6
+ } from "./chunk-YLLWLUQX.js";
7
7
 
8
8
  // src/actions/schema.ts
9
9
  import { z } from "zod";
@@ -249,4 +249,4 @@ export {
249
249
  TourZ,
250
250
  coreActionStepSchemas
251
251
  };
252
- //# sourceMappingURL=chunk-L6RJMBR2.js.map
252
+ //# sourceMappingURL=chunk-77TNZ66J.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ActivationConfigZ,
3
3
  ConditionZ
4
- } from "./chunk-BU4Z6PD7.js";
4
+ } from "./chunk-YLLWLUQX.js";
5
5
 
6
6
  // src/config/schema.ts
7
7
  import { z } from "zod";
@@ -46,7 +46,8 @@ var LauncherElementConfigZ = z.object({
46
46
  color: z.string().optional(),
47
47
  size: z.string().optional(),
48
48
  shadow: z.string().optional(),
49
- borderRadius: z.string().optional()
49
+ borderRadius: z.string().optional(),
50
+ icon: z.string().optional()
50
51
  });
51
52
  var TileElementConfigZ = z.object({
52
53
  background: z.string().optional(),
@@ -126,7 +127,6 @@ var CanvasThemeConfigZ = z.object({
126
127
  var LauncherConfigZ = z.object({
127
128
  enabled: z.boolean().optional(),
128
129
  label: z.string().optional(),
129
- icon: z.string().optional(),
130
130
  position: z.string().optional(),
131
131
  animate: z.boolean().optional(),
132
132
  animationStyle: z.enum(["pulse", "bounce", "glow"]).optional(),
@@ -175,4 +175,4 @@ export {
175
175
  CanvasConfigResponseZ,
176
176
  configSchemas
177
177
  };
178
- //# sourceMappingURL=chunk-XDYJ64IN.js.map
178
+ //# sourceMappingURL=chunk-IR6UOR63.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/config/schema.ts"],
4
+ "sourcesContent": ["/**\n * Zod schemas for canvas configuration types.\n *\n * Single source of truth for tile, theme, launcher, and top-level\n * CanvasConfigResponse shapes. These schemas are converted to JSON Schema\n * during build and merged into the unified canvas-config.schema.json.\n *\n * Design decisions:\n * - `.strict()` on top-level objects \u2192 `additionalProperties: false` in JSON Schema\n * - Element sub-schemas (canvas, tile, etc.) are NOT strict to allow future expansion\n */\n\nimport { z } from 'zod';\nimport { ActivationConfigZ, ConditionZ } from '../decisions/schema';\n\n// ============================================================================\n// Tile Notification Sub-Types\n// ============================================================================\n\nconst NotificationDeepLinkZ = z\n .object({\n tileId: z.string(),\n itemId: z.string().optional(),\n })\n .strict();\n\nconst TileNotificationRuleZ = z\n .object({\n on: z.string(),\n title: z.string(),\n body: z.string().optional(),\n icon: z.string().optional(),\n ttl: z.number().optional(),\n cooldown: z.number().optional(),\n deepLink: NotificationDeepLinkZ.optional(),\n })\n .strict();\n\n// ============================================================================\n// Tile\n// ============================================================================\n\nexport const TileZ = z\n .object({\n id: z.string(),\n title: z.string().optional(),\n subtitle: z.string().optional(),\n icon: z.string().optional(),\n priority: z.number().optional(),\n widget: z.string(),\n props: z.record(z.unknown()).optional(),\n activation: ActivationConfigZ.optional(),\n notifications: z.array(TileNotificationRuleZ).optional(),\n })\n .strict();\n\n// ============================================================================\n// Theme Config \u2014 Element Sub-Schemas\n// ============================================================================\n\nexport const CanvasElementConfigZ = z.object({\n position: z.enum(['left', 'right']).optional(),\n layout: z.enum(['overlay', 'push']).optional(),\n background: z.string().optional(),\n blur: z.string().optional(),\n border: z.string().optional(),\n width: z.string().optional(),\n transitionDuration: z.string().optional(),\n transitionEasing: z.string().optional(),\n transitionFade: z.string().optional(),\n});\n\nexport const LauncherElementConfigZ = z.object({\n background: z.string().optional(),\n backgroundHover: z.string().optional(),\n color: z.string().optional(),\n size: z.string().optional(),\n shadow: z.string().optional(),\n borderRadius: z.string().optional(),\n icon: z.string().optional(),\n});\n\nexport const TileElementConfigZ = z.object({\n background: z.string().optional(),\n backgroundHover: z.string().optional(),\n border: z.string().optional(),\n borderRadius: z.string().optional(),\n shadow: z.string().optional(),\n titleColor: z.string().optional(),\n textColor: z.string().optional(),\n iconBackground: z.string().optional(),\n iconShadow: z.string().optional(),\n headerPadding: z.string().optional(),\n bodyPadding: z.string().optional(),\n gap: z.string().optional(),\n});\n\nexport const OverlayElementConfigZ = z.object({\n background: z.string().optional(),\n textColor: z.string().optional(),\n titleColor: z.string().optional(),\n arrowColor: z.string().optional(),\n arrowSize: z.string().optional(),\n border: z.string().optional(),\n borderRadius: z.string().optional(),\n scrimOpacity: z.string().optional(),\n highlightRing: z.string().optional(),\n});\n\nexport const NotificationElementConfigZ = z.object({\n background: z.string().optional(),\n textColor: z.string().optional(),\n textSecondaryColor: z.string().optional(),\n border: z.string().optional(),\n borderRadius: z.string().optional(),\n successColor: z.string().optional(),\n warningColor: z.string().optional(),\n errorColor: z.string().optional(),\n iconBackground: z.string().optional(),\n progressGradient: z.string().optional(),\n});\n\nexport const ContentElementConfigZ = z.object({\n background: z.string().optional(),\n backgroundHover: z.string().optional(),\n border: z.string().optional(),\n borderRadius: z.string().optional(),\n textColor: z.string().optional(),\n textSecondaryColor: z.string().optional(),\n // Accordion layout\n itemDivider: z.string().optional(),\n itemGap: z.string().optional(),\n itemPadding: z.string().optional(),\n itemFontSize: z.string().optional(),\n // Expanded content\n bodyPadding: z.string().optional(),\n bodyFontSize: z.string().optional(),\n // Category headers\n categoryPadding: z.string().optional(),\n categoryGap: z.string().optional(),\n categoryFontSize: z.string().optional(),\n // Search\n searchBackground: z.string().optional(),\n searchColor: z.string().optional(),\n // Chevron\n chevronColor: z.string().optional(),\n});\n\n// ============================================================================\n// Theme Config \u2014 Top-Level\n// ============================================================================\n\nexport const CanvasThemeConfigZ = z\n .object({\n mode: z.enum(['dark', 'light']).optional(),\n fontFamily: z.string().optional(),\n colorPrimary: z.string().optional(),\n colorPrimaryHover: z.string().optional(),\n borderRadius: z.string().optional(),\n canvas: CanvasElementConfigZ.optional(),\n launcher: LauncherElementConfigZ.optional(),\n tile: TileElementConfigZ.optional(),\n overlay: OverlayElementConfigZ.optional(),\n notification: NotificationElementConfigZ.optional(),\n content: ContentElementConfigZ.optional(),\n })\n .strict();\n\n// ============================================================================\n// Launcher Config\n// ============================================================================\n\nexport const LauncherConfigZ = z\n .object({\n enabled: z.boolean().optional(),\n label: z.string().optional(),\n position: z.string().optional(),\n animate: z.boolean().optional(),\n animationStyle: z.enum(['pulse', 'bounce', 'glow']).optional(),\n notificationCount: z.number().optional(),\n })\n .strict();\n\n// ============================================================================\n// Canvas Config Response (top-level)\n// ============================================================================\n\nexport const CanvasConfigResponseZ = z\n .object({\n schemaVersion: z.string().optional(),\n fetchedAt: z.string().datetime(),\n configVersion: z.string().optional(),\n canvasTitle: z.string().optional(),\n tiles: z.array(TileZ),\n actions: z.array(z.any()),\n theme: CanvasThemeConfigZ.optional(),\n launcher: LauncherConfigZ.optional(),\n meta: z\n .object({\n verificationSteps: z\n .array(\n z.union([\n z.string(),\n z.object({\n text: z.string(),\n check: ConditionZ.optional(),\n }),\n ])\n )\n .optional(),\n })\n .passthrough()\n .optional(),\n })\n .strict();\n\n// ============================================================================\n// Export: Array for unified schema generation\n// ============================================================================\n\n/**\n * Config schemas for unified JSON Schema generation.\n * The generator imports this array and converts each to a JSON Schema $def.\n */\nexport const configSchemas = [\n { defName: 'tile', schema: TileZ },\n { defName: 'themeConfig', schema: CanvasThemeConfigZ },\n { defName: 'launcherConfig', schema: LauncherConfigZ },\n { defName: 'canvasConfigResponse', schema: CanvasConfigResponseZ },\n];\n\n// ============================================================================\n// Named Exports\n// ============================================================================\n\nexport { NotificationDeepLinkZ, TileNotificationRuleZ };\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -3,7 +3,7 @@ import {
3
3
  __privateGet,
4
4
  __privateSet,
5
5
  __publicField
6
- } from "./chunk-BU4Z6PD7.js";
6
+ } from "./chunk-YLLWLUQX.js";
7
7
 
8
8
  // ../adaptives/adaptive-content/dist/reconciliation-guard.js
9
9
  function guardAgainstReconciliation(container, anchor, reinsertFn, opts) {
@@ -3456,14 +3456,20 @@ function getAntiFlickerSnippet(config = {}) {
3456
3456
  }
3457
3457
 
3458
3458
  // src/version.ts
3459
- var SDK_VERSION = "2.13.0";
3459
+ var SDK_VERSION = "2.14.0";
3460
3460
 
3461
3461
  // src/types.ts
3462
3462
  var SDK_SCHEMA_VERSION = "2.0";
3463
3463
 
3464
3464
  // src/fetchers/mergeConfigs.ts
3465
- function resolveVariantConfigs(client, keys, _strategy = "first-match") {
3466
- var _a2, _b, _c, _d;
3465
+ function resolveVariantConfigs(client, keys, strategy = "merge") {
3466
+ if (strategy === "first-match") {
3467
+ return resolveFirstMatch(client, keys);
3468
+ }
3469
+ return resolveMerge(client, keys);
3470
+ }
3471
+ function resolveFirstMatch(client, keys) {
3472
+ var _a2;
3467
3473
  for (const key of keys) {
3468
3474
  const value = (_a2 = client.getFeatureValue) == null ? void 0 : _a2.call(client, key, null);
3469
3475
  if (!value || typeof value !== "object") continue;
@@ -3471,20 +3477,60 @@ function resolveVariantConfigs(client, keys, _strategy = "first-match") {
3471
3477
  const hasTiles = variant.tiles && variant.tiles.length > 0;
3472
3478
  const hasActions = variant.actions && variant.actions.length > 0;
3473
3479
  if (hasTiles || hasActions) {
3474
- return {
3475
- tiles: (_b = variant.tiles) != null ? _b : [],
3476
- actions: (_c = variant.actions) != null ? _c : [],
3477
- fetchedAt: (_d = variant.fetchedAt) != null ? _d : (/* @__PURE__ */ new Date()).toISOString(),
3478
- ...variant.schemaVersion && { schemaVersion: variant.schemaVersion },
3479
- ...variant.configVersion && { configVersion: variant.configVersion },
3480
- ...variant.canvasTitle && { canvasTitle: variant.canvasTitle },
3481
- ...variant.theme && { theme: variant.theme },
3482
- ...variant.launcher && { launcher: variant.launcher }
3483
- };
3480
+ return buildConfig([variant]);
3484
3481
  }
3485
3482
  }
3486
3483
  return null;
3487
3484
  }
3485
+ function resolveMerge(client, keys) {
3486
+ var _a2;
3487
+ const variants = [];
3488
+ for (const key of keys) {
3489
+ const value = (_a2 = client.getFeatureValue) == null ? void 0 : _a2.call(client, key, null);
3490
+ if (!value || typeof value !== "object") continue;
3491
+ const variant = value;
3492
+ const hasTiles = variant.tiles && variant.tiles.length > 0;
3493
+ const hasActions = variant.actions && variant.actions.length > 0;
3494
+ if (hasTiles || hasActions) {
3495
+ variants.push(variant);
3496
+ }
3497
+ }
3498
+ if (variants.length === 0) return null;
3499
+ return buildConfig(variants);
3500
+ }
3501
+ function buildConfig(variants) {
3502
+ const allTiles = [];
3503
+ const allActions = [];
3504
+ let fetchedAt;
3505
+ let schemaVersion;
3506
+ let configVersion;
3507
+ let canvasTitle;
3508
+ let theme;
3509
+ let launcher;
3510
+ let meta;
3511
+ for (const variant of variants) {
3512
+ if (variant.tiles) allTiles.push(...variant.tiles);
3513
+ if (variant.actions) allActions.push(...variant.actions);
3514
+ fetchedAt != null ? fetchedAt : fetchedAt = variant.fetchedAt;
3515
+ schemaVersion != null ? schemaVersion : schemaVersion = variant.schemaVersion;
3516
+ configVersion != null ? configVersion : configVersion = variant.configVersion;
3517
+ canvasTitle != null ? canvasTitle : canvasTitle = variant.canvasTitle;
3518
+ theme != null ? theme : theme = variant.theme;
3519
+ launcher != null ? launcher : launcher = variant.launcher;
3520
+ meta != null ? meta : meta = variant.meta;
3521
+ }
3522
+ return {
3523
+ tiles: allTiles,
3524
+ actions: allActions,
3525
+ fetchedAt: fetchedAt != null ? fetchedAt : (/* @__PURE__ */ new Date()).toISOString(),
3526
+ ...schemaVersion && { schemaVersion },
3527
+ ...configVersion && { configVersion },
3528
+ ...canvasTitle && { canvasTitle },
3529
+ ...theme && { theme },
3530
+ ...launcher && { launcher },
3531
+ ...meta && { meta }
3532
+ };
3533
+ }
3488
3534
 
3489
3535
  // src/logger.ts
3490
3536
  var debugEnabled = false;
@@ -3931,6 +3977,36 @@ function getEventName(phEvent) {
3931
3977
  return eventName.replace("$", "posthog.");
3932
3978
  }
3933
3979
  var INTERACTIVE_TAGS = /* @__PURE__ */ new Set(["a", "button", "input", "select", "textarea"]);
3980
+ function parseElementsChain(chain) {
3981
+ if (!chain)
3982
+ return void 0;
3983
+ return chain.split(";").map((segment) => {
3984
+ const el = {};
3985
+ const colonIdx = segment.indexOf(":");
3986
+ const tagPart = colonIdx >= 0 ? segment.slice(0, colonIdx) : segment;
3987
+ const attrPart = colonIdx >= 0 ? segment.slice(colonIdx + 1) : "";
3988
+ const dotIdx = tagPart.indexOf(".");
3989
+ if (dotIdx >= 0) {
3990
+ el.tag_name = tagPart.slice(0, dotIdx);
3991
+ el.attr__class = tagPart.slice(dotIdx + 1).replace(/\./g, " ");
3992
+ } else {
3993
+ el.tag_name = tagPart;
3994
+ }
3995
+ const attrRegex = /([\w$]+)="([^"]*)"/g;
3996
+ let match;
3997
+ while ((match = attrRegex.exec(attrPart)) !== null) {
3998
+ const [, key, value] = match;
3999
+ if (key === "nth-child" || key === "nth-of-type")
4000
+ continue;
4001
+ el[key] = value;
4002
+ }
4003
+ if (el.text) {
4004
+ el.$el_text = el.text;
4005
+ delete el.text;
4006
+ }
4007
+ return el;
4008
+ });
4009
+ }
3934
4010
  function resolveInteractiveTag(elements, directTag) {
3935
4011
  if (directTag && INTERACTIVE_TAGS.has(directTag))
3936
4012
  return directTag;
@@ -3944,17 +4020,20 @@ function resolveInteractiveTag(elements, directTag) {
3944
4020
  return directTag;
3945
4021
  }
3946
4022
  function extractProps(phEvent) {
3947
- var _a2, _b;
4023
+ var _a2, _b, _c;
3948
4024
  const props = {};
3949
4025
  const phProps = phEvent.properties || {};
3950
- const elements = phProps.$elements;
3951
- const directTag = (_b = phProps.$tag_name) != null ? _b : (_a2 = elements == null ? void 0 : elements[0]) == null ? void 0 : _a2.tag_name;
4026
+ const elements = (_a2 = phProps.$elements) != null ? _a2 : typeof phProps.$elements_chain === "string" ? parseElementsChain(phProps.$elements_chain) : void 0;
4027
+ const directTag = (_c = phProps.$tag_name) != null ? _c : (_b = elements == null ? void 0 : elements[0]) == null ? void 0 : _b.tag_name;
3952
4028
  const isClickEvent = phEvent.event === "$autocapture" || phEvent.event === "$click";
3953
4029
  props.tagName = isClickEvent ? resolveInteractiveTag(elements, directTag) : directTag;
3954
4030
  if (phProps.$el_text)
3955
4031
  props.elementText = phProps.$el_text;
3956
4032
  if (elements)
3957
4033
  props.elements = elements;
4034
+ if (isClickEvent && !elements) {
4035
+ console.warn(`[PostHogNormalizer] $autocapture click has no element chain. PostHog may have changed wire format. Properties: $elements=${!!phProps.$elements}, $elements_chain=${typeof phProps.$elements_chain}`);
4036
+ }
3958
4037
  if (phProps.$current_url)
3959
4038
  props.url = phProps.$current_url;
3960
4039
  if (phProps.$pathname)
@@ -5695,7 +5774,6 @@ function ShadowCanvasOverlay({
5695
5774
  onToggle,
5696
5775
  telemetry,
5697
5776
  launcherLabel: _launcherLabel = "Adaptives",
5698
- launcherIcon,
5699
5777
  launcherAnimate = false,
5700
5778
  launcherAnimationStyle: _launcherAnimationStyle = "pulse",
5701
5779
  notificationCount: _notificationCount,
@@ -5706,7 +5784,7 @@ function ShadowCanvasOverlay({
5706
5784
  canvasTitle,
5707
5785
  displayMode = "standard"
5708
5786
  }) {
5709
- var _a2, _b, _c, _d;
5787
+ var _a2, _b, _c, _d, _e;
5710
5788
  const [mounted, setMounted] = useState5(false);
5711
5789
  const [launcherPos, setLauncherPos] = useState5(null);
5712
5790
  const dragRef = useRef5(null);
@@ -5839,7 +5917,7 @@ function ShadowCanvasOverlay({
5839
5917
  }
5840
5918
  }, []);
5841
5919
  const onLauncherPointerUp = useCallback4(
5842
- (_e) => {
5920
+ (_e2) => {
5843
5921
  const drag = dragRef.current;
5844
5922
  dragRef.current = null;
5845
5923
  if (drag && !drag.dragged) {
@@ -6107,10 +6185,10 @@ function ShadowCanvasOverlay({
6107
6185
  /* @__PURE__ */ jsx8("path", { d: "M6 6l12 12" })
6108
6186
  ]
6109
6187
  }
6110
- ) : launcherIcon ? /* @__PURE__ */ jsx8(
6188
+ ) : ((_e = config.launcher) == null ? void 0 : _e.icon) ? /* @__PURE__ */ jsx8(
6111
6189
  "img",
6112
6190
  {
6113
- src: launcherIcon,
6191
+ src: config.launcher.icon,
6114
6192
  alt: "",
6115
6193
  "aria-hidden": "true",
6116
6194
  style: {
@@ -6405,7 +6483,7 @@ function SmartCanvasAppInner({
6405
6483
  initialBatchHandle,
6406
6484
  workspaceTheme
6407
6485
  }) {
6408
- var _a2, _b, _c, _d, _e, _f, _g;
6486
+ var _a2, _b, _c, _d, _e, _f;
6409
6487
  const [open, setOpen] = useState7(controller.getState().open);
6410
6488
  const pageContext = usePageContext();
6411
6489
  const [localUrl, setLocalUrl] = useState7(
@@ -6461,6 +6539,7 @@ function SmartCanvasAppInner({
6461
6539
  const batchHandleRef = useRef7(initialBatchHandle != null ? initialBatchHandle : null);
6462
6540
  const adoptedInitialRef = useRef7(!!initialBatchHandle);
6463
6541
  const runVersionRef = useRef7(0);
6542
+ const pendingRevertRef = useRef7(null);
6464
6543
  useEffect9(() => {
6465
6544
  if (!(runtime3 == null ? void 0 : runtime3.actions)) return;
6466
6545
  if (adoptedInitialRef.current) {
@@ -6472,6 +6551,10 @@ function SmartCanvasAppInner({
6472
6551
  const version = ++runVersionRef.current;
6473
6552
  const stale = () => version !== runVersionRef.current;
6474
6553
  const run = async () => {
6554
+ if (pendingRevertRef.current) {
6555
+ await pendingRevertRef.current;
6556
+ pendingRevertRef.current = null;
6557
+ }
6475
6558
  if (batchHandleRef.current) {
6476
6559
  try {
6477
6560
  await batchHandleRef.current.revertAll();
@@ -6499,7 +6582,7 @@ function SmartCanvasAppInner({
6499
6582
  run();
6500
6583
  return () => {
6501
6584
  if (batchHandleRef.current) {
6502
- batchHandleRef.current.revertAll().catch((err) => {
6585
+ pendingRevertRef.current = batchHandleRef.current.revertAll().catch((err) => {
6503
6586
  console.error("[SmartCanvasApp] Failed to revert actions on cleanup:", err);
6504
6587
  });
6505
6588
  batchHandleRef.current = null;
@@ -6530,10 +6613,9 @@ function SmartCanvasAppInner({
6530
6613
  canvasTitle: configState.canvasTitle,
6531
6614
  telemetry,
6532
6615
  launcherLabel: launcherLabel != null ? launcherLabel : (_b = configState.launcher) == null ? void 0 : _b.label,
6533
- launcherIcon: (_c = configState.launcher) == null ? void 0 : _c.icon,
6534
- launcherAnimate: (_d = configState.launcher) == null ? void 0 : _d.animate,
6535
- launcherAnimationStyle: (_e = configState.launcher) == null ? void 0 : _e.animationStyle,
6536
- notificationCount: (_g = (_f = configState.launcher) == null ? void 0 : _f.notificationCount) != null ? _g : configState.tiles.length,
6616
+ launcherAnimate: (_c = configState.launcher) == null ? void 0 : _c.animate,
6617
+ launcherAnimationStyle: (_d = configState.launcher) == null ? void 0 : _d.animationStyle,
6618
+ notificationCount: (_f = (_e = configState.launcher) == null ? void 0 : _e.notificationCount) != null ? _f : configState.tiles.length,
6537
6619
  footerSlot,
6538
6620
  isOpen: open,
6539
6621
  onToggle: () => controller.toggle(),
@@ -7733,33 +7815,7 @@ var PostHogAdapter = class {
7733
7815
  // Capture performance metrics
7734
7816
  capture_performance: true,
7735
7817
  // Enable web vitals
7736
- enable_recording_console_log: true,
7737
- // Bootstrap callback for when flags are loaded
7738
- loaded: (ph) => {
7739
- if (enableFeatureFlags && this.featureFlagsCallback) {
7740
- ph.onFeatureFlags(() => {
7741
- const allFlags = this.getAllFeatureFlags();
7742
- if (allFlags && this.featureFlagsCallback) {
7743
- this.featureFlagsCallback(allFlags);
7744
- }
7745
- });
7746
- const existingFlags = this.getAllFeatureFlags();
7747
- if (existingFlags && Object.keys(existingFlags).length > 0) {
7748
- this.featureFlagsCallback(existingFlags);
7749
- }
7750
- }
7751
- if (this.captureCallback) {
7752
- ph.on("eventCaptured", (...args) => {
7753
- var _a3;
7754
- const data = args[0];
7755
- const eventName = typeof data === "string" ? data : data == null ? void 0 : data.event;
7756
- const properties = typeof data === "string" ? void 0 : data == null ? void 0 : data.properties;
7757
- if (typeof eventName === "string") {
7758
- (_a3 = this.captureCallback) == null ? void 0 : _a3.call(this, eventName, properties);
7759
- }
7760
- });
7761
- }
7762
- }
7818
+ enable_recording_console_log: true
7763
7819
  };
7764
7820
  const result = posthog.init(
7765
7821
  options.apiKey,
@@ -7769,6 +7825,29 @@ var PostHogAdapter = class {
7769
7825
  if (result) {
7770
7826
  this.client = result;
7771
7827
  }
7828
+ if (this.captureCallback && this.client) {
7829
+ this.client.on("eventCaptured", (...args) => {
7830
+ var _a3;
7831
+ const data = args[0];
7832
+ const eventName = typeof data === "string" ? data : data == null ? void 0 : data.event;
7833
+ const properties = typeof data === "string" ? void 0 : data == null ? void 0 : data.properties;
7834
+ if (typeof eventName === "string") {
7835
+ (_a3 = this.captureCallback) == null ? void 0 : _a3.call(this, eventName, properties);
7836
+ }
7837
+ });
7838
+ }
7839
+ if (enableFeatureFlags && this.featureFlagsCallback && this.client) {
7840
+ this.client.onFeatureFlags(() => {
7841
+ const allFlags = this.getAllFeatureFlags();
7842
+ if (allFlags && this.featureFlagsCallback) {
7843
+ this.featureFlagsCallback(allFlags);
7844
+ }
7845
+ });
7846
+ const existingFlags = this.getAllFeatureFlags();
7847
+ if (existingFlags && Object.keys(existingFlags).length > 0) {
7848
+ this.featureFlagsCallback(existingFlags);
7849
+ }
7850
+ }
7772
7851
  if (this.rrwebCallback && this.client) {
7773
7852
  this.setupRRWebIntercept();
7774
7853
  }
@@ -9113,15 +9192,30 @@ function createActionEngine(options) {
9113
9192
  const handles = [];
9114
9193
  const appliedHandles = [];
9115
9194
  try {
9116
- for (const action of actions) {
9117
- const handle = await apply(action);
9118
- handles.push(handle);
9119
- appliedHandles.push(handle);
9195
+ const results = await Promise.allSettled(actions.map((action) => apply(action)));
9196
+ const errors = [];
9197
+ for (const result of results) {
9198
+ if (result.status === "fulfilled") {
9199
+ handles.push(result.value);
9200
+ appliedHandles.push(result.value);
9201
+ } else {
9202
+ errors.push(
9203
+ result.reason instanceof Error ? result.reason : new Error(String(result.reason))
9204
+ );
9205
+ }
9206
+ }
9207
+ if (errors.length > 0 && appliedHandles.length === 0) {
9208
+ throw errors[0];
9209
+ }
9210
+ if (errors.length > 0) {
9211
+ console.warn(
9212
+ `[ActionEngine] ${errors.length}/${actions.length} action(s) failed in batch:`,
9213
+ errors.map((e) => e.message).join("; ")
9214
+ );
9120
9215
  }
9121
9216
  } catch (error2) {
9122
9217
  console.error(
9123
- `[ActionEngine] Batch apply FAILED at action ${appliedHandles.length + 1}/${actions.length}.`,
9124
- `Successfully applied: ${appliedHandles.length}. Rolling back...`,
9218
+ `[ActionEngine] Batch apply FAILED. Successfully applied: ${appliedHandles.length}. Rolling back...`,
9125
9219
  error2
9126
9220
  );
9127
9221
  for (const handle of appliedHandles) {
@@ -11719,9 +11813,8 @@ var ExperimentsFetcher = class {
11719
11813
  __publicField(this, "featureKey");
11720
11814
  __publicField(this, "manifestKey");
11721
11815
  __publicField(this, "variantFlagPrefix");
11722
- var _a2;
11723
11816
  this.client = options.client;
11724
- this.featureKey = (_a2 = options.featureKey) != null ? _a2 : "smart-canvas-config";
11817
+ this.featureKey = options.featureKey;
11725
11818
  this.manifestKey = options.manifestKey;
11726
11819
  this.variantFlagPrefix = options.variantFlagPrefix;
11727
11820
  }
@@ -12374,4 +12467,4 @@ export {
12374
12467
  encodeToken,
12375
12468
  Syntro
12376
12469
  };
12377
- //# sourceMappingURL=chunk-GF364MMB.js.map
12470
+ //# sourceMappingURL=chunk-JCDCANR7.js.map