@wular/coder 0.3.9 → 0.3.11
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-BAzI1vc5.js → runtime-BnR7O1OS.js} +3 -3
- package/dist/sdk.js +1 -1
- package/dist/{upgrade-BMqsQjjt.js → upgrade-D9XGACFe.js} +2 -2
- package/package.json +1 -1
- package/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/plugins/cursor/.cursor-plugin/plugin.json +1 -1
package/dist/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-BnR7O1OS.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-D9XGACFe.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-BnR7O1OS.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,13 +1,13 @@
|
|
|
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{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;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=[]){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(`
|
|
11
11
|
`)}`);n=an(n,t)}let r=U(n);if(r.length)throw Error(`Invalid merged config:\n ${r.join(`
|
|
12
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`}}}async function Sn(e,t){let n=t.resumeSessionId??pe(),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`;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);let a=Wt(i,e,t.allowedNetworkHosts??[]);return a&&r.push(`--settings`,a),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(`
|
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-BnR7O1OS.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-D9XGACFe.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,6 +1,6 @@
|
|
|
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-BnR7O1OS.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(`
|
|
3
|
+
`)}\n`),a.prompt&&G.stdout.write(`${Ce(a.prompt,N,{truncate:!1}).join(`
|
|
4
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 rt(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
|
|
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.11",
|
|
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"
|