pi-provider-qoder-cn 0.2.6 → 0.2.8

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/README.md CHANGED
@@ -74,6 +74,7 @@ Qoder CN Plan (personal_standard)
74
74
  Overall [███░░░░░░░░░░░░░░░░░░] 12.5% used
75
75
  Plan quota [███░░░░░░░░░░░░░░░░░░] 250 / 2000 credits 12.5% 1750 left
76
76
  Add-on [░░░░░░░░░░░░░░░░░░░░░] 0 / 700 credits 0% 700 left
77
+ User someone · someone@example.com
77
78
  Expires never
78
79
  Manage https://qoder.com.cn/account/usage
79
80
  ```
package/dist/index.js CHANGED
@@ -1100,6 +1100,16 @@ var init_catalog = __esm({
1100
1100
  });
1101
1101
 
1102
1102
  // src/auth/pat.ts
1103
+ var pat_exports = {};
1104
+ __export(pat_exports, {
1105
+ PAT_REFRESH_PREFIX: () => PAT_REFRESH_PREFIX,
1106
+ credentialsFromPat: () => credentialsFromPat,
1107
+ decodePatRefresh: () => decodePatRefresh,
1108
+ encodePatRefresh: () => encodePatRefresh,
1109
+ exchangeJobToken: () => exchangeJobToken,
1110
+ fetchUserInfo: () => fetchUserInfo,
1111
+ isPatRefresh: () => isPatRefresh
1112
+ });
1103
1113
  function isPatRefresh(refresh) {
1104
1114
  return refresh.startsWith(`${PAT_REFRESH_PREFIX}|`);
1105
1115
  }
@@ -2014,12 +2024,16 @@ function formatQoderUsage(raw, mode, now = Date.now(), options = {}) {
2014
2024
  const notes = [];
2015
2025
  if (danger) {
2016
2026
  notes.push({ label: "Status", value: "quota exceeded", color: ANSI.red });
2017
- if (!showOrg || isPersonalStandard) {
2018
- notes.push({ label: "Daily reset", value: formatDailyResetCountdown(now) });
2019
- }
2020
2027
  }
2021
2028
  if (!showUserQuota && !showAddOnQuota && !showOrg) notes.push({ label: "Buckets", value: "none returned" });
2022
2029
  if (raw?.isPlanQuotaProrated) notes.push({ label: "Note", value: "plan quota is prorated" });
2030
+ const user = options.user;
2031
+ if (user && (user.name || user.email)) {
2032
+ notes.push({ label: "User", value: [user.name, user.email].filter(Boolean).join(" \xB7 ") });
2033
+ }
2034
+ if (isPersonalStandard || !showOrg && formatResetTime(raw?.expiresAt, now) === "never") {
2035
+ notes.push({ label: "Daily reset", value: formatDailyResetCountdown(now) });
2036
+ }
2023
2037
  notes.push({ label: "Expires", value: formatResetTime(raw?.expiresAt, now) });
2024
2038
  const manageUrl = raw?.addOnQuota?.detailUrl || raw?.upgradeUrl || region.manageUrl;
2025
2039
  if (manageUrl) notes.push({ label: "Manage", value: manageUrl });
@@ -2054,14 +2068,30 @@ async function fetchQoderQuota(accessToken, mode) {
2054
2068
  if (!data) throw new Error("Qoder usage response was not JSON.");
2055
2069
  return data;
2056
2070
  }
2057
- async function resolveAccessToken(providerID, ctx) {
2071
+ async function resolveUsageIdentity(providerID, mode, ctx, withIdentity = true) {
2072
+ let access;
2058
2073
  try {
2059
- const fromRegistry = await ctx?.modelRegistry?.getApiKeyForProvider(providerID);
2060
- if (fromRegistry) return fromRegistry;
2074
+ access = await ctx?.modelRegistry?.getApiKeyForProvider(providerID) || void 0;
2061
2075
  } catch {
2062
2076
  }
2063
2077
  const { getCachedCredentials: getCachedCredentials2 } = await Promise.resolve().then(() => (init_oauth(), oauth_exports));
2064
- return getCachedCredentials2("", providerID)?.access || void 0;
2078
+ const stored = getCachedCredentials2("", providerID);
2079
+ access = access || stored?.access || void 0;
2080
+ if (!access) return void 0;
2081
+ if (!withIdentity) return { access, name: "", email: "" };
2082
+ const storedMatches = stored?.access === access;
2083
+ let name = storedMatches && stored?.name || "";
2084
+ let email = storedMatches && stored?.email || "";
2085
+ if (!name && !email) {
2086
+ try {
2087
+ const { fetchUserInfo: fetchUserInfo2 } = await Promise.resolve().then(() => (init_pat(), pat_exports));
2088
+ const info = await fetchUserInfo2(access, mode);
2089
+ name = info.name || "";
2090
+ email = info.email || "";
2091
+ } catch {
2092
+ }
2093
+ }
2094
+ return { access, name, email };
2065
2095
  }
2066
2096
  var FORMAT_ARGS = /* @__PURE__ */ new Set(["json", "raw", "debug"]);
2067
2097
  var PLAIN_ARGS = /* @__PURE__ */ new Set(["plain", "no-color", "nocolor"]);
@@ -2077,14 +2107,15 @@ async function runUsageCommand(mode, args, ctx) {
2077
2107
  const providerID = region.providerID;
2078
2108
  const wantsRaw = FORMAT_ARGS.has((args || "").trim().toLowerCase());
2079
2109
  try {
2080
- const accessToken = await resolveAccessToken(providerID, ctx);
2110
+ const identity = await resolveUsageIdentity(providerID, mode, ctx, !wantsRaw);
2111
+ const accessToken = identity?.access;
2081
2112
  if (!accessToken) {
2082
2113
  ctx?.ui?.notify(`No ${providerID} credentials. Run /login ${providerID} first.`, "warning");
2083
2114
  return;
2084
2115
  }
2085
2116
  const raw = await fetchQoderQuota(accessToken, mode);
2086
2117
  const color = !wantsRaw && shouldColorize(args, { hasUI: Boolean(ctx?.ui) });
2087
- const output = wantsRaw ? JSON.stringify(raw, null, 2) : formatQoderUsage(raw, mode, Date.now(), { color }).lines.join("\n");
2118
+ const output = wantsRaw ? JSON.stringify(raw, null, 2) : formatQoderUsage(raw, mode, Date.now(), { color, user: identity }).lines.join("\n");
2088
2119
  ctx?.ui?.notify(output, "info");
2089
2120
  if (!ctx?.ui) console.log(output);
2090
2121
  } catch (error) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-provider-qoder-cn",
3
- "version": "0.2.6",
3
+ "version": "0.2.8",
4
4
  "description": "Pi extension for Qoder CN — PAT/OAuth auth, /qoder-cn.usage quota command, and enterprise VPC endpoint support",
5
5
  "type": "module",
6
6
  "license": "MIT",