@cortexkit/opencode-openai-auth 0.4.0 → 0.4.2
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/provider.d.ts +11 -0
- package/dist/core/refresh-all-quota.d.ts +10 -0
- package/dist/index-72cas5ht.js +7 -0
- package/dist/index-dc7za61x.js +89 -0
- package/dist/{index-b6kp9ydc.js → index-hjgzqz1c.js} +1 -1
- package/dist/{index-6y6ss1kc.js → index-jpx7h5gc.js} +1 -1
- package/dist/{index-1anzb8jh.js → index-qnd9x5jh.js} +1 -1
- package/dist/index-wpk440dz.js +2 -0
- package/dist/{index-y67qn95a.js → index-x1c39tzz.js} +1 -1
- package/dist/index.js +31 -31
- package/dist/{quota-normalize-8yzxqy78.js → quota-normalize-02mn21p4.js} +1 -1
- 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.js +1 -1
- package/dist/{token-yzcb1p3e.js → token-dab1ama0.js} +1 -1
- package/dist/token-util-41n40m0y.js +1 -0
- package/dist/tui-preferences.js +1 -1
- package/dist/version.d.ts +1 -1
- package/package.json +4 -4
- package/src/core/refresh-file-lock.ts +16 -0
- package/src/sidebar-state.ts +1 -0
- package/src/tui-compiled/core/refresh-file-lock.ts +309 -0
- package/src/tui-compiled/sidebar-state.ts +1 -0
- package/dist/index-1r02s323.js +0 -6
- package/dist/index-cz1bkmjz.js +0 -2
- package/dist/index-dzg88nw2.js +0 -89
- package/dist/token-util-h46jb3eg.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-jpx7h5gc.js";export{a as toResetIso,d as normalizeWsFrame,e as normalizeWham,b as normalizeQuotaHeaders,c as isCompleteQuotaHeaderFrame};
|
package/dist/rpc/port-file.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{na as a,oa as b}from"../index-qnd9x5jh.js";import"../index-jpx7h5gc.js";export{a as writePortFile,b as discoverPortFile};
|
package/dist/rpc/rpc-client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{oa as c}from"../index-qnd9x5jh.js";import"../index-jpx7h5gc.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{pa as a,qa as b}from"../index-hjgzqz1c.js";import"../index-jpx7h5gc.js";export{a as tmpdir,b as getRpcDir};
|
package/dist/sidebar-state.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$ as
|
|
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-wpk440dz.js";import"./index-72cas5ht.js";import"./index-jpx7h5gc.js";export{n as upsertSidebarActiveRouting,l as setSidebarState,m as setSidebarMachineState,o as setSidebarLegacyRouting,j as resolveSessionSidebarRouting,r as resolveActiveAccount,p as removeSidebarActiveRouting,k as pruneActiveRouting,e as normalizeSidebarState,i as isUsableRoutingEntry,c as getSidebarStateFile,f as getSidebarState,b as getPresentQuotaWindows,s as getCollapsedQuotaSummary,a as formatWindowLabel,q as drainSidebarWrites,t as computeQuotaPacing,d as DEFAULT_SIDEBAR_STATE,h as ACTIVE_ROUTING_MAX_ENTRIES,g as ACTIVE_ROUTING_MAX_AGE_MS};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as U,b as V}from"./index-
|
|
1
|
+
import{a as U,b as V}from"./index-x1c39tzz.js";import{sa as R}from"./index-jpx7h5gc.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();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as a}from"./index-x1c39tzz.js";import"./index-jpx7h5gc.js";export default a();
|
package/dist/tui-preferences.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{ra as P,sa as C,ua as _}from"./index-jpx7h5gc.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.2";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cortexkit/opencode-openai-auth",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -61,9 +61,9 @@
|
|
|
61
61
|
"@opencode-ai/plugin": "*"
|
|
62
62
|
},
|
|
63
63
|
"dependencies": {
|
|
64
|
-
"@opentui/core": ">=0.4.
|
|
65
|
-
"@opentui/solid": ">=0.4.
|
|
66
|
-
"ai": "^7.0.
|
|
64
|
+
"@opentui/core": ">=0.4.5",
|
|
65
|
+
"@opentui/solid": ">=0.4.5",
|
|
66
|
+
"ai": "^7.0.34",
|
|
67
67
|
"jsonc-parser": "^3.3.1",
|
|
68
68
|
"solid-js": "1.9.12"
|
|
69
69
|
}
|
|
@@ -95,6 +95,22 @@ export async function acquireRefreshFileLock(options: {
|
|
|
95
95
|
} catch (error) {
|
|
96
96
|
const code = (error as NodeJS.ErrnoException).code
|
|
97
97
|
if (code === 'EEXIST' || code === 'EISDIR') return false
|
|
98
|
+
if (code === 'ENOENT') {
|
|
99
|
+
// Reboots can clear runtime temp directories before the next lock acquisition.
|
|
100
|
+
await mkdir(dirname(lockPath), { recursive: true })
|
|
101
|
+
try {
|
|
102
|
+
await writeFile(
|
|
103
|
+
lockPath,
|
|
104
|
+
`${JSON.stringify({ ownerId, expiresAt: now() + options.ttlMs })}\n`,
|
|
105
|
+
{ encoding: 'utf8', mode: 0o600, flag: 'wx' },
|
|
106
|
+
)
|
|
107
|
+
return true
|
|
108
|
+
} catch (retryError) {
|
|
109
|
+
const retryCode = (retryError as NodeJS.ErrnoException).code
|
|
110
|
+
if (retryCode === 'EEXIST' || retryCode === 'EISDIR') return false
|
|
111
|
+
throw retryError
|
|
112
|
+
}
|
|
113
|
+
}
|
|
98
114
|
throw error
|
|
99
115
|
}
|
|
100
116
|
}
|
package/src/sidebar-state.ts
CHANGED
|
@@ -419,6 +419,7 @@ function parseSidebarState(raw: string): SidebarState {
|
|
|
419
419
|
}
|
|
420
420
|
|
|
421
421
|
async function acquireSidebarWriteLock(file: string) {
|
|
422
|
+
await mkdir(dirname(file), { recursive: true })
|
|
422
423
|
const deadline = Date.now() + SIDEBAR_WRITE_LOCK_WAIT_MS
|
|
423
424
|
while (Date.now() <= deadline) {
|
|
424
425
|
const lock = await acquireRefreshFileLock({
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto'
|
|
2
|
+
import { mkdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises'
|
|
3
|
+
import { homedir } from 'node:os'
|
|
4
|
+
import { dirname, join } from 'node:path'
|
|
5
|
+
|
|
6
|
+
const setRefreshLockRenewalTimeout = globalThis.setTimeout.bind(globalThis)
|
|
7
|
+
const clearRefreshLockRenewalTimeout = globalThis.clearTimeout.bind(globalThis)
|
|
8
|
+
|
|
9
|
+
export const ACCOUNT_FILE_NAME = 'openai-auth.json'
|
|
10
|
+
export const ACCOUNT_STATE_FILE_NAME = 'openai-auth-state.json'
|
|
11
|
+
|
|
12
|
+
function getConfigDir() {
|
|
13
|
+
if (process.env.OPENCODE_CONFIG_DIR?.trim()) {
|
|
14
|
+
return process.env.OPENCODE_CONFIG_DIR.trim()
|
|
15
|
+
}
|
|
16
|
+
return join(
|
|
17
|
+
process.env.XDG_CONFIG_HOME || join(homedir(), '.config'),
|
|
18
|
+
'opencode',
|
|
19
|
+
)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// A concurrent contender renaming the freshly-created eviction-marker directory
|
|
23
|
+
// away surfaces the vanished parent differently per platform: ENOENT on Linux,
|
|
24
|
+
// EINVAL or ENOTDIR on macOS/APFS. All three mean the marker is no longer ours
|
|
25
|
+
// to hold — a lost race the caller should retry, not a fatal lock error.
|
|
26
|
+
export function isLostMarkerRaceError(error: unknown): boolean {
|
|
27
|
+
const code = (error as NodeJS.ErrnoException | null)?.code
|
|
28
|
+
return code === 'ENOENT' || code === 'EINVAL' || code === 'ENOTDIR'
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function getAccountStoragePath() {
|
|
32
|
+
return (
|
|
33
|
+
process.env.OPENCODE_OPENAI_AUTH_FILE?.trim() ||
|
|
34
|
+
join(getConfigDir(), ACCOUNT_FILE_NAME)
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function getAccountStatePath(configPath = getAccountStoragePath()) {
|
|
39
|
+
const explicit = process.env.OPENCODE_OPENAI_AUTH_STATE_FILE?.trim()
|
|
40
|
+
if (explicit) return explicit
|
|
41
|
+
return configPath.endsWith(ACCOUNT_FILE_NAME)
|
|
42
|
+
? join(dirname(configPath), ACCOUNT_STATE_FILE_NAME)
|
|
43
|
+
: `${configPath}.state.json`
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export async function acquireRefreshFileLock(options: {
|
|
47
|
+
name: string
|
|
48
|
+
ttlMs: number
|
|
49
|
+
path?: string
|
|
50
|
+
now?: () => number
|
|
51
|
+
renew?: boolean
|
|
52
|
+
renewIntervalMs?: number
|
|
53
|
+
onStep?: (
|
|
54
|
+
step:
|
|
55
|
+
| 'stale-marker-stat'
|
|
56
|
+
| 'stale-marker-claimed'
|
|
57
|
+
| 'stale-lock-confirmed'
|
|
58
|
+
| 'eviction-marker-acquired',
|
|
59
|
+
) => void | Promise<void>
|
|
60
|
+
}): Promise<{ release: () => Promise<void> } | null> {
|
|
61
|
+
const accountPath = options.path ?? getAccountStoragePath()
|
|
62
|
+
const lockPath = `${accountPath}.${options.name}.lock`
|
|
63
|
+
const legacyOwnerPath = join(lockPath, 'owner.json')
|
|
64
|
+
const ownerId = randomUUID()
|
|
65
|
+
const now = options.now ?? Date.now
|
|
66
|
+
let renewTimer: ReturnType<typeof setTimeout> | null = null
|
|
67
|
+
let released = false
|
|
68
|
+
|
|
69
|
+
async function readOwner() {
|
|
70
|
+
try {
|
|
71
|
+
return JSON.parse(await readFile(lockPath, 'utf8'))
|
|
72
|
+
} catch (error) {
|
|
73
|
+
const code = (error as NodeJS.ErrnoException).code
|
|
74
|
+
if (code !== 'EISDIR') throw error
|
|
75
|
+
return JSON.parse(await readFile(legacyOwnerPath, 'utf8'))
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async function writeOwner() {
|
|
80
|
+
await writeFile(
|
|
81
|
+
lockPath,
|
|
82
|
+
`${JSON.stringify({ ownerId, expiresAt: now() + options.ttlMs })}\n`,
|
|
83
|
+
{ encoding: 'utf8', mode: 0o600 },
|
|
84
|
+
)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async function tryAcquire() {
|
|
88
|
+
try {
|
|
89
|
+
await writeFile(
|
|
90
|
+
lockPath,
|
|
91
|
+
`${JSON.stringify({ ownerId, expiresAt: now() + options.ttlMs })}\n`,
|
|
92
|
+
{ encoding: 'utf8', mode: 0o600, flag: 'wx' },
|
|
93
|
+
)
|
|
94
|
+
return true
|
|
95
|
+
} catch (error) {
|
|
96
|
+
const code = (error as NodeJS.ErrnoException).code
|
|
97
|
+
if (code === 'EEXIST' || code === 'EISDIR') return false
|
|
98
|
+
if (code === 'ENOENT') {
|
|
99
|
+
// Reboots can clear runtime temp directories before the next lock acquisition.
|
|
100
|
+
await mkdir(dirname(lockPath), { recursive: true })
|
|
101
|
+
try {
|
|
102
|
+
await writeFile(
|
|
103
|
+
lockPath,
|
|
104
|
+
`${JSON.stringify({ ownerId, expiresAt: now() + options.ttlMs })}\n`,
|
|
105
|
+
{ encoding: 'utf8', mode: 0o600, flag: 'wx' },
|
|
106
|
+
)
|
|
107
|
+
return true
|
|
108
|
+
} catch (retryError) {
|
|
109
|
+
const retryCode = (retryError as NodeJS.ErrnoException).code
|
|
110
|
+
if (retryCode === 'EEXIST' || retryCode === 'EISDIR') return false
|
|
111
|
+
throw retryError
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
throw error
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function scheduleRenewal() {
|
|
119
|
+
if (!options.renew || released) return
|
|
120
|
+
const intervalMs =
|
|
121
|
+
options.renewIntervalMs ?? Math.max(1_000, Math.floor(options.ttlMs / 3))
|
|
122
|
+
renewTimer = setRefreshLockRenewalTimeout(() => {
|
|
123
|
+
void (async () => {
|
|
124
|
+
try {
|
|
125
|
+
const owner = await readOwner()
|
|
126
|
+
const currentNow = now()
|
|
127
|
+
if (
|
|
128
|
+
released ||
|
|
129
|
+
owner?.ownerId !== ownerId ||
|
|
130
|
+
Number(owner?.expiresAt) <= currentNow
|
|
131
|
+
) {
|
|
132
|
+
return
|
|
133
|
+
}
|
|
134
|
+
await writeOwner()
|
|
135
|
+
scheduleRenewal()
|
|
136
|
+
} catch {
|
|
137
|
+
// If renewal fails, contenders will wait until the last written expiry.
|
|
138
|
+
}
|
|
139
|
+
})()
|
|
140
|
+
}, intervalMs)
|
|
141
|
+
if ('unref' in renewTimer) renewTimer.unref()
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
let acquired = await tryAcquire()
|
|
145
|
+
if (!acquired) {
|
|
146
|
+
// Fencing-token eviction: a directory-based marker (mkdir O_EXCL) serializes
|
|
147
|
+
// destructive removal to one contender at a time. The marker holds an owner
|
|
148
|
+
// file so ownership survives a stale-marker recovery rename: the recovering
|
|
149
|
+
// contender renames the stale directory, then must re-check ownership before
|
|
150
|
+
// acting — preventing the 3rd interleaving where a stale observer renames the
|
|
151
|
+
// FRESH marker the mkdir-winner created.
|
|
152
|
+
const evictPath = `${lockPath}.evicting`
|
|
153
|
+
const evictOwnerPath = join(evictPath, 'owner.json')
|
|
154
|
+
const evictOwnerId = randomUUID()
|
|
155
|
+
const EVICT_TTL = 5_000
|
|
156
|
+
const MAX_STEAL_ATTEMPTS = 8
|
|
157
|
+
|
|
158
|
+
async function backoff() {
|
|
159
|
+
await new Promise((resolve) =>
|
|
160
|
+
setTimeout(resolve, Math.floor(Math.random() * 4)),
|
|
161
|
+
)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async function lockIsLive() {
|
|
165
|
+
try {
|
|
166
|
+
const currentOwner = await readOwner()
|
|
167
|
+
return Number(currentOwner?.expiresAt) > now()
|
|
168
|
+
} catch {
|
|
169
|
+
try {
|
|
170
|
+
const current = await stat(lockPath)
|
|
171
|
+
return current.mtimeMs + options.ttlMs > now()
|
|
172
|
+
} catch {
|
|
173
|
+
// Lock doesn't exist — safe to acquire.
|
|
174
|
+
return false
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Fail-closed: any read error means we do NOT own the marker.
|
|
180
|
+
async function ownsEvictionMarker() {
|
|
181
|
+
try {
|
|
182
|
+
const owner = JSON.parse(await readFile(evictOwnerPath, 'utf8'))
|
|
183
|
+
return owner?.ownerId === evictOwnerId
|
|
184
|
+
} catch {
|
|
185
|
+
return false
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
async function tryAcquireEvictionMarker() {
|
|
190
|
+
await mkdir(evictPath)
|
|
191
|
+
try {
|
|
192
|
+
await writeFile(
|
|
193
|
+
evictOwnerPath,
|
|
194
|
+
`${JSON.stringify({ ownerId: evictOwnerId, createdAt: now() })}\n`,
|
|
195
|
+
{ encoding: 'utf8', mode: 0o600, flag: 'wx' },
|
|
196
|
+
)
|
|
197
|
+
} catch (error) {
|
|
198
|
+
// A competing contender can rename our just-created marker directory
|
|
199
|
+
// away between the mkdir above and this write (the stale-marker steal
|
|
200
|
+
// path below does exactly that). That is a lost race, not a failure, so
|
|
201
|
+
// report it as such and let the caller back off and retry rather than
|
|
202
|
+
// failing the whole lock acquisition.
|
|
203
|
+
if (isLostMarkerRaceError(error)) return false
|
|
204
|
+
await releaseEvictionMarker()
|
|
205
|
+
throw error
|
|
206
|
+
}
|
|
207
|
+
await options.onStep?.('eviction-marker-acquired')
|
|
208
|
+
return true
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
async function releaseEvictionMarker() {
|
|
212
|
+
if (await ownsEvictionMarker()) {
|
|
213
|
+
await rm(evictPath, { recursive: true, force: true }).catch(() => {})
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
for (let attempt = 0; attempt < MAX_STEAL_ATTEMPTS; attempt++) {
|
|
218
|
+
acquired = await tryAcquire()
|
|
219
|
+
if (acquired) break
|
|
220
|
+
if (await lockIsLive()) return null
|
|
221
|
+
|
|
222
|
+
try {
|
|
223
|
+
if (!(await tryAcquireEvictionMarker())) {
|
|
224
|
+
await backoff()
|
|
225
|
+
continue
|
|
226
|
+
}
|
|
227
|
+
} catch (evictError) {
|
|
228
|
+
const code = (evictError as NodeJS.ErrnoException).code
|
|
229
|
+
if (code !== 'EEXIST') throw evictError
|
|
230
|
+
|
|
231
|
+
let evictStat: Awaited<ReturnType<typeof stat>>
|
|
232
|
+
try {
|
|
233
|
+
evictStat = await stat(evictPath)
|
|
234
|
+
} catch (statError) {
|
|
235
|
+
if ((statError as NodeJS.ErrnoException).code === 'ENOENT') {
|
|
236
|
+
await backoff()
|
|
237
|
+
continue
|
|
238
|
+
}
|
|
239
|
+
throw statError
|
|
240
|
+
}
|
|
241
|
+
if (evictStat.mtimeMs + EVICT_TTL > now()) return null
|
|
242
|
+
|
|
243
|
+
await options.onStep?.('stale-marker-stat')
|
|
244
|
+
const claimedPath = `${evictPath}.${randomUUID()}`
|
|
245
|
+
try {
|
|
246
|
+
await rename(evictPath, claimedPath)
|
|
247
|
+
} catch (renameError) {
|
|
248
|
+
if ((renameError as NodeJS.ErrnoException).code === 'ENOENT') {
|
|
249
|
+
await backoff()
|
|
250
|
+
continue
|
|
251
|
+
}
|
|
252
|
+
throw renameError
|
|
253
|
+
}
|
|
254
|
+
await options.onStep?.('stale-marker-claimed')
|
|
255
|
+
await rm(claimedPath, { recursive: true, force: true }).catch(() => {})
|
|
256
|
+
await backoff()
|
|
257
|
+
continue
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
try {
|
|
261
|
+
if (await lockIsLive()) return null
|
|
262
|
+
// Fence check 1: verify we still own the marker before acting on the
|
|
263
|
+
// stale-lock-confirmed decision.
|
|
264
|
+
if (!(await ownsEvictionMarker())) return null
|
|
265
|
+
await options.onStep?.('stale-lock-confirmed')
|
|
266
|
+
// Fence check 2: re-verify ownership after the seam (another contender
|
|
267
|
+
// may have renamed our fresh marker while we were paused here).
|
|
268
|
+
if (!(await ownsEvictionMarker())) return null
|
|
269
|
+
await rm(lockPath, { recursive: true, force: true }).catch(() => {})
|
|
270
|
+
// Fence check 3: re-verify ownership after removing the stale lock.
|
|
271
|
+
if (!(await ownsEvictionMarker())) return null
|
|
272
|
+
acquired = await tryAcquire()
|
|
273
|
+
if (!acquired) return null
|
|
274
|
+
// Fence check 4: re-verify ownership after acquiring the lock. If the
|
|
275
|
+
// marker was stolen between tryAcquire and this check, release the
|
|
276
|
+
// just-acquired lock and return null (fail-closed).
|
|
277
|
+
if (!(await ownsEvictionMarker())) {
|
|
278
|
+
await rm(lockPath, { recursive: true, force: true }).catch(() => {})
|
|
279
|
+
acquired = false
|
|
280
|
+
return null
|
|
281
|
+
}
|
|
282
|
+
break
|
|
283
|
+
} finally {
|
|
284
|
+
await releaseEvictionMarker()
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
if (!acquired) return null
|
|
290
|
+
|
|
291
|
+
scheduleRenewal()
|
|
292
|
+
|
|
293
|
+
return {
|
|
294
|
+
release: async () => {
|
|
295
|
+
released = true
|
|
296
|
+
if (renewTimer) {
|
|
297
|
+
clearRefreshLockRenewalTimeout(renewTimer)
|
|
298
|
+
renewTimer = null
|
|
299
|
+
}
|
|
300
|
+
try {
|
|
301
|
+
const owner = await readOwner()
|
|
302
|
+
if (owner?.ownerId !== ownerId) return
|
|
303
|
+
} catch {
|
|
304
|
+
return
|
|
305
|
+
}
|
|
306
|
+
await rm(lockPath, { recursive: true, force: true }).catch(() => {})
|
|
307
|
+
},
|
|
308
|
+
}
|
|
309
|
+
}
|
|
@@ -419,6 +419,7 @@ function parseSidebarState(raw: string): SidebarState {
|
|
|
419
419
|
}
|
|
420
420
|
|
|
421
421
|
async function acquireSidebarWriteLock(file: string) {
|
|
422
|
+
await mkdir(dirname(file), { recursive: true })
|
|
422
423
|
const deadline = Date.now() + SIDEBAR_WRITE_LOCK_WAIT_MS
|
|
423
424
|
while (Date.now() <= deadline) {
|
|
424
425
|
const lock = await acquireRefreshFileLock({
|
package/dist/index-1r02s323.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{appendFileSync as d,chmodSync as s,existsSync as M,renameSync as f,statSync as c}from"node:fs";import{tmpdir as l}from"node:os";import{join as i}from"node:path";var U={error:0,warn:1,info:2,debug:3,trace:4},a=!1,o=5242880;function m(){return process.env.OPENCODE_OPENAI_AUTH_LOG_FILE??i(l(),"opencode-openai-auth.log")}var A;function qH(H){if(H===void 0||H in U)A=H}function n(){if(A)return A;let H=process.env.OPENCODE_OPENAI_AUTH_LOG_LEVEL;if(H&&H in U)return H;return"info"}var t=/^(authorization|x-api-key|cookie|set-cookie|refresh|access|token)$/i;function r(H){if(t.test(H))return!0;let J=H.toLowerCase().replace(/[-_]/g,"");if(J==="chatgptaccountid")return!0;if(J.includes("apikey"))return!0;if(J.endsWith("secret")||J.endsWith("password"))return!0;if(J.endsWith("token")&&!J.endsWith("tokens"))return!0;return!1}var e=/\b(Bearer\s+[\w.-]+|sk-[\w-]+|eyJ[\w.-]+)\b/g;function HH(H){return R(H,new WeakSet)}function R(H,J){if(typeof H==="string")return H.replace(e,"***REDACTED***");if(Array.isArray(H)){if(J.has(H))return"[Circular]";J.add(H);let Q=H.map((Z)=>R(Z,J));return J.delete(H),Q}if(H&&typeof H==="object"){if(J.has(H))return"[Circular]";J.add(H);let Q={};for(let[Z,B]of Object.entries(H))Q[Z]=r(Z)?"***REDACTED***":R(B,J);return J.delete(H),Q}return H}var j=[],L,JH=3;function S(H){try{s(H,384)}catch{}}function QH(){try{let H=m();if(!(M(H)&&c(H).size>o))return;for(let Q=JH-1;Q>=1;Q--)if(M(`${H}.${Q}`)){let Z=`${H}.${Q+1}`;f(`${H}.${Q}`,Z),S(Z)}let J=`${H}.1`;f(H,J),S(J)}catch{}}function I(){if(!j.length)return;let H=j.join("");j=[];try{QH();let J=m();if(M(J))S(J);d(J,H,{encoding:"utf8",mode:384})}catch{}}function WH(){if(!L)L=setTimeout(()=>{L=void 0,I()},500)}if(!a)process.on("exit",I);function ZH(H){try{return` ${JSON.stringify(HH(H))}`}catch{return" [unserializable]"}}function x(H,J,Q,Z){if(U[J]>U[n()])return;let B=`[${new Date().toISOString()}] ${J.toUpperCase()} [${H}] ${Q}`+(Z===void 0?"":ZH(Z))+`
|
|
2
|
-
`;if(j.push(B),j.length>=50)I();else WH()}function FH(H){return{error:(J,Q)=>x(H,"error",J,Q),warn:(J,Q)=>x(H,"warn",J,Q),info:(J,Q)=>x(H,"info",J,Q),debug:(J,Q)=>x(H,"debug",J,Q),trace:(J,Q)=>x(H,"trace",J,Q)}}import{randomUUID as g}from"node:crypto";import{mkdir as $H,readFile as y,rename as zH,rm as D,stat as h,writeFile as O}from"node:fs/promises";import{homedir as BH}from"node:os";import{dirname as SH,join as b}from"node:path";var GH=globalThis.setTimeout.bind(globalThis),VH=globalThis.clearTimeout.bind(globalThis),XH="openai-auth.json";function YH(){if(process.env.OPENCODE_CONFIG_DIR?.trim())return process.env.OPENCODE_CONFIG_DIR.trim();return b(process.env.XDG_CONFIG_HOME||b(BH(),".config"),"opencode")}function KH(H){let J=H?.code;return J==="ENOENT"||J==="EINVAL"||J==="ENOTDIR"}function xH(){return process.env.OPENCODE_OPENAI_AUTH_FILE?.trim()||b(YH(),XH)}async function IH(H){let Q=`${H.path??xH()}.${H.name}.lock`,Z=b(Q,"owner.json"),B=g(),G=H.now??Date.now,X=null,q=!1;async function F(){try{return JSON.parse(await y(Q,"utf8"))}catch(W){if(W.code!=="EISDIR")throw W;return JSON.parse(await y(Z,"utf8"))}}async function u(){await O(Q,`${JSON.stringify({ownerId:B,expiresAt:G()+H.ttlMs})}
|
|
3
|
-
`,{encoding:"utf8",mode:384})}async function _(){try{return await O(Q,`${JSON.stringify({ownerId:B,expiresAt:G()+H.ttlMs})}
|
|
4
|
-
`,{encoding:"utf8",mode:384,flag:"wx"}),!0}catch(W){let z=W.code;if(z==="EEXIST"||z==="EISDIR")return!1;throw W}}function T(){if(!H.renew||q)return;let W=H.renewIntervalMs??Math.max(1000,Math.floor(H.ttlMs/3));if(X=GH(()=>{(async()=>{try{let z=await F(),N=G();if(q||z?.ownerId!==B||Number(z?.expiresAt)<=N)return;await u(),T()}catch{}})()},W),"unref"in X)X.unref()}let V=await _();if(!V){let W=`${Q}.evicting`,z=b(W,"owner.json"),N=g(),jH=5000,DH=8;async function C(){await new Promise(($)=>setTimeout($,Math.floor(Math.random()*4)))}async function P(){try{let $=await F();return Number($?.expiresAt)>G()}catch{try{return(await h(Q)).mtimeMs+H.ttlMs>G()}catch{return!1}}}async function Y(){try{return JSON.parse(await y(z,"utf8"))?.ownerId===N}catch{return!1}}async function v(){await $H(W);try{await O(z,`${JSON.stringify({ownerId:N,createdAt:G()})}
|
|
5
|
-
`,{encoding:"utf8",mode:384,flag:"wx"})}catch($){if(KH($))return!1;throw await E(),$}return await H.onStep?.("eviction-marker-acquired"),!0}async function E(){if(await Y())await D(W,{recursive:!0,force:!0}).catch(()=>{})}for(let $=0;$<8;$++){if(V=await _(),V)break;if(await P())return null;try{if(!await v()){await C();continue}}catch(p){if(p.code!=="EEXIST")throw p;let k;try{k=await h(W)}catch(K){if(K.code==="ENOENT"){await C();continue}throw K}if(k.mtimeMs+5000>G())return null;await H.onStep?.("stale-marker-stat");let w=`${W}.${g()}`;try{await zH(W,w)}catch(K){if(K.code==="ENOENT"){await C();continue}throw K}await H.onStep?.("stale-marker-claimed"),await D(w,{recursive:!0,force:!0}).catch(()=>{}),await C();continue}try{if(await P())return null;if(!await Y())return null;if(await H.onStep?.("stale-lock-confirmed"),!await Y())return null;if(await D(Q,{recursive:!0,force:!0}).catch(()=>{}),!await Y())return null;if(V=await _(),!V)return null;if(!await Y())return await D(Q,{recursive:!0,force:!0}).catch(()=>{}),V=!1,null;break}finally{await E()}}}if(!V)return null;return T(),{release:async()=>{if(q=!0,X)VH(X),X=null;try{if((await F())?.ownerId!==B)return}catch{return}await D(Q,{recursive:!0,force:!0}).catch(()=>{})}}}
|
|
6
|
-
export{qH as ia,HH as ja,FH as ka,IH as la};
|
package/dist/index-cz1bkmjz.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{ka as U,la as F}from"./index-1r02s323.js";import{randomUUID as p}from"node:crypto";import{mkdir as A,readFile as R,rename as E,rm as f,writeFile as m}from"node:fs/promises";import{tmpdir as S}from"node:os";import{dirname as c,join as g}from"node:path";var T=["primary","secondary"],k={primary:300,secondary:10080};function N(H){return Number.isInteger(H)?String(H):String(Math.round(H*10)/10)}function b(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 _(H){if(!H)return[];let J=[];for(let Z of T){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:b(Q,Z),window:$,windowMs:Q*60000})}return J}var w=U("sidebar"),u="OPENCODE_OPENAI_AUTH_SIDEBAR_STATE_FILE",d=g(S(),"opencode-openai-auth"),l=g(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 y(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 R(z(),"utf8");return y(JSON.parse(H))}catch{return K}}var r=3600000,D=128;function v(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($&&v($,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 M(H,J,Z=Date.now(),$){if(!H)return;let x=Object.entries(H).filter(([Y,V])=>Y!==$&&v(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 I(await h(H))}catch{return K}}async function h(H){try{return await R(H,"utf8")}catch(J){if(J.code==="ENOENT")return"";throw J}}function I(H){if(H==="")return K;try{return y(JSON.parse(H))}catch{return K}}async function e(H){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(I(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=M({...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=M(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}.${p()}.tmp`;try{await A(c(J),{recursive:!0}),await m(Z,JSON.stringify(H),"utf8"),await E(Z,J)}catch($){throw await f(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,$=_(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{b as Q,_ as R,z as S,K as T,y as U,XH as V,r as W,D as X,v as Y,KH as Z,M as _,zH as $,GH as aa,BH as ba,OH as ca,qH as da,CH as ea,NH as fa,PH as ga,hH as ha};
|