@wular/coder 0.3.14 → 0.3.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +2 -2
- package/dist/flow/index.js +1 -1
- package/dist/runtime-DtukZ1m8.js +19 -0
- package/dist/sdk.js +1 -1
- package/dist/{upgrade-pCzfMZc6.js → upgrade-cC4ahBbt.js} +2 -2
- package/package.json +1 -1
- package/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/plugins/cursor/.cursor-plugin/plugin.json +1 -1
- package/dist/runtime-9CD0_h4s.js +0 -19
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{B as e,E as t,H as n,I as r,L as i,M as a,N as o,O as s,R as c,V as l,_ as u,b as d,c as f,d as p,f as m,j as h,l as g,m as _,o as v,s as y,u as b}from"./app-server-bHl6RBZ2.js";import{$ as ee,$t as x,A as S,At as C,B as te,Ct as w,D as T,Dt as ne,Et as re,F as E,Ft as ie,Gt as ae,Ht as D,I as oe,Jt as se,Kt as O,L as ce,Lt as le,M as k,N as ue,O as de,Ot as fe,Pt as pe,Qt as me,R as he,S as ge,St as _e,T as ve,Tt as ye,Ut as be,Vt as A,Wt as j,Y as xe,Yt as Se,Zt as Ce,_ as we,a as Te,an as M,b as Ee,cn as De,ct as N,d as Oe,dt as ke,en as P,ft as Ae,g as F,h as je,in as Me,j as Ne,jt as Pe,l as Fe,ln as Ie,n as Le,nn as Re,on as ze,p as Be,pt as Ve,qt as He,r as Ue,rn as I,rt as L,s as We,sn as Ge,st as Ke,t as qe,tn as R,u as Je,v as z,w as Ye,wt as Xe,x as Ze,xt as Qe,y as $e,yt as et,zt as B}from"./runtime-
|
|
2
|
+
import{B as e,E as t,H as n,I as r,L as i,M as a,N as o,O as s,R as c,V as l,_ as u,b as d,c as f,d as p,f as m,j as h,l as g,m as _,o as v,s as y,u as b}from"./app-server-bHl6RBZ2.js";import{$ as ee,$t as x,A as S,At as C,B as te,Ct as w,D as T,Dt as ne,Et as re,F as E,Ft as ie,Gt as ae,Ht as D,I as oe,Jt as se,Kt as O,L as ce,Lt as le,M as k,N as ue,O as de,Ot as fe,Pt as pe,Qt as me,R as he,S as ge,St as _e,T as ve,Tt as ye,Ut as be,Vt as A,Wt as j,Y as xe,Yt as Se,Zt as Ce,_ as we,a as Te,an as M,b as Ee,cn as De,ct as N,d as Oe,dt as ke,en as P,ft as Ae,g as F,h as je,in as Me,j as Ne,jt as Pe,l as Fe,ln as Ie,n as Le,nn as Re,on as ze,p as Be,pt as Ve,qt as He,r as Ue,rn as I,rt as L,s as We,sn as Ge,st as Ke,t as qe,tn as R,u as Je,v as z,w as Ye,wt as Xe,x as Ze,xt as Qe,y as $e,yt as et,zt as B}from"./runtime-DtukZ1m8.js";import{C as tt,E as V,O as nt,a as rt,h as it,k as at,p as ot,r as st,t as ct,v as lt,w as ut,x as dt}from"./upgrade-cC4ahBbt.js";import H from"node:process";import U from"node:fs";import W from"node:path";import{spawn as ft,spawnSync as pt}from"node:child_process";import mt from"node:os";import*as G from"zod/mini";import ht from"node:readline";import{randomUUID as gt}from"node:crypto";const _t=[[`--wait`,`run in the foreground and block until the answer is ready`],[`--agent <codex|claude|custom>`,`engine to use; custom runs your configured custom models (default: first in the chain)`],[`--model <alias|slug>`,`spark/luna/terra/sol (codex) · haiku/sonnet/opus/fable (claude) · a custom model (coder model list)`],[`--effort <low|medium|high>`,`reasoning effort`],[`--permissions <mode>`,`read-only · workspace-write · auto (default: auto)`],[`--resume <task-id>`,`continue that task's thread instead of a fresh run`],[`--json`,`machine-readable JSON output`]],K=[`--cwd <dir>`,`workspace directory (default: current)`],q=[`--json`,`JSON output`],vt=[{sub:`run`,usage:`run "<text>"`,blurb:`run a task (background; --wait blocks)`,alias:`run`},{sub:`list`,usage:`list`,blurb:`list recent tasks (running + just stopped)`,alias:`list`},{sub:`result`,usage:`result [task-id]`,blurb:`status + final answer (--wait blocks)`,alias:`result`},{sub:`watch`,usage:`watch [task-id]`,blurb:`watch a task live (progress log)`,alias:`watch`},{sub:`steer`,usage:`steer <task-id> "<follow-up>"`,blurb:`continue a task's thread`},{sub:`ask`,usage:`ask <task-id> "<question>"`,blurb:`ask about a task without interrupting it`},{sub:`stop`,usage:`stop <task-id>`,blurb:`interrupt a running task`},{sub:`archive`,usage:`archive <task-id>`,blurb:`archive a session (or --all-stopped)`},{sub:`delete`,usage:`delete <task-id>`,blurb:`delete a session (or --all-archived)`},{sub:`approvals`,usage:`approvals [task-id]`,blurb:`pending approvals (all tasks, or one)`},{sub:`approve`,usage:`approve <id>`,blurb:`answer an escalated permission`}],J={"task run":{list:[`task run "<text>"`,`run a coding task (background; --wait blocks)`],usage:`coder task run "<task text>"`,summary:`Dispatch a coding task to the configured engine. Backgrounds by default and
|
|
3
3
|
prints a task id; --wait runs in the foreground and prints the answer.
|
|
4
4
|
Shortcut: \`coder run "<text>"\`.`,flags:[[`--name <name>`,`label the task (shown in list/result)`],[`--system <text>`,`standing instructions prepended to the task (kept out of prompt previews)`],..._t,K],examples:[[`coder run "add a /health endpoint"`,`dispatch in the background, print a task id`],[`coder result <task-id> --wait`,`then block until it finishes and print the answer`],[`coder run --wait "fix the failing test"`,`or block on the run itself`],[`coder task run --model spark --system "tests live in test/, don't touch anything outside of it" "rename foo to bar"`,`pick an engine via its model alias; --system adds standing instructions`]],seeAlso:`task result · task steer · task stop · task watch`},"task list":{list:[`task list [--running|--stopped|--archived]`,`list recent tasks (running + just stopped)`],usage:`coder task list [--running] [--stopped] [--archived [--limit N]]`,summary:`List recent tasks across all workspaces, most recent first: running tasks plus
|
|
5
5
|
ones stopped within the last 10 minutes. Older stopped tasks auto-archive and
|
|
@@ -74,7 +74,7 @@ When finished, provide a concise implementation result summary.
|
|
|
74
74
|
Your turn is one-shot: background processes will not re-invoke you after it ends, so verify synchronously before finishing.${e.system?`\n-------\n${e.system}`:``}
|
|
75
75
|
</system>
|
|
76
76
|
|
|
77
|
-
${e.prompt??``}`}function yn(e,t){let n=0;return()=>{Date.now()-n>=1e4&&(n=Date.now(),c(e,t))}}function bn(e,t,{echo:n}){return r=>{let i=typeof r==`string`?{message:r}:r;u(e,t,i),n&&i.message&&H.stderr.write(`[coder] ${i.message}\n`)}}async function xn(t,n,{echo:a}){let o=i(t),s=r(t,n.id),c=N(t),l=bn(t,n.id,{echo:a}),d=L[n.permissions??`auto`]??L.auto,f=d.approvalPolicy===`never`?void 0:w({workspaceRoot:o,jobDir:s,mode:d.approvalMode,escalationTimeoutMs:c.approvals.escalationTimeoutMs,allowedNetworkHosts:c.approvals.allowedNetworkHosts,onEvent:e=>{u(t,n.id,e),a&&e.message&&H.stderr.write(`[coder] ${e.message}\n`)}}),p=n.model?c.models?.[n.model]:void 0,m=p&&Ke(p)?p:void 0;if(m&&!m.wireApi&&n.model){let e=await nt(m);e&&(m={...m,...e},c.models[n.model]=m,ke(t,n.model,e),u(t,n.id,{kind:`info`,message:`detected wire api for ${n.model}: ${e.wireApi} @ ${m.baseUrl}`}))}if(m?.envKey&&!H.env[m.envKey])throw Error(`Missing environment variable: \`${m.envKey}\`.`);let h=m?await at(m,m.wireApi??`chat`):null,g=Ve(c,n.model,h??void 0);try{let r=await et(t,{prompt:vn(n),model:g?.model??Ae(n.model),modelProvider:g?.modelProvider??null,configOverrides:g?.configOverrides??null,effort:n.effort,sandbox:d.sandbox,approvalPolicy:d.approvalPolicy,approvalsReviewer:d.approvalMode===`auto`?`auto_review`:null,onApprovalRequest:f,onHeartbeat:yn(t,n.id),resumeThreadId:n.resumeThreadId??null,onProgress:r=>{l(r);let i=typeof r==`object`?r.threadId:null,a=typeof r==`object`?r.turnId:null;(i||a)&&e(t,n.id,{status:`running`,...i?{threadId:i}:{},...a?{turnId:a}:{}})}});return e(t,n.id,{status:r.status===0?`completed`:`failed`,threadId:r.threadId,turnId:r.turnId,completedAt:new Date().toISOString()}),Cn(t,n,s,r),r}finally{await h?.close()}}async function Sn(t,n,{echo:i}){let a=r(t,n.id),o=N(t),s=bn(t,n.id,{echo:i}),c=L[n.permissions??`auto`]??L.auto;try{let r=await xe(t,{prompt:vn(n),model:n.model,effort:n.effort,permissions:n.permissions,approvalJobId:c.approvalMode===`auto`?n.id:null,allowedNetworkHosts:o.approvals.allowedNetworkHosts,resumeSessionId:n.resumeThreadId??null,onHeartbeat:yn(t,n.id),onSteerReady:r=>{e(t,n.id,{status:`running`,steerEndpoint:r})},onProgress:r=>{s(r),r.threadId&&e(t,n.id,{status:`running`,threadId:r.threadId})}});return e(t,n.id,{status:r.status===0?`completed`:`failed`,threadId:r.threadId,steerEndpoint:null,completedAt:new Date().toISOString()}),Cn(t,n,a,r),r}finally{e(t,n.id,{steerEndpoint:null})}}function Cn(e,t,n,r){Pe(W.join(n,`result.json`),r);let i={at:new Date().toISOString(),prompt:t.currentPrompt??t.prompt??null,...r};U.appendFileSync(W.join(n,`results.jsonl`),`${JSON.stringify(i)}\n`,`utf8`)}function wn(e){return e.engine===`claude`?Sn:xn}async function Tn(t,n){for(let r=0;r<2;){let i=h(t,n);if(!i||i.status===`failed`||i.status===`cancelled`)return;let a=d(t,n);if(a.length===0){r+=1,await new Promise(e=>setTimeout(e,300));continue}r=0;for(let r of a){let a=e(t,n,{status:`running`,currentPrompt:r,resumeThreadId:i.threadId??null});u(t,n,{message:`Running steered follow-up.`});try{await wn(a)(t,a,{echo:!1})}catch(r){let i=r instanceof Error?r.message:String(r);e(t,n,{status:`failed`,error:i}),u(t,n,{kind:`error`,message:i});return}}}}function En(e,t){if(e instanceof k)switch(e.code){case`chain-exhausted`:R(e.payload),H.exit(3);case`read-only-unavailable`:Dn(e.message,t);break;case`startup-failed`:t.json&&(R({taskId:e.taskId,status:`failed`,detail:e.message}),H.exit(1)),D(`Task ${e.taskId} failed to start.${e.message?`\n${e.message}`:``}`,{hint:`See: coder task result ${e.taskId}`});break;default:D(e.message,e.hint?{hint:e.hint}:{})}throw e}function Dn(e,t){let n=`read-only unavailable on this host: the OS sandbox failed to start (Linux/WSL2 needs bubblewrap + socat). Re-dispatch with --permissions auto (or workspace-write) if writes are acceptable, or install the sandbox deps.`;t.json?R({error:n,code:`read-only-unavailable`,detail:e}):H.stderr.write(`[coder] ${n}\n`),H.exit(1)}async function On(e){H.env.CODER_WORKER&&D(`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.`);let{options:t,positionals:n}=g(e,G.object({...v,agent:b,model:b,effort:b,permissions:b,resume:b,host:b,name:b,system:b,background:y,wait:y,"simulate-approval":y})),r=M(t),i=n.join(` `).trim();i||D(`Missing task text.`,{hint:[`Usage: coder run "<task text>"`,`Help: coder task run --help`]});let a={prompt:i,cwd:r,agent:t.agent,model:t.model,effort:t.effort,permissions:t.permissions,name:t.name,system:t.system,resume:t.resume,wait:t.wait,simulateApproval:t[`simulate-approval`],onFallback:({agent:e,detail:t,next:n})=>H.stderr.write(`[coder] ${e} failed to start (${t}); falling back to ${n}.\n`),onInstallNote:e=>H.stderr.write(`[coder] ${e}\n`)},o;try{o=await oe(a)}catch(e){En(e,t)}if(t.wait)for(;;){let e=o.taskId,n=o.job,s=[` result: coder task result ${e}`,` steer: coder task steer ${e} "<follow-up>"`].join(`
|
|
77
|
+
${e.prompt??``}`}function yn(e,t){let n=0;return()=>{Date.now()-n>=1e4&&(n=Date.now(),c(e,t))}}function bn(e,t,{echo:n}){return r=>{let i=typeof r==`string`?{message:r}:r;u(e,t,i),n&&i.message&&H.stderr.write(`[coder] ${i.message}\n`)}}async function xn(t,n,{echo:a}){let o=i(t),s=r(t,n.id),c=N(t),l=bn(t,n.id,{echo:a}),d=L[n.permissions??`auto`]??L.auto,f=d.approvalPolicy===`never`?void 0:w({workspaceRoot:o,jobDir:s,mode:d.approvalMode,escalationTimeoutMs:c.approvals.escalationTimeoutMs,allowedNetworkHosts:c.approvals.allowedNetworkHosts,onEvent:e=>{u(t,n.id,e),a&&e.message&&H.stderr.write(`[coder] ${e.message}\n`)}}),p=n.model?c.models?.[n.model]:void 0,m=p&&Ke(p)?p:void 0;if(m&&!m.wireApi&&n.model){let e=await nt(m);e&&(m={...m,...e},c.models[n.model]=m,ke(t,n.model,e),u(t,n.id,{kind:`info`,message:`detected wire api for ${n.model}: ${e.wireApi} @ ${m.baseUrl}`}))}if(m?.envKey&&!H.env[m.envKey])throw Error(`Missing environment variable: \`${m.envKey}\`.`);let h=m?await at(m,m.wireApi??`chat`):null,g=Ve(c,n.model,h??void 0);try{let r=await et(t,{prompt:vn(n),model:g?.model??Ae(n.model),modelProvider:g?.modelProvider??null,configOverrides:g?.configOverrides??null,effort:n.effort,sandbox:d.sandbox,approvalPolicy:d.approvalPolicy,approvalsReviewer:d.approvalMode===`auto`?`auto_review`:null,onApprovalRequest:f,onHeartbeat:yn(t,n.id),resumeThreadId:n.resumeThreadId??null,onControlReady:(r,i,a)=>{e(t,n.id,{status:`running`,steerEndpoint:r,threadId:i,turnId:a})},onProgress:r=>{l(r);let i=typeof r==`object`?r.threadId:null,a=typeof r==`object`?r.turnId:null;(i||a)&&e(t,n.id,{status:`running`,...i?{threadId:i}:{},...a?{turnId:a}:{}})}});return e(t,n.id,{status:r.status===0?`completed`:`failed`,threadId:r.threadId,turnId:r.turnId,steerEndpoint:null,completedAt:new Date().toISOString()}),Cn(t,n,s,r),r}finally{e(t,n.id,{steerEndpoint:null}),await h?.close()}}async function Sn(t,n,{echo:i}){let a=r(t,n.id),o=N(t),s=bn(t,n.id,{echo:i}),c=L[n.permissions??`auto`]??L.auto;try{let r=await xe(t,{prompt:vn(n),model:n.model,effort:n.effort,permissions:n.permissions,approvalJobId:c.approvalMode===`auto`?n.id:null,allowedNetworkHosts:o.approvals.allowedNetworkHosts,resumeSessionId:n.resumeThreadId??null,onHeartbeat:yn(t,n.id),onSteerReady:r=>{e(t,n.id,{status:`running`,steerEndpoint:r})},onProgress:r=>{s(r),r.threadId&&e(t,n.id,{status:`running`,threadId:r.threadId})}});return e(t,n.id,{status:r.status===0?`completed`:`failed`,threadId:r.threadId,steerEndpoint:null,completedAt:new Date().toISOString()}),Cn(t,n,a,r),r}finally{e(t,n.id,{steerEndpoint:null})}}function Cn(e,t,n,r){Pe(W.join(n,`result.json`),r);let i={at:new Date().toISOString(),prompt:t.currentPrompt??t.prompt??null,...r};U.appendFileSync(W.join(n,`results.jsonl`),`${JSON.stringify(i)}\n`,`utf8`)}function wn(e){return e.engine===`claude`?Sn:xn}async function Tn(t,n){for(let r=0;r<2;){let i=h(t,n);if(!i||i.status===`failed`||i.status===`cancelled`)return;let a=d(t,n);if(a.length===0){r+=1,await new Promise(e=>setTimeout(e,300));continue}r=0;for(let r of a){let a=e(t,n,{status:`running`,currentPrompt:r,resumeThreadId:i.threadId??null});u(t,n,{message:`Running steered follow-up.`});try{await wn(a)(t,a,{echo:!1})}catch(r){let i=r instanceof Error?r.message:String(r);e(t,n,{status:`failed`,error:i}),u(t,n,{kind:`error`,message:i});return}}}}function En(e,t){if(e instanceof k)switch(e.code){case`chain-exhausted`:R(e.payload),H.exit(3);case`read-only-unavailable`:Dn(e.message,t);break;case`startup-failed`:t.json&&(R({taskId:e.taskId,status:`failed`,detail:e.message}),H.exit(1)),D(`Task ${e.taskId} failed to start.${e.message?`\n${e.message}`:``}`,{hint:`See: coder task result ${e.taskId}`});break;default:D(e.message,e.hint?{hint:e.hint}:{})}throw e}function Dn(e,t){let n=`read-only unavailable on this host: the OS sandbox failed to start (Linux/WSL2 needs bubblewrap + socat). Re-dispatch with --permissions auto (or workspace-write) if writes are acceptable, or install the sandbox deps.`;t.json?R({error:n,code:`read-only-unavailable`,detail:e}):H.stderr.write(`[coder] ${n}\n`),H.exit(1)}async function On(e){H.env.CODER_WORKER&&D(`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.`);let{options:t,positionals:n}=g(e,G.object({...v,agent:b,model:b,effort:b,permissions:b,resume:b,host:b,name:b,system:b,background:y,wait:y,"simulate-approval":y})),r=M(t),i=n.join(` `).trim();i||D(`Missing task text.`,{hint:[`Usage: coder run "<task text>"`,`Help: coder task run --help`]});let a={prompt:i,cwd:r,agent:t.agent,model:t.model,effort:t.effort,permissions:t.permissions,name:t.name,system:t.system,resume:t.resume,wait:t.wait,simulateApproval:t[`simulate-approval`],onFallback:({agent:e,detail:t,next:n})=>H.stderr.write(`[coder] ${e} failed to start (${t}); falling back to ${n}.\n`),onInstallNote:e=>H.stderr.write(`[coder] ${e}\n`)},o;try{o=await oe(a)}catch(e){En(e,t)}if(t.wait)for(;;){let e=o.taskId,n=o.job,s=[` result: coder task result ${e}`,` steer: coder task steer ${e} "<follow-up>"`].join(`
|
|
78
78
|
`);t.json||(H.stderr.write(`${x.dim(`[coder]`)} task ${x.cyan(e)} started (${n.status}); waiting for it to finish — Ctrl-C to detach (it keeps running).\n`),H.stderr.write(`${x.dim(s)}\n`));let c=()=>{H.stderr.write(`\n${x.dim(`[coder] detached — task still running: coder task result ${e}`)}\n`),H.exit(130)};H.on(`SIGINT`,c);let l;try{l=await te(r,e)}catch(n){throw H.off(`SIGINT`,c),n instanceof k&&n.code===`approval-pending`&&ze(e,n.approval,t.json),n}H.off(`SIGINT`,c);let u=l.job,d=l.result,f=d?.error?.message??``;if(u.status===`failed`&&ce(u.permissions??`auto`,f)&&Dn(f,t),u.status===`failed`&&ue.test(f)){let e=N(r).chain,n=e[e.indexOf(o.agent)+1];n||(R(E(o.agent,f,u.permissions??`auto`,t.system,i)),H.exit(3)),H.stderr.write(`[coder] ${o.agent} failed to start (${f}); falling back to ${n}.\n`);try{o=await oe({...a,agent:n,model:void 0,effort:void 0,name:void 0,resume:void 0,simulateApproval:void 0})}catch(e){En(e,t)}continue}if(t.json)R({taskId:e,status:u.status,finalMessage:d?.finalMessage,...f?{error:f}:{},tokens:d?.tokens??null,model:d?.model??u.model??null});else{H.stdout.write(`\n${d?.finalMessage||(f?`${x.red(`error:`)} ${f}`:`(no final message)`)}\n\n`);let t=d?.tokens?` tokens=${Se(d.tokens,d.model??u.model)}`:``;H.stderr.write(`${x.dim(`[coder] task=${e} status=${u.status}${t}`)}\n`)}H.exit(u.status===`completed`?0:1)}let s=o.taskId,c=o.job,l=[` result: coder task result ${s}`,` steer: coder task steer ${s} "<follow-up>"`].join(`
|
|
79
79
|
`);if(t.json){R({taskId:s,status:c.status,startupCheck:o.startupCheck,commands:{result:`coder task result ${s}`,steer:`coder task steer ${s} "<follow-up>"`,stop:`coder task stop ${s}`,watch:`coder task watch ${s}`}});return}H.stdout.write(`${x.dim(`[coder]`)} task ${x.cyan(s)} started in the background (${c.status}).\n`),H.stdout.write(`${x.dim(l)}\n`)}async function kn(t){let{options:n,positionals:i}=g(t,G.object({cwd:b})),a=M(n),o=i[0],s=h(a,o);s||D(`Worker: task ${o} not found.`),e(a,o,{status:`running`,pid:H.pid});try{if(s.simulateApproval){let t=await fe(r(a,o),{onEvent:e=>u(a,o,e)});if(u(a,o,{message:`simulated approval: ${t}`}),t===`decline`){e(a,o,{status:`cancelled`,completedAt:new Date().toISOString(),error:`simulated approval denied`});return}}await wn(s)(a,s,{echo:!1}),await Tn(a,o)}catch(t){let n=t instanceof Error?t.message:String(t);e(a,o,{status:`failed`,error:n}),u(a,o,{kind:`error`,message:n}),H.exit(1)}}async function An(e){let{options:n,positionals:i}=g(e,G.object({...v,tail:p,wait:y,turns:y}));I(i,1,`task result`);let s=M(n),c=Me(s,i[0]);if(n.wait){l.includes(c.status)&&H.stderr.write(`${x.dim(`[coder] waiting for task ${c.id} to finish...`)}\n`);let e=await Qe(s,c);c=e.job,e.reason===`approval`&&ze(c.id,e.approval,n.json)}let{steps:u,result:d}=he(s,c.id,{tail:n.tail}),f=o(s,c.id),m=ne(r(s,c.id)).filter(e=>!e.response),h=l.includes(c.status),_=h&&m.length?`waiting-approval`:c.status,b=h?a(s,c.id,1)[0]:void 0,ee=h?t(s,c):c.updatedAt,S=B(ee),C=h&&m.length===0&&S>6e5,te=()=>{n.wait&&H.exit(c.status===`completed`?0:1)};if(n.json)return R({taskId:c.id,name:c.name??null,prompt:c.prompt??null,system:c.system??null,status:_,agent:c.agent,model:c.model??null,effort:c.effort??null,permissions:c.permissions??null,cwd:c.cwd??null,createdAt:c.createdAt??null,completedAt:c.completedAt??null,...h?{idleMs:S,lastActivityAt:ee??null,stalled:C}:{},pendingApprovals:m.map(e=>({id:e.id,summary:e.summary})),...u.length?{steps:u}:{},turnCount:f.length,...n.turns?{turns:f}:{},result:d}),te();let w=x,T=c.createdAt?B(c.createdAt):null,re=!h&&c.completedAt?B(c.completedAt):null,E=c.createdAt&&c.completedAt?Date.parse(c.completedAt)-Date.parse(c.createdAt):null,ie=h?T===null?``:`started ${j(T)} ago`:[re===null?``:`finished ${j(re)} ago`,E!==null&&E>=0?`took ${j(E)}`:``].filter(Boolean).join(` · `),D=[`${w.dim(`task`)} ${w.cyan(c.id)}`,...c.name?[`${w.dim(`name`)} ${c.name}`]:[],`${w.dim(`status`)} ${P(_)}${ie?` ${w.dim(`(${ie})`)}`:``}`,`${w.dim(`agent`)} ${ae(c)}`,...Ce(c,w),...d?.tokens?[`${w.dim(`tokens`)} ${Se(d.tokens,d.model??c.model)}`]:[]];if(c.prompt&&D.push(``,...Re(c.prompt,w)),m.length){D.push(``,w.dim(`pending approvals:`));for(let e of m)D.push(` ${w.cyan(e.id)} ${e.summary}`),D.push(` ${w.bold(`coder approve ${c.id} ${e.id}`)} ${w.dim(`(--deny to reject)`)}`)}if(u.length){D.push(``,w.dim(`steps:`));for(let e of u){let t=e.message??e.kind;t&&D.push(` ${w.dim(Ie(t))}`)}}if(D.push(``),n.turns&&f.length?f.forEach((e,t)=>{t&&D.push(``),D.push(w.dim(`— turn ${t+1} of ${f.length}: ${Ie(String(e.prompt??``))}`)),D.push(String(e.finalMessage||w.dim(`(no final message)`)))}):d?(D.push(be({...d,error:d.error??void 0},c.error,`(no final message)`,w)),f.length>1&&D.push(w.dim(`(turn ${f.length} of ${f.length} — all answers: coder task result ${c.id} --turns)`))):h?D.push(w.dim(C?`Result pending, but no progress for ${j(S)} — the task may be stalled.${b?` Last: ${Ie(b.message??b.kind??``)}`:``}`:`Result pending — task is still running.`)):D.push(w.dim(`(no result)`)),h&&!n.wait){let e=[`Wait for it: coder task result ${c.id} --wait`,`Follow live: coder task watch ${c.id}`];C&&e.push(`Check the transcript: coder task result ${c.id} --tail all`),D.push(``,O(e,w))}return H.stdout.write(`${D.join(`
|
|
80
80
|
`)}\n`),d?.touchedFiles?.length&&H.stderr.write(`[coder] touched files: ${d.touchedFiles.join(`, `)}\n`),te()}function jn(e){return s(e).filter(e=>l.includes(e.status)).flatMap(t=>ne(r(e,t.id)).filter(e=>!e.response).map(e=>({taskId:t.id,id:e.id,summary:String(e.summary??``),createdAt:e.createdAt?String(e.createdAt):void 0})))}async function Mn(e){let{options:t,positionals:n}=g(e,G.object(v));I(n,1,`task approvals`);let i=M(t),a=x;if(n[0]){let e=Me(i,n[0]),o=ne(r(i,e.id)).map(e=>({id:e.id,summary:e.summary,createdAt:e.createdAt,answered:e.response?.decision??null}));if(t.json){R(o);return}if(!o.length){H.stdout.write(`${a.dim(`No approvals for task ${e.id}.`)}\n`);return}for(let e of o){let t=e.answered??`pending`;H.stdout.write(`${a.cyan(e.id)} ${t.padEnd(8)} ${a.dim(String(e.summary??``))}\n`)}let s=o.filter(e=>!e.answered);if(s.length){let e=s.length===1?s[0].id:`<approval-id>`;H.stdout.write(`\n${O([`Answer: coder approve ${e} [--deny]`],a)}\n`)}return}let o=jn(i);if(t.json){R(o);return}if(!o.length){H.stdout.write(`${a.dim(`No pending approvals.`)}\n`);return}let s={id:Math.max(11,...o.map(e=>e.id.length)),task:Math.max(7,...o.map(e=>e.taskId.length))};H.stdout.write(a.bold(a.light(`${`approval-id`.padEnd(s.id)} ${`task-id`.padEnd(s.task)} age summary\n`)));for(let e of o){let t=e.createdAt?j(B(e.createdAt)):`-`;H.stdout.write(`${a.cyan(e.id.padEnd(s.id))} ${a.cyan(e.taskId.padEnd(s.task))} ${t.padEnd(5)} ${a.light(e.summary)}\n`)}let c=o.length===1?o[0].id:`<approval-id>`;H.stdout.write(`\n${O([`Answer: coder approve ${c} [--deny]`],a)}\n`)}async function Nn(e){let{options:t,positionals:n}=g(e,G.object({...v,deny:y}));I(n,2,`task approve`);let i=M(t),[a,o]=n;a&&!o&&a.startsWith(`apr-`)&&(o=a,a=jn(i).find(e=>e.id===o)?.taskId,a||D(`No pending approval "${o}".`,{hint:`List them: coder approvals`})),(!a||!o)&&D(`Missing approval id.`,{hint:[`List them: coder approvals`,`Usage: coder approve [task-id] <approval-id> [--deny]`]});let s=Me(i,a),c=t.deny?`decline`:`accept`;if(_e(r(i,s.id),o,c),t.json){R({taskId:s.id,approvalId:o,decision:c});return}H.stdout.write(`${t.deny?`Denied`:`Approved`} ${x.cyan(o)} on task ${x.cyan(s.id)}.\n`)}function Pn(e){return W.join(e,`sidecar.json`)}function Fn(e){return C(Pn(e))??{sessionId:null,declineStreak:0}}async function In(e){let t=W.join(e,`sidecar.lock`),n=Date.now()+12e4;for(;;)try{return U.mkdirSync(t),()=>{try{U.rmdirSync(t)}catch{}}}catch{try{if(Date.now()-U.statSync(t).mtimeMs>9e4){U.rmdirSync(t);continue}}catch{continue}if(Date.now()>n)throw Error(`sidecar lock wait timed out`);await new Promise(e=>setTimeout(e,250))}}function Ln(e,t,n,r){return[`-p`,r,`--output-format`,`json`,`--model`,`sonnet`,`--effort`,`low`,n?`--resume`:`--session-id`,t,...ee,`--add-dir`,e]}function Rn(e,t,n,r,i){let a=Ln(t,n,r,i);return new Promise((t,n)=>{let r=ft(`claude`,a,{cwd:e,stdio:[`ignore`,`pipe`,`pipe`]}),i=``,o=``,s=setTimeout(()=>{r.kill(`SIGKILL`),n(Error(`sidecar call timed out`))},12e4);r.stdout.on(`data`,e=>i+=e),r.stderr.on(`data`,e=>o+=e),r.on(`error`,e=>{clearTimeout(s),n(e)}),r.on(`close`,e=>{if(clearTimeout(s),e!==0){n(Error(`sidecar claude exited ${e}: ${o.trim().slice(0,200)}`));return}try{let e=JSON.parse(i);if(e.is_error){n(Error(`sidecar turn errored: ${String(e.result??``).slice(0,200)}`));return}t(String(e.result??``))}catch{n(Error(`sidecar returned unparseable output`))}})})}function zn(e){let t=e.match(/\{[^{}]*"decision"[^{}]*\}/);if(!t)return null;try{let e=JSON.parse(t[0]);if(e.decision===`accept`||e.decision===`decline`||e.decision===`escalate`)return{decision:e.decision,reason:String(e.reason??``)}}catch{}return null}async function Bn(e,t,n){let r=null;try{r=await In(t);let i=Fn(t);if(i.declineStreak>=3)return{decision:`escalate`,reason:`sidecar decline streak; needs human review`};if(!i.sessionId){let r=gt();await Rn(e,t,r,!1,`You are the approval reviewer for a "coder" background coding task. The task runs inside an OS sandbox; you review only actions that escape it.
|
package/dist/flow/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as e,C as t,M as n,S as r,_ as i,a,c as o,d as s,f as c,g as l,i as u,m as d,n as f,o as p,r as m,s as h,x as g,y as _}from"../runtime-
|
|
1
|
+
import{A as e,C as t,M as n,S as r,_ as i,a,c as o,d as s,f as c,g as l,i as u,m as d,n as f,o as p,r as m,s as h,x as g,y as _}from"../runtime-DtukZ1m8.js";const v=new Proxy({},{get(e,t){return u()?.[t]},has(e,t){let n=u();return n!=null&&t in Object(n)},ownKeys(){let e=u();return e?Reflect.ownKeys(Object(e)):[]},getOwnPropertyDescriptor(e,t){let n=u();if(n!=null&&t in Object(n))return{enumerable:!0,configurable:!0,value:n[t]}}});function y(e){let t=l(e);if(!t)throw new n(`flow-failed`,`No flow run "${e}".`,{hint:`Recent runs: coder flow list`});if(t.status===`running`||t.status===`queued`)throw new n(`flow-failed`,`Run ${t.runId} is still running.`,{runId:t.runId,hint:`Stop it first: coder flow stop ${t.runId}`});return t}const b={run(e,t={}){return _(e,t)},list(e={}){return m(e).runs},discover(t){return e(t??process.cwd())},result(e,t={}){let n=e?l(e):s()[0]??null;return n?{...n,steps:h(n.runId,t.tail)}:null},stream(e,t={}){let n=e??s()[0]?.runId;if(!n)throw Error(`No flow runs to stream.`);return r(n,void 0,{tail:t.tail})},stop(e,t={}){return g(e,t)},resume(e,t={}){let n=e??s()[0]?.runId;if(!n)throw Error(`No flow runs to resume.`);return i(n,t)},archive(e){return f(y(e)),{runId:e,archived:!0}},delete(e){return y(e),{runId:e,deleted:a(e)}}};export{n as CoderError,v as args,b as default,b as flowSdk,p as flow,o as gate,c as log,d as pipeline,t as task};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import{A as e,B as t,C as n,F as r,G as i,H as a,I as o,L as s,M as c,N as l,O as u,P as d,T as f,W as p,f as m,i as h,j as g,l as _,m as v,o as y,r as ee,s as te,u as ne,v as re,w as ie,y as ae}from"./app-server-bHl6RBZ2.js";import{createRequire as oe}from"node:module";import b from"node:process";import x from"node:fs";import S from"node:path";import{spawn as C,spawnSync as w}from"node:child_process";import T from"node:os";import{fileURLToPath as se,pathToFileURL as ce}from"node:url";import*as E from"zod/mini";import le from"node:net";import ue,{randomUUID as D}from"node:crypto";import{AsyncLocalStorage as de}from"node:async_hooks";function fe(e){let t=b.env.FORCE_COLOR,n=t!=null&&t!==``&&t!==`0`||t!==`0`&&e.isTTY&&!b.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),yellow:e=>r(`33`,e)}}const O=fe(b.stdout),k=fe(b.stderr);function pe(e,t=k){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 A(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];b.stderr.write(`${k.red(e)}\n`),i.length&&b.stderr.write(`\n${pe(i,k)}\n`),b.exit(n)}function j(e){b.stdout.write(`${JSON.stringify(e,null,2)}\n`)}function me(e,t=O){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 M(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 ${M(e.input)}`,...e.cachedInput?[`cached ${M(e.cachedInput)}`]:[],`out ${M(e.output)}`];return`${M(e.total)} (${n.join(` · `)}) on ${t||`default model`}`}function ve(e,t,n,r=O){let i=e?.error?.message??t;return e?.finalMessage||(i?`${r.red(`error:`)} ${i}`:n)}function ye(e,t=O,{truncate:n=!0}={}){let r=e=>e.split(`
|
|
5
|
+
`).map(e=>` ${t.dim(e)}`);return!n||e.length<=1e3?[t.dim(`prompt:`),...r(e)]:[t.dim(`prompt:`),...r(e.slice(0,500).trimEnd()),t.light(` … <${e.length-1e3} chars trimmed> …`),...r(e.slice(-500).trimStart())]}function be(e){return[e.agent??`-`,e.model,e.model?e.effort:null].filter(Boolean).join(`/`)}function xe(e,t=O){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=O}={}){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=6e5,we=12e4;function Te(e,t){return e.length>t?`${e.slice(0,t-1)}…`:e.padEnd(t)}function Ee(e){return` ${O.bold(O.green(`✔`))} ${e}`}function De(e){return` ${O.bold(O.red(`✘`))} ${e}`}function Oe(e=b.stdout){try{return e.getWindowSize?.()[0]??e.columns}catch{return e.columns}}function ke(e=b.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${O.dim(`…`)}`;r+=s,n+=c,i+=s.length}return r}function Ne(){let e=b.stdin;if(!e.isTTY||!b.stdout.isTTY)return()=>{};e.setRawMode(!0),e.resume();let t=e=>{e.includes(3)&&b.kill(b.pid,`SIGINT`),e.includes(26)&&b.kill(b.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=b.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`?O.green(n):e===`waiting-approval`?O.yellow(n):e===`failed`||e===`cancelled`?O.red(n):e===`completed`?O.blue(n):O.dim(n)}function Ie(e,t,n=!1){n?j({taskId:e,status:`awaiting-approval`,approval:t}):(b.stdout.write(`Approval needed for task ${e}: ${t.summary}\n`),b.stderr.write(`\n${pe([`Approve: coder approve ${e} ${t.id}`,`Deny: coder approve ${e} ${t.id} --deny`,`Then: coder task result ${e} --wait`],k)}\n`)),b.exit(4)}function Le(e,t,n){if(e.length>t){let r=e.slice(t);A(`Unexpected argument${r.length>1?`s`:``}: ${r.join(` `)}`,{hint:`Help: coder ${n} --help`})}}function N(e){return e.cwd?S.resolve(String(e.cwd)):b.cwd()}function Re(e,t){let r=n(e,t);return r||A(t?`No task found for "${t}".`:`No tasks found for this workspace.`,{hint:t?[`List tasks: coder task list`,`Start one: coder run "<text>"`]:[`Start one: coder run "<text>"`]}),r}const P=`@wular/coder`,ze=`https://registry.npmjs.org/${P}/latest`;function Be(){return S.join(r(),`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(x.readFileSync(Be(),`utf8`))}catch{return null}}function Ue(e){try{x.mkdirSync(r(),{recursive:!0}),x.writeFileSync(Be(),JSON.stringify(e))}catch{}}function We(){try{x.rmSync(Be(),{force:!0})}catch{}}function Ge(e,t){if(b.env.CODER_NO_UPDATE_CHECK||b.env.CI)return;let n=He();if(n?.latest&&Ve(n.latest,e)>0&&b.stderr.write(k.dim(`coder ${e} -> `)+k.bold(n.latest)+k.dim(` available. run: coder upgrade
|
|
6
|
+
|
|
7
|
+
`)),!n?.checkedAt||Date.now()-n.checkedAt>864e5)try{C(b.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=x.realpathSync(e)}catch{}let n=t.replace(/\\/g,`/`);return/\/\.bun\//.test(n)?{pm:`bun`,command:[`bun`,`add`,`-g`,`${P}@latest`]}:/\/\.pnpm\//.test(n)||/\/pnpm(-global)?\//i.test(n)||/\/Library\/pnpm\//.test(n)?{pm:`pnpm`,command:[`pnpm`,`add`,`-g`,`${P}@latest`]}:/\/\.config\/yarn\/global\//.test(n)||/\/yarn\/global\//.test(n)||/\/Yarn\/Data\/global\//.test(n)?{pm:`yarn`,command:[`yarn`,`global`,`add`,`${P}@latest`]}:{pm:`npm`,command:[`npm`,`install`,`-g`,`${P}@latest`]}}function F(e){try{return JSON.parse(x.readFileSync(e,`utf8`))}catch{return null}}function Je(e,t){let n=`${e}.tmp`;x.writeFileSync(n,`${JSON.stringify(t,null,2)}\n`,`utf8`),x.renameSync(n,e)}function Ye(e){let t=0,n=``;return()=>{let r;try{r=x.statSync(e).size}catch{return[]}if(r<t&&(t=0,n=``),r===t)return[];let i;try{i=x.openSync(e,`r`)}catch{return[]}try{let e=Buffer.alloc(r-t),a=x.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{x.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=S.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=S.resolve(t,n),r=S.relative(t,e);if(r.startsWith(`..`)||S.isAbsolute(r))return{decision:`escalate`,reason:`path outside workspace: ${n}`};if(r===`.git`||r.startsWith(`.git${S.sep}`))return{decision:`decline`,reason:`direct .git modification: ${n}`}}return{decision:`accept`,reason:`all paths inside workspace`}}function it(e){return S.join(e,`approvals`)}function at(e){let t=it(e);return x.existsSync(t)?x.readdirSync(t).filter(e=>e.endsWith(`.request.json`)).flatMap(e=>{let n=e.replace(/\.request\.json$/,``),r=F(S.join(t,e));if(!r)return[];let i=F(S.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=S.join(r,`${t}.request.json`);if(!x.existsSync(i))throw Error(`No pending approval "${t}" for this job.`);x.writeFileSync(S.join(r,`${t}.response.json`),`${JSON.stringify({decision:n,answeredAt:new Date().toISOString()},null,2)}\n`,`utf8`)}async function I(e,t,{timeoutMs:n,onEvent:r}){let i=it(e);x.mkdirSync(i,{recursive:!0});let a=`apr-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`;x.writeFileSync(S.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 ${S.basename(e)} ${a} [--deny]`});let o=S.join(i,`${a}.response.json`),s=Date.now()+n;for(;Date.now()<s;){if(x.existsSync(o))try{let e=JSON.parse(x.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 st(e,t={}){return I(e,{method:`simulate`,summary:`simulated approval probe (--simulate-approval)`},{timeoutMs:t.timeoutMs??12e4,onEvent:t.onEvent??null})}function ct({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 I(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 I(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 lt(e,t,n=400){let r=t;for(;;){if(a.includes(r.status))return{job:r,reason:`terminal`};let t=at(o(e,r.id)).filter(e=>!e.response);if(t[0])return{job:r,reason:`approval`,approval:{id:t[0].id,summary:String(t[0].summary??``)}};await new Promise(e=>setTimeout(e,n)),r=d(e,g(e,r.id)??r)}}function ut(e,t){let n=`${e}.${process.pid}.${D()}.tmp`;x.writeFileSync(n,`${JSON.stringify(t)}\n`,`utf8`),x.renameSync(n,e)}function dt(e){let t=e instanceof Error?e.message:String(e);return/no active turn|active turn.*(?:ended|completed)|turn.*(?:already )?(?:ended|completed)|turn.*not active/i.test(t)}function L(e,t,n){return Object.assign(Error(e),{retryable:t,...n===void 0?{}:{rpcCode:n}})}function ft(e,t,n,r){if(!e||e.id!==t||e.method!==`turn/steer`&&e.method!==`turn/interrupt`)throw L(`Invalid Codex control request.`,!1);let i=e.params;if(!i||typeof i!=`object`||i.threadId!==n)throw L(`Codex control request does not match its owning thread.`,!1);if(e.method===`turn/interrupt`){if(i.turnId!==r)throw L(`Codex turn/interrupt request does not match its owning active turn.`,!1);return{method:e.method,params:i}}if(i.expectedTurnId!==r)throw L(`Codex turn/steer request does not match its owning active turn.`,!1);let a=i.input;if(!Array.isArray(a)||a.length!==1||a[0]?.type!==`text`||typeof a[0]?.text!=`string`||!a[0].text.trim())throw L(`Invalid Codex turn/steer input schema.`,!1);return{method:e.method,params:i}}async function pt(e,{threadId:t,turnId:n}){let r=x.mkdtempSync(S.join(T.tmpdir(),`coder-codex-control-`)),i=`file:${r}`,a=new Set,o=!1,s=!1,c=(i=!1)=>{if(!(o&&!i||s)){s=!0;try{for(let i of x.readdirSync(r).filter(e=>e.endsWith(`.request.json`))){let s=S.join(r,i),c=`${s}.${process.pid}.processing`;try{x.renameSync(s,c)}catch{continue}let l=i.slice(0,-13),u=S.join(r,`${l}.response.json`),d=(async()=>{let r;try{if(o)throw L(`Codex owner endpoint is shutting down.`,!0);let i=ft(JSON.parse(x.readFileSync(c,`utf8`)),l,t,n);try{let t=await e.request(i.method,i.params);r={id:l,result:t}}catch(e){let t=e;r={id:l,error:{message:e instanceof Error?e.message:String(e),retryable:dt(e),...t.rpcCode===void 0?{}:{rpcCode:t.rpcCode}}}}}catch(e){let t=e;r={id:l,error:{message:t.message,retryable:t.retryable===!0,...t.rpcCode===void 0?{}:{rpcCode:t.rpcCode}}}}try{ut(u,r)}finally{try{x.unlinkSync(c)}catch{}}})();a.add(d),d.then(()=>a.delete(d),()=>a.delete(d))}}catch{}finally{s=!1}}},l=setInterval(c,10);return l.unref?.(),{endpoint:i,async close(){o||(o=!0,clearInterval(l),c(!0),await Promise.allSettled([...a]),await new Promise(e=>setTimeout(e,50)),x.rmSync(r,{recursive:!0,force:!0}))}}}function mt(e){if(e?.startsWith(`file:`)&&e.length>5){let t=S.resolve(e.slice(5)),n=S.resolve(T.tmpdir());S.dirname(t)===n&&S.basename(t).startsWith(`coder-codex-control-`)&&x.rmSync(t,{recursive:!0,force:!0})}}async function ht(e,t,n,r=3e3){if(!e)return{ok:!1,retryable:!0,detail:`Codex owner endpoint is not ready.`};if(!e.startsWith(`file:`)||e.length===5)return{ok:!1,retryable:!1,detail:`Unsupported Codex control endpoint: ${e}`};let i=e.slice(5);if(!x.existsSync(i))return{ok:!1,retryable:!0,detail:`Codex owner endpoint is no longer available.`};let a=D(),o=S.join(i,`${a}.request.json`),s=S.join(i,`${a}.response.json`);try{ut(o,{id:a,method:t,params:n})}catch(e){return{ok:!1,retryable:e.code===`ENOENT`,detail:e instanceof Error?e.message:String(e)}}let c=Date.now();for(;Date.now()-c<r;){try{let e=JSON.parse(x.readFileSync(s,`utf8`));try{x.unlinkSync(s)}catch{}return e?.id===a?e?.error?{ok:!1,retryable:e.error.retryable===!0,detail:String(e.error.message??`Malformed Codex owner error response.`)}:`result`in e?{ok:!0,retryable:!1,result:e.result,detail:`Codex owner accepted control.`}:{ok:!1,retryable:!1,detail:`Malformed Codex owner response.`}:{ok:!1,retryable:!1,detail:`Malformed Codex owner response id.`}}catch(e){if(e.code!==`ENOENT`)return{ok:!1,retryable:!1,detail:`Invalid Codex owner response: ${e instanceof Error?e.message:String(e)}`};if(!x.existsSync(i))return{ok:!1,retryable:!1,detail:`Codex owner endpoint closed after control publication; acceptance is unknown.`}}await new Promise(e=>setTimeout(e,10))}return{ok:!1,retryable:!1,detail:`Timed out waiting for Codex owner acknowledgement.`}}const gt=`Coder Task`;function _t(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 vt(e,t=72){let n=String(e??``).trim().replace(/\s+/g,` `);return n?n.length<=t?n:`${n.slice(0,t-3)}...`:``}function yt(e){let t=vt(e,56);return t?`${gt}: ${t}`:gt}function bt(e){return e?.params?.threadId??null}function xt(e){return e?.params?.turnId?e.params.turnId:e?.params?.turn?.id?e.params.turn.id:null}function St(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 Ct(e,t){let n=[];for(let r of e.matchAll(/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/gm)){let e=t===`delete`,i=Number(e?r[1]:r[3]),a=Number((e?r[2]:r[4])??1);!Number.isFinite(i)||!Number.isFinite(a)||n.push(a<=1?`L${i}`:`L${i}-L${i+a-1}`)}return n}function wt(e){try{let t=x.readFileSync(e,`utf8`),n=t?t.split(/\r\n|\r|\n/).length-+!!t.endsWith(`
|
|
10
|
+
`):0;return n>0?[n===1?`L1`:`L1-L${n}`]:[]}catch{return[]}}function Tt(e,t){let n=typeof e.kind==`string`?e.kind:e.kind?.type??`change`,r=e.path||`(unknown path)`,i=Ct(e.diff??``,n),a=i.length||n!==`add`||!t?i:wt(r);return`${n} ${r}${typeof e.kind==`object`&&e.kind?.move_path?` -> ${e.kind.move_path}`:``}${a.length?` ${a.join(`, `)}`:``}`}function Et(e,t=!1){return(e.changes??[]).map(e=>Tt(e,t)).join(`; `)}function Dt(e){let t=e.trim().split(` `)[0]??``;return t===`/dev/null`?``:t.replace(/^[ab]\//,``)}function Ot(e){let t=new Map,n=``,r=``;for(let i of e.split(/\r?\n/)){if(i.startsWith(`--- `)){n=Dt(i.slice(4));continue}if(i.startsWith(`+++ `)){r=Dt(i.slice(4));continue}let e=/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/.exec(i);if(!e)continue;let a=Number(e[1]),o=Number(e[2]??1),s=Number(e[3]),c=Number(e[4]??1),l=c===0,u=(l?n:r)||r||n||`(unknown path)`,d=l?a:s,f=l?o:c,p=f<=1?`L${d}`:`L${d}-L${d+f-1}`,m=t.get(u)??[];m.push(p),t.set(u,m)}return[...t].map(([e,t])=>`${e} ${t.join(`, `)}`).join(`; `)}function kt(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 At(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 jt(e){return String(e??``).replace(/\s+/g,` `).trim()}function R(e){if(!e)return[];if(typeof e==`string`){let t=jt(e);return t?[t]:[]}if(Array.isArray(e))return e.flatMap(e=>R(e));if(typeof e==`object`){let t=e;if(typeof t.text==`string`)return R(t.text);if(`summary`in t)return R(t.summary);if(`content`in t)return R(t.content);if(`parts`in t)return R(t.parts)}return[]}function Mt(e,t){let n=[];for(let r of[...e,...t]){let e=jt(r);!e||n.includes(e)||n.push(e)}return n}function z(e,t,n=null,r={}){!e||!t||e({message:t,phase:n,...r})}function Nt(e){switch(e.type){case`commandExecution`:return{message:`Running command: ${String(e.command??``).trim()}`,phase:`running`};case`fileChange`:return{message:`Applying file changes: ${Et(e)||`(details unavailable)`}.`,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 Pt(e){switch(e.type){case`agentMessage`:{let t=String(e.text??``).trim();return t?{message:t,phase:null}:null}case`reasoning`:{let t=R(e.summary)[0]?.split(`
|
|
11
|
+
`)[0]??``;return t?{message:`Thinking: ${t.length>100?`${t.slice(0,100)}…`:t}`,phase:null}:null}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}: ${Et(e,!0)||`(details unavailable)`}.`,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 Ft(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,lastDiffSummary:``,itemIndex:new Map,onProgress:t.onProgress??null,onHeartbeat:t.onHeartbeat??null}}function It(e){e.completionTimer&&=(clearTimeout(e.completionTimer),null)}function Lt(e,t=null){e.completed||(It(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 Rt(e){e.completed||e.finalTurn||!e.finalAnswerSeen||e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||(It(e),e.completionTimer=setTimeout(()=>{e.completionTimer=null,!(e.completed||e.finalTurn||!e.finalAnswerSeen)&&(e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||Lt(e,null))},250),e.completionTimer.unref?.())}function zt(e,t){let n=bt(t);if(!n||!e.threadIds.has(n))return!1;let r=e.threadTurnIds.get(n)??null,i=xt(t);return r===null||i===null||i===r}function Bt(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),Rt(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,Rt(e)));return}if(t.type===`reasoning`&&n===`completed`){e.reasoningSummary=Mt(e.reasoningSummary,R(t.summary));return}if(t.type===`fileChange`&&n===`completed`){e.fileChanges.push(t);return}t.type===`commandExecution`&&n===`completed`&&e.commandExecutions.push(t)}function Vt(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),z(e.onProgress,`Turn started (${t.params.turn.id}).`,`starting`,{threadId:t.params.threadId??null,turnId:t.params.turn.id??null});break;case`item/started`:Bt(e,t.params.item,`started`,t.params.threadId??null);{let n=Nt(t.params.item);z(e.onProgress,n?.message,n?.phase??null)}break;case`item/completed`:Bt(e,t.params.item,`completed`,t.params.threadId??null);{let n=Pt(t.params.item);z(e.onProgress,n?.message,n?.phase??null)}break;case`thread/tokenUsage/updated`:{let n=kt(t.params?.tokenUsage?.total??t.params?.tokenUsage),r=bt(t);n&&r&&e.tokenUsageByThread.set(r,n);break}case`turn/diff/updated`:{let n=Ot(String(t.params?.diff??``));n&&n!==e.lastDiffSummary&&(e.lastDiffSummary=n,z(e.onProgress,`Changed lines: ${n}.`,`editing`));break}case`item/autoApprovalReview/completed`:{let n=t.params?.review??{},r=t.params?.action??{},i=r.command??r.type??``;z(e.onProgress,`auto-review ${n.status}${n.riskLevel?` (${n.riskLevel} risk)`:``}: ${vt(i)}${n.rationale?` — ${vt(n.rationale,120)}`:``}`,null);break}case`error`:e.error=t.params.error,z(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),Rt(e);break}z(e.onProgress,`Turn ${t.params.turn.status}.`,`finalizing`),Lt(e,t.params.turn)}}async function Ht(e,t,n,r={}){let i=Ft(t,r),a=e.notificationHandler;e.setNotificationHandler(e=>{if(!i.turnId){i.bufferedNotifications.push(e);return}if(e.method===`thread/started`){Vt(i,e);return}if(!zt(i,e)){a?.(e);return}Vt(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),await r.onTurnStarted?.(i.turnId));for(let e of i.bufferedNotifications)zt(i,e)?Vt(i,e):a?.(e);return i.bufferedNotifications.length=0,e.turn?.status&&e.turn.status!==`inProgress`&&Lt(i,e.turn),await i.completion}finally{It(i),e.setNotificationHandler(a??null),e.setServerRequestHandler(null)}}async function Ut(e,t,n={}){let r=n.connect??ee.connect,i=null;try{i=await r(e);let n=await t(i);return await i.close(),n}catch(n){let a=n,o=i?.transport===`broker`||!!process.env.CODER_APP_SERVER_ENDPOINT,s=i?.transport===`broker`&&a?.rpcCode===-32001||o&&(a?.code===`ENOENT`||a?.code===`ECONNREFUSED`);if(i&&=(await i.close().catch(()=>{}),null),!s)throw n;let c=await r(e,{disableBroker:!0});try{return await t(c)}finally{await c.close()}}}function B(e){let t=h(`codex`,[`--version`],{cwd:e});if(!t.available)return t;let n=h(`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 Wt(e){let t=B(e);if(!t.available)return{available:!1,loggedIn:!1,detail:t.detail};let n=null;try{n=await ee.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=w(`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 Gt(e,{endpoint:t,threadId:n,turnId:r}){if(!n||!r)return{interrupted:!1,detail:`missing threadId or turnId`};let i=await ht(t,`turn/interrupt`,{threadId:n,turnId:r});return i.ok?{interrupted:!0,detail:`Interrupted ${r} on ${n}.`}:{interrupted:!1,detail:i.detail}}async function Kt(e,{endpoint:t,threadId:n,turnId:r,text:i}){if(!n)return{steered:!1,retryable:!0,detail:`missing active threadId`};if(!r)return{steered:!1,retryable:!0,detail:`missing active turnId`};let a=i.trim();if(!a)return{steered:!1,retryable:!1,detail:`empty follow-up`};let o=await ht(t,`turn/steer`,{threadId:n,input:[{type:`text`,text:a,text_elements:[]}],expectedTurnId:r});return o.ok?o.result?.turnId===r?{steered:!0,retryable:!1,detail:`Steered follow-up into ${r} on ${n}.`}:{steered:!1,retryable:!1,detail:`turn/steer returned unexpected turnId ${String(o.result?.turnId??`(missing)`)}; expected ${r}`}:{steered:!1,retryable:o.retryable,detail:o.detail}}async function qt(e,t={}){let n=B(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 Ut(e,async n=>{let a=null,o;if(t.resumeThreadId)z(t.onProgress,`Resuming thread ${t.resumeThreadId}.`,`starting`),p(t.resumeThreadId)&&await i(t.resumeThreadId),o=(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`,...t.approvalsReviewer?{approvalsReviewer:t.approvalsReviewer}:{}})).thread.id;else if(z(t.onProgress,`Starting Codex task thread.`,`starting`),o=(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`,...t.approvalsReviewer?{approvalsReviewer:t.approvalsReviewer}:{},serviceName:`coder_runtime`,ephemeral:t.ephemeral??!1})).thread.id,!(t.ephemeral??!1))try{await n.request(`thread/name/set`,{threadId:o,name:yt(r)})}catch(e){let t=String(e?.message??e??``);if(!t.includes(`unknown variant`)&&!t.includes(`unknown method`))throw e}z(t.onProgress,`Thread ready (${o}).`,`starting`,{threadId:o});let s;try{s=await Ht(n,o,()=>n.request(`turn/start`,{threadId:o,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,onTurnStarted:t.onControlReady?async e=>{a=await pt(n,{threadId:o,turnId:e}),t.onControlReady?.(a.endpoint,o,e)}:void 0})}finally{await a?.close()}return{status:s.finalTurn?.status===`completed`?0:1,threadId:o,turnId:s.turnId,finalMessage:s.lastAgentMessage,reasoningSummary:s.reasoningSummary,turn:s.finalTurn,error:s.error,stderr:_t(n.stderr),fileChanges:s.fileChanges,touchedFiles:St(s.fileChanges),tokens:At(s),model:t.model??null,commandExecutions:s.commandExecutions}})}const Jt={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:[]}},V={spark:`gpt-5.3-codex-spark`,luna:`gpt-5.6-luna`,terra:`gpt-5.6-terra`,sol:`gpt-5.6-sol`},H=new Set([`low`,`medium`,`high`]),U={haiku:`haiku`,sonnet:`sonnet`,opus:`opus`,fable:`fable`},W=new Set([`low`,`medium`,`high`]),Yt={"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`}},Xt={"read-only":[`--permission-mode`,`dontAsk`,`--disallowedTools`,`Edit`,`Write`,`NotebookEdit`],"workspace-write":[`--permission-mode`,`acceptEdits`],auto:[`--permission-mode`,`auto`]},Zt=[`--permission-mode`,`dontAsk`,`--disallowedTools`,`Edit`,`Write`,`NotebookEdit`,`Bash`,`WebFetch`,`WebSearch`,`Task`],Qt=/failIfUnavailable|sandbox\b[^.\n]*?(?:failed|could ?n[o']t|cannot|unavailable|not available|not supported)/i;function $t(e){return e.flatMap(e=>le.isIPv6(e)?[`[${e}]`]:e.startsWith(`[`)||e.includes(`:`)||le.isIP(e)?[e]:[e,`*.${e}`])}function en(e,t,n=[],r=[]){return JSON.stringify(e===`read-only`?{...r.length?{permissions:{additionalDirectories:r}}:{},sandbox:{enabled:!0,failIfUnavailable:!0,autoAllowBashIfSandboxed:!0,filesystem:{denyWrite:[t,...r]}}}:{sandbox:{enabled:!0,autoAllowBashIfSandboxed:!0,...e===`auto`&&n.length?{network:{allowedDomains:$t(n)}}:{}}})}const tn=E.enum([`codex`,`claude`]),nn=E.enum([`codex`,`claude`,`custom`]),rn=E.enum([`low`,`medium`,`high`]),an=E.enum([`read-only`,`workspace-write`,`auto`]),on=E.partial(E.strictObject({model:E.string().check(E.minLength(1)),effort:rn,permissions:an})),sn=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())}),cn=E.strictObject({provider:tn,model:E.string().check(E.minLength(1)),effort:E.optional(rn),disabled:E.optional(E.boolean())}),ln=E.strictObject({disabled:E.boolean()}),un=E.union([sn,cn,ln]),dn=E.strictObject({escalationTimeoutMs:E.number().check(E.positive()),allowedNetworkHosts:E.array(E.string())}),fn=E.strictObject({chain:E.array(nn).check(E.minLength(1)),agents:E.partial(E.strictObject({codex:on,claude:on,custom:on})),models:E.optional(E.record(E.string().check(E.regex(/^[a-z0-9][a-z0-9./_-]*$/i,`model name`)),un)),approvals:dn}),pn=E.partial(E.extend(fn,{approvals:E.partial(dn)}));function G(e){return`baseUrl`in e}function mn(e){return`provider`in e}function hn(e){let t=pn.safeParse(e);if(!t.success)return t.error.issues.map(e=>`${e.path.join(`.`)||`config`}: ${e.message}`);let n=_n(Jt,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(mn(i)){let t=n.models?.[i.model];t&&!G(t)&&r.push(`models.${e}: alias target "${i.model}" is itself a config entry`)}}return r}function gn(e){if(!x.existsSync(e))return null;try{return JSON.parse(x.readFileSync(e,`utf8`))}catch(t){let n=t instanceof Error?t.message:String(t);throw Error(`Invalid JSON in ${e}: ${n}`)}}function _n(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))n[e]=i&&typeof i==`object`&&!Array.isArray(i)&&r?.[e]&&typeof r[e]==`object`?_n(r[e],i):i;return n}function vn(){return S.join(r(),`config.json`)}function yn(e){let t=s(e),n=Jt;for(let e of[vn(),S.join(t,`coder.config.json`)]){let t=gn(e);if(!t)continue;let r=hn(t);if(r.length)throw Error(`Invalid config in ${e}:\n ${r.join(`
|
|
12
|
+
`)}`);n=_n(n,t)}let r=hn(n);if(r.length)throw Error(`Invalid merged config:\n ${r.join(`
|
|
13
|
+
`)}`);return n}function bn(e){return e.replace(/\/+$/,``).replace(/\/(chat\/completions|completions|responses)$/,``)}function xn(e,t,n){let r=[S.join(s(e),`coder.config.json`),vn()];for(let e of r){let r;try{r=gn(e)}catch{continue}if(r?.models?.[t])return Object.assign(r.models[t],n),!hn(r).length&&(x.writeFileSync(e,`${JSON.stringify(r,null,2)}\n`,`utf8`),!0)}return!1}function Sn(e){return/\/(chat\/completions|completions|responses)\/*$/.test(e)}function Cn(e,t){let n=bn(e);return Sn(e)||/\/v\d+(alpha|beta)?$/.test(n)?[`${n}/${t}`]:[`${n}/${t}`,`${n}/v1/${t}`]}function wn(e,t,n){let r=t?e.models?.[t]:void 0;if(!t||!r||!G(r))return null;let i=`coder-${t}`;return{model:r.model,modelProvider:i,configOverrides:{[`model_providers.${i}`]:{name:t,base_url:n?.url??bn(r.baseUrl),...r.envKey&&!n?{env_key:r.envKey}:{},wire_api:`responses`}}}}function Tn(e){return e?V[e]??e:null}function En(e){return e in V||e in U}function Dn(e,t){return!!(t&&e.models?.[t]?.disabled)}function On(e,t){if(Dn(e,t))throw Error(`model "${t}" is disabled in config`)}function kn(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=>H.has(e)||W.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&&mn(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 U?`claude`:i&&s&&G(s)?`custom`:`codex`;let c=t.agents[r]??{},l=i??c.model??null;return On(t,l),{agent:r,model:l,effort:a??c.effort??null}}function An(e){let t=vn();return x.mkdirSync(S.dirname(t),{recursive:!0}),x.writeFileSync(t,`${JSON.stringify(e,null,2)}\n`,`utf8`),t}function jn(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 Mn(e){if(!e)return 0;let t=e.split(/\r\n|\r|\n/);return t.at(-1)===``&&t.pop(),Math.max(1,t.length)}function Nn(e,t,n=!1){if(!t)return[];let r;try{r=x.readFileSync(e,`utf8`)}catch{return[]}let i=[],a=0;for(;a<=r.length;){let e=r.indexOf(t,a);if(e<0)break;let o=Mn(r.slice(0,e))+1,s=Math.max(1,Mn(t));if(i.push(s===1?`L${o}`:`L${o}-L${o+s-1}`),!n)break;a=e+Math.max(t.length,1)}return i.length>4?[...i.slice(0,4),`+${i.length-4} matches`]:i}function Pn(e,t,n){let r=String(t.file_path??t.notebook_path??``),i=r?S.isAbsolute(r)?r:S.resolve(n,r):``;if(e===`Write`){let e=Mn(String(t.content??``));return`Write ${r||`(unknown path)`} ${e?`L1-L${e}`:`(empty file)`}`}if(e===`Edit`){let e=Nn(i,String(t.old_string??``),t.replace_all===!0);return`Edit ${r||`(unknown path)`}${e.length?` ${e.join(`, `)}`:``}`}if(e===`MultiEdit`){let e=Array.isArray(t.edits)?t.edits:[],n=e.flatMap(e=>Nn(i,String(e?.old_string??``),e?.replace_all===!0));return`MultiEdit ${r||`(unknown path)`}${n.length?` ${n.join(`, `)}`:``} (${e.length} edits)`}if(e===`NotebookEdit`){let e=t.cell_id??t.cell_number;return`NotebookEdit ${r||`(unknown path)`}${e==null?``:` cell ${e}`}`}return`${e} ${JSON.stringify(t??{})}`}function Fn(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 In(){let e=w(`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 Ln(){let e=w(`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`}}}function Rn(e,t,n){let r=[`-p`,`--input-format`,`stream-json`,`--output-format`,`stream-json`,`--verbose`,`--replay-user-messages`];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`,a=i===`read-only`?t.additionalDirectories??[]:[],o=i===`read-only`?t.readOnlyAllowedTools??[]:[];if(i===`auto`&&t.approvalJobId){let n=JSON.stringify({mcpServers:{coder:{type:`stdio`,command:b.execPath,args:[m,`_mcp`,t.approvalJobId,`--cwd`,e]}}});r.push(`--permission-mode`,`default`,`--mcp-config`,n,`--permission-prompt-tool`,`mcp__coder__approval_prompt`)}else o.length?r.push(...Zt,`--allowedTools`,...o):r.push(...Xt[i]??Xt.auto);for(let e of a)r.push(`--add-dir`,e);let s=en(i,e,t.allowedNetworkHosts??[],a);return s&&r.push(`--settings`,s),r}function zn(e,t){return Object.assign(Error(e),{retryable:t})}function Bn(e){return{type:`user`,message:{role:`user`,content:[{type:`text`,text:e}]}}}function Vn(e){let t=!0;return{sendInitial(t){return new Promise((n,r)=>{e(`${JSON.stringify(Bn(t))}\n`,e=>{e?r(e):n()})})},sendSteer(n){return t?new Promise((t,r)=>{e(`${JSON.stringify(Bn(n))}\n`,e=>{if(!e){t();return}let n=e.code,i=n===`EPIPE`||n===`ERR_STREAM_DESTROYED`||n===`ERR_STREAM_WRITE_AFTER_END`;r(zn(`Failed to write Claude live steer: ${e.message}`,i))})}):Promise.reject(zn(`Claude turn is no longer accepting live input.`,!0))},stopAccepting(){t=!1}}}function Hn(e,t){let n=`${e}.${b.pid}.${D()}.tmp`;x.writeFileSync(n,`${JSON.stringify(t)}\n`,`utf8`),x.renameSync(n,e)}async function Un(e){let t=x.mkdtempSync(S.join(T.tmpdir(),`coder-claude-steer-`)),n=`file:${t}`,r=new Set,i=!1,a=!1,o=(n=!1)=>{if(!(i&&!n||a)){a=!0;try{for(let n of x.readdirSync(t).filter(e=>e.endsWith(`.request.json`))){let i=S.join(t,n),a=`${i}.${b.pid}.processing`;try{x.renameSync(i,a)}catch{continue}let o=n.slice(0,-13),s=S.join(t,`${o}.response.json`),c=(async()=>{let t;try{let n=JSON.parse(x.readFileSync(a,`utf8`)),r=typeof n?.params?.text==`string`?n.params.text.trim():``;if(n?.method!==`turn/steer`||!r||n?.id!==o)t={id:o,error:{message:`Invalid Claude steer request.`,retryable:!1}};else try{await e(r),t={id:o,result:{accepted:!0}}}catch(e){let n=e;t={id:o,error:{message:n.message,retryable:n.retryable===!0}}}}catch(e){t={id:o,error:{message:`Invalid Claude steer JSON: ${e instanceof Error?e.message:String(e)}`,retryable:!1}}}try{Hn(s,t)}finally{try{x.unlinkSync(a)}catch{}}})();r.add(c),c.then(()=>r.delete(c),()=>r.delete(c))}}catch{}finally{a=!1}}},s=setInterval(o,10);return{endpoint:n,async close(){i=!0,clearInterval(s),o(!0),await Promise.allSettled([...r]),await new Promise(e=>setTimeout(e,50)),x.rmSync(t,{recursive:!0,force:!0})}}}async function Wn(e,t,n=3e3){if(!e)return{steered:!1,retryable:!0,detail:`Claude live steer endpoint is not ready.`};let r=t.trim();if(!r)return{steered:!1,retryable:!1,detail:`empty follow-up`};if(!e.startsWith(`file:`)||e.length===5)return{steered:!1,retryable:!1,detail:`Unsupported Claude steer endpoint: ${e}`};let i=e.slice(5);if(!x.existsSync(i))return{steered:!1,retryable:!0,detail:`Claude live steer endpoint is no longer available.`};let a=D(),o=S.join(i,`${a}.request.json`),s=S.join(i,`${a}.response.json`);try{Hn(o,{id:a,method:`turn/steer`,params:{text:r}})}catch(e){return{steered:!1,retryable:e.code===`ENOENT`,detail:e instanceof Error?e.message:String(e)}}let c=Date.now();for(;Date.now()-c<n;){try{let e=JSON.parse(x.readFileSync(s,`utf8`));try{x.unlinkSync(s)}catch{}return e?.result?.accepted===!0?{steered:!0,retryable:!1,detail:`Claude accepted the live follow-up.`}:{steered:!1,retryable:e?.error?.retryable===!0,detail:String(e?.error?.message??`Malformed Claude steer response.`)}}catch(e){if(e.code!==`ENOENT`)return{steered:!1,retryable:!1,detail:`Invalid Claude steer response: ${e instanceof Error?e.message:String(e)}`}}await new Promise(e=>setTimeout(e,10))}return{steered:!1,retryable:!1,detail:`Timed out waiting for Claude live steer acknowledgement.`}}async function Gn(e,t){let n=t.resumeSessionId??D(),r=Rn(e,t,n);return t.onProgress?.({message:`claude turn started (session ${n})`,threadId:n}),new Promise((i,a)=>{let o=C(t.executable??`claude`,r,{cwd:e,stdio:[`pipe`,`pipe`,`pipe`]}),s=``,c=``,l=[],u=null,d=n,f=null,p=!1,m=Vn((e,t)=>o.stdin.write(e,t)),h=Date.now(),g=n=>{if(!(!n||typeof n!=`object`)){if(t.onHeartbeat?.(),n.type===`system`&&n.subtype===`init`&&n.session_id)d=n.session_id;else if(n.type===`assistant`){for(let r of n.message?.content??[])if(r?.type===`tool_use`)t.onProgress?.({message:Pn(String(r.name??`Tool`),r.input??{},e),threadId:d});else if(r?.type===`text`&&typeof r.text==`string`&&r.text.trim())t.onProgress?.({message:r.text.trim(),threadId:d});else if(r?.type===`thinking`&&typeof r.thinking==`string`&&r.thinking.trim()){let e=Math.max(1,Math.round((Date.now()-h)/1e3)),n=r.thinking.trim().split(`
|
|
14
|
+
`)[0],i=n.length>100?`${n.slice(0,100)}…`:n;t.onProgress?.({message:`Thought for ${e}s: ${i}`,threadId:d})}}else if(n.type===`user`){for(let e of n.message?.content??[])if(e?.type===`tool_result`){let n=jn(e.content).trim();n&&t.onProgress?.({message:n,threadId:d})}}else n.type===`result`&&(u=n,n.session_id&&(d=n.session_id),m.stopAccepting(),o.stdin.end());h=Date.now()}};o.stdout.on(`data`,e=>{s+=e;let t;for(;(t=s.indexOf(`
|
|
15
|
+
`))>=0;){let e=s.slice(0,t).trim();if(s=s.slice(t+1),e)try{g(JSON.parse(e))}catch(e){l.push(`Invalid Claude stream-json output: ${e instanceof Error?e.message:String(e)}`)}}}),o.stderr.on(`data`,e=>{c+=e});let _=()=>{m.stopAccepting(),o.kill(`SIGTERM`);let e=f?.endpoint;e?.startsWith(`file:`)&&x.rmSync(e.slice(5),{recursive:!0,force:!0}),b.exit(143)};b.on(`SIGTERM`,_),(async()=>{t.onSteerReady&&(f=await Un(e=>m.sendSteer(e))),await m.sendInitial(t.prompt),f&&t.onSteerReady?.(f.endpoint)})().catch(e=>{p||(p=!0,m.stopAccepting(),o.kill(`SIGTERM`),b.removeListener(`SIGTERM`,_),f?.close(),a(e))}),o.on(`error`,e=>{p||(p=!0,m.stopAccepting(),b.removeListener(`SIGTERM`,_),f?.close(),a(Error(`claude spawn failed: ${e.message}`)))}),o.on(`close`,async e=>{if(p)return;p=!0,m.stopAccepting(),b.removeListener(`SIGTERM`,_),await f?.close();let n=s.trim();if(n)try{g(JSON.parse(n))}catch(e){l.push(`Invalid trailing Claude stream-json output: ${e instanceof Error?e.message:String(e)}`)}let r=u?.result??``,a=e!==0||u?.is_error===!0||u==null||l.length>0;i({status:+!!a,threadId:u?.session_id??d,turnId:null,finalMessage:r,tokens:Fn(u?.usage),model:u?.modelUsage&&Object.keys(u.modelUsage).join(`+`)||t.model||null,error:a?{message:l[0]||r||c.trim()||`claude exited ${e}`}:null})})})}function Kn(e){w(`claude`,[`plugin`,`marketplace`,`remove`,`coder-plugins`],{encoding:`utf8`});let t=w(`claude`,[`plugin`,`marketplace`,`add`,e],{encoding:`utf8`}),n=w(`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 qn(){return S.join(T.homedir(),`.agents`,`skills`,`coder`)}function Jn(){try{let e=x.readFileSync(S.join(qn(),`SKILL.md`),`utf8`);return/^\s*version:\s*(\S+)/m.exec(e)?.[1]??null}catch{return null}}function Yn(e){let t=qn();try{let n=S.join(e,`plugins`,`agents`,`skills`,`coder`);x.rmSync(t,{recursive:!0,force:!0}),x.mkdirSync(t,{recursive:!0}),x.cpSync(n,t,{recursive:!0});let r=S.join(t,`SKILL.md`),i=x.readFileSync(r,`utf8`).replace(`
|
|
16
|
+
---
|
|
17
|
+
`,`\nmetadata:\n version: ${v()}\n---\n`);return x.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 Xn(e){if(e.available)return null;let t=w(`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 Zn(e){let t=/(\d+\.\d+\.\d+)/.exec(String(e??``));return t?t[1]:null}function Qn(e){if(!e.available)return null;let t=Zn(e.detail);if(!t||Ve(t,`0.144.0`)>=0)return null;let n=w(`codex`,[`update`],{encoding:`utf8`});return n.status!==0&&(n=w(`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 $n=/usage|quota|rate.?limit|429|401|unauthorized|not authenticated|login|insufficient|exhausted|not available|ENOENT/i,er=`CODER_WORKER`;var K=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)}},tr=class extends Error{agent;detail;constructor(e,t){super(t),this.agent=e,this.detail=t}};function nr(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&&mn(n)?n:void 0},s=e=>{let n=e?t.models?.[e]:void 0;return n&&G(n)?n:void 0};if(o(i)){let e;try{e=kn(i,t)}catch(e){throw new K(`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 U?n=`claude`:i in V?n=`codex`:s(i)&&(n=`custom`)),n=n??t.chain[0]??`codex`,n!==`codex`&&n!==`claude`&&n!==`custom`){let e=n in V||n in U||n in(t.models??{})?` "${n}" is a model; use --model ${n}.`:``;throw new K(`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=kn(l,t)}catch(e){throw new K(`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{On(t,l)}catch(e){throw new K(`invalid-option`,e instanceof Error?e.message:String(e))}if(n===`custom`){let e=Object.entries(t.models??{}).filter(([,e])=>G(e)).map(([e])=>e);if(!l&&e.length===1&&(l=e[0]),!l||!s(l))throw new K(`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 Yt))throw new K(`invalid-option`,`Invalid --permissions "${d}". Use one of: ${Object.keys(Yt).join(`, `)}`);if(f===`codex`&&u&&!H.has(u))throw new K(`invalid-option`,`Invalid codex --effort "${u}". Use one of: ${[...H].join(`, `)}`);if(f===`claude`&&u&&!W.has(u))throw new K(`invalid-option`,`Invalid claude --effort "${u}". Use one of: ${[...W].join(`, `)}`);return{engine:f,agent:n,model:l,effort:u,permissions:d}}function rr(e,t){return e===`read-only`&&Qt.test(t??``)}function ir(e,n){let r=o(e,n),i=x.openSync(S.join(r,`worker.log`),`a`),a=C(b.execPath,[m,`_worker`,n,`--cwd`,e],{cwd:e,detached:!0,stdio:[`ignore`,i,i],env:{...b.env,[er]:`1`}});a.unref(),x.closeSync(i),t(e,n,{pid:a.pid??null})}async function ar(e,r,i,a){let s=i.cwd,l=r.engine===`codex`?B(s):In(),u=r.model?e.models?.[r.model]:void 0;if(!l.available&&u&&G(u)){let e=Xn(l);i.onInstallNote?.(e.note),l=B(s)}if(!l.available)throw new tr(r.agent,l.detail);let d=null;a.resume&&(d=n(s,a.resume)?.threadId??a.resume);let f=ie(),p=t(s,f,{status:`queued`,kind:`task`,name:a.name??null,system:i.system??null,agent:r.agent,engine:r.engine,prompt:i.prompt,model:r.model,effort:r.effort,permissions:r.permissions,resumeThreadId:d,cwd:s,background:!i.wait,...a.simulateApproval?{simulateApproval:!0}:{},...i.flowRunId?{flowRunId:i.flowRunId}:{}});ir(s,f);let m=2**53-1,h=()=>c(s,f,m).filter(e=>e.phase!==`starting`).length,_=Date.now()+15e3,v=p,y=null,ee=null;for(;Date.now()<(ee??_)&&(v=g(s,f)??v,v.status!==`failed`&&v.status!==`completed`);){if(v.threadId&&y===null&&(y=h(),ee=Date.now()+5e3),y!==null&&h()>y){v=g(s,f)??v;break}await new Promise(e=>setTimeout(e,150))}if(v.status===`failed`){let e=F(S.join(o(s,f),`result.json`))?.error?.message??``,t=c(s,f,5).map(e=>e.message??``).join(`
|
|
18
|
+
`),n=e||t;throw rr(r.permissions,n)?new K(`read-only-unavailable`,n):$n.test(n)?new tr(r.agent,n):new K(`startup-failed`,n,{taskId:f})}return{taskId:f,job:v,agent:r.agent,startupCheck:v.threadId?`passed`:`pending`}}function or(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 sr(e){if(b.env.CODER_WORKER)throw new K(`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 K(`invalid-option`,`Missing task text.`,{hint:[`Usage: coder run "<task text>"`,`Help: coder task run --help`]});let t=yn(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=nr(n,t);try{return await ar(t,i,e,r)}catch(a){if(!(a instanceof tr))throw a;let o=t.chain[t.chain.indexOf(a.agent)+1];if(!o){let t=or(a.agent,a.detail,i.permissions,e.system,e.prompt);throw new K(`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 cr(e,t){if(t.status!==`failed`)return;let n=t.result;if(!n||!$n.test(n.error?.message??``)||!(!n.touchedFiles?.length&&!n.fileChanges?.length&&!n.commandExecutions?.length))return;let r=yn(e).chain;return r[r.indexOf(t.job.agent)+1]}function lr(e,t){return F(S.join(o(e,t),`result.json`))}function ur(e,t,n=0){return n===0?[]:c(e,t,n===`all`?2**53-1:n)}function dr(e,t,n={}){let r=g(e,t);if(!r)throw Error(`No task found for "${t}".`);return{taskId:t,status:r.status,result:lr(e,t),steps:ur(e,t,n.tail),turns:l(e,t),job:r}}async function fr(e,t,n={}){let r=g(e,t);if(!r)throw Error(`No task found for "${t}".`);let i=await lt(e,r);if(i.reason===`approval`){let e=i.approval;throw new K(`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:lr(e,t),steps:ur(e,t,n.tail),turns:l(e,t),job:a}}const pr=[`.ts`,`.mjs`,`.js`];function mr(e,t){let n=[];try{n=x.readdirSync(e)}catch{return[]}let r=[];for(let i of n.sort()){let n=S.extname(i);pr.includes(n)&&r.push({name:S.basename(i,n),path:S.join(e,i),scope:t})}return r}function hr(e){let t=s(e),n=[],i=S.resolve(e);for(;n.push({dir:S.join(i,`.coder`,`flows`),scope:`workspace`}),i!==t&&S.dirname(i)!==i;)i=S.dirname(i);return n.push({dir:S.join(r(),`flows`),scope:`global`}),n}function gr(e){let t=new Set,n=[];for(let{dir:r,scope:i}of hr(e))for(let e of mr(r,i))t.has(e.name)||(t.add(e.name),n.push(e));return n}function _r(e){return e.includes(`/`)||pr.includes(S.extname(e))}function vr(e,t){if(_r(e)){let n=S.resolve(t,e);if(x.existsSync(n))return{name:S.basename(n,S.extname(n)),path:n};throw Error(`Flow file not found: ${e}`)}let n=gr(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 yr(e,t,n={}){if(t.length)try{C(b.execPath,[m,`_archiveSweep`,`--cwd`,e,...n.flows?[`--flows`]:[],...t],{detached:!0,stdio:`ignore`}).unref()}catch{}}async function br(e){let{options:t,positionals:r}=_(e,E.object({cwd:ne,flows:te})),i=N(t);for(let e of r){if(t.flows){let t=Z(e);t&&li(t);continue}let r=n(i,e);r&&re(i,r)}}async function xr(e){let{options:t,positionals:n}=_(e,E.object({...y,"all-stopped":te}));Le(n,1,`task archive`);let r=N(t);if(t[`all-stopped`]){let e=u(r).filter(e=>a.includes(e.status));for(let t of e)re(r,t);let n=e.map(e=>e.id);if(t.json){j({archived:n,count:n.length});return}b.stdout.write(n.length?`Archived ${n.length} stopped task${n.length===1?``:`s`}.\n`:`${O.dim(`No stopped tasks to archive.`)}\n`);return}let i=n[0];i||A(`Missing task id.`,{hint:[`Archive one: coder task archive <task-id>`,`Archive all stopped: coder task archive --all-stopped`]});let o=Re(r,i);if(re(r,o),t.json){j({taskId:o.id,archived:!0});return}b.stdout.write(`Archived task ${O.cyan(o.id)}.\n`)}async function Sr(e,n,r={}){let i=n.engine===`claude`?{detail:`claude worker terminated`}:await(r.interrupt??Gt)(e,{endpoint:n.steerEndpoint,threadId:n.threadId,turnId:n.turnId});if(n.engine!==`claude`&&mt(n.steerEndpoint),n.pid&&n.status===`running`)try{b.kill(n.pid,`SIGTERM`)}catch{}return t(e,n.id,{status:`cancelled`,steerEndpoint:null,completedAt:new Date().toISOString()}),{taskId:n.id,status:`cancelled`,interrupt:i.detail}}async function Cr(e){let{options:t,positionals:n}=_(e,E.object(y));Le(n,1,`task stop`);let r=N(t),i=Re(r,n[0]),{interrupt:a}=await Sr(r,i);if(t.json){j({taskId:i.id,status:`cancelled`,interrupt:a});return}b.stdout.write(`Stopped task ${O.cyan(i.id)} ${O.dim(`(${a})`)}\n`)}function wr(e){return typeof e!=`object`||!e?JSON.stringify(e)??`null`:Array.isArray(e)?`[${e.map(wr).join(`,`)}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${wr(e[t])}`).join(`,`)}}`}function Tr(e,t){return ue.createHash(`sha256`).update(`${e}\0${wr(t)}`).digest(`hex`)}function Er(e){return x.existsSync(e)?x.readFileSync(e,`utf8`).split(/\r?\n/).filter(Boolean).map(e=>{try{return JSON.parse(e)}catch{return null}}).filter(e=>e!==null):[]}var Dr=class{file;recorded;seq=0;constructor(e,t){this.file=t,this.recorded=e.map(e=>({...e})),x.writeFileSync(t,``,`utf8`)}write(e){e.seq=this.seq++,x.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 Or=globalThis,q=Or.__coderFlowCtxALS??=new de,J=Or.__coderFlowScopeALS??=new de;function kr(){return J.getStore()?.args}function Ar(){return J.getStore()?.depth??0}var jr=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 Mr(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 Nr(e,t){if(!t.tokens)return;let n=t.model??`default`;e.ledger[n]=Mr(e.ledger[n]??null,t.tokens)}function Pr(e){return!!e&&typeof e.safeParse==`function`}async function Fr(e){try{let t=await import(`zod`);if(typeof t.toJSONSchema==`function`)return t.toJSONSchema(e)}catch{}return null}async function Ir(e){let t=await Fr(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 Rr(e,t){if(!Pr(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 zr(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 Br(e,t,n,r){let i=t.cwd?S.resolve(t.cwd):n?.cwd??b.cwd(),a;for(;;){let o=await sr({prompt:e,...zr(t,i,n),...a?{agent:a,model:void 0,effort:void 0,resume:void 0}:{resume:r??t.resume},onFallback:e=>Xr(`${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=g(i,o.taskId),c=s?be(s):void 0;n?.hooks.onTaskStart?.({taskId:o.taskId,name:t.name,prompt:e,agent:c,depth:Ar()});let l;try{l=await fr(i,o.taskId)}finally{n?.running.delete(o.taskId)}let u=cr(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 Vr(e,t,n){let r=e;if(t.returns&&(r=`${e}\n\n${await Ir(t.returns)}`),n?.dryRun){b.stdout.write(`\n[dry-run] task${t.name?` (${t.name})`:``}:\n${r}\n`);let e={...t,returns:t.returns?`<schema>`:void 0};return b.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 Br(r,t,n);if(i.status!==`completed`){let e={...i,data:void 0};throw new K(`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=Rr(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 Br(`Your previous reply did not match the required format: ${e.errors}\n\n${await Ir(t.returns)}`,t,n,i.taskId);a=r.output||a,o=Mr(o,r.tokens);try{let e=Rr(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 K(`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 Hr(e){if(e)return await Fr(e)??`<schema>`}async function Ur(e,t={}){let n=q.getStore();if(!n)return Vr(e,t);let r=Tr(`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 Hr(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 Vr(e,t,n)}catch(e){let t=e instanceof K?e.result:void 0;throw t&&n.hooks.onTaskEnd?.({taskId:t.taskId,status:t.status===`completed`?`failed`:t.status,tokens:t.tokens}),e}return Nr(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 Wr=262144;let Gr=0;function Kr(e){let t=[];for(let n=e;;){t.push(S.join(n,`node_modules`,`.bin`));let e=S.dirname(n);if(e===n)break;n=e}let n=b.platform===`win32`?`;`:`:`;return{...b.env,PATH:[...t,b.env.PATH??``].join(n)}}async function qr(e,t){return new Promise(n=>{let r=C(e,{shell:!0,cwd:t,env:Kr(t)}),i=``,a=e=>{i.length>=Wr||(i+=e,i.length>=Wr&&(i=`${i.slice(0,Wr)}\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 Jr(e,t={}){let n=q.getStore(),r=t.cwd?S.resolve(t.cwd):n?.cwd??b.cwd();if(!n)return qr(e,r);let i=Tr(`gate`,{cmd:e,cwd:t.cwd}),a=n.journal.replay(i);if(a)return a.result;if(n.dryRun){b.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-${b.pid}-${Gr+=1}`,c=Ar();n.hooks.onGateStart?.({gateId:s,cmd:e,depth:c});let l=await qr(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 Yr(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 Xr(e){let t=q.getStore();if(t)try{x.appendFileSync(S.join(t.runDir,`flow.log`),`${JSON.stringify({at:new Date().toISOString(),message:e})}\n`,`utf8`)}catch{}t?.hooks.onLog?t.hooks.onLog(e,Ar()):(b.stderr.isTTY||!t)&&b.stderr.write(`[flow] ${e}\n`)}const Zr=oe(import.meta.url);function Qr(e){let t=S.dirname(se(import.meta.url));for(;S.basename(t)!==`dist`&&S.dirname(t)!==t;)t=S.dirname(t);return S.basename(t)===`dist`?ce(S.join(t,e)).href:null}function $r(e){if(!(e===`@wular/coder`||e===`@wular/coder/flow`||e===`zod`||e.startsWith(`zod/`)))return null;try{return ce(Zr.resolve(e)).href}catch{}return e===`@wular/coder/flow`?Qr(`flow/index.js`):e===`@wular/coder`?Qr(`sdk.js`):null}const ei=/(\bfrom\s+|\bimport\s+|\bimport\s*\(\s*)(['"])([^'"]+)\2/g;function ti(e){return e.replace(ei,(e,t,n,r)=>{let i=$r(r);return i?`${t}${n}${i}${n}`:e})}async function ni(e,t,n){try{return await import(ce(e).href)}catch(e){let r=e instanceof Error?e.message:String(e);throw t===`.ts`&&!b.versions?.bun&&/Unknown file extension|Unexpected token|SyntaxError|Cannot parse|import type|interface/i.test(r)?Error(`Could not run ${S.basename(n)}: TypeScript flows need bun. Run under \`bun\`, or write the flow as .mjs/.js.`):e}}async function ri(e){let t=S.extname(e),n;try{n=x.readFileSync(e,`utf8`)}catch{throw Error(`Cannot read flow file: ${e}`)}let r=ti(n);if(r===n)return ni(e,t,e);let i=S.dirname(e);try{for(let e of x.readdirSync(i)){if(!e.startsWith(`.__coderflow_`))continue;let t=S.join(i,e);Date.now()-x.statSync(t).mtimeMs>6e5&&x.unlinkSync(t)}}catch{}let a=`${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`,o=S.join(i,`.__coderflow_${a}${t}`),s=`__coderflow_loaded_${a}`,c=new Promise(e=>{globalThis[s]=e});x.writeFileSync(o,`globalThis[${JSON.stringify(s)}]?.();${r}`,`utf8`);let l=ni(o,t,e);try{await Promise.race([c,l.then(()=>void 0,()=>void 0)])}finally{delete globalThis[s];try{x.unlinkSync(o)}catch{}}return await l}async function ii(e,t){let n=J.getStore();n.args=t??{};let r=await ri(e),i=r.args,a=n.args;if(Pr(i)){let e=i.safeParse(t??{});if(!e.success){let e=Rr(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 ai(e,t){let n=q.getStore(),r=vr(e,n?.cwd??b.cwd());if(!n)return J.run({args:t??{},depth:0},()=>ii(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=Tr(`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},()=>ii(r.path,t));return n.journal.record({kind:`flow`,fingerprint:a,result:c,startedAt:s,endedAt:new Date().toISOString()}),c}function oi(){return`flow-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function Y(){return S.join(r(),`state`,`global`,`flows`)}function si(){return S.join(r(),`state`,`global`,`flows-archived`)}function X(e){ae(e,`flow run id`);let t=S.join(Y(),e);if(x.existsSync(S.join(t,`flow.json`)))return t;let n=S.join(si(),e);return x.existsSync(S.join(n,`flow.json`))?n:t}function ci(e){if(e.archived)return e;let t={...e,archived:!0,archivedAt:new Date().toISOString()};return Q(X(e.runId),t),t}function li(e){let t=ci(e),n=X(e.runId),r=S.join(si(),e.runId);if(n!==r)try{x.mkdirSync(si(),{recursive:!0}),x.renameSync(n,r)}catch{}return t}function ui(e){let t=X(e.runId),n=S.join(Y(),e.runId);if(t!==n)try{x.mkdirSync(Y(),{recursive:!0}),x.renameSync(t,n)}catch{}let r={...e,archived:void 0,archivedAt:void 0};return Q(X(e.runId),r),r}function di(e){let t=X(e);return x.existsSync(S.join(t,`flow.json`))?(x.rmSync(t,{recursive:!0,force:!0}),!0):!1}function fi(e){if(!f(e))return null;let t=S.join(X(e),`flow.json`);if(!x.existsSync(t))return null;try{return JSON.parse(x.readFileSync(t,`utf8`))}catch{return null}}function pi(e){return e.status!==`running`||!e.pid||Ti(e)?e:(Si(e.runId,`orchestrator died`),fi(e.runId)??e)}function Z(e){let t=fi(e);return t?pi(t):null}function Q(e,t){x.writeFileSync(S.join(e,`flow.json`),`${JSON.stringify(t,null,2)}\n`,`utf8`)}function mi(e){let t=[];try{t=x.readdirSync(e)}catch{return[]}let n=[];for(let r of t)try{n.push(pi(JSON.parse(x.readFileSync(S.join(e,r,`flow.json`),`utf8`))))}catch{}return n}const hi=(e,t)=>String(t.startedAt).localeCompare(String(e.startedAt));function gi(){let e=[];for(let t of mi(Y()))t.archived?li(t):e.push(t);return e.sort(hi)}function _i(e){let t=e?.migrate??!0,n=mi(si()),r=new Set(n.map(e=>e.runId));for(let e of mi(Y()))e.archived&&!r.has(e.runId)&&n.push(t?li(e):e);return n.sort(hi)}function vi(){return[...gi(),..._i()].sort(hi)[0]??null}function yi(e,t=`all`){if(t===0)return[];let n=Er(S.join(X(e),`journal.jsonl`)).filter(e=>e.kind===`task`),r=u(b.cwd()),i=new Map(r.map(e=>[e.id,e])),a=e=>e?.name??e?.prompt?.replace(/\s+/g,` `).trim().slice(0,60)??null,o=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}}),s=new Set(o.map(e=>e.taskId));for(let t of r)t.flowRunId===e&&!s.has(t.id)&&o.push({taskId:t.id,name:a(t),status:t.status,tokens:null});return t===`all`?o:o.slice(-t)}function bi(e={}){let t;if(e.archived)t=_i();else{let e=[];t=gi().filter(t=>t.status===`running`||t.status===`queued`||he(t.endedAt??t.startedAt)<=6e5||(ci(t),e.push(t.runId),!1)),yr(b.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 xi(e,t={},n){let r,i,a;if(n){let e=Z(n);if(!e)throw Error(`No flow run "${n}".`);e.archived&&ui(e),r=e.name,i=e.script,a=t.args??e.args}else{let n=vr(e,t.cwd?S.resolve(t.cwd):b.cwd());r=n.name,i=n.path,a=t.args??{}}let o=n??oi(),s=X(o);x.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??T.cpus().length),maxTasks:Math.max(1,t.maxTasks??T.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 Si(e,t){let n=fi(e);!n||n.status!==`running`||$(X(e),n,{status:`failed`,error:t})}const Ci=`stop-keep-tasks`;function wi(e){try{return b.kill(e,0),!0}catch{return!1}}function Ti(t){if(!t.pid||!wi(t.pid))return!1;let n=e(t.pid),r=Date.parse(t.pidStartedAt??``);return n===null||!Number.isFinite(r)||n<=r+6e4}function Ei(e){let t=u(b.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 Er(S.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&&!a.includes(t.status)})}async function Di(e,t=[]){let n=b.cwd(),r=[];for(let i of new Set([...Ei(e),...t])){let e=g(n,i);if(!(!e||a.includes(e.status)))try{await Sr(n,e),r.push(i)}catch{}}return r}async function Oi(e,t={}){let n=e?Z(e):vi();if(!n)throw new K(`flow-failed`,e?`No flow run "${e}".`:`No flow runs.`,{hint:`Run one: coder flow run <name>`});if(n.status!==`running`)throw new K(`flow-failed`,`Run ${n.runId} is not running.`,{runId:n.runId,hint:`Result: coder flow result ${n.runId}`});let r=X(n.runId);if(!Ti(n))return $(r,n,{status:`failed`,error:`orchestrator died`}),{runId:n.runId,status:`failed`,stoppedTasks:[],keptTasks:Ei(n.runId)};let i=Ei(n.runId),o=S.join(r,Ci);t.keepTasks&&x.writeFileSync(o,``,`utf8`);try{b.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 K(`flow-failed`,`Run ${n.runId} did not stop within 5s.`,{runId:n.runId,hint:`Check it: coder flow result ${n.runId}`});let t=b.cwd(),r=[],o=[];for(let e of i){let n=g(t,e);n&&(n.status===`cancelled`?r.push(e):a.includes(n.status)||o.push(e))}return{runId:n.runId,status:e.status,stoppedTasks:r,keptTasks:o}}finally{if(t.keepTasks)try{x.unlinkSync(o)}catch{}}}async function*ki(e,t,n={}){let r=S.join(X(e),`events.jsonl`),i=n.tail??`all`,a=0;if(i!==`all`)try{a=Math.max(0,x.readFileSync(r,`utf8`).split(`
|
|
19
|
+
`).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?!Ti(c):t!==void 0&&!wi(t);if(c&&(c.pid||t!==void 0)&&n){Si(e,`orchestrator died`);break}await new Promise(e=>setTimeout(e,400)),c=Z(e)??c}yield*s()}function Ai(e,t,n,r){let i={...xi(e,t,r),pid:b.pid,pidStartedAt:new Date().toISOString()},{runId:a}=i,o=X(a);Q(o,i);let s=S.join(o,`journal.jsonl`),c=r?Er(s):[],l=new Dr(c,s),u={runId:a,runDir:o,cwd:t.cwd?S.resolve(t.cwd):b.cwd(),journal:l,semaphore:new jr(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 ji(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},()=>ii(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 K(`flow-failed`,e instanceof Error?e.message:String(e),{runId:o})}}async function Mi(e,t={},n={}){let{started:r}=Ai(e,t,n),i=Z(r.runId).script;return n.onStart?.({runId:r.runId,requestStop:r.markStopped,runningIds:()=>[...r.ctx.running]}),ji(r,i,Z(r.runId).name,t.args??{})}async function Ni(e,t={},n={}){let{started:r,args:i,name:a,replayable:o}=Ai(``,t,n,e),s=Z(e).script;return n.onStart?.({runId:e,requestStop:r.markStopped,runningIds:()=>[...r.ctx.running]}),o&&n.onReplay?.(o),ji(r,s,a,i)}export{Zt as $,O as $t,gr as A,F as At,fr as B,De as Bt,Ur as C,ct as Ct,xr as D,at as Dt,Sr as E,I as Et,or as F,Ke as Ft,Kn as G,be as Gt,Xn as H,A as Ht,sr as I,we as It,In as J,M as Jt,Jn as K,pe as Kt,rr as L,Pe as Lt,K as M,We as Mt,$n as N,qe as Nt,br as O,st as Ot,er as P,Ge as Pt,U as Q,Ne as Qt,dr as R,Ce as Rt,ki as S,ot as St,Cr as T,rt as Tt,Qn as U,ve as Ut,qn as V,Te as Vt,Yn as W,ge as Wt,Wn as X,Ee as Xt,Gn as Y,_e as Yt,W as Z,xe as Zt,Ni as _,Wt as _t,di as a,N as an,mn as at,Di as b,Kt as bt,Jr as c,ke as cn,yn as ct,gi as d,xn as dt,Fe as en,H as et,Xr as f,Tn as ft,Z as g,An as gt,xi as h,hn as ht,kr as i,Re as in,Cn as it,vr as j,Je as jt,yr as k,Ye as kt,vi as l,Se as ln,bn as lt,Yr as m,vn as mt,li as n,ye as nn,Jt as nt,ai as o,Ie as on,En as ot,Si as p,wn as pt,Ln as q,me as qt,bi as r,Le as rn,Yt as rt,yi as s,Oe as sn,G as st,Ci as t,j as tn,V as tt,_i as u,kn as ut,X as v,B as vt,Er as w,nt as wt,Oi as x,lt as xt,Mi as y,qt as yt,ir as z,he as zt};
|
package/dist/sdk.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{C as e,I as t,v as n,x as r}from"./app-server-bHl6RBZ2.js";import{B as i,Dt as a,E as o,I as s,M as c,R as l,St as u}from"./runtime-
|
|
1
|
+
import{C as e,I as t,v as n,x as r}from"./app-server-bHl6RBZ2.js";import{B as i,Dt as a,E as o,I as s,M as c,R as l,St as u}from"./runtime-DtukZ1m8.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-cC4ahBbt.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 s({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}):l(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 o(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 a(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{c 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};
|
|
@@ -1,7 +1,7 @@
|
|
|
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{$t as E,At as D,Bt as O,Dt as ee,G as te,Gt as ne,H as re,Ht as k,J as ie,K as ae,Kt as A,Mt as oe,Nt as se,Q as j,U as ce,Ut as le,V as ue,Vt as de,W as fe,Wt as pe,X as me,Xt as M,Y as he,Yt as ge,Z as _e,Zt as ve,_t as ye,an as N,at as P,bt as be,ct as F,en as xe,et as Se,ft as Ce,g as we,gt as Te,ht as Ee,in as I,it as De,k as Oe,kt as ke,ln as Ae,lt as L,mt as R,nn as je,nt as Me,ot as z,pt as Ne,q as Pe,rn as B,st as V,tn as H,tt as U,ut as Fe,vt as W,yt as Ie,z as Le,zt as Re}from"./runtime-
|
|
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{$t as E,At as D,Bt as O,Dt as ee,G as te,Gt as ne,H as re,Ht as k,J as ie,K as ae,Kt as A,Mt as oe,Nt as se,Q as j,U as ce,Ut as le,V as ue,Vt as de,W as fe,Wt as pe,X as me,Xt as M,Y as he,Yt as ge,Z as _e,Zt as ve,_t as ye,an as N,at as P,bt as be,ct as F,en as xe,et as Se,ft as Ce,g as we,gt as Te,ht as Ee,in as I,it as De,k as Oe,kt as ke,ln as Ae,lt as L,mt as R,nn as je,nt as Me,ot as z,pt as Ne,q as Pe,rn as B,st as V,tn as H,tt as U,ut as Fe,vt as W,yt as Ie,z as Le,zt as Re}from"./runtime-DtukZ1m8.js";import G from"node:process";import K from"node:fs";import q from"node:path";import{spawnSync as ze}from"node:child_process";import Be from"node:os";import{fileURLToPath as Ve}from"node:url";import*as J from"zod/mini";import He from"node:crypto";import Ue from"node:http";let We=0;function Ge(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 Ke(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:Ge(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 qe=class{send;model;responseId=`resp_bridge_${++We}`;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
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 Je(e,t=`chat`){let n=t===`responses`,r=De(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=He.randomBytes(16).toString(`hex`),c=Ue.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(Ke(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 qe(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 Ye(e,t,n){let r=e.envKey?G.env[e.envKey]:void 0,i=!1;for(let a of De(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 Xe(e){let t=await Ye(e,`responses`,{model:e.model,input:[],stream:!1});if(`baseUrl`in t)return{wireApi:`responses`,baseUrl:t.baseUrl};let n=await Ye(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*Ze(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=ke(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 Qe(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"`}))}));B(n,1,`task watch`);let r=N(t),a=I(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(`${E.dim(`[coder] task ${a.id} ${a.status} — watching (Ctrl-C to stop)`)}\n`);let e=[`${E.dim(`agent`.padEnd(8))} ${ne(a)}`,...ve(a,E)];G.stdout.write(`${e.join(`
|
|
3
3
|
`)}\n`),a.prompt&&G.stdout.write(`${je(a.prompt,E,{truncate:!1}).join(`
|
|
4
|
-
`)}\n`)}for await(let e of Ze(r,a.id,{tail:o})){let n=e.kind===`steer`?2**53-1:l;if(t.json){let t=e.message?{...e,message:Ae(e.message,n,{plain:!0})}:e;G.stdout.write(`${JSON.stringify(t)}\n`)}else{let t=e.message??e.kind;t&&G.stdout.write(`${E.dim(`[coder]`)} ${Ae(t,n)}\n`)}}let u=s(r,g(r,a.id)??a),d=D(q.join(i(r,a.id),`result.json`));if(t.json)H({taskId:a.id,status:u.status,result:d});else{let e=u.status===`completed`?`(no final message)`:`(task ${u.status})`;G.stdout.write(`\n${le(d,u.error,e)}\n`);let t=d?.tokens?` tokens=${ge(d.tokens,d.model??u.model)}`:``;G.stderr.write(`${E.dim(`[coder] task=${a.id} status=${u.status}${t}`)}\n`)}G.exit(u.status===`completed`?0:1)}async function $e(e,t,n,r={}){if(t.status!==`running`)return null;let i=t.engine===`claude`?await(r.claude??me)(t.steerEndpoint,n):await(r.codex??be)(e,{threadId:t.threadId,turnId:t.turnId,text:n});if(i.steered)return d(e,t.id,{kind:`steer`,message:`Steer accepted live:\n${n}`}),{taskId:t.id,steered:`live`};if(!i.retryable)throw d(e,t.id,{kind:`error`,message:`Live steer failed: ${i.detail}`}),Error(`Could not steer running task ${t.id}: ${i.detail}`);let a=g(e,t.id)??t;return u.includes(a.status)?(c(e,a.id,n),d(e,a.id,{kind:`steer`,message:`Steer queued for the next turn:\n${n}`}),{taskId:a.id,steered:`queued`}):null}async function et(e,t,n,r={},i={}){if(!t.threadId)throw Error(`Task ${t.id} has no thread to steer yet (status: ${t.status}).`);return await $e(e,t,n,i)||(tt(e,t,n,r),{taskId:t.id,steered:`resumed`})}function tt(t,n,r,i){e(t,n.id,{status:`queued`,resumedAt:new Date().toISOString(),currentPrompt:r,resumeThreadId:n.threadId,steerEndpoint:null,model:i.model??n.model??null,effort:i.effort??n.effort??null,permissions:i.permissions??n.permissions,error:void 0}),d(t,n.id,{kind:`steer`,message:`Resuming with steer:\n${r}`}),Le(n.cwd??t,n.id)}async function nt(e){let{options:t,positionals:n}=v(e,J.object({...b,model:C,effort:C,permissions:C,background:S,wait:S})),r=N(t),[i,...a]=n,o=a.join(` `).trim();(!i||!o)&&k(`Missing task id or follow-up text.`,{hint:[`Usage: coder task steer <task-id> "<follow-up>" [--wait]`,`Help: coder task steer --help`]});let s=I(r,i);s.threadId||k(`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 et(r,s,o,{model:t.model,effort:t.effort,permissions:t.permissions});return rt(r,c.taskId,{steered:c.steered,options:t})}async function rt(e,t,{steered:n,options:r}){if(n===`queued`){if(r.json){H({taskId:t,steered:`queued`});return}G.stdout.write(`${E.dim(`[coder]`)} follow-up queued for task ${E.cyan(t)}; it runs when the current turn finishes.\n`),r.wait&&G.stdout.write(`\n${E.dim(`[coder] --wait is not available for a queued follow-up; check: coder task result ${t}`)}\n`);return}if(!r.wait){if(r.json){H({taskId:t,steered:n});return}G.stdout.write(n===`live`?`${E.dim(`[coder]`)} steered follow-up into running task ${E.cyan(t)}.\n`:`${E.dim(`[coder]`)} resumed task ${E.cyan(t)} with the follow-up (same thread, same id).\n`),G.stdout.write(`\n${E.dim(` result: coder task result ${t}`)}\n`);return}let a=g(e,t),o=a?await T(e,a):null,s=D(q.join(i(e,t),`result.json`));r.json?H({taskId:t,status:o?.status??null,finalMessage:s?.finalMessage??null}):(G.stdout.write(`\n${s?.finalMessage||`(no final message)`}\n\n`),G.stderr.write(`${E.dim(`[coder] task=${t} status=${o?.status??`unknown`}`)}\n`)),G.exitCode=o?.status===`completed`?0:1}const it=[`Read`,`Glob`,`Grep`];function at(e,t,n){return`You are a read-only sidecar answering a question ABOUT a coder task.
|
|
4
|
+
`)}\n`)}for await(let e of Ze(r,a.id,{tail:o})){let n=e.kind===`steer`?2**53-1:l;if(t.json){let t=e.message?{...e,message:Ae(e.message,n,{plain:!0})}:e;G.stdout.write(`${JSON.stringify(t)}\n`)}else{let t=e.message??e.kind;t&&G.stdout.write(`${E.dim(`[coder]`)} ${Ae(t,n)}\n`)}}let u=s(r,g(r,a.id)??a),d=D(q.join(i(r,a.id),`result.json`));if(t.json)H({taskId:a.id,status:u.status,result:d});else{let e=u.status===`completed`?`(no final message)`:`(task ${u.status})`;G.stdout.write(`\n${le(d,u.error,e)}\n`);let t=d?.tokens?` tokens=${ge(d.tokens,d.model??u.model)}`:``;G.stderr.write(`${E.dim(`[coder] task=${a.id} status=${u.status}${t}`)}\n`)}G.exit(u.status===`completed`?0:1)}async function $e(e,t,n,r={}){if(t.status!==`running`)return null;let i=t.engine===`claude`?await(r.claude??me)(t.steerEndpoint,n):await(r.codex??be)(e,{endpoint:t.steerEndpoint,threadId:t.threadId,turnId:t.turnId,text:n});if(i.steered)return d(e,t.id,{kind:`steer`,message:`Steer accepted live:\n${n}`}),{taskId:t.id,steered:`live`};if(!i.retryable)throw d(e,t.id,{kind:`error`,message:`Live steer failed: ${i.detail}`}),Error(`Could not steer running task ${t.id}: ${i.detail}`);let a=g(e,t.id)??t;return u.includes(a.status)?(c(e,a.id,n),d(e,a.id,{kind:`steer`,message:`Steer queued for the next turn:\n${n}`}),{taskId:a.id,steered:`queued`}):null}async function et(e,t,n,r={},i={}){if(!t.threadId)throw Error(`Task ${t.id} has no thread to steer yet (status: ${t.status}).`);return await $e(e,t,n,i)||(tt(e,t,n,r),{taskId:t.id,steered:`resumed`})}function tt(t,n,r,i){e(t,n.id,{status:`queued`,resumedAt:new Date().toISOString(),currentPrompt:r,resumeThreadId:n.threadId,steerEndpoint:null,model:i.model??n.model??null,effort:i.effort??n.effort??null,permissions:i.permissions??n.permissions,error:void 0}),d(t,n.id,{kind:`steer`,message:`Resuming with steer:\n${r}`}),Le(n.cwd??t,n.id)}async function nt(e){let{options:t,positionals:n}=v(e,J.object({...b,model:C,effort:C,permissions:C,background:S,wait:S})),r=N(t),[i,...a]=n,o=a.join(` `).trim();(!i||!o)&&k(`Missing task id or follow-up text.`,{hint:[`Usage: coder task steer <task-id> "<follow-up>" [--wait]`,`Help: coder task steer --help`]});let s=I(r,i);s.threadId||k(`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 et(r,s,o,{model:t.model,effort:t.effort,permissions:t.permissions});return rt(r,c.taskId,{steered:c.steered,options:t})}async function rt(e,t,{steered:n,options:r}){if(n===`queued`){if(r.json){H({taskId:t,steered:`queued`});return}G.stdout.write(`${E.dim(`[coder]`)} follow-up queued for task ${E.cyan(t)}; it runs when the current turn finishes.\n`),r.wait&&G.stdout.write(`\n${E.dim(`[coder] --wait is not available for a queued follow-up; check: coder task result ${t}`)}\n`);return}if(!r.wait){if(r.json){H({taskId:t,steered:n});return}G.stdout.write(n===`live`?`${E.dim(`[coder]`)} steered follow-up into running task ${E.cyan(t)}.\n`:`${E.dim(`[coder]`)} resumed task ${E.cyan(t)} with the follow-up (same thread, same id).\n`),G.stdout.write(`\n${E.dim(` result: coder task result ${t}`)}\n`);return}let a=g(e,t),o=a?await T(e,a):null,s=D(q.join(i(e,t),`result.json`));r.json?H({taskId:t,status:o?.status??null,finalMessage:s?.finalMessage??null}):(G.stdout.write(`\n${s?.finalMessage||`(no final message)`}\n\n`),G.stderr.write(`${E.dim(`[coder] task=${t} status=${o?.status??`unknown`}`)}\n`)),G.exitCode=o?.status===`completed`?0:1}const it=[`Read`,`Glob`,`Grep`];function at(e,t,n){return`You are a read-only sidecar answering a question ABOUT a coder task.
|
|
5
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
6
|
|
|
7
7
|
Task metadata:
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "coder",
|
|
3
3
|
"displayName": "Coder",
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.15",
|
|
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/dist/runtime-9CD0_h4s.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import{A as e,B as t,C as n,F as r,G as i,H as a,I as o,L as s,M as c,N as l,O as u,P as d,T as f,W as p,f as m,i as h,j as g,l as _,m as v,o as y,r as b,s as ee,u as te,v as ne,w as re,y as ie}from"./app-server-bHl6RBZ2.js";import{createRequire as ae}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 oe from"node:os";import{fileURLToPath as se,pathToFileURL as ce}from"node:url";import*as E from"zod/mini";import le from"node:net";import ue,{randomUUID as de}from"node:crypto";import{AsyncLocalStorage as fe}from"node:async_hooks";function pe(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),yellow:e=>r(`33`,e)}}const D=pe(x.stdout),O=pe(x.stderr);function me(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 k(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${me(i,O)}\n`),x.exit(n)}function A(e){x.stdout.write(`${JSON.stringify(e,null,2)}\n`)}function he(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 ge(e){let t=Date.parse(e??``);return Number.isFinite(t)?Math.max(0,Date.now()-t):0}function _e(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 j(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(+(e<1e4))}k`:`${(e/1e6).toFixed(1)}M`}function ve(e,t){let n=[`in ${j(e.input)}`,...e.cachedInput?[`cached ${j(e.cachedInput)}`]:[],`out ${j(e.output)}`];return`${j(e.total)} (${n.join(` · `)}) on ${t||`default model`}`}function ye(e,t,n,r=D){let i=e?.error?.message??t;return e?.finalMessage||(i?`${r.red(`error:`)} ${i}`:n)}function be(e,t=D,{truncate:n=!0}={}){let r=e=>e.split(`
|
|
5
|
-
`).map(e=>` ${t.dim(e)}`);return!n||e.length<=1e3?[t.dim(`prompt:`),...r(e)]:[t.dim(`prompt:`),...r(e.slice(0,500).trimEnd()),t.light(` … <${e.length-1e3} chars trimmed> …`),...r(e.slice(-500).trimStart())]}function xe(e){return[e.agent??`-`,e.model,e.model?e.effort:null].filter(Boolean).join(`/`)}function Se(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 Ce(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 we=6e5,Te=12e4;function Ee(e,t){return e.length>t?`${e.slice(0,t-1)}…`:e.padEnd(t)}function De(e){return` ${D.bold(D.green(`✔`))} ${e}`}function Oe(e){return` ${D.bold(D.red(`✘`))} ${e}`}function ke(e=x.stdout){try{return e.getWindowSize?.()[0]??e.columns}catch{return e.columns}}function Ae(e=x.stdout){try{return e.getWindowSize?.()[1]??e.rows}catch{return e.rows}}function je(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 Me(e){let t=0;for(let n of e.replace(/\x1b\[[0-9;]*m/g,``))t+=je(n.codePointAt(0));return t}function Ne(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=je(o);if(n+c>t-1)return`${r}\x1b[0m${D.dim(`…`)}`;r+=s,n+=c,i+=s.length}return r}function Pe(){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 Fe=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=ke(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=ke(this.stream),t=e?this.lines.map(t=>Ne(t,e-1)):this.lines,n=Ae(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(Me),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 Ie(e,t=0){let n=e.padEnd(t);return e===`running`?D.green(n):e===`waiting-approval`?D.yellow(n):e===`failed`||e===`cancelled`?D.red(n):e===`completed`?D.blue(n):D.dim(n)}function Le(e,t,n=!1){n?A({taskId:e,status:`awaiting-approval`,approval:t}):(x.stdout.write(`Approval needed for task ${e}: ${t.summary}\n`),x.stderr.write(`\n${me([`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 Re(e,t,n){if(e.length>t){let r=e.slice(t);k(`Unexpected argument${r.length>1?`s`:``}: ${r.join(` `)}`,{hint:`Help: coder ${n} --help`})}}function M(e){return e.cwd?C.resolve(String(e.cwd)):x.cwd()}function ze(e,t){let r=n(e,t);return r||k(t?`No task found for "${t}".`:`No tasks found for this workspace.`,{hint:t?[`List tasks: coder task list`,`Start one: coder run "<text>"`]:[`Start one: coder run "<text>"`]}),r}const N=`@wular/coder`,Be=`https://registry.npmjs.org/${N}/latest`;function Ve(){return C.join(r(),`update-check.json`)}function He(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 Ue(){try{return JSON.parse(S.readFileSync(Ve(),`utf8`))}catch{return null}}function We(e){try{S.mkdirSync(r(),{recursive:!0}),S.writeFileSync(Ve(),JSON.stringify(e))}catch{}}function Ge(){try{S.rmSync(Ve(),{force:!0})}catch{}}function Ke(e,t){if(x.env.CODER_NO_UPDATE_CHECK||x.env.CI)return;let n=Ue();if(n?.latest&&He(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 qe(e){let t=Ue()?.latest??null;try{let e=new AbortController,n=setTimeout(()=>e.abort(),3e3),r=await fetch(Be,{signal:e.signal,headers:{accept:`application/json`}});if(clearTimeout(n),r.ok){let e=await r.json();e?.version&&(t=e.version)}}catch{}We({checkedAt:Date.now(),latest:t,current:e})}function Je(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`,`${N}@latest`]}:/\/\.pnpm\//.test(n)||/\/pnpm(-global)?\//i.test(n)||/\/Library\/pnpm\//.test(n)?{pm:`pnpm`,command:[`pnpm`,`add`,`-g`,`${N}@latest`]}:/\/\.config\/yarn\/global\//.test(n)||/\/yarn\/global\//.test(n)||/\/Yarn\/Data\/global\//.test(n)?{pm:`yarn`,command:[`yarn`,`global`,`add`,`${N}@latest`]}:{pm:`npm`,command:[`npm`,`install`,`-g`,`${N}@latest`]}}function P(e){try{return JSON.parse(S.readFileSync(e,`utf8`))}catch{return null}}function Ye(e,t){let n=`${e}.tmp`;S.writeFileSync(n,`${JSON.stringify(t,null,2)}\n`,`utf8`),S.renameSync(n,e)}function Xe(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 Ze=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(`.`)),Qe=[/\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)/],$e=new Set([`status`,`log`,`diff`,`show`,`blame`,`rev-parse`,`ls-files`,`ls-tree`,`cat-file`,`describe`,`shortlog`,`grep`,`branch`,`stash`]);function et(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 tt(e){return e.trim().split(/\s+/).filter(Boolean)}function nt(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 $e.has(t)?{decision:`accept`,reason:`git ${t} is read-only`}:Ze.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 rt(e,t={}){let n=et(String(e??``));if(!n.trim())return{decision:`escalate`,reason:`empty command`};for(let e of Qe)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=rt(n,t);if(r.decision===`decline`)return r;r.decision===`escalate`&&(e=r)}return e}let i=tt(n),a=C.basename(i[0]??``);if(a===`git`)return nt(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 it(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 at(e){return C.join(e,`approvals`)}function ot(e){let t=at(e);return S.existsSync(t)?S.readdirSync(t).filter(e=>e.endsWith(`.request.json`)).flatMap(e=>{let n=e.replace(/\.request\.json$/,``),r=P(C.join(t,e));if(!r)return[];let i=P(C.join(t,`${n}.response.json`));return[{...r,id:n,response:i}]}).sort((e,t)=>String(e.createdAt??``).localeCompare(String(t.createdAt??``))):[]}function st(e,t,n){let r=at(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 F(e,t,{timeoutMs:n,onEvent:r}){let i=at(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 ${C.basename(e)} ${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 F(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=rt(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 F(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=it(i,e);return a?.({kind:`approval-decision`,method:o,decision:u.decision,reason:u.reason,summary:l}),u.decision===`escalate`?{decision:await F(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,n=400){let r=t;for(;;){if(a.includes(r.status))return{job:r,reason:`terminal`};let t=ot(o(e,r.id)).filter(e=>!e.response);if(t[0])return{job:r,reason:`approval`,approval:{id:t[0].id,summary:String(t[0].summary??``)}};await new Promise(e=>setTimeout(e,n)),r=d(e,g(e,r.id)??r)}}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,t){let n=[];for(let r of e.matchAll(/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/gm)){let e=t===`delete`,i=Number(e?r[1]:r[3]),a=Number((e?r[2]:r[4])??1);!Number.isFinite(i)||!Number.isFinite(a)||n.push(a<=1?`L${i}`:`L${i}-L${i+a-1}`)}return n}function yt(e){try{let t=S.readFileSync(e,`utf8`),n=t?t.split(/\r\n|\r|\n/).length-+!!t.endsWith(`
|
|
10
|
-
`):0;return n>0?[n===1?`L1`:`L1-L${n}`]:[]}catch{return[]}}function bt(e,t){let n=typeof e.kind==`string`?e.kind:e.kind?.type??`change`,r=e.path||`(unknown path)`,i=vt(e.diff??``,n),a=i.length||n!==`add`||!t?i:yt(r);return`${n} ${r}${typeof e.kind==`object`&&e.kind?.move_path?` -> ${e.kind.move_path}`:``}${a.length?` ${a.join(`, `)}`:``}`}function xt(e,t=!1){return(e.changes??[]).map(e=>bt(e,t)).join(`; `)}function St(e){let t=e.trim().split(` `)[0]??``;return t===`/dev/null`?``:t.replace(/^[ab]\//,``)}function Ct(e){let t=new Map,n=``,r=``;for(let i of e.split(/\r?\n/)){if(i.startsWith(`--- `)){n=St(i.slice(4));continue}if(i.startsWith(`+++ `)){r=St(i.slice(4));continue}let e=/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/.exec(i);if(!e)continue;let a=Number(e[1]),o=Number(e[2]??1),s=Number(e[3]),c=Number(e[4]??1),l=c===0,u=(l?n:r)||r||n||`(unknown path)`,d=l?a:s,f=l?o:c,p=f<=1?`L${d}`:`L${d}-L${d+f-1}`,m=t.get(u)??[];m.push(p),t.set(u,m)}return[...t].map(([e,t])=>`${e} ${t.join(`, `)}`).join(`; `)}function wt(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 Tt(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 Et(e){return String(e??``).replace(/\s+/g,` `).trim()}function I(e){if(!e)return[];if(typeof e==`string`){let t=Et(e);return t?[t]:[]}if(Array.isArray(e))return e.flatMap(e=>I(e));if(typeof e==`object`){let t=e;if(typeof t.text==`string`)return I(t.text);if(`summary`in t)return I(t.summary);if(`content`in t)return I(t.content);if(`parts`in t)return I(t.parts)}return[]}function Dt(e,t){let n=[];for(let r of[...e,...t]){let e=Et(r);!e||n.includes(e)||n.push(e)}return n}function L(e,t,n=null,r={}){!e||!t||e({message:t,phase:n,...r})}function Ot(e){switch(e.type){case`commandExecution`:return{message:`Running command: ${String(e.command??``).trim()}`,phase:`running`};case`fileChange`:return{message:`Applying file changes: ${xt(e)||`(details unavailable)`}.`,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 kt(e){switch(e.type){case`agentMessage`:{let t=String(e.text??``).trim();return t?{message:t,phase:null}:null}case`reasoning`:{let t=I(e.summary)[0]?.split(`
|
|
11
|
-
`)[0]??``;return t?{message:`Thinking: ${t.length>100?`${t.slice(0,100)}…`:t}`,phase:null}:null}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}: ${xt(e,!0)||`(details unavailable)`}.`,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 At(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,lastDiffSummary:``,itemIndex:new Map,onProgress:t.onProgress??null,onHeartbeat:t.onHeartbeat??null}}function jt(e){e.completionTimer&&=(clearTimeout(e.completionTimer),null)}function Mt(e,t=null){e.completed||(jt(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 Nt(e){e.completed||e.finalTurn||!e.finalAnswerSeen||e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||(jt(e),e.completionTimer=setTimeout(()=>{e.completionTimer=null,!(e.completed||e.finalTurn||!e.finalAnswerSeen)&&(e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||Mt(e,null))},250),e.completionTimer.unref?.())}function Pt(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 Ft(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),Nt(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,Nt(e)));return}if(t.type===`reasoning`&&n===`completed`){e.reasoningSummary=Dt(e.reasoningSummary,I(t.summary));return}if(t.type===`fileChange`&&n===`completed`){e.fileChanges.push(t);return}t.type===`commandExecution`&&n===`completed`&&e.commandExecutions.push(t)}function It(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),L(e.onProgress,`Turn started (${t.params.turn.id}).`,`starting`,{threadId:t.params.threadId??null,turnId:t.params.turn.id??null});break;case`item/started`:Ft(e,t.params.item,`started`,t.params.threadId??null);{let n=Ot(t.params.item);L(e.onProgress,n?.message,n?.phase??null)}break;case`item/completed`:Ft(e,t.params.item,`completed`,t.params.threadId??null);{let n=kt(t.params.item);L(e.onProgress,n?.message,n?.phase??null)}break;case`thread/tokenUsage/updated`:{let n=wt(t.params?.tokenUsage?.total??t.params?.tokenUsage),r=ht(t);n&&r&&e.tokenUsageByThread.set(r,n);break}case`turn/diff/updated`:{let n=Ct(String(t.params?.diff??``));n&&n!==e.lastDiffSummary&&(e.lastDiffSummary=n,L(e.onProgress,`Changed lines: ${n}.`,`editing`));break}case`item/autoApprovalReview/completed`:{let n=t.params?.review??{},r=t.params?.action??{},i=r.command??r.type??``;L(e.onProgress,`auto-review ${n.status}${n.riskLevel?` (${n.riskLevel} risk)`:``}: ${pt(i)}${n.rationale?` — ${pt(n.rationale,120)}`:``}`,null);break}case`error`:e.error=t.params.error,L(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),Nt(e);break}L(e.onProgress,`Turn ${t.params.turn.status}.`,`finalizing`),Mt(e,t.params.turn)}}async function Lt(e,t,n,r={}){let i=At(t,r),a=e.notificationHandler;e.setNotificationHandler(e=>{if(!i.turnId){i.bufferedNotifications.push(e);return}if(e.method===`thread/started`){It(i,e);return}if(!Pt(i,e)){a?.(e);return}It(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)Pt(i,e)?It(i,e):a?.(e);return i.bufferedNotifications.length=0,e.turn?.status&&e.turn.status!==`inProgress`&&Mt(i,e.turn),await i.completion}finally{jt(i),e.setNotificationHandler(a??null),e.setServerRequestHandler(null)}}async function Rt(e,t){let n=null;try{n=await b.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 b.connect(e,{disableBroker:!0});try{return await t(s)}finally{await s.close()}}}function R(e){let t=h(`codex`,[`--version`],{cwd:e});if(!t.available)return t;let n=h(`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 zt(e){let t=R(e);if(!t.available)return{available:!1,loggedIn:!1,detail:t.detail};let n=null;try{n=await b.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 Bt(e,{threadId:t,turnId:n}){if(!t||!n)return{interrupted:!1,detail:`missing threadId or turnId`};let r=null;try{return r=await b.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 Vt(e,{threadId:t,turnId:n,text:r},i={}){if(!t)return{steered:!1,retryable:!0,detail:`missing active threadId`};if(!n)return{steered:!1,retryable:!0,detail:`missing active turnId`};let a=r.trim();if(!a)return{steered:!1,retryable:!1,detail:`empty follow-up`};let o=null;try{o=i.connect?await i.connect():await b.connect(e,{reuseExistingBroker:!0});let r=await o.request(`turn/steer`,{threadId:t,input:[{type:`text`,text:a,text_elements:[]}],expectedTurnId:n});return r?.turnId===n?{steered:!0,retryable:!1,detail:`Steered follow-up into ${n} on ${t}.`}:{steered:!1,retryable:!1,detail:`turn/steer returned unexpected turnId ${String(r?.turnId??`(missing)`)}; expected ${n}`}}catch(e){let t=e,n=e instanceof Error?e.message:String(e);return{steered:!1,retryable:t.rpcCode===-32001||t.code===`ENOENT`||t.code===`ECONNREFUSED`||/no active turn|active turn.*(?:ended|completed)|turn.*not active|expected turn.*(?:mismatch|does not match)|turn id.*(?:mismatch|does not match)/i.test(n),detail:n}}finally{await o?.close().catch(()=>{})}}async function Ht(e,t={}){let n=R(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 Rt(e,async n=>{let a;if(t.resumeThreadId)L(t.onProgress,`Resuming thread ${t.resumeThreadId}.`,`starting`),p(t.resumeThreadId)&&await i(t.resumeThreadId),a=(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`,...t.approvalsReviewer?{approvalsReviewer:t.approvalsReviewer}:{}})).thread.id;else if(L(t.onProgress,`Starting Codex task thread.`,`starting`),a=(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`,...t.approvalsReviewer?{approvalsReviewer:t.approvalsReviewer}:{},serviceName:`coder_runtime`,ephemeral:t.ephemeral??!1})).thread.id,!(t.ephemeral??!1))try{await n.request(`thread/name/set`,{threadId:a,name:mt(r)})}catch(e){let t=String(e?.message??e??``);if(!t.includes(`unknown variant`)&&!t.includes(`unknown method`))throw e}L(t.onProgress,`Thread ready (${a}).`,`starting`,{threadId:a});let o=await Lt(n,a,()=>n.request(`turn/start`,{threadId:a,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:o.finalTurn?.status===`completed`?0:1,threadId:a,turnId:o.turnId,finalMessage:o.lastAgentMessage,reasoningSummary:o.reasoningSummary,turn:o.finalTurn,error:o.error,stderr:ft(n.stderr),fileChanges:o.fileChanges,touchedFiles:_t(o.fileChanges),tokens:Tt(o),model:t.model??null,commandExecutions:o.commandExecutions}})}const Ut={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:[]}},z={spark:`gpt-5.3-codex-spark`,luna:`gpt-5.6-luna`,terra:`gpt-5.6-terra`,sol:`gpt-5.6-sol`},B=new Set([`low`,`medium`,`high`]),V={haiku:`haiku`,sonnet:`sonnet`,opus:`opus`,fable:`fable`},H=new Set([`low`,`medium`,`high`]),Wt={"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`}},Gt={"read-only":[`--permission-mode`,`dontAsk`,`--disallowedTools`,`Edit`,`Write`,`NotebookEdit`],"workspace-write":[`--permission-mode`,`acceptEdits`],auto:[`--permission-mode`,`auto`]},Kt=[`--permission-mode`,`dontAsk`,`--disallowedTools`,`Edit`,`Write`,`NotebookEdit`,`Bash`,`WebFetch`,`WebSearch`,`Task`],qt=/failIfUnavailable|sandbox\b[^.\n]*?(?:failed|could ?n[o']t|cannot|unavailable|not available|not supported)/i;function Jt(e){return e.flatMap(e=>le.isIPv6(e)?[`[${e}]`]:e.startsWith(`[`)||e.includes(`:`)||le.isIP(e)?[e]:[e,`*.${e}`])}function Yt(e,t,n=[],r=[]){return JSON.stringify(e===`read-only`?{...r.length?{permissions:{additionalDirectories:r}}:{},sandbox:{enabled:!0,failIfUnavailable:!0,autoAllowBashIfSandboxed:!0,filesystem:{denyWrite:[t,...r]}}}:{sandbox:{enabled:!0,autoAllowBashIfSandboxed:!0,...e===`auto`&&n.length?{network:{allowedDomains:Jt(n)}}:{}}})}const Xt=E.enum([`codex`,`claude`]),Zt=E.enum([`codex`,`claude`,`custom`]),Qt=E.enum([`low`,`medium`,`high`]),$t=E.enum([`read-only`,`workspace-write`,`auto`]),en=E.partial(E.strictObject({model:E.string().check(E.minLength(1)),effort:Qt,permissions:$t})),tn=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())}),nn=E.strictObject({provider:Xt,model:E.string().check(E.minLength(1)),effort:E.optional(Qt),disabled:E.optional(E.boolean())}),rn=E.strictObject({disabled:E.boolean()}),an=E.union([tn,nn,rn]),on=E.strictObject({escalationTimeoutMs:E.number().check(E.positive()),allowedNetworkHosts:E.array(E.string())}),sn=E.strictObject({chain:E.array(Zt).check(E.minLength(1)),agents:E.partial(E.strictObject({codex:en,claude:en,custom:en})),models:E.optional(E.record(E.string().check(E.regex(/^[a-z0-9][a-z0-9./_-]*$/i,`model name`)),an)),approvals:on}),cn=E.partial(E.extend(sn,{approvals:E.partial(on)}));function U(e){return`baseUrl`in e}function W(e){return`provider`in e}function G(e){let t=cn.safeParse(e);if(!t.success)return t.error.issues.map(e=>`${e.path.join(`.`)||`config`}: ${e.message}`);let n=un(Ut,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(W(i)){let t=n.models?.[i.model];t&&!U(t)&&r.push(`models.${e}: alias target "${i.model}" is itself a config entry`)}}return r}function ln(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 un(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))n[e]=i&&typeof i==`object`&&!Array.isArray(i)&&r?.[e]&&typeof r[e]==`object`?un(r[e],i):i;return n}function dn(){return C.join(r(),`config.json`)}function fn(e){let t=s(e),n=Ut;for(let e of[dn(),C.join(t,`coder.config.json`)]){let t=ln(e);if(!t)continue;let r=G(t);if(r.length)throw Error(`Invalid config in ${e}:\n ${r.join(`
|
|
12
|
-
`)}`);n=un(n,t)}let r=G(n);if(r.length)throw Error(`Invalid merged config:\n ${r.join(`
|
|
13
|
-
`)}`);return n}function pn(e){return e.replace(/\/+$/,``).replace(/\/(chat\/completions|completions|responses)$/,``)}function mn(e,t,n){let r=[C.join(s(e),`coder.config.json`),dn()];for(let e of r){let r;try{r=ln(e)}catch{continue}if(r?.models?.[t])return Object.assign(r.models[t],n),!G(r).length&&(S.writeFileSync(e,`${JSON.stringify(r,null,2)}\n`,`utf8`),!0)}return!1}function hn(e){return/\/(chat\/completions|completions|responses)\/*$/.test(e)}function gn(e,t){let n=pn(e);return hn(e)||/\/v\d+(alpha|beta)?$/.test(n)?[`${n}/${t}`]:[`${n}/${t}`,`${n}/v1/${t}`]}function _n(e,t,n){let r=t?e.models?.[t]:void 0;if(!t||!r||!U(r))return null;let i=`coder-${t}`;return{model:r.model,modelProvider:i,configOverrides:{[`model_providers.${i}`]:{name:t,base_url:n?.url??pn(r.baseUrl),...r.envKey&&!n?{env_key:r.envKey}:{},wire_api:`responses`}}}}function vn(e){return e?z[e]??e:null}function yn(e){return e in z||e in V}function bn(e,t){return!!(t&&e.models?.[t]?.disabled)}function xn(e,t){if(bn(e,t))throw Error(`model "${t}" is disabled in config`)}function Sn(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=>B.has(e)||H.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&&W(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 V?`claude`:i&&s&&U(s)?`custom`:`codex`;let c=t.agents[r]??{},l=i??c.model??null;return xn(t,l),{agent:r,model:l,effort:a??c.effort??null}}function Cn(e){let t=dn();return S.mkdirSync(C.dirname(t),{recursive:!0}),S.writeFileSync(t,`${JSON.stringify(e,null,2)}\n`,`utf8`),t}function wn(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 Tn(e){if(!e)return 0;let t=e.split(/\r\n|\r|\n/);return t.at(-1)===``&&t.pop(),Math.max(1,t.length)}function En(e,t,n=!1){if(!t)return[];let r;try{r=S.readFileSync(e,`utf8`)}catch{return[]}let i=[],a=0;for(;a<=r.length;){let e=r.indexOf(t,a);if(e<0)break;let o=Tn(r.slice(0,e))+1,s=Math.max(1,Tn(t));if(i.push(s===1?`L${o}`:`L${o}-L${o+s-1}`),!n)break;a=e+Math.max(t.length,1)}return i.length>4?[...i.slice(0,4),`+${i.length-4} matches`]:i}function Dn(e,t,n){let r=String(t.file_path??t.notebook_path??``),i=r?C.isAbsolute(r)?r:C.resolve(n,r):``;if(e===`Write`){let e=Tn(String(t.content??``));return`Write ${r||`(unknown path)`} ${e?`L1-L${e}`:`(empty file)`}`}if(e===`Edit`){let e=En(i,String(t.old_string??``),t.replace_all===!0);return`Edit ${r||`(unknown path)`}${e.length?` ${e.join(`, `)}`:``}`}if(e===`MultiEdit`){let e=Array.isArray(t.edits)?t.edits:[],n=e.flatMap(e=>En(i,String(e?.old_string??``),e?.replace_all===!0));return`MultiEdit ${r||`(unknown path)`}${n.length?` ${n.join(`, `)}`:``} (${e.length} edits)`}if(e===`NotebookEdit`){let e=t.cell_id??t.cell_number;return`NotebookEdit ${r||`(unknown path)`}${e==null?``:` cell ${e}`}`}return`${e} ${JSON.stringify(t??{})}`}function On(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 kn(){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 An(){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`}}}function jn(e,t,n){let r=[`-p`,`--input-format`,`stream-json`,`--output-format`,`stream-json`,`--verbose`,`--replay-user-messages`];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`,a=i===`read-only`?t.additionalDirectories??[]:[],o=i===`read-only`?t.readOnlyAllowedTools??[]:[];if(i===`auto`&&t.approvalJobId){let n=JSON.stringify({mcpServers:{coder:{type:`stdio`,command:x.execPath,args:[m,`_mcp`,t.approvalJobId,`--cwd`,e]}}});r.push(`--permission-mode`,`default`,`--mcp-config`,n,`--permission-prompt-tool`,`mcp__coder__approval_prompt`)}else o.length?r.push(...Kt,`--allowedTools`,...o):r.push(...Gt[i]??Gt.auto);for(let e of a)r.push(`--add-dir`,e);let s=Yt(i,e,t.allowedNetworkHosts??[],a);return s&&r.push(`--settings`,s),r}function Mn(e,t){return Object.assign(Error(e),{retryable:t})}function Nn(e){return{type:`user`,message:{role:`user`,content:[{type:`text`,text:e}]}}}function Pn(e){let t=!0;return{sendInitial(t){return new Promise((n,r)=>{e(`${JSON.stringify(Nn(t))}\n`,e=>{e?r(e):n()})})},sendSteer(n){return t?new Promise((t,r)=>{e(`${JSON.stringify(Nn(n))}\n`,e=>{if(!e){t();return}let n=e.code,i=n===`EPIPE`||n===`ERR_STREAM_DESTROYED`||n===`ERR_STREAM_WRITE_AFTER_END`;r(Mn(`Failed to write Claude live steer: ${e.message}`,i))})}):Promise.reject(Mn(`Claude turn is no longer accepting live input.`,!0))},stopAccepting(){t=!1}}}function Fn(e,t){let n=`${e}.${x.pid}.${de()}.tmp`;S.writeFileSync(n,`${JSON.stringify(t)}\n`,`utf8`),S.renameSync(n,e)}async function In(e){let t=S.mkdtempSync(C.join(oe.tmpdir(),`coder-claude-steer-`)),n=`file:${t}`,r=new Set,i=!1,a=!1,o=(n=!1)=>{if(!(i&&!n||a)){a=!0;try{for(let n of S.readdirSync(t).filter(e=>e.endsWith(`.request.json`))){let i=C.join(t,n),a=`${i}.${x.pid}.processing`;try{S.renameSync(i,a)}catch{continue}let o=n.slice(0,-13),s=C.join(t,`${o}.response.json`),c=(async()=>{let t;try{let n=JSON.parse(S.readFileSync(a,`utf8`)),r=typeof n?.params?.text==`string`?n.params.text.trim():``;if(n?.method!==`turn/steer`||!r||n?.id!==o)t={id:o,error:{message:`Invalid Claude steer request.`,retryable:!1}};else try{await e(r),t={id:o,result:{accepted:!0}}}catch(e){let n=e;t={id:o,error:{message:n.message,retryable:n.retryable===!0}}}}catch(e){t={id:o,error:{message:`Invalid Claude steer JSON: ${e instanceof Error?e.message:String(e)}`,retryable:!1}}}try{Fn(s,t)}finally{try{S.unlinkSync(a)}catch{}}})();r.add(c),c.then(()=>r.delete(c),()=>r.delete(c))}}catch{}finally{a=!1}}},s=setInterval(o,10);return{endpoint:n,async close(){i=!0,clearInterval(s),o(!0),await Promise.allSettled([...r]),await new Promise(e=>setTimeout(e,50)),S.rmSync(t,{recursive:!0,force:!0})}}}async function Ln(e,t,n=3e3){if(!e)return{steered:!1,retryable:!0,detail:`Claude live steer endpoint is not ready.`};let r=t.trim();if(!r)return{steered:!1,retryable:!1,detail:`empty follow-up`};if(!e.startsWith(`file:`)||e.length===5)return{steered:!1,retryable:!1,detail:`Unsupported Claude steer endpoint: ${e}`};let i=e.slice(5);if(!S.existsSync(i))return{steered:!1,retryable:!0,detail:`Claude live steer endpoint is no longer available.`};let a=de(),o=C.join(i,`${a}.request.json`),s=C.join(i,`${a}.response.json`);try{Fn(o,{id:a,method:`turn/steer`,params:{text:r}})}catch(e){return{steered:!1,retryable:e.code===`ENOENT`,detail:e instanceof Error?e.message:String(e)}}let c=Date.now();for(;Date.now()-c<n;){try{let e=JSON.parse(S.readFileSync(s,`utf8`));try{S.unlinkSync(s)}catch{}return e?.result?.accepted===!0?{steered:!0,retryable:!1,detail:`Claude accepted the live follow-up.`}:{steered:!1,retryable:e?.error?.retryable===!0,detail:String(e?.error?.message??`Malformed Claude steer response.`)}}catch(e){if(e.code!==`ENOENT`)return{steered:!1,retryable:!1,detail:`Invalid Claude steer response: ${e instanceof Error?e.message:String(e)}`}}await new Promise(e=>setTimeout(e,10))}return{steered:!1,retryable:!1,detail:`Timed out waiting for Claude live steer acknowledgement.`}}async function Rn(e,t){let n=t.resumeSessionId??de(),r=jn(e,t,n);return t.onProgress?.({message:`claude turn started (session ${n})`,threadId:n}),new Promise((i,a)=>{let o=w(t.executable??`claude`,r,{cwd:e,stdio:[`pipe`,`pipe`,`pipe`]}),s=``,c=``,l=[],u=null,d=n,f=null,p=!1,m=Pn((e,t)=>o.stdin.write(e,t)),h=Date.now(),g=n=>{if(!(!n||typeof n!=`object`)){if(t.onHeartbeat?.(),n.type===`system`&&n.subtype===`init`&&n.session_id)d=n.session_id;else if(n.type===`assistant`){for(let r of n.message?.content??[])if(r?.type===`tool_use`)t.onProgress?.({message:Dn(String(r.name??`Tool`),r.input??{},e),threadId:d});else if(r?.type===`text`&&typeof r.text==`string`&&r.text.trim())t.onProgress?.({message:r.text.trim(),threadId:d});else if(r?.type===`thinking`&&typeof r.thinking==`string`&&r.thinking.trim()){let e=Math.max(1,Math.round((Date.now()-h)/1e3)),n=r.thinking.trim().split(`
|
|
14
|
-
`)[0],i=n.length>100?`${n.slice(0,100)}…`:n;t.onProgress?.({message:`Thought for ${e}s: ${i}`,threadId:d})}}else if(n.type===`user`){for(let e of n.message?.content??[])if(e?.type===`tool_result`){let n=wn(e.content).trim();n&&t.onProgress?.({message:n,threadId:d})}}else n.type===`result`&&(u=n,n.session_id&&(d=n.session_id),m.stopAccepting(),o.stdin.end());h=Date.now()}};o.stdout.on(`data`,e=>{s+=e;let t;for(;(t=s.indexOf(`
|
|
15
|
-
`))>=0;){let e=s.slice(0,t).trim();if(s=s.slice(t+1),e)try{g(JSON.parse(e))}catch(e){l.push(`Invalid Claude stream-json output: ${e instanceof Error?e.message:String(e)}`)}}}),o.stderr.on(`data`,e=>{c+=e});let _=()=>{m.stopAccepting(),o.kill(`SIGTERM`);let e=f?.endpoint;e?.startsWith(`file:`)&&S.rmSync(e.slice(5),{recursive:!0,force:!0}),x.exit(143)};x.on(`SIGTERM`,_),(async()=>{t.onSteerReady&&(f=await In(e=>m.sendSteer(e))),await m.sendInitial(t.prompt),f&&t.onSteerReady?.(f.endpoint)})().catch(e=>{p||(p=!0,m.stopAccepting(),o.kill(`SIGTERM`),x.removeListener(`SIGTERM`,_),f?.close(),a(e))}),o.on(`error`,e=>{p||(p=!0,m.stopAccepting(),x.removeListener(`SIGTERM`,_),f?.close(),a(Error(`claude spawn failed: ${e.message}`)))}),o.on(`close`,async e=>{if(p)return;p=!0,m.stopAccepting(),x.removeListener(`SIGTERM`,_),await f?.close();let n=s.trim();if(n)try{g(JSON.parse(n))}catch(e){l.push(`Invalid trailing Claude stream-json output: ${e instanceof Error?e.message:String(e)}`)}let r=u?.result??``,a=e!==0||u?.is_error===!0||u==null||l.length>0;i({status:+!!a,threadId:u?.session_id??d,turnId:null,finalMessage:r,tokens:On(u?.usage),model:u?.modelUsage&&Object.keys(u.modelUsage).join(`+`)||t.model||null,error:a?{message:l[0]||r||c.trim()||`claude exited ${e}`}:null})})})}function zn(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 Bn(){return C.join(oe.homedir(),`.agents`,`skills`,`coder`)}function Vn(){try{let e=S.readFileSync(C.join(Bn(),`SKILL.md`),`utf8`);return/^\s*version:\s*(\S+)/m.exec(e)?.[1]??null}catch{return null}}function Hn(e){let t=Bn();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(`
|
|
16
|
-
---
|
|
17
|
-
`,`\nmetadata:\n version: ${v()}\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 Un(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 Wn(e){let t=/(\d+\.\d+\.\d+)/.exec(String(e??``));return t?t[1]:null}function Gn(e){if(!e.available)return null;let t=Wn(e.detail);if(!t||He(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 Kn=/usage|quota|rate.?limit|429|401|unauthorized|not authenticated|login|insufficient|exhausted|not available|ENOENT/i,qn=`CODER_WORKER`;var K=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)}},Jn=class extends Error{agent;detail;constructor(e,t){super(t),this.agent=e,this.detail=t}};function Yn(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&&W(n)?n:void 0},s=e=>{let n=e?t.models?.[e]:void 0;return n&&U(n)?n:void 0};if(o(i)){let e;try{e=Sn(i,t)}catch(e){throw new K(`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 V?n=`claude`:i in z?n=`codex`:s(i)&&(n=`custom`)),n=n??t.chain[0]??`codex`,n!==`codex`&&n!==`claude`&&n!==`custom`){let e=n in z||n in V||n in(t.models??{})?` "${n}" is a model; use --model ${n}.`:``;throw new K(`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=Sn(l,t)}catch(e){throw new K(`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{xn(t,l)}catch(e){throw new K(`invalid-option`,e instanceof Error?e.message:String(e))}if(n===`custom`){let e=Object.entries(t.models??{}).filter(([,e])=>U(e)).map(([e])=>e);if(!l&&e.length===1&&(l=e[0]),!l||!s(l))throw new K(`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 Wt))throw new K(`invalid-option`,`Invalid --permissions "${d}". Use one of: ${Object.keys(Wt).join(`, `)}`);if(f===`codex`&&u&&!B.has(u))throw new K(`invalid-option`,`Invalid codex --effort "${u}". Use one of: ${[...B].join(`, `)}`);if(f===`claude`&&u&&!H.has(u))throw new K(`invalid-option`,`Invalid claude --effort "${u}". Use one of: ${[...H].join(`, `)}`);return{engine:f,agent:n,model:l,effort:u,permissions:d}}function Xn(e,t){return e===`read-only`&&qt.test(t??``)}function Zn(e,n){let r=o(e,n),i=S.openSync(C.join(r,`worker.log`),`a`),a=w(x.execPath,[m,`_worker`,n,`--cwd`,e],{cwd:e,detached:!0,stdio:[`ignore`,i,i],env:{...x.env,[qn]:`1`}});a.unref(),S.closeSync(i),t(e,n,{pid:a.pid??null})}async function Qn(e,r,i,a){let s=i.cwd,l=r.engine===`codex`?R(s):kn(),u=r.model?e.models?.[r.model]:void 0;if(!l.available&&u&&U(u)){let e=Un(l);i.onInstallNote?.(e.note),l=R(s)}if(!l.available)throw new Jn(r.agent,l.detail);let d=null;a.resume&&(d=n(s,a.resume)?.threadId??a.resume);let f=re(),p=t(s,f,{status:`queued`,kind:`task`,name:a.name??null,system:i.system??null,agent:r.agent,engine:r.engine,prompt:i.prompt,model:r.model,effort:r.effort,permissions:r.permissions,resumeThreadId:d,cwd:s,background:!i.wait,...a.simulateApproval?{simulateApproval:!0}:{},...i.flowRunId?{flowRunId:i.flowRunId}:{}});Zn(s,f);let m=2**53-1,h=()=>c(s,f,m).filter(e=>e.phase!==`starting`).length,_=Date.now()+15e3,v=p,y=null,b=null;for(;Date.now()<(b??_)&&(v=g(s,f)??v,v.status!==`failed`&&v.status!==`completed`);){if(v.threadId&&y===null&&(y=h(),b=Date.now()+5e3),y!==null&&h()>y){v=g(s,f)??v;break}await new Promise(e=>setTimeout(e,150))}if(v.status===`failed`){let e=P(C.join(o(s,f),`result.json`))?.error?.message??``,t=c(s,f,5).map(e=>e.message??``).join(`
|
|
18
|
-
`),n=e||t;throw Xn(r.permissions,n)?new K(`read-only-unavailable`,n):Kn.test(n)?new Jn(r.agent,n):new K(`startup-failed`,n,{taskId:f})}return{taskId:f,job:v,agent:r.agent,startupCheck:v.threadId?`passed`:`pending`}}function $n(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 er(e){if(x.env.CODER_WORKER)throw new K(`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 K(`invalid-option`,`Missing task text.`,{hint:[`Usage: coder run "<task text>"`,`Help: coder task run --help`]});let t=fn(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=Yn(n,t);try{return await Qn(t,i,e,r)}catch(a){if(!(a instanceof Jn))throw a;let o=t.chain[t.chain.indexOf(a.agent)+1];if(!o){let t=$n(a.agent,a.detail,i.permissions,e.system,e.prompt);throw new K(`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 tr(e,t){if(t.status!==`failed`)return;let n=t.result;if(!n||!Kn.test(n.error?.message??``)||!(!n.touchedFiles?.length&&!n.fileChanges?.length&&!n.commandExecutions?.length))return;let r=fn(e).chain;return r[r.indexOf(t.job.agent)+1]}function nr(e,t){return P(C.join(o(e,t),`result.json`))}function rr(e,t,n=0){return n===0?[]:c(e,t,n===`all`?2**53-1:n)}function ir(e,t,n={}){let r=g(e,t);if(!r)throw Error(`No task found for "${t}".`);return{taskId:t,status:r.status,result:nr(e,t),steps:rr(e,t,n.tail),turns:l(e,t),job:r}}async function ar(e,t,n={}){let r=g(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 K(`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:nr(e,t),steps:rr(e,t,n.tail),turns:l(e,t),job:a}}const or=[`.ts`,`.mjs`,`.js`];function sr(e,t){let n=[];try{n=S.readdirSync(e)}catch{return[]}let r=[];for(let i of n.sort()){let n=C.extname(i);or.includes(n)&&r.push({name:C.basename(i,n),path:C.join(e,i),scope:t})}return r}function cr(e){let t=s(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(r(),`flows`),scope:`global`}),n}function lr(e){let t=new Set,n=[];for(let{dir:r,scope:i}of cr(e))for(let e of sr(r,i))t.has(e.name)||(t.add(e.name),n.push(e));return n}function ur(e){return e.includes(`/`)||or.includes(C.extname(e))}function dr(e,t){if(ur(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=lr(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 fr(e,t,n={}){if(t.length)try{w(x.execPath,[m,`_archiveSweep`,`--cwd`,e,...n.flows?[`--flows`]:[],...t],{detached:!0,stdio:`ignore`}).unref()}catch{}}async function pr(e){let{options:t,positionals:r}=_(e,E.object({cwd:te,flows:ee})),i=M(t);for(let e of r){if(t.flows){let t=Z(e);t&&ni(t);continue}let r=n(i,e);r&&ne(i,r)}}async function mr(e){let{options:t,positionals:n}=_(e,E.object({...y,"all-stopped":ee}));Re(n,1,`task archive`);let r=M(t);if(t[`all-stopped`]){let e=u(r).filter(e=>a.includes(e.status));for(let t of e)ne(r,t);let n=e.map(e=>e.id);if(t.json){A({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||k(`Missing task id.`,{hint:[`Archive one: coder task archive <task-id>`,`Archive all stopped: coder task archive --all-stopped`]});let o=ze(r,i);if(ne(r,o),t.json){A({taskId:o.id,archived:!0});return}x.stdout.write(`Archived task ${D.cyan(o.id)}.\n`)}async function hr(e,n){let r=n.engine===`claude`?{detail:`claude worker terminated`}:await Bt(e,{threadId:n.threadId,turnId:n.turnId});if(n.pid&&n.status===`running`)try{x.kill(n.pid,`SIGTERM`)}catch{}return t(e,n.id,{status:`cancelled`,steerEndpoint:null,completedAt:new Date().toISOString()}),{taskId:n.id,status:`cancelled`,interrupt:r.detail}}async function gr(e){let{options:t,positionals:n}=_(e,E.object(y));Re(n,1,`task stop`);let r=M(t),i=ze(r,n[0]),{interrupt:a}=await hr(r,i);if(t.json){A({taskId:i.id,status:`cancelled`,interrupt:a});return}x.stdout.write(`Stopped task ${D.cyan(i.id)} ${D.dim(`(${a})`)}\n`)}function _r(e){return typeof e!=`object`||!e?JSON.stringify(e)??`null`:Array.isArray(e)?`[${e.map(_r).join(`,`)}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${_r(e[t])}`).join(`,`)}}`}function vr(e,t){return ue.createHash(`sha256`).update(`${e}\0${_r(t)}`).digest(`hex`)}function yr(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 br=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 xr=globalThis,q=xr.__coderFlowCtxALS??=new fe,J=xr.__coderFlowScopeALS??=new fe;function Sr(){return J.getStore()?.args}function Cr(){return J.getStore()?.depth??0}var wr=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 Tr(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 Er(e,t){if(!t.tokens)return;let n=t.model??`default`;e.ledger[n]=Tr(e.ledger[n]??null,t.tokens)}function Dr(e){return!!e&&typeof e.safeParse==`function`}async function Or(e){try{let t=await import(`zod`);if(typeof t.toJSONSchema==`function`)return t.toJSONSchema(e)}catch{}return null}async function kr(e){let t=await Or(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 Ar(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 jr(e,t){if(!Dr(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 Mr(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 Nr(e,t,n,r){let i=t.cwd?C.resolve(t.cwd):n?.cwd??x.cwd(),a;for(;;){let o=await er({prompt:e,...Mr(t,i,n),...a?{agent:a,model:void 0,effort:void 0,resume:void 0}:{resume:r??t.resume},onFallback:e=>Ur(`${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=g(i,o.taskId),c=s?xe(s):void 0;n?.hooks.onTaskStart?.({taskId:o.taskId,name:t.name,prompt:e,agent:c,depth:Cr()});let l;try{l=await ar(i,o.taskId)}finally{n?.running.delete(o.taskId)}let u=tr(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 kr(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 Nr(r,t,n);if(i.status!==`completed`){let e={...i,data:void 0};throw new K(`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=jr(t.returns,Ar(a))}catch(t){e={ok:!1,errors:t instanceof Error?t.message:String(t)}}if(e.ok)s=e.data;else{let r=await Nr(`Your previous reply did not match the required format: ${e.errors}\n\n${await kr(t.returns)}`,t,n,i.taskId);a=r.output||a,o=Tr(o,r.tokens);try{let e=jr(t.returns,Ar(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 K(`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 Fr(e){if(e)return await Or(e)??`<schema>`}async function Ir(e,t={}){let n=q.getStore();if(!n)return Pr(e,t);let r=vr(`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 Fr(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 K?e.result:void 0;throw t&&n.hooks.onTaskEnd?.({taskId:t.taskId,status:t.status===`completed`?`failed`:t.status,tokens:t.tokens}),e}return Er(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 Lr=262144;let Rr=0;function zr(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 Br(e,t){return new Promise(n=>{let r=w(e,{shell:!0,cwd:t,env:zr(t)}),i=``,a=e=>{i.length>=Lr||(i+=e,i.length>=Lr&&(i=`${i.slice(0,Lr)}\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 Vr(e,t={}){let n=q.getStore(),r=t.cwd?C.resolve(t.cwd):n?.cwd??x.cwd();if(!n)return Br(e,r);let i=vr(`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}-${Rr+=1}`,c=Cr();n.hooks.onGateStart?.({gateId:s,cmd:e,depth:c});let l=await Br(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 Hr(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 Ur(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,Cr()):(x.stderr.isTTY||!t)&&x.stderr.write(`[flow] ${e}\n`)}const Wr=ae(import.meta.url);function Gr(e){let t=C.dirname(se(import.meta.url));for(;C.basename(t)!==`dist`&&C.dirname(t)!==t;)t=C.dirname(t);return C.basename(t)===`dist`?ce(C.join(t,e)).href:null}function Kr(e){if(!(e===`@wular/coder`||e===`@wular/coder/flow`||e===`zod`||e.startsWith(`zod/`)))return null;try{return ce(Wr.resolve(e)).href}catch{}return e===`@wular/coder/flow`?Gr(`flow/index.js`):e===`@wular/coder`?Gr(`sdk.js`):null}const qr=/(\bfrom\s+|\bimport\s+|\bimport\s*\(\s*)(['"])([^'"]+)\2/g;function Jr(e){return e.replace(qr,(e,t,n,r)=>{let i=Kr(r);return i?`${t}${n}${i}${n}`:e})}async function Yr(e,t,n){try{return await import(ce(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 Xr(e){let t=C.extname(e),n;try{n=S.readFileSync(e,`utf8`)}catch{throw Error(`Cannot read flow file: ${e}`)}let r=Jr(n);if(r===n)return Yr(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>6e5&&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=Yr(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 Zr(e,t){let n=J.getStore();n.args=t??{};let r=await Xr(e),i=r.args,a=n.args;if(Dr(i)){let e=i.safeParse(t??{});if(!e.success){let e=jr(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 Qr(e,t){let n=q.getStore(),r=dr(e,n?.cwd??x.cwd());if(!n)return J.run({args:t??{},depth:0},()=>Zr(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=vr(`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},()=>Zr(r.path,t));return n.journal.record({kind:`flow`,fingerprint:a,result:c,startedAt:s,endedAt:new Date().toISOString()}),c}function $r(){return`flow-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function Y(){return C.join(r(),`state`,`global`,`flows`)}function ei(){return C.join(r(),`state`,`global`,`flows-archived`)}function X(e){ie(e,`flow run id`);let t=C.join(Y(),e);if(S.existsSync(C.join(t,`flow.json`)))return t;let n=C.join(ei(),e);return S.existsSync(C.join(n,`flow.json`))?n:t}function ti(e){if(e.archived)return e;let t={...e,archived:!0,archivedAt:new Date().toISOString()};return Q(X(e.runId),t),t}function ni(e){let t=ti(e),n=X(e.runId),r=C.join(ei(),e.runId);if(n!==r)try{S.mkdirSync(ei(),{recursive:!0}),S.renameSync(n,r)}catch{}return t}function ri(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 ii(e){let t=X(e);return S.existsSync(C.join(t,`flow.json`))?(S.rmSync(t,{recursive:!0,force:!0}),!0):!1}function ai(e){if(!f(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 oi(e){return e.status!==`running`||!e.pid||vi(e)?e:(hi(e.runId,`orchestrator died`),ai(e.runId)??e)}function Z(e){let t=ai(e);return t?oi(t):null}function Q(e,t){S.writeFileSync(C.join(e,`flow.json`),`${JSON.stringify(t,null,2)}\n`,`utf8`)}function si(e){let t=[];try{t=S.readdirSync(e)}catch{return[]}let n=[];for(let r of t)try{n.push(oi(JSON.parse(S.readFileSync(C.join(e,r,`flow.json`),`utf8`))))}catch{}return n}const ci=(e,t)=>String(t.startedAt).localeCompare(String(e.startedAt));function li(){let e=[];for(let t of si(Y()))t.archived?ni(t):e.push(t);return e.sort(ci)}function ui(e){let t=e?.migrate??!0,n=si(ei()),r=new Set(n.map(e=>e.runId));for(let e of si(Y()))e.archived&&!r.has(e.runId)&&n.push(t?ni(e):e);return n.sort(ci)}function di(){return[...li(),...ui()].sort(ci)[0]??null}function fi(e,t=`all`){if(t===0)return[];let n=yr(C.join(X(e),`journal.jsonl`)).filter(e=>e.kind===`task`),r=u(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,o=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}}),s=new Set(o.map(e=>e.taskId));for(let t of r)t.flowRunId===e&&!s.has(t.id)&&o.push({taskId:t.id,name:a(t),status:t.status,tokens:null});return t===`all`?o:o.slice(-t)}function pi(e={}){let t;if(e.archived)t=ui();else{let e=[];t=li().filter(t=>t.status===`running`||t.status===`queued`||ge(t.endedAt??t.startedAt)<=6e5||(ti(t),e.push(t.runId),!1)),fr(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 mi(e,t={},n){let r,i,a;if(n){let e=Z(n);if(!e)throw Error(`No flow run "${n}".`);e.archived&&ri(e),r=e.name,i=e.script,a=t.args??e.args}else{let n=dr(e,t.cwd?C.resolve(t.cwd):x.cwd());r=n.name,i=n.path,a=t.args??{}}let o=n??$r(),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??oe.cpus().length),maxTasks:Math.max(1,t.maxTasks??oe.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 hi(e,t){let n=ai(e);!n||n.status!==`running`||$(X(e),n,{status:`failed`,error:t})}const gi=`stop-keep-tasks`;function _i(e){try{return x.kill(e,0),!0}catch{return!1}}function vi(t){if(!t.pid||!_i(t.pid))return!1;let n=e(t.pid),r=Date.parse(t.pidStartedAt??``);return n===null||!Number.isFinite(r)||n<=r+6e4}function yi(e){let t=u(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 yr(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&&!a.includes(t.status)})}async function bi(e,t=[]){let n=x.cwd(),r=[];for(let i of new Set([...yi(e),...t])){let e=g(n,i);if(!(!e||a.includes(e.status)))try{await hr(n,e),r.push(i)}catch{}}return r}async function xi(e,t={}){let n=e?Z(e):di();if(!n)throw new K(`flow-failed`,e?`No flow run "${e}".`:`No flow runs.`,{hint:`Run one: coder flow run <name>`});if(n.status!==`running`)throw new K(`flow-failed`,`Run ${n.runId} is not running.`,{runId:n.runId,hint:`Result: coder flow result ${n.runId}`});let r=X(n.runId);if(!vi(n))return $(r,n,{status:`failed`,error:`orchestrator died`}),{runId:n.runId,status:`failed`,stoppedTasks:[],keptTasks:yi(n.runId)};let i=yi(n.runId),o=C.join(r,gi);t.keepTasks&&S.writeFileSync(o,``,`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 K(`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=[],o=[];for(let e of i){let n=g(t,e);n&&(n.status===`cancelled`?r.push(e):a.includes(n.status)||o.push(e))}return{runId:n.runId,status:e.status,stoppedTasks:r,keptTasks:o}}finally{if(t.keepTasks)try{S.unlinkSync(o)}catch{}}}async function*Si(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(`
|
|
19
|
-
`).length-1-i)}catch{}let o=Xe(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?!vi(c):t!==void 0&&!_i(t);if(c&&(c.pid||t!==void 0)&&n){hi(e,`orchestrator died`);break}await new Promise(e=>setTimeout(e,400)),c=Z(e)??c}yield*s()}function Ci(e,t,n,r){let i={...mi(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?yr(s):[],l=new br(c,s),u={runId:a,runDir:o,cwd:t.cwd?C.resolve(t.cwd):x.cwd(),journal:l,semaphore:new wr(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 wi(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},()=>Zr(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 K(`flow-failed`,e instanceof Error?e.message:String(e),{runId:o})}}async function Ti(e,t={},n={}){let{started:r}=Ci(e,t,n),i=Z(r.runId).script;return n.onStart?.({runId:r.runId,requestStop:r.markStopped,runningIds:()=>[...r.ctx.running]}),wi(r,i,Z(r.runId).name,t.args??{})}async function Ei(e,t={},n={}){let{started:r,args:i,name:a,replayable:o}=Ci(``,t,n,e),s=Z(e).script;return n.onStart?.({runId:e,requestStop:r.markStopped,runningIds:()=>[...r.ctx.running]}),o&&n.onReplay?.(o),wi(r,s,a,i)}export{Kt as $,D as $t,lr as A,P as At,ar as B,Oe as Bt,Ir as C,lt as Ct,mr as D,ot as Dt,hr as E,F as Et,$n as F,qe as Ft,zn as G,xe as Gt,Un as H,k as Ht,er as I,Te as It,kn as J,j as Jt,Vn as K,me as Kt,Xn as L,Fe as Lt,K as M,Ge as Mt,Kn as N,Je as Nt,pr as O,ct as Ot,qn as P,Ke as Pt,V as Q,Pe as Qt,ir as R,we as Rt,Si as S,st as St,gr as T,it as Tt,Gn as U,ye as Ut,Bn as V,Ee as Vt,Hn as W,_e as Wt,Ln as X,De as Xt,Rn as Y,ve as Yt,H as Z,Se as Zt,Ei as _,zt as _t,ii as a,M as an,W as at,bi as b,Vt as bt,Vr as c,Ae as cn,fn as ct,li as d,mn as dt,Ie as en,B as et,Ur as f,vn as ft,Z as g,Cn as gt,mi as h,G as ht,Sr as i,ze as in,gn as it,dr as j,Ye as jt,fr as k,Xe as kt,di as l,Ce as ln,pn as lt,Hr as m,dn as mt,ni as n,be as nn,Ut as nt,Qr as o,Le as on,yn as ot,hi as p,_n as pt,An as q,he as qt,pi as r,Re as rn,Wt as rt,fi as s,ke as sn,U as st,gi as t,A as tn,z as tt,ui as u,Sn as ut,X as v,R as vt,yr as w,rt as wt,xi as x,ut as xt,Ti as y,Ht as yt,Zn as z,ge as zt};
|