@xpert-ai/chatkit-ui5 0.4.1 → 0.4.3

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;
@@ -2418,6 +2514,16 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
2418
2514
  }
2419
2515
  return onRequestPreview(request);
2420
2516
  },
2517
+ onConnectWorkspaceConnector: async (request) => {
2518
+ var _a2, _b2, _c2;
2519
+ const connect = (_c2 = (_b2 = (_a2 = __privateGet(this, _opts)) == null ? void 0 : _a2.composer) == null ? void 0 : _b2.resources) == null ? void 0 : _c2.onConnect;
2520
+ if (!connect) {
2521
+ __privateMethod(this, _ChatKitElementBase_instances, emitAndThrow_fn).call(this, new IntegrationError(
2522
+ "Add composer.resources.onConnect to handle workspace Connector connections."
2523
+ ));
2524
+ }
2525
+ return connect(request);
2526
+ },
2421
2527
  onWorkbenchClientCommand: async ({
2422
2528
  commandKey,
2423
2529
  payload,
@@ -2860,6 +2966,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
2860
2966
  _petOverlay = new WeakMap();
2861
2967
  _resolveLoaded = new WeakMap();
2862
2968
  _loaded = new WeakMap();
2969
+ _channelId = new WeakMap();
2863
2970
  _messenger = new WeakMap();
2864
2971
  _ChatKitElementBase_instances = new WeakSet();
2865
2972
  emitAndThrow_fn = function(error) {
@@ -3070,7 +3177,8 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
3070
3177
  frameURL.hash = encodeBase64({
3071
3178
  options: getInnerOptions(__privateMethod(this, _ChatKitElementBase_instances, getFrameOptions_fn).call(this, __privateGet(this, _opts))),
3072
3179
  referrer: window.location.origin,
3073
- profile: this.profile
3180
+ profile: this.profile,
3181
+ ...__privateGet(this, _channelId) ? { channelId: __privateGet(this, _channelId) } : {}
3074
3182
  });
3075
3183
  __privateGet(this, _messenger).connect();
3076
3184
  __privateGet(this, _frame).src = frameURL.toString();
@@ -3114,6 +3222,8 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
3114
3222
  "chatkit.response.start": "onResponseStart",
3115
3223
  "chatkit.log": "onLog",
3116
3224
  "chatkit.thread.change": "onThreadChange",
3225
+ "chatkit.project.change": "onProjectChange",
3226
+ "chatkit.connectors.change": "onConnectorsChange",
3117
3227
  "chatkit.thread.load.start": "onThreadLoadStart",
3118
3228
  "chatkit.thread.load.end": "onThreadLoadEnd",
3119
3229
  "chatkit.ready": "onReady",
@@ -3125,6 +3235,8 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
3125
3235
  "chatkit.response.start": "responseStart",
3126
3236
  "chatkit.log": "log",
3127
3237
  "chatkit.thread.change": "threadChange",
3238
+ "chatkit.project.change": "projectChange",
3239
+ "chatkit.connectors.change": "connectorsChange",
3128
3240
  "chatkit.thread.load.start": "threadLoadStart",
3129
3241
  "chatkit.thread.load.end": "threadLoadEnd",
3130
3242
  "chatkit.ready": "ready",