oca-proxy 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -7,23 +7,24 @@ This proxy handles OCI authentication via web-based OAuth flow and exposes stand
7
7
  ## Quick Start
8
8
 
9
9
  ```bash
10
- cd oca-proxy
11
- npm install
12
- npm run build
13
- npx ./bin/oca-proxy.js
10
+ # Run without installing (recommended)
11
+ npx oca-proxy
14
12
  ```
15
13
 
16
- Or install globally and run from anywhere:
14
+ Or install globally from npm and run:
17
15
 
18
16
  ```bash
19
- npm install -g .
17
+ npm install -g oca-proxy
20
18
  oca-proxy
21
19
  ```
22
20
 
23
- You can also use npx after local or global install:
21
+ ### From Source
24
22
 
25
23
  ```bash
26
- npx oca-proxy
24
+ cd oca-proxy
25
+ npm install
26
+ npm run build
27
+ npx ./bin/oca-proxy.js
27
28
  ```
28
29
 
29
30
  On first run, the browser will automatically open for OAuth login. After authentication, the proxy is ready to use.
@@ -36,7 +37,7 @@ The proxy uses web-based OAuth with PKCE on whitelisted ports (8669, 8668, 8667)
36
37
  - **Logout:** Visit `http://localhost:8669/logout`
37
38
  - **Status:** Visit `http://localhost:8669/health`
38
39
 
39
- Tokens are stored in `~/.oca/refresh_token.json` (same location as Python proxy).
40
+ Tokens are stored in `~/.oca/refresh_token.json`.
40
41
 
41
42
  ## Usage with OpenAI SDK
42
43
 
@@ -107,7 +108,7 @@ curl http://localhost:8669/v1/chat/completions \
107
108
 
108
109
  Models not starting with `oca/` are automatically mapped to `oca/gpt-4.1` by default.
109
110
 
110
- Custom mappings can be configured in `~/.config/oca/oca-proxy.config.json` (old path `~/.oca/oca-proxy-config.json` still read):
111
+ Custom mappings can be configured in `~/.config/oca/oca-proxy.config.json`:
111
112
 
112
113
  ```json
113
114
  {
@@ -120,69 +121,7 @@ Custom mappings can be configured in `~/.config/oca/oca-proxy.config.json` (old
120
121
 
121
122
  ## Integration Examples
122
123
 
123
- ### Claude Code
124
-
125
- Use the Anthropic endpoint with Claude Code:
126
-
127
- ```bash
128
- export ANTHROPIC_API_KEY=dummy
129
- export ANTHROPIC_BASE_URL=http://localhost:8669
130
- claude
131
- ```
132
-
133
- Or use environment variables in one line:
134
-
135
- ```bash
136
- ANTHROPIC_API_KEY=dummy ANTHROPIC_BASE_URL=http://localhost:8669 claude
137
- ```
138
-
139
- ### OpenCode
140
-
141
- Create `opencode.json` in your project root:
142
-
143
- ```json
144
- {
145
- "$schema": "https://opencode.ai/config.json",
146
- "provider": {
147
- "oca": {
148
- "api": "openai",
149
- "name": "Oracle Code Assist",
150
- "options": {
151
- "baseURL": "http://localhost:8669/v1",
152
- "apiKey": "dummy"
153
- },
154
- "models": {
155
- "gpt-4.1": {
156
- "id": "oca/gpt-4.1",
157
- "name": "OCA GPT 4.1"
158
- }
159
- }
160
- }
161
- },
162
- "model": "oca/gpt-4.1"
163
- }
164
- ```
165
-
166
- ### Aider
167
-
168
- ```bash
169
- aider --openai-api-key dummy --openai-api-base http://localhost:8669/v1
170
- ```
171
-
172
- ### Continue (VS Code)
173
-
174
- ```json
175
- {
176
- "models": [
177
- {
178
- "provider": "openai",
179
- "model": "oca/gpt-4.1",
180
- "apiKey": "dummy",
181
- "apiBase": "http://localhost:8669/v1"
182
- }
183
- ]
184
- }
185
- ```
124
+ See CONFIG.md for editor and tool setup examples: [CONFIG.md](./CONFIG.md)
186
125
 
187
126
  ## Files
188
127
 
@@ -202,7 +141,7 @@ oca-proxy/
202
141
 
203
142
  ## Running with PM2
204
143
 
205
- PM2 is a production process manager for Node.js applications. To run the OCA Proxy with PM2:
144
+ PM2 is a production process manager for Node.js applications. You can run the OCA Proxy via the global binary or npx.
206
145
 
207
146
  1. Install PM2 globally:
208
147
 
@@ -210,19 +149,19 @@ PM2 is a production process manager for Node.js applications. To run the OCA Pro
210
149
  npm install -g pm2
211
150
  ```
212
151
 
213
- 2. Build the project:
214
-
215
- ```bash
216
- npm run build
217
- ```
152
+ 2. Start the proxy (choose one):
218
153
 
219
- 3. Start the proxy:
154
+ - Global install:
155
+ ```bash
156
+ pm2 start oca-proxy --name oca-proxy
157
+ ```
220
158
 
221
- ```bash
222
- pm2 start dist/oca-proxy.js --name oca-proxy
223
- ```
159
+ - Using npx (no global install):
160
+ ```bash
161
+ pm2 start "npx oca-proxy" --name oca-proxy
162
+ ```
224
163
 
225
- 4. Monitor and manage:
164
+ 3. Monitor and manage:
226
165
  - View status: `pm2 status`
227
166
  - View logs: `pm2 logs oca-proxy`
228
167
  - Restart: `pm2 restart oca-proxy`
@@ -236,7 +175,11 @@ module.exports = {
236
175
  apps: [
237
176
  {
238
177
  name: 'oca-proxy',
239
- script: 'bin/oca-proxy.js',
178
+ // If installed globally:
179
+ script: 'oca-proxy',
180
+ // Or, if you prefer npx, use:
181
+ // script: 'npx',
182
+ // args: 'oca-proxy',
240
183
  env: {
241
184
  NODE_ENV: 'production',
242
185
  PORT: 8669,
@@ -248,11 +191,4 @@ module.exports = {
248
191
 
249
192
  Then start with `pm2 start ecosystem.config.js`.
250
193
 
251
- ## Comparison with Python Proxy
252
-
253
- This TypeScript proxy is functionally equivalent to the Python proxy at `~/project/ccr-oca/oca-proxy/`. Both:
254
194
 
255
- - Use the same OAuth client (internal mode)
256
- - Store tokens in the same location (`~/.oca/refresh_token.json`)
257
- - Support the same whitelisted ports (8669, 8668, 8667)
258
- - Provide OpenAI-compatible endpoints
package/bin/oca-proxy.js CHANGED
@@ -58,8 +58,8 @@ tell application "System Events" to get value of property list item "CFBundleNam
58
58
  `,l1=zn.encode(Aa),u1=2,Qo=class{constructor(e,n){let{escapeName:i}=this.constructor,t=x.isString(n),o=`Content-Disposition: form-data; name="${i(e)}"${!t&&n.name?`; filename="${i(n.name)}"`:""}${Aa}`;t?n=zn.encode(String(n).replace(/\r?\n|\r\n?/g,Aa)):o+=`Content-Type: ${n.type||"application/octet-stream"}${Aa}`,this.headers=zn.encode(o+Aa),this.contentLength=t?n.byteLength:n.size,this.size=this.headers.byteLength+this.contentLength+u1,this.name=e,this.value=n}async*encode(){yield this.headers;let{value:e}=this;x.isTypedArray(e)?yield e:yield*Pi(e),yield l1}static escapeName(e){return String(e).replace(/[\r\n"]/g,n=>({"\r":"%0D","\n":"%0A",'"':"%22"})[n])}},d1=(a,e,n)=>{let{tag:i="form-data-boundary",size:t=25,boundary:o=i+"-"+I.generateString(t,p1)}=n||{};if(!x.isFormData(a))throw TypeError("FormData instance required");if(o.length<1||o.length>70)throw Error("boundary must be 10-70 characters long");let r=zn.encode("--"+o+Aa),s=zn.encode("--"+o+"--"+Aa),l=s.byteLength,c=Array.from(a.entries()).map(([u,d])=>{let f=new Qo(u,d);return l+=f.size,f});l+=r.byteLength*c.length,l=x.toFiniteNumber(l);let p={"Content-Type":`multipart/form-data; boundary=${o}`};return Number.isFinite(l)&&(p["Content-Length"]=l),e&&e(p),Ou.Readable.from((async function*(){for(let u of c)yield r,yield*u.encode();yield s})())},Ru=d1;var qu=O(require("stream"),1),Zo=class extends qu.default.Transform{__transform(e,n,i){this.push(e),i()}_transform(e,n,i){if(e.length!==0&&(this._transform=this.__transform,e[0]!==120)){let t=Buffer.alloc(2);t[0]=120,t[1]=156,this.push(t,n)}this.__transform(e,n,i)}},Pu=Zo;var m1=(a,e)=>x.isAsyncFn(a)?function(...n){let i=n.pop();a.apply(this,n).then(t=>{try{e?i(null,...e(t)):i(null,t)}catch(o){i(o)}},i)}:a,Fu=m1;function f1(a,e){a=a||10;let n=new Array(a),i=new Array(a),t=0,o=0,r;return e=e!==void 0?e:1e3,function(l){let c=Date.now(),p=i[o];r||(r=c),n[t]=l,i[t]=c;let u=o,d=0;for(;u!==t;)d+=n[u++],u=u%a;if(t=(t+1)%a,t===o&&(o=(o+1)%a),c-r<e)return;let f=p&&c-p;return f?Math.round(d*1e3/f):void 0}}var Iu=f1;function x1(a,e){let n=0,i=1e3/e,t,o,r=(c,p=Date.now())=>{n=p,t=null,o&&(clearTimeout(o),o=null),a(...c)};return[(...c)=>{let p=Date.now(),u=p-n;u>=i?r(c,p):(t=c,o||(o=setTimeout(()=>{o=null,r(t)},i-u)))},()=>t&&r(t)]}var Lu=x1;var Ze=(a,e,n=3)=>{let i=0,t=Iu(50,250);return Lu(o=>{let r=o.loaded,s=o.lengthComputable?o.total:void 0,l=r-i,c=t(l),p=r<=s;i=r;let u={loaded:r,total:s,progress:s?r/s:void 0,bytes:l,rate:c||void 0,estimated:c&&s&&p?(s-r)/c:void 0,event:o,lengthComputable:s!=null,[e?"download":"upload"]:!0};a(u)},n)},an=(a,e)=>{let n=a!=null;return[i=>e[0]({lengthComputable:n,total:a,loaded:i}),e[1]]},nn=a=>(...e)=>x.asap(()=>a(...e));function er(a){if(!a||typeof a!="string"||!a.startsWith("data:"))return 0;let e=a.indexOf(",");if(e<0)return 0;let n=a.slice(5,e),i=a.slice(e+1);if(/;base64/i.test(n)){let o=i.length,r=i.length;for(let d=0;d<r;d++)if(i.charCodeAt(d)===37&&d+2<r){let f=i.charCodeAt(d+1),m=i.charCodeAt(d+2);(f>=48&&f<=57||f>=65&&f<=70||f>=97&&f<=102)&&(m>=48&&m<=57||m>=65&&m<=70||m>=97&&m<=102)&&(o-=2,d+=2)}let s=0,l=r-1,c=d=>d>=2&&i.charCodeAt(d-2)===37&&i.charCodeAt(d-1)===51&&(i.charCodeAt(d)===68||i.charCodeAt(d)===100);l>=0&&(i.charCodeAt(l)===61?(s++,l--):c(l)&&(s++,l-=3)),s===1&&l>=0&&(i.charCodeAt(l)===61||c(l))&&s++;let u=Math.floor(o/4)*3-(s||0);return u>0?u:0}return Buffer.byteLength(i,"utf8")}var Bu={flush:aa.default.constants.Z_SYNC_FLUSH,finishFlush:aa.default.constants.Z_SYNC_FLUSH},v1={flush:aa.default.constants.BROTLI_OPERATION_FLUSH,finishFlush:aa.default.constants.BROTLI_OPERATION_FLUSH},zu=x.isFunction(aa.default.createBrotliDecompress),{http:h1,https:g1}=Gu.default,b1=/https:?/,Du=I.protocols.map(a=>a+":"),Nu=(a,[e,n])=>(a.on("end",n).on("error",n),e),ar=class{constructor(){this.sessions=Object.create(null)}getSession(e,n){n=Object.assign({sessionTimeout:1e3},n);let i=this.sessions[e];if(i){let p=i.length;for(let u=0;u<p;u++){let[d,f]=i[u];if(!d.destroyed&&!d.closed&&ir.default.isDeepStrictEqual(f,n))return d}}let t=nr.default.connect(e,n),o,r=()=>{if(o)return;o=!0;let p=i,u=p.length,d=u;for(;d--;)if(p[d][0]===t){u===1?delete this.sessions[e]:p.splice(d,1);return}},s=t.request,{sessionTimeout:l}=n;if(l!=null){let p,u=0;t.request=function(){let d=s.apply(this,arguments);return u++,p&&(clearTimeout(p),p=null),d.once("close",()=>{--u||(p=setTimeout(()=>{p=null,r()},l))}),d}}t.once("close",r);let c=[t,n];return i?i.push(c):i=this.sessions[e]=[c],t}},y1=new ar;function w1(a,e){a.beforeRedirects.proxy&&a.beforeRedirects.proxy(a),a.beforeRedirects.config&&a.beforeRedirects.config(a,e)}function Vu(a,e,n){let i=e;if(!i&&i!==!1){let t=Mu.default.getProxyForUrl(n);t&&(i=new URL(t))}if(i){if(i.username&&(i.auth=(i.username||"")+":"+(i.password||"")),i.auth){(i.auth.username||i.auth.password)&&(i.auth=(i.auth.username||"")+":"+(i.auth.password||""));let o=Buffer.from(i.auth,"utf8").toString("base64");a.headers["Proxy-Authorization"]="Basic "+o}a.headers.host=a.hostname+(a.port?":"+a.port:"");let t=i.hostname||i.host;a.hostname=t,a.host=t,a.port=i.port,a.path=n,i.protocol&&(a.protocol=i.protocol.includes(":")?i.protocol:`${i.protocol}:`)}a.beforeRedirects.proxy=function(o){Vu(o,e,o.href)}}var k1=typeof process<"u"&&x.kindOf(process)==="process",E1=a=>new Promise((e,n)=>{let i,t,o=(l,c)=>{t||(t=!0,i&&i(l,c))},r=l=>{o(l),e(l)},s=l=>{o(l,!0),n(l)};a(r,s,l=>i=l).catch(s)}),S1=({address:a,family:e})=>{if(!x.isString(a))throw TypeError("address must be a string");return{address:a,family:e||(a.indexOf(".")<0?6:4)}},Uu=(a,e)=>S1(x.isObject(a)?a:{address:a,family:e}),_1={request(a,e){let n=a.protocol+"//"+a.hostname+":"+(a.port||80),{http2Options:i,headers:t}=a,o=y1.getSession(n,i),{HTTP2_HEADER_SCHEME:r,HTTP2_HEADER_METHOD:s,HTTP2_HEADER_PATH:l,HTTP2_HEADER_STATUS:c}=nr.default.constants,p={[r]:a.protocol.replace(":",""),[s]:a.method,[l]:a.path};x.forEach(t,(d,f)=>{f.charAt(0)!==":"&&(p[f]=d)});let u=o.request(p);return u.once("response",d=>{let f=u;d=Object.assign({},d);let m=d[c];delete d[c],f.headers=d,f.statusCode=+m,e(f)}),u}},Xu=k1&&function(e){return E1(async function(i,t,o){let{data:r,lookup:s,family:l,httpVersion:c=1,http2Options:p}=e,{responseType:u,responseEncoding:d}=e,f=e.method.toUpperCase(),m,v=!1,h;if(c=+c,Number.isNaN(c))throw TypeError(`Invalid protocol version: '${e.httpVersion}' is not a number`);if(c!==1&&c!==2)throw TypeError(`Unsupported protocol version '${c}'`);let b=c===2;if(s){let T=Fu(s,E=>x.isArray(E)?E:[E]);s=(E,L,Se)=>{T(E,L,(V,Le,pa)=>{if(V)return Se(V);let he=x.isArray(Le)?Le.map(di=>Uu(di)):[Uu(Le,pa)];L.all?Se(V,he):Se(V,he[0].address,he[0].family)})}}let k=new Wu.EventEmitter;function y(T){try{k.emit("abort",!T||T.type?new _e(null,e,h):T)}catch(E){console.warn("emit error",E)}}k.once("abort",t);let S=()=>{e.cancelToken&&e.cancelToken.unsubscribe(y),e.signal&&e.signal.removeEventListener("abort",y),k.removeAllListeners()};(e.cancelToken||e.signal)&&(e.cancelToken&&e.cancelToken.subscribe(y),e.signal&&(e.signal.aborted?y():e.signal.addEventListener("abort",y))),o((T,E)=>{if(m=!0,E){v=!0,S();return}let{data:L}=T;if(L instanceof ea.default.Readable||L instanceof ea.default.Duplex){let Se=ea.default.finished(L,()=>{Se(),S()})}else S()});let q=Ea(e.baseURL,e.url,e.allowAbsoluteUrls),A=new URL(q,I.hasBrowserEnv?I.origin:void 0),P=A.protocol||Du[0];if(P==="data:"){if(e.maxContentLength>-1){let E=String(e.url||q||"");if(er(E)>e.maxContentLength)return t(new w("maxContentLength size of "+e.maxContentLength+" exceeded",w.ERR_BAD_RESPONSE,e))}let T;if(f!=="GET")return $e(i,t,{status:405,statusText:"method not allowed",headers:{},config:e});try{T=Xo(e.url,u==="blob",{Blob:e.env&&e.env.Blob})}catch(E){throw w.from(E,w.ERR_BAD_REQUEST,e)}return u==="text"?(T=T.toString(d),(!d||d==="utf8")&&(T=x.stripBOM(T))):u==="stream"&&(T=ea.default.Readable.from(T)),$e(i,t,{data:T,status:200,statusText:"OK",headers:new U,config:e})}if(Du.indexOf(P)===-1)return t(new w("Unsupported protocol "+P,w.ERR_BAD_REQUEST,e));let z=U.from(e.headers).normalize();z.set("User-Agent","axios/"+Ca,!1);let{onUploadProgress:D,onDownloadProgress:ae}=e,Oe=e.maxRate,ue,$;if(x.isSpecCompliantForm(r)){let T=z.getContentType(/boundary=([-_\w\d]{10,70})/i);r=Ru(r,E=>{z.set(E)},{tag:`axios-${Ca}-boundary`,boundary:T&&T[1]||void 0})}else if(x.isFormData(r)&&x.isFunction(r.getHeaders)){if(z.set(r.getHeaders()),!z.hasContentLength())try{let T=await ir.default.promisify(r.getLength).call(r);Number.isFinite(T)&&T>=0&&z.setContentLength(T)}catch{}}else if(x.isBlob(r)||x.isFile(r))r.size&&z.setContentType(r.type||"application/octet-stream"),z.setContentLength(r.size||0),r=ea.default.Readable.from(Pi(r));else if(r&&!x.isStream(r)){if(!Buffer.isBuffer(r))if(x.isArrayBuffer(r))r=Buffer.from(new Uint8Array(r));else if(x.isString(r))r=Buffer.from(r,"utf-8");else return t(new w("Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream",w.ERR_BAD_REQUEST,e));if(z.setContentLength(r.length,!1),e.maxBodyLength>-1&&r.length>e.maxBodyLength)return t(new w("Request body larger than maxBodyLength limit",w.ERR_BAD_REQUEST,e))}let ne=x.toFiniteNumber(z.getContentLength());x.isArray(Oe)?(ue=Oe[0],$=Oe[1]):ue=$=Oe,r&&(D||ue)&&(x.isStream(r)||(r=ea.default.Readable.from(r,{objectMode:!1})),r=ea.default.pipeline([r,new Yo({maxRate:x.toFiniteNumber(ue)})],x.noop),D&&r.on("progress",Nu(r,an(ne,Ze(nn(D),!1,3)))));let ie;if(e.auth){let T=e.auth.username||"",E=e.auth.password||"";ie=T+":"+E}if(!ie&&A.username){let T=A.username,E=A.password;ie=T+":"+E}ie&&z.delete("authorization");let Q;try{Q=ka(A.pathname+A.search,e.params,e.paramsSerializer).replace(/^\?/,"")}catch(T){let E=new Error(T.message);return E.config=e,E.url=e.url,E.exists=!0,t(E)}z.set("Accept-Encoding","gzip, compress, deflate"+(zu?", br":""),!1);let W={path:Q,method:f,headers:z.toJSON(),agents:{http:e.httpAgent,https:e.httpsAgent},auth:ie,protocol:P,family:l,beforeRedirect:w1,beforeRedirects:{},http2Options:p};!x.isUndefined(s)&&(W.lookup=s),e.socketPath?W.socketPath=e.socketPath:(W.hostname=A.hostname.startsWith("[")?A.hostname.slice(1,-1):A.hostname,W.port=A.port,Vu(W,e.proxy,P+"//"+A.hostname+(A.port?":"+A.port:"")+W.path));let de,Qe=b1.test(W.protocol);if(W.agent=Qe?e.httpsAgent:e.httpAgent,b?de=_1:e.transport?de=e.transport:e.maxRedirects===0?de=Qe?Hu.default:$u.default:(e.maxRedirects&&(W.maxRedirects=e.maxRedirects),e.beforeRedirect&&(W.beforeRedirects.config=e.beforeRedirect),de=Qe?g1:h1),e.maxBodyLength>-1?W.maxBodyLength=e.maxBodyLength:W.maxBodyLength=1/0,e.insecureHTTPParser&&(W.insecureHTTPParser=e.insecureHTTPParser),h=de.request(W,function(E){if(h.destroyed)return;let L=[E],Se=x.toFiniteNumber(E.headers["content-length"]);if(ae||$){let he=new Yo({maxRate:x.toFiniteNumber($)});ae&&he.on("progress",Nu(he,an(Se,Ze(nn(ae),!0,3)))),L.push(he)}let V=E,Le=E.req||h;if(e.decompress!==!1&&E.headers["content-encoding"])switch((f==="HEAD"||E.statusCode===204)&&delete E.headers["content-encoding"],(E.headers["content-encoding"]||"").toLowerCase()){case"gzip":case"x-gzip":case"compress":case"x-compress":L.push(aa.default.createUnzip(Bu)),delete E.headers["content-encoding"];break;case"deflate":L.push(new Pu),L.push(aa.default.createUnzip(Bu)),delete E.headers["content-encoding"];break;case"br":zu&&(L.push(aa.default.createBrotliDecompress(v1)),delete E.headers["content-encoding"])}V=L.length>1?ea.default.pipeline(L,x.noop):L[0];let pa={status:E.statusCode,statusText:E.statusMessage,headers:new U(E.headers),config:e,request:Le};if(u==="stream")pa.data=V,$e(i,t,pa);else{let he=[],di=0;V.on("data",function(xe){he.push(xe),di+=xe.length,e.maxContentLength>-1&&di>e.maxContentLength&&(v=!0,V.destroy(),y(new w("maxContentLength size of "+e.maxContentLength+" exceeded",w.ERR_BAD_RESPONSE,e,Le)))}),V.on("aborted",function(){if(v)return;let xe=new w("stream has been aborted",w.ERR_BAD_RESPONSE,e,Le);V.destroy(xe),t(xe)}),V.on("error",function(xe){h.destroyed||t(w.from(xe,null,e,Le))}),V.on("end",function(){try{let xe=he.length===1?he[0]:Buffer.concat(he);u!=="arraybuffer"&&(xe=xe.toString(d),(!d||d==="utf8")&&(xe=x.stripBOM(xe))),pa.data=xe}catch(xe){return t(w.from(xe,null,e,pa.request,pa))}$e(i,t,pa)})}k.once("abort",he=>{V.destroyed||(V.emit("error",he),V.destroy())})}),k.once("abort",T=>{h.close?h.close():h.destroy(T)}),h.on("error",function(E){t(w.from(E,null,e,h))}),h.on("socket",function(E){E.setKeepAlive(!0,1e3*60)}),e.timeout){let T=parseInt(e.timeout,10);if(Number.isNaN(T)){y(new w("error trying to parse `config.timeout` to int",w.ERR_BAD_OPTION_VALUE,e,h));return}h.setTimeout(T,function(){if(m)return;let L=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",Se=e.transitional||Xa;e.timeoutErrorMessage&&(L=e.timeoutErrorMessage),y(new w(L,Se.clarifyTimeoutError?w.ETIMEDOUT:w.ECONNABORTED,e,h))})}else h.setTimeout(0);if(x.isStream(r)){let T=!1,E=!1;r.on("end",()=>{T=!0}),r.once("error",L=>{E=!0,h.destroy(L)}),r.on("close",()=>{!T&&!E&&y(new _e("Request stream has been aborted",e,h))}),r.pipe(h)}else r&&h.write(r),h.end()})};var Ju=I.hasStandardBrowserEnv?((a,e)=>n=>(n=new URL(n,I.origin),a.protocol===n.protocol&&a.host===n.host&&(e||a.port===n.port)))(new URL(I.origin),I.navigator&&/(msie|trident)/i.test(I.navigator.userAgent)):()=>!0;var Ku=I.hasStandardBrowserEnv?{write(a,e,n,i,t,o,r){if(typeof document>"u")return;let s=[`${a}=${encodeURIComponent(e)}`];x.isNumber(n)&&s.push(`expires=${new Date(n).toUTCString()}`),x.isString(i)&&s.push(`path=${i}`),x.isString(t)&&s.push(`domain=${t}`),o===!0&&s.push("secure"),x.isString(r)&&s.push(`SameSite=${r}`),document.cookie=s.join("; ")},read(a){if(typeof document>"u")return null;let e=document.cookie.match(new RegExp("(?:^|; )"+a+"=([^;]*)"));return e?decodeURIComponent(e[1]):null},remove(a){this.write(a,"",Date.now()-864e5,"/")}}:{write(){},read(){return null},remove(){}};var Yu=a=>a instanceof U?{...a}:a;function De(a,e){e=e||{};let n={};function i(c,p,u,d){return x.isPlainObject(c)&&x.isPlainObject(p)?x.merge.call({caseless:d},c,p):x.isPlainObject(p)?x.merge({},p):x.isArray(p)?p.slice():p}function t(c,p,u,d){if(x.isUndefined(p)){if(!x.isUndefined(c))return i(void 0,c,u,d)}else return i(c,p,u,d)}function o(c,p){if(!x.isUndefined(p))return i(void 0,p)}function r(c,p){if(x.isUndefined(p)){if(!x.isUndefined(c))return i(void 0,c)}else return i(void 0,p)}function s(c,p,u){if(u in e)return i(c,p);if(u in a)return i(void 0,c)}let l={url:o,method:o,data:o,baseURL:r,transformRequest:r,transformResponse:r,paramsSerializer:r,timeout:r,timeoutMessage:r,withCredentials:r,withXSRFToken:r,adapter:r,responseType:r,xsrfCookieName:r,xsrfHeaderName:r,onUploadProgress:r,onDownloadProgress:r,decompress:r,maxContentLength:r,maxBodyLength:r,beforeRedirect:r,transport:r,httpAgent:r,httpsAgent:r,cancelToken:r,socketPath:r,responseEncoding:r,validateStatus:s,headers:(c,p,u)=>t(Yu(c),Yu(p),u,!0)};return x.forEach(Object.keys({...a,...e}),function(p){let u=l[p]||t,d=u(a[p],e[p],p);x.isUndefined(d)&&u!==s||(n[p]=d)}),n}var Fi=a=>{let e=De({},a),{data:n,withXSRFToken:i,xsrfHeaderName:t,xsrfCookieName:o,headers:r,auth:s}=e;if(e.headers=r=U.from(r),e.url=ka(Ea(e.baseURL,e.url,e.allowAbsoluteUrls),a.params,a.paramsSerializer),s&&r.set("Authorization","Basic "+btoa((s.username||"")+":"+(s.password?unescape(encodeURIComponent(s.password)):""))),x.isFormData(n)){if(I.hasStandardBrowserEnv||I.hasStandardBrowserWebWorkerEnv)r.setContentType(void 0);else if(x.isFunction(n.getHeaders)){let l=n.getHeaders(),c=["content-type","content-length"];Object.entries(l).forEach(([p,u])=>{c.includes(p.toLowerCase())&&r.set(p,u)})}}if(I.hasStandardBrowserEnv&&(i&&x.isFunction(i)&&(i=i(e)),i||i!==!1&&Ju(e.url))){let l=t&&o&&Ku.read(o);l&&r.set(t,l)}return e};var T1=typeof XMLHttpRequest<"u",Qu=T1&&function(a){return new Promise(function(n,i){let t=Fi(a),o=t.data,r=U.from(t.headers).normalize(),{responseType:s,onUploadProgress:l,onDownloadProgress:c}=t,p,u,d,f,m;function v(){f&&f(),m&&m(),t.cancelToken&&t.cancelToken.unsubscribe(p),t.signal&&t.signal.removeEventListener("abort",p)}let h=new XMLHttpRequest;h.open(t.method.toUpperCase(),t.url,!0),h.timeout=t.timeout;function b(){if(!h)return;let y=U.from("getAllResponseHeaders"in h&&h.getAllResponseHeaders()),q={data:!s||s==="text"||s==="json"?h.responseText:h.response,status:h.status,statusText:h.statusText,headers:y,config:a,request:h};$e(function(P){n(P),v()},function(P){i(P),v()},q),h=null}"onloadend"in h?h.onloadend=b:h.onreadystatechange=function(){!h||h.readyState!==4||h.status===0&&!(h.responseURL&&h.responseURL.indexOf("file:")===0)||setTimeout(b)},h.onabort=function(){h&&(i(new w("Request aborted",w.ECONNABORTED,a,h)),h=null)},h.onerror=function(S){let q=S&&S.message?S.message:"Network Error",A=new w(q,w.ERR_NETWORK,a,h);A.event=S||null,i(A),h=null},h.ontimeout=function(){let S=t.timeout?"timeout of "+t.timeout+"ms exceeded":"timeout exceeded",q=t.transitional||Xa;t.timeoutErrorMessage&&(S=t.timeoutErrorMessage),i(new w(S,q.clarifyTimeoutError?w.ETIMEDOUT:w.ECONNABORTED,a,h)),h=null},o===void 0&&r.setContentType(null),"setRequestHeader"in h&&x.forEach(r.toJSON(),function(S,q){h.setRequestHeader(q,S)}),x.isUndefined(t.withCredentials)||(h.withCredentials=!!t.withCredentials),s&&s!=="json"&&(h.responseType=t.responseType),c&&([d,m]=Ze(c,!0),h.addEventListener("progress",d)),l&&h.upload&&([u,f]=Ze(l),h.upload.addEventListener("progress",u),h.upload.addEventListener("loadend",f)),(t.cancelToken||t.signal)&&(p=y=>{h&&(i(!y||y.type?new _e(null,a,h):y),h.abort(),h=null)},t.cancelToken&&t.cancelToken.subscribe(p),t.signal&&(t.signal.aborted?p():t.signal.addEventListener("abort",p)));let k=Bn(t.url);if(k&&I.protocols.indexOf(k)===-1){i(new w("Unsupported protocol "+k+":",w.ERR_BAD_REQUEST,a));return}h.send(o||null)})};var C1=(a,e)=>{let{length:n}=a=a?a.filter(Boolean):[];if(e||n){let i=new AbortController,t,o=function(c){if(!t){t=!0,s();let p=c instanceof Error?c:this.reason;i.abort(p instanceof w?p:new _e(p instanceof Error?p.message:p))}},r=e&&setTimeout(()=>{r=null,o(new w(`timeout ${e} of ms exceeded`,w.ETIMEDOUT))},e),s=()=>{a&&(r&&clearTimeout(r),r=null,a.forEach(c=>{c.unsubscribe?c.unsubscribe(o):c.removeEventListener("abort",o)}),a=null)};a.forEach(c=>c.addEventListener("abort",o));let{signal:l}=i;return l.unsubscribe=()=>x.asap(s),l}},Zu=C1;var A1=function*(a,e){let n=a.byteLength;if(!e||n<e){yield a;return}let i=0,t;for(;i<n;)t=i+e,yield a.slice(i,t),i=t},j1=async function*(a,e){for await(let n of O1(a))yield*A1(n,e)},O1=async function*(a){if(a[Symbol.asyncIterator]){yield*a;return}let e=a.getReader();try{for(;;){let{done:n,value:i}=await e.read();if(n)break;yield i}}finally{await e.cancel()}},tr=(a,e,n,i)=>{let t=j1(a,e),o=0,r,s=l=>{r||(r=!0,i&&i(l))};return new ReadableStream({async pull(l){try{let{done:c,value:p}=await t.next();if(c){s(),l.close();return}let u=p.byteLength;if(n){let d=o+=u;n(d)}l.enqueue(new Uint8Array(p))}catch(c){throw s(c),c}},cancel(l){return s(l),t.return()}},{highWaterMark:2})};var ed=64*1024,{isFunction:Ii}=x,R1=(({Request:a,Response:e})=>({Request:a,Response:e}))(x.global),{ReadableStream:ad,TextEncoder:nd}=x.global,id=(a,...e)=>{try{return!!a(...e)}catch{return!1}},q1=a=>{a=x.merge.call({skipUndefined:!0},R1,a);let{fetch:e,Request:n,Response:i}=a,t=e?Ii(e):typeof fetch=="function",o=Ii(n),r=Ii(i);if(!t)return!1;let s=t&&Ii(ad),l=t&&(typeof nd=="function"?(m=>v=>m.encode(v))(new nd):async m=>new Uint8Array(await new n(m).arrayBuffer())),c=o&&s&&id(()=>{let m=!1,v=new n(I.origin,{body:new ad,method:"POST",get duplex(){return m=!0,"half"}}).headers.has("Content-Type");return m&&!v}),p=r&&s&&id(()=>x.isReadableStream(new i("").body)),u={stream:p&&(m=>m.body)};t&&["text","arrayBuffer","blob","formData","stream"].forEach(m=>{!u[m]&&(u[m]=(v,h)=>{let b=v&&v[m];if(b)return b.call(v);throw new w(`Response type '${m}' is not supported`,w.ERR_NOT_SUPPORT,h)})});let d=async m=>{if(m==null)return 0;if(x.isBlob(m))return m.size;if(x.isSpecCompliantForm(m))return(await new n(I.origin,{method:"POST",body:m}).arrayBuffer()).byteLength;if(x.isArrayBufferView(m)||x.isArrayBuffer(m))return m.byteLength;if(x.isURLSearchParams(m)&&(m=m+""),x.isString(m))return(await l(m)).byteLength},f=async(m,v)=>{let h=x.toFiniteNumber(m.getContentLength());return h??d(v)};return async m=>{let{url:v,method:h,data:b,signal:k,cancelToken:y,timeout:S,onDownloadProgress:q,onUploadProgress:A,responseType:P,headers:z,withCredentials:D="same-origin",fetchOptions:ae}=Fi(m),Oe=e||fetch;P=P?(P+"").toLowerCase():"text";let ue=Zu([k,y&&y.toAbortSignal()],S),$=null,ne=ue&&ue.unsubscribe&&(()=>{ue.unsubscribe()}),ie;try{if(A&&c&&h!=="get"&&h!=="head"&&(ie=await f(z,b))!==0){let E=new n(v,{method:"POST",body:b,duplex:"half"}),L;if(x.isFormData(b)&&(L=E.headers.get("content-type"))&&z.setContentType(L),E.body){let[Se,V]=an(ie,Ze(nn(A)));b=tr(E.body,ed,Se,V)}}x.isString(D)||(D=D?"include":"omit");let Q=o&&"credentials"in n.prototype,W={...ae,signal:ue,method:h.toUpperCase(),headers:z.normalize().toJSON(),body:b,duplex:"half",credentials:Q?D:void 0};$=o&&new n(v,W);let de=await(o?Oe($,ae):Oe(v,W)),Qe=p&&(P==="stream"||P==="response");if(p&&(q||Qe&&ne)){let E={};["status","statusText","headers"].forEach(Le=>{E[Le]=de[Le]});let L=x.toFiniteNumber(de.headers.get("content-length")),[Se,V]=q&&an(L,Ze(nn(q),!0))||[];de=new i(tr(de.body,ed,Se,()=>{V&&V(),ne&&ne()}),E)}P=P||"text";let T=await u[x.findKey(u,P)||"text"](de,m);return!Qe&&ne&&ne(),await new Promise((E,L)=>{$e(E,L,{data:T,headers:U.from(de.headers),status:de.status,statusText:de.statusText,config:m,request:$})})}catch(Q){throw ne&&ne(),Q&&Q.name==="TypeError"&&/Load failed|fetch/i.test(Q.message)?Object.assign(new w("Network Error",w.ERR_NETWORK,m,$),{cause:Q.cause||Q}):w.from(Q,Q&&Q.code,m,$)}}},P1=new Map,or=a=>{let e=a&&a.env||{},{fetch:n,Request:i,Response:t}=e,o=[i,t,n],r=o.length,s=r,l,c,p=P1;for(;s--;)l=o[s],c=p.get(l),c===void 0&&p.set(l,c=s?new Map:q1(e)),p=c;return c},rT=or();var rr={http:Xu,xhr:Qu,fetch:{get:or}};x.forEach(rr,(a,e)=>{if(a){try{Object.defineProperty(a,"name",{value:e})}catch{}Object.defineProperty(a,"adapterName",{value:e})}});var td=a=>`- ${a}`,I1=a=>x.isFunction(a)||a===null||a===!1;function L1(a,e){a=x.isArray(a)?a:[a];let{length:n}=a,i,t,o={};for(let r=0;r<n;r++){i=a[r];let s;if(t=i,!I1(i)&&(t=rr[(s=String(i)).toLowerCase()],t===void 0))throw new w(`Unknown adapter '${s}'`);if(t&&(x.isFunction(t)||(t=t.get(e))))break;o[s||"#"+r]=t}if(!t){let r=Object.entries(o).map(([l,c])=>`adapter ${l} `+(c===!1?"is not supported by the environment":"is not available in the build")),s=n?r.length>1?`since :
59
59
  `+r.map(td).join(`
60
60
  `):" "+td(r[0]):"as no adapter specified";throw new w("There is no suitable adapter to dispatch the request "+s,"ERR_NOT_SUPPORT")}return t}var Li={getAdapter:L1,adapters:rr};function sr(a){if(a.cancelToken&&a.cancelToken.throwIfRequested(),a.signal&&a.signal.aborted)throw new _e(null,a)}function Bi(a){return sr(a),a.headers=U.from(a.headers),a.data=Rn.call(a,a.transformRequest),["post","put","patch"].indexOf(a.method)!==-1&&a.headers.setContentType("application/x-www-form-urlencoded",!1),Li.getAdapter(a.adapter||Ja.adapter,a)(a).then(function(i){return sr(a),i.data=Rn.call(a,a.transformResponse,i),i.headers=U.from(i.headers),i},function(i){return qn(i)||(sr(a),i&&i.response&&(i.response.data=Rn.call(a,a.transformResponse,i.response),i.response.headers=U.from(i.response.headers))),Promise.reject(i)})}var zi={};["object","boolean","number","function","string","symbol"].forEach((a,e)=>{zi[a]=function(i){return typeof i===a||"a"+(e<1?"n ":" ")+a}});var od={};zi.transitional=function(e,n,i){function t(o,r){return"[Axios v"+Ca+"] Transitional option '"+o+"'"+r+(i?". "+i:"")}return(o,r,s)=>{if(e===!1)throw new w(t(r," has been removed"+(n?" in "+n:"")),w.ERR_DEPRECATED);return n&&!od[r]&&(od[r]=!0,console.warn(t(r," has been deprecated since v"+n+" and will be removed in the near future"))),e?e(o,r,s):!0}};zi.spelling=function(e){return(n,i)=>(console.warn(`${i} is likely a misspelling of ${e}`),!0)};function B1(a,e,n){if(typeof a!="object")throw new w("options must be an object",w.ERR_BAD_OPTION_VALUE);let i=Object.keys(a),t=i.length;for(;t-- >0;){let o=i[t],r=e[o];if(r){let s=a[o],l=s===void 0||r(s,o,a);if(l!==!0)throw new w("option "+o+" must be "+l,w.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new w("Unknown option "+o,w.ERR_BAD_OPTION)}}var Dn={assertOptions:B1,validators:zi};var He=Dn.validators,tn=class{constructor(e){this.defaults=e||{},this.interceptors={request:new Eo,response:new Eo}}async request(e,n){try{return await this._request(e,n)}catch(i){if(i instanceof Error){let t={};Error.captureStackTrace?Error.captureStackTrace(t):t=new Error;let o=t.stack?t.stack.replace(/^.+\n/,""):"";try{i.stack?o&&!String(i.stack).endsWith(o.replace(/^.+\n.+\n/,""))&&(i.stack+=`
61
- `+o):i.stack=o}catch{}}throw i}}_request(e,n){typeof e=="string"?(n=n||{},n.url=e):n=e||{},n=De(this.defaults,n);let{transitional:i,paramsSerializer:t,headers:o}=n;i!==void 0&&Dn.assertOptions(i,{silentJSONParsing:He.transitional(He.boolean),forcedJSONParsing:He.transitional(He.boolean),clarifyTimeoutError:He.transitional(He.boolean)},!1),t!=null&&(x.isFunction(t)?n.paramsSerializer={serialize:t}:Dn.assertOptions(t,{encode:He.function,serialize:He.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),Dn.assertOptions(n,{baseUrl:He.spelling("baseURL"),withXsrfToken:He.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let r=o&&x.merge(o.common,o[n.method]);o&&x.forEach(["delete","get","head","post","put","patch","common"],m=>{delete o[m]}),n.headers=U.concat(r,o);let s=[],l=!0;this.interceptors.request.forEach(function(v){typeof v.runWhen=="function"&&v.runWhen(n)===!1||(l=l&&v.synchronous,s.unshift(v.fulfilled,v.rejected))});let c=[];this.interceptors.response.forEach(function(v){c.push(v.fulfilled,v.rejected)});let p,u=0,d;if(!l){let m=[Bi.bind(this),void 0];for(m.unshift(...s),m.push(...c),d=m.length,p=Promise.resolve(n);u<d;)p=p.then(m[u++],m[u++]);return p}d=s.length;let f=n;for(;u<d;){let m=s[u++],v=s[u++];try{f=m(f)}catch(h){v.call(this,h);break}}try{p=Bi.call(this,f)}catch(m){return Promise.reject(m)}for(u=0,d=c.length;u<d;)p=p.then(c[u++],c[u++]);return p}getUri(e){e=De(this.defaults,e);let n=Ea(e.baseURL,e.url,e.allowAbsoluteUrls);return ka(n,e.params,e.paramsSerializer)}};x.forEach(["delete","get","head","options"],function(e){tn.prototype[e]=function(n,i){return this.request(De(i||{},{method:e,url:n,data:(i||{}).data}))}});x.forEach(["post","put","patch"],function(e){function n(i){return function(o,r,s){return this.request(De(s||{},{method:e,headers:i?{"Content-Type":"multipart/form-data"}:{},url:o,data:r}))}}tn.prototype[e]=n(),tn.prototype[e+"Form"]=n(!0)});var Nn=tn;var cr=class a{constructor(e){if(typeof e!="function")throw new TypeError("executor must be a function.");let n;this.promise=new Promise(function(o){n=o});let i=this;this.promise.then(t=>{if(!i._listeners)return;let o=i._listeners.length;for(;o-- >0;)i._listeners[o](t);i._listeners=null}),this.promise.then=t=>{let o,r=new Promise(s=>{i.subscribe(s),o=s}).then(t);return r.cancel=function(){i.unsubscribe(o)},r},e(function(o,r,s){i.reason||(i.reason=new _e(o,r,s),n(i.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;let n=this._listeners.indexOf(e);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){let e=new AbortController,n=i=>{e.abort(i)};return this.subscribe(n),e.signal.unsubscribe=()=>this.unsubscribe(n),e.signal}static source(){let e;return{token:new a(function(t){e=t}),cancel:e}}},rd=cr;function pr(a){return function(n){return a.apply(null,n)}}function lr(a){return x.isObject(a)&&a.isAxiosError===!0}var ur={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(ur).forEach(([a,e])=>{ur[e]=a});var sd=ur;function cd(a){let e=new Nn(a),n=wn(Nn.prototype.request,e);return x.extend(n,Nn.prototype,e,{allOwnKeys:!0}),x.extend(n,e,null,{allOwnKeys:!0}),n.create=function(t){return cd(De(a,t))},n}var Y=cd(Ja);Y.Axios=Nn;Y.CanceledError=_e;Y.CancelToken=rd;Y.isCancel=qn;Y.VERSION=Ca;Y.toFormData=da;Y.AxiosError=w;Y.Cancel=Y.CanceledError;Y.all=function(e){return Promise.all(e)};Y.spread=pr;Y.isAxiosError=lr;Y.mergeConfig=De;Y.AxiosHeaders=U;Y.formToJSON=a=>Ci(x.isHTMLForm(a)?new FormData(a):a);Y.getAdapter=Li.getAdapter;Y.HttpStatusCode=sd;Y.default=Y;var me=Y;var{Axios:nC,AxiosError:iC,CanceledError:tC,isCancel:oC,CancelToken:rC,VERSION:sC,all:cC,Cancel:pC,isAxiosError:lC,spread:uC,toFormData:dC,AxiosHeaders:mC,HttpStatusCode:fC,formToJSON:xC,getAdapter:vC,mergeConfig:hC}=me;var Jt=O(Eh());var le=[];for(let a=0;a<256;++a)le.push((a+256).toString(16).slice(1));function Sh(a,e=0){return(le[a[e+0]]+le[a[e+1]]+le[a[e+2]]+le[a[e+3]]+"-"+le[a[e+4]]+le[a[e+5]]+"-"+le[a[e+6]]+le[a[e+7]]+"-"+le[a[e+8]]+le[a[e+9]]+"-"+le[a[e+10]]+le[a[e+11]]+le[a[e+12]]+le[a[e+13]]+le[a[e+14]]+le[a[e+15]]).toLowerCase()}var _h=require("node:crypto"),It=new Uint8Array(256),Ft=It.length;function dc(){return Ft>It.length-16&&((0,_h.randomFillSync)(It),Ft=0),It.slice(Ft,Ft+=16)}var Th=require("node:crypto"),mc={randomUUID:Th.randomUUID};function V3(a,e,n){a=a||{};let i=a.random??a.rng?.()??dc();if(i.length<16)throw new Error("Random bytes length must be >= 16");if(i[6]=i[6]&15|64,i[8]=i[8]&63|128,e){if(n=n||0,n<0||n+16>e.length)throw new RangeError(`UUID byte range ${n}:${n+15} is out of buffer bounds`);for(let t=0;t<16;++t)e[n+t]=i[t];return e}return Sh(i)}function X3(a,e,n){return mc.randomUUID&&!e&&!a?mc.randomUUID():V3(a,e,n)}var fc=X3;var Ba=O(require("node:crypto"));var ee=O(require("node:fs")),Dt=O(require("node:os")),La=O(require("node:path"));var Ye=O(require("node:fs")),Ch=O(require("node:os")),Lt=O(require("node:path")),Ah=require("node:events"),j={reset:"\x1B[0m",bright:"\x1B[1m",dim:"\x1B[2m",underscore:"\x1B[4m",black:"\x1B[30m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m",bgBlack:"\x1B[40m",bgRed:"\x1B[41m",bgGreen:"\x1B[42m",bgYellow:"\x1B[43m",bgBlue:"\x1B[44m",bgMagenta:"\x1B[45m",bgCyan:"\x1B[46m",bgWhite:"\x1B[47m"};var si=Lt.join(Ch.homedir(),".config","oca","logs"),xc=new Date().toISOString().slice(0,10),ri=null;function J3(){Ye.existsSync(si)||Ye.mkdirSync(si,{recursive:!0})}function jh(){J3();let a=Lt.join(si,`${xc}.log`);if(ri)try{ri.end()}catch{}ri=Ye.createWriteStream(a,{flags:"a"}),Y3()}function K3(){let a=new Date().toISOString().slice(0,10);(a!==xc||!ri)&&(xc=a,jh())}function Ke(a){try{K3();let e=JSON.stringify(a);ri?.write(`${e}
62
- `),Bt.emit("log",a)}catch{}}function Y3(){try{let a=Ye.readdirSync(si).filter(n=>/\d{4}-\d{2}-\d{2}\.log$/.test(n)),e=Date.now();for(let n of a){let i=n.slice(0,10),t=Date.parse(i);if(!Number.isNaN(t)&&e-t>720*60*60*1e3)try{Ye.unlinkSync(Lt.join(si,n))}catch{}}}catch{}}jh();var Bt=new Ah.EventEmitter,_={info:a=>{console.log(`${j.cyan}\u2139${j.reset} ${a}`),Ke({ts:new Date().toISOString(),level:"info",message:a,type:"log"})},success:a=>{console.log(`${j.green}\u2713${j.reset} ${a}`),Ke({ts:new Date().toISOString(),level:"success",message:a,type:"log"})},warn:a=>{console.log(`${j.yellow}\u26A0${j.reset} ${j.yellow}${a}${j.reset}`),Ke({ts:new Date().toISOString(),level:"warn",message:a,type:"log"})},error:a=>{console.log(`${j.red}\u2717${j.reset} ${j.red}${a}${j.reset}`),Ke({ts:new Date().toISOString(),level:"error",message:a,type:"log"})},debug:a=>{console.log(`${j.dim}${a}${j.reset}`),Ke({ts:new Date().toISOString(),level:"debug",message:a,type:"log"})},auth:a=>{console.log(`${j.yellow}[Auth]${j.reset} ${a}`),Ke({ts:new Date().toISOString(),level:"auth",message:a,type:"log"})},anthropic:a=>{console.log(`${j.magenta}[Anthropic]${j.reset} ${a}`),Ke({ts:new Date().toISOString(),level:"anthropic",message:a,type:"log"})},openai:a=>{console.log(`${j.blue}[OpenAI]${j.reset} ${a}`),Ke({ts:new Date().toISOString(),level:"openai",message:a,type:"log"})},request:(a,e,n)=>{let t={GET:j.green,POST:j.blue,PUT:j.yellow,DELETE:j.red,PATCH:j.cyan}[a]||j.white,o=n?` ${j.dim}${n}${j.reset}`:"";console.log(`${t}${j.bright}${a}${j.reset} ${e}${o}`),Ke({ts:new Date().toISOString(),level:"request",type:"request",method:a,path:e,extra:n})},response:(a,e,n)=>{let i=j.green;a>=400?i=j.red:a>=300&&(i=j.yellow);let t=n?` ${j.dim}${n}ms${j.reset}`:"";console.log(`${i}${a}${j.reset} ${e}${t}`),Ke({ts:new Date().toISOString(),level:"response",type:"response",status:a,path:e,duration:n})},blank:()=>console.log(""),raw:(...a)=>console.log(...a)};function Oh(a,e=60){let n=j.cyan+j.bright,i=j.reset,t=[];t.push(`${n}\u2554${"\u2550".repeat(e)}\u2557${i}`);for(let o of a){let r="\\x1B\\[[0-9;]*m",s=o.replace(new RegExp(r,"g"),""),l=e-s.length;l>0?t.push(`${n}\u2551${i}${o}${" ".repeat(l)}${n}\u2551${i}`):t.push(`${n}\u2551${i}${o.substring(0,e)}${n}\u2551${i}`)}return t.push(`${n}\u255A${"\u2550".repeat(e)}\u255D${i}`),t}function ci(a,e,n=14){let i=a.padEnd(n);return` ${j.dim}${i}${j.reset} ${e}`}var Rh=La.join(Dt.homedir(),".oca","oca-proxy-config.json"),zt=La.join(Dt.homedir(),".config","oca","oca-proxy.config.json");function qh(){try{if(ee.existsSync(zt))return JSON.parse(ee.readFileSync(zt,"utf-8"));if(ee.existsSync(Rh))return JSON.parse(ee.readFileSync(Rh,"utf-8"))}catch{}return{}}var vc=qh(),N={client_id:"a8331954c0cf48ba99b5dd223a14c6ea",idcs_url:vc.idcs_url||"https://idcs-9dc693e80d9b469480d7afe00e743931.identity.oraclecloud.com",scopes:"openid offline_access",base_url:vc.base_url||"https://code-internal.aiservice.us-chicago-1.oci.oraclecloud.com/20250206/app/litellm"};var Me=La.join(Dt.homedir(),".oca","refresh_token.json"),fe=parseInt(process.env.PORT||String(vc.port||8669),10);function Nt(){try{let a=qh();return{log_level:a.log_level||"INFO",model_mapping:a.model_mapping||{},default_model:a.default_model,base_url:a.base_url,idcs_url:a.idcs_url,port:a.port}}catch{return{log_level:"INFO",model_mapping:{}}}}function Ph(a){try{let e=La.dirname(zt);return ee.existsSync(e)||ee.mkdirSync(e,{recursive:!0}),ee.writeFileSync(zt,JSON.stringify(a,null,2)),!0}catch(e){return _.error(`Failed to save config: ${String(e)}`),!1}}function Fh(){try{if(ee.existsSync(Me))return JSON.parse(ee.readFileSync(Me,"utf-8")).refresh_token}catch{}return null}function hc(a){let e=La.dirname(Me);ee.existsSync(e)||ee.mkdirSync(e,{recursive:!0});let n={refresh_token:a,created_at:new Date().toISOString()};ee.writeFileSync(Me,JSON.stringify(n,null,2),{mode:384}),_.info(`Refresh token saved to ${Me}`)}function Ih(){try{ee.existsSync(Me)&&ee.unlinkSync(Me)}catch{}}var pi=new Map;function Q3(){return Ba.randomBytes(96).toString("base64url")}function Z3(a){return Ba.createHash("sha256").update(a).digest("base64url")}function Lh(a=32){return Ba.randomBytes(a).toString("base64url").slice(0,a)}function eS(){let a=Date.now()-6e5;for(let[e,n]of pi.entries())n.created_at<a&&pi.delete(e)}function Bh(a){eS();let e=Q3(),n=Z3(e),i=Lh(32),t=Lh(32);pi.set(i,{code_verifier:e,nonce:t,redirect_uri:a,created_at:Date.now()});let o=new URLSearchParams({client_id:N.client_id,response_type:"code",scope:N.scopes,redirect_uri:a,state:i,nonce:t,code_challenge:n,code_challenge_method:"S256"});return`${N.idcs_url}/oauth2/v1/authorize?${o.toString()}`}function zh(a){return pi.get(a)}function Dh(a){pi.delete(a)}async function Nh(a,e,n){let t=(await me.get(`${N.idcs_url}/.well-known/openid-configuration`)).data.token_endpoint,o=new URLSearchParams({grant_type:"authorization_code",code:a,redirect_uri:n,client_id:N.client_id,code_verifier:e}),r=await me.post(t,o,{headers:{"Content-Type":"application/x-www-form-urlencoded"}});return{access_token:r.data.access_token,refresh_token:r.data.refresh_token,expires_in:r.data.expires_in||3600}}var Ut=class{refreshToken=null;accessToken=null;tokenExpiry=null;refreshPromise=null;constructor(){this.refreshToken=Fh(),this.refreshToken?_.info("Refresh token loaded successfully"):_.warn("No refresh token found. Visit /login to authenticate.")}isAuthenticated(){return this.refreshToken!==null}setRefreshToken(e){this.refreshToken=e,this.accessToken=null,this.tokenExpiry=null,hc(e)}clearAuth(){this.refreshToken=null,this.accessToken=null,this.tokenExpiry=null,Ih()}async getToken(){if(!this.refreshToken)throw new Error("Not authenticated. Please visit /login to authenticate with OCA.");if(this.accessToken&&this.tokenExpiry){let e=(this.tokenExpiry.getTime()-Date.now())/1e3;if(e>300)return _.debug(`Using cached access token (expires in ${Math.floor(e)}s)`),this.accessToken||""}if(this.refreshPromise)return _.debug("Waiting for in-flight token refresh..."),this.refreshPromise;this.refreshPromise=this.doRefreshToken();try{return await this.refreshPromise}finally{this.refreshPromise=null}}async doRefreshToken(){_.info("Refreshing access token using refresh token");try{let n=(await me.get(`${N.idcs_url}/.well-known/openid-configuration`)).data.token_endpoint,i=this.refreshToken;if(!i)throw new Error("Not authenticated. Missing refresh token.");let t=new URLSearchParams({grant_type:"refresh_token",refresh_token:i,client_id:N.client_id}),o=await me.post(n,t,{headers:{"Content-Type":"application/x-www-form-urlencoded"}});this.accessToken=o.data.access_token;let r=o.data.expires_in||3600;this.tokenExpiry=new Date(Date.now()+r*1e3);let s=o.data.refresh_token;return s&&s!==this.refreshToken&&(_.info("Received new refresh token, updating saved token"),this.refreshToken=s,hc(this.refreshToken||"")),_.success(`Successfully refreshed access token (expires in ${r}s)`),this.accessToken||""}catch(e){let n=e,i=n.response?.status,t=n.response?.data;_.error(`Failed to refresh access token: ${i} ${JSON.stringify(t)}`);let o=t??{};throw i===400&&(o.error==="invalid_grant"||o.error==="invalid_token")?(_.error("Refresh token is invalid/expired. Clearing authentication."),this.clearAuth(),new Error("Refresh token expired. Please visit /login to re-authenticate.")):new Error(`Failed to refresh OCA access token: ${n.message||"unknown error"}`)}}getTokenExpiry(){return this.tokenExpiry}};function ba(a){return{Authorization:`Bearer ${a}`,"opc-request-id":Ba.randomUUID(),"Content-Type":"application/json"}}function Uh(a,e){a.get("/",async(n,i)=>{let t=e.isAuthenticated(),o=t?"green":"orange",r=t?"Authenticated":"Not Authenticated",s=t?'<a href="/logout" style="color: red;">Logout</a>':'<a href="/login">Login with Oracle Code Assist</a>';i.send(`
61
+ `+o):i.stack=o}catch{}}throw i}}_request(e,n){typeof e=="string"?(n=n||{},n.url=e):n=e||{},n=De(this.defaults,n);let{transitional:i,paramsSerializer:t,headers:o}=n;i!==void 0&&Dn.assertOptions(i,{silentJSONParsing:He.transitional(He.boolean),forcedJSONParsing:He.transitional(He.boolean),clarifyTimeoutError:He.transitional(He.boolean)},!1),t!=null&&(x.isFunction(t)?n.paramsSerializer={serialize:t}:Dn.assertOptions(t,{encode:He.function,serialize:He.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),Dn.assertOptions(n,{baseUrl:He.spelling("baseURL"),withXsrfToken:He.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let r=o&&x.merge(o.common,o[n.method]);o&&x.forEach(["delete","get","head","post","put","patch","common"],m=>{delete o[m]}),n.headers=U.concat(r,o);let s=[],l=!0;this.interceptors.request.forEach(function(v){typeof v.runWhen=="function"&&v.runWhen(n)===!1||(l=l&&v.synchronous,s.unshift(v.fulfilled,v.rejected))});let c=[];this.interceptors.response.forEach(function(v){c.push(v.fulfilled,v.rejected)});let p,u=0,d;if(!l){let m=[Bi.bind(this),void 0];for(m.unshift(...s),m.push(...c),d=m.length,p=Promise.resolve(n);u<d;)p=p.then(m[u++],m[u++]);return p}d=s.length;let f=n;for(;u<d;){let m=s[u++],v=s[u++];try{f=m(f)}catch(h){v.call(this,h);break}}try{p=Bi.call(this,f)}catch(m){return Promise.reject(m)}for(u=0,d=c.length;u<d;)p=p.then(c[u++],c[u++]);return p}getUri(e){e=De(this.defaults,e);let n=Ea(e.baseURL,e.url,e.allowAbsoluteUrls);return ka(n,e.params,e.paramsSerializer)}};x.forEach(["delete","get","head","options"],function(e){tn.prototype[e]=function(n,i){return this.request(De(i||{},{method:e,url:n,data:(i||{}).data}))}});x.forEach(["post","put","patch"],function(e){function n(i){return function(o,r,s){return this.request(De(s||{},{method:e,headers:i?{"Content-Type":"multipart/form-data"}:{},url:o,data:r}))}}tn.prototype[e]=n(),tn.prototype[e+"Form"]=n(!0)});var Nn=tn;var cr=class a{constructor(e){if(typeof e!="function")throw new TypeError("executor must be a function.");let n;this.promise=new Promise(function(o){n=o});let i=this;this.promise.then(t=>{if(!i._listeners)return;let o=i._listeners.length;for(;o-- >0;)i._listeners[o](t);i._listeners=null}),this.promise.then=t=>{let o,r=new Promise(s=>{i.subscribe(s),o=s}).then(t);return r.cancel=function(){i.unsubscribe(o)},r},e(function(o,r,s){i.reason||(i.reason=new _e(o,r,s),n(i.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;let n=this._listeners.indexOf(e);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){let e=new AbortController,n=i=>{e.abort(i)};return this.subscribe(n),e.signal.unsubscribe=()=>this.unsubscribe(n),e.signal}static source(){let e;return{token:new a(function(t){e=t}),cancel:e}}},rd=cr;function pr(a){return function(n){return a.apply(null,n)}}function lr(a){return x.isObject(a)&&a.isAxiosError===!0}var ur={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(ur).forEach(([a,e])=>{ur[e]=a});var sd=ur;function cd(a){let e=new Nn(a),n=wn(Nn.prototype.request,e);return x.extend(n,Nn.prototype,e,{allOwnKeys:!0}),x.extend(n,e,null,{allOwnKeys:!0}),n.create=function(t){return cd(De(a,t))},n}var Y=cd(Ja);Y.Axios=Nn;Y.CanceledError=_e;Y.CancelToken=rd;Y.isCancel=qn;Y.VERSION=Ca;Y.toFormData=da;Y.AxiosError=w;Y.Cancel=Y.CanceledError;Y.all=function(e){return Promise.all(e)};Y.spread=pr;Y.isAxiosError=lr;Y.mergeConfig=De;Y.AxiosHeaders=U;Y.formToJSON=a=>Ci(x.isHTMLForm(a)?new FormData(a):a);Y.getAdapter=Li.getAdapter;Y.HttpStatusCode=sd;Y.default=Y;var me=Y;var{Axios:nC,AxiosError:iC,CanceledError:tC,isCancel:oC,CancelToken:rC,VERSION:sC,all:cC,Cancel:pC,isAxiosError:lC,spread:uC,toFormData:dC,AxiosHeaders:mC,HttpStatusCode:fC,formToJSON:xC,getAdapter:vC,mergeConfig:hC}=me;var Jt=O(Eh());var le=[];for(let a=0;a<256;++a)le.push((a+256).toString(16).slice(1));function Sh(a,e=0){return(le[a[e+0]]+le[a[e+1]]+le[a[e+2]]+le[a[e+3]]+"-"+le[a[e+4]]+le[a[e+5]]+"-"+le[a[e+6]]+le[a[e+7]]+"-"+le[a[e+8]]+le[a[e+9]]+"-"+le[a[e+10]]+le[a[e+11]]+le[a[e+12]]+le[a[e+13]]+le[a[e+14]]+le[a[e+15]]).toLowerCase()}var _h=require("node:crypto"),It=new Uint8Array(256),Ft=It.length;function dc(){return Ft>It.length-16&&((0,_h.randomFillSync)(It),Ft=0),It.slice(Ft,Ft+=16)}var Th=require("node:crypto"),mc={randomUUID:Th.randomUUID};function V3(a,e,n){a=a||{};let i=a.random??a.rng?.()??dc();if(i.length<16)throw new Error("Random bytes length must be >= 16");if(i[6]=i[6]&15|64,i[8]=i[8]&63|128,e){if(n=n||0,n<0||n+16>e.length)throw new RangeError(`UUID byte range ${n}:${n+15} is out of buffer bounds`);for(let t=0;t<16;++t)e[n+t]=i[t];return e}return Sh(i)}function X3(a,e,n){return mc.randomUUID&&!e&&!a?mc.randomUUID():V3(a,e,n)}var fc=X3;var Ba=O(require("node:crypto"));var ee=O(require("node:fs")),Dt=O(require("node:os")),La=O(require("node:path"));var Ch=require("node:events"),Ye=O(require("node:fs")),Ah=O(require("node:os")),Lt=O(require("node:path")),j={reset:"\x1B[0m",bright:"\x1B[1m",dim:"\x1B[2m",underscore:"\x1B[4m",black:"\x1B[30m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m",bgBlack:"\x1B[40m",bgRed:"\x1B[41m",bgGreen:"\x1B[42m",bgYellow:"\x1B[43m",bgBlue:"\x1B[44m",bgMagenta:"\x1B[45m",bgCyan:"\x1B[46m",bgWhite:"\x1B[47m"};var si=Lt.join(Ah.homedir(),".config","oca","logs"),xc=new Date().toISOString().slice(0,10),ri=null;function J3(){Ye.existsSync(si)||Ye.mkdirSync(si,{recursive:!0})}function jh(){J3();let a=Lt.join(si,`${xc}.log`);if(ri)try{ri.end()}catch{}ri=Ye.createWriteStream(a,{flags:"a"}),Y3()}function K3(){let a=new Date().toISOString().slice(0,10);(a!==xc||!ri)&&(xc=a,jh())}function Ke(a){try{K3();let e=JSON.stringify(a);ri?.write(`${e}
62
+ `),Bt.emit("log",a)}catch{}}function Y3(){try{let a=Ye.readdirSync(si).filter(n=>/\d{4}-\d{2}-\d{2}\.log$/.test(n)),e=Date.now();for(let n of a){let i=n.slice(0,10),t=Date.parse(i);if(!Number.isNaN(t)&&e-t>720*60*60*1e3)try{Ye.unlinkSync(Lt.join(si,n))}catch{}}}catch{}}jh();var Bt=new Ch.EventEmitter,_={info:a=>{console.log(`${j.cyan}\u2139${j.reset} ${a}`),Ke({ts:new Date().toISOString(),level:"info",message:a,type:"log"})},success:a=>{console.log(`${j.green}\u2713${j.reset} ${a}`),Ke({ts:new Date().toISOString(),level:"success",message:a,type:"log"})},warn:a=>{console.log(`${j.yellow}\u26A0${j.reset} ${j.yellow}${a}${j.reset}`),Ke({ts:new Date().toISOString(),level:"warn",message:a,type:"log"})},error:a=>{console.log(`${j.red}\u2717${j.reset} ${j.red}${a}${j.reset}`),Ke({ts:new Date().toISOString(),level:"error",message:a,type:"log"})},debug:a=>{console.log(`${j.dim}${a}${j.reset}`),Ke({ts:new Date().toISOString(),level:"debug",message:a,type:"log"})},auth:a=>{console.log(`${j.yellow}[Auth]${j.reset} ${a}`),Ke({ts:new Date().toISOString(),level:"auth",message:a,type:"log"})},anthropic:a=>{console.log(`${j.magenta}[Anthropic]${j.reset} ${a}`),Ke({ts:new Date().toISOString(),level:"anthropic",message:a,type:"log"})},openai:a=>{console.log(`${j.blue}[OpenAI]${j.reset} ${a}`),Ke({ts:new Date().toISOString(),level:"openai",message:a,type:"log"})},request:(a,e,n)=>{let t={GET:j.green,POST:j.blue,PUT:j.yellow,DELETE:j.red,PATCH:j.cyan}[a]||j.white,o=n?` ${j.dim}${n}${j.reset}`:"";console.log(`${t}${j.bright}${a}${j.reset} ${e}${o}`),Ke({ts:new Date().toISOString(),level:"request",type:"request",method:a,path:e,extra:n})},response:(a,e,n)=>{let i=j.green;a>=400?i=j.red:a>=300&&(i=j.yellow);let t=n?` ${j.dim}${n}ms${j.reset}`:"";console.log(`${i}${a}${j.reset} ${e}${t}`),Ke({ts:new Date().toISOString(),level:"response",type:"response",status:a,path:e,duration:n})},blank:()=>console.log(""),raw:(...a)=>console.log(...a)};function Oh(a,e=60){let n=j.cyan+j.bright,i=j.reset,t=[];t.push(`${n}\u2554${"\u2550".repeat(e)}\u2557${i}`);for(let o of a){let r="\\x1B\\[[0-9;]*m",s=o.replace(new RegExp(r,"g"),""),l=e-s.length;l>0?t.push(`${n}\u2551${i}${o}${" ".repeat(l)}${n}\u2551${i}`):t.push(`${n}\u2551${i}${o.substring(0,e)}${n}\u2551${i}`)}return t.push(`${n}\u255A${"\u2550".repeat(e)}\u255D${i}`),t}function ci(a,e,n=14){let i=a.padEnd(n);return` ${j.dim}${i}${j.reset} ${e}`}var Rh=La.join(Dt.homedir(),".oca","oca-proxy-config.json"),zt=La.join(Dt.homedir(),".config","oca","oca-proxy.config.json");function qh(){try{if(ee.existsSync(zt))return JSON.parse(ee.readFileSync(zt,"utf-8"));if(ee.existsSync(Rh))return JSON.parse(ee.readFileSync(Rh,"utf-8"))}catch{}return{}}var vc=qh(),N={client_id:"a8331954c0cf48ba99b5dd223a14c6ea",idcs_url:vc.idcs_url||"https://idcs-9dc693e80d9b469480d7afe00e743931.identity.oraclecloud.com",scopes:"openid offline_access",base_url:vc.base_url||"https://code-internal.aiservice.us-chicago-1.oci.oraclecloud.com/20250206/app/litellm"};var Me=La.join(Dt.homedir(),".oca","refresh_token.json"),fe=parseInt(process.env.PORT||String(vc.port||8669),10);function Nt(){try{let a=qh();return{log_level:a.log_level||"INFO",model_mapping:a.model_mapping||{},default_model:a.default_model,base_url:a.base_url,idcs_url:a.idcs_url,port:a.port}}catch{return{log_level:"INFO",model_mapping:{}}}}function Ph(a){try{let e=La.dirname(zt);return ee.existsSync(e)||ee.mkdirSync(e,{recursive:!0}),ee.writeFileSync(zt,JSON.stringify(a,null,2)),!0}catch(e){return _.error(`Failed to save config: ${String(e)}`),!1}}function Fh(){try{if(ee.existsSync(Me))return JSON.parse(ee.readFileSync(Me,"utf-8")).refresh_token}catch{}return null}function hc(a){let e=La.dirname(Me);ee.existsSync(e)||ee.mkdirSync(e,{recursive:!0});let n={refresh_token:a,created_at:new Date().toISOString()};ee.writeFileSync(Me,JSON.stringify(n,null,2),{mode:384}),_.info(`Refresh token saved to ${Me}`)}function Ih(){try{ee.existsSync(Me)&&ee.unlinkSync(Me)}catch{}}var pi=new Map;function Q3(){return Ba.randomBytes(96).toString("base64url")}function Z3(a){return Ba.createHash("sha256").update(a).digest("base64url")}function Lh(a=32){return Ba.randomBytes(a).toString("base64url").slice(0,a)}function eS(){let a=Date.now()-6e5;for(let[e,n]of pi.entries())n.created_at<a&&pi.delete(e)}function Bh(a){eS();let e=Q3(),n=Z3(e),i=Lh(32),t=Lh(32);pi.set(i,{code_verifier:e,nonce:t,redirect_uri:a,created_at:Date.now()});let o=new URLSearchParams({client_id:N.client_id,response_type:"code",scope:N.scopes,redirect_uri:a,state:i,nonce:t,code_challenge:n,code_challenge_method:"S256"});return`${N.idcs_url}/oauth2/v1/authorize?${o.toString()}`}function zh(a){return pi.get(a)}function Dh(a){pi.delete(a)}async function Nh(a,e,n){let t=(await me.get(`${N.idcs_url}/.well-known/openid-configuration`)).data.token_endpoint,o=new URLSearchParams({grant_type:"authorization_code",code:a,redirect_uri:n,client_id:N.client_id,code_verifier:e}),r=await me.post(t,o,{headers:{"Content-Type":"application/x-www-form-urlencoded"}});return{access_token:r.data.access_token,refresh_token:r.data.refresh_token,expires_in:r.data.expires_in||3600}}var Ut=class{refreshToken=null;accessToken=null;tokenExpiry=null;refreshPromise=null;constructor(){this.refreshToken=Fh(),this.refreshToken?_.info("Refresh token loaded successfully"):_.warn("No refresh token found. Visit /login to authenticate.")}isAuthenticated(){return this.refreshToken!==null}setRefreshToken(e){this.refreshToken=e,this.accessToken=null,this.tokenExpiry=null,hc(e)}clearAuth(){this.refreshToken=null,this.accessToken=null,this.tokenExpiry=null,Ih()}async getToken(){if(!this.refreshToken)throw new Error("Not authenticated. Please visit /login to authenticate with OCA.");if(this.accessToken&&this.tokenExpiry){let e=(this.tokenExpiry.getTime()-Date.now())/1e3;if(e>300)return _.debug(`Using cached access token (expires in ${Math.floor(e)}s)`),this.accessToken||""}if(this.refreshPromise)return _.debug("Waiting for in-flight token refresh..."),this.refreshPromise;this.refreshPromise=this.doRefreshToken();try{return await this.refreshPromise}finally{this.refreshPromise=null}}async doRefreshToken(){_.info("Refreshing access token using refresh token");try{let n=(await me.get(`${N.idcs_url}/.well-known/openid-configuration`)).data.token_endpoint,i=this.refreshToken;if(!i)throw new Error("Not authenticated. Missing refresh token.");let t=new URLSearchParams({grant_type:"refresh_token",refresh_token:i,client_id:N.client_id}),o=await me.post(n,t,{headers:{"Content-Type":"application/x-www-form-urlencoded"}});this.accessToken=o.data.access_token;let r=o.data.expires_in||3600;this.tokenExpiry=new Date(Date.now()+r*1e3);let s=o.data.refresh_token;return s&&s!==this.refreshToken&&(_.info("Received new refresh token, updating saved token"),this.refreshToken=s,hc(this.refreshToken||"")),_.success(`Successfully refreshed access token (expires in ${r}s)`),this.accessToken||""}catch(e){let n=e,i=n.response?.status,t=n.response?.data;_.error(`Failed to refresh access token: ${i} ${JSON.stringify(t)}`);let o=t??{};throw i===400&&(o.error==="invalid_grant"||o.error==="invalid_token")?(_.error("Refresh token is invalid/expired. Clearing authentication."),this.clearAuth(),new Error("Refresh token expired. Please visit /login to re-authenticate.")):new Error(`Failed to refresh OCA access token: ${n.message||"unknown error"}`)}}getTokenExpiry(){return this.tokenExpiry}};function ba(a){return{Authorization:`Bearer ${a}`,"opc-request-id":Ba.randomUUID(),"Content-Type":"application/json"}}function Uh(a,e){a.get("/",async(n,i)=>{let t=e.isAuthenticated(),o=t?"green":"orange",r=t?"Authenticated":"Not Authenticated",s=t?'<a href="/logout" style="color: red;">Logout</a>':'<a href="/login">Login with Oracle Code Assist</a>';i.send(`
63
63
  <html>
64
64
  <head>
65
65
  <title>OCA Proxy</title>
@@ -202,6 +202,7 @@ tell application "System Events" to get value of property list item "CFBundleNam
202
202
 
203
203
  <div id="tab-usage" class="tab-panel" style="display:none">
204
204
  <h2>Usage</h2>
205
+ <p style="margin: 8px 0;"><a href="https://github.com/banzalik/oca-proxy/blob/master/CONFIG.md" target="_blank" rel="noopener noreferrer">Configuration examples (CONFIG.md)</a></p>
205
206
  <div class="endpoint">
206
207
  <strong>With Claude Code (Anthropic format):</strong><br>
207
208
  <code>ANTHROPIC_API_KEY=dummy ANTHROPIC_BASE_URL=http://localhost:${fe} claude</code>
@@ -700,4 +701,4 @@ data: ${JSON.stringify({type:"message_stop"})}
700
701
 
701
702
  Please visit http://localhost:${fe}/login in your browser to authenticate with Oracle Code Assist.
702
703
 
703
- After logging in, retry your request.`}}):e.status(i.response?.status||500).json({error:{type:"api_error",message:i.message||"Unknown error"}})}});K.use((a,e)=>{_.warn(`404 Not Found: ${a.method} ${a.originalUrl}`),e.status(404).json({error:"Not Found"})});var bS=K.listen(fe,async()=>{let a=Ee.isAuthenticated()?"\u2713 Authenticated":"\u2717 Not authenticated",e=[" OCA Proxy Server"," ",ci("OCA Base URL:",N.base_url),ci("IDCS URL:",N.idcs_url),ci("Client ID:",N.client_id),ci("Auth Status:",a)," ",` \u25B6 Server listening on http://localhost:${fe}`," "," Endpoints:",` OpenAI: http://localhost:${fe}/v1`,` Messages: http://localhost:${fe}/v1/messages`],n=Oh(e,58);for(let i of n)_.raw(i);if(Ee.isAuthenticated())_.success("Authenticated - Server ready to use!"),_.info(`Dashboard: http://localhost:${fe}`);else{_.info(`Login: http://localhost:${fe}/login`);try{let i=(await Promise.resolve().then(()=>(Rg(),Og))).default;setTimeout(()=>{i(`http://localhost:${fe}/login`),_.info("Browser opened for authentication")},1500)}catch{}}});bS.on("error",a=>{a.code==="EADDRINUSE"&&(_.error(`Port ${fe} already in use; exiting`),process.exit(1)),_.error(`Server error: ${String(a)}`),process.exit(1)});
704
+ After logging in, retry your request.`}}):e.status(i.response?.status||500).json({error:{type:"api_error",message:i.message||"Unknown error"}})}});K.use((a,e)=>{_.warn(`404 Not Found: ${a.method} ${a.originalUrl}`),e.status(404).json({error:"Not Found"})});var bS=K.listen(fe,async()=>{let a=Ee.isAuthenticated()?"\u2713 Authenticated":"\u2717 Not authenticated",e=[" OCA Proxy Server"," ",ci("OCA Base URL:",N.base_url),ci("IDCS URL:",N.idcs_url),ci("Client ID:",N.client_id),ci("Auth Status:",a)," ",` \u25B6 Server listening on http://localhost:${fe}`," "," Endpoints:",` OpenAI: http://localhost:${fe}/v1`,` Messages: http://localhost:${fe}/v1/messages`],n=Oh(e,58);for(let i of n)_.raw(i);if(Ee.isAuthenticated())_.success("Authenticated - Server ready to use!"),_.info(`Dashboard: http://localhost:${fe}`);else{_.info(`Login: http://localhost:${fe}/login`);try{let i=(await Promise.resolve().then(()=>(Rg(),Og))).default;setTimeout(()=>{let t=`http://localhost:${fe}/login`;Promise.resolve(i(t)).then(()=>{_.info("Browser opened for authentication")}).catch(o=>{let r=o.message??"unknown error";_.warn(`Failed to auto-open browser: ${r}`),_.info(`Please open this URL manually: ${t}`)})},1500)}catch{}}});bS.on("error",a=>{a.code==="EADDRINUSE"&&(_.error(`Port ${fe} already in use; exiting`),process.exit(1)),_.error(`Server error: ${String(a)}`),process.exit(1)});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oca-proxy",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "OpenAI-compatible proxy for Oracle Code Assist (OCA)",
5
5
  "main": "dist/index.js",
6
6
  "bin": {