@lark-apaas/client-toolkit-lite 1.1.7-alpha.27 → 1.1.7-alpha.29

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.cjs CHANGED
@@ -56,6 +56,7 @@ __export(index_exports, {
56
56
  getEnvPath: () => getEnvPath,
57
57
  getWsPath: () => getWsPath,
58
58
  initAxiosConfig: () => initAxiosConfig,
59
+ initObservable: () => initObservable,
59
60
  isIOS: () => isIOS,
60
61
  isIpad: () => isIpad,
61
62
  isMobile: () => isMobile,
@@ -66,6 +67,7 @@ __export(index_exports, {
66
67
  resolveAppUrl: () => resolveAppUrl,
67
68
  safeStringify: () => safeStringify,
68
69
  scopedStorage: () => scopedStorage,
70
+ trace: () => trace,
69
71
  useAppInfo: () => useAppInfo,
70
72
  useCurrentUserProfile: () => useCurrentUserProfile,
71
73
  useIsMobile: () => useIsMobile,
@@ -150,9 +152,43 @@ function initAxiosConfig(axiosInstance2) {
150
152
  }
151
153
  __name(initAxiosConfig, "initAxiosConfig");
152
154
 
153
- // src/logger/logger.ts
155
+ // src/runtime/observable.ts
154
156
  var import_observable_web = require("@lark-apaas/observable-web");
155
157
 
158
+ // src/utils/apiPath.ts
159
+ function isNewPathEnabled() {
160
+ const basePath = process.env.CLIENT_BASE_PATH || "/";
161
+ return /^\/app\/[^/]/.test(basePath);
162
+ }
163
+ __name(isNewPathEnabled, "isNewPathEnabled");
164
+
165
+ // src/runtime/observable.ts
166
+ var initObservable = /* @__PURE__ */ __name(() => {
167
+ try {
168
+ const appId = window.appId;
169
+ import_observable_web.observable.start({
170
+ serviceName: "app",
171
+ env: process.env.NODE_ENV === "development" ? import_observable_web.AppEnv.Dev : import_observable_web.AppEnv.Prod,
172
+ collectorUrl: isNewPathEnabled() ? {
173
+ log: `/app/${appId}/__runtime__/api/v1/observability/logs/collect`,
174
+ trace: `/app/${appId}/__runtime__/api/v1/observability/traces/collect`,
175
+ metric: `/app/${appId}/__runtime__/api/v1/observability/metrics/collect`,
176
+ time: `/app/${appId}/__runtime__/api/v1/observability/current_server_timestamp`
177
+ } : {
178
+ log: `/spark/app/${appId}/runtime/api/v1/observability/logs/collect`,
179
+ trace: `/spark/app/${appId}/runtime/api/v1/observability/traces/collect`,
180
+ metric: `/spark/app/${appId}/runtime/api/v1/observability/metrics/collect`,
181
+ time: `/spark/api/v1/observability/app/${appId}/current_server_timestamp`
182
+ }
183
+ });
184
+ } catch (error) {
185
+ console.error("Failed to start WebObservableSdk:", error);
186
+ }
187
+ }, "initObservable");
188
+
189
+ // src/logger/logger.ts
190
+ var import_observable_web2 = require("@lark-apaas/observable-web");
191
+
156
192
  // src/logger/intercept-global-error.ts
157
193
  var import_internal_slardar = require("@lark-apaas/internal-slardar");
158
194
 
@@ -971,7 +1007,7 @@ var logger = {
971
1007
  console.log(...getFormattedPrefix("info"), message, ...args);
972
1008
  }
973
1009
  if (shouldReportToObservable) {
974
- import_observable_web.observable.log("INFO", processLogParams([
1010
+ import_observable_web2.observable.log("INFO", processLogParams([
975
1011
  message,
976
1012
  ...args
977
1013
  ]).join(" "));
@@ -982,7 +1018,7 @@ var logger = {
982
1018
  console.log(...getFormattedPrefix("warn"), message, ...args);
983
1019
  }
984
1020
  if (shouldReportToObservable) {
985
- import_observable_web.observable.log("WARN", processLogParams([
1021
+ import_observable_web2.observable.log("WARN", processLogParams([
986
1022
  message,
987
1023
  ...args
988
1024
  ]).join(" "));
@@ -993,7 +1029,7 @@ var logger = {
993
1029
  console.error(...getFormattedPrefix("error"), message, ...args);
994
1030
  }
995
1031
  if (shouldReportToObservable) {
996
- import_observable_web.observable.log("ERROR", processLogParams([
1032
+ import_observable_web2.observable.log("ERROR", processLogParams([
997
1033
  message,
998
1034
  ...args
999
1035
  ]).join(" "));
@@ -1004,7 +1040,7 @@ var logger = {
1004
1040
  console.log(...getFormattedPrefix("success"), message, ...args);
1005
1041
  }
1006
1042
  if (shouldReportToObservable) {
1007
- import_observable_web.observable.log("INFO", processLogParams([
1043
+ import_observable_web2.observable.log("INFO", processLogParams([
1008
1044
  message,
1009
1045
  ...args
1010
1046
  ]).join(" "));
@@ -1015,7 +1051,7 @@ var logger = {
1015
1051
  console.log(...getFormattedPrefix(level), ...args);
1016
1052
  }
1017
1053
  if (shouldReportToObservable && level !== "debug") {
1018
- import_observable_web.observable.log(mapLogLevel(level), processLogParams(args).join(" "));
1054
+ import_observable_web2.observable.log(mapLogLevel(level), processLogParams(args).join(" "));
1019
1055
  }
1020
1056
  }
1021
1057
  };
@@ -1124,6 +1160,7 @@ __name(initIframeBridge, "initIframeBridge");
1124
1160
  if (!window.__FULLSTACK_RUNTIME_INITIALIZED__) {
1125
1161
  window.__FULLSTACK_RUNTIME_INITIALIZED__ = true;
1126
1162
  initAxiosConfig();
1163
+ initObservable();
1127
1164
  if (process.env.NODE_ENV !== "production") {
1128
1165
  initIframeBridge();
1129
1166
  }
@@ -1141,16 +1178,6 @@ function getAppId() {
1141
1178
  }
1142
1179
  __name(getAppId, "getAppId");
1143
1180
 
1144
- // src/utils/apiPath.ts
1145
- function isNewPathEnabled() {
1146
- const basePath = process.env.CLIENT_BASE_PATH || "/";
1147
- return /^\/app\/[^/]/.test(basePath);
1148
- }
1149
- __name(isNewPathEnabled, "isNewPathEnabled");
1150
-
1151
- // src/hooks/useAppInfo.tsx
1152
- var import_react = require("react");
1153
-
1154
1181
  // src/utils/getInitialInfo.ts
1155
1182
  async function getAppPublished() {
1156
1183
  try {
@@ -1201,6 +1228,47 @@ function getInitialInfo(refresh = false) {
1201
1228
  }
1202
1229
  __name(getInitialInfo, "getInitialInfo");
1203
1230
 
1231
+ // src/utils/getTenantInfo.ts
1232
+ async function fetchTenantInfo() {
1233
+ try {
1234
+ const appId = getAppId();
1235
+ const path = isNewPathEnabled() ? `/app/${appId}/__runtime__/api/v1/studio/tenant_info` : `/spark/b/${appId}/tenant_info`;
1236
+ const response = await fetch(`${window.location.origin}${path}`, {
1237
+ method: "GET",
1238
+ headers: {
1239
+ "X-Suda-Csrf-Token": getCsrfToken() ?? ""
1240
+ },
1241
+ credentials: "include"
1242
+ });
1243
+ const res = await response.json();
1244
+ return res?.data;
1245
+ } catch {
1246
+ return void 0;
1247
+ }
1248
+ }
1249
+ __name(fetchTenantInfo, "fetchTenantInfo");
1250
+ var tenantInfo;
1251
+ var pendingPromise2 = null;
1252
+ function getTenantInfo() {
1253
+ if (tenantInfo) {
1254
+ return Promise.resolve(tenantInfo);
1255
+ }
1256
+ if (pendingPromise2) {
1257
+ return pendingPromise2;
1258
+ }
1259
+ pendingPromise2 = fetchTenantInfo().then((info) => {
1260
+ tenantInfo = info;
1261
+ return tenantInfo;
1262
+ }).finally(() => {
1263
+ pendingPromise2 = null;
1264
+ });
1265
+ return pendingPromise2;
1266
+ }
1267
+ __name(getTenantInfo, "getTenantInfo");
1268
+
1269
+ // src/hooks/useAppInfo.tsx
1270
+ var import_react = require("react");
1271
+
1204
1272
  // src/integrations/getAppInfo.ts
1205
1273
  async function getAppInfo(refresh = false) {
1206
1274
  let appInfo = typeof window !== "undefined" ? window._appInfo : void 0;
@@ -1337,23 +1405,23 @@ var createDataLoomClient = /* @__PURE__ */ __name((url, pat) => {
1337
1405
  });
1338
1406
  }, "createDataLoomClient");
1339
1407
  var dataloom = null;
1340
- var pendingPromise2 = null;
1408
+ var pendingPromise3 = null;
1341
1409
  function getDataloom() {
1342
1410
  if (dataloom) {
1343
1411
  return Promise.resolve(dataloom);
1344
1412
  }
1345
- if (pendingPromise2) {
1346
- return pendingPromise2;
1413
+ if (pendingPromise3) {
1414
+ return pendingPromise3;
1347
1415
  }
1348
- pendingPromise2 = getInitialInfo().then((info) => {
1416
+ pendingPromise3 = getInitialInfo().then((info) => {
1349
1417
  const DATALOOM_CLIENT_URL = info?.app_runtime_extra?.url;
1350
1418
  const DATALOOM_PAT = info?.app_runtime_extra?.token;
1351
1419
  dataloom = createDataLoomClient(DATALOOM_CLIENT_URL, DATALOOM_PAT);
1352
1420
  return dataloom;
1353
1421
  }).finally(() => {
1354
- pendingPromise2 = null;
1422
+ pendingPromise3 = null;
1355
1423
  });
1356
- return pendingPromise2;
1424
+ return pendingPromise3;
1357
1425
  }
1358
1426
  __name(getDataloom, "getDataloom");
1359
1427
 
@@ -1473,6 +1541,11 @@ __name(useLogout, "useLogout");
1473
1541
 
1474
1542
  // src/locales/messages.ts
1475
1543
  var messages = {
1544
+ // ── Index / 通用 ──────────────────────────────────────────────
1545
+ "index.rateLimitError": {
1546
+ zh: "\u5E94\u7528\u989D\u5EA6\u5DF2\u8017\u5C3D\uFF0C\u8BF7\u8054\u7CFB\u5E94\u7528\u5F00\u53D1\u8005",
1547
+ en: "Application quota exhausted, please contact the app developer"
1548
+ },
1476
1549
  // ── Safety 组件 ──────────────────────────────────────────────
1477
1550
  "safety.badge.label": {
1478
1551
  zh: "\u5999\u642D",
@@ -1852,24 +1925,14 @@ var Safety = /* @__PURE__ */ __name(() => {
1852
1925
  const [badgeLoaded, setBadgeLoaded] = (0, import_react5.useState)(false);
1853
1926
  const timeoutRef = (0, import_react5.useRef)(null);
1854
1927
  (0, import_react5.useEffect)(() => {
1855
- const appId = getAppId();
1856
- const csrfToken = getCsrfToken() ?? "";
1857
- const csrfHeaders = {
1858
- "X-Suda-Csrf-Token": csrfToken
1859
- };
1860
- const tenantInfoUrl = isNewPathEnabled() ? `/app/${appId}/__runtime__/api/v1/studio/tenant_info` : `/spark/b/${appId}/tenant_info`;
1861
- fetch(tenantInfoUrl, {
1862
- headers: csrfHeaders
1863
- }).then((res) => res.json()).then((data) => {
1864
- setUserinfo(data?.data?.tenant_info);
1865
- setIsInternetVisible(data?.data?.is_internet_visible);
1928
+ if (process.env.NODE_ENV !== "production") return;
1929
+ getTenantInfo().then((data) => {
1930
+ setUserinfo(data?.tenant_info ?? null);
1931
+ setIsInternetVisible(!!data?.is_internet_visible);
1866
1932
  }).catch(() => {
1867
1933
  });
1868
- const getPublishedUrl = isNewPathEnabled() ? `/app/${appId}/__runtime__/api/v1/studio/get_published` : `/spark/b/${appId}/get_published`;
1869
- fetch(getPublishedUrl, {
1870
- headers: csrfHeaders
1871
- }).then((res) => res.json()).then((data) => {
1872
- const badge = data?.data?.app_info?.show_badge;
1934
+ getInitialInfo().then((info) => {
1935
+ const badge = info?.app_info?.show_badge;
1873
1936
  setShowBadge(badge !== false);
1874
1937
  }).catch(() => {
1875
1938
  setShowBadge(true);
@@ -1889,7 +1952,6 @@ var Safety = /* @__PURE__ */ __name(() => {
1889
1952
  isMobile2
1890
1953
  ]);
1891
1954
  if (process.env.NODE_ENV !== "production") return null;
1892
- if (String(process.env.MIAODA_APP_TYPE) === "7") return null;
1893
1955
  if (!badgeLoaded) return null;
1894
1956
  if (!showBadge) return null;
1895
1957
  if (!visible) return null;
@@ -2281,31 +2343,6 @@ var reportTeaEvent = /* @__PURE__ */ __name(async ({ trackKey, trackParams = {}
2281
2343
  }
2282
2344
  }, "reportTeaEvent");
2283
2345
 
2284
- // src/components/AppContainer/utils/observable.ts
2285
- var import_observable_web2 = require("@lark-apaas/observable-web");
2286
- var initObservable = /* @__PURE__ */ __name(() => {
2287
- try {
2288
- const appId = window.appId;
2289
- import_observable_web2.observable.start({
2290
- serviceName: "app",
2291
- env: process.env.NODE_ENV === "development" ? import_observable_web2.AppEnv.Dev : import_observable_web2.AppEnv.Prod,
2292
- collectorUrl: isNewPathEnabled() ? {
2293
- log: `/app/${appId}/__runtime__/api/v1/observability/logs/collect`,
2294
- trace: `/app/${appId}/__runtime__/api/v1/observability/traces/collect`,
2295
- metric: `/app/${appId}/__runtime__/api/v1/observability/metrics/collect`,
2296
- time: `/app/${appId}/__runtime__/api/v1/observability/current_server_timestamp`
2297
- } : {
2298
- log: `/spark/app/${appId}/runtime/api/v1/observability/logs/collect`,
2299
- trace: `/spark/app/${appId}/runtime/api/v1/observability/traces/collect`,
2300
- metric: `/spark/app/${appId}/runtime/api/v1/observability/metrics/collect`,
2301
- time: `/spark/api/v1/observability/app/${appId}/current_server_timestamp`
2302
- }
2303
- });
2304
- } catch (error) {
2305
- console.error("Failed to start WebObservableSdk:", error);
2306
- }
2307
- }, "initObservable");
2308
-
2309
2346
  // src/types/tea.ts
2310
2347
  var TrackKey = /* @__PURE__ */ (function(TrackKey2) {
2311
2348
  TrackKey2["VIEW"] = "aily_agent_artifact_page_view";
@@ -2315,9 +2352,6 @@ var TrackKey = /* @__PURE__ */ (function(TrackKey2) {
2315
2352
  // src/components/AppContainer/index.tsx
2316
2353
  var AppContainer = /* @__PURE__ */ __name(({ children }) => {
2317
2354
  useAppInfo();
2318
- (0, import_react9.useEffect)(() => {
2319
- initObservable();
2320
- }, []);
2321
2355
  (0, import_react9.useEffect)(() => {
2322
2356
  if (process.env.NODE_ENV === "production") {
2323
2357
  reportTeaEvent({
@@ -2330,7 +2364,7 @@ var AppContainer = /* @__PURE__ */ __name(({ children }) => {
2330
2364
  });
2331
2365
  }
2332
2366
  }, []);
2333
- return /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, /* @__PURE__ */ import_react9.default.createElement(safety_default, null), process.env.NODE_ENV !== "production" && /* @__PURE__ */ import_react9.default.createElement(import_miaoda_inspector.MiaodaInspector, null), process.env.NODE_ENV !== "production" && /* @__PURE__ */ import_react9.default.createElement(IframeBridge, null), /* @__PURE__ */ import_react9.default.createElement(QueryProvider_default, null, children));
2367
+ return /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, String(process.env.MIAODA_APP_TYPE) !== "7" && /* @__PURE__ */ import_react9.default.createElement(safety_default, null), process.env.NODE_ENV !== "production" && /* @__PURE__ */ import_react9.default.createElement(import_miaoda_inspector.MiaodaInspector, null), process.env.NODE_ENV !== "production" && /* @__PURE__ */ import_react9.default.createElement(IframeBridge, null), /* @__PURE__ */ import_react9.default.createElement(QueryProvider_default, null, children));
2334
2368
  }, "AppContainer");
2335
2369
  var AppContainer_default = AppContainer;
2336
2370
 
@@ -2841,25 +2875,92 @@ var axiosForBackend = getAxiosForBackend();
2841
2875
 
2842
2876
  // src/integrations/capabilityClient.ts
2843
2877
  var import_client_capability = require("@lark-apaas/client-capability");
2878
+
2879
+ // src/components/ui/toast.tsx
2880
+ function showToast2(message, duration = 3e3) {
2881
+ return new Promise((resolve) => {
2882
+ const toast = document.createElement("div");
2883
+ const iconSvg = `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2884
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M8 1.333a6.667 6.667 0 1 1 0 13.334A6.667 6.667 0 0 1 8 1.333ZM8 10a.667.667 0 1 0 0 1.333A.667.667 0 0 0 8 10Zm0-5.333a.667.667 0 0 0-.667.666v3.334a.667.667 0 0 0 1.334 0V5.333A.667.667 0 0 0 8 4.667Z" fill="#ff811a"/>
2885
+ </svg>`;
2886
+ const iconWrapper = document.createElement("span");
2887
+ iconWrapper.innerHTML = iconSvg;
2888
+ Object.assign(iconWrapper.style, {
2889
+ display: "flex",
2890
+ alignItems: "center",
2891
+ marginRight: "8px",
2892
+ flexShrink: "0"
2893
+ });
2894
+ const textWrapper = document.createElement("span");
2895
+ textWrapper.textContent = message;
2896
+ toast.appendChild(iconWrapper);
2897
+ toast.appendChild(textWrapper);
2898
+ Object.assign(toast.style, {
2899
+ position: "fixed",
2900
+ top: "32px",
2901
+ left: "50%",
2902
+ transform: "translate(-50%, -50%)",
2903
+ display: "flex",
2904
+ alignItems: "center",
2905
+ padding: "12px 16px",
2906
+ backgroundColor: "#fff",
2907
+ color: "#1f2329",
2908
+ border: "1px solid #dee0e3",
2909
+ borderRadius: "6px",
2910
+ fontSize: "14px",
2911
+ lineHeight: "1.5",
2912
+ zIndex: "99999",
2913
+ maxWidth: "80vw",
2914
+ wordBreak: "break-word",
2915
+ boxShadow: "0 4px 8px rgba(0, 0, 0, 0.03), 0 3px 6px rgba(0, 0, 0, 0.05), 0 6px 18px rgba(0, 0, 0, 0.03)",
2916
+ opacity: "0",
2917
+ transition: "opacity 0.3s ease"
2918
+ });
2919
+ document.body.appendChild(toast);
2920
+ requestAnimationFrame(() => {
2921
+ toast.style.opacity = "1";
2922
+ });
2923
+ setTimeout(() => {
2924
+ toast.style.opacity = "0";
2925
+ setTimeout(() => {
2926
+ document.body.removeChild(toast);
2927
+ resolve();
2928
+ }, 300);
2929
+ }, duration);
2930
+ });
2931
+ }
2932
+ __name(showToast2, "showToast");
2933
+
2934
+ // src/integrations/capabilityClient.ts
2844
2935
  var _appId = getAppId();
2845
- var _acquireUploadUrl = isNewPathEnabled() ? `/app/${_appId}/__runtime__/api/v1/studio/plugins/tmp_files/acquire_upload_url` : `/af/api/v1/studio/plugins/tmp_files/acquire_upload_url`;
2846
- var _acquireDownloadUrl = isNewPathEnabled() ? `/app/${_appId}/__runtime__/api/v1/studio/plugins/tmp_files/acquire_download_url` : `/af/api/v1/studio/plugins/tmp_files/acquire_download_url`;
2936
+ var _archType = process.env.MIAODA_APP_ARCH_TYPE;
2937
+ var _isFrontendOnly = _archType === "2" || _archType === "3" || _archType === "4";
2847
2938
  var capabilityClient = (0, import_client_capability.createClient)({
2848
2939
  baseURL: normalizeBasePath(process.env.CLIENT_BASE_PATH ?? "/"),
2849
- acquireUploadUrl: _acquireUploadUrl,
2850
- acquireDownloadUrl: _acquireDownloadUrl,
2940
+ acquireUploadUrl: `/app/${_appId}/__runtime__/api/v1/studio/plugins/tmp_files/acquire_upload_url`,
2941
+ acquireDownloadUrl: `/app/${_appId}/__runtime__/api/v1/studio/plugins/tmp_files/acquire_download_url`,
2851
2942
  fetchOptions: {
2852
2943
  headers: {
2853
2944
  "X-Suda-Csrf-Token": window.csrfToken ?? ""
2854
2945
  }
2855
2946
  },
2856
- central: {
2857
- enabled: true,
2858
- // window.appId 由妙搭沙箱 / 线上环境注入;非妙搭场景下 capability 调用本身不可用
2859
- appId: _appId ?? ""
2860
- }
2947
+ logger,
2948
+ onRateLimitError: /* @__PURE__ */ __name(() => {
2949
+ showToast2(t("index.rateLimitError"));
2950
+ }, "onRateLimitError"),
2951
+ ..._isFrontendOnly ? {
2952
+ central: {
2953
+ enabled: true,
2954
+ // window.appId 由妙搭沙箱 / 线上环境注入;非妙搭场景下 capability 调用本身不可用
2955
+ appId: _appId ?? ""
2956
+ }
2957
+ } : {}
2861
2958
  });
2862
2959
 
2960
+ // src/trace/index.ts
2961
+ var import_observable_web3 = require("@lark-apaas/observable-web");
2962
+ var trace = /* @__PURE__ */ __name((...args) => import_observable_web3.observable.trace(...args), "trace");
2963
+
2863
2964
  // src/constants/img-resources/avatar.ts
2864
2965
  var avatar_exports = {};
2865
2966
  __export(avatar_exports, {
@@ -3043,6 +3144,7 @@ var abstractArt3dRenderingCoverImg6 = "https://lf3-static.bytednsdoc.com/obj/ede
3043
3144
  getEnvPath,
3044
3145
  getWsPath,
3045
3146
  initAxiosConfig,
3147
+ initObservable,
3046
3148
  isIOS,
3047
3149
  isIpad,
3048
3150
  isMobile,
@@ -3053,6 +3155,7 @@ var abstractArt3dRenderingCoverImg6 = "https://lf3-static.bytednsdoc.com/obj/ede
3053
3155
  resolveAppUrl,
3054
3156
  safeStringify,
3055
3157
  scopedStorage,
3158
+ trace,
3056
3159
  useAppInfo,
3057
3160
  useCurrentUserProfile,
3058
3161
  useIsMobile,