@evolvingmachines/evolve 0.0.67 → 0.0.68
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-FHL4GIAZ.js +1 -0
- package/dist/chunk-ORD7JDZB.js +1 -0
- package/dist/chunk-SQDR2TAW.js +427 -0
- package/dist/cli/index.cjs +38 -38
- package/dist/cli/index.d.cts +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.js +30 -30
- package/dist/index.cjs +65 -60
- package/dist/index.d.cts +332 -29
- package/dist/index.d.ts +332 -29
- package/dist/index.js +48 -43
- package/dist/managed-modal-IXZBT4D5.js +4 -0
- package/dist/resumable-XNW5SKRW.js +1 -0
- package/dist/{types-84M4J_Vm.d.cts → types-DGx_qo9M.d.cts} +118 -77
- package/dist/{types-84M4J_Vm.d.ts → types-DGx_qo9M.d.ts} +118 -77
- package/harness-capabilities.json +325 -77
- package/hosted-error-codes.json +1 -0
- package/package.json +9 -7
- package/skills/create-adapter/SKILL.md +1 -1
- package/skills/create-task/SKILL.md +1 -1
- package/skills/evolve/SKILL.md +1 -1
- package/skills/evolve-evals/references/cli-reference/agent.md +1 -1
- package/skills/evolve-evals/references/cli-reference/analyze.md +6 -3
- package/skills/evolve-evals/references/cli-reference/check.md +4 -3
- package/skills/evolve-evals/references/cli-reference/index.md +1 -1
- package/skills/evolve-evals/references/cli-reference/run.md +4 -3
- package/skills/evolve-evals/references/core-concepts/agents.md +7 -3
- package/skills/evolve-evals/references/core-concepts/analyze.md +2 -2
- package/skills/evolve-evals/references/core-concepts/check.md +2 -2
- package/skills/evolve-evals/references/core-concepts/datasets.md +1 -1
- package/skills/evolve-evals/references/core-concepts/index.md +1 -1
- package/skills/evolve-evals/references/core-concepts/jobs.md +3 -3
- package/skills/evolve-evals/references/core-concepts/models.md +8 -9
- package/skills/evolve-evals/references/core-concepts/sandboxes.md +1 -1
- package/skills/evolve-evals/references/core-concepts/secrets.md +1 -1
- package/skills/evolve-evals/references/core-concepts/skills.md +1 -1
- package/skills/evolve-evals/references/core-concepts/task-verifiers.md +1 -1
- package/skills/evolve-evals/references/core-concepts/teams.md +1 -1
- package/skills/evolve-evals/references/core-concepts/upload.md +1 -1
- package/skills/evolve-evals/references/getting-started/first-task.md +1 -1
- package/skills/evolve-evals/references/getting-started/quick-start.md +1 -1
- package/skills/evolve-evals/references/index.md +1 -1
- package/skills/evolve-evals/references/sdk/http.md +1 -1
- package/skills/evolve-evals/references/sdk/python.md +1 -1
- package/skills/evolve-evals/references/sdk/typescript.md +1 -1
- package/skills/evolve-evals/references/sdk-reference/analyses.md +11 -4
- package/skills/evolve-evals/references/sdk-reference/checks.md +11 -4
- package/skills/evolve-evals/references/sdk-reference/error-codes.md +1 -0
- package/skills/evolve-evals/references/sdk-reference/jobs.md +2 -2
- package/skills/evolve-evals/references/sdk-reference/meta.md +2 -1
- package/skills/evolve-evals/references/sdk-reference/methods/analyses.md +6 -4
- package/skills/evolve-evals/references/sdk-reference/methods/checks.md +8 -4
- package/skills/evolve-evals/references/sdk-reference/methods/jobs.md +5 -3
- package/skills/evolve-evals/references/sdk-reference/methods/meta.md +15 -4
- package/skills/evolve-evals/references/sdk-reference/skills.md +2 -2
- package/skills/evolve-evals/references/sdk-reference/types.md +11 -5
- package/spec/openapi.yaml +290 -137
- package/dist/chunk-HQJI3HHU.js +0 -1
- package/dist/chunk-RFLMRPGK.js +0 -427
- package/dist/managed-modal-IJW62SSK.js +0 -4
- package/dist/resumable-HFSICSH3.js +0 -1
package/dist/chunk-HQJI3HHU.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import {createHash}from'crypto';import {stat,open}from'fs/promises';import {request as request$1}from'http';import {request}from'https';function S(e,t){try{let c=JSON.parse(e)?.error?.retryAfterSec;if(typeof c=="number"&&Number.isFinite(c))return c}catch{}let r=t.headers?.get?.("retry-after");if(typeof r!="string"||r.trim()==="")return;let s=Number(r);return Number.isFinite(s)?s:void 0}var $=256*1024*1024;function Q(e){$=e;}var v=6*1024*1024,g=4,N=3,C=60,q=6e5;async function D(e){let t=await open(e,"r");try{let r=createHash("sha256"),s=Buffer.alloc(1024*1024);for(;;){let{bytesRead:i}=await t.read(s,0,s.length);if(i===0)break;r.update(s.subarray(0,i));}return r.digest("hex")}finally{await t.close();}}function T(e){return Math.min(500*2**(e-1),4e3)}function I(e,t){let r=e===void 0?0:e*1e3;return Math.min(Math.max(r,T(t)),C*1e3)}var U=e=>new Promise(t=>setTimeout(t,e));async function E(e,t,r){let s=new AbortController,i=setTimeout(()=>s.abort(),r);i.unref?.();try{return await fetch(e,{...t,signal:s.signal})}finally{clearTimeout(i);}}var F=e=>e.status===429||e.status===503;async function R(e){for(let t=0;;t+=1){let r=await e();if(!F(r)||t>=N)return r;let s=await r.text().catch(()=>"");await U(I(S(s,r),t+1));}}function j(e,t,r){return new Promise((s,i)=>{let c=new URL(e),l=(c.protocol==="https:"?request:request$1)(c,{method:"POST",headers:t}),f=setTimeout(()=>{l.destroy(new Error(`finalize timed out: no response for ${Math.round(r/1e3)}s`));},r);f.unref?.(),l.on("error",a=>{clearTimeout(f),i(a);}),l.on("response",a=>{let h=[];a.on("data",u=>h.push(u)),a.on("error",u=>{clearTimeout(f),i(u);}),a.on("end",()=>{clearTimeout(f);let u=new Headers;for(let[o,p]of Object.entries(a.headers))if(typeof p=="string")u.set(o,p);else if(Array.isArray(p))for(let y of p)u.append(o,y);let m=a.statusCode??0,n=m!==204&&m!==205&&m!==304;s(new Response(n?Buffer.concat(h):null,{status:m,statusText:a.statusMessage??"",headers:u}));});}),l.end();})}async function G(e){let t=e.timeoutMs??q,r=e.chunkBytes??v,{size:s}=await stat(e.file.path),i=await D(e.file.path),c=`${e.baseUrl}${e.sessionsPath??"/api/datasets/publish/uploads"}`,_={...e.headers,"Content-Type":"application/json"},l={size:s,sha256:i};for(let[n,o]of Object.entries(e.fields))o!==void 0&&(l[n]=o);let f=await R(()=>E(c,{method:"POST",headers:_,body:JSON.stringify(l)},t));if(!f.ok)return f;let a=await f.json(),h=`${c}/${a.id}`;typeof a.import_id=="string"&&a.import_id!==""&&e.onRegistered?.(a.import_id);let u=async()=>{let n=await R(()=>E(h,{method:"HEAD",headers:e.headers},t));if(!n.ok)throw new Error(`upload session probe failed: HTTP ${n.status}`);let o=Number(n.headers.get("upload-offset"));if(!Number.isInteger(o))throw new Error("upload session probe did not return Upload-Offset");return o},m=await open(e.file.path,"r");try{let n=0,o=0,p=Buffer.alloc(r);for(;n<s;){let d=Math.min(r,s-n),{bytesRead:w}=await m.read(p,0,d,n);if(w!==d)throw new Error(`archive shrank mid-upload: read ${w} of ${d} bytes at offset ${n}`);let P=p.subarray(0,d),O=createHash("sha256").update(P).digest(),b;try{b=await R(()=>E(h,{method:"PATCH",headers:{...e.headers,"Content-Type":"application/offset+octet-stream","Upload-Offset":String(n),"Upload-Checksum":`sha256 ${O.toString("base64")}`},body:new Uint8Array(P)},t));}catch(k){if(o+=1,o>=g)throw k;await U(T(o));try{n=await u();}catch{}continue}if(b.status===409){if(o+=1,o>=g)return b;n=await u();continue}if(!b.ok)return b;let A=Number(b.headers.get("upload-offset"));if(!Number.isInteger(A)||A<=n)throw new Error("resumable upload did not advance Upload-Offset");n=A,o=0,e.onBytes?.(n,s);}let y;for(let d=1;d<=g;d++)try{return await R(()=>j(`${h}/complete`,e.headers,t))}catch(w){y=w,d<g&&await U(T(d));}throw y}finally{await m.close();}}export{S as a,$ as b,Q as c,v as d,g as e,N as f,C as g,I as h,G as i};
|
package/dist/chunk-RFLMRPGK.js
DELETED
|
@@ -1,427 +0,0 @@
|
|
|
1
|
-
import {a,b}from'./chunk-HQJI3HHU.js';import {createWriteStream}from'fs';import {mkdir,rename,rm}from'fs/promises';import {join,basename}from'path';import {Readable}from'stream';import {pipeline}from'stream/promises';function ft(e=""){let t=process.env.EVOLVE_GATEWAY_URL||"https://swarmkit-gateway-692833842999.us-central1.run.app";if(!e)return t;let n=e.startsWith("/")?e:`/${e}`;return `${t}${n}`}function bt(e=""){let t=process.env.EVOLVE_DASHBOARD_URL||D;if(!e)return t;let n=e.startsWith("/")?e:`/${e}`;return `${t.replace(/\/$/,"")}${n}`}var ns=["e2b","daytona","modal"];function Oe(e){return bt(`/api/managed/${e}`)}function ss(){return `${Oe("daytona")}/toolbox`}function rs(){return Oe("e2b")}function as(e){return {"browser-use":{type:"http",url:ft("/browser_use/mcp"),headers:{"x-litellm-api-key":`Bearer ${e}`}}}}var M="EVOLVE_API_KEY",is="E2B_API_KEY",os="DAYTONA_API_KEY",ls="MODAL_TOKEN_ID",us="MODAL_TOKEN_SECRET",cs="claude",ds=36e5,gs=4,ps=100,De="/home/user";function ms(e,t){return t?t.replace(/\/+$/,"")||"/":e?e==="root"?"/root":`/home/${e}`:De}var D=process.env.EVOLVE_DASHBOARD_URL||"https://dashboard.evolvingmachines.ai",fs="x-litellm-customer-id",bs="x-litellm-tags",ys="run:",hs=".evolve-sdk/observability/sessions",ks=["tag","provider","agent","model","sandboxId","sandbox_id","timestamp","event","events"],Ss=100,vs=5e3,Rs=3,xs=1e3;var yt=["QUEUED","RUNNING","SCORING","SCORED","SCORING_ERROR","INFRASTRUCTURE_ERROR","BUDGET","INDETERMINATE","CANCELLED"],ht=["e2b","daytona","modal"],kt=["my","shared","org"],St=["job","check","all"],vt=["queued","running","completed","failed"],Rt=["queued","running","completed"];function B(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;if(typeof t.provisional!="boolean")return null;let n=r=>typeof r=="number"&&Number.isFinite(r)?r:null;return {provisional:t.provisional,spent_usd:n(t.spent_usd),input_tokens:n(t.input_tokens),cached_input_tokens:n(t.cached_input_tokens),cache_write_tokens:n(t.cache_write_tokens),output_tokens:n(t.output_tokens),as_of:typeof t.as_of=="string"?t.as_of:null}}function xt(e){let t=e.stats?.evals??{},n=[];for(let r of Object.keys(t).sort()){let i=t[r]?.pass_at_k??{},l=[];for(let d of Object.keys(i)){let u=Number(d),g=i[d];!Number.isFinite(u)||typeof g!="number"||!Number.isFinite(g)||l.push({k:u,value:g});}l.length!==0&&(l.sort((d,u)=>d.k-u.k),n.push({evals_key:r,points:l}));}return n}var me=["dataset_flag","job_dataset_record","task_hash","none"],_e=["hash_mismatch","task_not_in_dataset","no_dataset_named","dataset_ambiguous","no_hash_match","no_task_digest"];function T(e){let t=e.link??{};return {visibility:e.visibility==="LINK"?"LINK":"PRIVATE",link:{enabled:t.enabled===true,...typeof t.url=="string"?{url:t.url}:{}},emails:(Array.isArray(e.emails)?e.emails:[]).map(n=>{let r=n;return {email:String(r.email??""),shared_by:String(r.shared_by??""),created_at:String(r.created_at??"")}})}}var fe=1e9;function be(e){let t=e.data?.update;if(!t||typeof t!="object"||Array.isArray(t))return null;let n=t;if(n.sessionUpdate!=="usage"||n.source!=="gateway")return null;let r=n.usage;return !r||typeof r!="object"||Array.isArray(r)?null:n}function z(e,t,n){if(e!=null){if(!Array.isArray(e)||e.some(r=>typeof r!="string"))throw new Error(`${n} storedAt is not a list of date-time strings`);if(e.length!==t)throw new Error(`${n} storedAt has ${e.length} entries for ${t} events (one per event, index-aligned)`);return e}}var At=["trace-parsed","verifier","trace-stdout","trace-stderr","trace-atif","trajectory","agent-home","filesystem"],Tt=["agent","verifier","setup","system","metrics"],wt=["trace-stdout","trace-stderr","agent-home"],Le=["missing_authorization","invalid_api_key","read_only_key","credential_service_unavailable","rate_limited","insufficient_credits","quota_exceeded","invalid_json","invalid_input","invalid_limit","invalid_status","invalid_visibility","invalid_cursor","invalid_after","invalid_format","invalid_ids","invalid_multipart","idempotency_key_reused","dataset_not_found","dataset_version_not_found","dataset_name_taken","dataset_in_use","dataset_not_owned","dataset_import_in_progress","upstream_not_watchable","no_active_version","version_not_ready","version_not_activatable","unknown_task_names","no_tasks","task_not_found","task_failed_to_build","upload_session_not_found","upload_offset_mismatch","upload_chunk_digest_mismatch","upload_incomplete","upload_archive_digest_mismatch","upload_session_failed","too_many_concurrent_upload_chunks","agent_not_found","agent_name_taken","agent_name_reserved","agent_invalid_name","agent_source_required","agent_source_conflict","agent_invalid_env","agent_too_large","agent_limit_reached","skill_not_found","skill_name_not_found","skill_ref_invalid","skill_unresolvable","skill_invalid","skill_in_use","skill_too_large","skill_limit_reached","too_many_concurrent_skill_uploads","secret_not_found","secret_ambiguous","secret_brokered_unsupported","secret_exists","secret_not_attached","agent_version_not_found","agent_version_unresolvable","agent_kwarg_unsupported","agent_config_unsupported","agent_config_key_refused","agent_preset_unsupported","provider_unsupported","job_not_found","job_not_terminal","no_failed_trials","trial_not_found","trial_not_settled","concurrent_update","regrade_source_ineligible","no_regradable_trials","invalid_rubric","analysis_already_running","analysis_not_found","analysis_not_terminal","check_not_found","check_not_terminal","no_checkable_tasks","too_many_concurrent_check_uploads","no_analyzable_trials","session_not_found","not_a_job_dir","invalid_trial","trial_too_large","upload_too_large","job_uploaded","job_already_uploaded","too_many_concurrent_job_uploads","job_import_not_found","import_not_found","import_too_large","too_many_concurrent_imports","invalid_archive","unpinned_git_ref","hub_package_not_found","hub_unreachable","package_not_retained","package_corrupt","package_missing","too_many_concurrent_package_downloads","org_not_found","org_slug_taken","org_forbidden","org_personal_immutable","org_last_owner","org_in_use","org_member_not_found","invite_not_found","invite_invalid","not_found","not_captured","filesystem_state","feature_unsupported","provider_unreachable","task_package_not_retained","internal_error"];function ye(e){return typeof e=="string"&&Le.includes(e)}var Et=["level","binary","none"];function Pt(e,t,n){return e==="measured"&&t===0&&n.every(r=>(r??null)===null)}function Je(e,t,n){return typeof e!="number"||!Number.isFinite(e)?{lane:"unmeasured"}:t==="measured"?Pt(t,e,n)?{lane:"unmeasured"}:{lane:"measured",usd:e}:t==="measured_provisional"?{lane:"floor",usd:e}:{lane:"unmeasured"}}function ee(e){let t=e.agent_result;return Je(t?.cost_usd,e.spend_source,[t?.n_input_tokens,t?.n_cache_tokens,t?.n_output_tokens])}function Ct(e){let t=e.judge_result;return Je(t?.cost_usd,e.judge_spend_source,[t?.n_input_tokens,t?.n_cache_tokens,t?.n_output_tokens])}function It(e,t){return typeof e!="number"||!Number.isFinite(e)?{lane:"unmeasured"}:typeof t=="number"&&t>0?{lane:"floor",usd:e}:{lane:"measured",usd:e}}function Ot(e){let t=ee(e);if(t.lane!=="unmeasured")return t;let n=e.usage;return n&&n.provisional&&typeof n.spent_usd=="number"?{lane:"floor",usd:n.spent_usd}:t}var Ue={stdoutFile:"stdout.log",harborCopies:[]},he={claude:{stdoutFile:"claude-code.txt",harborCopies:[{sandboxRoot:"/root/.claude",agentDir:"sessions"}]},codex:{stdoutFile:"codex.txt",harborCopies:[{sandboxRoot:"/root/.codex/sessions",agentDir:"sessions"}]},gemini:{stdoutFile:"gemini-cli.txt",harborCopies:[]},qwen:{stdoutFile:"qwen-code.txt",harborCopies:[{sandboxRoot:"/root/.qwen/projects",agentDir:"qwen-sessions"}]},kimi:{stdoutFile:"kimi-code.txt",harborCopies:[]},opencode:{stdoutFile:"opencode.txt",harborCopies:[{sandboxRoot:"/root/.local/share/opencode",agentDir:"opencode/xdg-data/opencode"}]},droid:{stdoutFile:"droid.txt",harborCopies:[]}},Dt={"claude-code":"claude",codex:"codex","gemini-cli":"gemini","qwen-coder":"qwen","kimi-code":"kimi",opencode:"opencode"};function je(e){let t=e in he?e:Dt[e];return t===void 0?Ue:he[t]}var Lt="/logs/agent",Jt="agent-home.json";function Fe(e){let t=Ne(Lt,e);if(t!==null)return t;let n=e.replace(/^\/+/,"");if(n===Jt)return n;let r=/^(?:root|home\/[^/]+)\/(.+)$/.exec(n);return r!==null?r[1]:`sessions/${n}`}function Ne(e,t){return t.startsWith(`${e}/`)?t.slice(e.length+1):null}function $e(e,t){let n=Fe(t),r=t.replace(/^\/+/,"");e.has(n)&&(n=r);for(let i=2;e.has(n);i++)n=`${r}.${i}`;return e.add(n),n}function Me(e,t){for(let n of e.harborCopies){let r=Ne(n.sandboxRoot,t);if(r!==null)return `${n.agentDir}/${r}`}return null}function Ut(e,t){let n=new Set,r={};for(let i of Object.keys(t).sort()){r[`agent/${$e(n,i)}`]=t[i];let l=Me(e,i);l!==null&&!n.has(l)&&(n.add(l),r[`agent/${l}`]=t[i]);}return Object.fromEntries(Object.keys(r).sort().map(i=>[i,r[i]]))}function te(e){return JSON.stringify(e,null,2)+`
|
|
2
|
-
`}function Be(e,t,n){return {trial_id:e.id,job_id:e.job_id,user_id:n,provider:e.sandbox_provider,gateway:{cost_usd:e.agent_result?.cost_usd??null,n_input_tokens:e.agent_result?.n_input_tokens??null,n_cache_tokens:e.agent_result?.n_cache_tokens??null,n_output_tokens:e.agent_result?.n_output_tokens??null,spend_source:e.spend_source,max_trial_spend_usd:e.max_trial_spend_usd,judge:e.judge_result?{cost_usd:e.judge_result.cost_usd,n_input_tokens:e.judge_result.n_input_tokens,n_cache_tokens:e.judge_result.n_cache_tokens,n_output_tokens:e.judge_result.n_output_tokens,spend_source:e.judge_spend_source??null}:null},regrade_lineage:{is_regrade:t?.is_regrade??false,source_jobs:t?.source_jobs??[],n_retries:e.n_retries,retries:e.retries}}}function jt(e,t){return {job_id:e.id,user_id:t,provider:e.sandbox_provider,gateway:{cost_usd:e.stats.cost_usd??null,judge_cost_usd:e.stats.judge_cost_usd??null,n_unmeasured_trials:e.stats.n_unmeasured_trials??null,n_unmeasured_judge_trials:e.stats.n_unmeasured_judge_trials??null,n_input_tokens:e.stats.n_input_tokens??null,n_cache_tokens:e.stats.n_cache_tokens??null,n_output_tokens:e.stats.n_output_tokens??null,max_trial_spend_usd:e.max_trial_spend_usd,worst_case_spend_usd:e.worst_case_spend_usd},regrade_lineage:{is_regrade:e.is_regrade,source_jobs:e.source_jobs}}}function Ft(e){let t=e.agent_result;return t==null?t??null:ee(e).lane==="measured"?t:{...t,cost_usd:null}}function Nt(e){let{trial:t}=e,n={};n["config.json"]=te({trial_name:t.id,task:{name:t.task_name,source:t.source},agent:{name:t.agent_info.name,version:t.agent_info.version,model_name:t.agent_info.model_info.name,reasoning_effort:t.agent_info.reasoning_effort}}),n["result.json"]=te({trial_name:t.id,task_name:t.task_name,status:t.status,reward:t.reward,verifier_result:t.verifier_result,exception_info:t.exception_info,agent_result:Ft(t),started_at:t.started_at,finished_at:t.finished_at,environment_setup:t.environment_setup,agent_setup:t.agent_setup,agent_execution:t.agent_execution,verifier:t.verifier});let r=je(t.agent_info.name);return e.atif!==null&&(n["agent/trajectory.json"]=e.atif),e.stdout!==null&&(n[`agent/${r.stdoutFile}`]=e.stdout),e.stderr!==null&&(n["agent/stderr.log"]=e.stderr),e.events.length>0&&(n["agent/trace-parsed.jsonl"]=e.events.map(i=>JSON.stringify(i)).join(`
|
|
3
|
-
`)+`
|
|
4
|
-
`),e.home!==null&&Object.assign(n,Ut(r,e.home)),e.verifierLog!==null&&(n["verifier/test-stdout.txt"]=e.verifierLog),t.verifier_result?.rewards&&(n["verifier/reward.json"]=te(t.verifier_result.rewards)),t.exception_info&&(n["exception.txt"]=`${t.exception_info.exception_type}: ${t.exception_info.exception_message}
|
|
5
|
-
`),n["evolve.json"]=te(Be(t,e.job,e.userId)),n}function $t(e,t){return {analysis_id:e.id,analyzed_trial_id:e.trial_id,job_id:e.job_id,task_name:e.task_name,user_id:t,status:e.status,model_name:e.model_name,gateway:{cost_usd:e.estimated_cost_usd,n_input_tokens:e.usage?.input_tokens??null,n_cache_tokens:e.usage?.cached_input_tokens??null,n_output_tokens:e.usage?.output_tokens??null}}}function Mt(e,t,n){return {task_check_id:e.id,check_id:t.id,dataset:t.source.dataset,task_name:e.task_name,user_id:n,provider:t.sandbox_provider,status:e.status,model_name:t.model_name,gateway:{cost_usd:e.cost_usd}}}function Bt(e,t){return {check_id:e.id,user_id:t,source:e.source,provider:e.sandbox_provider,status:e.status,model_name:e.model_name,gateway:{cost_usd:e.cost_usd}}}var A=class extends Error{status;code;param;details;retryAfterSec;requestId;constructor(t,n,r,i){super(r),this.name="EvolveApiError",this.status=t,this.code=n,i?.param!==void 0&&(this.param=i.param),i?.details!==void 0&&(this.details=i.details),i?.retryAfterSec!==void 0&&(this.retryAfterSec=i.retryAfterSec),i?.requestId!==void 0&&(this.requestId=i.requestId);}isKnownCode(){return ye(this.code)}};async function Z(e){let t=await e.text().catch(()=>""),n=e.headers?.get?.("x-request-id")??void 0,r=a(t,e);try{let i=JSON.parse(t);if(i?.error&&typeof i.error=="object"){let l=typeof i.error.code=="string"?i.error.code:"unknown_error",d=typeof i.error.message=="string"?i.error.message:e.statusText;throw new A(e.status,l,d,{param:typeof i.error.param=="string"?i.error.param:void 0,details:i.error.details&&typeof i.error.details=="object"?i.error.details:void 0,retryAfterSec:r,requestId:typeof i.error.requestId=="string"?i.error.requestId:n})}if(typeof i?.error=="string")throw new A(e.status,"unknown_error",i.error,{retryAfterSec:r,requestId:n})}catch(i){if(i instanceof A)throw i}throw new A(e.status,"unknown_error",t||e.statusText,{retryAfterSec:r,requestId:n})}var Se=class extends Error{dataset;constructor(t){super(`Dataset "${t}" has no active version`),this.name="NoActiveVersionError",this.dataset=t;}},ie=class extends Error{name="ImportSettleError";code;importId;dataset;version;state;constructor(t,n,r){super(n),this.code=t,this.importId=r.importId,this.dataset=r.dataset,this.version=r.version,this.state=r.state;}},Xt=1e3,X=3e4,Qt=new Set(["COMPLETED","CANCELLED","FAILED"]),Zt=new Set(["job.completed","job.cancelled","job.failed"]),Q=2e3,en=30*6e4;function I(e,t){let n=t?.apiKey||process.env[M];if(!n)throw new Error(`${e}() requires an API key. Set ${M} or pass { apiKey } in config.`);let r=(t?.baseUrl||process.env.EVOLVE_DASHBOARD_URL||D).replace(/\/$/,"");return {apiKey:n,baseUrl:r,...t?.org?{org:t.org}:{}}}async function _(e,t,n){let r=await fetch(`${e.baseUrl}${t}`,{...n,headers:{Authorization:`Bearer ${e.apiKey}`,...n?.headers}});return r.ok||await Z(r),r}function ne(e){let t=e.indexOf("@");if(t===-1)return {name:e.trim()};let n=e.slice(0,t).trim(),r=e.slice(t+1).trim();if(!n||!r)throw new Error(`Invalid dataset ref "${e}": expected "name" or "name@version"`);return {name:n,version:r}}function Ae(e){return {name:e.name,version:e.version}}function Ge(e){let t=e.kwargs,n=Array.isArray(e.skills)?e.skills.filter(l=>typeof l=="string"):[],r=Array.isArray(e.skill_locks)?e.skill_locks:null,i=r?r.flatMap(l=>{if(!l||typeof l!="object")return [];let d=l;return typeof d.name!="string"||typeof d.digest!="string"?[]:[{name:d.name,source:typeof d.source=="string"?d.source:"",digest:d.digest,git_url:typeof d.git_url=="string"?d.git_url:null,git_commit_id:typeof d.git_commit_id=="string"?d.git_commit_id:null}]}):null;return {name:e.name,model_name:e.model_name,version:e.version??null,reasoning_effort:e.reasoning_effort??null,kwargs:t&&typeof t=="object"&&!Array.isArray(t)?t:null,preset:typeof e.preset=="string"?e.preset:null,skills:n,skill_locks:i}}function tn(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;if(typeof t.name!="string")return null;let n=Array.isArray(t.authors)?t.authors.flatMap(r=>{if(!r||typeof r!="object"||Array.isArray(r))return [];let i=r;return typeof i.name!="string"?[]:[{name:i.name,email:typeof i.email=="string"?i.email:null}]}):[];return {name:t.name,version:typeof t.version=="string"?t.version:null,description:typeof t.description=="string"?t.description:"",authors:n,keywords:Array.isArray(t.keywords)?t.keywords.filter(r=>typeof r=="string"):[],task_count:typeof t.task_count=="number"?t.task_count:null}}function nn(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,n=i=>typeof t[i]=="string"?t[i]:null;switch(n("kind")??(n("commit")!==null?"git":null)){case "git":{let i=n("ref"),l=n("commit");return i===null||l===null?null:{kind:"git",git_url:n("git_url"),ref:i,commit:l,path:n("path")}}case "archive":{let i=n("digest");return i===null?null:{kind:"archive",digest:i}}case "archive_url":{let i=n("archive_url"),l=n("digest");return i===null||l===null?null:{kind:"archive_url",archive_url:i,digest:l}}case "hub_package":{let i=n("hub_package"),l=n("digest");return i===null||l===null?null:{kind:"hub_package",hub_package:i,digest:l}}default:return null}}function q(e){return {version:e.version,state:e.state,created_at:e.created_at,task_count:e.task_count??0,n_failed_tasks:typeof e.n_failed_tasks=="number"?e.n_failed_tasks:0,manifest:tn(e.manifest),source:nn(e.source)}}function Ke(e){return {code:e.code??"",step:e.step??"",message:e.message??"",excerpt:e.excerpt??null}}function sn(e){return Array.isArray(e)?e.filter(t=>t&&typeof t=="object").map(t=>({task_name:t.task_name??"",failure:Ke(t.failure??{})})):[]}function rn(e){return {task_name:e.task_name,agent_timeout_sec:e.agent_timeout_sec,verifier_timeout_sec:e.verifier_timeout_sec,gpus:typeof e.gpus=="number"&&e.gpus>0?e.gpus:0,gpu_types:Array.isArray(e.gpu_types)&&e.gpu_types.length>0?e.gpu_types.map(String):null,providers:e.providers,notes:Array.isArray(e.notes)?e.notes:[]}}function an(e){return {action:e.action,type:e.type,job_id:e.job_id}}function on(e){let t=e&&typeof e=="object"?e:{};return {max_retries:typeof t.max_retries=="number"?t.max_retries:0,include_exceptions:Array.isArray(t.include_exceptions)?t.include_exceptions:null,exclude_exceptions:Array.isArray(t.exclude_exceptions)?t.exclude_exceptions:[],wait_multiplier:typeof t.wait_multiplier=="number"?t.wait_multiplier:1,min_wait_sec:typeof t.min_wait_sec=="number"?t.min_wait_sec:1,max_wait_sec:typeof t.max_wait_sec=="number"?t.max_wait_sec:60}}function ln(e){return {attempt_number:e.attempt_number,exception_info:e.exception_info??{exception_type:"InfrastructureError",exception_message:""},cost_usd:e.cost_usd??null,started_at:e.started_at??null,settled_at:e.settled_at??null}}function Y(e){return typeof e=="number"?e:null}function un(e){return Array.isArray(e)?e.filter(t=>t&&typeof t=="object").map(t=>{let n=typeof t.n_tasks_ran=="number"?t.n_tasks_ran:0;return {dataset:Ae(t.dataset??{}),n_tasks_ran:n,n_tasks_selected:typeof t.n_tasks_selected=="number"?t.n_tasks_selected:n,n_tasks_failed_to_build:typeof t.n_tasks_failed_to_build=="number"?t.n_tasks_failed_to_build:0,failed_task_names:Array.isArray(t.failed_task_names)?t.failed_task_names.map(String):[],note:t.note??""}}):[]}function cn(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;if(typeof t.uploaded_at!="string")return null;let n=t.reported_totals,r=l=>typeof l=="number"&&Number.isFinite(l)?l:null,i=n&&typeof n=="object"&&!Array.isArray(n)&&Number.isInteger(n.n_trials_reporting)?{cost_usd:r(n.cost_usd),n_input_tokens:r(n.n_input_tokens),n_cache_tokens:r(n.n_cache_tokens),n_output_tokens:r(n.n_output_tokens),n_trials_reporting:n.n_trials_reporting}:null;return {original_job_id:typeof t.original_job_id=="string"?t.original_job_id:null,original_job_name:typeof t.original_job_name=="string"?t.original_job_name:null,uploaded_at:t.uploaded_at,reported_totals:i,task_links:We(t.task_links),datasets:dn(t.datasets)}}var ze=e=>typeof e=="string"&&me.includes(e),ve=e=>typeof e=="string"&&_e.includes(e),Re=e=>Array.isArray(e)&&e.every(t=>typeof t=="string")?[...e]:null;function We(e){if(!Array.isArray(e))return null;let t=[];for(let n of e){if(!n||typeof n!="object"||Array.isArray(n))return null;let r=n;if(typeof r.task_name!="string"||!ze(r.linked_by)||![r.n_trials,r.n_linked,r.n_unlinked].every(g=>Number.isInteger(g)&&g>=0))return null;let l=Re(r.datasets),d=Re(r.candidates);if(l===null||d===null||!r.link_reasons||typeof r.link_reasons!="object"||Array.isArray(r.link_reasons))return null;let u={};for(let[g,s]of Object.entries(r.link_reasons)){if(!ve(g)||!Number.isInteger(s))return null;u[g]=s;}t.push({task_name:r.task_name,n_trials:r.n_trials,n_linked:r.n_linked,n_unlinked:r.n_unlinked,linked_by:r.linked_by,datasets:l,link_reasons:u,candidates:d});}return t}function dn(e){if(!Array.isArray(e)||e.length===0)return null;let t=[];for(let n of e){if(typeof n!="object"||n===null)return null;let{name:r,version:i,path:l}=n;if(!(r===void 0&&typeof l=="string")){if(typeof r!="string"||r==="")return null;t.push({name:r,version:typeof i=="string"?i:null});}}return t.length>0?t:null}function gn(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;if(!ze(t.linked_by)||t.link_reason!==null&&t.link_reason!==void 0&&!ve(t.link_reason))return null;let n=t.candidates===void 0?[]:Re(t.candidates);return n===null?null:{linked_by:t.linked_by,link_reason:ve(t.link_reason)?t.link_reason:null,dataset:typeof t.dataset=="string"?t.dataset:null,version:typeof t.version=="string"?t.version:null,task_digest:typeof t.task_digest=="string"?t.task_digest:null,candidates:n}}var pn=["creator","member","shared","link"];function mn(e){return typeof e=="string"&&pn.includes(e)}function E(e){let t=e.trials??{};return {kind:"job",id:e.id,job_name:e.job_name,status:e.status,datasets:(e.datasets??[]).map(Ae),agents:(e.agents??[]).map(Ge),n_attempts:e.n_attempts,n_concurrent_trials:e.n_concurrent_trials,max_trial_spend_usd:e.max_trial_spend_usd,worst_case_spend_usd:e.worst_case_spend_usd,retry:on(e.retry),analyze:e.analyze&&typeof e.analyze=="object"&&!Array.isArray(e.analyze)?e.analyze:null,timeout_multiplier:typeof e.timeout_multiplier=="number"?e.timeout_multiplier:1,agent_timeout_multiplier:Y(e.agent_timeout_multiplier),verifier_timeout_multiplier:Y(e.verifier_timeout_multiplier),agent_setup_timeout_multiplier:Y(e.agent_setup_timeout_multiplier),environment_build_timeout_multiplier:Y(e.environment_build_timeout_multiplier),sandbox_provider:e.sandbox_provider??null,org:typeof e.org=="string"?e.org:null,visibility:e.visibility==="LINK"?"LINK":"PRIVATE",viewer:mn(e.viewer)?e.viewer:null,system_log:e.system_log===true,counts:e.counts,build_exclusions:un(e.build_exclusions),n_total_trials:e.n_total_trials??0,trials:{total:t.total??0,byStatus:t.byStatus??{}},stats:e.stats??{},failure:e.failure??null,source_jobs:(e.source_jobs??[]).map(an),is_regrade:e.is_regrade===true,upload:cn(e.upload),idempotent_replay:e.idempotent_replay===true,started_at:e.started_at,updated_at:e.updated_at,finished_at:e.finished_at??null}}function R(e,t){let n=e??{};return {items:Array.isArray(n.items)?n.items.map(t):[],nextCursor:n.nextCursor??null,hasMore:n.hasMore===true}}function w(e,t){let n=new URLSearchParams;e?.limit!==void 0&&n.set("limit",String(e.limit)),e?.cursor&&n.set("cursor",e.cursor);for(let[i,l]of Object.entries(t??{}))l!==void 0&&n.set(i,l);let r=n.toString();return r?`?${r}`:""}function L(e){if(!e||typeof e!="object")return null;let t=e;return {started_at:t.started_at??null,finished_at:t.finished_at??null}}function _n(e){let t=e.model_info??{};return {name:e.name,version:e.version??null,model_info:{name:t.name,provider:t.provider??null},reasoning_effort:e.reasoning_effort??null}}function oe(e){return !e||typeof e!="object"||Array.isArray(e)?null:{...e,usage:B(e.usage)}}function fn(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let{from:t,to:n,reason:r}=e;return typeof t!="string"||typeof n!="string"||typeof r!="string"?null:{from:t,to:n,reason:r}}function xe(e){return {id:e.id,job_id:e.job_id,task_name:e.task_name,source:e.source,agent_info:_n(e.agent_info||{}),attempt:e.attempt,status:e.status,reward:e.reward??null,verifier_result:e.verifier_result??null,exception_info:e.exception_info??null,agent_result:e.agent_result??null,judge_result:e.judge_result??null,analysis:oe(e.analysis),environment_setup:L(e.environment_setup),agent_setup:L(e.agent_setup),agent_execution:L(e.agent_execution),verifier:L(e.verifier),queue_wait:L(e.queue_wait),harness_bundle:L(e.harness_bundle),image_prepare:L(e.image_prepare),shared_verify_setup:L(e.shared_verify_setup),harness_bundle_cache_hit:typeof e.harness_bundle_cache_hit=="boolean"?e.harness_bundle_cache_hit:null,step_results:e.step_results??null,spend_source:e.spend_source??null,judge_spend_source:e.judge_spend_source??null,live_spent_usd:e.live_spent_usd??null,live_spend_at:e.live_spend_at??null,usage:B(e.usage),max_trial_spend_usd:e.max_trial_spend_usd??null,sandbox_provider:e.sandbox_provider??null,sandbox_provider_degrade:fn(e.sandbox_provider_degrade),gpu_cost:e.gpu_cost&&typeof e.gpu_cost=="object"&&!Array.isArray(e.gpu_cost)?e.gpu_cost:null,sandbox_id:e.sandbox_id??null,verifier_sandbox_id:e.verifier_sandbox_id??null,verifier_environment_mode:e.verifier_environment_mode??null,attempt_phase:e.attempt_phase??null,n_retries:e.n_retries??0,retries:Array.isArray(e.retries)?e.retries.map(ln):[],session_ref:e.session_ref??null,upload:bn(e.upload),started_at:e.started_at??null,finished_at:e.finished_at??null}}function bn(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;if(typeof t.original_trial_name!="string"||typeof t.original_task_name!="string")return null;let n=t.reported_agent_result,r=i=>typeof i=="number"&&Number.isFinite(i)?i:null;return {original_trial_id:typeof t.original_trial_id=="string"?t.original_trial_id:null,original_trial_name:t.original_trial_name,original_task_name:t.original_task_name,reported_agent_result:n&&typeof n=="object"&&!Array.isArray(n)?{n_input_tokens:r(n.n_input_tokens),n_cache_tokens:r(n.n_cache_tokens),n_output_tokens:r(n.n_output_tokens),cost_usd:r(n.cost_usd)}:null,link:gn(t.link)}}function se(e){return {name:e.name,org:typeof e.org=="string"?e.org:null,source:e.source,run_command:e.run_command,env:e.env??{},created_at:e.created_at,updated_at:e.updated_at}}function V(e){let t={id:e.id,status:e.status,name:e.name,version:e.version,failure:e.failure??null,warnings:e.warnings??[],progress:e.progress??null};return typeof e.receiving=="boolean"&&(t.receiving=e.receiving),typeof e.task_count=="number"&&(t.task_count=e.task_count),typeof e.created_at=="string"&&(t.created_at=e.created_at),typeof e.updated_at=="string"&&(t.updated_at=e.updated_at),t}function W(e){let t={id:e.id,status:e.status,receiving:e.receiving===true,source:e.source??null,dataset:e.dataset??null,job_id:e.job_id??null,n_trials_uploaded:e.n_trials_uploaded??null,n_trials_skipped:e.n_trials_skipped??null,skipped_trials:Array.isArray(e.skipped_trials)?e.skipped_trials:null,task_links:We(e.task_links),failure:e.failure??null,progress:e.progress??null};return typeof e.created_at=="string"&&(t.created_at=e.created_at),typeof e.updated_at=="string"&&(t.updated_at=e.updated_at),t}function Ye(e){let t=e??{};return {scored:t.scored??0,total:t.total??0}}function yn(e){return {id:e.id,datasets:(e.datasets??[]).map(Ae),status:e.status,mean_reward:e.mean_reward??null,coverage:Ye(e.coverage),cost_usd:e.cost_usd??0,agents:(e.agents||[]).map(Ge),started_at:e.started_at}}function hn(e){return {job_id:e.job_id,status:e.status,mean_reward:e.mean_reward??null,coverage:Ye(e.coverage)}}function kn(e){return {task_name:e.task_name,disagreement:e.disagreement===true,cells:(e.cells||[]).map(hn)}}function Xe(e){return {seq:e.seq,type:e.type,data:e.data??{}}}function Qe(e){return (Array.isArray(e)?e:[]).map((n,r)=>({seq:fe+r,type:"usage",data:n&&typeof n=="object"&&!Array.isArray(n)?n:{}}))}function Sn(e){return {trial_id:e.trial_id,task_name:e.task_name??null,match_count:e.match_count,events:(e.events||[]).map(Xe)}}function Te(e){return e?e.suffix!==void 0?`bytes=-${e.suffix}`:e.start===void 0?null:`bytes=${e.start}-${e.end??""}`:null}function J(e){if(e?.aborted)throw e.reason instanceof Error?e.reason:new Error("Watch aborted")}function qe(e,t){return t?.aborted?true:e?.name==="AbortError"}function x(e,t){return new Promise((n,r)=>{let i=setTimeout(()=>{t?.removeEventListener("abort",l),n();},e),l=()=>{clearTimeout(i),r(t?.reason instanceof Error?t.reason:new Error("Watch aborted"));};t?.addEventListener("abort",l,{once:true});})}function Ze(e){let t="",n=false;return {push(r){n&&(r="\r"+r,n=false),r.endsWith("\r")&&(r=r.slice(0,-1),n=true),t+=r.replace(/\r\n|\r/g,`
|
|
6
|
-
`);let i;for(;(i=t.indexOf(`
|
|
7
|
-
|
|
8
|
-
`))!==-1;){let l=t.slice(0,i);t=t.slice(i+2);let d,u,g=[];for(let s of l.split(`
|
|
9
|
-
`)){if(!s||s.startsWith(":"))continue;let a=s.indexOf(":"),o=a===-1?s:s.slice(0,a),c=a===-1?"":s.slice(a+1);c.startsWith(" ")&&(c=c.slice(1)),o==="id"?d=c:o==="event"?u=c:o==="data"&&g.push(c);}(d!==void 0||u!==void 0||g.length>0)&&e({id:d,event:u,data:g.join(`
|
|
10
|
-
`)});}}}}async function*Ve(e,t,n){let r=await _(e,t,{headers:{Accept:"text/event-stream",...n?.lastEventId!==void 0?{"Last-Event-ID":n.lastEventId}:{}},signal:n?.signal});if(!r.body)throw new Error("Event stream response has no body");let i=[],l=Ze(g=>{i.push({event:g.event||"message",...g.id!==void 0?{id:g.id}:{},data:g.data?ot(g.data):{}});}),d=r.body.getReader(),u=new TextDecoder;try{for(;;){let{done:g,value:s}=await d.read();if(g)break;for(l.push(u.decode(s,{stream:!0}));i.length>0;)yield i.shift();}}finally{d.cancel().catch(()=>{});}}function j(e){let t=new URLSearchParams;for(let[r,i]of Object.entries(e))i!==void 0&&t.set(r,String(i));let n=t.toString();return n?`?${n}`:""}function et(e){return e.split("/").filter(Boolean).map(encodeURIComponent).join("/")}function we(e,t){return {async status(){return await(await _(e,`${t}/filesystem`)).json()},async list(n){return await(await _(e,`${t}/filesystem/files${j({path:n?.path,source:n?.source,cursor:n?.cursor,limit:n?.limit})}`)).json()},async read(n,r){let i=Te(r?.range),l=await _(e,`${t}/filesystem/files/${et(n)}${j({source:r?.source})}`,i?{headers:{Range:i}}:void 0);return Buffer.from(await l.arrayBuffer())},async search(n){return await(await _(e,`${t}/filesystem/search${j({q:n.q,path:n.path,regex:n.regex,limit:n.limit,source:n.source})}`)).json()},async changes(n){return await(await _(e,`${t}/filesystem/changes${j({source:n?.source,phase:n?.phase,cursor:n?.cursor,limit:n?.limit})}`)).json()},archive:(async n=>ce(e,`${t}/filesystem/archive${j({path:n?.path,source:n?.source})}`,n,"filesystem.tar.gz")),async watch(n){return await(await _(e,`${t}/filesystem/watch`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({paths:n})})).json()},events(n){return Ve(e,`${t}/filesystem/events`,n)},async logs(n){return await(await _(e,`${t}/logs${j({stream:n.stream,cursor:n.cursor,limit:n.limit})}`)).json()},logEvents(n){return Ve(e,`${t}/logs/events`,n)},async procs(){return await(await _(e,`${t}/procs`)).json()}}}function vn(e,t){return {async status(){return await(await _(e,`${t}/filesystem`)).json()},async list(n){return await(await _(e,`${t}/filesystem/files${j({path:n?.path,cursor:n?.cursor,limit:n?.limit})}`)).json()},async read(n,r){let i=Te(r?.range),l=await _(e,`${t}/filesystem/files/${et(n)}`,i?{headers:{Range:i}}:void 0);return Buffer.from(await l.arrayBuffer())}}}function P(e,t){let n,r=()=>n??=e({limit:t?.limit,cursor:t?.cursor});return {then(i,l){return r().then(i,l)},catch(i){return r().catch(i)},finally(i){return r().finally(i)},async*[Symbol.asyncIterator](){let i=t?.cursor;for(;;){let l=await e({limit:t?.limit,cursor:i});for(let d of l.items)yield d;if(!l.nextCursor)return;i=l.nextCursor;}}}}function F(e){let t=new FormData;for(let[n,r]of Object.entries(e))r!==void 0&&t.set(n,r);return t}async function Rn(e){let{readFileSync:t,readdirSync:n,statSync:r}=await import('fs'),{basename:i,join:l,resolve:d}=await import('path'),u=d(e),g=m=>r(m,{throwIfNoEntry:false})?.isFile()===true,s=m=>r(m,{throwIfNoEntry:false})?.isDirectory()===true;if(!s(u))throw new Error(`datasets().preflight(): not a directory: ${u}`);let a=[],o=u;if(g(l(u,"task.toml"))){let m=n(u,{withFileTypes:true}).filter(p=>p.isDirectory()&&!p.name.startsWith(".")).filter(p=>g(l(u,p.name,"task.toml"))).map(p=>p.name);if(s(l(u,"tasks"))||m.length>0)throw new Error(`${u} is ambiguous: it carries task.toml at its root (a single-task shape) AND corpus-shaped content \u2014 the import refuses this too; point at the one task directory or at a corpus of task directories, not a mix`);a.push({name:i(u),dir:u});}else {o=s(l(u,"tasks"))?l(u,"tasks"):u;for(let m of n(o,{withFileTypes:true})){if(!m.isDirectory()||m.name.startsWith("."))continue;let p=l(o,m.name);if(!g(l(p,"task.toml")))throw new Error(`${p} has no task.toml \u2014 every directory of a corpus must be a task directory (the import fails on it rather than skipping it)`);a.push({name:m.name,dir:p});}if(a.length===0)throw new Error(`${o} holds no task directories \u2014 nothing to check`);a.sort((m,p)=>m.name<p.name?-1:m.name>p.name?1:0);}let c=(o===u?[u]:[o,u]).map(m=>l(m,"dataset.toml")).find(g);return {tasks:a.map(({name:m,dir:p})=>({name:m,task_toml:t(l(p,"task.toml"),"utf8")})),...c!==void 0?{dataset_toml:t(c,"utf8")}:{}}}async function xn(e,t,n){let{postMultipartFile:r}=await import('./upload-KPYDMWFJ.js'),i=await r({url:`${e.baseUrl}${t}`,method:n.method??"POST",headers:{Authorization:`Bearer ${e.apiKey}`},fields:n.fields,file:n.file,...n.onBytes!==void 0?{onBytes:n.onBytes}:{}});return i.ok||await Z(i),i}async function tt(e,t,n,r){if(r.resumableThreshold!==void 0){let{stat:i}=await import('fs/promises'),{size:l}=await i(n);if(l>r.resumableThreshold){let{uploadArchiveResumable:d}=await import('./resumable-HFSICSH3.js'),u=await d({baseUrl:e.baseUrl,headers:{Authorization:`Bearer ${e.apiKey}`},file:{path:n},fields:r.fields,...r.resumablePath!==void 0?{sessionsPath:r.resumablePath}:{},...r.onBytes!==void 0?{onBytes:r.onBytes}:{},...r.onRegistered!==void 0?{onRegistered:r.onRegistered}:{}});return u.ok||await Z(u),u}}return await xn(e,t,{method:r.method,fields:r.fields,file:{path:n,filename:r.filename},...r.onBytes!==void 0?{onBytes:r.onBytes}:{}})}async function H(e,t,n){let{tarGzipDirectoryToFile:r}=await import('./tar-GVC4KE52.js'),{mkdtemp:i,rm:l}=await import('fs/promises'),{tmpdir:d}=await import('os'),{join:u}=await import('path'),g=await i(u(d(),"evolve-upload-"));try{let s=u(g,n.filename);return await r(n.directory,s),await tt(e,t,s,n)}finally{await l(g,{recursive:true,force:true});}}function An(e){let t,n=()=>(t||(t=(async()=>{let r=await e.next();for(;!r.done;)r=await e.next();return r.value})()),t);return {then(r,i){return n().then(r,i)},catch(r){return n().catch(r)},finally(r){return n().finally(r)},[Symbol.asyncIterator](){return e}}}var nt="x-package-sha256",le=class extends Error{constructor(n,r){super(`downloaded bytes do not match the digest the server stated (expected ${n}, got ${r})`);this.expected=n;this.actual=r;}name="EvolveDigestMismatchError"},ue=class extends Error{constructor(n,r){super(`download ended early: the server declared ${n} bytes and ${r} arrived`);this.expectedBytes=n;this.receivedBytes=r;}name="EvolveIncompleteDownloadError"};function st(e,t){let n=e.headers.get("Content-Length");if(n===null)return;let r=Number(n);if(Number.isFinite(r)&&t!==r)throw new ue(r,t)}async function rt(e,t){let n=e.headers.get(nt);if(!n)return;let{createHash:r}=await import('crypto'),i=r("sha256").update(t).digest("hex");if(i!==n)throw new le(n,i)}function Tn(e,t){let r=(e.headers.get("Content-Disposition")||"").match(/filename="([^"]+)"/);if(!r)return t;let i=basename(r[1]);return i===""||i==="."||i===".."||/[/\\]/.test(i)||/[\u0000-\u001f]/.test(i)?t:i}async function at(e,t,n){if(!e.body)throw new Error("Download response has no body");await mkdir(t,{recursive:true});let r=join(t,Tn(e,n)),{createHash:i,randomBytes:l}=await import('crypto'),d=`${r}.${l(8).toString("hex")}.part`,u=i("sha256"),g=0,s=Readable.fromWeb(e.body);s.on("data",a=>{u.update(a),g+=a.length;});try{await pipeline(s,createWriteStream(d));let a=e.headers.get("Content-Length");if(a!==null&&g!==Number(a))throw new ue(Number(a),g);let o=e.headers.get(nt),c=u.digest("hex");if(o&&c!==o)throw new le(o,c);await rename(d,r);}catch(a){throw await rm(d,{force:true}).catch(()=>{}),a}return r}async function ce(e,t,n,r){let i=await _(e,t);if(n?.stream){if(!i.body)throw new Error("Download response has no body");return i.body}if(n?.to)return at(i,n.to,r);let l=Buffer.from(await i.arrayBuffer());return st(i,l.length),await rt(i,l),l}function wn(e){let t=I("datasets",e);async function n(s){let a=await _(t,`/api/datasets/imports/${encodeURIComponent(s)}`);return V(await a.json())}function r(s){if(!s||typeof s!="object")return null;let a=s;return {git_url:a.git_url??null,ref:a.ref,current_commit:a.current_commit,path:a.path??null,latest_commit:a.latest_commit??null,acked_commit:a.acked_commit??null,moved:a.moved===true,behind_by:typeof a.behind_by=="number"?a.behind_by:null,checked_at:a.checked_at??null,error:a.error??null,auto_import:a.auto_import===true}}function i(s){return {name:s.name,title:s.title??null,description:s.description??null,active_version:s.active_version?q(s.active_version):null,latest_version:s.latest_version?q(s.latest_version):null,versions:(s.versions||[]).map(q),selected_version:s.selected_version?q(s.selected_version):null,tasks:R(s.tasks,rn),failed_tasks:sn(s.failed_tasks),upstream:r(s.upstream),created_at:s.created_at,updated_at:s.updated_at}}async function l(s,a){let o=ne(s),c=w(a,{version:o.version}),m=await _(t,`/api/datasets/${encodeURIComponent(o.name)}${c}`);return i(await m.json())}async function d(s,a){let o=a?.pollIntervalMs??Q,c=a?.settleTimeoutMs??en,m=Date.now()+c,p=`${s.name}@${s.version}`,b=null,f=null,k=()=>f?.state==="FAILED"?new ie("settle_timeout",`Import ${s.id}'s dataset "${s.name}" version "${s.version}" settled FAILED, but the final import read kept answering rate-limited/unavailable past the ${c}ms settle budget. Read the failure with datasets().getImport("${s.id}").`,{importId:s.id,dataset:s.name,version:s.version,state:f.state}):new ie("settle_timeout",`Import ${s.id} completed, but dataset "${s.name}" version "${s.version}" did not settle within ${c}ms: last observed state ${f?.state??"never observed"}. Keep following with datasets().get("${p}").`,{importId:s.id,dataset:s.name,version:s.version,state:f?.state??null}),y=async S=>{for(;;){J(a?.signal);try{return await S()}catch(h){if(!(h instanceof A)||h.status!==429&&h.status!==503)throw h;let $=m-Date.now();if($<=0)throw k();await x(Math.min(Math.max((h.retryAfterSec??0)*1e3,o),$),a?.signal);}}};for(;;){J(a?.signal);let S=await y(()=>l(p,{limit:1})),h=S.selected_version;if(h){if(f=h,h.state!==b&&(b=h.state,a?.onVersion?.(h,S)),h.state==="FAILED")return y(()=>n(s.id));if(h.state==="READY"||h.state==="ARCHIVED")return s}if(Date.now()>=m)throw k();await x(o,a?.signal);}}function u(s){return {name:s.name,title:s.title??null,description:s.description??null,active_version:s.active_version?q(s.active_version):null,latest_version:s.latest_version?q(s.latest_version):null,upstream:r(s.upstream)}}async function g(s){let a=await _(t,`/api/datasets${w(s,{search:s?.search})}`);return R(await a.json(),u)}return {list(s){return P(a=>g({...a,search:s?.search}),s)},get:l,async getActive(s,a){let o=await l(s,a);if(o.active_version===null)throw new Se(s);return {name:o.name,title:o.title,description:o.description,active_version:o.active_version,version:o.active_version.version,tasks:o.tasks??{items:[],nextCursor:null,hasMore:false},versions:o.versions??[],created_at:o.created_at,updated_at:o.updated_at}},async getTaskBuild(s,a){let o=ne(s);if(o.version===void 0)throw new Error(`datasets().getTaskBuild() needs "name@version" \u2014 a task's build outcome belongs to one immutable version (got "${s}")`);let m=await(await _(t,`/api/datasets/${encodeURIComponent(o.name)}/versions/${encodeURIComponent(o.version)}/tasks/${encodeURIComponent(a)}/build`)).json();return {task_name:m.task_name??a,state:m.state,failure:m.failure&&typeof m.failure=="object"?Ke(m.failure):null,build_log_ref:m.build_log_ref??null}},async preflight(s){let a=s?.source?.directory;if(typeof a!="string"||a==="")throw new Error("datasets().preflight() requires { source: { directory } } \u2014 a local corpus directory whose task.toml files are checked server-side before any upload");let o=await Rn(a);return await(await _(t,"/api/datasets/preflight",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)})).json()},async publish(s,a){let o=s.source,c=s.org??t.org;if(o?.directory){if(s.name===void 0||s.version===void 0){let{existsSync:p}=await import('fs'),{join:b}=await import('path');if(!(p(b(o.directory,"dataset.toml"))||p(b(o.directory,"tasks","dataset.toml"))))throw new Error(`datasets().publish() needs ${s.name===void 0?"a name":"a version"} \u2014 pass it explicitly, or add a dataset.toml manifest to the corpus directory (the server then derives name and version from it)`)}let m=await H(t,"/api/datasets/publish",{fields:{name:s.name,version:s.version,org:c},directory:o.directory,filename:"corpus.tar.gz",...a?.onUploadProgress!==void 0?{onBytes:a.onUploadProgress}:{},...a?.onRegistered!==void 0?{onRegistered:a.onRegistered}:{},resumableThreshold:b});return V(await m.json())}if(o&&"archive_url"in o&&o.archive_url){if(s.name===void 0||s.version===void 0)throw new Error("datasets().publish() requires name and version for an archive_url source \u2014 the server fetches the tarball only after the publish is accepted, so a manifest cannot supply them");let m=await _(t,"/api/datasets/publish",{method:"POST",body:F({name:s.name,version:s.version,archive_url:o.archive_url,org:c})});return V(await m.json())}if(o&&"hub_package"in o&&o.hub_package){let m=await _(t,"/api/datasets/publish",{method:"POST",body:F({...s.name!==void 0?{name:s.name}:{},...s.version!==void 0?{version:s.version}:{},hub_package:o.hub_package,org:c})});return V(await m.json())}if(o&&"git_url"in o&&o.git_url){if(s.name===void 0||s.version===void 0)throw new Error("datasets().publish() requires name and version for a git source \u2014 a dataset.toml manifest can only supply them for a directory source, because a git repository is cloned server-side after the publish is accepted");let m=await _(t,"/api/datasets/publish",{method:"POST",body:F({name:s.name,version:s.version,git_url:o.git_url,git_ref:o.git_ref,...o.git_path!==void 0?{git_path:o.git_path}:{},org:c})});return V(await m.json())}throw new Error("datasets().publish() requires a source: a git source ({ source: { git_url, git_ref } }), a local corpus directory ({ source: { directory } }), a public tarball url ({ source: { archive_url } }), or a Harbor hub package ({ source: { hub_package } }); plus name and version (optional for a directory whose corpus carries a dataset.toml manifest, and for a hub package, which supplies its own defaults)")},getImport:n,async watchImport(s,a){let o=a?.pollIntervalMs??Q,c=null,m=null;for(;;){J(a?.signal);let p;try{p=await n(s);}catch(f){if(f instanceof A&&(f.status===429||f.status===503)){await x(Math.max((f.retryAfterSec??0)*1e3,o),a?.signal);continue}throw f}let b=`${p.status}${p.receiving===true?":receiving":""}`;if(b!==c&&(c=b,a?.onStatus?.(p)),p.progress!==null){let f=JSON.stringify(p.progress);f!==m&&(m=f,a?.onProgress?.(p.progress,p));}if(p.status==="FAILED")return p;if(p.status==="COMPLETED")return d(p,a);await x(o,a?.signal);}},download:(async(s,a)=>{let o=ne(s),c=o.version?`?version=${encodeURIComponent(o.version)}`:"",m=await _(t,`/api/datasets/${encodeURIComponent(o.name)}/download${c}`);if(a?.stream){if(!m.body)throw new Error("Package response has no body");return m.body}if(a?.to)return at(m,a.to,`${o.name}-corpus.tar.gz`);let p=Buffer.from(await m.arrayBuffer());return st(m,p.length),await rt(m,p),p}),listImports(s){return P(async a=>{let o=new URLSearchParams;a.limit!==void 0&&o.set("limit",String(a.limit)),a.cursor!==void 0&&o.set("cursor",a.cursor),s?.status!==void 0&&o.set("status",s.status),s?.dataset!==void 0&&o.set("dataset",s.dataset);let c=o.toString()?`?${o}`:"",m=await _(t,`/api/datasets/imports${c}`);return R(await m.json(),V)},s)},async activate(s,a){let o=await _(t,`/api/datasets/${encodeURIComponent(s)}/versions/${encodeURIComponent(a)}/activate`,{method:"POST"});return i(await o.json())},async update(s,a){let o=await _(t,`/api/datasets/${encodeURIComponent(s)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});return u(await o.json())},async delete(s){await _(t,`/api/datasets/${encodeURIComponent(s)}`,{method:"DELETE"});},taskFiles(s,a){let o=ne(s);if(o.version===void 0)throw new Error(`datasets().taskFiles() needs "name@version" \u2014 a task's files belong to one immutable version (got "${s}")`);return vn(t,`/api/datasets/${encodeURIComponent(o.name)}/versions/${encodeURIComponent(o.version)}/tasks/${encodeURIComponent(a)}`)}}}function En(e){let t=I("agents",e);return {async create(n){let r=He("agents().create()",{...n,org:n.org??t.org}),i=r.directory?await H(t,"/api/agents",{fields:r.fields,directory:r.directory,filename:"source.tar.gz"}):await _(t,"/api/agents",{method:"POST",body:F(r.fields)});return se(await i.json())},list(n){return P(async r=>{let i=await _(t,`/api/agents${w(r,{scope:n?.scope})}`);return R(await i.json(),se)},n)},async get(n){let r=await _(t,`/api/agents/${encodeURIComponent(n)}`);return se(await r.json())},async delete(n){await _(t,`/api/agents/${encodeURIComponent(n)}`,{method:"DELETE"});},async upsert(n,r){let i=He("agents().upsert()",{...r,name:n,org:r.org??t.org}),l=i.directory?await H(t,`/api/agents/${encodeURIComponent(n)}`,{method:"PUT",fields:i.fields,directory:i.directory,filename:"source.tar.gz"}):await _(t,`/api/agents/${encodeURIComponent(n)}`,{method:"PUT",body:F(i.fields)});return se(await l.json())}}}function He(e,t){let n=typeof t.install_script=="string",r=typeof t.directory=="string";if(n&&r)throw new Error(`${e} takes EITHER an install script ({ install_script }) or a local directory ({ directory }), not both`);if(!n&&!r)throw new Error(`${e} requires either an install script ({ install_script }) or a local directory ({ directory }), plus run_command`);let i={name:t.name,org:t.org,run_command:t.run_command,...t.env!==void 0?{env:JSON.stringify(t.env)}:{},...n?{install_script:t.install_script}:{}};return r?{fields:i,directory:t.directory}:{fields:i}}function ke(e){return {id:e.id,name:e.name,org:typeof e.org=="string"?e.org:null,digest:e.digest,size_bytes:e.size_bytes??0,description:e.description??null,ref:e.ref??`upload:${e.id}`,created_at:e.created_at}}function Pn(e){let t=I("skills",e);return {async upload(n,r){if(typeof n!="string"||!n.trim())throw new Error("skills().upload() requires a local skill directory path");let{basename:i,resolve:l}=await import('path'),d=i(l(n)),g=await(await H(t,"/api/skills",{fields:{name:d||void 0,org:r?.org??t.org},directory:n,filename:"skill.tar.gz"})).json();return (Array.isArray(g.skills)?g.skills:[g]).map(ke)},list(n){return P(async r=>{let i=await _(t,`/api/skills${w(r,{scope:n?.scope})}`);return R(await i.json(),ke)},n)},async get(n){let i=await(await _(t,`/api/skills/${encodeURIComponent(n)}`)).json();return {...ke(i),skill_md:i.skill_md??null}},async delete(n){await _(t,`/api/skills/${encodeURIComponent(n)}`,{method:"DELETE"});}}}function Cn(e){let t=I("jobs",e);async function n(s){let a=await _(t,`/api/jobs/${encodeURIComponent(s)}`);return E(await a.json())}async function r(s){let a=await _(t,`/api/jobs/imports/${encodeURIComponent(s)}`);return W(await a.json())}function i(s){return s.kind!=="check"?E(s):{...s,kind:"check",visibility:s.visibility==="LINK"?"LINK":"PRIVATE",cost_usd:Y(s.cost_usd),finished_at:s.finished_at??null}}async function l(s){let a=await _(t,`/api/jobs${w(s,{search:s?.search,scope:s?.scope,kind:s?.kind})}`);return R(await a.json(),i)}function d(s){let a=s.trials??{};return {task_name:s.task_name,source:s.source,trials:{total:a.total??0,byStatus:a.byStatus??{}},mean_reward:s.mean_reward??null,cost_usd:s.cost_usd??null,check:s.check&&typeof s.check=="object"&&!Array.isArray(s.check)?s.check:null}}async function u(s,a){let o=w(a,{status:a?.status?.length?a.status.join(","):void 0,dataset:a?.dataset}),c=await _(t,`/api/jobs/${encodeURIComponent(s)}/trials${o}`);return R(await c.json(),xe)}async function*g(s,a$1){let{onEvent:o,signal:c}=a$1??{},m=a$1?.reconnectDelayMs??Xt,p=a$1?.maxReconnectDelayMs??X,b=null,f=false,k=false,y=m;for(;!f;){J(c);let S;try{S=await fetch(`${t.baseUrl}/api/jobs/${encodeURIComponent(s)}/events`,{headers:{Authorization:`Bearer ${t.apiKey}`,Accept:"text/event-stream",...b!==null?{"Last-Event-ID":String(b)}:{}},signal:c});}catch(v){if(qe(v,c))throw v;await x(y,c),y=Math.min(y*2,p);continue}if(!S.ok){if(S.status===429||S.status>=500){let v=await S.text().catch(()=>""),C=a(v,S)??0,U=C>0?Math.max(C*1e3,y):y;await x(U,c),y=Math.min(y*2,p);continue}await Z(S);}if(!S.body)throw new Error("Event stream response has no body");let h=false,$=[],mt=Ze(v=>{let C=Number(v.id),U={seq:Number.isInteger(C)?C:-1,type:v.event||"message",data:v.data?ot(v.data):{}};Number.isInteger(C)&&(b=C),h=true,Zt.has(U.type)&&(f=true),$.push(U);}),Ce=S.body.getReader(),_t=new TextDecoder;try{for(;!f;){let{done:v,value:C}=await Ce.read();if(v)break;mt.push(_t.decode(C,{stream:!0}));for(let U of $)o?.(U),yield U;$.length=0;}}catch(v){if(qe(v,c))throw v}finally{await Ce.cancel().catch(()=>{});}if(f)break;J(c);let Ie=await n(s);if(Qt.has(Ie.status)){if(k)return Ie;k=true;continue}h&&(y=m),await x(y,c),y=Math.min(y*2,p);}return n(s)}return {async start(s,a){let o=s.org??t.org,c=o!==void 0?{...s,org:o}:s,m=await _(t,"/api/jobs",{method:"POST",headers:{"Content-Type":"application/json",...a?.idempotencyKey?{"Idempotency-Key":a.idempotencyKey}:{}},body:JSON.stringify(c)});return E(await m.json())},get:n,list(s){return P(a=>l({...a,search:s?.search,scope:s?.scope,kind:s?.kind}),s)},trials(s,a){return P(o=>u(s,{...o,status:a?.status,dataset:a?.dataset}),a)},tasks(s,a){return P(async o=>{let c=await _(t,`/api/jobs/${encodeURIComponent(s)}/tasks${w(o)}`);return R(await c.json(),d)},a)},watch(s,a){return An(g(s,a))},async cancel(s){let a=await _(t,`/api/jobs/${encodeURIComponent(s)}/cancel`,{method:"POST"});return E(await a.json())},async compare(s){let a=s.map(encodeURIComponent).join(","),c=await(await _(t,`/api/jobs/compare?ids=${a}`)).json();return {jobs:(c.jobs||[]).map(yn),taskMatrix:(c.taskMatrix||[]).map(kn)}},async resume(s,a,o){let c=await _(t,`/api/jobs/${encodeURIComponent(s)}/resume`,{method:"POST",headers:{"Content-Type":"application/json",...o?.idempotencyKey?{"Idempotency-Key":o.idempotencyKey}:{}},body:JSON.stringify(a??{})});return E(await c.json())},async retry(s,a,o){let c=await _(t,`/api/jobs/${encodeURIComponent(s)}/retry`,{method:"POST",headers:{"Content-Type":"application/json",...o?.idempotencyKey?{"Idempotency-Key":o.idempotencyKey}:{}},body:JSON.stringify(a??{})});return E(await c.json())},async regrade(s,a){let o={};a?.statuses?.length&&(o.statuses=a.statuses),a?.task_name!==void 0&&(o.task_name=a.task_name);let c=await _(t,`/api/jobs/${encodeURIComponent(s)}/regrade`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)});return E(await c.json())},async analyze(s,a){let o=await _(t,`/api/jobs/${encodeURIComponent(s)}/analyze`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a??{})});return E(await o.json())},async watchAnalysis(s,a){let o=a?.pollIntervalMs??Q,c=o,m=null;for(;;){J(a?.signal);let p;try{p=await n(s);}catch(y){if(y instanceof A&&(y.status===429||y.status===503)){await x(Math.max((y.retryAfterSec??0)*1e3,c),a?.signal),c=Math.min(c*2,X);continue}throw y}let b=p.stats.analysis??null,f=b?JSON.stringify([b.n_completed,b.n_failed,b.n_pending]):null,k=f!==null&&f!==m;if(k&&(m=f,a?.onStats?.(p)),b?.n_pending===0)return p;c=k?o:Math.min(c*2,X),await x(c,a?.signal);}},download:(async(s,a)=>ce(t,`/api/jobs/${encodeURIComponent(s)}/download`,a,`job-${s}-results.tar.gz`)),async upload(s,a){let o={dataset:a?.dataset};if(typeof s=="object"&&s!==null){if(typeof s.archive_url!="string"||!s.archive_url.trim())throw new Error("jobs().upload() with a URL source requires { archive_url: 'https://\u2026' }");let h=await _(t,"/api/jobs/upload",{method:"POST",body:F({...o,archive_url:s.archive_url})});return W(await h.json())}if(typeof s!="string"||!s.trim())throw new Error("jobs().upload() requires a job directory (or .tar.gz archive) path, or { archive_url }");let c={fields:o,filename:"job.tar.gz",resumableThreshold:b,resumablePath:"/api/jobs/upload/uploads",...a?.onUploadProgress!==void 0?{onBytes:a.onUploadProgress}:{},...a?.onRegistered!==void 0?{onRegistered:a.onRegistered}:{}},{stat:m}=await import('fs/promises');if((await m(s).catch(()=>null))?.isFile()){let h=await tt(t,"/api/jobs/upload",s,c);return W(await h.json())}let{existsSync:b$1}=await import('fs'),{join:f,resolve:k}=await import('path'),y=k(s);for(let h of ["result.json","config.json"])if(!b$1(f(y,h)))throw new Error(`${y} does not contain ${h}`);let S=await H(t,"/api/jobs/upload",{...c,directory:y});return W(await S.json())},getImport:r,async watchImport(s,a){let o=a?.pollIntervalMs??Q,c=null,m=null;for(;;){J(a?.signal);let p;try{p=await r(s);}catch(f){if(f instanceof A&&(f.status===429||f.status===503)){await x(Math.max((f.retryAfterSec??0)*1e3,o),a?.signal);continue}throw f}let b=`${p.status}${p.receiving?":receiving":""}`;if(b!==c&&(c=b,a?.onStatus?.(p)),p.progress!==null){let f=JSON.stringify(p.progress);f!==m&&(m=f,a?.onProgress?.(p.progress,p));}if(p.status==="COMPLETED"||p.status==="FAILED")return p;await x(o,a?.signal);}},listImports(s){return P(async a=>{let o=new URLSearchParams;a.limit!==void 0&&o.set("limit",String(a.limit)),a.cursor!==void 0&&o.set("cursor",a.cursor),s?.status!==void 0&&o.set("status",s.status);let c=o.toString()?`?${o}`:"",m=await _(t,`/api/jobs/imports${c}`);return R(await m.json(),W)},s)},async delete(s){let o=await(await _(t,`/api/jobs/${encodeURIComponent(s)}`,{method:"DELETE"})).json();return {job_id:o.job_id??s,trials_deleted:o.trials_deleted??0,analyses_deleted:o.analyses_deleted??0}},async share(s,a){let o=await _(t,`/api/jobs/${encodeURIComponent(s)}/share`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});return T(await o.json())},async unshare(s,a){let o=await _(t,`/api/jobs/${encodeURIComponent(s)}/unshare`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});return T(await o.json())},async shares(s){let a=await _(t,`/api/jobs/${encodeURIComponent(s)}/shares`);return T(await a.json())},async grep(s,a,o){let c=await _(t,`/api/jobs/${encodeURIComponent(s)}/grep${w(o,{q:a,type:o?.type})}`);return R(await c.json(),Sn)}}}function In(e){let t=I("trials",e);async function n(i,l){let d=await _(t,`/api/trials/${encodeURIComponent(i)}/trace${w(l,{type:l?.type,grep:l?.grep,tail:l?.tail!==void 0?String(l.tail):void 0})}`);return R(await d.json(),Xe)}async function r(i,l){let u=await(await _(t,`/api/trials/${encodeURIComponent(i)}/trace?stream=${l}`)).json();return l==="agent-home"?u.files??null:u.log??null}return {async get(i){let l=await _(t,`/api/trials/${encodeURIComponent(i)}`);return xe(await l.json())},trace:n,artifact:r,async*traceEvents(i,l){let d=l?.cursor;for(;;){let u=await n(i,{...l,cursor:d});for(let g of u.items)yield g;if(!u.nextCursor)return;d=u.nextCursor;}},async regrade(i){let l=await _(t,`/api/trials/${encodeURIComponent(i)}/regrade`,{method:"POST"});return E(await l.json())},async retry(i,l){let d=await _(t,`/api/trials/${encodeURIComponent(i)}/retry`,{method:"POST",...l?.idempotencyKey?{headers:{"Idempotency-Key":l.idempotencyKey}}:{}});return E(await d.json())},async stop(i){let d=await(await _(t,"/api/trials/stop",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({trial_ids:i})})).json();return {stopped:(d.stopped??[]).map(xe),stopped_analyses:(d.stopped_analyses??[]).map(oe).filter(u=>u!==null),already_terminal:d.already_terminal??[],not_found:d.not_found??[]}},async files(i,l){let d=await _(t,`/api/trials/${encodeURIComponent(i)}/files${w(l)}`);return R(await d.json(),u=>({path:u.path,size_bytes:u.size_bytes}))},async file(i,l,d){let u=l.split("/").filter(Boolean).map(encodeURIComponent).join("/"),g=Te(d),s=await _(t,`/api/trials/${encodeURIComponent(i)}/files/${u}`,g?{headers:{Range:g}}:void 0);return Buffer.from(await s.arrayBuffer())},filesystem:i=>we(t,`/api/trials/${encodeURIComponent(i)}`)}}function it(e){let t=e?.update;return typeof t?.sessionUpdate=="string"?t.sessionUpdate:"unknown"}function On(e){let t=I("analyses",e),n=new Set;async function r(d){if(n.has(d))return;let u;try{u=await _(t,`/api/traces/trials/${encodeURIComponent(d)}/artifacts?what=analysis`);}catch(g){throw g instanceof A&&g.status===400?new Error(`"${d}" is not an analysis run (the artifacts door refuses it typed) \u2014 for a trial's artifacts use trials()`):g}await u.text().catch(()=>{}),n.add(d);}async function i(d,u){await r(d);let s=await(await _(t,`/api/traces/trials/${encodeURIComponent(d)}/artifacts?what=${u}`)).json();return u==="agent-home"?s.files??null:s.log??null}async function l(d){let u=await _(t,`/api/analyses${w(d,{scope:d?.scope,job:d?.job,status:d?.status&&d.status.length>0?d.status.join(","):void 0})}`);return R(await u.json(),g=>{let s=oe(g);if(s===null)throw new Error("The analyses list served an unreadable analysis object");return s})}return {list(d){return P(u=>l({...u,scope:d?.scope,job:d?.job,status:d?.status}),d)},async get(d){let g=await(await _(t,`/api/traces/trials/${encodeURIComponent(d)}/artifacts?what=analysis`)).json(),s=oe(g.analysis);if(s===null)throw new Error(`The analysis feed served no readable analysis object for "${d}"`);return n.add(d),s},async transcript(d,u){let g=u?.since;if(g!==void 0&&(!Number.isInteger(g)||g<0))throw new Error(`transcript() since must be a non-negative integer, got ${g}`);let a=await(await _(t,`/api/traces/trials/${encodeURIComponent(d)}/events`+(g!==void 0?`?since=${g}`:""))).json(),o=a.session??{};if(o.kind!=="analysis"){let p=typeof o.kind=="string"?o.kind:"trial";throw new Error(`"${d}" is not an analysis run (the feed resolves it as a ${p}) \u2014 for a trial's trace use trials()`)}let c=g??0,m=Array.isArray(a.events)?a.events:[];return {id:typeof o.id=="string"?o.id:d,analyzed_trial_id:typeof o.analyzedTrialId=="string"?o.analyzedTrialId:null,job_id:typeof o.jobId=="string"?o.jobId:null,task_name:typeof o.tag=="string"?o.tag:null,model_name:typeof o.model=="string"?o.model:null,sandbox_provider:typeof o.provider=="string"?o.provider:null,sandbox_id:typeof o.sandboxId=="string"?o.sandboxId:null,is_ended:o.isEnded===true,total:typeof a.total=="number"?a.total:c+m.length,events:m.map((p,b)=>({seq:c+b,type:it(p),data:p&&typeof p=="object"&&!Array.isArray(p)?p:{}})),gateway_calls:Qe(a.gatewayCalls),stored_at:z(a.storedAt,m.length,"Analysis transcript response")}},artifact:i,download:(async(d,u)=>ce(t,`/api/analyses/${encodeURIComponent(d)}/download`,u,`analysis-${d}.tar.gz`)),async defaults(){return await(await _(t,"/api/analyses/defaults")).json()},filesystem:d=>we(t,`/api/analyses/${encodeURIComponent(d)}`)}}function re(e){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("The checks surface served an unreadable check object");let t=e,n=Array.isArray(t.results)?t.results.filter(i=>!!i&&typeof i=="object"&&!Array.isArray(i)):[],r=t.visibility==="LINK"?"LINK":"PRIVATE";return {...t,visibility:r,results:n}}function Dn(e){let t=I("checks",e);async function n(u){let g=await _(t,`/api/checks/${encodeURIComponent(u)}`);return re(await g.json())}async function r(u){let g=await _(t,`/api/checks${w(u,{scope:u?.scope,status:u?.status&&u.status.length>0?u.status.join(","):void 0,dataset:u?.dataset})}`);return R(await g.json(),re)}let i=new Set;async function l(u){let g;try{g=await _(t,`/api/traces/trials/${encodeURIComponent(u)}/artifacts?what=task-check`);}catch(o){throw o instanceof A&&o.status===400?new Error(`"${u}" is not a task check (the artifacts door refuses it typed) \u2014 for a trial's artifacts use trials(), for an analysis's use analyses()`):o}let a=(await g.json()).task_check;if(!a||typeof a!="object"||Array.isArray(a))throw new Error(`The traces feed served no readable task check for "${u}"`);return i.add(u),a}async function d(u,g){i.has(u)||await l(u);let a=await(await _(t,`/api/traces/trials/${encodeURIComponent(u)}/artifacts?what=${g}`)).json();return g==="agent-home"?a.files??null:a.log??null}return {async create(u){let{source:g,onUploadProgress:s,...a}=u,o={config:JSON.stringify(a)};if("dataset"in g){if(typeof g.dataset!="string"||g.dataset.trim()==="")throw new Error('checks().create(): source.dataset must be "name" or "name@version"');let y=await _(t,"/api/checks",{method:"POST",body:F({...o,dataset:g.dataset.trim()})});return re(await y.json())}let{existsSync:c,statSync:m}=await import('fs'),{basename:p,resolve:b}=await import('path'),f=b(g.directory);if(!c(f)||!m(f).isDirectory())throw new Error(`checks().create(): Path '${g.directory}' does not exist or is not a directory`);let k=await H(t,"/api/checks",{directory:f,fields:o,filename:`${p(f)||"task"}.tar.gz`,...s!==void 0?{onBytes:s}:{}});return re(await k.json())},get:n,async defaults(){return await(await _(t,"/api/checks/defaults")).json()},list(u){return P(g=>r({...g,scope:u?.scope,status:u?.status,dataset:u?.dataset}),u)},task:l,async transcript(u,g){let s=g?.since;if(s!==void 0&&(!Number.isInteger(s)||s<0))throw new Error(`transcript() since must be a non-negative integer, got ${s}`);let o=await(await _(t,`/api/traces/trials/${encodeURIComponent(u)}/events`+(s!==void 0?`?since=${s}`:""))).json(),c=o.session??{};if(c.kind!=="check"){let b=typeof c.kind=="string"?c.kind:"trial";throw new Error(`"${u}" is not a task check (the feed resolves it as a ${b}) \u2014 for a trial's trace use trials(), for an analysis's use analyses()`)}let m=s??0,p=Array.isArray(o.events)?o.events:[];return {id:typeof c.id=="string"?c.id:u,check_id:typeof c.checkId=="string"?c.checkId:null,dataset:typeof c.datasetRef=="string"?c.datasetRef:null,task_name:typeof c.tag=="string"?c.tag:null,model_name:typeof c.model=="string"?c.model:null,sandbox_provider:typeof c.provider=="string"?c.provider:null,sandbox_id:typeof c.sandboxId=="string"?c.sandboxId:null,is_ended:c.isEnded===true,total:typeof o.total=="number"?o.total:m+p.length,events:p.map((b,f)=>({seq:m+f,type:it(b),data:b&&typeof b=="object"&&!Array.isArray(b)?b:{}})),gateway_calls:Qe(o.gatewayCalls),stored_at:z(o.storedAt,p.length,"Task check transcript response")}},artifact:d,download:(async(u,g)=>ce(t,`/api/checks/${encodeURIComponent(u)}/download`,g,`check-${u}.tar.gz`)),async share(u,g){let s=await _(t,`/api/checks/${encodeURIComponent(u)}/share`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)});return T(await s.json())},async unshare(u,g){let s=await _(t,`/api/checks/${encodeURIComponent(u)}/unshare`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)});return T(await s.json())},async shares(u){let g=await _(t,`/api/checks/${encodeURIComponent(u)}/shares`);return T(await g.json())},async watch(u,g){let s=g?.pollIntervalMs??Q,a=s,o=null;for(;;){J(g?.signal);let c;try{c=await n(u);}catch(b){if(b instanceof A&&(b.status===429||b.status===503)){await x(Math.max((b.retryAfterSec??0)*1e3,a),g?.signal),a=Math.min(a*2,X);continue}throw b}let m=JSON.stringify(c.results.map(b=>[b.task_name,b.status])),p=m!==o;if(p&&(o=m,g?.onProgress?.(c)),c.status==="completed")return c;a=p?s:Math.min(a*2,X),await x(a,g?.signal);}},taskFilesystem:(u,g)=>we(t,`/api/checks/${encodeURIComponent(u)}/tasks/${encodeURIComponent(g)}`)}}function Ms(e){let t=I("auth",e);return {async status(){let r=await(await _(t,"/api/auth/status")).json(),i=r.key??{};return {user_id:r.user_id,email:r.email??null,key:{id:i.id,label:i.label??null,created_at:i.created_at,last_used_at:i.last_used_at??null}}}}}function Ln(e){return {user_id:e.user_id,email:e.email,role:e.role==="owner"?"owner":"member",joined_at:e.joined_at}}function Jn(e){return {invite_id:e.invite_id,expires_at:typeof e.expires_at=="string"?e.expires_at:null,max_uses:typeof e.max_uses=="number"?e.max_uses:null,uses:typeof e.uses=="number"?e.uses:0,revoked_at:typeof e.revoked_at=="string"?e.revoked_at:null,created_at:e.created_at,token:e.token}}function ae(e){return {org_id:e.org_id,slug:e.slug,display_name:e.display_name,personal:e.personal===true,...e.role==="owner"||e.role==="member"?{role:e.role}:{},created_at:e.created_at}}function Un(e){let t=e.quota??{},n=e.usage??{},r=i=>typeof i=="number"?i:0;return {...ae(e),member_count:r(e.member_count),quota:{max_concurrent_trials:r(t.max_concurrent_trials),max_queued_trials:r(t.max_queued_trials),max_concurrent_imports:r(t.max_concurrent_imports),max_concurrent_analyses:r(t.max_concurrent_analyses),max_concurrent_sessions:r(t.max_concurrent_sessions),monthly_budget_usd:typeof t.monthly_budget_usd=="number"?t.monthly_budget_usd:null,max_concurrent_sandboxes_e2b:r(t.max_concurrent_sandboxes_e2b),max_concurrent_sandboxes_daytona:r(t.max_concurrent_sandboxes_daytona),max_concurrent_sandboxes_modal:r(t.max_concurrent_sandboxes_modal)},usage:{in_flight_trials:r(n.in_flight_trials),queued_trials:r(n.queued_trials),in_flight_imports:r(n.in_flight_imports),in_flight_analyses:r(n.in_flight_analyses),active_sessions:r(n.active_sessions),month_spend_usd:typeof n.month_spend_usd=="number"?n.month_spend_usd:null,month_spend_as_of:typeof n.month_spend_as_of=="string"?n.month_spend_as_of:null}}}function jn(e){let t=I("orgs",e);return {async list(){let r=await(await _(t,"/api/orgs")).json();return (Array.isArray(r.items)?r.items:[]).map(i=>ae(i))},async get(n){let r=await _(t,`/api/orgs/${encodeURIComponent(n)}`);return Un(await r.json())},async create(n,r){let i=await _(t,"/api/orgs",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({slug:n,...r?.displayName!==void 0?{display_name:r.displayName}:{}})});return ae(await i.json())},async invite(n){let r=await _(t,`/api/orgs/${encodeURIComponent(n)}/invites`,{method:"POST"});return Jn(await r.json())},async join(n){let i=await(await _(t,"/api/orgs/invites/accept",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:n})})).json();return {org:ae(i.org??{}),already_member:i.already_member===true}},async members(n){let i=await(await _(t,`/api/orgs/${encodeURIComponent(n)}/members`)).json();return (Array.isArray(i.items)?i.items:[]).map(l=>Ln(l))}}}function ot(e){try{let t=JSON.parse(e);return t&&typeof t=="object"?t:{value:t}}catch{return {raw:e}}}function Bs(e){let t,n,r,i,l,d,u,g;return {get datasets(){return t??=wn(e)},get agents(){return n??=En(e)},get jobs(){return r??=Cn(e)},get trials(){return i??=In(e)},get analyses(){return l??=On(e)},get checks(){return d??=Dn(e)},get skills(){return u??=Pn(e)},get orgs(){return g??=jn(e)},meta(){return Fn(e)}}}async function Fn(e){let t=(e?.baseUrl||process.env.EVOLVE_DASHBOARD_URL||D).replace(/\/$/,""),n=await fetch(`${t}/api/meta`);return n.ok||await Z(n),await n.json()}function Ee(e){return e.delivery==="direct"}var ct=18181,O="/tmp/evolve-managed-secrets",dt=`${O}/proxy.py`,Pe=`${O}/config.json`,N=`${O}/ca.crt`,de=`${O}/ca.key`,G=`${O}/ca-bundle.crt`,gt=["HTTP_PROXY","HTTPS_PROXY","ALL_PROXY","http_proxy","https_proxy","all_proxy","NO_PROXY","no_proxy","NODE_EXTRA_CA_CERTS","SSL_CERT_FILE","REQUESTS_CA_BUNDLE","CURL_CA_BUNDLE","GIT_SSL_CAINFO"];function Ws(){return [...gt]}var Ys=String.raw`#!/usr/bin/env python3
|
|
11
|
-
import base64
|
|
12
|
-
import json
|
|
13
|
-
import os
|
|
14
|
-
import select
|
|
15
|
-
import secrets
|
|
16
|
-
import socket
|
|
17
|
-
import ssl
|
|
18
|
-
import subprocess
|
|
19
|
-
import sys
|
|
20
|
-
import tempfile
|
|
21
|
-
import threading
|
|
22
|
-
import time
|
|
23
|
-
import urllib.error
|
|
24
|
-
import urllib.request
|
|
25
|
-
|
|
26
|
-
for key in ["HTTP_PROXY", "HTTPS_PROXY", "ALL_PROXY", "http_proxy", "https_proxy", "all_proxy"]:
|
|
27
|
-
os.environ.pop(key, None)
|
|
28
|
-
|
|
29
|
-
CONFIG_PATH = sys.argv[1]
|
|
30
|
-
with open(CONFIG_PATH, "r", encoding="utf-8") as f:
|
|
31
|
-
CONFIG = json.load(f)
|
|
32
|
-
try:
|
|
33
|
-
os.unlink(CONFIG_PATH)
|
|
34
|
-
except FileNotFoundError:
|
|
35
|
-
pass
|
|
36
|
-
|
|
37
|
-
MAX_BODY_BYTES = int(CONFIG.get("max_body_bytes", 10 * 1024 * 1024))
|
|
38
|
-
CONNECT_TIMEOUT_SECONDS = 15
|
|
39
|
-
SOCKET_TIMEOUT_SECONDS = 130
|
|
40
|
-
MAX_WORKERS = 100
|
|
41
|
-
WORKERS = threading.BoundedSemaphore(MAX_WORKERS)
|
|
42
|
-
HOST_PATTERNS = [h.lower() for h in CONFIG["hosts"]]
|
|
43
|
-
PLACEHOLDERS = set(CONFIG["placeholders"])
|
|
44
|
-
PLACEHOLDER_BYTES = [p.encode("utf-8") for p in CONFIG["placeholders"]]
|
|
45
|
-
BASE_DIR = CONFIG["base_dir"]
|
|
46
|
-
CERT_DIR = os.path.join(BASE_DIR, "certs")
|
|
47
|
-
os.makedirs(CERT_DIR, exist_ok=True)
|
|
48
|
-
CHANNEL_SECRET = secrets.token_urlsafe(32)
|
|
49
|
-
|
|
50
|
-
def register_channel():
|
|
51
|
-
payload = json.dumps({}).encode("utf-8")
|
|
52
|
-
req = urllib.request.Request(
|
|
53
|
-
CONFIG["channel_url"],
|
|
54
|
-
data=payload,
|
|
55
|
-
method="POST",
|
|
56
|
-
headers={
|
|
57
|
-
"content-type": "application/json",
|
|
58
|
-
"accept": "application/json",
|
|
59
|
-
"x-evolve-managed-secret-token": CONFIG["token"],
|
|
60
|
-
"x-evolve-managed-secret-binding": CONFIG["binding"],
|
|
61
|
-
"x-evolve-managed-secret-channel": CHANNEL_SECRET,
|
|
62
|
-
},
|
|
63
|
-
)
|
|
64
|
-
with urllib.request.urlopen(req, timeout=30) as resp:
|
|
65
|
-
if resp.status < 200 or resp.status >= 300:
|
|
66
|
-
raise RuntimeError("managed secret channel registration failed")
|
|
67
|
-
|
|
68
|
-
def host_matches(pattern, host):
|
|
69
|
-
host = host.lower()
|
|
70
|
-
if pattern.startswith("*."):
|
|
71
|
-
base = pattern[2:]
|
|
72
|
-
return host != base and host.endswith("." + base)
|
|
73
|
-
return host == pattern
|
|
74
|
-
|
|
75
|
-
def is_managed_host(host):
|
|
76
|
-
clean = host.split(":", 1)[0].strip("[]").lower()
|
|
77
|
-
return any(host_matches(pattern, clean) for pattern in HOST_PATTERNS)
|
|
78
|
-
|
|
79
|
-
def safe_name(host):
|
|
80
|
-
return "".join(ch if ch.isalnum() or ch in "._-" else "_" for ch in host)[:180]
|
|
81
|
-
|
|
82
|
-
def ensure_cert(host):
|
|
83
|
-
name = safe_name(host)
|
|
84
|
-
cert = os.path.join(CERT_DIR, name + ".crt")
|
|
85
|
-
key = os.path.join(CERT_DIR, name + ".key")
|
|
86
|
-
if os.path.exists(cert) and os.path.exists(key):
|
|
87
|
-
return cert, key
|
|
88
|
-
csr = os.path.join(CERT_DIR, name + ".csr")
|
|
89
|
-
ext = os.path.join(CERT_DIR, name + ".ext")
|
|
90
|
-
san = "IP:" + host if host.replace(".", "").isdigit() else "DNS:" + host
|
|
91
|
-
with open(ext, "w", encoding="utf-8") as f:
|
|
92
|
-
f.write("basicConstraints=critical,CA:FALSE\n")
|
|
93
|
-
f.write("keyUsage=critical,digitalSignature,keyEncipherment\n")
|
|
94
|
-
f.write("subjectAltName=" + san + "\n")
|
|
95
|
-
f.write("extendedKeyUsage=serverAuth\n")
|
|
96
|
-
subprocess.run(
|
|
97
|
-
["openssl", "req", "-newkey", "rsa:2048", "-nodes", "-keyout", key, "-subj", "/CN=" + host, "-out", csr],
|
|
98
|
-
check=True,
|
|
99
|
-
stdout=subprocess.DEVNULL,
|
|
100
|
-
stderr=subprocess.DEVNULL,
|
|
101
|
-
)
|
|
102
|
-
subprocess.run(
|
|
103
|
-
[
|
|
104
|
-
"openssl", "x509", "-req", "-in", csr,
|
|
105
|
-
"-CA", CONFIG["ca_cert"], "-CAkey", CONFIG["ca_key"], "-CAcreateserial",
|
|
106
|
-
"-out", cert, "-days", "30", "-sha256", "-extfile", ext,
|
|
107
|
-
],
|
|
108
|
-
check=True,
|
|
109
|
-
stdout=subprocess.DEVNULL,
|
|
110
|
-
stderr=subprocess.DEVNULL,
|
|
111
|
-
)
|
|
112
|
-
return cert, key
|
|
113
|
-
|
|
114
|
-
def pipe_raw(client, host, port):
|
|
115
|
-
upstream = socket.create_connection((host, port), timeout=CONNECT_TIMEOUT_SECONDS)
|
|
116
|
-
client.settimeout(SOCKET_TIMEOUT_SECONDS)
|
|
117
|
-
upstream.settimeout(SOCKET_TIMEOUT_SECONDS)
|
|
118
|
-
try:
|
|
119
|
-
client.sendall(b"HTTP/1.1 200 Connection Established\r\n\r\n")
|
|
120
|
-
sockets = [client, upstream]
|
|
121
|
-
while True:
|
|
122
|
-
readable, _, _ = select.select(sockets, [], [], 120)
|
|
123
|
-
if not readable:
|
|
124
|
-
break
|
|
125
|
-
for sock in readable:
|
|
126
|
-
data = sock.recv(65536)
|
|
127
|
-
if not data:
|
|
128
|
-
return
|
|
129
|
-
(upstream if sock is client else client).sendall(data)
|
|
130
|
-
finally:
|
|
131
|
-
upstream.close()
|
|
132
|
-
|
|
133
|
-
def recv_until(sock, marker, limit=65536):
|
|
134
|
-
data = b""
|
|
135
|
-
while marker not in data:
|
|
136
|
-
chunk = sock.recv(4096)
|
|
137
|
-
if not chunk:
|
|
138
|
-
break
|
|
139
|
-
data += chunk
|
|
140
|
-
if len(data) > limit:
|
|
141
|
-
raise RuntimeError("request headers too large")
|
|
142
|
-
return data
|
|
143
|
-
|
|
144
|
-
def parse_headers(blob):
|
|
145
|
-
head, rest = blob.split(b"\r\n\r\n", 1)
|
|
146
|
-
lines = head.decode("iso-8859-1").split("\r\n")
|
|
147
|
-
request_line = lines[0]
|
|
148
|
-
headers = {}
|
|
149
|
-
for line in lines[1:]:
|
|
150
|
-
if not line or ":" not in line:
|
|
151
|
-
continue
|
|
152
|
-
name, value = line.split(":", 1)
|
|
153
|
-
headers[name.strip()] = value.strip()
|
|
154
|
-
return request_line, headers, rest
|
|
155
|
-
|
|
156
|
-
def header_value(headers, name):
|
|
157
|
-
wanted = name.lower()
|
|
158
|
-
for key, value in headers.items():
|
|
159
|
-
if key.lower() == wanted:
|
|
160
|
-
return value
|
|
161
|
-
return None
|
|
162
|
-
|
|
163
|
-
def read_chunked_body(sock, initial):
|
|
164
|
-
data = initial
|
|
165
|
-
body = b""
|
|
166
|
-
while True:
|
|
167
|
-
while b"\r\n" not in data:
|
|
168
|
-
chunk = sock.recv(4096)
|
|
169
|
-
if not chunk:
|
|
170
|
-
raise RuntimeError("incomplete chunked request")
|
|
171
|
-
data += chunk
|
|
172
|
-
line, data = data.split(b"\r\n", 1)
|
|
173
|
-
size = int((line.split(b";", 1)[0].strip() or b"0"), 16)
|
|
174
|
-
if size == 0:
|
|
175
|
-
return body
|
|
176
|
-
if len(body) + size > MAX_BODY_BYTES:
|
|
177
|
-
raise RuntimeError("request body too large")
|
|
178
|
-
while len(data) < size + 2:
|
|
179
|
-
chunk = sock.recv(65536)
|
|
180
|
-
if not chunk:
|
|
181
|
-
raise RuntimeError("incomplete chunked request")
|
|
182
|
-
data += chunk
|
|
183
|
-
body += data[:size]
|
|
184
|
-
data = data[size + 2:]
|
|
185
|
-
|
|
186
|
-
def read_request(tls_sock):
|
|
187
|
-
blob = recv_until(tls_sock, b"\r\n\r\n")
|
|
188
|
-
if not blob:
|
|
189
|
-
return None
|
|
190
|
-
request_line, headers, rest = parse_headers(blob)
|
|
191
|
-
transfer_encoding = (header_value(headers, "Transfer-Encoding") or "").lower()
|
|
192
|
-
if "chunked" in transfer_encoding:
|
|
193
|
-
return request_line, headers, read_chunked_body(tls_sock, rest)
|
|
194
|
-
length = int(header_value(headers, "Content-Length") or "0")
|
|
195
|
-
if length > MAX_BODY_BYTES:
|
|
196
|
-
raise RuntimeError("request body too large")
|
|
197
|
-
body = rest
|
|
198
|
-
while len(body) < length:
|
|
199
|
-
chunk = tls_sock.recv(min(65536, length - len(body)))
|
|
200
|
-
if not chunk:
|
|
201
|
-
break
|
|
202
|
-
body += chunk
|
|
203
|
-
return request_line, headers, body[:length]
|
|
204
|
-
|
|
205
|
-
def uses_placeholder(path, headers, body):
|
|
206
|
-
if any(ph in path for ph in PLACEHOLDERS):
|
|
207
|
-
return True
|
|
208
|
-
if any(ph in value for ph in PLACEHOLDERS for value in headers.values()):
|
|
209
|
-
return True
|
|
210
|
-
return any(ph_b in body for ph_b in PLACEHOLDER_BYTES)
|
|
211
|
-
|
|
212
|
-
def brokered_status(transport_status, transport_reason, payload):
|
|
213
|
-
# A brokered reply carries the TRUE upstream status inside the payload;
|
|
214
|
-
# the dashboard's own status reports only the health of the hop to it.
|
|
215
|
-
# Servers older than the status lane omit it: those fall back.
|
|
216
|
-
status = payload.get("status")
|
|
217
|
-
if isinstance(status, bool) or not isinstance(status, int) or not 100 <= status <= 599:
|
|
218
|
-
return transport_status, transport_reason
|
|
219
|
-
reason = payload.get("statusText")
|
|
220
|
-
return status, reason if isinstance(reason, str) else ""
|
|
221
|
-
|
|
222
|
-
def egress_failure(exc):
|
|
223
|
-
body = json.dumps({
|
|
224
|
-
"error": "managed secret egress request failed",
|
|
225
|
-
"detail": str(exc),
|
|
226
|
-
}).encode("utf-8")
|
|
227
|
-
return 502, "Managed Secret Egress Unavailable", {
|
|
228
|
-
"headers": {"content-type": "application/json"},
|
|
229
|
-
"bodyBase64": base64.b64encode(body).decode("ascii"),
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
def call_dashboard(method, url, headers, body):
|
|
233
|
-
payload = json.dumps({
|
|
234
|
-
"method": method,
|
|
235
|
-
"url": url,
|
|
236
|
-
"headers": headers,
|
|
237
|
-
"bodyBase64": base64.b64encode(body).decode("ascii") if body else "",
|
|
238
|
-
}).encode("utf-8")
|
|
239
|
-
req = urllib.request.Request(
|
|
240
|
-
CONFIG["egress_url"],
|
|
241
|
-
data=payload,
|
|
242
|
-
method="POST",
|
|
243
|
-
headers={
|
|
244
|
-
"content-type": "application/json",
|
|
245
|
-
"accept": "application/json",
|
|
246
|
-
"x-evolve-managed-secret-token": CONFIG["token"],
|
|
247
|
-
"x-evolve-managed-secret-binding": CONFIG["binding"],
|
|
248
|
-
"x-evolve-managed-secret-channel": CHANNEL_SECRET,
|
|
249
|
-
},
|
|
250
|
-
)
|
|
251
|
-
try:
|
|
252
|
-
with urllib.request.urlopen(req, timeout=130) as resp:
|
|
253
|
-
result = json.loads(resp.read().decode("utf-8"))
|
|
254
|
-
if not isinstance(result, dict):
|
|
255
|
-
raise ValueError("managed secret egress returned a non-object response")
|
|
256
|
-
status, reason = brokered_status(resp.status, resp.reason, result)
|
|
257
|
-
return status, reason, result
|
|
258
|
-
except urllib.error.HTTPError as err:
|
|
259
|
-
text = err.read().decode("utf-8", "replace")
|
|
260
|
-
return err.code, "Managed Secret Egress Error", {"headers": {"content-type": "application/json"}, "bodyBase64": base64.b64encode(text.encode()).decode("ascii")}
|
|
261
|
-
except (urllib.error.URLError, OSError, ValueError) as err:
|
|
262
|
-
# Connection reset, SSL EOF, timeout, or an unreadable body: the agent
|
|
263
|
-
# gets a typed 502 and the proxy keeps serving.
|
|
264
|
-
return egress_failure(err)
|
|
265
|
-
|
|
266
|
-
def read_limited_response(stream):
|
|
267
|
-
chunks = []
|
|
268
|
-
total = 0
|
|
269
|
-
while True:
|
|
270
|
-
chunk = stream.read(65536)
|
|
271
|
-
if not chunk:
|
|
272
|
-
break
|
|
273
|
-
total += len(chunk)
|
|
274
|
-
if total > MAX_BODY_BYTES:
|
|
275
|
-
raise RuntimeError("response body too large")
|
|
276
|
-
chunks.append(chunk)
|
|
277
|
-
return b"".join(chunks)
|
|
278
|
-
|
|
279
|
-
def call_direct(method, url, headers, body):
|
|
280
|
-
hop_by_hop = {"connection", "proxy-connection", "keep-alive", "transfer-encoding", "upgrade", "host", "content-length"}
|
|
281
|
-
request_headers = {k: v for k, v in headers.items() if k.lower() not in hop_by_hop}
|
|
282
|
-
req = urllib.request.Request(
|
|
283
|
-
url,
|
|
284
|
-
data=body if body else None,
|
|
285
|
-
method=method,
|
|
286
|
-
headers=request_headers,
|
|
287
|
-
)
|
|
288
|
-
try:
|
|
289
|
-
with urllib.request.urlopen(req, timeout=130) as resp:
|
|
290
|
-
return resp.status, resp.reason, {
|
|
291
|
-
"headers": dict(resp.headers.items()),
|
|
292
|
-
"bodyBase64": base64.b64encode(read_limited_response(resp)).decode("ascii"),
|
|
293
|
-
}
|
|
294
|
-
except urllib.error.HTTPError as err:
|
|
295
|
-
return err.code, err.reason, {
|
|
296
|
-
"headers": dict(err.headers.items()),
|
|
297
|
-
"bodyBase64": base64.b64encode(read_limited_response(err)).decode("ascii"),
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
def send_response(tls_sock, status, reason, result):
|
|
301
|
-
body = base64.b64decode(result.get("bodyBase64") or "")
|
|
302
|
-
headers = {str(k): str(v) for k, v in (result.get("headers") or {}).items()}
|
|
303
|
-
headers["content-length"] = str(len(body))
|
|
304
|
-
headers["connection"] = "close"
|
|
305
|
-
status_line = ("HTTP/1.1 %d %s\r\n" % (status, reason or "")).encode("ascii", "replace")
|
|
306
|
-
header_blob = b"".join((name + ": " + value + "\r\n").encode("iso-8859-1", "replace") for name, value in headers.items())
|
|
307
|
-
tls_sock.sendall(status_line + header_blob + b"\r\n" + body)
|
|
308
|
-
|
|
309
|
-
def dispatch_managed_request(method, url, headers, body):
|
|
310
|
-
if uses_placeholder(url, headers, body):
|
|
311
|
-
return call_dashboard(method, url, headers, body)
|
|
312
|
-
return call_direct(method, url, headers, body)
|
|
313
|
-
|
|
314
|
-
def handle_managed_connect(client, host, port):
|
|
315
|
-
client.sendall(b"HTTP/1.1 200 Connection Established\r\n\r\n")
|
|
316
|
-
cert, key = ensure_cert(host)
|
|
317
|
-
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
|
|
318
|
-
ctx.load_cert_chain(cert, key)
|
|
319
|
-
client.settimeout(SOCKET_TIMEOUT_SECONDS)
|
|
320
|
-
tls_sock = ctx.wrap_socket(client, server_side=True)
|
|
321
|
-
tls_sock.settimeout(SOCKET_TIMEOUT_SECONDS)
|
|
322
|
-
try:
|
|
323
|
-
request = read_request(tls_sock)
|
|
324
|
-
if not request:
|
|
325
|
-
return
|
|
326
|
-
request_line, headers, body = request
|
|
327
|
-
parts = request_line.split()
|
|
328
|
-
if len(parts) < 2:
|
|
329
|
-
raise RuntimeError("bad request line")
|
|
330
|
-
method, path = parts[0].upper(), parts[1]
|
|
331
|
-
if path.startswith("http://") or path.startswith("https://"):
|
|
332
|
-
url = path
|
|
333
|
-
else:
|
|
334
|
-
url = "https://%s%s" % (host if port == 443 else host + ":" + str(port), path)
|
|
335
|
-
status, reason, result = dispatch_managed_request(method, url, headers, body)
|
|
336
|
-
send_response(tls_sock, status, reason, result)
|
|
337
|
-
finally:
|
|
338
|
-
try:
|
|
339
|
-
tls_sock.close()
|
|
340
|
-
except Exception:
|
|
341
|
-
pass
|
|
342
|
-
|
|
343
|
-
def handle_client(client):
|
|
344
|
-
try:
|
|
345
|
-
client.settimeout(SOCKET_TIMEOUT_SECONDS)
|
|
346
|
-
blob = recv_until(client, b"\r\n\r\n")
|
|
347
|
-
if not blob:
|
|
348
|
-
return
|
|
349
|
-
request_line, headers, rest = parse_headers(blob)
|
|
350
|
-
parts = request_line.split()
|
|
351
|
-
if len(parts) < 3:
|
|
352
|
-
return
|
|
353
|
-
if parts[0].upper() == "CONNECT":
|
|
354
|
-
target = parts[1]
|
|
355
|
-
if ":" in target:
|
|
356
|
-
host, port_s = target.rsplit(":", 1)
|
|
357
|
-
port = int(port_s)
|
|
358
|
-
else:
|
|
359
|
-
host, port = target, 443
|
|
360
|
-
host = host.strip("[]")
|
|
361
|
-
if is_managed_host(host):
|
|
362
|
-
handle_managed_connect(client, host, port)
|
|
363
|
-
else:
|
|
364
|
-
pipe_raw(client, host, port)
|
|
365
|
-
return
|
|
366
|
-
client.sendall(b"HTTP/1.1 501 Not Implemented\r\ncontent-length: 0\r\nconnection: close\r\n\r\n")
|
|
367
|
-
except Exception as exc:
|
|
368
|
-
try:
|
|
369
|
-
body = json.dumps({"error": str(exc)}).encode("utf-8")
|
|
370
|
-
client.sendall(b"HTTP/1.1 502 Bad Gateway\r\ncontent-type: application/json\r\ncontent-length: " + str(len(body)).encode() + b"\r\nconnection: close\r\n\r\n" + body)
|
|
371
|
-
except Exception:
|
|
372
|
-
pass
|
|
373
|
-
finally:
|
|
374
|
-
try:
|
|
375
|
-
client.close()
|
|
376
|
-
except Exception:
|
|
377
|
-
pass
|
|
378
|
-
|
|
379
|
-
def close_quietly(sock):
|
|
380
|
-
try:
|
|
381
|
-
sock.close()
|
|
382
|
-
except Exception:
|
|
383
|
-
pass
|
|
384
|
-
|
|
385
|
-
def reject_client(client):
|
|
386
|
-
try:
|
|
387
|
-
client.sendall(b"HTTP/1.1 503 Service Unavailable\r\ncontent-length: 0\r\nconnection: close\r\n\r\n")
|
|
388
|
-
except Exception:
|
|
389
|
-
pass
|
|
390
|
-
close_quietly(client)
|
|
391
|
-
|
|
392
|
-
def serve():
|
|
393
|
-
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
394
|
-
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
395
|
-
server.bind(("127.0.0.1", int(CONFIG["port"])))
|
|
396
|
-
server.listen(100)
|
|
397
|
-
while True:
|
|
398
|
-
# The listener outlives every connection: nothing a single accept or
|
|
399
|
-
# handoff raises may end the loop, or the sandbox loses egress for the
|
|
400
|
-
# rest of the session.
|
|
401
|
-
try:
|
|
402
|
-
client, _ = server.accept()
|
|
403
|
-
except Exception:
|
|
404
|
-
time.sleep(0.05)
|
|
405
|
-
continue
|
|
406
|
-
if not WORKERS.acquire(blocking=False):
|
|
407
|
-
reject_client(client)
|
|
408
|
-
continue
|
|
409
|
-
# Bound per thread: the loop rebinds the client on the next accept.
|
|
410
|
-
def run_client(sock=client):
|
|
411
|
-
try:
|
|
412
|
-
handle_client(sock)
|
|
413
|
-
except Exception:
|
|
414
|
-
pass
|
|
415
|
-
finally:
|
|
416
|
-
WORKERS.release()
|
|
417
|
-
try:
|
|
418
|
-
threading.Thread(target=run_client, daemon=True).start()
|
|
419
|
-
except Exception:
|
|
420
|
-
WORKERS.release()
|
|
421
|
-
close_quietly(client)
|
|
422
|
-
|
|
423
|
-
if __name__ == "__main__":
|
|
424
|
-
register_channel()
|
|
425
|
-
serve()
|
|
426
|
-
`;function Nn(e){return (e||process.env.EVOLVE_DASHBOARD_URL||D).replace(/\/$/,"")}function $n(e){let t=e.apiKey||process.env.EVOLVE_API_KEY;if(!t)throw new Error("EVOLVE_API_KEY is required for managed secrets");return t}async function Mn(e){return await e.text().catch(()=>"")}async function K(e,t,n={}){let r=await fetch(`${Nn(e.dashboardUrl)}${t}`,{...n,headers:{Authorization:`Bearer ${$n(e)}`,accept:"application/json",...n.body?{"content-type":"application/json"}:{},...n.headers||{}}});if(!r.ok)throw new Error(`Managed secrets request failed (${r.status}): ${await Mn(r)}`);return await r.json()}function Bn(e){let t=n=>Array.isArray(n)?n.filter(r=>typeof r=="string"):[];return {id:String(e.id??""),name:String(e.name??""),...typeof e.label=="string"?{label:e.label}:{},...e.delivery==="brokered"||e.delivery==="direct"?{delivery:e.delivery}:{},allowedHosts:t(e.allowed_hosts??e.allowedHosts),allowedPathPrefixes:t(e.allowed_path_prefixes??e.allowedPathPrefixes),allowedMethods:t(e.allowed_methods??e.allowedMethods),createdAt:String(e.created_at??e.createdAt??""),updatedAt:String(e.updated_at??e.updatedAt??""),lastUsedAt:typeof(e.last_used_at??e.lastUsedAt)=="string"?e.last_used_at??e.lastUsedAt:null}}function Xs(e={}){return {async list(){return (await K(e,"/api/managed-secrets")).secrets??[]},async set(t){let n={name:t.name,value:t.value,delivery:t.delivery,...t.label!==void 0?{label:t.label}:{},...t.allowedHosts!==void 0?{allowed_hosts:t.allowedHosts}:{},...t.allowedPathPrefixes!==void 0?{allowed_path_prefixes:t.allowedPathPrefixes}:{},...t.allowedMethods!==void 0?{allowed_methods:t.allowedMethods}:{}},r=await K(e,"/api/managed-secrets",{method:"POST",body:JSON.stringify(n)});return {status:r.status,secret:Bn(r.secret??{})}},async delete(t){let n=await K(e,"/api/managed-secrets",{method:"DELETE",body:JSON.stringify({name:t.name,...t.label!==void 0?{label:t.label}:{}})});return {ok:n.ok,name:n.name,label:n.label}}}}function qn(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}function lt(e){try{return new URL(e).protocol==="https:"}catch{return false}}function Vn(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=e;return typeof t.token=="string"&&t.token.startsWith("evrt_")&&typeof t.bindingSecret=="string"&&t.bindingSecret.startsWith("evrb_")&&typeof t.egressUrl=="string"&<(t.egressUrl)&&typeof t.channelUrl=="string"&<(t.channelUrl)&&typeof t.expiresAt=="string"&&Array.isArray(t.env)&&t.env.every(n=>{if(!n||typeof n!="object"||Array.isArray(n))return false;let r=n;return typeof r.name!="string"||typeof r.envName!="string"||!qn(r.allowedHosts)?false:r.delivery==="direct"?typeof r.value=="string"&&r.value.length>0:(r.delivery===void 0||r.delivery==="brokered")&&typeof r.placeholder=="string"&&r.placeholder.startsWith("evsec_")&&r.value===void 0})}async function Qs(e,t){let n=await K(e,"/api/managed-secrets/runtime-token",{method:"POST",body:JSON.stringify(t)});if(!Vn(n))throw new Error("Invalid managed secret runtime token response");return n}async function Zs(e,t){return (await K(e,"/api/managed-secrets/runtime-token",{method:"PATCH",body:JSON.stringify(t)})).ok}async function er(e,t){return (await K(e,"/api/managed-secrets/runtime-token",{method:"DELETE",body:JSON.stringify(t)})).ok}var Hn=/^[A-Za-z0-9._-]{1,80}$/;function Gn(e){if(!Array.isArray(e)||e.length===0)throw new Error("withManagedSecrets() requires at least one secret");return e.map((t,n)=>{if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`managedSecrets[${n}] must be an object with a name`);let r=ut(t.name,`managedSecrets[${n}].name`),i;if(t.label!==void 0){if(typeof t.label!="string"||!Hn.test(t.label.trim()))throw new Error(`managedSecrets[${n}].label may contain only letters, numbers, dots, underscores, and hyphens (at most 80 characters)`);i=t.label.trim();}let l=t.as===void 0?void 0:ut(t.as,`managedSecrets[${n}].as`);return {name:r,...i!==void 0?{label:i}:{},...l!==void 0?{as:l}:{}}})}function ut(e,t){if(typeof e!="string"||!e.trim())throw new Error(`${t} is required`);let n=e.trim().toUpperCase();if(!/^[A-Z_][A-Z0-9_]{0,127}$/.test(n))throw new Error(`${t} must be a valid environment variable name`);if(n.startsWith("EVOLVE_"))throw new Error(`${t} cannot use the reserved EVOLVE_ prefix`);return n}function Kn(e){let t=new Set(["EVOLVE_API_KEY","EVOLVE_PROVIDER_RUNTIME_BINDING","GEMINI_DEFAULT_AUTH_TYPE",...gt]),n=r=>{r&&t.add(r);};n(e.apiKeyEnv),n(e.baseUrlEnv),n(e.customHeadersEnv),n(e.gatewayConfigEnv),e.spendTrackingEnvs&&(n(e.spendTrackingEnvs.sessionTagEnv),n(e.spendTrackingEnvs.runTagEnv));for(let r of Object.values(e.providerEnvMap??{}))n(r.keyEnv);return t}function tr(e,t){if(!e)return;let n=Gn(e),r=Kn(t),i=new Set;for(let l of n){let d=l.as||l.name;if(r.has(d))throw new Error(`${d} is reserved for Evolve-managed sandbox services and cannot be used as a managed secret env var`);if(i.has(d))throw new Error(`duplicate managed secret env var: ${d}`);i.add(d);}return n}function zn(e){return e.env.some(t=>!Ee(t))}function nr(e){let t={};for(let i of e.env)Ee(i)?t[i.envName]=i.value:t[i.envName]=i.placeholder;if(!zn(e))return t;let n=`http://127.0.0.1:${ct}`;t.HTTPS_PROXY=n,t.https_proxy=n,t.NODE_EXTRA_CA_CERTS=N,t.SSL_CERT_FILE=G,t.REQUESTS_CA_BUNDLE=G,t.CURL_CA_BUNDLE=G,t.GIT_SSL_CAINFO=G;let r=new URL(e.egressUrl).hostname;return t.NO_PROXY=`localhost,127.0.0.1,::1,${r}`,t.no_proxy=t.NO_PROXY,t}function sr(e){let t=e.env.filter(r=>!Ee(r)),n=Array.from(new Set(t.flatMap(r=>r.allowedHosts)));return JSON.stringify({egress_url:e.egressUrl,channel_url:e.channelUrl,token:e.token,binding:e.bindingSecret,hosts:n,placeholders:t.map(r=>r.placeholder),base_dir:O,ca_cert:N,ca_key:de,port:ct,max_body_bytes:10*1024*1024},null,2)}function rr(){return ["umask 077",`mkdir -p ${O}/certs`,`chmod 700 ${O} ${O}/certs`,`chmod 700 ${dt} 2>/dev/null || true`,`chmod 600 ${Pe} 2>/dev/null || true`,`if [ ! -f ${de} ]; then openssl genrsa -out ${de} 2048 >/dev/null 2>&1; fi`,`if [ ! -f ${N} ]; then openssl req -x509 -new -nodes -key ${de} -sha256 -days 30 -subj "/CN=Evolve Managed Secrets" -addext "basicConstraints=critical,CA:TRUE" -addext "keyUsage=critical,keyCertSign,cRLSign" -out ${N} >/dev/null 2>&1; fi`,`SYSTEM_CA_BUNDLE=""; for p in /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt /etc/ssl/ca-bundle.pem; do if [ -f "$p" ]; then SYSTEM_CA_BUNDLE="$p"; break; fi; done; if [ -n "$SYSTEM_CA_BUNDLE" ]; then cat "$SYSTEM_CA_BUNDLE" ${N} > ${G}; else cp ${N} ${G}; fi`,`if command -v update-ca-certificates >/dev/null 2>&1; then cp ${N} /usr/local/share/ca-certificates/evolve-managed-secrets.crt 2>/dev/null && update-ca-certificates >/dev/null 2>&1 || true; fi`].join(" && ")}function ar(){return `umask 077 && exec python3 ${dt} ${Pe}`}function ir(){return `rm -f ${Pe}`}var es=6e5,ts=5e3;function pt(e,t,n){let r=t??n;if(!Number.isFinite(r)||r<=0)throw new Error(`${e} must be a positive number`);return r}function _r(e){let t=e?.apiKey||process.env[M];if(!t)throw new Error(`sessions() requires an API key. Set ${M} or pass { apiKey } in config.`);let n=e?.dashboardUrl||D;async function r(s,a){let o=await fetch(`${n}${s}`,{...a,headers:{Authorization:`Bearer ${t}`,...a?.headers}});if(!o.ok){let c=await o.text().catch(()=>"");throw new Error(`Dashboard API error (${o.status}): ${c||o.statusText}`)}return o}function i(s){return {id:s.id,tag:s.tag,agent:s.agent,model:s.model||null,reasoningEffort:typeof s.reasoningEffort=="string"?s.reasoningEffort:null,provider:s.provider,org:typeof s.org=="string"?s.org:null,sandboxId:s.sandboxId||null,state:s.isEnded?"ended":"live",runtimeStatus:s.runtimeStatus||"unknown",cost:typeof s.cost=="number"?s.cost:null,usage:B(s.usage),createdAt:s.createdAt,endedAt:s.endedAt||null,stepCount:s.stepCount||0,toolStats:s.toolStats||null,visibility:s.visibility==="LINK"?"LINK":"PRIVATE"}}function l(s,a){if(s.status!=="ready")throw new Error(`Browser replay is not ready (status: ${String(s.status||"unknown")})`);if(typeof s.replayUrl!="string"||typeof s.downloadUrl!="string")throw new Error("Browser replay response missing replayUrl or downloadUrl");return {sessionId:s.sessionId||a,status:"ready",replayUrl:s.replayUrl,downloadUrl:s.downloadUrl,suggestedStartSeconds:typeof s.suggestedStartSeconds=="number"?s.suggestedStartSeconds:void 0,sizeBytes:typeof s.sizeBytes=="number"?s.sizeBytes:void 0,readyAt:typeof s.readyAt=="string"?s.readyAt:void 0}}let d=s=>new Promise(a=>setTimeout(a,s));function u(s){if(s==null)return [];if(!Array.isArray(s))throw new Error("Session transcript response gatewayCalls is not a list");return s.map((a,o)=>{let c=a&&typeof a=="object"&&!Array.isArray(a)?a:null;if(!c||be({data:c})===null)throw new Error(`Session transcript response gatewayCalls[${o}] is not a gateway usage event`);return c})}async function g(s,a){let o=new URLSearchParams;a?.since!=null&&o.set("since",String(a.since));let c=o.toString(),p=await(await r(`/api/sessions/${encodeURIComponent(s)}/events${c?`?${c}`:""}`)).json(),b=p.session;if(!b||typeof b!="object"||Array.isArray(b))throw new Error("Session transcript response missing session");let f=p.events||[];return {session:i(b),events:f,total:typeof p.total=="number"?p.total:(a?.since??0)+f.length,gatewayCalls:u(p.gatewayCalls),storedAt:z(p.storedAt,f.length,"Session transcript response")}}return {async list(s){let a=new URLSearchParams({paginationMode:"cursor",pageSize:String(Math.min(s?.limit??20,200)),paginated:"true"});if(s?.scope&&a.set("scope",s.scope),s?.cursor&&a.set("cursor",s.cursor),s?.state&&s.state!=="all"&&a.set("state",s.state),s?.agent&&a.set("agent",s.agent),s?.tagPrefix&&a.set("tagPrefix",s.tagPrefix),s?.scope&&a.set("scope",s.scope),s?.sort){let m={newest:"desc",oldest:"asc",cost:"desc"};a.set("sortDirection",m[s.sort]),s.sort==="cost"?a.set("sortField","cost"):a.set("sortField","timestamp");}let c=await(await r(`/api/sessions?${a}`)).json();return {items:(c.items||[]).map(i),nextCursor:c.nextCursor||null,hasMore:!!c.hasMore}},async get(s){let o=await(await r(`/api/sessions/${encodeURIComponent(s)}`)).json();return i(o)},async events(s,a){return (await g(s,a)).events},transcript:g,async download(s,a){let m=(await(await r(`/api/sessions/${encodeURIComponent(s)}`)).json()).tag||s,p=await fetch(`${n}/api/sessions/${encodeURIComponent(s)}/download`,{headers:{Authorization:`Bearer ${t}`},redirect:"follow"});if(!p.ok){let y=await p.text().catch(()=>"");throw new Error(`Download failed (${p.status}): ${y||p.statusText}`)}let b=a?.to||process.cwd();await mkdir(b,{recursive:true});let f=join(b,`${m}.jsonl`);if(!p.body)throw new Error("Download response has no body");let k=Readable.fromWeb(p.body);return await pipeline(k,createWriteStream(f)),f},async browserReplay(s,a){let o=pt("timeoutMs",a?.timeoutMs,es),c=pt("intervalMs",a?.intervalMs,ts),m=Date.now()+o,p=`/api/sessions/${encodeURIComponent(s)}/browser-replay`;for(;;){let b=m-Date.now();if(b<=0)throw new Error(`Browser replay timed out after ${o}ms`);let f;try{f=await fetch(`${n}${p}`,{headers:{Authorization:`Bearer ${t}`,accept:"application/json"},signal:AbortSignal.timeout(Math.max(1,b))});}catch(y){let S=y.name;throw S==="AbortError"||S==="TimeoutError"?new Error(`Browser replay timed out after ${o}ms`):y}let k={};if(f.ok)k=await f.json();else {let y=await f.text().catch(()=>"");throw new Error(`Dashboard API error (${f.status}): ${y||f.statusText}`)}if(k.status==="ready")return l(k,s);if(k.status==="failed"){let y=typeof k.error=="string"?k.error:"unknown error";throw new Error(`Browser replay failed: ${y}`)}if(Date.now()>=m)throw new Error(`Browser replay timed out after ${o}ms`);await d(Math.min(c,Math.max(0,m-Date.now())));}},async share(s,a){let o=await r(`/api/sessions/${encodeURIComponent(s)}/share`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});return T(await o.json())},async unshare(s,a){let o=await r(`/api/sessions/${encodeURIComponent(s)}/unshare`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});return T(await o.json())},async shares(s){let a=await r(`/api/sessions/${encodeURIComponent(s)}/shares`);return T(await a.json())}}}
|
|
427
|
-
export{$e as $,Rs as A,Pe as Aa,xs as B,Ws as Ba,yt as C,Ys as Ca,ht as D,Xs as Da,kt as E,Qs as Ea,St as F,Zs as Fa,vt as G,er as Ga,Rt as H,tr as Ha,xt as I,zn as Ia,me as J,nr as Ja,_e as K,sr as Ka,fe as L,rr as La,be as M,ar as Ma,At as N,ir as Na,Tt as O,_r as Oa,wt as P,Le as Q,ye as R,Et as S,ee as T,Ct as U,It as V,Ot as W,Ue as X,he as Y,je as Z,Fe as _,ft as a,Me as aa,bt as b,Be as ba,ns as c,jt as ca,Oe as d,Nt as da,ss as e,$t as ea,rs as f,Mt as fa,as as g,Bt as ga,M as h,A as ha,is as i,Se as ia,os as j,ie as ja,ls as k,le as ka,us as l,ue as la,cs as m,wn as ma,ds as n,En as na,gs as o,Pn as oa,ps as p,Cn as pa,De as q,In as qa,ms as r,On as ra,D as s,Dn as sa,fs as t,Ms as ta,bs as u,jn as ua,ys as v,Bs as va,hs as w,Fn as wa,ks as x,ct as xa,Ss as y,O as ya,vs as z,dt as za};
|