@ckyueix/glm-usage 0.1.5 → 0.1.6

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.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{TypertRemoteService}from"@deepseek-ai/dsh-typert-protocol";import z from"@deepseek-ai/schemastery";var QUOTA_ENDPOINT="https://open.bigmodel.cn/api/monitor/usage/quota/limit",QuotaError=Object.freeze({BAD_JSON:"bad_json",API_REJECTED:"api_rejected",NO_DATA:"no_data",NO_WINDOWS:"no_windows"}),WINDOW_UNITS=Object.freeze({hours:3,week:6});function amountOf(value){return typeof value=="number"&&Number.isFinite(value)?value:typeof value=="string"&&value.trim()!==""&&Number.isFinite(Number(value))?Number(value):null}function usedPercentOf(value){let n=amountOf(value);return n===null||n<0||n>100?null:Math.round(n)}function projectLimit(item){if(typeof item!="object"||item===null||item.type!=="TOKENS_LIMIT"&&item.type!=="CREDIT_LIMIT")return null;let usedPercent=usedPercentOf(item.percentage);if(usedPercent===null)return null;let total=amountOf(item.usage),remaining=amountOf(item.remaining),resetRaw=amountOf(item.nextResetTime),resetMs=resetRaw!==null&&resetRaw>0?Math.round(resetRaw):null,active=usedPercent>0||resetMs!==null;return Object.freeze({type:item.type,usedPercent,...total!==null?{total}:{},...remaining!==null?{remaining}:{},...resetMs!==null?{resetMs}:{},active})}function pickWindow(items){let token=items.find(w=>w.type==="TOKENS_LIMIT");return token!==void 0?token:items.find(w=>w.type==="CREDIT_LIMIT")??null}function parseQuotaResponse(body){let parsed;try{let text=typeof body=="string"?body:new TextDecoder().decode(body);parsed=JSON.parse(text)}catch{return{ok:!1,error:QuotaError.BAD_JSON}}if(typeof parsed!="object"||parsed===null)return{ok:!1,error:QuotaError.BAD_JSON};if(parsed.success!==!0)return{ok:!1,error:QuotaError.API_REJECTED};let data=parsed.data;if(typeof data!="object"||data===null||Array.isArray(data))return{ok:!1,error:QuotaError.NO_DATA};let pairs=(Array.isArray(data.limits)?data.limits:[]).map(item=>[item,projectLimit(item)]).filter(([,window])=>window!==null),fiveHourRaw=[],weeklyRaw=[];for(let[item,window]of pairs){let unit=amountOf(item.unit),number_=amountOf(item.number);unit===WINDOW_UNITS.hours&&number_===5?fiveHourRaw.push(window):unit===WINDOW_UNITS.week&&weeklyRaw.push(window)}let fiveHour=pickWindow(fiveHourRaw),weekly=pickWindow(weeklyRaw);return fiveHour===null&&weekly===null?{ok:!1,error:QuotaError.NO_WINDOWS}:{ok:!0,level:typeof data.level=="string"&&data.level.length>0?data.level:null,windows:{fiveHour,weekly}}}function buildPayload(providerId,parsed,fetchedAt,{stale=!1}={}){let payload={status:"ok",provider:providerId,fetchedAt,stale,windows:{fiveHour:parsed.windows.fiveHour,weekly:parsed.windows.weekly}};return parsed.level!==null&&(payload.level=parsed.level),payload}var REMOTE_METHOD_DESCRIPTOR="@deepseek-ai/dsh-typert-protocol/remote-methods",Status=Object.freeze({OK:"ok",NOT_GLM:"not_glm",NO_CREDENTIAL:"no_credential",INVALID_PROVIDER:"invalid_provider",CONFIG_MISMATCH:"config_mismatch",CONFIG_UNVERIFIED:"config_unverified",FETCH_FAILED:"fetch_failed",BAD_RESPONSE:"bad_response"}),GLM_OFFICIAL_HOSTS=new Set(["open.bigmodel.cn"]),CHINA_CODING_PROVIDER="zai-coding-cn",CHINA_CODING_BASE_URL="https://open.bigmodel.cn/api/coding/paas/v4";function glmUrlEvidence(baseURL){if(baseURL===void 0||baseURL==="")return"unknown";let url;try{url=new URL(baseURL)}catch{return"no"}return url.protocol!=="https:"?"no":GLM_OFFICIAL_HOSTS.has(url.hostname)?"yes":"no"}var plain=value=>value!==null&&typeof value=="object"&&typeof value.get=="function"?value.get():value,GLM_API_KINDS=new Set(["zai","openai-completions","anthropic-messages"]),CODING_DEFAULT_KINDS=new Set(["zai","openai-completions"]),GlmQuotaService=class extends TypertRemoteService{static inject=[];static Config=z.object({providers:z.dict(z.string().pattern(/^[A-Z_][A-Z0-9_]*$/u)).default({}).volatile(),autoDiscover:z.boolean().default(!0).volatile(),ttlMs:z.natural().min(6e4).max(864e5).default(6e4).description("\u914D\u989D\u5237\u65B0\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09\uFF1A\u9ED8\u8BA4 60000\uFF1B\u6700\u5C0F 1 \u5206\u949F\uFF0C\u6700\u5927 24 \u5C0F\u65F6\u3002\u540C\u6B65\u63A7\u5236 Host \u7F13\u5B58\u548C\u53EF\u89C1\u9875\u9762\u5237\u65B0\u3002").volatile(),minIntervalMs:z.natural().min(1e3).default(6e4).volatile(),timeoutMs:z.natural().min(1e3).max(12e4).default(1e4).volatile()});cache=new Map;inFlight=new Map;lastAttempt=new Map;fetchImpl=globalThis.fetch;constructor(ctx,config){super(ctx,"glmQuota"),this.config=config,ctx.effect(()=>async()=>{for(let controller of this.inFlight.values())controller.abort(new Error("glm-quota: disposed"));this.inFlight.clear(),this.cache.clear()})}async get(providerId,options){return{...await this._get(providerId,options),ttlMs:this.config.ttlMs.get()}}async _get(providerId,options){if(typeof providerId!="string"||providerId.length===0||providerId.length>200)return{status:Status.INVALID_PROVIDER,provider:typeof providerId=="string"?providerId:"",reason:"invalid_provider"};let force=options!==null&&typeof options=="object"&&options.force===!0,cached=this.cache.get(providerId),now=Date.now();if(!force&&cached!==void 0&&now-cached.at<this.config.ttlMs.get())return{...cached.payload,stale:!1};let running=this.inFlight.get(providerId);if(running!==void 0)return running.promise.then(payload=>({...payload}));let attempt=this.lastAttempt.get(providerId);if(!force&&attempt!==void 0&&now-attempt<this.config.minIntervalMs.get())return cached!==void 0?{...cached.payload,stale:!0}:{status:Status.FETCH_FAILED,provider:providerId,reason:"cooldown"};let controller=new AbortController,entry={controller,promise:null};return this.inFlight.set(providerId,entry),this.lastAttempt.set(providerId,now),entry.promise=this._query(providerId,controller.signal,cached).then(payload=>(payload.status===Status.OK&&this.cache.set(providerId,{at:payload.fetchedAt,payload}),payload)).finally(()=>{this.inFlight.delete(providerId);try{this.ctx.emit("glm-quota/changed",{provider:providerId})}catch{}}),entry.promise}async _query(providerId,signal,cached){let gate=this._providerGate(providerId);if(!gate.allowed)return{status:gate.status,provider:providerId};let token=await this._resolveCredential(gate.ref);if(token===null)return{status:Status.NO_CREDENTIAL,provider:providerId,reason:gate.ref};try{let timeout=AbortSignal.timeout(this.config.timeoutMs.get()),combined=signal.aborted?signal:AbortSignal.any([signal,timeout]),body=await(await this.fetchImpl(QUOTA_ENDPOINT,{method:"GET",headers:{Authorization:token,Accept:"application/json","Accept-Language":"zh-CN,zh"},signal:combined})).text(),parsed=parseQuotaResponse(body);return parsed.ok?buildPayload(providerId,parsed,Date.now()):this._withStale({status:parsed.error===QuotaError.API_REJECTED?Status.BAD_RESPONSE:Status.FETCH_FAILED,provider:providerId,reason:parsed.error},cached)}catch(error){let reason=signal.aborted?"cancelled":error instanceof Error&&error.name==="TimeoutError"?"timeout":"network";return this._withStale({status:Status.FETCH_FAILED,provider:providerId,reason},cached)}}_withStale(payload,cached){return cached!==void 0?{...cached.payload,stale:!0,supersedes:payload}:payload}_providerGate(providerId){let configured=this.config.providers.get(),explicit=Object.prototype.hasOwnProperty.call(configured,providerId)?configured[providerId]:void 0,profile=null;try{profile=this._piAiProfile(providerId)}catch{profile=null}return explicit!==void 0?profile===null?{allowed:!1,status:Status.CONFIG_UNVERIFIED}:(typeof profile.apiKeyEnv=="string"&&profile.apiKeyEnv.length>0?profile.apiKeyEnv:void 0)!==explicit?{allowed:!1,status:Status.CONFIG_MISMATCH}:!profile.kindOk||profile.urlEvidence==="no"?{allowed:!1,status:Status.NOT_GLM}:{allowed:!0,ref:explicit}:this.config.autoDiscover.get()?profile===null?{allowed:!1,status:Status.NOT_GLM}:typeof profile.apiKeyEnv!="string"||profile.apiKeyEnv.length===0?{allowed:!1,status:Status.NOT_GLM}:!profile.kindOk||profile.urlEvidence!=="yes"?{allowed:!1,status:Status.NOT_GLM}:{allowed:!0,ref:profile.apiKeyEnv}:{allowed:!1,status:Status.NOT_GLM}}_piAiProfile(providerId){let llm=this.ctx.get("llm"),loader=this.ctx.get("loader");if(llm===void 0||loader===void 0||!llm.listProviders().some(row=>row.id===providerId))return null;let directory=llm.listConfigurableProviders().find(row=>row.provider===providerId);if(directory===void 0)return null;let entry=[...loader.entries()].find(row=>row.options.id===directory.settingsNs);if(entry?.fiber?.state!==2)return null;let profiles=entry.fiber.config?.providers?.get?.();if(profiles===null||typeof profiles!="object"||Array.isArray(profiles)||!Object.prototype.hasOwnProperty.call(profiles,providerId))return null;let profile=profiles[providerId];if(profile===null||typeof profile!="object"||Array.isArray(profile))return null;let apiKeyEnv=plain(profile.apiKeyEnv),api=plain(profile.api),baseURL=plain(profile.baseURL),nativeChinaDefault=providerId===CHINA_CODING_PROVIDER&&baseURL===void 0&&(api===void 0||CODING_DEFAULT_KINDS.has(api))&&directory.declared===!1&&directory.error===void 0&&directory.defaultBaseURL===CHINA_CODING_BASE_URL;return{apiKeyEnv:typeof apiKeyEnv=="string"&&apiKeyEnv.length>0?apiKeyEnv:void 0,kindOk:api===void 0||GLM_API_KINDS.has(api),urlEvidence:nativeChinaDefault?"yes":typeof baseURL=="string"?glmUrlEvidence(baseURL):"unknown"}}async _resolveCredential(ref){let credentials=this.ctx.get("credentials");if(credentials!==void 0){let hit=await credentials.resolve(ref);return hit!==void 0&&typeof hit.value=="string"&&hit.value.length>0?hit.value:null}let ambient=process.env[ref];return typeof ambient=="string"&&ambient.length>0?ambient:null}};Object.defineProperty(GlmQuotaService.prototype,REMOTE_METHOD_DESCRIPTOR,{configurable:!0,value:Object.freeze({version:1,methods:Object.freeze([Object.freeze({method:"get",invocation:Object.freeze({kind:"direct"})})])})});export{Status,GlmQuotaService as default};
1
+ import{TypertRemoteService}from"@deepseek-ai/dsh-typert-protocol";import z from"@deepseek-ai/schemastery";var QUOTA_ENDPOINT="https://open.bigmodel.cn/api/monitor/usage/quota/limit",QuotaError=Object.freeze({BAD_JSON:"bad_json",API_REJECTED:"api_rejected",NO_DATA:"no_data",NO_WINDOWS:"no_windows"}),WINDOW_UNITS=Object.freeze({hours:3,week:6});function amountOf(value){return typeof value=="number"&&Number.isFinite(value)?value:typeof value=="string"&&value.trim()!==""&&Number.isFinite(Number(value))?Number(value):null}function usedPercentOf(value){let n=amountOf(value);return n===null||n<0||n>100?null:Math.round(n)}function projectLimit(item){if(typeof item!="object"||item===null||item.type!=="TOKENS_LIMIT"&&item.type!=="CREDIT_LIMIT")return null;let usedPercent=usedPercentOf(item.percentage);if(usedPercent===null)return null;let total=amountOf(item.usage),remaining=amountOf(item.remaining),resetRaw=amountOf(item.nextResetTime),resetMs=resetRaw!==null&&resetRaw>0?Math.round(resetRaw):null,active=usedPercent>0||resetMs!==null;return Object.freeze({type:item.type,usedPercent,...total!==null?{total}:{},...remaining!==null?{remaining}:{},...resetMs!==null?{resetMs}:{},active})}function pickWindow(items){let token=items.find(w=>w.type==="TOKENS_LIMIT");return token!==void 0?token:items.find(w=>w.type==="CREDIT_LIMIT")??null}function parseQuotaResponse(body){let parsed;try{let text=typeof body=="string"?body:new TextDecoder().decode(body);parsed=JSON.parse(text)}catch{return{ok:!1,error:QuotaError.BAD_JSON}}if(typeof parsed!="object"||parsed===null)return{ok:!1,error:QuotaError.BAD_JSON};if(parsed.success!==!0)return{ok:!1,error:QuotaError.API_REJECTED};let data=parsed.data;if(typeof data!="object"||data===null||Array.isArray(data))return{ok:!1,error:QuotaError.NO_DATA};let pairs=(Array.isArray(data.limits)?data.limits:[]).map(item=>[item,projectLimit(item)]).filter(([,window])=>window!==null),fiveHourRaw=[],weeklyRaw=[];for(let[item,window]of pairs){let unit=amountOf(item.unit),number_=amountOf(item.number);unit===WINDOW_UNITS.hours&&number_===5?fiveHourRaw.push(window):unit===WINDOW_UNITS.week&&weeklyRaw.push(window)}let fiveHour=pickWindow(fiveHourRaw),weekly=pickWindow(weeklyRaw);return fiveHour===null&&weekly===null?{ok:!1,error:QuotaError.NO_WINDOWS}:{ok:!0,level:typeof data.level=="string"&&data.level.length>0?data.level:null,windows:{fiveHour,weekly}}}function buildPayload(providerId,parsed,fetchedAt,{stale=!1}={}){let payload={status:"ok",provider:providerId,fetchedAt,stale,windows:{fiveHour:parsed.windows.fiveHour,weekly:parsed.windows.weekly}};return parsed.level!==null&&(payload.level=parsed.level),payload}var REMOTE_METHOD_DESCRIPTOR="@deepseek-ai/dsh-typert-protocol/remote-methods",Status=Object.freeze({OK:"ok",NOT_GLM:"not_glm",NO_CREDENTIAL:"no_credential",INVALID_PROVIDER:"invalid_provider",CONFIG_MISMATCH:"config_mismatch",CONFIG_UNVERIFIED:"config_unverified",FETCH_FAILED:"fetch_failed",BAD_RESPONSE:"bad_response"}),GLM_OFFICIAL_HOSTS=new Set(["open.bigmodel.cn"]),CHINA_CODING_PROVIDER="zai-coding-cn",CHINA_CODING_BASE_URL="https://open.bigmodel.cn/api/coding/paas/v4";function glmUrlEvidence(baseURL){if(baseURL===void 0||baseURL==="")return"unknown";let url;try{url=new URL(baseURL)}catch{return"no"}return url.protocol!=="https:"?"no":GLM_OFFICIAL_HOSTS.has(url.hostname)?"yes":"no"}var plain=value=>value!==null&&typeof value=="object"&&typeof value.get=="function"?value.get():value,GLM_API_KINDS=new Set(["zai","openai-completions","anthropic-messages"]),CODING_DEFAULT_KINDS=new Set(["zai","openai-completions"]),GlmQuotaService=class extends TypertRemoteService{static inject=[];static Config=z.object({providers:z.dict(z.string().pattern(/^[A-Z_][A-Z0-9_]*$/u)).default({}).volatile(),autoDiscover:z.boolean().default(!0).volatile(),ttlMs:z.natural().min(6e4).max(864e5).default(6e4).description("\u914D\u989D\u5237\u65B0\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09\uFF1A\u9ED8\u8BA4 60000\uFF1B\u6700\u5C0F 1 \u5206\u949F\uFF0C\u6700\u5927 24 \u5C0F\u65F6\u3002\u540C\u6B65\u63A7\u5236 Host \u7F13\u5B58\u548C\u53EF\u89C1\u9875\u9762\u5237\u65B0\u3002").volatile(),minIntervalMs:z.natural().min(1e3).default(6e4).volatile(),timeoutMs:z.natural().min(1e3).max(12e4).default(1e4).volatile()});cache=new Map;inFlight=new Map;lastAttempt=new Map;fetchImpl=globalThis.fetch;constructor(ctx,config){super(ctx,"glmQuota"),this.config=config,ctx.effect(()=>async()=>{for(let controller of this.inFlight.values())controller.abort(new Error("glm-quota: disposed"));this.inFlight.clear(),this.cache.clear()})}async get(providerId,options){return{...await this._get(providerId,options),ttlMs:this.config.ttlMs.get()}}async _get(providerId,options){if(typeof providerId!="string"||providerId.length===0||providerId.length>200)return{status:Status.INVALID_PROVIDER,provider:typeof providerId=="string"?providerId:"",reason:"invalid_provider"};let force=options!==null&&typeof options=="object"&&options.force===!0,cached=this.cache.get(providerId),now=Date.now();if(!force&&cached!==void 0&&now-cached.at<this.config.ttlMs.get())return{...cached.payload,stale:!1};let running=this.inFlight.get(providerId);if(running!==void 0)return running.promise.then(payload=>({...payload}));let attempt=this.lastAttempt.get(providerId);if(!force&&attempt!==void 0&&now-attempt<this.config.minIntervalMs.get())return cached!==void 0?{...cached.payload,stale:!0}:{status:Status.FETCH_FAILED,provider:providerId,reason:"cooldown"};let controller=new AbortController,entry={controller,promise:null};return this.inFlight.set(providerId,entry),this.lastAttempt.set(providerId,now),entry.promise=this._query(providerId,controller.signal,cached).then(payload=>(payload.status===Status.OK&&this.cache.set(providerId,{at:payload.fetchedAt,payload}),payload)).finally(()=>{this.inFlight.delete(providerId);try{this.ctx.emit("glm-quota/changed",{provider:providerId})}catch{}}),entry.promise}async _query(providerId,signal,cached){let gate=this._providerGate(providerId);if(!gate.allowed)return{status:gate.status,provider:providerId};let token=await this._resolveCredential(gate.ref);if(token===null)return{status:Status.NO_CREDENTIAL,provider:providerId,reason:gate.ref};try{let timeout=AbortSignal.timeout(this.config.timeoutMs.get()),combined=signal.aborted?signal:AbortSignal.any([signal,timeout]),body=await(await this.fetchImpl(QUOTA_ENDPOINT,{method:"GET",headers:{Authorization:token,Accept:"application/json","Accept-Language":"zh-CN,zh"},signal:combined})).text(),parsed=parseQuotaResponse(body);return parsed.ok?buildPayload(providerId,parsed,Date.now()):this._withStale({status:parsed.error===QuotaError.API_REJECTED?Status.BAD_RESPONSE:Status.FETCH_FAILED,provider:providerId,reason:parsed.error},cached)}catch(error){let reason=signal.aborted?"cancelled":error instanceof Error&&error.name==="TimeoutError"?"timeout":"network";return this._withStale({status:Status.FETCH_FAILED,provider:providerId,reason},cached)}}_withStale(payload,cached){return cached!==void 0?{...cached.payload,stale:!0,supersedes:payload}:payload}_providerGate(providerId){let configured=this.config.providers.get(),explicit=Object.prototype.hasOwnProperty.call(configured,providerId)?configured[providerId]:void 0,profile=null;try{profile=this._piAiProfile(providerId)}catch{profile=null}return explicit!==void 0?profile===null?{allowed:!1,status:Status.CONFIG_UNVERIFIED}:(typeof profile.apiKeyEnv=="string"&&profile.apiKeyEnv.length>0?profile.apiKeyEnv:void 0)!==explicit?{allowed:!1,status:Status.CONFIG_MISMATCH}:!profile.kindOk||profile.urlEvidence==="no"?{allowed:!1,status:Status.NOT_GLM}:{allowed:!0,ref:explicit}:this.config.autoDiscover.get()?profile===null?{allowed:!1,status:Status.NOT_GLM}:typeof profile.apiKeyEnv!="string"||profile.apiKeyEnv.length===0?{allowed:!1,status:Status.NOT_GLM}:!profile.kindOk||profile.urlEvidence!=="yes"?{allowed:!1,status:Status.NOT_GLM}:{allowed:!0,ref:profile.apiKeyEnv}:{allowed:!1,status:Status.NOT_GLM}}_piAiProfile(providerId){let llm=this.ctx.get("llm"),loader=this.ctx.get("loader");if(llm===void 0||loader===void 0||!llm.listProviders().some(row=>row.id===providerId))return null;let directory=llm.listConfigurableProviders().find(row=>row.provider===providerId);if(directory===void 0)return null;let entry=[...loader.entries()].find(row=>row.options.id===directory.settingsNs);if(entry?.fiber?.state!==2)return null;let providersField=entry.fiber.config?.providers,profiles=typeof providersField?.get=="function"?providersField.get():providersField;if(profiles===null||typeof profiles!="object"||Array.isArray(profiles)||!Object.prototype.hasOwnProperty.call(profiles,providerId))return null;let profile=profiles[providerId];if(profile===null||typeof profile!="object"||Array.isArray(profile))return null;let apiKeyEnv=plain(profile.apiKeyEnv),api=plain(profile.api),baseURL=plain(profile.baseURL),nativeChinaDefault=providerId===CHINA_CODING_PROVIDER&&baseURL===void 0&&(api===void 0||CODING_DEFAULT_KINDS.has(api))&&directory.declared===!1&&directory.error===void 0&&directory.defaultBaseURL===CHINA_CODING_BASE_URL;return{apiKeyEnv:typeof apiKeyEnv=="string"&&apiKeyEnv.length>0?apiKeyEnv:void 0,kindOk:api===void 0||GLM_API_KINDS.has(api),urlEvidence:nativeChinaDefault?"yes":typeof baseURL=="string"?glmUrlEvidence(baseURL):"unknown"}}async _resolveCredential(ref){let credentials=this.ctx.get("credentials");if(credentials!==void 0){let hit=await credentials.resolve(ref);return hit!==void 0&&typeof hit.value=="string"&&hit.value.length>0?hit.value:null}let ambient=process.env[ref];return typeof ambient=="string"&&ambient.length>0?ambient:null}};Object.defineProperty(GlmQuotaService.prototype,REMOTE_METHOD_DESCRIPTOR,{configurable:!0,value:Object.freeze({version:1,methods:Object.freeze([Object.freeze({method:"get",invocation:Object.freeze({kind:"direct"})})])})});export{Status,GlmQuotaService as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ckyueix/glm-usage",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "GLM Coding Plan usage pill for the DeepSeek Harness composer dock (dual-half: host quota reader + web client entry)",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE",