chatablex-web-sdk 1.0.31 → 1.0.34

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
@@ -22,6 +22,10 @@ var index_exports = {};
22
22
  __export(index_exports, {
23
23
  Bridge: () => Bridge,
24
24
  ChatableX: () => ChatableX,
25
+ CloudAuthRequiredError: () => CloudAuthRequiredError,
26
+ CloudError: () => CloudError,
27
+ CloudQuotaExceededError: () => CloudQuotaExceededError,
28
+ CloudSubscriptionRequiredError: () => CloudSubscriptionRequiredError,
25
29
  SDK_VERSION: () => SDK_VERSION
26
30
  });
27
31
  module.exports = __toCommonJS(index_exports);
@@ -160,7 +164,7 @@ var Bridge = class {
160
164
  };
161
165
 
162
166
  // src/modules/tool.ts
163
- function createToolModule(bridge, appId) {
167
+ function createToolModule(bridge, appId, agentLock) {
164
168
  let _info = { id: appId, name: appId, version: "1.0.0", description: "" };
165
169
  let _handler = null;
166
170
  const dispatch = async (params) => {
@@ -178,6 +182,7 @@ function createToolModule(bridge, appId) {
178
182
  bridge.addEventListener("toolExecution", async (data) => {
179
183
  const params = data;
180
184
  const requestId = params._requestId;
185
+ if (requestId && agentLock) agentLock._autoLock(requestId);
181
186
  const result = await dispatch(params);
182
187
  if (requestId && window.ChatableXBridge) {
183
188
  window.ChatableXBridge.postMessage(JSON.stringify({
@@ -185,6 +190,7 @@ function createToolModule(bridge, appId) {
185
190
  params: { _requestId: requestId, ...result }
186
191
  }));
187
192
  }
193
+ if (requestId && agentLock) agentLock._autoUnlock(requestId);
188
194
  });
189
195
  return {
190
196
  getInfo() {
@@ -357,10 +363,403 @@ function createAuthModule(bridge) {
357
363
  return new HostAuthProvider(bridge);
358
364
  }
359
365
 
366
+ // src/modules/cloud.ts
367
+ var CloudError = class extends Error {
368
+ constructor(message, code) {
369
+ super(message);
370
+ this.name = "CloudError";
371
+ this.code = code;
372
+ }
373
+ };
374
+ var CloudAuthRequiredError = class extends CloudError {
375
+ constructor(message = "cloud storage requires an authenticated session") {
376
+ super(message, 401);
377
+ this.name = "CloudAuthRequiredError";
378
+ }
379
+ };
380
+ var CloudSubscriptionRequiredError = class extends CloudError {
381
+ constructor(message = "cloud storage requires an active subscription") {
382
+ super(message, 40302);
383
+ this.name = "CloudSubscriptionRequiredError";
384
+ }
385
+ };
386
+ var CloudQuotaExceededError = class extends CloudError {
387
+ constructor(usedBytes, quotaBytes, message = "storage quota exceeded") {
388
+ super(message, 40301);
389
+ this.name = "CloudQuotaExceededError";
390
+ this.usedBytes = usedBytes;
391
+ this.quotaBytes = quotaBytes;
392
+ }
393
+ };
394
+ var DEFAULT_CONTENT_TYPE = "application/octet-stream";
395
+ function normalizeData(data) {
396
+ if (typeof Blob !== "undefined" && data instanceof Blob) {
397
+ return { body: data, size: data.size, type: data.type || "" };
398
+ }
399
+ if (typeof data === "string") {
400
+ const blob = new Blob([data]);
401
+ return { body: blob, size: blob.size, type: "" };
402
+ }
403
+ if (data instanceof ArrayBuffer) {
404
+ return { body: data, size: data.byteLength, type: "" };
405
+ }
406
+ if (ArrayBuffer.isView(data)) {
407
+ return { body: data, size: data.byteLength, type: "" };
408
+ }
409
+ throw new CloudError("unsupported upload data type", 400);
410
+ }
411
+ function createCloudModule(bridge, deps) {
412
+ const { appId, auth } = deps;
413
+ let resolvedBase = deps.apiBaseUrl ? stripTrailingSlash(deps.apiBaseUrl) : null;
414
+ function stripTrailingSlash(url) {
415
+ return url.replace(/\/+$/, "");
416
+ }
417
+ async function baseUrl() {
418
+ if (resolvedBase) return resolvedBase;
419
+ try {
420
+ const r = await bridge.sendMessage("host.getApiBaseUrl", {}, 5e3);
421
+ const url = typeof r === "string" ? r : r && typeof r === "object" && typeof r.base_url === "string" ? r.base_url : "";
422
+ if (url) {
423
+ resolvedBase = stripTrailingSlash(url);
424
+ return resolvedBase;
425
+ }
426
+ } catch {
427
+ }
428
+ throw new CloudError(
429
+ "cloud API base URL is not configured; pass apiBaseUrl to ChatableX.init()",
430
+ 0
431
+ );
432
+ }
433
+ async function authedFetch(path, init) {
434
+ const token = await auth.getToken();
435
+ if (!token) throw new CloudAuthRequiredError();
436
+ const base = await baseUrl();
437
+ const url = `${base}${path}`;
438
+ const build = async () => ({
439
+ ...init,
440
+ headers: { ...init.headers ?? {}, ...await auth.getAuthHeaders() }
441
+ });
442
+ let res = await fetch(url, await build());
443
+ if (res.status === 401 && await auth.refresh()) {
444
+ res = await fetch(url, await build());
445
+ }
446
+ return res;
447
+ }
448
+ async function callApi(path, init) {
449
+ const res = await authedFetch(path, init);
450
+ let body = null;
451
+ try {
452
+ body = await res.json();
453
+ } catch {
454
+ }
455
+ const code = body?.code;
456
+ const message = body?.message || `HTTP ${res.status}`;
457
+ if (!res.ok || body?.success === false) {
458
+ if (code === 40301) {
459
+ const q = body?.data ?? {};
460
+ throw new CloudQuotaExceededError(q.used_bytes ?? 0, q.quota_bytes ?? 0, message);
461
+ }
462
+ if (code === 40302) throw new CloudSubscriptionRequiredError(message);
463
+ if (res.status === 401) throw new CloudAuthRequiredError(message);
464
+ throw new CloudError(message, code ?? res.status);
465
+ }
466
+ return body?.data ?? null;
467
+ }
468
+ function validateFileKey(fileKey) {
469
+ if (!fileKey || typeof fileKey !== "string") {
470
+ throw new CloudError("fileKey is required", 400);
471
+ }
472
+ }
473
+ return {
474
+ async upload(fileKey, data, options = {}) {
475
+ validateFileKey(fileKey);
476
+ const { body, size, type } = normalizeData(data);
477
+ const contentType = options.contentType || type || DEFAULT_CONTENT_TYPE;
478
+ const signed = await callApi("/api/storage/upload-url", {
479
+ method: "POST",
480
+ headers: { "Content-Type": "application/json" },
481
+ body: JSON.stringify({
482
+ app_id: appId,
483
+ file_key: fileKey,
484
+ content_type: contentType,
485
+ size_bytes: size
486
+ })
487
+ });
488
+ const put = await fetch(signed.upload_url, {
489
+ method: "PUT",
490
+ headers: { "Content-Type": contentType },
491
+ body
492
+ });
493
+ if (!put.ok) {
494
+ throw new CloudError(`OSS upload failed: HTTP ${put.status}`, put.status);
495
+ }
496
+ return { fileKey, objectKey: signed.object_key, size, contentType };
497
+ },
498
+ async getDownloadUrl(fileKey) {
499
+ validateFileKey(fileKey);
500
+ const signed = await callApi("/api/storage/download-url", {
501
+ method: "POST",
502
+ headers: { "Content-Type": "application/json" },
503
+ body: JSON.stringify({ app_id: appId, file_key: fileKey })
504
+ });
505
+ return signed.download_url;
506
+ },
507
+ async download(fileKey) {
508
+ const url = await this.getDownloadUrl(fileKey);
509
+ const res = await fetch(url, { method: "GET" });
510
+ if (!res.ok) {
511
+ throw new CloudError(`OSS download failed: HTTP ${res.status}`, res.status);
512
+ }
513
+ return res.blob();
514
+ },
515
+ async list(options = {}) {
516
+ const qs = new URLSearchParams({ app_id: appId });
517
+ if (options.prefix) qs.set("prefix", options.prefix);
518
+ const data = await callApi(`/api/storage/files?${qs.toString()}`, {
519
+ method: "GET"
520
+ });
521
+ return (data?.files ?? []).map((f) => ({
522
+ fileKey: f.file_key,
523
+ size: f.size,
524
+ lastModified: f.last_modified
525
+ }));
526
+ },
527
+ async delete(fileKey) {
528
+ validateFileKey(fileKey);
529
+ const qs = new URLSearchParams({ app_id: appId, file_key: fileKey });
530
+ await callApi(`/api/storage/files?${qs.toString()}`, { method: "DELETE" });
531
+ },
532
+ async usage() {
533
+ const data = await callApi("/api/storage/usage", { method: "GET" });
534
+ return {
535
+ usedBytes: data.used_bytes,
536
+ quotaBytes: data.quota_bytes,
537
+ fileCount: data.file_count,
538
+ reconciledAt: data.reconciled_at
539
+ };
540
+ }
541
+ };
542
+ }
543
+
544
+ // src/assets/bee.png
545
+ var bee_default = "data:image/png;base64,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";
546
+
547
+ // src/modules/agentLock.ts
548
+ var DEFAULT_CONFIG = {
549
+ enabled: true,
550
+ mode: "overlay",
551
+ logoUrl: "",
552
+ message: "Agent \u6B63\u5728\u64CD\u4F5C\uFF0C\u8BF7\u7A0D\u5019\u2026",
553
+ allowCancel: true,
554
+ opacity: 0.3,
555
+ timeout: 3e4,
556
+ debounceUnlock: 200
557
+ };
558
+ var OVERLAY_ID = "__chatablex_agent_lock_overlay__";
559
+ var BLOCKED_EVENTS = [
560
+ "mousedown",
561
+ "mouseup",
562
+ "click",
563
+ "dblclick",
564
+ "contextmenu",
565
+ "keydown",
566
+ "keyup",
567
+ "keypress",
568
+ "touchstart",
569
+ "touchmove",
570
+ "touchend",
571
+ "wheel",
572
+ "scroll",
573
+ "pointerdown",
574
+ "pointerup"
575
+ ];
576
+ var CANCEL_BTN_ID = "__ctx_agent_lock_cancel__";
577
+ function blockEvent(e) {
578
+ const target = e.target;
579
+ if (target?.id === CANCEL_BTN_ID) return;
580
+ e.stopPropagation();
581
+ e.preventDefault();
582
+ }
583
+ function createAgentLockModule(_bridge, userConfig = {}) {
584
+ const cfg = { ...DEFAULT_CONFIG, ...userConfig };
585
+ const logoSrc = cfg.logoUrl || bee_default;
586
+ const listeners = /* @__PURE__ */ new Map();
587
+ let overlayEl = null;
588
+ let locked = false;
589
+ let lockCount = 0;
590
+ let timeoutTimer = null;
591
+ let debounceTimer = null;
592
+ let currentMessage = cfg.message;
593
+ function emit(event, data = {}) {
594
+ const payload = { timestamp: Date.now(), ...data };
595
+ const handlers = listeners.get(event);
596
+ if (handlers) {
597
+ for (const fn of handlers) {
598
+ try {
599
+ fn(payload);
600
+ } catch (e) {
601
+ console.error("[ChatableX AgentLock] event handler error:", e);
602
+ }
603
+ }
604
+ }
605
+ }
606
+ function injectOverlay(message) {
607
+ if (typeof document === "undefined") return;
608
+ if (document.getElementById(OVERLAY_ID)) return;
609
+ const el = document.createElement("div");
610
+ el.id = OVERLAY_ID;
611
+ el.setAttribute("aria-hidden", "true");
612
+ el.style.cssText = [
613
+ "position:fixed",
614
+ "inset:0",
615
+ `z-index:2147483646`,
616
+ `background:rgba(255,255,255,${cfg.opacity})`,
617
+ "display:flex",
618
+ "flex-direction:column",
619
+ "align-items:center",
620
+ "justify-content:center",
621
+ "pointer-events:all",
622
+ "user-select:none",
623
+ "backdrop-filter:blur(1px)",
624
+ "-webkit-backdrop-filter:blur(1px)"
625
+ ].join(";");
626
+ el.innerHTML = `
627
+ <img src="${logoSrc}" alt="" style="width:48px;height:48px;animation:__ctx_spin 1.5s linear infinite;" />
628
+ <p style="margin:12px 0 0;font:14px/1.4 -apple-system,BlinkMacSystemFont,sans-serif;color:#666;">${message}</p>
629
+ ${cfg.allowCancel ? '<button id="__ctx_agent_lock_cancel__" style="margin-top:16px;background:none;border:none;color:#6366f1;font:13px -apple-system,BlinkMacSystemFont,sans-serif;cursor:pointer;text-decoration:underline;padding:4px 8px;">\u53D6\u6D88</button>' : ""}
630
+ `;
631
+ if (!document.getElementById("__ctx_agent_lock_style__")) {
632
+ const style = document.createElement("style");
633
+ style.id = "__ctx_agent_lock_style__";
634
+ style.textContent = "@keyframes __ctx_spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}";
635
+ document.head.appendChild(style);
636
+ }
637
+ for (const evt of BLOCKED_EVENTS) {
638
+ el.addEventListener(evt, blockEvent, { capture: true, passive: false });
639
+ }
640
+ if (cfg.allowCancel) {
641
+ queueMicrotask(() => {
642
+ const btn = el.querySelector("#__ctx_agent_lock_cancel__");
643
+ if (btn) {
644
+ btn.addEventListener("click", (e) => {
645
+ e.stopPropagation();
646
+ handleCancel();
647
+ });
648
+ }
649
+ });
650
+ }
651
+ document.body.appendChild(el);
652
+ overlayEl = el;
653
+ }
654
+ function removeOverlay() {
655
+ if (overlayEl) {
656
+ for (const evt of BLOCKED_EVENTS) {
657
+ overlayEl.removeEventListener(evt, blockEvent, { capture: true });
658
+ }
659
+ overlayEl.remove();
660
+ overlayEl = null;
661
+ }
662
+ const style = typeof document !== "undefined" ? document.getElementById("__ctx_agent_lock_style__") : null;
663
+ if (style) style.remove();
664
+ }
665
+ function startTimeout(ms, requestId) {
666
+ clearTimeoutTimer();
667
+ if (ms <= 0) return;
668
+ timeoutTimer = setTimeout(() => {
669
+ console.warn("[ChatableX] Agent lock timeout \u2014 auto-unlocking");
670
+ forceUnlock();
671
+ emit("timeout", { requestId });
672
+ }, ms);
673
+ }
674
+ function clearTimeoutTimer() {
675
+ if (timeoutTimer !== null) {
676
+ clearTimeout(timeoutTimer);
677
+ timeoutTimer = null;
678
+ }
679
+ }
680
+ function clearDebounceTimer() {
681
+ if (debounceTimer !== null) {
682
+ clearTimeout(debounceTimer);
683
+ debounceTimer = null;
684
+ }
685
+ }
686
+ function doLock(message, timeout, requestId) {
687
+ if (locked) return;
688
+ locked = true;
689
+ currentMessage = message;
690
+ if (cfg.mode === "overlay") {
691
+ injectOverlay(currentMessage);
692
+ }
693
+ startTimeout(timeout, requestId);
694
+ emit("lock", { requestId });
695
+ }
696
+ function forceUnlock(requestId) {
697
+ if (!locked) return;
698
+ locked = false;
699
+ lockCount = 0;
700
+ clearTimeoutTimer();
701
+ clearDebounceTimer();
702
+ if (cfg.mode === "overlay") {
703
+ removeOverlay();
704
+ }
705
+ emit("unlock", { requestId });
706
+ }
707
+ function handleCancel() {
708
+ const rid = void 0;
709
+ forceUnlock(rid);
710
+ emit("cancel", { requestId: rid });
711
+ }
712
+ function lock(opts) {
713
+ if (!cfg.enabled) return;
714
+ const msg = opts?.message ?? cfg.message;
715
+ const timeout = opts?.timeout ?? cfg.timeout;
716
+ doLock(msg, timeout);
717
+ }
718
+ function unlock() {
719
+ forceUnlock();
720
+ }
721
+ function isLocked() {
722
+ return locked;
723
+ }
724
+ function on(event, handler) {
725
+ if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());
726
+ listeners.get(event).add(handler);
727
+ return () => off(event, handler);
728
+ }
729
+ function off(event, handler) {
730
+ listeners.get(event)?.delete(handler);
731
+ }
732
+ function _autoLock(requestId) {
733
+ if (!cfg.enabled) return;
734
+ clearDebounceTimer();
735
+ lockCount++;
736
+ if (!locked) {
737
+ doLock(cfg.message, cfg.timeout, requestId);
738
+ }
739
+ }
740
+ function _autoUnlock(requestId) {
741
+ if (!cfg.enabled) return;
742
+ lockCount = Math.max(0, lockCount - 1);
743
+ if (lockCount === 0) {
744
+ clearDebounceTimer();
745
+ debounceTimer = setTimeout(() => {
746
+ if (lockCount === 0) {
747
+ forceUnlock(requestId);
748
+ }
749
+ }, cfg.debounceUnlock);
750
+ }
751
+ }
752
+ function _destroy() {
753
+ forceUnlock();
754
+ listeners.clear();
755
+ }
756
+ return { lock, unlock, isLocked, on, off, _autoLock, _autoUnlock, _destroy };
757
+ }
758
+
360
759
  // package.json
361
760
  var package_default = {
362
761
  name: "chatablex-web-sdk",
363
- version: "1.0.31",
762
+ version: "1.0.34",
364
763
  description: "ChatableX Web SDK for AI App WebUI development. Provides bridge communication with the ChatableX Flutter client.",
365
764
  main: "dist/index.js",
366
765
  module: "dist/index.mjs",
@@ -379,8 +778,8 @@ var package_default = {
379
778
  "README.zh-CN.md"
380
779
  ],
381
780
  scripts: {
382
- build: "tsup src/index.ts --format cjs,esm --dts --clean",
383
- dev: "tsup src/index.ts --format cjs,esm --dts --watch",
781
+ build: "tsup",
782
+ dev: "tsup --watch",
384
783
  typecheck: "tsc --noEmit",
385
784
  test: "vitest run",
386
785
  "test:watch": "vitest",
@@ -450,8 +849,10 @@ var ChatableX = {
450
849
  } catch {
451
850
  if (debug) console.warn("[ChatableX] sdk_init handshake failed, continuing with defaults");
452
851
  }
453
- const toolModule = createToolModule(bridge, config.appId);
852
+ const agentLockModule = createAgentLockModule(bridge, config.agentLock);
853
+ const toolModule = createToolModule(bridge, config.appId, agentLockModule);
454
854
  if (toolConfig) toolModule._setInfo(toolConfig);
855
+ const authModule = createAuthModule(bridge);
455
856
  const sdk = {
456
857
  ai: createAIModule(bridge),
457
858
  tools: createToolsModule(bridge),
@@ -460,7 +861,13 @@ var ChatableX = {
460
861
  storage: createStorageModule(bridge),
461
862
  tool: toolModule,
462
863
  platform: createPlatformModule(bridge),
463
- auth: createAuthModule(bridge)
864
+ auth: authModule,
865
+ cloud: createCloudModule(bridge, {
866
+ appId: config.appId,
867
+ auth: authModule,
868
+ apiBaseUrl: config.apiBaseUrl
869
+ }),
870
+ agentLock: agentLockModule
464
871
  };
465
872
  window.ChatableX = sdk;
466
873
  _instance = sdk;
@@ -483,5 +890,9 @@ var ChatableX = {
483
890
  0 && (module.exports = {
484
891
  Bridge,
485
892
  ChatableX,
893
+ CloudAuthRequiredError,
894
+ CloudError,
895
+ CloudQuotaExceededError,
896
+ CloudSubscriptionRequiredError,
486
897
  SDK_VERSION
487
898
  });