@wular/coder 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/app-server-bHl6RBZ2.js +3 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +53 -39
- package/dist/flow/index.d.ts +2 -31
- package/dist/flow/index.js +1 -1
- package/dist/{index-CUy_WPvw.d.ts → index-CTrgzW3M.d.ts} +181 -314
- package/dist/lib/broker.d.ts +1 -1
- package/dist/lib/broker.js +2 -2
- package/dist/runtime-BL-oL-Yy.js +16 -0
- package/dist/sdk.d.ts +263 -424
- package/dist/sdk.js +1 -1
- package/dist/upgrade-DVySGHGq.js +36 -0
- package/docs/sdk.md +4 -3
- package/package.json +4 -2
- package/plugins/agents/skills/coder/SKILL.md +3 -2
- package/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/plugins/claude/skills/dispatch/SKILL.md +3 -2
- package/plugins/cursor/.cursor-plugin/plugin.json +1 -1
- package/plugins/cursor/README.md +1 -1
- package/plugins/cursor/skills/coder/SKILL.md +3 -2
- package/dist/app-server-Dwd7IcQH.js +0 -3
- package/dist/runtime-DRtQOCSz.js +0 -16
- package/dist/upgrade-DFAtgbtD.js +0 -27
package/dist/sdk.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{C as e,
|
|
1
|
+
import{C as e,I as t,v as n,x as r}from"./app-server-bHl6RBZ2.js";import{B as i,E as a,I as o,M as s,R as c,Tt as l,bt as u}from"./runtime-BL-oL-Yy.js";import{D as d,S as f,T as p,_ as m,b as h,c as g,d as _,f as v,g as y,i as b,l as x,m as S,n as C,o as w,s as T,u as E,y as D}from"./upgrade-DVySGHGq.js";import O from"./flow/index.js";import k from"node:process";import A from"node:path";function j(e){return e?A.resolve(e):k.cwd()}function M(t,n){let r=e(t,n);if(!r)throw Error(n?`No task found for "${n}".`:`No tasks found for this workspace.`);return r}const N={async run(e,t={}){let{taskId:n}=await o({prompt:e,cwd:j(t.cwd),agent:t.agent,model:t.model,effort:t.effort,permissions:t.permissions,name:t.name,system:t.system,resume:t.resume});return{taskId:n}},async result(e,t={}){let n=j(t.cwd),r=e??M(n).id;return t.wait?i(n,r,{tail:t.tail}):c(n,r,{tail:t.tail})},list(e={}){return h(j(e.cwd),e).jobs},async steer(e,t,n={}){let r=j(n.cwd);return p(r,M(r,e),t,{model:n.model,effort:n.effort,permissions:n.permissions})},async ask(e,t,n={}){let r=j(n.cwd),i=M(r,e),a=await f(r,i,t,{model:n.model,effort:n.effort});return{taskId:i.id,answer:a.finalMessage||null}},async stop(e,t={}){let n=j(t.cwd);return a(n,M(n,e))},archive(e,t={}){let r=j(t.cwd);return n(r,M(r,e)),{taskId:e,archived:!0}},delete(e,t={}){let n=j(t.cwd),i=M(n,e);if(i.status===`running`)throw Error(`Task ${i.id} is still running.`);D(i);let a=r(n,i.id);return{taskId:i.id,deleted:a}},approve(e,n,r={}){let i=j(r.cwd),a=M(i,e),o=r.deny?`decline`:`accept`;return u(t(i,a.id),n,o),{taskId:a.id,approvalId:n,decision:o}},approvals(e,n={}){let r=j(n.cwd),i=e?M(r,e):M(r);return l(t(r,i.id))},stream(e,t={}){let n=j(t.cwd);return d(n,e??M(n).id,{tail:t.tail})}},P={add:(e,t)=>w(j(t.cwd),e,t),update:(e,t)=>v(j(t.cwd),e,t),remove:(e,t={})=>x(j(t.cwd),e,t),list:(e={})=>g(j(e.cwd)),alias:(e,t,n={})=>T(j(n.cwd),e,t,n),unalias:(e,t={})=>_(j(t.cwd),e,t),disable:(e,t={})=>E(j(t.cwd),e,!0,t),enable:(e,t={})=>E(j(t.cwd),e,!1,t)},F={get:(e,t={})=>y(j(t.cwd),e),set:(e,t,n={})=>m(j(n.cwd),e,t,n)};function I(e=[],t={}){return S(j(t.cwd),{claude:e.includes(`claude`),codex:e.includes(`codex`),agents:e.includes(`agents`)})}function L(e={}){return C(e)}function R(e){return b(e)}var z={task:N,flow:O,model:P,config:F,setupHost:I,upgrade:L,docs:R};export{s as CoderError,F as config,z as default,R as docs,O as flow,P as model,I as setupHost,N as task,L as upgrade};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import{B as e,D as t,E as n,H as r,I as i,L as a,O as o,P as s,S as c,U as l,V as u,_ as d,c as f,d as p,f as m,h,j as g,k as _,l as v,m as y,o as b,p as x,s as S,u as C,x as w,z as T}from"./app-server-bHl6RBZ2.js";import{$ as E,$t as D,At as ee,Bt as O,Dt as te,G as ne,H as re,Ht as ie,J as ae,Jt as k,K as oe,Lt as se,Ot as ce,Q as le,Qt as ue,Rt as A,U as de,Ut as fe,V as pe,Vt as me,W as he,Wt as j,X as ge,Y as _e,Yt as ve,Z as M,Zt as N,_t as ye,at as P,ct as be,dt as xe,en as Se,et as Ce,ft as F,g as we,gt as I,ht as Te,it as L,jt as Ee,k as De,mt as Oe,nn as R,nt as z,ot as B,pt as ke,q as Ae,qt as je,rn as V,rt as H,sn as Me,st as U,tn as W,ut as Ne,vt as Pe,z as Fe,zt as Ie}from"./runtime-BL-oL-Yy.js";import G from"node:process";import K from"node:fs";import q from"node:path";import{spawnSync as Le}from"node:child_process";import Re from"node:os";import{fileURLToPath as ze}from"node:url";import*as J from"zod/mini";import Be from"node:crypto";import Ve from"node:http";let He=0;function Ue(e){let t=[];typeof e.instructions==`string`&&e.instructions&&t.push({role:`system`,content:e.instructions});let n=Array.isArray(e.input)?e.input:[];for(let e of n)switch(e?.type){case`message`:{let n=Array.isArray(e.content)?e.content.map(e=>e?.text??``).join(``):String(e.content??``);t.push({role:e.role===`developer`?`system`:e.role,content:n});break}case`function_call`:{let n={id:e.call_id,type:`function`,function:{name:e.name,arguments:e.arguments??`{}`}},r=t.at(-1);r?.role===`assistant`&&r.tool_calls?r.tool_calls.push(n):t.push({role:`assistant`,content:null,tool_calls:[n]});break}case`function_call_output`:{let n=e.output;t.push({role:`tool`,tool_call_id:e.call_id,content:typeof n==`string`?n:JSON.stringify(n??``)});break}}return t}function We(e){let t=(Array.isArray(e.tools)?e.tools:[]).filter(e=>e?.type===`function`).map(e=>({type:`function`,function:{name:e.name,description:e.description??``,parameters:e.parameters??{type:`object`,properties:{}}}})),n=e.text?.format;return{model:e.model,messages:Ue(e),...t.length?{tools:t,tool_choice:e.tool_choice??`auto`}:{},...typeof e.parallel_tool_calls==`boolean`?{parallel_tool_calls:e.parallel_tool_calls}:{},...n?.type===`json_schema`?{response_format:{type:`json_schema`,json_schema:{name:n.name,schema:n.schema,strict:n.strict??!1}}}:{},stream:!0,stream_options:{include_usage:!0}}}var Ge=class{send;model;responseId=`resp_bridge_${++He}`;text=``;textOpen=!1;toolCalls=new Map;usage=null;buffer=``;constructor(e,t){this.model=e,this.send=t,this.send({type:`response.created`,response:{id:this.responseId,object:`response`,status:`in_progress`,model:e,output:[]}})}push(e){this.buffer+=e;let t=this.buffer.split(`
|
|
2
|
+
`);this.buffer=t.pop()??``;for(let e of t){let t=e.trim();if(!t.startsWith(`data:`))continue;let n=t.slice(5).trim();if(!n||n===`[DONE]`)continue;let r;try{r=JSON.parse(n)}catch{continue}r.usage&&(this.usage=r.usage);let i=r.choices?.[0]?.delta;if(i){typeof i.content==`string`&&i.content&&(this.textOpen||(this.textOpen=!0,this.send({type:`response.output_item.added`,output_index:0,item:{type:`message`,id:`msg_bridge_0`,status:`in_progress`,role:`assistant`,content:[]}})),this.text+=i.content,this.send({type:`response.output_text.delta`,item_id:`msg_bridge_0`,output_index:0,content_index:0,delta:i.content}));for(let e of i.tool_calls??[]){let t=this.toolCalls.get(e.index)??{id:``,name:``,args:``};e.id&&(t.id=e.id),e.function?.name&&(t.name+=e.function.name),e.function?.arguments&&(t.args+=e.function.arguments),this.toolCalls.set(e.index,t)}}}}finish(){let e=[];if(this.text){let t={type:`message`,id:`msg_bridge_0`,status:`completed`,role:`assistant`,content:[{type:`output_text`,text:this.text,annotations:[]}]};e.push(t),this.send({type:`response.output_item.done`,output_index:0,item:t})}let t=e.length;for(let n of this.toolCalls.values()){let r={type:`function_call`,id:`fc_bridge_${t}`,call_id:n.id||`call_bridge_${t}`,name:n.name,arguments:n.args||`{}`,status:`completed`};e.push(r),this.send({type:`response.output_item.done`,output_index:t,item:r}),t+=1}this.send({type:`response.completed`,response:{id:this.responseId,object:`response`,status:`completed`,model:this.model,output:e,usage:{input_tokens:this.usage?.prompt_tokens??0,input_tokens_details:{cached_tokens:this.usage?.prompt_tokens_details?.cached_tokens??0},output_tokens:this.usage?.completion_tokens??0,output_tokens_details:{reasoning_tokens:this.usage?.completion_tokens_details?.reasoning_tokens??0},total_tokens:this.usage?.total_tokens??0}}})}};async function Ke(e,t=`chat`){let n=t===`responses`,r=z(e.baseUrl,n?`responses`:`chat/completions`),i=null,a=e.envKey?G.env[e.envKey]:void 0;async function o(e){let t=i?[i]:r,n=null;for(let r of t)if(n=await fetch(r,{method:`POST`,headers:{"content-type":`application/json`,...a?{authorization:`Bearer ${a}`}:{}},body:e}),n.status!==404)return i=r,n;return n}let s=Be.randomBytes(16).toString(`hex`),c=Ve.createServer((e,t)=>{if(e.method!==`POST`||!e.url?.startsWith(`/${s}/`)||!e.url.replace(/\/+$/,``).endsWith(`/responses`)){t.writeHead(404,{"content-type":`application/json`}),t.end(JSON.stringify({error:{message:`coder chat bridge: only POST /responses is supported`}}));return}let r=``;e.on(`data`,e=>r+=e),e.on(`end`,async()=>{let e;try{e=JSON.parse(r)}catch{t.writeHead(400,{"content-type":`application/json`}),t.end(JSON.stringify({error:{message:`invalid JSON`}}));return}try{if(n){let e=await o(r);if(t.writeHead(e.status,{"content-type":e.headers.get(`content-type`)??`application/json`,"cache-control":`no-store`}),e.body)for await(let n of e.body)t.write(n);t.end();return}let i=await o(JSON.stringify(We(e)));if(!i.ok||!i.body){let e=await i.text().catch(()=>``);t.writeHead(i.status,{"content-type":`application/json`}),t.end(e||JSON.stringify({error:{message:`upstream HTTP ${i.status}`}}));return}t.writeHead(200,{"content-type":`text/event-stream`,"cache-control":`no-store`});let a=new Ge(e.model,e=>t.write(`data: ${JSON.stringify(e)}\n\n`)),s=new TextDecoder;for await(let e of i.body)a.push(s.decode(e,{stream:!0}));a.finish(),t.end()}catch(e){let n=e instanceof Error?e.message:String(e);t.writeHead(502,{"content-type":`application/json`}),t.end(JSON.stringify({error:{message:`coder chat bridge: ${n}`}}))}})});await new Promise(e=>c.listen(0,`127.0.0.1`,e));let l=c.address();return{url:`http://127.0.0.1:${typeof l==`object`&&l?l.port:0}/${s}/v1`,close:()=>new Promise(e=>{c.close(()=>e()),c.closeAllConnections?.()})}}async function qe(e,t,n){let r=e.envKey?G.env[e.envKey]:void 0,i=!1;for(let a of z(e.baseUrl,t))try{let e=await fetch(a,{method:`POST`,headers:{"content-type":`application/json`,...r?{Authorization:`Bearer ${r}`}:{}},body:JSON.stringify(n),signal:AbortSignal.timeout(5e3)});if(i=!0,e.status!==404&&e.status!==405&&e.status!==501)return{baseUrl:a.slice(0,-(t.length+1))}}catch{}return{reachable:i}}async function Je(e){let t=await qe(e,`responses`,{model:e.model,input:[],stream:!1});if(`baseUrl`in t)return{wireApi:`responses`,baseUrl:t.baseUrl};let n=await qe(e,`chat/completions`,{model:e.model,messages:[],stream:!1});return`baseUrl`in n?{wireApi:`chat`,baseUrl:n.baseUrl}:t.reachable||n.reachable?{wireApi:`chat`}:null}async function*Ye(e,t,n={}){let r=new Set([`completed`,`failed`,`cancelled`]),a=g(e,t);if(!a)throw Error(`No task found for "${t}".`);let o=n.tail??1,c=te(q.join(i(e,t),`log.jsonl`)),l=!0,u=()=>{let e=c();return l&&(l=!1,o!==`all`&&(e=o===0?[]:e.slice(-o))),e.map(e=>{try{return JSON.parse(e)}catch{return{message:e}}})};for(yield*u();!r.has(a.status);)await new Promise(e=>setTimeout(e,400)),a=s(e,g(e,t)??a),yield*u();yield*u()}async function Xe(e){let{options:t,positionals:n}=v(e,J.object({...b,tail:p,trim:J.optional(J.union([J.literal(`none`),J.coerce.number().check(J.int(),J.positive())],{error:`expected a positive integer or "none"`}))}));W(n,1,`task watch`);let r=V(t),a=R(r,n[0]),o=t.tail,c=t.trim,l=c===void 0?300:c===`none`?2**53-1:c;if(!t.json){G.stdout.write(`${N.dim(`[coder] task ${a.id} ${a.status} — watching (Ctrl-C to stop)`)}\n`);let e=[`${N.dim(`agent`.padEnd(8))} ${fe(a)}`,...ve(a,N)];G.stdout.write(`${e.join(`
|
|
3
|
+
`)}\n`),a.prompt&&G.stdout.write(`${Se(a.prompt,N).join(`
|
|
4
|
+
`)}\n`)}for await(let e of Ye(r,a.id,{tail:o}))if(t.json){let t=e.message?{...e,message:Me(e.message,l,{plain:!0})}:e;G.stdout.write(`${JSON.stringify(t)}\n`)}else{let t=e.message??e.kind;t&&G.stdout.write(`${N.dim(`[coder]`)} ${Me(t,l)}\n`)}let u=s(r,g(r,a.id)??a),d=ce(q.join(i(r,a.id),`result.json`));if(t.json)D({taskId:a.id,status:u.status,result:d});else{let e=u.status===`completed`?`(no final message)`:`(task ${u.status})`;G.stdout.write(`\n${me(d,u.error,e)}\n`);let t=d?.tokens?` tokens=${je(d.tokens,d.model??u.model)}`:``;G.stderr.write(`${N.dim(`[coder] task=${a.id} status=${u.status}${t}`)}\n`)}G.exit(u.status===`completed`?0:1)}async function Ze(e,t,n){if(t.status!==`running`)return null;if(t.engine!==`claude`&&(await Pe(e,{threadId:t.threadId,text:n})).steered)return{taskId:t.id,steered:`live`};let r=g(e,t.id)??t;return u.includes(r.status)?(c(e,r.id,n),{taskId:r.id,steered:`queued`}):null}async function Qe(e,t,n,r={}){if(!t.threadId)throw Error(`Task ${t.id} has no thread to steer yet (status: ${t.status}).`);return await Ze(e,t,n)||($e(e,t,n,r),{taskId:t.id,steered:`resumed`})}function $e(t,n,r,i){e(t,n.id,{status:`queued`,resumedAt:new Date().toISOString(),currentPrompt:r,resumeThreadId:n.threadId,model:i.model??n.model??null,effort:i.effort??n.effort??null,permissions:i.permissions??n.permissions,error:void 0}),d(t,n.id,{message:`Resuming with steered follow-up.`}),Fe(n.cwd??t,n.id)}async function et(e){let{options:t,positionals:n}=v(e,J.object({...b,model:C,effort:C,permissions:C,background:S,wait:S})),r=V(t),[i,...a]=n,o=a.join(` `).trim();(!i||!o)&&O(`Missing task id or follow-up text.`,{hint:[`Usage: coder task steer <task-id> "<follow-up>" [--wait]`,`Help: coder task steer --help`]});let s=R(r,i);s.threadId||O(`Task ${s.id} has no thread to steer yet (status: ${s.status}).`,{hint:`Wait for it to start: coder task watch ${s.id}`});let c=await Qe(r,s,o,{model:t.model,effort:t.effort,permissions:t.permissions});return tt(r,c.taskId,{steered:c.steered,options:t})}async function tt(e,t,{steered:n,options:r}){if(n===`queued`){if(r.json){D({taskId:t,steered:`queued`});return}G.stdout.write(`${N.dim(`[coder]`)} follow-up queued for task ${N.cyan(t)}; it runs when the current turn finishes.\n`),r.wait&&G.stdout.write(`\n${N.dim(`[coder] --wait is not available for a queued follow-up; check: coder task result ${t}`)}\n`);return}if(!r.wait){if(r.json){D({taskId:t,steered:n});return}G.stdout.write(n===`live`?`${N.dim(`[coder]`)} steered follow-up into running task ${N.cyan(t)}.\n`:`${N.dim(`[coder]`)} resumed task ${N.cyan(t)} with the follow-up (same thread, same id).\n`),G.stdout.write(`\n${N.dim(` result: coder task result ${t}`)}\n`);return}let a=g(e,t),o=a?await T(e,a):null,s=ce(q.join(i(e,t),`result.json`));r.json?D({taskId:t,status:o?.status??null,finalMessage:s?.finalMessage??null}):(G.stdout.write(`\n${s?.finalMessage||`(no final message)`}\n\n`),G.stderr.write(`${N.dim(`[coder] task=${t} status=${o?.status??`unknown`}`)}\n`)),G.exitCode=o?.status===`completed`?0:1}function nt(e,t,n){return`You are a read-only sidecar answering a question ABOUT a coder task.
|
|
5
|
+
You are not the task: never continue, redo, or fix its work — only answer the question. The task never sees this question or your answer.
|
|
6
|
+
|
|
7
|
+
Task metadata:
|
|
8
|
+
${[`id: ${e.id}`,...e.name?[`name: ${e.name}`]:[],`status: ${e.status}`,`agent: ${e.agent}${e.model?`/${e.model}`:``}${e.effort?`/${e.effort}`:``}`,...e.cwd?[`workspace: ${e.cwd}`]:[],...e.createdAt?[`created: ${e.createdAt}`]:[],...e.completedAt?[`finished: ${e.completedAt}`]:[]].join(`
|
|
9
|
+
`)}
|
|
10
|
+
|
|
11
|
+
Task prompt:
|
|
12
|
+
${e.prompt??`(unknown)`}
|
|
13
|
+
|
|
14
|
+
Inspect as needed (grep/read selectively; events can be large):
|
|
15
|
+
- progress log (jsonl, one event per line): ${q.join(t,`log.jsonl`)}
|
|
16
|
+
- final result: ${q.join(t,`result.json`)}
|
|
17
|
+
- worker output: ${q.join(t,`worker.log`)}
|
|
18
|
+
${e.cwd?`- the task's workspace (its code and changes): ${e.cwd}`:``}
|
|
19
|
+
|
|
20
|
+
Question: ${n}
|
|
21
|
+
|
|
22
|
+
Answer the question directly and concisely.`}async function rt(e,t,n,r={}){let a=nt(t,i(e,t.id),n),o=r.effort??t.effort??null;if(t.engine===`claude`)return _e(t.cwd??e,{prompt:a,model:r.model??t.model,effort:o,permissions:`read-only`});let s=B(e),c=r.model??t.model,l=c?s.models?.[c]:void 0,u=l&&P(l)?l:void 0;if(u?.envKey&&!G.env[u.envKey])throw Error(`Missing environment variable: \`${u.envKey}\`.`);let d=u?await Ke(u,u.wireApi??`chat`):null,f=xe(s,c,d??void 0);try{return await ye(t.cwd??e,{prompt:a,model:f?.model??Ne(c??null),modelProvider:f?.modelProvider??null,configOverrides:f?.configOverrides??null,effort:o,sandbox:`read-only`,approvalPolicy:`never`,ephemeral:!0})}finally{await d?.close()}}async function it(e){let{options:t,positionals:n}=v(e,J.object({...b,model:C,effort:C})),r=V(t),[i,...a]=n,o=a.join(` `).trim();(!i||!o)&&O(`Missing task id or question.`,{hint:[`Usage: coder task ask <task-id> "<question>"`,`Help: coder task ask --help`]});let s=R(r,i);t.json||G.stderr.write(`${N.dim(`[coder]`)} asking about task ${N.cyan(s.id)} (read-only sidecar; the task is not interrupted)...\n`);let c=await rt(r,s,o,{model:t.model,effort:t.effort}),l=c.finalMessage||``;if(t.json)D({taskId:s.id,answer:l||null,...c.error?{error:c.error.message}:{}});else if(l)G.stdout.write(`\n${l}\n`);else{let e=c.error?.message?` ${N.red(c.error.message)}`:``;G.stdout.write(`${N.dim(`(no answer)`)}${e}\n`)}G.exitCode=c.status===0?0:1}function at(e,n={}){let i=n.limit===`all`?void 0:n.limit,s=e=>r.includes(e.status),c=[],l=o(e).filter(t=>{if(!s(t))return!0;let n=t.completedAt??t.updatedAt??t.createdAt;return se(n)<=6e5||(_(e,t),c.push(t.id),!1)});if(De(e,c),n.archived?l=t(e):n.running?l=l.filter(e=>u.includes(e.status)):n.stopped&&(l=l.filter(s)),n.dir){let e=a(q.resolve(String(n.dir)));l=l.filter(t=>t.cwd&&a(t.cwd)===e)}if(!n.archived&&!n.running&&!n.stopped){let e=e=>e.status===`failed`?0:u.includes(e.status)?1:e.status===`completed`?3:2;l=[...l].sort((t,n)=>e(t)-e(n))}let d=i===void 0?0:Math.max(0,l.length-i);return i!==void 0&&(l=l.slice(0,i)),{jobs:l,clipped:d}}async function ot(e){let{options:r,positionals:i}=v(e,J.object({cwd:C,dir:C,limit:f,json:S,running:S,stopped:S,archived:S}));W(i,0,`task list`);let a=V(r),o=r.limit===`all`?void 0:r.limit,{jobs:s,clipped:c}=at(a,{running:r.running,stopped:r.stopped,archived:r.archived,dir:r.dir??r.cwd,limit:r.limit}),l=s.map(e=>({taskId:e.id,status:e.status,agent:e.agent??null,model:e.model??null,effort:e.effort??null,name:e.name??null,cwd:e.cwd??null,prompt:String(e.prompt??``).replace(/\s+/g,` `).trim().slice(0,80),updatedAt:e.updatedAt,archived:e.archived??!1,flowRunId:e.flowRunId??null,idleMs:u.includes(e.status)?se(n(a,e)):null}));if(r.json){D(l);return}if(!l.length){let e=r.archived?`archived tasks`:r.running?`running tasks`:r.stopped?`recently stopped tasks`:`recent tasks`;G.stdout.write(`No ${e}.\n`);let n=[];if(!r.archived){let e=t(a,{migrate:!1}).length;e&&n.push(`${e} archived: coder task list --archived [--limit N]`)}n.length&&G.stdout.write(`\n${j(n,N)}\n`);return}let d=N,p=e=>(e.agent===`custom`&&e.model?e.model:(e.agent??`-`)+(e.model?`/${e.model}`:``))+(e.effort?`/${e.effort}`:``),m=e=>e.cwd?q.basename(e.cwd):`-`,h=(e,t,n)=>Math.min(t,Math.max(e,...n.map(e=>e.length))),g={id:h(7,28,l.map(e=>e.taskId)),who:h(5,26,l.map(p)),cwd:h(3,24,l.map(m))},_=e=>{let t=e.archived?` ${d.dim(`(archived)`)}`:``,n=e.name?e.name:d.light(e.prompt),r=e.idleMs!==null&&e.idleMs>=12e4?` ${(e.idleMs>6e5?d.red:d.dim)(`· idle ${ie(e.idleMs)}`)}`:``;G.stdout.write(`${d.cyan(e.taskId.padEnd(g.id))} ${ue(e.status,10)} ${d.light(Ie(p(e),g.who))} ${d.light(Ie(m(e),g.cwd))} ${n}${r}${t}\n`)};G.stdout.write(d.bold(d.light(`${`task-id`.padEnd(g.id)} ${`status`.padEnd(10)} ${`agent`.padEnd(g.who)} ${`cwd`.padEnd(g.cwd)} name\n`)));let y=new Map;for(let e of l)e.flowRunId&&(y.get(e.flowRunId)??y.set(e.flowRunId,[]).get(e.flowRunId)).push(e);let b=new Set,x=!1,w=!1;for(let e of l){if(!e.flowRunId){w&&G.stdout.write(`
|
|
23
|
+
`),_(e),x=!0,w=!1;continue}if(b.has(e.flowRunId))continue;b.add(e.flowRunId);let t=we(e.flowRunId),n=t?`(${d.bold(e.flowRunId)} ${t.status} — flow ${t.name})`:`(${d.bold(e.flowRunId)} flow)`;G.stdout.write(`${x?`
|
|
24
|
+
`:``}${n}\n`);for(let t of y.get(e.flowRunId))_(t);x=!0,w=!0}c&&G.stdout.write(d.dim(`\n... ${c} more not shown (--limit ${o})\n`));let T=[`Result: coder task result <task-id>`];r.archived||T.push(`Older tasks: coder task list --archived [--limit N]`),G.stdout.write(`\n${j(T,d)}\n`)}function st(){let e=process.env.CLAUDE_CONFIG_DIR||q.join(Re.homedir(),`.claude`);return q.join(e,`projects`)}function ct(e){if(!e)return!1;let t=st(),n=!1;try{for(let r of K.readdirSync(t)){let i=q.join(t,r,`${e}.jsonl`);K.existsSync(i)&&(K.rmSync(i,{force:!0}),n=!0)}}catch{}return n}function Y(e){e.threadId&&(e.engine===`codex`?l(e.threadId):e.engine===`claude`&&ct(e.threadId))}async function lt(e){let{options:n,positionals:r}=v(e,J.object({...b,"all-archived":S}));W(r,1,`task delete`);let i=V(n);if(n[`all-archived`]){let e=t(i).filter(e=>(Y(e),w(i,e.id))).map(e=>e.id);if(n.json){D({deleted:e,count:e.length});return}G.stdout.write(e.length?`Deleted ${e.length} archived task${e.length===1?``:`s`}.\n`:`${N.dim(`No archived tasks to delete.`)}\n`);return}let a=r[0];a||O(`Missing task id.`,{hint:[`Delete one: coder task delete <task-id>`,`Delete all archived: coder task delete --all-archived`]});let o=R(i,a);if(o.status===`running`&&O(`Task ${o.id} is still running.`,{hint:`Stop it first: coder task stop ${o.id}`}),Y(o),w(i,o.id),n.json){D({taskId:o.id,deleted:!0});return}G.stdout.write(`Deleted task ${N.cyan(o.id)}.\n`)}function X(e,t){return t.split(`.`).reduce((e,t)=>e?.[t],e)}function ut(e,t){return t?q.join(a(e),`coder.config.json`):F()}function dt(e,t){let n=B(e);return t?X(n,t):n}function ft(e,t,n,r={}){let i=ut(e,r.workspace),a=K.existsSync(i)?JSON.parse(K.readFileSync(i,`utf8`)):{},o=t.split(`.`),s=o.at(-1),c=a;for(let e of o.slice(0,-1))(typeof c[e]!=`object`||c[e]===null)&&(c[e]={}),c=c[e];r.unset?delete c[s]:c[s]=n;let l=ke(a);if(l.length)throw Error(`Refusing to write invalid config:\n ${l.join(`
|
|
25
|
+
`)}`);return K.mkdirSync(q.dirname(i),{recursive:!0}),K.writeFileSync(i,`${JSON.stringify(a,null,2)}\n`,`utf8`),{file:i,key:t,effective:X(B(e),t)??null,...r.unset?{unset:!0}:{value:n}}}async function pt(e){let{options:t,positionals:n}=v(e,J.object({...b,workspace:S})),r=V(t),[i=`list`,a,...o]=n,s=ut(r,t.workspace);if(i===`list`){let e=B(r);if(t.json){D(e);return}let n=N,i=e=>[e?.model,e?.effort,e?.permissions].filter(Boolean).join(`/`)||`-`;G.stdout.write([`${n.dim(`chain`)} ${e.chain.join(` -> `)}`,`${n.dim(`codex`)} ${i(e.agents.codex)}`,`${n.dim(`claude`)} ${i(e.agents.claude)}`,`${n.dim(`approvals`)} timeout=${e.approvals.escalationTimeoutMs}ms hosts=[${e.approvals.allowedNetworkHosts.join(`, `)}]`,`${n.dim(`file`)} ${F()}`].join(`
|
|
26
|
+
`)+`
|
|
27
|
+
`);return}if(i===`get`){a||O(`Usage: coder config get <key> (e.g. chain, agents.codex.model)`);let e=X(B(r),a);if(t.json||e===null||typeof e==`object`&&e!==void 0){D(e===void 0?null:e);return}G.stdout.write(`${e===void 0?`(unset)`:String(e)}\n`);return}i!==`set`&&i!==`unset`&&O(`Usage: coder config [get|set|unset] <key> [value] [--workspace]`),(!a||i===`set`&&o.length===0)&&O(`Usage: coder config ${i} <key>${i===`set`?` <value>`:``}`);let c=o.join(` `),l;try{l=JSON.parse(c)}catch{l=c.includes(`,`)?c.split(`,`).map(e=>e.trim()).filter(Boolean):c}let u;try{({effective:u}=ft(r,a,l,{workspace:t.workspace,unset:i===`unset`}))}catch(e){O(e instanceof Error?e.message:String(e))}if(t.json){D({file:s,key:a,...i===`set`?{value:l}:{unset:!0},effective:u});return}let d=N,f=i===`set`?`${d.cyan(a)} = ${JSON.stringify(l)}`:`unset ${d.cyan(a)}`;G.stdout.write(`${f} ${d.dim(`(${s})`)}\n`)}async function mt(e,t={}){let n=I(e),r=de(n);r?.updated&&(n=I(e));let i=n.available?await Te(e):{loggedIn:!1,detail:n.detail},a=ae(),o=a.available?Ae():{loggedIn:!1,detail:a.detail},s=F();if(!K.existsSync(s)){let e=n.available?[`codex`,`claude`]:a.available?[`claude`,`codex`]:[`codex`,`claude`];Oe({...Ce,chain:e})}let c=h(),l=t.claude?ne(c):null,u=t.agents||t.codex?he(c):null,d=B(e),f=n.available&&i.loggedIn||a.available&&o.loggedIn;return{codex:{available:n.available,detail:n.detail,auth:i.detail,loggedIn:i.loggedIn},...r?{codexUpdate:r}:{},claude:{available:a.available,detail:a.detail,auth:o.detail,loggedIn:o.loggedIn},configFile:s,runtime:ze(new URL(`../bin/coder.mjs`,import.meta.url)),...l?{claudePlugin:l}:{},...u?{agentsSkill:u}:{},config:d,ready:f}}async function ht(e){let{options:t,positionals:n}=v(e,J.object({...b,codex:S,claude:S,agents:S})),r=V(t),i=[`claude`,`codex`,`agents`];for(let e of n)i.includes(e)||O(`Unknown host "${e}". Use claude, codex, or agents.`,{hint:`Codex, Pi, OpenCode, and other Agent Skills hosts: coder setup-host agents`}),t[e]=!0;let a=N.bold,o=N.dim;t.json||G.stdout.write(`${a(`Coder host setup`)}\n\n`);let s=await mt(r,{claude:t.claude,codex:t.codex,agents:t.agents});if(t.json){D(s);return}let{codex:c,claude:l,codexUpdate:u,config:d,configFile:f,claudePlugin:p,agentsSkill:m,ready:h}=s,g=[],_=c.available?c.loggedIn?k(`codex ${o(`${c.detail}; ${c.auth}`)}`):A(`codex not logged in ${o(`(${c.auth})`)} - run: codex login`):A(`codex CLI not installed - run: npm install -g @openai/codex`),y=l.available?l.loggedIn?k(`claude ${o(`${l.detail}; ${l.auth}`)}`):A(`claude not logged in - run: claude auth login`):A(`claude CLI not installed - run: npm install -g @anthropic-ai/claude-code`);g.push(a(`Available Engines`),_,y,` ${o(`custom models (local/provider endpoints): coder model --help`)}`),u?.updated?g.push(k(`codex ${o(`updated ${u.from} -> ${c.detail} (GPT-5.6 support)`)}`)):u&&g.push(A(`codex ${u.note}`)),g.push(``);let x=e=>{let t=d.agents?.[e]??{};return[t.model,t.effort,t.permissions].filter(Boolean).join(`/`)};g.push(a(`Config`),` chain: ${(d.chain??[]).join(` -> `)} codex: ${x(`codex`)} claude: ${x(`claude`)}`,` ${o(f)} ${o(`(coder config set <key> <value> to change)`)}`,``);let C=[[`claude plugin`,p??null],[`agents skill `,m??null]];for(let[e,t]of C)t&&g.push(t.installed?k(`${e} ${o(t.note)}`):A(`${e} ${t.note}`),``);g.push(h?k(`ready - try: coder run --wait "explain this repo's layout"`):A(`not ready - install an engine CLI to run tasks: codex (npm install -g @openai/codex, then codex login) or claude (npm install -g @anthropic-ai/claude-code, then claude auth login)`)),G.stdout.write(`${g.join(`
|
|
28
|
+
`)}\n`)}const gt=new Set([`codex`,`claude`,`custom`]);async function _t(e){let t=e.envKey?G.env[e.envKey]:void 0,n=z(e.baseUrl,`models`),r=null;for(let i of n)try{let n=await fetch(i,{headers:t?{Authorization:`Bearer ${t}`}:{},signal:AbortSignal.timeout(5e3)});if(!n.ok){r=n.status===404?{reachable:!0,modelListed:null,detail:`endpoint reachable (no model list to verify against)`}:{reachable:!1,modelListed:null,detail:`${i} -> HTTP ${n.status}`};continue}let a=await n.json().catch(()=>null),o=Array.isArray(a?.data)?a.data.map(e=>e.id):null;if(!o)return{reachable:!0,modelListed:null,detail:`endpoint reachable`};let s=o.includes(e.model);return{reachable:!0,modelListed:s,detail:s?`endpoint reachable; model "${e.model}" listed`:`endpoint reachable, but "${e.model}" is not in its model list`}}catch(e){r={reachable:!1,modelListed:null,detail:`${i} unreachable (${e instanceof Error?e.message:String(e)})`}}return r}function vt(e,t){let n=K.existsSync(e)?JSON.parse(K.readFileSync(e,`utf8`)):{};t(n),n.models&&Object.keys(n.models).length===0&&delete n.models;let r=ke(n);r.length&&O(`Refusing to write invalid config:\n ${r.join(`
|
|
29
|
+
`)}`),K.mkdirSync(q.dirname(e),{recursive:!0}),K.writeFileSync(e,`${JSON.stringify(n,null,2)}\n`,`utf8`)}function Z(e,t){vt(e,e=>{e.models=e.models??{},t(e.models)})}const Q=J.object({...b,"base-url":C,model:C,"env-key":C,workspace:S});function $(e,t){return e.workspace?q.join(a(t),`coder.config.json`):F()}function yt(e){let t=e.models??{},n=Object.entries(t).filter(e=>P(e[1])),r=e=>`${e.provider}:${e.model}${e.effort?`:${e.effort}`:``}`,i=Object.entries(t).filter(e=>H(e[1])).map(([e,t])=>{let n=t.provider===`claude`?M:E,i=n[t.model]??t.model,a=L(e)?e:Object.entries(n).find(([,e])=>e===i)?.[0];return{name:e,spec:r(t),replaces:a,disabled:!!t.disabled}}),a=new Map;for(let e of i)e.replaces&&(e.name===e.replaces||!a.has(e.replaces))&&a.get(e.replaces)?.name!==e.replaces&&a.set(e.replaces,e);let o=e=>!!t[e]?.disabled,s=i.filter(e=>![...a.values()].some(t=>t.name===e.name));return{models:t,endpoints:n,providerRows:(e,t)=>[...Object.entries(t).map(([e,t])=>{let n=a.get(e);return n?{alias:n.name,spec:n.spec,overrides:e,disabled:n.disabled}:{alias:e,model:t,builtin:!0,disabled:o(e)}}),...s.filter(t=>t.spec.startsWith(`${e}:`)).map(({name:e,spec:t,disabled:n})=>({alias:e,spec:t,disabled:n}))],toggledSlugs:Object.entries(t).filter(([e,t])=>!P(t)&&!H(t)&&!L(e)).map(([e,t])=>({name:e,disabled:!!t.disabled})),disabled:o}}async function bt(e){let{endpoints:t,providerRows:n,toggledSlugs:r}=yt(B(e)),i=await Promise.all(t.map(async([e,t])=>({name:e,...t,probe:await _t(t)})));return{codex:n(`codex`,E),claude:n(`claude`,M),custom:i,...r.length?{toggles:r}:{}}}async function xt(e){let{options:t,positionals:n}=v(e,Q);n.length&&O(`model list takes no arguments.`,{hint:`Usage: coder model list [--json]`});let r=V(t),i=N,{endpoints:a,providerRows:o,toggledSlugs:s,disabled:c}=yt(B(r));if(t.json){D(await bt(r));return}let l=e=>c(e)?i.dim(`∅`):i.green(`✔`),u=e=>c(e)?` ${i.dim(`(disabled)`)}`:``,d=[],f=(e,t,n)=>{d.push(i.bold(e));for(let e of o(t,n))`overrides`in e?d.push(` ${e.disabled?i.dim(`∅`):i.cyan(`↳`)} ${e.alias.padEnd(14)} ${i.dim(`-> ${e.spec} (overrides ${e.overrides})`)}${e.disabled?` ${i.dim(`(disabled)`)}`:``}`):`builtin`in e?d.push(` ${l(e.alias)} ${e.alias.padEnd(14)} ${i.dim(`-> ${e.model}`)}${u(e.alias)}`):d.push(` ${e.disabled?i.dim(`∅`):i.cyan(`↳`)} ${e.alias.padEnd(14)} ${i.dim(`-> ${e.spec}`)}${e.disabled?` ${i.dim(`(disabled)`)}`:``}`);d.push(``)};if(f(`Codex models`,`codex`,E),f(`Claude models`,`claude`,M),d.push(i.bold(`Custom models`),``),!a.length)d.push(i.dim(` none — coder model add <name> --base-url <url> --model <id> [--env-key VAR]`));else for(let[e,t]of a){let n=await _t(t),r=t.disabled?i.dim(`∅`):n.reachable?i.green(`✔`):i.red(`✘`);d.push(` ${r} ${e.padEnd(14)} ${t.model} ${i.dim(`@ ${t.baseUrl} — ${n.detail}`)}${u(e)}`)}if(d.push(``),s.length){d.push(i.bold(`Other`),``);for(let e of s)d.push(` ${e.disabled?i.dim(`∅`):i.green(`✔`)} ${e.name.padEnd(14)} ${i.dim(`raw model id`)}${e.disabled?` ${i.dim(`(disabled)`)}`:``}`);d.push(``)}d.push(i.dim(`Alias one: coder model alias <name> <spec> (e.g. fast codex:mini)`),i.dim(`Use one: coder run --model <name> "<task>" (or coder run --agent custom)`)),G.stdout.write(`${d.join(`
|
|
30
|
+
`)}\n`)}async function St(e,t,n,r){let i=await Je(t),a=i?.wireApi===`responses`;i?(t.wireApi=i.wireApi,t.baseUrl=i.baseUrl??t.baseUrl):delete t.wireApi,Z(n,n=>{n[e]=t});let o=await _t(t),s=re(I(r)),c=I(r);return{name:e,entry:t,file:n,probe:o,codex:c,install:s,nativeResponses:a,keyMissing:!!(t.envKey&&!G.env[t.envKey]),ready:o.reachable&&c.available}}async function Ct(e,t,n,r,i){let a=$(n,r),o=N,{probe:s,codex:c,install:l,nativeResponses:u,keyMissing:d}=await St(e,t,a,r);if(n.json){D({name:e,...t,file:a,probe:s,codex:c,...l?{codexInstall:l}:{},ready:s.reachable&&c.available});return}let f=e=>` ${o.green(`✔`)} ${e}`,p=e=>` ${o.red(`✘`)} ${e}`,m=[`${i} ${o.cyan(e)} -> ${t.model} @ ${t.baseUrl} ${o.dim(`(${a})`)}`,``,s.reachable?f(`${s.detail} ${o.dim(`(${u?`responses api, direct`:`chat api, auto-translated`})`)}`):p(s.detail),c.available?f(l?.installed?`${l.note} ${o.dim(`(${c.detail})`)}`:`codex engine ${o.dim(`(${c.detail})`)}`):p(l?.note??`codex CLI not installed - run: npm install -g @openai/codex`)];d&&m.push(p(`env var ${t.envKey} is not set in this shell`)),m.push(``,o.dim([`Use it: coder run --model ${e} "<task>"`,`Make default: coder config set agents.custom.model ${e}`].join(`
|
|
31
|
+
`))),G.stdout.write(`${m.join(`
|
|
32
|
+
`)}\n`)}function wt(e,t,n){return e||O(`Missing model name.`,{hint:t}),/^[a-z][a-z0-9-]*$/.test(e)||O(`Invalid model name "${e}". Use lowercase kebab-case (e.g. qwen-local).`),(gt.has(e)||n===`model`&&L(e))&&O(`"${e}" is reserved; pick another name.`),e}async function Tt(e){let t=`Usage: coder model add <name> --base-url <url> --model <id> [--env-key VAR]`,{options:n,positionals:r}=v(e,Q),i=V(n),a=wt(r[0],t,`model`),o=B(i).models?.[a];o&&O(P(o)?`Custom model "${a}" already exists.`:`"${a}" is already configured as an ${H(o)?`alias`:`entry`}; remove it first.`,{hint:`Change it: coder model update ${a} [--base-url|--model|--env-key], or remove it first.`}),(!n[`base-url`]||!n.model)&&O(`Missing --base-url or --model.`,{hint:t}),await Ct(a,{baseUrl:U(n[`base-url`]),model:n.model,...n[`env-key`]?{envKey:n[`env-key`]}:{}},n,i,`saved`)}async function Et(e){let t=`Usage: coder model update <name> [--base-url <url>] [--model <id>] [--env-key VAR]`,{options:n,positionals:r}=v(e,Q),i=V(n),a=r[0],o=a?B(i).models?.[a]:void 0,s=o&&P(o)?o:void 0;(!a||!s)&&O(a?`No custom model named "${a}".`:`Missing model name.`,{hint:a?`List them: coder model list`:t}),!n[`base-url`]&&!n.model&&!n[`env-key`]&&O(`Nothing to update: pass --base-url, --model, or --env-key.`,{hint:t}),await Ct(a,{...s,...n[`base-url`]?{baseUrl:U(n[`base-url`])}:{},...n.model?{model:n.model}:{},...n[`env-key`]?{envKey:n[`env-key`]}:{}},n,i,`updated`)}async function Dt(e){let{options:t,positionals:n}=v(e,Q),r=V(t),i=n[0],a;try{a=It(r,i??``,{workspace:t.workspace})}catch(e){O(e instanceof Error?e.message:String(e),{hint:i?`List them: coder model list`:`Usage: coder model remove <name>`})}if(t.json){D(a);return}G.stdout.write(`removed ${N.cyan(a.removed)} ${N.dim(`(${a.file})`)}\n`)}async function Ot(e){await At(e,!0)}async function kt(e){await At(e,!1)}async function At(e,t){let n=t?`disable`:`enable`,r=`Usage: coder model ${n} <name>`,{options:i,positionals:a}=v(e,Q),o=V(i),s=a[0];s||O(`Missing model name.`,{hint:r});let{file:c}=zt(o,s,t,{workspace:i.workspace});if(i.json){D({[t?`disabled`:`enabled`]:s,file:c});return}G.stdout.write(`${n}d ${N.cyan(s)} ${N.dim(`(${c})`)}\n`)}async function jt(e){let t=`Usage: coder model alias <name> <spec> (e.g. coder model alias fast codex:mini)`,{options:n,positionals:r}=v(e,Q),i=V(n),a=wt(r[0],t,`alias`),o=B(i).models?.[a];o&&P(o)&&O(`"${a}" is a custom model name; pick another alias name.`);let s=r[1];s||O(`Missing alias spec.`,{hint:t});let c;try{c=Lt(i,a,s,{workspace:n.workspace})}catch(e){let n=e instanceof Error?e.message:String(e);O(n,n.includes(`already dispatchable by name`)?{}:{hint:t})}if(n.json){D(c);return}let l=N,u=`${c.provider} ${c.model}${c.effort?` (${c.effort})`:``}`;G.stdout.write(`aliased ${l.cyan(a)} -> ${c.provider}:${c.model}${c.effort?`:${c.effort}`:``} ${l.dim(`= ${u}`)} ${l.dim(`(${c.file})`)}\n`)}async function Mt(e){let{options:t,positionals:n}=v(e,Q),r=V(t),i=n[0],a=i?B(r).models?.[i]:void 0;(!i||!a||!H(a))&&O(i?`No alias named "${i}".`:`Missing alias name.`,{hint:i?`List them: coder model list`:`Usage: coder model unalias <name>`});let{file:o}=Rt(r,i,{workspace:t.workspace});if(t.json){D({unaliased:i,file:o});return}G.stdout.write(`unaliased ${N.cyan(i)} ${N.dim(`(${o})`)}\n`)}function Nt(e,t){if(!e)throw Error(`Missing model name.`);if(!/^[a-z][a-z0-9-]*$/.test(e))throw Error(`Invalid model name "${e}". Use lowercase kebab-case (e.g. qwen-local).`);if(gt.has(e)||t===`model`&&L(e))throw Error(`"${e}" is reserved; pick another name.`)}async function Pt(e,t,n){if(Nt(t,`model`),B(e).models?.[t])throw Error(`Custom model "${t}" already exists.`);if(!n.baseUrl||!n.model)throw Error(`Missing baseUrl or model.`);return St(t,{baseUrl:U(n.baseUrl),model:n.model,...n.envKey?{envKey:n.envKey}:{}},$({workspace:n.workspace},e),e)}async function Ft(e,t,n){let r=B(e).models?.[t],i=r&&P(r)?r:void 0;if(!i)throw Error(`No custom model named "${t}".`);if(!n.baseUrl&&!n.model&&!n.envKey)throw Error(`Nothing to update: pass baseUrl, model, or envKey.`);return St(t,{...i,...n.baseUrl?{baseUrl:U(n.baseUrl)}:{},...n.model?{model:n.model}:{},...n.envKey?{envKey:n.envKey}:{}},$({workspace:n.workspace},e),e)}function It(e,t,n={}){if(!t||!B(e).models?.[t])throw Error(t?`No custom model named "${t}".`:`Missing model name.`);let r=$({workspace:n.workspace},e);return Z(r,e=>{delete e[t]}),{removed:t,file:r}}function Lt(e,t,n,r={}){Nt(t,`alias`);let i=B(e),a=i.models?.[t];if(a&&P(a))throw Error(`"${t}" is a custom model name; pick another alias name.`);if(!n)throw Error(`Missing alias spec.`);let o=be(n,i);if(!o||!o.model)throw Error(`Alias spec "${n}" does not resolve to a model.`);if(o.agent===`custom`)throw Error(`"${n}" names a custom model, which is already dispatchable by name; aliases target codex/claude models.`);let s=n.split(`:`).some(e=>le.has(e.trim())||ge.has(e.trim())),c=o.agent===`claude`?M:E,l={provider:o.agent,model:c[o.model]??o.model,...s&&o.effort?{effort:o.effort}:{}},u=$({workspace:r.workspace},e);return Z(u,e=>{e[t]=l}),{alias:t,...l,file:u}}function Rt(e,t,n={}){let r=t?B(e).models?.[t]:void 0;if(!t||!r||!H(r))throw Error(t?`No alias named "${t}".`:`Missing alias name.`);let i=$({workspace:n.workspace},e);return Z(i,e=>{delete e[t]}),{unaliased:t,file:i}}function zt(e,t,n,r={}){if(!t)throw Error(`Missing model name.`);let i=!!B(e).models?.[t],a=$({workspace:r.workspace},e);return Z(a,e=>{let r=e[t];if(!r){n?e[t]={disabled:!0}:i&&(e[t]={disabled:!1});return}P(r)||H(r)?n?r.disabled=!0:delete r.disabled:n?r.disabled=!0:delete e[t]}),{name:t,disabled:n,file:a}}const Bt={list:xt,add:Tt,setup:Tt,update:Et,remove:Dt,disable:Ot,enable:kt,alias:jt,unalias:Mt};async function Vt(e){let[t,...n]=e;if(t===void 0||t.startsWith(`-`)){await xt(e);return}let r=Bt[t];r||O(`Unknown model subcommand "${t}". Use list, add, update, remove, disable, enable, alias, or unalias.`,{hint:`Help: coder model --help`}),await r(n)}const Ht=[{name:`readme`,file:`README.md`,description:`What Coder is and how to get started.`},{name:`skill`,file:`plugins/agents/skills/coder/SKILL.md`,description:`How a host agent should drive Coder.`}];function Ut(e){let t=q.join(e,`docs`),n=[];try{n=K.readdirSync(t).filter(e=>e.endsWith(`.md`)).sort()}catch{n=[]}let r=n.map(t=>{let n=q.join(`docs`,t);return{name:q.basename(t,`.md`),file:n,description:Wt(q.join(e,n))}}),i=Ht.map(e=>({name:e.name,file:e.file,description:e.description}));return[...r,...i]}function Wt(e){let t=``;try{t=K.readFileSync(e,`utf8`)}catch{return``}let n=t.split(`
|
|
33
|
+
`),r=``,i=``,a=!1;for(let e of n){let t=e.trim();if(t.startsWith("```")){a=!a;continue}if(!(a||t===``)){if(t.startsWith(`#`)){r||=t.replace(/^#+\s*/,``);continue}i=t;break}}return Gt(i)||r}function Gt(e){if(!e)return``;let t=e.match(/^.*?[.!?](?=\s|$)/);return(t?t[0]:e).trim()}function Kt(e,t={}){let n=h(),r=Ut(n);if(!e)return{topics:r.map(e=>({name:e.name,description:e.description}))};let i=r.find(t=>t.name===e.toLowerCase());if(i?.name===`skill`&&t.claude&&(i={...i,file:`plugins/claude/skills/dispatch/SKILL.md`}),!i)throw Error(`Unknown docs topic "${e}". Available: ${r.map(e=>e.name).join(`, `)}`);let a=q.join(n,i.file),o;try{o=K.readFileSync(a,`utf8`)}catch{throw Error(`Could not read docs for "${i.name}" (${i.file}).`)}return{name:i.name,content:o}}async function qt(e){let{options:t,positionals:n}=v(e,J.object({json:S,claude:S})),[r]=n,i;try{i=Kt(r,{claude:t.claude})}catch(e){let t=e instanceof Error?e.message:String(e);return O(t,t.startsWith(`Unknown docs topic`)?{hint:`List topics: coder docs`}:{})}if(`content`in i){G.stdout.write(i.content.endsWith(`
|
|
34
|
+
`)?i.content:`${i.content}\n`);return}if(t.json){D(i);return}let a=N,o=Math.max(0,...i.topics.map(e=>e.name.length)),s=i.topics.map(e=>` ${a.cyan(e.name.padEnd(o))} ${a.dim(e.description)}`);G.stdout.write([a.bold(`Docs:`),...s,``,j([`Read a topic: coder docs <topic>`],a)].join(`
|
|
35
|
+
`)+`
|
|
36
|
+
`)}async function Jt(e={},t){let n=!e.pluginsOnly,r=!e.cliOnly,i=h(),a=q.join(i,`plugins/claude/.claude-plugin/plugin.json`),o={cli:y(),claude:x(a)},s={};if(n){let n=Ee(m),[r,...i]=e.pm===`npm`?[`npm`,`install`,`-g`,`@wular/coder@latest`]:e.pm===`pnpm`?[`pnpm`,`add`,`-g`,`@wular/coder@latest`]:e.pm===`yarn`?[`yarn`,`global`,`add`,`@wular/coder@latest`]:e.pm===`bun`?[`bun`,`add`,`-g`,`@wular/coder@latest`]:n.command,a=e.pm??n.pm;t?.(`via ${a}`);let c=Le(r,i,{encoding:`utf8`});if(c.error?.code===`ENOENT`)throw Error(`${a} not found on PATH. Re-run with --pm <npm|pnpm|yarn|bun>, or update manually: ${r} ${i.join(` `)}`);if(c.status!==0){let e=(c.stderr||c.stdout||``).trim();throw Error(`CLI update failed (${a}).${e?`\n${e}`:``}\nRun manually: ${r} ${i.join(` `)}`)}ee();let l=y();s.cli={pm:a,from:o.cli,to:l,changed:l!==o.cli}}if(r){if(e.claude||!e.codex&&ae().available){let e=ne(i);s.claudePlugin={installed:e.installed,note:e.note,from:o.claude,to:x(a)}}if(K.existsSync(pe())){let e=oe(),t=he(i);s.agentsSkill={installed:t.installed,note:t.note,from:e,to:oe()}}}return s}async function Yt(e){let{options:t}=v(e,J.object({pm:C,"cli-only":S,"plugins-only":S,codex:S,claude:S})),n=N.bold,r=N.dim,i=(e,t)=>t&&e&&t!==e?`${e} ${r(`->`)} ${n(t)}`:`${t??e??`?`} ${r(`(unchanged)`)}`,a;try{a=await Jt({cliOnly:t[`cli-only`],pluginsOnly:t[`plugins-only`],pm:t.pm,codex:t.codex,claude:t.claude},e=>G.stdout.write(`${n(`Updating coder CLI`)} ${r(`${e}...`)}\n`))}catch(e){O(e instanceof Error?e.message:String(e))}if(a.cli&&G.stdout.write(a.cli.changed?`${k(`coder CLI ${i(a.cli.from,a.cli.to)}`)}\n`:`${k(`coder CLI ${a.cli.from} ${r(`(already latest)`)}`)}\n`),a.claudePlugin){let e=a.claudePlugin;G.stdout.write(`${e.installed?k(`claude plugin ${i(e.from,e.to)} ${r(`- ${e.note}`)}`):A(`claude plugin ${e.note}`)}\n`)}if(a.agentsSkill){let e=a.agentsSkill;G.stdout.write(`${e.installed?k(`agents skill ${i(e.from,e.to)} ${r(`- ${e.note}`)}`):A(`agents skill ${e.note}`)}\n`)}}export{it as C,Ye as D,Xe as E,Je as O,rt as S,Qe as T,ft as _,Vt as a,at as b,bt as c,Rt as d,Ft as f,dt as g,pt as h,Kt as i,Ke as k,It as l,mt as m,Jt as n,Pt as o,ht as p,qt as r,Lt as s,Yt as t,zt as u,lt as v,et as w,ot as x,Y as y};
|
package/docs/sdk.md
CHANGED
|
@@ -23,10 +23,11 @@ SDK functions never print and never call `process.exit`; results come back as ty
|
|
|
23
23
|
| ------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
24
24
|
| `coder run "<text>"` | `task.run(prompt, opts?)` |
|
|
25
25
|
| `coder list` | `task.list(opts?)` |
|
|
26
|
-
| `coder result [id] [--wait] [--tail N]`
|
|
26
|
+
| `coder result [id] [--wait] [--tail N] [--turns]` | `task.result(id?, { wait?, tail? })` - returns `turns` (one entry per finished turn) alongside `result` |
|
|
27
27
|
| `coder task steer <id> "<text>"` | `task.steer(id, text)` |
|
|
28
|
+
| `coder task ask <id> "<question>"` | `task.ask(id, question, { model?, effort? })` - read-only sidecar answer; the task's thread is never touched |
|
|
28
29
|
| `coder task stop <id>` | `task.stop(id)` |
|
|
29
|
-
| `coder task
|
|
30
|
+
| `coder task watch [id] [--tail N]` | `task.stream(id?, { tail? })` - async iterable of progress events |
|
|
30
31
|
| `coder task approvals [id]` | `task.approvals(id?)` |
|
|
31
32
|
| `coder task approve <id> <appr>` | `task.approve(id, approvalId, { deny? })` |
|
|
32
33
|
| `coder task archive / delete <id>` | `task.archive(id)` / `task.delete(id)` |
|
|
@@ -34,7 +35,7 @@ SDK functions never print and never call `process.exit`; results come back as ty
|
|
|
34
35
|
| `coder flow list` | `flow.list()` |
|
|
35
36
|
| `coder flow discover` | `flow.discover()` |
|
|
36
37
|
| `coder flow result [id] [--tail N]` | `flow.result(id?, { tail? })` |
|
|
37
|
-
| `coder flow
|
|
38
|
+
| `coder flow watch [id] [--tail N]` | `flow.stream(id?, { tail? })` |
|
|
38
39
|
| `coder flow stop [id]` | `flow.stop(id?, { keepTasks? })` |
|
|
39
40
|
| `coder flow resume [id]` | `flow.resume(id?)` |
|
|
40
41
|
| `coder flow archive / delete <id>` | `flow.archive(id)` / `flow.delete(id)` |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wular/coder",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.3",
|
|
4
4
|
"description": "Delegating coding-agent runtime",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/sdk.js",
|
|
@@ -45,6 +45,8 @@
|
|
|
45
45
|
"zod": "^4.4.3"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"
|
|
48
|
+
"@types/node": "^26.1.2",
|
|
49
|
+
"tsdown": "^0.22.13",
|
|
50
|
+
"typescript": "^5.9.3"
|
|
49
51
|
}
|
|
50
52
|
}
|
|
@@ -52,7 +52,7 @@ coder flow --help # command reference
|
|
|
52
52
|
|
|
53
53
|
Preview with `--dry-run` before spending tokens - and note flow tasks are normal coder tasks, so steer/stop/list work on them.
|
|
54
54
|
|
|
55
|
-
Once a run is going, tell the user to run `coder flow
|
|
55
|
+
Once a run is going, tell the user to run `coder flow watch <run-id>` to see live progress and overview of its tasks as the wave goes. Give them the actual run id, not a placeholder.
|
|
56
56
|
|
|
57
57
|
For programmatic use - embedding coder in the user's own code or scripts - the SDK mirrors the CLI one-to-one; run `coder docs sdk` for the details.
|
|
58
58
|
|
|
@@ -67,7 +67,8 @@ With coders running in the background, don't fire-and-forget: check in on them r
|
|
|
67
67
|
## Controlling tasks
|
|
68
68
|
|
|
69
69
|
- Continue prior work ("keep going", "apply the top fix"): `coder task steer <task-id> "<follow-up>"`.
|
|
70
|
-
-
|
|
70
|
+
- Question a task without interrupting it (status, decisions, "why did it do X"): `coder task ask <task-id> "<question>"` - a read-only sidecar answers from the task's log and workspace; the task never sees it.
|
|
71
|
+
- Inspect: `coder task result <task-id>` (status + answer; add `--wait` to block until done) and `coder task list`. (`coder task watch <task-id>` streams the live progress log - to watch/debug in special cases, generally not for you to consume.)
|
|
71
72
|
- Interrupt: `coder task stop <task-id>`.
|
|
72
73
|
- If status shows `pendingApprovals`, surface them to the user; apply their decision with `coder task approve <task-id> <approval-id> [--deny]`.
|
|
73
74
|
|
|
@@ -50,7 +50,7 @@ coder flow --help # command reference
|
|
|
50
50
|
|
|
51
51
|
Preview with `--dry-run` before spending tokens - and note flow tasks are normal coder tasks, so steer/stop/list work on them.
|
|
52
52
|
|
|
53
|
-
Once a run is going, tell the user to run `coder flow
|
|
53
|
+
Once a run is going, tell the user to run `coder flow watch <run-id>` to see live progress and overview of its tasks as the wave goes. Give them the actual run id, not a placeholder.
|
|
54
54
|
|
|
55
55
|
For programmatic use - embedding coder in the user's own code or scripts - the SDK mirrors the CLI one-to-one; run `coder docs sdk` for the details.
|
|
56
56
|
|
|
@@ -65,7 +65,8 @@ With coders running in the background, don't fire-and-forget: schedule recurring
|
|
|
65
65
|
## Controlling tasks
|
|
66
66
|
|
|
67
67
|
- Continue prior work ("keep going", "apply the top fix"): `coder task steer <task-id> "<follow-up>"`.
|
|
68
|
-
-
|
|
68
|
+
- Question a task without interrupting it (status, decisions, "why did it do X"): `coder task ask <task-id> "<question>"` - a read-only sidecar answers from the task's log and workspace; the task never sees it.
|
|
69
|
+
- Inspect: `coder task result <task-id>` (status + answer; add `--wait` to block until done) and `coder task list`. (`coder task watch <task-id>` streams the live progress log - to watch/debug in special cases, generally not for you to consume.)
|
|
69
70
|
- Interrupt: `coder task stop <task-id>`.
|
|
70
71
|
- If status shows `pendingApprovals`, surface them to the user; apply their decision with `coder task approve <task-id> <approval-id> [--deny]`.
|
|
71
72
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "coder",
|
|
3
3
|
"displayName": "Coder",
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.3",
|
|
5
5
|
"description": "Delegate coding tasks to supervised Coder subagents running on Codex, Claude, or any OpenAI-compatible model. Your main context stays clean.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "muzam1l"
|
package/plugins/cursor/README.md
CHANGED
|
@@ -85,7 +85,7 @@ coder list # list recent tasks (running + just stopp
|
|
|
85
85
|
coder result [task-id] # status + final answer (--wait blocks until done)
|
|
86
86
|
coder task steer <task-id> "<text>" # continue a task with new instructions
|
|
87
87
|
coder task stop <task-id> # interrupt it
|
|
88
|
-
coder task
|
|
88
|
+
coder task watch [task-id] # watch the live progress log
|
|
89
89
|
coder task approve <task-id> <appr-id> # answer an escalated permission (--deny)
|
|
90
90
|
```
|
|
91
91
|
|
|
@@ -51,7 +51,7 @@ coder flow --help # command reference
|
|
|
51
51
|
|
|
52
52
|
Preview with `--dry-run` before spending tokens - and note flow tasks are normal coder tasks, so steer/stop/list work on them.
|
|
53
53
|
|
|
54
|
-
Once a run is going, tell the user to run `coder flow
|
|
54
|
+
Once a run is going, tell the user to run `coder flow watch <run-id>` to see live progress and overview of its tasks as the wave goes. Give them the actual run id, not a placeholder.
|
|
55
55
|
|
|
56
56
|
For programmatic use - embedding coder in the user's own code or scripts - the SDK mirrors the CLI one-to-one; run `coder docs sdk` for the details.
|
|
57
57
|
|
|
@@ -66,7 +66,8 @@ With coders running in the background, don't fire-and-forget: run a recurring mo
|
|
|
66
66
|
## Controlling tasks
|
|
67
67
|
|
|
68
68
|
- Continue prior work ("keep going", "apply the top fix"): `coder task steer <task-id> "<follow-up>"`.
|
|
69
|
-
-
|
|
69
|
+
- Question a task without interrupting it (status, decisions, "why did it do X"): `coder task ask <task-id> "<question>"` - a read-only sidecar answers from the task's log and workspace; the task never sees it.
|
|
70
|
+
- Inspect: `coder task result <task-id>` (status + answer; add `--wait` to block until done) and `coder task list`. (`coder task watch <task-id>` streams the live progress log - to watch/debug in special cases, generally not for you to consume.)
|
|
70
71
|
- Interrupt: `coder task stop <task-id>`.
|
|
71
72
|
- If status shows `pendingApprovals`, surface them to the user; apply their decision with `coder task approve <task-id> <approval-id> [--deny]`.
|
|
72
73
|
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import e from"node:process";import t from"node:fs";import n from"node:path";import{execFileSync as r,spawn as i,spawnSync as a}from"node:child_process";import o from"node:os";import{fileURLToPath as s}from"node:url";import*as c from"zod/mini";import l from"node:net";import u from"node:readline";function d(e){try{let t=i(`codex`,[`archive`,e],{detached:!0,stdio:`ignore`});t.on(`error`,()=>{}),t.unref()}catch{}}function f(e){let r=n.join(process.env.CODEX_HOME||n.join(o.homedir(),`.codex`),`archived_sessions`);try{return t.readdirSync(r).some(t=>t.endsWith(`-${e}.jsonl`))}catch{return!1}}function p(e){return new Promise(t=>{try{let n=i(`codex`,[`unarchive`,e],{stdio:`ignore`});n.on(`error`,()=>t(!1)),n.on(`close`,e=>t(e===0))}catch{t(!1)}})}function ee(e){return a(`codex`,[`delete`,`--force`,e],{encoding:`utf8`}).status===0}const m=[`completed`,`failed`,`cancelled`],te=[`queued`,`running`],ne=/^[a-z0-9][a-z0-9_-]*$/i;function h(e){return ne.test(e)}function g(e,t){if(!h(e))throw Error(`Invalid ${t} "${e}".`)}function _(){return n.resolve(process.env.CODER_HOME||n.join(o.homedir(),`.coder`))}const v=new Map;function re(e){let t=v.get(e);if(t!==void 0)return t;let n;try{n=r(`git`,[`rev-parse`,`--show-toplevel`],{cwd:e,encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim()}catch{n=e}return v.set(e,n),n}const y=`global`;function b(e){return n.join(_(),`state`,y)}let x=null;function S(){if(x)return x;let e=n.join(_(),`state`),r=[];try{r=t.readdirSync(e,{withFileTypes:!0})}catch{}return x=r.filter(e=>e.isDirectory()&&e.name!==y).map(t=>n.join(e,t.name)),x}function C(e){return n.join(b(e),`jobs`)}const ie=10*6e4;function w(e){return n.join(b(e),`archive`)}function T(e,r){g(r,`task id`);let i=n.join(C(e),r);if(t.existsSync(n.join(i,`job.json`)))return i;let a=n.join(w(e),r);if(t.existsSync(n.join(a,`job.json`)))return a;for(let e of S()){let i=n.join(e,`jobs`,r);if(t.existsSync(n.join(i,`job.json`)))return i}return i}function E(e,t){return t.archived?t:O(e,t.id,{archived:!0,archivedAt:new Date().toISOString()})}function D(e,r){let i=E(e,r);r.engine===`codex`&&r.threadId&&d(r.threadId);let a=T(e,r.id),o=n.join(w(e),r.id);if(a!==o)try{t.mkdirSync(w(e),{recursive:!0}),t.renameSync(a,o)}catch{}return i}function ae(){let e=Math.random().toString(36).slice(2,8);return`task-${Date.now().toString(36)}-${e}`}function O(e,r,i){let a=T(e,r);t.mkdirSync(a,{recursive:!0});let o=n.join(a,`job.json`),s={...A(e,r)??{id:r,createdAt:new Date().toISOString(),status:`queued`},...i,updatedAt:new Date().toISOString()};return t.writeFileSync(o,`${JSON.stringify(s,null,2)}\n`,`utf8`),s}function k(e){return!e.engine&&(e.agent===`codex`||e.agent===`claude`)&&(e.engine=e.agent),e}function A(e,r){if(!h(r))return null;let i=n.join(T(e,r),`job.json`);if(!t.existsSync(i))return null;try{return k(JSON.parse(t.readFileSync(i,`utf8`)))}catch{return null}}function oe(e,n){let r=T(e,n);return t.existsSync(r)?(t.rmSync(r,{recursive:!0,force:!0}),!0):!1}function se(e){if(!e)return!1;try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}const j=new Map;function M(e){let t=j.get(e);if(t&&Date.now()-t.at<5e3)return t.value;let n=ce(e);return j.set(e,{at:Date.now(),value:n}),n}function ce(e){try{let t=r(`ps`,[`-o`,`lstart=`,`-p`,String(e)],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`],env:{...process.env,TZ:Intl.DateTimeFormat().resolvedOptions().timeZone}}).trim(),n=t?Date.parse(t):NaN;return Number.isFinite(n)?n:null}catch{return null}}function le(e,t){if(!se(e))return!1;let n=M(e),r=Date.parse(t.createdAt??``);return n===null||!Number.isFinite(r)||n<=r+6e4}function N(e,t){if(t.status!==`running`&&t.status!==`queued`)return t;let n;if(t.pid)n=!le(t.pid,t);else{let e=Date.parse(t.updatedAt??t.createdAt??``);n=Number.isFinite(e)&&Date.now()-e>6e4}return n?O(e,t.id,{status:`failed`,error:`worker exited without finishing`,completedAt:new Date().toISOString()}):t}function P(e,r){let i=[];for(let a of e){let e=[];try{e=t.readdirSync(a)}catch{continue}for(let o of e){if(r.has(o))continue;let e=n.join(a,o,`job.json`);try{let n=k(JSON.parse(t.readFileSync(e,`utf8`)));r.add(o),i.push(n)}catch{}}}return i}const F=(e,t)=>String(t.updatedAt??``).localeCompare(String(e.updatedAt??``));function ue(e){let t=[C(e),...S().map(e=>n.join(e,`jobs`))],r=[];for(let n of P(t,new Set))n.archived?D(e,n):r.push(N(e,n));return r.sort(F)}function I(e,t){let r=t?.migrate??!0,i=new Set,a=P([w(e)],i),o=[C(e),...S().map(e=>n.join(e,`jobs`))];for(let t of P(o,i))t.archived&&a.push(r?D(e,t):t);return a.sort(F)}function de(e,t){let n=[...ue(e),...I(e)].sort(F);if(!t)return n[0]??null;let r=n.find(e=>e.id===t);if(r)return r;let i=n.filter(e=>e.id.startsWith(t));if(i.length===1)return i[0];if(i.length>1)throw Error(`Job reference "${t}" is ambiguous. Use a longer id.`);return null}function fe(e,r){let i=T(e,r);try{t.mkdirSync(i,{recursive:!0}),t.writeFileSync(n.join(i,`heartbeat`),``,`utf8`)}catch{}}function pe(e,r){let i=T(e,r.id),a=Date.parse(r.updatedAt??``)||0;for(let e of[`log.jsonl`,`heartbeat`])try{a=Math.max(a,t.statSync(n.join(i,e)).mtimeMs)}catch{}return a?new Date(a).toISOString():void 0}async function me(e,t,n=400){let r=t;for(;!m.includes(r.status);)await new Promise(e=>setTimeout(e,n)),r=N(e,A(e,r.id)??r);return r}const L=`steer-queue.jsonl`;function he(e,r,i){let a=T(e,r);t.mkdirSync(a,{recursive:!0}),t.appendFileSync(n.join(a,L),`${JSON.stringify({at:new Date().toISOString(),text:i})}\n`,`utf8`)}function ge(e,r){let i=T(e,r),a=n.join(i,L),o=n.join(i,`steer-claim-${process.pid}-${Date.now()}.tmp`);try{t.renameSync(a,o)}catch{return[]}try{return t.readFileSync(o,`utf8`).split(/\r?\n/).filter(Boolean).map(e=>{try{return String(JSON.parse(e).text??``)}catch{return``}}).filter(Boolean)}finally{try{t.unlinkSync(o)}catch{}}}function _e(e,r,i){let a=T(e,r);t.mkdirSync(a,{recursive:!0}),t.appendFileSync(n.join(a,`log.jsonl`),`${JSON.stringify({at:new Date().toISOString(),...i})}\n`,`utf8`)}function ve(e,r,i=40){let a=n.join(T(e,r),`log.jsonl`);return t.existsSync(a)?t.readFileSync(a,`utf8`).split(/\r?\n/).filter(Boolean).slice(-i).map(e=>{try{return JSON.parse(e)}catch{return{message:e}}}):[]}function ye(){let e=n.dirname(s(import.meta.url));for(let r=0;r<10;r++){let r=n.join(e,`package.json`);try{if(JSON.parse(t.readFileSync(r,`utf8`)).name===`@wular/coder`)return e}catch{}let i=n.dirname(e);if(i===e)break;e=i}return n.resolve(n.dirname(s(import.meta.url)),`..`)}const R=ye(),be=t.existsSync(n.join(R,`dist/cli.js`))?n.join(R,`dist/cli.js`):n.join(R,`src/cli.ts`);function z(){try{return JSON.parse(t.readFileSync(n.join(R,`package.json`),`utf8`)).version??`unknown`}catch{return`unknown`}}function xe(e){try{return JSON.parse(t.readFileSync(e,`utf8`)).version??null}catch{return null}}function Se(){return R}const B=c.optional(c.boolean()),V=c.optional(c.string()),Ce={cwd:V,json:B},we=c.optional(c.union([c.literal(`all`),c.coerce.number().check(c.int(),c.positive())],{error:`expected a positive integer or "all"`})),Te=c.optional(c.union([c.literal(`all`),c.coerce.number().check(c.int(),c.nonnegative())],{error:`expected a number or "all"`}));function H(e){let t=e.def;for(;t;){if(t.type===`boolean`)return!0;let e=t.innerType??t.in;t=e?e.def:void 0}return!1}function Ee(e,t){let n=t.shape,r={},i=[],a=!1,o=(e,t,i,a)=>{let o=n[t],s=a?`-`:`--`;if(!o)throw Error(`Unknown option ${s}${e} (use -- to pass literal text starting with -)`);if(H(o))return r[t]=i===void 0||i!==`false`,0;if(i===void 0)throw Error(`Missing value for ${s}${e}`);return r[t]=i,1};for(let t=0;t<e.length;t+=1){let r=e[t];if(a){i.push(r);continue}if(r===`--`){a=!0;continue}if(!r.startsWith(`-`)||r===`-`){i.push(r);continue}if(r.startsWith(`--`)){let[i,a]=r.slice(2).split(`=`,2);a===void 0&&n[i]&&!H(n[i])?t+=o(i,i,e[t+1],!1):o(i,i,a,!1);continue}let s=r.slice(1);n[s]&&!H(n[s])?t+=o(s,s,e[t+1],!0):o(s,s,void 0,!0)}let s=t.safeParse(r);if(!s.success){let e=s.error.issues[0],t=String(e.path[0]??``),n=r[t];throw Error(n===void 0?`Missing required --${t}.`:`Invalid --${t} value ${JSON.stringify(n)}: ${e.message}`)}return{options:s.data,positionals:i}}function De(e){return String(e??``).replace(/[^A-Za-z0-9._-]/g,`-`).replace(/^-+|-+$/g,``)}function Oe(t,r=e.platform){return r===`win32`?`pipe:\\\\.\\pipe\\${De(`${n.win32.basename(t)}-codex-app-server`)}`:`unix:${n.join(t,`broker.sock`)}`}function U(e){if(typeof e!=`string`||e.length===0)throw Error(`Missing broker endpoint.`);if(e.startsWith(`pipe:`)){let t=e.slice(5);if(!t)throw Error(`Broker pipe endpoint is missing its path.`);return{kind:`pipe`,path:t}}if(e.startsWith(`unix:`)){let t=e.slice(5);if(!t)throw Error(`Broker Unix socket endpoint is missing its path.`);return{kind:`unix`,path:t}}throw Error(`Unsupported broker endpoint: ${e}`)}function ke(e=`coder-`){return t.mkdtempSync(n.join(o.tmpdir(),e))}function Ae(e){let t=U(e);return l.createConnection({path:t.path})}async function W(e,t=2e3){let n=Date.now();for(;Date.now()-n<t;){if(await new Promise(t=>{let n=Ae(e);n.on(`connect`,()=>{n.end(),t(!0)}),n.on(`error`,()=>t(!1))}))return!0;await new Promise(e=>setTimeout(e,50))}return!1}function je({scriptPath:n,cwd:r,endpoint:a,pidFile:o,logFile:s,env:c=e.env}){let l=t.openSync(s,`a`),u=i(e.execPath,[n,`serve`,`--endpoint`,a,`--cwd`,r,`--pid-file`,o],{cwd:r,env:c,detached:!0,stdio:[`ignore`,l,l]});return u.unref(),t.closeSync(l),u}function Me(){let e=[new URL(`./lib/broker.js`,import.meta.url),new URL(`./broker.js`,import.meta.url)];for(let n of e){let e=s(n);if(t.existsSync(e))return e}throw Error("Coder broker script not found next to the runtime. Rebuild with `bun run build`.")}function G(e){return n.join(b(e),`broker.json`)}function K(e){let n=G(e);if(!t.existsSync(n))return null;try{return JSON.parse(t.readFileSync(n,`utf8`))}catch{return null}}function Ne(e,n){let r=b(e);t.mkdirSync(r,{recursive:!0}),t.writeFileSync(G(e),`${JSON.stringify(n,null,2)}\n`,`utf8`)}function Pe(e){let n=G(e);t.existsSync(n)&&t.unlinkSync(n)}async function Fe(e){if(!e)return!1;try{return await W(e,150)}catch{return!1}}async function Ie(t,r={}){let i=r.scriptPath??Me(),a=z(),o=K(t),s=o?.version===a&&o?.scriptPath===i;if(o&&s&&await Fe(o.endpoint))return o;o&&(q({endpoint:o.endpoint??null,pidFile:o.pidFile??null,logFile:o.logFile??null,sessionDir:o.sessionDir??null,pid:o.pid??null,killProcess:r.killProcess??null}),Pe(t));let c=ke(),l=(r.createBrokerEndpoint??Oe)(c,r.platform),u=n.join(c,`broker.pid`),d=n.join(c,`broker.log`),f=je({scriptPath:i,cwd:t,endpoint:l,pidFile:u,logFile:d,env:r.env??e.env});if(!await W(l,r.timeoutMs??2e3))return q({endpoint:l,pidFile:u,logFile:d,sessionDir:c,pid:f.pid??null,killProcess:r.killProcess??null}),null;let p={endpoint:l,pidFile:u,logFile:d,sessionDir:c,pid:f.pid??null,version:a,scriptPath:i};return Ne(t,p),p}function q({endpoint:e=null,pidFile:r,logFile:i,sessionDir:a=null,pid:o=null,killProcess:s=null}){if(Number.isFinite(o)&&s)try{s(o)}catch{}if(r&&t.existsSync(r)&&t.unlinkSync(r),i&&t.existsSync(i)&&t.unlinkSync(i),e)try{let n=U(e);n.kind===`unix`&&t.existsSync(n.path)&&t.unlinkSync(n.path)}catch{}let c=a??(r?n.dirname(r):i?n.dirname(i):null);if(c&&t.existsSync(c))try{t.rmdirSync(c)}catch{}}function J(t,n=[],r={}){let i=a(t,n,{cwd:r.cwd,env:r.env,encoding:`utf8`,input:r.input,maxBuffer:r.maxBuffer,stdio:r.stdio??`pipe`,shell:e.platform===`win32`?e.env.SHELL||!0:!1,windowsHide:!0});return{command:t,args:n,status:i.status??0,signal:i.signal??null,stdout:i.stdout??``,stderr:i.stderr??``,error:i.error??null}}function Le(e,t=[`--version`],n={}){let r=J(e,t,n);return r.error&&r.error.code===`ENOENT`?{available:!1,detail:`not found`}:r.error?{available:!1,detail:r.error.message}:r.status===0?{available:!0,detail:r.stdout.trim()||r.stderr.trim()||`ok`}:{available:!1,detail:r.stderr.trim()||r.stdout.trim()||`exit ${r.status}`}}function Re(e){return/not found|no running instance|cannot find|does not exist|no such process/i.test(e)}function ze(t,n={}){if(!Number.isFinite(t))return{attempted:!1,delivered:!1,method:null};let r=t,i=n.platform??e.platform,a=n.runCommandImpl??J,o=n.killImpl??e.kill.bind(e);if(i===`win32`){let e=a(`taskkill`,[`/PID`,String(r),`/T`,`/F`],{cwd:n.cwd,env:n.env});if(!e.error&&e.status===0)return{attempted:!0,delivered:!0,method:`taskkill`,result:e};let t=`${e.stderr}\n${e.stdout}`.trim();if(!e.error&&Re(t))return{attempted:!0,delivered:!1,method:`taskkill`,result:e};if(e.error?.code===`ENOENT`)try{return o(r),{attempted:!0,delivered:!0,method:`kill`}}catch(e){if(e?.code===`ESRCH`)return{attempted:!0,delivered:!1,method:`kill`};throw e}throw e.error?e.error:Error(Be(e))}try{return o(-r,`SIGTERM`),{attempted:!0,delivered:!0,method:`process-group`}}catch(e){if(e?.code!==`ESRCH`)try{return o(r,`SIGTERM`),{attempted:!0,delivered:!0,method:`process`}}catch(e){if(e?.code===`ESRCH`)return{attempted:!0,delivered:!1,method:`process`};throw e}return{attempted:!0,delivered:!1,method:`process-group`}}}function Be(e){let t=[`${e.command} ${e.args.join(` `)}`.trim()];e.signal?t.push(`signal=${e.signal}`):t.push(`exit=${e.status}`);let n=(e.stderr||``).trim(),r=(e.stdout||``).trim();return n?t.push(n):r&&t.push(r),t.join(`: `)}const Ve=`CODER_APP_SERVER_ENDPOINT`,He=-32001;let Y;function Ue(){if(Y===void 0){let e=J(`codex`,[`--version`]),t=/(\d+\.\d+\.\d+(?:-[\w.]+)?)/.exec(`${e.stdout} ${e.stderr}`);Y=t?t[1]:`0.144.1`}return Y}function X(){return{title:`Coder`,name:`coder`,version:Ue()}}const Z={experimentalApi:!1,requestAttestation:!1,optOutNotificationMethods:[`item/agentMessage/delta`,`item/reasoning/summaryTextDelta`,`item/reasoning/summaryPartAdded`,`item/reasoning/textDelta`]};function Q(e,t,n){return n===void 0?{code:e,message:t}:{code:e,message:t,data:n}}function $(e,t){let n=Error(e);return n.data=t,t?.code!==void 0&&(n.rpcCode=t.code),n}var We=class{cwd;options;pending;nextId;stderr;closed;exitError;notificationHandler;serverRequestHandler;lineBuffer;transport;exitPromise;exitResolved;resolveExit;handleServerRequest;constructor(e,t={}){this.cwd=e,this.options=t,this.pending=new Map,this.nextId=1,this.stderr=``,this.closed=!1,this.exitError=null,this.notificationHandler=null,this.serverRequestHandler=null,this.lineBuffer=``,this.transport=`unknown`,this.handleServerRequest=e=>this.defaultHandleServerRequest(e),this.exitPromise=new Promise(e=>{this.resolveExit=e})}setNotificationHandler(e){this.notificationHandler=e}setServerRequestHandler(e){this.serverRequestHandler=e}request(e,t){if(this.closed)throw Error(`codex app-server client is closed.`);let n=this.nextId;return this.nextId+=1,new Promise((r,i)=>{this.pending.set(n,{resolve:r,reject:i,method:e}),this.sendMessage({id:n,method:e,params:t})})}notify(e,t={}){this.closed||this.sendMessage({method:e,params:t})}handleChunk(e){this.lineBuffer+=e;let t=this.lineBuffer.indexOf(`
|
|
2
|
-
`);for(;t!==-1;){let e=this.lineBuffer.slice(0,t);this.lineBuffer=this.lineBuffer.slice(t+1),this.handleLine(e),t=this.lineBuffer.indexOf(`
|
|
3
|
-
`)}}handleLine(e){if(!e.trim())return;let t;try{t=JSON.parse(e)}catch(t){this.handleExit($(`Failed to parse codex app-server JSONL: ${t instanceof Error?t.message:String(t)}`,{line:e}));return}if(t.id!==void 0&&t.method){this.handleServerRequest(t);return}if(t.id!==void 0){let e=this.pending.get(t.id);if(!e)return;this.pending.delete(t.id),t.error?e.reject($(t.error.message??`codex app-server ${e.method} failed.`,t.error)):e.resolve(t.result??{});return}t.method&&this.notificationHandler&&this.notificationHandler(t)}defaultHandleServerRequest(e){let t=this.serverRequestHandler;if(!t){this.sendMessage({id:e.id,error:Q(-32601,`Unsupported server request: ${e.method}`)});return}Promise.resolve().then(()=>t(e.method,e.params??{})).then(t=>{this.sendMessage({id:e.id,result:t??{}})}).catch(t=>{this.sendMessage({id:e.id,error:Q(-32e3,t instanceof Error?t.message:String(t))})})}handleExit(e){if(!this.exitResolved){this.exitResolved=!0,this.exitError=e??null;for(let e of this.pending.values())e.reject(this.exitError??Error(`codex app-server connection closed.`));this.pending.clear(),this.resolveExit(void 0)}}sendMessage(e){throw Error(`sendMessage must be implemented by subclasses.`)}},Ge=class extends We{proc;readline;constructor(e,t={}){super(e,t),this.transport=`direct`}async initialize(){this.proc=i(`codex`,[`-c`,`sandbox_workspace_write.network_access=false`,`app-server`,`--disable`,`plugins`],{cwd:this.cwd,env:this.options.env??e.env,stdio:[`pipe`,`pipe`,`pipe`],shell:e.platform===`win32`?e.env.SHELL||!0:!1,windowsHide:!0});let t=this.proc.stdout,n=this.proc.stderr;if(!t||!n)throw Error(`codex app-server did not expose stdio streams.`);t.setEncoding(`utf8`),n.setEncoding(`utf8`),n.on(`data`,e=>{this.stderr+=e}),this.proc.on(`error`,e=>{this.handleExit(e)}),this.proc.on(`exit`,(e,t)=>{let n=this.stderr.trim(),r=e===0?null:$(`codex app-server exited unexpectedly (${t?`signal ${t}`:`exit ${e}`}).${n?`\n${n}`:``}`);this.handleExit(r)}),this.readline=u.createInterface({input:t}),this.readline.on(`line`,e=>{this.handleLine(e)}),await this.request(`initialize`,{clientInfo:this.options.clientInfo??X(),capabilities:this.options.capabilities??Z}),this.notify(`initialized`,{})}async close(){if(this.closed){await this.exitPromise;return}this.closed=!0,this.readline&&this.readline.close(),this.proc&&!this.proc.killed&&(this.proc.stdin?.end(),setTimeout(()=>{if(this.proc&&!this.proc.killed&&this.proc.exitCode===null)if(e.platform===`win32`)try{ze(this.proc.pid)}catch{}else this.proc.kill(`SIGTERM`)},50).unref?.()),await this.exitPromise}sendMessage(e){let t=`${JSON.stringify(e)}\n`,n=this.proc?.stdin;if(!n)throw Error(`codex app-server stdin is not available.`);n.write(t)}},Ke=class extends We{endpoint;socket;constructor(e,t={}){super(e,t),this.transport=`broker`,this.endpoint=t.brokerEndpoint}async initialize(){await new Promise((e,t)=>{let n=U(this.endpoint);this.socket=l.createConnection({path:n.path}),this.socket.setEncoding(`utf8`),this.socket.on(`connect`,e),this.socket.on(`data`,e=>{this.handleChunk(e)}),this.socket.on(`error`,e=>{this.exitResolved||t(e),this.handleExit(e)}),this.socket.on(`close`,()=>{this.handleExit(this.exitError)})}),await this.request(`initialize`,{clientInfo:this.options.clientInfo??X(),capabilities:this.options.capabilities??Z}),this.notify(`initialized`,{})}async close(){if(this.closed){await this.exitPromise;return}this.closed=!0,this.socket&&this.socket.end(),await this.exitPromise}sendMessage(e){let t=`${JSON.stringify(e)}\n`,n=this.socket;if(!n)throw Error(`codex app-server broker connection is not connected.`);n.write(t)}},qe=class{static async connect(t,n={}){let r=null;n.disableBroker||(r=n.brokerEndpoint??n.env?.CODER_APP_SERVER_ENDPOINT??e.env.CODER_APP_SERVER_ENDPOINT??null,!r&&n.reuseExistingBroker&&(r=K(t)?.endpoint??null),!r&&!n.reuseExistingBroker&&(r=(await Ie(t,{env:n.env}))?.endpoint??null));let i=r?new Ke(t,{...n,brokerEndpoint:r}):new Ge(t,n);return await i.initialize(),i}};export{M as A,te as B,de as C,I as D,pe as E,T as F,ee as H,re as I,fe as L,ve as M,N,ue as O,_ as P,me as R,he as S,h as T,f as U,m as V,p as W,_e as _,U as a,ge as b,we as c,Te as d,be as f,ie as g,Se as h,Le as i,A as j,E as k,Ee as l,z as m,Ve as n,Ce as o,xe as p,qe as r,B as s,He as t,V as u,D as v,ae as w,oe as x,g as y,O as z};
|
package/dist/runtime-DRtQOCSz.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import{A as e,C as t,F as n,I as r,M as i,N as a,O as o,P as s,T as c,U as l,V as u,W as d,f,i as ee,j as p,l as m,m as h,o as g,r as _,s as v,u as te,v as y,w as ne,y as b,z as re}from"./app-server-Dwd7IcQH.js";import{createRequire as ie}from"node:module";import x from"node:process";import S from"node:fs";import C from"node:path";import{spawn as w,spawnSync as T}from"node:child_process";import ae from"node:os";import{fileURLToPath as oe,pathToFileURL as se}from"node:url";import*as E from"zod/mini";import ce,{randomUUID as le}from"node:crypto";import{AsyncLocalStorage as ue}from"node:async_hooks";function de(e){let t=x.env.FORCE_COLOR,n=t!=null&&t!==``&&t!==`0`||t!==`0`&&e.isTTY&&!x.env.NO_COLOR,r=(e,t)=>n?`\x1b[${e}m${t}\x1b[0m`:t;return{blue:e=>r(`34`,e),bold:e=>r(`1`,e),cyan:e=>r(`36`,e),dim:e=>r(`38;5;246`,e),light:e=>r(`38;5;249`,e),green:e=>r(`32`,e),red:e=>r(`31`,e)}}const D=de(x.stdout),O=de(x.stderr);function fe(e,t=O){let n=e.map(e=>{let t=e.indexOf(`coder `);return t===-1?{label:e,cmd:``}:{label:e.slice(0,t),cmd:e.slice(t)}}),r=Math.max(0,...n.map(e=>e.label.length));return n.map(({label:e,cmd:n})=>n?` ${t.dim(e.padEnd(r))}${t.bold(n)}`:` ${t.dim(e)}`).join(`
|
|
2
|
-
`)}function pe(e,t={}){let n=typeof t==`number`?t:t.code??1,r=typeof t==`object`?t.hint:null,i=r==null?[]:Array.isArray(r)?r:[r];x.stderr.write(`${O.red(e)}\n`),i.length&&x.stderr.write(`\n${fe(i,O)}\n`),x.exit(n)}function k(e){x.stdout.write(`${JSON.stringify(e,null,2)}\n`)}function me(e,t=D){return(JSON.stringify(e,null,2)??`null`).split(`
|
|
3
|
-
`).map(e=>e.replace(/"((?:[^"\\]|\\.)*)":/g,(e,n)=>`${t.light(`"${n}"`)}:`).replace(/: (-?\d[\d.eE+-]*|true|false|null)(,?)$/,(e,n,r)=>`: ${t.blue(n)}${r}`)).join(`
|
|
4
|
-
`)}function he(e){let t=Date.parse(e??``);return Number.isFinite(t)?Math.max(0,Date.now()-t):0}function ge(e){let t=Math.floor(e/1e3);if(t<60)return`${t}s`;let n=Math.floor(t/60);return n<60?`${n}m`:`${Math.floor(n/60)}h${n%60}m`}function A(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(+(e<1e4))}k`:`${(e/1e6).toFixed(1)}M`}function _e(e,t){let n=[`in ${A(e.input)}`,...e.cachedInput?[`cached ${A(e.cachedInput)}`]:[],`out ${A(e.output)}`];return`${A(e.total)} (${n.join(` · `)}) on ${t||`default model`}`}function ve(e,t,n,r=D){let i=e?.error?.message??t;return e?.finalMessage||(i?`${r.red(`error:`)} ${i}`:n)}function ye(e,t=D){let n=e=>e.split(`
|
|
5
|
-
`).map(e=>` ${t.dim(e)}`);return e.length<=1e3?[t.dim(`prompt:`),...n(e)]:[t.dim(`prompt:`),...n(e.slice(0,500).trimEnd()),t.light(` … <${e.length-1e3} chars trimmed> …`),...n(e.slice(-500).trimStart())]}function be(e){return[e.agent??`-`,e.model,e.model?e.effort:null].filter(Boolean).join(`/`)}function xe(e,t=D){let n=[];return e.permissions&&n.push([`perms`,e.permissions]),e.cwd&&n.push([`cwd`,e.cwd]),n.map(([e,n])=>`${t.dim(e.padEnd(8))} ${n}`)}function Se(e,t=300,{plain:n=!1,style:r=D}={}){if(e.length<=t)return e;let i=`<${e.length-t} more chars>`;return`${e.slice(0,t)} ${n?i:r.dim(i)}`}const Ce=10*6e4,we=2*6e4;function Te(e,t){return e.length>t?`${e.slice(0,t-1)}…`:e.padEnd(t)}function Ee(e){return` ${D.bold(D.green(`✔`))} ${e}`}function De(e){return` ${D.bold(D.red(`✘`))} ${e}`}function Oe(e=x.stdout){try{return e.getWindowSize?.()[0]??e.columns}catch{return e.columns}}function ke(e=x.stdout){try{return e.getWindowSize?.()[1]??e.rows}catch{return e.rows}}function Ae(e){return e>=768&&e<=879||e>=8203&&e<=8207||e>=65024&&e<=65039?0:e>=4352&&e<=4447||e>=11904&&e<=42191||e>=44032&&e<=55203||e>=63744&&e<=64255||e>=65072&&e<=65103||e>=65280&&e<=65376||e>=65504&&e<=65510||e>=127744&&e<=129791||e>=131072&&e<=262141?2:1}function je(e){let t=0;for(let n of e.replace(/\x1b\[[0-9;]*m/g,``))t+=Ae(n.codePointAt(0));return t}function Me(e,t){let n=0,r=``;for(let i=0;i<e.length;){let a=e[i]===`\x1B`?/^\x1b\[[0-9;]*m/.exec(e.slice(i)):null;if(a){r+=a[0],i+=a[0].length;continue}let o=e.codePointAt(i),s=String.fromCodePoint(o),c=Ae(o);if(n+c>t-1)return`${r}\x1b[0m${D.dim(`…`)}`;r+=s,n+=c,i+=s.length}return r}function Ne(){let e=x.stdin;if(!e.isTTY||!x.stdout.isTTY)return()=>{};e.setRawMode(!0),e.resume();let t=e=>{e.includes(3)&&x.kill(x.pid,`SIGINT`),e.includes(26)&&x.kill(x.pid,`SIGTSTP`)};return e.on(`data`,t),e.unref(),()=>{e.off(`data`,t),e.isTTY&&e.setRawMode(!1),e.pause()}}var Pe=class{stream;quietMs;lines=[];painted=[];paintedWidths=[];paintedCols;resizeTimer;tty;constructor(e=x.stdout,t=250){this.stream=e,this.quietMs=t,this.tty=!!e.isTTY,this.tty&&e.on(`resize`,this.onResize)}set(e){this.lines=e,!(!this.tty||this.resizeTimer)&&this.paint()}commit(e){this.clear(),this.stream.write(e)}clear(){if(!this.painted.length)return;let e=Oe(this.stream),t=this.painted.length;e&&this.paintedCols&&e!==this.paintedCols&&(t=this.paintedWidths.reduce((t,n)=>t+Math.max(1,Math.ceil(n/e)),0)),this.stream.write(`\x1b[${t}A\x1b[0J`),this.painted=[],this.paintedWidths=[]}done(){this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=void 0,this.paint()),this.tty&&this.stream.off(`resize`,this.onResize)}paint(){this.clear();let e=Oe(this.stream),t=e?this.lines.map(t=>Me(t,e-1)):this.lines,n=ke(this.stream);n&&t.length>n-1&&(t=n>1?t.slice(-(n-1)):[]);for(let e of t)this.stream.write(`${e}\n`);this.painted=t,this.paintedWidths=t.map(je),this.paintedCols=e}onResize=()=>{this.clear(),this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=setTimeout(()=>{this.resizeTimer=void 0,this.paint()},this.quietMs),this.resizeTimer.unref?.()}};function Fe(e,t=0){let n=e.padEnd(t);return e===`running`?D.green(n):e===`failed`||e===`cancelled`?D.red(n):e===`completed`?D.blue(n):D.dim(n)}function Ie(e,t,n=!1){n?k({taskId:e,status:`awaiting-approval`,approval:t}):(x.stdout.write(`Approval needed for task ${e}: ${t.summary}\n`),x.stderr.write(`\n${fe([`Approve: coder approve ${e} ${t.id}`,`Deny: coder approve ${e} ${t.id} --deny`,`Then: coder task result ${e} --wait`],O)}\n`)),x.exit(4)}function Le(e,t,n){if(e.length>t){let r=e.slice(t);pe(`Unexpected argument${r.length>1?`s`:``}: ${r.join(` `)}`,{hint:`Help: coder ${n} --help`})}}function j(e){return e.cwd?C.resolve(String(e.cwd)):x.cwd()}function Re(e,n){let r=t(e,n);return r||pe(n?`No task found for "${n}".`:`No tasks found for this workspace.`,{hint:n?[`List tasks: coder task list`,`Start one: coder run "<text>"`]:[`Start one: coder run "<text>"`]}),r}const M=`@wular/coder`,ze=`https://registry.npmjs.org/${M}/latest`;function Be(){return C.join(s(),`update-check.json`)}function Ve(e,t){let n=String(e).split(`.`).map(e=>parseInt(e,10)||0),r=String(t).split(`.`).map(e=>parseInt(e,10)||0);for(let e=0;e<3;e+=1){if((n[e]??0)>(r[e]??0))return 1;if((n[e]??0)<(r[e]??0))return-1}return 0}function He(){try{return JSON.parse(S.readFileSync(Be(),`utf8`))}catch{return null}}function Ue(e){try{S.mkdirSync(s(),{recursive:!0}),S.writeFileSync(Be(),JSON.stringify(e))}catch{}}function We(){try{S.rmSync(Be(),{force:!0})}catch{}}function Ge(e,t){if(x.env.CODER_NO_UPDATE_CHECK||x.env.CI)return;let n=He();if(n?.latest&&Ve(n.latest,e)>0&&x.stderr.write(O.dim(`coder ${e} -> `)+O.bold(n.latest)+O.dim(` available. run: coder upgrade
|
|
6
|
-
|
|
7
|
-
`)),!n?.checkedAt||Date.now()-n.checkedAt>864e5)try{w(x.execPath,[t,`_refreshUpdate`],{detached:!0,stdio:`ignore`}).unref()}catch{}}async function Ke(e){let t=He()?.latest??null;try{let e=new AbortController,n=setTimeout(()=>e.abort(),3e3),r=await fetch(ze,{signal:e.signal,headers:{accept:`application/json`}});if(clearTimeout(n),r.ok){let e=await r.json();e?.version&&(t=e.version)}}catch{}Ue({checkedAt:Date.now(),latest:t,current:e})}function qe(e){let t=e;try{t=S.realpathSync(e)}catch{}let n=t.replace(/\\/g,`/`);return/\/\.bun\//.test(n)?{pm:`bun`,command:[`bun`,`add`,`-g`,`${M}@latest`]}:/\/\.pnpm\//.test(n)||/\/pnpm(-global)?\//i.test(n)||/\/Library\/pnpm\//.test(n)?{pm:`pnpm`,command:[`pnpm`,`add`,`-g`,`${M}@latest`]}:/\/\.config\/yarn\/global\//.test(n)||/\/yarn\/global\//.test(n)||/\/Yarn\/Data\/global\//.test(n)?{pm:`yarn`,command:[`yarn`,`global`,`add`,`${M}@latest`]}:{pm:`npm`,command:[`npm`,`install`,`-g`,`${M}@latest`]}}function N(e){try{return JSON.parse(S.readFileSync(e,`utf8`))}catch{return null}}function Je(e,t){let n=`${e}.tmp`;S.writeFileSync(n,`${JSON.stringify(t,null,2)}\n`,`utf8`),S.renameSync(n,e)}function Ye(e){let t=0,n=``;return()=>{let r;try{r=S.statSync(e).size}catch{return[]}if(r<t&&(t=0,n=``),r===t)return[];let i;try{i=S.openSync(e,`r`)}catch{return[]}try{let e=Buffer.alloc(r-t),a=S.readSync(i,e,0,e.length,t);t+=a;let o=(n+e.toString(`utf8`,0,a)).split(`
|
|
8
|
-
`);return n=o.pop()??``,o.filter(Boolean)}finally{S.closeSync(i)}}}const Xe=new Set(`commit.checkout.switch.restore.stash.reset.rebase.merge.push.pull.cherry-pick.revert.clean.am.apply.tag.branch.worktree.filter-branch.filter-repo.gc.prune.reflog.remote.submodule.config`.split(`.`)),Ze=[/\bsudo\b/,/\brm\s+(-[a-zA-Z]*r[a-zA-Z]*f|-[a-zA-Z]*f[a-zA-Z]*r)\b.*\s(\/\*?|~\/?|\$HOME\/?)(\s|$)/,/\b(shutdown|reboot|halt|poweroff)\b/,/\bmkfs\b|\bdiskutil\s+erase/i,/\b(chmod|chown)\b.*-R.*\s\/(\s|$)/,/\bkill(all)?\s+-9\s+1\b/,/curl[^|;&]*\|\s*(ba|z|da)?sh\b/,/wget[^|;&]*\|\s*(ba|z|da)?sh\b/,/\blaunchctl\b|\bsystemctl\b/,/\bdefaults\s+write\b/,/>\s*\/dev\/(sd|disk)/],Qe=new Set([`status`,`log`,`diff`,`show`,`blame`,`rev-parse`,`ls-files`,`ls-tree`,`cat-file`,`describe`,`shortlog`,`grep`,`branch`,`stash`]);function $e(e){let t=e.match(/^\s*(?:ba|z|da)?sh\s+(?:-[a-zA-Z]+\s+)*(?:-c\s+)?(["'])([\s\S]*)\1\s*$/);return t?t[2]:e}function et(e){return e.trim().split(/\s+/).filter(Boolean)}function tt(e){let t=e.find((e,t)=>t>0&&!e.startsWith(`-`));if(!t)return{decision:`accept`,reason:`bare git`};if(t===`branch`&&e.some(e=>/^-(d|D|m|M|c|C|f|u)|^--(delete|move|copy|force|set-upstream)/.test(e)))return{decision:`decline`,reason:`git branch write operation (git is read-only for Coder)`};if(t===`stash`){let t=e.find((e,t)=>t>1&&!e.startsWith(`-`));return t===`list`||t===`show`?{decision:`accept`,reason:`git stash ${t} is read-only`}:{decision:`decline`,reason:`git stash write operation (git is read-only for Coder)`}}return Qe.has(t)?{decision:`accept`,reason:`git ${t} is read-only`}:Xe.has(t)?{decision:`decline`,reason:`git ${t} is a write operation (git is read-only for Coder)`}:{decision:`escalate`,reason:`unrecognized git subcommand: ${t}`}}function nt(e,t={}){let n=$e(String(e??``));if(!n.trim())return{decision:`escalate`,reason:`empty command`};for(let e of Ze)if(e.test(n))return{decision:`decline`,reason:`matches hard-deny pattern ${e}`};if(/\$\(|`|<\(/.test(n))return{decision:`escalate`,reason:`contains command substitution`};let r=n.split(/&&|\|\||;|\||\r?\n/).map(e=>e.trim()).filter(Boolean);if(r.length>1){let e={decision:`accept`,reason:`all segments safe`};for(let n of r){let r=nt(n,t);if(r.decision===`decline`)return r;r.decision===`escalate`&&(e=r)}return e}let i=et(n),a=C.basename(i[0]??``);if(a===`git`)return tt(i);let o=t.networkHost;return o?(t.allowedNetworkHosts??[]).some(e=>o===e||o.endsWith(`.${e}`))?{decision:`accept`,reason:`network host ${o} is allowlisted`}:{decision:`escalate`,reason:`network access to ${o}`}:{decision:`escalate`,reason:`command needs approval: ${a||`(unknown)`}`}}function rt(e,t){if(!e.length)return{decision:`escalate`,reason:`file change with no resolvable paths`};for(let n of e){let e=C.resolve(t,n),r=C.relative(t,e);if(r.startsWith(`..`)||C.isAbsolute(r))return{decision:`escalate`,reason:`path outside workspace: ${n}`};if(r===`.git`||r.startsWith(`.git${C.sep}`))return{decision:`decline`,reason:`direct .git modification: ${n}`}}return{decision:`accept`,reason:`all paths inside workspace`}}function it(e){return C.join(e,`approvals`)}function at(e){let t=it(e);return S.existsSync(t)?S.readdirSync(t).filter(e=>e.endsWith(`.request.json`)).flatMap(e=>{let n=e.replace(/\.request\.json$/,``),r=N(C.join(t,e));if(!r)return[];let i=N(C.join(t,`${n}.response.json`));return[{...r,id:n,response:i}]}).sort((e,t)=>String(e.createdAt??``).localeCompare(String(t.createdAt??``))):[]}function ot(e,t,n){let r=it(e),i=C.join(r,`${t}.request.json`);if(!S.existsSync(i))throw Error(`No pending approval "${t}" for this job.`);S.writeFileSync(C.join(r,`${t}.response.json`),`${JSON.stringify({decision:n,answeredAt:new Date().toISOString()},null,2)}\n`,`utf8`)}async function st(e,t,{timeoutMs:n,onEvent:r}){let i=it(e);S.mkdirSync(i,{recursive:!0});let a=`apr-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`;S.writeFileSync(C.join(i,`${a}.request.json`),`${JSON.stringify({...t,createdAt:new Date().toISOString()},null,2)}\n`,`utf8`),r?.({kind:`approval-escalated`,approvalId:a,summary:t.summary,message:`Approval needed (${a}): ${t.summary}. Answer with: coder approve <job> ${a} [--deny]`});let o=C.join(i,`${a}.response.json`),s=Date.now()+n;for(;Date.now()<s;){if(S.existsSync(o))try{let e=JSON.parse(S.readFileSync(o,`utf8`)).decision===`accept`?`accept`:`decline`;return r?.({kind:`approval-answered`,approvalId:a,decision:e}),e}catch{}await new Promise(e=>setTimeout(e,400))}return r?.({kind:`approval-timeout`,approvalId:a,message:`Approval ${a} timed out; declining.`}),`decline`}function ct(e,t={}){return st(e,{method:`simulate`,summary:`simulated approval probe (--simulate-approval)`},{timeoutMs:t.timeoutMs??12e4,onEvent:t.onEvent??null})}function lt({workspaceRoot:e,jobDir:t,mode:n=`auto`,escalationTimeoutMs:r=12e4,allowedNetworkHosts:i=[],onEvent:a=null}){return async(o,s,c)=>{if(o===`item/commandExecution/requestApproval`){let e=s.command??c?.itemIndex?.get(s.itemId??``)?.command??``,l=`run command: ${e||`(unknown command)`}${s.reason?` — ${s.reason}`:``}`;if(n===`deny`)return a?.({kind:`approval-decision`,method:o,decision:`decline`,reason:`deny mode`,summary:l}),{decision:`decline`};let u=nt(e,{networkHost:s.networkApprovalContext?.host??null,allowedNetworkHosts:i});return a?.({kind:`approval-decision`,method:o,decision:u.decision,reason:u.reason,summary:l}),u.decision===`escalate`?{decision:await st(t,{method:o,summary:l,command:e,params:s},{timeoutMs:r,onEvent:a})}:{decision:u.decision}}if(o===`item/fileChange/requestApproval`){let i=(c?.itemIndex?.get(s.itemId??``)?.changes??[]).map(e=>e.path).filter(e=>!!e),l=`apply file changes: ${i.join(`, `)||`(unknown paths)`}${s.reason?` — ${s.reason}`:``}`;if(n===`deny`)return a?.({kind:`approval-decision`,method:o,decision:`decline`,reason:`deny mode`,summary:l}),{decision:`decline`};let u=rt(i,e);return a?.({kind:`approval-decision`,method:o,decision:u.decision,reason:u.reason,summary:l}),u.decision===`escalate`?{decision:await st(t,{method:o,summary:l,paths:i,params:s},{timeoutMs:r,onEvent:a})}:{decision:u.decision}}throw a?.({kind:`approval-unsupported`,method:o}),Error(`Coder does not handle server request ${o}; treating as denied.`)}}async function ut(e,t,r=400){let i=t;for(;;){if(u.includes(i.status))return{job:i,reason:`terminal`};let t=at(n(e,i.id)).filter(e=>!e.response);if(t[0])return{job:i,reason:`approval`,approval:{id:t[0].id,summary:String(t[0].summary??``)}};await new Promise(e=>setTimeout(e,r)),i=a(e,p(e,i.id)??i)}}const dt=`Coder Task`;function ft(e){return e.split(/\r?\n/).map(e=>e.trimEnd()).filter(e=>e&&!e.startsWith(`WARNING: proceeding, even though we could not update PATH:`)).join(`
|
|
9
|
-
`)}function pt(e,t=72){let n=String(e??``).trim().replace(/\s+/g,` `);return n?n.length<=t?n:`${n.slice(0,t-3)}...`:``}function mt(e){let t=pt(e,56);return t?`${dt}: ${t}`:dt}function ht(e){return e?.params?.threadId??null}function gt(e){return e?.params?.turnId?e.params.turnId:e?.params?.turn?.id?e.params.turn.id:null}function _t(e){let t=new Set;for(let n of e)for(let e of n.changes??[])e.path&&t.add(e.path);return[...t]}function vt(e){if(!e||typeof e!=`object`)return null;let t=e=>typeof e==`number`&&Number.isFinite(e)?e:0,n=t(e.inputTokens),r=t(e.cachedInputTokens),i=t(e.outputTokens);return{input:n,cachedInput:r,output:i,total:t(e.totalTokens)||n+r+i}}function yt(e){if(e.tokenUsageByThread.size===0)return null;let t={input:0,cachedInput:0,output:0,total:0};for(let n of e.tokenUsageByThread.values())t.input+=n.input,t.cachedInput+=n.cachedInput,t.output+=n.output,t.total+=n.total;return t}function bt(e){return String(e??``).replace(/\s+/g,` `).trim()}function P(e){if(!e)return[];if(typeof e==`string`){let t=bt(e);return t?[t]:[]}if(Array.isArray(e))return e.flatMap(e=>P(e));if(typeof e==`object`){let t=e;if(typeof t.text==`string`)return P(t.text);if(`summary`in t)return P(t.summary);if(`content`in t)return P(t.content);if(`parts`in t)return P(t.parts)}return[]}function xt(e,t){let n=[];for(let r of[...e,...t]){let e=bt(r);!e||n.includes(e)||n.push(e)}return n}function F(e,t,n=null,r={}){!e||!t||e({message:t,phase:n,...r})}function St(e){switch(e.type){case`commandExecution`:return{message:`Running command: ${String(e.command??``).trim()}`,phase:`running`};case`fileChange`:return{message:`Applying ${e.changes.length} file change(s).`,phase:`editing`};case`mcpToolCall`:return{message:`Calling ${e.server}/${e.tool}.`,phase:`investigating`};case`dynamicToolCall`:return{message:`Running tool: ${e.tool}.`,phase:`investigating`};case`webSearch`:return{message:`Searching: ${String(e.query??``).trim()}`,phase:`investigating`};default:return null}}function Ct(e){switch(e.type){case`commandExecution`:{let t=String(e.aggregatedOutput??``).trim();return{message:`Command ${e.status===`completed`?`completed`:e.status}: ${String(e.command??``).trim()} (exit ${e.exitCode??`?`})`+(t?`\n${t}`:``),phase:`running`}}case`fileChange`:return{message:`File changes ${e.status}.`,phase:`editing`};case`mcpToolCall`:return{message:`Tool ${e.server}/${e.tool} ${e.status}.`,phase:`investigating`};case`dynamicToolCall`:return{message:`Tool ${e.tool} ${e.status}.`,phase:`investigating`};default:return null}}function wt(e,t={}){let n,r,i=new Promise((e,t)=>{n=e,r=t});return{threadId:e,rootThreadId:e,threadIds:new Set([e]),threadTurnIds:new Map,turnId:null,bufferedNotifications:[],completion:i,resolveCompletion:n,rejectCompletion:r,finalTurn:null,completed:!1,finalAnswerSeen:!1,pendingCollaborations:new Set,activeSubagentTurns:new Set,completionTimer:null,lastAgentMessage:``,reasoningSummary:[],error:null,fileChanges:[],commandExecutions:[],tokenUsageByThread:new Map,itemIndex:new Map,onProgress:t.onProgress??null,onHeartbeat:t.onHeartbeat??null}}function Tt(e){e.completionTimer&&=(clearTimeout(e.completionTimer),null)}function Et(e,t=null){e.completed||(Tt(e),e.completed=!0,t?(e.finalTurn=t,e.turnId||=t.id??null):e.finalTurn||={id:e.turnId??`inferred-turn`,status:`completed`},e.resolveCompletion(e))}function Dt(e){e.completed||e.finalTurn||!e.finalAnswerSeen||e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||(Tt(e),e.completionTimer=setTimeout(()=>{e.completionTimer=null,!(e.completed||e.finalTurn||!e.finalAnswerSeen)&&(e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||Et(e,null))},250),e.completionTimer.unref?.())}function Ot(e,t){let n=ht(t);if(!n||!e.threadIds.has(n))return!1;let r=e.threadTurnIds.get(n)??null,i=gt(t);return r===null||i===null||i===r}function kt(e,t,n,r=null){if(t.id&&e.itemIndex.set(t.id,t),t.type===`collabAgentToolCall`){(!r||r===e.threadId)&&(n===`started`||t.status===`inProgress`?e.pendingCollaborations.add(t.id):n===`completed`&&(e.pendingCollaborations.delete(t.id),Dt(e)));for(let n of t.receiverThreadIds??[])e.threadIds.add(n)}if(t.type===`agentMessage`){t.text&&(!r||r===e.threadId)&&(e.lastAgentMessage=t.text,n===`completed`&&t.phase===`final_answer`&&(e.finalAnswerSeen=!0,Dt(e)));return}if(t.type===`reasoning`&&n===`completed`){e.reasoningSummary=xt(e.reasoningSummary,P(t.summary));return}if(t.type===`fileChange`&&n===`completed`){e.fileChanges.push(t);return}t.type===`commandExecution`&&n===`completed`&&e.commandExecutions.push(t)}function At(e,t){switch(e.onHeartbeat?.(),t.method){case`thread/started`:e.threadIds.add(t.params.thread.id);break;case`turn/started`:e.threadIds.add(t.params.threadId),e.threadTurnIds.set(t.params.threadId,t.params.turn.id),(t.params.threadId??null)!==e.threadId&&e.activeSubagentTurns.add(t.params.threadId),F(e.onProgress,`Turn started (${t.params.turn.id}).`,`starting`,{threadId:t.params.threadId??null,turnId:t.params.turn.id??null});break;case`item/started`:kt(e,t.params.item,`started`,t.params.threadId??null);{let n=St(t.params.item);F(e.onProgress,n?.message,n?.phase??null)}break;case`item/completed`:kt(e,t.params.item,`completed`,t.params.threadId??null);{let n=Ct(t.params.item);F(e.onProgress,n?.message,n?.phase??null)}break;case`thread/tokenUsage/updated`:{let n=vt(t.params?.tokenUsage?.total??t.params?.tokenUsage),r=ht(t);n&&r&&e.tokenUsageByThread.set(r,n);break}case`error`:e.error=t.params.error,F(e.onProgress,`Codex error: ${t.params.error.message}`,`failed`);break;case`turn/completed`:if((t.params.threadId??null)!==e.threadId){e.activeSubagentTurns.delete(t.params.threadId),Dt(e);break}F(e.onProgress,`Turn ${t.params.turn.status}.`,`finalizing`),Et(e,t.params.turn);break;default:break}}async function jt(e,t,n,r={}){let i=wt(t,r),a=e.notificationHandler;e.setNotificationHandler(e=>{if(!i.turnId){i.bufferedNotifications.push(e);return}if(e.method===`thread/started`){At(i,e);return}if(!Ot(i,e)){a?.(e);return}At(i,e)});let o=r.onApprovalRequest;o&&e.setServerRequestHandler((e,t)=>o(e,t,i));try{let e=await n();i.turnId=e.turn?.id??null,i.turnId&&i.threadTurnIds.set(i.threadId,i.turnId);for(let e of i.bufferedNotifications)Ot(i,e)?At(i,e):a?.(e);return i.bufferedNotifications.length=0,e.turn?.status&&e.turn.status!==`inProgress`&&Et(i,e.turn),await i.completion}finally{Tt(i),e.setNotificationHandler(a??null),e.setServerRequestHandler(null)}}async function Mt(e,t){let n=null;try{n=await _.connect(e);let r=await t(n);return await n.close(),r}catch(r){let i=r,a=n?.transport===`broker`||!!process.env.CODER_APP_SERVER_ENDPOINT,o=n?.transport===`broker`&&i?.rpcCode===-32001||a&&(i?.code===`ENOENT`||i?.code===`ECONNREFUSED`);if(n&&=(await n.close().catch(()=>{}),null),!o)throw r;let s=await _.connect(e,{disableBroker:!0});try{return await t(s)}finally{await s.close()}}}function I(e){let t=ee(`codex`,[`--version`],{cwd:e});if(!t.available)return t;let n=ee(`codex`,[`app-server`,`--help`],{cwd:e});return n.available?{available:!0,detail:`${t.detail}; app-server runtime available`}:{available:!1,detail:`${t.detail}; app-server runtime unavailable: ${n.detail}`}}async function Nt(e){let t=I(e);if(!t.available)return{available:!1,loggedIn:!1,detail:t.detail};let n=null;try{n=await _.connect(e,{reuseExistingBroker:!0});let t=await n.request(`account/read`,{refreshToken:!1}),r=t?.account??null;return r?.type===`chatgpt`?{available:!0,loggedIn:!0,detail:r.email?`ChatGPT login active for ${r.email}`:`ChatGPT login active`}:r?.type===`apiKey`?{available:!0,loggedIn:!0,detail:`API key configured`}:t?.requiresOpenaiAuth===!1?{available:!0,loggedIn:!0,detail:`Active provider does not require OpenAI authentication`}:{available:!0,loggedIn:!1,detail:"Not authenticated. Run `codex login`."}}catch(e){let t=T(`codex`,[`login`,`status`],{encoding:`utf8`}),n=`${t.stdout??``}${t.stderr??``}`.trim();return t.status===0?{available:!0,loggedIn:!0,detail:n||`Logged in`}:{available:!0,loggedIn:!1,detail:n||(e instanceof Error?e.message:String(e))}}finally{await n?.close().catch(()=>{})}}async function Pt(e,{threadId:t,turnId:n}){if(!t||!n)return{interrupted:!1,detail:`missing threadId or turnId`};let r=null;try{return r=await _.connect(e,{reuseExistingBroker:!0}),await r.request(`turn/interrupt`,{threadId:t,turnId:n}),{interrupted:!0,detail:`Interrupted ${n} on ${t}.`}}catch(e){return{interrupted:!1,detail:e instanceof Error?e.message:String(e)}}finally{await r?.close().catch(()=>{})}}async function Ft(e,{threadId:t,text:n}){if(!t)return{steered:!1,detail:`missing threadId`};let r=n.trim();if(!r)return{steered:!1,detail:`empty follow-up`};let i=null;try{return i=await _.connect(e,{reuseExistingBroker:!0}),await i.request(`turn/steer`,{threadId:t,input:[{type:`text`,text:r,text_elements:[]}]}),{steered:!0,detail:`Steered follow-up into the active turn on ${t}.`}}catch(e){return{steered:!1,detail:e instanceof Error?e.message:String(e)}}finally{await i?.close().catch(()=>{})}}async function It(e,t={}){let n=I(e);if(!n.available)throw Error(`Codex CLI is not available: ${n.detail}`);let r=t.prompt?.trim();if(!r)throw Error(`A prompt is required.`);return Mt(e,async n=>{let i;if(t.resumeThreadId)F(t.onProgress,`Resuming thread ${t.resumeThreadId}.`,`starting`),l(t.resumeThreadId)&&await d(t.resumeThreadId),i=(await n.request(`thread/resume`,{threadId:t.resumeThreadId,cwd:e,model:t.model??null,modelProvider:t.modelProvider??null,config:t.configOverrides??null,approvalPolicy:t.approvalPolicy??`never`,sandbox:t.sandbox??`read-only`})).thread.id;else{F(t.onProgress,`Starting Codex task thread.`,`starting`),i=(await n.request(`thread/start`,{cwd:e,model:t.model??null,modelProvider:t.modelProvider??null,config:t.configOverrides??null,approvalPolicy:t.approvalPolicy??`never`,sandbox:t.sandbox??`read-only`,serviceName:`coder_runtime`,ephemeral:t.ephemeral??!1})).thread.id;try{await n.request(`thread/name/set`,{threadId:i,name:mt(r)})}catch(e){let t=String(e?.message??e??``);if(!t.includes(`unknown variant`)&&!t.includes(`unknown method`))throw e}}F(t.onProgress,`Thread ready (${i}).`,`starting`,{threadId:i});let a=await jt(n,i,()=>n.request(`turn/start`,{threadId:i,input:[{type:`text`,text:r,text_elements:[]}],model:t.model??null,effort:t.effort??null,outputSchema:t.outputSchema??null}),{onProgress:t.onProgress,onHeartbeat:t.onHeartbeat,onApprovalRequest:t.onApprovalRequest});return{status:a.finalTurn?.status===`completed`?0:1,threadId:i,turnId:a.turnId,finalMessage:a.lastAgentMessage,reasoningSummary:a.reasoningSummary,turn:a.finalTurn,error:a.error,stderr:ft(n.stderr),fileChanges:a.fileChanges,touchedFiles:_t(a.fileChanges),tokens:yt(a),model:t.model??null,commandExecutions:a.commandExecutions}})}const Lt={chain:[`codex`,`claude`],agents:{codex:{model:`gpt-5.6-terra`,effort:`high`,permissions:`auto`},claude:{model:`opus`,effort:`medium`,permissions:`auto`}},models:{},approvals:{escalationTimeoutMs:12e4,allowedNetworkHosts:[]}},L={mini:`gpt-5.4-mini`,luna:`gpt-5.6-luna`,terra:`gpt-5.6-terra`,sol:`gpt-5.6-sol`},R=new Set([`low`,`medium`,`high`]),z={haiku:`haiku`,sonnet:`sonnet`,opus:`opus`,fable:`fable`},B=new Set([`low`,`medium`,`high`]),Rt={"read-only":{sandbox:`read-only`,approvalPolicy:`never`,approvalMode:null},"workspace-write":{sandbox:`workspace-write`,approvalPolicy:`never`,approvalMode:null},auto:{sandbox:`workspace-write`,approvalPolicy:`on-request`,approvalMode:`auto`}},zt={"read-only":[`--permission-mode`,`dontAsk`,`--disallowedTools`,`Edit`,`Write`,`NotebookEdit`],"workspace-write":[`--permission-mode`,`acceptEdits`],auto:[`--permission-mode`,`auto`]},Bt=/failIfUnavailable|sandbox\b[^.\n]*?(?:failed|could ?n[o']t|cannot|unavailable|not available|not supported)/i;function Vt(e,t){return e===`read-only`?JSON.stringify({sandbox:{enabled:!0,failIfUnavailable:!0,autoAllowBashIfSandboxed:!0,filesystem:{denyWrite:[t]}}}):null}const Ht=E.enum([`codex`,`claude`]),Ut=E.enum([`codex`,`claude`,`custom`]),Wt=E.enum([`low`,`medium`,`high`]),Gt=E.enum([`read-only`,`workspace-write`,`auto`]),Kt=E.partial(E.strictObject({model:E.string().check(E.minLength(1)),effort:Wt,permissions:Gt})),qt=E.strictObject({baseUrl:E.url(),model:E.string().check(E.minLength(1)),envKey:E.optional(E.string().check(E.minLength(1))),wireApi:E.optional(E.enum([`chat`,`responses`])),disabled:E.optional(E.boolean())}),Jt=E.strictObject({provider:Ht,model:E.string().check(E.minLength(1)),effort:E.optional(Wt),disabled:E.optional(E.boolean())}),Yt=E.strictObject({disabled:E.boolean()}),Xt=E.union([qt,Jt,Yt]),Zt=E.strictObject({escalationTimeoutMs:E.number().check(E.positive()),allowedNetworkHosts:E.array(E.string())}),Qt=E.strictObject({chain:E.array(Ut).check(E.minLength(1)),agents:E.partial(E.strictObject({codex:Kt,claude:Kt,custom:Kt})),models:E.optional(E.record(E.string().check(E.regex(/^[a-z0-9][a-z0-9./_-]*$/i,`model name`)),Xt)),approvals:Zt}),$t=E.partial(E.extend(Qt,{approvals:E.partial(Zt)}));function V(e){return`baseUrl`in e}function H(e){return`provider`in e}function U(e){let t=$t.safeParse(e);if(!t.success)return t.error.issues.map(e=>`${e.path.join(`.`)||`config`}: ${e.message}`);let n=tn(Lt,t.data),r=[];for(let[e,i]of Object.entries(t.data.models??{})){if(e===`codex`||e===`claude`||e===`custom`){r.push(`models.${e}: reserved agent name`);continue}if(H(i)){let t=n.models?.[i.model];t&&!V(t)&&r.push(`models.${e}: alias target "${i.model}" is itself a config entry`)}}return r}function en(e){if(!S.existsSync(e))return null;try{return JSON.parse(S.readFileSync(e,`utf8`))}catch(t){let n=t instanceof Error?t.message:String(t);throw Error(`Invalid JSON in ${e}: ${n}`)}}function tn(e,t){if(!t||typeof t!=`object`||Array.isArray(t))return t??e;let n={...e},r=e;for(let[e,i]of Object.entries(t))i&&typeof i==`object`&&!Array.isArray(i)&&r?.[e]&&typeof r[e]==`object`?n[e]=tn(r[e],i):n[e]=i;return n}function W(){return C.join(s(),`config.json`)}function nn(e){let t=r(e),n=Lt;for(let e of[W(),C.join(t,`coder.config.json`)]){let t=en(e);if(!t)continue;let r=U(t);if(r.length)throw Error(`Invalid config in ${e}:\n ${r.join(`
|
|
10
|
-
`)}`);n=tn(n,t)}let i=U(n);if(i.length)throw Error(`Invalid merged config:\n ${i.join(`
|
|
11
|
-
`)}`);return n}function rn(e){return e.replace(/\/+$/,``).replace(/\/(chat\/completions|completions|responses)$/,``)}function an(e,t,n){let i=[C.join(r(e),`coder.config.json`),W()];for(let e of i){let r;try{r=en(e)}catch{continue}if(r?.models?.[t])return Object.assign(r.models[t],n),U(r).length?!1:(S.writeFileSync(e,`${JSON.stringify(r,null,2)}\n`,`utf8`),!0)}return!1}function on(e){return/\/(chat\/completions|completions|responses)\/*$/.test(e)}function sn(e,t){let n=rn(e);return on(e)||/\/v\d+(alpha|beta)?$/.test(n)?[`${n}/${t}`]:[`${n}/${t}`,`${n}/v1/${t}`]}function cn(e,t,n){let r=t?e.models?.[t]:void 0;if(!t||!r||!V(r))return null;let i=`coder-${t}`;return{model:r.model,modelProvider:i,configOverrides:{[`model_providers.${i}`]:{name:t,base_url:n?.url??rn(r.baseUrl),...r.envKey&&!n?{env_key:r.envKey}:{},wire_api:`responses`}}}}function ln(e){return e?L[e]??e:null}function un(e){return e in L||e in z}function dn(e,t){return!!(t&&e.models?.[t]?.disabled)}function fn(e,t){if(dn(e,t))throw Error(`model "${t}" is disabled in config`)}function pn(e,t){if(!e)return null;let n=String(e).trim().split(`:`).map(e=>e.trim());if(!n.length||n.length>3||n.some(e=>!e))throw Error(`Invalid agent spec "${e}".`);let r=null,i=null,a=null,o=e=>R.has(e)||B.has(e);for(let t of n)if(t===`codex`||t===`claude`||t===`custom`){if(r)throw Error(`Invalid agent spec "${e}".`);r=t}else if(o(t)&&!a)a=t;else if(!i)i=t;else throw Error(`Invalid agent spec "${e}".`);let s=i?t.models?.[i]:void 0;if(s&&H(s)){if(s.disabled)throw Error(`model "${i}" is disabled in config`);if(r&&r!==s.provider)throw Error(`Alias "${i}" runs on ${s.provider}, not ${r}.`);r=s.provider,a=a??s.effort??null,i=s.model}r||=i&&i in z?`claude`:i&&s&&V(s)?`custom`:`codex`;let c=t.agents[r]??{},l=i??c.model??null;return fn(t,l),{agent:r,model:l,effort:a??c.effort??null}}function mn(e){let t=W();return S.mkdirSync(C.dirname(t),{recursive:!0}),S.writeFileSync(t,`${JSON.stringify(e,null,2)}\n`,`utf8`),t}function hn(e){return typeof e==`string`?e:Array.isArray(e)?e.map(e=>typeof e?.text==`string`?e.text:``).join(``):e==null?``:JSON.stringify(e)}function gn(e){if(!e||typeof e!=`object`)return null;let t=e=>typeof e==`number`&&Number.isFinite(e)?e:0,n=t(e.input_tokens),r=t(e.cache_read_input_tokens)+t(e.cache_creation_input_tokens),i=t(e.output_tokens);return{input:n,cachedInput:r,output:i,total:n+r+i}}function _n(){let e=T(`claude`,[`--version`],{encoding:`utf8`});return e.error||e.status!==0?{available:!1,detail:`claude CLI not found on PATH (npm install -g @anthropic-ai/claude-code)`}:{available:!0,detail:String(e.stdout||``).trim()}}function vn(){let e=T(`claude`,[`auth`,`status`,`--json`],{encoding:`utf8`});if(e.error||e.status!==0)return{loggedIn:!1,detail:`not logged in`};try{let t=JSON.parse(String(e.stdout||``));return t.loggedIn?{loggedIn:!0,detail:[t.email,t.subscriptionType].filter(Boolean).join(`, `)||`logged in`}:{loggedIn:!1,detail:`not logged in`}}catch{return{loggedIn:!1,detail:`unknown`}}}async function yn(e,t){let n=t.resumeSessionId??le(),r=[`-p`,t.prompt,`--output-format`,`stream-json`,`--verbose`];r.push(t.resumeSessionId?`--resume`:`--session-id`,n),t.model&&r.push(`--model`,t.model),t.effort&&r.push(`--effort`,t.effort);let i=t.permissions??`auto`;r.push(...zt[i]??zt.auto);let a=Vt(i,e);return a&&r.push(`--settings`,a),t.onProgress?.({message:`claude turn started (session ${n})`,threadId:n}),new Promise((i,a)=>{let o=w(`claude`,r,{cwd:e,stdio:[`ignore`,`pipe`,`pipe`]}),s=``,c=``,l=null,u=n,d=e=>{if(!(!e||typeof e!=`object`))if(t.onHeartbeat?.(),e.type===`system`&&e.subtype===`init`&&e.session_id)u=e.session_id;else if(e.type===`assistant`)for(let n of e.message?.content??[])n?.type===`tool_use`&&t.onProgress?.({message:`${n.name} ${JSON.stringify(n.input??{})}`,threadId:u});else if(e.type===`user`){for(let n of e.message?.content??[])if(n?.type===`tool_result`){let e=hn(n.content).trim();e&&t.onProgress?.({message:e,threadId:u})}}else e.type===`result`&&(l=e,e.session_id&&(u=e.session_id))};o.stdout.on(`data`,e=>{s+=e;let t;for(;(t=s.indexOf(`
|
|
12
|
-
`))>=0;){let e=s.slice(0,t).trim();if(s=s.slice(t+1),e)try{d(JSON.parse(e))}catch{}}}),o.stderr.on(`data`,e=>{c+=e});let f=()=>{o.kill(`SIGTERM`),process.exit(143)};process.on(`SIGTERM`,f),o.on(`error`,e=>{process.removeListener(`SIGTERM`,f),a(Error(`claude spawn failed: ${e.message}`))}),o.on(`close`,e=>{process.removeListener(`SIGTERM`,f);let n=s.trim();if(n)try{d(JSON.parse(n))}catch{}let r=l?.result??``,a=e!==0||l?.is_error===!0||l==null;i({status:+!!a,threadId:l?.session_id??u,turnId:null,finalMessage:r,tokens:gn(l?.usage),model:l?.modelUsage&&Object.keys(l.modelUsage).join(`+`)||t.model||null,error:a?{message:r||c.trim()||`claude exited ${e}`}:null})})})}function bn(e){T(`claude`,[`plugin`,`marketplace`,`remove`,`coder-plugins`],{encoding:`utf8`});let t=T(`claude`,[`plugin`,`marketplace`,`add`,e],{encoding:`utf8`}),n=T(`claude`,[`plugin`,`install`,`coder@coder-plugins`],{encoding:`utf8`}),r=t.status===0&&n.status===0;return{marketplace:e,installed:r,note:r?`Plugin installed; restart any running Claude Code session to load it.`:`Automatic install failed (${(n.stderr||t.stderr||`claude not found`).trim()}); run: claude plugin marketplace add "${e}" && claude plugin install coder@coder-plugins`}}function xn(){return C.join(ae.homedir(),`.agents`,`skills`,`coder`)}function Sn(){try{let e=S.readFileSync(C.join(xn(),`SKILL.md`),`utf8`);return/^\s*version:\s*(\S+)/m.exec(e)?.[1]??null}catch{return null}}function Cn(e){let t=xn();try{let n=C.join(e,`plugins`,`agents`,`skills`,`coder`);S.rmSync(t,{recursive:!0,force:!0}),S.mkdirSync(t,{recursive:!0}),S.cpSync(n,t,{recursive:!0});let r=C.join(t,`SKILL.md`),i=S.readFileSync(r,`utf8`).replace(`
|
|
13
|
-
---
|
|
14
|
-
`,`\nmetadata:\n version: ${h()}\n---\n`);return S.writeFileSync(r,i),{marketplace:t,installed:!0,note:`Skill installed to ~/.agents/skills/coder; restart running sessions to load it.`}}catch(e){return{marketplace:t,installed:!1,note:`Skill install failed: ${e instanceof Error?e.message:String(e)}`}}}function wn(e){if(e.available)return null;let t=T(`npm`,[`install`,`-g`,`@openai/codex@latest`],{encoding:`utf8`});return t.status===0?{installed:!0,note:`codex CLI installed (runs your custom models; no login needed for them)`}:{installed:!1,note:`custom models run on the codex CLI and it is not installed; auto-install failed: ${(t.stderr||`npm not found`).trim()}. Run: npm install -g @openai/codex`}}function Tn(e){let t=/(\d+\.\d+\.\d+)/.exec(String(e??``));return t?t[1]:null}function En(e){if(!e.available)return null;let t=Tn(e.detail);if(!t||Ve(t,`0.144.0`)>=0)return null;let n=T(`codex`,[`update`],{encoding:`utf8`});return n.status!==0&&(n=T(`npm`,[`install`,`-g`,`@openai/codex@latest`],{encoding:`utf8`})),n.status===0?{updated:!0,from:t}:{updated:!1,from:t,note:`codex ${t} is too old for the default GPT-5.6 model (needs >= 0.144.0); auto-update failed: ${(n.stderr||`codex/npm not found`).trim()}. Run: codex update`}}const Dn=/usage|quota|rate.?limit|429|401|unauthorized|not authenticated|login|insufficient|exhausted|not available|ENOENT/i,On=`CODER_WORKER`;var G=class extends Error{code;hint;taskId;payload;approval;result;runId;constructor(e,t,n={}){super(t),this.name=`CoderError`,this.code=e,Object.assign(this,n)}},kn=class extends Error{agent;detail;constructor(e,t){super(t),this.agent=e,this.detail=t}};function An(e,t){let n=e.agent,r=!!n,i=e.model,a=e.effort,o=e=>{let n=e?t.models?.[e]:void 0;return n&&H(n)?n:void 0},s=e=>{let n=e?t.models?.[e]:void 0;return n&&V(n)?n:void 0};if(o(i)){let e;try{e=pn(i,t)}catch(e){throw new G(`invalid-option`,e instanceof Error?e.message:String(e))}e&&(r||(n=e.agent),i=e.model??void 0,a=a??e.effort??void 0)}if(!n&&i&&(i in z?n=`claude`:i in L?n=`codex`:s(i)&&(n=`custom`)),n=n??t.chain[0]??`codex`,n!==`codex`&&n!==`claude`&&n!==`custom`){let e=n in L||n in z||n in(t.models??{})?` "${n}" is a model; use --model ${n}.`:``;throw new G(`invalid-option`,`Invalid --agent "${n}". Use codex, claude, or custom.${e}`)}let c=t.agents[n]??{},l=i??c.model??null,u=a??c.effort??null;if(o(l)){let e;try{e=pn(l,t)}catch(e){throw new G(`invalid-option`,e instanceof Error?e.message:String(e))}e&&(r||(n=e.agent),l=e.model,u=a??e.effort??u)}let d=e.permissions??c.permissions??`auto`;try{fn(t,l)}catch(e){throw new G(`invalid-option`,e instanceof Error?e.message:String(e))}if(n===`custom`){let e=Object.entries(t.models??{}).filter(([,e])=>V(e)).map(([e])=>e);if(!l&&e.length===1&&(l=e[0]),!l||!s(l))throw new G(`invalid-option`,l?`No custom model named "${l}". Configured: ${e.join(`, `)||`none`}.`:`No custom model to run: pass --model <name> or set agents.custom.model.`,{hint:`Add one: coder model add <name> --base-url <url> --model <id>`})}let f=n===`claude`?`claude`:`codex`;if(!(d in Rt))throw new G(`invalid-option`,`Invalid --permissions "${d}". Use one of: ${Object.keys(Rt).join(`, `)}`);if(f===`codex`&&u&&!R.has(u))throw new G(`invalid-option`,`Invalid codex --effort "${u}". Use one of: ${[...R].join(`, `)}`);if(f===`claude`&&u&&!B.has(u))throw new G(`invalid-option`,`Invalid claude --effort "${u}". Use one of: ${[...B].join(`, `)}`);return{engine:f,agent:n,model:l,effort:u,permissions:d}}function jn(e,t){return e===`read-only`&&Bt.test(t??``)}async function Mn(e,r,a,o){let s=a.cwd,c=r.engine===`codex`?I(s):_n(),l=r.model?e.models?.[r.model]:void 0;if(!c.available&&l&&V(l)){let e=wn(c);a.onInstallNote?.(e.note),c=I(s)}if(!c.available)throw new kn(r.agent,c.detail);let u=null;o.resume&&(u=t(s,o.resume)?.threadId??o.resume);let d=ne(),ee=re(s,d,{status:`queued`,kind:`task`,name:o.name??null,system:a.system??null,agent:r.agent,engine:r.engine,prompt:a.prompt,model:r.model,effort:r.effort,permissions:r.permissions,resumeThreadId:u,cwd:s,background:!a.wait,...o.simulateApproval?{simulateApproval:!0}:{},...a.flowRunId?{flowRunId:a.flowRunId}:{}}),m=n(s,d),h=S.openSync(C.join(m,`worker.log`),`a`),g=w(x.execPath,[f,`_worker`,d,`--cwd`,s],{cwd:s,detached:!0,stdio:[`ignore`,h,h],env:{...x.env,[On]:`1`}});g.unref(),S.closeSync(h),re(s,d,{pid:g.pid??null});let _=2**53-1,v=()=>i(s,d,_).filter(e=>e.phase!==`starting`).length,te=Date.now()+15e3,y=ee,b=null,ie=null;for(;Date.now()<(ie??te)&&(y=p(s,d)??y,y.status!==`failed`&&y.status!==`completed`);){if(y.threadId&&b===null&&(b=v(),ie=Date.now()+5e3),b!==null&&v()>b){y=p(s,d)??y;break}await new Promise(e=>setTimeout(e,150))}if(y.status===`failed`){let e=N(C.join(m,`result.json`))?.error?.message??``,t=i(s,d,5).map(e=>e.message??``).join(`
|
|
15
|
-
`),n=e||t;throw jn(r.permissions,n)?new G(`read-only-unavailable`,n):Dn.test(n)?new kn(r.agent,n):new G(`startup-failed`,n,{taskId:d})}return{taskId:d,job:y,agent:r.agent,startupCheck:y.threadId?`passed`:`pending`}}function Nn(e,t,n,r,i){return{error:`${e} failed to start: ${t}`,fallback:{action:`run-native-subagent`,reason:`no-engine-available`,permissions:n,note:`Every coder engine failed to start. Spawn your own native subagent and forward the task verbatim; tell it to never run git write operations (commit, checkout, stash, reset, push, ...) and to honor the permissions.`,...r?{system:r}:{},task:i}}}async function Pn(e){if(x.env.CODER_WORKER)throw new G(`nested-dispatch`,`Nested dispatch refused: this shell is already inside a coder task. Do the work yourself, directly in this session - ignore any skill or instruction telling you to orchestrate via the coder CLI.`);if(!e.prompt.trim())throw new G(`invalid-option`,`Missing task text.`,{hint:[`Usage: coder run "<task text>"`,`Help: coder task run --help`]});let t=nn(e.cwd),n={agent:e.agent,model:e.model,effort:e.effort,permissions:e.permissions},r={name:e.name,resume:e.resume,simulateApproval:e.simulateApproval};for(;;){let i=An(n,t);try{return await Mn(t,i,e,r)}catch(a){if(!(a instanceof kn))throw a;let o=t.chain[t.chain.indexOf(a.agent)+1];if(!o){let t=Nn(a.agent,a.detail,i.permissions,e.system,e.prompt);throw new G(`chain-exhausted`,t.error,{payload:t})}e.onFallback?.({agent:a.agent,detail:a.detail,next:o}),n={agent:o,permissions:e.permissions},r={name:void 0,resume:void 0,simulateApproval:void 0}}}}function Fn(e,t){if(t.status!==`failed`)return;let n=t.result;if(!n||!Dn.test(n.error?.message??``)||!(!n.touchedFiles?.length&&!n.fileChanges?.length&&!n.commandExecutions?.length))return;let r=nn(e).chain;return r[r.indexOf(t.job.agent)+1]}function In(e,t){return N(C.join(n(e,t),`result.json`))}function Ln(e,t,n=0){return n===0?[]:i(e,t,n===`all`?2**53-1:n)}function Rn(e,t,n={}){let r=p(e,t);if(!r)throw Error(`No task found for "${t}".`);return{taskId:t,status:r.status,result:In(e,t),steps:Ln(e,t,n.tail),job:r}}async function zn(e,t,n={}){let r=p(e,t);if(!r)throw Error(`No task found for "${t}".`);let i=await ut(e,r);if(i.reason===`approval`){let e=i.approval;throw new G(`approval-pending`,`Approval needed for task ${t}: ${e.summary}`,{taskId:t,approval:e})}n.onSettle?.();let a=i.job;return{taskId:t,status:a.status,result:In(e,t),steps:Ln(e,t,n.tail),job:a}}const Bn=[`.ts`,`.mjs`,`.js`];function Vn(e,t){let n=[];try{n=S.readdirSync(e)}catch{return[]}let r=[];for(let i of n.sort()){let n=C.extname(i);Bn.includes(n)&&r.push({name:C.basename(i,n),path:C.join(e,i),scope:t})}return r}function Hn(e){let t=r(e),n=[],i=C.resolve(e);for(;n.push({dir:C.join(i,`.coder`,`flows`),scope:`workspace`}),i!==t&&C.dirname(i)!==i;)i=C.dirname(i);return n.push({dir:C.join(s(),`flows`),scope:`global`}),n}function Un(e){let t=new Set,n=[];for(let{dir:r,scope:i}of Hn(e))for(let e of Vn(r,i))t.has(e.name)||(t.add(e.name),n.push(e));return n}function Wn(e){return e.includes(`/`)||Bn.includes(C.extname(e))}function Gn(e,t){if(Wn(e)){let n=C.resolve(t,e);if(S.existsSync(n))return{name:C.basename(n,C.extname(n)),path:n};throw Error(`Flow file not found: ${e}`)}let n=Un(t).find(t=>t.name===e);if(!n)throw Error(`No flow named "${e}". Run \`coder flow discover\` to see available flows.`);return{name:n.name,path:n.path}}function Kn(e,t,n={}){if(t.length)try{w(x.execPath,[f,`_archiveSweep`,`--cwd`,e,...n.flows?[`--flows`]:[],...t],{detached:!0,stdio:`ignore`}).unref()}catch{}}async function qn(e){let{options:n,positionals:r}=m(e,E.object({cwd:te,flows:v})),i=j(n);for(let e of r){if(n.flows){let t=Z(e);t&&Fr(t);continue}let r=t(i,e);r&&y(i,r)}}async function Jn(e){let{options:t,positionals:n}=m(e,E.object({...g,"all-stopped":v}));Le(n,1,`task archive`);let r=j(t);if(t[`all-stopped`]){let e=o(r).filter(e=>u.includes(e.status));for(let t of e)y(r,t);let n=e.map(e=>e.id);if(t.json){k({archived:n,count:n.length});return}x.stdout.write(n.length?`Archived ${n.length} stopped task${n.length===1?``:`s`}.\n`:`${D.dim(`No stopped tasks to archive.`)}\n`);return}let i=n[0];i||pe(`Missing task id.`,{hint:[`Archive one: coder task archive <task-id>`,`Archive all stopped: coder task archive --all-stopped`]});let a=Re(r,i);if(y(r,a),t.json){k({taskId:a.id,archived:!0});return}x.stdout.write(`Archived task ${D.cyan(a.id)}.\n`)}async function Yn(e,t){let n=t.engine===`claude`?{detail:`claude worker terminated`}:await Pt(e,{threadId:t.threadId,turnId:t.turnId});if(t.pid&&t.status===`running`)try{x.kill(t.pid,`SIGTERM`)}catch{}return re(e,t.id,{status:`cancelled`,completedAt:new Date().toISOString()}),{taskId:t.id,status:`cancelled`,interrupt:n.detail}}async function Xn(e){let{options:t,positionals:n}=m(e,E.object(g));Le(n,1,`task stop`);let r=j(t),i=Re(r,n[0]),{interrupt:a}=await Yn(r,i);if(t.json){k({taskId:i.id,status:`cancelled`,interrupt:a});return}x.stdout.write(`Stopped task ${D.cyan(i.id)} ${D.dim(`(${a})`)}\n`)}function Zn(e){return typeof e!=`object`||!e?JSON.stringify(e)??`null`:Array.isArray(e)?`[${e.map(Zn).join(`,`)}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Zn(e[t])}`).join(`,`)}}`}function Qn(e,t){return ce.createHash(`sha256`).update(`${e}\0${Zn(t)}`).digest(`hex`)}function K(e){return S.existsSync(e)?S.readFileSync(e,`utf8`).split(/\r?\n/).filter(Boolean).map(e=>{try{return JSON.parse(e)}catch{return null}}).filter(e=>e!==null):[]}var $n=class{file;recorded;seq=0;constructor(e,t){this.file=t,this.recorded=e.map(e=>({...e})),S.writeFileSync(t,``,`utf8`)}write(e){e.seq=this.seq++,S.appendFileSync(this.file,`${JSON.stringify(e)}\n`,`utf8`)}replay(e){let t=this.recorded.find(t=>!t.consumed&&t.fingerprint===e);if(!t)return null;t.consumed=!0;let{consumed:n,...r}=t;return this.write(r),r}record(e){this.write({...e,seq:0})}};const er=globalThis,q=er.__coderFlowCtxALS??=new ue,J=er.__coderFlowScopeALS??=new ue;function tr(){return J.getStore()?.args}function nr(){return J.getStore()?.depth??0}var rr=class{limit;active=0;queue=[];constructor(e){this.limit=e}async run(e){this.active<this.limit?this.active+=1:await new Promise(e=>this.queue.push(e));try{return await e()}finally{let e=this.queue.shift();e?e():--this.active}}};function ir(e,t){return t?e?{input:e.input+t.input,cachedInput:e.cachedInput+t.cachedInput,output:e.output+t.output,total:e.total+t.total}:{...t}:e}function ar(e,t){if(!t.tokens)return;let n=t.model??`default`;e.ledger[n]=ir(e.ledger[n]??null,t.tokens)}function or(e){return!!e&&typeof e.safeParse==`function`}async function sr(e){try{let t=await import(`zod`);if(typeof t.toJSONSchema==`function`)return t.toJSONSchema(e)}catch{}return null}async function cr(e){let t=await sr(e);return`Reply with ONLY a single JSON object ${t?`matching this JSON Schema:\n${JSON.stringify(t,null,2)}`:`matching the requested shape`}\nNo prose, no markdown fences — just the JSON object.`}function lr(e){let t=e.trim(),n=t.match(/```(?:json)?\s*([\s\S]*?)```/i);n&&(t=n[1].trim());let r=t.indexOf(`{`);if(r===-1)throw Error(`no JSON object found in reply`);let i=0,a=!1,o=!1;for(let e=r;e<t.length;e+=1){let n=t[e];if(a){o?o=!1:n===`\\`?o=!0:n===`"`&&(a=!1);continue}if(n===`"`)a=!0;else if(n===`{`)i+=1;else if(n===`}`&&(--i,i===0))return JSON.parse(t.slice(r,e+1))}throw Error(`unterminated JSON object in reply`)}function ur(e,t){if(!or(e))return{ok:!0,data:t};let n=e.safeParse(t);if(n.success)return{ok:!0,data:n.data};let r=n.error?.issues??n.error?.errors??[];return{ok:!1,errors:Array.isArray(r)?r.map(e=>`${(e.path??[]).join(`.`)||`(root)`}: ${e.message}`).join(`; `):String(n.error)}}function dr(e,t,n){return{cwd:t,agent:e.agent,model:e.model,effort:e.effort,permissions:e.permissions,name:e.name,system:e.system,wait:!0,flowRunId:n?.runId}}async function fr(e,t,n,r){let i=t.cwd?C.resolve(t.cwd):n?.cwd??x.cwd(),a;for(;;){let o=await Pn({prompt:e,...dr(t,i,n),...a?{agent:a,model:void 0,effort:void 0,resume:void 0}:{resume:r??t.resume},onFallback:e=>Sr(`${e.agent} failed to start — falling back to ${e.next} (${e.detail.replace(/\s+/g,` `).slice(0,140)})`)});n?.running.add(o.taskId);let s=p(i,o.taskId),c=s?be(s):void 0;n?.hooks.onTaskStart?.({taskId:o.taskId,name:t.name,prompt:e,agent:c,depth:nr()});let l;try{l=await zn(i,o.taskId)}finally{n?.running.delete(o.taskId)}let u=Fn(i,l);if(u){n?.hooks.onTaskEnd?.({taskId:o.taskId,status:`failed`,tokens:null}),a=u;continue}return{taskId:o.taskId,status:l.status,output:l.result?.finalMessage||l.result?.error?.message||``,tokens:l.result?.tokens??null,model:l.result?.model??l.job.model??null}}}async function pr(e,t,n){let r=e;if(t.returns&&(r=`${e}\n\n${await cr(t.returns)}`),n?.dryRun){x.stdout.write(`\n[dry-run] task${t.name?` (${t.name})`:``}:\n${r}\n`);let e={...t,returns:t.returns?`<schema>`:void 0};return x.stdout.write(`[dry-run] opts: ${JSON.stringify(e)}\n`),{taskId:`dry`,status:`completed`,output:`[dry-run]`,data:void 0,tokens:null,model:t.model??null}}let i=await fr(r,t,n);if(i.status!==`completed`){let e={...i,data:void 0};throw new G(`task-failed`,`Task ${i.taskId} ${i.status}: ${i.output||`no output`}`,{taskId:i.taskId,result:e})}let a=i.output,o=i.tokens,s;if(t.returns){let e;try{e=ur(t.returns,lr(a))}catch(t){e={ok:!1,errors:t instanceof Error?t.message:String(t)}}if(e.ok)s=e.data;else{let r=await fr(`Your previous reply did not match the required format: ${e.errors}\n\n${await cr(t.returns)}`,t,n,i.taskId);a=r.output||a,o=ir(o,r.tokens);try{let e=ur(t.returns,lr(a));if(!e.ok)throw Error(e.errors);s=e.data}catch(e){let t={taskId:i.taskId,status:`completed`,output:a,data:void 0,tokens:o,model:i.model};throw new G(`task-failed`,`Task ${i.taskId} produced no valid structured output: ${e instanceof Error?e.message:String(e)}`,{taskId:i.taskId,result:t})}}}return{taskId:i.taskId,status:`completed`,output:a,data:s,tokens:o,model:i.model}}async function mr(e){if(e)return await sr(e)??`<schema>`}async function hr(e,t={}){let n=q.getStore();if(!n)return pr(e,t);let r=Qn(`task`,{prompt:e,agent:t.agent,model:t.model,effort:t.effort,permissions:t.permissions,name:t.name,system:t.system,resume:t.resume,cwd:t.cwd,returns:await mr(t.returns)}),i=n.journal.replay(r);if(i)return i.result;if(n.taskCount+=1,n.taskCount>n.maxTasks)throw Error(`Flow exceeded --max-tasks (${n.maxTasks}). Raise it with --max-tasks, or fix a runaway loop; the run is resumable.`);return n.semaphore.run(async()=>{let i=new Date().toISOString(),a;try{a=await pr(e,t,n)}catch(e){let t=e instanceof G?e.result:void 0;throw t&&n.hooks.onTaskEnd?.({taskId:t.taskId,status:t.status===`completed`?`failed`:t.status,tokens:t.tokens}),e}return ar(n,a),n.dryRun||n.hooks.onTaskEnd?.({taskId:a.taskId,status:a.status,tokens:a.tokens}),n.journal.record({kind:`task`,fingerprint:r,result:a,taskId:a.taskId,tokens:a.tokens,startedAt:i,endedAt:new Date().toISOString()}),a})}const gr=256*1024;let _r=0;function vr(e){let t=[];for(let n=e;;){t.push(C.join(n,`node_modules`,`.bin`));let e=C.dirname(n);if(e===n)break;n=e}let n=x.platform===`win32`?`;`:`:`;return{...x.env,PATH:[...t,x.env.PATH??``].join(n)}}async function yr(e,t){return new Promise(n=>{let r=w(e,{shell:!0,cwd:t,env:vr(t)}),i=``,a=e=>{i.length>=gr||(i+=e,i.length>=gr&&(i=`${i.slice(0,gr)}\n... [gate output truncated]`))};r.stdout?.on(`data`,a),r.stderr?.on(`data`,a),r.on(`error`,e=>n({ok:!1,code:1,output:String(e.message??e).trim()})),r.on(`close`,e=>n({ok:e===0,code:e??0,output:i.trim()}))})}async function br(e,t={}){let n=q.getStore(),r=t.cwd?C.resolve(t.cwd):n?.cwd??x.cwd();if(!n)return yr(e,r);let i=Qn(`gate`,{cmd:e,cwd:t.cwd}),a=n.journal.replay(i);if(a)return a.result;if(n.dryRun){x.stdout.write(`\n[dry-run] gate: ${e}\n`);let t={ok:!0,code:0,output:``};return n.journal.record({kind:`gate`,fingerprint:i,result:t,startedAt:new Date().toISOString(),endedAt:new Date().toISOString()}),t}let o=new Date().toISOString(),s=`gate-${x.pid}-${_r+=1}`,c=nr();n.hooks.onGateStart?.({gateId:s,cmd:e,depth:c});let l=await yr(e,r);return n.hooks.onGate?.({gateId:s,cmd:e,ok:l.ok,code:l.code,depth:c}),n.journal.record({kind:`gate`,fingerprint:i,result:l,startedAt:o,endedAt:new Date().toISOString()}),l}async function xr(e,...t){return Promise.all(e.map(async(e,n)=>{let r=e;for(let i of t)try{r=await i(r,e,n)}catch{return null}return r}))}function Sr(e){let t=q.getStore();if(t)try{S.appendFileSync(C.join(t.runDir,`flow.log`),`${JSON.stringify({at:new Date().toISOString(),message:e})}\n`,`utf8`)}catch{}t?.hooks.onLog?t.hooks.onLog(e,nr()):(x.stderr.isTTY||!t)&&x.stderr.write(`[flow] ${e}\n`)}const Cr=ie(import.meta.url);function wr(e){let t=C.dirname(oe(import.meta.url));for(;C.basename(t)!==`dist`&&C.dirname(t)!==t;)t=C.dirname(t);return C.basename(t)===`dist`?se(C.join(t,e)).href:null}function Tr(e){if(!(e===`@wular/coder`||e===`@wular/coder/flow`||e===`zod`||e.startsWith(`zod/`)))return null;try{return se(Cr.resolve(e)).href}catch{}return e===`@wular/coder/flow`?wr(`flow/index.js`):e===`@wular/coder`?wr(`sdk.js`):null}const Er=/(\bfrom\s+|\bimport\s+|\bimport\s*\(\s*)(['"])([^'"]+)\2/g;function Dr(e){return e.replace(Er,(e,t,n,r)=>{let i=Tr(r);return i?`${t}${n}${i}${n}`:e})}async function Or(e,t,n){try{return await import(se(e).href)}catch(e){let r=e instanceof Error?e.message:String(e);throw t===`.ts`&&!x.versions?.bun&&/Unknown file extension|Unexpected token|SyntaxError|Cannot parse|import type|interface/i.test(r)?Error(`Could not run ${C.basename(n)}: TypeScript flows need bun. Run under \`bun\`, or write the flow as .mjs/.js.`):e}}async function kr(e){let t=C.extname(e),n;try{n=S.readFileSync(e,`utf8`)}catch{throw Error(`Cannot read flow file: ${e}`)}let r=Dr(n);if(r===n)return Or(e,t,e);let i=C.dirname(e);try{for(let e of S.readdirSync(i)){if(!e.startsWith(`.__coderflow_`))continue;let t=C.join(i,e);Date.now()-S.statSync(t).mtimeMs>10*6e4&&S.unlinkSync(t)}}catch{}let a=`${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`,o=C.join(i,`.__coderflow_${a}${t}`),s=`__coderflow_loaded_${a}`,c=new Promise(e=>{globalThis[s]=e});S.writeFileSync(o,`globalThis[${JSON.stringify(s)}]?.();${r}`,`utf8`);let l=Or(o,t,e);try{await Promise.race([c,l.then(()=>void 0,()=>void 0)])}finally{delete globalThis[s];try{S.unlinkSync(o)}catch{}}return await l}async function Ar(e,t){let n=J.getStore();n.args=t??{};let r=await kr(e),i=r.args,a=n.args;if(or(i)){let e=i.safeParse(t??{});if(!e.success){let e=ur(i,t??{});throw Error(`Invalid flow args: ${e.errors??`validation failed`}`)}a=e.data,n.args=a}let o=r.default;return typeof o==`function`?o(a):o}async function jr(e,t){let n=q.getStore(),r=Gn(e,n?.cwd??x.cwd());if(!n)return J.run({args:t??{},depth:0},()=>Ar(r.path,t));let i=J.getStore();if(i&&i.depth>=1)throw Error(`flow("${e}") nesting is one level deep; a sub-flow cannot call flow().`);let a=Qn(`flow`,{name:r.name,args:t??{}}),o=n.journal.replay(a);if(o)return o.result;let s=new Date().toISOString();n.hooks.onFlowStart?.({name:r.name,depth:(i?.depth??0)+1});let c=await J.run({args:t??{},depth:(i?.depth??0)+1},()=>Ar(r.path,t));return n.journal.record({kind:`flow`,fingerprint:a,result:c,startedAt:s,endedAt:new Date().toISOString()}),c}function Mr(){return`flow-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function Y(){return C.join(s(),`state`,`global`,`flows`)}function Nr(){return C.join(s(),`state`,`global`,`flows-archived`)}function X(e){b(e,`flow run id`);let t=C.join(Y(),e);if(S.existsSync(C.join(t,`flow.json`)))return t;let n=C.join(Nr(),e);return S.existsSync(C.join(n,`flow.json`))?n:t}function Pr(e){if(e.archived)return e;let t={...e,archived:!0,archivedAt:new Date().toISOString()};return Q(X(e.runId),t),t}function Fr(e){let t=Pr(e),n=X(e.runId),r=C.join(Nr(),e.runId);if(n!==r)try{S.mkdirSync(Nr(),{recursive:!0}),S.renameSync(n,r)}catch{}return t}function Ir(e){let t=X(e.runId),n=C.join(Y(),e.runId);if(t!==n)try{S.mkdirSync(Y(),{recursive:!0}),S.renameSync(t,n)}catch{}let r={...e,archived:void 0,archivedAt:void 0};return Q(X(e.runId),r),r}function Lr(e){let t=X(e);return S.existsSync(C.join(t,`flow.json`))?(S.rmSync(t,{recursive:!0,force:!0}),!0):!1}function Rr(e){if(!c(e))return null;let t=C.join(X(e),`flow.json`);if(!S.existsSync(t))return null;try{return JSON.parse(S.readFileSync(t,`utf8`))}catch{return null}}function zr(e){return e.status!==`running`||!e.pid||Zr(e)?e:(Jr(e.runId,`orchestrator died`),Rr(e.runId)??e)}function Z(e){let t=Rr(e);return t?zr(t):null}function Q(e,t){S.writeFileSync(C.join(e,`flow.json`),`${JSON.stringify(t,null,2)}\n`,`utf8`)}function Br(e){let t=[];try{t=S.readdirSync(e)}catch{return[]}let n=[];for(let r of t)try{n.push(zr(JSON.parse(S.readFileSync(C.join(e,r,`flow.json`),`utf8`))))}catch{}return n}const Vr=(e,t)=>String(t.startedAt).localeCompare(String(e.startedAt));function Hr(){let e=[];for(let t of Br(Y()))t.archived?Fr(t):e.push(t);return e.sort(Vr)}function Ur(e){let t=e?.migrate??!0,n=Br(Nr()),r=new Set(n.map(e=>e.runId));for(let e of Br(Y()))e.archived&&!r.has(e.runId)&&n.push(t?Fr(e):e);return n.sort(Vr)}function Wr(){return[...Hr(),...Ur()].sort(Vr)[0]??null}function Gr(e,t=`all`){if(t===0)return[];let n=K(C.join(X(e),`journal.jsonl`)).filter(e=>e.kind===`task`),r=o(x.cwd()),i=new Map(r.map(e=>[e.id,e])),a=e=>e?.name??e?.prompt?.replace(/\s+/g,` `).trim().slice(0,60)??null,s=n.map(e=>{let t=e.taskId?i.get(e.taskId):void 0;return{taskId:e.taskId??null,name:a(t),status:t?.status??e.result?.status??`?`,tokens:e.tokens??null}}),c=new Set(s.map(e=>e.taskId));for(let t of r)t.flowRunId===e&&!c.has(t.id)&&s.push({taskId:t.id,name:a(t),status:t.status,tokens:null});return t===`all`?s:s.slice(-t)}function Kr(e={}){let t;if(e.archived)t=Ur();else{let e=[];t=Hr().filter(t=>t.status===`running`||t.status===`queued`||he(t.endedAt??t.startedAt)<=6e5?!0:(Pr(t),e.push(t.runId),!1)),Kn(x.cwd(),e,{flows:!0})}let n=e.limit===void 0?0:Math.max(0,t.length-e.limit);return{runs:e.limit===void 0?t:t.slice(0,e.limit),clipped:n}}function qr(e,t={},n){let r,i,a;if(n){let e=Z(n);if(!e)throw Error(`No flow run "${n}".`);e.archived&&Ir(e),r=e.name,i=e.script,a=t.args??e.args}else{let n=Gn(e,t.cwd?C.resolve(t.cwd):x.cwd());r=n.name,i=n.path,a=t.args??{}}let o=n??Mr(),s=X(o);S.mkdirSync(s,{recursive:!0});let c={runId:o,name:r,script:i,args:a,status:`running`,startedAt:new Date().toISOString(),concurrency:Math.max(1,t.concurrency??ae.cpus().length),maxTasks:Math.max(1,t.maxTasks??ae.cpus().length*10),taskCount:0,ledger:{}};return Q(s,c),c}function $(e,t,n){Q(e,{...t,endedAt:new Date().toISOString(),pid:void 0,pidStartedAt:void 0,...n})}function Jr(e,t){let n=Rr(e);!n||n.status!==`running`||$(X(e),n,{status:`failed`,error:t})}const Yr=`stop-keep-tasks`;function Xr(e){try{return x.kill(e,0),!0}catch{return!1}}function Zr(t){if(!t.pid||!Xr(t.pid))return!1;let n=e(t.pid),r=Date.parse(t.pidStartedAt??``);return n===null||!Number.isFinite(r)||n<=r+6e4}function Qr(e){let t=o(x.cwd()),n=new Map(t.map(e=>[e.id,e])),r=new Set(t.filter(t=>t.flowRunId===e).map(e=>e.id));for(let t of K(C.join(X(e),`journal.jsonl`)))t.kind===`task`&&t.taskId&&r.add(t.taskId);return[...r].filter(e=>{let t=n.get(e);return!!t&&!u.includes(t.status)})}async function $r(e,t=[]){let n=x.cwd(),r=[];for(let i of new Set([...Qr(e),...t])){let e=p(n,i);if(!(!e||u.includes(e.status)))try{await Yn(n,e),r.push(i)}catch{}}return r}async function ei(e,t={}){let n=e?Z(e):Wr();if(!n)throw new G(`flow-failed`,e?`No flow run "${e}".`:`No flow runs.`,{hint:`Run one: coder flow run <name>`});if(n.status!==`running`)throw new G(`flow-failed`,`Run ${n.runId} is not running.`,{runId:n.runId,hint:`Result: coder flow result ${n.runId}`});let r=X(n.runId);if(!Zr(n))return $(r,n,{status:`failed`,error:`orchestrator died`}),{runId:n.runId,status:`failed`,stoppedTasks:[],keptTasks:Qr(n.runId)};let i=Qr(n.runId),a=C.join(r,Yr);t.keepTasks&&S.writeFileSync(a,``,`utf8`);try{x.kill(n.pid,`SIGINT`);let e=Z(n.runId);for(let t=0;t<25&&e?.status===`running`;t+=1)await new Promise(e=>setTimeout(e,200)),e=Z(n.runId);if(!e||e.status===`running`)throw new G(`flow-failed`,`Run ${n.runId} did not stop within 5s.`,{runId:n.runId,hint:`Check it: coder flow result ${n.runId}`});let t=x.cwd(),r=[],a=[];for(let e of i){let n=p(t,e);n&&(n.status===`cancelled`?r.push(e):u.includes(n.status)||a.push(e))}return{runId:n.runId,status:e.status,stoppedTasks:r,keptTasks:a}}finally{if(t.keepTasks)try{S.unlinkSync(a)}catch{}}}async function*ti(e,t,n={}){let r=C.join(X(e),`events.jsonl`),i=n.tail??`all`,a=0;if(i!==`all`)try{a=Math.max(0,S.readFileSync(r,`utf8`).split(`
|
|
16
|
-
`).length-1-i)}catch{}let o=Ye(r),s=()=>{let e=[];for(let t of o()){if(a>0){--a;continue}try{e.push(JSON.parse(t))}catch{}}return e},c=Z(e);for(;!c||c.status===`running`;){yield*s();let n=c?.pid?!Zr(c):t!==void 0&&!Xr(t);if(c&&(c.pid||t!==void 0)&&n){Jr(e,`orchestrator died`);break}await new Promise(e=>setTimeout(e,400)),c=Z(e)??c}yield*s()}function ni(e,t,n,r){let i={...qr(e,t,r),pid:x.pid,pidStartedAt:new Date().toISOString()},{runId:a}=i,o=X(a);Q(o,i);let s=C.join(o,`journal.jsonl`),c=r?K(s):[],l=new $n(c,s),u={runId:a,runDir:o,cwd:t.cwd?C.resolve(t.cwd):x.cwd(),journal:l,semaphore:new rr(i.concurrency),maxTasks:i.maxTasks,dryRun:t.dryRun??!1,ledger:{},running:new Set,taskCount:0,stopping:!1,hooks:n};return{started:{runId:a,runDir:o,ctx:u,markStopped:()=>{u.stopping=!0,$(o,i,{status:`stopped`,taskCount:u.taskCount,ledger:u.ledger})}},args:i.args,name:i.name,replayable:c.length}}async function ri(e,t,n,r){let{ctx:i,runDir:a,runId:o}=e,s=Z(o);try{let e=await q.run(i,()=>J.run({args:r??{},depth:0},()=>Ar(t,r)));return $(a,s,{status:`completed`,taskCount:i.taskCount,ledger:i.ledger,result:e}),{runId:o,name:n,status:`completed`,result:e,tokens:i.ledger,taskCount:i.taskCount}}catch(e){throw i.stopping||$(a,s,{status:`failed`,taskCount:i.taskCount,ledger:i.ledger,error:e instanceof Error?e.message:String(e)}),new G(`flow-failed`,e instanceof Error?e.message:String(e),{runId:o})}}async function ii(e,t={},n={}){let{started:r}=ni(e,t,n),i=Z(r.runId).script;return n.onStart?.({runId:r.runId,requestStop:r.markStopped,runningIds:()=>[...r.ctx.running]}),ri(r,i,Z(r.runId).name,t.args??{})}async function ai(e,t={},n={}){let{started:r,args:i,name:a,replayable:o}=ni(``,t,n,e),s=Z(e).script;return n.onStart?.({runId:e,requestStop:r.markStopped,runningIds:()=>[...r.ctx.running]}),o&&n.onReplay?.(o),ri(r,s,a,i)}export{Lt as $,j as $t,Un as A,we as At,xn as B,fe as Bt,hr as C,Ye as Ct,Jn as D,qe as Dt,Yn as E,We as Et,Nn as F,Te as Ft,Sn as G,xe as Gt,En as H,A as Ht,Pn as I,pe as It,yn as J,Fe as Jt,vn as K,Ne as Kt,jn as L,ve as Lt,G as M,Ce as Mt,Dn as N,he as Nt,qn as O,Ge as Ot,On as P,De as Pt,L as Q,Re as Qt,Rn as R,ge as Rt,ti as S,ct as St,Xn as T,Je as Tt,Cn as U,_e as Ut,wn as V,me as Vt,bn as W,Ee as Wt,z as X,ye as Xt,B as Y,k as Yt,R as Z,Le as Zt,ai as _,Ft as _t,Lr as a,nn as at,$r as b,lt as bt,br as c,an as ct,Hr as d,W as dt,Ie as en,Rt as et,Sr as f,U as ft,Z as g,It as gt,qr as h,I as ht,tr as i,V as it,Gn as j,Pe as jt,Kn as k,Ke as kt,Wr as l,ln as lt,xr as m,Nt as mt,Fr as n,ke as nn,H as nt,jr as o,rn as ot,Jr as p,mn as pt,_n as q,D as qt,Kr as r,Se as rn,un as rt,Gr as s,pn as st,Yr as t,Oe as tn,sn as tt,Ur as u,cn as ut,X as v,ut as vt,K as w,N as wt,ei as x,at as xt,ii as y,ot as yt,zn as z,be as zt};
|