@wular/coder 0.3.10 → 0.3.12
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 +1 -1
- package/dist/flow/index.js +1 -1
- package/dist/{runtime-D2fWzl9D.js → runtime-DKvmKCSR.js} +8 -8
- package/dist/sdk.js +1 -1
- package/dist/{upgrade-C4DHqXHf.js → upgrade-Coqsp0jR.js} +13 -13
- 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/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{$t as x,A as ee,B as S,Bt as C,Ct as te,D as w,Et as ne,F as re,Ft as T,Gt as ie,Ht as E,I as D,Kt as ae,L as oe,Lt as O,M as k,Mt as se,N as ce,Nt as le,O as ue,Ot as de,Qt as A,R as fe,S as pe,St as me,T as he,Tt as ge,Ut as _e,Vt as ve,Wt as j,Xt as ye,Y as be,Yt as xe,Zt as M,_ as Se,_t as Ce,a as we,an as Te,at as Ee,b as De,bt as Oe,d as ke,dt as Ae,en as je,g as N,h as Me,in as Ne,j as Pe,kt as Fe,l as Ie,lt as Le,n as Re,nn as ze,on as Be,ot as P,p as Ve,qt as He,r as Ue,rn as F,s as We,sn as Ge,t as Ke,tn as I,tt as L,u as qe,ut as Je,v as R,w as Ye,wt as Xe,x as Ze,xt as Qe,y as $e,yt as et,zt as z}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{$t as x,A as ee,B as S,Bt as C,Ct as te,D as w,Et as ne,F as re,Ft as T,Gt as ie,Ht as E,I as D,Kt as ae,L as oe,Lt as O,M as k,Mt as se,N as ce,Nt as le,O as ue,Ot as de,Qt as A,R as fe,S as pe,St as me,T as he,Tt as ge,Ut as _e,Vt as ve,Wt as j,Xt as ye,Y as be,Yt as xe,Zt as M,_ as Se,_t as Ce,a as we,an as Te,at as Ee,b as De,bt as Oe,d as ke,dt as Ae,en as je,g as N,h as Me,in as Ne,j as Pe,kt as Fe,l as Ie,lt as Le,n as Re,nn as ze,on as Be,ot as P,p as Ve,qt as He,r as Ue,rn as F,s as We,sn as Ge,t as Ke,tn as I,tt as L,u as qe,ut as Je,v as R,w as Ye,wt as Xe,x as Ze,xt as Qe,y as $e,yt as et,zt as z}from"./runtime-DKvmKCSR.js";import{C as tt,E as B,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-Coqsp0jR.js";import V from"node:process";import H from"node:fs";import U from"node:path";import{spawn as ft,spawnSync as pt}from"node:child_process";import mt from"node:os";import*as W 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`]],G=[`--cwd <dir>`,`workspace directory (default: current)`],K=[`--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`}],q={"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,G],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
|
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-DKvmKCSR.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};
|
|
@@ -1,18 +1,18 @@
|
|
|
1
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 ee,i as m,j as h,l as te,m as g,o as _,r as v,s as ne,u as re,v as ie,w as ae,y as oe}from"./app-server-bHl6RBZ2.js";import{createRequire as se}from"node:module";import y from"node:process";import b from"node:fs";import x from"node:path";import{spawn as S,spawnSync as C}from"node:child_process";import ce from"node:os";import{fileURLToPath as le,pathToFileURL as ue}from"node:url";import*as w from"zod/mini";import de from"node:net";import fe,{randomUUID as pe}from"node:crypto";import{AsyncLocalStorage as me}from"node:async_hooks";function he(e){let t=y.env.FORCE_COLOR,n=t!=null&&t!==``&&t!==`0`||t!==`0`&&e.isTTY&&!y.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 T=he(y.stdout),E=he(y.stderr);function ge(e,t=E){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
2
|
`)}function D(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];y.stderr.write(`${E.red(e)}\n`),i.length&&y.stderr.write(`\n${ge(i,E)}\n`),y.exit(n)}function O(e){y.stdout.write(`${JSON.stringify(e,null,2)}\n`)}function _e(e,t=T){return(JSON.stringify(e,null,2)??`null`).split(`
|
|
3
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 ve(e){let t=Date.parse(e??``);return Number.isFinite(t)?Math.max(0,Date.now()-t):0}function ye(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 k(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(+(e<1e4))}k`:`${(e/1e6).toFixed(1)}M`}function be(e,t){let n=[`in ${k(e.input)}`,...e.cachedInput?[`cached ${k(e.cachedInput)}`]:[],`out ${k(e.output)}`];return`${k(e.total)} (${n.join(` · `)}) on ${t||`default model`}`}function xe(e,t,n,r=T){let i=e?.error?.message??t;return e?.finalMessage||(i?`${r.red(`error:`)} ${i}`:n)}function Se(e,t=T){let
|
|
5
|
-
`).map(e=>` ${t.dim(e)}`);return
|
|
4
|
+
`)}function ve(e){let t=Date.parse(e??``);return Number.isFinite(t)?Math.max(0,Date.now()-t):0}function ye(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 k(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(+(e<1e4))}k`:`${(e/1e6).toFixed(1)}M`}function be(e,t){let n=[`in ${k(e.input)}`,...e.cachedInput?[`cached ${k(e.cachedInput)}`]:[],`out ${k(e.output)}`];return`${k(e.total)} (${n.join(` · `)}) on ${t||`default model`}`}function xe(e,t,n,r=T){let i=e?.error?.message??t;return e?.finalMessage||(i?`${r.red(`error:`)} ${i}`:n)}function Se(e,t=T,{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 Ce(e){return[e.agent??`-`,e.model,e.model?e.effort:null].filter(Boolean).join(`/`)}function we(e,t=T){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 Te(e,t=300,{plain:n=!1,style:r=T}={}){if(e.length<=t)return e;let i=`<${e.length-t} more chars>`;return`${e.slice(0,t)} ${n?i:r.dim(i)}`}const Ee=6e5,De=12e4;function Oe(e,t){return e.length>t?`${e.slice(0,t-1)}…`:e.padEnd(t)}function ke(e){return` ${T.bold(T.green(`✔`))} ${e}`}function Ae(e){return` ${T.bold(T.red(`✘`))} ${e}`}function je(e=y.stdout){try{return e.getWindowSize?.()[0]??e.columns}catch{return e.columns}}function Me(e=y.stdout){try{return e.getWindowSize?.()[1]??e.rows}catch{return e.rows}}function Ne(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 Pe(e){let t=0;for(let n of e.replace(/\x1b\[[0-9;]*m/g,``))t+=Ne(n.codePointAt(0));return t}function Fe(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=Ne(o);if(n+c>t-1)return`${r}\x1b[0m${T.dim(`…`)}`;r+=s,n+=c,i+=s.length}return r}function Ie(){let e=y.stdin;if(!e.isTTY||!y.stdout.isTTY)return()=>{};e.setRawMode(!0),e.resume();let t=e=>{e.includes(3)&&y.kill(y.pid,`SIGINT`),e.includes(26)&&y.kill(y.pid,`SIGTSTP`)};return e.on(`data`,t),e.unref(),()=>{e.off(`data`,t),e.isTTY&&e.setRawMode(!1),e.pause()}}var Le=class{stream;quietMs;lines=[];painted=[];paintedWidths=[];paintedCols;resizeTimer;tty;constructor(e=y.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=je(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=je(this.stream),t=e?this.lines.map(t=>Fe(t,e-1)):this.lines,n=Me(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(Pe),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 Re(e,t=0){let n=e.padEnd(t);return e===`running`?T.green(n):e===`waiting-approval`?T.yellow(n):e===`failed`||e===`cancelled`?T.red(n):e===`completed`?T.blue(n):T.dim(n)}function ze(e,t,n=!1){n?O({taskId:e,status:`awaiting-approval`,approval:t}):(y.stdout.write(`Approval needed for task ${e}: ${t.summary}\n`),y.stderr.write(`\n${ge([`Approve: coder approve ${e} ${t.id}`,`Deny: coder approve ${e} ${t.id} --deny`,`Then: coder task result ${e} --wait`],E)}\n`)),y.exit(4)}function Be(e,t,n){if(e.length>t){let r=e.slice(t);D(`Unexpected argument${r.length>1?`s`:``}: ${r.join(` `)}`,{hint:`Help: coder ${n} --help`})}}function A(e){return e.cwd?x.resolve(String(e.cwd)):y.cwd()}function Ve(e,t){let r=n(e,t);return r||D(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 j=`@wular/coder`,He=`https://registry.npmjs.org/${j}/latest`;function Ue(){return x.join(r(),`update-check.json`)}function We(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 Ge(){try{return JSON.parse(b.readFileSync(Ue(),`utf8`))}catch{return null}}function Ke(e){try{b.mkdirSync(r(),{recursive:!0}),b.writeFileSync(Ue(),JSON.stringify(e))}catch{}}function qe(){try{b.rmSync(Ue(),{force:!0})}catch{}}function Je(e,t){if(y.env.CODER_NO_UPDATE_CHECK||y.env.CI)return;let n=Ge();if(n?.latest&&We(n.latest,e)>0&&y.stderr.write(E.dim(`coder ${e} -> `)+E.bold(n.latest)+E.dim(` available. run: coder upgrade
|
|
6
6
|
|
|
7
7
|
`)),!n?.checkedAt||Date.now()-n.checkedAt>864e5)try{S(y.execPath,[t,`_refreshUpdate`],{detached:!0,stdio:`ignore`}).unref()}catch{}}async function Ye(e){let t=Ge()?.latest??null;try{let e=new AbortController,n=setTimeout(()=>e.abort(),3e3),r=await fetch(He,{signal:e.signal,headers:{accept:`application/json`}});if(clearTimeout(n),r.ok){let e=await r.json();e?.version&&(t=e.version)}}catch{}Ke({checkedAt:Date.now(),latest:t,current:e})}function Xe(e){let t=e;try{t=b.realpathSync(e)}catch{}let n=t.replace(/\\/g,`/`);return/\/\.bun\//.test(n)?{pm:`bun`,command:[`bun`,`add`,`-g`,`${j}@latest`]}:/\/\.pnpm\//.test(n)||/\/pnpm(-global)?\//i.test(n)||/\/Library\/pnpm\//.test(n)?{pm:`pnpm`,command:[`pnpm`,`add`,`-g`,`${j}@latest`]}:/\/\.config\/yarn\/global\//.test(n)||/\/yarn\/global\//.test(n)||/\/Yarn\/Data\/global\//.test(n)?{pm:`yarn`,command:[`yarn`,`global`,`add`,`${j}@latest`]}:{pm:`npm`,command:[`npm`,`install`,`-g`,`${j}@latest`]}}function M(e){try{return JSON.parse(b.readFileSync(e,`utf8`))}catch{return null}}function Ze(e,t){let n=`${e}.tmp`;b.writeFileSync(n,`${JSON.stringify(t,null,2)}\n`,`utf8`),b.renameSync(n,e)}function Qe(e){let t=0,n=``;return()=>{let r;try{r=b.statSync(e).size}catch{return[]}if(r<t&&(t=0,n=``),r===t)return[];let i;try{i=b.openSync(e,`r`)}catch{return[]}try{let e=Buffer.alloc(r-t),a=b.readSync(i,e,0,e.length,t);t+=a;let o=(n+e.toString(`utf8`,0,a)).split(`
|
|
8
8
|
`);return n=o.pop()??``,o.filter(Boolean)}finally{b.closeSync(i)}}}const $e=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(`.`)),et=[/\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)/],tt=new Set([`status`,`log`,`diff`,`show`,`blame`,`rev-parse`,`ls-files`,`ls-tree`,`cat-file`,`describe`,`shortlog`,`grep`,`branch`,`stash`]);function nt(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 rt(e){return e.trim().split(/\s+/).filter(Boolean)}function it(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 tt.has(t)?{decision:`accept`,reason:`git ${t} is read-only`}:$e.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 at(e,t={}){let n=nt(String(e??``));if(!n.trim())return{decision:`escalate`,reason:`empty command`};for(let e of et)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=at(n,t);if(r.decision===`decline`)return r;r.decision===`escalate`&&(e=r)}return e}let i=rt(n),a=x.basename(i[0]??``);if(a===`git`)return it(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 ot(e,t){if(!e.length)return{decision:`escalate`,reason:`file change with no resolvable paths`};for(let n of e){let e=x.resolve(t,n),r=x.relative(t,e);if(r.startsWith(`..`)||x.isAbsolute(r))return{decision:`escalate`,reason:`path outside workspace: ${n}`};if(r===`.git`||r.startsWith(`.git${x.sep}`))return{decision:`decline`,reason:`direct .git modification: ${n}`}}return{decision:`accept`,reason:`all paths inside workspace`}}function st(e){return x.join(e,`approvals`)}function ct(e){let t=st(e);return b.existsSync(t)?b.readdirSync(t).filter(e=>e.endsWith(`.request.json`)).flatMap(e=>{let n=e.replace(/\.request\.json$/,``),r=M(x.join(t,e));if(!r)return[];let i=M(x.join(t,`${n}.response.json`));return[{...r,id:n,response:i}]}).sort((e,t)=>String(e.createdAt??``).localeCompare(String(t.createdAt??``))):[]}function lt(e,t,n){let r=st(e),i=x.join(r,`${t}.request.json`);if(!b.existsSync(i))throw Error(`No pending approval "${t}" for this job.`);b.writeFileSync(x.join(r,`${t}.response.json`),`${JSON.stringify({decision:n,answeredAt:new Date().toISOString()},null,2)}\n`,`utf8`)}async function N(e,t,{timeoutMs:n,onEvent:r}){let i=st(e);b.mkdirSync(i,{recursive:!0});let a=`apr-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`;b.writeFileSync(x.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 ${x.basename(e)} ${a} [--deny]`});let o=x.join(i,`${a}.response.json`),s=Date.now()+n;for(;Date.now()<s;){if(b.existsSync(o))try{let e=JSON.parse(b.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 ut(e,t={}){return N(e,{method:`simulate`,summary:`simulated approval probe (--simulate-approval)`},{timeoutMs:t.timeoutMs??12e4,onEvent:t.onEvent??null})}function dt({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=at(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 N(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=ot(i,e);return a?.({kind:`approval-decision`,method:o,decision:u.decision,reason:u.reason,summary:l}),u.decision===`escalate`?{decision:await N(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 ft(e,t,n=400){let r=t;for(;;){if(a.includes(r.status))return{job:r,reason:`terminal`};let t=ct(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,h(e,r.id)??r)}}const pt=`Coder Task`;function mt(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
9
|
`)}function ht(e,t=72){let n=String(e??``).trim().replace(/\s+/g,` `);return n?n.length<=t?n:`${n.slice(0,t-3)}...`:``}function gt(e){let t=ht(e,56);return t?`${pt}: ${t}`:pt}function _t(e){return e?.params?.threadId??null}function vt(e){return e?.params?.turnId?e.params.turnId:e?.params?.turn?.id?e.params.turn.id:null}function yt(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 bt(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 xt(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 St(e){return String(e??``).replace(/\s+/g,` `).trim()}function P(e){if(!e)return[];if(typeof e==`string`){let t=St(e);return t?[t]:[]}if(Array.isArray(e))return e.flatMap(e=>P(e));if(typeof e==`object`){let t=e;if(typeof t.text==`string`)return P(t.text);if(`summary`in t)return P(t.summary);if(`content`in t)return P(t.content);if(`parts`in t)return P(t.parts)}return[]}function Ct(e,t){let n=[];for(let r of[...e,...t]){let e=St(r);!e||n.includes(e)||n.push(e)}return n}function F(e,t,n=null,r={}){!e||!t||e({message:t,phase:n,...r})}function wt(e){switch(e.type){case`commandExecution`:return{message:`Running command: ${String(e.command??``).trim()}`,phase:`running`};case`fileChange`:return{message:`Applying ${e.changes.length} file change(s).`,phase:`editing`};case`mcpToolCall`:return{message:`Calling ${e.server}/${e.tool}.`,phase:`investigating`};case`dynamicToolCall`:return{message:`Running tool: ${e.tool}.`,phase:`investigating`};case`webSearch`:return{message:`Searching: ${String(e.query??``).trim()}`,phase:`investigating`};default:return null}}function Tt(e){switch(e.type){case`agentMessage`:{let t=String(e.text??``).trim();return t?{message:t,phase:null}:null}case`reasoning`:{let t=P(e.summary)[0]?.split(`
|
|
10
|
-
`)[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}.`,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 Et(e,t={}){let n,r,i=new Promise((e,t)=>{n=e,r=t});return{threadId:e,rootThreadId:e,threadIds:new Set([e]),threadTurnIds:new Map,turnId:null,bufferedNotifications:[],completion:i,resolveCompletion:n,rejectCompletion:r,finalTurn:null,completed:!1,finalAnswerSeen:!1,pendingCollaborations:new Set,activeSubagentTurns:new Set,completionTimer:null,lastAgentMessage:``,reasoningSummary:[],error:null,fileChanges:[],commandExecutions:[],tokenUsageByThread:new Map,itemIndex:new Map,onProgress:t.onProgress??null,onHeartbeat:t.onHeartbeat??null}}function Dt(e){e.completionTimer&&=(clearTimeout(e.completionTimer),null)}function Ot(e,t=null){e.completed||(Dt(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 kt(e){e.completed||e.finalTurn||!e.finalAnswerSeen||e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||(Dt(e),e.completionTimer=setTimeout(()=>{e.completionTimer=null,!(e.completed||e.finalTurn||!e.finalAnswerSeen)&&(e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||Ot(e,null))},250),e.completionTimer.unref?.())}function At(e,t){let n=_t(t);if(!n||!e.threadIds.has(n))return!1;let r=e.threadTurnIds.get(n)??null,i=vt(t);return r===null||i===null||i===r}function jt(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),kt(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,kt(e)));return}if(t.type===`reasoning`&&n===`completed`){e.reasoningSummary=Ct(e.reasoningSummary,P(t.summary));return}if(t.type===`fileChange`&&n===`completed`){e.fileChanges.push(t);return}t.type===`commandExecution`&&n===`completed`&&e.commandExecutions.push(t)}function Mt(e,t){switch(e.onHeartbeat?.(),t.method){case`thread/started`:e.threadIds.add(t.params.thread.id);break;case`turn/started`:e.threadIds.add(t.params.threadId),e.threadTurnIds.set(t.params.threadId,t.params.turn.id),(t.params.threadId??null)!==e.threadId&&e.activeSubagentTurns.add(t.params.threadId),F(e.onProgress,`Turn started (${t.params.turn.id}).`,`starting`,{threadId:t.params.threadId??null,turnId:t.params.turn.id??null});break;case`item/started`:jt(e,t.params.item,`started`,t.params.threadId??null);{let n=wt(t.params.item);F(e.onProgress,n?.message,n?.phase??null)}break;case`item/completed`:jt(e,t.params.item,`completed`,t.params.threadId??null);{let n=Tt(t.params.item);F(e.onProgress,n?.message,n?.phase??null)}break;case`thread/tokenUsage/updated`:{let n=bt(t.params?.tokenUsage?.total??t.params?.tokenUsage),r=_t(t);n&&r&&e.tokenUsageByThread.set(r,n);break}case`item/autoApprovalReview/completed`:{let n=t.params?.review??{},r=t.params?.action??{},i=r.command??r.type??``;F(e.onProgress,`auto-review ${n.status}${n.riskLevel?` (${n.riskLevel} risk)`:``}: ${ht(i)}${n.rationale?` — ${ht(n.rationale,120)}`:``}`,null);break}case`error`:e.error=t.params.error,F(e.onProgress,`Codex error: ${t.params.error.message}`,`failed`);break;case`turn/completed`:if((t.params.threadId??null)!==e.threadId){e.activeSubagentTurns.delete(t.params.threadId),kt(e);break}F(e.onProgress,`Turn ${t.params.turn.status}.`,`finalizing`),Ot(e,t.params.turn)}}async function Nt(e,t,n,r={}){let i=Et(t,r),a=e.notificationHandler;e.setNotificationHandler(e=>{if(!i.turnId){i.bufferedNotifications.push(e);return}if(e.method===`thread/started`){Mt(i,e);return}if(!At(i,e)){a?.(e);return}Mt(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)At(i,e)?Mt(i,e):a?.(e);return i.bufferedNotifications.length=0,e.turn?.status&&e.turn.status!==`inProgress`&&Ot(i,e.turn),await i.completion}finally{Dt(i),e.setNotificationHandler(a??null),e.setServerRequestHandler(null)}}async function Pt(e,t){let n=null;try{n=await v.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 v.connect(e,{disableBroker:!0});try{return await t(s)}finally{await s.close()}}}function I(e){let t=m(`codex`,[`--version`],{cwd:e});if(!t.available)return t;let n=m(`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 Ft(e){let t=I(e);if(!t.available)return{available:!1,loggedIn:!1,detail:t.detail};let n=null;try{n=await v.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=C(`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 It(e,{threadId:t,turnId:n}){if(!t||!n)return{interrupted:!1,detail:`missing threadId or turnId`};let r=null;try{return r=await v.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 Lt(e,{threadId:t,text:n}){if(!t)return{steered:!1,detail:`missing threadId`};let r=n.trim();if(!r)return{steered:!1,detail:`empty follow-up`};let i=null;try{return i=await v.connect(e,{reuseExistingBroker:!0}),await i.request(`turn/steer`,{threadId:t,input:[{type:`text`,text:r,text_elements:[]}]}),{steered:!0,detail:`Steered follow-up into the active turn on ${t}.`}}catch(e){return{steered:!1,detail:e instanceof Error?e.message:String(e)}}finally{await i?.close().catch(()=>{})}}async function Rt(e,t={}){let n=I(e);if(!n.available)throw Error(`Codex CLI is not available: ${n.detail}`);let r=t.prompt?.trim();if(!r)throw Error(`A prompt is required.`);return Pt(e,async n=>{let a;if(t.resumeThreadId)F(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(F(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:gt(r)})}catch(e){let t=String(e?.message??e??``);if(!t.includes(`unknown variant`)&&!t.includes(`unknown method`))throw e}F(t.onProgress,`Thread ready (${a}).`,`starting`,{threadId:a});let o=await Nt(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:mt(n.stderr),fileChanges:o.fileChanges,touchedFiles:yt(o.fileChanges),tokens:xt(o),model:t.model??null,commandExecutions:o.commandExecutions}})}const zt={chain:[`codex`,`claude`],agents:{codex:{model:`gpt-5.6-terra`,effort:`high`,permissions:`auto`},claude:{model:`opus`,effort:`medium`,permissions:`auto`}},models:{},approvals:{escalationTimeoutMs:12e4,allowedNetworkHosts:[]}},L={spark:`gpt-5.3-codex-spark`,luna:`gpt-5.6-luna`,terra:`gpt-5.6-terra`,sol:`gpt-5.6-sol`},R=new Set([`low`,`medium`,`high`]),z={haiku:`haiku`,sonnet:`sonnet`,opus:`opus`,fable:`fable`},B=new Set([`low`,`medium`,`high`]),Bt={"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`}},Vt={"read-only":[`--permission-mode`,`dontAsk`,`--disallowedTools`,`Edit`,`Write`,`NotebookEdit`],"workspace-write":[`--permission-mode`,`acceptEdits`],auto:[`--permission-mode`,`auto`]},Ht=/failIfUnavailable|sandbox\b[^.\n]*?(?:failed|could ?n[o']t|cannot|unavailable|not available|not supported)/i;function Ut(e){return e.flatMap(e=>de.isIPv6(e)?[`[${e}]`]:e.startsWith(`[`)||e.includes(`:`)||de.isIP(e)?[e]:[e,`*.${e}`])}function Wt(e,t,n=[]){return JSON.stringify(e===`read-only`?{sandbox:{enabled:!0,failIfUnavailable:!0,autoAllowBashIfSandboxed:!0,filesystem:{denyWrite:[t]}}}:{sandbox:{enabled:!0,autoAllowBashIfSandboxed:!0,...e===`auto`&&n.length?{network:{allowedDomains:Ut(n)}}:{}}})}const Gt=w.enum([`codex`,`claude`]),Kt=w.enum([`codex`,`claude`,`custom`]),qt=w.enum([`low`,`medium`,`high`]),Jt=w.enum([`read-only`,`workspace-write`,`auto`]),Yt=w.partial(w.strictObject({model:w.string().check(w.minLength(1)),effort:qt,permissions:Jt})),Xt=w.strictObject({baseUrl:w.url(),model:w.string().check(w.minLength(1)),envKey:w.optional(w.string().check(w.minLength(1))),wireApi:w.optional(w.enum([`chat`,`responses`])),disabled:w.optional(w.boolean())}),Zt=w.strictObject({provider:Gt,model:w.string().check(w.minLength(1)),effort:w.optional(qt),disabled:w.optional(w.boolean())}),Qt=w.strictObject({disabled:w.boolean()}),$t=w.union([Xt,Zt,Qt]),en=w.strictObject({escalationTimeoutMs:w.number().check(w.positive()),allowedNetworkHosts:w.array(w.string())}),tn=w.strictObject({chain:w.array(Kt).check(w.minLength(1)),agents:w.partial(w.strictObject({codex:Yt,claude:Yt,custom:Yt})),models:w.optional(w.record(w.string().check(w.regex(/^[a-z0-9][a-z0-9./_-]*$/i,`model name`)),$t)),approvals:en}),nn=w.partial(w.extend(tn,{approvals:w.partial(en)}));function V(e){return`baseUrl`in e}function H(e){return`provider`in e}function U(e){let t=nn.safeParse(e);if(!t.success)return t.error.issues.map(e=>`${e.path.join(`.`)||`config`}: ${e.message}`);let n=an(zt,t.data),r=[];for(let[e,i]of Object.entries(t.data.models??{})){if(e===`codex`||e===`claude`||e===`custom`){r.push(`models.${e}: reserved agent name`);continue}if(H(i)){let t=n.models?.[i.model];t&&!V(t)&&r.push(`models.${e}: alias target "${i.model}" is itself a config entry`)}}return r}function rn(e){if(!b.existsSync(e))return null;try{return JSON.parse(b.readFileSync(e,`utf8`))}catch(t){let n=t instanceof Error?t.message:String(t);throw Error(`Invalid JSON in ${e}: ${n}`)}}function an(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`?an(r[e],i):i;return n}function W(){return x.join(r(),`config.json`)}function on(e){let t=s(e),n=zt;for(let e of[W(),x.join(t,`coder.config.json`)]){let t=rn(e);if(!t)continue;let r=U(t);if(r.length)throw Error(`Invalid config in ${e}:\n ${r.join(`
|
|
10
|
+
`)[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}.`,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 Et(e,t={}){let n,r,i=new Promise((e,t)=>{n=e,r=t});return{threadId:e,rootThreadId:e,threadIds:new Set([e]),threadTurnIds:new Map,turnId:null,bufferedNotifications:[],completion:i,resolveCompletion:n,rejectCompletion:r,finalTurn:null,completed:!1,finalAnswerSeen:!1,pendingCollaborations:new Set,activeSubagentTurns:new Set,completionTimer:null,lastAgentMessage:``,reasoningSummary:[],error:null,fileChanges:[],commandExecutions:[],tokenUsageByThread:new Map,itemIndex:new Map,onProgress:t.onProgress??null,onHeartbeat:t.onHeartbeat??null}}function Dt(e){e.completionTimer&&=(clearTimeout(e.completionTimer),null)}function Ot(e,t=null){e.completed||(Dt(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 kt(e){e.completed||e.finalTurn||!e.finalAnswerSeen||e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||(Dt(e),e.completionTimer=setTimeout(()=>{e.completionTimer=null,!(e.completed||e.finalTurn||!e.finalAnswerSeen)&&(e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||Ot(e,null))},250),e.completionTimer.unref?.())}function At(e,t){let n=_t(t);if(!n||!e.threadIds.has(n))return!1;let r=e.threadTurnIds.get(n)??null,i=vt(t);return r===null||i===null||i===r}function jt(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),kt(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,kt(e)));return}if(t.type===`reasoning`&&n===`completed`){e.reasoningSummary=Ct(e.reasoningSummary,P(t.summary));return}if(t.type===`fileChange`&&n===`completed`){e.fileChanges.push(t);return}t.type===`commandExecution`&&n===`completed`&&e.commandExecutions.push(t)}function Mt(e,t){switch(e.onHeartbeat?.(),t.method){case`thread/started`:e.threadIds.add(t.params.thread.id);break;case`turn/started`:e.threadIds.add(t.params.threadId),e.threadTurnIds.set(t.params.threadId,t.params.turn.id),(t.params.threadId??null)!==e.threadId&&e.activeSubagentTurns.add(t.params.threadId),F(e.onProgress,`Turn started (${t.params.turn.id}).`,`starting`,{threadId:t.params.threadId??null,turnId:t.params.turn.id??null});break;case`item/started`:jt(e,t.params.item,`started`,t.params.threadId??null);{let n=wt(t.params.item);F(e.onProgress,n?.message,n?.phase??null)}break;case`item/completed`:jt(e,t.params.item,`completed`,t.params.threadId??null);{let n=Tt(t.params.item);F(e.onProgress,n?.message,n?.phase??null)}break;case`thread/tokenUsage/updated`:{let n=bt(t.params?.tokenUsage?.total??t.params?.tokenUsage),r=_t(t);n&&r&&e.tokenUsageByThread.set(r,n);break}case`item/autoApprovalReview/completed`:{let n=t.params?.review??{},r=t.params?.action??{},i=r.command??r.type??``;F(e.onProgress,`auto-review ${n.status}${n.riskLevel?` (${n.riskLevel} risk)`:``}: ${ht(i)}${n.rationale?` — ${ht(n.rationale,120)}`:``}`,null);break}case`error`:e.error=t.params.error,F(e.onProgress,`Codex error: ${t.params.error.message}`,`failed`);break;case`turn/completed`:if((t.params.threadId??null)!==e.threadId){e.activeSubagentTurns.delete(t.params.threadId),kt(e);break}F(e.onProgress,`Turn ${t.params.turn.status}.`,`finalizing`),Ot(e,t.params.turn)}}async function Nt(e,t,n,r={}){let i=Et(t,r),a=e.notificationHandler;e.setNotificationHandler(e=>{if(!i.turnId){i.bufferedNotifications.push(e);return}if(e.method===`thread/started`){Mt(i,e);return}if(!At(i,e)){a?.(e);return}Mt(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)At(i,e)?Mt(i,e):a?.(e);return i.bufferedNotifications.length=0,e.turn?.status&&e.turn.status!==`inProgress`&&Ot(i,e.turn),await i.completion}finally{Dt(i),e.setNotificationHandler(a??null),e.setServerRequestHandler(null)}}async function Pt(e,t){let n=null;try{n=await v.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 v.connect(e,{disableBroker:!0});try{return await t(s)}finally{await s.close()}}}function I(e){let t=m(`codex`,[`--version`],{cwd:e});if(!t.available)return t;let n=m(`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 Ft(e){let t=I(e);if(!t.available)return{available:!1,loggedIn:!1,detail:t.detail};let n=null;try{n=await v.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=C(`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 It(e,{threadId:t,turnId:n}){if(!t||!n)return{interrupted:!1,detail:`missing threadId or turnId`};let r=null;try{return r=await v.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 Lt(e,{threadId:t,text:n}){if(!t)return{steered:!1,detail:`missing threadId`};let r=n.trim();if(!r)return{steered:!1,detail:`empty follow-up`};let i=null;try{return i=await v.connect(e,{reuseExistingBroker:!0}),await i.request(`turn/steer`,{threadId:t,input:[{type:`text`,text:r,text_elements:[]}]}),{steered:!0,detail:`Steered follow-up into the active turn on ${t}.`}}catch(e){return{steered:!1,detail:e instanceof Error?e.message:String(e)}}finally{await i?.close().catch(()=>{})}}async function Rt(e,t={}){let n=I(e);if(!n.available)throw Error(`Codex CLI is not available: ${n.detail}`);let r=t.prompt?.trim();if(!r)throw Error(`A prompt is required.`);return Pt(e,async n=>{let a;if(t.resumeThreadId)F(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(F(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:gt(r)})}catch(e){let t=String(e?.message??e??``);if(!t.includes(`unknown variant`)&&!t.includes(`unknown method`))throw e}F(t.onProgress,`Thread ready (${a}).`,`starting`,{threadId:a});let o=await Nt(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:mt(n.stderr),fileChanges:o.fileChanges,touchedFiles:yt(o.fileChanges),tokens:xt(o),model:t.model??null,commandExecutions:o.commandExecutions}})}const zt={chain:[`codex`,`claude`],agents:{codex:{model:`gpt-5.6-terra`,effort:`high`,permissions:`auto`},claude:{model:`opus`,effort:`medium`,permissions:`auto`}},models:{},approvals:{escalationTimeoutMs:12e4,allowedNetworkHosts:[]}},L={spark:`gpt-5.3-codex-spark`,luna:`gpt-5.6-luna`,terra:`gpt-5.6-terra`,sol:`gpt-5.6-sol`},R=new Set([`low`,`medium`,`high`]),z={haiku:`haiku`,sonnet:`sonnet`,opus:`opus`,fable:`fable`},B=new Set([`low`,`medium`,`high`]),Bt={"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`}},Vt={"read-only":[`--permission-mode`,`dontAsk`,`--disallowedTools`,`Edit`,`Write`,`NotebookEdit`],"workspace-write":[`--permission-mode`,`acceptEdits`],auto:[`--permission-mode`,`auto`]},Ht=/failIfUnavailable|sandbox\b[^.\n]*?(?:failed|could ?n[o']t|cannot|unavailable|not available|not supported)/i;function Ut(e){return e.flatMap(e=>de.isIPv6(e)?[`[${e}]`]:e.startsWith(`[`)||e.includes(`:`)||de.isIP(e)?[e]:[e,`*.${e}`])}function Wt(e,t,n=[],r=[]){return JSON.stringify(e===`read-only`?{sandbox:{enabled:!0,failIfUnavailable:!0,autoAllowBashIfSandboxed:!0,filesystem:{denyWrite:[t,...r]}}}:{sandbox:{enabled:!0,autoAllowBashIfSandboxed:!0,...e===`auto`&&n.length?{network:{allowedDomains:Ut(n)}}:{}}})}const Gt=w.enum([`codex`,`claude`]),Kt=w.enum([`codex`,`claude`,`custom`]),qt=w.enum([`low`,`medium`,`high`]),Jt=w.enum([`read-only`,`workspace-write`,`auto`]),Yt=w.partial(w.strictObject({model:w.string().check(w.minLength(1)),effort:qt,permissions:Jt})),Xt=w.strictObject({baseUrl:w.url(),model:w.string().check(w.minLength(1)),envKey:w.optional(w.string().check(w.minLength(1))),wireApi:w.optional(w.enum([`chat`,`responses`])),disabled:w.optional(w.boolean())}),Zt=w.strictObject({provider:Gt,model:w.string().check(w.minLength(1)),effort:w.optional(qt),disabled:w.optional(w.boolean())}),Qt=w.strictObject({disabled:w.boolean()}),$t=w.union([Xt,Zt,Qt]),en=w.strictObject({escalationTimeoutMs:w.number().check(w.positive()),allowedNetworkHosts:w.array(w.string())}),tn=w.strictObject({chain:w.array(Kt).check(w.minLength(1)),agents:w.partial(w.strictObject({codex:Yt,claude:Yt,custom:Yt})),models:w.optional(w.record(w.string().check(w.regex(/^[a-z0-9][a-z0-9./_-]*$/i,`model name`)),$t)),approvals:en}),nn=w.partial(w.extend(tn,{approvals:w.partial(en)}));function V(e){return`baseUrl`in e}function H(e){return`provider`in e}function U(e){let t=nn.safeParse(e);if(!t.success)return t.error.issues.map(e=>`${e.path.join(`.`)||`config`}: ${e.message}`);let n=an(zt,t.data),r=[];for(let[e,i]of Object.entries(t.data.models??{})){if(e===`codex`||e===`claude`||e===`custom`){r.push(`models.${e}: reserved agent name`);continue}if(H(i)){let t=n.models?.[i.model];t&&!V(t)&&r.push(`models.${e}: alias target "${i.model}" is itself a config entry`)}}return r}function rn(e){if(!b.existsSync(e))return null;try{return JSON.parse(b.readFileSync(e,`utf8`))}catch(t){let n=t instanceof Error?t.message:String(t);throw Error(`Invalid JSON in ${e}: ${n}`)}}function an(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`?an(r[e],i):i;return n}function W(){return x.join(r(),`config.json`)}function on(e){let t=s(e),n=zt;for(let e of[W(),x.join(t,`coder.config.json`)]){let t=rn(e);if(!t)continue;let r=U(t);if(r.length)throw Error(`Invalid config in ${e}:\n ${r.join(`
|
|
11
11
|
`)}`);n=an(n,t)}let r=U(n);if(r.length)throw Error(`Invalid merged config:\n ${r.join(`
|
|
12
|
-
`)}`);return n}function sn(e){return e.replace(/\/+$/,``).replace(/\/(chat\/completions|completions|responses)$/,``)}function cn(e,t,n){let r=[x.join(s(e),`coder.config.json`),W()];for(let e of r){let r;try{r=rn(e)}catch{continue}if(r?.models?.[t])return Object.assign(r.models[t],n),!U(r).length&&(b.writeFileSync(e,`${JSON.stringify(r,null,2)}\n`,`utf8`),!0)}return!1}function ln(e){return/\/(chat\/completions|completions|responses)\/*$/.test(e)}function un(e,t){let n=sn(e);return ln(e)||/\/v\d+(alpha|beta)?$/.test(n)?[`${n}/${t}`]:[`${n}/${t}`,`${n}/v1/${t}`]}function dn(e,t,n){let r=t?e.models?.[t]:void 0;if(!t||!r||!V(r))return null;let i=`coder-${t}`;return{model:r.model,modelProvider:i,configOverrides:{[`model_providers.${i}`]:{name:t,base_url:n?.url??sn(r.baseUrl),...r.envKey&&!n?{env_key:r.envKey}:{},wire_api:`responses`}}}}function fn(e){return e?L[e]??e:null}function pn(e){return e in L||e in z}function mn(e,t){return!!(t&&e.models?.[t]?.disabled)}function hn(e,t){if(mn(e,t))throw Error(`model "${t}" is disabled in config`)}function gn(e,t){if(!e)return null;let n=String(e).trim().split(`:`).map(e=>e.trim());if(!n.length||n.length>3||n.some(e=>!e))throw Error(`Invalid agent spec "${e}".`);let r=null,i=null,a=null,o=e=>R.has(e)||B.has(e);for(let t of n)if(t===`codex`||t===`claude`||t===`custom`){if(r)throw Error(`Invalid agent spec "${e}".`);r=t}else if(o(t)&&!a)a=t;else if(!i)i=t;else throw Error(`Invalid agent spec "${e}".`);let s=i?t.models?.[i]:void 0;if(s&&H(s)){if(s.disabled)throw Error(`model "${i}" is disabled in config`);if(r&&r!==s.provider)throw Error(`Alias "${i}" runs on ${s.provider}, not ${r}.`);r=s.provider,a=a??s.effort??null,i=s.model}r||=i&&i in z?`claude`:i&&s&&V(s)?`custom`:`codex`;let c=t.agents[r]??{},l=i??c.model??null;return hn(t,l),{agent:r,model:l,effort:a??c.effort??null}}function _n(e){let t=W();return b.mkdirSync(x.dirname(t),{recursive:!0}),b.writeFileSync(t,`${JSON.stringify(e,null,2)}\n`,`utf8`),t}function vn(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 yn(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 bn(){let e=C(`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 xn(){let e=C(`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`}}}
|
|
12
|
+
`)}`);return n}function sn(e){return e.replace(/\/+$/,``).replace(/\/(chat\/completions|completions|responses)$/,``)}function cn(e,t,n){let r=[x.join(s(e),`coder.config.json`),W()];for(let e of r){let r;try{r=rn(e)}catch{continue}if(r?.models?.[t])return Object.assign(r.models[t],n),!U(r).length&&(b.writeFileSync(e,`${JSON.stringify(r,null,2)}\n`,`utf8`),!0)}return!1}function ln(e){return/\/(chat\/completions|completions|responses)\/*$/.test(e)}function un(e,t){let n=sn(e);return ln(e)||/\/v\d+(alpha|beta)?$/.test(n)?[`${n}/${t}`]:[`${n}/${t}`,`${n}/v1/${t}`]}function dn(e,t,n){let r=t?e.models?.[t]:void 0;if(!t||!r||!V(r))return null;let i=`coder-${t}`;return{model:r.model,modelProvider:i,configOverrides:{[`model_providers.${i}`]:{name:t,base_url:n?.url??sn(r.baseUrl),...r.envKey&&!n?{env_key:r.envKey}:{},wire_api:`responses`}}}}function fn(e){return e?L[e]??e:null}function pn(e){return e in L||e in z}function mn(e,t){return!!(t&&e.models?.[t]?.disabled)}function hn(e,t){if(mn(e,t))throw Error(`model "${t}" is disabled in config`)}function gn(e,t){if(!e)return null;let n=String(e).trim().split(`:`).map(e=>e.trim());if(!n.length||n.length>3||n.some(e=>!e))throw Error(`Invalid agent spec "${e}".`);let r=null,i=null,a=null,o=e=>R.has(e)||B.has(e);for(let t of n)if(t===`codex`||t===`claude`||t===`custom`){if(r)throw Error(`Invalid agent spec "${e}".`);r=t}else if(o(t)&&!a)a=t;else if(!i)i=t;else throw Error(`Invalid agent spec "${e}".`);let s=i?t.models?.[i]:void 0;if(s&&H(s)){if(s.disabled)throw Error(`model "${i}" is disabled in config`);if(r&&r!==s.provider)throw Error(`Alias "${i}" runs on ${s.provider}, not ${r}.`);r=s.provider,a=a??s.effort??null,i=s.model}r||=i&&i in z?`claude`:i&&s&&V(s)?`custom`:`codex`;let c=t.agents[r]??{},l=i??c.model??null;return hn(t,l),{agent:r,model:l,effort:a??c.effort??null}}function _n(e){let t=W();return b.mkdirSync(x.dirname(t),{recursive:!0}),b.writeFileSync(t,`${JSON.stringify(e,null,2)}\n`,`utf8`),t}function vn(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 yn(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 bn(){let e=C(`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 xn(){let e=C(`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 Sn(e,t,n){let r=[`-p`,t.prompt,`--output-format`,`stream-json`,`--verbose`];r.push(t.resumeSessionId?`--resume`:`--session-id`,n),t.model&&r.push(`--model`,t.model),t.effort&&r.push(`--effort`,t.effort);let i=t.permissions??`auto`,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:process.execPath,args:[ee,`_mcp`,t.approvalJobId,`--cwd`,e]}}});r.push(`--permission-mode`,`default`,`--mcp-config`,n,`--permission-prompt-tool`,`mcp__coder__approval_prompt`)}else r.push(...Vt[i]??Vt.auto);o.length&&r.push(`--allowedTools`,...o);for(let e of a)r.push(`--add-dir`,e);let s=Wt(i,e,t.allowedNetworkHosts??[],a);return s&&r.push(`--settings`,s),r}async function Cn(e,t){let n=t.resumeSessionId??pe(),r=Sn(e,t,n);return t.onProgress?.({message:`claude turn started (session ${n})`,threadId:n}),new Promise((i,a)=>{let o=S(`claude`,r,{cwd:e,stdio:[`ignore`,`pipe`,`pipe`]}),s=``,c=``,l=null,u=n,d=Date.now(),f=e=>{if(!(!e||typeof e!=`object`)){if(t.onHeartbeat?.(),e.type===`system`&&e.subtype===`init`&&e.session_id)u=e.session_id;else if(e.type===`assistant`){for(let n of e.message?.content??[])if(n?.type===`tool_use`)t.onProgress?.({message:`${n.name} ${JSON.stringify(n.input??{})}`,threadId:u});else if(n?.type===`text`&&typeof n.text==`string`&&n.text.trim())t.onProgress?.({message:n.text.trim(),threadId:u});else if(n?.type===`thinking`&&typeof n.thinking==`string`&&n.thinking.trim()){let e=Math.max(1,Math.round((Date.now()-d)/1e3)),r=n.thinking.trim().split(`
|
|
13
13
|
`)[0],i=r.length>100?`${r.slice(0,100)}…`:r;t.onProgress?.({message:`Thought for ${e}s: ${i}`,threadId:u})}}else if(e.type===`user`){for(let n of e.message?.content??[])if(n?.type===`tool_result`){let e=vn(n.content).trim();e&&t.onProgress?.({message:e,threadId:u})}}else e.type===`result`&&(l=e,e.session_id&&(u=e.session_id));d=Date.now()}};o.stdout.on(`data`,e=>{s+=e;let t;for(;(t=s.indexOf(`
|
|
14
|
-
`))>=0;){let e=s.slice(0,t).trim();if(s=s.slice(t+1),e)try{f(JSON.parse(e))}catch{}}}),o.stderr.on(`data`,e=>{c+=e});let p=()=>{o.kill(`SIGTERM`),process.exit(143)};process.on(`SIGTERM`,p),o.on(`error`,e=>{process.removeListener(`SIGTERM`,p),a(Error(`claude spawn failed: ${e.message}`))}),o.on(`close`,e=>{process.removeListener(`SIGTERM`,p);let n=s.trim();if(n)try{f(JSON.parse(n))}catch{}let r=l?.result??``,a=e!==0||l?.is_error===!0||l==null;i({status:+!!a,threadId:l?.session_id??u,turnId:null,finalMessage:r,tokens:yn(l?.usage),model:l?.modelUsage&&Object.keys(l.modelUsage).join(`+`)||t.model||null,error:a?{message:r||c.trim()||`claude exited ${e}`}:null})})})}function
|
|
14
|
+
`))>=0;){let e=s.slice(0,t).trim();if(s=s.slice(t+1),e)try{f(JSON.parse(e))}catch{}}}),o.stderr.on(`data`,e=>{c+=e});let p=()=>{o.kill(`SIGTERM`),process.exit(143)};process.on(`SIGTERM`,p),o.on(`error`,e=>{process.removeListener(`SIGTERM`,p),a(Error(`claude spawn failed: ${e.message}`))}),o.on(`close`,e=>{process.removeListener(`SIGTERM`,p);let n=s.trim();if(n)try{f(JSON.parse(n))}catch{}let r=l?.result??``,a=e!==0||l?.is_error===!0||l==null;i({status:+!!a,threadId:l?.session_id??u,turnId:null,finalMessage:r,tokens:yn(l?.usage),model:l?.modelUsage&&Object.keys(l.modelUsage).join(`+`)||t.model||null,error:a?{message:r||c.trim()||`claude exited ${e}`}:null})})})}function wn(e){C(`claude`,[`plugin`,`marketplace`,`remove`,`coder-plugins`],{encoding:`utf8`});let t=C(`claude`,[`plugin`,`marketplace`,`add`,e],{encoding:`utf8`}),n=C(`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 Tn(){return x.join(ce.homedir(),`.agents`,`skills`,`coder`)}function En(){try{let e=b.readFileSync(x.join(Tn(),`SKILL.md`),`utf8`);return/^\s*version:\s*(\S+)/m.exec(e)?.[1]??null}catch{return null}}function Dn(e){let t=Tn();try{let n=x.join(e,`plugins`,`agents`,`skills`,`coder`);b.rmSync(t,{recursive:!0,force:!0}),b.mkdirSync(t,{recursive:!0}),b.cpSync(n,t,{recursive:!0});let r=x.join(t,`SKILL.md`),i=b.readFileSync(r,`utf8`).replace(`
|
|
15
15
|
---
|
|
16
|
-
`,`\nmetadata:\n version: ${g()}\n---\n`);return b.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
|
|
17
|
-
`),n=e||t;throw Pn(r.permissions,n)?new G(`read-only-unavailable`,n):An.test(n)?new Mn(r.agent,n):new G(`startup-failed`,n,{taskId:f})}return{taskId:f,job:g,agent:r.agent,startupCheck:g.threadId?`passed`:`pending`}}function Ln(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 Rn(e){if(y.env.CODER_WORKER)throw new G(`nested-dispatch`,`Nested dispatch refused: this shell is already inside a coder task. Do the work yourself, directly in this session - ignore any skill or instruction telling you to orchestrate via the coder CLI.`);if(!e.prompt.trim())throw new G(`invalid-option`,`Missing task text.`,{hint:[`Usage: coder run "<task text>"`,`Help: coder task run --help`]});let t=on(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=Nn(n,t);try{return await In(t,i,e,r)}catch(a){if(!(a instanceof Mn))throw a;let o=t.chain[t.chain.indexOf(a.agent)+1];if(!o){let t=Ln(a.agent,a.detail,i.permissions,e.system,e.prompt);throw new G(`chain-exhausted`,t.error,{payload:t})}e.onFallback?.({agent:a.agent,detail:a.detail,next:o}),n={agent:o,permissions:e.permissions},r={name:void 0,resume:void 0,simulateApproval:void 0}}}}function zn(e,t){if(t.status!==`failed`)return;let n=t.result;if(!n||!An.test(n.error?.message??``)||!(!n.touchedFiles?.length&&!n.fileChanges?.length&&!n.commandExecutions?.length))return;let r=on(e).chain;return r[r.indexOf(t.job.agent)+1]}function Bn(e,t){return M(x.join(o(e,t),`result.json`))}function Vn(e,t,n=0){return n===0?[]:c(e,t,n===`all`?2**53-1:n)}function Hn(e,t,n={}){let r=h(e,t);if(!r)throw Error(`No task found for "${t}".`);return{taskId:t,status:r.status,result:Bn(e,t),steps:Vn(e,t,n.tail),turns:l(e,t),job:r}}async function Un(e,t,n={}){let r=h(e,t);if(!r)throw Error(`No task found for "${t}".`);let i=await ft(e,r);if(i.reason===`approval`){let e=i.approval;throw new G(`approval-pending`,`Approval needed for task ${t}: ${e.summary}`,{taskId:t,approval:e})}n.onSettle?.();let a=i.job;return{taskId:t,status:a.status,result:Bn(e,t),steps:Vn(e,t,n.tail),turns:l(e,t),job:a}}const Wn=[`.ts`,`.mjs`,`.js`];function Gn(e,t){let n=[];try{n=b.readdirSync(e)}catch{return[]}let r=[];for(let i of n.sort()){let n=x.extname(i);Wn.includes(n)&&r.push({name:x.basename(i,n),path:x.join(e,i),scope:t})}return r}function Kn(e){let t=s(e),n=[],i=x.resolve(e);for(;n.push({dir:x.join(i,`.coder`,`flows`),scope:`workspace`}),i!==t&&x.dirname(i)!==i;)i=x.dirname(i);return n.push({dir:x.join(r(),`flows`),scope:`global`}),n}function qn(e){let t=new Set,n=[];for(let{dir:r,scope:i}of Kn(e))for(let e of Gn(r,i))t.has(e.name)||(t.add(e.name),n.push(e));return n}function Jn(e){return e.includes(`/`)||Wn.includes(x.extname(e))}function Yn(e,t){if(Jn(e)){let n=x.resolve(t,e);if(b.existsSync(n))return{name:x.basename(n,x.extname(n)),path:n};throw Error(`Flow file not found: ${e}`)}let n=qn(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 Xn(e,t,n={}){if(t.length)try{S(y.execPath,[ee,`_archiveSweep`,`--cwd`,e,...n.flows?[`--flows`]:[],...t],{detached:!0,stdio:`ignore`}).unref()}catch{}}async function Zn(e){let{options:t,positionals:r}=te(e,w.object({cwd:re,flows:ne})),i=A(t);for(let e of r){if(t.flows){let t=Z(e);t&&zr(t);continue}let r=n(i,e);r&&ie(i,r)}}async function Qn(e){let{options:t,positionals:n}=te(e,w.object({..._,"all-stopped":ne}));Be(n,1,`task archive`);let r=A(t);if(t[`all-stopped`]){let e=u(r).filter(e=>a.includes(e.status));for(let t of e)ie(r,t);let n=e.map(e=>e.id);if(t.json){O({archived:n,count:n.length});return}y.stdout.write(n.length?`Archived ${n.length} stopped task${n.length===1?``:`s`}.\n`:`${T.dim(`No stopped tasks to archive.`)}\n`);return}let i=n[0];i||D(`Missing task id.`,{hint:[`Archive one: coder task archive <task-id>`,`Archive all stopped: coder task archive --all-stopped`]});let o=Ve(r,i);if(ie(r,o),t.json){O({taskId:o.id,archived:!0});return}y.stdout.write(`Archived task ${T.cyan(o.id)}.\n`)}async function $n(e,n){let r=n.engine===`claude`?{detail:`claude worker terminated`}:await It(e,{threadId:n.threadId,turnId:n.turnId});if(n.pid&&n.status===`running`)try{y.kill(n.pid,`SIGTERM`)}catch{}return t(e,n.id,{status:`cancelled`,completedAt:new Date().toISOString()}),{taskId:n.id,status:`cancelled`,interrupt:r.detail}}async function er(e){let{options:t,positionals:n}=te(e,w.object(_));Be(n,1,`task stop`);let r=A(t),i=Ve(r,n[0]),{interrupt:a}=await $n(r,i);if(t.json){O({taskId:i.id,status:`cancelled`,interrupt:a});return}y.stdout.write(`Stopped task ${T.cyan(i.id)} ${T.dim(`(${a})`)}\n`)}function tr(e){return typeof e!=`object`||!e?JSON.stringify(e)??`null`:Array.isArray(e)?`[${e.map(tr).join(`,`)}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${tr(e[t])}`).join(`,`)}}`}function nr(e,t){return fe.createHash(`sha256`).update(`${e}\0${tr(t)}`).digest(`hex`)}function K(e){return b.existsSync(e)?b.readFileSync(e,`utf8`).split(/\r?\n/).filter(Boolean).map(e=>{try{return JSON.parse(e)}catch{return null}}).filter(e=>e!==null):[]}var rr=class{file;recorded;seq=0;constructor(e,t){this.file=t,this.recorded=e.map(e=>({...e})),b.writeFileSync(t,``,`utf8`)}write(e){e.seq=this.seq++,b.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 ir=globalThis,q=ir.__coderFlowCtxALS??=new me,J=ir.__coderFlowScopeALS??=new me;function ar(){return J.getStore()?.args}function or(){return J.getStore()?.depth??0}var sr=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 cr(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 lr(e,t){if(!t.tokens)return;let n=t.model??`default`;e.ledger[n]=cr(e.ledger[n]??null,t.tokens)}function ur(e){return!!e&&typeof e.safeParse==`function`}async function dr(e){try{let t=await import(`zod`);if(typeof t.toJSONSchema==`function`)return t.toJSONSchema(e)}catch{}return null}async function fr(e){let t=await dr(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 pr(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 mr(e,t){if(!ur(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 hr(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 gr(e,t,n,r){let i=t.cwd?x.resolve(t.cwd):n?.cwd??y.cwd(),a;for(;;){let o=await Rn({prompt:e,...hr(t,i,n),...a?{agent:a,model:void 0,effort:void 0,resume:void 0}:{resume:r??t.resume},onFallback:e=>Er(`${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=h(i,o.taskId),c=s?Ce(s):void 0;n?.hooks.onTaskStart?.({taskId:o.taskId,name:t.name,prompt:e,agent:c,depth:or()});let l;try{l=await Un(i,o.taskId)}finally{n?.running.delete(o.taskId)}let u=zn(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 _r(e,t,n){let r=e;if(t.returns&&(r=`${e}\n\n${await fr(t.returns)}`),n?.dryRun){y.stdout.write(`\n[dry-run] task${t.name?` (${t.name})`:``}:\n${r}\n`);let e={...t,returns:t.returns?`<schema>`:void 0};return y.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 gr(r,t,n);if(i.status!==`completed`){let e={...i,data:void 0};throw new G(`task-failed`,`Task ${i.taskId} ${i.status}: ${i.output||`no output`}`,{taskId:i.taskId,result:e})}let a=i.output,o=i.tokens,s;if(t.returns){let e;try{e=mr(t.returns,pr(a))}catch(t){e={ok:!1,errors:t instanceof Error?t.message:String(t)}}if(e.ok)s=e.data;else{let r=await gr(`Your previous reply did not match the required format: ${e.errors}\n\n${await fr(t.returns)}`,t,n,i.taskId);a=r.output||a,o=cr(o,r.tokens);try{let e=mr(t.returns,pr(a));if(!e.ok)throw Error(e.errors);s=e.data}catch(e){let t={taskId:i.taskId,status:`completed`,output:a,data:void 0,tokens:o,model:i.model};throw new G(`task-failed`,`Task ${i.taskId} produced no valid structured output: ${e instanceof Error?e.message:String(e)}`,{taskId:i.taskId,result:t})}}}return{taskId:i.taskId,status:`completed`,output:a,data:s,tokens:o,model:i.model}}async function vr(e){if(e)return await dr(e)??`<schema>`}async function yr(e,t={}){let n=q.getStore();if(!n)return _r(e,t);let r=nr(`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 vr(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 _r(e,t,n)}catch(e){let t=e instanceof G?e.result:void 0;throw t&&n.hooks.onTaskEnd?.({taskId:t.taskId,status:t.status===`completed`?`failed`:t.status,tokens:t.tokens}),e}return lr(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 br=262144;let xr=0;function Sr(e){let t=[];for(let n=e;;){t.push(x.join(n,`node_modules`,`.bin`));let e=x.dirname(n);if(e===n)break;n=e}let n=y.platform===`win32`?`;`:`:`;return{...y.env,PATH:[...t,y.env.PATH??``].join(n)}}async function Cr(e,t){return new Promise(n=>{let r=S(e,{shell:!0,cwd:t,env:Sr(t)}),i=``,a=e=>{i.length>=br||(i+=e,i.length>=br&&(i=`${i.slice(0,br)}\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 wr(e,t={}){let n=q.getStore(),r=t.cwd?x.resolve(t.cwd):n?.cwd??y.cwd();if(!n)return Cr(e,r);let i=nr(`gate`,{cmd:e,cwd:t.cwd}),a=n.journal.replay(i);if(a)return a.result;if(n.dryRun){y.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-${y.pid}-${xr+=1}`,c=or();n.hooks.onGateStart?.({gateId:s,cmd:e,depth:c});let l=await Cr(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 Tr(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 Er(e){let t=q.getStore();if(t)try{b.appendFileSync(x.join(t.runDir,`flow.log`),`${JSON.stringify({at:new Date().toISOString(),message:e})}\n`,`utf8`)}catch{}t?.hooks.onLog?t.hooks.onLog(e,or()):(y.stderr.isTTY||!t)&&y.stderr.write(`[flow] ${e}\n`)}const Dr=se(import.meta.url);function Or(e){let t=x.dirname(le(import.meta.url));for(;x.basename(t)!==`dist`&&x.dirname(t)!==t;)t=x.dirname(t);return x.basename(t)===`dist`?ue(x.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 ue(Dr.resolve(e)).href}catch{}return e===`@wular/coder/flow`?Or(`flow/index.js`):e===`@wular/coder`?Or(`sdk.js`):null}const Ar=/(\bfrom\s+|\bimport\s+|\bimport\s*\(\s*)(['"])([^'"]+)\2/g;function jr(e){return e.replace(Ar,(e,t,n,r)=>{let i=kr(r);return i?`${t}${n}${i}${n}`:e})}async function Mr(e,t,n){try{return await import(ue(e).href)}catch(e){let r=e instanceof Error?e.message:String(e);throw t===`.ts`&&!y.versions?.bun&&/Unknown file extension|Unexpected token|SyntaxError|Cannot parse|import type|interface/i.test(r)?Error(`Could not run ${x.basename(n)}: TypeScript flows need bun. Run under \`bun\`, or write the flow as .mjs/.js.`):e}}async function Nr(e){let t=x.extname(e),n;try{n=b.readFileSync(e,`utf8`)}catch{throw Error(`Cannot read flow file: ${e}`)}let r=jr(n);if(r===n)return Mr(e,t,e);let i=x.dirname(e);try{for(let e of b.readdirSync(i)){if(!e.startsWith(`.__coderflow_`))continue;let t=x.join(i,e);Date.now()-b.statSync(t).mtimeMs>6e5&&b.unlinkSync(t)}}catch{}let a=`${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`,o=x.join(i,`.__coderflow_${a}${t}`),s=`__coderflow_loaded_${a}`,c=new Promise(e=>{globalThis[s]=e});b.writeFileSync(o,`globalThis[${JSON.stringify(s)}]?.();${r}`,`utf8`);let l=Mr(o,t,e);try{await Promise.race([c,l.then(()=>void 0,()=>void 0)])}finally{delete globalThis[s];try{b.unlinkSync(o)}catch{}}return await l}async function Pr(e,t){let n=J.getStore();n.args=t??{};let r=await Nr(e),i=r.args,a=n.args;if(ur(i)){let e=i.safeParse(t??{});if(!e.success){let e=mr(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 Fr(e,t){let n=q.getStore(),r=Yn(e,n?.cwd??y.cwd());if(!n)return J.run({args:t??{},depth:0},()=>Pr(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=nr(`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},()=>Pr(r.path,t));return n.journal.record({kind:`flow`,fingerprint:a,result:c,startedAt:s,endedAt:new Date().toISOString()}),c}function Ir(){return`flow-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function Y(){return x.join(r(),`state`,`global`,`flows`)}function Lr(){return x.join(r(),`state`,`global`,`flows-archived`)}function X(e){oe(e,`flow run id`);let t=x.join(Y(),e);if(b.existsSync(x.join(t,`flow.json`)))return t;let n=x.join(Lr(),e);return b.existsSync(x.join(n,`flow.json`))?n:t}function Rr(e){if(e.archived)return e;let t={...e,archived:!0,archivedAt:new Date().toISOString()};return Q(X(e.runId),t),t}function zr(e){let t=Rr(e),n=X(e.runId),r=x.join(Lr(),e.runId);if(n!==r)try{b.mkdirSync(Lr(),{recursive:!0}),b.renameSync(n,r)}catch{}return t}function Br(e){let t=X(e.runId),n=x.join(Y(),e.runId);if(t!==n)try{b.mkdirSync(Y(),{recursive:!0}),b.renameSync(t,n)}catch{}let r={...e,archived:void 0,archivedAt:void 0};return Q(X(e.runId),r),r}function Vr(e){let t=X(e);return b.existsSync(x.join(t,`flow.json`))?(b.rmSync(t,{recursive:!0,force:!0}),!0):!1}function Hr(e){if(!f(e))return null;let t=x.join(X(e),`flow.json`);if(!b.existsSync(t))return null;try{return JSON.parse(b.readFileSync(t,`utf8`))}catch{return null}}function Ur(e){return e.status!==`running`||!e.pid||ti(e)?e:(Qr(e.runId,`orchestrator died`),Hr(e.runId)??e)}function Z(e){let t=Hr(e);return t?Ur(t):null}function Q(e,t){b.writeFileSync(x.join(e,`flow.json`),`${JSON.stringify(t,null,2)}\n`,`utf8`)}function Wr(e){let t=[];try{t=b.readdirSync(e)}catch{return[]}let n=[];for(let r of t)try{n.push(Ur(JSON.parse(b.readFileSync(x.join(e,r,`flow.json`),`utf8`))))}catch{}return n}const Gr=(e,t)=>String(t.startedAt).localeCompare(String(e.startedAt));function Kr(){let e=[];for(let t of Wr(Y()))t.archived?zr(t):e.push(t);return e.sort(Gr)}function qr(e){let t=e?.migrate??!0,n=Wr(Lr()),r=new Set(n.map(e=>e.runId));for(let e of Wr(Y()))e.archived&&!r.has(e.runId)&&n.push(t?zr(e):e);return n.sort(Gr)}function Jr(){return[...Kr(),...qr()].sort(Gr)[0]??null}function Yr(e,t=`all`){if(t===0)return[];let n=K(x.join(X(e),`journal.jsonl`)).filter(e=>e.kind===`task`),r=u(y.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 Xr(e={}){let t;if(e.archived)t=qr();else{let e=[];t=Kr().filter(t=>t.status===`running`||t.status===`queued`||ve(t.endedAt??t.startedAt)<=6e5||(Rr(t),e.push(t.runId),!1)),Xn(y.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 Zr(e,t={},n){let r,i,a;if(n){let e=Z(n);if(!e)throw Error(`No flow run "${n}".`);e.archived&&Br(e),r=e.name,i=e.script,a=t.args??e.args}else{let n=Yn(e,t.cwd?x.resolve(t.cwd):y.cwd());r=n.name,i=n.path,a=t.args??{}}let o=n??Ir(),s=X(o);b.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??ce.cpus().length),maxTasks:Math.max(1,t.maxTasks??ce.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 Qr(e,t){let n=Hr(e);!n||n.status!==`running`||$(X(e),n,{status:`failed`,error:t})}const $r=`stop-keep-tasks`;function ei(e){try{return y.kill(e,0),!0}catch{return!1}}function ti(t){if(!t.pid||!ei(t.pid))return!1;let n=e(t.pid),r=Date.parse(t.pidStartedAt??``);return n===null||!Number.isFinite(r)||n<=r+6e4}function ni(e){let t=u(y.cwd()),n=new Map(t.map(e=>[e.id,e])),r=new Set(t.filter(t=>t.flowRunId===e).map(e=>e.id));for(let t of K(x.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 ri(e,t=[]){let n=y.cwd(),r=[];for(let i of new Set([...ni(e),...t])){let e=h(n,i);if(!(!e||a.includes(e.status)))try{await $n(n,e),r.push(i)}catch{}}return r}async function ii(e,t={}){let n=e?Z(e):Jr();if(!n)throw new G(`flow-failed`,e?`No flow run "${e}".`:`No flow runs.`,{hint:`Run one: coder flow run <name>`});if(n.status!==`running`)throw new G(`flow-failed`,`Run ${n.runId} is not running.`,{runId:n.runId,hint:`Result: coder flow result ${n.runId}`});let r=X(n.runId);if(!ti(n))return $(r,n,{status:`failed`,error:`orchestrator died`}),{runId:n.runId,status:`failed`,stoppedTasks:[],keptTasks:ni(n.runId)};let i=ni(n.runId),o=x.join(r,$r);t.keepTasks&&b.writeFileSync(o,``,`utf8`);try{y.kill(n.pid,`SIGINT`);let e=Z(n.runId);for(let t=0;t<25&&e?.status===`running`;t+=1)await new Promise(e=>setTimeout(e,200)),e=Z(n.runId);if(!e||e.status===`running`)throw new G(`flow-failed`,`Run ${n.runId} did not stop within 5s.`,{runId:n.runId,hint:`Check it: coder flow result ${n.runId}`});let t=y.cwd(),r=[],o=[];for(let e of i){let n=h(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{b.unlinkSync(o)}catch{}}}async function*ai(e,t,n={}){let r=x.join(X(e),`events.jsonl`),i=n.tail??`all`,a=0;if(i!==`all`)try{a=Math.max(0,b.readFileSync(r,`utf8`).split(`
|
|
18
|
-
`).length-1-i)}catch{}let o=Qe(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?!
|
|
16
|
+
`,`\nmetadata:\n version: ${g()}\n---\n`);return b.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 On(e){if(e.available)return null;let t=C(`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 kn(e){let t=/(\d+\.\d+\.\d+)/.exec(String(e??``));return t?t[1]:null}function An(e){if(!e.available)return null;let t=kn(e.detail);if(!t||We(t,`0.144.0`)>=0)return null;let n=C(`codex`,[`update`],{encoding:`utf8`});return n.status!==0&&(n=C(`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 jn=/usage|quota|rate.?limit|429|401|unauthorized|not authenticated|login|insufficient|exhausted|not available|ENOENT/i,Mn=`CODER_WORKER`;var G=class extends Error{code;hint;taskId;payload;approval;result;runId;constructor(e,t,n={}){super(t),this.name=`CoderError`,this.code=e,Object.assign(this,n)}},Nn=class extends Error{agent;detail;constructor(e,t){super(t),this.agent=e,this.detail=t}};function Pn(e,t){let n=e.agent,r=!!n,i=e.model,a=e.effort,o=e=>{let n=e?t.models?.[e]:void 0;return n&&H(n)?n:void 0},s=e=>{let n=e?t.models?.[e]:void 0;return n&&V(n)?n:void 0};if(o(i)){let e;try{e=gn(i,t)}catch(e){throw new G(`invalid-option`,e instanceof Error?e.message:String(e))}e&&(r||(n=e.agent),i=e.model??void 0,a=a??e.effort??void 0)}if(!n&&i&&(i in z?n=`claude`:i in L?n=`codex`:s(i)&&(n=`custom`)),n=n??t.chain[0]??`codex`,n!==`codex`&&n!==`claude`&&n!==`custom`){let e=n in L||n in z||n in(t.models??{})?` "${n}" is a model; use --model ${n}.`:``;throw new G(`invalid-option`,`Invalid --agent "${n}". Use codex, claude, or custom.${e}`)}let c=t.agents[n]??{},l=i??c.model??null,u=a??c.effort??null;if(o(l)){let e;try{e=gn(l,t)}catch(e){throw new G(`invalid-option`,e instanceof Error?e.message:String(e))}e&&(r||(n=e.agent),l=e.model,u=a??e.effort??u)}let d=e.permissions??c.permissions??`auto`;try{hn(t,l)}catch(e){throw new G(`invalid-option`,e instanceof Error?e.message:String(e))}if(n===`custom`){let e=Object.entries(t.models??{}).filter(([,e])=>V(e)).map(([e])=>e);if(!l&&e.length===1&&(l=e[0]),!l||!s(l))throw new G(`invalid-option`,l?`No custom model named "${l}". Configured: ${e.join(`, `)||`none`}.`:`No custom model to run: pass --model <name> or set agents.custom.model.`,{hint:`Add one: coder model add <name> --base-url <url> --model <id>`})}let f=n===`claude`?`claude`:`codex`;if(!(d in Bt))throw new G(`invalid-option`,`Invalid --permissions "${d}". Use one of: ${Object.keys(Bt).join(`, `)}`);if(f===`codex`&&u&&!R.has(u))throw new G(`invalid-option`,`Invalid codex --effort "${u}". Use one of: ${[...R].join(`, `)}`);if(f===`claude`&&u&&!B.has(u))throw new G(`invalid-option`,`Invalid claude --effort "${u}". Use one of: ${[...B].join(`, `)}`);return{engine:f,agent:n,model:l,effort:u,permissions:d}}function Fn(e,t){return e===`read-only`&&Ht.test(t??``)}function In(e,n){let r=o(e,n),i=b.openSync(x.join(r,`worker.log`),`a`),a=S(y.execPath,[ee,`_worker`,n,`--cwd`,e],{cwd:e,detached:!0,stdio:[`ignore`,i,i],env:{...y.env,[Mn]:`1`}});a.unref(),b.closeSync(i),t(e,n,{pid:a.pid??null})}async function Ln(e,r,i,a){let s=i.cwd,l=r.engine===`codex`?I(s):bn(),u=r.model?e.models?.[r.model]:void 0;if(!l.available&&u&&V(u)){let e=On(l);i.onInstallNote?.(e.note),l=I(s)}if(!l.available)throw new Nn(r.agent,l.detail);let d=null;a.resume&&(d=n(s,a.resume)?.threadId??a.resume);let f=ae(),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}:{}});In(s,f);let ee=2**53-1,m=()=>c(s,f,ee).filter(e=>e.phase!==`starting`).length,te=Date.now()+15e3,g=p,_=null,v=null;for(;Date.now()<(v??te)&&(g=h(s,f)??g,g.status!==`failed`&&g.status!==`completed`);){if(g.threadId&&_===null&&(_=m(),v=Date.now()+5e3),_!==null&&m()>_){g=h(s,f)??g;break}await new Promise(e=>setTimeout(e,150))}if(g.status===`failed`){let e=M(x.join(o(s,f),`result.json`))?.error?.message??``,t=c(s,f,5).map(e=>e.message??``).join(`
|
|
17
|
+
`),n=e||t;throw Fn(r.permissions,n)?new G(`read-only-unavailable`,n):jn.test(n)?new Nn(r.agent,n):new G(`startup-failed`,n,{taskId:f})}return{taskId:f,job:g,agent:r.agent,startupCheck:g.threadId?`passed`:`pending`}}function Rn(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 zn(e){if(y.env.CODER_WORKER)throw new G(`nested-dispatch`,`Nested dispatch refused: this shell is already inside a coder task. Do the work yourself, directly in this session - ignore any skill or instruction telling you to orchestrate via the coder CLI.`);if(!e.prompt.trim())throw new G(`invalid-option`,`Missing task text.`,{hint:[`Usage: coder run "<task text>"`,`Help: coder task run --help`]});let t=on(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=Pn(n,t);try{return await Ln(t,i,e,r)}catch(a){if(!(a instanceof Nn))throw a;let o=t.chain[t.chain.indexOf(a.agent)+1];if(!o){let t=Rn(a.agent,a.detail,i.permissions,e.system,e.prompt);throw new G(`chain-exhausted`,t.error,{payload:t})}e.onFallback?.({agent:a.agent,detail:a.detail,next:o}),n={agent:o,permissions:e.permissions},r={name:void 0,resume:void 0,simulateApproval:void 0}}}}function Bn(e,t){if(t.status!==`failed`)return;let n=t.result;if(!n||!jn.test(n.error?.message??``)||!(!n.touchedFiles?.length&&!n.fileChanges?.length&&!n.commandExecutions?.length))return;let r=on(e).chain;return r[r.indexOf(t.job.agent)+1]}function Vn(e,t){return M(x.join(o(e,t),`result.json`))}function Hn(e,t,n=0){return n===0?[]:c(e,t,n===`all`?2**53-1:n)}function Un(e,t,n={}){let r=h(e,t);if(!r)throw Error(`No task found for "${t}".`);return{taskId:t,status:r.status,result:Vn(e,t),steps:Hn(e,t,n.tail),turns:l(e,t),job:r}}async function Wn(e,t,n={}){let r=h(e,t);if(!r)throw Error(`No task found for "${t}".`);let i=await ft(e,r);if(i.reason===`approval`){let e=i.approval;throw new G(`approval-pending`,`Approval needed for task ${t}: ${e.summary}`,{taskId:t,approval:e})}n.onSettle?.();let a=i.job;return{taskId:t,status:a.status,result:Vn(e,t),steps:Hn(e,t,n.tail),turns:l(e,t),job:a}}const Gn=[`.ts`,`.mjs`,`.js`];function Kn(e,t){let n=[];try{n=b.readdirSync(e)}catch{return[]}let r=[];for(let i of n.sort()){let n=x.extname(i);Gn.includes(n)&&r.push({name:x.basename(i,n),path:x.join(e,i),scope:t})}return r}function qn(e){let t=s(e),n=[],i=x.resolve(e);for(;n.push({dir:x.join(i,`.coder`,`flows`),scope:`workspace`}),i!==t&&x.dirname(i)!==i;)i=x.dirname(i);return n.push({dir:x.join(r(),`flows`),scope:`global`}),n}function Jn(e){let t=new Set,n=[];for(let{dir:r,scope:i}of qn(e))for(let e of Kn(r,i))t.has(e.name)||(t.add(e.name),n.push(e));return n}function Yn(e){return e.includes(`/`)||Gn.includes(x.extname(e))}function Xn(e,t){if(Yn(e)){let n=x.resolve(t,e);if(b.existsSync(n))return{name:x.basename(n,x.extname(n)),path:n};throw Error(`Flow file not found: ${e}`)}let n=Jn(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 Zn(e,t,n={}){if(t.length)try{S(y.execPath,[ee,`_archiveSweep`,`--cwd`,e,...n.flows?[`--flows`]:[],...t],{detached:!0,stdio:`ignore`}).unref()}catch{}}async function Qn(e){let{options:t,positionals:r}=te(e,w.object({cwd:re,flows:ne})),i=A(t);for(let e of r){if(t.flows){let t=Z(e);t&&Br(t);continue}let r=n(i,e);r&&ie(i,r)}}async function $n(e){let{options:t,positionals:n}=te(e,w.object({..._,"all-stopped":ne}));Be(n,1,`task archive`);let r=A(t);if(t[`all-stopped`]){let e=u(r).filter(e=>a.includes(e.status));for(let t of e)ie(r,t);let n=e.map(e=>e.id);if(t.json){O({archived:n,count:n.length});return}y.stdout.write(n.length?`Archived ${n.length} stopped task${n.length===1?``:`s`}.\n`:`${T.dim(`No stopped tasks to archive.`)}\n`);return}let i=n[0];i||D(`Missing task id.`,{hint:[`Archive one: coder task archive <task-id>`,`Archive all stopped: coder task archive --all-stopped`]});let o=Ve(r,i);if(ie(r,o),t.json){O({taskId:o.id,archived:!0});return}y.stdout.write(`Archived task ${T.cyan(o.id)}.\n`)}async function er(e,n){let r=n.engine===`claude`?{detail:`claude worker terminated`}:await It(e,{threadId:n.threadId,turnId:n.turnId});if(n.pid&&n.status===`running`)try{y.kill(n.pid,`SIGTERM`)}catch{}return t(e,n.id,{status:`cancelled`,completedAt:new Date().toISOString()}),{taskId:n.id,status:`cancelled`,interrupt:r.detail}}async function tr(e){let{options:t,positionals:n}=te(e,w.object(_));Be(n,1,`task stop`);let r=A(t),i=Ve(r,n[0]),{interrupt:a}=await er(r,i);if(t.json){O({taskId:i.id,status:`cancelled`,interrupt:a});return}y.stdout.write(`Stopped task ${T.cyan(i.id)} ${T.dim(`(${a})`)}\n`)}function nr(e){return typeof e!=`object`||!e?JSON.stringify(e)??`null`:Array.isArray(e)?`[${e.map(nr).join(`,`)}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${nr(e[t])}`).join(`,`)}}`}function rr(e,t){return fe.createHash(`sha256`).update(`${e}\0${nr(t)}`).digest(`hex`)}function K(e){return b.existsSync(e)?b.readFileSync(e,`utf8`).split(/\r?\n/).filter(Boolean).map(e=>{try{return JSON.parse(e)}catch{return null}}).filter(e=>e!==null):[]}var ir=class{file;recorded;seq=0;constructor(e,t){this.file=t,this.recorded=e.map(e=>({...e})),b.writeFileSync(t,``,`utf8`)}write(e){e.seq=this.seq++,b.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 ar=globalThis,q=ar.__coderFlowCtxALS??=new me,J=ar.__coderFlowScopeALS??=new me;function or(){return J.getStore()?.args}function sr(){return J.getStore()?.depth??0}var cr=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 lr(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 ur(e,t){if(!t.tokens)return;let n=t.model??`default`;e.ledger[n]=lr(e.ledger[n]??null,t.tokens)}function dr(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 pr(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 mr(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 hr(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 gr(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 _r(e,t,n,r){let i=t.cwd?x.resolve(t.cwd):n?.cwd??y.cwd(),a;for(;;){let o=await zn({prompt:e,...gr(t,i,n),...a?{agent:a,model:void 0,effort:void 0,resume:void 0}:{resume:r??t.resume},onFallback:e=>Dr(`${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=h(i,o.taskId),c=s?Ce(s):void 0;n?.hooks.onTaskStart?.({taskId:o.taskId,name:t.name,prompt:e,agent:c,depth:sr()});let l;try{l=await Wn(i,o.taskId)}finally{n?.running.delete(o.taskId)}let u=Bn(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 pr(t.returns)}`),n?.dryRun){y.stdout.write(`\n[dry-run] task${t.name?` (${t.name})`:``}:\n${r}\n`);let e={...t,returns:t.returns?`<schema>`:void 0};return y.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 _r(r,t,n);if(i.status!==`completed`){let e={...i,data:void 0};throw new G(`task-failed`,`Task ${i.taskId} ${i.status}: ${i.output||`no output`}`,{taskId:i.taskId,result:e})}let a=i.output,o=i.tokens,s;if(t.returns){let e;try{e=hr(t.returns,mr(a))}catch(t){e={ok:!1,errors:t instanceof Error?t.message:String(t)}}if(e.ok)s=e.data;else{let r=await _r(`Your previous reply did not match the required format: ${e.errors}\n\n${await pr(t.returns)}`,t,n,i.taskId);a=r.output||a,o=lr(o,r.tokens);try{let e=hr(t.returns,mr(a));if(!e.ok)throw Error(e.errors);s=e.data}catch(e){let t={taskId:i.taskId,status:`completed`,output:a,data:void 0,tokens:o,model:i.model};throw new G(`task-failed`,`Task ${i.taskId} produced no valid structured output: ${e instanceof Error?e.message:String(e)}`,{taskId:i.taskId,result:t})}}}return{taskId:i.taskId,status:`completed`,output:a,data:s,tokens:o,model:i.model}}async function yr(e){if(e)return await fr(e)??`<schema>`}async function br(e,t={}){let n=q.getStore();if(!n)return vr(e,t);let r=rr(`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 yr(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 G?e.result:void 0;throw t&&n.hooks.onTaskEnd?.({taskId:t.taskId,status:t.status===`completed`?`failed`:t.status,tokens:t.tokens}),e}return ur(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 xr=262144;let Sr=0;function Cr(e){let t=[];for(let n=e;;){t.push(x.join(n,`node_modules`,`.bin`));let e=x.dirname(n);if(e===n)break;n=e}let n=y.platform===`win32`?`;`:`:`;return{...y.env,PATH:[...t,y.env.PATH??``].join(n)}}async function wr(e,t){return new Promise(n=>{let r=S(e,{shell:!0,cwd:t,env:Cr(t)}),i=``,a=e=>{i.length>=xr||(i+=e,i.length>=xr&&(i=`${i.slice(0,xr)}\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 Tr(e,t={}){let n=q.getStore(),r=t.cwd?x.resolve(t.cwd):n?.cwd??y.cwd();if(!n)return wr(e,r);let i=rr(`gate`,{cmd:e,cwd:t.cwd}),a=n.journal.replay(i);if(a)return a.result;if(n.dryRun){y.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-${y.pid}-${Sr+=1}`,c=sr();n.hooks.onGateStart?.({gateId:s,cmd:e,depth:c});let l=await wr(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 Er(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 Dr(e){let t=q.getStore();if(t)try{b.appendFileSync(x.join(t.runDir,`flow.log`),`${JSON.stringify({at:new Date().toISOString(),message:e})}\n`,`utf8`)}catch{}t?.hooks.onLog?t.hooks.onLog(e,sr()):(y.stderr.isTTY||!t)&&y.stderr.write(`[flow] ${e}\n`)}const Or=se(import.meta.url);function kr(e){let t=x.dirname(le(import.meta.url));for(;x.basename(t)!==`dist`&&x.dirname(t)!==t;)t=x.dirname(t);return x.basename(t)===`dist`?ue(x.join(t,e)).href:null}function Ar(e){if(!(e===`@wular/coder`||e===`@wular/coder/flow`||e===`zod`||e.startsWith(`zod/`)))return null;try{return ue(Or.resolve(e)).href}catch{}return e===`@wular/coder/flow`?kr(`flow/index.js`):e===`@wular/coder`?kr(`sdk.js`):null}const jr=/(\bfrom\s+|\bimport\s+|\bimport\s*\(\s*)(['"])([^'"]+)\2/g;function Mr(e){return e.replace(jr,(e,t,n,r)=>{let i=Ar(r);return i?`${t}${n}${i}${n}`:e})}async function Nr(e,t,n){try{return await import(ue(e).href)}catch(e){let r=e instanceof Error?e.message:String(e);throw t===`.ts`&&!y.versions?.bun&&/Unknown file extension|Unexpected token|SyntaxError|Cannot parse|import type|interface/i.test(r)?Error(`Could not run ${x.basename(n)}: TypeScript flows need bun. Run under \`bun\`, or write the flow as .mjs/.js.`):e}}async function Pr(e){let t=x.extname(e),n;try{n=b.readFileSync(e,`utf8`)}catch{throw Error(`Cannot read flow file: ${e}`)}let r=Mr(n);if(r===n)return Nr(e,t,e);let i=x.dirname(e);try{for(let e of b.readdirSync(i)){if(!e.startsWith(`.__coderflow_`))continue;let t=x.join(i,e);Date.now()-b.statSync(t).mtimeMs>6e5&&b.unlinkSync(t)}}catch{}let a=`${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`,o=x.join(i,`.__coderflow_${a}${t}`),s=`__coderflow_loaded_${a}`,c=new Promise(e=>{globalThis[s]=e});b.writeFileSync(o,`globalThis[${JSON.stringify(s)}]?.();${r}`,`utf8`);let l=Nr(o,t,e);try{await Promise.race([c,l.then(()=>void 0,()=>void 0)])}finally{delete globalThis[s];try{b.unlinkSync(o)}catch{}}return await l}async function Fr(e,t){let n=J.getStore();n.args=t??{};let r=await Pr(e),i=r.args,a=n.args;if(dr(i)){let e=i.safeParse(t??{});if(!e.success){let e=hr(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 Ir(e,t){let n=q.getStore(),r=Xn(e,n?.cwd??y.cwd());if(!n)return J.run({args:t??{},depth:0},()=>Fr(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=rr(`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},()=>Fr(r.path,t));return n.journal.record({kind:`flow`,fingerprint:a,result:c,startedAt:s,endedAt:new Date().toISOString()}),c}function Lr(){return`flow-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function Y(){return x.join(r(),`state`,`global`,`flows`)}function Rr(){return x.join(r(),`state`,`global`,`flows-archived`)}function X(e){oe(e,`flow run id`);let t=x.join(Y(),e);if(b.existsSync(x.join(t,`flow.json`)))return t;let n=x.join(Rr(),e);return b.existsSync(x.join(n,`flow.json`))?n:t}function zr(e){if(e.archived)return e;let t={...e,archived:!0,archivedAt:new Date().toISOString()};return Q(X(e.runId),t),t}function Br(e){let t=zr(e),n=X(e.runId),r=x.join(Rr(),e.runId);if(n!==r)try{b.mkdirSync(Rr(),{recursive:!0}),b.renameSync(n,r)}catch{}return t}function Vr(e){let t=X(e.runId),n=x.join(Y(),e.runId);if(t!==n)try{b.mkdirSync(Y(),{recursive:!0}),b.renameSync(t,n)}catch{}let r={...e,archived:void 0,archivedAt:void 0};return Q(X(e.runId),r),r}function Hr(e){let t=X(e);return b.existsSync(x.join(t,`flow.json`))?(b.rmSync(t,{recursive:!0,force:!0}),!0):!1}function Ur(e){if(!f(e))return null;let t=x.join(X(e),`flow.json`);if(!b.existsSync(t))return null;try{return JSON.parse(b.readFileSync(t,`utf8`))}catch{return null}}function Wr(e){return e.status!==`running`||!e.pid||ni(e)?e:($r(e.runId,`orchestrator died`),Ur(e.runId)??e)}function Z(e){let t=Ur(e);return t?Wr(t):null}function Q(e,t){b.writeFileSync(x.join(e,`flow.json`),`${JSON.stringify(t,null,2)}\n`,`utf8`)}function Gr(e){let t=[];try{t=b.readdirSync(e)}catch{return[]}let n=[];for(let r of t)try{n.push(Wr(JSON.parse(b.readFileSync(x.join(e,r,`flow.json`),`utf8`))))}catch{}return n}const Kr=(e,t)=>String(t.startedAt).localeCompare(String(e.startedAt));function qr(){let e=[];for(let t of Gr(Y()))t.archived?Br(t):e.push(t);return e.sort(Kr)}function Jr(e){let t=e?.migrate??!0,n=Gr(Rr()),r=new Set(n.map(e=>e.runId));for(let e of Gr(Y()))e.archived&&!r.has(e.runId)&&n.push(t?Br(e):e);return n.sort(Kr)}function Yr(){return[...qr(),...Jr()].sort(Kr)[0]??null}function Xr(e,t=`all`){if(t===0)return[];let n=K(x.join(X(e),`journal.jsonl`)).filter(e=>e.kind===`task`),r=u(y.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 Zr(e={}){let t;if(e.archived)t=Jr();else{let e=[];t=qr().filter(t=>t.status===`running`||t.status===`queued`||ve(t.endedAt??t.startedAt)<=6e5||(zr(t),e.push(t.runId),!1)),Zn(y.cwd(),e,{flows:!0})}let n=e.limit===void 0?0:Math.max(0,t.length-e.limit);return{runs:e.limit===void 0?t:t.slice(0,e.limit),clipped:n}}function Qr(e,t={},n){let r,i,a;if(n){let e=Z(n);if(!e)throw Error(`No flow run "${n}".`);e.archived&&Vr(e),r=e.name,i=e.script,a=t.args??e.args}else{let n=Xn(e,t.cwd?x.resolve(t.cwd):y.cwd());r=n.name,i=n.path,a=t.args??{}}let o=n??Lr(),s=X(o);b.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??ce.cpus().length),maxTasks:Math.max(1,t.maxTasks??ce.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 $r(e,t){let n=Ur(e);!n||n.status!==`running`||$(X(e),n,{status:`failed`,error:t})}const ei=`stop-keep-tasks`;function ti(e){try{return y.kill(e,0),!0}catch{return!1}}function ni(t){if(!t.pid||!ti(t.pid))return!1;let n=e(t.pid),r=Date.parse(t.pidStartedAt??``);return n===null||!Number.isFinite(r)||n<=r+6e4}function ri(e){let t=u(y.cwd()),n=new Map(t.map(e=>[e.id,e])),r=new Set(t.filter(t=>t.flowRunId===e).map(e=>e.id));for(let t of K(x.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 ii(e,t=[]){let n=y.cwd(),r=[];for(let i of new Set([...ri(e),...t])){let e=h(n,i);if(!(!e||a.includes(e.status)))try{await er(n,e),r.push(i)}catch{}}return r}async function ai(e,t={}){let n=e?Z(e):Yr();if(!n)throw new G(`flow-failed`,e?`No flow run "${e}".`:`No flow runs.`,{hint:`Run one: coder flow run <name>`});if(n.status!==`running`)throw new G(`flow-failed`,`Run ${n.runId} is not running.`,{runId:n.runId,hint:`Result: coder flow result ${n.runId}`});let r=X(n.runId);if(!ni(n))return $(r,n,{status:`failed`,error:`orchestrator died`}),{runId:n.runId,status:`failed`,stoppedTasks:[],keptTasks:ri(n.runId)};let i=ri(n.runId),o=x.join(r,ei);t.keepTasks&&b.writeFileSync(o,``,`utf8`);try{y.kill(n.pid,`SIGINT`);let e=Z(n.runId);for(let t=0;t<25&&e?.status===`running`;t+=1)await new Promise(e=>setTimeout(e,200)),e=Z(n.runId);if(!e||e.status===`running`)throw new G(`flow-failed`,`Run ${n.runId} did not stop within 5s.`,{runId:n.runId,hint:`Check it: coder flow result ${n.runId}`});let t=y.cwd(),r=[],o=[];for(let e of i){let n=h(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{b.unlinkSync(o)}catch{}}}async function*oi(e,t,n={}){let r=x.join(X(e),`events.jsonl`),i=n.tail??`all`,a=0;if(i!==`all`)try{a=Math.max(0,b.readFileSync(r,`utf8`).split(`
|
|
18
|
+
`).length-1-i)}catch{}let o=Qe(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?!ni(c):t!==void 0&&!ti(t);if(c&&(c.pid||t!==void 0)&&n){$r(e,`orchestrator died`);break}await new Promise(e=>setTimeout(e,400)),c=Z(e)??c}yield*s()}function si(e,t,n,r){let i={...Qr(e,t,r),pid:y.pid,pidStartedAt:new Date().toISOString()},{runId:a}=i,o=X(a);Q(o,i);let s=x.join(o,`journal.jsonl`),c=r?K(s):[],l=new ir(c,s),u={runId:a,runDir:o,cwd:t.cwd?x.resolve(t.cwd):y.cwd(),journal:l,semaphore:new cr(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 ci(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},()=>Fr(t,r)));return $(a,s,{status:`completed`,taskCount:i.taskCount,ledger:i.ledger,result:e}),{runId:o,name:n,status:`completed`,result:e,tokens:i.ledger,taskCount:i.taskCount}}catch(e){throw i.stopping||$(a,s,{status:`failed`,taskCount:i.taskCount,ledger:i.ledger,error:e instanceof Error?e.message:String(e)}),new G(`flow-failed`,e instanceof Error?e.message:String(e),{runId:o})}}async function li(e,t={},n={}){let{started:r}=si(e,t,n),i=Z(r.runId).script;return n.onStart?.({runId:r.runId,requestStop:r.markStopped,runningIds:()=>[...r.ctx.running]}),ci(r,i,Z(r.runId).name,t.args??{})}async function ui(e,t={},n={}){let{started:r,args:i,name:a,replayable:o}=si(``,t,n,e),s=Z(e).script;return n.onStart?.({runId:e,requestStop:r.markStopped,runningIds:()=>[...r.ctx.running]}),o&&n.onReplay?.(o),ci(r,s,a,i)}export{L as $,O as $t,Jn as A,qe as At,Wn as B,D as Bt,br as C,ot as Ct,$n as D,Qe as Dt,er as E,ut as Et,Rn as F,Le as Ft,wn as G,_e as Gt,On as H,ye as Ht,zn as I,Ee as It,bn as J,ke as Jt,En as K,k as Kt,Fn as L,ve as Lt,G as M,Je as Mt,jn as N,Ye as Nt,Qn as O,M as Ot,Mn as P,De as Pt,R as Q,Re as Qt,Un as R,Ae as Rt,oi as S,at as St,tr as T,ct as Tt,An as U,Ce as Ut,Tn as V,xe as Vt,Dn as W,ge as Wt,B as X,Ie as Xt,Cn as Y,we as Yt,z as Z,T as Zt,ui as _,Rt as _t,Hr as a,je as an,V as at,ii as b,lt as bt,Tr as c,gn as ct,qr as d,dn as dt,Se as en,zt as et,Dr as f,W as ft,Z as g,I as gt,Qr as h,Ft as ht,or as i,ze as in,pn as it,Xn as j,Xe as jt,Zn as k,Ze as kt,Yr as l,cn as lt,Er as m,_n as mt,Br as n,Ve as nn,un as nt,Ir as o,Me as on,on as ot,$r as p,U as pt,xn as q,be as qt,Zr as r,A as rn,H as rt,Xr as s,Te as sn,sn as st,ei as t,Be as tn,Bt as tt,Jr as u,fn as ut,X as v,Lt as vt,K as w,N as wt,ai as x,dt as xt,li as y,ft as yt,In as z,Oe 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,E as a,I as o,M as s,R as c,Tt as l,bt 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,E as a,I as o,M as s,R as c,Tt as l,bt as u}from"./runtime-DKvmKCSR.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-Coqsp0jR.js";import O from"./flow/index.js";import k from"node:process";import A from"node:path";function j(e){return e?A.resolve(e):k.cwd()}function M(t,n){let r=e(t,n);if(!r)throw Error(n?`No task found for "${n}".`:`No tasks found for this workspace.`);return r}const N={async run(e,t={}){let{taskId:n}=await o({prompt:e,cwd:j(t.cwd),agent:t.agent,model:t.model,effort:t.effort,permissions:t.permissions,name:t.name,system:t.system,resume:t.resume});return{taskId:n}},async result(e,t={}){let n=j(t.cwd),r=e??M(n).id;return t.wait?i(n,r,{tail:t.tail}):c(n,r,{tail:t.tail})},list(e={}){return h(j(e.cwd),e).jobs},async steer(e,t,n={}){let r=j(n.cwd);return p(r,M(r,e),t,{model:n.model,effort:n.effort,permissions:n.permissions})},async ask(e,t,n={}){let r=j(n.cwd),i=M(r,e),a=await f(r,i,t,{model:n.model,effort:n.effort});return{taskId:i.id,answer:a.finalMessage||null}},async stop(e,t={}){let n=j(t.cwd);return a(n,M(n,e))},archive(e,t={}){let r=j(t.cwd);return n(r,M(r,e)),{taskId:e,archived:!0}},delete(e,t={}){let n=j(t.cwd),i=M(n,e);if(i.status===`running`)throw Error(`Task ${i.id} is still running.`);D(i);let a=r(n,i.id);return{taskId:i.id,deleted:a}},approve(e,n,r={}){let i=j(r.cwd),a=M(i,e),o=r.deny?`decline`:`accept`;return u(t(i,a.id),n,o),{taskId:a.id,approvalId:n,decision:o}},approvals(e,n={}){let r=j(n.cwd),i=e?M(r,e):M(r);return l(t(r,i.id))},stream(e,t={}){let n=j(t.cwd);return d(n,e??M(n).id,{tail:t.tail})}},P={add:(e,t)=>w(j(t.cwd),e,t),update:(e,t)=>v(j(t.cwd),e,t),remove:(e,t={})=>x(j(t.cwd),e,t),list:(e={})=>g(j(e.cwd)),alias:(e,t,n={})=>T(j(n.cwd),e,t,n),unalias:(e,t={})=>_(j(t.cwd),e,t),disable:(e,t={})=>E(j(t.cwd),e,!0,t),enable:(e,t={})=>E(j(t.cwd),e,!1,t)},F={get:(e,t={})=>y(j(t.cwd),e),set:(e,t,n={})=>m(j(n.cwd),e,t,n)};function I(e=[],t={}){return S(j(t.cwd),{claude:e.includes(`claude`),codex:e.includes(`codex`),agents:e.includes(`agents`)})}function L(e={}){return C(e)}function R(e){return b(e)}var z={task:N,flow:O,model:P,config:F,setupHost:I,upgrade:L,docs:R};export{s as CoderError,F as config,z as default,R as docs,O as flow,P as model,I as setupHost,N as task,L as upgrade};
|
|
@@ -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{$ as E,$t as D,At as ee,Bt as O,Dt as te,G as ne,H as re,Ht as ie,J as ae,Jt as k,K as oe,Lt as se,Ot as ce,Q as le,Qt as ue,Rt as A,Tt as de,U as fe,Ut as pe,V as me,Vt as he,W as ge,Wt as j,X as _e,Y as ve,Yt as ye,Z as M,Zt as N,_t as be,at as P,ct as xe,dt as Se,en as Ce,et as we,ft as F,g as Te,gt as I,ht as Ee,it as L,jt as De,k as Oe,mt as ke,nn as R,nt as z,ot as B,pt as Ae,q as je,qt as Me,rn as V,rt as H,sn as Ne,st as U,tn as W,ut as Pe,vt as Fe,z as Ie,zt as Le}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{$ as E,$t as D,At as ee,Bt as O,Dt as te,G as ne,H as re,Ht as ie,J as ae,Jt as k,K as oe,Lt as se,Ot as ce,Q as le,Qt as ue,Rt as A,Tt as de,U as fe,Ut as pe,V as me,Vt as he,W as ge,Wt as j,X as _e,Y as ve,Yt as ye,Z as M,Zt as N,_t as be,at as P,ct as xe,dt as Se,en as Ce,et as we,ft as F,g as Te,gt as I,ht as Ee,it as L,jt as De,k as Oe,mt as ke,nn as R,nt as z,ot as B,pt as Ae,q as je,qt as Me,rn as V,rt as H,sn as Ne,st as U,tn as W,ut as Pe,vt as Fe,z as Ie,zt as Le}from"./runtime-DKvmKCSR.js";import G from"node:process";import K from"node:fs";import q from"node:path";import{spawnSync as Re}from"node:child_process";import ze from"node:os";import{fileURLToPath as Be}from"node:url";import*as J from"zod/mini";import Ve from"node:crypto";import He from"node:http";let Ue=0;function We(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 Ge(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:We(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 Ke=class{send;model;responseId=`resp_bridge_${++Ue}`;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 qe(e,t=`chat`){let n=t===`responses`,r=z(e.baseUrl,n?`responses`:`chat/completions`),i=null,a=e.envKey?G.env[e.envKey]:void 0;async function o(e){let t=i?[i]:r,n=null;for(let r of t)if(n=await fetch(r,{method:`POST`,headers:{"content-type":`application/json`,...a?{authorization:`Bearer ${a}`}:{}},body:e}),n.status!==404)return i=r,n;return n}let s=Ve.randomBytes(16).toString(`hex`),c=He.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(Ge(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 Ke(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 Je(e,t,n){let r=e.envKey?G.env[e.envKey]:void 0,i=!1;for(let a of z(e.baseUrl,t))try{let e=await fetch(a,{method:`POST`,headers:{"content-type":`application/json`,...r?{Authorization:`Bearer ${r}`}:{}},body:JSON.stringify(n),signal:AbortSignal.timeout(5e3)});if(i=!0,e.status!==404&&e.status!==405&&e.status!==501)return{baseUrl:a.slice(0,-(t.length+1))}}catch{}return{reachable:i}}async function Ye(e){let t=await Je(e,`responses`,{model:e.model,input:[],stream:!1});if(`baseUrl`in t)return{wireApi:`responses`,baseUrl:t.baseUrl};let n=await Je(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*Xe(e,t,n={}){let r=new Set([`completed`,`failed`,`cancelled`]),a=g(e,t);if(!a)throw Error(`No task found for "${t}".`);let o=n.tail??1,c=te(q.join(i(e,t),`log.jsonl`)),l=!0,u=()=>{let e=c();return l&&(l=!1,o!==`all`&&(e=o===0?[]:e.slice(-o))),e.map(e=>{try{return JSON.parse(e)}catch{return{message:e}}})};for(yield*u();!r.has(a.status);)await new Promise(e=>setTimeout(e,400)),a=s(e,g(e,t)??a),yield*u();yield*u()}async function Ze(e){let{options:t,positionals:n}=v(e,J.object({...b,tail:p,trim:J.optional(J.union([J.literal(`none`),J.coerce.number().check(J.int(),J.positive())],{error:`expected a positive integer or "none"`}))}));W(n,1,`task watch`);let r=V(t),a=R(r,n[0]),o=t.tail,c=t.trim,l=c===void 0?300:c===`none`?2**53-1:c;if(!t.json){G.stdout.write(`${N.dim(`[coder] task ${a.id} ${a.status} — watching (Ctrl-C to stop)`)}\n`);let e=[`${N.dim(`agent`.padEnd(8))} ${pe(a)}`,...ye(a,N)];G.stdout.write(`${e.join(`
|
|
3
|
-
`)}\n`),a.prompt&&G.stdout.write(`${Ce(a.prompt,N).join(`
|
|
4
|
-
`)}\n`)}for await(let e of Xe(r,a.id,{tail:o}))if(t.json){let t=e.message?{...e,message:Ne(e.message,l,{plain:!0})}:e;G.stdout.write(`${JSON.stringify(t)}\n`)}else{let t=e.message??e.kind;t&&G.stdout.write(`${N.dim(`[coder]`)} ${Ne(t,l)}\n`)}let u=s(r,g(r,a.id)??a),d=ce(q.join(i(r,a.id),`result.json`));if(t.json)D({taskId:a.id,status:u.status,result:d});else{let e=u.status===`completed`?`(no final message)`:`(task ${u.status})`;G.stdout.write(`\n${he(d,u.error,e)}\n`);let t=d?.tokens?` tokens=${Me(d.tokens,d.model??u.model)}`:``;G.stderr.write(`${N.dim(`[coder] task=${a.id} status=${u.status}${t}`)}\n`)}G.exit(u.status===`completed`?0:1)}async function Qe(e,t,n){if(t.status!==`running`)return null;if(t.engine!==`claude`&&(await Fe(e,{threadId:t.threadId,text:n})).steered)return{taskId:t.id,steered:`live`};let r=g(e,t.id)??t;return u.includes(r.status)?(c(e,r.id,n),{taskId:r.id,steered:`queued`}):null}async function $e(e,t,n,r={}){if(!t.threadId)throw Error(`Task ${t.id} has no thread to steer yet (status: ${t.status}).`);return await Qe(e,t,n)||(et(e,t,n,r),{taskId:t.id,steered:`resumed`})}function et(t,n,r,i){e(t,n.id,{status:`queued`,resumedAt:new Date().toISOString(),currentPrompt:r,resumeThreadId:n.threadId,model:i.model??n.model??null,effort:i.effort??n.effort??null,permissions:i.permissions??n.permissions,error:void 0}),d(t,n.id,{message:`Resuming with steered follow-up.`}),Ie(n.cwd??t,n.id)}async function tt(e){let{options:t,positionals:n}=v(e,J.object({...b,model:C,effort:C,permissions:C,background:S,wait:S})),r=V(t),[i,...a]=n,o=a.join(` `).trim();(!i||!o)&&O(`Missing task id or follow-up text.`,{hint:[`Usage: coder task steer <task-id> "<follow-up>" [--wait]`,`Help: coder task steer --help`]});let s=R(r,i);s.threadId||O(`Task ${s.id} has no thread to steer yet (status: ${s.status}).`,{hint:`Wait for it to start: coder task watch ${s.id}`});let c=await $e(r,s,o,{model:t.model,effort:t.effort,permissions:t.permissions});return nt(r,c.taskId,{steered:c.steered,options:t})}async function nt(e,t,{steered:n,options:r}){if(n===`queued`){if(r.json){D({taskId:t,steered:`queued`});return}G.stdout.write(`${N.dim(`[coder]`)} follow-up queued for task ${N.cyan(t)}; it runs when the current turn finishes.\n`),r.wait&&G.stdout.write(`\n${N.dim(`[coder] --wait is not available for a queued follow-up; check: coder task result ${t}`)}\n`);return}if(!r.wait){if(r.json){D({taskId:t,steered:n});return}G.stdout.write(n===`live`?`${N.dim(`[coder]`)} steered follow-up into running task ${N.cyan(t)}.\n`:`${N.dim(`[coder]`)} resumed task ${N.cyan(t)} with the follow-up (same thread, same id).\n`),G.stdout.write(`\n${N.dim(` result: coder task result ${t}`)}\n`);return}let a=g(e,t),o=a?await T(e,a):null,s=ce(q.join(i(e,t),`result.json`));r.json?D({taskId:t,status:o?.status??null,finalMessage:s?.finalMessage??null}):(G.stdout.write(`\n${s?.finalMessage||`(no final message)`}\n\n`),G.stderr.write(`${N.dim(`[coder] task=${t} status=${o?.status??`unknown`}`)}\n`)),G.exitCode=o?.status===`completed`?0:1}function
|
|
3
|
+
`)}\n`),a.prompt&&G.stdout.write(`${Ce(a.prompt,N,{truncate:!1}).join(`
|
|
4
|
+
`)}\n`)}for await(let e of Xe(r,a.id,{tail:o}))if(t.json){let t=e.message?{...e,message:Ne(e.message,l,{plain:!0})}:e;G.stdout.write(`${JSON.stringify(t)}\n`)}else{let t=e.message??e.kind;t&&G.stdout.write(`${N.dim(`[coder]`)} ${Ne(t,l)}\n`)}let u=s(r,g(r,a.id)??a),d=ce(q.join(i(r,a.id),`result.json`));if(t.json)D({taskId:a.id,status:u.status,result:d});else{let e=u.status===`completed`?`(no final message)`:`(task ${u.status})`;G.stdout.write(`\n${he(d,u.error,e)}\n`);let t=d?.tokens?` tokens=${Me(d.tokens,d.model??u.model)}`:``;G.stderr.write(`${N.dim(`[coder] task=${a.id} status=${u.status}${t}`)}\n`)}G.exit(u.status===`completed`?0:1)}async function Qe(e,t,n){if(t.status!==`running`)return null;if(t.engine!==`claude`&&(await Fe(e,{threadId:t.threadId,text:n})).steered)return{taskId:t.id,steered:`live`};let r=g(e,t.id)??t;return u.includes(r.status)?(c(e,r.id,n),{taskId:r.id,steered:`queued`}):null}async function $e(e,t,n,r={}){if(!t.threadId)throw Error(`Task ${t.id} has no thread to steer yet (status: ${t.status}).`);return await Qe(e,t,n)||(et(e,t,n,r),{taskId:t.id,steered:`resumed`})}function et(t,n,r,i){e(t,n.id,{status:`queued`,resumedAt:new Date().toISOString(),currentPrompt:r,resumeThreadId:n.threadId,model:i.model??n.model??null,effort:i.effort??n.effort??null,permissions:i.permissions??n.permissions,error:void 0}),d(t,n.id,{message:`Resuming with steered follow-up.`}),Ie(n.cwd??t,n.id)}async function tt(e){let{options:t,positionals:n}=v(e,J.object({...b,model:C,effort:C,permissions:C,background:S,wait:S})),r=V(t),[i,...a]=n,o=a.join(` `).trim();(!i||!o)&&O(`Missing task id or follow-up text.`,{hint:[`Usage: coder task steer <task-id> "<follow-up>" [--wait]`,`Help: coder task steer --help`]});let s=R(r,i);s.threadId||O(`Task ${s.id} has no thread to steer yet (status: ${s.status}).`,{hint:`Wait for it to start: coder task watch ${s.id}`});let c=await $e(r,s,o,{model:t.model,effort:t.effort,permissions:t.permissions});return nt(r,c.taskId,{steered:c.steered,options:t})}async function nt(e,t,{steered:n,options:r}){if(n===`queued`){if(r.json){D({taskId:t,steered:`queued`});return}G.stdout.write(`${N.dim(`[coder]`)} follow-up queued for task ${N.cyan(t)}; it runs when the current turn finishes.\n`),r.wait&&G.stdout.write(`\n${N.dim(`[coder] --wait is not available for a queued follow-up; check: coder task result ${t}`)}\n`);return}if(!r.wait){if(r.json){D({taskId:t,steered:n});return}G.stdout.write(n===`live`?`${N.dim(`[coder]`)} steered follow-up into running task ${N.cyan(t)}.\n`:`${N.dim(`[coder]`)} resumed task ${N.cyan(t)} with the follow-up (same thread, same id).\n`),G.stdout.write(`\n${N.dim(` result: coder task result ${t}`)}\n`);return}let a=g(e,t),o=a?await T(e,a):null,s=ce(q.join(i(e,t),`result.json`));r.json?D({taskId:t,status:o?.status??null,finalMessage:s?.finalMessage??null}):(G.stdout.write(`\n${s?.finalMessage||`(no final message)`}\n\n`),G.stderr.write(`${N.dim(`[coder] task=${t} status=${o?.status??`unknown`}`)}\n`)),G.exitCode=o?.status===`completed`?0:1}const rt=[`Read`,`Glob`,`Grep`];function it(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:
|
|
@@ -19,18 +19,18 @@ ${e.cwd?`- the task's workspace (its code and changes): ${e.cwd}`:``}
|
|
|
19
19
|
|
|
20
20
|
Question: ${n}
|
|
21
21
|
|
|
22
|
-
Answer the question directly and concisely.`}async function
|
|
22
|
+
Answer the question directly and concisely.`}function at(e,t,n,r){return{prompt:n,model:r.model??e.model,effort:r.effort,permissions:`read-only`,additionalDirectories:[t],readOnlyAllowedTools:rt}}async function ot(e,t,n,r={}){let a=i(e,t.id),o=it(t,a,n),s=r.effort??t.effort??null;if(t.engine===`claude`)return ve(t.cwd??e,at(t,a,o,{model:r.model,effort:s}));let c=B(e),l=r.model??t.model,u=l?c.models?.[l]:void 0,d=u&&P(u)?u:void 0;if(d?.envKey&&!G.env[d.envKey])throw Error(`Missing environment variable: \`${d.envKey}\`.`);let f=d?await qe(d,d.wireApi??`chat`):null,p=Se(c,l,f??void 0);try{return await be(t.cwd??e,{prompt:o,model:p?.model??Pe(l??null),modelProvider:p?.modelProvider??null,configOverrides:p?.configOverrides??null,effort:s,sandbox:`read-only`,approvalPolicy:`never`,ephemeral:!0})}finally{await f?.close()}}async function st(e){let{options:t,positionals:n}=v(e,J.object({...b,model:C,effort:C})),r=V(t),[i,...a]=n,o=a.join(` `).trim();(!i||!o)&&O(`Missing task id or question.`,{hint:[`Usage: coder task ask <task-id> "<question>"`,`Help: coder task ask --help`]});let s=R(r,i);t.json||G.stderr.write(`${N.dim(`[coder]`)} asking about task ${N.cyan(s.id)} (read-only sidecar; the task is not interrupted)...\n`);let c=await ot(r,s,o,{model:t.model,effort:t.effort}),l=c.finalMessage||``;if(t.json)D({taskId:s.id,answer:l||null,...c.error?{error:c.error.message}:{}});else if(l)G.stdout.write(`\n${l}\n`);else{let e=c.error?.message?` ${N.red(c.error.message)}`:``;G.stdout.write(`${N.dim(`(no answer)`)}${e}\n`)}G.exitCode=c.status===0?0:1}function ct(e,n={}){let i=n.limit===`all`?void 0:n.limit,s=e=>r.includes(e.status),c=[],l=o(e).filter(t=>{if(!s(t))return!0;let n=t.completedAt??t.updatedAt??t.createdAt;return se(n)<=6e5||(_(e,t),c.push(t.id),!1)});if(Oe(e,c),n.archived?l=t(e):n.running?l=l.filter(e=>u.includes(e.status)):n.stopped&&(l=l.filter(s)),n.dir){let e=a(q.resolve(String(n.dir)));l=l.filter(t=>t.cwd&&a(t.cwd)===e)}if(!n.archived&&!n.running&&!n.stopped){let e=e=>e.status===`failed`?0:u.includes(e.status)?1:e.status===`completed`?3:2;l=[...l].sort((t,n)=>e(t)-e(n))}let d=i===void 0?0:Math.max(0,l.length-i);return i!==void 0&&(l=l.slice(0,i)),{jobs:l,clipped:d}}async function lt(e){let{options:r,positionals:a}=v(e,J.object({cwd:C,dir:C,limit:f,json:S,running:S,stopped:S,archived:S}));W(a,0,`task list`);let o=V(r),s=r.limit===`all`?void 0:r.limit,{jobs:c,clipped:l}=ct(o,{running:r.running,stopped:r.stopped,archived:r.archived,dir:r.dir??r.cwd,limit:r.limit}),d=c.map(e=>{let t=u.includes(e.status)?de(i(o,e.id)).filter(e=>!e.response).length:0;return{taskId:e.id,status:t?`waiting-approval`:e.status,pendingApprovals:t,agent:e.agent??null,model:e.model??null,effort:e.effort??null,name:e.name??null,cwd:e.cwd??null,prompt:String(e.prompt??``).replace(/\s+/g,` `).trim().slice(0,80),updatedAt:e.updatedAt,archived:e.archived??!1,flowRunId:e.flowRunId??null,idleMs:u.includes(e.status)?se(n(o,e)):null}});if(r.json){D(d);return}if(!d.length){let e=r.archived?`archived tasks`:r.running?`running tasks`:r.stopped?`recently stopped tasks`:`recent tasks`;G.stdout.write(`No ${e}.\n`);let n=[];if(!r.archived){let e=t(o,{migrate:!1}).length;e&&n.push(`${e} archived: coder task list --archived [--limit N]`)}n.length&&G.stdout.write(`\n${j(n,N)}\n`);return}let p=N,m=e=>(e.agent===`custom`&&e.model?e.model:(e.agent??`-`)+(e.model?`/${e.model}`:``))+(e.effort?`/${e.effort}`:``),h=e=>e.cwd?q.basename(e.cwd):`-`,g=(e,t,n)=>Math.min(t,Math.max(e,...n.map(e=>e.length))),_={id:g(7,28,d.map(e=>e.taskId)),status:g(6,16,d.map(e=>e.status)),who:g(5,26,d.map(m)),cwd:g(3,24,d.map(h))},y=e=>{let t=e.archived?` ${p.dim(`(archived)`)}`:``,n=e.name?e.name:p.light(e.prompt),r=e.idleMs!==null&&e.idleMs>=12e4?` ${(e.idleMs>6e5?p.red:p.dim)(`· idle ${ie(e.idleMs)}`)}`:``;G.stdout.write(`${p.cyan(e.taskId.padEnd(_.id))} ${ue(e.status,_.status)} ${p.light(Le(m(e),_.who))} ${p.light(Le(h(e),_.cwd))} ${n}${r}${t}\n`)};G.stdout.write(p.bold(p.light(`${`task-id`.padEnd(_.id)} ${`status`.padEnd(_.status)} ${`agent`.padEnd(_.who)} ${`cwd`.padEnd(_.cwd)} name\n`)));let b=new Map;for(let e of d)e.flowRunId&&(b.get(e.flowRunId)??b.set(e.flowRunId,[]).get(e.flowRunId)).push(e);let x=new Set,w=!1,T=!1;for(let e of d){if(!e.flowRunId){T&&G.stdout.write(`
|
|
23
23
|
`),y(e),w=!0,T=!1;continue}if(x.has(e.flowRunId))continue;x.add(e.flowRunId);let t=Te(e.flowRunId),n=t?`(${p.bold(e.flowRunId)} ${t.status} — flow ${t.name})`:`(${p.bold(e.flowRunId)} flow)`;G.stdout.write(`${w?`
|
|
24
|
-
`:``}${n}\n`);for(let t of b.get(e.flowRunId))y(t);w=!0,T=!0}l&&G.stdout.write(p.dim(`\n... ${l} more not shown (--limit ${s})\n`));let E=[`Result: coder task result <task-id>`];r.archived||E.push(`Older tasks: coder task list --archived [--limit N]`),G.stdout.write(`\n${j(E,p)}\n`)}function
|
|
25
|
-
`)}`);return K.mkdirSync(q.dirname(i),{recursive:!0}),K.writeFileSync(i,`${JSON.stringify(a,null,2)}\n`,`utf8`),{file:i,key:t,effective:
|
|
24
|
+
`:``}${n}\n`);for(let t of b.get(e.flowRunId))y(t);w=!0,T=!0}l&&G.stdout.write(p.dim(`\n... ${l} more not shown (--limit ${s})\n`));let E=[`Result: coder task result <task-id>`];r.archived||E.push(`Older tasks: coder task list --archived [--limit N]`),G.stdout.write(`\n${j(E,p)}\n`)}function ut(){let e=process.env.CLAUDE_CONFIG_DIR||q.join(ze.homedir(),`.claude`);return q.join(e,`projects`)}function dt(e){if(!e)return!1;let t=ut(),n=!1;try{for(let r of K.readdirSync(t)){let i=q.join(t,r,`${e}.jsonl`);K.existsSync(i)&&(K.rmSync(i,{force:!0}),n=!0)}}catch{}return n}function Y(e){e.threadId&&(e.engine===`codex`?l(e.threadId):e.engine===`claude`&&dt(e.threadId))}async function ft(e){let{options:n,positionals:r}=v(e,J.object({...b,"all-archived":S}));W(r,1,`task delete`);let i=V(n);if(n[`all-archived`]){let e=t(i).filter(e=>(Y(e),w(i,e.id))).map(e=>e.id);if(n.json){D({deleted:e,count:e.length});return}G.stdout.write(e.length?`Deleted ${e.length} archived task${e.length===1?``:`s`}.\n`:`${N.dim(`No archived tasks to delete.`)}\n`);return}let a=r[0];a||O(`Missing task id.`,{hint:[`Delete one: coder task delete <task-id>`,`Delete all archived: coder task delete --all-archived`]});let o=R(i,a);if(o.status===`running`&&O(`Task ${o.id} is still running.`,{hint:`Stop it first: coder task stop ${o.id}`}),Y(o),w(i,o.id),n.json){D({taskId:o.id,deleted:!0});return}G.stdout.write(`Deleted task ${N.cyan(o.id)}.\n`)}function pt(e,t){return t.split(`.`).reduce((e,t)=>e?.[t],e)}function mt(e,t){return t?q.join(a(e),`coder.config.json`):F()}function ht(e,t){let n=B(e);return t?pt(n,t):n}function gt(e,t,n,r={}){let i=mt(e,r.workspace),a=K.existsSync(i)?JSON.parse(K.readFileSync(i,`utf8`)):{},o=t.split(`.`),s=o.at(-1),c=a;for(let e of o.slice(0,-1))(typeof c[e]!=`object`||c[e]===null)&&(c[e]={}),c=c[e];r.unset?delete c[s]:c[s]=n;let l=Ae(a);if(l.length)throw Error(`Refusing to write invalid config:\n ${l.join(`
|
|
25
|
+
`)}`);return K.mkdirSync(q.dirname(i),{recursive:!0}),K.writeFileSync(i,`${JSON.stringify(a,null,2)}\n`,`utf8`),{file:i,key:t,effective:pt(B(e),t)??null,...r.unset?{unset:!0}:{value:n}}}async function _t(e){let{options:t,positionals:n}=v(e,J.object({...b,workspace:S})),r=V(t),[i=`list`,a,...o]=n,s=mt(r,t.workspace);if(i===`list`){let e=B(r);if(t.json){D(e);return}let n=N,i=e=>[e?.model,e?.effort,e?.permissions].filter(Boolean).join(`/`)||`-`;G.stdout.write([`${n.dim(`chain`)} ${e.chain.join(` -> `)}`,`${n.dim(`codex`)} ${i(e.agents.codex)}`,`${n.dim(`claude`)} ${i(e.agents.claude)}`,`${n.dim(`approvals`)} timeout=${e.approvals.escalationTimeoutMs}ms hosts=[${e.approvals.allowedNetworkHosts.join(`, `)}]`,`${n.dim(`file`)} ${F()}`].join(`
|
|
26
26
|
`)+`
|
|
27
|
-
`);return}if(i===`get`){a||O(`Usage: coder config get <key> (e.g. chain, agents.codex.model)`);let e=
|
|
28
|
-
`)}\n`)}const
|
|
29
|
-
`)}`),K.mkdirSync(q.dirname(e),{recursive:!0}),K.writeFileSync(e,`${JSON.stringify(n,null,2)}\n`,`utf8`)}function
|
|
30
|
-
`)}\n`)}async function
|
|
27
|
+
`);return}if(i===`get`){a||O(`Usage: coder config get <key> (e.g. chain, agents.codex.model)`);let e=pt(B(r),a);if(t.json||e===null||typeof e==`object`&&e!==void 0){D(e===void 0?null:e);return}G.stdout.write(`${e===void 0?`(unset)`:String(e)}\n`);return}i!==`set`&&i!==`unset`&&O(`Usage: coder config [get|set|unset] <key> [value] [--workspace]`),(!a||i===`set`&&o.length===0)&&O(`Usage: coder config ${i} <key>${i===`set`?` <value>`:``}`);let c=o.join(` `),l;try{l=JSON.parse(c)}catch{l=c.includes(`,`)?c.split(`,`).map(e=>e.trim()).filter(Boolean):c}let u;try{({effective:u}=gt(r,a,l,{workspace:t.workspace,unset:i===`unset`}))}catch(e){O(e instanceof Error?e.message:String(e))}if(t.json){D({file:s,key:a,...i===`set`?{value:l}:{unset:!0},effective:u});return}let d=N,f=i===`set`?`${d.cyan(a)} = ${JSON.stringify(l)}`:`unset ${d.cyan(a)}`;G.stdout.write(`${f} ${d.dim(`(${s})`)}\n`)}async function vt(e,t={}){let n=I(e),r=fe(n);r?.updated&&(n=I(e));let i=n.available?await Ee(e):{loggedIn:!1,detail:n.detail},a=ae(),o=a.available?je():{loggedIn:!1,detail:a.detail},s=F();if(!K.existsSync(s)){let e=n.available?[`codex`,`claude`]:a.available?[`claude`,`codex`]:[`codex`,`claude`];ke({...we,chain:e})}let c=h(),l=t.claude?ne(c):null,u=t.agents||t.codex?ge(c):null,d=B(e),f=n.available&&i.loggedIn||a.available&&o.loggedIn;return{codex:{available:n.available,detail:n.detail,auth:i.detail,loggedIn:i.loggedIn},...r?{codexUpdate:r}:{},claude:{available:a.available,detail:a.detail,auth:o.detail,loggedIn:o.loggedIn},configFile:s,runtime:Be(new URL(`../bin/coder.mjs`,import.meta.url)),...l?{claudePlugin:l}:{},...u?{agentsSkill:u}:{},config:d,ready:f}}async function yt(e){let{options:t,positionals:n}=v(e,J.object({...b,codex:S,claude:S,agents:S})),r=V(t),i=[`claude`,`codex`,`agents`];for(let e of n)i.includes(e)||O(`Unknown host "${e}". Use claude, codex, or agents.`,{hint:`Codex, Pi, OpenCode, and other Agent Skills hosts: coder setup-host agents`}),t[e]=!0;let a=N.bold,o=N.dim;t.json||G.stdout.write(`${a(`Coder host setup`)}\n\n`);let s=await vt(r,{claude:t.claude,codex:t.codex,agents:t.agents});if(t.json){D(s);return}let{codex:c,claude:l,codexUpdate:u,config:d,configFile:f,claudePlugin:p,agentsSkill:m,ready:h}=s,g=[],_=c.available?c.loggedIn?k(`codex ${o(`${c.detail}; ${c.auth}`)}`):A(`codex not logged in ${o(`(${c.auth})`)} - run: codex login`):A(`codex CLI not installed - run: npm install -g @openai/codex`),y=l.available?l.loggedIn?k(`claude ${o(`${l.detail}; ${l.auth}`)}`):A(`claude not logged in - run: claude auth login`):A(`claude CLI not installed - run: npm install -g @anthropic-ai/claude-code`);g.push(a(`Available Engines`),_,y,` ${o(`custom models (local/provider endpoints): coder model --help`)}`),u?.updated?g.push(k(`codex ${o(`updated ${u.from} -> ${c.detail} (GPT-5.6 support)`)}`)):u&&g.push(A(`codex ${u.note}`)),g.push(``);let x=e=>{let t=d.agents?.[e]??{};return[t.model,t.effort,t.permissions].filter(Boolean).join(`/`)};g.push(a(`Config`),` chain: ${(d.chain??[]).join(` -> `)} codex: ${x(`codex`)} claude: ${x(`claude`)}`,` ${o(f)} ${o(`(coder config set <key> <value> to change)`)}`,``);let C=[[`claude plugin`,p??null],[`agents skill `,m??null]];for(let[e,t]of C)t&&g.push(t.installed?k(`${e} ${o(t.note)}`):A(`${e} ${t.note}`),``);g.push(h?k(`ready - try: coder run --wait "explain this repo's layout"`):A(`not ready - install an engine CLI to run tasks: codex (npm install -g @openai/codex, then codex login) or claude (npm install -g @anthropic-ai/claude-code, then claude auth login)`)),G.stdout.write(`${g.join(`
|
|
28
|
+
`)}\n`)}const bt=new Set([`codex`,`claude`,`custom`]);async function xt(e){let t=e.envKey?G.env[e.envKey]:void 0,n=z(e.baseUrl,`models`),r=null;for(let i of n)try{let n=await fetch(i,{headers:t?{Authorization:`Bearer ${t}`}:{},signal:AbortSignal.timeout(5e3)});if(!n.ok){r=n.status===404?{reachable:!0,modelListed:null,detail:`endpoint reachable (no model list to verify against)`}:{reachable:!1,modelListed:null,detail:`${i} -> HTTP ${n.status}`};continue}let a=await n.json().catch(()=>null),o=Array.isArray(a?.data)?a.data.map(e=>e.id):null;if(!o)return{reachable:!0,modelListed:null,detail:`endpoint reachable`};let s=o.includes(e.model);return{reachable:!0,modelListed:s,detail:s?`endpoint reachable; model "${e.model}" listed`:`endpoint reachable, but "${e.model}" is not in its model list`}}catch(e){r={reachable:!1,modelListed:null,detail:`${i} unreachable (${e instanceof Error?e.message:String(e)})`}}return r}function St(e,t){let n=K.existsSync(e)?JSON.parse(K.readFileSync(e,`utf8`)):{};t(n),n.models&&Object.keys(n.models).length===0&&delete n.models;let r=Ae(n);r.length&&O(`Refusing to write invalid config:\n ${r.join(`
|
|
29
|
+
`)}`),K.mkdirSync(q.dirname(e),{recursive:!0}),K.writeFileSync(e,`${JSON.stringify(n,null,2)}\n`,`utf8`)}function X(e,t){St(e,e=>{e.models=e.models??{},t(e.models)})}const Z=J.object({...b,"base-url":C,model:C,"env-key":C,workspace:S});function Q(e,t){return e.workspace?q.join(a(t),`coder.config.json`):F()}function Ct(e){let t=e.models??{},n=Object.entries(t).filter(e=>P(e[1])),r=e=>`${e.provider}:${e.model}${e.effort?`:${e.effort}`:``}`,i=Object.entries(t).filter(e=>H(e[1])).map(([e,t])=>{let n=t.provider===`claude`?M:E,i=n[t.model]??t.model,a=L(e)?e:Object.entries(n).find(([,e])=>e===i)?.[0];return{name:e,spec:r(t),replaces:a,disabled:!!t.disabled}}),a=new Map;for(let e of i)e.replaces&&(e.name===e.replaces||!a.has(e.replaces))&&a.get(e.replaces)?.name!==e.replaces&&a.set(e.replaces,e);let o=e=>!!t[e]?.disabled,s=i.filter(e=>![...a.values()].some(t=>t.name===e.name));return{models:t,endpoints:n,providerRows:(e,t)=>[...Object.entries(t).map(([e,t])=>{let n=a.get(e);return n?{alias:n.name,spec:n.spec,overrides:e,disabled:n.disabled}:{alias:e,model:t,builtin:!0,disabled:o(e)}}),...s.filter(t=>t.spec.startsWith(`${e}:`)).map(({name:e,spec:t,disabled:n})=>({alias:e,spec:t,disabled:n}))],toggledSlugs:Object.entries(t).filter(([e,t])=>!P(t)&&!H(t)&&!L(e)).map(([e,t])=>({name:e,disabled:!!t.disabled})),disabled:o}}async function wt(e){let{endpoints:t,providerRows:n,toggledSlugs:r}=Ct(B(e)),i=await Promise.all(t.map(async([e,t])=>({name:e,...t,probe:await xt(t)})));return{codex:n(`codex`,E),claude:n(`claude`,M),custom:i,...r.length?{toggles:r}:{}}}async function Tt(e){let{options:t,positionals:n}=v(e,Z);n.length&&O(`model list takes no arguments.`,{hint:`Usage: coder model list [--json]`});let r=V(t),i=N,{endpoints:a,providerRows:o,toggledSlugs:s,disabled:c}=Ct(B(r));if(t.json){D(await wt(r));return}let l=e=>c(e)?i.dim(`∅`):i.green(`✔`),u=e=>c(e)?` ${i.dim(`(disabled)`)}`:``,d=[],f=(e,t,n)=>{d.push(i.bold(e));for(let e of o(t,n))`overrides`in e?d.push(` ${e.disabled?i.dim(`∅`):i.cyan(`↳`)} ${e.alias.padEnd(14)} ${i.dim(`-> ${e.spec} (overrides ${e.overrides})`)}${e.disabled?` ${i.dim(`(disabled)`)}`:``}`):`builtin`in e?d.push(` ${l(e.alias)} ${e.alias.padEnd(14)} ${i.dim(`-> ${e.model}`)}${u(e.alias)}`):d.push(` ${e.disabled?i.dim(`∅`):i.cyan(`↳`)} ${e.alias.padEnd(14)} ${i.dim(`-> ${e.spec}`)}${e.disabled?` ${i.dim(`(disabled)`)}`:``}`);d.push(``)};if(f(`Codex models`,`codex`,E),f(`Claude models`,`claude`,M),d.push(i.bold(`Custom models`),``),!a.length)d.push(i.dim(` none — coder model add <name> --base-url <url> --model <id> [--env-key VAR]`));else for(let[e,t]of a){let n=await xt(t),r=t.disabled?i.dim(`∅`):n.reachable?i.green(`✔`):i.red(`✘`);d.push(` ${r} ${e.padEnd(14)} ${t.model} ${i.dim(`@ ${t.baseUrl} — ${n.detail}`)}${u(e)}`)}if(d.push(``),s.length){d.push(i.bold(`Other`),``);for(let e of s)d.push(` ${e.disabled?i.dim(`∅`):i.green(`✔`)} ${e.name.padEnd(14)} ${i.dim(`raw model id`)}${e.disabled?` ${i.dim(`(disabled)`)}`:``}`);d.push(``)}d.push(i.dim(`Alias one: coder model alias <name> <spec> (e.g. fast codex:spark)`),i.dim(`Use one: coder run --model <name> "<task>" (or coder run --agent custom)`)),G.stdout.write(`${d.join(`
|
|
30
|
+
`)}\n`)}async function $(e,t,n,r){let i=await Ye(t),a=i?.wireApi===`responses`;i?(t.wireApi=i.wireApi,t.baseUrl=i.baseUrl??t.baseUrl):delete t.wireApi,X(n,n=>{n[e]=t});let o=await xt(t),s=re(I(r)),c=I(r);return{name:e,entry:t,file:n,probe:o,codex:c,install:s,nativeResponses:a,keyMissing:!!(t.envKey&&!G.env[t.envKey]),ready:o.reachable&&c.available}}async function Et(e,t,n,r,i){let a=Q(n,r),o=N,{probe:s,codex:c,install:l,nativeResponses:u,keyMissing:d}=await $(e,t,a,r);if(n.json){D({name:e,...t,file:a,probe:s,codex:c,...l?{codexInstall:l}:{},ready:s.reachable&&c.available});return}let f=e=>` ${o.green(`✔`)} ${e}`,p=e=>` ${o.red(`✘`)} ${e}`,m=[`${i} ${o.cyan(e)} -> ${t.model} @ ${t.baseUrl} ${o.dim(`(${a})`)}`,``,s.reachable?f(`${s.detail} ${o.dim(`(${u?`responses api, direct`:`chat api, auto-translated`})`)}`):p(s.detail),c.available?f(l?.installed?`${l.note} ${o.dim(`(${c.detail})`)}`:`codex engine ${o.dim(`(${c.detail})`)}`):p(l?.note??`codex CLI not installed - run: npm install -g @openai/codex`)];d&&m.push(p(`env var ${t.envKey} is not set in this shell`)),m.push(``,o.dim([`Use it: coder run --model ${e} "<task>"`,`Make default: coder config set agents.custom.model ${e}`].join(`
|
|
31
31
|
`))),G.stdout.write(`${m.join(`
|
|
32
|
-
`)}\n`)}function
|
|
33
|
-
`),r=``,i=``,a=!1;for(let e of n){let t=e.trim();if(t.startsWith("```")){a=!a;continue}if(!(a||t===``)){if(t.startsWith(`#`)){r||=t.replace(/^#+\s*/,``);continue}i=t;break}}return
|
|
32
|
+
`)}\n`)}function Dt(e,t,n){return e||O(`Missing model name.`,{hint:t}),/^[a-z][a-z0-9-]*$/.test(e)||O(`Invalid model name "${e}". Use lowercase kebab-case (e.g. qwen-local).`),(bt.has(e)||n===`model`&&L(e))&&O(`"${e}" is reserved; pick another name.`),e}async function Ot(e){let t=`Usage: coder model add <name> --base-url <url> --model <id> [--env-key VAR]`,{options:n,positionals:r}=v(e,Z),i=V(n),a=Dt(r[0],t,`model`),o=B(i).models?.[a];o&&O(P(o)?`Custom model "${a}" already exists.`:`"${a}" is already configured as an ${H(o)?`alias`:`entry`}; remove it first.`,{hint:`Change it: coder model update ${a} [--base-url|--model|--env-key], or remove it first.`}),(!n[`base-url`]||!n.model)&&O(`Missing --base-url or --model.`,{hint:t}),await Et(a,{baseUrl:U(n[`base-url`]),model:n.model,...n[`env-key`]?{envKey:n[`env-key`]}:{}},n,i,`saved`)}async function kt(e){let t=`Usage: coder model update <name> [--base-url <url>] [--model <id>] [--env-key VAR]`,{options:n,positionals:r}=v(e,Z),i=V(n),a=r[0],o=a?B(i).models?.[a]:void 0,s=o&&P(o)?o:void 0;(!a||!s)&&O(a?`No custom model named "${a}".`:`Missing model name.`,{hint:a?`List them: coder model list`:t}),!n[`base-url`]&&!n.model&&!n[`env-key`]&&O(`Nothing to update: pass --base-url, --model, or --env-key.`,{hint:t}),await Et(a,{...s,...n[`base-url`]?{baseUrl:U(n[`base-url`])}:{},...n.model?{model:n.model}:{},...n[`env-key`]?{envKey:n[`env-key`]}:{}},n,i,`updated`)}async function At(e){let{options:t,positionals:n}=v(e,Z),r=V(t),i=n[0],a;try{a=zt(r,i??``,{workspace:t.workspace})}catch(e){O(e instanceof Error?e.message:String(e),{hint:i?`List them: coder model list`:`Usage: coder model remove <name>`})}if(t.json){D(a);return}G.stdout.write(`removed ${N.cyan(a.removed)} ${N.dim(`(${a.file})`)}\n`)}async function jt(e){await Nt(e,!0)}async function Mt(e){await Nt(e,!1)}async function Nt(e,t){let n=t?`disable`:`enable`,r=`Usage: coder model ${n} <name>`,{options:i,positionals:a}=v(e,Z),o=V(i),s=a[0];s||O(`Missing model name.`,{hint:r});let{file:c}=Ht(o,s,t,{workspace:i.workspace});if(i.json){D({[t?`disabled`:`enabled`]:s,file:c});return}G.stdout.write(`${n}d ${N.cyan(s)} ${N.dim(`(${c})`)}\n`)}async function Pt(e){let t=`Usage: coder model alias <name> <spec> (e.g. coder model alias fast codex:spark)`,{options:n,positionals:r}=v(e,Z),i=V(n),a=Dt(r[0],t,`alias`),o=B(i).models?.[a];o&&P(o)&&O(`"${a}" is a custom model name; pick another alias name.`);let s=r[1];s||O(`Missing alias spec.`,{hint:t});let c;try{c=Bt(i,a,s,{workspace:n.workspace})}catch(e){let n=e instanceof Error?e.message:String(e);O(n,n.includes(`already dispatchable by name`)?{}:{hint:t})}if(n.json){D(c);return}let l=N,u=`${c.provider} ${c.model}${c.effort?` (${c.effort})`:``}`;G.stdout.write(`aliased ${l.cyan(a)} -> ${c.provider}:${c.model}${c.effort?`:${c.effort}`:``} ${l.dim(`= ${u}`)} ${l.dim(`(${c.file})`)}\n`)}async function Ft(e){let{options:t,positionals:n}=v(e,Z),r=V(t),i=n[0],a=i?B(r).models?.[i]:void 0;(!i||!a||!H(a))&&O(i?`No alias named "${i}".`:`Missing alias name.`,{hint:i?`List them: coder model list`:`Usage: coder model unalias <name>`});let{file:o}=Vt(r,i,{workspace:t.workspace});if(t.json){D({unaliased:i,file:o});return}G.stdout.write(`unaliased ${N.cyan(i)} ${N.dim(`(${o})`)}\n`)}function It(e,t){if(!e)throw Error(`Missing model name.`);if(!/^[a-z][a-z0-9-]*$/.test(e))throw Error(`Invalid model name "${e}". Use lowercase kebab-case (e.g. qwen-local).`);if(bt.has(e)||t===`model`&&L(e))throw Error(`"${e}" is reserved; pick another name.`)}async function Lt(e,t,n){if(It(t,`model`),B(e).models?.[t])throw Error(`Custom model "${t}" already exists.`);if(!n.baseUrl||!n.model)throw Error(`Missing baseUrl or model.`);return $(t,{baseUrl:U(n.baseUrl),model:n.model,...n.envKey?{envKey:n.envKey}:{}},Q({workspace:n.workspace},e),e)}async function Rt(e,t,n){let r=B(e).models?.[t],i=r&&P(r)?r:void 0;if(!i)throw Error(`No custom model named "${t}".`);if(!n.baseUrl&&!n.model&&!n.envKey)throw Error(`Nothing to update: pass baseUrl, model, or envKey.`);return $(t,{...i,...n.baseUrl?{baseUrl:U(n.baseUrl)}:{},...n.model?{model:n.model}:{},...n.envKey?{envKey:n.envKey}:{}},Q({workspace:n.workspace},e),e)}function zt(e,t,n={}){if(!t||!B(e).models?.[t])throw Error(t?`No custom model named "${t}".`:`Missing model name.`);let r=Q({workspace:n.workspace},e);return X(r,e=>{delete e[t]}),{removed:t,file:r}}function Bt(e,t,n,r={}){It(t,`alias`);let i=B(e),a=i.models?.[t];if(a&&P(a))throw Error(`"${t}" is a custom model name; pick another alias name.`);if(!n)throw Error(`Missing alias spec.`);let o=xe(n,i);if(!o||!o.model)throw Error(`Alias spec "${n}" does not resolve to a model.`);if(o.agent===`custom`)throw Error(`"${n}" names a custom model, which is already dispatchable by name; aliases target codex/claude models.`);let s=n.split(`:`).some(e=>le.has(e.trim())||_e.has(e.trim())),c=o.agent===`claude`?M:E,l={provider:o.agent,model:c[o.model]??o.model,...s&&o.effort?{effort:o.effort}:{}},u=Q({workspace:r.workspace},e);return X(u,e=>{e[t]=l}),{alias:t,...l,file:u}}function Vt(e,t,n={}){let r=t?B(e).models?.[t]:void 0;if(!t||!r||!H(r))throw Error(t?`No alias named "${t}".`:`Missing alias name.`);let i=Q({workspace:n.workspace},e);return X(i,e=>{delete e[t]}),{unaliased:t,file:i}}function Ht(e,t,n,r={}){if(!t)throw Error(`Missing model name.`);let i=!!B(e).models?.[t],a=Q({workspace:r.workspace},e);return X(a,e=>{let r=e[t];if(!r){n?e[t]={disabled:!0}:i&&(e[t]={disabled:!1});return}P(r)||H(r)?n?r.disabled=!0:delete r.disabled:n?r.disabled=!0:delete e[t]}),{name:t,disabled:n,file:a}}const Ut={list:Tt,add:Ot,setup:Ot,update:kt,remove:At,disable:jt,enable:Mt,alias:Pt,unalias:Ft};async function Wt(e){let[t,...n]=e;if(t===void 0||t.startsWith(`-`)){await Tt(e);return}let r=Ut[t];r||O(`Unknown model subcommand "${t}". Use list, add, update, remove, disable, enable, alias, or unalias.`,{hint:`Help: coder model --help`}),await r(n)}const Gt=[{name:`readme`,file:`README.md`,description:`What Coder is and how to get started.`},{name:`skill`,file:`plugins/agents/skills/coder/SKILL.md`,description:`How a host agent should drive Coder.`}];function Kt(e){let t=q.join(e,`docs`),n=[];try{n=K.readdirSync(t).filter(e=>e.endsWith(`.md`)).sort()}catch{n=[]}let r=n.map(t=>{let n=q.join(`docs`,t);return{name:q.basename(t,`.md`),file:n,description:qt(q.join(e,n))}}),i=Gt.map(e=>({name:e.name,file:e.file,description:e.description}));return[...r,...i]}function qt(e){let t=``;try{t=K.readFileSync(e,`utf8`)}catch{return``}let n=t.split(`
|
|
33
|
+
`),r=``,i=``,a=!1;for(let e of n){let t=e.trim();if(t.startsWith("```")){a=!a;continue}if(!(a||t===``)){if(t.startsWith(`#`)){r||=t.replace(/^#+\s*/,``);continue}i=t;break}}return Jt(i)||r}function Jt(e){if(!e)return``;let t=e.match(/^.*?[.!?](?=\s|$)/);return(t?t[0]:e).trim()}function Yt(e,t={}){let n=h(),r=Kt(n);if(!e)return{topics:r.map(e=>({name:e.name,description:e.description}))};let i=r.find(t=>t.name===e.toLowerCase());if(i?.name===`skill`&&t.claude&&(i={...i,file:`plugins/claude/skills/dispatch/SKILL.md`}),!i)throw Error(`Unknown docs topic "${e}". Available: ${r.map(e=>e.name).join(`, `)}`);let a=q.join(n,i.file),o;try{o=K.readFileSync(a,`utf8`)}catch{throw Error(`Could not read docs for "${i.name}" (${i.file}).`)}return{name:i.name,content:o}}async function Xt(e){let{options:t,positionals:n}=v(e,J.object({json:S,claude:S})),[r]=n,i;try{i=Yt(r,{claude:t.claude})}catch(e){let t=e instanceof Error?e.message:String(e);return O(t,t.startsWith(`Unknown docs topic`)?{hint:`List topics: coder docs`}:{})}if(`content`in i){G.stdout.write(i.content.endsWith(`
|
|
34
34
|
`)?i.content:`${i.content}\n`);return}if(t.json){D(i);return}let a=N,o=Math.max(0,...i.topics.map(e=>e.name.length)),s=i.topics.map(e=>` ${a.cyan(e.name.padEnd(o))} ${a.dim(e.description)}`);G.stdout.write([a.bold(`Docs:`),...s,``,j([`Read a topic: coder docs <topic>`],a)].join(`
|
|
35
35
|
`)+`
|
|
36
|
-
`)}async function
|
|
36
|
+
`)}async function Zt(e={},t){let n=!e.pluginsOnly,r=!e.cliOnly,i=h(),a=q.join(i,`plugins/claude/.claude-plugin/plugin.json`),o={cli:y(),claude:x(a)},s={};if(n){let n=De(m),[r,...i]=e.pm===`npm`?[`npm`,`install`,`-g`,`@wular/coder@latest`]:e.pm===`pnpm`?[`pnpm`,`add`,`-g`,`@wular/coder@latest`]:e.pm===`yarn`?[`yarn`,`global`,`add`,`@wular/coder@latest`]:e.pm===`bun`?[`bun`,`add`,`-g`,`@wular/coder@latest`]:n.command,a=e.pm??n.pm;t?.(`via ${a}`);let c=Re(r,i,{encoding:`utf8`});if(c.error?.code===`ENOENT`)throw Error(`${a} not found on PATH. Re-run with --pm <npm|pnpm|yarn|bun>, or update manually: ${r} ${i.join(` `)}`);if(c.status!==0){let e=(c.stderr||c.stdout||``).trim();throw Error(`CLI update failed (${a}).${e?`\n${e}`:``}\nRun manually: ${r} ${i.join(` `)}`)}ee();let l=y();s.cli={pm:a,from:o.cli,to:l,changed:l!==o.cli}}if(r){if(e.claude||!e.codex&&ae().available){let e=ne(i);s.claudePlugin={installed:e.installed,note:e.note,from:o.claude,to:x(a)}}if(K.existsSync(me())){let e=oe(),t=ge(i);s.agentsSkill={installed:t.installed,note:t.note,from:e,to:oe()}}}return s}async function Qt(e){let{options:t}=v(e,J.object({pm:C,"cli-only":S,"plugins-only":S,codex:S,claude:S})),n=N.bold,r=N.dim,i=(e,t)=>t&&e&&t!==e?`${e} ${r(`->`)} ${n(t)}`:`${t??e??`?`} ${r(`(unchanged)`)}`,a;try{a=await Zt({cliOnly:t[`cli-only`],pluginsOnly:t[`plugins-only`],pm:t.pm,codex:t.codex,claude:t.claude},e=>G.stdout.write(`${n(`Updating coder CLI`)} ${r(`${e}...`)}\n`))}catch(e){O(e instanceof Error?e.message:String(e))}if(a.cli&&G.stdout.write(a.cli.changed?`${k(`coder CLI ${i(a.cli.from,a.cli.to)}`)}\n`:`${k(`coder CLI ${a.cli.from} ${r(`(already latest)`)}`)}\n`),a.claudePlugin){let e=a.claudePlugin;G.stdout.write(`${e.installed?k(`claude plugin ${i(e.from,e.to)} ${r(`- ${e.note}`)}`):A(`claude plugin ${e.note}`)}\n`)}if(a.agentsSkill){let e=a.agentsSkill;G.stdout.write(`${e.installed?k(`agents skill ${i(e.from,e.to)} ${r(`- ${e.note}`)}`):A(`agents skill ${e.note}`)}\n`)}}export{st as C,Xe as D,Ze as E,Ye as O,ot as S,$e as T,gt as _,Wt as a,ct as b,wt as c,Vt as d,Rt as f,ht as g,_t as h,Yt as i,qe as k,zt as l,vt as m,Zt as n,Lt as o,yt as p,Xt as r,Bt as s,Qt as t,Ht as u,ft as v,tt as w,lt as x,Y as y};
|
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.12",
|
|
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"
|