@wular/coder 0.3.2 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/app-server-bHl6RBZ2.js +3 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +53 -39
- package/dist/flow/index.d.ts +2 -31
- package/dist/flow/index.js +1 -1
- package/dist/{index-CUy_WPvw.d.ts → index-CTrgzW3M.d.ts} +181 -314
- package/dist/lib/broker.d.ts +1 -1
- package/dist/lib/broker.js +2 -2
- package/dist/runtime-DVrs6VXX.js +16 -0
- package/dist/sdk.d.ts +263 -424
- package/dist/sdk.js +1 -1
- package/dist/upgrade-Dgk4Gl4g.js +36 -0
- package/docs/sdk.md +4 -3
- package/package.json +4 -2
- package/plugins/agents/skills/coder/SKILL.md +3 -2
- package/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/plugins/claude/skills/dispatch/SKILL.md +3 -2
- package/plugins/cursor/.cursor-plugin/plugin.json +1 -1
- package/plugins/cursor/README.md +1 -1
- package/plugins/cursor/skills/coder/SKILL.md +3 -2
- package/dist/app-server-Dwd7IcQH.js +0 -3
- package/dist/runtime-DRtQOCSz.js +0 -16
- package/dist/upgrade-BNwIk8zT.js +0 -27
|
@@ -0,0 +1,16 @@
|
|
|
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 ee,f as te,i as p,j as m,l as ne,m as h,o as g,r as _,s as re,u as ie,v as ae,w as oe,y as se}from"./app-server-bHl6RBZ2.js";import{createRequire as ce}from"node:module";import v from"node:process";import y from"node:fs";import b from"node:path";import{spawn as x,spawnSync as S}from"node:child_process";import le from"node:os";import{fileURLToPath as ue,pathToFileURL as de}from"node:url";import*as C from"zod/mini";import fe,{randomUUID as pe}from"node:crypto";import{AsyncLocalStorage as me}from"node:async_hooks";function he(e){let t=v.env.FORCE_COLOR,n=t!=null&&t!==``&&t!==`0`||t!==`0`&&e.isTTY&&!v.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 w=he(v.stdout),T=he(v.stderr);function ge(e,t=T){let n=e.map(e=>{let t=e.indexOf(`coder `);return t===-1?{label:e,cmd:``}:{label:e.slice(0,t),cmd:e.slice(t)}}),r=Math.max(0,...n.map(e=>e.label.length));return n.map(({label:e,cmd:n})=>n?` ${t.dim(e.padEnd(r))}${t.bold(n)}`:` ${t.dim(e)}`).join(`
|
|
2
|
+
`)}function E(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];v.stderr.write(`${T.red(e)}\n`),i.length&&v.stderr.write(`\n${ge(i,T)}\n`),v.exit(n)}function D(e){v.stdout.write(`${JSON.stringify(e,null,2)}\n`)}function _e(e,t=w){return(JSON.stringify(e,null,2)??`null`).split(`
|
|
3
|
+
`).map(e=>e.replace(/"((?:[^"\\]|\\.)*)":/g,(e,n)=>`${t.light(`"${n}"`)}:`).replace(/: (-?\d[\d.eE+-]*|true|false|null)(,?)$/,(e,n,r)=>`: ${t.blue(n)}${r}`)).join(`
|
|
4
|
+
`)}function 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 O(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 ${O(e.input)}`,...e.cachedInput?[`cached ${O(e.cachedInput)}`]:[],`out ${O(e.output)}`];return`${O(e.total)} (${n.join(` · `)}) on ${t||`default model`}`}function xe(e,t,n,r=w){let i=e?.error?.message??t;return e?.finalMessage||(i?`${r.red(`error:`)} ${i}`:n)}function Se(e,t=w){let n=e=>e.split(`
|
|
5
|
+
`).map(e=>` ${t.dim(e)}`);return e.length<=1e3?[t.dim(`prompt:`),...n(e)]:[t.dim(`prompt:`),...n(e.slice(0,500).trimEnd()),t.light(` … <${e.length-1e3} chars trimmed> …`),...n(e.slice(-500).trimStart())]}function Ce(e){return[e.agent??`-`,e.model,e.model?e.effort:null].filter(Boolean).join(`/`)}function we(e,t=w){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=w}={}){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` ${w.bold(w.green(`✔`))} ${e}`}function Ae(e){return` ${w.bold(w.red(`✘`))} ${e}`}function je(e=v.stdout){try{return e.getWindowSize?.()[0]??e.columns}catch{return e.columns}}function Me(e=v.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${w.dim(`…`)}`;r+=s,n+=c,i+=s.length}return r}function Ie(){let e=v.stdin;if(!e.isTTY||!v.stdout.isTTY)return()=>{};e.setRawMode(!0),e.resume();let t=e=>{e.includes(3)&&v.kill(v.pid,`SIGINT`),e.includes(26)&&v.kill(v.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=v.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`?w.green(n):e===`waiting-approval`?w.yellow(n):e===`failed`||e===`cancelled`?w.red(n):e===`completed`?w.blue(n):w.dim(n)}function ze(e,t,n=!1){n?D({taskId:e,status:`awaiting-approval`,approval:t}):(v.stdout.write(`Approval needed for task ${e}: ${t.summary}\n`),v.stderr.write(`\n${ge([`Approve: coder approve ${e} ${t.id}`,`Deny: coder approve ${e} ${t.id} --deny`,`Then: coder task result ${e} --wait`],T)}\n`)),v.exit(4)}function Be(e,t,n){if(e.length>t){let r=e.slice(t);E(`Unexpected argument${r.length>1?`s`:``}: ${r.join(` `)}`,{hint:`Help: coder ${n} --help`})}}function k(e){return e.cwd?b.resolve(String(e.cwd)):v.cwd()}function Ve(e,t){let r=n(e,t);return r||E(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 A=`@wular/coder`,He=`https://registry.npmjs.org/${A}/latest`;function Ue(){return b.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(y.readFileSync(Ue(),`utf8`))}catch{return null}}function Ke(e){try{y.mkdirSync(r(),{recursive:!0}),y.writeFileSync(Ue(),JSON.stringify(e))}catch{}}function qe(){try{y.rmSync(Ue(),{force:!0})}catch{}}function Je(e,t){if(v.env.CODER_NO_UPDATE_CHECK||v.env.CI)return;let n=Ge();if(n?.latest&&We(n.latest,e)>0&&v.stderr.write(T.dim(`coder ${e} -> `)+T.bold(n.latest)+T.dim(` available. run: coder upgrade
|
|
6
|
+
|
|
7
|
+
`)),!n?.checkedAt||Date.now()-n.checkedAt>864e5)try{x(v.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=y.realpathSync(e)}catch{}let n=t.replace(/\\/g,`/`);return/\/\.bun\//.test(n)?{pm:`bun`,command:[`bun`,`add`,`-g`,`${A}@latest`]}:/\/\.pnpm\//.test(n)||/\/pnpm(-global)?\//i.test(n)||/\/Library\/pnpm\//.test(n)?{pm:`pnpm`,command:[`pnpm`,`add`,`-g`,`${A}@latest`]}:/\/\.config\/yarn\/global\//.test(n)||/\/yarn\/global\//.test(n)||/\/Yarn\/Data\/global\//.test(n)?{pm:`yarn`,command:[`yarn`,`global`,`add`,`${A}@latest`]}:{pm:`npm`,command:[`npm`,`install`,`-g`,`${A}@latest`]}}function j(e){try{return JSON.parse(y.readFileSync(e,`utf8`))}catch{return null}}function Ze(e,t){let n=`${e}.tmp`;y.writeFileSync(n,`${JSON.stringify(t,null,2)}\n`,`utf8`),y.renameSync(n,e)}function Qe(e){let t=0,n=``;return()=>{let r;try{r=y.statSync(e).size}catch{return[]}if(r<t&&(t=0,n=``),r===t)return[];let i;try{i=y.openSync(e,`r`)}catch{return[]}try{let e=Buffer.alloc(r-t),a=y.readSync(i,e,0,e.length,t);t+=a;let o=(n+e.toString(`utf8`,0,a)).split(`
|
|
8
|
+
`);return n=o.pop()??``,o.filter(Boolean)}finally{y.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=b.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=b.resolve(t,n),r=b.relative(t,e);if(r.startsWith(`..`)||b.isAbsolute(r))return{decision:`escalate`,reason:`path outside workspace: ${n}`};if(r===`.git`||r.startsWith(`.git${b.sep}`))return{decision:`decline`,reason:`direct .git modification: ${n}`}}return{decision:`accept`,reason:`all paths inside workspace`}}function st(e){return b.join(e,`approvals`)}function ct(e){let t=st(e);return y.existsSync(t)?y.readdirSync(t).filter(e=>e.endsWith(`.request.json`)).flatMap(e=>{let n=e.replace(/\.request\.json$/,``),r=j(b.join(t,e));if(!r)return[];let i=j(b.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=b.join(r,`${t}.request.json`);if(!y.existsSync(i))throw Error(`No pending approval "${t}" for this job.`);y.writeFileSync(b.join(r,`${t}.response.json`),`${JSON.stringify({decision:n,answeredAt:new Date().toISOString()},null,2)}\n`,`utf8`)}async function M(e,t,{timeoutMs:n,onEvent:r}){let i=st(e);y.mkdirSync(i,{recursive:!0});let a=`apr-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`;y.writeFileSync(b.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 ${b.basename(e)} ${a} [--deny]`});let o=b.join(i,`${a}.response.json`),s=Date.now()+n;for(;Date.now()<s;){if(y.existsSync(o))try{let e=JSON.parse(y.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 M(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 M(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 M(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,m(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
|
+
`)}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 N(e){if(!e)return[];if(typeof e==`string`){let t=St(e);return t?[t]:[]}if(Array.isArray(e))return e.flatMap(e=>N(e));if(typeof e==`object`){let t=e;if(typeof t.text==`string`)return N(t.text);if(`summary`in t)return N(t.summary);if(`content`in t)return N(t.content);if(`parts`in t)return N(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 P(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`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,N(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),P(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);P(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);P(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`error`:e.error=t.params.error,P(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}P(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 _.connect(e);let r=await t(n);return await n.close(),r}catch(r){let i=r,a=n?.transport===`broker`||!!process.env.CODER_APP_SERVER_ENDPOINT,o=n?.transport===`broker`&&i?.rpcCode===-32001||a&&(i?.code===`ENOENT`||i?.code===`ECONNREFUSED`);if(n&&=(await n.close().catch(()=>{}),null),!o)throw r;let s=await _.connect(e,{disableBroker:!0});try{return await t(s)}finally{await s.close()}}}function F(e){let t=p(`codex`,[`--version`],{cwd:e});if(!t.available)return t;let n=p(`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=F(e);if(!t.available)return{available:!1,loggedIn:!1,detail:t.detail};let n=null;try{n=await _.connect(e,{reuseExistingBroker:!0});let t=await n.request(`account/read`,{refreshToken:!1}),r=t?.account??null;return r?.type===`chatgpt`?{available:!0,loggedIn:!0,detail:r.email?`ChatGPT login active for ${r.email}`:`ChatGPT login active`}:r?.type===`apiKey`?{available:!0,loggedIn:!0,detail:`API key configured`}:t?.requiresOpenaiAuth===!1?{available:!0,loggedIn:!0,detail:`Active provider does not require OpenAI authentication`}:{available:!0,loggedIn:!1,detail:"Not authenticated. Run `codex login`."}}catch(e){let t=S(`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 _.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 _.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=F(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)P(t.onProgress,`Resuming thread ${t.resumeThreadId}.`,`starting`),ee(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`})).thread.id;else{P(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`,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}}P(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:[]}},I={mini:`gpt-5.4-mini`,luna:`gpt-5.6-luna`,terra:`gpt-5.6-terra`,sol:`gpt-5.6-sol`},L=new Set([`low`,`medium`,`high`]),R={haiku:`haiku`,sonnet:`sonnet`,opus:`opus`,fable:`fable`},z=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,t){return JSON.stringify(e===`read-only`?{sandbox:{enabled:!0,failIfUnavailable:!0,autoAllowBashIfSandboxed:!0,filesystem:{denyWrite:[t]}}}:{sandbox:{enabled:!0,autoAllowBashIfSandboxed:!0}})}const Wt=C.enum([`codex`,`claude`]),Gt=C.enum([`codex`,`claude`,`custom`]),Kt=C.enum([`low`,`medium`,`high`]),qt=C.enum([`read-only`,`workspace-write`,`auto`]),Jt=C.partial(C.strictObject({model:C.string().check(C.minLength(1)),effort:Kt,permissions:qt})),Yt=C.strictObject({baseUrl:C.url(),model:C.string().check(C.minLength(1)),envKey:C.optional(C.string().check(C.minLength(1))),wireApi:C.optional(C.enum([`chat`,`responses`])),disabled:C.optional(C.boolean())}),Xt=C.strictObject({provider:Wt,model:C.string().check(C.minLength(1)),effort:C.optional(Kt),disabled:C.optional(C.boolean())}),Zt=C.strictObject({disabled:C.boolean()}),Qt=C.union([Yt,Xt,Zt]),$t=C.strictObject({escalationTimeoutMs:C.number().check(C.positive()),allowedNetworkHosts:C.array(C.string())}),en=C.strictObject({chain:C.array(Gt).check(C.minLength(1)),agents:C.partial(C.strictObject({codex:Jt,claude:Jt,custom:Jt})),models:C.optional(C.record(C.string().check(C.regex(/^[a-z0-9][a-z0-9./_-]*$/i,`model name`)),Qt)),approvals:$t}),tn=C.partial(C.extend(en,{approvals:C.partial($t)}));function B(e){return`baseUrl`in e}function V(e){return`provider`in e}function H(e){let t=tn.safeParse(e);if(!t.success)return t.error.issues.map(e=>`${e.path.join(`.`)||`config`}: ${e.message}`);let n=rn(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(V(i)){let t=n.models?.[i.model];t&&!B(t)&&r.push(`models.${e}: alias target "${i.model}" is itself a config entry`)}}return r}function nn(e){if(!y.existsSync(e))return null;try{return JSON.parse(y.readFileSync(e,`utf8`))}catch(t){let n=t instanceof Error?t.message:String(t);throw Error(`Invalid JSON in ${e}: ${n}`)}}function rn(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`?rn(r[e],i):i;return n}function U(){return b.join(r(),`config.json`)}function an(e){let t=s(e),n=zt;for(let e of[U(),b.join(t,`coder.config.json`)]){let t=nn(e);if(!t)continue;let r=H(t);if(r.length)throw Error(`Invalid config in ${e}:\n ${r.join(`
|
|
10
|
+
`)}`);n=rn(n,t)}let r=H(n);if(r.length)throw Error(`Invalid merged config:\n ${r.join(`
|
|
11
|
+
`)}`);return n}function on(e){return e.replace(/\/+$/,``).replace(/\/(chat\/completions|completions|responses)$/,``)}function sn(e,t,n){let r=[b.join(s(e),`coder.config.json`),U()];for(let e of r){let r;try{r=nn(e)}catch{continue}if(r?.models?.[t])return Object.assign(r.models[t],n),!H(r).length&&(y.writeFileSync(e,`${JSON.stringify(r,null,2)}\n`,`utf8`),!0)}return!1}function cn(e){return/\/(chat\/completions|completions|responses)\/*$/.test(e)}function ln(e,t){let n=on(e);return cn(e)||/\/v\d+(alpha|beta)?$/.test(n)?[`${n}/${t}`]:[`${n}/${t}`,`${n}/v1/${t}`]}function un(e,t,n){let r=t?e.models?.[t]:void 0;if(!t||!r||!B(r))return null;let i=`coder-${t}`;return{model:r.model,modelProvider:i,configOverrides:{[`model_providers.${i}`]:{name:t,base_url:n?.url??on(r.baseUrl),...r.envKey&&!n?{env_key:r.envKey}:{},wire_api:`responses`}}}}function dn(e){return e?I[e]??e:null}function fn(e){return e in I||e in R}function pn(e,t){return!!(t&&e.models?.[t]?.disabled)}function mn(e,t){if(pn(e,t))throw Error(`model "${t}" is disabled in config`)}function hn(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=>L.has(e)||z.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&&V(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 R?`claude`:i&&s&&B(s)?`custom`:`codex`;let c=t.agents[r]??{},l=i??c.model??null;return mn(t,l),{agent:r,model:l,effort:a??c.effort??null}}function gn(e){let t=U();return y.mkdirSync(b.dirname(t),{recursive:!0}),y.writeFileSync(t,`${JSON.stringify(e,null,2)}\n`,`utf8`),t}function _n(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 vn(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 yn(){let e=S(`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 bn(){let e=S(`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 xn(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:[te,`_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=Ut(i,e);return a&&r.push(`--settings`,a),t.onProgress?.({message:`claude turn started (session ${n})`,threadId:n}),new Promise((i,a)=>{let o=x(`claude`,r,{cwd:e,stdio:[`ignore`,`pipe`,`pipe`]}),s=``,c=``,l=null,u=n,d=e=>{if(!(!e||typeof e!=`object`))if(t.onHeartbeat?.(),e.type===`system`&&e.subtype===`init`&&e.session_id)u=e.session_id;else if(e.type===`assistant`)for(let n of e.message?.content??[])n?.type===`tool_use`&&t.onProgress?.({message:`${n.name} ${JSON.stringify(n.input??{})}`,threadId:u});else if(e.type===`user`){for(let n of e.message?.content??[])if(n?.type===`tool_result`){let e=_n(n.content).trim();e&&t.onProgress?.({message:e,threadId:u})}}else e.type===`result`&&(l=e,e.session_id&&(u=e.session_id))};o.stdout.on(`data`,e=>{s+=e;let t;for(;(t=s.indexOf(`
|
|
12
|
+
`))>=0;){let e=s.slice(0,t).trim();if(s=s.slice(t+1),e)try{d(JSON.parse(e))}catch{}}}),o.stderr.on(`data`,e=>{c+=e});let f=()=>{o.kill(`SIGTERM`),process.exit(143)};process.on(`SIGTERM`,f),o.on(`error`,e=>{process.removeListener(`SIGTERM`,f),a(Error(`claude spawn failed: ${e.message}`))}),o.on(`close`,e=>{process.removeListener(`SIGTERM`,f);let n=s.trim();if(n)try{d(JSON.parse(n))}catch{}let r=l?.result??``,a=e!==0||l?.is_error===!0||l==null;i({status:+!!a,threadId:l?.session_id??u,turnId:null,finalMessage:r,tokens:vn(l?.usage),model:l?.modelUsage&&Object.keys(l.modelUsage).join(`+`)||t.model||null,error:a?{message:r||c.trim()||`claude exited ${e}`}:null})})})}function Sn(e){S(`claude`,[`plugin`,`marketplace`,`remove`,`coder-plugins`],{encoding:`utf8`});let t=S(`claude`,[`plugin`,`marketplace`,`add`,e],{encoding:`utf8`}),n=S(`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 Cn(){return b.join(le.homedir(),`.agents`,`skills`,`coder`)}function wn(){try{let e=y.readFileSync(b.join(Cn(),`SKILL.md`),`utf8`);return/^\s*version:\s*(\S+)/m.exec(e)?.[1]??null}catch{return null}}function Tn(e){let t=Cn();try{let n=b.join(e,`plugins`,`agents`,`skills`,`coder`);y.rmSync(t,{recursive:!0,force:!0}),y.mkdirSync(t,{recursive:!0}),y.cpSync(n,t,{recursive:!0});let r=b.join(t,`SKILL.md`),i=y.readFileSync(r,`utf8`).replace(`
|
|
13
|
+
---
|
|
14
|
+
`,`\nmetadata:\n version: ${h()}\n---\n`);return y.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 En(e){if(e.available)return null;let t=S(`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 Dn(e){let t=/(\d+\.\d+\.\d+)/.exec(String(e??``));return t?t[1]:null}function On(e){if(!e.available)return null;let t=Dn(e.detail);if(!t||We(t,`0.144.0`)>=0)return null;let n=S(`codex`,[`update`],{encoding:`utf8`});return n.status!==0&&(n=S(`npm`,[`install`,`-g`,`@openai/codex@latest`],{encoding:`utf8`})),n.status===0?{updated:!0,from:t}:{updated:!1,from:t,note:`codex ${t} is too old for the default GPT-5.6 model (needs >= 0.144.0); auto-update failed: ${(n.stderr||`codex/npm not found`).trim()}. Run: codex update`}}const kn=/usage|quota|rate.?limit|429|401|unauthorized|not authenticated|login|insufficient|exhausted|not available|ENOENT/i,An=`CODER_WORKER`;var W=class extends Error{code;hint;taskId;payload;approval;result;runId;constructor(e,t,n={}){super(t),this.name=`CoderError`,this.code=e,Object.assign(this,n)}},jn=class extends Error{agent;detail;constructor(e,t){super(t),this.agent=e,this.detail=t}};function Mn(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&&V(n)?n:void 0},s=e=>{let n=e?t.models?.[e]:void 0;return n&&B(n)?n:void 0};if(o(i)){let e;try{e=hn(i,t)}catch(e){throw new W(`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 R?n=`claude`:i in I?n=`codex`:s(i)&&(n=`custom`)),n=n??t.chain[0]??`codex`,n!==`codex`&&n!==`claude`&&n!==`custom`){let e=n in I||n in R||n in(t.models??{})?` "${n}" is a model; use --model ${n}.`:``;throw new W(`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=hn(l,t)}catch(e){throw new W(`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{mn(t,l)}catch(e){throw new W(`invalid-option`,e instanceof Error?e.message:String(e))}if(n===`custom`){let e=Object.entries(t.models??{}).filter(([,e])=>B(e)).map(([e])=>e);if(!l&&e.length===1&&(l=e[0]),!l||!s(l))throw new W(`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 W(`invalid-option`,`Invalid --permissions "${d}". Use one of: ${Object.keys(Bt).join(`, `)}`);if(f===`codex`&&u&&!L.has(u))throw new W(`invalid-option`,`Invalid codex --effort "${u}". Use one of: ${[...L].join(`, `)}`);if(f===`claude`&&u&&!z.has(u))throw new W(`invalid-option`,`Invalid claude --effort "${u}". Use one of: ${[...z].join(`, `)}`);return{engine:f,agent:n,model:l,effort:u,permissions:d}}function Nn(e,t){return e===`read-only`&&Ht.test(t??``)}function Pn(e,n){let r=o(e,n),i=y.openSync(b.join(r,`worker.log`),`a`),a=x(v.execPath,[te,`_worker`,n,`--cwd`,e],{cwd:e,detached:!0,stdio:[`ignore`,i,i],env:{...v.env,[An]:`1`}});a.unref(),y.closeSync(i),t(e,n,{pid:a.pid??null})}async function Fn(e,r,i,a){let s=i.cwd,l=r.engine===`codex`?F(s):yn(),u=r.model?e.models?.[r.model]:void 0;if(!l.available&&u&&B(u)){let e=En(l);i.onInstallNote?.(e.note),l=F(s)}if(!l.available)throw new jn(r.agent,l.detail);let d=null;a.resume&&(d=n(s,a.resume)?.threadId??a.resume);let f=oe(),ee=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}:{}});Pn(s,f);let te=2**53-1,p=()=>c(s,f,te).filter(e=>e.phase!==`starting`).length,ne=Date.now()+15e3,h=ee,g=null,_=null;for(;Date.now()<(_??ne)&&(h=m(s,f)??h,h.status!==`failed`&&h.status!==`completed`);){if(h.threadId&&g===null&&(g=p(),_=Date.now()+5e3),g!==null&&p()>g){h=m(s,f)??h;break}await new Promise(e=>setTimeout(e,150))}if(h.status===`failed`){let e=j(b.join(o(s,f),`result.json`))?.error?.message??``,t=c(s,f,5).map(e=>e.message??``).join(`
|
|
15
|
+
`),n=e||t;throw Nn(r.permissions,n)?new W(`read-only-unavailable`,n):kn.test(n)?new jn(r.agent,n):new W(`startup-failed`,n,{taskId:f})}return{taskId:f,job:h,agent:r.agent,startupCheck:h.threadId?`passed`:`pending`}}function In(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 Ln(e){if(v.env.CODER_WORKER)throw new W(`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 W(`invalid-option`,`Missing task text.`,{hint:[`Usage: coder run "<task text>"`,`Help: coder task run --help`]});let t=an(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=Mn(n,t);try{return await Fn(t,i,e,r)}catch(a){if(!(a instanceof jn))throw a;let o=t.chain[t.chain.indexOf(a.agent)+1];if(!o){let t=In(a.agent,a.detail,i.permissions,e.system,e.prompt);throw new W(`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 Rn(e,t){if(t.status!==`failed`)return;let n=t.result;if(!n||!kn.test(n.error?.message??``)||!(!n.touchedFiles?.length&&!n.fileChanges?.length&&!n.commandExecutions?.length))return;let r=an(e).chain;return r[r.indexOf(t.job.agent)+1]}function zn(e,t){return j(b.join(o(e,t),`result.json`))}function Bn(e,t,n=0){return n===0?[]:c(e,t,n===`all`?2**53-1:n)}function Vn(e,t,n={}){let r=m(e,t);if(!r)throw Error(`No task found for "${t}".`);return{taskId:t,status:r.status,result:zn(e,t),steps:Bn(e,t,n.tail),turns:l(e,t),job:r}}async function Hn(e,t,n={}){let r=m(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 W(`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:zn(e,t),steps:Bn(e,t,n.tail),turns:l(e,t),job:a}}const Un=[`.ts`,`.mjs`,`.js`];function Wn(e,t){let n=[];try{n=y.readdirSync(e)}catch{return[]}let r=[];for(let i of n.sort()){let n=b.extname(i);Un.includes(n)&&r.push({name:b.basename(i,n),path:b.join(e,i),scope:t})}return r}function Gn(e){let t=s(e),n=[],i=b.resolve(e);for(;n.push({dir:b.join(i,`.coder`,`flows`),scope:`workspace`}),i!==t&&b.dirname(i)!==i;)i=b.dirname(i);return n.push({dir:b.join(r(),`flows`),scope:`global`}),n}function Kn(e){let t=new Set,n=[];for(let{dir:r,scope:i}of Gn(e))for(let e of Wn(r,i))t.has(e.name)||(t.add(e.name),n.push(e));return n}function qn(e){return e.includes(`/`)||Un.includes(b.extname(e))}function Jn(e,t){if(qn(e)){let n=b.resolve(t,e);if(y.existsSync(n))return{name:b.basename(n,b.extname(n)),path:n};throw Error(`Flow file not found: ${e}`)}let n=Kn(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 Yn(e,t,n={}){if(t.length)try{x(v.execPath,[te,`_archiveSweep`,`--cwd`,e,...n.flows?[`--flows`]:[],...t],{detached:!0,stdio:`ignore`}).unref()}catch{}}async function Xn(e){let{options:t,positionals:r}=ne(e,C.object({cwd:ie,flows:re})),i=k(t);for(let e of r){if(t.flows){let t=Z(e);t&&Lr(t);continue}let r=n(i,e);r&&ae(i,r)}}async function Zn(e){let{options:t,positionals:n}=ne(e,C.object({...g,"all-stopped":re}));Be(n,1,`task archive`);let r=k(t);if(t[`all-stopped`]){let e=u(r).filter(e=>a.includes(e.status));for(let t of e)ae(r,t);let n=e.map(e=>e.id);if(t.json){D({archived:n,count:n.length});return}v.stdout.write(n.length?`Archived ${n.length} stopped task${n.length===1?``:`s`}.\n`:`${w.dim(`No stopped tasks to archive.`)}\n`);return}let i=n[0];i||E(`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(ae(r,o),t.json){D({taskId:o.id,archived:!0});return}v.stdout.write(`Archived task ${w.cyan(o.id)}.\n`)}async function Qn(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{v.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 $n(e){let{options:t,positionals:n}=ne(e,C.object(g));Be(n,1,`task stop`);let r=k(t),i=Ve(r,n[0]),{interrupt:a}=await Qn(r,i);if(t.json){D({taskId:i.id,status:`cancelled`,interrupt:a});return}v.stdout.write(`Stopped task ${w.cyan(i.id)} ${w.dim(`(${a})`)}\n`)}function er(e){return typeof e!=`object`||!e?JSON.stringify(e)??`null`:Array.isArray(e)?`[${e.map(er).join(`,`)}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${er(e[t])}`).join(`,`)}}`}function tr(e,t){return fe.createHash(`sha256`).update(`${e}\0${er(t)}`).digest(`hex`)}function G(e){return y.existsSync(e)?y.readFileSync(e,`utf8`).split(/\r?\n/).filter(Boolean).map(e=>{try{return JSON.parse(e)}catch{return null}}).filter(e=>e!==null):[]}var nr=class{file;recorded;seq=0;constructor(e,t){this.file=t,this.recorded=e.map(e=>({...e})),y.writeFileSync(t,``,`utf8`)}write(e){e.seq=this.seq++,y.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 rr=globalThis,K=rr.__coderFlowCtxALS??=new me,q=rr.__coderFlowScopeALS??=new me;function ir(){return q.getStore()?.args}function ar(){return q.getStore()?.depth??0}var or=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 sr(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 cr(e,t){if(!t.tokens)return;let n=t.model??`default`;e.ledger[n]=sr(e.ledger[n]??null,t.tokens)}function lr(e){return!!e&&typeof e.safeParse==`function`}async function ur(e){try{let t=await import(`zod`);if(typeof t.toJSONSchema==`function`)return t.toJSONSchema(e)}catch{}return null}async function dr(e){let t=await ur(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 fr(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 pr(e,t){if(!lr(e))return{ok:!0,data:t};let n=e.safeParse(t);if(n.success)return{ok:!0,data:n.data};let r=n.error?.issues??n.error?.errors??[];return{ok:!1,errors:Array.isArray(r)?r.map(e=>`${(e.path??[]).join(`.`)||`(root)`}: ${e.message}`).join(`; `):String(n.error)}}function mr(e,t,n){return{cwd:t,agent:e.agent,model:e.model,effort:e.effort,permissions:e.permissions,name:e.name,system:e.system,wait:!0,flowRunId:n?.runId}}async function hr(e,t,n,r){let i=t.cwd?b.resolve(t.cwd):n?.cwd??v.cwd(),a;for(;;){let o=await Ln({prompt:e,...mr(t,i,n),...a?{agent:a,model:void 0,effort:void 0,resume:void 0}:{resume:r??t.resume},onFallback:e=>Tr(`${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=m(i,o.taskId),c=s?Ce(s):void 0;n?.hooks.onTaskStart?.({taskId:o.taskId,name:t.name,prompt:e,agent:c,depth:ar()});let l;try{l=await Hn(i,o.taskId)}finally{n?.running.delete(o.taskId)}let u=Rn(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 gr(e,t,n){let r=e;if(t.returns&&(r=`${e}\n\n${await dr(t.returns)}`),n?.dryRun){v.stdout.write(`\n[dry-run] task${t.name?` (${t.name})`:``}:\n${r}\n`);let e={...t,returns:t.returns?`<schema>`:void 0};return v.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 hr(r,t,n);if(i.status!==`completed`){let e={...i,data:void 0};throw new W(`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=pr(t.returns,fr(a))}catch(t){e={ok:!1,errors:t instanceof Error?t.message:String(t)}}if(e.ok)s=e.data;else{let r=await hr(`Your previous reply did not match the required format: ${e.errors}\n\n${await dr(t.returns)}`,t,n,i.taskId);a=r.output||a,o=sr(o,r.tokens);try{let e=pr(t.returns,fr(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 W(`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 _r(e){if(e)return await ur(e)??`<schema>`}async function vr(e,t={}){let n=K.getStore();if(!n)return gr(e,t);let r=tr(`task`,{prompt:e,agent:t.agent,model:t.model,effort:t.effort,permissions:t.permissions,name:t.name,system:t.system,resume:t.resume,cwd:t.cwd,returns:await _r(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 gr(e,t,n)}catch(e){let t=e instanceof W?e.result:void 0;throw t&&n.hooks.onTaskEnd?.({taskId:t.taskId,status:t.status===`completed`?`failed`:t.status,tokens:t.tokens}),e}return cr(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 yr=262144;let br=0;function xr(e){let t=[];for(let n=e;;){t.push(b.join(n,`node_modules`,`.bin`));let e=b.dirname(n);if(e===n)break;n=e}let n=v.platform===`win32`?`;`:`:`;return{...v.env,PATH:[...t,v.env.PATH??``].join(n)}}async function Sr(e,t){return new Promise(n=>{let r=x(e,{shell:!0,cwd:t,env:xr(t)}),i=``,a=e=>{i.length>=yr||(i+=e,i.length>=yr&&(i=`${i.slice(0,yr)}\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 Cr(e,t={}){let n=K.getStore(),r=t.cwd?b.resolve(t.cwd):n?.cwd??v.cwd();if(!n)return Sr(e,r);let i=tr(`gate`,{cmd:e,cwd:t.cwd}),a=n.journal.replay(i);if(a)return a.result;if(n.dryRun){v.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-${v.pid}-${br+=1}`,c=ar();n.hooks.onGateStart?.({gateId:s,cmd:e,depth:c});let l=await Sr(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 wr(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 Tr(e){let t=K.getStore();if(t)try{y.appendFileSync(b.join(t.runDir,`flow.log`),`${JSON.stringify({at:new Date().toISOString(),message:e})}\n`,`utf8`)}catch{}t?.hooks.onLog?t.hooks.onLog(e,ar()):(v.stderr.isTTY||!t)&&v.stderr.write(`[flow] ${e}\n`)}const Er=ce(import.meta.url);function Dr(e){let t=b.dirname(ue(import.meta.url));for(;b.basename(t)!==`dist`&&b.dirname(t)!==t;)t=b.dirname(t);return b.basename(t)===`dist`?de(b.join(t,e)).href:null}function Or(e){if(!(e===`@wular/coder`||e===`@wular/coder/flow`||e===`zod`||e.startsWith(`zod/`)))return null;try{return de(Er.resolve(e)).href}catch{}return e===`@wular/coder/flow`?Dr(`flow/index.js`):e===`@wular/coder`?Dr(`sdk.js`):null}const kr=/(\bfrom\s+|\bimport\s+|\bimport\s*\(\s*)(['"])([^'"]+)\2/g;function Ar(e){return e.replace(kr,(e,t,n,r)=>{let i=Or(r);return i?`${t}${n}${i}${n}`:e})}async function jr(e,t,n){try{return await import(de(e).href)}catch(e){let r=e instanceof Error?e.message:String(e);throw t===`.ts`&&!v.versions?.bun&&/Unknown file extension|Unexpected token|SyntaxError|Cannot parse|import type|interface/i.test(r)?Error(`Could not run ${b.basename(n)}: TypeScript flows need bun. Run under \`bun\`, or write the flow as .mjs/.js.`):e}}async function Mr(e){let t=b.extname(e),n;try{n=y.readFileSync(e,`utf8`)}catch{throw Error(`Cannot read flow file: ${e}`)}let r=Ar(n);if(r===n)return jr(e,t,e);let i=b.dirname(e);try{for(let e of y.readdirSync(i)){if(!e.startsWith(`.__coderflow_`))continue;let t=b.join(i,e);Date.now()-y.statSync(t).mtimeMs>6e5&&y.unlinkSync(t)}}catch{}let a=`${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`,o=b.join(i,`.__coderflow_${a}${t}`),s=`__coderflow_loaded_${a}`,c=new Promise(e=>{globalThis[s]=e});y.writeFileSync(o,`globalThis[${JSON.stringify(s)}]?.();${r}`,`utf8`);let l=jr(o,t,e);try{await Promise.race([c,l.then(()=>void 0,()=>void 0)])}finally{delete globalThis[s];try{y.unlinkSync(o)}catch{}}return await l}async function Nr(e,t){let n=q.getStore();n.args=t??{};let r=await Mr(e),i=r.args,a=n.args;if(lr(i)){let e=i.safeParse(t??{});if(!e.success){let e=pr(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 Pr(e,t){let n=K.getStore(),r=Jn(e,n?.cwd??v.cwd());if(!n)return q.run({args:t??{},depth:0},()=>Nr(r.path,t));let i=q.getStore();if(i&&i.depth>=1)throw Error(`flow("${e}") nesting is one level deep; a sub-flow cannot call flow().`);let a=tr(`flow`,{name:r.name,args:t??{}}),o=n.journal.replay(a);if(o)return o.result;let s=new Date().toISOString();n.hooks.onFlowStart?.({name:r.name,depth:(i?.depth??0)+1});let c=await q.run({args:t??{},depth:(i?.depth??0)+1},()=>Nr(r.path,t));return n.journal.record({kind:`flow`,fingerprint:a,result:c,startedAt:s,endedAt:new Date().toISOString()}),c}function Fr(){return`flow-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function J(){return b.join(r(),`state`,`global`,`flows`)}function Y(){return b.join(r(),`state`,`global`,`flows-archived`)}function X(e){se(e,`flow run id`);let t=b.join(J(),e);if(y.existsSync(b.join(t,`flow.json`)))return t;let n=b.join(Y(),e);return y.existsSync(b.join(n,`flow.json`))?n:t}function Ir(e){if(e.archived)return e;let t={...e,archived:!0,archivedAt:new Date().toISOString()};return Q(X(e.runId),t),t}function Lr(e){let t=Ir(e),n=X(e.runId),r=b.join(Y(),e.runId);if(n!==r)try{y.mkdirSync(Y(),{recursive:!0}),y.renameSync(n,r)}catch{}return t}function Rr(e){let t=X(e.runId),n=b.join(J(),e.runId);if(t!==n)try{y.mkdirSync(J(),{recursive:!0}),y.renameSync(t,n)}catch{}let r={...e,archived:void 0,archivedAt:void 0};return Q(X(e.runId),r),r}function zr(e){let t=X(e);return y.existsSync(b.join(t,`flow.json`))?(y.rmSync(t,{recursive:!0,force:!0}),!0):!1}function Br(e){if(!f(e))return null;let t=b.join(X(e),`flow.json`);if(!y.existsSync(t))return null;try{return JSON.parse(y.readFileSync(t,`utf8`))}catch{return null}}function Vr(e){return e.status!==`running`||!e.pid||$r(e)?e:(Xr(e.runId,`orchestrator died`),Br(e.runId)??e)}function Z(e){let t=Br(e);return t?Vr(t):null}function Q(e,t){y.writeFileSync(b.join(e,`flow.json`),`${JSON.stringify(t,null,2)}\n`,`utf8`)}function Hr(e){let t=[];try{t=y.readdirSync(e)}catch{return[]}let n=[];for(let r of t)try{n.push(Vr(JSON.parse(y.readFileSync(b.join(e,r,`flow.json`),`utf8`))))}catch{}return n}const Ur=(e,t)=>String(t.startedAt).localeCompare(String(e.startedAt));function Wr(){let e=[];for(let t of Hr(J()))t.archived?Lr(t):e.push(t);return e.sort(Ur)}function Gr(e){let t=e?.migrate??!0,n=Hr(Y()),r=new Set(n.map(e=>e.runId));for(let e of Hr(J()))e.archived&&!r.has(e.runId)&&n.push(t?Lr(e):e);return n.sort(Ur)}function Kr(){return[...Wr(),...Gr()].sort(Ur)[0]??null}function qr(e,t=`all`){if(t===0)return[];let n=G(b.join(X(e),`journal.jsonl`)).filter(e=>e.kind===`task`),r=u(v.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 Jr(e={}){let t;if(e.archived)t=Gr();else{let e=[];t=Wr().filter(t=>t.status===`running`||t.status===`queued`||ve(t.endedAt??t.startedAt)<=6e5||(Ir(t),e.push(t.runId),!1)),Yn(v.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 Yr(e,t={},n){let r,i,a;if(n){let e=Z(n);if(!e)throw Error(`No flow run "${n}".`);e.archived&&Rr(e),r=e.name,i=e.script,a=t.args??e.args}else{let n=Jn(e,t.cwd?b.resolve(t.cwd):v.cwd());r=n.name,i=n.path,a=t.args??{}}let o=n??Fr(),s=X(o);y.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??le.cpus().length),maxTasks:Math.max(1,t.maxTasks??le.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 Xr(e,t){let n=Br(e);!n||n.status!==`running`||$(X(e),n,{status:`failed`,error:t})}const Zr=`stop-keep-tasks`;function Qr(e){try{return v.kill(e,0),!0}catch{return!1}}function $r(t){if(!t.pid||!Qr(t.pid))return!1;let n=e(t.pid),r=Date.parse(t.pidStartedAt??``);return n===null||!Number.isFinite(r)||n<=r+6e4}function ei(e){let t=u(v.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 G(b.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 ti(e,t=[]){let n=v.cwd(),r=[];for(let i of new Set([...ei(e),...t])){let e=m(n,i);if(!(!e||a.includes(e.status)))try{await Qn(n,e),r.push(i)}catch{}}return r}async function ni(e,t={}){let n=e?Z(e):Kr();if(!n)throw new W(`flow-failed`,e?`No flow run "${e}".`:`No flow runs.`,{hint:`Run one: coder flow run <name>`});if(n.status!==`running`)throw new W(`flow-failed`,`Run ${n.runId} is not running.`,{runId:n.runId,hint:`Result: coder flow result ${n.runId}`});let r=X(n.runId);if(!$r(n))return $(r,n,{status:`failed`,error:`orchestrator died`}),{runId:n.runId,status:`failed`,stoppedTasks:[],keptTasks:ei(n.runId)};let i=ei(n.runId),o=b.join(r,Zr);t.keepTasks&&y.writeFileSync(o,``,`utf8`);try{v.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 W(`flow-failed`,`Run ${n.runId} did not stop within 5s.`,{runId:n.runId,hint:`Check it: coder flow result ${n.runId}`});let t=v.cwd(),r=[],o=[];for(let e of i){let n=m(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{y.unlinkSync(o)}catch{}}}async function*ri(e,t,n={}){let r=b.join(X(e),`events.jsonl`),i=n.tail??`all`,a=0;if(i!==`all`)try{a=Math.max(0,y.readFileSync(r,`utf8`).split(`
|
|
16
|
+
`).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?!$r(c):t!==void 0&&!Qr(t);if(c&&(c.pid||t!==void 0)&&n){Xr(e,`orchestrator died`);break}await new Promise(e=>setTimeout(e,400)),c=Z(e)??c}yield*s()}function ii(e,t,n,r){let i={...Yr(e,t,r),pid:v.pid,pidStartedAt:new Date().toISOString()},{runId:a}=i,o=X(a);Q(o,i);let s=b.join(o,`journal.jsonl`),c=r?G(s):[],l=new nr(c,s),u={runId:a,runDir:o,cwd:t.cwd?b.resolve(t.cwd):v.cwd(),journal:l,semaphore:new or(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 ai(e,t,n,r){let{ctx:i,runDir:a,runId:o}=e,s=Z(o);try{let e=await K.run(i,()=>q.run({args:r??{},depth:0},()=>Nr(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 W(`flow-failed`,e instanceof Error?e.message:String(e),{runId:o})}}async function oi(e,t={},n={}){let{started:r}=ii(e,t,n),i=Z(r.runId).script;return n.onStart?.({runId:r.runId,requestStop:r.markStopped,runningIds:()=>[...r.ctx.running]}),ai(r,i,Z(r.runId).name,t.args??{})}async function si(e,t={},n={}){let{started:r,args:i,name:a,replayable:o}=ii(``,t,n,e),s=Z(e).script;return n.onStart?.({runId:e,requestStop:r.markStopped,runningIds:()=>[...r.ctx.running]}),o&&n.onReplay?.(o),ai(r,s,a,i)}export{I as $,D as $t,Kn as A,qe as At,Hn as B,E as Bt,vr as C,ot as Ct,Zn as D,Qe as Dt,Qn as E,ut as Et,In as F,Le as Ft,Sn as G,_e as Gt,En as H,ye as Ht,Ln as I,Ee as It,yn as J,ke as Jt,wn as K,O as Kt,Nn as L,ve as Lt,W as M,Je as Mt,kn as N,Ye as Nt,Xn as O,j as Ot,An as P,De as Pt,L as Q,Re as Qt,Vn as R,Ae as Rt,ri as S,at as St,$n as T,ct as Tt,On as U,Ce as Ut,Cn as V,xe as Vt,Tn as W,ge as Wt,z as X,Ie as Xt,xn as Y,we as Yt,R as Z,w as Zt,si as _,Rt as _t,zr as a,je as an,B as at,ti as b,lt as bt,Cr as c,hn as ct,Wr as d,un as dt,Se as en,zt as et,Tr as f,U as ft,Z as g,F as gt,Yr as h,Ft as ht,ir as i,ze as in,fn as it,Jn as j,Xe as jt,Yn as k,Ze as kt,Kr as l,sn as lt,wr as m,gn as mt,Lr as n,Ve as nn,ln as nt,Pr as o,Me as on,an as ot,Xr as p,H as pt,bn as q,be as qt,Jr as r,k as rn,V as rt,qr as s,Te as sn,on as st,Zr as t,Be as tn,Bt as tt,Gr as u,dn as ut,X as v,Lt as vt,G as w,M as wt,ni as x,dt as xt,oi as y,ft as yt,Pn as z,Oe as zt};
|