@xpert-ai/chatkit-ui5 0.4.1 → 0.4.2

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.
@@ -51,7 +51,7 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
51
51
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
52
52
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
53
53
 
54
- var _a, _b, _setTrainingOptOut_dec, _hideHistory_dec, _showHistory_dec, _sendCustomAction_dec, _shareThread_dec, _setThreadId_dec, _setRuntimeCapabilities_dec, _setComposerValue_dec, _sendUserMessage_dec, _fetchUpdates_dec, _focusComposer_dec, _c, _opts, _frameUrl, _frame, _wrapper, _launcherCloseButton, _launcherOpen, _chatMinimizedToPet, _framePetOptionsOverride, _petClosedByContextMenu, _shadow, _petOverlay, _resolveLoaded, _loaded, _messenger, _ChatKitElementBase_instances, emitAndThrow_fn, setOptionsDataAttributes_fn, getDisplayMode_fn, getConfiguredPetOptions_fn, mergeConfiguredPetPositionDefaults_fn, getOverlayPetOptions_fn, resolvePetAssetUrl_fn, resolveOverlayPetOptions_fn, getFrameOptions_fn, setLauncherOpen_fn, setChatMinimizedToPet_fn, syncPetOverlayOptions_fn, handlePetActivate_fn, handlePetClose_fn, handlePetReply_fn, handlePetThreadSummaryActivate_fn, _handleLauncherClose, getFrameUrl_fn, setFrameUrl_fn, consumeFrameUrl_fn, _handleFrameLoad, _initialized, maybeInit_fn, _init;
54
+ var _a, _b, _setTrainingOptOut_dec, _hideHistory_dec, _showHistory_dec, _sendCustomAction_dec, _shareThread_dec, _setThreadId_dec, _setRuntimeCapabilities_dec, _setComposerValue_dec, _sendUserMessage_dec, _fetchUpdates_dec, _focusComposer_dec, _c, _opts, _frameUrl, _frame, _wrapper, _launcherCloseButton, _launcherOpen, _chatMinimizedToPet, _framePetOptionsOverride, _petClosedByContextMenu, _shadow, _petOverlay, _resolveLoaded, _loaded, _channelId, _messenger, _ChatKitElementBase_instances, emitAndThrow_fn, setOptionsDataAttributes_fn, getDisplayMode_fn, getConfiguredPetOptions_fn, mergeConfiguredPetPositionDefaults_fn, getOverlayPetOptions_fn, resolvePetAssetUrl_fn, resolveOverlayPetOptions_fn, getFrameOptions_fn, setLauncherOpen_fn, setChatMinimizedToPet_fn, syncPetOverlayOptions_fn, handlePetActivate_fn, handlePetClose_fn, handlePetReply_fn, handlePetThreadSummaryActivate_fn, _handleLauncherClose, getFrameUrl_fn, setFrameUrl_fn, consumeFrameUrl_fn, _handleFrameLoad, _initialized, maybeInit_fn, _init;
55
55
  class EventEmitter {
56
56
  constructor() {
57
57
  __publicField(this, "callbacks", /* @__PURE__ */ new Map());
@@ -370,7 +370,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
370
370
  }
371
371
  });
372
372
  };
373
- function safeRandomUUID() {
373
+ function createSecureChannelId() {
374
374
  const cryptoRef = globalThis.crypto;
375
375
  if (typeof (cryptoRef == null ? void 0 : cryptoRef.randomUUID) === "function") {
376
376
  return cryptoRef.randomUUID();
@@ -382,7 +382,30 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
382
382
  bytes[8] = bytes[8] & 63 | 128;
383
383
  return [...bytes].map((byte) => byte.toString(16).padStart(2, "0")).join("").replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/, "$1-$2-$3-$4-$5");
384
384
  }
385
- return `ck_${Date.now()}_${Math.random().toString(16).slice(2)}`;
385
+ return null;
386
+ }
387
+ function safeRandomUUID() {
388
+ return createSecureChannelId() ?? `ck_${Date.now()}_${Math.random().toString(16).slice(2)}`;
389
+ }
390
+ function isTrustedChatKitMessageEvent(event, { channelId, expectedOrigin, expectedSource }) {
391
+ const payload = event.data;
392
+ if (!payload || typeof payload !== "object" || !("__xpaiChatKit" in payload)) {
393
+ return false;
394
+ }
395
+ if (payload.__xpaiChatKit !== true) {
396
+ return false;
397
+ }
398
+ if (expectedOrigin !== "*" && event.origin !== expectedOrigin) {
399
+ return false;
400
+ }
401
+ if (event.source === expectedSource) {
402
+ return true;
403
+ }
404
+ const normalizedChannelId = channelId == null ? void 0 : channelId.trim();
405
+ if (normalizedChannelId) {
406
+ return "channelId" in payload && payload.channelId === normalizedChannelId;
407
+ }
408
+ return false;
386
409
  }
387
410
  let IntegrationError$1 = class IntegrationError2 extends Error {
388
411
  constructor(message) {
@@ -416,10 +439,12 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
416
439
  handlers,
417
440
  target,
418
441
  targetOrigin,
442
+ channelId,
419
443
  fetch: fetch2 = window.fetch
420
444
  }) {
421
445
  __publicField(this, "targetOrigin");
422
446
  __publicField(this, "target");
447
+ __publicField(this, "channelId");
423
448
  __publicField(this, "commandHandlers");
424
449
  __publicField(this, "_fetch");
425
450
  __publicField(this, "emitter", new EventEmitter());
@@ -450,7 +475,11 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
450
475
  ));
451
476
  __publicField(this, "handleMessage", async (event) => {
452
477
  var _a2, _b2, _c2, _d;
453
- if (!event.data || event.data.__xpaiChatKit !== true || event.origin !== this.targetOrigin || event.source !== this.target()) {
478
+ if (!isTrustedChatKitMessageEvent(event, {
479
+ channelId: this.channelId,
480
+ expectedOrigin: this.targetOrigin,
481
+ expectedSource: this.target()
482
+ })) {
454
483
  return;
455
484
  }
456
485
  const data = event.data;
@@ -591,6 +620,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
591
620
  this.commandHandlers = handlers;
592
621
  this.target = target;
593
622
  this.targetOrigin = targetOrigin;
623
+ this.channelId = (channelId == null ? void 0 : channelId.trim()) || void 0;
594
624
  this._fetch = (...args) => fetch2(...args);
595
625
  }
596
626
  setTargetOrigin(targetOrigin) {
@@ -600,6 +630,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
600
630
  var _a2;
601
631
  const message = {
602
632
  __xpaiChatKit: true,
633
+ ...this.channelId ? { channelId: this.channelId } : {},
603
634
  ...data
604
635
  };
605
636
  (_a2 = this.target()) == null ? void 0 : _a2.postMessage(message, this.targetOrigin, transfer);
@@ -715,6 +746,8 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
715
746
  "event.response.end",
716
747
  "event.response.stop",
717
748
  "event.thread.change",
749
+ "event.project.change",
750
+ "event.connectors.change",
718
751
  "event.tool.change",
719
752
  "event.thread.load.start",
720
753
  "event.thread.load.end",
@@ -820,7 +853,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
820
853
  "widget.Map"
821
854
  ];
822
855
  const PROFILE_TO_RULES = {
823
- "chatkit": {
856
+ chatkit: {
824
857
  allow: [...BASE_CAPABILITY_ALLOWLIST, "thread.item.image_generation"],
825
858
  deny: BASE_CAPABILITY_DENYLIST
826
859
  }
@@ -1154,6 +1187,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1154
1187
  this.lastDragPosition = null;
1155
1188
  this.lastDragClientX = null;
1156
1189
  this.dragAnimation = null;
1190
+ this.activePointerId = null;
1157
1191
  this.isDragging = false;
1158
1192
  this.isHovering = false;
1159
1193
  this.movedDuringDrag = false;
@@ -1285,7 +1319,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1285
1319
  };
1286
1320
  this.handlePointerDown = (event) => {
1287
1321
  var _a2, _b2;
1288
- if (event.button !== 0 || event.ctrlKey) {
1322
+ if (event.button !== 0 || event.ctrlKey || this.isDragging) {
1289
1323
  return;
1290
1324
  }
1291
1325
  this.closeContextMenu();
@@ -1311,12 +1345,17 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1311
1345
  this.movedDuringDrag = false;
1312
1346
  this.dragPosition = nextPosition;
1313
1347
  this.isDragging = true;
1348
+ this.activePointerId = event.pointerId;
1314
1349
  this.clearRestingDelayTimer();
1315
1350
  this.isHovering = true;
1351
+ this.captureActivePointer();
1316
1352
  this.installDragListeners();
1317
1353
  this.rescheduleAnimation();
1318
1354
  };
1319
1355
  this.handlePointerMove = (event) => {
1356
+ if (!this.isActiveDragPointer(event)) {
1357
+ return;
1358
+ }
1320
1359
  const nextPosition = this.getNextDragPosition(event);
1321
1360
  const last = this.lastDragPosition;
1322
1361
  if (last && (Math.abs(last.x - nextPosition.x) > DRAG_DIRECTION_THRESHOLD_PX || Math.abs(last.y - nextPosition.y) > DRAG_DIRECTION_THRESHOLD_PX)) {
@@ -1336,20 +1375,18 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1336
1375
  this.render();
1337
1376
  };
1338
1377
  this.handlePointerUp = (event) => {
1378
+ if (!this.isActiveDragPointer(event)) {
1379
+ return;
1380
+ }
1339
1381
  const finalPosition = this.lastDragPosition ?? this.getNextDragPosition(event);
1340
- this.isDragging = false;
1341
- this.dragPosition = null;
1342
- this.dragAnimation = null;
1343
- this.lastDragClientX = null;
1344
- this.removeDragListeners();
1345
- this.persistPosition(finalPosition);
1346
- if (event.pointerType === "mouse" && this.isPointerOverPet(event)) {
1347
- this.isHovering = true;
1348
- this.rescheduleAnimation();
1349
- } else {
1350
- this.enterRestingAfterDelay();
1351
- this.rescheduleAnimation();
1382
+ this.finishDrag(finalPosition, event);
1383
+ };
1384
+ this.handleLostPointerCapture = (event) => {
1385
+ if (!this.isActiveDragPointer(event)) {
1386
+ return;
1352
1387
  }
1388
+ const finalPosition = this.lastDragPosition ?? this.getNextDragPosition(event);
1389
+ this.finishDrag(finalPosition, event);
1353
1390
  };
1354
1391
  this.handleClick = () => {
1355
1392
  var _a2;
@@ -1553,6 +1590,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1553
1590
  pet.addEventListener("pointerenter", this.handlePointerEnter);
1554
1591
  pet.addEventListener("pointerleave", this.handlePointerLeave);
1555
1592
  pet.addEventListener("pointerdown", this.handlePointerDown);
1593
+ pet.addEventListener("lostpointercapture", this.handleLostPointerCapture);
1556
1594
  pet.addEventListener("contextmenu", this.handleContextMenu);
1557
1595
  pet.addEventListener("click", this.handleClick);
1558
1596
  overlay.append(style, pet);
@@ -1562,6 +1600,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1562
1600
  }
1563
1601
  removeOverlay() {
1564
1602
  var _a2;
1603
+ this.cancelActiveDrag();
1565
1604
  this.clearRestingDelayTimer();
1566
1605
  this.clearTimers();
1567
1606
  this.closeContextMenu();
@@ -1578,6 +1617,10 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1578
1617
  "pointerdown",
1579
1618
  this.handlePointerDown
1580
1619
  );
1620
+ this.petElement.removeEventListener(
1621
+ "lostpointercapture",
1622
+ this.handleLostPointerCapture
1623
+ );
1581
1624
  this.petElement.removeEventListener(
1582
1625
  "contextmenu",
1583
1626
  this.handleContextMenu
@@ -2295,6 +2338,34 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
2295
2338
  this.render();
2296
2339
  }
2297
2340
  }
2341
+ captureActivePointer() {
2342
+ const pointerId = this.activePointerId;
2343
+ const pet = this.petElement;
2344
+ if (pointerId === null || typeof (pet == null ? void 0 : pet.setPointerCapture) !== "function") {
2345
+ return;
2346
+ }
2347
+ try {
2348
+ pet.setPointerCapture(pointerId);
2349
+ } catch {
2350
+ }
2351
+ }
2352
+ releaseActivePointer() {
2353
+ const pointerId = this.activePointerId;
2354
+ const pet = this.petElement;
2355
+ this.activePointerId = null;
2356
+ if (pointerId === null || typeof (pet == null ? void 0 : pet.hasPointerCapture) !== "function" || typeof pet.releasePointerCapture !== "function") {
2357
+ return;
2358
+ }
2359
+ try {
2360
+ if (pet.hasPointerCapture(pointerId)) {
2361
+ pet.releasePointerCapture(pointerId);
2362
+ }
2363
+ } catch {
2364
+ }
2365
+ }
2366
+ isActiveDragPointer(event) {
2367
+ return this.isDragging && event.pointerId === this.activePointerId;
2368
+ }
2298
2369
  getNextDragPosition(event) {
2299
2370
  if (!this.options) {
2300
2371
  return { x: 0, y: 0 };
@@ -2309,12 +2380,35 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
2309
2380
  chatkitTypes.normalizeBoundsPadding(this.options.position.boundsPadding)
2310
2381
  );
2311
2382
  }
2383
+ finishDrag(finalPosition, event) {
2384
+ this.isDragging = false;
2385
+ this.dragPosition = null;
2386
+ this.dragAnimation = null;
2387
+ this.lastDragClientX = null;
2388
+ this.removeDragListeners();
2389
+ this.releaseActivePointer();
2390
+ this.persistPosition(finalPosition);
2391
+ if (event.pointerType === "mouse" && this.isPointerOverPet(event)) {
2392
+ this.isHovering = true;
2393
+ this.rescheduleAnimation();
2394
+ } else {
2395
+ this.enterRestingAfterDelay();
2396
+ this.rescheduleAnimation();
2397
+ }
2398
+ }
2399
+ cancelActiveDrag() {
2400
+ this.isDragging = false;
2401
+ this.dragPosition = null;
2402
+ this.dragAnimation = null;
2403
+ this.lastDragPosition = null;
2404
+ this.lastDragClientX = null;
2405
+ this.removeDragListeners();
2406
+ this.releaseActivePointer();
2407
+ }
2312
2408
  installDragListeners() {
2313
2409
  window.addEventListener("pointermove", this.handlePointerMove);
2314
- window.addEventListener("pointerup", this.handlePointerUp, { once: true });
2315
- window.addEventListener("pointercancel", this.handlePointerUp, {
2316
- once: true
2317
- });
2410
+ window.addEventListener("pointerup", this.handlePointerUp);
2411
+ window.addEventListener("pointercancel", this.handlePointerUp);
2318
2412
  }
2319
2413
  removeDragListeners() {
2320
2414
  window.removeEventListener("pointermove", this.handlePointerMove);
@@ -2361,7 +2455,9 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
2361
2455
  __privateAdd(this, _loaded, new Promise((resolve) => {
2362
2456
  __privateSet(this, _resolveLoaded, resolve);
2363
2457
  }));
2458
+ __privateAdd(this, _channelId, createSecureChannelId());
2364
2459
  __privateAdd(this, _messenger, new ChatFrameMessenger({
2460
+ channelId: __privateGet(this, _channelId) ?? void 0,
2365
2461
  fetch: (...args) => {
2366
2462
  var _a2;
2367
2463
  const customFetch = ((_a2 = __privateGet(this, _opts)) == null ? void 0 : _a2.api) && "fetch" in __privateGet(this, _opts).api && __privateGet(this, _opts).api.fetch;
@@ -2860,6 +2956,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
2860
2956
  _petOverlay = new WeakMap();
2861
2957
  _resolveLoaded = new WeakMap();
2862
2958
  _loaded = new WeakMap();
2959
+ _channelId = new WeakMap();
2863
2960
  _messenger = new WeakMap();
2864
2961
  _ChatKitElementBase_instances = new WeakSet();
2865
2962
  emitAndThrow_fn = function(error) {
@@ -3070,7 +3167,8 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
3070
3167
  frameURL.hash = encodeBase64({
3071
3168
  options: getInnerOptions(__privateMethod(this, _ChatKitElementBase_instances, getFrameOptions_fn).call(this, __privateGet(this, _opts))),
3072
3169
  referrer: window.location.origin,
3073
- profile: this.profile
3170
+ profile: this.profile,
3171
+ ...__privateGet(this, _channelId) ? { channelId: __privateGet(this, _channelId) } : {}
3074
3172
  });
3075
3173
  __privateGet(this, _messenger).connect();
3076
3174
  __privateGet(this, _frame).src = frameURL.toString();
@@ -3114,6 +3212,8 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
3114
3212
  "chatkit.response.start": "onResponseStart",
3115
3213
  "chatkit.log": "onLog",
3116
3214
  "chatkit.thread.change": "onThreadChange",
3215
+ "chatkit.project.change": "onProjectChange",
3216
+ "chatkit.connectors.change": "onConnectorsChange",
3117
3217
  "chatkit.thread.load.start": "onThreadLoadStart",
3118
3218
  "chatkit.thread.load.end": "onThreadLoadEnd",
3119
3219
  "chatkit.ready": "onReady",
@@ -3125,6 +3225,8 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
3125
3225
  "chatkit.response.start": "responseStart",
3126
3226
  "chatkit.log": "log",
3127
3227
  "chatkit.thread.change": "threadChange",
3228
+ "chatkit.project.change": "projectChange",
3229
+ "chatkit.connectors.change": "connectorsChange",
3128
3230
  "chatkit.thread.load.start": "threadLoadStart",
3129
3231
  "chatkit.thread.load.end": "threadLoadEnd",
3130
3232
  "chatkit.ready": "ready",