copilot-api-node20 0.43.3 → 0.44.0-preview.10
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 +54 -4
- package/dist/main.mjs +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
|
|
10
10
|
A proxy server that turns a GitHub Copilot subscription into fully compatible OpenAI and Anthropic API endpoints. Use Claude Code, Claude Cowork, Codex CLI, and any tool that speaks the API -- all through the Copilot plan you already pay for, no separate API keys required.
|
|
11
11
|
|
|
12
|
+
Your organisation runs its models in **Microsoft Foundry / Azure OpenAI** instead? The same proxy fronts your Azure deployments with `--provider foundry`. See [Microsoft Foundry](#microsoft-foundry--azure-openai).
|
|
13
|
+
|
|
12
14
|
```
|
|
13
15
|
Clients Proxy Backends
|
|
14
16
|
─────── ───── ────────
|
|
@@ -19,6 +21,9 @@ A proxy server that turns a GitHub Copilot subscription into fully compatible Op
|
|
|
19
21
|
OpenAI SDK ─┤ /v1/chat/ └─────────────┘ │ Responses API
|
|
20
22
|
curl ─┤ completions │ Embeddings
|
|
21
23
|
Any tool ─┘ │
|
|
24
|
+
├─▶ Microsoft Foundry /
|
|
25
|
+
│ Azure OpenAI
|
|
26
|
+
│ (--provider foundry)
|
|
22
27
|
└─▶ Web Search
|
|
23
28
|
(Tavily / Exa)
|
|
24
29
|
```
|
|
@@ -33,6 +38,7 @@ A proxy server that turns a GitHub Copilot subscription into fully compatible Op
|
|
|
33
38
|
- [Codex CLI](#codex-cli)
|
|
34
39
|
- [Web Search](#web-search)
|
|
35
40
|
- [Claude Cowork](#claude-cowork)
|
|
41
|
+
- [Microsoft Foundry / Azure OpenAI](#microsoft-foundry--azure-openai)
|
|
36
42
|
- [API Endpoints](#api-endpoints)
|
|
37
43
|
- [CLI Reference](#cli-reference)
|
|
38
44
|
- [Commands](#commands)
|
|
@@ -53,6 +59,7 @@ A proxy server that turns a GitHub Copilot subscription into fully compatible Op
|
|
|
53
59
|
| **Full Claude Code support** | All Claude models, streaming, extended thinking, and the complete **1M token context window** |
|
|
54
60
|
| **Claude Cowork support** | Run Claude's desktop app through Copilot — **one-command setup** via [Tailscale](https://tailscale.com) for zero-trust-hassle HTTPS |
|
|
55
61
|
| **Full Codex CLI support** | Complete **OpenAI Responses API** implementation purpose-built for Codex CLI |
|
|
62
|
+
| **Microsoft Foundry / Azure OpenAI** | Serve Claude Code and Codex from your own Azure deployments (GPT, Claude, and others) with `--provider foundry`: no GitHub account needed |
|
|
56
63
|
| **Web search** | Optional web search for Claude Code and Codex sessions, via **Tavily and/or Exa** with automatic failover |
|
|
57
64
|
| **Dual API compatibility** | OpenAI Chat Completions, Anthropic Messages, and OpenAI Responses APIs side by side |
|
|
58
65
|
| **HTTPS with auto-generated certs** | Self-signed TLS certs with configurable SANs -- works across VMs, containers, and LAN |
|
|
@@ -92,13 +99,13 @@ npx copilot-api-node20@latest start \
|
|
|
92
99
|
Start the proxy with Codex mode:
|
|
93
100
|
|
|
94
101
|
```bash
|
|
95
|
-
npx copilot-api-node20@latest start --codex --model gpt-5.
|
|
102
|
+
npx copilot-api-node20@latest start --codex --model gpt-5.6-sol
|
|
96
103
|
```
|
|
97
104
|
|
|
98
105
|
Configure `~/.codex/config.toml`:
|
|
99
106
|
|
|
100
107
|
```toml
|
|
101
|
-
model = "gpt-5.
|
|
108
|
+
model = "gpt-5.6-sol"
|
|
102
109
|
model_provider = "local"
|
|
103
110
|
|
|
104
111
|
[model_providers.local]
|
|
@@ -173,6 +180,36 @@ npx copilot-api-node20@latest cowork-setup doctor
|
|
|
173
180
|
|
|
174
181
|
See **[docs/claude-cowork.md](./docs/claude-cowork.md)** for the full setup guide and troubleshooting. For Cowork's own configuration docs, see [Claude Cowork 3P Installation](https://claude.com/docs/cowork/3p/installation).
|
|
175
182
|
|
|
183
|
+
### Microsoft Foundry / Azure OpenAI
|
|
184
|
+
|
|
185
|
+
Point the proxy at your own Azure resource instead of GitHub Copilot. No GitHub account or Copilot subscription is needed:
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
export FOUNDRY_ENDPOINT=https://<resource>.openai.azure.com
|
|
189
|
+
export FOUNDRY_API_KEY=<key> # or omit it and `az login` for Entra ID
|
|
190
|
+
npx copilot-api-node20@latest start --provider foundry
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Then launch Claude Code with a **deployment name** as the model:
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
ANTHROPIC_BASE_URL=http://localhost:4141 ANTHROPIC_AUTH_TOKEN=dummy \
|
|
197
|
+
ANTHROPIC_DEFAULT_HAIKU_MODEL=<fast-deployment> \
|
|
198
|
+
claude --model <deployment>
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
The model you ask for is the model you get: the proxy never renames or substitutes one. It routes by model family:
|
|
202
|
+
|
|
203
|
+
| Model family | Served by |
|
|
204
|
+
|:--|:--|
|
|
205
|
+
| Claude | Your resource's native `/anthropic/v1/messages`, forwarded byte for byte |
|
|
206
|
+
| OpenAI (`gpt-*`, `o*`, codex) | `/openai/v1/responses` (translated for Claude Code) |
|
|
207
|
+
| Others (DeepSeek, Grok, …) | `/openai/v1/chat/completions` |
|
|
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
|
+
|
|
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).
|
|
212
|
+
|
|
176
213
|
### First run & troubleshooting
|
|
177
214
|
|
|
178
215
|
On a successful start the proxy runs a **one-shot self-test generation** and prints the result, so you know immediately whether everything works end-to-end — you'll see something like:
|
|
@@ -213,15 +250,22 @@ curl http://localhost:4141/v1/chat/completions \
|
|
|
213
250
|
|
|
214
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`.
|
|
215
252
|
|
|
216
|
-
| Method | Path |
|
|
253
|
+
| Method | Path | Purpose |
|
|
217
254
|
|:--|:--|:--|
|
|
255
|
+
| `GET` | `/` | Basic server-running response |
|
|
256
|
+
| `GET` | `/health` | Proxy, token, and upstream health status |
|
|
218
257
|
| `POST` | `/v1/chat/completions` | OpenAI Chat Completions |
|
|
258
|
+
| `POST` | `/chat/completions` | OpenAI Chat Completions without the `/v1` prefix |
|
|
219
259
|
| `POST` | `/v1/responses` | OpenAI Responses API |
|
|
260
|
+
| `POST` | `/responses` | OpenAI Responses API without the `/v1` prefix |
|
|
220
261
|
| `POST` | `/v1/messages` | Anthropic Messages |
|
|
221
262
|
| `POST` | `/v1/messages/count_tokens` | Anthropic Token Counting |
|
|
222
263
|
| `POST` | `/v1/embeddings` | OpenAI Embeddings |
|
|
264
|
+
| `POST` | `/embeddings` | OpenAI Embeddings without the `/v1` prefix |
|
|
223
265
|
| `GET` | `/v1/models` | OpenAI Models |
|
|
224
|
-
|
|
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` |
|
|
225
269
|
|
|
226
270
|
---
|
|
227
271
|
|
|
@@ -250,17 +294,23 @@ All OpenAI-compatible routes are also available without the `/v1/` prefix.
|
|
|
250
294
|
|
|
251
295
|
| Flag | Alias | Default | Description |
|
|
252
296
|
|:--|:--|:--|:--|
|
|
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` |
|
|
253
299
|
| `--port` | `-p` | `4141` | Port to listen on |
|
|
254
300
|
| `--hostname` | `-H` | `127.0.0.1` | Hostname/IP to bind to. Use `0.0.0.0` for LAN/Docker exposure |
|
|
255
301
|
| `--claude-code` | `-c` | | Enable Claude Code compatibility mode |
|
|
256
302
|
| `--codex` | | | Enable Codex CLI compatibility mode |
|
|
257
303
|
| `--model` | `-m` | | Primary model to use |
|
|
258
304
|
| `--small-model` | `-s` | | Lightweight model for fast tasks (Claude Code) |
|
|
305
|
+
| `--manual` | | `false` | Require manual approval before forwarding requests |
|
|
259
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 |
|
|
260
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` |
|
|
261
310
|
| `--account-type` | `-a` | `individual` | `individual`, `business`, or `enterprise` |
|
|
262
311
|
| `--github-token` | `-g` | | Provide a GitHub token directly (skips OAuth) |
|
|
263
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` |
|
|
264
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` |
|
|
265
315
|
| `--tavily-api-key` | | | **Deprecated** — prefer `TAVILY_API_KEY` env var. Tavily API key for web search |
|
|
266
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 j}from"hono/cors";import{streamSSE as D}from"hono/streaming";import{events as M}from"fetch-event-stream";import{Tokenizer as H,models as F}from"ai-tokenizer";import*as B from"ai-tokenizer/encoding/claude";import U,{accessSync as L}from"node:fs";import{serve as z}from"srvx";import{isIP as G}from"node:net";import{generate as J}from"selfsigned";const W=s.join(i.homedir(),".local","share","copilot-api"),K={APP_DIR:W,GITHUB_TOKEN_PATH:s.join(W,"github_token"),MACHINE_ID_PATH:s.join(W,"machine_id"),SESSION_ID_PATH:s.join(W,"session_id")};async function V(){await a.mkdir(K.APP_DIR,{recursive:!0}),await Y(K.GITHUB_TOKEN_PATH),await Y(K.SESSION_ID_PATH)}async function Y(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,""),await a.chmod(e,384)}}const X=6e5,Z={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),Ke(_.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"}),je=_e.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),De=_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"}),He=_e.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),Fe=_e.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Be=_e.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),Ue=_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"}),Je=_e.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),We=_e.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function Ke(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 Ve(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 Ye(e,t,o){Ve(e,o),t&&t!==e&&Ve(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","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 Ve(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 Ve(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"}),Ke(_.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"}),Ke(_.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`${K.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(K.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=R();return await a.writeFile(K.SESSION_ID_PATH,e),await a.chmod(K.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_***"}],bt=new Set(["authorization","cookie","set-cookie","x-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",je.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(K.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(K.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:K.APP_DIR,GITHUB_TOKEN_PATH:K.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 jt;function Dt(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){jt??=Et();let t=await jt,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 Ht=new WeakSet;async function Ft(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&&Ht.add(e)}(e),!1)}var Bt=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},Ut=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function Lt(e,t){return setTimeout(()=>e.abort(new Ut(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 Jt(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function Wt(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=Jt(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function Kt(e){let t=e.code;return"string"==typeof t?t:void 0}function Vt(e){if(void 0===e.cause)return"";let t=Wt(e);if(t===e)return"";let o=Kt(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function Yt(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&&Ht.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",Z.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function ao(e){return Yt(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 Bt&&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),Ke(_.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"),Ke(_.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 Bt)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),Ke(_.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&&Dt({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 Ut||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof Ut}(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.";Ke(_.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?Wt(t):void 0,r=(n&&Kt(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.";Ke(_.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}${Vt(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),Ke(_.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),Dt({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}${Vt(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 Bt("Failed to get Service token",t);return await t.json()}catch(e){throw Ve(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._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new Bt("Failed to get GitHub user",t);return await t.json()}catch(e){throw Ve(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let co=null;function uo(){return co||=so().then(({token:e})=>{Z._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{co=null}),co}const po=async()=>{let e=`${ct(Z)}/models`,t=ut(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 Bt("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw Ve(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const mo=e=>new Promise(t=>{setTimeout(t,e)}),fo=e=>null==e;async function ho(){let e=await(async()=>{try{return await po()}catch(e){if(e instanceof Bt&&401===e.response.status)return await uo(),po();throw e}})();Z.models=e}const go=()=>{Z._v1="1.140.0-insider"};var _o=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let yo,wo,ko,bo,vo,xo=!1,To=!1,$o=!1;function Ao(){return So()?vo:void 0}function So(){return void 0!==vo&&Date.now()-vo.at<6e4}function Eo(){return $o?"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 Oo=()=>a.readFile(K.GITHUB_TOKEN_PATH,"utf8");function Co(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._t1=void 0,vo={status:s,message:l,at:Date.now()},clearInterval(yo),yo=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),Ue.record(performance.now()-a,{reason:r}),Ke(_.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 Io(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;Z._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:c.ERROR,message:s.message}),t.recordException(s),Ee.add(1,{reason:r}),Ue.record(performance.now()-a,{reason:r}),Ke(_.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const Po=async(e=5,t=1e3,n="scheduled")=>xo?(o.debug("Token refresh already in progress, coalescing"),wo):(xo=!0,wo=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._t1=t,vo=void 0,To&&void 0===yo&&(o.info("Token refresh recovered, resuming scheduled refresh"),No(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"}),Ue.record(performance.now()-a,{reason:n}),void Ke(_.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof Bt&&(401===s.response.status||403===s.response.status))return void Co({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 Io({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(),xo=!1,wo=void 0}}),wo);async function Ro(){return!!Z._t1||!So()&&(void 0!==vo&&$o&&await async function(){if(wo)return;let e=(await Oo().catch(()=>{}))?.trim();e&&e!==Z._t2?.trim()&&(Z._t2=e,o.info("Picked up re-authenticated Auth token from disk"),Z.showToken&&o.info("Auth token:",e))}(),await Po(3,250,"on-demand"),!!Z._t1)}function No(e){yo&&clearInterval(yo);let t=Math.max(1e3*(e-60),6e4);yo=setInterval(()=>{Po(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function qo(e){try{let t=await Oo();if(t&&!e?.force)return Z._t2=t,$o=!0,Z.showToken&&o.info("Auth token:",t),void await jo();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 Bt("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 _o("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 mo(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 _o("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new _o("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 mo(t);continue}if(r.access_token)return r.access_token;await mo(t)}catch(e){if(e instanceof _o)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await mo(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(K.GITHUB_TOKEN_PATH,e,{mode:384}))(r),Z._t2=r,$o=!0,Z.showToken&&o.info("Auth token:",r),await jo()}catch(e){throw e instanceof Bt?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function jo(){let e=await lo();o.success(`Authenticated as ${e.login}`)}async function Do(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),Z.showToken=e.showToken,await V(),await qo({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 Mo=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})=>Do({verbose:e.verbose,showToken:e["show-token"]})}),Ho=.01,Fo=864e5,Bo=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Uo=new Intl.NumberFormat("en-US"),Lo=e=>Bo.format(e*Ho),zo=e=>e.credits_used??e.entitlement-e.remaining,Go=(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())/Fo;if(r<.5)return;let a=zo(e),i=a*Ho/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*Ho,c=new Date(n.getTime()+l/i*Fo);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},Jo=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Uo.format(zo(e))} of ${Uo.format(e.entitlement)} used`:"n/a",Wo=e=>e.padEnd(14),Ko=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${Wo("AI credits")}unlimited`);else{let e=zo(o),t=o.percent_remaining;n.push(`${Wo("AI credits")}${Lo(e)} / ${Lo(o.entitlement)} ${t.toFixed(1)}% left`,`${Wo("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${Wo("")}${Uo.format(e)} of ${Uo.format(o.entitlement)} credits`)}if(n.push("",`${Wo("Chat")}${Jo(e.quota_snapshots.chat)}`,`${Wo("Completions")}${Jo(e.quota_snapshots.completions)}`,"",`${Wo("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/Fo)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=Go(o,e.quota_reset_date,t);r&&n.push(`${Wo("Burn rate")}~${Bo.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?`${Uo.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${Wo("Overage")}${a}`)}return n.join("\n")},Vo=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 Bt("Failed to get usage",t);return await t.json()}catch(e){throw Ve(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},Yo=()=>g.stdout.write("[2J[H"),Xo=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Zo=async()=>{let e=await Vo();return Ko(e)},Qo=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 V(),await qo(),!e.watch){try{o.box(await Zo())}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 Zo();n&&Yo(),o.box(e),o.log(Xo(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),en=N(f);async function tn(){let e="win32"===g.platform?"where.exe":"which";try{return await en(e,["tailscale"]),!0}catch{return!1}}async function on(){try{let{stdout:e}=await en("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function nn(e){return e.replace(/\.$/,"")}async function rn(){let e=await on();if(e?.Online)return nn(e.DNSName)}const an=N(f),sn=e=>`[1m${e}[0m`,ln=e=>`[2m${e}[0m`,cn=e=>`[36m${e}[0m`,un=e=>`[32m${e}[0m`,pn=e=>`[31m${e}[0m`,dn=e=>`[33m${e}[0m`,mn=ln(" ─────────────────────────────────────────────────────────────"),fn=s.join(K.APP_DIR,"certs","tailscale"),hn=s.join(fn,"cert.pem"),gn=s.join(fn,"key.pem"),_n={certDir:fn,certPath:hn,keyPath:gn};function yn(){switch(g.platform){case"darwin":return[` ${ln("Install Tailscale for macOS:")}`,` ${cn("https://tailscale.com/download/mac")}`,` ${ln("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${ln("After installing, open the Tailscale app and sign in.")}`,` ${ln("Then re-run this command.")}`].join("\n");case"linux":return[` ${ln("Install Tailscale for Linux:")}`,` ${cn("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${cn("sudo tailscale up")}`,` ${ln("or")} ${cn("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${ln("Install Tailscale for Windows:")}`,` ${cn("https://tailscale.com/download/windows")}`,"",` ${ln("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${ln("Install Tailscale:")} ${cn("https://tailscale.com/download")}`}}function wn(){let e=[` ${pn("Tailscale is not running.")}`];return"darwin"===g.platform?e.push(` ${ln("Open the Tailscale app from Applications and sign in.")}`,` ${ln("Download:")} ${cn("https://tailscale.com/download/mac")}`):"win32"===g.platform?e.push(` ${ln("Open the Tailscale app and sign in.")}`,` ${ln("Download:")} ${cn("https://tailscale.com/download/windows")}`):e.push(` ${ln("Connect with:")} ${cn("sudo tailscale up")}`),e.push("",` ${ln("Then re-run this command.")}`),e.join("\n")}async function kn(){try{return await a.access(hn),await a.access(gn),!0}catch{return!1}}function bn(e){console.log(""),console.log(mn),console.log(` ${sn("Claude Cowork Setup")} ${ln("— Diagnostic")}`),console.log(mn),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?un("✅"):"missing"===n.status?pn("❌"):dn("❓");let r=n.detail?ln(` ${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(` ${un("All checks passed.")}`):console.log(` ${pn(`${t.length} issue(s).`)} Run ${cn("copilot-api cowork-setup install")} to fix.`),console.log("")}const vn={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},xn=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await tn();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return bn(e),console.log(""),console.log(yn()),void console.log("");let o=await on();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},bn(e),console.log(wn()),void console.log("");let n=nn(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await kn();e["tailscale-cert"]=r?{status:"ok",detail:hn}:{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)}}),Tn=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:vn},async run({args:e}){await async function(e){if(console.log(""),console.log(mn),console.log(` ${sn("Claude Cowork Setup")} ${ln("— Install")}`),console.log(mn),console.log(""),!await tn())return console.log(` ${pn("Tailscale is not installed.")}`),console.log(""),console.log(yn()),console.log(""),console.log(` ${ln("After installing, run")} ${cn("tailscale up")} ${ln("to connect, then re-run this command.")}`),void console.log("");let t=await on();if(!t||!t.Online)return console.log(wn()),void console.log("");let n=nn(t.DNSName);if(console.log(` ${ln("Tailscale hostname:")} ${sn(n)}`),console.log(""),console.log(` ${sn("Generating TLS certificate via Tailscale…")}`),console.log(` ${ln("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${cn(`$ tailscale cert --cert-file ${hn} --key-file ${gn} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(fn,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await an("tailscale",["cert","--cert-file",hn,"--key-file",gn,n]),console.log(` ${un("✓ 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(mn),console.log(` ${sn("Next steps")}`),console.log(mn),console.log(""),console.log(` ${sn("1.")} Start the proxy:`),console.log(` ${cn("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${sn("2.")} In Cowork ${ln("→")} Settings ${ln("→")} Inference Provider, set:`),console.log(` ${sn("inferenceGatewayBaseUrl")} = ${cn(`https://${n}:<port>`)}`),console.log(` ${ln("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${sn("3.")} Restart Cowork ${ln("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${ln("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)}}),$n=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:vn},async run({args:e}){await async function(e){if(console.log(""),console.log(mn),console.log(` ${sn("Claude Cowork Setup")} ${ln("— Revert")}`),console.log(mn),console.log(""),!await kn())return console.log(` ${ln("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${sn("Remove Tailscale cert files:")}`),console.log(` ${ln(hn)}`),console.log(` ${ln(gn)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(fn,{recursive:!0}),console.log(` ${un("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${ln("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),An=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:xn,install:Tn,revert:$n}}),Sn=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function En(e){if(!Sn.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 On(e){return"string"==typeof e?En(e):Array.isArray(e)?function(e){let t;for(let o=0;o<e.length;o++){let n=e[o],r=On(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?On(a):a;!t&&(i!==a||"__proto__"===r)&&(t=Cn({},o,e)),t&&(t[r]=i)}let r=t??e;return"object"===r.type&&!("properties"in r)&&(t??=Cn({},o,o.length),t.properties={}),t??e}(e):e}function Cn(e,t,o){for(let n=0;n<o;n++)e[t[n][0]]=t[n][1];return e}const In="x-copilot-api-self-test",Pn=R();const Rn=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function Nn(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 qn(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),De.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 jn=1048576;const Dn=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),We.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),Re.add(1,{result:"rejected"}),new Bt("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 Mn(e){if(Z._t1||await Ro())return null;let t=Ao();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${Eo()}`,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 Hn(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 Fn(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))}const Bn=[{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"}],Un="claude-haiku-4.5",Ln={haiku:Un,"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 zn=/^claude-/i;function Gn(e){return e.toLowerCase().replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2")}function Jn(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 Bn)if(t.pattern.test(e))return t.family;return null}(n),i=zn.test(n),s=n.replace(/-\d{8}(?::.*)?$/,""),l=r?`-${r}`:"",c=l?[`${s}${l}`,s]:[s];for(let e of i?c:[]){let o=Gn(e);for(let e of t)if(Gn(e.replace(/-\d{8}(?::.*)?$/,""))===o)return e}return a?function(e,t,o=null){let n=Ln[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 Wn=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function Kn(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=Wn.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=Wn.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}var Vn=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Yn(e){if(!e||"string"!=typeof e)throw new Vn("Model name is required and must be a string");if(!Z.models?.data)throw new Vn("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=Jn(e,t);if(!o)throw $e.add(1,{requested_model:e}),new Vn(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function Xn(e){let t=Z.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):/gpt-[\d.]+-codex/i.test(e)}async function Zn(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 Bt("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"}),Fe.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await mo(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}var Qn=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function er(e){if(e instanceof Qn)return{type:e.type,message:e.message};if(e instanceof Bt){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 tr(e,t){let{type:n,message:r}=er(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 or(e,t){let{type:n,message:r}=er(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 nr(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 rr(e,t,o){return Math.min(Math.max(e,t),o)}function ar(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 ar(JSON.parse(r),t+1)}catch{return null}}function ir(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=nr(o.capabilities.supports.min_thinking_budget),r=nr(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:nr(o.capabilities.limits?.max_output_tokens)??void 0}}function sr(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=rr(nr(e.requestedBudget)??o,o,n),a=nr(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 lr(e,t){if(fo(e.thinking_budget))return e;let o=ir(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=sr({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 cr(e){return"invalid_thinking_budget"===ar(e)}async function ur(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(fo(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(!cr(i))return null;let l=ir(n,t.model);return l?function(e,t){let o=sr({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=nr(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 pr(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 dr(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const mr=new Map,fr=new Map,hr=new Set;let gr,_r,yr;function wr(e){return!e.closed&&!e.destroyed}function kr(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 mr.set(t,Date.now()),qe.add(1,{event:"created",origin:e}),Ke(_.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=hr.has(t);qe.add(1,{event:"goaway",origin:e}),Ke(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}),fr.delete(t),hr.delete(t),mr.delete(t),wr(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function br(e,t){if(!Z.connectivity.h2)return;if(gr&&gr!==e&&function(){for(let e of[...fr.keys(),...hr])wr(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});fr.clear(),hr.clear(),mr.clear()}(),gr=e,t?.fresh){let t=kr(e);return hr.add(t),t}let n=Date.now();for(let[t]of fr)if(n-(mr.get(t)??0)>=6e5)fr.delete(t),mr.delete(t),wr(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),qe.add(1,{event:"rotated",origin:e}),Ke(_.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(wr(t))return fr.delete(t),hr.add(t),t;fr.delete(t),mr.delete(t)}let r=kr(e);return hr.add(r),r}function vr(e){e&&hr.delete(e)&&(wr(e)?fr.set(e,Date.now()):mr.delete(e))}function xr(){yr||(yr=setInterval(()=>{!function(){let e=Date.now(),t=Z.connectivity.h2Keepalive,n=fr.size;for(let[r,a]of fr)e-a<6e4||t&&n<=1||(fr.delete(r),mr.delete(r),n--,wr(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),qe.add(1,{event:"idle_reaped",origin:gr??""}),Ke(_.INFO,"INFO",`HTTP/2 idle connection reaped for ${gr}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":gr??""}))}()},3e4),yr.unref())}function Tr(){_r||(o.debug("Starting HTTP/2 keepalive (every 45s)"),_r=setInterval(()=>{(async function(){if(0===fr.size&&0===hr.size){if(gr){let e=kr(gr);fr.set(e,Date.now())}return}let e=[...fr.keys()];for(let t of e)fr.delete(t);await Promise.allSettled(e.map(async e=>{if(wr(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}`),fr.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:gr??""}),mr.delete(e),wr(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else mr.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),_r.unref(),xr())}function $r(e){return e.max_completion_tokens??e.max_tokens}async function Ar(e,t,o){try{if(!e.ok)throw new Bt("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&&Fn(t,n.usage),n}catch(e){throw Ve(t,e),e}finally{t.end()}}const Sr=async e=>{let t=On(e);try{return await Er(t)}catch(e){if(e instanceof Bt&&401===e.response.status)return await uo(),Er(t);let n;if(e instanceof Bt)try{n=await e.response.clone().text()}catch{n=void 0}let r=await ur({payload:t,error:e,models:Z.models,errorBodyText:n});if(r)return e instanceof Bt&&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 Er(On(r));throw e}},Er=async e=>{if(!Z._t1)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={...ut(Z,t),"X-Initiator":o?"agent":"user"},r=ct(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=$r(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":$r(e)??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":o?"agent":"user"};for(let t=0;t<=1;t++){let o=br(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 Bt("Failed to create chat completions",m,{outgoingBody:l,outgoingHeaders:n});return{events:M(m),span:d,release:()=>vr(o)}}try{return await Ar(m,d,{outgoingBody:l,outgoingHeaders:n})}finally{vr(o)}}catch(e){if(vr(o),await Ft(e,{attempt:t,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};async function Or(e,t,o){try{if(!e.ok)throw new Bt("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&&Fn(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 Ve(t,e),e}finally{t.end()}}const Cr=async e=>{try{return await Ir(e)}catch(t){if(t instanceof Bt&&401===t.response.status)return await uo(),Ir(e);throw t}},Ir=async e=>{if(!Z._t1)throw Error("Service token not found");let t=On(e),o={...ut(Z),"X-Initiator":"agent"},n=ct(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=br(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 Bt("Failed to create responses",m,{outgoingBody:i,outgoingHeaders:o});return{events:M(m),span:d,release:()=>vr(l)}}try{return await Or(m,d,{outgoingBody:i,outgoingHeaders:o})}finally{vr(l)}}catch(t){if(vr(l),await Ft(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Pr=e=>Object.hasOwn(e,"output");function Rr(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 Nr=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const qr=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 jr(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new Nr(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new Nr(`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=>Mr(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=Hr(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=Mr(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:Mr(o.content)})}return t}(e.messages);if(0===o.length)throw new Nr("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),Dr(e.temperature)&&(n.temperature=e.temperature),Dr(e.top_p)&&(n.top_p=e.top_p),Dr(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),Dr(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 Dr(e){return null!=e}function Mr(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function Hr(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 Nr(`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 Fr(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 Br(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 Ur(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 Lr(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function zr(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=Lr(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[Ur(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),[Ur(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function Gr(e,t){let o=[Ur(e,{},Br(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=Fr(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function Jr(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:[Ur(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:zr(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=Lr(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[Ur(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:Gr(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 Wr="openai_responses";function Kr(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),jr(e)}finally{t.end()}});Be.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!qr.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 Vr(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:Br(e,n.length>0)}]};return e.usage&&(r.usage=Fr(e.usage)),r}(e)}finally{t.end()}});return Be.record(performance.now()-t,{direction:"responses_to_openai"}),o}function Yr(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=Fr(t.usage);a.tokenUsage=Hn(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?(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(Vr(t))}async function Xr(e,t,n){let r;try{r=Kr(t)}catch(t){if(t instanceof Nr)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 Dn();let a=await Mn(e);if(a)return a;let i=performance.now(),s=await Cr(r),l=performance.now()-i;if(Me.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Pr(s))return Yr(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 D(e,async t=>{let n=null,a=0,s=performance.now(),d=pr(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:Wr});let c=Rr(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Hn(c),t._d1=l,e.set("requestData",t)}let u=Jr(s,m);if(u.error)throw new Qn(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:Wr};He.record(performance.now()-s,u),Je.record(a,u),dr(e,i)}catch(o){throw Ye(u,e.get("requestSpan"),o),await or(t,o),o}finally{n&&Fn(u,n),u.end(),p()}let f=e.get("requestId");f&&ue.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function Zr(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 Qr(e){let t=!0===e.get("isSelfTest");t||await Zn(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=Yn(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 Vn)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(Xn(n.model))return Xr(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),Z.manualApprove&&!t&&await Dn(),n=function(e){if(!fo(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!fo(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=lr(n,Z.models),fo(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await Mn(e);if(r)return r;let a=performance.now(),i=await Sr(n),s=performance.now()-a;if(Me.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),ea(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=Hn(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 D(e,async t=>{let o={value:null},r=0,i=performance.now(),p=pr(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=Zr(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=Hn(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(He.record(c,u),Je.record(r,u),dr(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Hn(o.value),t._d1=s,e.set("requestData",t))}}catch(o){throw Ye(c,e.get("requestSpan"),o),await or(t,o),o}finally{o.value&&Fn(c,o.value),c.end(),u()}let d=e.get("requestId");d&&ue.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const ea=e=>Object.hasOwn(e,"choices"),ta=new q;ta.post("/",async e=>{try{return await Qr(e)}catch(t){return await io(e,t)}});const oa=new q;oa.post("/",async e=>{try{let t=await e.req.json();try{t.model=Yn(t.model)}catch(t){if(t instanceof Vn)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 Mn(e);if(o)return o;let n=performance.now(),r=await(async e=>{if(!Z._t1)throw Error("Service token not found");let t=`${ct(Z)}/embeddings`,o=ut(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 Bt("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw Ve(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=Hn(r.usage),i._d1=a,e.set("requestData",i),e.json(r)}catch(t){return await io(e,t)}});const na=new q;let ra=null,aa=null;function ia(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function sa(e){return!ia(e)}na.get("/",async e=>{let t,o=function(){let e=Z._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=ra;return t&&e-t.timestamp<3e4?{result:t.result}:aa||(aa=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${ct(Z)}/models`,n=await fetch(t,{method:"GET",headers:ut(Z),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return ra={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return ra={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),aa=null}})(),aa)}();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.43.3",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 la=new H(B),ca={...F["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function ua(e){try{return la.encode(e,[],[]).length}catch(t){return o.debug("count_tokens: tokenizer failed, using length/4",t),Math.ceil(e.length/4)}}function pa(e){let t=0;for(let o of e)switch(o.type){case"text":t+=ua(o.text)*ca.contentMultiplier;break;case"tool_use":t+=ua(o.name+JSON.stringify(o.input))*ca.contentMultiplier;break;case"tool_result":o.content&&(t+=ua("string"==typeof o.content?o.content:JSON.stringify(o.content))*ca.contentMultiplier);break;case"thinking":t+=ua(o.thinking)*ca.contentMultiplier;break;case"image":t+=1600}return t}function da(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?ca.perFirstProp:ca.perAdditionalProp,t+=ua(o),r.description&&(t+=ca.perPropDesc+ua(r.description)),r.enum&&Array.isArray(r.enum)){t+=ca.perEnum;for(let e of r.enum)t+=ua(String(e))}if("object"===r.type&&r.properties&&(t+=ca.perNestedObject,t+=da(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=ca.perArrayOfObjects,t+=da(e))}}return t}function ma(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 fa(e,t,o){let n=ma(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const ha=async(e,t,n)=>{try{return await ga(e,t)}catch(r){if(r instanceof Bt&&401===r.response.status)return await uo(),ga(e,t);if(r instanceof Bt&&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}`),ga(i,t)}throw r}};const ga=async(e,t)=>{if(!Z._t1)throw Error("Service token not found");let{metadata:o,...n}=On(e),r=function(e){return e.context_management?["context-management-2025-06-27"]:[]}(n),a={...dt(Z,t,r),"X-Initiator":"agent"},i=ct(Z),s=`${i}/v1/messages`,l=Z.timeoutMs,c=JSON.stringify(n),u=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",...ma(e,t?.anthropicBeta)}}(n,t,l);for(let e=0;e<=1;e++){let t=br(i,{fresh:e>0}),r=new AbortController,p=Lt(r,l);try{let{statusCode:o,headers:i,body:p,span:d}=await tt({spanName:"copilot POST /v1/messages",url:s,target:"anthropic_messages",headers:a,body:c,signal:r.signal,headersTimeout:l,bodyTimeout:3*l,extraAttributes:{...u,"copilot_api.h2.retry_attempt":e},dispatcher:t}),m=new Response(p,{status:o,headers:i});if(!m.ok)throw d.end(),new Bt("Failed to create anthropic messages",m,{outgoingBody:c,outgoingHeaders:a});if(n.stream)return{events:M(m),span:d,release:()=>vr(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&&Fn(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(),vr(t)}}catch(o){if(vr(t),await Ft(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},_a=new Set(["low","medium","high","max","xhigh"]);function ya(e,t,n){let r=t.includes(e.model)?e.model:Jn(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=Jn(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=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 function(e){let t=e.output_config?.effort;if("string"!=typeof t||!t||!_a.has(t))return e;let n=Z.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=Kn(t,n);if(!r||!_a.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}}}(s)}const wa=e=>"object"==typeof e&&!!e&&!Array.isArray(e),ka=["properties","patternProperties","$defs","definitions"],ba=["items","additionalProperties","propertyNames","contains","not","if","then","else"],va=["anyOf","allOf","oneOf","prefixItems"];const xa=()=>["string","number","boolean"].map(e=>({type:e})),Ta=()=>({anyOf:[...xa(),{type:"array",items:{anyOf:xa()}},{type:"object"}]}),$a=e=>!0===e||wa(e)&&0===Object.keys(e).length,Aa=e=>"array"===e.type||Array.isArray(e.type)&&e.type.includes("array");function Sa(e,t){let o={...e};for(let e of ka){let n=o[e];wa(n)&&(o[e]=Object.fromEntries(Object.entries(n).map(([e,o])=>[e,wa(o)?Sa(o,t):o])))}for(let e of ba){let n=o[e];wa(n)&&(o[e]=Sa(n,t))}for(let e of va){let n=o[e];Array.isArray(n)&&(o[e]=n.map(e=>wa(e)?Sa(e,t):e))}return"prefixItems"in o&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?[...e.prefixItems]:[];delete e.prefixItems,(wa(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let o=t.flatMap(e=>$a(e)?Ta().anyOf:wa(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)),Aa(o)&&(!("items"in o)||$a(o.items))&&(t.add("items"),o.items=Ta()),$a(o.additionalProperties)&&(t.add("additionalProperties"),delete o.additionalProperties),o}function Ea(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{if(o.length>0){o.push(n);break}let e=Ca(n);e&&t.push(e);break}case"user":case"assistant":o.push(n)}return{leadingSystemTexts:t,messages:o}}function Oa(e){return Ia(Ca(e))}function Ca(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 Ia(e){if(!e.startsWith("x-anthropic-billing-header:"))return e;let t=e.indexOf("\n");return-1===t?"":e.slice(t).replace(/^\n+/,"")}function Pa(e,t){return["string"==typeof e?e:(e??[]).map(e=>e.text).join("\n\n"),...t].map(e=>Ia(e)).filter(Boolean).join("\n\n")}const Ra=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),Na=new Set(["text","image"]);function qa(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);Na.has(e)||t.add(`block:tool_result:${e}`)}}const ja=new Set;function Da(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=Ra.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&&qa(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(ja.size>=100)break;ja.has(o)||(ja.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 Ma=e=>I("sha256").update(e).digest("hex").slice(0,12);function Ha(e,t){e.setAttribute("copilot_api.translation.system_hash",Ma(t.system)),e.setAttribute("copilot_api.translation.tools_hash",Ma(JSON.stringify(t.tools??[])))}function Fa(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function Ba(e,t){let o={model:e.model,messages:Ua(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:Ya(e.tools,e.model),tool_choice:Xa(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=ir(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=nr(t),a=r&&r>1?r-1:o.min;return rr(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=lr({...o,thinking_budget:a},t)}}return o}function Ua(e,t){let{leadingSystemTexts:o,messages:n}=Ea(e),r=function(e,t){let o=Pa(e,t);return o?[{role:"system",content:o}]:[]}(t,o),a=[];for(let e of n)switch(e.role){case"system":{let t=Oa(e);if(!t)break;La(r)?a.push(t):za(r,t);break}case"user":r.push(...Ga(e));for(let e of a)za(r,e);a=[];break;case"assistant":r.push(...Ja(e))}for(let e of a)za(r,e);return r}function La(e){let t=e.at(-1);return"assistant"===t?.role&&!!t.tool_calls?.length}function za(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 Ga(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:Va(e.content)});n.length>0&&t.push({role:"user",content:Va(n)})}else t.push({role:"user",content:Va(e.content)});return t}function Ja(e){let t=function(e){return{reasoning_text:Ka(e.reasoning_text),reasoning_opaque:Ka(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:Va(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:Va(e.content),...t}]}const Wa=32768;function Ka(e){if("string"==typeof e)return e.length<=Wa?e:e.slice(0,Wa)}function Va(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 Ya(e,t){if(!e)return;let o=e.filter(sa),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:Sa(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&&d.getActiveSpan()?.setAttribute("copilot_api.translation.schema_keywords_rewritten",[...r].sort().join(",")),a}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)(Kn(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||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 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),fa(n,t,e.req.header("anthropic-beta"));let r=Yn(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 Vn)return{ok:!1,response:li(e,t.message,t.statusCode)};throw t}finally{n.end()}})}function ui(e){let{leadingSystemTexts:t,messages:o}=Ea(e.messages),n=function(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{let e=Oa(n);if(!e)break;"function_call"===t.at(-1)?.type?o.push(e):t.push(di(e));break}case"user":t.push(...mi(n),...o.map(e=>di(e))),o=[];break;case"assistant":t.push(...hi(n))}return t.push(...o.map(e=>di(e))),t}(o);if(0===n.length)throw new Bt("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 r={model:e.model,input:n,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)},a=function(e,t){return Pa(e,t)||null}(e.system,t);return a&&(r.instructions=a),e.tools?.length&&(r.tools=e.tools.filter(sa).map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(r.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)),"adaptive"===e.thinking?.type?r.reasoning={effort:pi(e.output_config?.effort??"high")}:"enabled"===e.thinking?.type&&e.thinking.budget_tokens&&(r.reasoning=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens)),r}function pi(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function di(e){return{type:"message",role:"developer",content:[{type:"input_text",text:e}]}}function mi(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(fi(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 fi(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 hi(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 gi(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 _i(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function yi(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 wi(e,t){let o=[];switch(e.type){case"response.created":yi(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){yi(t,o),_i(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":yi(t,o),_i(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":_i(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":{_i(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:gi(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":{yi(t,o),_i(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":yi(t,o),_i(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":yi(t,o),_i(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":yi(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 ki(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 bi(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function vi(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&&(ki(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&&(ki(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),bi(t,o)),r.content&&(bi(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){bi(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&&(bi(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:Fa(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 xi=/structured_outputs|output_config\.format/i;function Ti(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&xi.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?ii({...e,model:Un},o):null}var $i=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var Ai=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const Si={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 Ve(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Ai: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 Ve(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new $i:e}finally{clearTimeout(i)}}},Ei=["tavily","exa"];function Oi(e){return"tavily"===e||"exa"===e}function Ci(){return Z.webSearchProviders.length>0}async function Ii(e,t){return async function(e,t,n){let{providers:r,searchFns:a=Si}=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 Pi(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function Ri(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 Ni(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&&ia(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(!Ci())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await Ii(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_${Pi()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{...Ri(n,e)}];return{id:`msg_ws_${Pi()}`,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_${Pi()}`,r=`msg_ws_${Pi()}`,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:Ri(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}),D(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const qi=(e,t)=>!(!e||!t||e===t);async function ji(e){if(Z._t1||await Ro())return null;let t=Ao();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${Eo()}`}},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 Di(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 Mi(e){let t=await e.req.json();if(function(e){let t=e.tools;return!(!t||1!==t.length)&&ia(t[0])}(t))return Di(e,t)??Ni(e,t);await Zn(Z),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=Di(e,t);if(a)return a;t=function(e,t){return ya(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(Xn(t.model))return Ui(e,t);if(function(e){return e.toLowerCase().startsWith("claude-")}(t.model))return async function(e,t,o){let n=ii(t,Z.models),r={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")},a=n.output_config?.effort;return e.set("requestData",{model:n.model,reasoningEffort:a,effortClamped:qi(o,a),streaming:!!n.stream}),Z.manualApprove&&await Dn(),ge.startActiveSpan("copilot_api.anthropic_passthrough",async t=>{t.setAttribute("copilot_api.route","anthropic_passthrough"),t.setAttribute("copilot_api.model",n.model),t.setAttribute("copilot_api.streaming",!!n.stream),fa(t,n,r.anthropicBeta);try{let o=performance.now(),a=await ha(n,r,{onStructuredOutputFallback:(e,o)=>{let n=Ti(e,o,Z.models);return n&&(t.setAttribute("copilot_api.structured_output_fallback",!0),t.setAttribute("copilot_api.structured_output_fallback.model",n.model)),n}}),i=performance.now()-o;if(Me.record(i,{model:n.model,target:"anthropic_messages",streaming:String(!!n.stream)}),!n.stream){let o=a,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=Hn(Fi(t)),o._d1=i,o.upstreamTtfbMs=i,o.upstreamTotalMs=i,e.set("requestData",o)}return t.end(),e.json(o)}let{events:s,span:l,release:c}=a;return D(e,async r=>{let a=0,i=performance.now(),u={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1,d=pr(e,o);try{try{for await(let e of s)d(),e.data&&"[DONE]"!==e.data?(a++,Pe.add(1,{model:n.model,endpoint_type:"anthropic_messages"}),Bi(e.data,u)&&(p=!0),await r.writeSSE(e)):await r.writeSSE(e);let e=performance.now()-i,t={model:n.model,endpoint_type:"anthropic_messages"};He.record(e,t),Je.record(a,t)}catch(t){throw Ye(l,e.get("requestSpan"),t),await tr(r,t),t}finally{if(dr(e,o),p){let t=Fi(u);Fn(l,t);let o=e.get("requestData")||{};o.tokenUsage=Hn(t),e.set("requestData",o)}l.end(),c()}let t=e.get("requestId");t&&ue.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw Ve(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));o.setAttribute("copilot_api.translation.has_images",n),o.setAttribute("copilot_api.translation.has_thinking",r),Da(o,t.messages);let a=Ba(t,Z.models),i=a.messages.at(0);return Ha(o,{system:"system"===i?.role&&"string"==typeof i.content?i.content:"",tools:a.tools}),a}finally{o.end()}});Be.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=lr(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:qi(r,u),streaming:!!c.stream});let p=performance.now();Z.manualApprove&&await Dn();let d=await Sr(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=Hn(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=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:Fa(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 Be.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 D(e,async t=>{let n=null,r=0,a=performance.now(),i=pr(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=Hn(n),t._d1=m,e.set("requestData",t)}let u=vi(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(He.record(l,u),Je.record(r,u),dr(e,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Hn(n),t._d1=m,e.set("requestData",t))}}catch(o){throw Ye(h,e.get("requestSpan"),o),await tr(t,o),o}finally{n&&Fn(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 Fi(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 Ui(e,t){let r=performance.now(),a=ge.startActiveSpan("copilot_api.translate.anthropic_to_responses",e=>{try{e.setAttribute("copilot_api.translation.direction","anthropic_to_responses"),e.setAttribute("copilot_api.translation.message_count",t.messages.length),Da(e,t.messages);let o=ui(t);return Ha(e,{system:o.instructions??"",tools:o.tools}),o}finally{e.end()}});Be.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 Dn();let i=performance.now(),s=await Cr(a),l=performance.now()-i;if(Me.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Pr(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=Hn({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 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:gi(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 Be.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 D(e,async t=>{let n=null,r=0,s=performance.now(),d=pr(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=Rr(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Hn(n),t._d1=l,e.set("requestData",t)}let u=wi(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"};He.record(u,p),Je.record(r,p),dr(e,i)}catch(o){throw Ye(u,e.get("requestSpan"),o),await tr(t,o),o}finally{n&&Fn(u,n),u.end(),p()}let f=e.get("requestId");f&&ue.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}const Li=new q;Li.post("/",async e=>{try{return await Mi(e)}catch(t){return await io(e,t)}});const zi=new q;function Gi(e){return ge.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Yn(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,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=Hn(o),n._d1=t._d1,t.c.set("requestData",n)}zi.get("/",async e=>{try{Z.models||await ho();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"]),Ki=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||!Ci())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await Ii(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function Yi(e){if(Ci())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 Xi(e){if(!Ci())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 Zi(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 Qi(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 es(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&&Qi(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)Qi(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function ts(e){return null!=e}function os(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function ns(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function rs(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(!os(n)){o.push(n);continue}let e=Zi(n);null===e?t.add(ns(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"])ts(e[o])&&(t[o]=e[o]);let r=new Set;if(ts(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))Ki.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(ts(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},ts(o.effort)&&(t.reasoning.effort=o.effort),ts(o.summary)&&(t.reasoning.summary=o.summary)}if(ts(e.text)&&"object"==typeof e.text){let o=e.text;ts(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function as(e,t){return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function is(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||ts(n.previous_response_id)||ts(n.prompt)||ts(n.conversation)?null:as(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 ss(e){await Zn(Z);let t=await e.req.json();if(!os(t))return as(e,"request body must be a JSON object");let n=rs(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:Gi(t)}}catch(t){if(t instanceof Vn)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=is(e,t.input,n);if(s)return s;let l=await Mn(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),Z.manualApprove&&await Dn();let c=performance.now(),u=await Cr(a),p=performance.now()-c;if(Me.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),ls(u))return async function(e,t,o){await Yi(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=Hn({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 D(e,async t=>{let o={value:null},n=0,i=performance.now(),s=pr(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=es(i.data,r);s=await Xi(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,_d1:p}),await t.writeSSE(l)}else await t.writeSSE(i);let l=performance.now()-i,u={model:a.model,endpoint_type:"responses"};He.record(l,u),Je.record(n,u),dr(e,c)}catch(o){throw Ye(m,e.get("requestSpan"),o),await or(t,o),o}finally{o.value&&Fn(m,o.value),m.end(),f()}let l=e.get("requestId");l&&ue.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const ls=e=>Object.hasOwn(e,"output"),cs=new q;cs.post("/",async e=>{try{return await ss(e)}catch(t){return await io(e,t)}});const us=new q;us.get("/",e=>{try{return Z.showToken?e.json({token:Z._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 ps=new q;ps.get("/",async e=>{try{let t=await Vo();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const ds=new q;function ms(){return function(e){let t=e.filter(e=>Nn(e));if(0===t.length)return;let o=t.find(e=>Rn.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(Z.models?.data??[])}function fs(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 En(o).slice(0,200)}catch{}let t=En(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 hs(e={}){let t=performance.now(),o=e.model&&function(e){let t=Z.models?.data.find(t=>t.id===e);return void 0!==t&&Nn(t)}(e.model)?e.model:ms();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 ds.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[In]:Pn},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:fs(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)}}ds.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===Pn}(e.req.header(In));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>jn?t.slice(0,jn):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(()=>qn(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{}}):qn(y)}),ds.use(j()),ds.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()}),ds.get("/",e=>e.text("Server running")),ds.route("/health",na),ds.route("/chat/completions",ta),ds.route("/models",zi),ds.route("/embeddings",oa),ds.route("/usage",ps),ds.route("/token",us),ds.route("/v1/chat/completions",ta),ds.route("/v1/models",zi),ds.route("/v1/embeddings",oa),ds.route("/v1/messages",Li),ds.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=ca.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=ca.perMessage+ua(e)*ca.contentMultiplier}for(let e of t.messages)o+=ca.perMessage,o+=ua(e.role),"string"==typeof e.content?o+=ua(e.content)*ca.contentMultiplier:Array.isArray(e.content)&&(o+=pa(e.content));let n=t.tools?.filter(sa);return n&&n.length>0&&(o+=function(e){let t=ca.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=ca.perTool),t+=ua(n.name),n.description&&(t+=ca.perDesc+ua(n.description)),t+=da(n.input_schema);return t}(n)),e.json({input_tokens:Math.round(o)})}),ds.route("/v1/responses",cs),ds.route("/responses",cs),ds.onError((e,t)=>io(t,e));const gs=e=>`[1m${e}[0m`,_s=e=>`[2m${e}[0m`,ys=e=>`[32m${e}[0m`,ws=e=>`[31m${e}[0m`,ks=e=>`[33m${e}[0m`,bs=_s(" ─────────────────────────────────────────────────────────────");function vs(e,t,o){console.log(` ${function(e){return"ok"===e?ys("✓"):"warn"===e?ks("⚠"):ws("✗")}(e)} ${gs(t.padEnd(14))} ${o}`)}function xs(e){console.log(` ${_s("↳")} ${_s(e)}`)}function Ts(e){return e instanceof Bt?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function $s(){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(K.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 As(){try{await ho();let e=(Z.models?.data.length??0)>0;return vs(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 vs("fail","Model catalog",Ts(e)),xs("Could not fetch /models — check connectivity/auth."),!1}}async function Ss(e){Z.accountType=e.accountType;let t=await Et(),o=Ot();if(console.log(""),console.log(` ${gs("COPILOT-API DOCTOR")} ${_s(`v${t}`)}`),console.log(bs),vs("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await V(),go(),!await async function(){let e=await $s();if(!e)return vs("fail","Auth token","not found"),void xs("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");Z._t2=e.token,vs("ok","Auth token",`found (${e.source})`);try{let e=await lo();return await lt(Z,e.login),vs("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return vs("fail","GitHub auth",Ts(e)),void xs("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(bs),console.log(` ${ws("✗")} ${gs("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await so();return Z._t1=e,vs("ok","Service token","acquired"),!0}catch(e){let t=e instanceof Bt?e.response.status:0;return vs("fail","Service token",Ts(e)),xs(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 As();await async function(){try{let e=await Vo(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${Lo(zo(t))} of ${Lo(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;vs("ok","Copilot plan",`${e.copilot_plan} · ${o} `+_s(`(resets ${e.quota_reset_date})`))}catch(e){vs("warn","Copilot plan",`unavailable (${Ts(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await hs();return e.ok?(vs("ok","Generation",`works via ${e.model} ${_s(`(${e.durationMs}ms)`)}`),!0):(vs("fail","Generation",`${e.reason}${e.status?_s(` [HTTP ${e.status}]`):""}`),!1)}():vs("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){vs(t,"Client config","potential base-URL issue");for(let t of e)xs(t)}else vs("ok","Client config","no base-URL issues detected");xs("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(bs),a?(console.log(` ${ys("✓")} ${gs("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${ks("⚠")} ${gs("Some checks need attention")} — see the ${ws("✗")}/${ks("⚠")} lines above.`),console.log(""),2)}const Es=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 Ss({accountType:e["account-type"]});g.exit(t)}});function Os(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 Cs=!1;const Is="copilot-api-node20",Ps=`https://registry.npmjs.org/${Is}/latest`,Rs=e=>`[1m${e}[0m`,Ns=e=>`[33m${e}[0m`;async function qs(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(Ps,{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 Ds,Ms;async function Hs(e){try{let[t,o]=await Promise.all([Et(),qs(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 Fs(){if(!Ds||!Ms)return;let{signal:e}=Ms;Ds.then(t=>{t&&!e.aborted&&function(e,t){let o=`npx ${Is}@latest`,n=Ns("│"),r=` ${Rs("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${Rs(o)} to update`,i=" ".repeat(54),s=Ns(`╭${"─".repeat(54)}╮`),l=Ns(`╰${"─".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 Us=262144,Ls="https://barazany.dev",zs=/^[a-z0-9][a-z0-9-]*$/i,Gs=/[\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(Gs," ").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!==Ls||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&&zs.test(t.slug)&&(r=`${Ls}/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 Ks(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 Ys(e){return s.join(e,"blog-posts.json")}function Xs(e=K.APP_DIR){try{if(Vs&&Vs.length>0)return Vs;let t=function(e){try{let t=Ys(e);return U.statSync(t).size>Us?[]:Ks(JSON.parse(U.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:Ks(Bs)}catch{return[]}}function Zs(e){return e>-6e4&&e<864e5}async function Qs(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>Us)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>Us?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>Us)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?[]:Ks(JSON.parse(o))}finally{clearTimeout(o)}}async function el(e={}){try{if("1"===g.env.COPILOT_API_NO_BLOG||"1"===g.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let t=e.dir??K.APP_DIR,o=e.now??Date.now();if(await async function(e,t){try{let o=Ys(e),n=await U.promises.stat(o);if(n.size<=Us){let e=await U.promises.readFile(o),n=JSON.parse(e.toString("utf8"));if("number"==typeof n.fetchedAt)return Zs(t-n.fetchedAt)}return Zs(t-n.mtimeMs)}catch{return!1}}(t,o))return;let n=await Qs(e.timeoutMs??3e3);if(0===n.length)return;Vs=n,await async function(e,t,o){let n=Ys(e),r=`${n}.${g.pid}.tmp`;try{await U.promises.writeFile(r,`${JSON.stringify({fetchedAt:o,posts:t})}\n`),await U.promises.rename(r,n)}catch(e){throw await U.promises.rm(r,{force:!0}).catch(()=>{}),e}}(t,n,o)}catch(e){o.debug("Blog posts refresh skipped:",e)}}function tl(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 ol=e=>`[1m${e}[0m`,nl=e=>`[2m${e}[0m`,rl=e=>`[36m${e}[0m`,al=e=>`[32m${e}[0m`,il=e=>`[33m${e}[0m`,sl=e=>`[4m${e}[0m`,ll=(e,t)=>`]8;;${e}\\${t}]8;;\\`,cl="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",ul="https://github.com/johnib/copilot-api-issues/issues",pl=nl(" ─────────────────────────────────────────────────────────────");function dl(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function ml(e){return e&&0!==e.length?e.join("·"):"—"}function fl(e){if(0===e.length)return[];let t=["",pl,` ${ol("BARAZANY.DEV")} ${nl("— Recent Posts")}`,pl,""];for(let[o,n]of e.entries()){let e=`${n.url}${cl}`,r=ll(e,ol(sl(`[${o+1}]`)));t.push(` ${r} ${rl(n.title)}`,` ${nl("→")} ${nl(n.teaser)}`,"")}return t.push(pl,` ${ll(`https://barazany.dev/blog${cl}`,"barazany.dev/blog")}`,pl),t}function hl(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(nl(" → "))} ${al("✓")}`:nl("off"),n=["",` ${ol("COPILOT-API")} ${nl(`v${e.version}`)}`,pl,` ${nl("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${nl("User")} ${e.user} ${nl("·")} ${e.accountType}`];return Z._v1&&n.push(` ${nl("Client")} VSCode ${Z._v1}`),n.push(` ${nl("Network")} ${t.join(nl(" · "))}`,` ${nl("Search")} ${o}`),e.clipboardCopied&&n.push(` ${nl("Clipboard")} Claude Code command ${al("✓")}`),n.push(pl),n}function gl(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${ol("Active")}`];if(e.model){let o=Z.models?.data.find(t=>t.id===e.model),n=dl(o?.capabilities.limits?.max_context_window_tokens),r=ml(o?.capabilities.supports.reasoning_effort);t.push(` ${rl(e.model.padEnd(32))} ${nl("ctx")} ${ol(n.padStart(5))} ${nl("effort")} ${nl(r)} ${il("← main")}`)}if(e.smallModel){let o=Z.models?.data.find(t=>t.id===e.smallModel),n=dl(o?.capabilities.limits?.max_context_window_tokens),r=ml(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${nl("ctx")} ${n.padStart(5)} ${nl("effort")} ${nl(r)} ${il("← small")}`)}return t}function _l(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("",` ${ol(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?rl("●"):nl("·"),i=n?rl(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?dl(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${ml(r.effort)}`;t.push(` ${a} ${i} ${nl(s)}${nl(l)}`)}}return t}function yl(){let e=ul.replace(/^https:\/\//,""),t=ll(`${ul}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",pl,` ${ol("FOUND A BUG?")} ${nl("— Report it on GitHub")}`,pl,"",` ${rl("→")} ${rl(t)}`,` ${nl("Bug reports, feature requests, and questions welcome.")}`,"",pl]}function wl(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=["",pl,` ${ol("Claude Cowork")} ${nl("— Settings → Inference Provider")}`,pl,"",` ${nl("Paste into")} ${ol("inferenceGatewayBaseUrl")}${nl(":")}`,` ${ol(rl(r))}`];return n||a.push("",` ${nl("Your Tailscale hostname is shown by:")} ${rl("tailscale status --self")}`),a.push("",` ${nl("Docs:")} ${rl("https://claude.com/docs/cowork/3p/installation")}`),a}function kl(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",pl,` ${ol("HTTPS")} ${nl("— self-signed cert")}`,pl,"",` ${nl("Cert")} ${t}`];switch(o.push("",` ${ol("Trust this cert")} ${nl("(one-time setup)")}`),g.platform){case"darwin":o.push(` ${nl("macOS:")}`,` ${rl("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${rl(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${nl("Windows (PowerShell as Administrator):")}`,` ${rl(`Import-Certificate -FilePath "${t}" \``)}`,` ${rl("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${nl("Linux (Debian/Ubuntu):")}`,` ${rl(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${rl("sudo update-ca-certificates")}`,` ${nl("Linux (Fedora/RHEL/Arch):")}`,` ${rl(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${rl("sudo update-ca-trust")}`);break;default:o.push(` ${nl("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${nl("Or, for Node CLIs only (no admin needed):")}`,` ${rl(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,pl),o}function bl(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 vl=s.join(K.APP_DIR,"certs"),xl=s.join(vl,"cert.pem"),Tl=s.join(vl,"key.pem"),$l=s.join(vl,"cert.meta.json");async function Al(e){try{return await a.readFile(e,"utf8")}catch{return}}async function Sl(e){let t=await Al(xl),o=await Al(Tl),n=await async function(){let e=await Al($l);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 El(e){return 0!==G(e)}async function Ol(e){await a.mkdir(vl,{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)El(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 J([{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(xl,l.cert,{mode:420}),await a.writeFile(Tl,l.private,{mode:384}),await async function(e){await a.writeFile($l,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:xl,keyPath:Tl,generated:!0}}const Cl=[],Il=Date.now();let Pl="";function Rl(){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()-Il)/1e3}});for(let t of Cl)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=ll("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",pl,` ${ol("COPILOT-API")} ${nl(`v${e}`)} ${nl("·")} ${bl(t)} uptime`,pl,""," Check in from time to time on",` ${rl(o)}`,"",pl,""];console.log(n.join("\n"))}(Pl,Date.now()-Il),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)})}async function Nl(e,t,n){if(!e._cc1)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,Z.models.data.map(e=>e.id));i?(r=i.model,a=i.smallModel):(r=await o.prompt("Select a model to use",{type:"select",options:Z.models.data.map(e=>e.id)}),a=await o.prompt("Select a small model to use",{type:"select",options:Z.models.data.map(e=>e.id)}));let s=tl({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 ql(e){return e._t2?"cli_arg":g.env.GH_TOKEN?"env_var":"stored"}function jl(e){let{options:t,version:o,runtime:n,_u1: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,_cc1:t._cc1,model:t.model,smallModel:t.smallModel,_t3:ql(t)},runtime:n,identity:{_u1:r.login,machineId:Z.machineId,sessionId:Z.sessionId,_v1:Z._v1},connectivity:Z.connectivity,modelsCount:Z.models?.data.length??0,startupDurationMs:Date.now()-Il},"copilot_api")});if(Z.models?.data)for(let e of Z.models.data)a.addEvent("copilot_api.model.available",Xe(e,"model"));a.end(),Ke(_.INFO,"INFO","Server started",Xe({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:Z.models?.data.length??0,startupDurationMs:Date.now()-Il},"copilot_api"))}async function Dl(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 Sl(e)){let e=await Al(xl),t=await Al(Tl);if(e&&t)return{cert:e,key:t,certPath:xl,keyPath:Tl,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),Ol(e)}(e.httpsHosts)}}async function Ml(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=_n;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(Rl(),Cl.push(()=>{o.debug("Cleaning up connectivity monitor"),ot.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),To=!1,yo&&=void clearInterval(yo),ko&&=void ot.off("online",ko),bo&&=void ot.off("offline",bo),wo=void 0,vo=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),_r&&=void clearInterval(_r),yr&&=void clearInterval(yr);let e=[...fr.keys(),...hr];fr.clear(),hr.clear(),mr.clear(),gr=void 0;for(let t of e)wr(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._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");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 V(),el().catch(()=>{}),go();let n=await Et();Pl=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,Il),t._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 a,i=t._t2||g.env.GH_TOKEN;i?(function(e){Z._t2=e,$o=!1}(i),o.info("Using provided Auth token")):await qo();try{a=await lo(),await lt(Z,a.login)}catch(e){throw o.error("Failed to get user info for machine ID generation:",e),Error("Cannot proceed without user information",{cause:e})}await(async()=>{let{token:e,refresh_in:t}=await so();Z._t1=e,o.debug("Service token fetched successfully!"),Z.showToken&&o.info("Service token:",e),To=!0,No(t),ot.start(),ko=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Po(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",ko),ot.on("offline",bo)})(),await async function(){try{return await ho(),!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})`;return o.warn(`Could not fetch model list from Copilot${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(()=>{ho().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let s=function(e=18e5){let t=setInterval(()=>{ho().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)}}();Cl.push(()=>{o.debug("Cleaning up model refresh interval"),s()}),Z.connectivity.h2&&(vr(br(ct(Z))),Z.connectivity.h2Keepalive&&Tr()),jl({options:t,version:n,runtime:r,_u1:a});let l=await Dl(t),c=l?"https":"http",u=`${c}://localhost:${t.port}`,p=await Nl(t,u,l)||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=Z.models.data.map(e=>e.id);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:Z.models.data.map(e=>e.id)});let a=tl({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,u,l);(function(e){let t=[...hl(e),...gl(e),..._l(e),...yl(),"",...fl(Xs()),...wl(e),...kl(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 rn()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:p,tls:l})),Fs(),z({fetch:ds.fetch,port:t.port,hostname:t.hostname,tls:l?{cert:l.cert,key:l.key}:void 0,bun:{idleTimeout:255}}),function(e,t,n){o.info(`Server listening on ${e}://${t}:${n}`)}(c,t.hostname,t.port),t.smokeTest&&await async function(e,t,n){try{o.start("Running first-run self-test (one tiny generation)…");let r=await hs({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: ${En(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))}}(u,t.smallModel??t.model,t.hostname)}function Hl(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const Fl=e({meta:{name:"start",description:"Start the API server"},args:{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:Hl(t,"--rate-limit"),r=e.timeout,a=void 0===r?X:Hl(r,"--timeout"),i=function(e,t){let o=e??t,n=void 0===o?15e3:Hl(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(!Oi(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${Ei.join(", ")}`);let r=n.length>0?n:Ei,a=new Set,i=n.length>0,s=[];for(let e of r){if(!Oi(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 Ml({port:Hl(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})}});Cs||(Cs=!0,o.setReporters([Os(o.options.reporters)]));const Bl=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(Ds||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;Ms=e,Ds=Hs(e).catch(()=>null)})(),Bl||Fs();const Ul=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:Mo,start:Fl,"check-usage":Qo,debug:Pt,doctor:Es,"cowork-setup":An}});await t(Ul),Bl||(Ms?.abort(),Ms=void 0,Ds=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{SpanKind as c,SpanStatusCode as u,context as p,metrics as d,trace as m}from"@opentelemetry/api";import f from"clipboardy";import{execFile as h,execSync as g}from"node:child_process";import _ from"node:process";import{SeverityNumber as y,logs as w}from"@opentelemetry/api-logs";import{OTLPLogExporter as b}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as k}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as v}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as x}from"@opentelemetry/resources";import{BatchLogRecordProcessor as T}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as $}from"@opentelemetry/sdk-metrics";import{NodeSDK as A}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as S,ATTR_SERVICE_NAME as E,ATTR_SERVICE_VERSION as O}from"@opentelemetry/semantic-conventions";import{Client as C,request as I}from"undici";import{createHash as N,randomBytes as P,randomUUID as R}from"node:crypto";import{promisify as q}from"node:util";import{Hono as D}from"hono";import{cors as j}from"hono/cors";import{streamSSE as M}from"hono/streaming";import{events as F}from"fetch-event-stream";import{Tokenizer as H,models as U}from"ai-tokenizer";import*as B from"ai-tokenizer/encoding/claude";import L,{accessSync as z}from"node:fs";import{serve as G}from"srvx";import{isIP as K}from"node:net";import{generate as J}from"selfsigned";const W=s.join(i.homedir(),".local","share","copilot-api"),Y={APP_DIR:W,GITHUB_TOKEN_PATH:s.join(W,"github_token"),MACHINE_ID_PATH:s.join(W,"machine_id"),SESSION_ID_PATH:s.join(W,"session_id")};async function V(){await a.mkdir(Y.APP_DIR,{recursive:!0}),await X(Y.GITHUB_TOKEN_PATH),await X(Y.SESSION_ID_PATH)}async function X(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,""),await a.chmod(e,384)}}const Z=new l;function Q(e,t){return Z.run(e,t)}const ee=()=>!0===Z.getStore()?.rerun;const te=6e5,oe={provider:"copilot",accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:te,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 ne(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:()=>Z.getStore()?.provider??t,set:e=>{t=e},enumerable:!0,configurable:!0},models:{get:()=>{let e=Z.getStore();return e?e.models:o},set:e=>{o=e},enumerable:!0,configurable:!0}})}(oe);const re=" │ ",ae=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()},ie=(e,t)=>e.padEnd(t),se=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),le=(e,t,o)=>` --\x3e ${ie(e,4)} ${ie(t,21)} ${ie(o,3)}`,ce=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return ie(t,22)})(e.model??"—")+ie(t,8)},ue=e=>{let t=e?.inputTokens??0,o=e?.cachedTokens??0,n=e?ae(Math.max(t-o,0)):"—",r=e?ae(e.outputTokens??0):"—",a=o?ae(o):"—";return`↑${n.padStart(5)} ⚡${a.padStart(5)} ↓${r.padStart(5)}`},pe=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${ie("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=ae(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},de=e=>{if(void 0===e.ttfbMs)return`e2e ${se(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${se(e.ttfbMs)} → e2e ${se(e.e2eMs)} ${t}`},me=e=>e?oe.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,fe=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}}),he={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=>[le(e.method,e.path,e.status),ce(e),ue(e.tokenUsage),pe(e.tokenUsage,e.maxContextTokens),de({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(re))({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:me(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),et(y.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)},...fe(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=>[le(e.method,e.path,"429"),ce(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${se(e.e2eMs)}`].join(re))({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=le(e.method,e.path,e.status.toString()),o=ce(e),n=e.message.replaceAll(/\s+/g," ").trim();return[t,o,(n.length>37?`${n.slice(0,36)}…`:n).padEnd(37),`e2e ${se(e.e2eMs)}`].join(re)})({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(()=>he.cleanup(),6e4);let ge,_e,ye=Date.now();const we={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function be(){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):we;return{endpoint:e.replace(/\/$/,""),headers:t}}async function ke(){if(!ge)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([ge.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 ve=m.getTracer("copilot-api"),xe=d.getMeter("copilot-api"),Te=w.getLogger("copilot-api"),$e=xe.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),Ae=xe.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),Se=xe.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),Ee=xe.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),Oe=xe.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),Ce=xe.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),Ie=xe.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),Ne=xe.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Pe=xe.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),Re=xe.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),qe=xe.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),De=xe.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),je=xe.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Me=xe.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),Fe=xe.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),He=xe.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),Ue=xe.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),Be=xe.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),Le=xe.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),ze=xe.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),Ge=xe.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),Ke=xe.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Je=xe.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),We=xe.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Ye=xe.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),Ve=xe.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),Xe=xe.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),Ze=xe.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),Qe=xe.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function et(e,t,o,n,r){let a=m.getActiveSpan()?.spanContext()??r;Te.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function tt(e,t,o){let n=t instanceof Error?t:Error(String(t));e.setStatus({code:u.ERROR,message:o??n.message}),e.recordException(n)}function ot(e,t,o){tt(e,o),t&&t!==e&&tt(t,o)}function nt(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,nt(r,e)))}return o}xe.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!lt.getConnectivityStats().isOnline)}),xe.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(lt.getConnectivityStats().consecutiveFailures)}),xe.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(oe.models?.data.length??0)}),xe.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(he.completionCallbacks.size)}),xe.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-ye)/1e3)});const rt=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","api-key","proxy-authorization"]);function at(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();"authorization"===o&&e.setAttribute(`http.${t}.header.authorization.shape`,ne(r)),!rt.has(o)&&e.setAttribute(`http.${t}.header.${o}`,r)}}async function it(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:l}=e,p=ve.startSpan(t,{kind:c.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...l}});a&&at(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();rt.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(p,e),je.add(1,{target:n,status_code:String(e.status)}),e.ok||p.setStatus({code:u.ERROR,message:`HTTP ${e.status}`}),{response:e,span:p}}catch(e){throw tt(p,e),p.end(),e}}async function st(e){let{spanName:t,url:o,target:n,method:r="POST",headers:a,body:i,signal:s,headersTimeout:l,bodyTimeout:p,extraAttributes:d,dispatcher:m}=e,f=ve.startSpan(t,{kind:c.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});at(f,"request",a);try{let{statusCode:e,headers:t,body:c}=await I(o,{method:r,headers:a,body:i,signal:s,headersTimeout:l,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&&!rt.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return je.add(1,{target:n,status_code:String(e)}),e>=400&&f.setStatus({code:u.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:c,span:f}}catch(e){throw tt(f,e),f.end(),e}}const lt=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:oe.connectivity.probeEndpoints,fastInterval:oe.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?oe.connectivity.slowProbeInterval:oe.connectivity.fastProbeInterval)+Math.random()*oe.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=ve.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),oe.connectivity.timeoutMs);try{let n=!1;for(let e of oe.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",...oe.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Ye.record(r,{endpoint:e,result:"success"});break}Ye.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),qe.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")),De.add(1,{from:"offline",to:"online"}),et(y.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")),De.add(1,{from:"online",to:"offline"}),et(y.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?oe.connectivity.slowProbeInterval:oe.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*oe.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:oe.connectivity.jitterMaxMs>0,connectionPooling:oe.connectivity.connectionPooling,dnsCache:oe.connectivity.dnsCache}}},ct=()=>({"content-type":"application/json",accept:"application/json"}),ut="0.48.1",pt=`copilot-chat/${ut}`,dt=`GitHubCopilotChat/${ut}`,mt=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`${Y.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=N("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},ft=async(e,t)=>{e.machineId||=await mt(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(Y.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=R();return await a.writeFile(Y.SESSION_ID_PATH,e),await a.chmod(Y.SESSION_ID_PATH,384),e})()},ht=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,gt=(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":pt,"User-Agent":dt,"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},_t=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const yt=(e,t,o)=>{let n=gt(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&&_t.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},wt="https://api.github.com",bt=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":pt,"user-agent":dt,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),kt="https://github.com",vt="01ab8ac9400c4e429b23",xt=["user:email"].join(" ");function Tt(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 $t=32768,At=[{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: ***"}],St=new Set(["authorization","cookie","set-cookie","x-api-key","api-key","proxy-authorization"]);function Et(e){let t=e;for(let{regex:e,mask:o}of At)t=t.replace(e,o);return t}const Ot=new Map;function Ct(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 It(e,t,o){let n=Et(o),r=8*$t,a=n.length>r,i=a?n.slice(0,r):n,s=N("sha256").update(n).digest("hex");if(i.length<=$t)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=$t)e.setAttribute(`${t}.part_${o/$t}`,i.slice(o,o+$t));e.setAttribute(`${t}.parts`,Math.ceil(i.length/$t))}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 Nt(e,t){let o=function(e){if(Ot.size>=1e3&&!Ot.has(e)){let e=Ot.keys().next().value;void 0!==e&&Ot.delete(e)}let t,o=(Ot.get(e)??0)+1;return Ot.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",Be.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&&It(e,"copilot_api.incoming_request_body",n);let r=Pt(t.c.req.header());return r&&It(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&It(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&It(e,"copilot_api.outgoing_headers",Pt(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&It(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function Pt(e){let t={};for(let[o,n]of Object.entries(e))St.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}async function Rt(){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 qt(){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 Dt(){try{return!!(await a.stat(Y.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(Y.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function jt(e){let t=await async function(){let[e,t]=await Promise.all([Rt(),Dt()]);return{version:e,runtime:qt(),paths:{APP_DIR:Y.APP_DIR,GITHUB_TOKEN_PATH:Y.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 Mt=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})=>jt({json:e.json})}),Ft=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",Ht=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",Ut=new Set;let Bt;function Lt(e){if(oe.errorReporting&&!(e.statusCode<500)&&!Ut.has(e.signature)){if(Ut.size>=1e3){let e=Ut.values().next().value;void 0!==e&&Ut.delete(e)}Ut.add(e.signature),async function(e){Bt??=Rt();let t=await Bt,o=qt(),n=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(Et(e.upstreamErrorMessage)).slice(0,600),r={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:n,endpointType:Tt(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(Ft,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":Ht},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}function zt(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 Gt=new WeakSet;async function Kt(e,{attempt:t,maxRetries:n,operation:r}){return zt(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&&Gt.add(e)}(e),!1)}var Jt=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},Wt=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function Yt(e,t){return setTimeout(()=>e.abort(new Wt(t)),t)}const Vt=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),Xt=RegExp(`\\b(?:${[...Vt].join("|")})\\b`);function Zt(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function Qt(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=Zt(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function eo(e){let t=e.code;return"string"==typeof t?t:void 0}function to(e){if(void 0===e.cause)return"";let t=Qt(e);if(t===e)return"";let o=eo(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function oo(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=>Vt.has(e))||!(t.length>0)&&(!!o.some(e=>Xt.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function no(e){return e.req.path.startsWith("/v1/messages")}function ro(e,t){if(no(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 ao(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 io(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 so(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 lo(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=m.getActiveSpan();if(!a)return;let i=Ct({endpointType:Tt(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});Nt(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function co(e,t,o){let n=e.get("requestId"),r=he.completionCallbacks.get(n);r&&(he.logError(r,t,o),he.completionCallbacks.delete(n))}async function uo(e,t){let o=m.getActiveSpan(),n=e.get("requestId"),r=he.completionCallbacks.get(n);r&&(he.logRateLimit(r,t.response),he.completionCallbacks.delete(n)),Ce.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=ro(a,e),s=ao(i);return o?.setStatus({code:u.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),io(o,s),et(y.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...so(s)}),lo({c:e,error:t,errorText:a,upstream:s}),function(e,t){t.headers.forEach((t,o)=>{po.test(o)&&e.header(o,t)})}(e,t.response),e.json(i,429)}const po=/^(?:retry-after(?:-ms)?|x-ratelimit-[\w-]+)$/i;function mo(e,t){(function(e){return"object"==typeof e&&!!e&&Gt.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",oe.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function fo(e){return oo(e)||function(e){return zt(e)||e instanceof Error&&zt(e.cause)}(e)}async function ho(e,t){if(mo(m.getActiveSpan(),t),t instanceof Jt&&429===t.response.status)return uo(e,t);if(t instanceof SyntaxError){m.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),et(y.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=no(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 co(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof Jt)return async function(e,t){let o=m.getActiveSpan(),n=await t.response.text(),r=ro(n,e),a=ao(r);return co(e,t.response.status,a.message??t.message),o?.setStatus({code:u.ERROR,message:t.message}),o?.recordException(t),o?.setAttribute("copilot_api.error_type","HTTPError"),io(o,a),et(y.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...so(a)}),lo({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&Lt({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:Ct({endpointType:Tt(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 Wt||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof Wt}(t))return function(e,t){let o=m.getActiveSpan();o?.setStatus({code:u.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.";et(y.ERROR,"ERROR",n,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let r=no(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return co(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(fo(t))return function(e,t){let o=m.getActiveSpan();o?.setStatus({code:u.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?Qt(t):void 0,r=(n&&eo(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.";et(y.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=no(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return co(e,503,t instanceof Error?`${t.message}${to(t)}`:i),e.json(s,503)}(e,t);let n=m.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:u.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),et(y.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),Lt({route:e.req.path,statusCode:500,errorClass:r.name,signature:Ct({endpointType:Tt(e.req.path),statusCode:500,upstreamErrorType:r.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:r.name,upstreamErrorMessage:`${r.message}${to(r)}`}),co(e,500,r.message),o.error(r);let a=no(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}const go=async()=>{let e=`${wt}/copilot_internal/v2/token`,t=oe.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await it({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:bt(oe),signal:o.signal});try{if(!t.ok)throw new Jt("Failed to get Service token",t);return await t.json()}catch(e){throw tt(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function _o(){let e=`${wt}/user`,t=oe.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await it({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${oe._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new Jt("Failed to get GitHub user",t);return await t.json()}catch(e){throw tt(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let yo,wo,bo,ko=null,vo=0;function xo(e){bo&&clearTimeout(bo),bo=setTimeout(()=>{Ao().catch(e=>{o.warn("Foundry Entra token renewal failed; retrying:",e),xo(3e4)})},e),bo.unref()}async function To(){let e=wo;if(!yo||!e?.tokenScope)throw Error("Foundry Entra auth is not initialised");let t=await yo.getToken(e.tokenScope);if(!t)throw Error(`No Entra token for scope ${e.tokenScope}`);e.bearerToken=t.token,e.bearerExpiresAt=t.expiresOnTimestamp,vo=Date.now(),xo(function(e){let t=e.refreshAfterTimestamp??e.expiresOnTimestamp-3e5;return Math.max(t-Date.now(),3e4)}(t))}async function $o(e,t){wo=e,yo=t??await async function(){let{DefaultAzureCredential:e}=await import("@azure/identity");return new e}();try{await To()}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 Ao(){return ko??=To().finally(()=>{ko=null}),ko}let So=null;function Eo(){return"foundry"===oe.provider?"entra"===oe.foundry?.auth?async function(){if(!(Date.now()-vo<3e4))try{await Ao()}catch(e){o.warn("Foundry Entra token renewal after a 401 failed:",e)}}():Promise.resolve():(So||=go().then(({token:e})=>{oe._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{So=null}),So)}function Oo(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 Co=/^([\w-]+)\.(?:openai\.azure\.com|cognitiveservices\.azure\.com|services\.ai\.azure\.com)$/i;function Io(e){let t=new URL(e),o=Co.exec(t.hostname)?.[1];return o?`https://${o}.services.ai.azure.com${t.pathname.replace(/\/+$/,"")}`:e}function No(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 Po(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=Oo(t),a=e.FOUNDRY_ANTHROPIC_ENDPOINT?.trim();return{endpoint:r,anthropicEndpoint:a?Oo(a,"FOUNDRY_ANTHROPIC_ENDPOINT"):Io(r),auth:n,..."key"===n?{apiKey:o}:{tokenScope:e.FOUNDRY_TOKEN_SCOPE?.trim()||"https://cognitiveservices.azure.com/.default"},deployments:No(e.FOUNDRY_DEPLOYMENTS)}}const Ro=(e,t)=>"entra"===e.auth?{Authorization:`Bearer ${e.bearerToken??""}`}:{[t]:e.apiKey??""},qo=e=>({...Ro(e,"api-key"),"Content-Type":"application/json",accept:"*/*"}),Do=e=>`${e.anthropicEndpoint}/anthropic`,jo=(e,t)=>({...Ro(e,"x-api-key"),"Content-Type":"application/json",accept:"*/*","anthropic-version":t?.anthropicVersion??"2023-06-01",...t?.anthropicBeta?{"anthropic-beta":t.anthropicBeta}:{}}),Mo=e=>"foundry"===e.provider;function Fo(e){if(!e.foundry)throw Error("Foundry provider selected but not configured");return e.foundry}const Ho=e=>Mo(e)?(e=>`${e.endpoint}/openai/v1`)(Fo(e)):ht(e),Uo=(e,t=!1)=>Mo(e)?qo(Fo(e)):gt(e,t),Bo=e=>Mo(e)?!!(e.foundry?.apiKey??e.foundry?.bearerToken):!!e._t1;const Lo=[{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}],zo={context:128e3,output:16384};function Go(e){return Lo.find(({pattern:t})=>t.test(e))??zo}const Ko=/dall-e|gpt-image|image|whisper|tts|transcribe|realtime|audio|speech|sora/i,Jo=e=>/^(?:gpt-|o\d|codex|chatgpt|computer-use)/i.test(e);function Wo(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 Yo(e){let t=`${e.endpoint}/openai/deployments?api-version=2022-12-01`,o=new AbortController,n=Yt(o,oe.timeoutMs);try{let{response:n,span:r}=await it({spanName:"foundry GET /openai/deployments",url:t,target:"models",headers:qo(e),signal:o.signal});try{if(!n.ok)throw new Jt("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 tt(r,e),e}finally{r.end()}}finally{clearTimeout(n)}}async function Vo(e){return{object:"list",data:(e.deployments??await Yo(e)).map(e=>function(e){let{model:t}=e;if(!Ko.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)?Wo(e,{vendor:"Anthropic",supported_endpoints:["/v1/messages"]}):Jo(t)?Wo(e,{vendor:"Azure OpenAI",supported_endpoints:["/responses"],limits:Go(t)}):Wo(e,{vendor:"Foundry",supported_endpoints:["/chat/completions"],limits:Go(t)})}(e)).filter(e=>void 0!==e)}}const Xo=()=>Mo(oe)&&oe.foundry?Vo(oe.foundry):Qo(),Zo=async()=>{try{return await Xo()}catch(e){if(e instanceof Jt&&401===e.response.status)return await Eo(),Xo();throw e}},Qo=async()=>{let e=`${Ho(oe)}/models`,t=Uo(oe),o=oe.timeoutMs,n=new AbortController,r=Yt(n,o);try{let{response:o,span:r}=await it({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new Jt("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw tt(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const en=[{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"}],tn="claude-haiku-4.5",on={haiku:tn,"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 nn=/^claude-/i;function rn(e){return e.toLowerCase().replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2")}function an(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 en)if(t.pattern.test(e))return t.family;return null}(n),i=nn.test(n),s=n.replace(/-\d{8}(?::.*)?$/,""),l=r?`-${r}`:"",c=l?[`${s}${l}`,s]:[s];for(let e of i?c:[]){let o=rn(e);for(let e of t)if(rn(e.replace(/-\d{8}(?::.*)?$/,""))===o)return e}return a?function(e,t,o=null){let n=on[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 sn=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function ln(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=sn.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=sn.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}let cn;const un=new Map;function pn(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 dn(){cn=await Q({provider:"copilot"},Zo)}const mn=()=>void 0!==cn;function fn(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 un.set(e,Math.max(un.get(e)??0,o+n)),n}function hn(e){if(!mn()||!Mo(oe)||!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 gn(e,t,o){let{model:n,reason:r}=o,a=m.getActiveSpan();return a?.setAttribute("copilot_api.fallback.upstream","copilot"),a?.setAttribute("copilot_api.fallback.reason",r),a?.setAttribute("copilot_api.fallback.foundry_model",n),Q({provider:"copilot",models:cn,rerun:"foundry_429"===r},()=>t(e))}async function _n(e,t){if(!mn()||!Mo(oe))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=cn?.data.map(e=>e.id)??[];return t.includes(e)?e:an(e,t)??void 0}(n))return t(e);if(function(e,t=Date.now()){let o=un.get(e);return void 0!==o&&(t<o||(un.delete(e),!1))}(n))return gn(e,t,{model:n,reason:"breaker_open"});try{return await t(e)}catch(r){if(!(e=>e instanceof Jt&&429===e.response.status&&void 0!==e.outgoingBody)(r))throw r;let a=fn(n,r.response.headers);return await(r.response.body?.cancel()),m.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`),gn(e,t,{model:n,reason:"foundry_429"})}}const yn=e=>new Promise(t=>{setTimeout(t,e)}),wn=e=>null==e;async function bn(){let e=await Zo();oe.models=e,mn()&&await dn().catch(e=>{o.warn("Failed to refresh the Copilot fallback models:",e)})}const kn=()=>{oe._v1="1.140.0-insider"};var vn=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let xn,Tn,$n,An,Sn,En=!1,On=!1,Cn=!1;function In(){return Nn()?Sn:void 0}function Nn(){return void 0!==Sn&&Date.now()-Sn.at<6e4}function Pn(){return Cn?"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 Rn=()=>a.readFile(Y.GITHUB_TOKEN_PATH,"utf8");function qn(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";oe._t1=void 0,Sn={status:s,message:l,at:Date.now()},clearInterval(xn),xn=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Pe.add(1,{reason:r,success:"false"}),Re.add(1,{reason:r}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:u.ERROR,message:n.message}),t.recordException(n),We.record(performance.now()-a,{reason:r}),et(y.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 Dn(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;oe._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:u.ERROR,message:s.message}),t.recordException(s),Re.add(1,{reason:r}),We.record(performance.now()-a,{reason:r}),et(y.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const jn=async(e=5,t=1e3,n="scheduled")=>En?(o.debug("Token refresh already in progress, coalescing"),Tn):(En=!0,Tn=ve.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 go();return oe._t1=t,Sn=void 0,On&&void 0===xn&&(o.info("Token refresh recovered, resuming scheduled refresh"),Fn(s)),o.debug("Service token refreshed successfully"),oe.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),Pe.add(1,{reason:n,success:"true"}),We.record(performance.now()-a,{reason:n}),void et(y.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof Jt&&(401===s.response.status||403===s.response.status))return void qn({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),Pe.add(1,{reason:n,success:"false"}),l)return void Dn({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(),En=!1,Tn=void 0}}),Tn);async function Mn(){return!!oe._t1||!Nn()&&(void 0!==Sn&&Cn&&await async function(){if(Tn)return;let e=(await Rn().catch(()=>{}))?.trim();e&&e!==oe._t2?.trim()&&(oe._t2=e,o.info("Picked up re-authenticated Auth token from disk"),oe.showToken&&o.info("Auth token:",e))}(),await jn(3,250,"on-demand"),!!oe._t1)}function Fn(e){xn&&clearInterval(xn);let t=Math.max(1e3*(e-60),6e4);xn=setInterval(()=>{jn(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function Hn(e){try{let t=await Rn();if(t&&!e?.force)return oe._t2=t,Cn=!0,oe.showToken&&o.info("Auth token:",t),void await Un();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=oe.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${kt}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:vt,scope:xt}),signal:e.signal});if(!t.ok)throw new Jt("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{f.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=_.platform;t="darwin"===o?"open":"win32"===o?"start":"xdg-open",h(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 vn("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=oe.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${kt}/login/oauth/access_token`,{method:"POST",headers:ct(),body:JSON.stringify({client_id:vt,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await yn(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 vn("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new vn("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 yn(t);continue}if(r.access_token)return r.access_token;await yn(t)}catch(e){if(e instanceof vn)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await yn(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(Y.GITHUB_TOKEN_PATH,e,{mode:384}))(r),oe._t2=r,Cn=!0,oe.showToken&&o.info("Auth token:",r),await Un()}catch(e){throw e instanceof Jt?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function Un(){let e=await _o();o.success(`Authenticated as ${e.login}`)}async function Bn(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),oe.showToken=e.showToken,await V(),await Hn({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 Ln=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})=>Bn({verbose:e.verbose,showToken:e["show-token"]})}),zn=.01,Gn=864e5,Kn=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Jn=new Intl.NumberFormat("en-US"),Wn=e=>Kn.format(e*zn),Yn=e=>e.credits_used??e.entitlement-e.remaining,Vn=(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())/Gn;if(r<.5)return;let a=Yn(e),i=a*zn/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*zn,c=new Date(n.getTime()+l/i*Gn);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},Xn=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Jn.format(Yn(e))} of ${Jn.format(e.entitlement)} used`:"n/a",Zn=e=>e.padEnd(14),Qn=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${Zn("AI credits")}unlimited`);else{let e=Yn(o),t=o.percent_remaining;n.push(`${Zn("AI credits")}${Wn(e)} / ${Wn(o.entitlement)} ${t.toFixed(1)}% left`,`${Zn("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${Zn("")}${Jn.format(e)} of ${Jn.format(o.entitlement)} credits`)}if(n.push("",`${Zn("Chat")}${Xn(e.quota_snapshots.chat)}`,`${Zn("Completions")}${Xn(e.quota_snapshots.completions)}`,"",`${Zn("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/Gn)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=Vn(o,e.quota_reset_date,t);r&&n.push(`${Zn("Burn rate")}~${Kn.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?`${Jn.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${Zn("Overage")}${a}`)}return n.join("\n")},er=async()=>{let e=`${wt}/copilot_internal/user`,t=oe.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await it({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:bt(oe),signal:o.signal});try{if(!t.ok)throw new Jt("Failed to get usage",t);return await t.json()}catch(e){throw tt(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},tr=()=>_.stdout.write("[2J[H"),or=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,nr=async()=>{let e=await er();return Qn(e)},rr=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 V(),await Hn(),!e.watch){try{o.box(await nr())}catch(e){o.error("Failed to fetch usage:",e),_.exit(1)}_.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=_.stdout.isTTY,r=()=>_.exit(0);for(_.on("SIGINT",r),_.on("SIGTERM",r);;){try{let e=await nr();n&&tr(),o.box(e),o.log(or(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),ar=q(h);async function ir(){let e="win32"===_.platform?"where.exe":"which";try{return await ar(e,["tailscale"]),!0}catch{return!1}}async function sr(){try{let{stdout:e}=await ar("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function lr(e){return e.replace(/\.$/,"")}async function cr(){let e=await sr();if(e?.Online)return lr(e.DNSName)}const ur=q(h),pr=e=>`[1m${e}[0m`,dr=e=>`[2m${e}[0m`,mr=e=>`[36m${e}[0m`,fr=e=>`[32m${e}[0m`,hr=e=>`[31m${e}[0m`,gr=e=>`[33m${e}[0m`,_r=dr(" ─────────────────────────────────────────────────────────────"),yr=s.join(Y.APP_DIR,"certs","tailscale"),wr=s.join(yr,"cert.pem"),br=s.join(yr,"key.pem"),kr={certDir:yr,certPath:wr,keyPath:br};function vr(){switch(_.platform){case"darwin":return[` ${dr("Install Tailscale for macOS:")}`,` ${mr("https://tailscale.com/download/mac")}`,` ${dr("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${dr("After installing, open the Tailscale app and sign in.")}`,` ${dr("Then re-run this command.")}`].join("\n");case"linux":return[` ${dr("Install Tailscale for Linux:")}`,` ${mr("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${mr("sudo tailscale up")}`,` ${dr("or")} ${mr("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${dr("Install Tailscale for Windows:")}`,` ${mr("https://tailscale.com/download/windows")}`,"",` ${dr("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${dr("Install Tailscale:")} ${mr("https://tailscale.com/download")}`}}function xr(){let e=[` ${hr("Tailscale is not running.")}`];return"darwin"===_.platform?e.push(` ${dr("Open the Tailscale app from Applications and sign in.")}`,` ${dr("Download:")} ${mr("https://tailscale.com/download/mac")}`):"win32"===_.platform?e.push(` ${dr("Open the Tailscale app and sign in.")}`,` ${dr("Download:")} ${mr("https://tailscale.com/download/windows")}`):e.push(` ${dr("Connect with:")} ${mr("sudo tailscale up")}`),e.push("",` ${dr("Then re-run this command.")}`),e.join("\n")}async function Tr(){try{return await a.access(wr),await a.access(br),!0}catch{return!1}}function $r(e){console.log(""),console.log(_r),console.log(` ${pr("Claude Cowork Setup")} ${dr("— Diagnostic")}`),console.log(_r),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?fr("✅"):"missing"===n.status?hr("❌"):gr("❓");let r=n.detail?dr(` ${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(` ${fr("All checks passed.")}`):console.log(` ${hr(`${t.length} issue(s).`)} Run ${mr("copilot-api cowork-setup install")} to fix.`),console.log("")}const Ar={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},Sr=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await ir();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return $r(e),console.log(""),console.log(vr()),void console.log("");let o=await sr();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},$r(e),console.log(xr()),void console.log("");let n=lr(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await Tr();e["tailscale-cert"]=r?{status:"ok",detail:wr}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),$r(e)}(),_.exit(0)}}),Er=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:Ar},async run({args:e}){await async function(e){if(console.log(""),console.log(_r),console.log(` ${pr("Claude Cowork Setup")} ${dr("— Install")}`),console.log(_r),console.log(""),!await ir())return console.log(` ${hr("Tailscale is not installed.")}`),console.log(""),console.log(vr()),console.log(""),console.log(` ${dr("After installing, run")} ${mr("tailscale up")} ${dr("to connect, then re-run this command.")}`),void console.log("");let t=await sr();if(!t||!t.Online)return console.log(xr()),void console.log("");let n=lr(t.DNSName);if(console.log(` ${dr("Tailscale hostname:")} ${pr(n)}`),console.log(""),console.log(` ${pr("Generating TLS certificate via Tailscale…")}`),console.log(` ${dr("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${mr(`$ tailscale cert --cert-file ${wr} --key-file ${br} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(yr,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await ur("tailscale",["cert","--cert-file",wr,"--key-file",br,n]),console.log(` ${fr("✓ 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(_r),console.log(` ${pr("Next steps")}`),console.log(_r),console.log(""),console.log(` ${pr("1.")} Start the proxy:`),console.log(` ${mr("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${pr("2.")} In Cowork ${dr("→")} Settings ${dr("→")} Inference Provider, set:`),console.log(` ${pr("inferenceGatewayBaseUrl")} = ${mr(`https://${n}:<port>`)}`),console.log(` ${dr("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${pr("3.")} Restart Cowork ${dr("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${dr("For Cowork's own configuration docs, see:")}`),console.log(` ${mr("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),_.exit(0)}}),Or=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:Ar},async run({args:e}){await async function(e){if(console.log(""),console.log(_r),console.log(` ${pr("Claude Cowork Setup")} ${dr("— Revert")}`),console.log(_r),console.log(""),!await Tr())return console.log(` ${dr("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${pr("Remove Tailscale cert files:")}`),console.log(` ${dr(wr)}`),console.log(` ${dr(br)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(yr,{recursive:!0}),console.log(` ${fr("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${dr("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),_.exit(0)}}),Cr=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:Sr,install:Er,revert:Or}}),Ir=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function Nr(e){if(!Ir.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 Pr(e){return"string"==typeof e?Nr(e):Array.isArray(e)?function(e){let t;for(let o=0;o<e.length;o++){let n=e[o],r=Pr(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?Pr(a):a;!t&&(i!==a||"__proto__"===r)&&(t=Rr({},o,e)),t&&(t[r]=i)}let r=t??e;return"object"===r.type&&!("properties"in r)&&(t??=Rr({},o,o.length),t.properties={}),t??e}(e):e}function Rr(e,t,o){for(let n=0;n<o;n++)e[t[n][0]]=t[n][1];return e}const qr="x-copilot-api-self-test",Dr=R();const jr=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function Mr(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 Fr(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();rt.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),a>=400&&n.setStatus({code:u.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($e.add(1,d),Le.record(s,d),c>=400&&Ae.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&&(Se.add(e.inputTokens,t),Ve.record(e.inputTokens,t)),e.outputTokens&&(Ee.add(e.outputTokens,t),Xe.record(e.outputTokens,t)),e.cachedTokens&&Oe.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&he.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const Hr=1048576;const Ur=async()=>{if(!ee())return ve.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),Qe.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),Fe.add(1,{result:"rejected"}),new Jt("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),Fe.add(1,{result:"approved"})}finally{e.end()}})};async function Br(e){if(Bo(oe)||await Mn())return null;let t=In();return t?(m.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${Pn()}`,type:"authentication_error"}},401)):(m.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 Lr(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 zr(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 Gr=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Kr(e){if(!e||"string"!=typeof e)throw new Gr("Model name is required and must be a string");if("foundry"===oe.provider)return e;if(!oe.models?.data)throw new Gr("Models not available. Please try again later.",503);let t=oe.models.data.map(e=>e.id);if(t.includes(e))return e;let o=an(e,t);if(!o)throw Ie.add(1,{requested_model:e}),new Gr(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function Jr(e){let t=oe.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):"foundry"===oe.provider?Jo(e):/gpt-[\d.]+-codex/i.test(e)}async function Wr(e){if(void 0===e.rateLimitSeconds||ee())return;let t=e.rateLimitSeconds;return ve.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"),Ce.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new Jt("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),Ce.add(1,{action:"waited",source:"local"}),Ke.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await yn(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 Vr(e){if(e instanceof Yr)return{type:e.type,message:e.message};if(e instanceof Jt){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 Xr(e,t){let{type:n,message:r}=Vr(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 Zr(e,t){let{type:n,message:r}=Vr(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 Qr(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 ea(e,t,o){return Math.min(Math.max(e,t),o)}function ta(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 ta(JSON.parse(r),t+1)}catch{return null}}function oa(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=Qr(o.capabilities.supports.min_thinking_budget),r=Qr(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:Qr(o.capabilities.limits?.max_output_tokens)??void 0}}function na(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=ea(Qr(e.requestedBudget)??o,o,n),a=Qr(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 ra(e,t){if(wn(e.thinking_budget))return e;let o=oa(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=na({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 aa(e){return"invalid_thinking_budget"===ta(e)}async function ia(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(wn(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(!aa(i))return null;let l=oa(n,t.model);return l?function(e,t){let o=na({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=Qr(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 sa(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 la(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const ca=new Map,ua=new Map,pa=new Set;let da,ma,fa;function ha(e){return!e.closed&&!e.destroyed}function ga(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new C(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return ca.set(t,Date.now()),Ue.add(1,{event:"created",origin:e}),et(y.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=pa.has(t);Ue.add(1,{event:"goaway",origin:e}),et(i?y.WARN:y.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}),ua.delete(t),pa.delete(t),ca.delete(t),ha(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function _a(e,t){if(!oe.connectivity.h2)return;if(da&&da!==e&&function(){for(let e of[...ua.keys(),...pa])ha(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});ua.clear(),pa.clear(),ca.clear()}(),da=e,t?.fresh){let t=ga(e);return pa.add(t),t}let n=Date.now();for(let[t]of ua)if(n-(ca.get(t)??0)>=6e5)ua.delete(t),ca.delete(t),ha(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Ue.add(1,{event:"rotated",origin:e}),et(y.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(ha(t))return ua.delete(t),pa.add(t),t;ua.delete(t),ca.delete(t)}let r=ga(e);return pa.add(r),r}function ya(e){e&&pa.delete(e)&&(ha(e)?ua.set(e,Date.now()):ca.delete(e))}function wa(){fa||(fa=setInterval(()=>{!function(){let e=Date.now(),t=oe.connectivity.h2Keepalive,n=ua.size;for(let[r,a]of ua)e-a<6e4||t&&n<=1||(ua.delete(r),ca.delete(r),n--,ha(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Ue.add(1,{event:"idle_reaped",origin:da??""}),et(y.INFO,"INFO",`HTTP/2 idle connection reaped for ${da}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":da??""}))}()},3e4),fa.unref())}function ba(){ma||(o.debug("Starting HTTP/2 keepalive (every 45s)"),ma=setInterval(()=>{(async function(){if(0===ua.size&&0===pa.size){if(da){let e=ga(da);ua.set(e,Date.now())}return}let e=[...ua.keys()];for(let t of e)ua.delete(t);await Promise.allSettled(e.map(async e=>{if(ha(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:gt(oe)});await n.dump(),He.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),ua.set(e,Date.now())}catch(t){He.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Ue.add(1,{event:"error",origin:da??""}),ca.delete(e),ha(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else ca.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),ma.unref(),wa())}function ka(e){return e.max_completion_tokens??e.max_tokens}async function va(e,t,o){try{if(!e.ok)throw new Jt("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&&zr(t,n.usage),n}catch(e){throw tt(t,e),e}finally{t.end()}}const xa=e=>Mo(oe)?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=ka(e);return null==i?a:{...a,max_completion_tokens:i}}(e,oe.models),Ta=e=>Mo(oe)?e:Pr(e),$a=async e=>{let t=Ta(e);try{return await Aa(t)}catch(e){if(e instanceof Jt&&401===e.response.status)return await Eo(),Aa(t);let n;if(e instanceof Jt)try{n=await e.response.clone().text()}catch{n=void 0}let r=await ia({payload:t,error:e,models:oe.models,errorBodyText:n});if(r)return e instanceof Jt&&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 Aa(Ta(r));throw e}},Aa=async e=>{if(!Bo(oe))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={...Uo(oe,t),"X-Initiator":o?"agent":"user"},r=Ho(oe),a=`${r}/chat/completions`,i=oe.timeoutMs,s=xa(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":ka(e)??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":o?"agent":"user"};for(let t=0;t<=1;t++){let o=_a(r,{fresh:t>0}),s=new AbortController,u=Yt(s,i);try{let{statusCode:r,headers:u,body:p,span:d}=await st({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 Jt("Failed to create chat completions",m,{outgoingBody:l,outgoingHeaders:n});return{events:F(m),span:d,release:()=>ya(o)}}try{return await va(m,d,{outgoingBody:l,outgoingHeaders:n})}finally{ya(o)}}catch(e){if(ya(o),await Kt(e,{attempt:t,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Sa=new Map;const Ea=["none","minimal","low","medium","high","xhigh","max"];function Oa(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=Ea.indexOf(e);if(-1===o)return t[0];let n,r=1/0;for(let e of t){let t=Ea.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 Ca(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:[];Sa.set(e.model,r);let a=Oa(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 Ia(e,t,o){try{if(!e.ok)throw new Jt("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&&zr(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 tt(t,e),e}finally{t.end()}}const Na=async e=>{let t=Mo(oe),o=t?function(e){let t=Sa.get(e.model);return t?Oa(e,t):e}(e):e,n=!1,r=!1;for(;;)try{return await Pa(o)}catch(e){if(!(e instanceof Jt))throw e;if(401===e.response.status&&!n){n=!0,await Eo();continue}if(t&&400===e.response.status&&!r){r=!0;let t=Ca(o,await e.response.clone().text().catch(()=>{}));if(t){o=t;continue}}throw e}},Pa=async e=>{if(!Bo(oe))throw Error("Service token not found");let t=Mo(oe)?e:Pr(e),o={...Uo(oe),"X-Initiator":"agent"},n=Ho(oe),r=`${n}/responses`,a=oe.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=_a(n,{fresh:e>0}),c=new AbortController,u=Yt(c,a);try{let{statusCode:n,headers:u,body:p,span:d}=await st({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=hn(m);if(e&&(d.setAttribute("copilot_api.foundry.throttled_stream",!0),await(m.body?.cancel())),!m.ok||e)throw d.end(),new Jt("Failed to create responses",e??m,{outgoingBody:i,outgoingHeaders:o});return{events:F(m),span:d,release:()=>ya(l)}}try{return await Ia(m,d,{outgoingBody:i,outgoingHeaders:o})}finally{ya(l)}}catch(t){if(ya(l),await Kt(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Ra=e=>Object.hasOwn(e,"output");function qa(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 Da=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const ja=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 Ma(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new Da(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new Da(`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=>Ha(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=Ua(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=Ha(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:Ha(o.content)})}return t}(e.messages);if(0===o.length)throw new Da("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),Fa(e.temperature)&&(n.temperature=e.temperature),Fa(e.top_p)&&(n.top_p=e.top_p),Fa(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),Fa(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 Fa(e){return null!=e}function Ha(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function Ua(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 Da(`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 Ba(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 La(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 za(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 Ga(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function Ka(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=Ga(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[za(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),[za(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function Ja(e,t){let o=[za(e,{},La(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=Ba(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function Wa(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:[za(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:Ka(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=Ga(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[za(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:Ja(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 Ya="openai_responses";function Va(e){let t=performance.now(),n=ve.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),Ma(e)}finally{t.end()}});Je.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!ja.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 Xa(e){let t=performance.now(),o=ve.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:La(e,n.length>0)}]};return e.usage&&(r.usage=Ba(e.usage)),r}(e)}finally{t.end()}});return Je.record(performance.now()-t,{direction:"responses_to_openai"}),o}function Za(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=Ba(t.usage);a.tokenUsage=Lr(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?(m.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(Xa(t))}async function Qa(e,t,n){let r;try{r=Va(t)}catch(t){if(t instanceof Da)return m.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}),oe.manualApprove&&!n.isSelfTest&&await Ur();let a=await Br(e);if(a)return a;let i=performance.now(),s=await Na(r),l=performance.now()-i;if(ze.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Ra(s))return Za(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 M(e,async t=>{let n=null,a=0,s=performance.now(),m=sa(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++,Me.add(1,{model:r.model,endpoint_type:Ya});let c=qa(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Lr(c),t._d1=l,e.set("requestData",t)}let u=Wa(s,d);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:Ya};Ge.record(performance.now()-s,u),Ze.record(a,u),la(e,i)}catch(o){throw ot(u,e.get("requestSpan"),o),await Zr(t,o),o}finally{n&&zr(u,n),u.end(),p()}let f=e.get("requestId");f&&he.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function ei(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 ti(e){let t=!0===e.get("isSelfTest");t||await Wr(oe);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return ve.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Kr(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),Ne.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 Gr)return m.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(Jr(n.model))return Qa(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),oe.manualApprove&&!t&&await Ur(),"foundry"!==oe.provider&&(n=function(e){if(!wn(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!wn(e.max_tokens))return e;let t=(oe.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=ra(n,oe.models)),wn(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await Br(e);if(r)return r;let a=performance.now(),i=await $a(n),s=performance.now()-a;if(ze.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),oi(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=Lr(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 M(e,async t=>{let o={value:null},r=0,i=performance.now(),p=sa(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(r++,Me.add(1,{model:n.model,endpoint_type:"openai"}),i=ei(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=Lr(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(Ge.record(c,u),Ze.record(r,u),la(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Lr(o.value),t._d1=s,e.set("requestData",t))}}catch(o){throw ot(c,e.get("requestSpan"),o),await Zr(t,o),o}finally{o.value&&zr(c,o.value),c.end(),u()}let d=e.get("requestId");d&&he.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const oi=e=>Object.hasOwn(e,"choices"),ni=new D;ni.post("/",async e=>{try{return await ti(e)}catch(t){return await ho(e,t)}});const ri=async e=>{if(!Bo(oe))throw Error("Service token not found");let t=`${Ho(oe)}/embeddings`,o=Uo(oe),n=oe.timeoutMs,r=new AbortController,a=Yt(r,n),i=JSON.stringify(e);try{let{response:n,span:a}=await it({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 Jt("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw tt(a,e),e}finally{a.end()}}finally{clearTimeout(a)}},ai=new D;ai.post("/",async e=>{try{let t=await e.req.json();try{t.model=Kr(t.model)}catch(t){if(t instanceof Gr)return m.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 Br(e);if(o)return o;let n=performance.now(),r=await(async e=>{try{return await ri(e)}catch(t){if(t instanceof Jt&&401===t.response.status)return await Eo(),ri(e);throw t}})(t),a=performance.now()-n;ze.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=Lr(r.usage),i._d1=a,e.set("requestData",i),e.json(r)}catch(t){return await ho(e,t)}});const ii=new D;let si=null,li=null;function ci(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function ui(e){return!ci(e)}ii.get("/",async e=>{let t,o=function(){if(Mo(oe)){if(!Bo(oe))return"missing";let e=oe.foundry?.bearerExpiresAt;return void 0!==e&&e<=Date.now()?"expired":"valid"}let e=oe._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=si;return t&&e-t.timestamp<3e4?{result:t.result}:li||(li=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${Ho(oe)}/models`,n=await fetch(t,{method:"GET",headers:Uo(oe),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return si={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return si={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),li=null}})(),li)}();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.10",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 pi=new H(B),di={...U["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function mi(e){try{return pi.encode(e,[],[]).length}catch(t){return o.debug("count_tokens: tokenizer failed, using length/4",t),Math.ceil(e.length/4)}}function fi(e){let t=0;for(let o of e)switch(o.type){case"text":t+=mi(o.text)*di.contentMultiplier;break;case"tool_use":t+=mi(o.name+JSON.stringify(o.input))*di.contentMultiplier;break;case"tool_result":o.content&&(t+=mi("string"==typeof o.content?o.content:JSON.stringify(o.content))*di.contentMultiplier);break;case"thinking":t+=mi(o.thinking)*di.contentMultiplier;break;case"image":t+=1600}return t}function hi(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?di.perFirstProp:di.perAdditionalProp,t+=mi(o),r.description&&(t+=di.perPropDesc+mi(r.description)),r.enum&&Array.isArray(r.enum)){t+=di.perEnum;for(let e of r.enum)t+=mi(String(e))}if("object"===r.type&&r.properties&&(t+=di.perNestedObject,t+=hi(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=di.perArrayOfObjects,t+=hi(e))}}return t}function gi(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 _i(e,t,o){let n=gi(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const yi=async(e,t,n)=>{try{return await wi(e,t)}catch(r){if(r instanceof Jt&&401===r.response.status)return await Eo(),wi(e,t);if(r instanceof Jt&&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}`),wi(i,t)}throw r}};const wi=async(e,t)=>{if(!Bo(oe))throw Error("Service token not found");let{baseUrl:o,headers:n,cleanPayload:r}=Mo(oe)&&oe.foundry?{baseUrl:Do(oe.foundry),headers:jo(oe.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={...yt(oe,t,r),"X-Initiator":"agent"};return{baseUrl:ht(oe),headers:a,cleanPayload:n}}(Pr(e),t),a=`${o}/v1/messages`,i=oe.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",...gi(e,t?.anthropicBeta)}}(r,t,i);for(let e=0;e<=1;e++){let t=_a(o,{fresh:e>0}),c=new AbortController,u=Yt(c,i);try{let{statusCode:o,headers:u,body:p,span:d}=await st({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 Jt("Failed to create anthropic messages",m,{outgoingBody:s,outgoingHeaders:n});if(r.stream)return{events:F(m),span:d,release:()=>ya(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&&zr(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(),ya(t)}}catch(o){if(ya(t),await Kt(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},bi=new Set(["low","medium","high","max","xhigh"]);function ki(e){let t=e.output_config?.effort;if("string"!=typeof t||!t||!bi.has(t))return e;let n=oe.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=ln(t,n);if(!r||!bi.has(r))return e;let a=r;if(a===t)return e;o.debug(`Effort clamp: ${t} → ${a}`);let i=m.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 vi(e,t,n){if("foundry"===oe.provider)return ki(e);let r=t.includes(e.model)?e.model:an(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=an(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=m.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 ki(s)}const xi=e=>"object"==typeof e&&!!e&&!Array.isArray(e),Ti=["properties","patternProperties","$defs","definitions"],$i=["items","additionalProperties","propertyNames","contains","not","if","then","else"],Ai=["anyOf","allOf","oneOf","prefixItems"];const Si=()=>["string","number","boolean"].map(e=>({type:e})),Ei=()=>({anyOf:[...Si(),{type:"array",items:{anyOf:Si()}},{type:"object"}]}),Oi=e=>!0===e||xi(e)&&0===Object.keys(e).length,Ci=e=>"array"===e.type||Array.isArray(e.type)&&e.type.includes("array");function Ii(e,t){let o={...e};for(let e of Ti){let n=o[e];xi(n)&&(o[e]=Object.fromEntries(Object.entries(n).map(([e,o])=>[e,xi(o)?Ii(o,t):o])))}for(let e of $i){let n=o[e];xi(n)&&(o[e]=Ii(n,t))}for(let e of Ai){let n=o[e];Array.isArray(n)&&(o[e]=n.map(e=>xi(e)?Ii(e,t):e))}return"prefixItems"in o&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?[...e.prefixItems]:[];delete e.prefixItems,(xi(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let o=t.flatMap(e=>Oi(e)?Ei().anyOf:xi(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)),Ci(o)&&(!("items"in o)||Oi(o.items))&&(t.add("items"),o.items=Ei()),Oi(o.additionalProperties)&&(t.add("additionalProperties"),delete o.additionalProperties),o}function Ni(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{if(o.length>0){o.push(n);break}let e=Ri(n);e&&t.push(e);break}case"user":case"assistant":o.push(n)}return{leadingSystemTexts:t,messages:o}}function Pi(e){return qi(Ri(e))}function Ri(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 qi(e){if(!e.startsWith("x-anthropic-billing-header:"))return e;let t=e.indexOf("\n");return-1===t?"":e.slice(t).replace(/^\n+/,"")}function Di(e,t){return["string"==typeof e?e:(e??[]).map(e=>e.text).join("\n\n"),...t].map(e=>qi(e)).filter(Boolean).join("\n\n")}const ji=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),Mi=new Set(["text","image"]);function Fi(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);Mi.has(e)||t.add(`block:tool_result:${e}`)}}const Hi=new Set;function Ui(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=ji.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&&Fi(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(Hi.size>=100)break;Hi.has(o)||(Hi.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 Bi=e=>N("sha256").update(e).digest("hex").slice(0,12);function Li(e,t){e.setAttribute("copilot_api.translation.system_hash",Bi(t.system)),e.setAttribute("copilot_api.translation.tools_hash",Bi(JSON.stringify(t.tools??[])))}function zi(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function Gi(e){return e.toLowerCase().startsWith("claude-")}function Ki(e,t){let o={model:e.model,messages:Ji(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:ts(e.tools,e.model),tool_choice:os(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=oa(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=Qr(t),a=r&&r>1?r-1:o.min;return ea(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=ra({...o,thinking_budget:a},t)}}return o}function Ji(e,t){let{leadingSystemTexts:o,messages:n}=Ni(e),r=function(e,t){let o=Di(e,t);return o?[{role:"system",content:o}]:[]}(t,o),a=[];for(let e of n)switch(e.role){case"system":{let t=Pi(e);if(!t)break;Wi(r)?a.push(t):Yi(r,t);break}case"user":r.push(...Vi(e));for(let e of a)Yi(r,e);a=[];break;case"assistant":r.push(...Xi(e))}for(let e of a)Yi(r,e);return r}function Wi(e){let t=e.at(-1);return"assistant"===t?.role&&!!t.tool_calls?.length}function Yi(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 Vi(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:es(e.content)});n.length>0&&t.push({role:"user",content:es(n)})}else t.push({role:"user",content:es(e.content)});return t}function Xi(e){let t=function(e){return{reasoning_text:Qi(e.reasoning_text),reasoning_opaque:Qi(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:es(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:es(e.content),...t}]}const Zi=32768;function Qi(e){if("string"==typeof e)return e.length<=Zi?e:e.slice(0,Zi)}function es(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 ts(e,t){if(!e)return;let o=e.filter(ui),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:Ii(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&&m.getActiveSpan()?.setAttribute("copilot_api.translation.schema_keywords_rewritten",[...r].sort().join(",")),a}function os(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 ns(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 rs(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function as(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 is=new Set(["low","medium","high","max","xhigh"]);function ss(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&&is.has(e)?e:null)(ln(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 ls(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 cs=/[^\w-]/g;function us(e){return e.replaceAll(cs,"_")}function ps(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=ss(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:ls(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:us(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:us(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function ds(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 ms(e,t,o=400){return m.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({type:"error",error:{type:"invalid_request_error",message:t}},o)}function fs(e,t){return ve.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),_i(n,t,e.req.header("anthropic-beta"));let r=Kr(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=ds(t);return a?(m.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),Ne.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 Gr)return{ok:!1,response:ms(e,t.message,t.statusCode)};throw t}finally{n.end()}})}function hs(e,t,o){let{leadingSystemTexts:n,messages:r}=Ni(e.messages),a=function(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{let e=Pi(n);if(!e)break;"function_call"===t.at(-1)?.type?o.push(e):t.push(ks(e));break}case"user":t.push(...vs(n),...o.map(e=>ks(e))),o=[];break;case"assistant":t.push(...Ts(n))}return t.push(...o.map(e=>ks(e))),t}(r);if(0===a.length)throw new Jt("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 Di(e,t)||null}(e.system,n);s&&(i.instructions=s),e.tools?.length&&(i.tools=e.tools.filter(ui).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:bs(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=ln(o,t);return{effort:ws(n)?n:o}}}(e,t,o?.keepMax??!1);return l&&(i.reasoning=l),o?.promptCacheKey&&(i.prompt_cache_key=o.promptCacheKey),i}function gs(e,t){let o=e?.trim()||t?.trim();if(o)return`cc-${N("sha256").update(o).digest("hex").slice(0,32)}`}function _s(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 ys=new Set(["low","medium","high","xhigh"]),ws=e=>null!==e&&ys.has(e);function bs(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function ks(e){return{type:"message",role:"developer",content:[{type:"input_text",text:e}]}}function vs(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(xs(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 xs(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 Ts(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 $s(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 As(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function Ss(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 Es(e,t){let o=[];switch(e.type){case"response.created":Ss(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){Ss(t,o),As(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":Ss(t,o),As(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":As(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":{As(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:$s(e.response.status,n),stop_sequence:null},usage:_s(r)},{type:"message_stop"});break}case"response.incomplete":{Ss(t,o),As(t,o);let n=e.response.usage;o.push({type:"message_delta",delta:{stop_reason:"max_tokens",stop_sequence:null},usage:_s(n)},{type:"message_stop"});break}case"response.failed":Ss(t,o),As(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":Ss(t,o),As(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":Ss(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 Os(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 Cs(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function Is(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&&(Os(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&&(Os(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),Cs(t,o)),r.content&&(Cs(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){Cs(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&&(Cs(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:zi(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 Ns=/structured_outputs|output_config\.format/i;function Ps(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&Ns.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?ps({...e,model:tn},o):null}var Rs=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var qs=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const Ds={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 it({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 tt(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new qs: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 it({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 tt(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Rs:e}finally{clearTimeout(i)}}},js=["tavily","exa"];function Ms(e){return"tavily"===e||"exa"===e}function Fs(){return oe.webSearchProviders.length>0}async function Hs(e,t){return async function(e,t,n){let{providers:r,searchFns:a=Ds}=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:oe.webSearchProviders})}function Us(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function Bs(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 Ls(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&&ci(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(!Fs())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await Hs(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_${Us()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{...Bs(n,e)}];return{id:`msg_ws_${Us()}`,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_${Us()}`,r=`msg_ws_${Us()}`,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:Bs(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}),M(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const zs=(e,t)=>!(!e||!t||e===t);async function Gs(e){if(Bo(oe)||await Mn())return null;let t=In();return t?(m.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${Pn()}`}},401)):(m.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 Ks(e,t){let o=t.model;return o&&"string"==typeof o?null:ms(e,"Model name is required and must be a string")}async function Js(e){let t=await e.req.json();if(function(e){let t=e.tools;return!(!t||1!==t.length)&&ci(t[0])}(t))return Ks(e,t)??Ls(e,t);await Wr(oe),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=Ks(e,t);if(a)return a;t=function(e,t){return vi(t,oe.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=fs(e,t);if(!i.ok)return i.response;t=i.payload;let s=await Gs(e);if(s)return s;if(Jr(t.model))return Xs(e,t);if(function(e){if("foundry"!==oe.provider)return Gi(e);let t=oe.models?.data.find(t=>t.id===e);return t?"Anthropic"===t.vendor:Gi(e)}(t.model))return async function(e,t,o){let n="foundry"===oe.provider,r=n?t:ps(t,oe.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:zs(o,i),streaming:!!r.stream}),oe.manualApprove&&await Ur(),ve.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),_i(t,r,a.anthropicBeta);try{let o=performance.now(),i=await yi(r,a,{onStructuredOutputFallback:(e,o)=>{if(n)return null;let r=Ps(e,o,oe.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(ze.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=Lr(Ys(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 M(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=sa(e,o);try{try{for await(let e of l)d(),e.data&&"[DONE]"!==e.data?(a++,Me.add(1,{model:r.model,endpoint_type:"anthropic_messages"}),Vs(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"};Ge.record(e,t),Ze.record(a,t)}catch(t){throw ot(c,e.get("requestSpan"),t),await Xr(n,t),t}finally{if(la(e,o),p){let t=Ys(s);zr(c,t);let o=e.get("requestData")||{};o.tokenUsage=Lr(t),e.set("requestData",o)}c.end(),u()}let t=e.get("requestId");t&&he.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw tt(t,e),t.end(),e}})}(e,t,r);let l=performance.now(),c=ve.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),Ui(o,t.messages);let a=Ki(t,oe.models),i=a.messages.at(0);return Li(o,{system:"system"===i?.role&&"string"==typeof i.content?i.content:"",tools:a.tools}),a}finally{o.end()}});Je.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=ra(c,oe.models),o.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:zs(r,u),streaming:!!c.stream});let p=performance.now();oe.manualApprove&&await Ur();let d=await $a(c),m=performance.now()-p;if(ze.record(m,{model:c.model,target:"chat_completions",streaming:String(!!c.stream)}),Ws(d)){let t=e.get("requestData")||{};d.usage&&(t.tokenUsage=Lr(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=ve.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=rs(a.message),i=ns(a.message.content),s=as(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:zi(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 Je.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 M(e,async t=>{let n=null,r=0,a=performance.now(),i=sa(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++,Me.add(1,{model:c.model,endpoint_type:"anthropic"}),l.usage){n=l.usage;let t=e.get("requestData")||{};t.tokenUsage=Lr(n),t._d1=m,e.set("requestData",t)}let u=Is(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(Ge.record(l,u),Ze.record(r,u),la(e,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Lr(n),t._d1=m,e.set("requestData",t))}}catch(o){throw ot(h,e.get("requestSpan"),o),await Xr(t,o),o}finally{n&&zr(h,n),h.end(),g()}let l=e.get("requestId");l&&he.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const Ws=e=>Object.hasOwn(e,"choices");function Ys(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 Vs(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 Xs(e,t){let r=performance.now(),a=ve.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),Ui(o,t.messages);let n=hs(t,oe.models?.data.find(e=>e.id===t.model)?.capabilities.supports.reasoning_effort,{keepMax:"foundry"===oe.provider,promptCacheKey:"foundry"===oe.provider?gs(e.req.header("x-claude-code-session-id"),t.metadata?.user_id):void 0});return Li(o,{system:n.instructions??"",tools:n.tools}),n}finally{o.end()}});Je.record(performance.now()-r,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",a),e.set("requestData",{model:a.model,streaming:!!a.stream}),oe.manualApprove&&await Ur();let i=performance.now(),s=await Na(a),l=performance.now()-i;if(ze.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Ra(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=Lr({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 m.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=ve.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:$s(e.status,o),stop_sequence:null,usage:_s(e.usage)}}(s)}finally{e.end()}});return Je.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 M(e,async t=>{let n=null,r=0,s=performance.now(),d=sa(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++,Me.add(1,{model:a.model,endpoint_type:"responses"});let c=qa(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Lr(n),t._d1=l,e.set("requestData",t)}let u=Es(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"};Ge.record(u,p),Ze.record(r,p),la(e,i)}catch(o){throw ot(u,e.get("requestSpan"),o),await Xr(t,o),o}finally{n&&zr(u,n),u.end(),p()}let f=e.get("requestId");f&&he.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}const Zs=new D;Zs.post("/",async e=>{try{return await _n(e,Js)}catch(t){return await ho(e,t)}});const Qs=new D;function el(e){return ve.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Kr(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),Ne.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 tl(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=Lr(o),n._d1=t._d1,t.c.set("requestData",n)}Qs.get("/",async e=>{try{oe.models||await bn();let t=oe.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 ho(e,t)}});const ol=new Set(["message","function_call","function_call_output"]),nl=new Set(["type","name","description","parameters"]);async function rl(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||!Fs())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await Hs(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function al(e){if(Fs())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await rl(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function il(e){if(!Fs())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 rl(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function sl(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 ol.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function ll(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 cl(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&&ll(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)ll(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function ul(e){return null!=e}function pl(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function dl(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function ml(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(!pl(n)){o.push(n);continue}let e=sl(n);null===e?t.add(dl(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"])ul(e[o])&&(t[o]=e[o]);let r=new Set;if(ul(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))nl.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(ul(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},ul(o.effort)&&(t.reasoning.effort=o.effort),ul(o.summary)&&(t.reasoning.summary=o.summary)}if(ul(e.text)&&"object"==typeof e.text){let o=e.text;ul(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function fl(e,t){return m.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function hl(e,t,o){let{payload:n,droppedInputTypes:r}=o;if(!Array.isArray(t)||!Array.isArray(n.input))return null;let a=m.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||ul(n.previous_response_id)||ul(n.prompt)||ul(n.conversation)?null:fl(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 gl(e){await Wr(oe);let t=await e.req.json();if(!pl(t))return fl(e,"request body must be a JSON object");let n=function(e){return"foundry"===oe.provider?{payload:e,customToolNames:new Set,droppedInputTypes:[]}:ml(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:el(t)}}catch(t){if(t instanceof Gr)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=hl(e,t.input,n);if(s)return s;let l=await Br(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),oe.manualApprove&&await Ur();let c=performance.now(),u=await Na(a),p=performance.now()-c;if(ze.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),_l(u))return async function(e,t,o){await al(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=Lr({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 M(e,async t=>{let o={value:null},n=0,i=performance.now(),s=sa(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=cl(i.data,r);s=await il(s);let l=s===i.data?i:{...i,data:s};Me.add(1,{model:a.model,endpoint_type:"responses"}),tl(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"};Ge.record(l,u),Ze.record(n,u),la(e,c)}catch(o){throw ot(m,e.get("requestSpan"),o),await Zr(t,o),o}finally{o.value&&zr(m,o.value),m.end(),f()}let l=e.get("requestId");l&&he.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const _l=e=>Object.hasOwn(e,"output"),yl=new D;yl.post("/",async e=>{try{return await _n(e,gl)}catch(t){return await ho(e,t)}});const wl=new D;wl.get("/",e=>{try{return oe.showToken?e.json({token:oe._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 bl=new D;bl.get("/",async e=>{try{let t=await er();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const kl=new D;function vl(){return function(e){let t=e.filter(e=>Mr(e));if(0===t.length)return;let o=t.find(e=>jr.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(oe.models?.data??[])}function xl(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 Nr(o).slice(0,200)}catch{}let t=Nr(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 Tl(e={}){let t=performance.now(),o=e.model&&function(e){let t=oe.models?.data.find(t=>t.id===e);return void 0!==t&&Mr(t)}(e.model)?e.model:vl();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 kl.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[qr]:Dr},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:xl(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)}}kl.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=Tt(i),l=function(e){return e===Dr}(e.req.header(qr));e.set("requestId",r),e.set("isSelfTest",l),e.header("x-request-id",r);let d=ve.startSpan("copilot_api.handle_request",{kind:c.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",d),e.set("requestTraceContext",d.spanContext()),l&&d.setAttribute("copilot_api.self_test",!0);for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();rt.has(e)||"x-copilot-api-self-test"!==e&&d.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>Hr?t.slice(0,Hr):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=m.setSpan(p.active(),d);await p.with(g,async()=>{l||he.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw d.setStatus({code:u.ERROR,message:t.message}),d.recordException(t),e}});let _=e.get("requestData"),y={c:e,start:n,method:a,path:i,endpointType:s,requestId:r,span:d};_?.streaming&&e.res.status<400?h.then(()=>Fr(y)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{d.recordException(t),d.setStatus({code:u.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{d.end()}catch{}}):Fr(y)}),kl.use(j()),kl.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()}),kl.get("/",e=>e.text("Server running")),kl.route("/health",ii),kl.route("/chat/completions",ni),kl.route("/models",Qs),kl.route("/embeddings",ai),kl.route("/usage",bl),kl.route("/token",wl),kl.route("/v1/chat/completions",ni),kl.route("/v1/models",Qs),kl.route("/v1/embeddings",ai),kl.route("/v1/messages",Zs),kl.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=di.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=di.perMessage+mi(e)*di.contentMultiplier}for(let e of t.messages)o+=di.perMessage,o+=mi(e.role),"string"==typeof e.content?o+=mi(e.content)*di.contentMultiplier:Array.isArray(e.content)&&(o+=fi(e.content));let n=t.tools?.filter(ui);return n&&n.length>0&&(o+=function(e){let t=di.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=di.perTool),t+=mi(n.name),n.description&&(t+=di.perDesc+mi(n.description)),t+=hi(n.input_schema);return t}(n)),e.json({input_tokens:Math.round(o)})}),kl.route("/v1/responses",yl),kl.route("/responses",yl),kl.onError((e,t)=>ho(t,e));const $l=e=>`[1m${e}[0m`,Al=e=>`[2m${e}[0m`,Sl=e=>`[32m${e}[0m`,El=e=>`[31m${e}[0m`,Ol=e=>`[33m${e}[0m`,Cl=Al(" ─────────────────────────────────────────────────────────────");function Il(e,t,o){console.log(` ${function(e){return"ok"===e?Sl("✓"):"warn"===e?Ol("⚠"):El("✗")}(e)} ${$l(t.padEnd(14))} ${o}`)}function Nl(e){console.log(` ${Al("↳")} ${Al(e)}`)}function Pl(e){return e instanceof Jt?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function Rl(){let e=_.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(Y.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 ql(){try{await bn();let e=(oe.models?.data.length??0)>0;return Il(e?"ok":"warn","Model catalog",e?function(){let e=oe.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 Il("fail","Model catalog",Pl(e)),Nl("Could not fetch /models — check connectivity/auth."),!1}}async function Dl(e){oe.accountType=e.accountType;let t=await Rt(),o=qt();if(console.log(""),console.log(` ${$l("COPILOT-API DOCTOR")} ${Al(`v${t}`)}`),console.log(Cl),Il("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await V(),kn(),!await async function(){let e=await Rl();if(!e)return Il("fail","Auth token","not found"),void Nl("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");oe._t2=e.token,Il("ok","Auth token",`found (${e.source})`);try{let e=await _o();return await ft(oe,e.login),Il("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return Il("fail","GitHub auth",Pl(e)),void Nl("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(Cl),console.log(` ${El("✗")} ${$l("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await go();return oe._t1=e,Il("ok","Service token","acquired"),!0}catch(e){let t=e instanceof Jt?e.response.status:0;return Il("fail","Service token",Pl(e)),Nl(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 ql();await async function(){try{let e=await er(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${Wn(Yn(t))} of ${Wn(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;Il("ok","Copilot plan",`${e.copilot_plan} · ${o} `+Al(`(resets ${e.quota_reset_date})`))}catch(e){Il("warn","Copilot plan",`unavailable (${Pl(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await Tl();return e.ok?(Il("ok","Generation",`works via ${e.model} ${Al(`(${e.durationMs}ms)`)}`),!0):(Il("fail","Generation",`${e.reason}${e.status?Al(` [HTTP ${e.status}]`):""}`),!1)}():Il("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=_.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){Il(t,"Client config","potential base-URL issue");for(let t of e)Nl(t)}else Il("ok","Client config","no base-URL issues detected");Nl("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(Cl),a?(console.log(` ${Sl("✓")} ${$l("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${Ol("⚠")} ${$l("Some checks need attention")} — see the ${El("✗")}/${Ol("⚠")} lines above.`),console.log(""),2)}const jl=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 Dl({accountType:e["account-type"]});_.exit(t)}});function Ml(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 Fl=!1;const Hl="copilot-api-node20",Ul=`https://registry.npmjs.org/${Hl}/latest`,Bl=e=>`[1m${e}[0m`,Ll=e=>`[33m${e}[0m`;async function zl(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(Ul,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function Gl(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 Kl,Jl;async function Wl(e){try{let[t,o]=await Promise.all([Rt(),zl(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 Yl(){if(!Kl||!Jl)return;let{signal:e}=Jl;Kl.then(t=>{t&&!e.aborted&&function(e,t){let o=`npx ${Hl}@latest`,n=Ll("│"),r=` ${Bl("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${Bl(o)} to update`,i=" ".repeat(54),s=Ll(`╭${"─".repeat(54)}╮`),l=Ll(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${Gl(r,54)}${n}`,`${n}${i}${n}`,`${n}${Gl(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var Vl={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 Xl=262144,Zl="https://barazany.dev",Ql=/^[a-z0-9][a-z0-9-]*$/i,ec=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function tc(e,t){if("string"!=typeof e)return"";let o=e.replaceAll(ec," ").replaceAll(/\s+/g," ").trim(),n=Array.from(o);return n.length<=t?o:`${n.slice(0,t-1).join("").trimEnd()}…`}function oc(e){if("object"!=typeof e||!e)return null;let t=e,o=tc(t.title,100),n=tc(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!==Zl||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&&Ql.test(t.slug)&&(r=`${Zl}/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 nc(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=oc(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 rc=null;function ac(e){return s.join(e,"blog-posts.json")}function ic(e=Y.APP_DIR){try{if(rc&&rc.length>0)return rc;let t=function(e){try{let t=ac(e);return L.statSync(t).size>Xl?[]:nc(JSON.parse(L.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:nc(Vl)}catch{return[]}}function sc(e){return e>-6e4&&e<864e5}async function lc(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>Xl)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>Xl?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>Xl)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?[]:nc(JSON.parse(o))}finally{clearTimeout(o)}}async function cc(e={}){try{if("1"===_.env.COPILOT_API_NO_BLOG||"1"===_.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let t=e.dir??Y.APP_DIR,o=e.now??Date.now();if(await async function(e,t){try{let o=ac(e),n=await L.promises.stat(o);if(n.size<=Xl){let e=await L.promises.readFile(o),n=JSON.parse(e.toString("utf8"));if("number"==typeof n.fetchedAt)return sc(t-n.fetchedAt)}return sc(t-n.mtimeMs)}catch{return!1}}(t,o))return;let n=await lc(e.timeoutMs??3e3);if(0===n.length)return;rc=n,await async function(e,t,o){let n=ac(e),r=`${n}.${_.pid}.tmp`;try{await L.promises.writeFile(r,`${JSON.stringify({fetchedAt:o,posts:t})}\n`),await L.promises.rename(r,n)}catch(e){throw await L.promises.rm(r,{force:!0}).catch(()=>{}),e}}(t,n,o)}catch(e){o.debug("Blog posts refresh skipped:",e)}}async function uc(e){return"foundry"===e.provider?(oe.foundry=Po(process.env),oe.connectivity.h2=!1,oe.connectivity.h2Keepalive=!1,"entra"===oe.foundry.auth&&await $o(oe.foundry),o.info(`Using Microsoft Foundry upstream: ${oe.foundry.endpoint} (${"entra"===oe.foundry.auth?"Entra ID":"API key"} auth)`),"copilot"===e.fallback&&await async function(e){try{await pc(e),await dn(),o.info("Copilot fallback enabled for Foundry rate limits (429)")}catch(e){o.error("Copilot fallback disabled: GitHub Copilot login failed; serving from Foundry only.",e)}}(e),{login:"foundry"}):pc(e)}async function pc(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){oe._t2=e,Cn=!1}(n),o.info("Using provided Auth token")):await Hn();try{t=await _o(),await ft(oe,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 go();oe._t1=e,o.debug("Service token fetched successfully!"),oe.showToken&&o.info("Service token:",e),On=!0,Fn(t),lt.start(),$n=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),jn(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},An=()=>{o.debug("Network connectivity lost")},lt.on("online",$n),lt.on("offline",An)})(),t}function dc(e,t=""){let o,n=function(){let{platform:e,ppid:t,env:o}=_;if("win32"===e){try{if(g(`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 mc=e=>`[1m${e}[0m`,fc=e=>`[2m${e}[0m`,hc=e=>`[36m${e}[0m`,gc=e=>`[32m${e}[0m`,_c=e=>`[33m${e}[0m`,yc=e=>`[4m${e}[0m`,wc=(e,t)=>`]8;;${e}\\${t}]8;;\\`,bc="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",kc="https://github.com/johnib/copilot-api-issues/issues",vc=fc(" ─────────────────────────────────────────────────────────────");function xc(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function Tc(e){return e&&0!==e.length?e.join("·"):"—"}function $c(e){if(0===e.length)return[];let t=["",vc,` ${mc("BARAZANY.DEV")} ${fc("— Recent Posts")}`,vc,""];for(let[o,n]of e.entries()){let e=`${n.url}${bc}`,r=wc(e,mc(yc(`[${o+1}]`)));t.push(` ${r} ${hc(n.title)}`,` ${fc("→")} ${fc(n.teaser)}`,"")}return t.push(vc,` ${wc(`https://barazany.dev/blog${bc}`,"barazany.dev/blog")}`,vc),t}function Ac(e){let t=[];oe.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):oe.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(fc(" → "))} ${gc("✓")}`:fc("off"),n=["",` ${mc("COPILOT-API")} ${fc(`v${e.version}`)}`,vc,` ${fc("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${fc("User")} ${e.user} ${fc("·")} ${e.accountType}`];return oe._v1&&n.push(` ${fc("Client")} VSCode ${oe._v1}`),n.push(` ${fc("Network")} ${t.join(fc(" · "))}`,` ${fc("Search")} ${o}`),e.clipboardCopied&&n.push(` ${fc("Clipboard")} Claude Code command ${gc("✓")}`),n.push(vc),n}function Sc(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${mc("Active")}`];if(e.model){let o=oe.models?.data.find(t=>t.id===e.model),n=xc(o?.capabilities.limits?.max_context_window_tokens),r=Tc(o?.capabilities.supports.reasoning_effort);t.push(` ${hc(e.model.padEnd(32))} ${fc("ctx")} ${mc(n.padStart(5))} ${fc("effort")} ${fc(r)} ${_c("← main")}`)}if(e.smallModel){let o=oe.models?.data.find(t=>t.id===e.smallModel),n=xc(o?.capabilities.limits?.max_context_window_tokens),r=Tc(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${fc("ctx")} ${n.padStart(5)} ${fc("effort")} ${fc(r)} ${_c("← small")}`)}return t}function Ec(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of oe.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("",` ${mc(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?hc("●"):fc("·"),i=n?hc(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?xc(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${Tc(r.effort)}`;t.push(` ${a} ${i} ${fc(s)}${fc(l)}`)}}return t}function Oc(){let e=kc.replace(/^https:\/\//,""),t=wc(`${kc}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",vc,` ${mc("FOUND A BUG?")} ${fc("— Report it on GitHub")}`,vc,"",` ${hc("→")} ${hc(t)}`,` ${fc("Bug reports, feature requests, and questions welcome.")}`,"",vc]}function Cc(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=["",vc,` ${mc("Claude Cowork")} ${fc("— Settings → Inference Provider")}`,vc,"",` ${fc("Paste into")} ${mc("inferenceGatewayBaseUrl")}${fc(":")}`,` ${mc(hc(r))}`];return n||a.push("",` ${fc("Your Tailscale hostname is shown by:")} ${hc("tailscale status --self")}`),a.push("",` ${fc("Docs:")} ${hc("https://claude.com/docs/cowork/3p/installation")}`),a}function Ic(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",vc,` ${mc("HTTPS")} ${fc("— self-signed cert")}`,vc,"",` ${fc("Cert")} ${t}`];switch(o.push("",` ${mc("Trust this cert")} ${fc("(one-time setup)")}`),_.platform){case"darwin":o.push(` ${fc("macOS:")}`,` ${hc("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${hc(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${fc("Windows (PowerShell as Administrator):")}`,` ${hc(`Import-Certificate -FilePath "${t}" \``)}`,` ${hc("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${fc("Linux (Debian/Ubuntu):")}`,` ${hc(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${hc("sudo update-ca-certificates")}`,` ${fc("Linux (Fedora/RHEL/Arch):")}`,` ${hc(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${hc("sudo update-ca-trust")}`);break;default:o.push(` ${fc("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${fc("Or, for Node CLIs only (no admin needed):")}`,` ${hc(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,vc),o}function Nc(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 Pc=s.join(Y.APP_DIR,"certs"),Rc=s.join(Pc,"cert.pem"),qc=s.join(Pc,"key.pem"),Dc=s.join(Pc,"cert.meta.json");async function jc(e){try{return await a.readFile(e,"utf8")}catch{return}}async function Mc(e){let t=await jc(Rc),o=await jc(qc),n=await async function(){let e=await jc(Dc);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 Fc(e){return 0!==K(e)}async function Hc(e){await a.mkdir(Pc,{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)Fc(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 J([{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(Rc,l.cert,{mode:420}),await a.writeFile(qc,l.private,{mode:384}),await async function(e){await a.writeFile(Dc,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:Rc,keyPath:qc,generated:!0}}const Uc=[],Bc=Date.now();let Lc="";function zc(){let e=async(e,t=0)=>{let n=ve.startSpan("copilot_api.server.shutdown",{kind:c.INTERNAL,attributes:{"copilot_api.shutdown.reason":e,"copilot_api.shutdown.exit_code":t,"copilot_api.uptime_seconds":(Date.now()-Bc)/1e3}});for(let t of Uc)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=wc("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",vc,` ${mc("COPILOT-API")} ${fc(`v${e}`)} ${fc("·")} ${Nc(t)} uptime`,vc,""," Check in from time to time on",` ${hc(o)}`,"",vc,""];console.log(n.join("\n"))}(Lc,Date.now()-Bc),_.exit(t)};_.on("SIGINT",()=>e("SIGINT")),_.on("SIGTERM",()=>e("SIGTERM")),_.on("uncaughtException",t=>{o.error("Uncaught exception:",t),e("uncaughtException",1)}),_.on("unhandledRejection",(t,n)=>{o.error("Unhandled promise rejection at:",n,"reason:",t),e("unhandledRejection",1)})}const Gc=e=>e.filter(e=>"embeddings"!==e.capabilities.type).map(e=>e.id),Kc=e=>e.filter(e=>"embeddings"!==e.capabilities.type&&(e.supported_endpoints?.includes("/responses")??!0)).map(e=>e.id);async function Jc(e,t,n){if(!e._cc1)return!1;oe.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."),_.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,Gc(oe.models.data));i?(r=i.model,a=i.smallModel):(r=await o.prompt("Select a model to use",{type:"select",options:Gc(oe.models.data)}),a=await o.prompt("Select a small model to use",{type:"select",options:Gc(oe.models.data)}));let s=dc({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 f.writeSync(s),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(s),!1}}function Wc(e){return e._t2?"cli_arg":_.env.GH_TOKEN?"env_var":"stored"}function Yc(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=ve.startSpan("copilot_api.server.startup",{kind:c.INTERNAL,attributes:nt({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,_cc1:t._cc1,model:t.model,smallModel:t.smallModel,_t3:Wc(t),provider:t.provider},runtime:n,identity:{_u1:r.login,machineId:oe.machineId,sessionId:oe.sessionId,_v1:oe._v1},connectivity:oe.connectivity,modelsCount:oe.models?.data.length??0,startupDurationMs:Date.now()-Bc},"copilot_api")});if(oe.models?.data)for(let e of oe.models.data)a.addEvent("copilot_api.model.available",nt(e,"model"));a.end(),et(y.INFO,"INFO","Server started",nt({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:oe.models?.data.length??0,startupDurationMs:Date.now()-Bc},"copilot_api"))}async function Vc(e,t){try{return await uc(e)}catch(o){throw await async function(e,t){let o=nt({config:t,startupStage:"upstream_auth"},"copilot_api"),n=ve.startSpan("copilot_api.server.startup_failed",{kind:c.INTERNAL,attributes:o});e instanceof Jt&&(n.setAttribute("http.response.status_code",e.response.status),n.setAttribute("url.full",e.response.url)),tt(n,e),n.end(),et(y.ERROR,"ERROR","Server startup failed",{...o,"exception.message":e instanceof Error?e.message:String(e)}),await ke()}(o,{version:t,provider:e.provider,accountType:e.accountType,_t3:Wc(e)}),o}}async function Xc(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 Mc(e)){let e=await jc(Rc),t=await jc(qc);if(e&&t)return{cert:e,key:t,certPath:Rc,keyPath:qc,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),Hc(e)}(e.httpsHosts)}}async function Zc(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=kr;try{z(t),z(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(zc(),Uc.push(()=>{o.debug("Cleaning up connectivity monitor"),lt.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),On=!1,xn&&=void clearInterval(xn),$n&&=void lt.off("online",$n),An&&=void lt.off("offline",An),Tn=void 0,Sn=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),ma&&=void clearInterval(ma),fa&&=void clearInterval(fa);let e=[...ua.keys(),...pa];ua.clear(),pa.clear(),ca.clear(),da=void 0;for(let t of e)ha(t)&&(Ue.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await ke()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");oe.provider=t.provider,oe.accountType=t.accountType,oe.manualApprove=t.manual,oe.rateLimitSeconds=t.rateLimit,oe.rateLimitWait=t.rateLimitWait,oe.showToken=t.showToken,oe.timeoutMs=t.timeout,oe.connectivity.timeoutMs=t.connectTimeout,oe.webSearchProviders=t.webSearchProviders,oe.errorReporting=function(e){let t=_.env.COPILOT_API_ERROR_REPORTING;return(void 0===t||!["0","false","no","off"].includes(t.trim().toLowerCase()))&&e}(t.errorReporting),function(){let e="1"===_.env.COPILOT_H2_KEEPALIVE||"true"===_.env.COPILOT_H2_KEEPALIVE,t=e||"1"===_.env.COPILOT_H2||"true"===_.env.COPILOT_H2;oe.connectivity.h2=t,oe.connectivity.h2Keepalive=e}(),await V(),cc().catch(()=>{}),kn();let n=await Rt();Lc=n;let r=qt();!function(e,t){t&&(ye=t),_e=crypto.randomUUID();let o=x({[E]:"copilot-api",[O]:e,[S]:_e}),{endpoint:n,headers:r}=be();ge=new A({resource:o,traceExporter:new v({url:`${n}/v1/traces`,headers:r}),metricReader:new $({exporter:new k({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new T({exporter:new b({url:`${n}/v1/logs`,headers:r})})],instrumentations:[]}),ge.start()}(n,Bc);let a=await Vc(t,n);await async function(){try{return await bn(),!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"===oe.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(()=>{bn().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let i=function(e=18e5){let t=setInterval(()=>{bn().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)}}();Uc.push(()=>{o.debug("Cleaning up model refresh interval"),i()}),oe.connectivity.h2&&(ya(_a(ht(oe))),oe.connectivity.h2Keepalive&&ba()),Yc({options:t,version:n,runtime:r,_u1:a});let s=await Xc(t),l=s?"https":"http",c=`${l}://localhost:${t.port}`,u=await Jc(t,c,s)||await async function(e,t,n){if(!e.codex)return!1;let r;if(oe.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."),_.exit(1)),e.model){let t=Kc(oe.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:Kc(oe.models.data)});let a=dc({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return f.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=[...Ac(e),...Sc(e),...Ec(e),...Oc(),"",...$c(ic()),...Cc(e),...Ic(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 cr()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:u,tls:s})),Yl(),G({fetch:kl.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 Tl({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: ${Nr(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 Qc(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const eu=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:Qc(t,"--rate-limit"),r=e.timeout,a=void 0===r?te:Qc(r,"--timeout"),i=function(e,t){let o=e??t,n=void 0===o?15e3:Qc(o,"--connect-timeout");if(n<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${n}`);return n}(e["connect-timeout"],_.env.COPILOT_CONNECT_TIMEOUT_MS),s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[],c=e["web-search-provider"]??_.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(!Ms(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${js.join(", ")}`);let r=n.length>0?n:js,a=new Set,i=n.length>0,s=[];for(let e of r){if(!Ms(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"]||_.env.TAVILY_API_KEY,exaApiKey:_.env.EXA_API_KEY,order:u}),d=(_.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,_.env.COPILOT_API_PROVIDER);return Zc({provider:f,fallback:pn(e.fallback,_.env.COPILOT_API_FALLBACK,f),port:Qc(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})}});Fl||(Fl=!0,o.setReporters([Ml(o.options.reporters)]));const tu=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(Kl||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;Jl=e,Kl=Wl(e).catch(()=>null)})(),tu||Yl();const ou=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:Ln,start:eu,"check-usage":rr,debug:Mt,doctor:jl,"cowork-setup":Cr}});await t(ou),tu||(Jl?.abort(),Jl=void 0,Kl=void 0);export{};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "copilot-api-node20",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.44.0-preview.10",
|
|
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",
|