@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.
package/dist/index.js CHANGED
@@ -47,7 +47,7 @@ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read fr
47
47
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
48
48
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
49
49
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
50
- 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;
50
+ 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;
51
51
  import { normalizePetOptions, DEFAULT_PET_STORAGE_KEY, resolvePetCharacter, normalizeBoundsPadding, getPinnedPetPosition, clampPetPosition } from "@xpert-ai/chatkit-types";
52
52
  class EventEmitter {
53
53
  constructor() {
@@ -367,7 +367,7 @@ const fetchEventSourceWithRetry = async (url, params) => {
367
367
  }
368
368
  });
369
369
  };
370
- function safeRandomUUID() {
370
+ function createSecureChannelId() {
371
371
  const cryptoRef = globalThis.crypto;
372
372
  if (typeof (cryptoRef == null ? void 0 : cryptoRef.randomUUID) === "function") {
373
373
  return cryptoRef.randomUUID();
@@ -379,7 +379,30 @@ function safeRandomUUID() {
379
379
  bytes[8] = bytes[8] & 63 | 128;
380
380
  return [...bytes].map((byte) => byte.toString(16).padStart(2, "0")).join("").replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/, "$1-$2-$3-$4-$5");
381
381
  }
382
- return `ck_${Date.now()}_${Math.random().toString(16).slice(2)}`;
382
+ return null;
383
+ }
384
+ function safeRandomUUID() {
385
+ return createSecureChannelId() ?? `ck_${Date.now()}_${Math.random().toString(16).slice(2)}`;
386
+ }
387
+ function isTrustedChatKitMessageEvent(event, { channelId, expectedOrigin, expectedSource }) {
388
+ const payload = event.data;
389
+ if (!payload || typeof payload !== "object" || !("__xpaiChatKit" in payload)) {
390
+ return false;
391
+ }
392
+ if (payload.__xpaiChatKit !== true) {
393
+ return false;
394
+ }
395
+ if (expectedOrigin !== "*" && event.origin !== expectedOrigin) {
396
+ return false;
397
+ }
398
+ if (event.source === expectedSource) {
399
+ return true;
400
+ }
401
+ const normalizedChannelId = channelId == null ? void 0 : channelId.trim();
402
+ if (normalizedChannelId) {
403
+ return "channelId" in payload && payload.channelId === normalizedChannelId;
404
+ }
405
+ return false;
383
406
  }
384
407
  let IntegrationError$1 = class IntegrationError extends Error {
385
408
  constructor(message) {
@@ -413,10 +436,12 @@ class BaseMessenger {
413
436
  handlers,
414
437
  target,
415
438
  targetOrigin,
439
+ channelId,
416
440
  fetch: fetch2 = window.fetch
417
441
  }) {
418
442
  __publicField(this, "targetOrigin");
419
443
  __publicField(this, "target");
444
+ __publicField(this, "channelId");
420
445
  __publicField(this, "commandHandlers");
421
446
  __publicField(this, "_fetch");
422
447
  __publicField(this, "emitter", new EventEmitter());
@@ -447,7 +472,11 @@ class BaseMessenger {
447
472
  ));
448
473
  __publicField(this, "handleMessage", async (event) => {
449
474
  var _a2, _b2, _c2, _d;
450
- if (!event.data || event.data.__xpaiChatKit !== true || event.origin !== this.targetOrigin || event.source !== this.target()) {
475
+ if (!isTrustedChatKitMessageEvent(event, {
476
+ channelId: this.channelId,
477
+ expectedOrigin: this.targetOrigin,
478
+ expectedSource: this.target()
479
+ })) {
451
480
  return;
452
481
  }
453
482
  const data = event.data;
@@ -588,6 +617,7 @@ class BaseMessenger {
588
617
  this.commandHandlers = handlers;
589
618
  this.target = target;
590
619
  this.targetOrigin = targetOrigin;
620
+ this.channelId = (channelId == null ? void 0 : channelId.trim()) || void 0;
591
621
  this._fetch = (...args) => fetch2(...args);
592
622
  }
593
623
  setTargetOrigin(targetOrigin) {
@@ -597,6 +627,7 @@ class BaseMessenger {
597
627
  var _a2;
598
628
  const message = {
599
629
  __xpaiChatKit: true,
630
+ ...this.channelId ? { channelId: this.channelId } : {},
600
631
  ...data
601
632
  };
602
633
  (_a2 = this.target()) == null ? void 0 : _a2.postMessage(message, this.targetOrigin, transfer);
@@ -712,6 +743,8 @@ const BASE_CAPABILITY_ALLOWLIST = [
712
743
  "event.response.end",
713
744
  "event.response.stop",
714
745
  "event.thread.change",
746
+ "event.project.change",
747
+ "event.connectors.change",
715
748
  "event.tool.change",
716
749
  "event.thread.load.start",
717
750
  "event.thread.load.end",
@@ -817,7 +850,7 @@ const BASE_CAPABILITY_DENYLIST = [
817
850
  "widget.Map"
818
851
  ];
819
852
  const PROFILE_TO_RULES = {
820
- "chatkit": {
853
+ chatkit: {
821
854
  allow: [...BASE_CAPABILITY_ALLOWLIST, "thread.item.image_generation"],
822
855
  deny: BASE_CAPABILITY_DENYLIST
823
856
  }
@@ -1151,6 +1184,7 @@ class PetOverlay {
1151
1184
  this.lastDragPosition = null;
1152
1185
  this.lastDragClientX = null;
1153
1186
  this.dragAnimation = null;
1187
+ this.activePointerId = null;
1154
1188
  this.isDragging = false;
1155
1189
  this.isHovering = false;
1156
1190
  this.movedDuringDrag = false;
@@ -1282,7 +1316,7 @@ class PetOverlay {
1282
1316
  };
1283
1317
  this.handlePointerDown = (event) => {
1284
1318
  var _a2, _b2;
1285
- if (event.button !== 0 || event.ctrlKey) {
1319
+ if (event.button !== 0 || event.ctrlKey || this.isDragging) {
1286
1320
  return;
1287
1321
  }
1288
1322
  this.closeContextMenu();
@@ -1308,12 +1342,17 @@ class PetOverlay {
1308
1342
  this.movedDuringDrag = false;
1309
1343
  this.dragPosition = nextPosition;
1310
1344
  this.isDragging = true;
1345
+ this.activePointerId = event.pointerId;
1311
1346
  this.clearRestingDelayTimer();
1312
1347
  this.isHovering = true;
1348
+ this.captureActivePointer();
1313
1349
  this.installDragListeners();
1314
1350
  this.rescheduleAnimation();
1315
1351
  };
1316
1352
  this.handlePointerMove = (event) => {
1353
+ if (!this.isActiveDragPointer(event)) {
1354
+ return;
1355
+ }
1317
1356
  const nextPosition = this.getNextDragPosition(event);
1318
1357
  const last = this.lastDragPosition;
1319
1358
  if (last && (Math.abs(last.x - nextPosition.x) > DRAG_DIRECTION_THRESHOLD_PX || Math.abs(last.y - nextPosition.y) > DRAG_DIRECTION_THRESHOLD_PX)) {
@@ -1333,20 +1372,18 @@ class PetOverlay {
1333
1372
  this.render();
1334
1373
  };
1335
1374
  this.handlePointerUp = (event) => {
1375
+ if (!this.isActiveDragPointer(event)) {
1376
+ return;
1377
+ }
1336
1378
  const finalPosition = this.lastDragPosition ?? this.getNextDragPosition(event);
1337
- this.isDragging = false;
1338
- this.dragPosition = null;
1339
- this.dragAnimation = null;
1340
- this.lastDragClientX = null;
1341
- this.removeDragListeners();
1342
- this.persistPosition(finalPosition);
1343
- if (event.pointerType === "mouse" && this.isPointerOverPet(event)) {
1344
- this.isHovering = true;
1345
- this.rescheduleAnimation();
1346
- } else {
1347
- this.enterRestingAfterDelay();
1348
- this.rescheduleAnimation();
1379
+ this.finishDrag(finalPosition, event);
1380
+ };
1381
+ this.handleLostPointerCapture = (event) => {
1382
+ if (!this.isActiveDragPointer(event)) {
1383
+ return;
1349
1384
  }
1385
+ const finalPosition = this.lastDragPosition ?? this.getNextDragPosition(event);
1386
+ this.finishDrag(finalPosition, event);
1350
1387
  };
1351
1388
  this.handleClick = () => {
1352
1389
  var _a2;
@@ -1550,6 +1587,7 @@ class PetOverlay {
1550
1587
  pet.addEventListener("pointerenter", this.handlePointerEnter);
1551
1588
  pet.addEventListener("pointerleave", this.handlePointerLeave);
1552
1589
  pet.addEventListener("pointerdown", this.handlePointerDown);
1590
+ pet.addEventListener("lostpointercapture", this.handleLostPointerCapture);
1553
1591
  pet.addEventListener("contextmenu", this.handleContextMenu);
1554
1592
  pet.addEventListener("click", this.handleClick);
1555
1593
  overlay.append(style, pet);
@@ -1559,6 +1597,7 @@ class PetOverlay {
1559
1597
  }
1560
1598
  removeOverlay() {
1561
1599
  var _a2;
1600
+ this.cancelActiveDrag();
1562
1601
  this.clearRestingDelayTimer();
1563
1602
  this.clearTimers();
1564
1603
  this.closeContextMenu();
@@ -1575,6 +1614,10 @@ class PetOverlay {
1575
1614
  "pointerdown",
1576
1615
  this.handlePointerDown
1577
1616
  );
1617
+ this.petElement.removeEventListener(
1618
+ "lostpointercapture",
1619
+ this.handleLostPointerCapture
1620
+ );
1578
1621
  this.petElement.removeEventListener(
1579
1622
  "contextmenu",
1580
1623
  this.handleContextMenu
@@ -2292,6 +2335,34 @@ class PetOverlay {
2292
2335
  this.render();
2293
2336
  }
2294
2337
  }
2338
+ captureActivePointer() {
2339
+ const pointerId = this.activePointerId;
2340
+ const pet = this.petElement;
2341
+ if (pointerId === null || typeof (pet == null ? void 0 : pet.setPointerCapture) !== "function") {
2342
+ return;
2343
+ }
2344
+ try {
2345
+ pet.setPointerCapture(pointerId);
2346
+ } catch {
2347
+ }
2348
+ }
2349
+ releaseActivePointer() {
2350
+ const pointerId = this.activePointerId;
2351
+ const pet = this.petElement;
2352
+ this.activePointerId = null;
2353
+ if (pointerId === null || typeof (pet == null ? void 0 : pet.hasPointerCapture) !== "function" || typeof pet.releasePointerCapture !== "function") {
2354
+ return;
2355
+ }
2356
+ try {
2357
+ if (pet.hasPointerCapture(pointerId)) {
2358
+ pet.releasePointerCapture(pointerId);
2359
+ }
2360
+ } catch {
2361
+ }
2362
+ }
2363
+ isActiveDragPointer(event) {
2364
+ return this.isDragging && event.pointerId === this.activePointerId;
2365
+ }
2295
2366
  getNextDragPosition(event) {
2296
2367
  if (!this.options) {
2297
2368
  return { x: 0, y: 0 };
@@ -2306,12 +2377,35 @@ class PetOverlay {
2306
2377
  normalizeBoundsPadding(this.options.position.boundsPadding)
2307
2378
  );
2308
2379
  }
2380
+ finishDrag(finalPosition, event) {
2381
+ this.isDragging = false;
2382
+ this.dragPosition = null;
2383
+ this.dragAnimation = null;
2384
+ this.lastDragClientX = null;
2385
+ this.removeDragListeners();
2386
+ this.releaseActivePointer();
2387
+ this.persistPosition(finalPosition);
2388
+ if (event.pointerType === "mouse" && this.isPointerOverPet(event)) {
2389
+ this.isHovering = true;
2390
+ this.rescheduleAnimation();
2391
+ } else {
2392
+ this.enterRestingAfterDelay();
2393
+ this.rescheduleAnimation();
2394
+ }
2395
+ }
2396
+ cancelActiveDrag() {
2397
+ this.isDragging = false;
2398
+ this.dragPosition = null;
2399
+ this.dragAnimation = null;
2400
+ this.lastDragPosition = null;
2401
+ this.lastDragClientX = null;
2402
+ this.removeDragListeners();
2403
+ this.releaseActivePointer();
2404
+ }
2309
2405
  installDragListeners() {
2310
2406
  window.addEventListener("pointermove", this.handlePointerMove);
2311
- window.addEventListener("pointerup", this.handlePointerUp, { once: true });
2312
- window.addEventListener("pointercancel", this.handlePointerUp, {
2313
- once: true
2314
- });
2407
+ window.addEventListener("pointerup", this.handlePointerUp);
2408
+ window.addEventListener("pointercancel", this.handlePointerUp);
2315
2409
  }
2316
2410
  removeDragListeners() {
2317
2411
  window.removeEventListener("pointermove", this.handlePointerMove);
@@ -2358,7 +2452,9 @@ class ChatKitElementBase extends (_c = HTMLElement, _focusComposer_dec = [requir
2358
2452
  __privateAdd(this, _loaded, new Promise((resolve) => {
2359
2453
  __privateSet(this, _resolveLoaded, resolve);
2360
2454
  }));
2455
+ __privateAdd(this, _channelId, createSecureChannelId());
2361
2456
  __privateAdd(this, _messenger, new ChatFrameMessenger({
2457
+ channelId: __privateGet(this, _channelId) ?? void 0,
2362
2458
  fetch: (...args) => {
2363
2459
  var _a2;
2364
2460
  const customFetch = ((_a2 = __privateGet(this, _opts)) == null ? void 0 : _a2.api) && "fetch" in __privateGet(this, _opts).api && __privateGet(this, _opts).api.fetch;
@@ -2415,6 +2511,16 @@ class ChatKitElementBase extends (_c = HTMLElement, _focusComposer_dec = [requir
2415
2511
  }
2416
2512
  return onRequestPreview(request);
2417
2513
  },
2514
+ onConnectWorkspaceConnector: async (request) => {
2515
+ var _a2, _b2, _c2;
2516
+ const connect = (_c2 = (_b2 = (_a2 = __privateGet(this, _opts)) == null ? void 0 : _a2.composer) == null ? void 0 : _b2.resources) == null ? void 0 : _c2.onConnect;
2517
+ if (!connect) {
2518
+ __privateMethod(this, _ChatKitElementBase_instances, emitAndThrow_fn).call(this, new IntegrationError2(
2519
+ "Add composer.resources.onConnect to handle workspace Connector connections."
2520
+ ));
2521
+ }
2522
+ return connect(request);
2523
+ },
2418
2524
  onWorkbenchClientCommand: async ({
2419
2525
  commandKey,
2420
2526
  payload,
@@ -2857,6 +2963,7 @@ _shadow = new WeakMap();
2857
2963
  _petOverlay = new WeakMap();
2858
2964
  _resolveLoaded = new WeakMap();
2859
2965
  _loaded = new WeakMap();
2966
+ _channelId = new WeakMap();
2860
2967
  _messenger = new WeakMap();
2861
2968
  _ChatKitElementBase_instances = new WeakSet();
2862
2969
  emitAndThrow_fn = function(error) {
@@ -3067,7 +3174,8 @@ maybeInit_fn = function() {
3067
3174
  frameURL.hash = encodeBase64({
3068
3175
  options: getInnerOptions(__privateMethod(this, _ChatKitElementBase_instances, getFrameOptions_fn).call(this, __privateGet(this, _opts))),
3069
3176
  referrer: window.location.origin,
3070
- profile: this.profile
3177
+ profile: this.profile,
3178
+ ...__privateGet(this, _channelId) ? { channelId: __privateGet(this, _channelId) } : {}
3071
3179
  });
3072
3180
  __privateGet(this, _messenger).connect();
3073
3181
  __privateGet(this, _frame).src = frameURL.toString();
@@ -3111,6 +3219,8 @@ const EVENT_HANDLER_MAP = {
3111
3219
  "chatkit.response.start": "onResponseStart",
3112
3220
  "chatkit.log": "onLog",
3113
3221
  "chatkit.thread.change": "onThreadChange",
3222
+ "chatkit.project.change": "onProjectChange",
3223
+ "chatkit.connectors.change": "onConnectorsChange",
3114
3224
  "chatkit.thread.load.start": "onThreadLoadStart",
3115
3225
  "chatkit.thread.load.end": "onThreadLoadEnd",
3116
3226
  "chatkit.ready": "onReady",
@@ -3122,6 +3232,8 @@ const UI5_EVENT_NAME_MAP = {
3122
3232
  "chatkit.response.start": "responseStart",
3123
3233
  "chatkit.log": "log",
3124
3234
  "chatkit.thread.change": "threadChange",
3235
+ "chatkit.project.change": "projectChange",
3236
+ "chatkit.connectors.change": "connectorsChange",
3125
3237
  "chatkit.thread.load.start": "threadLoadStart",
3126
3238
  "chatkit.thread.load.end": "threadLoadEnd",
3127
3239
  "chatkit.ready": "ready",