@cortexkit/opencode-openai-auth 0.4.2 → 0.4.3
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/cli.js +1 -1
- package/dist/core/oauth.d.ts +1 -1
- package/dist/core/quota-manager.d.ts +7 -11
- package/dist/{index-dc7za61x.js → index-9k2gxqc1.js} +5 -5
- package/dist/{index-qnd9x5jh.js → index-ptsh66z7.js} +1 -1
- package/dist/{index-hjgzqz1c.js → index-rckqt97a.js} +1 -1
- package/dist/index-reagbdg3.js +2 -0
- package/dist/{index-jpx7h5gc.js → index-xbq3aq6f.js} +1 -1
- package/dist/{index-x1c39tzz.js → index-xcf8tm40.js} +1 -1
- package/dist/{index-72cas5ht.js → index-ya6hw803.js} +1 -1
- package/dist/index.js +66 -61
- package/dist/{quota-normalize-02mn21p4.js → quota-normalize-754rewnb.js} +1 -1
- package/dist/raw-ws-bun.d.ts +2 -0
- package/dist/raw-ws-node.d.ts +2 -0
- package/dist/raw-ws-upgrade.d.ts +2 -0
- package/dist/rpc/port-file.js +1 -1
- package/dist/rpc/rpc-client.js +1 -1
- package/dist/rpc/rpc-dir.js +1 -1
- package/dist/sidebar-state.d.ts +2 -0
- package/dist/sidebar-state.js +1 -1
- package/dist/token-util-xzavn760.js +1 -0
- package/dist/{token-dab1ama0.js → token-xsc39hv8.js} +1 -1
- package/dist/tui-preferences.js +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/ws-pool.d.ts +2 -11
- package/dist/ws.d.ts +7 -2
- package/package.json +1 -1
- package/src/sidebar-state.ts +34 -3
- package/src/tui-compiled/sidebar-state.ts +34 -3
- package/dist/index-wpk440dz.js +0 -2
- package/dist/token-util-41n40m0y.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as a,d as b,e as c,f as d,g as e}from"./index-2ng03cby.js";import"./index-
|
|
1
|
+
import{c as a,d as b,e as c,f as d,g as e}from"./index-2ng03cby.js";import"./index-xbq3aq6f.js";export{a as toResetIso,d as normalizeWsFrame,e as normalizeWham,b as normalizeQuotaHeaders,c as isCompleteQuotaHeaderFrame};
|
package/dist/raw-ws-bun.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export declare class RawWebSocket {
|
|
|
7
7
|
private listeners;
|
|
8
8
|
private rxBuffer;
|
|
9
9
|
private handshakeDone;
|
|
10
|
+
private upgradeFailureEmitted;
|
|
10
11
|
private expectedAccept;
|
|
11
12
|
private fragOpcode;
|
|
12
13
|
private fragChunks;
|
|
@@ -21,6 +22,7 @@ export declare class RawWebSocket {
|
|
|
21
22
|
private emit;
|
|
22
23
|
private connect;
|
|
23
24
|
private onData;
|
|
25
|
+
private emitRejectedUpgrade;
|
|
24
26
|
private drainFrames;
|
|
25
27
|
private handleFrame;
|
|
26
28
|
send(data: string): void;
|
package/dist/raw-ws-node.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export declare class RawWebSocket {
|
|
|
7
7
|
private listeners;
|
|
8
8
|
private rxBuffer;
|
|
9
9
|
private handshakeDone;
|
|
10
|
+
private upgradeFailureEmitted;
|
|
10
11
|
private expectedAccept;
|
|
11
12
|
private fragOpcode;
|
|
12
13
|
private fragChunks;
|
|
@@ -20,6 +21,7 @@ export declare class RawWebSocket {
|
|
|
20
21
|
private emit;
|
|
21
22
|
private connect;
|
|
22
23
|
private onData;
|
|
24
|
+
private emitRejectedUpgrade;
|
|
23
25
|
private drainFrames;
|
|
24
26
|
private handleFrame;
|
|
25
27
|
send(data: string): void;
|
package/dist/rpc/port-file.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{oa as a,pa as b}from"../index-ptsh66z7.js";import"../index-xbq3aq6f.js";export{a as writePortFile,b as discoverPortFile};
|
package/dist/rpc/rpc-client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{pa as c}from"../index-ptsh66z7.js";import"../index-xbq3aq6f.js";async function p(n,r,l,o,i){let t=await c(n,r);if(l?.(t),!t)return null;let e=new AbortController,s=setTimeout(()=>e.abort(),2000);try{let a=await fetch(`http://127.0.0.1:${t.port}/rpc/${o}`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${t.token}`},body:JSON.stringify(i),signal:e.signal});if(!a.ok)return null;return await a.json()}catch{return null}finally{clearTimeout(s)}}function y(n,r,l){let o=!1,i=(t)=>{if(o)return;o=!0,l?.(t)};return{async pending(t,e){return(await p(n,r,i,"pending-notifications",{lastReceivedId:t,sessionId:e}))?.messages??[]},async apply(t){return await p(n,r,i,"apply",{...t})??{text:"apply failed",knobs:{}}}}}export{y as createRpcClient};
|
package/dist/rpc/rpc-dir.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{qa as a,ra as b}from"../index-rckqt97a.js";import"../index-xbq3aq6f.js";export{a as tmpdir,b as getRpcDir};
|
package/dist/sidebar-state.d.ts
CHANGED
|
@@ -70,8 +70,10 @@ export declare const ACTIVE_ROUTING_MAX_ENTRIES = 128;
|
|
|
70
70
|
export type SidebarRoutingAccount = {
|
|
71
71
|
id: string;
|
|
72
72
|
enabled?: boolean;
|
|
73
|
+
killed?: boolean;
|
|
73
74
|
};
|
|
74
75
|
export declare function isUsableRoutingEntry(entry: ActiveRoutingEntry, accounts: readonly SidebarRoutingAccount[], now?: number): boolean;
|
|
76
|
+
export declare function isQuotaExhausted(quota: AccountQuota | null | undefined, now?: number): boolean;
|
|
75
77
|
export declare function resolveSessionSidebarRouting(state: SidebarState, sessionId?: string, now?: number): {
|
|
76
78
|
activeId: string;
|
|
77
79
|
route: string;
|
package/dist/sidebar-state.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$ as k,R as a,S as b,T as c,U as d,V as e,W as f,X as g,Y as h,Z as i,_ as j,aa as l,ba as m,ca as n,da as o,ea as p,fa as q,ga as r,ha as s,ia as t}from"./index-
|
|
1
|
+
import{$ as k,R as a,S as b,T as c,U as d,V as e,W as f,X as g,Y as h,Z as i,_ as j,aa as l,ba as m,ca as n,da as o,ea as p,fa as q,ga as r,ha as s,ia as t,ja as u}from"./index-reagbdg3.js";import"./index-ya6hw803.js";import"./index-xbq3aq6f.js";export{o as upsertSidebarActiveRouting,m as setSidebarState,n as setSidebarMachineState,p as setSidebarLegacyRouting,k as resolveSessionSidebarRouting,s as resolveActiveAccount,q as removeSidebarActiveRouting,l as pruneActiveRouting,e as normalizeSidebarState,i as isUsableRoutingEntry,j as isQuotaExhausted,c as getSidebarStateFile,f as getSidebarState,b as getPresentQuotaWindows,t as getCollapsedQuotaSummary,a as formatWindowLabel,r as drainSidebarWrites,u as computeQuotaPacing,d as DEFAULT_SIDEBAR_STATE,h as ACTIVE_ROUTING_MAX_ENTRIES,g as ACTIVE_ROUTING_MAX_AGE_MS};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as a}from"./index-xcf8tm40.js";import"./index-xbq3aq6f.js";export default a();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as U,b as V}from"./index-
|
|
1
|
+
import{a as U,b as V}from"./index-xcf8tm40.js";import{ta as R}from"./index-xbq3aq6f.js";var E=R((M,Q)=>{var{defineProperty:H,getOwnPropertyDescriptor:W,getOwnPropertyNames:X}=Object,Y=Object.prototype.hasOwnProperty,Z=(z,q)=>{for(var B in q)H(z,B,{get:q[B],enumerable:!0})},$=(z,q,B,F)=>{if(q&&typeof q==="object"||typeof q==="function"){for(let v of X(q))if(!Y.call(z,v)&&v!==B)H(z,v,{get:()=>q[v],enumerable:!(F=W(q,v))||F.enumerable})}return z},A=(z)=>$(H({},"__esModule",{value:!0}),z),L={};Z(L,{refreshToken:()=>D});Q.exports=A(L);var K=U(),G=V();async function D(z){let q=z?.project,B=z?.team;if(!q&&!B){let v=(0,G.findProjectInfo)();q=v.projectId,B=v.teamId}else if(!q||!B){let v=(0,G.findProjectInfo)();q=q??v.projectId,B=B??v.teamId}if(!q)throw new K.VercelOidcTokenError("Failed to refresh OIDC token: No project specified. Try re-linking your project with `vc link`");let F=(0,G.loadToken)(q);if(!F||(0,G.isExpired)((0,G.getTokenPayload)(F.token),z?.expirationBufferMs)){let v=await(0,G.getVercelToken)({expirationBufferMs:z?.expirationBufferMs});if(F=await(0,G.getVercelOidcToken)(v,q,B),!F)throw new K.VercelOidcTokenError("Failed to refresh OIDC token");(0,G.saveToken)(F,q)}process.env.VERCEL_OIDC_TOKEN=F.token;return}});export default E();
|
package/dist/tui-preferences.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{sa as P,ta as C,va as _}from"./index-xbq3aq6f.js";var g=C((T,L)=>{(function(Q){if(typeof L==="object"&&typeof L.exports==="object"){var J=Q(_,T);if(J!==void 0)L.exports=J}else if(typeof define==="function"&&define.amd)define(["require","exports","./impl/format","./impl/edit","./impl/scanner","./impl/parser"],Q)})(function(Q,J){Object.defineProperty(J,"__esModule",{value:!0}),J.applyEdits=J.modify=J.format=J.printParseErrorCode=J.ParseErrorCode=J.stripComments=J.visit=J.getNodeValue=J.getNodePath=J.findNodeAtOffset=J.findNodeAtLocation=J.parseTree=J.parse=J.getLocation=J.SyntaxKind=J.ScanError=J.createScanner=void 0;let X=Q("./impl/format"),Z=Q("./impl/edit"),G=Q("./impl/scanner"),$=Q("./impl/parser");J.createScanner=G.createScanner;var W;(function(z){z[z.None=0]="None",z[z.UnexpectedEndOfComment=1]="UnexpectedEndOfComment",z[z.UnexpectedEndOfString=2]="UnexpectedEndOfString",z[z.UnexpectedEndOfNumber=3]="UnexpectedEndOfNumber",z[z.InvalidUnicode=4]="InvalidUnicode",z[z.InvalidEscapeCharacter=5]="InvalidEscapeCharacter",z[z.InvalidCharacter=6]="InvalidCharacter"})(W||(J.ScanError=W={}));var H;(function(z){z[z.OpenBraceToken=1]="OpenBraceToken",z[z.CloseBraceToken=2]="CloseBraceToken",z[z.OpenBracketToken=3]="OpenBracketToken",z[z.CloseBracketToken=4]="CloseBracketToken",z[z.CommaToken=5]="CommaToken",z[z.ColonToken=6]="ColonToken",z[z.NullKeyword=7]="NullKeyword",z[z.TrueKeyword=8]="TrueKeyword",z[z.FalseKeyword=9]="FalseKeyword",z[z.StringLiteral=10]="StringLiteral",z[z.NumericLiteral=11]="NumericLiteral",z[z.LineCommentTrivia=12]="LineCommentTrivia",z[z.BlockCommentTrivia=13]="BlockCommentTrivia",z[z.LineBreakTrivia=14]="LineBreakTrivia",z[z.Trivia=15]="Trivia",z[z.Unknown=16]="Unknown",z[z.EOF=17]="EOF"})(H||(J.SyntaxKind=H={})),J.getLocation=$.getLocation,J.parse=$.parse,J.parseTree=$.parseTree,J.findNodeAtLocation=$.findNodeAtLocation,J.findNodeAtOffset=$.findNodeAtOffset,J.getNodePath=$.getNodePath,J.getNodeValue=$.getNodeValue,J.visit=$.visit,J.stripComments=$.stripComments;var q;(function(z){z[z.InvalidSymbol=1]="InvalidSymbol",z[z.InvalidNumberFormat=2]="InvalidNumberFormat",z[z.PropertyNameExpected=3]="PropertyNameExpected",z[z.ValueExpected=4]="ValueExpected",z[z.ColonExpected=5]="ColonExpected",z[z.CommaExpected=6]="CommaExpected",z[z.CloseBraceExpected=7]="CloseBraceExpected",z[z.CloseBracketExpected=8]="CloseBracketExpected",z[z.EndOfFileExpected=9]="EndOfFileExpected",z[z.InvalidCommentToken=10]="InvalidCommentToken",z[z.UnexpectedEndOfComment=11]="UnexpectedEndOfComment",z[z.UnexpectedEndOfString=12]="UnexpectedEndOfString",z[z.UnexpectedEndOfNumber=13]="UnexpectedEndOfNumber",z[z.InvalidUnicode=14]="InvalidUnicode",z[z.InvalidEscapeCharacter=15]="InvalidEscapeCharacter",z[z.InvalidCharacter=16]="InvalidCharacter"})(q||(J.ParseErrorCode=q={}));function D(z){switch(z){case 1:return"InvalidSymbol";case 2:return"InvalidNumberFormat";case 3:return"PropertyNameExpected";case 4:return"ValueExpected";case 5:return"ColonExpected";case 6:return"CommaExpected";case 7:return"CloseBraceExpected";case 8:return"CloseBracketExpected";case 9:return"EndOfFileExpected";case 10:return"InvalidCommentToken";case 11:return"UnexpectedEndOfComment";case 12:return"UnexpectedEndOfString";case 13:return"UnexpectedEndOfNumber";case 14:return"InvalidUnicode";case 15:return"InvalidEscapeCharacter";case 16:return"InvalidCharacter"}return"<unknown ParseErrorCode>"}J.printParseErrorCode=D;function m(z,U,j){return X.format(z,U,j)}J.format=m;function f(z,U,j,A){return Z.setProperty(z,U,j,A)}J.modify=f;function u(z,U){let j=U.slice(0).sort((I,Y)=>{let F=I.offset-Y.offset;if(F===0)return I.length-Y.length;return F}),A=z.length;for(let I=j.length-1;I>=0;I--){let Y=j[I];if(Y.offset+Y.length<=A)z=Z.applyEdit(z,Y);else throw Error("Overlapping edit");A=Y.offset}return z}J.applyEdits=u})});var M=P(g(),1);import{watch as K}from"node:fs";import{mkdir as c,readFile as O,rename as y,writeFile as S}from"node:fs/promises";import{homedir as E}from"node:os";import{basename as l,dirname as v,join as k}from"node:path";var p="OPENCODE_TUI_PREFERENCES_FILE",x="tui-preferences.jsonc";function w(){let Q=process.env[p];if(Q)return Q;let J=process.env.OPENCODE_CONFIG_DIR||k(process.env.XDG_CONFIG_HOME||k(E(),".config"),"opencode");return k(J,x)}function N(Q){return typeof Q==="object"&&Q!==null&&!Array.isArray(Q)}async function Xz(){try{let Q=await O(w(),"utf8"),J=[],X=M.parse(Q,J,{allowTrailingComma:!0});if(J.length>0)return{};return N(X)?X:{}}catch{return{}}}var i="openai-auth",s=160,b={forceToTop:!1,order:s,startCollapsed:!1,rememberCollapsed:!0,collapsed:null,pollMs:1500,refreshDebounceMs:200,header:{label:"OPENAI",showVersion:!0},sections:{quota:!0,fallbackAccounts:!0,routing:!0,health:!0,pacing:!0},appearance:{barWidth:10,barFilledChar:"█",barEmptyChar:"░",warnThreshold:50,errorThreshold:80}};function V(Q,J){return typeof Q==="boolean"?Q:J}function B(Q,J,X,Z){if(typeof Q!=="number"||!Number.isFinite(Q))return J;return Math.min(Math.max(Math.round(Q),X),Z)}function d(Q,J,X){if(typeof Q!=="string"||Q.length===0)return J;return Q.slice(0,X)}function h(Q,J){if(typeof Q!=="string")return J;return[...Q][0]??J}function Zz(Q){let J=Q[i];if(!N(J))return structuredClone(b);let X=b,Z=N(J.header)?J.header:{},G=N(J.sections)?J.sections:{},$=N(J.appearance)?J.appearance:{},W=B($.warnThreshold,X.appearance.warnThreshold,0,99),H=Math.max(B($.errorThreshold,X.appearance.errorThreshold,0,100),Math.min(W+1,100));return{forceToTop:V(J.forceToTop,X.forceToTop),order:B(J.order,X.order,-1e4,1e4),startCollapsed:V(J.startCollapsed,X.startCollapsed),rememberCollapsed:V(J.rememberCollapsed,X.rememberCollapsed),collapsed:typeof J.collapsed==="boolean"?J.collapsed:null,pollMs:B(J.pollMs,X.pollMs,500,30000),refreshDebounceMs:B(J.refreshDebounceMs,X.refreshDebounceMs,50,5000),header:{label:d(Z.label,X.header.label,20),showVersion:V(Z.showVersion,X.header.showVersion)},sections:{quota:V(G.quota,X.sections.quota),fallbackAccounts:V(G.fallbackAccounts,X.sections.fallbackAccounts),routing:V(G.routing,X.sections.routing),health:V(G.health,X.sections.health),pacing:V(G.pacing,X.sections.pacing)},appearance:{barWidth:B($.barWidth,X.appearance.barWidth,4,40),barFilledChar:h($.barFilledChar,X.appearance.barFilledChar),barEmptyChar:h($.barEmptyChar,X.appearance.barEmptyChar),warnThreshold:W,errorThreshold:H}}}var n=-1e5;function $z(Q,J,X){let Z=Q[J];if(!N(Z))return X;if(Z.forceToTop===!0)return n+Object.keys(Q).indexOf(J);return B(Z.order,X,-1e4,1e4)}var t=`// Shared preferences for opencode TUI plugins.
|
|
2
2
|
// One top-level key per plugin (short name). See each plugin's README for
|
|
3
3
|
// its supported settings. This file is safe to hand-edit; plugins update
|
|
4
4
|
// individual keys in place and preserve comments.
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const PackageVersion = "0.4.
|
|
1
|
+
export declare const PackageVersion = "0.4.3";
|
package/dist/ws-pool.d.ts
CHANGED
|
@@ -20,17 +20,8 @@ export interface CreateWebSocketFetchOptions {
|
|
|
20
20
|
* shared mutable global.
|
|
21
21
|
*/
|
|
22
22
|
onQuota?: (s: Record<string, unknown>, accessToken: string, accountId: string | undefined, servedChatgptAccountId: string | undefined) => void;
|
|
23
|
-
/**
|
|
24
|
-
|
|
25
|
-
* mid-stream quota exhaustion the reactive HTTP-status fallback cannot see
|
|
26
|
-
* on the WebSocket transport (ws.ts synthesizes status:200 at upgrade,
|
|
27
|
-
* before generation runs).
|
|
28
|
-
*
|
|
29
|
-
* Receives the window label plus the per-request internal quota account key
|
|
30
|
-
* captured at send time, same as onQuota, so the signal is attributed to
|
|
31
|
-
* the connection's own account rather than a shared mutable global.
|
|
32
|
-
*/
|
|
33
|
-
onRateLimitReached?: (window: string, accountId: string | undefined) => void;
|
|
23
|
+
/** Receives quota exhaustion plus the account identity captured at send time. */
|
|
24
|
+
onRateLimitReached?: (window: string, accountId: string | undefined, resetAt?: number) => void;
|
|
34
25
|
}
|
|
35
26
|
interface PoolEntry {
|
|
36
27
|
socket?: WebSocket;
|
package/dist/ws.d.ts
CHANGED
|
@@ -30,8 +30,8 @@ export interface StreamResponsesWebSocketOptions {
|
|
|
30
30
|
onAbort?: (error: Error) => void;
|
|
31
31
|
/** Push per-turn quota from a codex.rate_limits in-band frame. */
|
|
32
32
|
onQuota?: (s: Record<string, unknown>) => void;
|
|
33
|
-
/** Called when
|
|
34
|
-
onRateLimitReached?: (window: string) => void;
|
|
33
|
+
/** Called when the transport reports quota exhaustion for the current connection. */
|
|
34
|
+
onRateLimitReached?: (window: string, resetAt?: number) => void;
|
|
35
35
|
}
|
|
36
36
|
export interface WrappedError {
|
|
37
37
|
status: number;
|
|
@@ -41,6 +41,11 @@ export interface WrappedError {
|
|
|
41
41
|
export declare function toWebSocketUrl(url: string): string;
|
|
42
42
|
export declare function normalizeHeaders(headers: HeadersInit | undefined): Record<string, string>;
|
|
43
43
|
export declare function isAbortError(error: unknown): error is DOMException;
|
|
44
|
+
export declare function isUpgradeFailure(error: unknown): boolean;
|
|
44
45
|
export declare function connectResponsesWebSocket(options: ConnectResponsesWebSocketOptions): Promise<WebSocket>;
|
|
45
46
|
export declare function streamResponsesWebSocket(options: StreamResponsesWebSocketOptions): Response;
|
|
47
|
+
export declare function parseRateLimitSignal(value: unknown): {
|
|
48
|
+
window: string;
|
|
49
|
+
resetAt?: number;
|
|
50
|
+
} | undefined;
|
|
46
51
|
export * as OpenAIWebSocket from './ws';
|
package/package.json
CHANGED
package/src/sidebar-state.ts
CHANGED
|
@@ -295,6 +295,7 @@ export const ACTIVE_ROUTING_MAX_ENTRIES = 128
|
|
|
295
295
|
export type SidebarRoutingAccount = {
|
|
296
296
|
id: string
|
|
297
297
|
enabled?: boolean
|
|
298
|
+
killed?: boolean
|
|
298
299
|
}
|
|
299
300
|
|
|
300
301
|
export function isUsableRoutingEntry(
|
|
@@ -308,11 +309,30 @@ export function isUsableRoutingEntry(
|
|
|
308
309
|
return (
|
|
309
310
|
entry.activeId === 'main' ||
|
|
310
311
|
accounts.some(
|
|
311
|
-
(account) =>
|
|
312
|
+
(account) =>
|
|
313
|
+
account.enabled !== false &&
|
|
314
|
+
account.killed !== true &&
|
|
315
|
+
account.id === entry.activeId,
|
|
312
316
|
)
|
|
313
317
|
)
|
|
314
318
|
}
|
|
315
319
|
|
|
320
|
+
export function isQuotaExhausted(
|
|
321
|
+
quota: AccountQuota | null | undefined,
|
|
322
|
+
now = Date.now(),
|
|
323
|
+
): boolean {
|
|
324
|
+
const primary = quota?.primary
|
|
325
|
+
if (
|
|
326
|
+
typeof primary?.resetsAt !== 'string' ||
|
|
327
|
+
!Number.isFinite(primary.usedPercent) ||
|
|
328
|
+
primary.usedPercent < 100
|
|
329
|
+
) {
|
|
330
|
+
return false
|
|
331
|
+
}
|
|
332
|
+
const resetsAt = Date.parse(primary.resetsAt)
|
|
333
|
+
return Number.isFinite(resetsAt) && resetsAt > now
|
|
334
|
+
}
|
|
335
|
+
|
|
316
336
|
export function resolveSessionSidebarRouting(
|
|
317
337
|
state: SidebarState,
|
|
318
338
|
sessionId?: string,
|
|
@@ -322,13 +342,24 @@ export function resolveSessionSidebarRouting(
|
|
|
322
342
|
return { activeId: state.activeId ?? 'main', route: state.route }
|
|
323
343
|
}
|
|
324
344
|
const own = sessionId ? state.activeRouting?.[sessionId] : undefined
|
|
325
|
-
|
|
345
|
+
const ownQuota =
|
|
346
|
+
own?.activeId === 'main'
|
|
347
|
+
? state.main.quota
|
|
348
|
+
: state.fallbacks.find((account) => account.id === own?.activeId)?.quota
|
|
349
|
+
if (
|
|
350
|
+
own &&
|
|
351
|
+
isUsableRoutingEntry(own, state.fallbacks, now) &&
|
|
352
|
+
!isQuotaExhausted(ownQuota, now)
|
|
353
|
+
) {
|
|
326
354
|
return { activeId: own.activeId, route: own.route }
|
|
327
355
|
}
|
|
328
356
|
|
|
329
|
-
const
|
|
357
|
+
const enabledFallbacks = state.fallbacks.filter(
|
|
330
358
|
(account) => account.enabled && !account.killed,
|
|
331
359
|
)
|
|
360
|
+
const fallback =
|
|
361
|
+
enabledFallbacks.find((account) => !isQuotaExhausted(account.quota, now)) ??
|
|
362
|
+
enabledFallbacks[0]
|
|
332
363
|
return {
|
|
333
364
|
activeId:
|
|
334
365
|
state.route === 'fallback-first' && fallback ? fallback.id : 'main',
|
|
@@ -295,6 +295,7 @@ export const ACTIVE_ROUTING_MAX_ENTRIES = 128
|
|
|
295
295
|
export type SidebarRoutingAccount = {
|
|
296
296
|
id: string
|
|
297
297
|
enabled?: boolean
|
|
298
|
+
killed?: boolean
|
|
298
299
|
}
|
|
299
300
|
|
|
300
301
|
export function isUsableRoutingEntry(
|
|
@@ -308,11 +309,30 @@ export function isUsableRoutingEntry(
|
|
|
308
309
|
return (
|
|
309
310
|
entry.activeId === 'main' ||
|
|
310
311
|
accounts.some(
|
|
311
|
-
(account) =>
|
|
312
|
+
(account) =>
|
|
313
|
+
account.enabled !== false &&
|
|
314
|
+
account.killed !== true &&
|
|
315
|
+
account.id === entry.activeId,
|
|
312
316
|
)
|
|
313
317
|
)
|
|
314
318
|
}
|
|
315
319
|
|
|
320
|
+
export function isQuotaExhausted(
|
|
321
|
+
quota: AccountQuota | null | undefined,
|
|
322
|
+
now = Date.now(),
|
|
323
|
+
): boolean {
|
|
324
|
+
const primary = quota?.primary
|
|
325
|
+
if (
|
|
326
|
+
typeof primary?.resetsAt !== 'string' ||
|
|
327
|
+
!Number.isFinite(primary.usedPercent) ||
|
|
328
|
+
primary.usedPercent < 100
|
|
329
|
+
) {
|
|
330
|
+
return false
|
|
331
|
+
}
|
|
332
|
+
const resetsAt = Date.parse(primary.resetsAt)
|
|
333
|
+
return Number.isFinite(resetsAt) && resetsAt > now
|
|
334
|
+
}
|
|
335
|
+
|
|
316
336
|
export function resolveSessionSidebarRouting(
|
|
317
337
|
state: SidebarState,
|
|
318
338
|
sessionId?: string,
|
|
@@ -322,13 +342,24 @@ export function resolveSessionSidebarRouting(
|
|
|
322
342
|
return { activeId: state.activeId ?? 'main', route: state.route }
|
|
323
343
|
}
|
|
324
344
|
const own = sessionId ? state.activeRouting?.[sessionId] : undefined
|
|
325
|
-
|
|
345
|
+
const ownQuota =
|
|
346
|
+
own?.activeId === 'main'
|
|
347
|
+
? state.main.quota
|
|
348
|
+
: state.fallbacks.find((account) => account.id === own?.activeId)?.quota
|
|
349
|
+
if (
|
|
350
|
+
own &&
|
|
351
|
+
isUsableRoutingEntry(own, state.fallbacks, now) &&
|
|
352
|
+
!isQuotaExhausted(ownQuota, now)
|
|
353
|
+
) {
|
|
326
354
|
return { activeId: own.activeId, route: own.route }
|
|
327
355
|
}
|
|
328
356
|
|
|
329
|
-
const
|
|
357
|
+
const enabledFallbacks = state.fallbacks.filter(
|
|
330
358
|
(account) => account.enabled && !account.killed,
|
|
331
359
|
)
|
|
360
|
+
const fallback =
|
|
361
|
+
enabledFallbacks.find((account) => !isQuotaExhausted(account.quota, now)) ??
|
|
362
|
+
enabledFallbacks[0]
|
|
332
363
|
return {
|
|
333
364
|
activeId:
|
|
334
365
|
state.route === 'fallback-first' && fallback ? fallback.id : 'main',
|
package/dist/index-wpk440dz.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{la as U,ma as F}from"./index-72cas5ht.js";import{randomUUID as E}from"node:crypto";import{mkdir as R,readFile as g,rename as f,rm as m,writeFile as S}from"node:fs/promises";import{tmpdir as c}from"node:os";import{dirname as y,join as v}from"node:path";var _=["primary","secondary"],k={primary:300,secondary:10080};function N(H){return Number.isInteger(H)?String(H):String(Math.round(H*10)/10)}function p(H,J){let Z=H!==void 0&&Number.isFinite(H)&&H>0?H:k[J];if(Z<60)return`${N(Z)}m`;if(Z<1440)return`${N(Z/60)}h`;return`${N(Z/1440)}d`}function A(H){if(!H)return[];let J=[];for(let Z of _){let $=H[Z];if(!$)continue;let x=$.windowMinutes,Q=x!==void 0&&Number.isFinite(x)&&x>0?x:k[Z];J.push({key:Z,label:p(Q,Z),window:$,windowMs:Q*60000})}return J}var w=U("sidebar"),u="OPENCODE_OPENAI_AUTH_SIDEBAR_STATE_FILE",d=v(c(),"opencode-openai-auth"),l=v(d,"sidebar-state.json");function o(H){return typeof H==="number"&&Number.isFinite(H)&&H>=0?H:void 0}function W(H){let J=o(H);return J!==void 0?{resetCredits:J}:{}}function s(H){if(H===null||typeof H!=="object"||Array.isArray(H))return;let J={};for(let[Z,$]of Object.entries(H)){if($===null||typeof $!=="object"||Array.isArray($))continue;let x=$;if(typeof x.activeId!=="string"||typeof x.route!=="string"||typeof x.updatedAt!=="number"||!Number.isFinite(x.updatedAt))continue;J[Z]={activeId:x.activeId,route:x.route,updatedAt:x.updatedAt}}return Object.keys(J).length>0?J:void 0}function z(){return process.env[u]||l}var K={main:{quota:null,killed:!1},fallbacks:[],activeId:void 0,route:"main",lastUpdated:0};function M(H){if(H===null||typeof H!=="object"||Array.isArray(H))return K;let J=H,Z=J.main,$;if(Z!==null&&typeof Z==="object"&&!Array.isArray(Z)){let j=Z;$={quota:"quota"in j?j.quota:null,killed:typeof j.killed==="boolean"?j.killed:!1,...typeof j.quotaBackedOff==="boolean"?{quotaBackedOff:j.quotaBackedOff}:{},...typeof j.quotaBackoffUntil==="number"?{quotaBackoffUntil:j.quotaBackoffUntil}:{},...typeof j.refreshBackedOff==="boolean"?{refreshBackedOff:j.refreshBackedOff}:{},...typeof j.refreshBackoffUntil==="number"?{refreshBackoffUntil:j.refreshBackoffUntil}:{},...W(j.resetCredits)}}else $={quota:null,killed:!1};let x=J.fallbacks,Q=Array.isArray(x)?x.filter((j)=>j!==null&&typeof j==="object"&&!Array.isArray(j)&&typeof j.id==="string").map((j)=>({id:j.id,label:typeof j.label==="string"?j.label:void 0,quota:"quota"in j?j.quota:null,killed:typeof j.killed==="boolean"?j.killed:!1,enabled:typeof j.enabled==="boolean"?j.enabled:!0,...W(j.resetCredits)})):[],Y=typeof J.activeId==="string"?J.activeId:void 0,V=typeof J.route==="string"?J.route:K.route,X=typeof J.lastUpdated==="number"?J.lastUpdated:0,O=typeof J.planType==="string"?J.planType:void 0,G=typeof J.credits==="number"?J.credits:void 0,q=s(J.activeRouting);return{main:$,fallbacks:Q,activeId:Y,route:V,lastUpdated:X,...q!==void 0?{activeRouting:q}:{},...O!==void 0?{planType:O}:{},...G!==void 0?{credits:G}:{}}}async function XH(){try{let H=await g(z(),"utf8");return M(JSON.parse(H))}catch{return K}}var r=3600000,D=128;function I(H,J,Z=Date.now()){if(!(H.updatedAt>=Z-r&&H.updatedAt<=Z))return!1;return H.activeId==="main"||J.some((x)=>x.enabled!==!1&&x.id===H.activeId)}function KH(H,J,Z=Date.now()){if(!J)return{activeId:H.activeId??"main",route:H.route};let $=J?H.activeRouting?.[J]:void 0;if($&&I($,H.fallbacks,Z))return{activeId:$.activeId,route:$.route};let x=H.fallbacks.find((Q)=>Q.enabled&&!Q.killed);return{activeId:H.route==="fallback-first"&&x?x.id:"main",route:H.route}}function T(H,J,Z=Date.now(),$){if(!H)return;let x=Object.entries(H).filter(([Y,V])=>Y!==$&&I(V,J,Z)),Q=x.length<=D?x:x.sort((Y,V)=>V[1].updatedAt-Y[1].updatedAt).slice(0,D);return Q.length>0?Object.fromEntries(Q):void 0}var P=Promise.resolve(),n=3,i=1e4,a=15000;function B(H){let J=P.then(H);return P=J.catch(()=>{}),J}function zH(H,J=z()){return B(()=>L(H,J))}async function t(H){try{return b(await h(H))}catch{return K}}async function h(H){try{return await g(H,"utf8")}catch(J){if(J.code==="ENOENT")return"";throw J}}function b(H){if(H==="")return K;try{return M(JSON.parse(H))}catch{return K}}async function e(H){await R(y(H),{recursive:!0});let J=Date.now()+a;while(Date.now()<=J){let Z=await F({name:"sidebar-write",path:H,ttlMs:i,renew:!0});if(Z)return Z;await new Promise(($)=>setTimeout($,10))}throw Error("Timed out waiting for the sidebar state write lock")}async function C(H,J,Z){let $=await e(H);try{for(let Q=0;Q<n;Q+=1){let Y=await h(H),V=J(b(Y));if(Q===0)await Z?.beforeRecheck?.();if(await h(H)!==Y)continue;await L(V,H);return}let x=await t(H);await L(J(x),H)}finally{await $.release()}}function GH(H,J=z(),Z){return B(async()=>{await C(J,($)=>({...$,...H,activeId:$.activeId,activeRouting:$.activeRouting,lastUpdated:Math.max(Date.now(),$.lastUpdated+1)}),Z)})}function BH(H,J,Z=z(),$){return B(async()=>{await C(Z,(x)=>{let Q=T({...x.activeRouting,[H.sessionId]:{activeId:H.activeId,route:H.route,updatedAt:H.updatedAt}},J,Date.now());return{...x,activeId:H.activeId,route:H.route,activeRouting:Q,lastUpdated:Math.max(Date.now(),x.lastUpdated+1)}},$)})}function OH(H,J=z()){return B(async()=>{await C(J,(Z)=>({...Z,activeId:H.activeId,route:H.route,lastUpdated:Math.max(Date.now(),Z.lastUpdated+1)}))})}function qH(H,J,Z=z(),$){return B(async()=>{await C(Z,(x)=>{let Q=Date.now(),Y=T(x.activeRouting,J,Q,H);return{...x,activeRouting:Y,lastUpdated:Math.max(Date.now(),x.lastUpdated+1)}},$)})}async function L(H,J){let Z=`${J}.${E()}.tmp`;try{await R(y(J),{recursive:!0}),await S(Z,JSON.stringify(H),"utf8"),await f(Z,J)}catch($){throw await m(Z,{force:!0}).catch(()=>{}),w.warn("sidebar write failed",{pid:process.pid,error:$ instanceof Error?$.message:String($)}),$}}function CH(){return P}function NH(H){let J=H.activeId;if(J&&J!=="main"){let Z=H.fallbacks.find(($)=>$.enabled&&$.id===J);if(Z)return{id:Z.id,name:Z.label??Z.id,quota:Z.quota,killed:Z.killed}}return{id:"main",name:"main",quota:H.main.quota,killed:H.main.killed}}function PH(H){let J=H?.primary?.usedPercent??null,Z=H?.secondary?.usedPercent??null,$=A(H);return{primaryUsedPercent:J,secondaryUsedPercent:Z,text:$.length===0?null:$.map(({label:x,window:Q})=>`${x}: ${Math.round(Q.usedPercent)}%`).join(" ")}}var HH=300000,JH=0.01,ZH=1;function hH(H,J,Z){if(!H.resetsAt)return null;let $=new Date(H.resetsAt).getTime();if(!Number.isFinite($))return null;let x=$-J,Q=Z-x;if(Q<HH)return null;if(Q<J*JH)return null;if(Q>=J)return null;let Y=H.usedPercent,V=Math.min(Math.max(Q/J*100,0),100),X=Y-V,O=Math.abs(X)<ZH?"on-pace":X>0?"deficit":"reserve",G=null;if(Y>0){let q=Q*100/Y,j=x+q;if(j<$)G=new Date(j).toISOString()}return{pacePercent:V,deltaPercent:X,state:O,runsOutAt:G}}
|
|
2
|
-
export{p as R,A as S,z as T,K as U,M as V,XH as W,r as X,D as Y,I as Z,KH as _,T as $,zH as aa,GH as ba,BH as ca,OH as da,qH as ea,CH as fa,NH as ga,PH as ha,hH as ia};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{b as a}from"./index-x1c39tzz.js";import"./index-jpx7h5gc.js";export default a();
|