oca-proxy 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -92
- package/bin/oca-proxy.js +3 -2
- package/package.json +1 -1
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
|
-
|
|
11
|
-
|
|
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
|
|
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
|
-
|
|
21
|
+
### From Source
|
|
24
22
|
|
|
25
23
|
```bash
|
|
26
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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.
|
|
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.
|
|
214
|
-
|
|
215
|
-
```bash
|
|
216
|
-
npm run build
|
|
217
|
-
```
|
|
152
|
+
2. Start the proxy (choose one):
|
|
218
153
|
|
|
219
|
-
|
|
154
|
+
- Global install:
|
|
155
|
+
```bash
|
|
156
|
+
pm2 start oca-proxy --name oca-proxy
|
|
157
|
+
```
|
|
220
158
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
159
|
+
- Using npx (no global install):
|
|
160
|
+
```bash
|
|
161
|
+
pm2 start "npx oca-proxy" --name oca-proxy
|
|
162
|
+
```
|
|
224
163
|
|
|
225
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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>
|