copilot-api-node20 0.44.0-preview.1 → 0.44.0-preview.11
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 +20 -6
- package/dist/main.mjs +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -99,13 +99,13 @@ npx copilot-api-node20@latest start \
|
|
|
99
99
|
Start the proxy with Codex mode:
|
|
100
100
|
|
|
101
101
|
```bash
|
|
102
|
-
npx copilot-api-node20@latest start --codex --model gpt-5.
|
|
102
|
+
npx copilot-api-node20@latest start --codex --model gpt-5.6-sol
|
|
103
103
|
```
|
|
104
104
|
|
|
105
105
|
Configure `~/.codex/config.toml`:
|
|
106
106
|
|
|
107
107
|
```toml
|
|
108
|
-
model = "gpt-5.
|
|
108
|
+
model = "gpt-5.6-sol"
|
|
109
109
|
model_provider = "local"
|
|
110
110
|
|
|
111
111
|
[model_providers.local]
|
|
@@ -186,7 +186,7 @@ Point the proxy at your own Azure resource instead of GitHub Copilot. No GitHub
|
|
|
186
186
|
|
|
187
187
|
```bash
|
|
188
188
|
export FOUNDRY_ENDPOINT=https://<resource>.openai.azure.com
|
|
189
|
-
export FOUNDRY_API_KEY=<key>
|
|
189
|
+
export FOUNDRY_API_KEY=<key> # or omit it and `az login` for Entra ID
|
|
190
190
|
npx copilot-api-node20@latest start --provider foundry
|
|
191
191
|
```
|
|
192
192
|
|
|
@@ -206,6 +206,8 @@ The model you ask for is the model you get: the proxy never renames or substitut
|
|
|
206
206
|
| OpenAI (`gpt-*`, `o*`, codex) | `/openai/v1/responses` (translated for Claude Code) |
|
|
207
207
|
| Others (DeepSeek, Grok, …) | `/openai/v1/chat/completions` |
|
|
208
208
|
|
|
209
|
+
Hitting Foundry's tokens-per-minute limit? Add `--fallback copilot` and a request Foundry rate-limits (429) is served by your GitHub Copilot subscription instead, until Foundry's `retry-after` passes. See [Copilot fallback](./docs/foundry.md#copilot-fallback-on-rate-limits).
|
|
210
|
+
|
|
209
211
|
Codex works with the usual `config.toml` (see [Codex CLI](#codex-cli)) with `model` set to a deployment name. See **[docs/foundry.md](./docs/foundry.md)** for configuration, routing details, reasoning effort, and troubleshooting (including `NODE_EXTRA_CA_CERTS` behind TLS-inspecting corporate proxies).
|
|
210
212
|
|
|
211
213
|
### First run & troubleshooting
|
|
@@ -248,15 +250,22 @@ curl http://localhost:4141/v1/chat/completions \
|
|
|
248
250
|
|
|
249
251
|
All endpoints are served at `http://localhost:4141` by default (`https://` when `--https` or `--claude-cowork` is used). The server binds to `127.0.0.1` (localhost only) by default. To expose to LAN/network/Docker, pass `--hostname 0.0.0.0`.
|
|
250
252
|
|
|
251
|
-
| Method | Path |
|
|
253
|
+
| Method | Path | Purpose |
|
|
252
254
|
|:--|:--|:--|
|
|
255
|
+
| `GET` | `/` | Basic server-running response |
|
|
256
|
+
| `GET` | `/health` | Proxy, token, and upstream health status |
|
|
253
257
|
| `POST` | `/v1/chat/completions` | OpenAI Chat Completions |
|
|
258
|
+
| `POST` | `/chat/completions` | OpenAI Chat Completions without the `/v1` prefix |
|
|
254
259
|
| `POST` | `/v1/responses` | OpenAI Responses API |
|
|
260
|
+
| `POST` | `/responses` | OpenAI Responses API without the `/v1` prefix |
|
|
255
261
|
| `POST` | `/v1/messages` | Anthropic Messages |
|
|
256
262
|
| `POST` | `/v1/messages/count_tokens` | Anthropic Token Counting |
|
|
257
263
|
| `POST` | `/v1/embeddings` | OpenAI Embeddings |
|
|
264
|
+
| `POST` | `/embeddings` | OpenAI Embeddings without the `/v1` prefix |
|
|
258
265
|
| `GET` | `/v1/models` | OpenAI Models |
|
|
259
|
-
|
|
266
|
+
| `GET` | `/models` | OpenAI Models without the `/v1` prefix |
|
|
267
|
+
| `GET` | `/usage` | GitHub Copilot usage and quota information |
|
|
268
|
+
| `GET` | `/token` | Copilot token debug endpoint; disabled unless started with `--show-token` |
|
|
260
269
|
|
|
261
270
|
---
|
|
262
271
|
|
|
@@ -285,18 +294,23 @@ All OpenAI-compatible routes are also available without the `/v1/` prefix.
|
|
|
285
294
|
|
|
286
295
|
| Flag | Alias | Default | Description |
|
|
287
296
|
|:--|:--|:--|:--|
|
|
288
|
-
| `--provider` | | `copilot` | Upstream: `copilot`, or `foundry` for Microsoft Foundry / Azure OpenAI (reads `FOUNDRY_ENDPOINT
|
|
297
|
+
| `--provider` | | `copilot` | Upstream: `copilot`, or `foundry` for Microsoft Foundry / Azure OpenAI (reads `FOUNDRY_ENDPOINT`, plus `FOUNDRY_API_KEY` or an Entra ID login; see [docs/foundry.md](./docs/foundry.md)). Also `COPILOT_API_PROVIDER` |
|
|
298
|
+
| `--fallback` | | | With `--provider foundry`: `copilot` re-sends a Foundry 429 to GitHub Copilot and keeps that model there until Foundry's `retry-after` passes (see [docs/foundry.md](./docs/foundry.md#copilot-fallback-on-rate-limits)). Also `COPILOT_API_FALLBACK` |
|
|
289
299
|
| `--port` | `-p` | `4141` | Port to listen on |
|
|
290
300
|
| `--hostname` | `-H` | `127.0.0.1` | Hostname/IP to bind to. Use `0.0.0.0` for LAN/Docker exposure |
|
|
291
301
|
| `--claude-code` | `-c` | | Enable Claude Code compatibility mode |
|
|
292
302
|
| `--codex` | | | Enable Codex CLI compatibility mode |
|
|
293
303
|
| `--model` | `-m` | | Primary model to use |
|
|
294
304
|
| `--small-model` | `-s` | | Lightweight model for fast tasks (Claude Code) |
|
|
305
|
+
| `--manual` | | `false` | Require manual approval before forwarding requests |
|
|
295
306
|
| `--rate-limit` | `-r` | | Minimum seconds between requests |
|
|
307
|
+
| `--wait` | `-w` | `false` | Wait instead of returning an error when the configured rate limit is hit |
|
|
296
308
|
| `--timeout` | `-t` | `600000` | Request timeout in ms (default 10 min) |
|
|
309
|
+
| `--connect-timeout` | | `15000` | Connectivity probe timeout in ms; overrides `COPILOT_CONNECT_TIMEOUT_MS` |
|
|
297
310
|
| `--account-type` | `-a` | `individual` | `individual`, `business`, or `enterprise` |
|
|
298
311
|
| `--github-token` | `-g` | | Provide a GitHub token directly (skips OAuth) |
|
|
299
312
|
| `--show-token` | | | Display tokens on fetch and refresh, and enable the local `/token` debug endpoint |
|
|
313
|
+
| `--error-reporting` | | `true` | Send sanitized server-error reports. Disable with `--no-error-reporting` or `COPILOT_API_ERROR_REPORTING=0` |
|
|
300
314
|
| `--smoke-test` | | `true` | Run one self-test generation after startup and print PASS/FAIL. Disable with `--no-smoke-test` or `COPILOT_API_NO_SMOKE_TEST=1` |
|
|
301
315
|
| `--tavily-api-key` | | | **Deprecated** — prefer `TAVILY_API_KEY` env var. Tavily API key for web search |
|
|
302
316
|
| `--web-search-provider` | | | Web search providers in primary→fallback order, e.g. `exa,tavily` (keys via `TAVILY_API_KEY` / `EXA_API_KEY`) |
|
package/dist/main.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{defineCommand as e,runMain as t}from"citty";import o,{LogLevels as n,consola as r}from"consola";import a from"node:fs/promises";import i from"node:os";import s from"node:path";import{SpanKind as l,SpanStatusCode as c,context as u,metrics as p,trace as d}from"@opentelemetry/api";import m from"clipboardy";import{execFile as f,execSync as h}from"node:child_process";import g from"node:process";import{SeverityNumber as _,logs as y}from"@opentelemetry/api-logs";import{OTLPLogExporter as w}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as k}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as b}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as v}from"@opentelemetry/resources";import{BatchLogRecordProcessor as x}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as T}from"@opentelemetry/sdk-metrics";import{NodeSDK as $}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as A,ATTR_SERVICE_NAME as S,ATTR_SERVICE_VERSION as E}from"@opentelemetry/semantic-conventions";import{Client as O,request as C}from"undici";import{createHash as I,randomBytes as P,randomUUID as R}from"node:crypto";import{promisify as N}from"node:util";import{Hono as q}from"hono";import{cors as D}from"hono/cors";import{streamSSE as j}from"hono/streaming";import{events as M}from"fetch-event-stream";import{Tokenizer as F,models as H}from"ai-tokenizer";import*as U from"ai-tokenizer/encoding/claude";import B,{accessSync as L}from"node:fs";import{serve as z}from"srvx";import{isIP as G}from"node:net";import{generate as K}from"selfsigned";const J=s.join(i.homedir(),".local","share","copilot-api"),W={APP_DIR:J,GITHUB_TOKEN_PATH:s.join(J,"github_token"),MACHINE_ID_PATH:s.join(J,"machine_id"),SESSION_ID_PATH:s.join(J,"session_id")};async function Y(){await a.mkdir(W.APP_DIR,{recursive:!0}),await V(W.GITHUB_TOKEN_PATH),await V(W.SESSION_ID_PATH)}async function V(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,""),await a.chmod(e,384)}}const X=6e5,Z={provider:"copilot",accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:X,webSearchProviders:[],errorReporting:!0,connectivity:{probeEndpoints:["https://api.github.com","https://www.google.com","https://1.1.1.1"],fastProbeInterval:5e3,slowProbeInterval:1e4,timeoutMs:15e3,jitterMaxMs:1e3,connectionPooling:!0,dnsCache:!0,h2:!1,h2Keepalive:!1}},Q=" │ ",ee=e=>{if(e>=1e6){let t=e/1e6;return Number.isInteger(t)?`${t}M`:`${t.toFixed(1)}M`}return e>=1e4?`${Math.round(e/1e3)}K`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toString()},te=(e,t)=>e.padEnd(t),oe=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),ne=(e,t,o)=>` --\x3e ${te(e,4)} ${te(t,21)} ${te(o,3)}`,re=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return te(t,22)})(e.model??"—")+te(t,8)},ae=e=>{let t=e?.inputTokens??0,o=e?.cachedTokens??0,n=e?ee(Math.max(t-o,0)):"—",r=e?ee(e.outputTokens??0):"—",a=o?ee(o):"—";return`↑${n.padStart(5)} ⚡${a.padStart(5)} ↓${r.padStart(5)}`},ie=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${te("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=ee(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},se=e=>{if(void 0===e.ttfbMs)return`e2e ${oe(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${oe(e.ttfbMs)} → e2e ${oe(e.e2eMs)} ${t}`},le=e=>e?Z.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,ce=e=>({...e?.inputTokens&&{"copilot_api.input_tokens":e.inputTokens},...e?.inputTokens&&{"copilot_api.fresh_input_tokens":Math.max(e.inputTokens-(e.cachedTokens??0),0)},...e?.outputTokens&&{"copilot_api.output_tokens":e.outputTokens},...e?.cachedTokens&&{"copilot_api.cached_tokens":e.cachedTokens}}),ue={completionCallbacks:new Map,registerCompletion(e,t,o){this.completionCallbacks.set(e,{context:t,startTime:o,requestId:e})},executeCompletion(e){let t=this.completionCallbacks.get(e);t&&(this.logCompletion(t),this.completionCallbacks.delete(e))},logCompletion(e){let{context:t,startTime:n}=e,r=Math.round(performance.now()-n),a=t.get("requestData"),i=a?.upstreamTotalMs??a?._d1,s=(e=>[ne(e.method,e.path,e.status),re(e),ae(e.tokenUsage),ie(e.tokenUsage,e.maxContextTokens),se({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(Q))({method:t.req.method,path:t.req.path,status:t.res.status.toString(),model:a?.model,reasoningEffort:a?.reasoningEffort,effortClamped:a?.effortClamped,tokenUsage:a?.tokenUsage,maxContextTokens:le(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),We(_.INFO,"INFO","Request completed",(e=>{let{c:t,requestData:o,duration:n,upstreamTotal:r}=e;return{"http.method":t.req.method,"http.path":t.req.path,"http.status_code":t.res.status,"copilot_api.duration_ms":n,...o?.model&&{"copilot_api.model":o.model},...o?.reasoningEffort&&{"copilot_api.reasoning_effort":o.reasoningEffort},...o?.effortClamped&&{"copilot_api.effort_clamped":!0},...void 0!==o?.upstreamTtfbMs&&{"copilot_api.upstream_ttfb_ms":Math.round(o.upstreamTtfbMs)},...void 0!==r&&{"copilot_api.upstream_total_ms":Math.round(r),"copilot_api.copilot_duration_ms":Math.round(r)},...ce(o?.tokenUsage)}})({c:t,requestData:a,duration:r,upstreamTotal:i}),t.get("requestTraceContext"))},logRateLimit(e,t){let{context:n,startTime:r}=e,a=Math.round(performance.now()-r),i=(t.headers.get("x-ratelimit-exceeded")||"").split(":")[1]||"unknown",s=t.headers.get("retry-after")||t.headers.get("x-ratelimit-user-retry-after")||"?",l=n.get("requestData");o.warn((e=>[ne(e.method,e.path,"429"),re(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${oe(e.e2eMs)}`].join(Q))({method:n.req.method,path:n.req.path,model:l?.model,reasoningEffort:l?.reasoningEffort,effortClamped:l?.effortClamped,retry:s,rateLimitType:i,e2eMs:a}))},logError(e,t,n){let{context:r,startTime:a}=e,i=Math.round(performance.now()-a),s=r.get("requestData");o.error((e=>{let t=ne(e.method,e.path,e.status.toString()),o=re(e),n=e.message.replaceAll(/\s+/g," ").trim();return[t,o,(n.length>37?`${n.slice(0,36)}…`:n).padEnd(37),`e2e ${oe(e.e2eMs)}`].join(Q)})({method:r.req.method,path:r.req.path,status:t,model:s?.model,reasoningEffort:s?.reasoningEffort,effortClamped:s?.effortClamped,message:n,e2eMs:i}))},cleanup(){let e=performance.now()-12e5;for(let[t,o]of this.completionCallbacks)o.startTime<e&&this.completionCallbacks.delete(t);if(this.completionCallbacks.size>1e3){let e=Array.from(this.completionCallbacks.entries()).sort(([,e],[,t])=>e.startTime-t.startTime),t=e.slice(0,e.length-1e3);for(let[e]of t)this.completionCallbacks.delete(e)}}};setInterval(()=>ue.cleanup(),6e4);let pe,de,me=Date.now();const fe={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function he(){let e=process.env.OTEL_EXPORTER_OTLP_ENDPOINT??"https://api.honeycomb.io",t=process.env.OTEL_EXPORTER_OTLP_HEADERS?function(e){return e?Object.fromEntries(e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let t=e.indexOf("=");return-1===t?[e,""]:[decodeURIComponent(e.slice(0,t)),decodeURIComponent(e.slice(t+1))]})):{}}(process.env.OTEL_EXPORTER_OTLP_HEADERS):fe;return{endpoint:e.replace(/\/$/,""),headers:t}}const ge=d.getTracer("copilot-api"),_e=p.getMeter("copilot-api"),ye=y.getLogger("copilot-api"),we=_e.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),ke=_e.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),be=_e.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),ve=_e.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),xe=_e.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),Te=_e.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),$e=_e.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),Ae=_e.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Se=_e.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),Ee=_e.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),Oe=_e.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),Ce=_e.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Ie=_e.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Pe=_e.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),Re=_e.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Ne=_e.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),qe=_e.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),De=_e.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),je=_e.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),Me=_e.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),Fe=_e.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),He=_e.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Ue=_e.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),Be=_e.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Le=_e.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),ze=_e.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),Ge=_e.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),Ke=_e.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),Je=_e.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function We(e,t,o,n,r){let a=d.getActiveSpan()?.spanContext()??r;ye.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function Ye(e,t,o){let n=t instanceof Error?t:Error(String(t));e.setStatus({code:c.ERROR,message:o??n.message}),e.recordException(n)}function Ve(e,t,o){Ye(e,o),t&&t!==e&&Ye(t,o)}function Xe(e,t=""){let o={};if(null==e)return o;if("object"!=typeof e)return("string"==typeof e||"number"==typeof e||"boolean"==typeof e)&&t&&(o[t]=e),o;if(Array.isArray(e))return t&&(o[t]=JSON.stringify(e)),o;for(let[n,r]of Object.entries(e)){let e=t?`${t}.${n}`:n;void 0!==r&&"function"!=typeof r&&(null===r?o[e]="null":"object"!=typeof r||Array.isArray(r)?Array.isArray(r)?o[e]=JSON.stringify(r):("string"==typeof r||"number"==typeof r||"boolean"==typeof r)&&(o[e]=r):Object.assign(o,Xe(r,e)))}return o}_e.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!ot.getConnectivityStats().isOnline)}),_e.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(ot.getConnectivityStats().consecutiveFailures)}),_e.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(Z.models?.data.length??0)}),_e.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(ue.completionCallbacks.size)}),_e.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-me)/1e3)});const Ze=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","api-key","proxy-authorization"]);function Qe(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();Ze.has(o)||e.setAttribute(`http.${t}.header.${o}`,r)}}async function et(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:u}=e,p=ge.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...u}});a&&Qe(p,"request",a);try{let e=await fetch(o,{method:r,headers:a,body:i,signal:s});return p.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,o)=>{let n=o.toLowerCase();Ze.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(p,e),Ie.add(1,{target:n,status_code:String(e.status)}),e.ok||p.setStatus({code:c.ERROR,message:`HTTP ${e.status}`}),{response:e,span:p}}catch(e){throw Ye(p,e),p.end(),e}}async function tt(e){let{spanName:t,url:o,target:n,method:r="POST",headers:a,body:i,signal:s,headersTimeout:u,bodyTimeout:p,extraAttributes:d,dispatcher:m}=e,f=ge.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});Qe(f,"request",a);try{let{statusCode:e,headers:t,body:l}=await C(o,{method:r,headers:a,body:i,signal:s,headersTimeout:u,bodyTimeout:p,dispatcher:m});f.setAttribute("http.response.status_code",e);for(let[e,o]of Object.entries(t)){let t=e.toLowerCase();void 0!==o&&!Ze.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return Ie.add(1,{target:n,status_code:String(e)}),e>=400&&f.setStatus({code:c.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:l,span:f}}catch(e){throw Ye(f,e),f.end(),e}}const ot=new class extends EventTarget{isOnline=!0;lastChecked=(new Date).toISOString();consecutiveFailures=0;lastErrorType;lastErrorMessage;lastSuccessfulEndpoint;endpointFailureStats={};checkInterval;abortController;on(e,t){return this.addEventListener(e,t),this}off(e,t){return this.removeEventListener(e,t),this}start(){o.debug("Starting connectivity monitor",{probeEndpoints:Z.connectivity.probeEndpoints,fastInterval:Z.connectivity.fastProbeInterval}),this.scheduleNextCheck()}stop(){o.debug("Stopping connectivity monitor"),this.checkInterval&&=void clearTimeout(this.checkInterval),this.abortController&&=void this.abortController.abort()}scheduleNextCheck(){this.checkInterval&&clearTimeout(this.checkInterval);let e=(this.isOnline?Z.connectivity.slowProbeInterval:Z.connectivity.fastProbeInterval)+Math.random()*Z.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=ge.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),Z.connectivity.timeoutMs);try{let n=!1;for(let e of Z.connectivity.probeEndpoints)try{let t=performance.now(),o=await fetch(e,{method:"HEAD",signal:this.abortController.signal,headers:{"User-Agent":"copilot-api-connectivity-monitor/1.0",...Z.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Le.record(r,{endpoint:e,result:"success"});break}Le.record(r,{endpoint:e,result:"failed"})}catch(t){this.endpointFailureStats[e]=(this.endpointFailureStats[e]||0)+1,o.debug(`Probe failed for ${e}:`,t)}this.updateConnectivityState(n);let r=n?"online":"offline";e.setAttribute("copilot_api.connectivity.result",r),e.setAttribute("copilot_api.connectivity.consecutive_failures",this.consecutiveFailures),this.lastSuccessfulEndpoint&&e.setAttribute("copilot_api.connectivity.successful_endpoint",this.lastSuccessfulEndpoint),Oe.add(1,{result:n?"online":"offline"})}catch(e){this.handleConnectivityError(e)}finally{clearTimeout(t),e.end(),this.scheduleNextCheck()}}updateConnectivityState(e){let t=this.isOnline;if(this.isOnline=e,this.lastChecked=(new Date).toISOString(),e){let e=this.consecutiveFailures;this.consecutiveFailures>0&&o.info(`Connectivity restored after ${this.consecutiveFailures} failures`),this.consecutiveFailures=0,this.lastErrorType=void 0,this.lastErrorMessage=void 0,t||(this.dispatchEvent(new CustomEvent("online")),Ce.add(1,{from:"offline",to:"online"}),We(_.INFO,"INFO","Connectivity restored",{"copilot_api.connectivity.consecutive_failures_before_recovery":e}))}else this.consecutiveFailures++,t&&(o.warn("Connectivity lost"),this.dispatchEvent(new CustomEvent("offline")),Ce.add(1,{from:"online",to:"offline"}),We(_.WARN,"WARN","Connectivity lost",{"copilot_api.connectivity.consecutive_failures":this.consecutiveFailures}))}handleConnectivityError(e){this.lastErrorType=e.name,this.lastErrorMessage=e.message,o.error("Connectivity check failed:",e),this.updateConnectivityState(!1)}getConnectivityStats(){return{isOnline:this.isOnline,lastChecked:this.lastChecked,consecutiveFailures:this.consecutiveFailures,lastErrorType:this.lastErrorType,lastErrorMessage:this.lastErrorMessage}}getPerformanceStats(){let e=this.isOnline?Z.connectivity.slowProbeInterval:Z.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*Z.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:Z.connectivity.jitterMaxMs>0,connectionPooling:Z.connectivity.connectionPooling,dnsCache:Z.connectivity.dnsCache}}},nt=()=>({"content-type":"application/json",accept:"application/json"}),rt="0.48.1",at=`copilot-chat/${rt}`,it=`GitHubCopilotChat/${rt}`,st=async e=>{let t=(e=>{let t=e.replaceAll(/[^\w.-]/g,"_").trim();if(0===t.length||"."===t||".."===t||/^[_.]+$/.test(t))throw Error("Invalid GitHub username: cannot be empty or consist only of special characters after sanitization");return`${W.MACHINE_ID_PATH}_${t}`})(e);try{let e=await a.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let o=(e=>{let t=I("sha256");return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||"anonymous"),t.update(i.hostname()),t.update(e),t.update(Date.now().toString()),t.update(P(16)),t.digest("hex")})(e);return await a.writeFile(t,o),await a.chmod(t,384),o},lt=async(e,t)=>{e.machineId||=await st(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(W.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=R();return await a.writeFile(W.SESSION_ID_PATH,e),await a.chmod(W.SESSION_ID_PATH,384),e})()},ct=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,ut=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=R(),n={Authorization:`Bearer ${e._t1}`,"Content-Type":"application/json",accept:"*/*","accept-encoding":"br, gzip, deflate","accept-language":"*","sec-fetch-mode":"cors","Copilot-Integration-Id":"vscode-chat","Editor-Version":`vscode/${e._v1}`,"Editor-Plugin-Version":at,"User-Agent":it,"VScode-MachineId":e.machineId,"VScode-SessionId":e.sessionId,"OpenAI-Intent":"conversation-agent","X-Interaction-Type":"conversation-agent","X-Agent-Task-Id":o,"X-VSCode-User-Agent-Library-Version":"node-fetch","X-GitHub-Api-Version":"2025-05-01","X-Interaction-Id":R(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},pt=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const dt=(e,t,o)=>{let n=ut(e);delete n["Copilot-Integration-Id"],n["anthropic-version"]=t?.anthropicVersion??"2023-06-01";let r=new Set,a=t?.anthropicBeta?function(e){let t=e.split(",").map(e=>e.trim()).filter(e=>e&&pt.some(t=>e.startsWith(`${t}-`)));return t.length>0?t.join(","):void 0}(t.anthropicBeta):void 0;if(a)for(let e of a.split(","))r.add(e);if(o)for(let e of o)r.add(e);return r.size>0&&(n["anthropic-beta"]=[...r].join(",")),n},mt="https://api.github.com",ft=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":at,"user-agent":it,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),ht="https://github.com",gt="01ab8ac9400c4e429b23",_t=["user:email"].join(" ");function yt(e){return e.includes("/messages")?"anthropic":e.includes("/chat/completions")?"openai":e.includes("/embeddings")?"embeddings":e.includes("/responses")?"responses":e.includes("/models")?"models":e.includes("/usage")?"usage":e.includes("/token")?"token":"unknown"}const wt=32768,kt=[{regex:/Bearer\s+[\w.-]{20,}/g,mask:"Bearer ***"},{regex:/\bghu_[A-Za-z0-9]{20,}/g,mask:"ghu_***"},{regex:/\bghp_[A-Za-z0-9]{20,}/g,mask:"ghp_***"},{regex:/\bgho_[A-Za-z0-9]{20,}/g,mask:"gho_***"},{regex:/\bghs_[A-Za-z0-9]{20,}/g,mask:"ghs_***"},{regex:/\bghr_[A-Za-z0-9]{20,}/g,mask:"ghr_***"},{regex:/\bsk-[A-Za-z0-9-]{20,}/g,mask:"sk-***"},{regex:/\bhcaik_[A-Za-z0-9]{20,}/g,mask:"hcaik_***"},{regex:/\bapi-key["']?\s*[:=]\s*["']?[\w-]{20,}/gi,mask:"api-key: ***"}],bt=new Set(["authorization","cookie","set-cookie","x-api-key","api-key","proxy-authorization"]);function vt(e){let t=e;for(let{regex:e,mask:o}of kt)t=t.replace(e,o);return t}const xt=new Map;function Tt(e){let t=function(e=new Date){return e.toISOString().slice(0,10)}(e.now),o=e.upstreamErrorType??"unknown",n=(e.model??"unknown").slice(0,100);return`${e.endpointType}:${e.statusCode}:${o}:${n}:${t}`}function $t(e,t,o){let n=vt(o),r=8*wt,a=n.length>r,i=a?n.slice(0,r):n,s=I("sha256").update(n).digest("hex");if(i.length<=wt)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=wt)e.setAttribute(`${t}.part_${o/wt}`,i.slice(o,o+wt));e.setAttribute(`${t}.parts`,Math.ceil(i.length/wt))}e.setAttribute(`${t}.bytes`,n.length),e.setAttribute(`${t}.sha256`,s),a&&(e.setAttribute(`${t}.truncated`,!0),e.setAttribute(`${t}.dropped_bytes`,n.length-i.length))}function At(e,t){let o=function(e){if(xt.size>=1e3&&!xt.has(e)){let e=xt.keys().next().value;void 0!==e&&xt.delete(e)}let t,o=(xt.get(e)??0)+1;return xt.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",De.add(1,{decision:t}),t}(t.signatureKey);if(e.setAttribute("copilot_api.error_capture.decision",o),e.setAttribute("copilot_api.error_capture.signature_key",t.signatureKey),"drop"===o)return{decision:o};if("suppressed"===o)return e.setAttribute("copilot_api.error_capture.suppressed_today",!0),{decision:o};let n=t.c.get("rawBody");n&&$t(e,"copilot_api.incoming_request_body",n);let r=St(t.c.req.header());return r&&$t(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&$t(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&$t(e,"copilot_api.outgoing_headers",St(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&$t(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function St(e){let t={};for(let[o,n]of Object.entries(e))bt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}async function Et(){try{let e=new URL("../package.json",import.meta.url).pathname,t=await a.readFile(e);return JSON.parse(t.toString()).version}catch{return"unknown"}}function Ot(){let e=typeof Bun<"u";return{name:e?"bun":"node",version:e?Bun.version:process.version.slice(1),platform:i.platform(),arch:i.arch()}}async function Ct(){try{return!!(await a.stat(W.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(W.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function It(e){let t=await async function(){let[e,t]=await Promise.all([Et(),Ct()]);return{version:e,runtime:Ot(),paths:{APP_DIR:W.APP_DIR,GITHUB_TOKEN_PATH:W.GITHUB_TOKEN_PATH},tokenExists:t}}();e.json?function(e){console.log(JSON.stringify(e,null,2))}(t):function(e){o.info(`service debug\n\nVersion: ${e.version}\nRuntime: ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform} ${e.runtime.arch})\n\nPaths:\n- APP_DIR: ${e.paths.APP_DIR}\n- GITHUB_TOKEN_PATH: ${e.paths.GITHUB_TOKEN_PATH}\n\nToken exists: ${e.tokenExists?"Yes":"No"}`)}(t)}const Pt=e({meta:{name:"debug",description:"Print debug information about the application"},args:{json:{type:"boolean",default:!1,description:"Output debug information as JSON"}},run:({args:e})=>It({json:e.json})}),Rt=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",Nt=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",qt=new Set;let Dt;function jt(e){if(Z.errorReporting&&!(e.statusCode<500)&&!qt.has(e.signature)){if(qt.size>=1e3){let e=qt.values().next().value;void 0!==e&&qt.delete(e)}qt.add(e.signature),async function(e){Dt??=Et();let t=await Dt,o=Ot(),n=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(vt(e.upstreamErrorMessage)).slice(0,600),r={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:n,endpointType:yt(e.route),route:e.route,model:e.model?.slice(0,100),platform:`${o.platform}/${o.arch}`,runtime:`${o.name}/${o.version}`,timestamp:(new Date).toISOString()},a=new AbortController,i=setTimeout(()=>a.abort(),4e3);try{await fetch(Rt,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":Nt},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}function Mt(e){return function(e){if(!(e instanceof Error))return!1;let t=e.code;return(!t||"UND_ERR_SOCKET"===t)&&/GOAWAY/i.test(e.message)}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"ECONNRESET"===t||(!t||"UND_ERR_SOCKET"===t)&&(/ECONNRESET/i.test(e.message)||/other side closed/i.test(e.message))}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"UND_ERR_DESTROYED"===t||"UND_ERR_CLOSED"===t}(e)||function(e){return e instanceof Error&&"UND_ERR_CONNECT_TIMEOUT"===e.code}(e)}const Ft=new WeakSet;async function Ht(e,{attempt:t,maxRetries:n,operation:r}){return Mt(e)&&t<n?(o.warn(`HTTP/2 connection error during ${r}, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await async function(){return new Promise(e=>setTimeout(e,100))}(),!0):(t>0&&function(e){"object"==typeof e&&e&&Ft.add(e)}(e),!1)}var Ut=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},Bt=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function Lt(e,t){return setTimeout(()=>e.abort(new Bt(t)),t)}const zt=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),Gt=RegExp(`\\b(?:${[...zt].join("|")})\\b`);function Kt(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function Jt(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=Kt(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function Wt(e){let t=e.code;return"string"==typeof t?t:void 0}function Yt(e){if(void 0===e.cause)return"";let t=Jt(e);if(t===e)return"";let o=Wt(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function Vt(e){if(!(e instanceof Error))return!1;let{codes:t,messages:o}=function(e){let t=[],o=[],n=new Set,r=(e,a)=>{if(a>4||!(e instanceof Error)||n.has(e))return;n.add(e);let{code:i,errors:s,cause:l}=e;if("string"==typeof i&&t.push(i),o.push(e.message),Array.isArray(s))for(let e of s)r(e,a+1);r(l,a+1)};return r(e,0),{codes:t,messages:o}}(e);return!!t.some(e=>zt.has(e))||!(t.length>0)&&(!!o.some(e=>Gt.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function Xt(e){return e.req.path.startsWith("/v1/messages")}function Zt(e,t){if(Xt(t)){try{let t=JSON.parse(e);if("message"in t&&"string"==typeof t.message&&!("error"in t))return{type:"error",error:{type:"invalid_request_error",message:t.message}};if("error"in t&&"object"==typeof t.error){let e=t.error;return{type:"error",error:{type:"string"==typeof e.type&&e.type||"string"==typeof e.code&&e.code||"api_error",message:"string"==typeof e.message&&e.message||"Unknown error"}}}}catch{}return{type:"error",error:{type:"api_error",message:e}}}try{return JSON.parse(e)}catch{return{error:{message:e,type:"error"}}}}function Qt(e){let t=e.error,o={};return t&&"object"==typeof t&&("string"==typeof t.type?o.type=t.type:"string"==typeof t.code&&(o.type=t.code),"string"==typeof t.message&&(o.message=t.message)),!o.message&&"string"==typeof e.message&&(o.message=e.message),o}function eo(e,t){e&&(t.type&&e.setAttribute("copilot_api.upstream.error_type",t.type),t.message&&e.setAttribute("copilot_api.upstream.error_message",t.message))}function to(e){let t={};return e.type&&(t["copilot_api.upstream.error_type"]=e.type),e.message&&(t["copilot_api.upstream.error_message"]=e.message),t}function oo(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=d.getActiveSpan();if(!a)return;let i=Tt({endpointType:yt(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});At(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function no(e,t,o){let n=e.get("requestId"),r=ue.completionCallbacks.get(n);r&&(ue.logError(r,t,o),ue.completionCallbacks.delete(n))}function ro(e,t){(function(e){return"object"==typeof e&&!!e&&Ft.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",Z.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function ao(e){return Vt(e)||function(e){return Mt(e)||e instanceof Error&&Mt(e.cause)}(e)}async function io(e,t){if(ro(d.getActiveSpan(),t),t instanceof Ut&&429===t.response.status)return async function(e,t){let o=d.getActiveSpan(),n=e.get("requestId"),r=ue.completionCallbacks.get(n);r&&(ue.logRateLimit(r,t.response),ue.completionCallbacks.delete(n)),Te.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=Zt(a,e),s=Qt(i);return o?.setStatus({code:c.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),eo(o,s),We(_.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...to(s)}),oo({c:e,error:t,errorText:a,upstream:s}),e.json(i,429)}(e,t);if(t instanceof SyntaxError){d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),We(_.WARN,"WARN",`Invalid JSON in request body: ${t.message}`,{"copilot_api.status_code":400,"http.path":e.req.path,"copilot_api.error_type":"invalid_json_body"});let o=Xt(e)?{type:"error",error:{type:"invalid_request_error",message:"Invalid JSON in request body"}}:{error:{message:"Invalid JSON in request body",type:"invalid_request_error"}};return no(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof Ut)return async function(e,t){let o=d.getActiveSpan(),n=await t.response.text(),r=Zt(n,e),a=Qt(r);return no(e,t.response.status,a.message??t.message),o?.setStatus({code:c.ERROR,message:t.message}),o?.recordException(t),o?.setAttribute("copilot_api.error_type","HTTPError"),eo(o,a),We(_.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...to(a)}),oo({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&jt({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:Tt({endpointType:yt(e.req.path),statusCode:t.response.status,upstreamErrorType:a.type,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:a.type,upstreamErrorMessage:a.message}),e.json(r,t.response.status)}(e,t);if(function(e){return e instanceof Bt||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof Bt}(t))return function(e,t){let o=d.getActiveSpan();o?.setStatus({code:c.ERROR,message:"Upstream request timed out"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","request_timeout");let n="Upstream request timed out (gateway timeout). Increase the timeout or retry.";We(_.ERROR,"ERROR",n,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let r=Xt(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return no(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(ao(t))return function(e,t){let o=d.getActiveSpan();o?.setStatus({code:c.ERROR,message:"Transient upstream connection failure"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","transient_transport");let n=t instanceof Error?Jt(t):void 0,r=(n&&Wt(n))??"none",a=n?.message??String(t);o?.setAttribute("copilot_api.transport_cause_code",r),o?.setAttribute("copilot_api.transport_cause_message",a);let i="Temporary upstream connection failure. Please retry.";We(_.WARN,"WARN",i,{"copilot_api.status_code":503,"http.path":e.req.path,"copilot_api.error_type":"transient_transport","copilot_api.transport_cause_code":r,"copilot_api.transport_cause_message":a}),e.header("Retry-After","1");let s=Xt(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return no(e,503,t instanceof Error?`${t.message}${Yt(t)}`:i),e.json(s,503)}(e,t);let n=d.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:c.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),We(_.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),jt({route:e.req.path,statusCode:500,errorClass:r.name,signature:Tt({endpointType:yt(e.req.path),statusCode:500,upstreamErrorType:r.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:r.name,upstreamErrorMessage:`${r.message}${Yt(r)}`}),no(e,500,r.message),o.error(r);let a=Xt(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}const so=async()=>{let e=`${mt}/copilot_internal/v2/token`,t=Z.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await et({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:ft(Z),signal:o.signal});try{if(!t.ok)throw new Ut("Failed to get Service token",t);return await t.json()}catch(e){throw Ye(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function lo(){let e=`${mt}/user`,t=Z.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await et({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${Z.githubToken}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new Ut("Failed to get GitHub user",t);return await t.json()}catch(e){throw Ye(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let co=null;function uo(){return"foundry"===Z.provider?Promise.resolve():(co||=so().then(({token:e})=>{Z.copilotToken=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{co=null}),co)}function po(e,t="FOUNDRY_ENDPOINT"){let o,n=e.trim();try{o=new URL(n)}catch{throw Error(`${t} is not a valid URL: "${n}"`)}if("https:"!==o.protocol)throw Error(`${t} must use https, got: "${n}"`);let r=o.pathname.replace(/\/+$/,"").replace(/\/(?:\u006f\u0070\u0065\u006e\u0061\u0069|\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063)(?:\/v1)?$/i,"");return`${o.origin}${r}`}const mo=/^([\w-]+)\.(?:\u006f\u0070\u0065\u006e\u0061\u0069\.azure\.com|cognitiveservices\.azure\.com|services\.ai\.azure\.com)$/i;function fo(e){let t=new URL(e),o=mo.exec(t.hostname)?.[1];return o?`https://${o}.services.ai.azure.com${t.pathname.replace(/\/+$/,"")}`:e}function ho(e){if(!e?.trim())return;let t=e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let[t,o]=e.split(":").map(e=>e.trim());if(!t)throw Error(`Invalid FOUNDRY_DEPLOYMENTS entry: "${e}"`);return{id:t,model:o||t}});return t.length>0?t:void 0}const go=e=>({"api-key":e.apiKey,"Content-Type":"application/json",accept:"*/*"}),_o=e=>`${e.anthropicEndpoint}/anthropic`,yo=(e,t)=>({"x-api-key":e.apiKey,"Content-Type":"application/json",accept:"*/*","anthropic-version":t?.anthropicVersion??"2023-06-01",...t?.anthropicBeta?{"anthropic-beta":t.anthropicBeta}:{}}),wo=e=>"foundry"===e.provider;function ko(e){if(!e.foundry)throw Error("Foundry provider selected but not configured");return e.foundry}const bo=e=>wo(e)?(e=>`${e.endpoint}/openai/v1`)(ko(e)):ct(e),vo=(e,t=!1)=>wo(e)?go(ko(e)):ut(e,t),xo=e=>wo(e)?!!e.foundry?.apiKey:!!e.copilotToken;function To(e,t){let o=(e??t??"copilot").trim().toLowerCase();if("copilot"===o||"foundry"===o)return o;throw Error(`--provider must be "copilot" or "foundry", got: "${o}"`)}const $o=[{pattern:/^gpt-6/,context:105e4,output:128e3},{pattern:/^gpt-5/,context:4e5,output:128e3},{pattern:/^gpt-4\.1/,context:1047576,output:32768},{pattern:/^o\d/,context:2e5,output:1e5}],Ao={context:128e3,output:16384};function So(e){return $o.find(({pattern:t})=>t.test(e))??Ao}const Eo=/dall-e|gpt-image|image|whisper|tts|transcribe|realtime|audio|speech|sora/i,Oo=e=>/^(?:gpt-|o\d|codex|chatgpt|computer-use)/i.test(e);function Co(e,t){return{id:e.id,name:e.id,object:"model",vendor:t.vendor,version:e.model,preview:!1,model_picker_enabled:!0,supported_endpoints:t.supported_endpoints,capabilities:{family:e.model,object:"model_capabilities",type:"chat",tokenizer:"o200k_base",limits:t.limits&&{max_context_window_tokens:t.limits.context,max_output_tokens:t.limits.output},supports:{tool_calls:!0,parallel_tool_calls:!0}}}}async function Io(e){let t=`${e.endpoint}/openai/deployments?api-version=2022-12-01`,o=new AbortController,n=Lt(o,Z.timeoutMs);try{let{response:n,span:r}=await et({spanName:"foundry GET /openai/deployments",url:t,target:"models",headers:go(e),signal:o.signal});try{if(!n.ok)throw new Ut("Failed to list Foundry deployments",n);let e=(await n.json()).data.filter(e=>!e.status||"succeeded"===e.status).map(e=>({id:e.id,model:e.model}));return r.setAttribute("copilot_api.models_count",e.length),e}catch(e){throw Ye(r,e),e}finally{r.end()}}finally{clearTimeout(n)}}async function Po(e){return{object:"list",data:(e.deployments??await Io(e)).map(e=>function(e){let{model:t}=e;if(!Eo.test(t))return(e=>/embedding/i.test(e))(t)?{id:e.id,name:e.id,object:"model",vendor:"Azure OpenAI",version:t,preview:!1,model_picker_enabled:!1,supported_endpoints:["/embeddings"],capabilities:{family:t,object:"model_capabilities",type:"embeddings",tokenizer:"cl100k_base",supports:{}}}:(e=>/^\u0063\u006c\u0061\u0075\u0064\u0065/i.test(e))(t)?Co(e,{vendor:"Anthropic",supported_endpoints:["/v1/messages"]}):Oo(t)?Co(e,{vendor:"Azure OpenAI",supported_endpoints:["/responses"],limits:So(t)}):Co(e,{vendor:"Foundry",supported_endpoints:["/chat/completions"],limits:So(t)})}(e)).filter(e=>void 0!==e)}}const Ro=async()=>{let e=`${bo(Z)}/models`,t=vo(Z),o=Z.timeoutMs,n=new AbortController,r=Lt(n,o);try{let{response:o,span:r}=await et({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new Ut("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw Ye(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const No=e=>new Promise(t=>{setTimeout(t,e)}),qo=e=>null==e;async function Do(){let e=await(async()=>{if(wo(Z)&&Z.foundry)return Po(Z.foundry);try{return await Ro()}catch(e){if(e instanceof Ut&&401===e.response.status)return await uo(),Ro();throw e}})();Z.models=e}const jo=()=>{Z.vsCodeVersion="1.140.0-insider"};var Mo=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let Fo,Ho,Uo,Bo,Lo,zo=!1,Go=!1,Ko=!1;function Jo(){return Wo()?Lo:void 0}function Wo(){return void 0!==Lo&&Date.now()-Lo.at<6e4}function Yo(){return Ko?"re-authenticate with `copilot-api auth`; the proxy picks up the new token automatically within a minute":"re-authenticate and update GH_TOKEN / --github-token, then restart the proxy"}const Vo=()=>a.readFile(W.GITHUB_TOKEN_PATH,"utf8");function Xo(e){let{span:t,error:n,reason:r,refreshStart:a,attempt:i}=e,s=n.response.status,l=401===s?"Auth token is invalid or expired":"GitHub Copilot subscription not found or not active";Z.copilotToken=void 0,Lo={status:s,message:l,at:Date.now()},clearInterval(Fo),Fo=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Se.add(1,{reason:r,success:"false"}),Ee.add(1,{reason:r}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:c.ERROR,message:n.message}),t.recordException(n),Be.record(performance.now()-a,{reason:r}),We(_.ERROR,"ERROR",`Token refresh terminated — HTTP ${s} (${l})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempt":i,"copilot_api.token_refresh.terminal_status":s})}function Zo(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;Z.copilotToken=void 0,o.error("All token refresh attempts failed. Stale token has been cleared — next request will trigger re-authentication or fail with a clear 'no token' error.");let s=n instanceof Error?n:Error(String(n));t.setAttribute("copilot_api.token_refresh.success",!1),t.setStatus({code:c.ERROR,message:s.message}),t.recordException(s),Ee.add(1,{reason:r}),Be.record(performance.now()-a,{reason:r}),We(_.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const Qo=async(e=5,t=1e3,n="scheduled")=>zo?(o.debug("Token refresh already in progress, coalescing"),Ho):(zo=!0,Ho=ge.startActiveSpan("copilot_api.token.refresh",async r=>{let a=performance.now();r.setAttribute("copilot_api.token_refresh.reason",n),r.setAttribute("copilot_api.token_refresh.max_retries",e);try{for(let i=1;i<=e;i++)try{r.setAttribute("copilot_api.token_refresh.attempt",i),o.debug(`Refreshing Service token (${n}, attempt ${i}/${e})`);let{token:t,refresh_in:s}=await so();return Z.copilotToken=t,Lo=void 0,Go&&void 0===Fo&&(o.info("Token refresh recovered, resuming scheduled refresh"),tn(s)),o.debug("Service token refreshed successfully"),Z.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),Se.add(1,{reason:n,success:"true"}),Be.record(performance.now()-a,{reason:n}),void We(_.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof Ut&&(401===s.response.status||403===s.response.status))return void Xo({span:r,error:s,reason:n,refreshStart:a,attempt:i});let l=i===e;if(o.error(`Failed to refresh Service token (attempt ${i}/${e}):`,s),Se.add(1,{reason:n,success:"false"}),l)return void Zo({span:r,error:s,reason:n,refreshStart:a,maxRetries:e});let c=t*2**(i-1);o.debug(`Retrying token refresh in ${c}ms...`),await new Promise(e=>setTimeout(e,c))}}finally{r.end(),zo=!1,Ho=void 0}}),Ho);async function en(){return!!Z.copilotToken||!Wo()&&(void 0!==Lo&&Ko&&await async function(){if(Ho)return;let e=(await Vo().catch(()=>{}))?.trim();e&&e!==Z.githubToken?.trim()&&(Z.githubToken=e,o.info("Picked up re-authenticated Auth token from disk"),Z.showToken&&o.info("Auth token:",e))}(),await Qo(3,250,"on-demand"),!!Z.copilotToken)}function tn(e){Fo&&clearInterval(Fo);let t=Math.max(1e3*(e-60),6e4);Fo=setInterval(()=>{Qo(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function on(e){try{let t=await Vo();if(t&&!e?.force)return Z.githubToken=t,Ko=!0,Z.showToken&&o.info("Auth token:",t),void await nn();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=Z.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${ht}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:gt,scope:_t}),signal:e.signal});if(!t.ok)throw new Ut("Failed to get device code",t);return await t.json()}finally{clearTimeout(o)}}();o.debug("Device code response:",n),o.info(`Please enter the code "${n.user_code}" at ${n.verification_uri}`);try{m.writeSync(n.user_code),o.success("Code copied to clipboard — opening browser...")}catch{o.info("Open the link above and enter the code to authenticate")}!function(e){try{let t,o=g.platform;t="darwin"===o?"open":"win32"===o?"start":"xdg-open",f(t,[e],()=>{})}catch{}}(n.verification_uri);let r=await async function(e){let t=1e3*(e.interval+1);o.debug(`Polling access token with interval of ${t}ms`),o.start("Waiting for authorization...");let n=Date.now(),r=1e3*e.expires_in;for(;;){if(Date.now()-n>=r)throw new Mo("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=Z.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${ht}/login/oauth/access_token`,{method:"POST",headers:nt(),body:JSON.stringify({client_id:gt,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await No(t),o.error("Failed to poll access token:",await n.text());continue}let r=await n.json();if(o.debug("Polling access token response:",r),r.error){if("expired_token"===r.error)throw new Mo("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new Mo("Authorization was denied. Please run the command again and approve the request.");"authorization_pending"!==r.error&&"slow_down"!==r.error&&o.warn(`Unexpected auth error: ${r.error}`),await No(t);continue}if(r.access_token)return r.access_token;await No(t)}catch(e){if(e instanceof Mo)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await No(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(W.GITHUB_TOKEN_PATH,e,{mode:384}))(r),Z.githubToken=r,Ko=!0,Z.showToken&&o.info("Auth token:",r),await nn()}catch(e){throw e instanceof Ut?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function nn(){let e=await lo();o.success(`Authenticated as ${e.login}`)}async function rn(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),Z.showToken=e.showToken,await Y(),await on({force:!0}),console.log([""," Get started:",""," $ npx copilot-api-node20@latest start --claude-code"," $ npx copilot-api-node20@latest start --codex",""," Full docs: https://www.npmjs.com/package/copilot-api-node20",""].join("\n")),process.exit(0)}const an=e({meta:{name:"auth",description:"Run authentication flow"},args:{verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"show-token":{type:"boolean",default:!1,description:"Show token on auth"}},run:({args:e})=>rn({verbose:e.verbose,showToken:e["show-token"]})}),sn=.01,ln=864e5,cn=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),un=new Intl.NumberFormat("en-US"),pn=e=>cn.format(e*sn),dn=e=>e.credits_used??e.entitlement-e.remaining,mn=(e,t,o)=>{let n=(e=>{let t=new Date(`${e}T00:00:00Z`);return new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth()-1,1))})(t),r=(o.getTime()-n.getTime())/ln;if(r<.5)return;let a=dn(e),i=a*sn/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*sn,c=new Date(n.getTime()+l/i*ln);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},fn=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${un.format(dn(e))} of ${un.format(e.entitlement)} used`:"n/a",hn=e=>e.padEnd(14),gn=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${hn("AI credits")}unlimited`);else{let e=dn(o),t=o.percent_remaining;n.push(`${hn("AI credits")}${pn(e)} / ${pn(o.entitlement)} ${t.toFixed(1)}% left`,`${hn("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${hn("")}${un.format(e)} of ${un.format(o.entitlement)} credits`)}if(n.push("",`${hn("Chat")}${fn(e.quota_snapshots.chat)}`,`${hn("Completions")}${fn(e.quota_snapshots.completions)}`,"",`${hn("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/ln)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=mn(o,e.quota_reset_date,t);r&&n.push(`${hn("Burn rate")}~${cn.format(r.usdPerDay)}/day${(e=>e.exhausted?" — allowance already exhausted":e.exhaustsOn?` — on track to exhaust ${(e=>e.toLocaleDateString("en-US",{month:"short",day:"numeric",timeZone:"UTC"}))(e.exhaustsOn)}`:" — within allowance")(r)}`);let a=o.overage_permitted?"permitted, "+(o.overage_count>0?`${un.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${hn("Overage")}${a}`)}return n.join("\n")},_n=async()=>{let e=`${mt}/copilot_internal/user`,t=Z.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await et({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:ft(Z),signal:o.signal});try{if(!t.ok)throw new Ut("Failed to get usage",t);return await t.json()}catch(e){throw Ye(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},yn=()=>g.stdout.write("[2J[H"),wn=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,kn=async()=>{let e=await _n();return gn(e)},bn=e({meta:{name:"check-usage",description:"Show current usage/quota information"},args:{watch:{alias:"w",type:"boolean",default:!1,description:"Keep running and refresh the report on an interval"},interval:{alias:"i",type:"string",default:"60",description:"Seconds between refreshes in --watch mode (min 10)"}},async run({args:e}){if(await Y(),await on(),!e.watch){try{o.box(await kn())}catch(e){o.error("Failed to fetch usage:",e),g.exit(1)}g.exit(0)}(e=>!!e&&Number.isNaN(Number(e)))(e.interval)?o.info(`Ignoring --interval "${e.interval}" (not a number); using 60s`):(e=>{let t=Number(e);return!(!e||Number.isNaN(t))&&Math.floor(t)<10})(e.interval)&&o.info(`Raising --interval "${e.interval}" to the 10s minimum`);let t=(e=>{let t=Number(e);return!e||Number.isNaN(t)?60:Math.max(10,Math.floor(t))})(e.interval),n=g.stdout.isTTY,r=()=>g.exit(0);for(g.on("SIGINT",r),g.on("SIGTERM",r);;){try{let e=await kn();n&&yn(),o.box(e),o.log(wn(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),vn=N(f);async function xn(){let e="win32"===g.platform?"where.exe":"which";try{return await vn(e,["tailscale"]),!0}catch{return!1}}async function Tn(){try{let{stdout:e}=await vn("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function $n(e){return e.replace(/\.$/,"")}async function An(){let e=await Tn();if(e?.Online)return $n(e.DNSName)}const Sn=N(f),En=e=>`[1m${e}[0m`,On=e=>`[2m${e}[0m`,Cn=e=>`[36m${e}[0m`,In=e=>`[32m${e}[0m`,Pn=e=>`[31m${e}[0m`,Rn=e=>`[33m${e}[0m`,Nn=On(" ─────────────────────────────────────────────────────────────"),qn=s.join(W.APP_DIR,"certs","tailscale"),Dn=s.join(qn,"cert.pem"),jn=s.join(qn,"key.pem"),Mn={certDir:qn,certPath:Dn,keyPath:jn};function Fn(){switch(g.platform){case"darwin":return[` ${On("Install Tailscale for macOS:")}`,` ${Cn("https://tailscale.com/download/mac")}`,` ${On("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${On("After installing, open the Tailscale app and sign in.")}`,` ${On("Then re-run this command.")}`].join("\n");case"linux":return[` ${On("Install Tailscale for Linux:")}`,` ${Cn("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${Cn("sudo tailscale up")}`,` ${On("or")} ${Cn("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${On("Install Tailscale for Windows:")}`,` ${Cn("https://tailscale.com/download/windows")}`,"",` ${On("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${On("Install Tailscale:")} ${Cn("https://tailscale.com/download")}`}}function Hn(){let e=[` ${Pn("Tailscale is not running.")}`];return"darwin"===g.platform?e.push(` ${On("Open the Tailscale app from Applications and sign in.")}`,` ${On("Download:")} ${Cn("https://tailscale.com/download/mac")}`):"win32"===g.platform?e.push(` ${On("Open the Tailscale app and sign in.")}`,` ${On("Download:")} ${Cn("https://tailscale.com/download/windows")}`):e.push(` ${On("Connect with:")} ${Cn("sudo tailscale up")}`),e.push("",` ${On("Then re-run this command.")}`),e.join("\n")}async function Un(){try{return await a.access(Dn),await a.access(jn),!0}catch{return!1}}function Bn(e){console.log(""),console.log(Nn),console.log(` ${En("Claude Cowork Setup")} ${On("— Diagnostic")}`),console.log(Nn),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?In("✅"):"missing"===n.status?Pn("❌"):Rn("❓");let r=n.detail?On(` ${n.detail}`):"";t.push(` ${e} ${o}${r}`)}return t}(e))console.log(t);console.log("");let t=Object.values(e).filter(e=>"missing"===e.status);0===t.length?console.log(` ${In("All checks passed.")}`):console.log(` ${Pn(`${t.length} issue(s).`)} Run ${Cn("copilot-api cowork-setup install")} to fix.`),console.log("")}const Ln={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},zn=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await xn();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return Bn(e),console.log(""),console.log(Fn()),void console.log("");let o=await Tn();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},Bn(e),console.log(Hn()),void console.log("");let n=$n(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await Un();e["tailscale-cert"]=r?{status:"ok",detail:Dn}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),Bn(e)}(),g.exit(0)}}),Gn=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:Ln},async run({args:e}){await async function(e){if(console.log(""),console.log(Nn),console.log(` ${En("Claude Cowork Setup")} ${On("— Install")}`),console.log(Nn),console.log(""),!await xn())return console.log(` ${Pn("Tailscale is not installed.")}`),console.log(""),console.log(Fn()),console.log(""),console.log(` ${On("After installing, run")} ${Cn("tailscale up")} ${On("to connect, then re-run this command.")}`),void console.log("");let t=await Tn();if(!t||!t.Online)return console.log(Hn()),void console.log("");let n=$n(t.DNSName);if(console.log(` ${On("Tailscale hostname:")} ${En(n)}`),console.log(""),console.log(` ${En("Generating TLS certificate via Tailscale…")}`),console.log(` ${On("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${Cn(`$ tailscale cert --cert-file ${Dn} --key-file ${jn} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(qn,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await Sn("tailscale",["cert","--cert-file",Dn,"--key-file",jn,n]),console.log(` ${In("✓ Certificate generated")}`)}catch(e){let t=e instanceof Error?e.message:String(e);return void o.error(`Failed to generate cert: ${t}`)}console.log(""),console.log(Nn),console.log(` ${En("Next steps")}`),console.log(Nn),console.log(""),console.log(` ${En("1.")} Start the proxy:`),console.log(` ${Cn("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${En("2.")} In Cowork ${On("→")} Settings ${On("→")} Inference Provider, set:`),console.log(` ${En("inferenceGatewayBaseUrl")} = ${Cn(`https://${n}:<port>`)}`),console.log(` ${On("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${En("3.")} Restart Cowork ${On("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${On("For Cowork's own configuration docs, see:")}`),console.log(` ${Cn("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),Kn=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:Ln},async run({args:e}){await async function(e){if(console.log(""),console.log(Nn),console.log(` ${En("Claude Cowork Setup")} ${On("— Revert")}`),console.log(Nn),console.log(""),!await Un())return console.log(` ${On("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${En("Remove Tailscale cert files:")}`),console.log(` ${On(Dn)}`),console.log(` ${On(jn)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(qn,{recursive:!0}),console.log(` ${In("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${On("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),Jn=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:zn,install:Gn,revert:Kn}}),Wn=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function Yn(e){if(!Wn.test(e))return e;let t=e,o=String.fromCodePoint(27),n=t.split(o);if(n.length>1){t=n[0];for(let e=1;e<n.length;e++){let r=n[e],a=r.match(/^\[[0-9;]*[a-z]/i);t+=a?r.slice(a[0].length):o+r}}return t.replaceAll(/[\u200B-\u200D\uFEFF]/g,"").replaceAll(/[\u2060-\u2064]/g,"").replaceAll(/[\u206A-\u206F]/g,"").replaceAll(/[\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/g,"").replaceAll(/[\uFFF0-\uFFFF]/g,"").replaceAll(/[\x00-\x08\v\f\x0E-\x1F]/g,"")}function Vn(e){return"string"==typeof e?Yn(e):Array.isArray(e)?function(e){let t;for(let o=0;o<e.length;o++){let n=e[o],r=Vn(n);!t&&r!==n&&(t=e.slice(0,o)),t?.push(r)}return t??e}(e):e&&"object"==typeof e?function(e){let t,o=Object.entries(e),n="thinking"===e.type;for(let e=0;e<o.length;e++){let[r,a]=o[e],i=!n||"thinking"!==r&&"signature"!==r?Vn(a):a;!t&&(i!==a||"__proto__"===r)&&(t=Xn({},o,e)),t&&(t[r]=i)}let r=t??e;return"object"===r.type&&!("properties"in r)&&(t??=Xn({},o,o.length),t.properties={}),t??e}(e):e}function Xn(e,t,o){for(let n=0;n<o;n++)e[t[n][0]]=t[n][1];return e}const Zn="x-copilot-api-self-test",Qn=R();const er=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function tr(e){return!e.id.startsWith("text-embedding")&&"embeddings"!==e.capabilities.type&&!function(e){let t=e.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):/gpt-[\d.]+-codex/i.test(e.id)}(e)&&!function(e){return"disabled"===e.policy?.state}(e)}function or(e){try{!function(e){let{c:t,start:o,span:n}=e,r=t.get("requestData"),a=t.res.status,i=r?.model??"unknown",s=r?.streaming??!1,l=Math.round(performance.now()-o);if(n.setAttribute("http.status_code",a),n.setAttribute("copilot_api.model",i),n.setAttribute("copilot_api.streaming",s),n.setAttribute("copilot_api.duration_ms",l),r?._d1&&n.setAttribute("copilot_api.copilot_duration_ms",r._d1),r?.tokenUsage){let e=r.tokenUsage;n.setAttribute("copilot_api.input_tokens",e.inputTokens),n.setAttribute("copilot_api.output_tokens",e.outputTokens),n.setAttribute("copilot_api.total_tokens",e.totalTokens),e.cachedTokens&&n.setAttribute("copilot_api.cached_tokens",e.cachedTokens)}t.res.headers.forEach((e,t)=>{let o=t.toLowerCase();Ze.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),a>=400&&n.setStatus({code:c.ERROR,message:`HTTP ${a}`})}(e)}catch(e){o.warn("Error enriching span during finalization:",e)}try{!function(e){let{c:t,start:o,method:n,path:r,endpointType:a,requestId:i}=e;if(t.get("isSelfTest"))return;let s=Math.round(performance.now()-o),l=t.get("requestData"),c=t.res.status,u=l?.model??"unknown",p=l?.streaming??!1,d={method:n,path:r,status_code:String(c),model:u,streaming:String(p),endpoint_type:a};if(we.add(1,d),je.record(s,d),c>=400&&ke.add(1,{method:n,path:r,status_code:String(c),error_type:c>=500?"server_error":"client_error"}),l?.tokenUsage){let e=l.tokenUsage,t={model:u,endpoint_type:a};e.inputTokens&&(be.add(e.inputTokens,t),ze.record(e.inputTokens,t)),e.outputTokens&&(ve.add(e.outputTokens,t),Ge.record(e.outputTokens,t)),e.cachedTokens&&xe.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&ue.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const nr=1048576;const rr=async()=>ge.startActiveSpan("copilot_api.approval.await",async e=>{let t=performance.now();try{let n=await o.prompt("Accept incoming request?",{type:"confirm"}),r=performance.now()-t;if(e.setAttribute("copilot_api.approval.wait_duration_ms",r),Je.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),Re.add(1,{result:"rejected"}),new Ut("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),Re.add(1,{result:"approved"})}finally{e.end()}});async function ar(e){if(xo(Z)||await en())return null;let t=Jo();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${Yo()}`,type:"authentication_error"}},401)):(d.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({error:{message:"Service token not yet available; retry shortly",type:"service_unavailable"}},503))}function ir(e){let t=e.prompt_tokens||0,o=e.completion_tokens||0;return{inputTokens:t,outputTokens:o,totalTokens:e.total_tokens||t+o,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function sr(e,t){void 0!==t.prompt_tokens&&e.setAttribute("copilot_api.input_tokens",t.prompt_tokens),void 0!==t.completion_tokens&&e.setAttribute("copilot_api.output_tokens",t.completion_tokens),void 0!==t.total_tokens&&e.setAttribute("copilot_api.total_tokens",t.total_tokens)}const lr=[{pattern:/haiku/i,family:"haiku"},{pattern:/sonnet[.-]?4[.-]6/i,family:"sonnet-4.6"},{pattern:/(sonnet-4[.-]5|[.-]?3[.-]5[.-]?sonnet|[.-]?3[.-]7[.-]?sonnet)/i,family:"sonnet-4.5"},{pattern:/sonnet-4(?![.-]5|[.-]6|[.-]1)/i,family:"sonnet-4"},{pattern:/opus[.-]?4[.-]7/i,family:"opus-4.7"},{pattern:/opus[.-]?4[.-]6/i,family:"opus-4.6"},{pattern:/opus[.-]?4[.-]5/i,family:"opus-4.5"},{pattern:/opus/i,family:"opus"}],cr="claude-haiku-4.5",ur={haiku:cr,"sonnet-4.6":"claude-sonnet-4.6","sonnet-4.5":"claude-sonnet-4.5","sonnet-4":"claude-sonnet-4","opus-4.7":"claude-opus-4.7","opus-4.6":"claude-opus-4.6","opus-4.5":"claude-opus-4.5",opus:"claude-opus-4.5"};function pr(e,t){if("string"!=typeof e)return null;let o=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[n,r]=function(e){let t=e.lastIndexOf("["),o=e.lastIndexOf("]");return-1!==t&&o===e.length-1&&o>t?[e.slice(0,t),e.slice(t+1,o)]:[e,null]}(o);if(t.includes(o))return o;if(r){let e=`${n}-${r}`.replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.includes(e))return e}let a=function(e){for(let t of lr)if(t.pattern.test(e))return t.family;return null}(n);if(!a)return null;let i=n.replace(/-\d{8}(?::.*)?$/,""),s=r?`-${r}`:"";for(let e of t){let t=e.replace(/-\d{8}(?::.*)?$/,""),o=`${i}${s}`.toLowerCase().replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.toLowerCase().replaceAll(/(\d)-(\d)\b/g,"$1.$2")===o)return e}return function(e,t,o=null){let n=ur[e];if(!n)return null;if(o){let e=`${n}-${o}`;if(t.includes(e))return e}if(t.includes(n))return n;if("sonnet-4.5"===e)for(let e of["claude-3.5-sonnet"]){let n=o?`${e}-${o}`:e;if(t.includes(n))return n}return null}(a,t,r)}const dr=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function mr(e,t){if(!e||!t||0===t.length)return null;let o=function(e){return"max"===e?"xhigh":e}(e);if(t.includes(o))return o;let n=dr.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=dr.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}var fr=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function hr(e){if(!e||"string"!=typeof e)throw new fr("Model name is required and must be a string");if("foundry"===Z.provider)return e;if(!Z.models?.data)throw new fr("Models not available. Please try again later.",503);let t=Z.models.data.map(e=>e.id);if(t.includes(e))return e;let o=pr(e,t);if(!o)throw $e.add(1,{requested_model:e}),new fr(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function gr(e){let t=Z.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):"foundry"===Z.provider?Oo(e):/gpt-[\d.]+-codex/i.test(e)}async function _r(e){if(void 0===e.rateLimitSeconds)return;let t=e.rateLimitSeconds;return ge.startActiveSpan("copilot_api.rate_limit.check",async n=>{try{let r=Date.now();if(n.setAttribute("copilot_api.rate_limit.configured_seconds",t),!e.lastRequestTimestamp)return e.lastRequestTimestamp=r,void n.setAttribute("copilot_api.rate_limit.action","allowed");let a=(r-e.lastRequestTimestamp)/1e3;if(n.setAttribute("copilot_api.rate_limit.elapsed_seconds",a),a>t)return e.lastRequestTimestamp=r,void n.setAttribute("copilot_api.rate_limit.action","allowed");let i=Math.ceil(t-a);if(n.setAttribute("copilot_api.rate_limit.wait_seconds",i),!e.rateLimitWait)throw n.setAttribute("copilot_api.rate_limit.action","rejected"),Te.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new Ut("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),Te.add(1,{action:"waited",source:"local"}),He.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await No(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}var yr=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function wr(e){if(e instanceof yr)return{type:e.type,message:e.message};if(e instanceof Ut){let t=e.response.status;return{type:529===t?"overloaded_error":`upstream_error_${t}`,message:`Upstream error (${t}) while streaming response`}}return{type:"api_error",message:"Stream interrupted before completion"}}async function kr(e,t){let{type:n,message:r}=wr(t);try{await e.writeSSE({event:"error",data:JSON.stringify({type:"error",error:{type:n,message:r}})})}catch(e){o.debug("Failed to emit Anthropic stream error frame:",e)}}async function br(e,t){let{type:n,message:r}=wr(t);try{await e.writeSSE({event:"error",data:JSON.stringify({error:{message:r,type:n}})})}catch(e){o.debug("Failed to emit OpenAI stream error frame:",e)}}function vr(e){if("number"==typeof e){if(!Number.isFinite(e))return null;let t=Math.floor(e);return t>0?t:null}if("string"==typeof e){let t=e.trim();if(!t)return null;let o=Number(t);if(!Number.isFinite(o))return null;let n=Math.floor(o);return n>0?n:null}return null}function xr(e,t,o){return Math.min(Math.max(e,t),o)}function Tr(e,t=0){if(t>5||!e||"object"!=typeof e)return null;let o=e.error;if(!o||"object"!=typeof o)return null;let n=o.code;if("string"==typeof n)return n;let r=o.message;if("string"!=typeof r)return null;try{return Tr(JSON.parse(r),t+1)}catch{return null}}function $r(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=vr(o.capabilities.supports.min_thinking_budget),r=vr(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:vr(o.capabilities.limits?.max_output_tokens)??void 0}}function Ar(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=xr(vr(e.requestedBudget)??o,o,n),a=vr(e.maxTokens);if(a||=r+1,t.maxOutputTokens&&a>t.maxOutputTokens&&(a=t.maxOutputTokens),a<=r){let e=Math.min(r,a-1);if(e>=o)r=e;else{let e=o+1;if(t.maxOutputTokens&&e>t.maxOutputTokens)return{thinkingBudget:null,maxTokens:a};a=e,r=o}}return a<=r?{thinkingBudget:null,maxTokens:a}:{thinkingBudget:r,maxTokens:a}}function Sr(e,t){if(qo(e.thinking_budget))return e;let o=$r(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=Ar({requestedBudget:e.thinking_budget,maxTokens:e.max_tokens,config:o});return null===n.thinkingBudget?{...e,max_tokens:n.maxTokens,thinking_budget:void 0}:{...e,max_tokens:n.maxTokens,thinking_budget:n.thinkingBudget}}function Er(e){return"invalid_thinking_budget"===Tr(e)}async function Or(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(qo(t.thinking_budget)||!(o instanceof Error))return null;let a,i,s=o;if(!(s.response instanceof Response)||400!==s.response.status)return null;if(void 0!==r)a=r;else try{a=await s.response.clone().text()}catch{return null}try{i=JSON.parse(a)}catch{return null}if(!Er(i))return null;let l=$r(n,t.model);return l?function(e,t){let o=Ar({requestedBudget:e.thinking_budget,maxTokens:e.max_tokens,config:t});if(null===o.thinkingBudget)return{...e,max_tokens:o.maxTokens,thinking_budget:void 0};let n=o.thinkingBudget,r=vr(e.thinking_budget);if(r&&r===o.thinkingBudget){let e=n+1;e<=t.bounds.max&&(!o.maxTokens||e<o.maxTokens)&&(n=e)}let a=o.maxTokens;if((!a||a<=n)&&(a=n+1),t.maxOutputTokens&&a>t.maxOutputTokens){if(!(t.maxOutputTokens>n))return{...e,max_tokens:t.maxOutputTokens,thinking_budget:void 0};a=t.maxOutputTokens}return{...e,max_tokens:a,thinking_budget:n}}(t,l):{...t,thinking_budget:void 0}}function Cr(e,t){let o=!1;return()=>{if(o)return;o=!0;let n=e.get("requestData")||{};n.upstreamTtfbMs=performance.now()-t,e.set("requestData",n)}}function Ir(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const Pr=new Map,Rr=new Map,Nr=new Set;let qr,Dr,jr;function Mr(e){return!e.closed&&!e.destroyed}function Fr(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new O(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return Pr.set(t,Date.now()),qe.add(1,{event:"created",origin:e}),We(_.INFO,"INFO",`HTTP/2 client created for ${e}`,{"copilot_api.h2.event":"created","copilot_api.h2.origin":e}),t.on("connect",()=>{o.debug(`HTTP/2 client connected to ${e}`)}),t.on("error",t=>{o.debug(`HTTP/2 client error for ${e}:`,t.message)}),t.on("disconnect",(n,r,a)=>{o.debug(`HTTP/2 client disconnected from ${e}:`,a.message);let i=Nr.has(t);qe.add(1,{event:"goaway",origin:e}),We(i?_.WARN:_.DEBUG,i?"WARN":"DEBUG",`HTTP/2 client disconnected from ${e}: ${a.message}`,{"copilot_api.h2.event":"goaway","copilot_api.h2.origin":e,"copilot_api.h2.error":a.message}),Rr.delete(t),Nr.delete(t),Pr.delete(t),Mr(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function Hr(e,t){if(!Z.connectivity.h2)return;if(qr&&qr!==e&&function(){for(let e of[...Rr.keys(),...Nr])Mr(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});Rr.clear(),Nr.clear(),Pr.clear()}(),qr=e,t?.fresh){let t=Fr(e);return Nr.add(t),t}let n=Date.now();for(let[t]of Rr)if(n-(Pr.get(t)??0)>=6e5)Rr.delete(t),Pr.delete(t),Mr(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),qe.add(1,{event:"rotated",origin:e}),We(_.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(Mr(t))return Rr.delete(t),Nr.add(t),t;Rr.delete(t),Pr.delete(t)}let r=Fr(e);return Nr.add(r),r}function Ur(e){e&&Nr.delete(e)&&(Mr(e)?Rr.set(e,Date.now()):Pr.delete(e))}function Br(){jr||(jr=setInterval(()=>{!function(){let e=Date.now(),t=Z.connectivity.h2Keepalive,n=Rr.size;for(let[r,a]of Rr)e-a<6e4||t&&n<=1||(Rr.delete(r),Pr.delete(r),n--,Mr(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),qe.add(1,{event:"idle_reaped",origin:qr??""}),We(_.INFO,"INFO",`HTTP/2 idle connection reaped for ${qr}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":qr??""}))}()},3e4),jr.unref())}function Lr(){Dr||(o.debug("Starting HTTP/2 keepalive (every 45s)"),Dr=setInterval(()=>{(async function(){if(0===Rr.size&&0===Nr.size){if(qr){let e=Fr(qr);Rr.set(e,Date.now())}return}let e=[...Rr.keys()];for(let t of e)Rr.delete(t);await Promise.allSettled(e.map(async e=>{if(Mr(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:ut(Z)});await n.dump(),Ne.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),Rr.set(e,Date.now())}catch(t){Ne.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),qe.add(1,{event:"error",origin:qr??""}),Pr.delete(e),Mr(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else Pr.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),Dr.unref(),Br())}function zr(e){return e.max_completion_tokens??e.max_tokens}async function Gr(e,t,o){try{if(!e.ok)throw new Ut("Failed to create chat completions",e,{outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders});let n=await e.json();return n.id&&t.setAttribute("copilot_api.response.id",n.id),n.usage&&sr(t,n.usage),n}catch(e){throw Ye(t,e),e}finally{t.end()}}const Kr=async e=>{let t=Vn(e);try{return await Jr(t)}catch(e){if(e instanceof Ut&&401===e.response.status)return await uo(),Jr(t);let n;if(e instanceof Ut)try{n=await e.response.clone().text()}catch{n=void 0}let r=await Or({payload:t,error:e,models:Z.models,errorBodyText:n});if(r)return e instanceof Ut&&void 0!==n&&o.warn(`Upstream rejected thinking_budget (status ${e.response.status}): ${n.slice(0,500)}`),o.warn("Adjusting thinking_budget payload and retrying once..."),await Jr(Vn(r));throw e}},Jr=async e=>{if(!xo(Z))throw Error("Service token not found");let t=e.messages.some(e=>"string"!=typeof e.content&&e.content?.some(e=>"image_url"===e.type)),o=e.messages.some(e=>["assistant","tool"].includes(e.role)),n={...vo(Z,t),"X-Initiator":o?"agent":"user"},r=bo(Z),a=`${r}/chat/completions`,i=Z.timeoutMs,s=function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t)){let{max_completion_tokens:t,...o}=e;return null==t?o:{...o,max_tokens:t}}let{max_tokens:o,max_completion_tokens:n,stop:r,...a}=e,i=zr(e);return null==i?a:{...a,max_completion_tokens:i}}(e,Z.models),l=JSON.stringify(s),c={"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":i,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.message_count":e.messages.length,"copilot_api.max_tokens":zr(e)??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":o?"agent":"user"};for(let t=0;t<=1;t++){let o=Hr(r,{fresh:t>0}),s=new AbortController,u=Lt(s,i);try{let{statusCode:r,headers:u,body:p,span:d}=await tt({spanName:"copilot POST /chat/completions",url:a,target:"chat_completions",headers:n,body:l,signal:s.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...c,"copilot_api.h2.retry_attempt":t},dispatcher:o}),m=new Response(p,{status:r,headers:u});if(e.stream){if(!m.ok)throw d.end(),new Ut("Failed to create chat completions",m,{outgoingBody:l,outgoingHeaders:n});return{events:M(m),span:d,release:()=>Ur(o)}}try{return await Gr(m,d,{outgoingBody:l,outgoingHeaders:n})}finally{Ur(o)}}catch(e){if(Ur(o),await Ht(e,{attempt:t,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Wr=new Map;function Yr(e,t){let o=e.reasoning?.effort;if(!o)return e;if(0===t.length){let{reasoning:t,...o}=e;return o}let n=mr(o,t);return n&&n!==o?{...e,reasoning:{...e.reasoning,effort:n}}:e}function Vr(e,t){if(!e.reasoning)return null;let n=function(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}let{param:o,code:n,message:r=""}=t.error??{};if("reasoning.effort"===o||"reasoning"===o){if("unsupported_value"===n){let e=[...(/Supported values are:(.*)$/i.exec(r)?.[1]??"").matchAll(/'([^']+)'/g)].map(e=>e[1]);return e.length>0?{kind:"unsupported_value",supported:e}:void 0}if("unsupported_parameter"===n)return{kind:"unsupported_parameter"}}}(t);if(!n)return null;let r="unsupported_value"===n.kind?n.supported:[];Wr.set(e.model,r);let a=Yr(e,r);return a===e?null:(o.debug(`Foundry rejected reasoning.effort=${e.reasoning.effort} on ${e.model}; retrying with ${a.reasoning?.effort??"no reasoning"}`),a)}async function Xr(e,t,o){try{if(!e.ok)throw new Ut("Failed to create responses",e,{outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders});let n=await e.json();return n.id&&t.setAttribute("copilot_api.response.id",n.id),n.usage&&sr(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens}),n}catch(e){throw Ye(t,e),e}finally{t.end()}}const Zr=async e=>{let t=wo(Z),o=t?function(e){let t=Wr.get(e.model);return t?Yr(e,t):e}(e):e;try{return await Qr(o)}catch(e){if(e instanceof Ut&&401===e.response.status)return await uo(),Qr(o);if(t&&e instanceof Ut&&400===e.response.status){let t=Vr(o,await e.response.clone().text().catch(()=>{}));if(t)return Qr(t)}throw e}},Qr=async e=>{if(!xo(Z))throw Error("Service token not found");let t=Vn(e),o={...vo(Z),"X-Initiator":"agent"},n=bo(Z),r=`${n}/responses`,a=Z.timeoutMs,i=JSON.stringify(t),s={"copilot_api.model":t.model,"copilot_api.streaming":!!t.stream,"copilot_api.timeout_ms":a,"copilot_api.has_tools":!!t.tools?.length,"copilot_api.tool_count":t.tools?.length??0,"copilot_api.max_output_tokens":t.max_output_tokens??0,"copilot_api.api_type":"responses"};for(let e=0;e<=1;e++){let l=Hr(n,{fresh:e>0}),c=new AbortController,u=Lt(c,a);try{let{statusCode:n,headers:u,body:p,span:d}=await tt({spanName:"copilot POST /responses",url:r,target:"responses",headers:o,body:i,signal:c.signal,headersTimeout:a,bodyTimeout:3*a,extraAttributes:{...s,"copilot_api.h2.retry_attempt":e},dispatcher:l}),m=new Response(p,{status:n,headers:u});if(t.stream){if(!m.ok)throw d.end(),new Ut("Failed to create responses",m,{outgoingBody:i,outgoingHeaders:o});return{events:M(m),span:d,release:()=>Ur(l)}}try{return await Xr(m,d,{outgoingBody:i,outgoingHeaders:o})}finally{Ur(l)}}catch(t){if(Ur(l),await Ht(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},ea=e=>Object.hasOwn(e,"output");function ta(e){if("response.completed"!==e.type&&"response.incomplete"!==e.type)return null;let t=e.response.usage;return t?{prompt_tokens:t.input_tokens,completion_tokens:t.output_tokens,total_tokens:t.total_tokens}:null}var oa=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const na=new Set(["model","messages","max_tokens","max_completion_tokens","temperature","top_p","stream","stream_options","tools","tool_choice","parallel_tool_calls","user","reasoning_effort","response_format"]);function ra(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new oa(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new oa(`logprobs is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","logprobs")}(e);let t=function(e){return e.filter(e=>"system"===e.role||"developer"===e.role).map(e=>ia(e.content)).filter(Boolean).join("\n\n")||void 0}(e.messages),o=function(e){let t=[];for(let o of e)switch(o.role){case"user":{let e=sa(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=ia(o.content);e&&t.push({type:"message",role:"assistant",content:[{type:"output_text",text:e}]});for(let e of o.tool_calls??[])t.push({type:"function_call",call_id:e.id,name:e.function.name,arguments:e.function.arguments});break}case"tool":t.push({type:"function_call_output",call_id:o.tool_call_id??"",output:ia(o.content)})}return t}(e.messages);if(0===o.length)throw new oa("request has no translatable message content","invalid_request","messages");let n={model:e.model,input:o,store:!1};t&&(n.instructions=t);let r=e.max_completion_tokens??e.max_tokens;"number"==typeof r&&(n.max_output_tokens=Math.max(r,16)),e.stream&&(n.stream=!0),aa(e.temperature)&&(n.temperature=e.temperature),aa(e.top_p)&&(n.top_p=e.top_p),aa(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),aa(e.user)&&(n.user=e.user),e.reasoning_effort&&(n.reasoning={effort:e.reasoning_effort}),e.tools?.length&&(n.tools=e.tools.filter(e=>"function"===e.type).map(e=>({type:"function",name:e.function.name,description:e.function.description,parameters:e.function.parameters}))),e.tool_choice&&(n.tool_choice="string"==typeof e.tool_choice?e.tool_choice:{type:"function",name:e.tool_choice.function.name});let a=function(e){if(e)switch(e.type){case"json_schema":{let{name:t,description:o,schema:n,strict:r}=e.json_schema;return{type:"json_schema",name:t,description:o,schema:n,strict:r}}case"json_object":return{type:"json_object"};default:return{type:"text"}}}(e.response_format);return a&&(n.text={format:a}),n}function aa(e){return null!=e}function ia(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function sa(e){if("string"==typeof e)return e?[{type:"input_text",text:e}]:[];let t=[];for(let o of e??[])if("text"===o.type)o.text&&t.push({type:"input_text",text:o.text});else{if("image_url"!==o.type)throw new oa(`content part type '${o.type}' is not supported for models served via the Responses API`,"unsupported_content_type","messages");t.push({type:"input_image",image_url:o.image_url.url,detail:"low"===o.image_url.detail?"low":"high"})}return t}function la(e){let t={prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens};return void 0!==e.input_tokens_details?.cached_tokens&&(t.prompt_tokens_details={cached_tokens:e.input_tokens_details.cached_tokens}),void 0!==e.output_tokens_details?.reasoning_tokens&&(t.completion_tokens_details={reasoning_tokens:e.output_tokens_details.reasoning_tokens}),t}function ca(e,t){if("incomplete"===e.status){let t=e.incomplete_details?.reason;if("content_filter"===t)return"content_filter";if("max_output_tokens"===t)return"length"}return t?"tool_calls":"stop"}function ua(e,t,o=null){let n=e.roleSent?t:{role:"assistant",...t};return e.roleSent=!0,{id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[{index:0,delta:n,logprobs:null,finish_reason:o}]}}function pa(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function da(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=pa(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[ua(t,{tool_calls:[{index:r,function:{arguments:o.arguments}}]})]):[];let a=function(e,t,o){let n=e.toolCallCount++;return e.toolCallIndexByItemId.set(t,n),e.toolCallIndexByOutputIndex.set(o,n),n}(t,o.id,e.output_index),i=n?o.arguments:"";return i&&t.toolCallsWithArgs.add(a),[ua(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function ma(e,t){let o=[ua(e,{},ca(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=la(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function fa(e,t){switch(e.type){case"response.created":case"response.in_progress":return t.id=e.response.id||t.id,t.model=e.response.model||t.model,e.response.created_at&&(t.created=e.response.created_at),{chunks:[]};case"response.output_text.delta":case"response.refusal.delta":return e.delta?{chunks:[ua(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:da(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=pa(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[ua(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:ma(t,e.response),done:!0};case"response.failed":return{chunks:[],error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}};case"error":return{chunks:[],error:{type:e.code??"api_error",message:e.message??"Response generation failed"}};default:return{chunks:[]}}}const ha="openai_responses";function ga(e){let t=performance.now(),n=ge.startActiveSpan("copilot_api.translate.openai_to_responses",t=>{try{return t.setAttribute("copilot_api.translation.direction","openai_to_responses"),t.setAttribute("copilot_api.translation.message_count",e.messages.length),t.setAttribute("copilot_api.translation.has_tools",!!e.tools?.length),ra(e)}finally{t.end()}});Ue.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!na.has(e)&&null!=t).map(([e])=>e)}(e);return r.length>0&&o.debug(`Dropped chat-only fields with no Responses API equivalent: ${r.join(", ")}`),n}function _a(e){let t=performance.now(),o=ge.startActiveSpan("copilot_api.translate.responses_to_openai",t=>{try{return t.setAttribute("copilot_api.translation.direction","responses_to_openai"),function(e){let t="",o=!1,n=[];for(let r of e.output)if("message"===r.type)for(let e of r.content)"output_text"===e.type?(t+=e.text,o=!0):"refusal"===e.type&&(t+=e.refusal,o=!0);else"function_call"===r.type&&n.push({id:r.call_id,type:"function",function:{name:r.name,arguments:r.arguments}});let r={id:e.id,object:"chat.completion",created:e.created_at,model:e.model,choices:[{index:0,message:{role:"assistant",content:o?t:null,...n.length>0&&{tool_calls:n}},logprobs:null,finish_reason:ca(e,n.length>0)}]};return e.usage&&(r.usage=la(e.usage)),r}(e)}finally{t.end()}});return Ue.record(performance.now()-t,{direction:"responses_to_openai"}),o}function ya(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=la(t.usage);a.tokenUsage=ir(o)}return a.copilotDuration=r,a.upstreamTtfbMs=r,a.upstreamTotalMs=r,e.set("requestData",a),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(t).slice(-400)),"failed"===t.status?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({error:{message:t.error?.message??"Response generation failed",type:"api_error",code:t.error?.code??null}},500)):e.json(_a(t))}async function wa(e,t,n){let r;try{r=ga(t)}catch(t){if(t instanceof oa)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t.message,type:"invalid_request_error",param:t.param,code:t.code}},400);throw t}o.debug("Translated chat → Responses API payload:",JSON.stringify(r).slice(-400)),e.set("requestData",{model:r.model,streaming:!!r.stream}),Z.manualApprove&&!n.isSelfTest&&await rr();let a=await ar(e);if(a)return a;let i=performance.now(),s=await Zr(r),l=performance.now()-i;if(Me.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),ea(s))return ya(e,s,l);let{events:c,span:u,release:p}=s,m=function(e){return{id:"",model:e.model,created:Math.floor(Date.now()/1e3),includeUsage:e.includeUsage,roleSent:!1,toolCallCount:0,toolCallIndexByItemId:new Map,toolCallIndexByOutputIndex:new Map,toolCallsWithArgs:new Set}}({model:r.model,includeUsage:!0===t.stream_options?.include_usage});return j(e,async t=>{let n=null,a=0,s=performance.now(),d=Cr(e,i);try{try{for await(let i of c){if(d(),!i.data||"[DONE]"===i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}a++,Pe.add(1,{model:r.model,endpoint_type:ha});let c=ta(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=ir(c),t.copilotDuration=l,e.set("requestData",t)}let u=fa(s,m);if(u.error)throw new yr(u.error.type,u.error.message);for(let e of u.chunks)await t.writeSSE({data:JSON.stringify(e)});u.done&&await t.writeSSE({data:"[DONE]"})}let u={model:r.model,endpoint_type:ha};Fe.record(performance.now()-s,u),Ke.record(a,u),Ir(e,i)}catch(o){throw Ve(u,e.get("requestSpan"),o),await br(t,o),o}finally{n&&sr(u,n),u.end(),p()}let f=e.get("requestId");f&&ue.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function ka(e,t){if(!e.data)return e;try{let o=JSON.parse(e.data);if(o.usage&&t(o.usage),void 0!==o.usage?.prompt_tokens_details?.cached_tokens)return{...e,data:JSON.stringify({...o,usage:{...o.usage,prompt_tokens_details:void 0}})}}catch(t){o.warn("Failed to parse streaming chunk:",e.data.slice(0,200),t)}return e}async function ba(e){let t=!0===e.get("isSelfTest");t||await _r(Z);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return ge.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=hr(e.model);return t.setAttribute("copilot_api.model.normalized",n),n===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),Ae.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}(n)}catch(t){if(t instanceof fr)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}if(gr(n.model))return wa(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),Z.manualApprove&&!t&&await rr(),n=function(e){if(!qo(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!qo(e.max_tokens))return e;let t=(Z.models?.data.find(t=>t.id===e.model))?.capabilities.limits?.max_output_tokens;return o.debug("Set max_tokens to:",JSON.stringify(t)),{...e,max_tokens:t}}(n),n=Sr(n,Z.models),qo(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await ar(e);if(r)return r;let a=performance.now(),i=await Kr(n),s=performance.now()-a;if(Me.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),va(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=ir(i.usage)),t.copilotDuration=s,t.upstreamTtfbMs=s,t.upstreamTotalMs=s,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(i)),e.json(i)}let{events:l,span:c,release:u}=i;return j(e,async t=>{let o={value:null},r=0,i=performance.now(),p=Cr(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(r++,Pe.add(1,{model:n.model,endpoint_type:"openai"}),i=ka(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=ir(t),n.copilotDuration=s,e.set("requestData",n)})),await t.writeSSE(i)}let c=performance.now()-i,u={model:n.model,endpoint_type:"openai"};if(Fe.record(c,u),Ke.record(r,u),Ir(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=ir(o.value),t.copilotDuration=s,e.set("requestData",t))}}catch(o){throw Ve(c,e.get("requestSpan"),o),await br(t,o),o}finally{o.value&&sr(c,o.value),c.end(),u()}let d=e.get("requestId");d&&ue.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const va=e=>Object.hasOwn(e,"choices"),xa=new q;xa.post("/",async e=>{try{return await ba(e)}catch(t){return await io(e,t)}});const Ta=new q;Ta.post("/",async e=>{try{let t=await e.req.json();try{t.model=hr(t.model)}catch(t){if(t instanceof fr)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:t.model});let o=await ar(e);if(o)return o;let n=performance.now(),r=await(async e=>{if(!xo(Z))throw Error("Service token not found");let t=`${bo(Z)}/embeddings`,o=vo(Z),n=Z.timeoutMs,r=new AbortController,a=Lt(r,n),i=JSON.stringify(e);try{let{response:n,span:a}=await et({spanName:"copilot POST /embeddings",url:t,target:"embeddings",method:"POST",headers:o,body:i,signal:r.signal,extraAttributes:{"copilot_api.model":e.model,"copilot_api.input_count":Array.isArray(e.input)?e.input.length:1}});try{if(!n.ok)throw new Ut("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw Ye(a,e),e}finally{a.end()}}finally{clearTimeout(a)}})(t),a=performance.now()-n;Me.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=ir(r.usage),i.copilotDuration=a,e.set("requestData",i),e.json(r)}catch(t){return await io(e,t)}});const $a=new q;let Aa=null,Sa=null;function Ea(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function Oa(e){return!Ea(e)}$a.get("/",async e=>{let t,o=function(){if(wo(Z))return xo(Z)?"valid":"missing";let e=Z.copilotToken;if(!e)return"missing";try{let t=e.split(".");if(t.length<2)return"expired";let o=(t[1]??"").replaceAll("-","+").replaceAll("_","/"),n=JSON.parse(atob(o)),r="object"==typeof n&&n&&"exp"in n&&"number"==typeof n.exp?n.exp:void 0;return void 0!==r&&1e3*r<Date.now()?"expired":"valid"}catch{return"expired"}}(),n=await async function(){let e=Date.now(),t=Aa;return t&&e-t.timestamp<3e4?{result:t.result}:Sa||(Sa=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${bo(Z)}/models`,n=await fetch(t,{method:"GET",headers:vo(Z),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return Aa={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return Aa={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),Sa=null}})(),Sa)}();t="valid"===o&&"reachable"===n.result?"ok":"valid"!==o&&"reachable"!==n.result?"unhealthy":"degraded";let r={status:t,copilot_token:o,upstream:n.result,version:"0.44.0-preview.1",timestamp:(new Date).toISOString()};void 0!==n.latencyMs&&(r.upstream_latency_ms=n.latencyMs);let a="ok"===t?200:503;return e.json(r,a)});const Ca=new F(U),Ia={...H["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function Pa(e){try{return Ca.encode(e,[],[]).length}catch(t){return o.debug("count_tokens: tokenizer failed, using length/4",t),Math.ceil(e.length/4)}}function Ra(e){let t=0;for(let o of e)switch(o.type){case"text":t+=Pa(o.text)*Ia.contentMultiplier;break;case"tool_use":t+=Pa(o.name+JSON.stringify(o.input))*Ia.contentMultiplier;break;case"tool_result":o.content&&(t+=Pa("string"==typeof o.content?o.content:JSON.stringify(o.content))*Ia.contentMultiplier);break;case"thinking":t+=Pa(o.thinking)*Ia.contentMultiplier;break;case"image":t+=1600}return t}function Na(e){let t=0,o=e.properties;if(!o)return t;let n=Object.entries(o);for(let[e,[o,r]]of n.entries()){if(t+=0===e?Ia.perFirstProp:Ia.perAdditionalProp,t+=Pa(o),r.description&&(t+=Ia.perPropDesc+Pa(r.description)),r.enum&&Array.isArray(r.enum)){t+=Ia.perEnum;for(let e of r.enum)t+=Pa(String(e))}if("object"===r.type&&r.properties&&(t+=Ia.perNestedObject,t+=Na(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=Ia.perArrayOfObjects,t+=Na(e))}}return t}function qa(e,t){let o={"copilot_api.context_1m_beta":/context-1m/i.test(t??"")};return e.thinking&&(o["copilot_api.thinking.type"]=e.thinking.type,"budget_tokens"in e.thinking&&e.thinking.budget_tokens&&(o["copilot_api.thinking.budget_tokens"]=e.thinking.budget_tokens)),e.output_config?.effort&&(o["copilot_api.output_config.effort"]=e.output_config.effort),o}function Da(e,t,o){let n=qa(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const ja=async(e,t,n)=>{try{return await Ma(e,t)}catch(r){if(r instanceof Ut&&401===r.response.status)return await uo(),Ma(e,t);if(r instanceof Ut&&400===r.response.status&&n?.onStructuredOutputFallback){let a;try{a=await r.response.clone().text()}catch{a=void 0}let i=n.onStructuredOutputFallback(e,a);if(i)return o.warn(`Upstream rejected structured outputs on ${e.model}; retrying once against ${i.model}`),Ma(i,t)}throw r}};const Ma=async(e,t)=>{if(!xo(Z))throw Error("Service token not found");let{baseUrl:o,headers:n,cleanPayload:r}=wo(Z)&&Z.foundry?{baseUrl:_o(Z.foundry),headers:yo(Z.foundry,t),cleanPayload:e}:function(e,t){let{metadata:o,...n}=e,r=function(e){return e.context_management?["context-management-2025-06-27"]:[]}(n),a={...dt(Z,t,r),"X-Initiator":"agent"};return{baseUrl:ct(Z),headers:a,cleanPayload:n}}(Vn(e),t),a=`${o}/v1/messages`,i=Z.timeoutMs,s=JSON.stringify(r),l=function(e,t,o){return{"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":o,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length||0,"copilot_api.max_tokens":e.max_tokens||0,"copilot_api.api_type":"anthropic_passthrough",...qa(e,t?.anthropicBeta)}}(r,t,i);for(let e=0;e<=1;e++){let t=Hr(o,{fresh:e>0}),c=new AbortController,u=Lt(c,i);try{let{statusCode:o,headers:u,body:p,span:d}=await tt({spanName:"copilot POST /v1/messages",url:a,target:"anthropic_messages",headers:n,body:s,signal:c.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:t}),m=new Response(p,{status:o,headers:u});if(!m.ok)throw d.end(),new Ut("Failed to create anthropic messages",m,{outgoingBody:s,outgoingHeaders:n});if(r.stream)return{events:M(m),span:d,release:()=>Ur(t)};try{let e=await m.json();"string"==typeof e.id&&d.setAttribute("copilot_api.response.id",e.id);let t=e.usage;return t&&sr(d,{prompt_tokens:t.input_tokens??0,completion_tokens:t.output_tokens??0,total_tokens:(t.input_tokens??0)+(t.output_tokens??0)}),e}finally{d.end(),Ur(t)}}catch(o){if(Ur(t),await Ht(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Fa=new Set(["low","medium","high","max","xhigh"]);function Ha(e){let t=e.output_config?.effort;if(!t)return e;let n=Z.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=mr(t,n);if(!r||!Fa.has(r))return e;let a=r;if(a===t)return e;o.debug(`Effort clamp: ${t} → ${a}`);let i=d.getActiveSpan();return i?.setAttribute("copilot_api.effort.requested",t),i?.setAttribute("copilot_api.effort.clamped_to",a),{...e,output_config:{...e.output_config,effort:a}}}function Ua(e,t,n){if("foundry"===Z.provider)return Ha(e);let r=t.includes(e.model)?e.model:pr(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=pr(e,t);if(!n)return null;let r=new Set(t);if(o.context1m){let e=function(e,t){let o=`${e}-1m`;if(t.has(o))return o;let n=`${e}-1m-`;for(let e of t)if(e.startsWith(n))return e;return null}(n,r);if(e)return e}if(o.effort){let e=function(e,t,o){let n=null;if("high"===o?n="high":("max"===o||"xhigh"===o)&&(n="xhigh"),!n)return null;let r=`${e}-${n}`;return t.has(r)?r:null}(n,r,o.effort);if(e)return e}return null}(a.model,t,{context1m:n.context1m,effort:a.output_config?.effort}),s=a;if(i&&i!==a.model){o.debug(`Resolved model variant: ${a.model} → ${i}`);let e=d.getActiveSpan();e?.setAttribute("copilot_api.model.variant_resolved_from",a.model),e?.setAttribute("copilot_api.model.variant_resolved_to",i),s={...a,model:i}}return Ha(s)}function Ba(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function La(e){return e.toLowerCase().startsWith("claude-")}function za(e,t){let o={model:e.model,messages:Ga(e.messages,e.system),max_tokens:e.max_tokens,stop:e.stop_sequences,stream:e.stream,temperature:e.temperature,top_p:e.top_p,user:e.metadata?.user_id,tools:Va(e.tools),tool_choice:Xa(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=$r(t,o.model);if(r){let a="enabled"===n.type&&"number"==typeof n.budget_tokens?n.budget_tokens:function(e,t,o){let n=function(e,t){return"max"===e||"xhigh"===e?t:"high"===e?16e3:"medium"===e?8e3:1024}(e,o.max),r=vr(t),a=r&&r>1?r-1:o.min;return xr(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=Sr({...o,thinking_budget:a},t)}}return o}function Ga(e,t){let o=function(e){return e?"string"==typeof e?[{role:"system",content:Ka(e)}]:[{role:"system",content:Ka(e.map(e=>e.text).join("\n\n"))}]:[]}(t),n=e.flatMap(e=>"user"===e.role?function(e){let t=[];if(Array.isArray(e.content)){let o=e.content.filter(e=>"tool_result"===e.type),n=e.content.filter(e=>"tool_result"!==e.type);for(let e of o)t.push({role:"tool",tool_call_id:e.tool_use_id,content:Ya(e.content)});n.length>0&&t.push({role:"user",content:Ya(n)})}else t.push({role:"user",content:Ya(e.content)});return t}(e):function(e){let t=function(e){return{reasoning_text:Wa(e.reasoning_text),reasoning_opaque:Wa(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:Ya(e.content),...t}];let o=e.content.filter(e=>"tool_use"===e.type),n=e.content.filter(e=>"text"===e.type),r=e.content.filter(e=>"thinking"===e.type),a=[...n.map(e=>e.text),...r.map(e=>e.thinking)].join("\n\n");return o.length>0?[{role:"assistant",content:a||null,...t,tool_calls:o.map(e=>({id:e.id,type:"function",function:{name:e.name,arguments:JSON.stringify(e.input)}}))}]:[{role:"assistant",content:Ya(e.content),...t}]}(e));return[...o,...n]}function Ka(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063-billing-header:[^\n]*\n+/,""):e}const Ja=32768;function Wa(e){if("string"==typeof e)return e.length<=Ja?e:e.slice(0,Ja)}function Ya(e){if("string"==typeof e)return e;if(!Array.isArray(e))return null;if(!e.some(e=>"image"===e.type))return e.filter(e=>"text"===e.type||"thinking"===e.type).map(e=>"text"===e.type?e.text:e.thinking).join("\n\n");let t=[];for(let o of e)switch(o.type){case"text":t.push({type:"text",text:o.text});break;case"thinking":t.push({type:"text",text:o.thinking});break;case"image":t.push({type:"image_url",image_url:{url:`data:${o.source.media_type};base64,${o.source.data}`}})}return t}function Va(e){if(e)return e.filter(Oa).map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function Xa(e){if(e)switch(e.type){case"auto":return"auto";case"any":return"required";case"tool":return e.name?{type:"function",function:{name:e.name}}:void 0;case"none":return"none";default:return}}function Za(e){return"string"==typeof e?[{type:"text",text:e}]:Array.isArray(e)?e.filter(e=>"text"===e.type).map(e=>({type:"text",text:e.text})):[]}function Qa(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function ei(e){return e?e.map(e=>{let t={};try{t=JSON.parse(e.function.arguments)}catch{r.warn(`Failed to parse tool call arguments for "${e.function.name}": ${e.function.arguments.slice(0,200)}`)}return{type:"tool_use",id:e.id,name:e.function.name,input:t}}):[]}const ti=new Set(["low","medium","high","max","xhigh"]);function oi(e,t){let o=e.thinking;if(!o||"enabled"!==o.type)return e;let n=t?.data.find(t=>t.id===e.model);if(!n||!n.capabilities.supports.adaptive_thinking)return e;let r={...e,thinking:{type:"adaptive"}};if(!e.output_config?.effort){let t=(e=>null!==e&&ti.has(e)?e:null)(mr(function(e){return!e||e<=0?"medium":e<8e3?"low":e<24e3?"medium":"high"}(o.budget_tokens),n.capabilities.supports.reasoning_effort));t&&(r.output_config={...e.output_config,effort:t})}return r}function ni(e){return"string"!=typeof e&&Array.isArray(e)?e.map(e=>{let t=e;if(!t.cache_control||"object"!=typeof t.cache_control)return e;let o=t.cache_control;if("string"!=typeof o.type){let{cache_control:e,...o}=t;return o}let n={type:o.type};return void 0!==o.ttl&&(n.ttl=o.ttl),{...t,cache_control:n}}):e}const ri=/[^\w-]/g;function ai(e){return e.replaceAll(ri,"_")}function ii(e,t){let o=function(e,t){if(!e.output_config?.effort)return e;let o=t?.data.find(t=>t.id===e.model);if(!o)return e;let n=o.capabilities.supports.reasoning_effort;if(Array.isArray(n)&&n.length>0)return e;let{effort:r,...a}=e.output_config;if(0===Object.keys(a).length){let{output_config:t,...o}=e;return o}return{...e,output_config:a}}(e,t);return o=oi(o,t),o=function(e,t){let o=e.max_tokens;if("number"!=typeof o)return e;let n=t?.data.find(t=>t.id===e.model);if(!n)return e;let r=n.capabilities.limits;if(!r)return e;let a=(!1===e.stream?r.max_non_streaming_output_tokens:void 0)??r.max_output_tokens;if("number"!=typeof a||a<=0)return e;let i=Math.max(Math.min(o,a),16);return i===o?e:{...e,max_tokens:i}}(o,t),o={...o,system:ni(o.system)},o=function(e){let t=e.messages.map(e=>{if(!Array.isArray(e.content))return e;let t=e.content.map(e=>{let t=e;return"tool_use"===t.type&&"string"==typeof t.id?{...t,id:ai(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:ai(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function si(e){return function(e){let t=e.thinking;if(null==t)return null;if("object"!=typeof t)return"thinking must be an object";let o=t,n=new Set(["enabled","adaptive","disabled"]);return"string"==typeof o.type&&n.has(o.type)?"enabled"!==o.type||void 0===o.budget_tokens||"number"==typeof o.budget_tokens&&Number.isFinite(o.budget_tokens)&&!(o.budget_tokens<=0)&&Number.isInteger(o.budget_tokens)?null:"thinking.budget_tokens must be a positive integer":"thinking.type must be one of: enabled, adaptive, disabled"}(e)??function(e){let t=e.output_config;if(null==t)return null;if("object"!=typeof t)return"output_config must be an object";let o=t;if(void 0===o.effort)return null;let n=new Set(["low","medium","high","max","xhigh"]);return"string"==typeof o.effort&&n.has(o.effort)?null:"output_config.effort must be one of: low, medium, high, max, xhigh"}(e)}function li(e,t,o=400){return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({type:"error",error:{type:"invalid_request_error",message:t}},o)}function ci(e,t){return ge.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),Da(n,t,e.req.header("anthropic-beta"));let r=hr(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=si(t);return a?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:a}},400)}):r===t.model?(n.setAttribute("copilot_api.model.was_mapped",!1),{ok:!0,payload:t}):(n.setAttribute("copilot_api.model.was_mapped",!0),Ae.add(1,{from_model:t.model,to_model:r}),o.debug(`Model mapping: '${t.model}' → '${r}'`),{ok:!0,payload:{...t,model:r}})}catch(t){if(t instanceof fr)return{ok:!1,response:li(e,t.message,t.statusCode)};throw t}finally{n.end()}})}function ui(e,t){let o=function(e){let t=[];for(let o of e)"user"===o.role?t.push(...fi(o)):t.push(...gi(o));return t}(e.messages);if(0===o.length)throw new Ut("request has no translatable message content",Response.json({type:"error",error:{type:"invalid_request_error",message:"request has no translatable message content"}},{status:400}));let n={model:e.model,input:o,max_output_tokens:Math.max(e.max_tokens,16),stream:e.stream,temperature:e.temperature,top_p:e.top_p,store:!1,user:e.metadata?.user_id?.slice(0,64)},r=function(e){return e?function(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063-billing-header:[^\n]*\n+/,""):e}("string"==typeof e?e:e.map(e=>e.text).join("\n\n")):null}(e.system);r&&(n.instructions=r),e.tools?.length&&(n.tools=e.tools.filter(Oa).map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(n.tool_choice=function(e){switch(e.type){case"auto":return"auto";case"any":return"required";case"none":return"none";case"tool":return e.name?{type:"function",name:e.name}:void 0;default:return}}(e.tool_choice));let a=function(e,t){if("adaptive"===e.thinking?.type)return{effort:mi(e.output_config?.effort??"high")};if("enabled"===e.thinking?.type&&e.thinking.budget_tokens){let{effort:o}=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens),n=mr(o,t);return{effort:di(n)?n:o}}}(e,t);return a&&(n.reasoning=a),n}const pi=new Set(["low","medium","high","xhigh"]),di=e=>null!==e&&pi.has(e);function mi(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function fi(e){if("string"==typeof e.content)return[{type:"message",role:"user",content:e.content}];let t=[],o=e.content.filter(e=>"tool_result"===e.type),n=e.content.filter(e=>"tool_result"!==e.type);for(let e of o)t.push(hi(e));if(n.length>0)if(n.some(e=>"image"===e.type)){let e=[];for(let t of n)"text"===t.type?e.push({type:"input_text",text:t.text}):e.push({type:"input_image",image_url:`data:${t.source.media_type};base64,${t.source.data}`,detail:"high"});t.push({type:"message",role:"user",content:e})}else{let e=n.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n");e&&t.push({type:"message",role:"user",content:e})}return t}function hi(e){let t;return t="string"==typeof e.content?e.content:Array.isArray(e.content)?e.content.filter(e=>"text"===e.type).map(e=>e.text).join("\n"):"",e.is_error&&(t=`[ERROR] ${t}`),{type:"function_call_output",call_id:e.tool_use_id,output:t}}function gi(e){if("string"==typeof e.content)return[{type:"message",role:"assistant",content:e.content}];let t=[],o=e.content.filter(e=>"text"===e.type),n=e.content.filter(e=>"thinking"===e.type),r=e.content.filter(e=>"tool_use"===e.type),a=[...o.map(e=>e.text),...n.map(e=>e.thinking)].join("\n\n");a&&t.push({type:"message",role:"assistant",content:a});for(let e of r)t.push({type:"function_call",call_id:e.id,name:e.name,arguments:JSON.stringify(e.input)});return t}function _i(e,t){if(t)return"tool_use";switch(e){case"completed":case"cancelled":case"failed":return"end_turn";case"incomplete":return"max_tokens";default:return null}}function yi(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function wi(e,t,o){e.messageStartSent||=(e.responseId=o?.responseId??e.responseId,e.model=o?.model??e.model,t.push({type:"message_start",message:{id:e.responseId,type:"message",role:"assistant",content:[],model:e.model,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}),!0)}function ki(e,t){let o=[];switch(e.type){case"response.created":wi(t,o,{responseId:e.response.id,model:e.response.model});break;case"response.in_progress":case"response.output_text.done":case"response.function_call_arguments.done":break;case"response.output_item.added":if("function_call"===e.item.type){wi(t,o),yi(t,o);let n=e.item;t.toolCalls[e.output_index]={call_id:n.call_id,name:n.name,anthropicBlockIndex:t.contentBlockIndex},o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"tool_use",id:n.call_id,name:n.name,input:{}}}),t.contentBlockOpen=!0}break;case"response.content_part.added":wi(t,o),yi(t,o),o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),t.contentBlockOpen=!0;break;case"response.output_text.delta":o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:e.delta}});break;case"response.content_part.done":yi(t,o);break;case"response.function_call_arguments.delta":{let n=t.toolCalls[e.output_index];n&&o.push({type:"content_block_delta",index:n.anthropicBlockIndex,delta:{type:"input_json_delta",partial_json:e.delta}});break}case"response.output_item.done":if("function_call"===e.item.type){let n=t.toolCalls[e.output_index];n&&t.contentBlockOpen&&(o.push({type:"content_block_stop",index:n.anthropicBlockIndex}),t.contentBlockIndex++,t.contentBlockOpen=!1)}break;case"response.completed":{yi(t,o);let n=e.response.output.some(e=>"function_call"===e.type),r=e.response.usage;o.push({type:"message_delta",delta:{stop_reason:_i(e.response.status,n),stop_sequence:null},usage:{input_tokens:r?.input_tokens??0,output_tokens:r?.output_tokens??0}},{type:"message_stop"});break}case"response.incomplete":{wi(t,o),yi(t,o);let n=e.response.usage;o.push({type:"message_delta",delta:{stop_reason:"max_tokens",stop_sequence:null},usage:{input_tokens:n?.input_tokens??0,output_tokens:n?.output_tokens??0}},{type:"message_stop"});break}case"response.failed":wi(t,o),yi(t,o),o.push({type:"error",error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}});break;case"response.cancelled":wi(t,o),yi(t,o),o.push({type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{input_tokens:0,output_tokens:0}},{type:"message_stop"});break;case"response.refusal.delta":wi(t,o),t.contentBlockOpen||=(o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),!0),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:e.delta}})}return o}function bi(e,t){e.thinkingBlockOpen||(e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1),t.push({type:"content_block_start",index:e.contentBlockIndex,content_block:{type:"thinking",thinking:""}}),e.thinkingBlockOpen=!0,e.contentBlockOpen=!0)}function vi(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function xi(e,t){let o=[];if(0===e.choices.length)return o;let n=e.choices[0],{delta:r}=n;if(t.messageStartSent||=(o.push({type:"message_start",message:{id:e.id,type:"message",role:"assistant",content:[],model:e.model,stop_reason:null,stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:0}}}),!0),"string"==typeof r.reasoning_text&&""!==r.reasoning_text&&(bi(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"thinking_delta",thinking:r.reasoning_text}})),"string"==typeof r.reasoning_opaque&&""!==r.reasoning_opaque&&(bi(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),vi(t,o)),r.content&&(vi(t,o),function(e){return!!e.contentBlockOpen&&Object.values(e.toolCalls).some(t=>t.anthropicBlockIndex===e.contentBlockIndex)}(t)&&(o.push({type:"content_block_stop",index:t.contentBlockIndex}),t.contentBlockIndex++,t.contentBlockOpen=!1),t.contentBlockOpen||=(o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),!0),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:r.content}})),r.tool_calls){vi(t,o);for(let e of r.tool_calls){if(e.id&&e.function?.name){t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),t.contentBlockIndex++,!1);let n=t.contentBlockIndex;t.toolCalls[e.index]={id:e.id,name:e.function.name,anthropicBlockIndex:n},o.push({type:"content_block_start",index:n,content_block:{type:"tool_use",id:e.id,name:e.function.name,input:{}}}),t.contentBlockOpen=!0}if(e.function?.arguments){let n=t.toolCalls[e.index];n&&o.push({type:"content_block_delta",index:n.anthropicBlockIndex,delta:{type:"input_json_delta",partial_json:e.function.arguments}})}}}return n.finish_reason&&(vi(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:Ba(n.finish_reason),stop_sequence:null},usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}},{type:"message_stop"})),o}const Ti=/structured_outputs|output_config\.format/i;function $i(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&Ti.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?ii({...e,model:cr},o):null}var Ai=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var Si=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const Ei={tavily:async function(e,t,n){let r=function(e,t){let o={query:e,max_results:t?.maxResults??5};return t?.includeDomains?.length&&(o.include_domains=t.includeDomains),t?.excludeDomains?.length&&(o.exclude_domains=t.excludeDomains),o}(t,n);o.debug("Tavily search request:",JSON.stringify(r));let a=new AbortController,i=setTimeout(()=>a.abort(),15e3);try{let{response:t,span:i}=await et({spanName:"tavily POST /search",url:"https://api.tavily.com/search",target:"tavily_search",method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(r),signal:a.signal,extraAttributes:{"tavily.max_results":n?.maxResults??5,"tavily.has_include_domains":!!n?.includeDomains?.length,"tavily.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Tavily API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("tavily.results_count",e.results.length),o.debug(`Tavily returned ${e.results.length} results`),e.results}catch(e){throw Ye(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Si:e}finally{clearTimeout(i)}},exa:async function(e,t,n){let r=function(e,t){let o={query:e,numResults:t?.maxResults??5,contents:{text:!0}};return t?.includeDomains?.length&&(o.includeDomains=t.includeDomains),t?.excludeDomains?.length&&(o.excludeDomains=t.excludeDomains),o}(t,n);o.debug("Exa search request:",JSON.stringify(r));let a=new AbortController,i=setTimeout(()=>a.abort(),15e3);try{let{response:t,span:i}=await et({spanName:"exa POST /search",url:"https://api.exa.ai/search",target:"exa_search",method:"POST",headers:{"Content-Type":"application/json","x-api-key":e},body:JSON.stringify(r),signal:a.signal,extraAttributes:{"exa.max_results":n?.maxResults??5,"exa.has_include_domains":!!n?.includeDomains?.length,"exa.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Exa API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("exa.results_count",e.results.length),o.debug(`Exa returned ${e.results.length} results`),e.results.map(e=>({title:e.title??"",url:e.url,content:e.text??""}))}catch(e){throw Ye(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Ai:e}finally{clearTimeout(i)}}},Oi=["tavily","exa"];function Ci(e){return"tavily"===e||"exa"===e}function Ii(){return Z.webSearchProviders.length>0}async function Pi(e,t){return async function(e,t,n){let{providers:r,searchFns:a=Ei}=n;if(0===r.length)throw Error("No web search provider configured");let i,s=[];for(let[n,l]of r.entries())try{let n=await a[l.name](l.key,e,t);return s.length>0&&o.info(`Web search recovered: served by "${l.name}" after ${s.join(", ")} failed.`),n}catch(e){i=e,s.push(l.name);let t=e instanceof Error?e.message:String(e);n!==r.length-1&&o.warn(`Web search provider "${l.name}" failed (${t}); falling over to "${r[n+1].name}".`)}let l=i instanceof Error?i.message:String(i);throw o.error(`Web search failed: all providers exhausted (${s.join(", ")}). Last error: ${l}`),i instanceof Error?i:Error("All web search providers failed")}(e,t,{providers:Z.webSearchProviders})}function Ri(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function Ni(e,t){let o=[{type:"web_search_tool_result_error",error_code:t.errorCode??"unavailable"}];return{type:"web_search_tool_result",tool_use_id:e,content:t.searchFailed?o:t.results}}async function qi(e,t){let n=function(e){let t,o=e.messages[0];if(!o||"user"!==o.role)return null;if("string"==typeof o.content)t=o.content;else{if(!Array.isArray(o.content))return null;{let e=o.content.find(e=>"text"===e.type);if(!e)return null;t=e.text}}return t.startsWith("Perform a web search for the query: ")?t.slice(36).trim():t.trim()||null}(t);if(!n)return e.set("requestData",{model:t.model,streaming:!1}),e.json({type:"error",error:{type:"invalid_request_error",message:"Could not extract search query from web search request"}},400);let r=function(e){let t=e.tools?.[0];return t&&Ea(t)?{maxResults:"number"==typeof t.max_uses?t.max_uses:5,allowedDomains:t.allowed_domains,blockedDomains:t.blocked_domains}:{maxResults:5}}(t);o.info(`Web search intercepted: "${n}"`);let a,i=[],s=!1;try{if(!Ii())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await Pi(n,{maxResults:Math.min(r.maxResults,10),includeDomains:r.allowedDomains,excludeDomains:r.blockedDomains})).map(e=>({type:"web_search_result",url:e.url,title:e.title,encrypted_content:Buffer.from(e.content).toString("base64"),page_age:null}))}catch(e){o.error("Web search failed:",e),s=!0,a??="unavailable"}let l={query:n,results:i,model:t.model,searchFailed:s,errorCode:a};if(!t.stream)return e.set("requestData",{model:t.model,streaming:!1}),e.json(function(e){let{query:t,model:o}=e,n=`srvtoolu_${Ri()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{...Ni(n,e)}];return{id:`msg_ws_${Ri()}`,type:"message",role:"assistant",model:o,content:r,stop_reason:"end_turn",stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}(l));let c=function(e){let{query:t,model:o}=e,n=`srvtoolu_${Ri()}`,r=`msg_ws_${Ri()}`,a=[];return a.push({type:"message_start",message:{id:r,type:"message",role:"assistant",content:[],model:o,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}},{type:"content_block_start",index:0,content_block:{type:"text",text:""}},{type:"content_block_delta",index:0,delta:{type:"text_delta",text:"I'll search for that."}},{type:"content_block_stop",index:0},{type:"content_block_start",index:1,content_block:{type:"server_tool_use",id:n,name:"web_search",input:{}}},{type:"content_block_delta",index:1,delta:{type:"input_json_delta",partial_json:JSON.stringify({query:t})}},{type:"content_block_stop",index:1},{type:"content_block_start",index:2,content_block:Ni(n,e)},{type:"content_block_stop",index:2},{type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{output_tokens:0}},{type:"message_stop"}),a}(l);return e.set("requestData",{model:t.model,streaming:!0}),j(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const Di=(e,t)=>!(!e||!t||e===t);async function ji(e){if(xo(Z)||await en())return null;let t=Jo();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${Yo()}`}},401)):(d.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({type:"error",error:{type:"service_unavailable",message:"Service token not yet available; retry shortly"}},503))}function Mi(e,t){let o=t.model;return o&&"string"==typeof o?null:li(e,"Model name is required and must be a string")}async function Fi(e){let t=await e.req.json();if(function(e){let t=e.tools;return!(!t||1!==t.length)&&Ea(t[0])}(t))return Mi(e,t)??qi(e,t);await _r(Z),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=Mi(e,t);if(a)return a;t=function(e,t){return Ua(t,Z.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=ci(e,t);if(!i.ok)return i.response;t=i.payload;let s=await ji(e);if(s)return s;if(gr(t.model))return Li(e,t);if(function(e){if("foundry"!==Z.provider)return La(e);let t=Z.models?.data.find(t=>t.id===e);return t?"Anthropic"===t.vendor:La(e)}(t.model))return async function(e,t,o){let n="foundry"===Z.provider,r=n?t:ii(t,Z.models),a={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")},i=r.output_config?.effort;return e.set("requestData",{model:r.model,reasoningEffort:i,effortClamped:Di(o,i),streaming:!!r.stream}),Z.manualApprove&&await rr(),ge.startActiveSpan("copilot_api.anthropic_passthrough",async t=>{t.setAttribute("copilot_api.route","anthropic_passthrough"),t.setAttribute("copilot_api.model",r.model),t.setAttribute("copilot_api.streaming",!!r.stream),Da(t,r,a.anthropicBeta);try{let o=performance.now(),i=await ja(r,a,{onStructuredOutputFallback:(e,o)=>{if(n)return null;let r=$i(e,o,Z.models);return r&&(t.setAttribute("copilot_api.structured_output_fallback",!0),t.setAttribute("copilot_api.structured_output_fallback.model",r.model)),r}}),s=performance.now()-o;if(Me.record(s,{model:r.model,target:"anthropic_messages",streaming:String(!!r.stream)}),!r.stream){let o=i,n=o.usage;if(n){let t={input_tokens:n.input_tokens||0,output_tokens:n.output_tokens||0,cache_read_input_tokens:n.cache_read_input_tokens||0,cache_creation_input_tokens:n.cache_creation_input_tokens||0},o=e.get("requestData")||{};o.tokenUsage=ir(Ui(t)),o.copilotDuration=s,o.upstreamTtfbMs=s,o.upstreamTotalMs=s,e.set("requestData",o)}return t.end(),e.json(o)}let{events:l,span:c,release:u}=i;return j(e,async n=>{let a=0,i=performance.now(),s={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1,d=Cr(e,o);try{try{for await(let e of l)d(),e.data&&"[DONE]"!==e.data?(a++,Pe.add(1,{model:r.model,endpoint_type:"anthropic_messages"}),Bi(e.data,s)&&(p=!0),await n.writeSSE(e)):await n.writeSSE(e);let e=performance.now()-i,t={model:r.model,endpoint_type:"anthropic_messages"};Fe.record(e,t),Ke.record(a,t)}catch(t){throw Ve(c,e.get("requestSpan"),t),await kr(n,t),t}finally{if(Ir(e,o),p){let t=Ui(s);sr(c,t);let o=e.get("requestData")||{};o.tokenUsage=ir(t),e.set("requestData",o)}c.end(),u()}let t=e.get("requestId");t&&ue.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw Ye(t,e),t.end(),e}})}(e,t,r);let l=performance.now(),c=ge.startActiveSpan("copilot_api.translate.anthropic_to_openai",o=>{try{o.setAttribute("copilot_api.translation.direction","anthropic_to_openai"),o.setAttribute("copilot_api.translation.message_count",t.messages.length),o.setAttribute("copilot_api.translation.has_tools",!!t.tools?.length),o.setAttribute("copilot_api.translation.has_system",!!t.system),o.setAttribute("copilot_api.translation.context_1m_beta",/context-1m/i.test(e.req.header("anthropic-beta")??""));let n=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"image"===e.type)),r=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"thinking"===e.type));return o.setAttribute("copilot_api.translation.has_images",n),o.setAttribute("copilot_api.translation.has_thinking",r),za(t,Z.models)}finally{o.end()}});Ue.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=Sr(c,Z.models),o.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:Di(r,u),streaming:!!c.stream});let p=performance.now();Z.manualApprove&&await rr();let d=await Kr(c),m=performance.now()-p;if(Me.record(m,{model:c.model,target:"chat_completions",streaming:String(!!c.stream)}),Hi(d)){let t=e.get("requestData")||{};d.usage&&(t.tokenUsage=ir(d.usage)),t.copilotDuration=m,t.upstreamTtfbMs=m,t.upstreamTotalMs=m,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming response:",JSON.stringify(d).slice(-400));let r=performance.now(),a=ge.startActiveSpan("copilot_api.translate.openai_to_anthropic",e=>{try{e.setAttribute("copilot_api.translation.direction","openai_to_anthropic");let t=function(e){let t=[],o=[],n=[],r=null;r=e.choices[0]?.finish_reason??r;for(let a of e.choices){let e=Qa(a.message),i=Za(a.message.content),s=ei(a.message.tool_calls);t.push(...e),o.push(...i),n.push(...s),("tool_calls"===a.finish_reason||"stop"===r)&&(r=a.finish_reason)}return{id:e.id,type:"message",role:"assistant",model:e.model,content:[...t,...o,...n],stop_reason:Ba(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(d);return e.setAttribute("copilot_api.translation.content_blocks",t.content.length),e.setAttribute("copilot_api.translation.stop_reason",t.stop_reason??"null"),e.setAttribute("copilot_api.translation.has_tool_use",t.content.some(e=>"tool_use"===e.type)),t}finally{e.end()}});return Ue.record(performance.now()-r,{direction:"openai_to_anthropic"}),o.debug("Translated Anthropic response:",a),e.json(a)}o.debug("Streaming response from service");let{events:f,span:h,release:g}=d;return j(e,async t=>{let n=null,r=0,a=performance.now(),i=Cr(e,p),s={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{try{for await(let a of f){if(i(),o.debug("Raw stream event:",a),"[DONE]"===a.data)break;if(!a.data)continue;let l;try{l=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}if(r++,Pe.add(1,{model:c.model,endpoint_type:"anthropic"}),l.usage){n=l.usage;let t=e.get("requestData")||{};t.tokenUsage=ir(n),t.copilotDuration=m,e.set("requestData",t)}let u=xi(l,s);for(let e of u)o.debug("Translated Anthropic event:",e),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let l=performance.now()-a,u={model:c.model,endpoint_type:"anthropic"};if(Fe.record(l,u),Ke.record(r,u),Ir(e,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=ir(n),t.copilotDuration=m,e.set("requestData",t))}}catch(o){throw Ve(h,e.get("requestSpan"),o),await kr(t,o),o}finally{n&&sr(h,n),h.end(),g()}let l=e.get("requestId");l&&ue.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const Hi=e=>Object.hasOwn(e,"choices");function Ui(e){let t=e.input_tokens+e.cache_read_input_tokens+e.cache_creation_input_tokens;return{prompt_tokens:t,completion_tokens:e.output_tokens,total_tokens:t+e.output_tokens,prompt_tokens_details:{cached_tokens:e.cache_read_input_tokens}}}function Bi(e,t){try{let o=JSON.parse(e);if("message_start"===o.type){let e=o.message?.usage;if(e)return t.input_tokens=e.input_tokens||0,t.cache_read_input_tokens=e.cache_read_input_tokens||0,t.cache_creation_input_tokens=e.cache_creation_input_tokens||0,!0}if("message_delta"===o.type){let e=o.usage;if(e)return t.output_tokens=e.output_tokens||0,!0}}catch{}return!1}async function Li(e,t){let r=performance.now(),a=ge.startActiveSpan("copilot_api.translate.anthropic_to_responses",e=>{try{return e.setAttribute("copilot_api.translation.direction","anthropic_to_responses"),e.setAttribute("copilot_api.translation.message_count",t.messages.length),ui(t,Z.models?.data.find(e=>e.id===t.model)?.capabilities.supports.reasoning_effort)}finally{e.end()}});Ue.record(performance.now()-r,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",a),e.set("requestData",{model:a.model,streaming:!!a.stream}),Z.manualApprove&&await rr();let i=performance.now(),s=await Zr(a),l=performance.now()-i;if(Me.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),ea(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=ir({prompt_tokens:s.usage.input_tokens,completion_tokens:s.usage.output_tokens,total_tokens:s.usage.total_tokens})),t.copilotDuration=l,t.upstreamTtfbMs=l,t.upstreamTotalMs=l,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(s).slice(-400)),"failed"===s.status)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:s.error?.code??"api_error",message:s.error?.message??"Response generation failed"}},500);let r=performance.now(),a=ge.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{return e.setAttribute("copilot_api.translation.direction","responses_to_anthropic"),function(e){let t=[],o=!1;for(let n of e.output)if("message"===n.type)for(let e of n.content)"output_text"===e.type&&e.text&&t.push({type:"text",text:e.text});else if("function_call"===n.type){o=!0;let e={};try{e=JSON.parse(n.arguments)}catch{}t.push({type:"tool_use",id:n.call_id,name:n.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:_i(e.status,o),stop_sequence:null,usage:{input_tokens:e.usage?.input_tokens??0,output_tokens:e.usage?.output_tokens??0}}}(s)}finally{e.end()}});return Ue.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(a)}o.debug("Streaming Responses API response");let{events:c,span:u,release:p}=s;return j(e,async t=>{let n=null,r=0,s=performance.now(),d=Cr(e,i),m={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}};try{try{for await(let i of c){if(d(),o.debug("Responses API raw stream event:",i),!i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}r++,Pe.add(1,{model:a.model,endpoint_type:"responses"});let c=ta(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=ir(n),t.copilotDuration=l,e.set("requestData",t)}let u=ki(s,m);for(let e of u)o.debug("Translated Anthropic event:",e),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let u=performance.now()-s,p={model:a.model,endpoint_type:"responses"};Fe.record(u,p),Ke.record(r,p),Ir(e,i)}catch(o){throw Ve(u,e.get("requestSpan"),o),await kr(t,o),o}finally{n&&sr(u,n),u.end(),p()}let f=e.get("requestId");f&&ue.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}const zi=new q;zi.post("/",async e=>{try{return await Fi(e)}catch(t){return await io(e,t)}});const Gi=new q;function Ki(e){return ge.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=hr(e.model);return t.setAttribute("copilot_api.model.normalized",n),n===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),Ae.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}function Ji(e,t){let o=function(e){try{let t=JSON.parse(e);if(("response.completed"===t.type||"response.incomplete"===t.type)&&t.response?.usage){let e=t.response.usage;return{prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens}}}catch{}return null}(e);if(!o)return;t.usageRef.value=o;let n=t.c.get("requestData")||{};n.tokenUsage=ir(o),n.copilotDuration=t.copilotDuration,t.c.set("requestData",n)}Gi.get("/",async e=>{try{Z.models||await Do();let t=Z.models?.data.map(e=>({id:e.id,object:"model",type:"model",created:0,created_at:new Date(0).toISOString(),owned_by:e.vendor,display_name:e.name,context_length:e.capabilities.limits?.max_context_window_tokens}));return e.json({object:"list",data:t,has_more:!1})}catch(t){return await io(e,t)}});const Wi=new Set(["message","function_call","function_call_output"]),Yi=new Set(["type","name","description","parameters"]);async function Vi(e){if(!e)return!1;let t=e.sources;if(t&&t.length>0)return!1;let n=e.query??e.queries?.[0];return!(!n||!Ii())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await Pi(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function Xi(e){if(Ii())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Vi(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function Zi(e){if(!Ii())return e;try{let t=JSON.parse(e);if("response.output_item.done"===t.type){let e=t.item;if("web_search_call"===e?.type&&await Vi(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function Qi(e){switch(e.type){case"custom_tool_call":{let t=e.input;return{type:"function_call",call_id:e.call_id,name:e.name,arguments:JSON.stringify("string"==typeof t?{input:t}:t)}}case"custom_tool_call_output":return{type:"function_call_output",call_id:e.call_id,output:e.output};default:return Wi.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function es(e,t){if("function_call"!==e.type||!t.has(e.name))return!1;if(e.type="custom_tool_call","string"==typeof e.arguments){try{e.input=JSON.parse(e.arguments).input??e.arguments}catch{e.input=e.arguments}delete e.arguments}return!0}function ts(e,t){if(0===t.size)return e;try{let o=JSON.parse(e),n=o.type;if("response.output_item.added"===n||"response.output_item.done"===n){let e=o.item;if(e&&es(e,t))return JSON.stringify(o)}if("response.completed"===n){let n=o.response?.output;if(!n)return e;let r=!1;for(let e of n)es(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function os(e){return null!=e}function ns(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function rs(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function as(e){let t={model:e.model},{input:o,droppedInputTypes:n}=function(e){if(!Array.isArray(e))return{input:e,droppedInputTypes:[]};let t=new Set,o=[];for(let n of e){if(!ns(n)){o.push(n);continue}let e=Qi(n);null===e?t.add(rs(n.type)):o.push(e)}return{input:o,droppedInputTypes:[...t]}}(e.input);void 0!==o&&(t.input=o);for(let o of["previous_response_id","prompt","conversation","instructions","max_output_tokens","temperature","top_p","stream","tool_choice","parallel_tool_calls","user"])os(e[o])&&(t[o]=e[o]);let r=new Set;if(os(e.tools)){let o=function(e){let t=new Set;return{tools:e.filter(e=>{let t=e.type;return"function"===t||"custom"===t||"web_search"===t||t.startsWith("web_search_")}).map(e=>{let o=e.type;if("web_search"===o||o.startsWith("web_search_"))return{type:e.type};let n={};for(let t of Object.keys(e))Yi.has(t)&&(n[t]=e[t]);return"custom"===n.type&&(n.type="function",t.add(n.name),n.parameters||={type:"object",properties:{input:{type:"string",description:"The freeform tool input content"}},required:["input"],additionalProperties:!1}),n}),customToolNames:t}}(e.tools);t.tools=o.tools,r=o.customToolNames}if(os(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},os(o.effort)&&(t.reasoning.effort=o.effort),os(o.summary)&&(t.reasoning.summary=o.summary)}if(os(e.text)&&"object"==typeof e.text){let o=e.text;os(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function is(e,t){return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function ss(e,t,o){let{payload:n,droppedInputTypes:r}=o;if(!Array.isArray(t)||!Array.isArray(n.input))return null;let a=d.getActiveSpan();return a?.setAttribute("copilot_api.responses.input_items_in",t.length),a?.setAttribute("copilot_api.responses.input_items_out",n.input.length),0===t.length||n.input.length>0||os(n.previous_response_id)||os(n.prompt)||os(n.conversation)?null:is(e,`input contains no supported items: every item was dropped (unsupported item types: ${r.join(", ")}). Provide at least one message, function_call or function_call_output item, or previous_response_id, prompt or conversation.`)}async function ls(e){await _r(Z);let t=await e.req.json();if(!ns(t))return is(e,"request body must be a JSON object");let n=as(t),{customToolNames:r}=n,a=n.payload;o.debug(`Responses API [${Array.isArray(a.input)?a.input.length:1} items]`),r.size>0&&o.debug(`Custom tools detected: ${[...r].join(", ")}`);let i=function(e,t){try{return{ok:!0,payload:Ki(t)}}catch(t){if(t instanceof fr)return{ok:!1,response:e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode)};throw t}}(e,a);if(!i.ok)return i.response;a=i.payload;let s=ss(e,t.input,n);if(s)return s;let l=await ar(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),Z.manualApprove&&await rr();let c=performance.now(),u=await Zr(a),p=performance.now()-c;if(Me.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),cs(u))return async function(e,t,o){await Xi(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=ir({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens})),n.copilotDuration=o,n.upstreamTtfbMs=o,n.upstreamTotalMs=o,e.set("requestData",n),e.json(t)}(e,u,p);let{events:d,span:m,release:f}=u;return j(e,async t=>{let o={value:null},n=0,i=performance.now(),s=Cr(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=ts(i.data,r);s=await Zi(s);let l=s===i.data?i:{...i,data:s};Pe.add(1,{model:a.model,endpoint_type:"responses"}),Ji(s,{usageRef:o,c:e,copilotDuration:p}),await t.writeSSE(l)}else await t.writeSSE(i);let l=performance.now()-i,u={model:a.model,endpoint_type:"responses"};Fe.record(l,u),Ke.record(n,u),Ir(e,c)}catch(o){throw Ve(m,e.get("requestSpan"),o),await br(t,o),o}finally{o.value&&sr(m,o.value),m.end(),f()}let l=e.get("requestId");l&&ue.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const cs=e=>Object.hasOwn(e,"output"),us=new q;us.post("/",async e=>{try{return await ls(e)}catch(t){return await io(e,t)}});const ps=new q;ps.get("/",e=>{try{return Z.showToken?e.json({token:Z.copilotToken}):e.json({error:"Token endpoint disabled. Restart with --show-token to enable it.",token:null},403)}catch(t){return o.error("Error fetching token:",t),e.json({error:"Failed to fetch token",token:null},500)}});const ds=new q;ds.get("/",async e=>{try{let t=await _n();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const ms=new q;function fs(){return function(e){let t=e.filter(e=>tr(e));if(0===t.length)return;let o=t.find(e=>er.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(Z.models?.data??[])}function hs(e,t,o){let n=function(e){if(!e)return;try{let t=JSON.parse(e),o=t.error?.message??t.message;if("string"==typeof o&&o.length>0)return Yn(o).slice(0,200)}catch{}let t=Yn(e).trim();return t.length>0?t.slice(0,200):void 0}(t),r=n?` (upstream: ${n})`:"";switch(!0){case 401===e:case 403===e:return`Authentication/entitlement failed (HTTP ${e}). Your GitHub Copilot subscription may be inactive, or the Auth token is invalid. Run \`copilot-api auth\` to re-authenticate; if it persists, this account has no active Copilot access${r}.`;case 402===e:return`Premium monthly quota exhausted (HTTP 402). Switch to a non-premium model (e.g. claude-haiku-4.5) or wait for the monthly quota reset${r}.`;case 400===e:return`Model '${o}' was rejected (HTTP 400). On individual plans only some models are entitled — try claude-haiku-4.5, or run \`copilot-api doctor\` to see what works${r}.`;case 413===e:return`Request too large (HTTP 413)${r}.`;case 429===e:return`Rate limited upstream (HTTP 429) — wait and retry${r}.`;case 503===e:return`Service not ready (HTTP 503) — the model catalog or Service token is still warming up. Retry in a few seconds${r}.`;case e>=500:return`Upstream error (HTTP ${e})${r}.`;default:return`Unexpected response (HTTP ${e})${r}.`}}async function gs(e={}){let t=performance.now(),o=e.model&&function(e){let t=Z.models?.data.find(t=>t.id===e);return void 0!==t&&tr(t)}(e.model)?e.model:fs();if(!o)return{ok:!1,durationMs:0,reason:"No models available — the catalog is empty (upstream /models failed at startup). Check connectivity and authentication."};let n,r=e.timeoutMs??3e4,a=()=>Math.round(performance.now()-t),i=(async()=>{try{let e=await ms.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[Zn]:Qn},body:JSON.stringify({model:o,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1})});if(e.ok)return{ok:!0,model:o,status:e.status,durationMs:a()};let t=await e.text().catch(()=>"");return{ok:!1,model:o,status:e.status,durationMs:a(),reason:hs(e.status,t,o),detail:t.slice(0,400)||void 0}}catch(e){let t=e instanceof Error?e.message:String(e);return{ok:!1,model:o,durationMs:a(),reason:`Request failed before a usable response: ${t}`,detail:t}}})(),s=new Promise(e=>{n=setTimeout(()=>{e({ok:!1,model:o,durationMs:a(),reason:`Did not complete within ${r}ms. If you started with --manual, approve the request or use --no-smoke-test; otherwise the upstream may be slow or unreachable.`})},r)});try{return await Promise.race([i,s])}finally{n&&clearTimeout(n)}}ms.use(async(e,t)=>{let n=performance.now(),r=`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`,a=e.req.method,i=e.req.path,s=yt(i),p=function(e){return e===Qn}(e.req.header(Zn));e.set("requestId",r),e.set("isSelfTest",p),e.header("x-request-id",r);let m=ge.startSpan("copilot_api.handle_request",{kind:l.SERVER,attributes:{"http.method":a,"http.url":e.req.url,"http.route":i,"copilot_api.request_id":r,"copilot_api.endpoint_type":s}});e.set("requestSpan",m),e.set("requestTraceContext",m.spanContext()),p&&m.setAttribute("copilot_api.self_test",!0);for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();Ze.has(e)||"x-copilot-api-self-test"!==e&&m.setAttribute(`http.request.header.${e}`,o)}await async function(e,t){let{method:n,path:r,endpointType:a}=t;if("POST"===n&&("anthropic"===a||"openai"===a||"embeddings"===a||r.includes("/responses")))try{let t=await e.req.raw.clone().text();e.set("rawBody",t.length>nr?t.slice(0,nr):t)}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:a,path:i,endpointType:s});let f,h=new Promise(e=>{f=e});e.set("streamComplete",h),e.set("resolveStreamComplete",f);let g=d.setSpan(u.active(),m);await u.with(g,async()=>{p||ue.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw m.setStatus({code:c.ERROR,message:t.message}),m.recordException(t),e}});let _=e.get("requestData"),y={c:e,start:n,method:a,path:i,endpointType:s,requestId:r,span:m};_?.streaming&&e.res.status<400?h.then(()=>or(y)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{m.recordException(t),m.setStatus({code:c.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{m.end()}catch{}}):or(y)}),ms.use(D()),ms.use(async(e,t)=>{let o=e.req.header("content-length");if(o){let t=Number(o);if(Number.isFinite(t)&&t>33554432)return r.warn(`Rejected oversized request: ${t} bytes on ${e.req.path} (UA: ${e.req.header("user-agent")??"unknown"})`),e.json({type:"error",error:{type:"request_too_large",message:`Request body exceeds 32 MB limit (got ${t} bytes).`}},413)}await t()}),ms.get("/",e=>e.text("Server running")),ms.route("/health",$a),ms.route("/chat/completions",xa),ms.route("/models",Gi),ms.route("/embeddings",Ta),ms.route("/usage",ds),ms.route("/token",ps),ms.route("/v1/chat/completions",xa),ms.route("/v1/models",Gi),ms.route("/v1/embeddings",Ta),ms.route("/v1/messages",zi),ms.post("/v1/messages/count_tokens",async function(e){let t;try{t=await e.req.json()}catch{return e.json({error:{type:"invalid_request_error",message:"Invalid JSON"}},400)}if(!Array.isArray(t.messages))return e.json({error:{type:"invalid_request_error",message:"messages is required"}},400);let o=Ia.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=Ia.perMessage+Pa(e)*Ia.contentMultiplier}for(let e of t.messages)o+=Ia.perMessage,o+=Pa(e.role),"string"==typeof e.content?o+=Pa(e.content)*Ia.contentMultiplier:Array.isArray(e.content)&&(o+=Ra(e.content));let n=t.tools?.filter(Oa);return n&&n.length>0&&(o+=function(e){let t=Ia.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=Ia.perTool),t+=Pa(n.name),n.description&&(t+=Ia.perDesc+Pa(n.description)),t+=Na(n.input_schema);return t}(n)),e.json({input_tokens:Math.round(o)})}),ms.route("/v1/responses",us),ms.route("/responses",us),ms.onError((e,t)=>io(t,e));const _s=e=>`[1m${e}[0m`,ys=e=>`[2m${e}[0m`,ws=e=>`[32m${e}[0m`,ks=e=>`[31m${e}[0m`,bs=e=>`[33m${e}[0m`,vs=ys(" ─────────────────────────────────────────────────────────────");function xs(e,t,o){console.log(` ${function(e){return"ok"===e?ws("✓"):"warn"===e?bs("⚠"):ks("✗")}(e)} ${_s(t.padEnd(14))} ${o}`)}function Ts(e){console.log(` ${ys("↳")} ${ys(e)}`)}function $s(e){return e instanceof Ut?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function As(){let e=g.env.GH_TOKEN;if(e&&e.trim().length>0)return{token:e.trim(),source:"GH_TOKEN env"};let t=await async function(){try{let e=(await a.readFile(W.GITHUB_TOKEN_PATH,"utf8")).trim();return e.length>0?e:void 0}catch{return}}();return t?{token:t,source:"stored file"}:void 0}async function Ss(){try{await Do();let e=(Z.models?.data.length??0)>0;return xs(e?"ok":"warn","Model catalog",e?function(){let e=Z.models?.data??[],t={Claude:0,OpenAI:0,Gemini:0,Embedding:0};for(let o of e)o.id.startsWith("text-embedding")?t.Embedding++:"Anthropic"===o.vendor?t.Claude++:"Google"===o.vendor?t.Gemini++:t.OpenAI++;let o=Object.entries(t).filter(([,e])=>e>0).map(([e,t])=>`${e}: ${t}`);return`${e.length} models (${o.join(", ")})`}():"empty"),e}catch(e){return xs("fail","Model catalog",$s(e)),Ts("Could not fetch /models — check connectivity/auth."),!1}}async function Es(e){Z.accountType=e.accountType;let t=await Et(),o=Ot();if(console.log(""),console.log(` ${_s("COPILOT-API DOCTOR")} ${ys(`v${t}`)}`),console.log(vs),xs("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await Y(),jo(),!await async function(){let e=await As();if(!e)return xs("fail","Auth token","not found"),void Ts("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");Z.githubToken=e.token,xs("ok","Auth token",`found (${e.source})`);try{let e=await lo();return await lt(Z,e.login),xs("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return xs("fail","GitHub auth",$s(e)),void Ts("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(vs),console.log(` ${ks("✗")} ${_s("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await so();return Z.copilotToken=e,xs("ok","Service token","acquired"),!0}catch(e){let t=e instanceof Ut?e.response.status:0;return xs("fail","Service token",$s(e)),Ts(401===t?"Auth token is invalid/expired — run `copilot-api auth`.":403===t?"No active GitHub Copilot subscription on this account. Re-auth won't help.":"Transient/network issue — check connectivity and retry."),!1}}(),r=!!n&&await Ss();await async function(){try{let e=await _n(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${pn(dn(t))} of ${pn(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;xs("ok","Copilot plan",`${e.copilot_plan} · ${o} `+ys(`(resets ${e.quota_reset_date})`))}catch(e){xs("warn","Copilot plan",`unavailable (${$s(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await gs();return e.ok?(xs("ok","Generation",`works via ${e.model} ${ys(`(${e.durationMs}ms)`)}`),!0):(xs("fail","Generation",`${e.reason}${e.status?ys(` [HTTP ${e.status}]`):""}`),!1)}():xs("warn","Generation","skipped (no token or empty catalog)"),function(){let e=[],t="ok";for(let o of["ANTHROPIC_BASE_URL","OPENAI_BASE_URL"]){let n=g.env[o];n&&("ANTHROPIC_BASE_URL"===o&&/\/v1\/*$/.test(n)&&(t="warn",e.push(`${o}=${n} ends in /v1 — Claude Code appends /v1/messages, producing a doubled /v1/v1/... path (404). Drop the trailing /v1.`)),/\/v1\/v1(?:\/|$)/.test(n)&&(t="warn",e.push(`${o}=${n} contains a doubled /v1/v1 path (404).`)))}if(e.length>0){xs(t,"Client config","potential base-URL issue");for(let t of e)Ts(t)}else xs("ok","Client config","no base-URL issues detected");Ts("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(vs),a?(console.log(` ${ws("✓")} ${_s("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${bs("⚠")} ${_s("Some checks need attention")} — see the ${ks("✗")}/${bs("⚠")} lines above.`),console.log(""),2)}const Os=e({meta:{name:"doctor",description:"Diagnose your setup end-to-end: token, auth, entitlement, model catalog, and one real generation. Tells you exactly what's wrong and how to fix it."},args:{"account-type":{alias:"a",type:"string",default:"individual",description:"Account type to check against (individual, business, enterprise)"}},async run({args:e}){let t=await Es({accountType:e["account-type"]});g.exit(t)}});function Cs(e){return{log(t,r){let a=o.level>=n.debug;if(t.level!==n.warn||a)for(let o of e)o.log(t,r)}}}let Is=!1;const Ps="copilot-api-node20",Rs=`https://registry.npmjs.org/${Ps}/latest`,Ns=e=>`[1m${e}[0m`,qs=e=>`[33m${e}[0m`;async function Ds(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(Rs,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function js(e,t){let o=Math.max(0,t-function(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,"").length}(e));return e+" ".repeat(o)}let Ms,Fs;async function Hs(e){try{let[t,o]=await Promise.all([Et(),Ds(e)]);return"unknown"!==t&&o&&function(e,t){let o=e.split(".").map(Number),n=t.split(".").map(Number),r=Math.max(o.length,n.length);for(let e=0;e<r;e++){let t=o[e]??0,r=n[e]??0;if(t<r)return!0;if(t>r)return!1}return!1}(t,o)?{current:t,latest:o}:null}catch{return null}}function Us(){if(!Ms||!Fs)return;let{signal:e}=Fs;Ms.then(t=>{t&&!e.aborted&&function(e,t){let o=`npx ${Ps}@latest`,n=qs("│"),r=` ${Ns("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${Ns(o)} to update`,i=" ".repeat(54),s=qs(`╭${"─".repeat(54)}╮`),l=qs(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${js(r,54)}${n}`,`${n}${i}${n}`,`${n}${js(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var Bs={posts:[{title:"I Almost Bought an AI Code Reviewer. Then I Did the Math.",teaser:"100+ repos. Every PR reviewed by AI. Under $1K a month.",url:"https://barazany.dev/blog/claude-code-pr-reviewer",date:"2026-06-09"},{title:"I Had Claude Mine 30 Days of My Own Messages. What It Found Was Uncomfortably Accurate.",teaser:"I had Claude read a month of my messages. It nailed me.",url:"https://barazany.dev/blog/mining-claude-history-ultracode",date:"2026-06-05"},{title:"The 5-Hour Quota, Boris's Tweet, and What the Source Code Actually Reveals",teaser:"Claude Code's caching story — decoded from the source.",url:"https://barazany.dev/blog/claude-code-token-caching",date:"2026-04-01"}]};const Ls=262144,zs="https://barazany.dev",Gs=/^[a-z0-9][a-z0-9-]*$/i,Ks=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function Js(e,t){if("string"!=typeof e)return"";let o=e.replaceAll(Ks," ").replaceAll(/\s+/g," ").trim(),n=Array.from(o);return n.length<=t?o:`${n.slice(0,t-1).join("").trimEnd()}…`}function Ws(e){if("object"!=typeof e||!e)return null;let t=e,o=Js(t.title,100),n=Js(t.teaser??t.excerpt??t.description,120),r=function(e){if("string"!=typeof e||e.length>2048)return null;let t;try{t=new URL(e)}catch{return null}if(t.origin!==zs||t.username||t.password)return null;let o=t.href;return/^[\x21-\x7E]+$/.test(o)?o:null}(t.url);if(null===r&&void 0===t.url&&"string"==typeof t.slug&&Gs.test(t.slug)&&(r=`${zs}/blog/${t.slug}`),!o||!n||null===r)return null;let a=function(e){if("string"==typeof e&&/^\d{4}-\d{2}-\d{2}/.test(e))return Number.isFinite(Date.parse(e))?e.slice(0,10):void 0}(t.date);return a?{title:o,teaser:n,url:r,date:a}:{title:o,teaser:n,url:r}}function Ys(e){let t=e;if(!Array.isArray(e)&&"object"==typeof e&&e&&(t=e.posts),!Array.isArray(t))return[];let o=[];for(let e of t){let t=Ws(e);t&&o.push(t)}let n=e=>e.date?Date.parse(e.date):-1/0;return o.sort((e,t)=>n(t)-n(e)).slice(0,3)}let Vs=null;function Xs(e){return s.join(e,"blog-posts.json")}function Zs(e=W.APP_DIR){try{if(Vs&&Vs.length>0)return Vs;let t=function(e){try{let t=Xs(e);return B.statSync(t).size>Ls?[]:Ys(JSON.parse(B.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:Ys(Bs)}catch{return[]}}function Qs(e){return e>-6e4&&e<864e5}async function el(e){let t=new AbortController,o=setTimeout(()=>t.abort(),e);"object"==typeof o&&"unref"in o&&o.unref();try{let e=await fetch("https://barazany.dev/posts.json",{signal:t.signal,headers:{accept:"application/json"}});if(!e.ok)return await(e.body?.cancel().catch(()=>{})),[];let o=await async function(e,t){let o=Number(e.headers.get("content-length"));if(Number.isFinite(o)&&o>Ls)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>Ls?null:t}let n=e.body.getReader(),r=()=>{n.cancel().catch(()=>{})};t.addEventListener("abort",r,{once:!0});let a=[],i=0;try{for(;;){let{done:e,value:t}=await n.read();if(e)break;if(i+=t.byteLength,i>Ls)return await n.cancel().catch(()=>{}),null;a.push(t)}}finally{t.removeEventListener("abort",r)}return t.aborted?null:Buffer.concat(a).toString("utf8")}(e,t.signal);return null===o?[]:Ys(JSON.parse(o))}finally{clearTimeout(o)}}async function tl(e={}){try{if("1"===g.env.COPILOT_API_NO_BLOG||"1"===g.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let t=e.dir??W.APP_DIR,o=e.now??Date.now();if(await async function(e,t){try{let o=Xs(e),n=await B.promises.stat(o);if(n.size<=Ls){let e=await B.promises.readFile(o),n=JSON.parse(e.toString("utf8"));if("number"==typeof n.fetchedAt)return Qs(t-n.fetchedAt)}return Qs(t-n.mtimeMs)}catch{return!1}}(t,o))return;let n=await el(e.timeoutMs??3e3);if(0===n.length)return;Vs=n,await async function(e,t,o){let n=Xs(e),r=`${n}.${g.pid}.tmp`;try{await B.promises.writeFile(r,`${JSON.stringify({fetchedAt:o,posts:t})}\n`),await B.promises.rename(r,n)}catch(e){throw await B.promises.rm(r,{force:!0}).catch(()=>{}),e}}(t,n,o)}catch(e){o.debug("Blog posts refresh skipped:",e)}}async function ol(e){if("foundry"===e.provider)return Z.foundry=function(e){let t=e.FOUNDRY_ENDPOINT,o=e.FOUNDRY_API_KEY?.trim();if(!t?.trim())throw Error("--provider foundry requires FOUNDRY_ENDPOINT (e.g. https://<resource>.openai.azure.com)");if(!o)throw Error("--provider foundry requires FOUNDRY_API_KEY");let n=po(t),r=e.FOUNDRY_ANTHROPIC_ENDPOINT?.trim();return{endpoint:n,anthropicEndpoint:r?po(r,"FOUNDRY_ANTHROPIC_ENDPOINT"):fo(n),apiKey:o,deployments:ho(e.FOUNDRY_DEPLOYMENTS)}}(process.env),Z.connectivity.h2=!1,Z.connectivity.h2Keepalive=!1,o.info(`Using Microsoft Foundry upstream: ${Z.foundry.endpoint}`),{login:"foundry"};e.githubToken&&o.warn("Passing the Auth token via --github-token / -g exposes it to other processes on this host (visible in ps/proc). Prefer the GH_TOKEN environment variable instead.");let t,n=e.githubToken||process.env.GH_TOKEN;n?(function(e){Z.githubToken=e,Ko=!1}(n),o.info("Using provided Auth token")):await on();try{t=await lo(),await lt(Z,t.login)}catch(e){throw o.error("Failed to get user info for machine ID generation:",e),Error("Cannot proceed without user information",{cause:e})}return await(async()=>{let{token:e,refresh_in:t}=await so();Z.copilotToken=e,o.debug("Service token fetched successfully!"),Z.showToken&&o.info("Service token:",e),Go=!0,tn(t),ot.start(),Uo=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Qo(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},Bo=()=>{o.debug("Network connectivity lost")},ot.on("online",Uo),ot.on("offline",Bo)})(),t}function nl(e,t=""){let o,n=function(){let{platform:e,ppid:t,env:o}=g;if("win32"===e){try{if(h(`wmic process get ParentProcessId,Name | findstr "${t}"`,{stdio:"pipe"}).toString().toLowerCase().includes("powershell.exe"))return"powershell"}catch{return"cmd"}return"cmd"}{let e=o.SHELL;if(e){if(e.endsWith("zsh"))return"zsh";if(e.endsWith("fish"))return"fish";if(e.endsWith("bash"))return"bash"}return"sh"}}(),r=Object.entries(e).filter(([,e])=>void 0!==e);switch(n){case"powershell":o=r.map(([e,t])=>`$env:${e} = ${t}`).join("; ");break;case"cmd":o=r.map(([e,t])=>`set ${e}=${t}`).join(" & ");break;case"fish":o=r.map(([e,t])=>`set -gx ${e} ${t}`).join("; ");break;default:{let e=r.map(([e,t])=>`${e}=${t}`).join(" ");o=r.length>0?`export ${e}`:"";break}}return o&&t?`${o}${"cmd"===n?" & ":" && "}${t}`:o||t}const rl=e=>`[1m${e}[0m`,al=e=>`[2m${e}[0m`,il=e=>`[36m${e}[0m`,sl=e=>`[32m${e}[0m`,ll=e=>`[33m${e}[0m`,cl=e=>`[4m${e}[0m`,ul=(e,t)=>`]8;;${e}\\${t}]8;;\\`,pl="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",dl="https://github.com/johnib/copilot-api-issues/issues",ml=al(" ─────────────────────────────────────────────────────────────");function fl(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function hl(e){return e&&0!==e.length?e.join("·"):"—"}function gl(e){if(0===e.length)return[];let t=["",ml,` ${rl("BARAZANY.DEV")} ${al("— Recent Posts")}`,ml,""];for(let[o,n]of e.entries()){let e=`${n.url}${pl}`,r=ul(e,rl(cl(`[${o+1}]`)));t.push(` ${r} ${il(n.title)}`,` ${al("→")} ${al(n.teaser)}`,"")}return t.push(ml,` ${ul(`https://barazany.dev/blog${pl}`,"barazany.dev/blog")}`,ml),t}function _l(e){let t=[];Z.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):Z.connectivity.h2&&t.push("HTTP/2"),t.push(`timeout ${e.timeout/1e3}s`);let o=e.webSearchProviders.length>0?`${e.webSearchProviders.map(e=>(e=>e&&e[0].toUpperCase()+e.slice(1))(e)).join(al(" → "))} ${sl("✓")}`:al("off"),n=["",` ${rl("COPILOT-API")} ${al(`v${e.version}`)}`,ml,` ${al("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${al("User")} ${e.user} ${al("·")} ${e.accountType}`];return Z.vsCodeVersion&&n.push(` ${al("Client")} VSCode ${Z._v1}`),n.push(` ${al("Network")} ${t.join(al(" · "))}`,` ${al("Search")} ${o}`),e.clipboardCopied&&n.push(` ${al("Clipboard")} Claude Code command ${sl("✓")}`),n.push(ml),n}function yl(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${rl("Active")}`];if(e.model){let o=Z.models?.data.find(t=>t.id===e.model),n=fl(o?.capabilities.limits?.max_context_window_tokens),r=hl(o?.capabilities.supports.reasoning_effort);t.push(` ${il(e.model.padEnd(32))} ${al("ctx")} ${rl(n.padStart(5))} ${al("effort")} ${al(r)} ${ll("← main")}`)}if(e.smallModel){let o=Z.models?.data.find(t=>t.id===e.smallModel),n=fl(o?.capabilities.limits?.max_context_window_tokens),r=hl(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${al("ctx")} ${n.padStart(5)} ${al("effort")} ${al(r)} ${ll("← small")}`)}return t}function wl(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of Z.models?.data??[]){let a=r.capabilities.limits?.max_context_window_tokens,i={id:r.id,ctx:a,effort:r.capabilities.supports.reasoning_effort};r.id.startsWith("text-embedding")?n.push(i):"Anthropic"===r.vendor?e.push(i):"Google"===r.vendor?o.push(i):t.push(i)}return[["Claude",e],["OpenAI",t],["Gemini",o],["Embedding",n]]}())if(0!==n.length){t.push("",` ${rl(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?il("●"):al("·"),i=n?il(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?fl(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${hl(r.effort)}`;t.push(` ${a} ${i} ${al(s)}${al(l)}`)}}return t}function kl(){let e=dl.replace(/^https:\/\//,""),t=ul(`${dl}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",ml,` ${rl("FOUND A BUG?")} ${al("— Report it on GitHub")}`,ml,"",` ${il("→")} ${il(t)}`,` ${al("Bug reports, feature requests, and questions welcome.")}`,"",ml]}function bl(e){if(!e.endpoints)return[];let{scheme:t,port:o,hostname:n}=e.endpoints,r=n?`${t}://${n}:${o}`:`${t}://<your-tailscale-hostname>:${o}`,a=["",ml,` ${rl("Claude Cowork")} ${al("— Settings → Inference Provider")}`,ml,"",` ${al("Paste into")} ${rl("inferenceGatewayBaseUrl")}${al(":")}`,` ${rl(il(r))}`];return n||a.push("",` ${al("Your Tailscale hostname is shown by:")} ${il("tailscale status --self")}`),a.push("",` ${al("Docs:")} ${il("https://claude.com/docs/cowork/3p/installation")}`),a}function vl(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",ml,` ${rl("HTTPS")} ${al("— self-signed cert")}`,ml,"",` ${al("Cert")} ${t}`];switch(o.push("",` ${rl("Trust this cert")} ${al("(one-time setup)")}`),g.platform){case"darwin":o.push(` ${al("macOS:")}`,` ${il("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${il(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${al("Windows (PowerShell as Administrator):")}`,` ${il(`Import-Certificate -FilePath "${t}" \``)}`,` ${il("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${al("Linux (Debian/Ubuntu):")}`,` ${il(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${il("sudo update-ca-certificates")}`,` ${al("Linux (Fedora/RHEL/Arch):")}`,` ${il(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${il("sudo update-ca-trust")}`);break;default:o.push(` ${al("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${al("Or, for Node CLIs only (no admin needed):")}`,` ${il(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,ml),o}function xl(e){let t=Math.floor(e/1e3),o=Math.floor(t/3600),n=Math.floor(t%3600/60);return o>0?`${o}h ${n}m`:n>0?`${n}m`:`${t}s`}const Tl=s.join(W.APP_DIR,"certs"),$l=s.join(Tl,"cert.pem"),Al=s.join(Tl,"key.pem"),Sl=s.join(Tl,"cert.meta.json");async function El(e){try{return await a.readFile(e,"utf8")}catch{return}}async function Ol(e){let t=await El($l),o=await El(Al),n=await async function(){let e=await El(Sl);if(e)try{let t=JSON.parse(e);return Array.isArray(t.hosts)&&"string"==typeof t.notAfter?t:void 0}catch{return}}();if(!t||!o||!n)return!1;let r=new Set(n.hosts);for(let t of e)if(!r.has(t))return!1;let a=Date.parse(n.notAfter);return!Number.isNaN(a)&&a-Date.now()>2592e6}function Cl(e){return 0!==G(e)}async function Il(e){await a.mkdir(Tl,{recursive:!0});let t=new Date,o=new Date;o.setDate(o.getDate()+825);let n=["127.0.0.1","::1"],r=new Set(["localhost"]),i=new Set(n);for(let t of e)Cl(t)?i.add(t):r.add(t);let s=[...[...r].map(e=>({type:2,value:e})),...[...i].map(e=>({type:7,ip:e}))],l=await K([{name:"commonName",value:"localhost"},{name:"organizationName",value:"copilot-api"}],{keyType:"ec",curve:"P-256",algorithm:"sha256",notBeforeDate:t,notAfterDate:o,extensions:[{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0,critical:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:s}]});return await a.writeFile($l,l.cert,{mode:420}),await a.writeFile(Al,l.private,{mode:384}),await async function(e){await a.writeFile(Sl,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:$l,keyPath:Al,generated:!0}}const Pl=[],Rl=Date.now();let Nl="";function ql(){let e=async(e,t=0)=>{let n=ge.startSpan("copilot_api.server.shutdown",{kind:l.INTERNAL,attributes:{"copilot_api.shutdown.reason":e,"copilot_api.shutdown.exit_code":t,"copilot_api.uptime_seconds":(Date.now()-Rl)/1e3}});for(let t of Pl)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=ul("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",ml,` ${rl("COPILOT-API")} ${al(`v${e}`)} ${al("·")} ${xl(t)} uptime`,ml,""," Check in from time to time on",` ${il(o)}`,"",ml,""];console.log(n.join("\n"))}(Nl,Date.now()-Rl),g.exit(t)};g.on("SIGINT",()=>e("SIGINT")),g.on("SIGTERM",()=>e("SIGTERM")),g.on("uncaughtException",t=>{o.error("Uncaught exception:",t),e("uncaughtException",1)}),g.on("unhandledRejection",(t,n)=>{o.error("Unhandled promise rejection at:",n,"reason:",t),e("unhandledRejection",1)})}const Dl=e=>e.filter(e=>"embeddings"!==e.capabilities.type).map(e=>e.id),jl=e=>e.filter(e=>"embeddings"!==e.capabilities.type&&(e.supported_endpoints?.includes("/responses")??!0)).map(e=>e.id);async function Ml(e,t,n){if(!e.claudeCode)return!1;Z.models||(o.error("Cannot apply --claude-code defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --claude-code."),g.exit(1));let r,a,i=function(e,t,n){if(e&&t){if(!n.includes(e))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid model: ${e}`);if(!n.includes(t))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid small model: ${t}`);return{model:e,smallModel:t}}if(e||t)throw Error("Both --model and --small-model must be specified for model selection")}(e.model,e.smallModel,Dl(Z.models.data));i?(r=i.model,a=i.smallModel):(r=await o.prompt("Select a model to use",{type:"select",options:Dl(Z.models.data)}),a=await o.prompt("Select a small model to use",{type:"select",options:Dl(Z.models.data)}));let s=nl({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:"dummy",ANTHROPIC_MODEL:r,ANTHROPIC_SMALL_FAST_MODEL:a,NODE_EXTRA_CA_CERTS:n?.certPath},"claude");try{return m.writeSync(s),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(s),!1}}function Fl(e){return e.githubToken?"cli_arg":g.env.GH_TOKEN?"env_var":"stored"}function Hl(e){let{options:t,version:o,runtime:n,githubUser:r}=e,a=ge.startSpan("copilot_api.server.startup",{kind:l.INTERNAL,attributes:Xe({config:{version:o,port:t.port,accountType:t.accountType,verbose:t.verbose,manualApprove:t.manual,rateLimitSeconds:t.rateLimit??0,rateLimitWait:t.rateLimitWait,timeoutMs:t.timeout,showToken:t.showToken,claudeCode:t.claudeCode,model:t.model,smallModel:t.smallModel,githubTokenSource:Fl(t)},runtime:n,identity:{githubUser:r.login,machineId:Z.machineId,sessionId:Z.sessionId,vsCodeVersion:Z.vsCodeVersion},connectivity:Z.connectivity,modelsCount:Z.models?.data.length??0,startupDurationMs:Date.now()-Rl},"copilot_api")});if(Z.models?.data)for(let e of Z.models.data)a.addEvent("copilot_api.model.available",Xe(e,"model"));a.end(),We(_.INFO,"INFO","Server started",Xe({version:o,port:t.port,accountType:t.accountType,githubUser:r.login,modelsCount:Z.models?.data.length??0,startupDurationMs:Date.now()-Rl},"copilot_api"))}async function Ul(e){if(e.https){if(e.httpsCert&&e.httpsKey)return async function(e,t){let[o,n]=await Promise.all([a.readFile(e,"utf8"),a.readFile(t,"utf8")]);return{cert:o,key:n,certPath:e,keyPath:t,generated:!1}}(e.httpsCert,e.httpsKey);if(e.httpsCert||e.httpsKey)throw Error("Both --https-cert and --https-key must be provided together");return async function(e=[]){if(await Ol(e)){let e=await El($l),t=await El(Al);if(e&&t)return{cert:e,key:t,certPath:$l,keyPath:Al,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),Il(e)}(e.httpsHosts)}}async function Bl(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=Mn;try{L(t),L(n)}catch{throw o.error("Tailscale cert not found. Run `copilot-api cowork-setup install` first."),Error("Tailscale cert not found")}return{...e,https:!0,httpsCert:t,httpsKey:n}}(e);if(ql(),Pl.push(()=>{o.debug("Cleaning up connectivity monitor"),ot.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),Go=!1,Fo&&=void clearInterval(Fo),Uo&&=void ot.off("online",Uo),Bo&&=void ot.off("offline",Bo),Ho=void 0,Lo=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),Dr&&=void clearInterval(Dr),jr&&=void clearInterval(jr);let e=[...Rr.keys(),...Nr];Rr.clear(),Nr.clear(),Pr.clear(),qr=void 0;for(let t of e)Mr(t)&&(qe.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await async function(){if(!pe)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([pe.shutdown(),t])&&o.warn("OTel SDK shutdown timed out after 5000ms; continuing exit")}catch(e){o.warn("OTel SDK shutdown failed; continuing exit",e)}}()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t.claudeCode&&t.codex)throw Error("Cannot use --claude-code and --codex together");Z.provider=t.provider,Z.accountType=t.accountType,Z.manualApprove=t.manual,Z.rateLimitSeconds=t.rateLimit,Z.rateLimitWait=t.rateLimitWait,Z.showToken=t.showToken,Z.timeoutMs=t.timeout,Z.connectivity.timeoutMs=t.connectTimeout,Z.webSearchProviders=t.webSearchProviders,Z.errorReporting=function(e){let t=g.env.COPILOT_API_ERROR_REPORTING;return(void 0===t||!["0","false","no","off"].includes(t.trim().toLowerCase()))&&e}(t.errorReporting),function(){let e="1"===g.env.COPILOT_H2_KEEPALIVE||"true"===g.env.COPILOT_H2_KEEPALIVE,t=e||"1"===g.env.COPILOT_H2||"true"===g.env.COPILOT_H2;Z.connectivity.h2=t,Z.connectivity.h2Keepalive=e}(),await Y(),tl().catch(()=>{}),jo();let n=await Et();Nl=n;let r=Ot();!function(e,t){t&&(me=t),de=crypto.randomUUID();let o=v({[S]:"copilot-api",[E]:e,[A]:de}),{endpoint:n,headers:r}=he();pe=new $({resource:o,traceExporter:new b({url:`${n}/v1/traces`,headers:r}),metricReader:new T({exporter:new k({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new x({exporter:new w({url:`${n}/v1/logs`,headers:r})})],instrumentations:[]}),pe.start()}(n,Rl);let a=await ol(t);await async function(){try{return await Do(),!0}catch(e){let t="object"==typeof e&&e&&"statusCode"in e&&"number"==typeof e.statusCode?e.statusCode:void 0,n=e instanceof Error?e.message:"Unknown error occurred",r=void 0===t?"":` (HTTP ${t})`,a="foundry"===Z.provider?"Foundry":"Copilot";return o.warn(`Could not fetch model list from ${a}${r}: ${n}. This is likely a transient network or authentication issue. The proxy will start anyway; model listing endpoints may return empty until the cache is populated.`),!1}}()||function(e){let t=setTimeout(()=>{Do().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let i=function(e=18e5){let t=setInterval(()=>{Do().then(()=>o.debug("Model list refreshed successfully")).catch(e=>{o.warn("Failed to refresh model list; keeping existing cache:",e)})},e);return t.unref(),()=>{clearInterval(t)}}();Pl.push(()=>{o.debug("Cleaning up model refresh interval"),i()}),Z.connectivity.h2&&(Ur(Hr(ct(Z))),Z.connectivity.h2Keepalive&&Lr()),Hl({options:t,version:n,runtime:r,githubUser:a});let s=await Ul(t),l=s?"https":"http",c=`${l}://localhost:${t.port}`,u=await Ml(t,c,s)||await async function(e,t,n){if(!e.codex)return!1;let r;if(Z.models||(o.error("Cannot apply --codex defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --codex."),g.exit(1)),e.model){let t=jl(Z.models.data);if(!t.includes(e.model))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid model: ${e.model}`);r=e.model}else r=await o.prompt("Select a model to use with Codex CLI",{type:"select",options:jl(Z.models.data)});let a=nl({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return m.writeSync(a),!0}catch{return o.warn("Failed to copy to clipboard. Here is the Codex CLI command:"),o.log(a),!1}}(t,c,s);(function(e){let t=[..._l(e),...yl(e),...wl(e),...kl(),"",...gl(Zs()),...bl(e),...vl(e),""];console.log(t.join("\n"))})(await async function(e){let{options:t,version:o,runtime:n,user:r,clipboardCopied:a,tls:i}=e,s=i?"https":"http";return{version:o,runtime:n,user:r,accountType:t.accountType,port:t.port,timeout:t.timeout,webSearchProviders:t.webSearchProviders.map(e=>e.name),model:t.model,smallModel:t.smallModel,clipboardCopied:a,https:i?{certPath:i.certPath,keyPath:i.keyPath,generated:i.generated,selfSigned:!t.httpsCert}:void 0,endpoints:t.claudeCowork?{scheme:s,port:t.port,hostname:await An()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:u,tls:s})),Us(),z({fetch:ms.fetch,port:t.port,hostname:t.hostname,tls:s?{cert:s.cert,key:s.key}:void 0,bun:{idleTimeout:255}}),function(e,t,n){o.info(`Server listening on ${e}://${t}:${n}`)}(l,t.hostname,t.port),t.smokeTest&&"copilot"===t.provider&&await async function(e,t,n){try{o.start("Running first-run self-test (one tiny generation)…");let r=await gs({model:t});if(r.ok){let t=void 0===n||["::1","127.0.0.1","localhost"].includes(n)?`Point your client at ${e}`:`Point your client at ${e} — you bound ${n}, so from another machine/container replace \`localhost\` with this host's reachable IP/hostname.`;return void o.success(`Self-test passed — generation works via ${r.model} (${r.durationMs}ms). ${t}`)}let a=r.status?` (HTTP ${r.status})`:"";o.warn(`Self-test FAILED${a}: ${r.reason??"unknown error"}`),r.detail&&o.info(` detail: ${Yn(r.detail)}`),o.info(" The server is still running. Run `copilot-api doctor` to diagnose, or `--no-smoke-test` to skip this check.")}catch(e){o.warn("First-run self-test could not run:",e instanceof Error?e.message:String(e))}}(c,t.smallModel??t.model,t.hostname)}function Ll(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const zl=e({meta:{name:"start",description:"Start the API server"},args:{provider:{type:"string",description:'Upstream provider: "copilot" (default) or "foundry" (Microsoft Foundry / Azure OpenAI; reads FOUNDRY_ENDPOINT and FOUNDRY_API_KEY). Overrides COPILOT_API_PROVIDER.'},port:{alias:"p",type:"string",default:"4141",description:"Port to listen on"},hostname:{alias:"H",type:"string",default:"127.0.0.1",description:"Hostname/IP to bind the server to. Defaults to 127.0.0.1 (localhost only) for security. Use 0.0.0.0 only when you intentionally need LAN/network/Docker exposure."},verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"account-type":{alias:"a",type:"string",default:"individual",description:"Account type (individual, business, enterprise)"},manual:{type:"boolean",default:!1,description:"Enable manual request approval"},"rate-limit":{alias:"r",type:"string",description:"Rate limit in seconds between requests"},wait:{alias:"w",type:"boolean",default:!1,description:"Wait instead of error when rate limit is hit. Has no effect if rate limit is not set"},"github-token":{alias:"g",type:"string",description:"Auth token (visible in process list — prefer GH_TOKEN env var)"},"claude-code":{alias:"c",type:"boolean",default:!1,description:"Generate a command to launch with API config"},codex:{type:"boolean",default:!1,description:"Generate a command to launch Codex CLI with Copilot API config"},model:{alias:"m",type:"string",description:"Model to use (with --claude-code or --codex)"},"small-model":{alias:"s",type:"string",description:"Small/fast model to use (requires --claude-code)"},"show-token":{type:"boolean",default:!1,description:"Show tokens on fetch and refresh"},"error-reporting":{type:"boolean",default:!0,description:"Send anonymous, sanitized error reports to the maintainer to help fix bugs (no prompts, completions, or tokens). Use --no-error-reporting or COPILOT_API_ERROR_REPORTING=0 to disable."},timeout:{alias:"t",type:"string",description:"API timeout in milliseconds (default: 600000)"},"connect-timeout":{type:"string",description:"Connectivity probe timeout in milliseconds (default: 15000). Overrides COPILOT_CONNECT_TIMEOUT_MS env var."},"tavily-api-key":{type:"string",description:"[DEPRECATED — set the TAVILY_API_KEY env var instead] Tavily API key for web search."},"web-search-provider":{type:"string",description:'Web search failover order, e.g. "exa,tavily" (first = primary, rest = fallbacks). Web search turns on when TAVILY_API_KEY and/or EXA_API_KEY are set; this flag is optional and only orders the providers you configured.'},https:{type:"boolean",default:!1,description:"Serve over HTTPS using a self-signed certificate (auto-generated and persisted)"},"https-cert":{type:"string",description:"Path to a PEM-encoded TLS certificate (use with --https-key to bring your own cert)"},"https-key":{type:"string",description:"Path to a PEM-encoded TLS private key (use with --https-cert to bring your own cert)"},"https-hosts":{type:"string",description:"Extra hostnames or IPs to include in the self-signed cert's SANs (comma-separated). Example: --https-hosts host.docker.internal,192.168.1.42"},"claude-cowork":{type:"boolean",default:!1,description:"Print Claude Cowork-specific setup hints (inference endpoint URLs to paste into Cowork's apiHost setting)"},"smoke-test":{type:"boolean",default:!0,description:"After startup, run one tiny self-test generation to verify the proxy works end-to-end and print a clear PASS/FAIL. Disable with --no-smoke-test (or COPILOT_API_NO_SMOKE_TEST=1)."}},run({args:e}){let t=e["rate-limit"],n=void 0===t?void 0:Ll(t,"--rate-limit"),r=e.timeout,a=void 0===r?X:Ll(r,"--timeout"),i=function(e,t){let o=e??t,n=void 0===o?15e3:Ll(o,"--connect-timeout");if(n<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${n}`);return n}(e["connect-timeout"],g.env.COPILOT_CONNECT_TIMEOUT_MS),s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[],c=e["web-search-provider"]??g.env.WEB_SEARCH_PROVIDER,u=c?c.split(",").map(e=>e.trim()).filter(Boolean):[];e["tavily-api-key"]&&o.warn("--tavily-api-key is deprecated; set the TAVILY_API_KEY environment variable instead.");let p=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},n=(e.order??[]).map(e=>e.toLowerCase());for(let e of n)if(!Ci(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${Oi.join(", ")}`);let r=n.length>0?n:Oi,a=new Set,i=n.length>0,s=[];for(let e of r){if(!Ci(e)||a.has(e))continue;a.add(e);let n=t[e];n?s.push({name:e,key:n}):i&&o.warn(`Web search provider "${e}" was requested but no API key is configured — skipping.`)}return s}({tavilyApiKey:e["tavily-api-key"]||g.env.TAVILY_API_KEY,exaApiKey:g.env.EXA_API_KEY,order:u}),d=(g.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),m=""!==d&&"0"!==d&&"false"!==d;return Bl({provider:To(e.provider,g.env.COPILOT_API_PROVIDER),port:Ll(e.port,"--port"),hostname:e.hostname,verbose:e.verbose,accountType:e["account-type"],manual:e.manual,rateLimit:n,rateLimitWait:e.wait,githubToken:e["github-token"],claudeCode:e["claude-code"],codex:e.codex,model:e.model,smallModel:e["small-model"],showToken:e["show-token"],timeout:a,connectTimeout:i,webSearchProviders:p,https:e.https,httpsCert:e["https-cert"],httpsKey:e["https-key"],httpsHosts:l,claudeCowork:e["claude-cowork"],errorReporting:e["error-reporting"],smokeTest:e["smoke-test"]&&!m})}});Is||(Is=!0,o.setReporters([Cs(o.options.reporters)]));const Gl=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(Ms||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;Fs=e,Ms=Hs(e).catch(()=>null)})(),Gl||Us();const Kl=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:an,start:zl,"check-usage":bn,debug:Pt,doctor:Os,"cowork-setup":Jn}});await t(Kl),Gl||(Fs?.abort(),Fs=void 0,Ms=void 0);export{};
|
|
2
|
+
import{defineCommand as e,runMain as t}from"citty";import o,{LogLevels as n,consola as r}from"consola";import a from"node:fs/promises";import i from"node:os";import s from"node:path";import{AsyncLocalStorage as l}from"node:async_hooks";import{ROOT_CONTEXT as c,SpanKind as u,SpanStatusCode as p,context as d,metrics as m,trace as f}from"@opentelemetry/api";import h from"clipboardy";import{execFile as g,execSync as _}from"node:child_process";import y from"node:process";import{SeverityNumber as w,logs as b}from"@opentelemetry/api-logs";import{OTLPLogExporter as k}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as v}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as x}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as T}from"@opentelemetry/resources";import{BatchLogRecordProcessor as $}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as A}from"@opentelemetry/sdk-metrics";import{NodeSDK as S}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as E,ATTR_SERVICE_NAME as O,ATTR_SERVICE_VERSION as C}from"@opentelemetry/semantic-conventions";import{Client as I,request as N}from"undici";import{createHash as P,randomBytes as R,randomUUID as q}from"node:crypto";import{promisify as D}from"node:util";import{Hono as j}from"hono";import{cors as M}from"hono/cors";import{streamSSE as F}from"hono/streaming";import{events as H}from"fetch-event-stream";import{Tokenizer as U,models as B}from"ai-tokenizer";import*as L from"ai-tokenizer/encoding/claude";import z,{accessSync as G}from"node:fs";import{serve as K}from"srvx";import{isIP as J}from"node:net";import{generate as W}from"selfsigned";const Y=s.join(i.homedir(),".local","share","copilot-api"),V={APP_DIR:Y,GITHUB_TOKEN_PATH:s.join(Y,"github_token"),MACHINE_ID_PATH:s.join(Y,"machine_id"),SESSION_ID_PATH:s.join(Y,"session_id")};async function X(){await a.mkdir(V.APP_DIR,{recursive:!0}),await Z(V.GITHUB_TOKEN_PATH),await Z(V.SESSION_ID_PATH)}async function Z(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,""),await a.chmod(e,384)}}const Q=new l;function ee(e,t){return Q.run(e,t)}const te=()=>!0===Q.getStore()?.rerun;const oe=6e5,ne={provider:"copilot",accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:oe,webSearchProviders:[],errorReporting:!0,connectivity:{probeEndpoints:["https://api.github.com","https://www.google.com","https://1.1.1.1"],fastProbeInterval:5e3,slowProbeInterval:1e4,timeoutMs:15e3,jitterMaxMs:1e3,connectionPooling:!0,dnsCache:!0,h2:!1,h2Keepalive:!1}};function re(e){let[t="",o=""]=e.trim().split(/\s+/,2),n=o&&"undefined"!==o&&"null"!==o?/^(?:ghu|gho|ghp|ghs|ghr|github_pat)_/.exec(o)?.[0]??"opaque":"missing";return`${t.toLowerCase()} ${n}`}!function(e){let t=e.provider,o=e.models;Object.defineProperties(e,{provider:{get:()=>Q.getStore()?.provider??t,set:e=>{t=e},enumerable:!0,configurable:!0},models:{get:()=>{let e=Q.getStore();return e?e.models:o},set:e=>{o=e},enumerable:!0,configurable:!0}})}(ne);const ae=" │ ",ie=e=>{if(e>=1e6){let t=e/1e6;return Number.isInteger(t)?`${t}M`:`${t.toFixed(1)}M`}return e>=1e4?`${Math.round(e/1e3)}K`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toString()},se=(e,t)=>e.padEnd(t),le=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),ce=(e,t,o)=>` --\x3e ${se(e,4)} ${se(t,21)} ${se(o,3)}`,ue=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return se(t,22)})(e.model??"—")+se(t,8)},pe=e=>{let t=e?.inputTokens??0,o=e?.cachedTokens??0,n=e?ie(Math.max(t-o,0)):"—",r=e?ie(e.outputTokens??0):"—",a=o?ie(o):"—";return`↑${n.padStart(5)} ⚡${a.padStart(5)} ↓${r.padStart(5)}`},de=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${se("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=ie(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},me=e=>{if(void 0===e.ttfbMs)return`e2e ${le(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${le(e.ttfbMs)} → e2e ${le(e.e2eMs)} ${t}`},fe=e=>e?ne.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,he=e=>({...e?.inputTokens&&{"copilot_api.input_tokens":e.inputTokens},...e?.inputTokens&&{"copilot_api.fresh_input_tokens":Math.max(e.inputTokens-(e.cachedTokens??0),0)},...e?.outputTokens&&{"copilot_api.output_tokens":e.outputTokens},...e?.cachedTokens&&{"copilot_api.cached_tokens":e.cachedTokens}}),ge={completionCallbacks:new Map,registerCompletion(e,t,o){this.completionCallbacks.set(e,{context:t,startTime:o,requestId:e})},executeCompletion(e){let t=this.completionCallbacks.get(e);t&&(this.logCompletion(t),this.completionCallbacks.delete(e))},logCompletion(e){let{context:t,startTime:n}=e,r=Math.round(performance.now()-n),a=t.get("requestData"),i=a?.upstreamTotalMs??a?._d1,s=(e=>[ce(e.method,e.path,e.status),ue(e),pe(e.tokenUsage),de(e.tokenUsage,e.maxContextTokens),me({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(ae))({method:t.req.method,path:t.req.path,status:t.res.status.toString(),model:a?.model,reasoningEffort:a?.reasoningEffort,effortClamped:a?.effortClamped,tokenUsage:a?.tokenUsage,maxContextTokens:fe(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),tt(w.INFO,"INFO","Request completed",(e=>{let{c:t,requestData:o,duration:n,upstreamTotal:r}=e;return{"http.method":t.req.method,"http.path":t.req.path,"http.status_code":t.res.status,"copilot_api.duration_ms":n,...o?.model&&{"copilot_api.model":o.model},...o?.reasoningEffort&&{"copilot_api.reasoning_effort":o.reasoningEffort},...o?.effortClamped&&{"copilot_api.effort_clamped":!0},...void 0!==o?.upstreamTtfbMs&&{"copilot_api.upstream_ttfb_ms":Math.round(o.upstreamTtfbMs)},...void 0!==r&&{"copilot_api.upstream_total_ms":Math.round(r),"copilot_api.copilot_duration_ms":Math.round(r)},...he(o?.tokenUsage)}})({c:t,requestData:a,duration:r,upstreamTotal:i}),t.get("requestTraceContext"))},logRateLimit(e,t){let{context:n,startTime:r}=e,a=Math.round(performance.now()-r),i=(t.headers.get("x-ratelimit-exceeded")||"").split(":")[1]||"unknown",s=t.headers.get("retry-after")||t.headers.get("x-ratelimit-user-retry-after")||"?",l=n.get("requestData");o.error((e=>[ce(e.method,e.path,"429"),ue(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${le(e.e2eMs)}`].join(ae))({method:n.req.method,path:n.req.path,model:l?.model,reasoningEffort:l?.reasoningEffort,effortClamped:l?.effortClamped,retry:s,rateLimitType:i,e2eMs:a}))},logError(e,t,n){let{context:r,startTime:a}=e,i=Math.round(performance.now()-a),s=r.get("requestData");o.error((e=>{let t=ce(e.method,e.path,e.status.toString()),o=ue(e),n=e.message.replaceAll(/\s+/g," ").trim();return[t,o,(n.length>37?`${n.slice(0,36)}…`:n).padEnd(37),`e2e ${le(e.e2eMs)}`].join(ae)})({method:r.req.method,path:r.req.path,status:t,model:s?.model,reasoningEffort:s?.reasoningEffort,effortClamped:s?.effortClamped,message:n,e2eMs:i}))},cleanup(){let e=performance.now()-12e5;for(let[t,o]of this.completionCallbacks)o.startTime<e&&this.completionCallbacks.delete(t);if(this.completionCallbacks.size>1e3){let e=Array.from(this.completionCallbacks.entries()).sort(([,e],[,t])=>e.startTime-t.startTime),t=e.slice(0,e.length-1e3);for(let[e]of t)this.completionCallbacks.delete(e)}}};setInterval(()=>ge.cleanup(),6e4);let _e,ye,we=Date.now();const be={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function ke(){let e=process.env.OTEL_EXPORTER_OTLP_ENDPOINT??"https://api.honeycomb.io",t=process.env.OTEL_EXPORTER_OTLP_HEADERS?function(e){return e?Object.fromEntries(e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let t=e.indexOf("=");return-1===t?[e,""]:[decodeURIComponent(e.slice(0,t)),decodeURIComponent(e.slice(t+1))]})):{}}(process.env.OTEL_EXPORTER_OTLP_HEADERS):be;return{endpoint:e.replace(/\/$/,""),headers:t}}async function ve(){if(!_e)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([_e.shutdown(),t])&&o.warn("OTel SDK shutdown timed out after 5000ms; continuing exit")}catch(e){o.warn("OTel SDK shutdown failed; continuing exit",e)}}const xe=f.getTracer("copilot-api"),Te=m.getMeter("copilot-api"),$e=b.getLogger("copilot-api"),Ae=Te.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),Se=Te.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),Ee=Te.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),Oe=Te.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),Ce=Te.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),Ie=Te.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),Ne=Te.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),Pe=Te.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Re=Te.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),qe=Te.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),De=Te.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),je=Te.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Me=Te.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Fe=Te.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),He=Te.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Ue=Te.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),Be=Te.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),Le=Te.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),ze=Te.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),Ge=Te.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),Ke=Te.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),Je=Te.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),We=Te.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),Ye=Te.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Ve=Te.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),Xe=Te.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),Ze=Te.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),Qe=Te.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),et=Te.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function tt(e,t,o,n,r){let a=f.getActiveSpan()?.spanContext()??r;$e.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function ot(e,t,o){let n=t instanceof Error?t:Error(String(t));e.setStatus({code:p.ERROR,message:o??n.message}),e.recordException(n)}function nt(e,t,o){ot(e,o),t&&t!==e&&ot(t,o)}function rt(e,t=""){let o={};if(null==e)return o;if("object"!=typeof e)return("string"==typeof e||"number"==typeof e||"boolean"==typeof e)&&t&&(o[t]=e),o;if(Array.isArray(e))return t&&(o[t]=JSON.stringify(e)),o;for(let[n,r]of Object.entries(e)){let e=t?`${t}.${n}`:n;void 0!==r&&"function"!=typeof r&&(null===r?o[e]="null":"object"!=typeof r||Array.isArray(r)?Array.isArray(r)?o[e]=JSON.stringify(r):("string"==typeof r||"number"==typeof r||"boolean"==typeof r)&&(o[e]=r):Object.assign(o,rt(r,e)))}return o}Te.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!ct.getConnectivityStats().isOnline)}),Te.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(ct.getConnectivityStats().consecutiveFailures)}),Te.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(ne.models?.data.length??0)}),Te.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(ge.completionCallbacks.size)}),Te.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-we)/1e3)});const at=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","api-key","proxy-authorization"]);function it(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();"authorization"===o&&e.setAttribute(`http.${t}.header.authorization.shape`,re(r)),!at.has(o)&&e.setAttribute(`http.${t}.header.${o}`,r)}}async function st(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:l}=e,c=xe.startSpan(t,{kind:u.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...l}});a&&it(c,"request",a);try{let e=await fetch(o,{method:r,headers:a,body:i,signal:s});return c.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,o)=>{let n=o.toLowerCase();at.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(c,e),Me.add(1,{target:n,status_code:String(e.status)}),e.ok||c.setStatus({code:p.ERROR,message:`HTTP ${e.status}`}),{response:e,span:c}}catch(e){throw ot(c,e),c.end(),e}}async function lt(e){let{spanName:t,url:o,target:n,method:r="POST",headers:a,body:i,signal:s,headersTimeout:l,bodyTimeout:c,extraAttributes:d,dispatcher:m}=e,f=xe.startSpan(t,{kind:u.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});it(f,"request",a);try{let{statusCode:e,headers:t,body:u}=await N(o,{method:r,headers:a,body:i,signal:s,headersTimeout:l,bodyTimeout:c,dispatcher:m});f.setAttribute("http.response.status_code",e);for(let[e,o]of Object.entries(t)){let t=e.toLowerCase();void 0!==o&&!at.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return Me.add(1,{target:n,status_code:String(e)}),e>=400&&f.setStatus({code:p.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:u,span:f}}catch(e){throw ot(f,e),f.end(),e}}const ct=new class extends EventTarget{isOnline=!0;lastChecked=(new Date).toISOString();consecutiveFailures=0;lastErrorType;lastErrorMessage;lastSuccessfulEndpoint;endpointFailureStats={};checkInterval;abortController;on(e,t){return this.addEventListener(e,t),this}off(e,t){return this.removeEventListener(e,t),this}start(){o.debug("Starting connectivity monitor",{probeEndpoints:ne.connectivity.probeEndpoints,fastInterval:ne.connectivity.fastProbeInterval}),this.scheduleNextCheck()}stop(){o.debug("Stopping connectivity monitor"),this.checkInterval&&=void clearTimeout(this.checkInterval),this.abortController&&=void this.abortController.abort()}scheduleNextCheck(){this.checkInterval&&clearTimeout(this.checkInterval);let e=(this.isOnline?ne.connectivity.slowProbeInterval:ne.connectivity.fastProbeInterval)+Math.random()*ne.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=xe.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),ne.connectivity.timeoutMs);try{let n=!1;for(let e of ne.connectivity.probeEndpoints)try{let t=performance.now(),o=await fetch(e,{method:"HEAD",signal:this.abortController.signal,headers:{"User-Agent":"copilot-api-connectivity-monitor/1.0",...ne.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Ve.record(r,{endpoint:e,result:"success"});break}Ve.record(r,{endpoint:e,result:"failed"})}catch(t){this.endpointFailureStats[e]=(this.endpointFailureStats[e]||0)+1,o.debug(`Probe failed for ${e}:`,t)}this.updateConnectivityState(n);let r=n?"online":"offline";e.setAttribute("copilot_api.connectivity.result",r),e.setAttribute("copilot_api.connectivity.consecutive_failures",this.consecutiveFailures),this.lastSuccessfulEndpoint&&e.setAttribute("copilot_api.connectivity.successful_endpoint",this.lastSuccessfulEndpoint),De.add(1,{result:n?"online":"offline"})}catch(e){this.handleConnectivityError(e)}finally{clearTimeout(t),e.end(),this.scheduleNextCheck()}}updateConnectivityState(e){let t=this.isOnline;if(this.isOnline=e,this.lastChecked=(new Date).toISOString(),e){let e=this.consecutiveFailures;this.consecutiveFailures>0&&o.info(`Connectivity restored after ${this.consecutiveFailures} failures`),this.consecutiveFailures=0,this.lastErrorType=void 0,this.lastErrorMessage=void 0,t||(this.dispatchEvent(new CustomEvent("online")),je.add(1,{from:"offline",to:"online"}),tt(w.INFO,"INFO","Connectivity restored",{"copilot_api.connectivity.consecutive_failures_before_recovery":e}))}else this.consecutiveFailures++,t&&(o.warn("Connectivity lost"),this.dispatchEvent(new CustomEvent("offline")),je.add(1,{from:"online",to:"offline"}),tt(w.WARN,"WARN","Connectivity lost",{"copilot_api.connectivity.consecutive_failures":this.consecutiveFailures}))}handleConnectivityError(e){this.lastErrorType=e.name,this.lastErrorMessage=e.message,o.error("Connectivity check failed:",e),this.updateConnectivityState(!1)}getConnectivityStats(){return{isOnline:this.isOnline,lastChecked:this.lastChecked,consecutiveFailures:this.consecutiveFailures,lastErrorType:this.lastErrorType,lastErrorMessage:this.lastErrorMessage}}getPerformanceStats(){let e=this.isOnline?ne.connectivity.slowProbeInterval:ne.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*ne.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:ne.connectivity.jitterMaxMs>0,connectionPooling:ne.connectivity.connectionPooling,dnsCache:ne.connectivity.dnsCache}}},ut=()=>({"content-type":"application/json",accept:"application/json"}),pt="0.48.1",dt=`copilot-chat/${pt}`,mt=`GitHubCopilotChat/${pt}`,ft=async e=>{let t=(e=>{let t=e.replaceAll(/[^\w.-]/g,"_").trim();if(0===t.length||"."===t||".."===t||/^[_.]+$/.test(t))throw Error("Invalid GitHub username: cannot be empty or consist only of special characters after sanitization");return`${V.MACHINE_ID_PATH}_${t}`})(e);try{let e=await a.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let o=(e=>{let t=P("sha256");return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||"anonymous"),t.update(i.hostname()),t.update(e),t.update(Date.now().toString()),t.update(R(16)),t.digest("hex")})(e);return await a.writeFile(t,o),await a.chmod(t,384),o},ht=async(e,t)=>{e.machineId||=await ft(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(V.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=q();return await a.writeFile(V.SESSION_ID_PATH,e),await a.chmod(V.SESSION_ID_PATH,384),e})()},gt=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,_t=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=q(),n={Authorization:`Bearer ${e._t1}`,"Content-Type":"application/json",accept:"*/*","accept-encoding":"br, gzip, deflate","accept-language":"*","sec-fetch-mode":"cors","Copilot-Integration-Id":"vscode-chat","Editor-Version":`vscode/${e._v1}`,"Editor-Plugin-Version":dt,"User-Agent":mt,"VScode-MachineId":e.machineId,"VScode-SessionId":e.sessionId,"OpenAI-Intent":"conversation-agent","X-Interaction-Type":"conversation-agent","X-Agent-Task-Id":o,"X-VSCode-User-Agent-Library-Version":"node-fetch","X-GitHub-Api-Version":"2025-05-01","X-Interaction-Id":q(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},yt=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const wt=(e,t,o)=>{let n=_t(e);delete n["Copilot-Integration-Id"],n["anthropic-version"]=t?.anthropicVersion??"2023-06-01";let r=new Set,a=t?.anthropicBeta?function(e){let t=e.split(",").map(e=>e.trim()).filter(e=>e&&yt.some(t=>e.startsWith(`${t}-`)));return t.length>0?t.join(","):void 0}(t.anthropicBeta):void 0;if(a)for(let e of a.split(","))r.add(e);if(o)for(let e of o)r.add(e);return r.size>0&&(n["anthropic-beta"]=[...r].join(",")),n},bt="https://api.github.com",kt=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":dt,"user-agent":mt,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),vt="https://github.com",xt="01ab8ac9400c4e429b23",Tt=["user:email"].join(" ");function $t(e){return e.includes("/messages")?"anthropic":e.includes("/chat/completions")?"openai":e.includes("/embeddings")?"embeddings":e.includes("/responses")?"responses":e.includes("/models")?"models":e.includes("/usage")?"usage":e.includes("/token")?"token":"unknown"}const At=32768,St=[{regex:/Bearer\s+[\w.-]{20,}/g,mask:"Bearer ***"},{regex:/\bghu_[A-Za-z0-9]{20,}/g,mask:"ghu_***"},{regex:/\bghp_[A-Za-z0-9]{20,}/g,mask:"ghp_***"},{regex:/\bgho_[A-Za-z0-9]{20,}/g,mask:"gho_***"},{regex:/\bghs_[A-Za-z0-9]{20,}/g,mask:"ghs_***"},{regex:/\bghr_[A-Za-z0-9]{20,}/g,mask:"ghr_***"},{regex:/\bsk-[A-Za-z0-9-]{20,}/g,mask:"sk-***"},{regex:/\bhcaik_[A-Za-z0-9]{20,}/g,mask:"hcaik_***"},{regex:/\bapi-key[\x22\x27]?\s*[:=]\s*[\x22\x27]?[\w-]{20,}/gi,mask:"api-key: ***"}],Et=new Set(["authorization","cookie","set-cookie","x-api-key","api-key","proxy-authorization"]);function Ot(e){let t=e;for(let{regex:e,mask:o}of St)t=t.replace(e,o);return t}const Ct=new Map;function It(e){let t=function(e=new Date){return e.toISOString().slice(0,10)}(e.now),o=e.upstreamErrorType??"unknown",n=(e.model??"unknown").slice(0,100);return`${e.endpointType}:${e.statusCode}:${o}:${n}:${t}`}function Nt(e,t,o){let n=Ot(o),r=8*At,a=n.length>r,i=a?n.slice(0,r):n,s=P("sha256").update(n).digest("hex");if(i.length<=At)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=At)e.setAttribute(`${t}.part_${o/At}`,i.slice(o,o+At));e.setAttribute(`${t}.parts`,Math.ceil(i.length/At))}e.setAttribute(`${t}.bytes`,n.length),e.setAttribute(`${t}.sha256`,s),a&&(e.setAttribute(`${t}.truncated`,!0),e.setAttribute(`${t}.dropped_bytes`,n.length-i.length))}function Pt(e,t){let o=function(e){if(Ct.size>=1e3&&!Ct.has(e)){let e=Ct.keys().next().value;void 0!==e&&Ct.delete(e)}let t,o=(Ct.get(e)??0)+1;return Ct.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",Le.add(1,{decision:t}),t}(t.signatureKey);if(e.setAttribute("copilot_api.error_capture.decision",o),e.setAttribute("copilot_api.error_capture.signature_key",t.signatureKey),"drop"===o)return{decision:o};if("suppressed"===o)return e.setAttribute("copilot_api.error_capture.suppressed_today",!0),{decision:o};let n=t.c.get("rawBody");n&&Nt(e,"copilot_api.incoming_request_body",n);let r=Rt(t.c.req.header());return r&&Nt(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&Nt(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&Nt(e,"copilot_api.outgoing_headers",Rt(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&Nt(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function Rt(e){let t={};for(let[o,n]of Object.entries(e))Et.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}async function qt(){try{let e=new URL("../package.json",import.meta.url).pathname,t=await a.readFile(e);return JSON.parse(t.toString()).version}catch{return"unknown"}}function Dt(){let e=typeof Bun<"u";return{name:e?"bun":"node",version:e?Bun.version:process.version.slice(1),platform:i.platform(),arch:i.arch()}}async function jt(){try{return!!(await a.stat(V.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(V.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function Mt(e){let t=await async function(){let[e,t]=await Promise.all([qt(),jt()]);return{version:e,runtime:Dt(),paths:{APP_DIR:V.APP_DIR,GITHUB_TOKEN_PATH:V.GITHUB_TOKEN_PATH},tokenExists:t}}();e.json?function(e){console.log(JSON.stringify(e,null,2))}(t):function(e){o.info(`service debug\n\nVersion: ${e.version}\nRuntime: ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform} ${e.runtime.arch})\n\nPaths:\n- APP_DIR: ${e.paths.APP_DIR}\n- GITHUB_TOKEN_PATH: ${e.paths.GITHUB_TOKEN_PATH}\n\nToken exists: ${e.tokenExists?"Yes":"No"}`)}(t)}const Ft=e({meta:{name:"debug",description:"Print debug information about the application"},args:{json:{type:"boolean",default:!1,description:"Output debug information as JSON"}},run:({args:e})=>Mt({json:e.json})}),Ht=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",Ut=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",Bt=new Set;let Lt;function zt(e){if(ne.errorReporting&&!(e.statusCode<500)&&!Bt.has(e.signature)){if(Bt.size>=1e3){let e=Bt.values().next().value;void 0!==e&&Bt.delete(e)}Bt.add(e.signature),async function(e){Lt??=qt();let t=await Lt,o=Dt(),n=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(Ot(e.upstreamErrorMessage)).slice(0,600),r={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:n,endpointType:$t(e.route),route:e.route,model:e.model?.slice(0,100),platform:`${o.platform}/${o.arch}`,runtime:`${o.name}/${o.version}`,timestamp:(new Date).toISOString()},a=new AbortController,i=setTimeout(()=>a.abort(),4e3);try{await fetch(Ht,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":Ut},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}function Gt(e){return function(e){if(!(e instanceof Error))return!1;let t=e.code;return(!t||"UND_ERR_SOCKET"===t)&&/GOAWAY/i.test(e.message)}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"ECONNRESET"===t||(!t||"UND_ERR_SOCKET"===t)&&(/ECONNRESET/i.test(e.message)||/other side closed/i.test(e.message))}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"UND_ERR_DESTROYED"===t||"UND_ERR_CLOSED"===t}(e)||function(e){return e instanceof Error&&"UND_ERR_CONNECT_TIMEOUT"===e.code}(e)}const Kt=new WeakSet;async function Jt(e,{attempt:t,maxRetries:n,operation:r}){return Gt(e)&&t<n?(o.warn(`HTTP/2 connection error during ${r}, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await async function(){return new Promise(e=>setTimeout(e,100))}(),!0):(t>0&&function(e){"object"==typeof e&&e&&Kt.add(e)}(e),!1)}var Wt=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},Yt=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function Vt(e,t){return setTimeout(()=>e.abort(new Yt(t)),t)}const Xt=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),Zt=RegExp(`\\b(?:${[...Xt].join("|")})\\b`);function Qt(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function eo(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=Qt(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function to(e){let t=e.code;return"string"==typeof t?t:void 0}function oo(e){if(void 0===e.cause)return"";let t=eo(e);if(t===e)return"";let o=to(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function no(e){if(!(e instanceof Error))return!1;let{codes:t,messages:o}=function(e){let t=[],o=[],n=new Set,r=(e,a)=>{if(a>4||!(e instanceof Error)||n.has(e))return;n.add(e);let{code:i,errors:s,cause:l}=e;if("string"==typeof i&&t.push(i),o.push(e.message),Array.isArray(s))for(let e of s)r(e,a+1);r(l,a+1)};return r(e,0),{codes:t,messages:o}}(e);return!!t.some(e=>Xt.has(e))||!(t.length>0)&&(!!o.some(e=>Zt.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function ro(e){return e.req.path.startsWith("/v1/messages")}function ao(e,t){if(ro(t)){try{let t=JSON.parse(e);if("message"in t&&"string"==typeof t.message&&!("error"in t))return{type:"error",error:{type:"invalid_request_error",message:t.message}};if("error"in t&&"object"==typeof t.error){let e=t.error;return{type:"error",error:{type:"string"==typeof e.type&&e.type||"string"==typeof e.code&&e.code||"api_error",message:"string"==typeof e.message&&e.message||"Unknown error"}}}}catch{}return{type:"error",error:{type:"api_error",message:e}}}try{return JSON.parse(e)}catch{return{error:{message:e,type:"error"}}}}function io(e){let t=e.error,o={};return t&&"object"==typeof t&&("string"==typeof t.type?o.type=t.type:"string"==typeof t.code&&(o.type=t.code),"string"==typeof t.message&&(o.message=t.message)),!o.message&&"string"==typeof e.message&&(o.message=e.message),o}function so(e,t){e&&(t.type&&e.setAttribute("copilot_api.upstream.error_type",t.type),t.message&&e.setAttribute("copilot_api.upstream.error_message",t.message))}function lo(e){let t={};return e.type&&(t["copilot_api.upstream.error_type"]=e.type),e.message&&(t["copilot_api.upstream.error_message"]=e.message),t}function co(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=f.getActiveSpan();if(!a)return;let i=It({endpointType:$t(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});Pt(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function uo(e,t,o){let n=e.get("requestId"),r=ge.completionCallbacks.get(n);r&&(ge.logError(r,t,o),ge.completionCallbacks.delete(n))}async function po(e,t){let o=f.getActiveSpan(),n=e.get("requestId"),r=ge.completionCallbacks.get(n);r&&(ge.logRateLimit(r,t.response),ge.completionCallbacks.delete(n)),Ie.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=ao(a,e),s=io(i);return o?.setStatus({code:p.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),so(o,s),tt(w.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...lo(s)}),co({c:e,error:t,errorText:a,upstream:s}),function(e,t){t.headers.forEach((t,o)=>{mo.test(o)&&e.header(o,t)})}(e,t.response),e.json(i,429)}const mo=/^(?:retry-after(?:-ms)?|x-ratelimit-[\w-]+)$/i;function fo(e,t){(function(e){return"object"==typeof e&&!!e&&Kt.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",ne.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function ho(e){return no(e)||function(e){return Gt(e)||e instanceof Error&&Gt(e.cause)}(e)}async function go(e,t){if(fo(f.getActiveSpan(),t),t instanceof Wt&&429===t.response.status)return po(e,t);if(t instanceof SyntaxError){f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),tt(w.WARN,"WARN",`Invalid JSON in request body: ${t.message}`,{"copilot_api.status_code":400,"http.path":e.req.path,"copilot_api.error_type":"invalid_json_body"});let o=ro(e)?{type:"error",error:{type:"invalid_request_error",message:"Invalid JSON in request body"}}:{error:{message:"Invalid JSON in request body",type:"invalid_request_error"}};return uo(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof Wt)return async function(e,t){let o=f.getActiveSpan(),n=await t.response.text(),r=ao(n,e),a=io(r);return uo(e,t.response.status,a.message??t.message),o?.setStatus({code:p.ERROR,message:t.message}),o?.recordException(t),o?.setAttribute("copilot_api.error_type","HTTPError"),so(o,a),tt(w.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...lo(a)}),co({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&zt({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:It({endpointType:$t(e.req.path),statusCode:t.response.status,upstreamErrorType:a.type,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:a.type,upstreamErrorMessage:a.message}),e.json(r,t.response.status)}(e,t);if(function(e){return e instanceof Yt||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof Yt}(t))return function(e,t){let o=f.getActiveSpan();o?.setStatus({code:p.ERROR,message:"Upstream request timed out"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","request_timeout");let n="Upstream request timed out (gateway timeout). Increase the timeout or retry.";tt(w.ERROR,"ERROR",n,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let r=ro(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return uo(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(ho(t))return function(e,t){let o=f.getActiveSpan();o?.setStatus({code:p.ERROR,message:"Transient upstream connection failure"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","transient_transport");let n=t instanceof Error?eo(t):void 0,r=(n&&to(n))??"none",a=n?.message??String(t);o?.setAttribute("copilot_api.transport_cause_code",r),o?.setAttribute("copilot_api.transport_cause_message",a);let i="Temporary upstream connection failure. Please retry.";tt(w.WARN,"WARN",i,{"copilot_api.status_code":503,"http.path":e.req.path,"copilot_api.error_type":"transient_transport","copilot_api.transport_cause_code":r,"copilot_api.transport_cause_message":a}),e.header("Retry-After","1");let s=ro(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return uo(e,503,t instanceof Error?`${t.message}${oo(t)}`:i),e.json(s,503)}(e,t);let n=f.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:p.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),tt(w.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),zt({route:e.req.path,statusCode:500,errorClass:r.name,signature:It({endpointType:$t(e.req.path),statusCode:500,upstreamErrorType:r.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:r.name,upstreamErrorMessage:`${r.message}${oo(r)}`}),uo(e,500,r.message),o.error(r);let a=ro(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}const _o=async()=>{let e=`${bt}/copilot_internal/v2/token`,t=ne.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await st({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:kt(ne),signal:o.signal});try{if(!t.ok)throw new Wt("Failed to get Service token",t);return await t.json()}catch(e){throw ot(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function yo(){let e=`${bt}/user`,t=ne.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await st({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${ne._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new Wt("Failed to get GitHub user",t);return await t.json()}catch(e){throw ot(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let wo,bo,ko,vo=null,xo=0;function To(e){ko&&clearTimeout(ko),ko=setTimeout(()=>{So("scheduled").catch(e=>{o.warn("Foundry Entra token renewal failed; retrying:",e),To(3e4)})},e),ko.unref()}async function $o(e){let t=bo;if(!wo||!t?.tokenScope)throw Error("Foundry Entra auth is not initialised");let o=xe.startSpan("copilot_api.foundry.entra_token",{kind:u.INTERNAL,attributes:{"copilot_api.foundry.token.trigger":e}},"upstream_401"===e?d.active():c);try{let e=await wo.getToken(t.tokenScope);if(!e)throw Error(`No Entra token for scope ${t.tokenScope}`);o.setAttribute("copilot_api.foundry.token.expires_in_s",Math.round((e.expiresOnTimestamp-Date.now())/1e3)),t.bearerToken=e.token,t.bearerExpiresAt=e.expiresOnTimestamp,xo=Date.now(),To(function(e){let t=e.refreshAfterTimestamp??e.expiresOnTimestamp-3e5;return Math.max(t-Date.now(),3e4)}(e))}catch(e){throw ot(o,e),e}finally{o.end()}}async function Ao(e,t){bo=e,wo=t??await async function(){let{DefaultAzureCredential:e}=await import("@azure/identity");return new e}();try{await $o("startup")}catch(e){throw Error("Foundry Entra ID auth: could not get a token. Run `az login` (or set FOUNDRY_API_KEY for key auth). The identity needs the 'Cognitive Services OpenAI User' role (GPT) or 'Azure AI User' (Claude) on the resource.",{cause:e})}}function So(e="upstream_401"){return vo??=$o(e).finally(()=>{vo=null}),vo}let Eo=null;function Oo(){return"foundry"===ne.provider?"entra"===ne.foundry?.auth?async function(){if(!(Date.now()-xo<3e4))try{await So()}catch(e){o.warn("Foundry Entra token renewal after a 401 failed:",e)}}():Promise.resolve():(Eo||=_o().then(({token:e})=>{ne._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{Eo=null}),Eo)}function Co(e,t="FOUNDRY_ENDPOINT"){let o,n=e.trim();try{o=new URL(n)}catch{throw Error(`${t} is not a valid URL: "${n}"`)}if("https:"!==o.protocol)throw Error(`${t} must use https, got: "${n}"`);let r=o.pathname.replace(/\/+$/,"").replace(/\/(?:openai|_an1)(?:\/v1)?$/i,"");return`${o.origin}${r}`}const Io=/^([\w-]+)\.(?:openai\.azure\.com|cognitiveservices\.azure\.com|services\.ai\.azure\.com)$/i;function No(e){let t=new URL(e),o=Io.exec(t.hostname)?.[1];return o?`https://${o}.services.ai.azure.com${t.pathname.replace(/\/+$/,"")}`:e}function Po(e){if(!e?.trim())return;let t=e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let[t,o]=e.split(":").map(e=>e.trim());if(!t)throw Error(`Invalid FOUNDRY_DEPLOYMENTS entry: "${e}"`);return{id:t,model:o||t}});return t.length>0?t:void 0}function Ro(e){let t=e.FOUNDRY_ENDPOINT,o=e.FOUNDRY_API_KEY?.trim();if(!t?.trim())throw Error("--provider foundry requires FOUNDRY_ENDPOINT (e.g. https://<resource>.openai.azure.com)");let n=function(e,t){let o=e?.trim().toLowerCase();if(!o)return t?"key":"entra";if("key"!==o&&"entra"!==o)throw Error(`FOUNDRY_AUTH must be "key" or "entra", got: "${o}"`);if("key"===o&&!t)throw Error("FOUNDRY_AUTH=key requires FOUNDRY_API_KEY");return o}(e.FOUNDRY_AUTH,o),r=Co(t),a=e.FOUNDRY_ANTHROPIC_ENDPOINT?.trim();return{endpoint:r,anthropicEndpoint:a?Co(a,"FOUNDRY_ANTHROPIC_ENDPOINT"):No(r),auth:n,..."key"===n?{apiKey:o}:{tokenScope:e.FOUNDRY_TOKEN_SCOPE?.trim()||"https://cognitiveservices.azure.com/.default"},deployments:Po(e.FOUNDRY_DEPLOYMENTS)}}const qo=(e,t)=>"entra"===e.auth?{Authorization:`Bearer ${e.bearerToken??""}`}:{[t]:e.apiKey??""},Do=e=>({...qo(e,"api-key"),"Content-Type":"application/json",accept:"*/*"}),jo=e=>`${e.anthropicEndpoint}/anthropic`,Mo=(e,t)=>({...qo(e,"x-api-key"),"Content-Type":"application/json",accept:"*/*","anthropic-version":t?.anthropicVersion??"2023-06-01",...t?.anthropicBeta?{"anthropic-beta":t.anthropicBeta}:{}}),Fo=e=>"foundry"===e.provider;function Ho(e){if(!e.foundry)throw Error("Foundry provider selected but not configured");return e.foundry}const Uo=e=>Fo(e)?(e=>`${e.endpoint}/openai/v1`)(Ho(e)):gt(e),Bo=(e,t=!1)=>Fo(e)?Do(Ho(e)):_t(e,t),Lo=e=>Fo(e)?!!(e.foundry?.apiKey??e.foundry?.bearerToken):!!e._t1;const zo=[{pattern:/^gpt-6/,context:105e4,output:128e3},{pattern:/^gpt-5/,context:4e5,output:128e3},{pattern:/^gpt-4\.1/,context:1047576,output:32768},{pattern:/^o\d/,context:2e5,output:1e5}],Go={context:128e3,output:16384};function Ko(e){return zo.find(({pattern:t})=>t.test(e))??Go}const Jo=/dall-e|gpt-image|image|whisper|tts|transcribe|realtime|audio|speech|sora/i,Wo=e=>/^(?:gpt-|o\d|codex|chatgpt|computer-use)/i.test(e);function Yo(e,t){return{id:e.id,name:e.id,object:"model",vendor:t.vendor,version:e.model,preview:!1,model_picker_enabled:!0,supported_endpoints:t.supported_endpoints,capabilities:{family:e.model,object:"model_capabilities",type:"chat",tokenizer:"o200k_base",limits:t.limits&&{max_context_window_tokens:t.limits.context,max_output_tokens:t.limits.output},supports:{tool_calls:!0,parallel_tool_calls:!0}}}}async function Vo(e){let t=`${e.endpoint}/openai/deployments?api-version=2022-12-01`,o=new AbortController,n=Vt(o,ne.timeoutMs);try{let{response:n,span:r}=await st({spanName:"foundry GET /openai/deployments",url:t,target:"models",headers:Do(e),signal:o.signal});try{if(!n.ok)throw new Wt("Failed to list Foundry deployments",n);let e=(await n.json()).data.filter(e=>!e.status||"succeeded"===e.status).map(e=>({id:e.id,model:e.model}));return r.setAttribute("copilot_api.models_count",e.length),e}catch(e){throw ot(r,e),e}finally{r.end()}}finally{clearTimeout(n)}}async function Xo(e){return{object:"list",data:(e.deployments??await Vo(e)).map(e=>function(e){let{model:t}=e;if(!Jo.test(t))return(e=>/embedding/i.test(e))(t)?{id:e.id,name:e.id,object:"model",vendor:"Azure OpenAI",version:t,preview:!1,model_picker_enabled:!1,supported_endpoints:["/embeddings"],capabilities:{family:t,object:"model_capabilities",type:"embeddings",tokenizer:"cl100k_base",supports:{}}}:(e=>/^claude/i.test(e))(t)?Yo(e,{vendor:"Anthropic",supported_endpoints:["/v1/messages"]}):Wo(t)?Yo(e,{vendor:"Azure OpenAI",supported_endpoints:["/responses"],limits:Ko(t)}):Yo(e,{vendor:"Foundry",supported_endpoints:["/chat/completions"],limits:Ko(t)})}(e)).filter(e=>void 0!==e)}}const Zo=()=>Fo(ne)&&ne.foundry?Xo(ne.foundry):en(),Qo=async()=>{try{return await Zo()}catch(e){if(e instanceof Wt&&401===e.response.status)return await Oo(),Zo();throw e}},en=async()=>{let e=`${Uo(ne)}/models`,t=Bo(ne),o=ne.timeoutMs,n=new AbortController,r=Vt(n,o);try{let{response:o,span:r}=await st({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new Wt("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw ot(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const tn=[{pattern:/haiku/i,family:"haiku"},{pattern:/sonnet[.-]?4[.-]6/i,family:"sonnet-4.6"},{pattern:/(sonnet-4[.-]5|[.-]?3[.-]5[.-]?sonnet|[.-]?3[.-]7[.-]?sonnet)/i,family:"sonnet-4.5"},{pattern:/sonnet-4(?![.-]5|[.-]6|[.-]1)/i,family:"sonnet-4"},{pattern:/opus[.-]?4[.-]7/i,family:"opus-4.7"},{pattern:/opus[.-]?4[.-]6/i,family:"opus-4.6"},{pattern:/opus[.-]?4[.-]5/i,family:"opus-4.5"},{pattern:/opus/i,family:"opus"}],on="claude-haiku-4.5",nn={haiku:on,"sonnet-4.6":"claude-sonnet-4.6","sonnet-4.5":"claude-sonnet-4.5","sonnet-4":"claude-sonnet-4","opus-4.7":"claude-opus-4.7","opus-4.6":"claude-opus-4.6","opus-4.5":"claude-opus-4.5",opus:"claude-opus-4.5"};const rn=/^claude-/i;function an(e){return e.toLowerCase().replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2")}function sn(e,t){if("string"!=typeof e)return null;let o=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[n,r]=function(e){let t=e.lastIndexOf("["),o=e.lastIndexOf("]");return-1!==t&&o===e.length-1&&o>t?[e.slice(0,t),e.slice(t+1,o)]:[e,null]}(o);if(t.includes(o))return o;if(r){let e=`${n}-${r}`.replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2");if(t.includes(e))return e}let a=function(e){for(let t of tn)if(t.pattern.test(e))return t.family;return null}(n),i=rn.test(n),s=n.replace(/-\d{8}(?::.*)?$/,""),l=r?`-${r}`:"",c=l?[`${s}${l}`,s]:[s];for(let e of i?c:[]){let o=an(e);for(let e of t)if(an(e.replace(/-\d{8}(?::.*)?$/,""))===o)return e}return a?function(e,t,o=null){let n=nn[e];if(!n)return null;if(o){let e=`${n}-${o}`;if(t.includes(e))return e}if(t.includes(n))return n;if("sonnet-4.5"===e)for(let e of["claude-3.5-sonnet"]){let n=o?`${e}-${o}`:e;if(t.includes(n))return n}return null}(a,t,r):null}const ln=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function cn(e,t){if(!e||!t||0===t.length)return null;let o=function(e){return"max"===e?"xhigh":e}(e);if(t.includes(o))return o;let n=ln.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=ln.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}let un;const pn=new Map;function dn(e,t,o){let n=(e??t??"").trim().toLowerCase();if(""!==n&&"none"!==n){if("copilot"!==n)throw Error(`--fallback must be "copilot", got: "${n}"`);if("foundry"!==o)throw Error("--fallback copilot requires --provider foundry");return n}}async function mn(){un=await ee({provider:"copilot"},Qo)}const fn=()=>void 0!==un;function hn(e,t,o=Date.now()){let n=function(e,t=Date.now()){let o=e.get("retry-after-ms");if(null!==o&&Number.isFinite(Number(o))&&Number(o)>=0)return Number(o);let n=e.get("retry-after");if(null!==n){let e=Number(n);if(""!==n.trim()&&Number.isFinite(e)&&e>=0)return 1e3*e;let o=Date.parse(n);if(!Number.isNaN(o))return Math.max(0,o-t)}return 1e4}(t,o);return pn.set(e,Math.max(pn.get(e)??0,o+n)),n}function gn(e){if(!fn()||!Fo(ne)||!e.ok)return;let{headers:t}=e;return t.has("retry-after")||t.has("retry-after-ms")?Response.json({error:{message:"Foundry rate-limited this request (HTTP 200 stream with retry-after).",type:"too_many_requests",code:"rate_limit_exceeded"}},{status:429,headers:t}):void 0}function _n(e,t,o){let{model:n,reason:r}=o,a=f.getActiveSpan();return a?.setAttribute("copilot_api.fallback.upstream","copilot"),a?.setAttribute("copilot_api.fallback.reason",r),a?.setAttribute("copilot_api.fallback.foundry_model",n),ee({provider:"copilot",models:un,rerun:"foundry_429"===r},()=>t(e))}async function yn(e,t){if(!fn()||!Fo(ne))return t(e);let n=await async function(e){try{let t=await e.req.json();return"string"==typeof t.model?t.model:void 0}catch{return}}(e);if(!n||!function(e){let t=un?.data.map(e=>e.id)??[];return t.includes(e)?e:sn(e,t)??void 0}(n))return t(e);if(function(e,t=Date.now()){let o=pn.get(e);return void 0!==o&&(t<o||(pn.delete(e),!1))}(n))return _n(e,t,{model:n,reason:"breaker_open"});try{return await t(e)}catch(r){if(!(e=>e instanceof Wt&&429===e.response.status&&void 0!==e.outgoingBody)(r))throw r;let a=hn(n,r.response.headers);return await(r.response.body?.cancel()),f.getActiveSpan()?.setAttribute("copilot_api.fallback.retry_after_ms",a),o.info(`Foundry rate-limited ${n}; serving it from Copilot for ${Math.ceil(a/1e3)}s`),_n(e,t,{model:n,reason:"foundry_429"})}}const wn=e=>new Promise(t=>{setTimeout(t,e)}),bn=e=>null==e;async function kn(){let e=await Qo();ne.models=e,fn()&&await mn().catch(e=>{o.warn("Failed to refresh the Copilot fallback models:",e)})}const vn=()=>{ne._v1="1.140.0-insider"};var xn=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let Tn,$n,An,Sn,En,On=!1,Cn=!1,In=!1;function Nn(){return Pn()?En:void 0}function Pn(){return void 0!==En&&Date.now()-En.at<6e4}function Rn(){return In?"re-authenticate with `copilot-api auth`; the proxy picks up the new token automatically within a minute":"re-authenticate and update GH_TOKEN / --github-token, then restart the proxy"}const qn=()=>a.readFile(V.GITHUB_TOKEN_PATH,"utf8");function Dn(e){let{span:t,error:n,reason:r,refreshStart:a,attempt:i}=e,s=n.response.status,l=401===s?"Auth token is invalid or expired":"GitHub Copilot subscription not found or not active";ne._t1=void 0,En={status:s,message:l,at:Date.now()},clearInterval(Tn),Tn=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Re.add(1,{reason:r,success:"false"}),qe.add(1,{reason:r}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:p.ERROR,message:n.message}),t.recordException(n),Ye.record(performance.now()-a,{reason:r}),tt(w.ERROR,"ERROR",`Token refresh terminated — HTTP ${s} (${l})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempt":i,"copilot_api.token_refresh.terminal_status":s})}function jn(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;ne._t1=void 0,o.error("All token refresh attempts failed. Stale token has been cleared — next request will trigger re-authentication or fail with a clear 'no token' error.");let s=n instanceof Error?n:Error(String(n));t.setAttribute("copilot_api.token_refresh.success",!1),t.setStatus({code:p.ERROR,message:s.message}),t.recordException(s),qe.add(1,{reason:r}),Ye.record(performance.now()-a,{reason:r}),tt(w.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const Mn=async(e=5,t=1e3,n="scheduled")=>On?(o.debug("Token refresh already in progress, coalescing"),$n):(On=!0,$n=xe.startActiveSpan("copilot_api.token.refresh",async r=>{let a=performance.now();r.setAttribute("copilot_api.token_refresh.reason",n),r.setAttribute("copilot_api.token_refresh.max_retries",e);try{for(let i=1;i<=e;i++)try{r.setAttribute("copilot_api.token_refresh.attempt",i),o.debug(`Refreshing Service token (${n}, attempt ${i}/${e})`);let{token:t,refresh_in:s}=await _o();return ne._t1=t,En=void 0,Cn&&void 0===Tn&&(o.info("Token refresh recovered, resuming scheduled refresh"),Hn(s)),o.debug("Service token refreshed successfully"),ne.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),Re.add(1,{reason:n,success:"true"}),Ye.record(performance.now()-a,{reason:n}),void tt(w.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof Wt&&(401===s.response.status||403===s.response.status))return void Dn({span:r,error:s,reason:n,refreshStart:a,attempt:i});let l=i===e;if(o.error(`Failed to refresh Service token (attempt ${i}/${e}):`,s),Re.add(1,{reason:n,success:"false"}),l)return void jn({span:r,error:s,reason:n,refreshStart:a,maxRetries:e});let c=t*2**(i-1);o.debug(`Retrying token refresh in ${c}ms...`),await new Promise(e=>setTimeout(e,c))}}finally{r.end(),On=!1,$n=void 0}}),$n);async function Fn(){return!!ne._t1||!Pn()&&(void 0!==En&&In&&await async function(){if($n)return;let e=(await qn().catch(()=>{}))?.trim();e&&e!==ne._t2?.trim()&&(ne._t2=e,o.info("Picked up re-authenticated Auth token from disk"),ne.showToken&&o.info("Auth token:",e))}(),await Mn(3,250,"on-demand"),!!ne._t1)}function Hn(e){Tn&&clearInterval(Tn);let t=Math.max(1e3*(e-60),6e4);Tn=setInterval(()=>{Mn(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function Un(e){try{let t=await qn();if(t&&!e?.force)return ne._t2=t,In=!0,ne.showToken&&o.info("Auth token:",t),void await Bn();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=ne.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${vt}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:xt,scope:Tt}),signal:e.signal});if(!t.ok)throw new Wt("Failed to get device code",t);return await t.json()}finally{clearTimeout(o)}}();o.debug("Device code response:",n),o.info(`Please enter the code "${n.user_code}" at ${n.verification_uri}`);try{h.writeSync(n.user_code),o.success("Code copied to clipboard — opening browser...")}catch{o.info("Open the link above and enter the code to authenticate")}!function(e){try{let t,o=y.platform;t="darwin"===o?"open":"win32"===o?"start":"xdg-open",g(t,[e],()=>{})}catch{}}(n.verification_uri);let r=await async function(e){let t=1e3*(e.interval+1);o.debug(`Polling access token with interval of ${t}ms`),o.start("Waiting for authorization...");let n=Date.now(),r=1e3*e.expires_in;for(;;){if(Date.now()-n>=r)throw new xn("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=ne.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${vt}/login/oauth/access_token`,{method:"POST",headers:ut(),body:JSON.stringify({client_id:xt,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await wn(t),o.error("Failed to poll access token:",await n.text());continue}let r=await n.json();if(o.debug("Polling access token response:",r),r.error){if("expired_token"===r.error)throw new xn("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new xn("Authorization was denied. Please run the command again and approve the request.");"authorization_pending"!==r.error&&"slow_down"!==r.error&&o.warn(`Unexpected auth error: ${r.error}`),await wn(t);continue}if(r.access_token)return r.access_token;await wn(t)}catch(e){if(e instanceof xn)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await wn(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(V.GITHUB_TOKEN_PATH,e,{mode:384}))(r),ne._t2=r,In=!0,ne.showToken&&o.info("Auth token:",r),await Bn()}catch(e){throw e instanceof Wt?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function Bn(){let e=await yo();o.success(`Authenticated as ${e.login}`)}async function Ln(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),ne.showToken=e.showToken,await X(),await Un({force:!0}),console.log([""," Get started:",""," $ npx copilot-api-node20@latest start --claude-code"," $ npx copilot-api-node20@latest start --codex",""," Full docs: https://www.npmjs.com/package/copilot-api-node20",""].join("\n")),process.exit(0)}const zn=e({meta:{name:"auth",description:"Run authentication flow"},args:{verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"show-token":{type:"boolean",default:!1,description:"Show token on auth"}},run:({args:e})=>Ln({verbose:e.verbose,showToken:e["show-token"]})}),Gn=.01,Kn=864e5,Jn=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Wn=new Intl.NumberFormat("en-US"),Yn=e=>Jn.format(e*Gn),Vn=e=>e.credits_used??e.entitlement-e.remaining,Xn=(e,t,o)=>{let n=(e=>{let t=new Date(`${e}T00:00:00Z`);return new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth()-1,1))})(t),r=(o.getTime()-n.getTime())/Kn;if(r<.5)return;let a=Vn(e),i=a*Gn/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*Gn,c=new Date(n.getTime()+l/i*Kn);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},Zn=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Wn.format(Vn(e))} of ${Wn.format(e.entitlement)} used`:"n/a",Qn=e=>e.padEnd(14),er=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${Qn("AI credits")}unlimited`);else{let e=Vn(o),t=o.percent_remaining;n.push(`${Qn("AI credits")}${Yn(e)} / ${Yn(o.entitlement)} ${t.toFixed(1)}% left`,`${Qn("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${Qn("")}${Wn.format(e)} of ${Wn.format(o.entitlement)} credits`)}if(n.push("",`${Qn("Chat")}${Zn(e.quota_snapshots.chat)}`,`${Qn("Completions")}${Zn(e.quota_snapshots.completions)}`,"",`${Qn("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/Kn)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=Xn(o,e.quota_reset_date,t);r&&n.push(`${Qn("Burn rate")}~${Jn.format(r.usdPerDay)}/day${(e=>e.exhausted?" — allowance already exhausted":e.exhaustsOn?` — on track to exhaust ${(e=>e.toLocaleDateString("en-US",{month:"short",day:"numeric",timeZone:"UTC"}))(e.exhaustsOn)}`:" — within allowance")(r)}`);let a=o.overage_permitted?"permitted, "+(o.overage_count>0?`${Wn.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${Qn("Overage")}${a}`)}return n.join("\n")},tr=async()=>{let e=`${bt}/copilot_internal/user`,t=ne.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await st({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:kt(ne),signal:o.signal});try{if(!t.ok)throw new Wt("Failed to get usage",t);return await t.json()}catch(e){throw ot(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},or=()=>y.stdout.write("[2J[H"),nr=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,rr=async()=>{let e=await tr();return er(e)},ar=e({meta:{name:"check-usage",description:"Show current usage/quota information"},args:{watch:{alias:"w",type:"boolean",default:!1,description:"Keep running and refresh the report on an interval"},interval:{alias:"i",type:"string",default:"60",description:"Seconds between refreshes in --watch mode (min 10)"}},async run({args:e}){if(await X(),await Un(),!e.watch){try{o.box(await rr())}catch(e){o.error("Failed to fetch usage:",e),y.exit(1)}y.exit(0)}(e=>!!e&&Number.isNaN(Number(e)))(e.interval)?o.info(`Ignoring --interval "${e.interval}" (not a number); using 60s`):(e=>{let t=Number(e);return!(!e||Number.isNaN(t))&&Math.floor(t)<10})(e.interval)&&o.info(`Raising --interval "${e.interval}" to the 10s minimum`);let t=(e=>{let t=Number(e);return!e||Number.isNaN(t)?60:Math.max(10,Math.floor(t))})(e.interval),n=y.stdout.isTTY,r=()=>y.exit(0);for(y.on("SIGINT",r),y.on("SIGTERM",r);;){try{let e=await rr();n&&or(),o.box(e),o.log(nr(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),ir=D(g);async function sr(){let e="win32"===y.platform?"where.exe":"which";try{return await ir(e,["tailscale"]),!0}catch{return!1}}async function lr(){try{let{stdout:e}=await ir("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function cr(e){return e.replace(/\.$/,"")}async function ur(){let e=await lr();if(e?.Online)return cr(e.DNSName)}const pr=D(g),dr=e=>`[1m${e}[0m`,mr=e=>`[2m${e}[0m`,fr=e=>`[36m${e}[0m`,hr=e=>`[32m${e}[0m`,gr=e=>`[31m${e}[0m`,_r=e=>`[33m${e}[0m`,yr=mr(" ─────────────────────────────────────────────────────────────"),wr=s.join(V.APP_DIR,"certs","tailscale"),br=s.join(wr,"cert.pem"),kr=s.join(wr,"key.pem"),vr={certDir:wr,certPath:br,keyPath:kr};function xr(){switch(y.platform){case"darwin":return[` ${mr("Install Tailscale for macOS:")}`,` ${fr("https://tailscale.com/download/mac")}`,` ${mr("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${mr("After installing, open the Tailscale app and sign in.")}`,` ${mr("Then re-run this command.")}`].join("\n");case"linux":return[` ${mr("Install Tailscale for Linux:")}`,` ${fr("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${fr("sudo tailscale up")}`,` ${mr("or")} ${fr("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${mr("Install Tailscale for Windows:")}`,` ${fr("https://tailscale.com/download/windows")}`,"",` ${mr("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${mr("Install Tailscale:")} ${fr("https://tailscale.com/download")}`}}function Tr(){let e=[` ${gr("Tailscale is not running.")}`];return"darwin"===y.platform?e.push(` ${mr("Open the Tailscale app from Applications and sign in.")}`,` ${mr("Download:")} ${fr("https://tailscale.com/download/mac")}`):"win32"===y.platform?e.push(` ${mr("Open the Tailscale app and sign in.")}`,` ${mr("Download:")} ${fr("https://tailscale.com/download/windows")}`):e.push(` ${mr("Connect with:")} ${fr("sudo tailscale up")}`),e.push("",` ${mr("Then re-run this command.")}`),e.join("\n")}async function $r(){try{return await a.access(br),await a.access(kr),!0}catch{return!1}}function Ar(e){console.log(""),console.log(yr),console.log(` ${dr("Claude Cowork Setup")} ${mr("— Diagnostic")}`),console.log(yr),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?hr("✅"):"missing"===n.status?gr("❌"):_r("❓");let r=n.detail?mr(` ${n.detail}`):"";t.push(` ${e} ${o}${r}`)}return t}(e))console.log(t);console.log("");let t=Object.values(e).filter(e=>"missing"===e.status);0===t.length?console.log(` ${hr("All checks passed.")}`):console.log(` ${gr(`${t.length} issue(s).`)} Run ${fr("copilot-api cowork-setup install")} to fix.`),console.log("")}const Sr={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},Er=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await sr();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return Ar(e),console.log(""),console.log(xr()),void console.log("");let o=await lr();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},Ar(e),console.log(Tr()),void console.log("");let n=cr(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await $r();e["tailscale-cert"]=r?{status:"ok",detail:br}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),Ar(e)}(),y.exit(0)}}),Or=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:Sr},async run({args:e}){await async function(e){if(console.log(""),console.log(yr),console.log(` ${dr("Claude Cowork Setup")} ${mr("— Install")}`),console.log(yr),console.log(""),!await sr())return console.log(` ${gr("Tailscale is not installed.")}`),console.log(""),console.log(xr()),console.log(""),console.log(` ${mr("After installing, run")} ${fr("tailscale up")} ${mr("to connect, then re-run this command.")}`),void console.log("");let t=await lr();if(!t||!t.Online)return console.log(Tr()),void console.log("");let n=cr(t.DNSName);if(console.log(` ${mr("Tailscale hostname:")} ${dr(n)}`),console.log(""),console.log(` ${dr("Generating TLS certificate via Tailscale…")}`),console.log(` ${mr("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${fr(`$ tailscale cert --cert-file ${br} --key-file ${kr} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(wr,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await pr("tailscale",["cert","--cert-file",br,"--key-file",kr,n]),console.log(` ${hr("✓ Certificate generated")}`)}catch(e){let t=e instanceof Error?e.message:String(e);return void o.error(`Failed to generate cert: ${t}`)}console.log(""),console.log(yr),console.log(` ${dr("Next steps")}`),console.log(yr),console.log(""),console.log(` ${dr("1.")} Start the proxy:`),console.log(` ${fr("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${dr("2.")} In Cowork ${mr("→")} Settings ${mr("→")} Inference Provider, set:`),console.log(` ${dr("inferenceGatewayBaseUrl")} = ${fr(`https://${n}:<port>`)}`),console.log(` ${mr("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${dr("3.")} Restart Cowork ${mr("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${mr("For Cowork's own configuration docs, see:")}`),console.log(` ${fr("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),y.exit(0)}}),Cr=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:Sr},async run({args:e}){await async function(e){if(console.log(""),console.log(yr),console.log(` ${dr("Claude Cowork Setup")} ${mr("— Revert")}`),console.log(yr),console.log(""),!await $r())return console.log(` ${mr("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${dr("Remove Tailscale cert files:")}`),console.log(` ${mr(br)}`),console.log(` ${mr(kr)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(wr,{recursive:!0}),console.log(` ${hr("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${mr("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),y.exit(0)}}),Ir=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:Er,install:Or,revert:Cr}}),Nr=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function Pr(e){if(!Nr.test(e))return e;let t=e,o=String.fromCodePoint(27),n=t.split(o);if(n.length>1){t=n[0];for(let e=1;e<n.length;e++){let r=n[e],a=r.match(/^\[[0-9;]*[a-z]/i);t+=a?r.slice(a[0].length):o+r}}return t.replaceAll(/[\u200B-\u200D\uFEFF]/g,"").replaceAll(/[\u2060-\u2064]/g,"").replaceAll(/[\u206A-\u206F]/g,"").replaceAll(/[\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/g,"").replaceAll(/[\uFFF0-\uFFFF]/g,"").replaceAll(/[\x00-\x08\v\f\x0E-\x1F]/g,"")}function Rr(e){return"string"==typeof e?Pr(e):Array.isArray(e)?function(e){let t;for(let o=0;o<e.length;o++){let n=e[o],r=Rr(n);!t&&r!==n&&(t=e.slice(0,o)),t?.push(r)}return t??e}(e):e&&"object"==typeof e?function(e){let t,o=Object.entries(e),n="thinking"===e.type;for(let e=0;e<o.length;e++){let[r,a]=o[e],i=!n||"thinking"!==r&&"signature"!==r?Rr(a):a;!t&&(i!==a||"__proto__"===r)&&(t=qr({},o,e)),t&&(t[r]=i)}let r=t??e;return"object"===r.type&&!("properties"in r)&&(t??=qr({},o,o.length),t.properties={}),t??e}(e):e}function qr(e,t,o){for(let n=0;n<o;n++)e[t[n][0]]=t[n][1];return e}const Dr="x-copilot-api-self-test",jr=q();const Mr=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function Fr(e){return!e.id.startsWith("text-embedding")&&"embeddings"!==e.capabilities.type&&!function(e){let t=e.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):/gpt-[\d.]+-codex/i.test(e.id)}(e)&&!function(e){return"disabled"===e.policy?.state}(e)}function Hr(e){try{!function(e){let{c:t,start:o,span:n}=e,r=t.get("requestData"),a=t.res.status,i=r?.model??"unknown",s=r?.streaming??!1,l=Math.round(performance.now()-o);if(n.setAttribute("http.status_code",a),n.setAttribute("copilot_api.model",i),n.setAttribute("copilot_api.streaming",s),n.setAttribute("copilot_api.duration_ms",l),r?._d1&&n.setAttribute("copilot_api.copilot_duration_ms",r._d1),r?.tokenUsage){let e=r.tokenUsage;n.setAttribute("copilot_api.input_tokens",e.inputTokens),n.setAttribute("copilot_api.output_tokens",e.outputTokens),n.setAttribute("copilot_api.total_tokens",e.totalTokens),e.cachedTokens&&n.setAttribute("copilot_api.cached_tokens",e.cachedTokens)}t.res.headers.forEach((e,t)=>{let o=t.toLowerCase();at.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),a>=400&&n.setStatus({code:p.ERROR,message:`HTTP ${a}`})}(e)}catch(e){o.warn("Error enriching span during finalization:",e)}try{!function(e){let{c:t,start:o,method:n,path:r,endpointType:a,requestId:i}=e;if(t.get("isSelfTest"))return;let s=Math.round(performance.now()-o),l=t.get("requestData"),c=t.res.status,u=l?.model??"unknown",p=l?.streaming??!1,d={method:n,path:r,status_code:String(c),model:u,streaming:String(p),endpoint_type:a};if(Ae.add(1,d),ze.record(s,d),c>=400&&Se.add(1,{method:n,path:r,status_code:String(c),error_type:c>=500?"server_error":"client_error"}),l?.tokenUsage){let e=l.tokenUsage,t={model:u,endpoint_type:a};e.inputTokens&&(Ee.add(e.inputTokens,t),Xe.record(e.inputTokens,t)),e.outputTokens&&(Oe.add(e.outputTokens,t),Ze.record(e.outputTokens,t)),e.cachedTokens&&Ce.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&ge.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const Ur=1048576;const Br=async()=>{if(!te())return xe.startActiveSpan("copilot_api.approval.await",async e=>{let t=performance.now();try{let n=await o.prompt("Accept incoming request?",{type:"confirm"}),r=performance.now()-t;if(e.setAttribute("copilot_api.approval.wait_duration_ms",r),et.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),He.add(1,{result:"rejected"}),new Wt("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),He.add(1,{result:"approved"})}finally{e.end()}})};async function Lr(e){if(Lo(ne)||await Fn())return null;let t=Nn();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${Rn()}`,type:"authentication_error"}},401)):(f.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({error:{message:"Service token not yet available; retry shortly",type:"service_unavailable"}},503))}function zr(e){let t=e.prompt_tokens||0,o=e.completion_tokens||0;return{inputTokens:t,outputTokens:o,totalTokens:e.total_tokens||t+o,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function Gr(e,t){e.setAttributes(function(e){let t={};void 0!==e.prompt_tokens&&(t["copilot_api.input_tokens"]=e.prompt_tokens),void 0!==e.completion_tokens&&(t["copilot_api.output_tokens"]=e.completion_tokens),void 0!==e.total_tokens&&(t["copilot_api.total_tokens"]=e.total_tokens);let o=e.prompt_tokens_details?.cached_tokens;return void 0!==o&&(t["copilot_api.cached_tokens"]=o),t}(t))}var Kr=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Jr(e){if(!e||"string"!=typeof e)throw new Kr("Model name is required and must be a string");if("foundry"===ne.provider)return e;if(!ne.models?.data)throw new Kr("Models not available. Please try again later.",503);let t=ne.models.data.map(e=>e.id);if(t.includes(e))return e;let o=sn(e,t);if(!o)throw Ne.add(1,{requested_model:e}),new Kr(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function Wr(e){let t=ne.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):"foundry"===ne.provider?Wo(e):/gpt-[\d.]+-codex/i.test(e)}async function Yr(e){if(void 0===e.rateLimitSeconds||te())return;let t=e.rateLimitSeconds;return xe.startActiveSpan("copilot_api.rate_limit.check",async n=>{try{let r=Date.now();if(n.setAttribute("copilot_api.rate_limit.configured_seconds",t),!e.lastRequestTimestamp)return e.lastRequestTimestamp=r,void n.setAttribute("copilot_api.rate_limit.action","allowed");let a=(r-e.lastRequestTimestamp)/1e3;if(n.setAttribute("copilot_api.rate_limit.elapsed_seconds",a),a>t)return e.lastRequestTimestamp=r,void n.setAttribute("copilot_api.rate_limit.action","allowed");let i=Math.ceil(t-a);if(n.setAttribute("copilot_api.rate_limit.wait_seconds",i),!e.rateLimitWait)throw n.setAttribute("copilot_api.rate_limit.action","rejected"),Ie.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new Wt("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),Ie.add(1,{action:"waited",source:"local"}),Je.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await wn(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}var Vr=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function Xr(e){if(e instanceof Vr)return{type:e.type,message:e.message};if(e instanceof Wt){let t=e.response.status;return{type:529===t?"overloaded_error":`upstream_error_${t}`,message:`Upstream error (${t}) while streaming response`}}return{type:"api_error",message:"Stream interrupted before completion"}}async function Zr(e,t){let{type:n,message:r}=Xr(t);try{await e.writeSSE({event:"error",data:JSON.stringify({type:"error",error:{type:n,message:r}})})}catch(e){o.debug("Failed to emit Anthropic stream error frame:",e)}}async function Qr(e,t){let{type:n,message:r}=Xr(t);try{await e.writeSSE({event:"error",data:JSON.stringify({error:{message:r,type:n}})})}catch(e){o.debug("Failed to emit OpenAI stream error frame:",e)}}function ea(e){if("number"==typeof e){if(!Number.isFinite(e))return null;let t=Math.floor(e);return t>0?t:null}if("string"==typeof e){let t=e.trim();if(!t)return null;let o=Number(t);if(!Number.isFinite(o))return null;let n=Math.floor(o);return n>0?n:null}return null}function ta(e,t,o){return Math.min(Math.max(e,t),o)}function oa(e,t=0){if(t>5||!e||"object"!=typeof e)return null;let o=e.error;if(!o||"object"!=typeof o)return null;let n=o.code;if("string"==typeof n)return n;let r=o.message;if("string"!=typeof r)return null;try{return oa(JSON.parse(r),t+1)}catch{return null}}function na(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=ea(o.capabilities.supports.min_thinking_budget),r=ea(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:ea(o.capabilities.limits?.max_output_tokens)??void 0}}function ra(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=ta(ea(e.requestedBudget)??o,o,n),a=ea(e.maxTokens);if(a||=r+1,t.maxOutputTokens&&a>t.maxOutputTokens&&(a=t.maxOutputTokens),a<=r){let e=Math.min(r,a-1);if(e>=o)r=e;else{let e=o+1;if(t.maxOutputTokens&&e>t.maxOutputTokens)return{thinkingBudget:null,maxTokens:a};a=e,r=o}}return a<=r?{thinkingBudget:null,maxTokens:a}:{thinkingBudget:r,maxTokens:a}}function aa(e,t){if(bn(e.thinking_budget))return e;let o=na(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=ra({requestedBudget:e.thinking_budget,maxTokens:e.max_tokens,config:o});return null===n.thinkingBudget?{...e,max_tokens:n.maxTokens,thinking_budget:void 0}:{...e,max_tokens:n.maxTokens,thinking_budget:n.thinkingBudget}}function ia(e){return"invalid_thinking_budget"===oa(e)}async function sa(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(bn(t.thinking_budget)||!(o instanceof Error))return null;let a,i,s=o;if(!(s.response instanceof Response)||400!==s.response.status)return null;if(void 0!==r)a=r;else try{a=await s.response.clone().text()}catch{return null}try{i=JSON.parse(a)}catch{return null}if(!ia(i))return null;let l=na(n,t.model);return l?function(e,t){let o=ra({requestedBudget:e.thinking_budget,maxTokens:e.max_tokens,config:t});if(null===o.thinkingBudget)return{...e,max_tokens:o.maxTokens,thinking_budget:void 0};let n=o.thinkingBudget,r=ea(e.thinking_budget);if(r&&r===o.thinkingBudget){let e=n+1;e<=t.bounds.max&&(!o.maxTokens||e<o.maxTokens)&&(n=e)}let a=o.maxTokens;if((!a||a<=n)&&(a=n+1),t.maxOutputTokens&&a>t.maxOutputTokens){if(!(t.maxOutputTokens>n))return{...e,max_tokens:t.maxOutputTokens,thinking_budget:void 0};a=t.maxOutputTokens}return{...e,max_tokens:a,thinking_budget:n}}(t,l):{...t,thinking_budget:void 0}}function la(e,t){let o=!1;return()=>{if(o)return;o=!0;let n=e.get("requestData")||{};n.upstreamTtfbMs=performance.now()-t,e.set("requestData",n)}}function ca(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const ua=new Map,pa=new Map,da=new Set;let ma,fa,ha;function ga(e){return!e.closed&&!e.destroyed}function _a(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new I(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return ua.set(t,Date.now()),Be.add(1,{event:"created",origin:e}),tt(w.INFO,"INFO",`HTTP/2 client created for ${e}`,{"copilot_api.h2.event":"created","copilot_api.h2.origin":e}),t.on("connect",()=>{o.debug(`HTTP/2 client connected to ${e}`)}),t.on("error",t=>{o.debug(`HTTP/2 client error for ${e}:`,t.message)}),t.on("disconnect",(n,r,a)=>{o.debug(`HTTP/2 client disconnected from ${e}:`,a.message);let i=da.has(t);Be.add(1,{event:"goaway",origin:e}),tt(i?w.WARN:w.DEBUG,i?"WARN":"DEBUG",`HTTP/2 client disconnected from ${e}: ${a.message}`,{"copilot_api.h2.event":"goaway","copilot_api.h2.origin":e,"copilot_api.h2.error":a.message}),pa.delete(t),da.delete(t),ua.delete(t),ga(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function ya(e,t){if(!ne.connectivity.h2)return;if(ma&&ma!==e&&function(){for(let e of[...pa.keys(),...da])ga(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});pa.clear(),da.clear(),ua.clear()}(),ma=e,t?.fresh){let t=_a(e);return da.add(t),t}let n=Date.now();for(let[t]of pa)if(n-(ua.get(t)??0)>=6e5)pa.delete(t),ua.delete(t),ga(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Be.add(1,{event:"rotated",origin:e}),tt(w.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(ga(t))return pa.delete(t),da.add(t),t;pa.delete(t),ua.delete(t)}let r=_a(e);return da.add(r),r}function wa(e){e&&da.delete(e)&&(ga(e)?pa.set(e,Date.now()):ua.delete(e))}function ba(){ha||(ha=setInterval(()=>{!function(){let e=Date.now(),t=ne.connectivity.h2Keepalive,n=pa.size;for(let[r,a]of pa)e-a<6e4||t&&n<=1||(pa.delete(r),ua.delete(r),n--,ga(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Be.add(1,{event:"idle_reaped",origin:ma??""}),tt(w.INFO,"INFO",`HTTP/2 idle connection reaped for ${ma}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":ma??""}))}()},3e4),ha.unref())}function ka(){fa||(o.debug("Starting HTTP/2 keepalive (every 45s)"),fa=setInterval(()=>{(async function(){if(0===pa.size&&0===da.size){if(ma){let e=_a(ma);pa.set(e,Date.now())}return}let e=[...pa.keys()];for(let t of e)pa.delete(t);await Promise.allSettled(e.map(async e=>{if(ga(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:_t(ne)});await n.dump(),Ue.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),pa.set(e,Date.now())}catch(t){Ue.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Be.add(1,{event:"error",origin:ma??""}),ua.delete(e),ga(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else ua.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),fa.unref(),ba())}function va(e){return e.max_completion_tokens??e.max_tokens}async function xa(e,t,o){try{if(!e.ok)throw new Wt("Failed to create chat completions",e,{outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders});let n=await e.json();return n.id&&t.setAttribute("copilot_api.response.id",n.id),n.usage&&Gr(t,n.usage),n}catch(e){throw ot(t,e),e}finally{t.end()}}const Ta=e=>Fo(ne)?e:function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t)){let{max_completion_tokens:t,...o}=e;return null==t?o:{...o,max_tokens:t}}let{max_tokens:o,max_completion_tokens:n,stop:r,...a}=e,i=va(e);return null==i?a:{...a,max_completion_tokens:i}}(e,ne.models),$a=e=>Fo(ne)?e:Rr(e),Aa=async e=>{let t=$a(e);try{return await Sa(t)}catch(e){if(e instanceof Wt&&401===e.response.status)return await Oo(),Sa(t);let n;if(e instanceof Wt)try{n=await e.response.clone().text()}catch{n=void 0}let r=await sa({payload:t,error:e,models:ne.models,errorBodyText:n});if(r)return e instanceof Wt&&void 0!==n&&o.warn(`Upstream rejected thinking_budget (status ${e.response.status}): ${n.slice(0,500)}`),o.warn("Adjusting thinking_budget payload and retrying once..."),await Sa($a(r));throw e}},Sa=async e=>{if(!Lo(ne))throw Error("Service token not found");let t=e.messages.some(e=>"string"!=typeof e.content&&e.content?.some(e=>"image_url"===e.type)),o=e.messages.some(e=>["assistant","tool"].includes(e.role)),n={...Bo(ne,t),"X-Initiator":o?"agent":"user"},r=Uo(ne),a=`${r}/chat/completions`,i=ne.timeoutMs,s=Ta(e),l=JSON.stringify(s),c={"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":i,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.message_count":e.messages.length,"copilot_api.max_tokens":va(e)??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":o?"agent":"user"};for(let t=0;t<=1;t++){let o=ya(r,{fresh:t>0}),s=new AbortController,u=Vt(s,i);try{let{statusCode:r,headers:u,body:p,span:d}=await lt({spanName:"copilot POST /chat/completions",url:a,target:"chat_completions",headers:n,body:l,signal:s.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...c,"copilot_api.h2.retry_attempt":t},dispatcher:o}),m=new Response(p,{status:r,headers:u});if(e.stream){if(!m.ok)throw d.end(),new Wt("Failed to create chat completions",m,{outgoingBody:l,outgoingHeaders:n});return{events:H(m),span:d,release:()=>wa(o)}}try{return await xa(m,d,{outgoingBody:l,outgoingHeaders:n})}finally{wa(o)}}catch(e){if(wa(o),await Jt(e,{attempt:t,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Ea=new Map;const Oa=["none","minimal","low","medium","high","xhigh","max"];function Ca(e,t){if(!e.reasoning)return e;if(0===t.length){let{reasoning:t,...o}=e;return o}let o=e.reasoning.effort;if(!o)return e;let n=function(e,t){if(t.includes(e))return e;let o=Oa.indexOf(e);if(-1===o)return t[0];let n,r=1/0;for(let e of t){let t=Oa.indexOf(e);if(-1===t)continue;let a=Math.abs(t-o);a<r&&(r=a,n=e)}return n??t[0]}(o,t);return n&&n!==o?{...e,reasoning:{...e.reasoning,effort:n}}:e}function Ia(e,t){if(!e.reasoning)return null;let n=function(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}let{param:o,code:n,message:r=""}=t.error??{};if("reasoning.effort"===o||"reasoning"===o){if("unsupported_value"===n){let e=[...(/Supported values are:(.*)$/i.exec(r)?.[1]??"").matchAll(/\x27([^\x27]+)\x27/g)].map(e=>e[1]);return e.length>0?{kind:"unsupported_value",supported:e}:void 0}if("unsupported_parameter"===n)return{kind:"unsupported_parameter"}}}(t);if(!n)return null;let r="unsupported_value"===n.kind?n.supported:[];Ea.set(e.model,r);let a=Ca(e,r);return a===e?null:(o.debug(`Foundry rejected reasoning.effort=${e.reasoning.effort} on ${e.model}; retrying with ${a.reasoning?.effort??"no reasoning"}`),a)}async function Na(e,t,o){try{if(!e.ok)throw new Wt("Failed to create responses",e,{outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders});let n=await e.json();return n.id&&t.setAttribute("copilot_api.response.id",n.id),n.usage&&Gr(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens,prompt_tokens_details:n.usage.input_tokens_details}),n}catch(e){throw ot(t,e),e}finally{t.end()}}const Pa=async e=>{let t=Fo(ne),o=t?function(e){let t=Ea.get(e.model);return t?Ca(e,t):e}(e):e,n=!1,r=!1;for(;;)try{return await Ra(o)}catch(e){if(!(e instanceof Wt))throw e;if(401===e.response.status&&!n){n=!0,await Oo();continue}if(t&&400===e.response.status&&!r){r=!0;let t=Ia(o,await e.response.clone().text().catch(()=>{}));if(t){o=t;continue}}throw e}},Ra=async e=>{if(!Lo(ne))throw Error("Service token not found");let t=Fo(ne)?e:Rr(e),o={...Bo(ne),"X-Initiator":"agent"},n=Uo(ne),r=`${n}/responses`,a=ne.timeoutMs,i=JSON.stringify(t),s={"copilot_api.model":t.model,"copilot_api.streaming":!!t.stream,"copilot_api.timeout_ms":a,"copilot_api.has_tools":!!t.tools?.length,"copilot_api.tool_count":t.tools?.length??0,"copilot_api.max_output_tokens":t.max_output_tokens??0,"copilot_api.api_type":"responses"};for(let e=0;e<=1;e++){let l=ya(n,{fresh:e>0}),c=new AbortController,u=Vt(c,a);try{let{statusCode:n,headers:u,body:p,span:d}=await lt({spanName:"copilot POST /responses",url:r,target:"responses",headers:o,body:i,signal:c.signal,headersTimeout:a,bodyTimeout:3*a,extraAttributes:{...s,"copilot_api.h2.retry_attempt":e},dispatcher:l}),m=new Response(p,{status:n,headers:u});if(t.stream){let e=gn(m);if(e&&(d.setAttribute("copilot_api.foundry.throttled_stream",!0),await(m.body?.cancel())),!m.ok||e)throw d.end(),new Wt("Failed to create responses",e??m,{outgoingBody:i,outgoingHeaders:o});return{events:H(m),span:d,release:()=>wa(l)}}try{return await Na(m,d,{outgoingBody:i,outgoingHeaders:o})}finally{wa(l)}}catch(t){if(wa(l),await Jt(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},qa=e=>Object.hasOwn(e,"output");function Da(e){if("response.completed"!==e.type&&"response.incomplete"!==e.type)return null;let t=e.response.usage;return t?{prompt_tokens:t.input_tokens,completion_tokens:t.output_tokens,total_tokens:t.total_tokens,...t.input_tokens_details&&{prompt_tokens_details:{cached_tokens:t.input_tokens_details.cached_tokens}}}:null}var ja=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const Ma=new Set(["model","messages","max_tokens","max_completion_tokens","temperature","top_p","stream","stream_options","tools","tool_choice","parallel_tool_calls","user","reasoning_effort","response_format"]);function Fa(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new ja(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new ja(`logprobs is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","logprobs")}(e);let t=function(e){return e.filter(e=>"system"===e.role||"developer"===e.role).map(e=>Ua(e.content)).filter(Boolean).join("\n\n")||void 0}(e.messages),o=function(e){let t=[];for(let o of e)switch(o.role){case"user":{let e=Ba(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=Ua(o.content);e&&t.push({type:"message",role:"assistant",content:[{type:"output_text",text:e}]});for(let e of o.tool_calls??[])t.push({type:"function_call",call_id:e.id,name:e.function.name,arguments:e.function.arguments});break}case"tool":t.push({type:"function_call_output",call_id:o.tool_call_id??"",output:Ua(o.content)})}return t}(e.messages);if(0===o.length)throw new ja("request has no translatable message content","invalid_request","messages");let n={model:e.model,input:o,store:!1};t&&(n.instructions=t);let r=e.max_completion_tokens??e.max_tokens;"number"==typeof r&&(n.max_output_tokens=Math.max(r,16)),e.stream&&(n.stream=!0),Ha(e.temperature)&&(n.temperature=e.temperature),Ha(e.top_p)&&(n.top_p=e.top_p),Ha(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),Ha(e.user)&&(n.user=e.user),e.reasoning_effort&&(n.reasoning={effort:e.reasoning_effort}),e.tools?.length&&(n.tools=e.tools.filter(e=>"function"===e.type).map(e=>({type:"function",name:e.function.name,description:e.function.description,parameters:e.function.parameters}))),e.tool_choice&&(n.tool_choice="string"==typeof e.tool_choice?e.tool_choice:{type:"function",name:e.tool_choice.function.name});let a=function(e){if(e)switch(e.type){case"json_schema":{let{name:t,description:o,schema:n,strict:r}=e.json_schema;return{type:"json_schema",name:t,description:o,schema:n,strict:r}}case"json_object":return{type:"json_object"};default:return{type:"text"}}}(e.response_format);return a&&(n.text={format:a}),n}function Ha(e){return null!=e}function Ua(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function Ba(e){if("string"==typeof e)return e?[{type:"input_text",text:e}]:[];let t=[];for(let o of e??[])if("text"===o.type)o.text&&t.push({type:"input_text",text:o.text});else{if("image_url"!==o.type)throw new ja(`content part type '${o.type}' is not supported for models served via the Responses API`,"unsupported_content_type","messages");t.push({type:"input_image",image_url:o.image_url.url,detail:"low"===o.image_url.detail?"low":"high"})}return t}function La(e){let t={prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens};return void 0!==e.input_tokens_details?.cached_tokens&&(t.prompt_tokens_details={cached_tokens:e.input_tokens_details.cached_tokens}),void 0!==e.output_tokens_details?.reasoning_tokens&&(t.completion_tokens_details={reasoning_tokens:e.output_tokens_details.reasoning_tokens}),t}function za(e,t){if("incomplete"===e.status){let t=e.incomplete_details?.reason;if("content_filter"===t)return"content_filter";if("max_output_tokens"===t)return"length"}return t?"tool_calls":"stop"}function Ga(e,t,o=null){let n=e.roleSent?t:{role:"assistant",...t};return e.roleSent=!0,{id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[{index:0,delta:n,logprobs:null,finish_reason:o}]}}function Ka(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function Ja(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=Ka(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[Ga(t,{tool_calls:[{index:r,function:{arguments:o.arguments}}]})]):[];let a=function(e,t,o){let n=e.toolCallCount++;return e.toolCallIndexByItemId.set(t,n),e.toolCallIndexByOutputIndex.set(o,n),n}(t,o.id,e.output_index),i=n?o.arguments:"";return i&&t.toolCallsWithArgs.add(a),[Ga(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function Wa(e,t){let o=[Ga(e,{},za(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=La(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function Ya(e,t){switch(e.type){case"response.created":case"response.in_progress":return t.id=e.response.id||t.id,t.model=e.response.model||t.model,e.response.created_at&&(t.created=e.response.created_at),{chunks:[]};case"response.output_text.delta":case"response.refusal.delta":return e.delta?{chunks:[Ga(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:Ja(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=Ka(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[Ga(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:Wa(t,e.response),done:!0};case"response.failed":return{chunks:[],error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}};case"error":return{chunks:[],error:{type:e.code??"api_error",message:e.message??"Response generation failed"}};default:return{chunks:[]}}}const Va="openai_responses";function Xa(e){let t=performance.now(),n=xe.startActiveSpan("copilot_api.translate.openai_to_responses",t=>{try{return t.setAttribute("copilot_api.translation.direction","openai_to_responses"),t.setAttribute("copilot_api.translation.message_count",e.messages.length),t.setAttribute("copilot_api.translation.has_tools",!!e.tools?.length),Fa(e)}finally{t.end()}});We.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!Ma.has(e)&&null!=t).map(([e])=>e)}(e);return r.length>0&&o.debug(`Dropped chat-only fields with no Responses API equivalent: ${r.join(", ")}`),n}function Za(e){let t=performance.now(),o=xe.startActiveSpan("copilot_api.translate.responses_to_openai",t=>{try{return t.setAttribute("copilot_api.translation.direction","responses_to_openai"),function(e){let t="",o=!1,n=[];for(let r of e.output)if("message"===r.type)for(let e of r.content)"output_text"===e.type?(t+=e.text,o=!0):"refusal"===e.type&&(t+=e.refusal,o=!0);else"function_call"===r.type&&n.push({id:r.call_id,type:"function",function:{name:r.name,arguments:r.arguments}});let r={id:e.id,object:"chat.completion",created:e.created_at,model:e.model,choices:[{index:0,message:{role:"assistant",content:o?t:null,...n.length>0&&{tool_calls:n}},logprobs:null,finish_reason:za(e,n.length>0)}]};return e.usage&&(r.usage=La(e.usage)),r}(e)}finally{t.end()}});return We.record(performance.now()-t,{direction:"responses_to_openai"}),o}function Qa(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=La(t.usage);a.tokenUsage=zr(o)}return a._d1=r,a.upstreamTtfbMs=r,a.upstreamTotalMs=r,e.set("requestData",a),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(t).slice(-400)),"failed"===t.status?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({error:{message:t.error?.message??"Response generation failed",type:"api_error",code:t.error?.code??null}},500)):e.json(Za(t))}async function ei(e,t,n){let r;try{r=Xa(t)}catch(t){if(t instanceof ja)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t.message,type:"invalid_request_error",param:t.param,code:t.code}},400);throw t}o.debug("Translated chat → Responses API payload:",JSON.stringify(r).slice(-400)),e.set("requestData",{model:r.model,streaming:!!r.stream}),ne.manualApprove&&!n.isSelfTest&&await Br();let a=await Lr(e);if(a)return a;let i=performance.now(),s=await Pa(r),l=performance.now()-i;if(Ge.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),qa(s))return Qa(e,s,l);let{events:c,span:u,release:p}=s,d=function(e){return{id:"",model:e.model,created:Math.floor(Date.now()/1e3),includeUsage:e.includeUsage,roleSent:!1,toolCallCount:0,toolCallIndexByItemId:new Map,toolCallIndexByOutputIndex:new Map,toolCallsWithArgs:new Set}}({model:r.model,includeUsage:!0===t.stream_options?.include_usage});return F(e,async t=>{let n=null,a=0,s=performance.now(),m=la(e,i);try{try{for await(let i of c){if(m(),!i.data||"[DONE]"===i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}a++,Fe.add(1,{model:r.model,endpoint_type:Va});let c=Da(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=zr(c),t._d1=l,e.set("requestData",t)}let u=Ya(s,d);if(u.error)throw new Vr(u.error.type,u.error.message);for(let e of u.chunks)await t.writeSSE({data:JSON.stringify(e)});u.done&&await t.writeSSE({data:"[DONE]"})}let u={model:r.model,endpoint_type:Va};Ke.record(performance.now()-s,u),Qe.record(a,u),ca(e,i)}catch(o){throw nt(u,e.get("requestSpan"),o),await Qr(t,o),o}finally{n&&Gr(u,n),u.end(),p()}let f=e.get("requestId");f&&ge.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function ti(e,t){if(!e.data)return e;try{let o=JSON.parse(e.data);if(o.usage&&t(o.usage),void 0!==o.usage?.prompt_tokens_details?.cached_tokens)return{...e,data:JSON.stringify({...o,usage:{...o.usage,prompt_tokens_details:void 0}})}}catch(t){o.warn("Failed to parse streaming chunk:",e.data.slice(0,200),t)}return e}async function oi(e){let t=!0===e.get("isSelfTest");t||await Yr(ne);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return xe.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Jr(e.model);return t.setAttribute("copilot_api.model.normalized",n),n===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),Pe.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}(n)}catch(t){if(t instanceof Kr)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}if(Wr(n.model))return ei(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),ne.manualApprove&&!t&&await Br(),"foundry"!==ne.provider&&(n=function(e){if(!bn(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!bn(e.max_tokens))return e;let t=(ne.models?.data.find(t=>t.id===e.model))?.capabilities.limits?.max_output_tokens;return o.debug("Set max_tokens to:",JSON.stringify(t)),{...e,max_tokens:t}}(n),n=aa(n,ne.models)),bn(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await Lr(e);if(r)return r;let a=performance.now(),i=await Aa(n),s=performance.now()-a;if(Ge.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),ni(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=zr(i.usage)),t._d1=s,t.upstreamTtfbMs=s,t.upstreamTotalMs=s,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(i)),e.json(i)}let{events:l,span:c,release:u}=i;return F(e,async t=>{let o={value:null},r=0,i=performance.now(),p=la(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(r++,Fe.add(1,{model:n.model,endpoint_type:"openai"}),i=ti(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=zr(t),n._d1=s,e.set("requestData",n)})),await t.writeSSE(i)}let c=performance.now()-i,u={model:n.model,endpoint_type:"openai"};if(Ke.record(c,u),Qe.record(r,u),ca(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=zr(o.value),t._d1=s,e.set("requestData",t))}}catch(o){throw nt(c,e.get("requestSpan"),o),await Qr(t,o),o}finally{o.value&&Gr(c,o.value),c.end(),u()}let d=e.get("requestId");d&&ge.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const ni=e=>Object.hasOwn(e,"choices"),ri=new j;ri.post("/",async e=>{try{return await oi(e)}catch(t){return await go(e,t)}});const ai=async e=>{if(!Lo(ne))throw Error("Service token not found");let t=`${Uo(ne)}/embeddings`,o=Bo(ne),n=ne.timeoutMs,r=new AbortController,a=Vt(r,n),i=JSON.stringify(e);try{let{response:n,span:a}=await st({spanName:"copilot POST /embeddings",url:t,target:"embeddings",method:"POST",headers:o,body:i,signal:r.signal,extraAttributes:{"copilot_api.model":e.model,"copilot_api.input_count":Array.isArray(e.input)?e.input.length:1}});try{if(!n.ok)throw new Wt("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw ot(a,e),e}finally{a.end()}}finally{clearTimeout(a)}},ii=new j;ii.post("/",async e=>{try{let t=await e.req.json();try{t.model=Jr(t.model)}catch(t){if(t instanceof Kr)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:t.model});let o=await Lr(e);if(o)return o;let n=performance.now(),r=await(async e=>{try{return await ai(e)}catch(t){if(t instanceof Wt&&401===t.response.status)return await Oo(),ai(e);throw t}})(t),a=performance.now()-n;Ge.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=zr(r.usage),i._d1=a,e.set("requestData",i),e.json(r)}catch(t){return await go(e,t)}});const si=new j;let li=null,ci=null;function ui(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function pi(e){return!ui(e)}si.get("/",async e=>{let t,o=function(){if(Fo(ne)){if(!Lo(ne))return"missing";let e=ne.foundry?.bearerExpiresAt;return void 0!==e&&e<=Date.now()?"expired":"valid"}let e=ne._t1;if(!e)return"missing";try{let t=e.split(".");if(t.length<2)return"expired";let o=(t[1]??"").replaceAll("-","+").replaceAll("_","/"),n=JSON.parse(atob(o)),r="object"==typeof n&&n&&"exp"in n&&"number"==typeof n.exp?n.exp:void 0;return void 0!==r&&1e3*r<Date.now()?"expired":"valid"}catch{return"expired"}}(),n=await async function(){let e=Date.now(),t=li;return t&&e-t.timestamp<3e4?{result:t.result}:ci||(ci=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${Uo(ne)}/models`,n=await fetch(t,{method:"GET",headers:Bo(ne),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return li={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return li={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),ci=null}})(),ci)}();t="valid"===o&&"reachable"===n.result?"ok":"valid"!==o&&"reachable"!==n.result?"unhealthy":"degraded";let r={status:t,copilot_token:o,upstream:n.result,version:"0.44.0-preview.11",timestamp:(new Date).toISOString()};void 0!==n.latencyMs&&(r.upstream_latency_ms=n.latencyMs);let a="ok"===t?200:503;return e.json(r,a)});const di=new U(L),mi={...B["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function fi(e){try{return di.encode(e,[],[]).length}catch(t){return o.debug("count_tokens: tokenizer failed, using length/4",t),Math.ceil(e.length/4)}}function hi(e){let t=0;for(let o of e)switch(o.type){case"text":t+=fi(o.text)*mi.contentMultiplier;break;case"tool_use":t+=fi(o.name+JSON.stringify(o.input))*mi.contentMultiplier;break;case"tool_result":o.content&&(t+=fi("string"==typeof o.content?o.content:JSON.stringify(o.content))*mi.contentMultiplier);break;case"thinking":t+=fi(o.thinking)*mi.contentMultiplier;break;case"image":t+=1600}return t}function gi(e){let t=0,o=e.properties;if(!o)return t;let n=Object.entries(o);for(let[e,[o,r]]of n.entries()){if(t+=0===e?mi.perFirstProp:mi.perAdditionalProp,t+=fi(o),r.description&&(t+=mi.perPropDesc+fi(r.description)),r.enum&&Array.isArray(r.enum)){t+=mi.perEnum;for(let e of r.enum)t+=fi(String(e))}if("object"===r.type&&r.properties&&(t+=mi.perNestedObject,t+=gi(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=mi.perArrayOfObjects,t+=gi(e))}}return t}function _i(e,t){let o={"copilot_api.context_1m_beta":/context-1m/i.test(t??"")},n=e.thinking;if(n&&"object"==typeof n){let{type:e,budget_tokens:t}=n;"string"==typeof e&&(o["copilot_api.thinking.type"]=e),"number"==typeof t&&t&&(o["copilot_api.thinking.budget_tokens"]=t)}let r=e.output_config?.effort;return"string"==typeof r&&r&&(o["copilot_api.output_config.effort"]=r),o}function yi(e,t,o){let n=_i(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const wi=async(e,t,n)=>{try{return await bi(e,t)}catch(r){if(r instanceof Wt&&401===r.response.status)return await Oo(),bi(e,t);if(r instanceof Wt&&400===r.response.status&&n?.onStructuredOutputFallback){let a;try{a=await r.response.clone().text()}catch{a=void 0}let i=n.onStructuredOutputFallback(e,a);if(i)return o.warn(`Upstream rejected structured outputs on ${e.model}; retrying once against ${i.model}`),bi(i,t)}throw r}};const bi=async(e,t)=>{if(!Lo(ne))throw Error("Service token not found");let{baseUrl:o,headers:n,cleanPayload:r}=Fo(ne)&&ne.foundry?{baseUrl:jo(ne.foundry),headers:Mo(ne.foundry,t),cleanPayload:e}:function(e,t){let{metadata:o,...n}=e,r=function(e){return e.context_management?["context-management-2025-06-27"]:[]}(n),a={...wt(ne,t,r),"X-Initiator":"agent"};return{baseUrl:gt(ne),headers:a,cleanPayload:n}}(Rr(e),t),a=`${o}/v1/messages`,i=ne.timeoutMs,s=JSON.stringify(r),l=function(e,t,o){return{"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":o,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length||0,"copilot_api.max_tokens":e.max_tokens||0,"copilot_api.api_type":"anthropic_passthrough",..._i(e,t?.anthropicBeta)}}(r,t,i);for(let e=0;e<=1;e++){let t=ya(o,{fresh:e>0}),c=new AbortController,u=Vt(c,i);try{let{statusCode:o,headers:u,body:p,span:d}=await lt({spanName:"copilot POST /v1/messages",url:a,target:"anthropic_messages",headers:n,body:s,signal:c.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:t}),m=new Response(p,{status:o,headers:u});if(!m.ok)throw d.end(),new Wt("Failed to create anthropic messages",m,{outgoingBody:s,outgoingHeaders:n});if(r.stream)return{events:H(m),span:d,release:()=>wa(t)};try{let e=await m.json();"string"==typeof e.id&&d.setAttribute("copilot_api.response.id",e.id);let t=e.usage;return t&&Gr(d,{prompt_tokens:t.input_tokens??0,completion_tokens:t.output_tokens??0,total_tokens:(t.input_tokens??0)+(t.output_tokens??0)}),e}finally{d.end(),wa(t)}}catch(o){if(wa(t),await Jt(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},ki=new Set(["low","medium","high","max","xhigh"]);function vi(e){let t=e.output_config?.effort;if("string"!=typeof t||!t||!ki.has(t))return e;let n=ne.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=cn(t,n);if(!r||!ki.has(r))return e;let a=r;if(a===t)return e;o.debug(`Effort clamp: ${t} → ${a}`);let i=f.getActiveSpan();return i?.setAttribute("copilot_api.effort.requested",t),i?.setAttribute("copilot_api.effort.clamped_to",a),{...e,output_config:{...e.output_config,effort:a}}}function xi(e,t,n){if("foundry"===ne.provider)return vi(e);let r=t.includes(e.model)?e.model:sn(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=sn(e,t);return n&&o.context1m?function(e,t){let o=`${e}-1m`;if(t.has(o))return o;let n=`${e}-1m-`;for(let e of t)if(e.startsWith(n))return e;return null}(n,new Set(t)):null}(a.model,t,{context1m:n.context1m}),s=a;if(i&&i!==a.model){o.debug(`Resolved model variant: ${a.model} → ${i}`);let e=f.getActiveSpan();e?.setAttribute("copilot_api.model.variant_resolved_from",a.model),e?.setAttribute("copilot_api.model.variant_resolved_to",i),s={...a,model:i}}return vi(s)}const Ti=e=>"object"==typeof e&&!!e&&!Array.isArray(e),$i=["properties","patternProperties","$defs","definitions"],Ai=["items","additionalProperties","propertyNames","contains","not","if","then","else"],Si=["anyOf","allOf","oneOf","prefixItems"];const Ei=()=>["string","number","boolean"].map(e=>({type:e})),Oi=()=>({anyOf:[...Ei(),{type:"array",items:{anyOf:Ei()}},{type:"object"}]}),Ci=e=>!0===e||Ti(e)&&0===Object.keys(e).length,Ii=e=>"array"===e.type||Array.isArray(e.type)&&e.type.includes("array");function Ni(e,t){let o={...e};for(let e of $i){let n=o[e];Ti(n)&&(o[e]=Object.fromEntries(Object.entries(n).map(([e,o])=>[e,Ti(o)?Ni(o,t):o])))}for(let e of Ai){let n=o[e];Ti(n)&&(o[e]=Ni(n,t))}for(let e of Si){let n=o[e];Array.isArray(n)&&(o[e]=n.map(e=>Ti(e)?Ni(e,t):e))}return"prefixItems"in o&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?[...e.prefixItems]:[];delete e.prefixItems,(Ti(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let o=t.flatMap(e=>Ci(e)?Oi().anyOf:Ti(e)?[e]:[]);if(0===o.length)return;let n=[...new Map(o.map(e=>[JSON.stringify(e),e]))].map(([,e])=>e);e.items=1===n.length?n[0]:{anyOf:n}}(o)),Ii(o)&&(!("items"in o)||Ci(o.items))&&(t.add("items"),o.items=Oi()),Ci(o.additionalProperties)&&(t.add("additionalProperties"),delete o.additionalProperties),o}function Pi(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{if(o.length>0){o.push(n);break}let e=qi(n);e&&t.push(e);break}case"user":case"assistant":o.push(n)}return{leadingSystemTexts:t,messages:o}}function Ri(e){return Di(qi(e))}function qi(e){return"string"==typeof e.content?e.content:Array.isArray(e.content)?e.content.flatMap(e=>"text"===e.type&&"string"==typeof e.text?[e.text]:[]).join("\n\n"):""}function Di(e){if(!e.startsWith("x-anthropic-billing-header:"))return e;let t=e.indexOf("\n");return-1===t?"":e.slice(t).replace(/^\n+/,"")}function ji(e,t){return["string"==typeof e?e:(e??[]).map(e=>e.text).join("\n\n"),...t].map(e=>Di(e)).filter(Boolean).join("\n\n")}const Mi=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),Fi=new Set(["text","image"]);function Hi(e,t){if(Array.isArray(e?.content))for(let o of e.content){if(t.size>=20)return;let e=String(o?.type).slice(0,64);Fi.has(e)||t.add(`block:tool_result:${e}`)}}const Ui=new Set;function Bi(e,t){e.setAttribute("copilot_api.translation.system_message_count",t.filter(e=>"system"===e.role).length);let o=function(e){let t=new Set;for(let o of e){if(t.size>=20)break;let e=String(o.role).slice(0,64),n=Mi.get(e);if(n){if(Array.isArray(o.content))for(let r of o.content){let o=String(r?.type).slice(0,64);if(n.has(o)||t.add(`block:${e}:${o}`),"tool_result"===o&&Hi(r,t),t.size>=20)break}}else t.add(`role:${e}`)}return[...t].sort()}(t);if(0===o.length)return;e.setAttribute("copilot_api.translation.unknown_shapes",o.join(","));let n=function(e){let t=[];for(let o of e){if(Ui.size>=100)break;Ui.has(o)||(Ui.add(o),t.push(o))}return t}(o);0!==n.length&&r.warn(`Request contains message shapes the translator does not handle (dropped): ${n.join(", ")}`)}const Li=e=>P("sha256").update(e).digest("hex").slice(0,12);function zi(e,t){e.setAttribute("copilot_api.translation.system_hash",Li(t.system)),e.setAttribute("copilot_api.translation.tools_hash",Li(JSON.stringify(t.tools??[])))}function Gi(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function Ki(e){return e.toLowerCase().startsWith("claude-")}function Ji(e,t){let o={model:e.model,messages:Wi(e.messages,e.system),max_tokens:e.max_tokens,stop:e.stop_sequences,stream:e.stream,temperature:e.temperature,top_p:e.top_p,user:e.metadata?.user_id,tools:os(e.tools,e.model),tool_choice:ns(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=na(t,o.model);if(r){let a="enabled"===n.type&&"number"==typeof n.budget_tokens?n.budget_tokens:function(e,t,o){let n=function(e,t){return"max"===e||"xhigh"===e?t:"medium"===e?8e3:"low"===e?1024:16e3}(e,o.max),r=ea(t),a=r&&r>1?r-1:o.min;return ta(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=aa({...o,thinking_budget:a},t)}}return o}function Wi(e,t){let{leadingSystemTexts:o,messages:n}=Pi(e),r=function(e,t){let o=ji(e,t);return o?[{role:"system",content:o}]:[]}(t,o),a=[];for(let e of n)switch(e.role){case"system":{let t=Ri(e);if(!t)break;Yi(r)?a.push(t):Vi(r,t);break}case"user":r.push(...Xi(e));for(let e of a)Vi(r,e);a=[];break;case"assistant":r.push(...Zi(e))}for(let e of a)Vi(r,e);return r}function Yi(e){let t=e.at(-1);return"assistant"===t?.role&&!!t.tool_calls?.length}function Vi(e,t){let o=function(e){return e.trimStart().startsWith("<system-reminder>")?e:`<system-reminder>\n${e}\n</system-reminder>`}(t),n=e.at(-1);"user"===n?.role?Array.isArray(n.content)?n.content.push({type:"text",text:o}):n.content=n.content?`${n.content}\n\n${o}`:o:e.push({role:"user",content:o})}function Xi(e){let t=[];if(Array.isArray(e.content)){let o=e.content.filter(e=>"tool_result"===e.type),n=e.content.filter(e=>"tool_result"!==e.type);for(let e of o)t.push({role:"tool",tool_call_id:e.tool_use_id,content:ts(e.content)});n.length>0&&t.push({role:"user",content:ts(n)})}else t.push({role:"user",content:ts(e.content)});return t}function Zi(e){let t=function(e){return{reasoning_text:es(e.reasoning_text),reasoning_opaque:es(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:ts(e.content),...t}];let o=e.content.filter(e=>"tool_use"===e.type),n=e.content.filter(e=>"text"===e.type),r=e.content.filter(e=>"thinking"===e.type),a=[...n.map(e=>e.text),...r.map(e=>e.thinking)].join("\n\n");return o.length>0?[{role:"assistant",content:a||null,...t,tool_calls:o.map(e=>({id:e.id,type:"function",function:{name:e.name,arguments:JSON.stringify(e.input)}}))}]:[{role:"assistant",content:ts(e.content),...t}]}const Qi=32768;function es(e){if("string"==typeof e)return e.length<=Qi?e:e.slice(0,Qi)}function ts(e){if("string"==typeof e)return e;if(!Array.isArray(e))return null;if(!e.some(e=>"image"===e.type))return e.filter(e=>"text"===e.type||"thinking"===e.type).map(e=>"text"===e.type?e.text:e.thinking).join("\n\n");let t=[];for(let o of e)switch(o.type){case"text":t.push({type:"text",text:o.text});break;case"thinking":t.push({type:"text",text:o.thinking});break;case"image":t.push({type:"image_url",image_url:{url:`data:${o.source.media_type};base64,${o.source.data}`}})}return t}function os(e,t){if(!e)return;let o=e.filter(pi),n=function(e){return e.toLowerCase().startsWith("gemini")}(t),r=new Set,a=o.map(e=>{let t=e.input_schema;if(n){let e=function(e){let t=new Set;return{schema:Ni(e,t),rewritten:[...t]}}(t);t=e.schema;for(let t of e.rewritten)r.add(t)}return{type:"function",function:{name:e.name,description:e.description,parameters:t}}});return r.size>0&&f.getActiveSpan()?.setAttribute("copilot_api.translation.schema_keywords_rewritten",[...r].sort().join(",")),a}function ns(e){if(e)switch(e.type){case"auto":return"auto";case"any":return"required";case"tool":return e.name?{type:"function",function:{name:e.name}}:void 0;case"none":return"none";default:return}}function rs(e){return"string"==typeof e?[{type:"text",text:e}]:Array.isArray(e)?e.filter(e=>"text"===e.type).map(e=>({type:"text",text:e.text})):[]}function as(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function is(e){return e?e.map(e=>{let t={};try{t=JSON.parse(e.function.arguments)}catch{r.warn(`Failed to parse tool call arguments for "${e.function.name}": ${e.function.arguments.slice(0,200)}`)}return{type:"tool_use",id:e.id,name:e.function.name,input:t}}):[]}const ss=new Set(["low","medium","high","max","xhigh"]);function ls(e,t){let o=e.thinking;if(!o||"enabled"!==o.type)return e;let n=t?.data.find(t=>t.id===e.model);if(!n||!n.capabilities.supports.adaptive_thinking)return e;let r={...e,thinking:{type:"adaptive"}};if(!e.output_config?.effort){let t=(e=>null!==e&&ss.has(e)?e:null)(cn(function(e){return!e||e<=0?"medium":e<8e3?"low":e<24e3?"medium":"high"}(o.budget_tokens),n.capabilities.supports.reasoning_effort));t&&(r.output_config={...e.output_config,effort:t})}return r}function cs(e){return"string"!=typeof e&&Array.isArray(e)?e.map(e=>{let t=e;if(!t.cache_control||"object"!=typeof t.cache_control)return e;let o=t.cache_control;if("string"!=typeof o.type){let{cache_control:e,...o}=t;return o}let n={type:o.type};return void 0!==o.ttl&&(n.ttl=o.ttl),{...t,cache_control:n}}):e}const us=/[^\w-]/g;function ps(e){return e.replaceAll(us,"_")}function ds(e,t){let o=function(e,t){if(!e.output_config?.effort)return e;let o=t?.data.find(t=>t.id===e.model);if(!o)return e;let n=o.capabilities.supports.reasoning_effort;if(Array.isArray(n)&&n.length>0)return e;let{effort:r,...a}=e.output_config;if(0===Object.keys(a).length){let{output_config:t,...o}=e;return o}return{...e,output_config:a}}(e,t);return o=ls(o,t),o=function(e,t){let o=e.max_tokens;if("number"!=typeof o)return e;let n=t?.data.find(t=>t.id===e.model);if(!n)return e;let r=n.capabilities.limits;if(!r)return e;let a=(!1===e.stream?r.max_non_streaming_output_tokens:void 0)??r.max_output_tokens;if("number"!=typeof a||a<=0)return e;let i=Math.max(Math.min(o,a),16);return i===o?e:{...e,max_tokens:i}}(o,t),o={...o,system:cs(o.system)},o=function(e){let t=e.messages.map(e=>{if(!Array.isArray(e.content))return e;let t=e.content.map(e=>{let t=e;return"tool_use"===t.type&&"string"==typeof t.id?{...t,id:ps(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:ps(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function ms(e){return function(e){let t=e.thinking;if(null==t)return null;if("object"!=typeof t||Array.isArray(t))return"thinking must be an object";let o=t;return"string"==typeof o.type?"enabled"!==o.type||void 0===o.budget_tokens||"number"==typeof o.budget_tokens&&Number.isFinite(o.budget_tokens)&&!(o.budget_tokens<=0)&&Number.isInteger(o.budget_tokens)?null:"thinking.budget_tokens must be a positive integer":"thinking.type must be a string"}(e)??function(e){let t=e.output_config;if(null==t)return null;if("object"!=typeof t||Array.isArray(t))return"output_config must be an object";let o=t;return void 0===o.effort||"string"==typeof o.effort?null:"output_config.effort must be a string"}(e)}function fs(e,t,o=400){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({type:"error",error:{type:"invalid_request_error",message:t}},o)}function hs(e,t){return xe.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),yi(n,t,e.req.header("anthropic-beta"));let r=Jr(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=ms(t);return a?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:a}},400)}):r===t.model?(n.setAttribute("copilot_api.model.was_mapped",!1),{ok:!0,payload:t}):(n.setAttribute("copilot_api.model.was_mapped",!0),Pe.add(1,{from_model:t.model,to_model:r}),o.debug(`Model mapping: '${t.model}' → '${r}'`),{ok:!0,payload:{...t,model:r}})}catch(t){if(t instanceof Kr)return{ok:!1,response:fs(e,t.message,t.statusCode)};throw t}finally{n.end()}})}function gs(e,t,o){let{leadingSystemTexts:n,messages:r}=Pi(e.messages),a=function(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{let e=Ri(n);if(!e)break;"function_call"===t.at(-1)?.type?o.push(e):t.push(vs(e));break}case"user":t.push(...xs(n),...o.map(e=>vs(e))),o=[];break;case"assistant":t.push(...$s(n))}return t.push(...o.map(e=>vs(e))),t}(r);if(0===a.length)throw new Wt("request has no translatable message content",Response.json({type:"error",error:{type:"invalid_request_error",message:"request has no translatable message content"}},{status:400}));let i={model:e.model,input:a,max_output_tokens:Math.max(e.max_tokens,16),stream:e.stream,temperature:e.temperature,top_p:e.top_p,store:!1,user:e.metadata?.user_id?.slice(0,64)},s=function(e,t){return ji(e,t)||null}(e.system,n);s&&(i.instructions=s),e.tools?.length&&(i.tools=e.tools.filter(pi).map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(i.tool_choice=function(e){switch(e.type){case"auto":return"auto";case"any":return"required";case"none":return"none";case"tool":return e.name?{type:"function",name:e.name}:void 0;default:return}}(e.tool_choice));let l=function(e,t,o){if("adaptive"===e.thinking?.type){let t=e.output_config?.effort??"high";return o&&"max"===t?{effort:"max"}:{effort:ks(t)}}if("enabled"===e.thinking?.type&&e.thinking.budget_tokens){let{effort:o}=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens),n=cn(o,t);return{effort:bs(n)?n:o}}}(e,t,o?.keepMax??!1);return l&&(i.reasoning=l),o?.promptCacheKey&&(i.prompt_cache_key=o.promptCacheKey),i}function _s(e,t){let o=e?.trim()||t?.trim();if(o)return`cc-${P("sha256").update(o).digest("hex").slice(0,32)}`}function ys(e){let t=e?.input_tokens??0,o=e?.input_tokens_details?.cached_tokens;return{input_tokens:void 0===o?t:Math.max(t-o,0),output_tokens:e?.output_tokens??0,...void 0===o?{}:{cache_read_input_tokens:o}}}const ws=new Set(["low","medium","high","xhigh"]),bs=e=>null!==e&&ws.has(e);function ks(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function vs(e){return{type:"message",role:"developer",content:[{type:"input_text",text:e}]}}function xs(e){if("string"==typeof e.content)return[{type:"message",role:"user",content:e.content}];let t=[],o=e.content.filter(e=>"tool_result"===e.type),n=e.content.filter(e=>"tool_result"!==e.type);for(let e of o)t.push(Ts(e));if(n.length>0)if(n.some(e=>"image"===e.type)){let e=[];for(let t of n)switch(t.type){case"text":e.push({type:"input_text",text:t.text});break;case"image":e.push({type:"input_image",image_url:`data:${t.source.media_type};base64,${t.source.data}`,detail:"high"})}t.push({type:"message",role:"user",content:e})}else{let e=n.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n");e&&t.push({type:"message",role:"user",content:e})}return t}function Ts(e){let t;return t="string"==typeof e.content?e.content:Array.isArray(e.content)?e.content.filter(e=>"text"===e.type).map(e=>e.text).join("\n"):"",e.is_error&&(t=`[ERROR] ${t}`),{type:"function_call_output",call_id:e.tool_use_id,output:t}}function $s(e){if("string"==typeof e.content)return[{type:"message",role:"assistant",content:e.content}];let t=[],o=e.content.filter(e=>"text"===e.type),n=e.content.filter(e=>"thinking"===e.type),r=e.content.filter(e=>"tool_use"===e.type),a=[...o.map(e=>e.text),...n.map(e=>e.thinking)].join("\n\n");a&&t.push({type:"message",role:"assistant",content:a});for(let e of r)t.push({type:"function_call",call_id:e.id,name:e.name,arguments:JSON.stringify(e.input)});return t}function As(e,t){if(t)return"tool_use";switch(e){case"completed":case"cancelled":case"failed":return"end_turn";case"incomplete":return"max_tokens";default:return null}}function Ss(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function Es(e,t,o){e.messageStartSent||=(e.responseId=o?.responseId??e.responseId,e.model=o?.model??e.model,t.push({type:"message_start",message:{id:e.responseId,type:"message",role:"assistant",content:[],model:e.model,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}),!0)}function Os(e,t){let o=[];switch(e.type){case"response.created":Es(t,o,{responseId:e.response.id,model:e.response.model});break;case"response.in_progress":case"response.output_text.done":case"response.function_call_arguments.done":break;case"response.output_item.added":if("function_call"===e.item.type){Es(t,o),Ss(t,o);let n=e.item;t.toolCalls[e.output_index]={call_id:n.call_id,name:n.name,_bi1:t.contentBlockIndex},o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"tool_use",id:n.call_id,name:n.name,input:{}}}),t.contentBlockOpen=!0}break;case"response.content_part.added":Es(t,o),Ss(t,o),o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),t.contentBlockOpen=!0;break;case"response.output_text.delta":o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:e.delta}});break;case"response.content_part.done":Ss(t,o);break;case"response.function_call_arguments.delta":{let n=t.toolCalls[e.output_index];n&&o.push({type:"content_block_delta",index:n._bi1,delta:{type:"input_json_delta",partial_json:e.delta}});break}case"response.output_item.done":if("function_call"===e.item.type){let n=t.toolCalls[e.output_index];n&&t.contentBlockOpen&&(o.push({type:"content_block_stop",index:n._bi1}),t.contentBlockIndex++,t.contentBlockOpen=!1)}break;case"response.completed":{Ss(t,o);let n=e.response.output.some(e=>"function_call"===e.type),r=e.response.usage;o.push({type:"message_delta",delta:{stop_reason:As(e.response.status,n),stop_sequence:null},usage:ys(r)},{type:"message_stop"});break}case"response.incomplete":{Es(t,o),Ss(t,o);let n=e.response.usage;o.push({type:"message_delta",delta:{stop_reason:"max_tokens",stop_sequence:null},usage:ys(n)},{type:"message_stop"});break}case"response.failed":Es(t,o),Ss(t,o),o.push({type:"error",error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}});break;case"response.cancelled":Es(t,o),Ss(t,o),o.push({type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{input_tokens:0,output_tokens:0}},{type:"message_stop"});break;case"response.refusal.delta":Es(t,o),t.contentBlockOpen||=(o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),!0),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:e.delta}})}return o}function Cs(e,t){e.thinkingBlockOpen||(e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1),t.push({type:"content_block_start",index:e.contentBlockIndex,content_block:{type:"thinking",thinking:""}}),e.thinkingBlockOpen=!0,e.contentBlockOpen=!0)}function Is(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function Ns(e,t){let o=[];if(0===e.choices.length)return o;let n=e.choices[0],{delta:r}=n;if(t.messageStartSent||=(o.push({type:"message_start",message:{id:e.id,type:"message",role:"assistant",content:[],model:e.model,stop_reason:null,stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:0}}}),!0),"string"==typeof r.reasoning_text&&""!==r.reasoning_text&&(Cs(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"thinking_delta",thinking:r.reasoning_text}})),"string"==typeof r.reasoning_opaque&&""!==r.reasoning_opaque&&(Cs(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),Is(t,o)),r.content&&(Is(t,o),function(e){return!!e.contentBlockOpen&&Object.values(e.toolCalls).some(t=>t._bi1===e.contentBlockIndex)}(t)&&(o.push({type:"content_block_stop",index:t.contentBlockIndex}),t.contentBlockIndex++,t.contentBlockOpen=!1),t.contentBlockOpen||=(o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),!0),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:r.content}})),r.tool_calls){Is(t,o);for(let e of r.tool_calls){if(e.id&&e.function?.name){t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),t.contentBlockIndex++,!1);let n=t.contentBlockIndex;t.toolCalls[e.index]={id:e.id,name:e.function.name,_bi1:n},o.push({type:"content_block_start",index:n,content_block:{type:"tool_use",id:e.id,name:e.function.name,input:{}}}),t.contentBlockOpen=!0}if(e.function?.arguments){let n=t.toolCalls[e.index];n&&o.push({type:"content_block_delta",index:n._bi1,delta:{type:"input_json_delta",partial_json:e.function.arguments}})}}}return n.finish_reason&&(Is(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:Gi(n.finish_reason),stop_sequence:null},usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}},{type:"message_stop"})),o}const Ps=/structured_outputs|output_config\.format/i;function Rs(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&Ps.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?ds({...e,model:on},o):null}var qs=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var Ds=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const js={tavily:async function(e,t,n){let r=function(e,t){let o={query:e,max_results:t?.maxResults??5};return t?.includeDomains?.length&&(o.include_domains=t.includeDomains),t?.excludeDomains?.length&&(o.exclude_domains=t.excludeDomains),o}(t,n);o.debug("Tavily search request:",JSON.stringify(r));let a=new AbortController,i=setTimeout(()=>a.abort(),15e3);try{let{response:t,span:i}=await st({spanName:"tavily POST /search",url:"https://api.tavily.com/search",target:"tavily_search",method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(r),signal:a.signal,extraAttributes:{"tavily.max_results":n?.maxResults??5,"tavily.has_include_domains":!!n?.includeDomains?.length,"tavily.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Tavily API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("tavily.results_count",e.results.length),o.debug(`Tavily returned ${e.results.length} results`),e.results}catch(e){throw ot(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Ds:e}finally{clearTimeout(i)}},exa:async function(e,t,n){let r=function(e,t){let o={query:e,numResults:t?.maxResults??5,contents:{text:!0}};return t?.includeDomains?.length&&(o.includeDomains=t.includeDomains),t?.excludeDomains?.length&&(o.excludeDomains=t.excludeDomains),o}(t,n);o.debug("Exa search request:",JSON.stringify(r));let a=new AbortController,i=setTimeout(()=>a.abort(),15e3);try{let{response:t,span:i}=await st({spanName:"exa POST /search",url:"https://api.exa.ai/search",target:"exa_search",method:"POST",headers:{"Content-Type":"application/json","x-api-key":e},body:JSON.stringify(r),signal:a.signal,extraAttributes:{"exa.max_results":n?.maxResults??5,"exa.has_include_domains":!!n?.includeDomains?.length,"exa.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Exa API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("exa.results_count",e.results.length),o.debug(`Exa returned ${e.results.length} results`),e.results.map(e=>({title:e.title??"",url:e.url,content:e.text??""}))}catch(e){throw ot(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new qs:e}finally{clearTimeout(i)}}},Ms=["tavily","exa"];function Fs(e){return"tavily"===e||"exa"===e}function Hs(){return ne.webSearchProviders.length>0}async function Us(e,t){return async function(e,t,n){let{providers:r,searchFns:a=js}=n;if(0===r.length)throw Error("No web search provider configured");let i,s=[];for(let[n,l]of r.entries())try{let n=await a[l.name](l.key,e,t);return s.length>0&&o.info(`Web search recovered: served by "${l.name}" after ${s.join(", ")} failed.`),n}catch(e){i=e,s.push(l.name);let t=e instanceof Error?e.message:String(e);n!==r.length-1&&o.warn(`Web search provider "${l.name}" failed (${t}); falling over to "${r[n+1].name}".`)}let l=i instanceof Error?i.message:String(i);throw o.error(`Web search failed: all providers exhausted (${s.join(", ")}). Last error: ${l}`),i instanceof Error?i:Error("All web search providers failed")}(e,t,{providers:ne.webSearchProviders})}function Bs(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function Ls(e,t){let o=[{type:"web_search_tool_result_error",error_code:t.errorCode??"unavailable"}];return{type:"web_search_tool_result",tool_use_id:e,content:t.searchFailed?o:t.results}}async function zs(e,t){let n=function(e){let t,o=e.messages[0];if(!o||"user"!==o.role)return null;if("string"==typeof o.content)t=o.content;else{if(!Array.isArray(o.content))return null;{let e=o.content.find(e=>"text"===e.type);if(!e)return null;t=e.text}}return t.startsWith("Perform a web search for the query: ")?t.slice(36).trim():t.trim()||null}(t);if(!n)return e.set("requestData",{model:t.model,streaming:!1}),e.json({type:"error",error:{type:"invalid_request_error",message:"Could not extract search query from web search request"}},400);let r=function(e){let t=e.tools?.[0];return t&&ui(t)?{maxResults:"number"==typeof t.max_uses?t.max_uses:5,allowedDomains:t.allowed_domains,blockedDomains:t.blocked_domains}:{maxResults:5}}(t);o.info(`Web search intercepted: "${n}"`);let a,i=[],s=!1;try{if(!Hs())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await Us(n,{maxResults:Math.min(r.maxResults,10),includeDomains:r.allowedDomains,excludeDomains:r.blockedDomains})).map(e=>({type:"web_search_result",url:e.url,title:e.title,encrypted_content:Buffer.from(e.content).toString("base64"),page_age:null}))}catch(e){o.error("Web search failed:",e),s=!0,a??="unavailable"}let l={query:n,results:i,model:t.model,searchFailed:s,errorCode:a};if(!t.stream)return e.set("requestData",{model:t.model,streaming:!1}),e.json(function(e){let{query:t,model:o}=e,n=`srvtoolu_${Bs()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{...Ls(n,e)}];return{id:`msg_ws_${Bs()}`,type:"message",role:"assistant",model:o,content:r,stop_reason:"end_turn",stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}(l));let c=function(e){let{query:t,model:o}=e,n=`srvtoolu_${Bs()}`,r=`msg_ws_${Bs()}`,a=[];return a.push({type:"message_start",message:{id:r,type:"message",role:"assistant",content:[],model:o,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}},{type:"content_block_start",index:0,content_block:{type:"text",text:""}},{type:"content_block_delta",index:0,delta:{type:"text_delta",text:"I'll search for that."}},{type:"content_block_stop",index:0},{type:"content_block_start",index:1,content_block:{type:"server_tool_use",id:n,name:"web_search",input:{}}},{type:"content_block_delta",index:1,delta:{type:"input_json_delta",partial_json:JSON.stringify({query:t})}},{type:"content_block_stop",index:1},{type:"content_block_start",index:2,content_block:Ls(n,e)},{type:"content_block_stop",index:2},{type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{output_tokens:0}},{type:"message_stop"}),a}(l);return e.set("requestData",{model:t.model,streaming:!0}),F(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const Gs=(e,t)=>!(!e||!t||e===t);async function Ks(e){if(Lo(ne)||await Fn())return null;let t=Nn();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${Rn()}`}},401)):(f.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({type:"error",error:{type:"service_unavailable",message:"Service token not yet available; retry shortly"}},503))}function Js(e,t){let o=t.model;return o&&"string"==typeof o?null:fs(e,"Model name is required and must be a string")}async function Ws(e){let t=await e.req.json();if(function(e){let t=e.tools;return!(!t||1!==t.length)&&ui(t[0])}(t))return Js(e,t)??zs(e,t);await Yr(ne),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=Js(e,t);if(a)return a;t=function(e,t){return xi(t,ne.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=hs(e,t);if(!i.ok)return i.response;t=i.payload;let s=await Ks(e);if(s)return s;if(Wr(t.model))return Zs(e,t);if(function(e){if("foundry"!==ne.provider)return Ki(e);let t=ne.models?.data.find(t=>t.id===e);return t?"Anthropic"===t.vendor:Ki(e)}(t.model))return async function(e,t,o){let n="foundry"===ne.provider,r=n?t:ds(t,ne.models),a={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")},i=r.output_config?.effort;return e.set("requestData",{model:r.model,reasoningEffort:i,effortClamped:Gs(o,i),streaming:!!r.stream}),ne.manualApprove&&await Br(),xe.startActiveSpan("copilot_api.anthropic_passthrough",async t=>{t.setAttribute("copilot_api.route","anthropic_passthrough"),t.setAttribute("copilot_api.model",r.model),t.setAttribute("copilot_api.streaming",!!r.stream),yi(t,r,a.anthropicBeta);try{let o=performance.now(),i=await wi(r,a,{onStructuredOutputFallback:(e,o)=>{if(n)return null;let r=Rs(e,o,ne.models);return r&&(t.setAttribute("copilot_api.structured_output_fallback",!0),t.setAttribute("copilot_api.structured_output_fallback.model",r.model)),r}}),s=performance.now()-o;if(Ge.record(s,{model:r.model,target:"anthropic_messages",streaming:String(!!r.stream)}),!r.stream){let o=i,n=o.usage;if(n){let t={input_tokens:n.input_tokens||0,output_tokens:n.output_tokens||0,cache_read_input_tokens:n.cache_read_input_tokens||0,cache_creation_input_tokens:n.cache_creation_input_tokens||0},o=e.get("requestData")||{};o.tokenUsage=zr(Vs(t)),o._d1=s,o.upstreamTtfbMs=s,o.upstreamTotalMs=s,e.set("requestData",o)}return t.end(),e.json(o)}let{events:l,span:c,release:u}=i;return F(e,async n=>{let a=0,i=performance.now(),s={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1,d=la(e,o);try{try{for await(let e of l)d(),e.data&&"[DONE]"!==e.data?(a++,Fe.add(1,{model:r.model,endpoint_type:"anthropic_messages"}),Xs(e.data,s)&&(p=!0),await n.writeSSE(e)):await n.writeSSE(e);let e=performance.now()-i,t={model:r.model,endpoint_type:"anthropic_messages"};Ke.record(e,t),Qe.record(a,t)}catch(t){throw nt(c,e.get("requestSpan"),t),await Zr(n,t),t}finally{if(ca(e,o),p){let t=Vs(s);Gr(c,t);let o=e.get("requestData")||{};o.tokenUsage=zr(t),e.set("requestData",o)}c.end(),u()}let t=e.get("requestId");t&&ge.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw ot(t,e),t.end(),e}})}(e,t,r);let l=performance.now(),c=xe.startActiveSpan("copilot_api.translate.anthropic_to_openai",o=>{try{o.setAttribute("copilot_api.translation.direction","anthropic_to_openai"),o.setAttribute("copilot_api.translation.message_count",t.messages.length),o.setAttribute("copilot_api.translation.has_tools",!!t.tools?.length),o.setAttribute("copilot_api.translation.has_system",!!t.system),o.setAttribute("copilot_api.translation.context_1m_beta",/context-1m/i.test(e.req.header("anthropic-beta")??""));let n=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"image"===e.type)),r=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"thinking"===e.type));o.setAttribute("copilot_api.translation.has_images",n),o.setAttribute("copilot_api.translation.has_thinking",r),Bi(o,t.messages);let a=Ji(t,ne.models),i=a.messages.at(0);return zi(o,{system:"system"===i?.role&&"string"==typeof i.content?i.content:"",tools:a.tools}),a}finally{o.end()}});We.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=aa(c,ne.models),o.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:Gs(r,u),streaming:!!c.stream});let p=performance.now();ne.manualApprove&&await Br();let d=await Aa(c),m=performance.now()-p;if(Ge.record(m,{model:c.model,target:"chat_completions",streaming:String(!!c.stream)}),Ys(d)){let t=e.get("requestData")||{};d.usage&&(t.tokenUsage=zr(d.usage)),t._d1=m,t.upstreamTtfbMs=m,t.upstreamTotalMs=m,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming response:",JSON.stringify(d).slice(-400));let r=performance.now(),a=xe.startActiveSpan("copilot_api.translate.openai_to_anthropic",e=>{try{e.setAttribute("copilot_api.translation.direction","openai_to_anthropic");let t=function(e){let t=[],o=[],n=[],r=null;r=e.choices[0]?.finish_reason??r;for(let a of e.choices){let e=as(a.message),i=rs(a.message.content),s=is(a.message.tool_calls);t.push(...e),o.push(...i),n.push(...s),("tool_calls"===a.finish_reason||"stop"===r)&&(r=a.finish_reason)}return{id:e.id,type:"message",role:"assistant",model:e.model,content:[...t,...o,...n],stop_reason:Gi(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(d);return e.setAttribute("copilot_api.translation.content_blocks",t.content.length),e.setAttribute("copilot_api.translation.stop_reason",t.stop_reason??"null"),e.setAttribute("copilot_api.translation.has_tool_use",t.content.some(e=>"tool_use"===e.type)),t}finally{e.end()}});return We.record(performance.now()-r,{direction:"openai_to_anthropic"}),o.debug("Translated Anthropic response:",a),e.json(a)}o.debug("Streaming response from service");let{events:f,span:h,release:g}=d;return F(e,async t=>{let n=null,r=0,a=performance.now(),i=la(e,p),s={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{try{for await(let a of f){if(i(),o.debug("Raw stream event:",a),"[DONE]"===a.data)break;if(!a.data)continue;let l;try{l=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}if(r++,Fe.add(1,{model:c.model,endpoint_type:"anthropic"}),l.usage){n=l.usage;let t=e.get("requestData")||{};t.tokenUsage=zr(n),t._d1=m,e.set("requestData",t)}let u=Ns(l,s);for(let e of u)o.debug("Translated Anthropic event:",e),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let l=performance.now()-a,u={model:c.model,endpoint_type:"anthropic"};if(Ke.record(l,u),Qe.record(r,u),ca(e,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=zr(n),t._d1=m,e.set("requestData",t))}}catch(o){throw nt(h,e.get("requestSpan"),o),await Zr(t,o),o}finally{n&&Gr(h,n),h.end(),g()}let l=e.get("requestId");l&&ge.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const Ys=e=>Object.hasOwn(e,"choices");function Vs(e){let t=e.input_tokens+e.cache_read_input_tokens+e.cache_creation_input_tokens;return{prompt_tokens:t,completion_tokens:e.output_tokens,total_tokens:t+e.output_tokens,prompt_tokens_details:{cached_tokens:e.cache_read_input_tokens}}}function Xs(e,t){try{let o=JSON.parse(e);if("message_start"===o.type){let e=o.message?.usage;if(e)return t.input_tokens=e.input_tokens||0,t.cache_read_input_tokens=e.cache_read_input_tokens||0,t.cache_creation_input_tokens=e.cache_creation_input_tokens||0,!0}if("message_delta"===o.type){let e=o.usage;if(e)return t.output_tokens=e.output_tokens||0,!0}}catch{}return!1}async function Zs(e,t){let r=performance.now(),a=xe.startActiveSpan("copilot_api.translate.anthropic_to_responses",o=>{try{o.setAttribute("copilot_api.translation.direction","anthropic_to_responses"),o.setAttribute("copilot_api.translation.message_count",t.messages.length),Bi(o,t.messages);let n=gs(t,ne.models?.data.find(e=>e.id===t.model)?.capabilities.supports.reasoning_effort,{keepMax:"foundry"===ne.provider,promptCacheKey:"foundry"===ne.provider?_s(e.req.header("x-claude-code-session-id"),t.metadata?.user_id):void 0});return zi(o,{system:n.instructions??"",tools:n.tools}),n}finally{o.end()}});We.record(performance.now()-r,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",a),e.set("requestData",{model:a.model,streaming:!!a.stream}),ne.manualApprove&&await Br();let i=performance.now(),s=await Pa(a),l=performance.now()-i;if(Ge.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),qa(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=zr({prompt_tokens:s.usage.input_tokens,completion_tokens:s.usage.output_tokens,total_tokens:s.usage.total_tokens,prompt_tokens_details:s.usage.input_tokens_details})),t._d1=l,t.upstreamTtfbMs=l,t.upstreamTotalMs=l,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(s).slice(-400)),"failed"===s.status)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:s.error?.code??"api_error",message:s.error?.message??"Response generation failed"}},500);let r=performance.now(),a=xe.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{return e.setAttribute("copilot_api.translation.direction","responses_to_anthropic"),function(e){let t=[],o=!1;for(let n of e.output)if("message"===n.type)for(let e of n.content)"output_text"===e.type&&e.text&&t.push({type:"text",text:e.text});else if("function_call"===n.type){o=!0;let e={};try{e=JSON.parse(n.arguments)}catch{}t.push({type:"tool_use",id:n.call_id,name:n.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:As(e.status,o),stop_sequence:null,usage:ys(e.usage)}}(s)}finally{e.end()}});return We.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(a)}o.debug("Streaming Responses API response");let{events:c,span:u,release:p}=s;return F(e,async t=>{let n=null,r=0,s=performance.now(),d=la(e,i),m={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}};try{try{for await(let i of c){if(d(),o.debug("Responses API raw stream event:",i),!i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}r++,Fe.add(1,{model:a.model,endpoint_type:"responses"});let c=Da(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=zr(n),t._d1=l,e.set("requestData",t)}let u=Os(s,m);for(let e of u)o.debug("Translated Anthropic event:",e),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let u=performance.now()-s,p={model:a.model,endpoint_type:"responses"};Ke.record(u,p),Qe.record(r,p),ca(e,i)}catch(o){throw nt(u,e.get("requestSpan"),o),await Zr(t,o),o}finally{n&&Gr(u,n),u.end(),p()}let f=e.get("requestId");f&&ge.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}const Qs=new j;Qs.post("/",async e=>{try{return await yn(e,Ws)}catch(t){return await go(e,t)}});const el=new j;function tl(e){return xe.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Jr(e.model);return t.setAttribute("copilot_api.model.normalized",n),n===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),Pe.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}function ol(e,t){let o=function(e){try{let t=JSON.parse(e);if(("response.completed"===t.type||"response.incomplete"===t.type)&&t.response?.usage){let e=t.response.usage;return{prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens,prompt_tokens_details:e.input_tokens_details}}}catch{}return null}(e);if(!o)return;t.usageRef.value=o;let n=t.c.get("requestData")||{};n.tokenUsage=zr(o),n._d1=t._d1,t.c.set("requestData",n)}el.get("/",async e=>{try{ne.models||await kn();let t=ne.models?.data.map(e=>({id:e.id,object:"model",type:"model",created:0,created_at:new Date(0).toISOString(),owned_by:e.vendor,display_name:e.name,context_length:e.capabilities.limits?.max_context_window_tokens}));return e.json({object:"list",data:t,has_more:!1})}catch(t){return await go(e,t)}});const nl=new Set(["message","function_call","function_call_output"]),rl=new Set(["type","name","description","parameters"]);async function al(e){if(!e)return!1;let t=e.sources;if(t&&t.length>0)return!1;let n=e.query??e.queries?.[0];return!(!n||!Hs())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await Us(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function il(e){if(Hs())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await al(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function sl(e){if(!Hs())return e;try{let t=JSON.parse(e);if("response.output_item.done"===t.type){let e=t.item;if("web_search_call"===e?.type&&await al(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function ll(e){switch(e.type){case"custom_tool_call":{let t=e.input;return{type:"function_call",call_id:e.call_id,name:e.name,arguments:JSON.stringify("string"==typeof t?{input:t}:t)}}case"custom_tool_call_output":return{type:"function_call_output",call_id:e.call_id,output:e.output};default:return nl.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function cl(e,t){if("function_call"!==e.type||!t.has(e.name))return!1;if(e.type="custom_tool_call","string"==typeof e.arguments){try{e.input=JSON.parse(e.arguments).input??e.arguments}catch{e.input=e.arguments}delete e.arguments}return!0}function ul(e,t){if(0===t.size)return e;try{let o=JSON.parse(e),n=o.type;if("response.output_item.added"===n||"response.output_item.done"===n){let e=o.item;if(e&&cl(e,t))return JSON.stringify(o)}if("response.completed"===n){let n=o.response?.output;if(!n)return e;let r=!1;for(let e of n)cl(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function pl(e){return null!=e}function dl(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function ml(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function fl(e){let t={model:e.model},{input:o,droppedInputTypes:n}=function(e){if(!Array.isArray(e))return{input:e,droppedInputTypes:[]};let t=new Set,o=[];for(let n of e){if(!dl(n)){o.push(n);continue}let e=ll(n);null===e?t.add(ml(n.type)):o.push(e)}return{input:o,droppedInputTypes:[...t]}}(e.input);void 0!==o&&(t.input=o);for(let o of["previous_response_id","prompt","conversation","instructions","max_output_tokens","temperature","top_p","stream","tool_choice","parallel_tool_calls","user"])pl(e[o])&&(t[o]=e[o]);let r=new Set;if(pl(e.tools)){let o=function(e){let t=new Set;return{tools:e.filter(e=>{let t=e.type;return"function"===t||"custom"===t||"web_search"===t||t.startsWith("web_search_")}).map(e=>{let o=e.type;if("web_search"===o||o.startsWith("web_search_"))return{type:e.type};let n={};for(let t of Object.keys(e))rl.has(t)&&(n[t]=e[t]);return"custom"===n.type&&(n.type="function",t.add(n.name),n.parameters||={type:"object",properties:{input:{type:"string",description:"The freeform tool input content"}},required:["input"],additionalProperties:!1}),n}),customToolNames:t}}(e.tools);t.tools=o.tools,r=o.customToolNames}if(pl(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},pl(o.effort)&&(t.reasoning.effort=o.effort),pl(o.summary)&&(t.reasoning.summary=o.summary)}if(pl(e.text)&&"object"==typeof e.text){let o=e.text;pl(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function hl(e,t){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function gl(e,t,o){let{payload:n,droppedInputTypes:r}=o;if(!Array.isArray(t)||!Array.isArray(n.input))return null;let a=f.getActiveSpan();return a?.setAttribute("copilot_api.responses.input_items_in",t.length),a?.setAttribute("copilot_api.responses.input_items_out",n.input.length),0===t.length||n.input.length>0||pl(n.previous_response_id)||pl(n.prompt)||pl(n.conversation)?null:hl(e,`input contains no supported items: every item was dropped (unsupported item types: ${r.join(", ")}). Provide at least one message, function_call or function_call_output item, or previous_response_id, prompt or conversation.`)}async function _l(e){await Yr(ne);let t=await e.req.json();if(!dl(t))return hl(e,"request body must be a JSON object");let n=function(e){return"foundry"===ne.provider?{payload:e,customToolNames:new Set,droppedInputTypes:[]}:fl(e)}(t),{customToolNames:r}=n,a=n.payload;o.debug(`Responses API [${Array.isArray(a.input)?a.input.length:1} items]`),r.size>0&&o.debug(`Custom tools detected: ${[...r].join(", ")}`);let i=function(e,t){try{return{ok:!0,payload:tl(t)}}catch(t){if(t instanceof Kr)return{ok:!1,response:e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode)};throw t}}(e,a);if(!i.ok)return i.response;a=i.payload;let s=gl(e,t.input,n);if(s)return s;let l=await Lr(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),ne.manualApprove&&await Br();let c=performance.now(),u=await Pa(a),p=performance.now()-c;if(Ge.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),yl(u))return async function(e,t,o){await il(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=zr({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens,prompt_tokens_details:t.usage.input_tokens_details})),n._d1=o,n.upstreamTtfbMs=o,n.upstreamTotalMs=o,e.set("requestData",n),e.json(t)}(e,u,p);let{events:d,span:m,release:f}=u;return F(e,async t=>{let o={value:null},n=0,i=performance.now(),s=la(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=ul(i.data,r);s=await sl(s);let l=s===i.data?i:{...i,data:s};Fe.add(1,{model:a.model,endpoint_type:"responses"}),ol(s,{usageRef:o,c:e,_d1:p}),await t.writeSSE(l)}else await t.writeSSE(i);let l=performance.now()-i,u={model:a.model,endpoint_type:"responses"};Ke.record(l,u),Qe.record(n,u),ca(e,c)}catch(o){throw nt(m,e.get("requestSpan"),o),await Qr(t,o),o}finally{o.value&&Gr(m,o.value),m.end(),f()}let l=e.get("requestId");l&&ge.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const yl=e=>Object.hasOwn(e,"output"),wl=new j;wl.post("/",async e=>{try{return await yn(e,_l)}catch(t){return await go(e,t)}});const bl=new j;bl.get("/",e=>{try{return ne.showToken?e.json({token:ne._t1}):e.json({error:"Token endpoint disabled. Restart with --show-token to enable it.",token:null},403)}catch(t){return o.error("Error fetching token:",t),e.json({error:"Failed to fetch token",token:null},500)}});const kl=new j;kl.get("/",async e=>{try{let t=await tr();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const vl=new j;function xl(){return function(e){let t=e.filter(e=>Fr(e));if(0===t.length)return;let o=t.find(e=>Mr.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(ne.models?.data??[])}function Tl(e,t,o){let n=function(e){if(!e)return;try{let t=JSON.parse(e),o=t.error?.message??t.message;if("string"==typeof o&&o.length>0)return Pr(o).slice(0,200)}catch{}let t=Pr(e).trim();return t.length>0?t.slice(0,200):void 0}(t),r=n?` (upstream: ${n})`:"";switch(!0){case 401===e:case 403===e:return`Authentication/entitlement failed (HTTP ${e}). Your GitHub Copilot subscription may be inactive, or the Auth token is invalid. Run \`copilot-api auth\` to re-authenticate; if it persists, this account has no active Copilot access${r}.`;case 402===e:return`Premium monthly quota exhausted (HTTP 402). Switch to a non-premium model (e.g. claude-haiku-4.5) or wait for the monthly quota reset${r}.`;case 400===e:return`Model '${o}' was rejected (HTTP 400). On individual plans only some models are entitled — try claude-haiku-4.5, or run \`copilot-api doctor\` to see what works${r}.`;case 413===e:return`Request too large (HTTP 413)${r}.`;case 429===e:return`Rate limited upstream (HTTP 429) — wait and retry${r}.`;case 503===e:return`Service not ready (HTTP 503) — the model catalog or Service token is still warming up. Retry in a few seconds${r}.`;case e>=500:return`Upstream error (HTTP ${e})${r}.`;default:return`Unexpected response (HTTP ${e})${r}.`}}async function $l(e={}){let t=performance.now(),o=e.model&&function(e){let t=ne.models?.data.find(t=>t.id===e);return void 0!==t&&Fr(t)}(e.model)?e.model:xl();if(!o)return{ok:!1,durationMs:0,reason:"No models available — the catalog is empty (upstream /models failed at startup). Check connectivity and authentication."};let n,r=e.timeoutMs??3e4,a=()=>Math.round(performance.now()-t),i=(async()=>{try{let e=await vl.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[Dr]:jr},body:JSON.stringify({model:o,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1})});if(e.ok)return{ok:!0,model:o,status:e.status,durationMs:a()};let t=await e.text().catch(()=>"");return{ok:!1,model:o,status:e.status,durationMs:a(),reason:Tl(e.status,t,o),detail:t.slice(0,400)||void 0}}catch(e){let t=e instanceof Error?e.message:String(e);return{ok:!1,model:o,durationMs:a(),reason:`Request failed before a usable response: ${t}`,detail:t}}})(),s=new Promise(e=>{n=setTimeout(()=>{e({ok:!1,model:o,durationMs:a(),reason:`Did not complete within ${r}ms. If you started with --manual, approve the request or use --no-smoke-test; otherwise the upstream may be slow or unreachable.`})},r)});try{return await Promise.race([i,s])}finally{n&&clearTimeout(n)}}vl.use(async(e,t)=>{let n=performance.now(),r=`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`,a=e.req.method,i=e.req.path,s=$t(i),l=function(e){return e===jr}(e.req.header(Dr));e.set("requestId",r),e.set("isSelfTest",l),e.header("x-request-id",r);let c=xe.startSpan("copilot_api.handle_request",{kind:u.SERVER,attributes:{"http.method":a,"http.url":e.req.url,"http.route":i,"copilot_api.request_id":r,"copilot_api.endpoint_type":s}});e.set("requestSpan",c),e.set("requestTraceContext",c.spanContext()),l&&c.setAttribute("copilot_api.self_test",!0);for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();at.has(e)||"x-copilot-api-self-test"!==e&&c.setAttribute(`http.request.header.${e}`,o)}await async function(e,t){let{method:n,path:r,endpointType:a}=t;if("POST"===n&&("anthropic"===a||"openai"===a||"embeddings"===a||r.includes("/responses")))try{let t=await e.req.raw.clone().text();e.set("rawBody",t.length>Ur?t.slice(0,Ur):t)}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:a,path:i,endpointType:s});let m,h=new Promise(e=>{m=e});e.set("streamComplete",h),e.set("resolveStreamComplete",m);let g=f.setSpan(d.active(),c);await d.with(g,async()=>{l||ge.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw c.setStatus({code:p.ERROR,message:t.message}),c.recordException(t),e}});let _=e.get("requestData"),y={c:e,start:n,method:a,path:i,endpointType:s,requestId:r,span:c};_?.streaming&&e.res.status<400?h.then(()=>Hr(y)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{c.recordException(t),c.setStatus({code:p.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{c.end()}catch{}}):Hr(y)}),vl.use(M()),vl.use(async(e,t)=>{let o=e.req.header("content-length");if(o){let t=Number(o);if(Number.isFinite(t)&&t>33554432)return r.warn(`Rejected oversized request: ${t} bytes on ${e.req.path} (UA: ${e.req.header("user-agent")??"unknown"})`),e.json({type:"error",error:{type:"request_too_large",message:`Request body exceeds 32 MB limit (got ${t} bytes).`}},413)}await t()}),vl.get("/",e=>e.text("Server running")),vl.route("/health",si),vl.route("/chat/completions",ri),vl.route("/models",el),vl.route("/embeddings",ii),vl.route("/usage",kl),vl.route("/token",bl),vl.route("/v1/chat/completions",ri),vl.route("/v1/models",el),vl.route("/v1/embeddings",ii),vl.route("/v1/messages",Qs),vl.post("/v1/messages/count_tokens",async function(e){let t;try{t=await e.req.json()}catch{return e.json({error:{type:"invalid_request_error",message:"Invalid JSON"}},400)}if(!Array.isArray(t.messages))return e.json({error:{type:"invalid_request_error",message:"messages is required"}},400);let o=mi.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=mi.perMessage+fi(e)*mi.contentMultiplier}for(let e of t.messages)o+=mi.perMessage,o+=fi(e.role),"string"==typeof e.content?o+=fi(e.content)*mi.contentMultiplier:Array.isArray(e.content)&&(o+=hi(e.content));let n=t.tools?.filter(pi);return n&&n.length>0&&(o+=function(e){let t=mi.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=mi.perTool),t+=fi(n.name),n.description&&(t+=mi.perDesc+fi(n.description)),t+=gi(n.input_schema);return t}(n)),e.json({input_tokens:Math.round(o)})}),vl.route("/v1/responses",wl),vl.route("/responses",wl),vl.onError((e,t)=>go(t,e));const Al=e=>`[1m${e}[0m`,Sl=e=>`[2m${e}[0m`,El=e=>`[32m${e}[0m`,Ol=e=>`[31m${e}[0m`,Cl=e=>`[33m${e}[0m`,Il=Sl(" ─────────────────────────────────────────────────────────────");function Nl(e,t,o){console.log(` ${function(e){return"ok"===e?El("✓"):"warn"===e?Cl("⚠"):Ol("✗")}(e)} ${Al(t.padEnd(14))} ${o}`)}function Pl(e){console.log(` ${Sl("↳")} ${Sl(e)}`)}function Rl(e){return e instanceof Wt?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function ql(){let e=y.env.GH_TOKEN;if(e&&e.trim().length>0)return{token:e.trim(),source:"GH_TOKEN env"};let t=await async function(){try{let e=(await a.readFile(V.GITHUB_TOKEN_PATH,"utf8")).trim();return e.length>0?e:void 0}catch{return}}();return t?{token:t,source:"stored file"}:void 0}async function Dl(){try{await kn();let e=(ne.models?.data.length??0)>0;return Nl(e?"ok":"warn","Model catalog",e?function(){let e=ne.models?.data??[],t={Claude:0,OpenAI:0,Gemini:0,Embedding:0};for(let o of e)o.id.startsWith("text-embedding")?t.Embedding++:"Anthropic"===o.vendor?t.Claude++:"Google"===o.vendor?t.Gemini++:t.OpenAI++;let o=Object.entries(t).filter(([,e])=>e>0).map(([e,t])=>`${e}: ${t}`);return`${e.length} models (${o.join(", ")})`}():"empty"),e}catch(e){return Nl("fail","Model catalog",Rl(e)),Pl("Could not fetch /models — check connectivity/auth."),!1}}async function jl(e){ne.accountType=e.accountType;let t=await qt(),o=Dt();if(console.log(""),console.log(` ${Al("COPILOT-API DOCTOR")} ${Sl(`v${t}`)}`),console.log(Il),Nl("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await X(),vn(),!await async function(){let e=await ql();if(!e)return Nl("fail","Auth token","not found"),void Pl("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");ne._t2=e.token,Nl("ok","Auth token",`found (${e.source})`);try{let e=await yo();return await ht(ne,e.login),Nl("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return Nl("fail","GitHub auth",Rl(e)),void Pl("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(Il),console.log(` ${Ol("✗")} ${Al("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await _o();return ne._t1=e,Nl("ok","Service token","acquired"),!0}catch(e){let t=e instanceof Wt?e.response.status:0;return Nl("fail","Service token",Rl(e)),Pl(401===t?"Auth token is invalid/expired — run `copilot-api auth`.":403===t?"No active GitHub Copilot subscription on this account. Re-auth won't help.":"Transient/network issue — check connectivity and retry."),!1}}(),r=!!n&&await Dl();await async function(){try{let e=await tr(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${Yn(Vn(t))} of ${Yn(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;Nl("ok","Copilot plan",`${e.copilot_plan} · ${o} `+Sl(`(resets ${e.quota_reset_date})`))}catch(e){Nl("warn","Copilot plan",`unavailable (${Rl(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await $l();return e.ok?(Nl("ok","Generation",`works via ${e.model} ${Sl(`(${e.durationMs}ms)`)}`),!0):(Nl("fail","Generation",`${e.reason}${e.status?Sl(` [HTTP ${e.status}]`):""}`),!1)}():Nl("warn","Generation","skipped (no token or empty catalog)"),function(){let e=[],t="ok";for(let o of["ANTHROPIC_BASE_URL","OPENAI_BASE_URL"]){let n=y.env[o];n&&("ANTHROPIC_BASE_URL"===o&&/\/v1\/*$/.test(n)&&(t="warn",e.push(`${o}=${n} ends in /v1 — Claude Code appends /v1/messages, producing a doubled /v1/v1/... path (404). Drop the trailing /v1.`)),/\/v1\/v1(?:\/|$)/.test(n)&&(t="warn",e.push(`${o}=${n} contains a doubled /v1/v1 path (404).`)))}if(e.length>0){Nl(t,"Client config","potential base-URL issue");for(let t of e)Pl(t)}else Nl("ok","Client config","no base-URL issues detected");Pl("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(Il),a?(console.log(` ${El("✓")} ${Al("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${Cl("⚠")} ${Al("Some checks need attention")} — see the ${Ol("✗")}/${Cl("⚠")} lines above.`),console.log(""),2)}const Ml=e({meta:{name:"doctor",description:"Diagnose your setup end-to-end: token, auth, entitlement, model catalog, and one real generation. Tells you exactly what's wrong and how to fix it."},args:{"account-type":{alias:"a",type:"string",default:"individual",description:"Account type to check against (individual, business, enterprise)"}},async run({args:e}){let t=await jl({accountType:e["account-type"]});y.exit(t)}});function Fl(e){return{log(t,r){let a=o.level>=n.debug;if(t.level!==n.warn||a)for(let o of e)o.log(t,r)}}}let Hl=!1;const Ul="copilot-api-node20",Bl=`https://registry.npmjs.org/${Ul}/latest`,Ll=e=>`[1m${e}[0m`,zl=e=>`[33m${e}[0m`;async function Gl(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(Bl,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function Kl(e,t){let o=Math.max(0,t-function(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,"").length}(e));return e+" ".repeat(o)}let Jl,Wl;async function Yl(e){try{let[t,o]=await Promise.all([qt(),Gl(e)]);return"unknown"!==t&&o&&function(e,t){let o=e.split(".").map(Number),n=t.split(".").map(Number),r=Math.max(o.length,n.length);for(let e=0;e<r;e++){let t=o[e]??0,r=n[e]??0;if(t<r)return!0;if(t>r)return!1}return!1}(t,o)?{current:t,latest:o}:null}catch{return null}}function Vl(){if(!Jl||!Wl)return;let{signal:e}=Wl;Jl.then(t=>{t&&!e.aborted&&function(e,t){let o=`npx ${Ul}@latest`,n=zl("│"),r=` ${Ll("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${Ll(o)} to update`,i=" ".repeat(54),s=zl(`╭${"─".repeat(54)}╮`),l=zl(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${Kl(r,54)}${n}`,`${n}${i}${n}`,`${n}${Kl(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var Xl={posts:[{title:"I Almost Bought an AI Code Reviewer. Then I Did the Math.",teaser:"100+ repos. Every PR reviewed by AI. Under $1K a month.",url:"https://barazany.dev/blog/claude-code-pr-reviewer",date:"2026-06-09"},{title:"I Had Claude Mine 30 Days of My Own Messages. What It Found Was Uncomfortably Accurate.",teaser:"I had Claude read a month of my messages. It nailed me.",url:"https://barazany.dev/blog/mining-claude-history-ultracode",date:"2026-06-05"},{title:"The 5-Hour Quota, Boris's Tweet, and What the Source Code Actually Reveals",teaser:"Claude Code's caching story — decoded from the source.",url:"https://barazany.dev/blog/claude-code-token-caching",date:"2026-04-01"}]};const Zl=262144,Ql="https://barazany.dev",ec=/^[a-z0-9][a-z0-9-]*$/i,tc=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function oc(e,t){if("string"!=typeof e)return"";let o=e.replaceAll(tc," ").replaceAll(/\s+/g," ").trim(),n=Array.from(o);return n.length<=t?o:`${n.slice(0,t-1).join("").trimEnd()}…`}function nc(e){if("object"!=typeof e||!e)return null;let t=e,o=oc(t.title,100),n=oc(t.teaser??t.excerpt??t.description,120),r=function(e){if("string"!=typeof e||e.length>2048)return null;let t;try{t=new URL(e)}catch{return null}if(t.origin!==Ql||t.username||t.password)return null;let o=t.href;return/^[\x21-\x7E]+$/.test(o)?o:null}(t.url);if(null===r&&void 0===t.url&&"string"==typeof t.slug&&ec.test(t.slug)&&(r=`${Ql}/blog/${t.slug}`),!o||!n||null===r)return null;let a=function(e){if("string"==typeof e&&/^\d{4}-\d{2}-\d{2}/.test(e))return Number.isFinite(Date.parse(e))?e.slice(0,10):void 0}(t.date);return a?{title:o,teaser:n,url:r,date:a}:{title:o,teaser:n,url:r}}function rc(e){let t=e;if(!Array.isArray(e)&&"object"==typeof e&&e&&(t=e.posts),!Array.isArray(t))return[];let o=[];for(let e of t){let t=nc(e);t&&o.push(t)}let n=e=>e.date?Date.parse(e.date):-1/0;return o.sort((e,t)=>n(t)-n(e)).slice(0,3)}let ac=null;function ic(e){return s.join(e,"blog-posts.json")}function sc(e=V.APP_DIR){try{if(ac&&ac.length>0)return ac;let t=function(e){try{let t=ic(e);return z.statSync(t).size>Zl?[]:rc(JSON.parse(z.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:rc(Xl)}catch{return[]}}function lc(e){return e>-6e4&&e<864e5}async function cc(e){let t=new AbortController,o=setTimeout(()=>t.abort(),e);"object"==typeof o&&"unref"in o&&o.unref();try{let e=await fetch("https://barazany.dev/posts.json",{signal:t.signal,headers:{accept:"application/json"}});if(!e.ok)return await(e.body?.cancel().catch(()=>{})),[];let o=await async function(e,t){let o=Number(e.headers.get("content-length"));if(Number.isFinite(o)&&o>Zl)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>Zl?null:t}let n=e.body.getReader(),r=()=>{n.cancel().catch(()=>{})};t.addEventListener("abort",r,{once:!0});let a=[],i=0;try{for(;;){let{done:e,value:t}=await n.read();if(e)break;if(i+=t.byteLength,i>Zl)return await n.cancel().catch(()=>{}),null;a.push(t)}}finally{t.removeEventListener("abort",r)}return t.aborted?null:Buffer.concat(a).toString("utf8")}(e,t.signal);return null===o?[]:rc(JSON.parse(o))}finally{clearTimeout(o)}}async function uc(e={}){try{if("1"===y.env.COPILOT_API_NO_BLOG||"1"===y.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let t=e.dir??V.APP_DIR,o=e.now??Date.now();if(await async function(e,t){try{let o=ic(e),n=await z.promises.stat(o);if(n.size<=Zl){let e=await z.promises.readFile(o),n=JSON.parse(e.toString("utf8"));if("number"==typeof n.fetchedAt)return lc(t-n.fetchedAt)}return lc(t-n.mtimeMs)}catch{return!1}}(t,o))return;let n=await cc(e.timeoutMs??3e3);if(0===n.length)return;ac=n,await async function(e,t,o){let n=ic(e),r=`${n}.${y.pid}.tmp`;try{await z.promises.writeFile(r,`${JSON.stringify({fetchedAt:o,posts:t})}\n`),await z.promises.rename(r,n)}catch(e){throw await z.promises.rm(r,{force:!0}).catch(()=>{}),e}}(t,n,o)}catch(e){o.debug("Blog posts refresh skipped:",e)}}async function pc(e){let t;try{({login:t}=await dc(e))}catch(e){return void o.error("Copilot fallback disabled: GitHub Copilot login failed; serving from Foundry only.",e)}try{await mn(),o.info("Copilot fallback enabled for Foundry rate limits (429)")}catch(e){o.error("Copilot fallback disabled: could not load the Copilot model list; serving from Foundry only.",e)}return t}async function dc(e){e._t2&&o.warn("Passing the Auth token via --github-token / -g exposes it to other processes on this host (visible in ps/proc). Prefer the GH_TOKEN environment variable instead.");let t,n=e._t2||process.env.GH_TOKEN;n?(function(e){ne._t2=e,In=!1}(n),o.info("Using provided Auth token")):await Un();try{t=await yo(),await ht(ne,t.login)}catch(e){throw o.error("Failed to get user info for machine ID generation:",e),Error("Cannot proceed without user information",{cause:e})}return await(async()=>{let{token:e,refresh_in:t}=await _o();ne._t1=e,o.debug("Service token fetched successfully!"),ne.showToken&&o.info("Service token:",e),Cn=!0,Hn(t),ct.start(),An=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Mn(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},Sn=()=>{o.debug("Network connectivity lost")},ct.on("online",An),ct.on("offline",Sn)})(),t}function mc(e,t=""){let o,n=function(){let{platform:e,ppid:t,env:o}=y;if("win32"===e){try{if(_(`wmic process get ParentProcessId,Name | findstr "${t}"`,{stdio:"pipe"}).toString().toLowerCase().includes("powershell.exe"))return"powershell"}catch{return"cmd"}return"cmd"}{let e=o.SHELL;if(e){if(e.endsWith("zsh"))return"zsh";if(e.endsWith("fish"))return"fish";if(e.endsWith("bash"))return"bash"}return"sh"}}(),r=Object.entries(e).filter(([,e])=>void 0!==e);switch(n){case"powershell":o=r.map(([e,t])=>`$env:${e} = ${t}`).join("; ");break;case"cmd":o=r.map(([e,t])=>`set ${e}=${t}`).join(" & ");break;case"fish":o=r.map(([e,t])=>`set -gx ${e} ${t}`).join("; ");break;default:{let e=r.map(([e,t])=>`${e}=${t}`).join(" ");o=r.length>0?`export ${e}`:"";break}}return o&&t?`${o}${"cmd"===n?" & ":" && "}${t}`:o||t}function fc(e,t){return{version:t.version,port:e.port,accountType:e.accountType,verbose:e.verbose,manualApprove:e.manual,rateLimitSeconds:e.rateLimit??0,rateLimitWait:e.rateLimitWait,timeoutMs:e.timeout,showToken:e.showToken,_cc1:e._cc1,model:e.model,smallModel:e.smallModel,_t3:t._t3,provider:e.provider,fallback:e.fallback,foundryAuth:t.foundryAuth}}const hc=e=>`[1m${e}[0m`,gc=e=>`[2m${e}[0m`,_c=e=>`[36m${e}[0m`,yc=e=>`[32m${e}[0m`,wc=e=>`[33m${e}[0m`,bc=e=>`[4m${e}[0m`,kc=(e,t)=>`]8;;${e}\\${t}]8;;\\`,vc="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",xc="https://github.com/johnib/copilot-api-issues/issues",Tc=gc(" ─────────────────────────────────────────────────────────────");function $c(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function Ac(e){return e&&0!==e.length?e.join("·"):"—"}function Sc(e){if(0===e.length)return[];let t=["",Tc,` ${hc("BARAZANY.DEV")} ${gc("— Recent Posts")}`,Tc,""];for(let[o,n]of e.entries()){let e=`${n.url}${vc}`,r=kc(e,hc(bc(`[${o+1}]`)));t.push(` ${r} ${_c(n.title)}`,` ${gc("→")} ${gc(n.teaser)}`,"")}return t.push(Tc,` ${kc(`https://barazany.dev/blog${vc}`,"barazany.dev/blog")}`,Tc),t}function Ec(e){let t=[];ne.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):ne.connectivity.h2&&t.push("HTTP/2"),t.push(`timeout ${e.timeout/1e3}s`);let o=e.webSearchProviders.length>0?`${e.webSearchProviders.map(e=>(e=>e&&e[0].toUpperCase()+e.slice(1))(e)).join(gc(" → "))} ${yc("✓")}`:gc("off"),n=["",` ${hc("COPILOT-API")} ${gc(`v${e.version}`)}`,Tc,` ${gc("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${gc("User")} ${e.user} ${gc("·")} ${e.accountType}`];return ne._v1&&n.push(` ${gc("Client")} VSCode ${ne._v1}`),n.push(` ${gc("Network")} ${t.join(gc(" · "))}`,` ${gc("Search")} ${o}`),e.clipboardCopied&&n.push(` ${gc("Clipboard")} Claude Code command ${yc("✓")}`),n.push(Tc),n}function Oc(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${hc("Active")}`];if(e.model){let o=ne.models?.data.find(t=>t.id===e.model),n=$c(o?.capabilities.limits?.max_context_window_tokens),r=Ac(o?.capabilities.supports.reasoning_effort);t.push(` ${_c(e.model.padEnd(32))} ${gc("ctx")} ${hc(n.padStart(5))} ${gc("effort")} ${gc(r)} ${wc("← main")}`)}if(e.smallModel){let o=ne.models?.data.find(t=>t.id===e.smallModel),n=$c(o?.capabilities.limits?.max_context_window_tokens),r=Ac(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${gc("ctx")} ${n.padStart(5)} ${gc("effort")} ${gc(r)} ${wc("← small")}`)}return t}function Cc(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of ne.models?.data??[]){let a=r.capabilities.limits?.max_context_window_tokens,i={id:r.id,ctx:a,effort:r.capabilities.supports.reasoning_effort};r.id.startsWith("text-embedding")?n.push(i):"Anthropic"===r.vendor?e.push(i):"Google"===r.vendor?o.push(i):t.push(i)}return[["Claude",e],["OpenAI",t],["Gemini",o],["Embedding",n]]}())if(0!==n.length){t.push("",` ${hc(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?_c("●"):gc("·"),i=n?_c(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?$c(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${Ac(r.effort)}`;t.push(` ${a} ${i} ${gc(s)}${gc(l)}`)}}return t}function Ic(){let e=xc.replace(/^https:\/\//,""),t=kc(`${xc}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",Tc,` ${hc("FOUND A BUG?")} ${gc("— Report it on GitHub")}`,Tc,"",` ${_c("→")} ${_c(t)}`,` ${gc("Bug reports, feature requests, and questions welcome.")}`,"",Tc]}function Nc(e){if(!e.endpoints)return[];let{scheme:t,port:o,hostname:n}=e.endpoints,r=n?`${t}://${n}:${o}`:`${t}://<your-tailscale-hostname>:${o}`,a=["",Tc,` ${hc("Claude Cowork")} ${gc("— Settings → Inference Provider")}`,Tc,"",` ${gc("Paste into")} ${hc("inferenceGatewayBaseUrl")}${gc(":")}`,` ${hc(_c(r))}`];return n||a.push("",` ${gc("Your Tailscale hostname is shown by:")} ${_c("tailscale status --self")}`),a.push("",` ${gc("Docs:")} ${_c("https://claude.com/docs/cowork/3p/installation")}`),a}function Pc(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",Tc,` ${hc("HTTPS")} ${gc("— self-signed cert")}`,Tc,"",` ${gc("Cert")} ${t}`];switch(o.push("",` ${hc("Trust this cert")} ${gc("(one-time setup)")}`),y.platform){case"darwin":o.push(` ${gc("macOS:")}`,` ${_c("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${_c(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${gc("Windows (PowerShell as Administrator):")}`,` ${_c(`Import-Certificate -FilePath "${t}" \``)}`,` ${_c("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${gc("Linux (Debian/Ubuntu):")}`,` ${_c(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${_c("sudo update-ca-certificates")}`,` ${gc("Linux (Fedora/RHEL/Arch):")}`,` ${_c(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${_c("sudo update-ca-trust")}`);break;default:o.push(` ${gc("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${gc("Or, for Node CLIs only (no admin needed):")}`,` ${_c(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Tc),o}function Rc(e){let t=Math.floor(e/1e3),o=Math.floor(t/3600),n=Math.floor(t%3600/60);return o>0?`${o}h ${n}m`:n>0?`${n}m`:`${t}s`}const qc=s.join(V.APP_DIR,"certs"),Dc=s.join(qc,"cert.pem"),jc=s.join(qc,"key.pem"),Mc=s.join(qc,"cert.meta.json");async function Fc(e){try{return await a.readFile(e,"utf8")}catch{return}}async function Hc(e){let t=await Fc(Dc),o=await Fc(jc),n=await async function(){let e=await Fc(Mc);if(e)try{let t=JSON.parse(e);return Array.isArray(t.hosts)&&"string"==typeof t.notAfter?t:void 0}catch{return}}();if(!t||!o||!n)return!1;let r=new Set(n.hosts);for(let t of e)if(!r.has(t))return!1;let a=Date.parse(n.notAfter);return!Number.isNaN(a)&&a-Date.now()>2592e6}function Uc(e){return 0!==J(e)}async function Bc(e){await a.mkdir(qc,{recursive:!0});let t=new Date,o=new Date;o.setDate(o.getDate()+825);let n=["127.0.0.1","::1"],r=new Set(["localhost"]),i=new Set(n);for(let t of e)Uc(t)?i.add(t):r.add(t);let s=[...[...r].map(e=>({type:2,value:e})),...[...i].map(e=>({type:7,ip:e}))],l=await W([{name:"commonName",value:"localhost"},{name:"organizationName",value:"copilot-api"}],{keyType:"ec",curve:"P-256",algorithm:"sha256",notBeforeDate:t,notAfterDate:o,extensions:[{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0,critical:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:s}]});return await a.writeFile(Dc,l.cert,{mode:420}),await a.writeFile(jc,l.private,{mode:384}),await async function(e){await a.writeFile(Mc,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:Dc,keyPath:jc,generated:!0}}const Lc=[],zc=Date.now();let Gc="";function Kc(){let e=async(e,t=0)=>{let n=xe.startSpan("copilot_api.server.shutdown",{kind:u.INTERNAL,attributes:{"copilot_api.shutdown.reason":e,"copilot_api.shutdown.exit_code":t,"copilot_api.uptime_seconds":(Date.now()-zc)/1e3}});for(let t of Lc)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=kc("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",Tc,` ${hc("COPILOT-API")} ${gc(`v${e}`)} ${gc("·")} ${Rc(t)} uptime`,Tc,""," Check in from time to time on",` ${_c(o)}`,"",Tc,""];console.log(n.join("\n"))}(Gc,Date.now()-zc),y.exit(t)};y.on("SIGINT",()=>e("SIGINT")),y.on("SIGTERM",()=>e("SIGTERM")),y.on("uncaughtException",t=>{o.error("Uncaught exception:",t),e("uncaughtException",1)}),y.on("unhandledRejection",(t,n)=>{o.error("Unhandled promise rejection at:",n,"reason:",t),e("unhandledRejection",1)})}const Jc=e=>e.filter(e=>"embeddings"!==e.capabilities.type).map(e=>e.id),Wc=e=>e.filter(e=>"embeddings"!==e.capabilities.type&&(e.supported_endpoints?.includes("/responses")??!0)).map(e=>e.id);async function Yc(e,t,n){if(!e._cc1)return!1;ne.models||(o.error("Cannot apply --claude-code defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --claude-code."),y.exit(1));let r,a,i=function(e,t,n){if(e&&t){if(!n.includes(e))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid model: ${e}`);if(!n.includes(t))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid small model: ${t}`);return{model:e,smallModel:t}}if(e||t)throw Error("Both --model and --small-model must be specified for model selection")}(e.model,e.smallModel,Jc(ne.models.data));i?(r=i.model,a=i.smallModel):(r=await o.prompt("Select a model to use",{type:"select",options:Jc(ne.models.data)}),a=await o.prompt("Select a small model to use",{type:"select",options:Jc(ne.models.data)}));let s=mc({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:"dummy",ANTHROPIC_MODEL:r,ANTHROPIC_SMALL_FAST_MODEL:a,NODE_EXTRA_CA_CERTS:n?.certPath},"claude");try{return h.writeSync(s),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(s),!1}}function Vc(e){return e._t2?"cli_arg":y.env.GH_TOKEN?"env_var":"stored"}function Xc(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=xe.startSpan("copilot_api.server.startup",{kind:u.INTERNAL,attributes:rt({config:fc(t,{version:o,_t3:Vc(t),foundryAuth:ne.foundry?.auth}),runtime:n,identity:{_u1:r.login,machineId:ne.machineId,sessionId:ne.sessionId,_v1:ne._v1},connectivity:ne.connectivity,modelsCount:ne.models?.data.length??0,startupDurationMs:Date.now()-zc},"copilot_api")});if(ne.models?.data)for(let e of ne.models.data)a.addEvent("copilot_api.model.available",rt(e,"model"));a.end(),tt(w.INFO,"INFO","Server started",rt({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:ne.models?.data.length??0,startupDurationMs:Date.now()-zc},"copilot_api"))}async function Zc(e,t){try{return await async function(e){return"foundry"===e.provider?(ne.foundry=Ro(process.env),ne.connectivity.h2=!1,ne.connectivity.h2Keepalive=!1,"entra"===ne.foundry.auth&&await Ao(ne.foundry),o.info(`Using Microsoft Foundry upstream: ${ne.foundry.endpoint} (${"entra"===ne.foundry.auth?"Entra ID":"API key"} auth)`),{login:("copilot"===e.fallback?await pc(e):void 0)??"foundry"}):dc(e)}(e)}catch(o){throw await async function(e,t){let o=rt({config:t,startupStage:"upstream_auth"},"copilot_api"),n=xe.startSpan("copilot_api.server.startup_failed",{kind:u.INTERNAL,attributes:o});e instanceof Wt&&(n.setAttribute("http.response.status_code",e.response.status),n.setAttribute("url.full",e.response.url)),ot(n,e),n.end(),tt(w.ERROR,"ERROR","Server startup failed",{...o,"exception.message":e instanceof Error?e.message:String(e)}),await ve()}(o,{version:t,provider:e.provider,accountType:e.accountType,_t3:Vc(e)}),o}}async function Qc(e){if(e.https){if(e.httpsCert&&e.httpsKey)return async function(e,t){let[o,n]=await Promise.all([a.readFile(e,"utf8"),a.readFile(t,"utf8")]);return{cert:o,key:n,certPath:e,keyPath:t,generated:!1}}(e.httpsCert,e.httpsKey);if(e.httpsCert||e.httpsKey)throw Error("Both --https-cert and --https-key must be provided together");return async function(e=[]){if(await Hc(e)){let e=await Fc(Dc),t=await Fc(jc);if(e&&t)return{cert:e,key:t,certPath:Dc,keyPath:jc,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),Bc(e)}(e.httpsHosts)}}async function eu(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=vr;try{G(t),G(n)}catch{throw o.error("Tailscale cert not found. Run `copilot-api cowork-setup install` first."),Error("Tailscale cert not found")}return{...e,https:!0,httpsCert:t,httpsKey:n}}(e);if(Kc(),Lc.push(()=>{o.debug("Cleaning up connectivity monitor"),ct.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),Cn=!1,Tn&&=void clearInterval(Tn),An&&=void ct.off("online",An),Sn&&=void ct.off("offline",Sn),$n=void 0,En=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),fa&&=void clearInterval(fa),ha&&=void clearInterval(ha);let e=[...pa.keys(),...da];pa.clear(),da.clear(),ua.clear(),ma=void 0;for(let t of e)ga(t)&&(Be.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await ve()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");ne.provider=t.provider,ne.accountType=t.accountType,ne.manualApprove=t.manual,ne.rateLimitSeconds=t.rateLimit,ne.rateLimitWait=t.rateLimitWait,ne.showToken=t.showToken,ne.timeoutMs=t.timeout,ne.connectivity.timeoutMs=t.connectTimeout,ne.webSearchProviders=t.webSearchProviders,ne.errorReporting=function(e){let t=y.env.COPILOT_API_ERROR_REPORTING;return(void 0===t||!["0","false","no","off"].includes(t.trim().toLowerCase()))&&e}(t.errorReporting),function(){let e="1"===y.env.COPILOT_H2_KEEPALIVE||"true"===y.env.COPILOT_H2_KEEPALIVE,t=e||"1"===y.env.COPILOT_H2||"true"===y.env.COPILOT_H2;ne.connectivity.h2=t,ne.connectivity.h2Keepalive=e}(),await X(),uc().catch(()=>{}),vn();let n=await qt();Gc=n;let r=Dt();!function(e,t){t&&(we=t),ye=crypto.randomUUID();let o=T({[O]:"copilot-api",[C]:e,[E]:ye}),{endpoint:n,headers:r}=ke();_e=new S({resource:o,traceExporter:new x({url:`${n}/v1/traces`,headers:r}),metricReader:new A({exporter:new v({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new $({exporter:new k({url:`${n}/v1/logs`,headers:r})})],instrumentations:[]}),_e.start()}(n,zc);let a=await Zc(t,n);await async function(){try{return await kn(),!0}catch(e){let t="object"==typeof e&&e&&"statusCode"in e&&"number"==typeof e.statusCode?e.statusCode:void 0,n=e instanceof Error?e.message:"Unknown error occurred",r=void 0===t?"":` (HTTP ${t})`,a="foundry"===ne.provider?"Foundry":"Copilot";return o.warn(`Could not fetch model list from ${a}${r}: ${n}. This is likely a transient network or authentication issue. The proxy will start anyway; model listing endpoints may return empty until the cache is populated.`),!1}}()||function(e){let t=setTimeout(()=>{kn().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let i=function(e=18e5){let t=setInterval(()=>{kn().then(()=>o.debug("Model list refreshed successfully")).catch(e=>{o.warn("Failed to refresh model list; keeping existing cache:",e)})},e);return t.unref(),()=>{clearInterval(t)}}();Lc.push(()=>{o.debug("Cleaning up model refresh interval"),i()}),ne.connectivity.h2&&(wa(ya(gt(ne))),ne.connectivity.h2Keepalive&&ka()),Xc({options:t,version:n,runtime:r,_u1:a});let s=await Qc(t),l=s?"https":"http",c=`${l}://localhost:${t.port}`,u=await Yc(t,c,s)||await async function(e,t,n){if(!e.codex)return!1;let r;if(ne.models||(o.error("Cannot apply --codex defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --codex."),y.exit(1)),e.model){let t=Wc(ne.models.data);if(!t.includes(e.model))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid model: ${e.model}`);r=e.model}else r=await o.prompt("Select a model to use with Codex CLI",{type:"select",options:Wc(ne.models.data)});let a=mc({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return h.writeSync(a),!0}catch{return o.warn("Failed to copy to clipboard. Here is the Codex CLI command:"),o.log(a),!1}}(t,c,s);(function(e){let t=[...Ec(e),...Oc(e),...Cc(e),...Ic(),"",...Sc(sc()),...Nc(e),...Pc(e),""];console.log(t.join("\n"))})(await async function(e){let{options:t,version:o,runtime:n,user:r,clipboardCopied:a,tls:i}=e,s=i?"https":"http";return{version:o,runtime:n,user:r,accountType:t.accountType,port:t.port,timeout:t.timeout,webSearchProviders:t.webSearchProviders.map(e=>e.name),model:t.model,smallModel:t.smallModel,clipboardCopied:a,https:i?{certPath:i.certPath,keyPath:i.keyPath,generated:i.generated,selfSigned:!t.httpsCert}:void 0,endpoints:t.claudeCowork?{scheme:s,port:t.port,hostname:await ur()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:u,tls:s})),Vl(),K({fetch:vl.fetch,port:t.port,hostname:t.hostname,tls:s?{cert:s.cert,key:s.key}:void 0,bun:{idleTimeout:255}}),function(e,t,n){o.info(`Server listening on ${e}://${t}:${n}`)}(l,t.hostname,t.port),t.smokeTest&&"copilot"===t.provider&&await async function(e,t,n){try{o.start("Running first-run self-test (one tiny generation)…");let r=await $l({model:t});if(r.ok){let t=void 0===n||["::1","127.0.0.1","localhost"].includes(n)?`Point your client at ${e}`:`Point your client at ${e} — you bound ${n}, so from another machine/container replace \`localhost\` with this host's reachable IP/hostname.`;return void o.success(`Self-test passed — generation works via ${r.model} (${r.durationMs}ms). ${t}`)}let a=r.status?` (HTTP ${r.status})`:"";o.warn(`Self-test FAILED${a}: ${r.reason??"unknown error"}`),r.detail&&o.info(` detail: ${Pr(r.detail)}`),o.info(" The server is still running. Run `copilot-api doctor` to diagnose, or `--no-smoke-test` to skip this check.")}catch(e){o.warn("First-run self-test could not run:",e instanceof Error?e.message:String(e))}}(c,t.smallModel??t.model,t.hostname)}function tu(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const ou=e({meta:{name:"start",description:"Start the API server"},args:{provider:{type:"string",description:'Upstream provider: "copilot" (default) or "foundry" (Microsoft Foundry / Azure OpenAI; reads FOUNDRY_ENDPOINT, plus FOUNDRY_API_KEY or an Entra ID login such as az login). Overrides COPILOT_API_PROVIDER.'},fallback:{type:"string",description:'With --provider foundry: "copilot" re-sends a Foundry-rate-limited (429) request to GitHub Copilot and keeps that model on Copilot until Foundry\'s retry-after passes. Overrides COPILOT_API_FALLBACK.'},port:{alias:"p",type:"string",default:"4141",description:"Port to listen on"},hostname:{alias:"H",type:"string",default:"127.0.0.1",description:"Hostname/IP to bind the server to. Defaults to 127.0.0.1 (localhost only) for security. Use 0.0.0.0 only when you intentionally need LAN/network/Docker exposure."},verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"account-type":{alias:"a",type:"string",default:"individual",description:"Account type (individual, business, enterprise)"},manual:{type:"boolean",default:!1,description:"Enable manual request approval"},"rate-limit":{alias:"r",type:"string",description:"Rate limit in seconds between requests"},wait:{alias:"w",type:"boolean",default:!1,description:"Wait instead of error when rate limit is hit. Has no effect if rate limit is not set"},"github-token":{alias:"g",type:"string",description:"Auth token (visible in process list — prefer GH_TOKEN env var)"},"claude-code":{alias:"c",type:"boolean",default:!1,description:"Generate a command to launch with API config"},codex:{type:"boolean",default:!1,description:"Generate a command to launch Codex CLI with Copilot API config"},model:{alias:"m",type:"string",description:"Model to use (with --claude-code or --codex)"},"small-model":{alias:"s",type:"string",description:"Small/fast model to use (requires --claude-code)"},"show-token":{type:"boolean",default:!1,description:"Show tokens on fetch and refresh"},"error-reporting":{type:"boolean",default:!0,description:"Send anonymous, sanitized error reports to the maintainer to help fix bugs (no prompts, completions, or tokens). Use --no-error-reporting or COPILOT_API_ERROR_REPORTING=0 to disable."},timeout:{alias:"t",type:"string",description:"API timeout in milliseconds (default: 600000)"},"connect-timeout":{type:"string",description:"Connectivity probe timeout in milliseconds (default: 15000). Overrides COPILOT_CONNECT_TIMEOUT_MS env var."},"tavily-api-key":{type:"string",description:"[DEPRECATED — set the TAVILY_API_KEY env var instead] Tavily API key for web search."},"web-search-provider":{type:"string",description:'Web search failover order, e.g. "exa,tavily" (first = primary, rest = fallbacks). Web search turns on when TAVILY_API_KEY and/or EXA_API_KEY are set; this flag is optional and only orders the providers you configured.'},https:{type:"boolean",default:!1,description:"Serve over HTTPS using a self-signed certificate (auto-generated and persisted)"},"https-cert":{type:"string",description:"Path to a PEM-encoded TLS certificate (use with --https-key to bring your own cert)"},"https-key":{type:"string",description:"Path to a PEM-encoded TLS private key (use with --https-cert to bring your own cert)"},"https-hosts":{type:"string",description:"Extra hostnames or IPs to include in the self-signed cert's SANs (comma-separated). Example: --https-hosts host.docker.internal,192.168.1.42"},"claude-cowork":{type:"boolean",default:!1,description:"Print Claude Cowork-specific setup hints (inference endpoint URLs to paste into Cowork's apiHost setting)"},"smoke-test":{type:"boolean",default:!0,description:"After startup, run one tiny self-test generation to verify the proxy works end-to-end and print a clear PASS/FAIL. Disable with --no-smoke-test (or COPILOT_API_NO_SMOKE_TEST=1)."}},run({args:e}){let t=e["rate-limit"],n=void 0===t?void 0:tu(t,"--rate-limit"),r=e.timeout,a=void 0===r?oe:tu(r,"--timeout"),i=function(e,t){let o=e??t,n=void 0===o?15e3:tu(o,"--connect-timeout");if(n<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${n}`);return n}(e["connect-timeout"],y.env.COPILOT_CONNECT_TIMEOUT_MS),s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[],c=e["web-search-provider"]??y.env.WEB_SEARCH_PROVIDER,u=c?c.split(",").map(e=>e.trim()).filter(Boolean):[];e["tavily-api-key"]&&o.warn("--tavily-api-key is deprecated; set the TAVILY_API_KEY environment variable instead.");let p=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},n=(e.order??[]).map(e=>e.toLowerCase());for(let e of n)if(!Fs(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${Ms.join(", ")}`);let r=n.length>0?n:Ms,a=new Set,i=n.length>0,s=[];for(let e of r){if(!Fs(e)||a.has(e))continue;a.add(e);let n=t[e];n?s.push({name:e,key:n}):i&&o.warn(`Web search provider "${e}" was requested but no API key is configured — skipping.`)}return s}({tavilyApiKey:e["tavily-api-key"]||y.env.TAVILY_API_KEY,exaApiKey:y.env.EXA_API_KEY,order:u}),d=(y.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),m=""!==d&&"0"!==d&&"false"!==d,f=function(e,t){let o=(e??t??"copilot").trim().toLowerCase();if("copilot"===o||"foundry"===o)return o;throw Error(`--provider must be "copilot" or "foundry", got: "${o}"`)}(e.provider,y.env.COPILOT_API_PROVIDER);return eu({provider:f,fallback:dn(e.fallback,y.env.COPILOT_API_FALLBACK,f),port:tu(e.port,"--port"),hostname:e.hostname,verbose:e.verbose,accountType:e["account-type"],manual:e.manual,rateLimit:n,rateLimitWait:e.wait,_t2:e["github-token"],_cc1:e["claude-code"],codex:e.codex,model:e.model,smallModel:e["small-model"],showToken:e["show-token"],timeout:a,connectTimeout:i,webSearchProviders:p,https:e.https,httpsCert:e["https-cert"],httpsKey:e["https-key"],httpsHosts:l,claudeCowork:e["claude-cowork"],errorReporting:e["error-reporting"],smokeTest:e["smoke-test"]&&!m})}});Hl||(Hl=!0,o.setReporters([Fl(o.options.reporters)]));const nu=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(Jl||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;Wl=e,Jl=Yl(e).catch(()=>null)})(),nu||Vl();const ru=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:zn,start:ou,"check-usage":ar,debug:Ft,doctor:Ml,"cowork-setup":Ir}});await t(ru),nu||(Wl?.abort(),Wl=void 0,Jl=void 0);export{};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "copilot-api-node20",
|
|
3
|
-
"version": "0.44.0-preview.
|
|
3
|
+
"version": "0.44.0-preview.11",
|
|
4
4
|
"description": "Turn GitHub Copilot into OpenAI/Anthropic API compatible server. Usable with Claude Code! (Node v20+ fork)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"proxy",
|
|
@@ -67,6 +67,7 @@
|
|
|
67
67
|
"yaml": "^2.8.3"
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
|
+
"@azure/identity": "^4.13.3",
|
|
70
71
|
"@opentelemetry/api": "^1.9.0",
|
|
71
72
|
"@opentelemetry/api-logs": "^0.222.0",
|
|
72
73
|
"@opentelemetry/exporter-logs-otlp-http": "^0.222.0",
|