dsh-cloudq 0.1.3 → 0.1.4

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/lib/client.js CHANGED
@@ -2134,7 +2134,7 @@ display: none;
2134
2134
  hint.className = "dsh-cloudq-panel__hint";
2135
2135
  hint.textContent = "正在加载用量…";
2136
2136
  tableWrap.appendChild(hint);
2137
- cloudqRequest(`${API_USAGE}?start=${encodeURIComponent(range.start)}&end=${encodeURIComponent(range.end)}`).then((data) => {
2137
+ requireCloudqCredential().then(() => cloudqRequest(`${API_USAGE}?start=${encodeURIComponent(range.start)}&end=${encodeURIComponent(range.end)}`)).then((data) => {
2138
2138
  if (panelView !== "usage" || !panelExpanded) return;
2139
2139
  value.textContent = formatCredits(data.overview?.TotalCredits);
2140
2140
  const rows = Array.isArray(data.detail) ? data.detail : [];
@@ -2300,7 +2300,7 @@ display: none;
2300
2300
  hint.className = "dsh-cloudq-panel__hint";
2301
2301
  hint.textContent = "正在加载灵感…";
2302
2302
  list.appendChild(hint);
2303
- cloudqRequest(API_INSPIRATIONS).then((data) => {
2303
+ requireCloudqCredential().then(() => cloudqRequest(API_INSPIRATIONS)).then((data) => {
2304
2304
  inspirationCache = Array.isArray(data.inspirations) ? data.inspirations : [];
2305
2305
  paint(inspirationCache);
2306
2306
  }).catch((error) => {
@@ -2442,7 +2442,7 @@ display: none;
2442
2442
  hint.className = "dsh-cloudq-panel__hint";
2443
2443
  hint.textContent = "正在加载制品…";
2444
2444
  panelBody.appendChild(hint);
2445
- cloudqRequest(API_ARTIFACTS).then((data) => {
2445
+ requireCloudqCredential().then(() => cloudqRequest(API_ARTIFACTS)).then((data) => {
2446
2446
  artifactCache = Array.isArray(data?.sessions) ? data.sessions : [];
2447
2447
  artifactTotal = Number(data?.total) || artifactCache.length;
2448
2448
  paint(artifactCache, artifactTotal);
@@ -2742,7 +2742,7 @@ display: none;
2742
2742
  paintDirectories(architectureDirectoriesCache, architectureFirstFolderId);
2743
2743
  return;
2744
2744
  }
2745
- cloudqRequest(API_ARCH_DIRECTORIES).then((data) => {
2745
+ requireCloudqCredential().then(() => cloudqRequest(API_ARCH_DIRECTORIES)).then((data) => {
2746
2746
  architectureDirectoriesCache = Array.isArray(data?.folders) ? data.folders : [];
2747
2747
  architectureFirstFolderId = Number(data?.firstFolderId) || null;
2748
2748
  paintDirectories(architectureDirectoriesCache, architectureFirstFolderId);
@@ -3041,14 +3041,32 @@ display: none;
3041
3041
  this.code = code;
3042
3042
  }
3043
3043
  };
3044
+ const CLOUDQ_AUTH_ERROR_CODES = /* @__PURE__ */ new Set([
3045
+ "NeedAuth",
3046
+ "CredentialExpired",
3047
+ "AuthFailure"
3048
+ ]);
3044
3049
  /**
3045
- * Panel-facing error text. A missing credential gets an actionable pointer to
3046
- * the settings card instead of a raw load failure message.
3050
+ * Panel-facing error text. Credential problems carry an actionable Host
3051
+ * message and are shown directly instead of a raw load failure prefix.
3047
3052
  */
3048
3053
  function cloudqPanelErrorText(error, prefix) {
3049
- if (error instanceof CloudQApiError && error.code === "NeedAuth") return "尚未配置 AK/SK,请前往「设置 → 插件 → CloudQ」完成配置后重试。";
3054
+ if (error instanceof CloudQApiError && CLOUDQ_AUTH_ERROR_CODES.has(error.code)) return error.message;
3050
3055
  return `${prefix}:${error instanceof Error ? error.message : "未知错误"}`;
3051
3056
  }
3057
+ /**
3058
+ * Reject with an actionable NeedAuth error when no credential is configured,
3059
+ * so data views show the settings guide without calling the CloudQ APIs.
3060
+ * Returns undefined when the status check itself fails, letting the data
3061
+ * request surface its own error.
3062
+ */
3063
+ function requireCloudqCredential() {
3064
+ return cloudqRequest(API_CREDENTIAL).then((response) => {
3065
+ if (response.status?.logged_in !== true) throw new CloudQApiError("尚未配置 AK/SK,请前往「设置 → 插件 → CloudQ」完成配置后重试。", "NeedAuth");
3066
+ }).catch((error) => {
3067
+ if (error instanceof CloudQApiError && error.code === "NeedAuth") throw error;
3068
+ });
3069
+ }
3052
3070
  async function cloudqRequest(url, init, timeoutMs = 2e4) {
3053
3071
  const controller = new AbortController();
3054
3072
  const timeout = window.setTimeout(() => controller.abort(), timeoutMs);
package/lib/index.js CHANGED
@@ -424,7 +424,11 @@ async function runScript(scriptName, args, options) {
424
424
  try {
425
425
  return await runScript$1(resolve(skillDirectory(), "scripts"), scriptName, args, options);
426
426
  } catch (error) {
427
- if (error instanceof HttpError && error.code === "NeedAuth") throw new HttpError(401, "NeedAuth", "尚未配置 AK/SK,请前往「设置 → 插件 → CloudQ」完成配置。");
427
+ if (error instanceof HttpError) {
428
+ if (error.code === "NeedAuth") throw new HttpError(401, "NeedAuth", "尚未配置 AK/SK,请前往「设置 → 插件 → CloudQ」完成配置。");
429
+ if (error.code === "CredentialExpired") throw new HttpError(401, "CredentialExpired", "凭证已过期,请前往「设置 → 插件 → CloudQ」重新配置。");
430
+ if (typeof error.code === "string" && error.code.startsWith("AuthFailure")) throw new HttpError(401, "AuthFailure", "AK/SK 无效或权限不足,请前往「设置 → 插件 → CloudQ」检查配置。");
431
+ }
428
432
  throw error;
429
433
  }
430
434
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-cloudq",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "CloudQ integration for DeepSeek Harness with secure credential, workspace, and plugin-management surfaces",
5
5
  "license": "MIT",
6
6
  "type": "module",