@wular/coder 0.2.11 → 0.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js
CHANGED
|
@@ -1,169 +1,170 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`,"utf8"),G}function
|
|
4
|
-
`,"utf8")}function
|
|
5
|
-
`,"utf8")}function H0(Q,Y,X=40){let W=x.join(C(Q,Y),"log.jsonl");if(!k.existsSync(W))return[];return k.readFileSync(W,"utf8").split(/\r?\n/).filter(Boolean).slice(-X).map((K)=>{try{return JSON.parse(K)}catch{return{message:K}}})}var
|
|
2
|
+
var F8=Object.defineProperty;var R8=(Q,Y)=>{for(var X in Y)F8(Q,X,{get:Y[X],enumerable:!0,configurable:!0,set:(W)=>Y[X]=()=>W})};import e from"node:process";import $2 from"node:fs";import k8 from"node:path";import{spawn as j8}from"node:child_process";import m0 from"node:process";import{execFileSync as x4}from"node:child_process";import k from"node:fs";import T8 from"node:os";import x from"node:path";import{spawn as _4,spawnSync as E8}from"node:child_process";import M8 from"node:fs";import _8 from"node:os";import M4 from"node:path";function T4(Q){try{let Y=_4("codex",["archive",Q],{detached:!0,stdio:"ignore"});Y.on("error",()=>{}),Y.unref()}catch{}}function I4(Q){let Y=M4.join(process.env.CODEX_HOME||M4.join(_8.homedir(),".codex"),"archived_sessions");try{return M8.readdirSync(Y).some((X)=>X.endsWith(`-${Q}.jsonl`))}catch{return!1}}function w4(Q){return new Promise((Y)=>{try{let X=_4("codex",["unarchive",Q],{stdio:"ignore"});X.on("error",()=>Y(!1)),X.on("close",(W)=>Y(W===0))}catch{Y(!1)}})}function S4(Q){return E8("codex",["delete","--force",Q],{encoding:"utf8"}).status===0}var Z0=["completed","failed","cancelled"],J0=["queued","running"];var I8="CODER_HOME";function M0(){return x.resolve(process.env[I8]||x.join(T8.homedir(),".coder"))}var C4=new Map;function Y0(Q){let Y=C4.get(Q);if(Y!==void 0)return Y;let X;try{X=x4("git",["rev-parse","--show-toplevel"],{cwd:Q,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{X=Q}return C4.set(Q,X),X}var k4="global";function K2(Q){return x.join(M0(),"state",k4)}var S2=null;function U3(){if(S2)return S2;let Q=x.join(M0(),"state"),Y=[];try{Y=k.readdirSync(Q,{withFileTypes:!0})}catch{}return S2=Y.filter((X)=>X.isDirectory()&&X.name!==k4).map((X)=>x.join(Q,X.name)),S2}function L3(Q){return x.join(K2(Q),"jobs")}function C2(Q){return x.join(K2(Q),"archive")}function C(Q,Y){let X=x.join(L3(Q),Y);if(k.existsSync(x.join(X,"job.json")))return X;let W=x.join(C2(Q),Y);if(k.existsSync(x.join(W,"job.json")))return W;for(let q of U3()){let K=x.join(q,"jobs",Y);if(k.existsSync(x.join(K,"job.json")))return K}return X}function P3(Q,Y){return Y.archived?Y:m(Q,Y.id,{archived:!0,archivedAt:new Date().toISOString()})}function h0(Q,Y){let X=P3(Q,Y);if(Y.engine==="codex"&&Y.threadId)T4(Y.threadId);let W=C(Q,Y.id),q=x.join(C2(Q),Y.id);if(W!==q)try{k.mkdirSync(C2(Q),{recursive:!0}),k.renameSync(W,q)}catch{}return X}function j4(){let Q=Math.random().toString(36).slice(2,8);return`coder-${Date.now().toString(36)}-${Q}`}function m(Q,Y,X){let W=C(Q,Y);k.mkdirSync(W,{recursive:!0});let q=x.join(W,"job.json"),G={...r(Q,Y)??{id:Y,createdAt:new Date().toISOString(),status:"queued"},...X,updatedAt:new Date().toISOString()};return k.writeFileSync(q,`${JSON.stringify(G,null,2)}
|
|
3
|
+
`,"utf8"),G}function v4(Q){if(!Q.engine&&(Q.agent==="codex"||Q.agent==="claude"))Q.engine=Q.agent;return Q}function r(Q,Y){let X=x.join(C(Q,Y),"job.json");if(!k.existsSync(X))return null;try{return v4(JSON.parse(k.readFileSync(X,"utf8")))}catch{return null}}function O3(Q,Y){let X=C(Q,Y);if(!k.existsSync(X))return!1;return k.rmSync(X,{recursive:!0,force:!0}),!0}function w8(Q){if(!Q)return!1;try{return process.kill(Q,0),!0}catch(Y){return Y.code==="EPERM"}}function S8(Q){try{let Y=x4("ps",["-o","lstart=","-p",String(Q)],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim(),X=Y?Date.parse(Y):NaN;return Number.isFinite(X)?X:null}catch{return null}}function C8(Q,Y){if(!w8(Q))return!1;let X=S8(Q),W=Date.parse(Y.createdAt??"");if(X===null||!Number.isFinite(W))return!0;return X<=W+60000}var x8=60000;function b0(Q,Y){if(Y.status!=="running"&&Y.status!=="queued")return Y;let X;if(Y.pid)X=!C8(Y.pid,Y);else{let W=Date.parse(Y.updatedAt??Y.createdAt??"");X=Number.isFinite(W)&&Date.now()-W>x8}if(X)return m(Q,Y.id,{status:"failed",error:"worker exited without finishing",completedAt:new Date().toISOString()});return Y}function V3(Q,Y){let X=[];for(let W of Q){let q=[];try{q=k.readdirSync(W)}catch{continue}for(let K of q){if(Y.has(K))continue;let G=x.join(W,K,"job.json");try{let z=v4(JSON.parse(k.readFileSync(G,"utf8")));Y.add(K),X.push(z)}catch{}}}return X}var Z3=(Q,Y)=>String(Y.updatedAt??"").localeCompare(String(Q.updatedAt??""));function z2(Q){let Y=[L3(Q),...U3().map((W)=>x.join(W,"jobs"))],X=[];for(let W of V3(Y,new Set))if(W.archived)h0(Q,W);else X.push(b0(Q,W));return X.sort(Z3)}function g0(Q,Y){let X=Y?.migrate??!0,W=new Set,q=V3([C2(Q)],W),K=[L3(Q),...U3().map((G)=>x.join(G,"jobs"))];for(let G of V3(K,W))if(G.archived)q.push(X?h0(Q,G):G);return q.sort(Z3)}function y0(Q,Y){let X=[...z2(Q),...g0(Q)].sort(Z3);if(!Y)return X[0]??null;let W=X.find((K)=>K.id===Y);if(W)return W;let q=X.filter((K)=>K.id.startsWith(Y));if(q.length===1)return q[0];if(q.length>1)throw Error(`Job reference "${Y}" is ambiguous. Use a longer id.`);return null}function h4(Q,Y){let X=C(Q,Y);try{k.mkdirSync(X,{recursive:!0}),k.writeFileSync(x.join(X,"heartbeat"),"","utf8")}catch{}}function x2(Q,Y){let X=C(Q,Y.id),W=Date.parse(Y.updatedAt??"")||0;for(let q of["log.jsonl","heartbeat"])try{W=Math.max(W,k.statSync(x.join(X,q)).mtimeMs)}catch{}return W?new Date(W).toISOString():void 0}async function b4(Q,Y,X=400){let W=Y;while(!Z0.includes(W.status))await new Promise((q)=>setTimeout(q,X)),W=b0(Q,r(Q,W.id)??W);return W}var g4="steer-queue.jsonl";function y4(Q,Y,X){let W=C(Q,Y);k.mkdirSync(W,{recursive:!0}),k.appendFileSync(x.join(W,g4),`${JSON.stringify({at:new Date().toISOString(),text:X})}
|
|
4
|
+
`,"utf8")}function m4(Q,Y){let X=C(Q,Y),W=x.join(X,g4),q=x.join(X,`steer-claim-${process.pid}-${Date.now()}.tmp`);try{k.renameSync(W,q)}catch{return[]}try{return k.readFileSync(q,"utf8").split(/\r?\n/).filter(Boolean).map((K)=>{try{return String(JSON.parse(K).text??"")}catch{return""}}).filter(Boolean)}finally{try{k.unlinkSync(q)}catch{}}}function V0(Q,Y,X){let W=C(Q,Y);k.mkdirSync(W,{recursive:!0}),k.appendFileSync(x.join(W,"log.jsonl"),`${JSON.stringify({at:new Date().toISOString(),...X})}
|
|
5
|
+
`,"utf8")}function H0(Q,Y,X=40){let W=x.join(C(Q,Y),"log.jsonl");if(!k.existsSync(W))return[];return k.readFileSync(W,"utf8").split(/\r?\n/).filter(Boolean).slice(-X).map((K)=>{try{return JSON.parse(K)}catch{return{message:K}}})}var G2="@wular/coder",v8=`https://registry.npmjs.org/${G2}/latest`,h8=86400000;function A3(){return k8.join(M0(),"update-check.json")}function D3(Q,Y){let X=String(Q).split(".").map((q)=>parseInt(q,10)||0),W=String(Y).split(".").map((q)=>parseInt(q,10)||0);for(let q=0;q<3;q+=1){if((X[q]??0)>(W[q]??0))return 1;if((X[q]??0)<(W[q]??0))return-1}return 0}function u4(){try{return JSON.parse($2.readFileSync(A3(),"utf8"))}catch{return null}}function b8(Q){try{$2.mkdirSync(M0(),{recursive:!0}),$2.writeFileSync(A3(),JSON.stringify(Q))}catch{}}function c4(){try{$2.rmSync(A3(),{force:!0})}catch{}}function f4(Q,Y){if(m0.env.CODER_NO_UPDATE_CHECK||m0.env.CI)return;let X=u4();if(X?.latest&&D3(X.latest,Q)>0){let q=m0.stderr.isTTY&&!m0.env.NO_COLOR,K=(z)=>q?`\x1B[38;5;245m${z}\x1B[0m`:z,G=(z)=>q?`\x1B[1m${z}\x1B[0m`:z;m0.stderr.write(K(`coder ${Q} -> `)+G(X.latest)+K(` available. run: coder upgrade
|
|
6
6
|
|
|
7
|
-
`))}if(!X?.checkedAt||Date.now()-X.checkedAt>
|
|
8
|
-
`)}function
|
|
7
|
+
`))}if(!X?.checkedAt||Date.now()-X.checkedAt>h8)try{j8(m0.execPath,[Y,"_refreshUpdate"],{detached:!0,stdio:"ignore"}).unref()}catch{}}async function p4(Q){let X=u4()?.latest??null;try{let W=new AbortController,q=setTimeout(()=>W.abort(),3000),K=await fetch(v8,{signal:W.signal,headers:{accept:"application/json"}});if(clearTimeout(q),K.ok){let G=await K.json();if(G?.version)X=G.version}}catch{}b8({checkedAt:Date.now(),latest:X,current:Q})}function l4(Q){let Y=Q;try{Y=$2.realpathSync(Q)}catch{}let X=Y.replace(/\\/g,"/");if(/\/\.bun\//.test(X))return{pm:"bun",command:["bun","add","-g",`${G2}@latest`]};if(/\/\.pnpm\//.test(X)||/\/pnpm(-global)?\//i.test(X)||/\/Library\/pnpm\//.test(X))return{pm:"pnpm",command:["pnpm","add","-g",`${G2}@latest`]};if(/\/\.config\/yarn\/global\//.test(X)||/\/yarn\/global\//.test(X)||/\/Yarn\/Data\/global\//.test(X))return{pm:"yarn",command:["yarn","global","add",`${G2}@latest`]};return{pm:"npm",command:["npm","install","-g",`${G2}@latest`]}}import F3 from"node:fs";import{fileURLToPath as R3}from"node:url";var A0=R3(import.meta.url);function a(){try{return JSON.parse(F3.readFileSync(R3(new URL("../package.json",import.meta.url)),"utf8")).version??"unknown"}catch{return"unknown"}}function E3(Q){try{return JSON.parse(F3.readFileSync(Q,"utf8")).version??null}catch{return null}}function k2(){return R3(new URL("..",import.meta.url))}import g8 from"node:path";import G0 from"node:process";function d4(Q){let Y=Q.isTTY&&!G0.env.NO_COLOR,X=(W,q)=>Y?`\x1B[${W}m${q}\x1B[0m`:q;return{blue:(W)=>X("34",W),bold:(W)=>X("1",W),cyan:(W)=>X("36",W),dim:(W)=>X("38;5;245",W),green:(W)=>X("32",W),red:(W)=>X("31",W)}}var O=d4(G0.stdout),M3=d4(G0.stderr);function _0(Q,Y=M3){let X=Q.map((q)=>{let K=q.indexOf("coder ");return K===-1?{label:q,cmd:""}:{label:q.slice(0,K),cmd:q.slice(K)}}),W=Math.max(0,...X.map((q)=>q.label.length));return X.map(({label:q,cmd:K})=>K?` ${Y.dim(q.padEnd(W))}${Y.bold(K)}`:` ${Y.dim(q)}`).join(`
|
|
8
|
+
`)}function D(Q,Y={}){let X=typeof Y==="number"?Y:Y.code??1,W=typeof Y==="object"?Y.hint:null,q=W==null?[]:Array.isArray(W)?W:[W];if(G0.stderr.write(`${Q}
|
|
9
9
|
`),q.length)G0.stderr.write(`
|
|
10
|
-
${
|
|
10
|
+
${_0(q,M3)}
|
|
11
11
|
`);G0.exit(X)}function E(Q){G0.stdout.write(`${JSON.stringify(Q,null,2)}
|
|
12
|
-
`)}function
|
|
13
|
-
`).map((W)=>` ${Y.dim(W)}`)]}var
|
|
12
|
+
`)}function B2(Q){let Y=Date.parse(Q??"");return Number.isFinite(Y)?Math.max(0,Date.now()-Y):0}function H2(Q){let Y=Math.floor(Q/1000);if(Y<60)return`${Y}s`;let X=Math.floor(Y/60);if(X<60)return`${X}m`;return`${Math.floor(X/60)}h${X%60}m`}function j2(Q){if(Q<1000)return String(Q);if(Q<1e6)return`${(Q/1000).toFixed(Q<1e4?1:0)}k`;return`${(Q/1e6).toFixed(1)}M`}function u0(Q,Y){let X=[`in ${j2(Q.input)}`,...Q.cachedInput?[`cached ${j2(Q.cachedInput)}`]:[],`out ${j2(Q.output)}`];return`${j2(Q.total)} (${X.join(" · ")}) on ${Y||"default model"}`}function v2(Q,Y,X,W=O){let q=Q?.error?.message??Y;return Q?.finalMessage||(q?`${W.red("error:")} ${q}`:X)}var r4=500;function h2(Q,Y=O){let X=Q.length>r4?`${Q.slice(0,r4)}…`:Q;return[Y.dim("prompt:"),...X.split(`
|
|
13
|
+
`).map((W)=>` ${Y.dim(W)}`)]}var _3=128;function c0(Q,Y=_3,{plain:X=!1,style:W=O}={}){if(Q.length<=Y)return Q;let q=`<${Q.length-Y} more chars>`;return`${Q.slice(0,Y)} ${X?q:W.dim(q)}`}var b2=600000,n4=120000;function g2(Q,Y=0){let X=Q.padEnd(Y);if(Q==="running")return O.green(X);if(Q==="failed"||Q==="cancelled")return O.red(X);if(Q==="completed")return O.blue(X);return O.dim(X)}var y8=4;function y2(Q,Y,X=!1){if(X)E({taskId:Q,status:"awaiting-approval",approval:Y});else G0.stdout.write(`Approval needed for task ${Q}: ${Y.summary}
|
|
14
14
|
`),G0.stderr.write(`
|
|
15
|
-
${
|
|
16
|
-
`);G0.exit(
|
|
15
|
+
${_0([`Approve: coder approve ${Q} ${Y.id}`,`Deny: coder approve ${Q} ${Y.id} --deny`,`Then: coder task result ${Q} --wait`],M3)}
|
|
16
|
+
`);G0.exit(y8)}function f(Q,Y,X){if(Q.length>Y){let W=Q.slice(Y);D(`Unexpected argument${W.length>1?"s":""}: ${W.join(" ")}`,{hint:`Help: coder ${X} --help`})}}function I(Q){return Q.cwd?g8.resolve(String(Q.cwd)):G0.cwd()}function p(Q,Y){let X=y0(Q,Y);if(!X)D(Y?`No task found for "${Y}".`:"No tasks found for this workspace.",{hint:Y?["List tasks: coder task list",'Start one: coder run "<text>"']:['Start one: coder run "<text>"']});return X}var m8=[["--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) · opus/sonnet/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"]],W0=["--cwd <dir>","workspace directory (default: current)"],X0=["--json","JSON output"],T3=[{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:"stream",usage:"stream [task-id]",blurb:"watch a task live (progress log)",alias:"stream"},{sub:"steer",usage:'steer <task-id> "<follow-up>"',blurb:"continue a task's thread"},{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:"list escalated approvals"},{sub:"approve",usage:"approve <task-id> <id>",blurb:"answer an escalated permission"}],f0={"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\nprints a task id; --wait runs in the foreground and prints the answer.\nShortcut: `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)"],...m8,W0],examples:[['coder run "add a /health endpoint"',"dispatch in the background, print a task id"],['coder run --wait "fix the failing test"',"block until done, print the answer"],[`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 stream"},"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\nones stopped within the last 2 minutes. Older stopped tasks auto-archive and\nmove to --archived. Shortcut: `coder list`.",flags:[["--running","show only running tasks"],["--stopped","show only recently stopped tasks (not yet archived)"],["--archived","show only archived tasks (auto-archived or via task archive)"],["--limit <n|all>","show at most n tasks (default all)"],["--dir <dir>","only tasks launched in that workspace"],X0],seeAlso:"task result · task archive · task delete"},"task result":{list:["task result [task-id]","status + final answer of a task"],usage:"coder task result [task-id]",summary:`Show a task's status and its final answer (result pending while it runs), plus
|
|
17
17
|
any pending approvals. --wait blocks until it finishes, then prints. --tail <n>
|
|
18
18
|
includes the last n progress-log steps (--tail all for the whole transcript).
|
|
19
|
-
Defaults to the most recent task. Shortcut: \`coder result\`.`,flags:[["--wait","block until the task finishes, then print"],["--tail <n|all>","include the last n progress-log steps"],
|
|
19
|
+
Defaults to the most recent task. Shortcut: \`coder result\`.`,flags:[["--wait","block until the task finishes, then print"],["--tail <n|all>","include the last n progress-log steps"],X0,W0],seeAlso:"task list · task steer · task stream"},"task stream":{list:["task stream [task-id]","watch a task live (progress log)"],usage:"coder task stream [task-id]",summary:`Watch a running task's progress log live (for you/debugging), then print its
|
|
20
20
|
final answer. Replays the last line first so the current step is visible;
|
|
21
21
|
--tail <n> replays the last n lines (--tail all for the whole transcript).
|
|
22
22
|
Blocks until it finishes; exits 0 on success, 1 otherwise. For the answer
|
|
23
|
-
alone, prefer \`coder result\`.`,flags:[["--tail <n|all>","replay the last n log lines first (default: 1)"],["--trim <n|none>","cap each step at n chars, text and JSON alike (default: 128)"],["--json","emit each log entry as a JSON line, then the result"],
|
|
24
|
-
engine, model, and permissions unless you override them.`,flags:[["--wait","run in the foreground and block until the answer is ready"],["--model <alias|slug>","override the task's model for this follow-up"],["--effort <low|medium|high>","override the task's reasoning effort"],["--permissions <mode>","read-only · workspace-write · auto"],
|
|
25
|
-
delete every archived task at once. A running task must be stopped first.`,flags:[["--all-archived","delete every archived task"],
|
|
26
|
-
target a dotted key (e.g. agents.codex.model). Writes go to ~/.coder/config.json.`,flags:[["--workspace","target <repo>/coder.config.json instead of the user file"],
|
|
23
|
+
alone, prefer \`coder result\`.`,flags:[["--tail <n|all>","replay the last n log lines first (default: 1)"],["--trim <n|none>","cap each step at n chars, text and JSON alike (default: 128)"],["--json","emit each log entry as a JSON line, then the result"],W0],examples:[["coder stream","follow the most recent task to completion"]],seeAlso:"task result · task run"},"task steer":{list:['task steer <task-id> "<follow-up>"',"continue a task's thread"],usage:'coder task steer <task-id> "<follow-up instructions>" [--wait]',summary:`Continue a finished task's thread with new instructions. Reuses the task's
|
|
24
|
+
engine, model, and permissions unless you override them.`,flags:[["--wait","run in the foreground and block until the answer is ready"],["--model <alias|slug>","override the task's model for this follow-up"],["--effort <low|medium|high>","override the task's reasoning effort"],["--permissions <mode>","read-only · workspace-write · auto"],W0],examples:[['coder task steer coder-abc "now add tests"',"continue that task with a follow-up"]],seeAlso:"task run · task stop"},"task stop":{list:["task stop <task-id>","interrupt a running task"],usage:"coder task stop <task-id>",summary:"Interrupt a running task and mark it cancelled.",flags:[X0,W0],seeAlso:"task result · task steer"},"task archive":{list:["task archive <task-id> | --all-stopped","hide a task (or all stopped) from the list"],usage:"coder task archive <task-id> | coder task archive --all-stopped",summary:"Archive a task session so it drops out of the default list (see it again with\n`coder task list --archived [--limit N]`). Pass --all-stopped to archive every\nfinished task.",flags:[["--all-stopped","archive every stopped (finished) task"],X0,W0],seeAlso:"task list · task delete"},"task delete":{list:["task delete <task-id> | --all-archived","delete a task session (or all archived)"],usage:"coder task delete <task-id> | coder task delete --all-archived",summary:`Delete a task's session from disk. This is permanent. Pass --all-archived to
|
|
25
|
+
delete every archived task at once. A running task must be stopped first.`,flags:[["--all-archived","delete every archived task"],X0,W0],seeAlso:"task archive · task stop"},"task approvals":{list:["task approvals <task-id>","list escalated approvals"],usage:"coder task approvals <task-id>",summary:"List permission escalations a task has raised, and how each was answered.",flags:[X0,W0],seeAlso:"task approve"},"task approve":{list:["task approve <task-id> <id> [--deny]","answer an escalated permission"],usage:"coder task approve <task-id> <approval-id> [--deny]",summary:"Answer an escalated permission request. Accepts by default; --deny rejects it.",flags:[["--deny","reject the request instead of accepting"],X0,W0],seeAlso:"task approvals · task result"},config:{list:["config [get|set|unset] <key> [value]","read or write config"],usage:"coder config [get|set|unset] <key> [value] [--workspace]",summary:`Read or write configuration. No args prints the effective config; get/set/unset
|
|
26
|
+
target a dotted key (e.g. agents.codex.model). Writes go to ~/.coder/config.json.`,flags:[["--workspace","target <repo>/coder.config.json instead of the user file"],X0,W0],examples:[["coder config","print the effective config"],["coder config set chain codex,claude","set the engine fallback chain"],["coder config get agents.codex.model","read one value"]]},"setup-host":{list:["setup-host [claude|codex|agents]","set up the host: check engines, write config, install plugin"],usage:"coder setup-host [claude] [codex] [agents] [--json]",summary:`Set up coder in your host: check engines and auth, seed the config, and
|
|
27
27
|
install the host plugin/skill for the named host(s). Claude Code gets its
|
|
28
28
|
marketplace plugin; "agents" installs a skill into ~/.agents/skills for
|
|
29
29
|
every host that reads the Agent Skills standard dir (Codex, Pi, OpenCode,
|
|
30
|
-
...). "codex" is an alias for agents. With no host, checks and seeds.`,flags:[["--json","machine-readable output"]],examples:[["coder setup-host claude","install the Claude Code plugin"],["coder setup-host agents","install the skill into ~/.agents/skills (Codex, Pi, OpenCode, ...)"]]},"model list":{list:["model list","list custom models and probe their endpoints"],usage:"coder model list [--json]",summary:"List the configured custom models and probe each endpoint for reachability.\nAlso the default when `coder model` is run bare.",flags:[
|
|
30
|
+
...). "codex" is an alias for agents. With no host, checks and seeds.`,flags:[["--json","machine-readable output"]],examples:[["coder setup-host claude","install the Claude Code plugin"],["coder setup-host agents","install the skill into ~/.agents/skills (Codex, Pi, OpenCode, ...)"]]},"model list":{list:["model list","list custom models and probe their endpoints"],usage:"coder model list [--json]",summary:"List the configured custom models and probe each endpoint for reachability.\nAlso the default when `coder model` is run bare.",flags:[X0,W0],seeAlso:"model add · model remove"},"model add":{list:["model add <name> --base-url <url> --model <id>","connect a local or third-party model (OpenAI-compatible)"],usage:"coder model add <name> --base-url <url> --model <id> [--env-key VAR]",summary:`Connect a custom model behind an OpenAI-compatible endpoint (Ollama, LM Studio,
|
|
31
31
|
vLLM, OpenRouter, ...). It currently runs on the codex engine pointed at your
|
|
32
32
|
URL and is usable anywhere a model is: --model <name>, --agent custom, or as an
|
|
33
|
-
agent default in config. Alias: \`coder model setup\`.`,flags:[["--base-url <url>","OpenAI-compatible API base (e.g. http://localhost:11434/v1)"],["--model <id>","the provider's model id (e.g. qwen2.5-coder:32b)"],["--env-key <VAR>","env var holding the API key (omit for keyless local endpoints)"],["--workspace","write to <repo>/coder.config.json instead of the user file"],
|
|
34
|
-
is re-probed and the wire protocol re-detected.`,flags:[["--base-url <url>","new API base"],["--model <id>","new provider model id"],["--env-key <VAR>","new API-key env var"],["--workspace","write to <repo>/coder.config.json instead of the user file"],
|
|
35
|
-
the host plugins to match. Alias: update.`,flags:[["--cli-only","update just the CLI"],["--plugins-only","refresh just the host plugins"],["--codex","limit the refresh to the Agent Skills copy (Codex, Pi, ...)"],["--claude","limit the refresh to the Claude Code plugin"],["--pm <npm|pnpm|yarn|bun>","force a package manager instead of auto-detecting"]]}},
|
|
33
|
+
agent default in config. Alias: \`coder model setup\`.`,flags:[["--base-url <url>","OpenAI-compatible API base (e.g. http://localhost:11434/v1)"],["--model <id>","the provider's model id (e.g. qwen2.5-coder:32b)"],["--env-key <VAR>","env var holding the API key (omit for keyless local endpoints)"],["--workspace","write to <repo>/coder.config.json instead of the user file"],X0],examples:[["coder model add qwen --base-url http://localhost:11434/v1 --model qwen2.5-coder:32b","local Ollama model, no key"],["coder model add kimi --base-url https://openrouter.ai/api/v1 --model moonshotai/kimi-k2 --env-key OPENROUTER_API_KEY","third-party provider via OpenRouter"],['coder run --model qwen "explain this repo"',"dispatch a task on it"]],seeAlso:"model list · model update · setup-host · config"},"model update":{list:["model update <name> [--base-url|--model|--env-key]","change a custom model in place"],usage:"coder model update <name> [--base-url <url>] [--model <id>] [--env-key VAR]",summary:`Update a configured custom model. Only the flags you pass change; the endpoint
|
|
34
|
+
is re-probed and the wire protocol re-detected.`,flags:[["--base-url <url>","new API base"],["--model <id>","new provider model id"],["--env-key <VAR>","new API-key env var"],["--workspace","write to <repo>/coder.config.json instead of the user file"],X0],seeAlso:"model list · model remove"},"model remove":{list:["model remove <name>","delete a custom model"],usage:"coder model remove <name>",summary:"Remove a configured custom model.",flags:[["--workspace","target <repo>/coder.config.json instead of the user file"],X0],seeAlso:"model list · model add"},upgrade:{list:["upgrade [--cli-only|--plugins-only]","update the CLI and host plugins (alias: update)"],usage:"coder upgrade [--cli-only] [--plugins-only] [--codex] [--claude] [--pm <mgr>]",summary:`Update the coder CLI through whichever package manager installed it, then refresh
|
|
35
|
+
the host plugins to match. Alias: update.`,flags:[["--cli-only","update just the CLI"],["--plugins-only","refresh just the host plugins"],["--codex","limit the refresh to the Agent Skills copy (Codex, Pi, ...)"],["--claude","limit the refresh to the Claude Code plugin"],["--pm <npm|pnpm|yarn|bun>","force a package manager instead of auto-detecting"]]}},m2={run:"task run",list:"task list",stream:"task stream",watch:"task stream",result:"task result",steer:"task steer",stop:"task stop",archive:"task archive",delete:"task delete",approvals:"task approvals",approve:"task approve",setup:"setup-host","host-setup":"setup-host",update:"upgrade"},u8=[{usage:"list",blurb:"list models, probe their endpoints"},{usage:"add <name> --base-url <url> --model <id> [--env-key VAR]",blurb:"connect a model (alias: setup)"},{usage:"update <name> [--base-url|--model|--env-key]",blurb:"change a model in place"},{usage:"remove <name>",blurb:"delete a model"}];function I3(){let Q=O,Y=u8.map((X)=>` ${Q.cyan(X.usage.padEnd(60))}${Q.dim(X.blurb)}`);return`${[Q.bold("Usage:")," coder model <subcommand>","","Custom (OpenAI-compatible) models: local (Ollama, LM Studio, vLLM, ...) or","hosted (OpenRouter, gateways). Together they form the `custom` agent and","currently run on the codex engine pointed at your URL.","",Q.bold("Subcommands:"),...Y,"",Q.dim("Run 'coder model <subcommand> --help' for details on any subcommand.")].join(`
|
|
36
36
|
`)}
|
|
37
|
-
`}function
|
|
37
|
+
`}function c8(Q,Y){return Q.map(([X,W])=>` ${Y.cyan(X.padEnd(30))}${Y.dim(W)}`)}function N2(Q){let Y=f0[Q];if(!Y)return null;let X=O,W=[X.bold("Usage:"),` ${Y.usage}`];if(Y.summary)W.push("",Y.summary);if(Y.flags?.length)W.push("",X.bold("Flags:"),...c8(Y.flags,X));if(Y.examples?.length){W.push("",X.bold("Examples:"));for(let[q,K]of Y.examples)W.push(` ${X.cyan(q)}`,` ${X.dim(K)}`)}if(Y.seeAlso)W.push("",X.dim(`Related: ${Y.seeAlso}`));return`${W.join(`
|
|
38
38
|
`)}
|
|
39
|
-
`}function
|
|
39
|
+
`}function J2(){let Q=O,Y=T3.map((X)=>{let W=X.alias?Q.dim(` (coder ${X.alias})`):"";return` ${Q.cyan(X.usage.padEnd(30))}${Q.dim(X.blurb)}${W}`});return`${[Q.bold("Usage:")," coder task <subcommand>","",Q.bold("Subcommands:"),...Y,"",Q.dim("Run 'coder task <subcommand> --help' for details on any subcommand.")].join(`
|
|
40
40
|
`)}
|
|
41
|
-
`}function
|
|
41
|
+
`}function u2(){let Q=O,Y=([q,K])=>` ${Q.cyan(q.padEnd(38))}${Q.dim(K)}`,X=T3.filter((q)=>q.alias).map((q)=>Y([q.usage.replace(/^\S+/,q.alias),q.blurb])),W=T3.filter((q)=>!q.alias).map((q)=>q.sub).join(", ");return`${[`${Q.bold("Coder")} ${Q.dim(`v${a()}`)}`,"Delegate a coding task to the best available engine and steer it while it runs.","",Q.bold("Get started:"),` ${Q.cyan("coder setup-host claude")} ${Q.dim("# or agents (Codex, Pi, ...); installs the host plugin/skill")}`,` ${Q.cyan(`coder run "explain this repo's layout"`)}`,"",Q.bold("Usage:")," coder <command>","",Q.bold("Commands:"),...X,` ${Q.dim(`More task commands (${W}): `)}${Q.cyan("coder task --help")}`,Y(f0.config.list),Y(["model <list|add|update|remove>","manage custom models (OpenAI-compatible)"]),Y(f0.upgrade.list),"",Q.bold("Global:"),Y(["-h, --help","show help (top-level, or for a command)"]),Y(["-v, --version","print the coder version"]),Y(["--json","JSON output instead of human-readable text"]),Y(W0)].join(`
|
|
42
42
|
`)}
|
|
43
|
-
`}function y2(Q){let Y=Q.indexOf("--"),X=Y===-1?Q:Q.slice(0,Y);return X.includes("-h")||X.includes("--help")}import E0 from"node:fs";import _2 from"node:path";import h from"node:process";import{spawn as FY}from"node:child_process";var r4;function F(Q,Y,X){function W(z,$){if(!z._zod)Object.defineProperty(z,"_zod",{value:{def:$,constr:G,traits:new Set},enumerable:!1});if(z._zod.traits.has(Q))return;z._zod.traits.add(Q),Y(z,$);let B=G.prototype,N=Object.keys(B);for(let H=0;H<N.length;H++){let V=N[H];if(!(V in z))z[V]=B[V].bind(z)}}let q=X?.Parent??Object;class K extends q{}Object.defineProperty(K,"name",{value:Q});function G(z){var $;let B=X?.Parent?new K:this;W(B,z),($=B._zod).deferred??($.deferred=[]);for(let N of B._zod.deferred)N();return B}return Object.defineProperty(G,"init",{value:W}),Object.defineProperty(G,Symbol.hasInstance,{value:(z)=>{if(X?.Parent&&z instanceof X.Parent)return!0;return z?._zod?.traits?.has(Q)}}),Object.defineProperty(G,"name",{value:Q}),G}var _6=Symbol("zod_brand");class D0 extends Error{constructor(){super("Encountered Promise during synchronous parse. Use .parseAsync() instead.")}}(r4=globalThis).__zod_globalConfig??(r4.__zod_globalConfig={});var M3=globalThis.__zod_globalConfig;function J0(Q){if(Q)Object.assign(M3,Q);return M3}function n4(Q){let Y=Object.values(Q).filter((W)=>typeof W==="number");return Object.entries(Q).filter(([W,q])=>Y.indexOf(+W)===-1).map(([W,q])=>q)}function o4(Q,Y){if(typeof Y==="bigint")return Y.toString();return Y}function i4(Q){return{get value(){{let X=Q();return Object.defineProperty(this,"value",{value:X}),X}throw Error("cached value already set")}}}function t4(Q){return Q===null||Q===void 0}function T3(Q){let Y=Q.startsWith("^")?1:0,X=Q.endsWith("$")?Q.length-1:Q.length;return Q.slice(Y,X)}var d4=Symbol("evaluating");function $0(Q,Y,X){let W=void 0;Object.defineProperty(Q,Y,{get(){if(W===d4)return;if(W===void 0)W=d4,W=X();return W},set(q){Object.defineProperty(Q,Y,{value:q})},configurable:!0})}function a4(Q,Y,X){Object.defineProperty(Q,Y,{value:X,writable:!0,enumerable:!0,configurable:!0})}function s4(...Q){let Y={};for(let X of Q){let W=Object.getOwnPropertyDescriptors(X);Object.assign(Y,W)}return Object.defineProperties({},Y)}var I3="captureStackTrace"in Error?Error.captureStackTrace:(...Q)=>{};function m2(Q){return typeof Q==="object"&&Q!==null&&!Array.isArray(Q)}function w3(Q){if(m2(Q)===!1)return!1;let Y=Q.constructor;if(Y===void 0)return!0;if(typeof Y!=="function")return!0;let X=Y.prototype;if(m2(X)===!1)return!1;if(Object.prototype.hasOwnProperty.call(X,"isPrototypeOf")===!1)return!1;return!0}var e4=new Set(["string","number","symbol"]);function J2(Q){return Q.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function V2(Q,Y,X){let W=new Q._zod.constr(Y??Q._zod.def);if(!Y||X?.parent)W._zod.parent=Q;return W}function v(Q){let Y=Q;if(!Y)return{};if(typeof Y==="string")return{error:()=>Y};if(Y?.message!==void 0){if(Y?.error!==void 0)throw Error("Cannot specify both `message` and `error` params");Y.error=Y.message}if(delete Y.message,typeof Y.error==="string")return{...Y,error:()=>Y.error};return Y}function Q1(Q){return Object.keys(Q).filter((Y)=>{return Q[Y]._zod.optin==="optional"&&Q[Y]._zod.optout==="optional"})}var Y1={safeint:[Number.MIN_SAFE_INTEGER,Number.MAX_SAFE_INTEGER],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-340282346638528860000000000000000000000,340282346638528860000000000000000000000],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function X1(Q,Y){if(!w3(Y))throw Error("Invalid input to extend: expected a plain object");let X=Q._zod.def.checks;if(X&&X.length>0){let K=Q._zod.def.shape;for(let G in Y)if(Object.getOwnPropertyDescriptor(K,G)!==void 0)throw Error("Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.")}let q=s4(Q._zod.def,{get shape(){let K={...Q._zod.def.shape,...Y};return a4(this,"shape",K),K}});return V2(Q,q)}function W1(Q,Y,X){let q=Y._zod.def.checks;if(q&&q.length>0)throw Error(".partial() cannot be used on object schemas containing refinements");let G=s4(Y._zod.def,{get shape(){let z=Y._zod.def.shape,$={...z};if(X)for(let B in X){if(!(B in z))throw Error(`Unrecognized key: "${B}"`);if(!X[B])continue;$[B]=Q?new Q({type:"optional",innerType:z[B]}):z[B]}else for(let B in z)$[B]=Q?new Q({type:"optional",innerType:z[B]}):z[B];return a4(this,"shape",$),$},checks:[]});return V2(Y,G)}function p0(Q,Y=0){if(Q.aborted===!0)return!0;for(let X=Y;X<Q.issues.length;X++)if(Q.issues[X]?.continue!==!0)return!0;return!1}function q1(Q,Y=0){if(Q.aborted===!0)return!0;for(let X=Y;X<Q.issues.length;X++)if(Q.issues[X]?.continue===!1)return!0;return!1}function F0(Q,Y){return Y.map((X)=>{var W;return(W=X).path??(W.path=[]),X.path.unshift(Q),X})}function u2(Q){return typeof Q==="string"?Q:Q?.message}function V0(Q,Y,X){let W=Q.message?Q.message:u2(Q.inst?._zod.def?.error?.(Q))??u2(Y?.error?.(Q))??u2(X.customError?.(Q))??u2(X.localeError?.(Q))??"Invalid input",{inst:q,continue:K,input:G,...z}=Q;if(z.path??(z.path=[]),z.message=W,Y?.reportInput)z.input=G;return z}function K1(Q){if(Array.isArray(Q))return"array";if(typeof Q==="string")return"string";return"unknown"}var z1=(Q,Y)=>{Q.name="$ZodError",Object.defineProperty(Q,"_zod",{value:Q._zod,enumerable:!1}),Object.defineProperty(Q,"issues",{value:Y,enumerable:!1}),Q.message=JSON.stringify(Y,o4,2),Object.defineProperty(Q,"toString",{value:()=>Q.message,enumerable:!1})},G1=F("$ZodError",z1),U2=F("$ZodError",z1,{Parent:Error});var g8=(Q)=>(Y,X,W,q)=>{let K=W?{...W,async:!1}:{async:!1},G=Y._zod.run({value:X,issues:[]},K);if(G instanceof Promise)throw new D0;if(G.issues.length){let z=new(q?.Err??Q)(G.issues.map(($)=>V0($,K,J0())));throw I3(z,q?.callee),z}return G.value},c2=g8(U2),y8=(Q)=>async(Y,X,W,q)=>{let K=W?{...W,async:!0}:{async:!0},G=Y._zod.run({value:X,issues:[]},K);if(G instanceof Promise)G=await G;if(G.issues.length){let z=new(q?.Err??Q)(G.issues.map(($)=>V0($,K,J0())));throw I3(z,q?.callee),z}return G.value},f2=y8(U2),u8=(Q)=>(Y,X,W)=>{let q=W?{...W,async:!1}:{async:!1},K=Y._zod.run({value:X,issues:[]},q);if(K instanceof Promise)throw new D0;return K.issues.length?{success:!1,error:new(Q??G1)(K.issues.map((G)=>V0(G,q,J0())))}:{success:!0,data:K.value}},L2=u8(U2),m8=(Q)=>async(Y,X,W)=>{let q=W?{...W,async:!0}:{async:!0},K=Y._zod.run({value:X,issues:[]},q);if(K instanceof Promise)K=await K;return K.issues.length?{success:!1,error:new Q(K.issues.map((G)=>V0(G,q,J0())))}:{success:!0,data:K.value}},P2=m8(U2);var $1=/^https?$/;var c8="(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))",f8=new RegExp(`^${c8}$`);var B1=(Q)=>{let Y=Q?`[\\s\\S]{${Q?.minimum??0},${Q?.maximum??""}}`:"[\\s\\S]*";return new RegExp(`^${Y}$`)},H1=/^-?\d+n?$/,N1=/^-?\d+$/,p2=/^-?\d+(?:\.\d+)?$/,J1=/^(?:true|false)$/i;var I0=F("$ZodCheck",(Q,Y)=>{var X;Q._zod??(Q._zod={}),Q._zod.def=Y,(X=Q._zod).onattach??(X.onattach=[])}),p8={number:"number",bigint:"bigint",object:"date"};var C3=F("$ZodCheckGreaterThan",(Q,Y)=>{I0.init(Q,Y);let X=p8[typeof Y.value];Q._zod.onattach.push((W)=>{let q=W._zod.bag,K=(Y.inclusive?q.minimum:q.exclusiveMinimum)??Number.NEGATIVE_INFINITY;if(Y.value>K)if(Y.inclusive)q.minimum=Y.value;else q.exclusiveMinimum=Y.value}),Q._zod.check=(W)=>{if(Y.inclusive?W.value>=Y.value:W.value>Y.value)return;W.issues.push({origin:X,code:"too_small",minimum:typeof Y.value==="object"?Y.value.getTime():Y.value,input:W.value,inclusive:Y.inclusive,inst:Q,continue:!Y.abort})}});var V1=F("$ZodCheckNumberFormat",(Q,Y)=>{I0.init(Q,Y),Y.format=Y.format||"float64";let X=Y.format?.includes("int"),W=X?"int":"number",[q,K]=Y1[Y.format];Q._zod.onattach.push((G)=>{let z=G._zod.bag;if(z.format=Y.format,z.minimum=q,z.maximum=K,X)z.pattern=N1}),Q._zod.check=(G)=>{let z=G.value;if(X){if(!Number.isInteger(z)){G.issues.push({expected:W,format:Y.format,code:"invalid_type",continue:!1,input:z,inst:Q});return}if(!Number.isSafeInteger(z)){if(z>0)G.issues.push({input:z,code:"too_big",maximum:Number.MAX_SAFE_INTEGER,note:"Integers must be within the safe integer range.",inst:Q,origin:W,inclusive:!0,continue:!Y.abort});else G.issues.push({input:z,code:"too_small",minimum:Number.MIN_SAFE_INTEGER,note:"Integers must be within the safe integer range.",inst:Q,origin:W,inclusive:!0,continue:!Y.abort});return}}if(z<q)G.issues.push({origin:"number",input:z,code:"too_small",minimum:q,inclusive:!0,inst:Q,continue:!Y.abort});if(z>K)G.issues.push({origin:"number",input:z,code:"too_big",maximum:K,inclusive:!0,inst:Q,continue:!Y.abort})}});var U1=F("$ZodCheckMinLength",(Q,Y)=>{var X;I0.init(Q,Y),(X=Q._zod.def).when??(X.when=(W)=>{let q=W.value;return!t4(q)&&q.length!==void 0}),Q._zod.onattach.push((W)=>{let q=W._zod.bag.minimum??Number.NEGATIVE_INFINITY;if(Y.minimum>q)W._zod.bag.minimum=Y.minimum}),Q._zod.check=(W)=>{let q=W.value;if(q.length>=Y.minimum)return;let G=K1(q);W.issues.push({origin:G,code:"too_small",minimum:Y.minimum,inclusive:!0,input:q,inst:Q,continue:!Y.abort})}});var x3=F("$ZodCheckStringFormat",(Q,Y)=>{var X,W;if(I0.init(Q,Y),Q._zod.onattach.push((q)=>{let K=q._zod.bag;if(K.format=Y.format,Y.pattern)K.patterns??(K.patterns=new Set),K.patterns.add(Y.pattern)}),Y.pattern)(X=Q._zod).check??(X.check=(q)=>{if(Y.pattern.lastIndex=0,Y.pattern.test(q.value))return;q.issues.push({origin:"string",code:"invalid_format",format:Y.format,input:q.value,...Y.pattern?{pattern:Y.pattern.toString()}:{},inst:Q,continue:!Y.abort})});else(W=Q._zod).check??(W.check=()=>{})}),L1=F("$ZodCheckRegex",(Q,Y)=>{x3.init(Q,Y),Q._zod.check=(X)=>{if(Y.pattern.lastIndex=0,Y.pattern.test(X.value))return;X.issues.push({origin:"string",code:"invalid_format",format:"regex",input:X.value,pattern:Y.pattern.toString(),inst:Q,continue:!Y.abort})}});var O1={major:4,minor:4,patch:3};var l=F("$ZodType",(Q,Y)=>{var X;Q??(Q={}),Q._zod.def=Y,Q._zod.bag=Q._zod.bag||{},Q._zod.version=O1;let W=[...Q._zod.def.checks??[]];if(Q._zod.traits.has("$ZodCheck"))W.unshift(Q);for(let q of W)for(let K of q._zod.onattach)K(Q);if(W.length===0)(X=Q._zod).deferred??(X.deferred=[]),Q._zod.deferred?.push(()=>{Q._zod.run=Q._zod.parse});else{let q=(G,z,$)=>{let B=p0(G),N;for(let H of z){if(H._zod.def.when){if(q1(G))continue;if(!H._zod.def.when(G))continue}else if(B)continue;let V=G.issues.length,J=H._zod.check(G);if(J instanceof Promise&&$?.async===!1)throw new D0;if(N||J instanceof Promise)N=(N??Promise.resolve()).then(async()=>{if(await J,G.issues.length===V)return;if(!B)B=p0(G,V)});else{if(G.issues.length===V)continue;if(!B)B=p0(G,V)}}if(N)return N.then(()=>{return G});return G},K=(G,z,$)=>{if(p0(G))return G.aborted=!0,G;let B=q(z,W,$);if(B instanceof Promise){if($.async===!1)throw new D0;return B.then((N)=>Q._zod.parse(N,$))}return Q._zod.parse(B,$)};Q._zod.run=(G,z)=>{if(z.skipChecks)return Q._zod.parse(G,z);if(z.direction==="backward"){let B=Q._zod.parse({value:G.value,issues:[]},{...z,skipChecks:!0});if(B instanceof Promise)return B.then((N)=>{return K(N,G,z)});return K(B,G,z)}let $=Q._zod.parse(G,z);if($ instanceof Promise){if(z.async===!1)throw new D0;return $.then((B)=>q(B,W,z))}return q($,W,z)}}$0(Q,"~standard",()=>({validate:(q)=>{try{let K=L2(Q,q);return K.success?{value:K.data}:{issues:K.error?.issues}}catch(K){return P2(Q,q).then((G)=>G.success?{value:G.data}:{issues:G.error?.issues})}},vendor:"zod",version:1}))}),k3=F("$ZodString",(Q,Y)=>{l.init(Q,Y),Q._zod.pattern=[...Q?._zod.bag?.patterns??[]].pop()??B1(Q._zod.bag),Q._zod.parse=(X,W)=>{if(Y.coerce)try{X.value=String(X.value)}catch(q){}if(typeof X.value==="string")return X;return X.issues.push({expected:"string",code:"invalid_type",input:X.value,inst:Q}),X}}),j3=F("$ZodStringFormat",(Q,Y)=>{x3.init(Q,Y),k3.init(Q,Y)});var F1=F("$ZodURL",(Q,Y)=>{j3.init(Q,Y),Q._zod.check=(X)=>{try{let W=X.value.trim();if(!Y.normalize&&Y.protocol?.source===$1.source){if(!/^https?:\/\//i.test(W)){X.issues.push({code:"invalid_format",format:"url",note:"Invalid URL format",input:X.value,inst:Q,continue:!Y.abort});return}}let q=new URL(W);if(Y.hostname){if(Y.hostname.lastIndex=0,!Y.hostname.test(q.hostname))X.issues.push({code:"invalid_format",format:"url",note:"Invalid hostname",pattern:Y.hostname.source,input:X.value,inst:Q,continue:!Y.abort})}if(Y.protocol){if(Y.protocol.lastIndex=0,!Y.protocol.test(q.protocol.endsWith(":")?q.protocol.slice(0,-1):q.protocol))X.issues.push({code:"invalid_format",format:"url",note:"Invalid protocol",pattern:Y.protocol.source,input:X.value,inst:Q,continue:!Y.abort})}if(Y.normalize)X.value=q.href;else X.value=W;return}catch(W){X.issues.push({code:"invalid_format",format:"url",input:X.value,inst:Q,continue:!Y.abort})}}});var v3=F("$ZodNumber",(Q,Y)=>{l.init(Q,Y),Q._zod.pattern=Q._zod.bag.pattern??p2,Q._zod.parse=(X,W)=>{if(Y.coerce)try{X.value=Number(X.value)}catch(G){}let q=X.value;if(typeof q==="number"&&!Number.isNaN(q)&&Number.isFinite(q))return X;let K=typeof q==="number"?Number.isNaN(q)?"NaN":!Number.isFinite(q)?"Infinity":void 0:void 0;return X.issues.push({expected:"number",code:"invalid_type",input:q,inst:Q,...K?{received:K}:{}}),X}}),R1=F("$ZodNumberFormat",(Q,Y)=>{V1.init(Q,Y),v3.init(Q,Y)}),E1=F("$ZodBoolean",(Q,Y)=>{l.init(Q,Y),Q._zod.pattern=J1,Q._zod.parse=(X,W)=>{if(Y.coerce)try{X.value=Boolean(X.value)}catch(K){}let q=X.value;if(typeof q==="boolean")return X;return X.issues.push({expected:"boolean",code:"invalid_type",input:q,inst:Q}),X}}),M1=F("$ZodBigInt",(Q,Y)=>{l.init(Q,Y),Q._zod.pattern=H1,Q._zod.parse=(X,W)=>{if(Y.coerce)try{X.value=BigInt(X.value)}catch(q){}if(typeof X.value==="bigint")return X;return X.issues.push({expected:"bigint",code:"invalid_type",input:X.value,inst:Q}),X}});var _1=F("$ZodNever",(Q,Y)=>{l.init(Q,Y),Q._zod.parse=(X,W)=>{return X.issues.push({expected:"never",code:"invalid_type",input:X.value,inst:Q}),X}});var T1=F("$ZodDate",(Q,Y)=>{l.init(Q,Y),Q._zod.parse=(X,W)=>{if(Y.coerce)try{X.value=new Date(X.value)}catch(z){}let q=X.value,K=q instanceof Date;if(K&&!Number.isNaN(q.getTime()))return X;return X.issues.push({expected:"date",code:"invalid_type",input:q,...K?{received:"Invalid Date"}:{},inst:Q}),X}});function Z1(Q,Y,X){if(Q.issues.length)Y.issues.push(...F0(X,Q.issues));Y.value[X]=Q.value}var I1=F("$ZodArray",(Q,Y)=>{l.init(Q,Y),Q._zod.parse=(X,W)=>{let q=X.value;if(!Array.isArray(q))return X.issues.push({expected:"array",code:"invalid_type",input:q,inst:Q}),X;X.value=Array(q.length);let K=[];for(let G=0;G<q.length;G++){let z=q[G],$=Y.element._zod.run({value:z,issues:[]},W);if($ instanceof Promise)K.push($.then((B)=>Z1(B,X,G)));else Z1($,X,G)}if(K.length)return Promise.all(K).then(()=>X);return X}});function l2(Q,Y,X,W,q,K){let G=X in W;if(Q.issues.length){if(q&&K&&!G)return;Y.issues.push(...F0(X,Q.issues))}if(!G&&!q){if(!Q.issues.length)Y.issues.push({code:"invalid_type",expected:"nonoptional",input:void 0,path:[X]});return}if(Q.value===void 0){if(G)Y.value[X]=void 0}else Y.value[X]=Q.value}function r8(Q){let Y=Object.keys(Q.shape);for(let W of Y)if(!Q.shape?.[W]?._zod?.traits?.has("$ZodType"))throw Error(`Invalid element at key "${W}": expected a Zod schema`);let X=Q1(Q.shape);return{...Q,keys:Y,keySet:new Set(Y),numKeys:Y.length,optionalKeys:new Set(X)}}function d8(Q,Y,X,W,q,K){let G=[],z=q.keySet,$=q.catchall._zod,B=$.def.type,N=$.optin==="optional",H=$.optout==="optional";for(let V in Y){if(V==="__proto__")continue;if(z.has(V))continue;if(B==="never"){G.push(V);continue}let J=$.run({value:Y[V],issues:[]},W);if(J instanceof Promise)Q.push(J.then((U)=>l2(U,X,V,Y,N,H)));else l2(J,X,V,Y,N,H)}if(G.length)X.issues.push({code:"unrecognized_keys",keys:G,input:Y,inst:K});if(!Q.length)return X;return Promise.all(Q).then(()=>{return X})}var w1=F("$ZodObject",(Q,Y)=>{if(l.init(Q,Y),!Object.getOwnPropertyDescriptor(Y,"shape")?.get){let z=Y.shape;Object.defineProperty(Y,"shape",{get:()=>{let $={...z};return Object.defineProperty(Y,"shape",{value:$}),$}})}let W=i4(()=>r8(Y));$0(Q._zod,"propValues",()=>{let z=Y.shape,$={};for(let B in z){let N=z[B]._zod;if(N.values){$[B]??($[B]=new Set);for(let H of N.values)$[B].add(H)}}return $});let q=m2,K=Y.catchall,G;Q._zod.parse=(z,$)=>{G??(G=W.value);let B=z.value;if(!q(B))return z.issues.push({expected:"object",code:"invalid_type",input:B,inst:Q}),z;z.value={};let N=[],H=G.shape;for(let V of G.keys){let J=H[V],U=J._zod.optin==="optional",L=J._zod.optout==="optional",P=J._zod.run({value:B[V],issues:[]},$);if(P instanceof Promise)N.push(P.then((D)=>l2(D,z,V,B,U,L)));else l2(P,z,V,B,U,L)}if(!K)return N.length?Promise.all(N).then(()=>z):z;return d8(N,B,z,$,W.value,Q)}});function A1(Q,Y,X,W){for(let K of Q)if(K.issues.length===0)return Y.value=K.value,Y;let q=Q.filter((K)=>!p0(K));if(q.length===1)return Y.value=q[0].value,q[0];return Y.issues.push({code:"invalid_union",input:Y.value,inst:X,errors:Q.map((K)=>K.issues.map((G)=>V0(G,W,J0())))}),Y}var S1=F("$ZodUnion",(Q,Y)=>{l.init(Q,Y),$0(Q._zod,"optin",()=>Y.options.some((W)=>W._zod.optin==="optional")?"optional":void 0),$0(Q._zod,"optout",()=>Y.options.some((W)=>W._zod.optout==="optional")?"optional":void 0),$0(Q._zod,"values",()=>{if(Y.options.every((W)=>W._zod.values))return new Set(Y.options.flatMap((W)=>Array.from(W._zod.values)));return}),$0(Q._zod,"pattern",()=>{if(Y.options.every((W)=>W._zod.pattern)){let W=Y.options.map((q)=>q._zod.pattern);return new RegExp(`^(${W.map((q)=>T3(q.source)).join("|")})$`)}return});let X=Y.options.length===1?Y.options[0]._zod.run:null;Q._zod.parse=(W,q)=>{if(X)return X(W,q);let K=!1,G=[];for(let z of Y.options){let $=z._zod.run({value:W.value,issues:[]},q);if($ instanceof Promise)G.push($),K=!0;else{if($.issues.length===0)return $;G.push($)}}if(!K)return A1(G,W,Q,q);return Promise.all(G).then((z)=>{return A1(z,W,Q,q)})}});var C1=F("$ZodRecord",(Q,Y)=>{l.init(Q,Y),Q._zod.parse=(X,W)=>{let q=X.value;if(!w3(q))return X.issues.push({expected:"record",code:"invalid_type",input:q,inst:Q}),X;let K=[],G=Y.keyType._zod.values;if(G){X.value={};let z=new Set;for(let B of G)if(typeof B==="string"||typeof B==="number"||typeof B==="symbol"){z.add(typeof B==="number"?B.toString():B);let N=Y.keyType._zod.run({value:B,issues:[]},W);if(N instanceof Promise)throw Error("Async schemas not supported in object keys currently");if(N.issues.length){X.issues.push({code:"invalid_key",origin:"record",issues:N.issues.map((J)=>V0(J,W,J0())),input:B,path:[B],inst:Q});continue}let H=N.value,V=Y.valueType._zod.run({value:q[B],issues:[]},W);if(V instanceof Promise)K.push(V.then((J)=>{if(J.issues.length)X.issues.push(...F0(B,J.issues));X.value[H]=J.value}));else{if(V.issues.length)X.issues.push(...F0(B,V.issues));X.value[H]=V.value}}let $;for(let B in q)if(!z.has(B))$=$??[],$.push(B);if($&&$.length>0)X.issues.push({code:"unrecognized_keys",input:q,inst:Q,keys:$})}else{X.value={};for(let z of Reflect.ownKeys(q)){if(z==="__proto__")continue;if(!Object.prototype.propertyIsEnumerable.call(q,z))continue;let $=Y.keyType._zod.run({value:z,issues:[]},W);if($ instanceof Promise)throw Error("Async schemas not supported in object keys currently");if(typeof z==="string"&&p2.test(z)&&$.issues.length){let H=Y.keyType._zod.run({value:Number(z),issues:[]},W);if(H instanceof Promise)throw Error("Async schemas not supported in object keys currently");if(H.issues.length===0)$=H}if($.issues.length){if(Y.mode==="loose")X.value[z]=q[z];else X.issues.push({code:"invalid_key",origin:"record",issues:$.issues.map((H)=>V0(H,W,J0())),input:z,path:[z],inst:Q});continue}let N=Y.valueType._zod.run({value:q[z],issues:[]},W);if(N instanceof Promise)K.push(N.then((H)=>{if(H.issues.length)X.issues.push(...F0(z,H.issues));X.value[$.value]=H.value}));else{if(N.issues.length)X.issues.push(...F0(z,N.issues));X.value[$.value]=N.value}}}if(K.length)return Promise.all(K).then(()=>X);return X}});var x1=F("$ZodEnum",(Q,Y)=>{l.init(Q,Y);let X=n4(Y.entries),W=new Set(X);Q._zod.values=W,Q._zod.pattern=new RegExp(`^(${X.filter((q)=>e4.has(typeof q)).map((q)=>typeof q==="string"?J2(q):q.toString()).join("|")})$`),Q._zod.parse=(q,K)=>{let G=q.value;if(W.has(G))return q;return q.issues.push({code:"invalid_value",values:X,input:G,inst:Q}),q}}),k1=F("$ZodLiteral",(Q,Y)=>{if(l.init(Q,Y),Y.values.length===0)throw Error("Cannot create literal schema with no valid values");let X=new Set(Y.values);Q._zod.values=X,Q._zod.pattern=new RegExp(`^(${Y.values.map((W)=>typeof W==="string"?J2(W):W?J2(W.toString()):String(W)).join("|")})$`),Q._zod.parse=(W,q)=>{let K=W.value;if(X.has(K))return W;return W.issues.push({code:"invalid_value",values:Y.values,input:K,inst:Q}),W}});function D1(Q,Y){if(Y===void 0&&(Q.issues.length||Q.fallback))return{issues:[],value:void 0};return Q}var j1=F("$ZodOptional",(Q,Y)=>{l.init(Q,Y),Q._zod.optin="optional",Q._zod.optout="optional",$0(Q._zod,"values",()=>{return Y.innerType._zod.values?new Set([...Y.innerType._zod.values,void 0]):void 0}),$0(Q._zod,"pattern",()=>{let X=Y.innerType._zod.pattern;return X?new RegExp(`^(${T3(X.source)})?$`):void 0}),Q._zod.parse=(X,W)=>{if(Y.innerType._zod.optin==="optional"){let q=X.value,K=Y.innerType._zod.run(X,W);if(K instanceof Promise)return K.then((G)=>D1(G,q));return D1(K,q)}if(X.value===void 0)return X;return Y.innerType._zod.run(X,W)}});function v1(Q,Y){return new Q({type:"string",...v(Y)})}function h1(Q,Y){return new Q({type:"string",coerce:!0,...v(Y)})}function b1(Q,Y){return new Q({type:"string",format:"url",check:"string_format",abort:!1,...v(Y)})}function g1(Q,Y){return new Q({type:"number",checks:[],...v(Y)})}function y1(Q,Y){return new Q({type:"number",coerce:!0,checks:[],...v(Y)})}function u1(Q,Y){return new Q({type:"number",check:"number_format",abort:!1,format:"safeint",...v(Y)})}function m1(Q,Y){return new Q({type:"boolean",...v(Y)})}function c1(Q,Y){return new Q({type:"boolean",coerce:!0,...v(Y)})}function f1(Q,Y){return new Q({type:"bigint",coerce:!0,...v(Y)})}function p1(Q,Y){return new Q({type:"never",...v(Y)})}function l1(Q,Y){return new Q({type:"date",coerce:!0,...v(Y)})}function r1(Q,Y){return new C3({check:"greater_than",...v(Y),value:Q,inclusive:!1})}function h3(Q,Y){return new C3({check:"greater_than",...v(Y),value:Q,inclusive:!0})}function w0(Q){return r1(0,Q)}function O2(Q){return h3(0,Q)}function r0(Q,Y){return new U1({check:"min_length",...v(Y),minimum:Q})}function b3(Q,Y){return new L1({check:"string_format",format:"regex",...v(Y),pattern:Q})}var s=F("ZodMiniType",(Q,Y)=>{if(!Q._zod)throw Error("Uninitialized schema in ZodMiniType.");l.init(Q,Y),Q.def=Y,Q.type=Y.type,Q.parse=(X,W)=>c2(Q,X,W,{callee:Q.parse}),Q.safeParse=(X,W)=>L2(Q,X,W),Q.parseAsync=async(X,W)=>f2(Q,X,W,{callee:Q.parseAsync}),Q.safeParseAsync=async(X,W)=>P2(Q,X,W),Q.check=(...X)=>{return Q.clone({...Y,checks:[...Y.checks??[],...X.map((W)=>typeof W==="function"?{_zod:{check:W,def:{check:"custom"},onattach:[]}}:W)]},{parent:!0})},Q.with=Q.check,Q.clone=(X,W)=>V2(Q,X,W),Q.brand=()=>Q,Q.register=(X,W)=>{return X.add(Q,W),Q},Q.apply=(X)=>X(Q)}),r2=F("ZodMiniString",(Q,Y)=>{k3.init(Q,Y),s.init(Q,Y)});function U0(Q){return v1(r2,Q)}var i8=F("ZodMiniStringFormat",(Q,Y)=>{j3.init(Q,Y),r2.init(Q,Y)});var t8=F("ZodMiniURL",(Q,Y)=>{F1.init(Q,Y),i8.init(Q,Y)});function o1(Q){return b1(t8,Q)}var d2=F("ZodMiniNumber",(Q,Y)=>{v3.init(Q,Y),s.init(Q,Y)});function i1(Q){return g1(d2,Q)}var a8=F("ZodMiniNumberFormat",(Q,Y)=>{R1.init(Q,Y),d2.init(Q,Y)});function S0(Q){return u1(a8,Q)}var g3=F("ZodMiniBoolean",(Q,Y)=>{E1.init(Q,Y),s.init(Q,Y)});function t1(Q){return m1(g3,Q)}var a1=F("ZodMiniBigInt",(Q,Y)=>{M1.init(Q,Y),s.init(Q,Y)});var s8=F("ZodMiniNever",(Q,Y)=>{_1.init(Q,Y),s.init(Q,Y)});function e8(Q){return p1(s8,Q)}var s1=F("ZodMiniDate",(Q,Y)=>{T1.init(Q,Y),s.init(Q,Y)});var QQ=F("ZodMiniArray",(Q,Y)=>{I1.init(Q,Y),s.init(Q,Y)});function y3(Q,Y){return new QQ({type:"array",element:Q,...v(Y)})}var e1=F("ZodMiniObject",(Q,Y)=>{w1.init(Q,Y),s.init(Q,Y),$0(Q,"shape",()=>Y.shape)});function S(Q,Y){let X={type:"object",shape:Q??{},...v(Y)};return new e1(X)}function d0(Q,Y){return new e1({type:"object",shape:Q,catchall:e8(),...v(Y)})}function Q9(Q,Y){return X1(Q,Y)}function Z2(Q,Y){return W1(X9,Q,Y)}var YQ=F("ZodMiniUnion",(Q,Y)=>{S1.init(Q,Y),s.init(Q,Y)});function C0(Q,Y){return new YQ({type:"union",options:Q,...v(Y)})}var d1=F("ZodMiniRecord",(Q,Y)=>{C1.init(Q,Y),s.init(Q,Y)});function Y9(Q,Y,X){if(!Y||!Y._zod)return new d1({type:"record",keyType:U0(),valueType:Q,...v(Y)});return new d1({type:"record",keyType:Q,valueType:Y,...v(X)})}var XQ=F("ZodMiniEnum",(Q,Y)=>{x1.init(Q,Y),s.init(Q,Y),Q.options=Object.values(Y.entries)});function n0(Q,Y){let X=Array.isArray(Q)?Object.fromEntries(Q.map((W)=>[W,W])):Q;return new XQ({type:"enum",entries:X,...v(Y)})}var WQ=F("ZodMiniLiteral",(Q,Y)=>{k1.init(Q,Y),s.init(Q,Y)});function x0(Q,Y){return new WQ({type:"literal",values:Array.isArray(Q)?Q:[Q],...v(Y)})}var X9=F("ZodMiniOptional",(Q,Y)=>{j1.init(Q,Y),s.init(Q,Y)});function d(Q){return new X9({type:"optional",innerType:Q})}var L0={};P8(L0,{string:()=>zQ,number:()=>GQ,date:()=>HQ,boolean:()=>$Q,bigint:()=>BQ});function zQ(Q){return h1(r2,Q)}function GQ(Q){return y1(d2,Q)}function $Q(Q){return c1(g3,Q)}function BQ(Q){return f1(a1,Q)}function HQ(Q){return l1(s1,Q)}var _=d(t1()),j=d(U0()),b={cwd:j,json:_};function u3(Q){let Y=Q.def;while(Y){if(Y.type==="boolean")return!0;let X=Y.innerType??Y.in;Y=X?X.def:void 0}return!1}function T(Q,Y){let X=Y.shape,W={},q=[],K=!1,G=($,B,N,H)=>{let V=X[B],J=H?"-":"--";if(!V)throw Error(`Unknown option ${J}${$} (use -- to pass literal text starting with -)`);if(u3(V))return W[B]=N===void 0?!0:N!=="false",0;if(N===void 0)throw Error(`Missing value for ${J}${$}`);return W[B]=N,1};for(let $=0;$<Q.length;$+=1){let B=Q[$];if(K){q.push(B);continue}if(B==="--"){K=!0;continue}if(!B.startsWith("-")||B==="-"){q.push(B);continue}if(B.startsWith("--")){let[H,V]=B.slice(2).split("=",2);if(V===void 0&&X[H]&&!u3(X[H]))$+=G(H,H,Q[$+1],!1);else G(H,H,V,!1);continue}let N=B.slice(1);if(X[N]&&!u3(X[N]))$+=G(N,N,Q[$+1],!0);else G(N,N,void 0,!0)}let z=Y.safeParse(W);if(!z.success){let $=z.error.issues[0],B=String($.path[0]??""),N=W[B];throw Error(N===void 0?`Missing required --${B}.`:`Invalid --${B} value ${JSON.stringify(N)}: ${$.message}`)}return{options:z.data,positionals:q}}import W0 from"node:fs";import q0 from"node:path";var NQ="item/commandExecution/requestApproval",JQ="item/fileChange/requestApproval",VQ=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"]),UQ=[/\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)/],LQ=new Set(["status","log","diff","show","blame","rev-parse","ls-files","ls-tree","cat-file","describe","shortlog","grep","branch","stash"]);function PQ(Q){let Y=Q.match(/^\s*(?:ba|z|da)?sh\s+(?:-[a-zA-Z]+\s+)*(?:-c\s+)?(["'])([\s\S]*)\1\s*$/);return Y?Y[2]:Q}function OQ(Q){return Q.trim().split(/\s+/).filter(Boolean)}function ZQ(Q){let Y=Q.find((X,W)=>W>0&&!X.startsWith("-"));if(!Y)return{decision:"accept",reason:"bare git"};if(Y==="branch"&&Q.some((X)=>/^-(d|D|m|M|c|C|f|u)|^--(delete|move|copy|force|set-upstream)/.test(X)))return{decision:"decline",reason:"git branch write operation (git is read-only for Coder)"};if(Y==="stash"){let X=Q.find((W,q)=>q>1&&!W.startsWith("-"));if(X==="list"||X==="show")return{decision:"accept",reason:`git stash ${X} is read-only`};return{decision:"decline",reason:"git stash write operation (git is read-only for Coder)"}}if(LQ.has(Y))return{decision:"accept",reason:`git ${Y} is read-only`};if(VQ.has(Y))return{decision:"decline",reason:`git ${Y} is a write operation (git is read-only for Coder)`};return{decision:"escalate",reason:`unrecognized git subcommand: ${Y}`}}function W9(Q,Y={}){let X=PQ(String(Q??""));if(!X.trim())return{decision:"escalate",reason:"empty command"};for(let z of UQ)if(z.test(X))return{decision:"decline",reason:`matches hard-deny pattern ${z}`};if(/\$\(|`|<\(/.test(X))return{decision:"escalate",reason:"contains command substitution"};let W=X.split(/&&|\|\||;|\||\r?\n/).map((z)=>z.trim()).filter(Boolean);if(W.length>1){let z={decision:"accept",reason:"all segments safe"};for(let $ of W){let B=W9($,Y);if(B.decision==="decline")return B;if(B.decision==="escalate")z=B}return z}let q=OQ(X),K=q0.basename(q[0]??"");if(K==="git")return ZQ(q);let G=Y.networkHost;if(G){if((Y.allowedNetworkHosts??[]).some(($)=>G===$||G.endsWith(`.${$}`)))return{decision:"accept",reason:`network host ${G} is allowlisted`};return{decision:"escalate",reason:`network access to ${G}`}}return{decision:"escalate",reason:`command needs approval: ${K||"(unknown)"}`}}function AQ(Q,Y){if(!Q.length)return{decision:"escalate",reason:"file change with no resolvable paths"};for(let X of Q){let W=q0.resolve(Y,X),q=q0.relative(Y,W);if(q.startsWith("..")||q0.isAbsolute(q))return{decision:"escalate",reason:`path outside workspace: ${X}`};if(q===".git"||q.startsWith(`.git${q0.sep}`))return{decision:"decline",reason:`direct .git modification: ${X}`}}return{decision:"accept",reason:"all paths inside workspace"}}function c3(Q){return q0.join(Q,"approvals")}function o0(Q){let Y=c3(Q);if(!W0.existsSync(Y))return[];return W0.readdirSync(Y).filter((X)=>X.endsWith(".request.json")).map((X)=>{let W=X.replace(/\.request\.json$/,""),q=JSON.parse(W0.readFileSync(q0.join(Y,X),"utf8")),K=q0.join(Y,`${W}.response.json`),G=W0.existsSync(K)?JSON.parse(W0.readFileSync(K,"utf8")):null;return{...q,id:W,response:G}}).sort((X,W)=>String(X.createdAt??"").localeCompare(String(W.createdAt??"")))}function q9(Q,Y,X){let W=c3(Q),q=q0.join(W,`${Y}.request.json`);if(!W0.existsSync(q))throw Error(`No pending approval "${Y}" for this job.`);W0.writeFileSync(q0.join(W,`${Y}.response.json`),`${JSON.stringify({decision:X,answeredAt:new Date().toISOString()},null,2)}
|
|
44
|
-
`,"utf8")}async function
|
|
45
|
-
`,"utf8"),W?.({kind:"approval-escalated",approvalId:K,summary:Y.summary,message:`Approval needed (${K}): ${Y.summary}. Answer with: coder approve <job> ${K} [--deny]`});let G=
|
|
46
|
-
`,"utf8")}function
|
|
47
|
-
${G.stdout}`.trim();if(!G.error&&
|
|
43
|
+
`}function c2(Q){let Y=Q.indexOf("--"),X=Y===-1?Q:Q.slice(0,Y);return X.includes("-h")||X.includes("--help")}import E0 from"node:fs";import I2 from"node:path";import v from"node:process";import{spawn as wY}from"node:child_process";var o4;function F(Q,Y,X){function W(z,$){if(!z._zod)Object.defineProperty(z,"_zod",{value:{def:$,constr:G,traits:new Set},enumerable:!1});if(z._zod.traits.has(Q))return;z._zod.traits.add(Q),Y(z,$);let B=G.prototype,N=Object.keys(B);for(let H=0;H<N.length;H++){let V=N[H];if(!(V in z))z[V]=B[V].bind(z)}}let q=X?.Parent??Object;class K extends q{}Object.defineProperty(K,"name",{value:Q});function G(z){var $;let B=X?.Parent?new K:this;W(B,z),($=B._zod).deferred??($.deferred=[]);for(let N of B._zod.deferred)N();return B}return Object.defineProperty(G,"init",{value:W}),Object.defineProperty(G,Symbol.hasInstance,{value:(z)=>{if(X?.Parent&&z instanceof X.Parent)return!0;return z?._zod?.traits?.has(Q)}}),Object.defineProperty(G,"name",{value:Q}),G}var x6=Symbol("zod_brand");class D0 extends Error{constructor(){super("Encountered Promise during synchronous parse. Use .parseAsync() instead.")}}(o4=globalThis).__zod_globalConfig??(o4.__zod_globalConfig={});var w3=globalThis.__zod_globalConfig;function U0(Q){if(Q)Object.assign(w3,Q);return w3}function t4(Q){let Y=Object.values(Q).filter((W)=>typeof W==="number");return Object.entries(Q).filter(([W,q])=>Y.indexOf(+W)===-1).map(([W,q])=>q)}function a4(Q,Y){if(typeof Y==="bigint")return Y.toString();return Y}function s4(Q){return{get value(){{let X=Q();return Object.defineProperty(this,"value",{value:X}),X}throw Error("cached value already set")}}}function e4(Q){return Q===null||Q===void 0}function C3(Q){let Y=Q.startsWith("^")?1:0,X=Q.endsWith("$")?Q.length-1:Q.length;return Q.slice(Y,X)}var i4=Symbol("evaluating");function $0(Q,Y,X){let W=void 0;Object.defineProperty(Q,Y,{get(){if(W===i4)return;if(W===void 0)W=i4,W=X();return W},set(q){Object.defineProperty(Q,Y,{value:q})},configurable:!0})}function Q1(Q,Y,X){Object.defineProperty(Q,Y,{value:X,writable:!0,enumerable:!0,configurable:!0})}function Y1(...Q){let Y={};for(let X of Q){let W=Object.getOwnPropertyDescriptors(X);Object.assign(Y,W)}return Object.defineProperties({},Y)}var x3="captureStackTrace"in Error?Error.captureStackTrace:(...Q)=>{};function p2(Q){return typeof Q==="object"&&Q!==null&&!Array.isArray(Q)}function k3(Q){if(p2(Q)===!1)return!1;let Y=Q.constructor;if(Y===void 0)return!0;if(typeof Y!=="function")return!0;let X=Y.prototype;if(p2(X)===!1)return!1;if(Object.prototype.hasOwnProperty.call(X,"isPrototypeOf")===!1)return!1;return!0}var X1=new Set(["string","number","symbol"]);function V2(Q){return Q.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function U2(Q,Y,X){let W=new Q._zod.constr(Y??Q._zod.def);if(!Y||X?.parent)W._zod.parent=Q;return W}function h(Q){let Y=Q;if(!Y)return{};if(typeof Y==="string")return{error:()=>Y};if(Y?.message!==void 0){if(Y?.error!==void 0)throw Error("Cannot specify both `message` and `error` params");Y.error=Y.message}if(delete Y.message,typeof Y.error==="string")return{...Y,error:()=>Y.error};return Y}function W1(Q){return Object.keys(Q).filter((Y)=>{return Q[Y]._zod.optin==="optional"&&Q[Y]._zod.optout==="optional"})}var q1={safeint:[Number.MIN_SAFE_INTEGER,Number.MAX_SAFE_INTEGER],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-340282346638528860000000000000000000000,340282346638528860000000000000000000000],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function K1(Q,Y){if(!k3(Y))throw Error("Invalid input to extend: expected a plain object");let X=Q._zod.def.checks;if(X&&X.length>0){let K=Q._zod.def.shape;for(let G in Y)if(Object.getOwnPropertyDescriptor(K,G)!==void 0)throw Error("Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.")}let q=Y1(Q._zod.def,{get shape(){let K={...Q._zod.def.shape,...Y};return Q1(this,"shape",K),K}});return U2(Q,q)}function z1(Q,Y,X){let q=Y._zod.def.checks;if(q&&q.length>0)throw Error(".partial() cannot be used on object schemas containing refinements");let G=Y1(Y._zod.def,{get shape(){let z=Y._zod.def.shape,$={...z};if(X)for(let B in X){if(!(B in z))throw Error(`Unrecognized key: "${B}"`);if(!X[B])continue;$[B]=Q?new Q({type:"optional",innerType:z[B]}):z[B]}else for(let B in z)$[B]=Q?new Q({type:"optional",innerType:z[B]}):z[B];return Q1(this,"shape",$),$},checks:[]});return U2(Y,G)}function p0(Q,Y=0){if(Q.aborted===!0)return!0;for(let X=Y;X<Q.issues.length;X++)if(Q.issues[X]?.continue!==!0)return!0;return!1}function G1(Q,Y=0){if(Q.aborted===!0)return!0;for(let X=Y;X<Q.issues.length;X++)if(Q.issues[X]?.continue===!1)return!0;return!1}function F0(Q,Y){return Y.map((X)=>{var W;return(W=X).path??(W.path=[]),X.path.unshift(Q),X})}function f2(Q){return typeof Q==="string"?Q:Q?.message}function L0(Q,Y,X){let W=Q.message?Q.message:f2(Q.inst?._zod.def?.error?.(Q))??f2(Y?.error?.(Q))??f2(X.customError?.(Q))??f2(X.localeError?.(Q))??"Invalid input",{inst:q,continue:K,input:G,...z}=Q;if(z.path??(z.path=[]),z.message=W,Y?.reportInput)z.input=G;return z}function $1(Q){if(Array.isArray(Q))return"array";if(typeof Q==="string")return"string";return"unknown"}var B1=(Q,Y)=>{Q.name="$ZodError",Object.defineProperty(Q,"_zod",{value:Q._zod,enumerable:!1}),Object.defineProperty(Q,"issues",{value:Y,enumerable:!1}),Q.message=JSON.stringify(Y,a4,2),Object.defineProperty(Q,"toString",{value:()=>Q.message,enumerable:!1})},H1=F("$ZodError",B1),L2=F("$ZodError",B1,{Parent:Error});var p8=(Q)=>(Y,X,W,q)=>{let K=W?{...W,async:!1}:{async:!1},G=Y._zod.run({value:X,issues:[]},K);if(G instanceof Promise)throw new D0;if(G.issues.length){let z=new(q?.Err??Q)(G.issues.map(($)=>L0($,K,U0())));throw x3(z,q?.callee),z}return G.value},l2=p8(L2),l8=(Q)=>async(Y,X,W,q)=>{let K=W?{...W,async:!0}:{async:!0},G=Y._zod.run({value:X,issues:[]},K);if(G instanceof Promise)G=await G;if(G.issues.length){let z=new(q?.Err??Q)(G.issues.map(($)=>L0($,K,U0())));throw x3(z,q?.callee),z}return G.value},r2=l8(L2),r8=(Q)=>(Y,X,W)=>{let q=W?{...W,async:!1}:{async:!1},K=Y._zod.run({value:X,issues:[]},q);if(K instanceof Promise)throw new D0;return K.issues.length?{success:!1,error:new(Q??H1)(K.issues.map((G)=>L0(G,q,U0())))}:{success:!0,data:K.value}},P2=r8(L2),d8=(Q)=>async(Y,X,W)=>{let q=W?{...W,async:!0}:{async:!0},K=Y._zod.run({value:X,issues:[]},q);if(K instanceof Promise)K=await K;return K.issues.length?{success:!1,error:new Q(K.issues.map((G)=>L0(G,q,U0())))}:{success:!0,data:K.value}},O2=d8(L2);var N1=/^https?$/;var n8="(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))",o8=new RegExp(`^${n8}$`);var J1=(Q)=>{let Y=Q?`[\\s\\S]{${Q?.minimum??0},${Q?.maximum??""}}`:"[\\s\\S]*";return new RegExp(`^${Y}$`)},V1=/^-?\d+n?$/,U1=/^-?\d+$/,d2=/^-?\d+(?:\.\d+)?$/,L1=/^(?:true|false)$/i;var T0=F("$ZodCheck",(Q,Y)=>{var X;Q._zod??(Q._zod={}),Q._zod.def=Y,(X=Q._zod).onattach??(X.onattach=[])}),i8={number:"number",bigint:"bigint",object:"date"};var v3=F("$ZodCheckGreaterThan",(Q,Y)=>{T0.init(Q,Y);let X=i8[typeof Y.value];Q._zod.onattach.push((W)=>{let q=W._zod.bag,K=(Y.inclusive?q.minimum:q.exclusiveMinimum)??Number.NEGATIVE_INFINITY;if(Y.value>K)if(Y.inclusive)q.minimum=Y.value;else q.exclusiveMinimum=Y.value}),Q._zod.check=(W)=>{if(Y.inclusive?W.value>=Y.value:W.value>Y.value)return;W.issues.push({origin:X,code:"too_small",minimum:typeof Y.value==="object"?Y.value.getTime():Y.value,input:W.value,inclusive:Y.inclusive,inst:Q,continue:!Y.abort})}});var P1=F("$ZodCheckNumberFormat",(Q,Y)=>{T0.init(Q,Y),Y.format=Y.format||"float64";let X=Y.format?.includes("int"),W=X?"int":"number",[q,K]=q1[Y.format];Q._zod.onattach.push((G)=>{let z=G._zod.bag;if(z.format=Y.format,z.minimum=q,z.maximum=K,X)z.pattern=U1}),Q._zod.check=(G)=>{let z=G.value;if(X){if(!Number.isInteger(z)){G.issues.push({expected:W,format:Y.format,code:"invalid_type",continue:!1,input:z,inst:Q});return}if(!Number.isSafeInteger(z)){if(z>0)G.issues.push({input:z,code:"too_big",maximum:Number.MAX_SAFE_INTEGER,note:"Integers must be within the safe integer range.",inst:Q,origin:W,inclusive:!0,continue:!Y.abort});else G.issues.push({input:z,code:"too_small",minimum:Number.MIN_SAFE_INTEGER,note:"Integers must be within the safe integer range.",inst:Q,origin:W,inclusive:!0,continue:!Y.abort});return}}if(z<q)G.issues.push({origin:"number",input:z,code:"too_small",minimum:q,inclusive:!0,inst:Q,continue:!Y.abort});if(z>K)G.issues.push({origin:"number",input:z,code:"too_big",maximum:K,inclusive:!0,inst:Q,continue:!Y.abort})}});var O1=F("$ZodCheckMinLength",(Q,Y)=>{var X;T0.init(Q,Y),(X=Q._zod.def).when??(X.when=(W)=>{let q=W.value;return!e4(q)&&q.length!==void 0}),Q._zod.onattach.push((W)=>{let q=W._zod.bag.minimum??Number.NEGATIVE_INFINITY;if(Y.minimum>q)W._zod.bag.minimum=Y.minimum}),Q._zod.check=(W)=>{let q=W.value;if(q.length>=Y.minimum)return;let G=$1(q);W.issues.push({origin:G,code:"too_small",minimum:Y.minimum,inclusive:!0,input:q,inst:Q,continue:!Y.abort})}});var h3=F("$ZodCheckStringFormat",(Q,Y)=>{var X,W;if(T0.init(Q,Y),Q._zod.onattach.push((q)=>{let K=q._zod.bag;if(K.format=Y.format,Y.pattern)K.patterns??(K.patterns=new Set),K.patterns.add(Y.pattern)}),Y.pattern)(X=Q._zod).check??(X.check=(q)=>{if(Y.pattern.lastIndex=0,Y.pattern.test(q.value))return;q.issues.push({origin:"string",code:"invalid_format",format:Y.format,input:q.value,...Y.pattern?{pattern:Y.pattern.toString()}:{},inst:Q,continue:!Y.abort})});else(W=Q._zod).check??(W.check=()=>{})}),Z1=F("$ZodCheckRegex",(Q,Y)=>{h3.init(Q,Y),Q._zod.check=(X)=>{if(Y.pattern.lastIndex=0,Y.pattern.test(X.value))return;X.issues.push({origin:"string",code:"invalid_format",format:"regex",input:X.value,pattern:Y.pattern.toString(),inst:Q,continue:!Y.abort})}});var D1={major:4,minor:4,patch:3};var l=F("$ZodType",(Q,Y)=>{var X;Q??(Q={}),Q._zod.def=Y,Q._zod.bag=Q._zod.bag||{},Q._zod.version=D1;let W=[...Q._zod.def.checks??[]];if(Q._zod.traits.has("$ZodCheck"))W.unshift(Q);for(let q of W)for(let K of q._zod.onattach)K(Q);if(W.length===0)(X=Q._zod).deferred??(X.deferred=[]),Q._zod.deferred?.push(()=>{Q._zod.run=Q._zod.parse});else{let q=(G,z,$)=>{let B=p0(G),N;for(let H of z){if(H._zod.def.when){if(G1(G))continue;if(!H._zod.def.when(G))continue}else if(B)continue;let V=G.issues.length,J=H._zod.check(G);if(J instanceof Promise&&$?.async===!1)throw new D0;if(N||J instanceof Promise)N=(N??Promise.resolve()).then(async()=>{if(await J,G.issues.length===V)return;if(!B)B=p0(G,V)});else{if(G.issues.length===V)continue;if(!B)B=p0(G,V)}}if(N)return N.then(()=>{return G});return G},K=(G,z,$)=>{if(p0(G))return G.aborted=!0,G;let B=q(z,W,$);if(B instanceof Promise){if($.async===!1)throw new D0;return B.then((N)=>Q._zod.parse(N,$))}return Q._zod.parse(B,$)};Q._zod.run=(G,z)=>{if(z.skipChecks)return Q._zod.parse(G,z);if(z.direction==="backward"){let B=Q._zod.parse({value:G.value,issues:[]},{...z,skipChecks:!0});if(B instanceof Promise)return B.then((N)=>{return K(N,G,z)});return K(B,G,z)}let $=Q._zod.parse(G,z);if($ instanceof Promise){if(z.async===!1)throw new D0;return $.then((B)=>q(B,W,z))}return q($,W,z)}}$0(Q,"~standard",()=>({validate:(q)=>{try{let K=P2(Q,q);return K.success?{value:K.data}:{issues:K.error?.issues}}catch(K){return O2(Q,q).then((G)=>G.success?{value:G.data}:{issues:G.error?.issues})}},vendor:"zod",version:1}))}),b3=F("$ZodString",(Q,Y)=>{l.init(Q,Y),Q._zod.pattern=[...Q?._zod.bag?.patterns??[]].pop()??J1(Q._zod.bag),Q._zod.parse=(X,W)=>{if(Y.coerce)try{X.value=String(X.value)}catch(q){}if(typeof X.value==="string")return X;return X.issues.push({expected:"string",code:"invalid_type",input:X.value,inst:Q}),X}}),g3=F("$ZodStringFormat",(Q,Y)=>{h3.init(Q,Y),b3.init(Q,Y)});var M1=F("$ZodURL",(Q,Y)=>{g3.init(Q,Y),Q._zod.check=(X)=>{try{let W=X.value.trim();if(!Y.normalize&&Y.protocol?.source===N1.source){if(!/^https?:\/\//i.test(W)){X.issues.push({code:"invalid_format",format:"url",note:"Invalid URL format",input:X.value,inst:Q,continue:!Y.abort});return}}let q=new URL(W);if(Y.hostname){if(Y.hostname.lastIndex=0,!Y.hostname.test(q.hostname))X.issues.push({code:"invalid_format",format:"url",note:"Invalid hostname",pattern:Y.hostname.source,input:X.value,inst:Q,continue:!Y.abort})}if(Y.protocol){if(Y.protocol.lastIndex=0,!Y.protocol.test(q.protocol.endsWith(":")?q.protocol.slice(0,-1):q.protocol))X.issues.push({code:"invalid_format",format:"url",note:"Invalid protocol",pattern:Y.protocol.source,input:X.value,inst:Q,continue:!Y.abort})}if(Y.normalize)X.value=q.href;else X.value=W;return}catch(W){X.issues.push({code:"invalid_format",format:"url",input:X.value,inst:Q,continue:!Y.abort})}}});var y3=F("$ZodNumber",(Q,Y)=>{l.init(Q,Y),Q._zod.pattern=Q._zod.bag.pattern??d2,Q._zod.parse=(X,W)=>{if(Y.coerce)try{X.value=Number(X.value)}catch(G){}let q=X.value;if(typeof q==="number"&&!Number.isNaN(q)&&Number.isFinite(q))return X;let K=typeof q==="number"?Number.isNaN(q)?"NaN":!Number.isFinite(q)?"Infinity":void 0:void 0;return X.issues.push({expected:"number",code:"invalid_type",input:q,inst:Q,...K?{received:K}:{}}),X}}),_1=F("$ZodNumberFormat",(Q,Y)=>{P1.init(Q,Y),y3.init(Q,Y)}),T1=F("$ZodBoolean",(Q,Y)=>{l.init(Q,Y),Q._zod.pattern=L1,Q._zod.parse=(X,W)=>{if(Y.coerce)try{X.value=Boolean(X.value)}catch(K){}let q=X.value;if(typeof q==="boolean")return X;return X.issues.push({expected:"boolean",code:"invalid_type",input:q,inst:Q}),X}}),I1=F("$ZodBigInt",(Q,Y)=>{l.init(Q,Y),Q._zod.pattern=V1,Q._zod.parse=(X,W)=>{if(Y.coerce)try{X.value=BigInt(X.value)}catch(q){}if(typeof X.value==="bigint")return X;return X.issues.push({expected:"bigint",code:"invalid_type",input:X.value,inst:Q}),X}});var w1=F("$ZodNever",(Q,Y)=>{l.init(Q,Y),Q._zod.parse=(X,W)=>{return X.issues.push({expected:"never",code:"invalid_type",input:X.value,inst:Q}),X}});var S1=F("$ZodDate",(Q,Y)=>{l.init(Q,Y),Q._zod.parse=(X,W)=>{if(Y.coerce)try{X.value=new Date(X.value)}catch(z){}let q=X.value,K=q instanceof Date;if(K&&!Number.isNaN(q.getTime()))return X;return X.issues.push({expected:"date",code:"invalid_type",input:q,...K?{received:"Invalid Date"}:{},inst:Q}),X}});function F1(Q,Y,X){if(Q.issues.length)Y.issues.push(...F0(X,Q.issues));Y.value[X]=Q.value}var C1=F("$ZodArray",(Q,Y)=>{l.init(Q,Y),Q._zod.parse=(X,W)=>{let q=X.value;if(!Array.isArray(q))return X.issues.push({expected:"array",code:"invalid_type",input:q,inst:Q}),X;X.value=Array(q.length);let K=[];for(let G=0;G<q.length;G++){let z=q[G],$=Y.element._zod.run({value:z,issues:[]},W);if($ instanceof Promise)K.push($.then((B)=>F1(B,X,G)));else F1($,X,G)}if(K.length)return Promise.all(K).then(()=>X);return X}});function n2(Q,Y,X,W,q,K){let G=X in W;if(Q.issues.length){if(q&&K&&!G)return;Y.issues.push(...F0(X,Q.issues))}if(!G&&!q){if(!Q.issues.length)Y.issues.push({code:"invalid_type",expected:"nonoptional",input:void 0,path:[X]});return}if(Q.value===void 0){if(G)Y.value[X]=void 0}else Y.value[X]=Q.value}function a8(Q){let Y=Object.keys(Q.shape);for(let W of Y)if(!Q.shape?.[W]?._zod?.traits?.has("$ZodType"))throw Error(`Invalid element at key "${W}": expected a Zod schema`);let X=W1(Q.shape);return{...Q,keys:Y,keySet:new Set(Y),numKeys:Y.length,optionalKeys:new Set(X)}}function s8(Q,Y,X,W,q,K){let G=[],z=q.keySet,$=q.catchall._zod,B=$.def.type,N=$.optin==="optional",H=$.optout==="optional";for(let V in Y){if(V==="__proto__")continue;if(z.has(V))continue;if(B==="never"){G.push(V);continue}let J=$.run({value:Y[V],issues:[]},W);if(J instanceof Promise)Q.push(J.then((U)=>n2(U,X,V,Y,N,H)));else n2(J,X,V,Y,N,H)}if(G.length)X.issues.push({code:"unrecognized_keys",keys:G,input:Y,inst:K});if(!Q.length)return X;return Promise.all(Q).then(()=>{return X})}var x1=F("$ZodObject",(Q,Y)=>{if(l.init(Q,Y),!Object.getOwnPropertyDescriptor(Y,"shape")?.get){let z=Y.shape;Object.defineProperty(Y,"shape",{get:()=>{let $={...z};return Object.defineProperty(Y,"shape",{value:$}),$}})}let W=s4(()=>a8(Y));$0(Q._zod,"propValues",()=>{let z=Y.shape,$={};for(let B in z){let N=z[B]._zod;if(N.values){$[B]??($[B]=new Set);for(let H of N.values)$[B].add(H)}}return $});let q=p2,K=Y.catchall,G;Q._zod.parse=(z,$)=>{G??(G=W.value);let B=z.value;if(!q(B))return z.issues.push({expected:"object",code:"invalid_type",input:B,inst:Q}),z;z.value={};let N=[],H=G.shape;for(let V of G.keys){let J=H[V],U=J._zod.optin==="optional",L=J._zod.optout==="optional",P=J._zod.run({value:B[V],issues:[]},$);if(P instanceof Promise)N.push(P.then((Z)=>n2(Z,z,V,B,U,L)));else n2(P,z,V,B,U,L)}if(!K)return N.length?Promise.all(N).then(()=>z):z;return s8(N,B,z,$,W.value,Q)}});function R1(Q,Y,X,W){for(let K of Q)if(K.issues.length===0)return Y.value=K.value,Y;let q=Q.filter((K)=>!p0(K));if(q.length===1)return Y.value=q[0].value,q[0];return Y.issues.push({code:"invalid_union",input:Y.value,inst:X,errors:Q.map((K)=>K.issues.map((G)=>L0(G,W,U0())))}),Y}var k1=F("$ZodUnion",(Q,Y)=>{l.init(Q,Y),$0(Q._zod,"optin",()=>Y.options.some((W)=>W._zod.optin==="optional")?"optional":void 0),$0(Q._zod,"optout",()=>Y.options.some((W)=>W._zod.optout==="optional")?"optional":void 0),$0(Q._zod,"values",()=>{if(Y.options.every((W)=>W._zod.values))return new Set(Y.options.flatMap((W)=>Array.from(W._zod.values)));return}),$0(Q._zod,"pattern",()=>{if(Y.options.every((W)=>W._zod.pattern)){let W=Y.options.map((q)=>q._zod.pattern);return new RegExp(`^(${W.map((q)=>C3(q.source)).join("|")})$`)}return});let X=Y.options.length===1?Y.options[0]._zod.run:null;Q._zod.parse=(W,q)=>{if(X)return X(W,q);let K=!1,G=[];for(let z of Y.options){let $=z._zod.run({value:W.value,issues:[]},q);if($ instanceof Promise)G.push($),K=!0;else{if($.issues.length===0)return $;G.push($)}}if(!K)return R1(G,W,Q,q);return Promise.all(G).then((z)=>{return R1(z,W,Q,q)})}});var j1=F("$ZodRecord",(Q,Y)=>{l.init(Q,Y),Q._zod.parse=(X,W)=>{let q=X.value;if(!k3(q))return X.issues.push({expected:"record",code:"invalid_type",input:q,inst:Q}),X;let K=[],G=Y.keyType._zod.values;if(G){X.value={};let z=new Set;for(let B of G)if(typeof B==="string"||typeof B==="number"||typeof B==="symbol"){z.add(typeof B==="number"?B.toString():B);let N=Y.keyType._zod.run({value:B,issues:[]},W);if(N instanceof Promise)throw Error("Async schemas not supported in object keys currently");if(N.issues.length){X.issues.push({code:"invalid_key",origin:"record",issues:N.issues.map((J)=>L0(J,W,U0())),input:B,path:[B],inst:Q});continue}let H=N.value,V=Y.valueType._zod.run({value:q[B],issues:[]},W);if(V instanceof Promise)K.push(V.then((J)=>{if(J.issues.length)X.issues.push(...F0(B,J.issues));X.value[H]=J.value}));else{if(V.issues.length)X.issues.push(...F0(B,V.issues));X.value[H]=V.value}}let $;for(let B in q)if(!z.has(B))$=$??[],$.push(B);if($&&$.length>0)X.issues.push({code:"unrecognized_keys",input:q,inst:Q,keys:$})}else{X.value={};for(let z of Reflect.ownKeys(q)){if(z==="__proto__")continue;if(!Object.prototype.propertyIsEnumerable.call(q,z))continue;let $=Y.keyType._zod.run({value:z,issues:[]},W);if($ instanceof Promise)throw Error("Async schemas not supported in object keys currently");if(typeof z==="string"&&d2.test(z)&&$.issues.length){let H=Y.keyType._zod.run({value:Number(z),issues:[]},W);if(H instanceof Promise)throw Error("Async schemas not supported in object keys currently");if(H.issues.length===0)$=H}if($.issues.length){if(Y.mode==="loose")X.value[z]=q[z];else X.issues.push({code:"invalid_key",origin:"record",issues:$.issues.map((H)=>L0(H,W,U0())),input:z,path:[z],inst:Q});continue}let N=Y.valueType._zod.run({value:q[z],issues:[]},W);if(N instanceof Promise)K.push(N.then((H)=>{if(H.issues.length)X.issues.push(...F0(z,H.issues));X.value[$.value]=H.value}));else{if(N.issues.length)X.issues.push(...F0(z,N.issues));X.value[$.value]=N.value}}}if(K.length)return Promise.all(K).then(()=>X);return X}});var v1=F("$ZodEnum",(Q,Y)=>{l.init(Q,Y);let X=t4(Y.entries),W=new Set(X);Q._zod.values=W,Q._zod.pattern=new RegExp(`^(${X.filter((q)=>X1.has(typeof q)).map((q)=>typeof q==="string"?V2(q):q.toString()).join("|")})$`),Q._zod.parse=(q,K)=>{let G=q.value;if(W.has(G))return q;return q.issues.push({code:"invalid_value",values:X,input:G,inst:Q}),q}}),h1=F("$ZodLiteral",(Q,Y)=>{if(l.init(Q,Y),Y.values.length===0)throw Error("Cannot create literal schema with no valid values");let X=new Set(Y.values);Q._zod.values=X,Q._zod.pattern=new RegExp(`^(${Y.values.map((W)=>typeof W==="string"?V2(W):W?V2(W.toString()):String(W)).join("|")})$`),Q._zod.parse=(W,q)=>{let K=W.value;if(X.has(K))return W;return W.issues.push({code:"invalid_value",values:Y.values,input:K,inst:Q}),W}});function E1(Q,Y){if(Y===void 0&&(Q.issues.length||Q.fallback))return{issues:[],value:void 0};return Q}var b1=F("$ZodOptional",(Q,Y)=>{l.init(Q,Y),Q._zod.optin="optional",Q._zod.optout="optional",$0(Q._zod,"values",()=>{return Y.innerType._zod.values?new Set([...Y.innerType._zod.values,void 0]):void 0}),$0(Q._zod,"pattern",()=>{let X=Y.innerType._zod.pattern;return X?new RegExp(`^(${C3(X.source)})?$`):void 0}),Q._zod.parse=(X,W)=>{if(Y.innerType._zod.optin==="optional"){let q=X.value,K=Y.innerType._zod.run(X,W);if(K instanceof Promise)return K.then((G)=>E1(G,q));return E1(K,q)}if(X.value===void 0)return X;return Y.innerType._zod.run(X,W)}});function g1(Q,Y){return new Q({type:"string",...h(Y)})}function y1(Q,Y){return new Q({type:"string",coerce:!0,...h(Y)})}function m1(Q,Y){return new Q({type:"string",format:"url",check:"string_format",abort:!1,...h(Y)})}function u1(Q,Y){return new Q({type:"number",checks:[],...h(Y)})}function c1(Q,Y){return new Q({type:"number",coerce:!0,checks:[],...h(Y)})}function f1(Q,Y){return new Q({type:"number",check:"number_format",abort:!1,format:"safeint",...h(Y)})}function p1(Q,Y){return new Q({type:"boolean",...h(Y)})}function l1(Q,Y){return new Q({type:"boolean",coerce:!0,...h(Y)})}function r1(Q,Y){return new Q({type:"bigint",coerce:!0,...h(Y)})}function d1(Q,Y){return new Q({type:"never",...h(Y)})}function n1(Q,Y){return new Q({type:"date",coerce:!0,...h(Y)})}function o1(Q,Y){return new v3({check:"greater_than",...h(Y),value:Q,inclusive:!1})}function m3(Q,Y){return new v3({check:"greater_than",...h(Y),value:Q,inclusive:!0})}function I0(Q){return o1(0,Q)}function Z2(Q){return m3(0,Q)}function r0(Q,Y){return new O1({check:"min_length",...h(Y),minimum:Q})}function u3(Q,Y){return new Z1({check:"string_format",format:"regex",...h(Y),pattern:Q})}var s=F("ZodMiniType",(Q,Y)=>{if(!Q._zod)throw Error("Uninitialized schema in ZodMiniType.");l.init(Q,Y),Q.def=Y,Q.type=Y.type,Q.parse=(X,W)=>l2(Q,X,W,{callee:Q.parse}),Q.safeParse=(X,W)=>P2(Q,X,W),Q.parseAsync=async(X,W)=>r2(Q,X,W,{callee:Q.parseAsync}),Q.safeParseAsync=async(X,W)=>O2(Q,X,W),Q.check=(...X)=>{return Q.clone({...Y,checks:[...Y.checks??[],...X.map((W)=>typeof W==="function"?{_zod:{check:W,def:{check:"custom"},onattach:[]}}:W)]},{parent:!0})},Q.with=Q.check,Q.clone=(X,W)=>U2(Q,X,W),Q.brand=()=>Q,Q.register=(X,W)=>{return X.add(Q,W),Q},Q.apply=(X)=>X(Q)}),o2=F("ZodMiniString",(Q,Y)=>{b3.init(Q,Y),s.init(Q,Y)});function P0(Q){return g1(o2,Q)}var YQ=F("ZodMiniStringFormat",(Q,Y)=>{g3.init(Q,Y),o2.init(Q,Y)});var XQ=F("ZodMiniURL",(Q,Y)=>{M1.init(Q,Y),YQ.init(Q,Y)});function a1(Q){return m1(XQ,Q)}var i2=F("ZodMiniNumber",(Q,Y)=>{y3.init(Q,Y),s.init(Q,Y)});function s1(Q){return u1(i2,Q)}var WQ=F("ZodMiniNumberFormat",(Q,Y)=>{_1.init(Q,Y),i2.init(Q,Y)});function w0(Q){return f1(WQ,Q)}var c3=F("ZodMiniBoolean",(Q,Y)=>{T1.init(Q,Y),s.init(Q,Y)});function e1(Q){return p1(c3,Q)}var Q9=F("ZodMiniBigInt",(Q,Y)=>{I1.init(Q,Y),s.init(Q,Y)});var qQ=F("ZodMiniNever",(Q,Y)=>{w1.init(Q,Y),s.init(Q,Y)});function KQ(Q){return d1(qQ,Q)}var Y9=F("ZodMiniDate",(Q,Y)=>{S1.init(Q,Y),s.init(Q,Y)});var zQ=F("ZodMiniArray",(Q,Y)=>{C1.init(Q,Y),s.init(Q,Y)});function f3(Q,Y){return new zQ({type:"array",element:Q,...h(Y)})}var X9=F("ZodMiniObject",(Q,Y)=>{x1.init(Q,Y),s.init(Q,Y),$0(Q,"shape",()=>Y.shape)});function S(Q,Y){let X={type:"object",shape:Q??{},...h(Y)};return new X9(X)}function d0(Q,Y){return new X9({type:"object",shape:Q,catchall:KQ(),...h(Y)})}function W9(Q,Y){return K1(Q,Y)}function A2(Q,Y){return z1(K9,Q,Y)}var GQ=F("ZodMiniUnion",(Q,Y)=>{k1.init(Q,Y),s.init(Q,Y)});function S0(Q,Y){return new GQ({type:"union",options:Q,...h(Y)})}var i1=F("ZodMiniRecord",(Q,Y)=>{j1.init(Q,Y),s.init(Q,Y)});function q9(Q,Y,X){if(!Y||!Y._zod)return new i1({type:"record",keyType:P0(),valueType:Q,...h(Y)});return new i1({type:"record",keyType:Q,valueType:Y,...h(X)})}var $Q=F("ZodMiniEnum",(Q,Y)=>{v1.init(Q,Y),s.init(Q,Y),Q.options=Object.values(Y.entries)});function n0(Q,Y){let X=Array.isArray(Q)?Object.fromEntries(Q.map((W)=>[W,W])):Q;return new $Q({type:"enum",entries:X,...h(Y)})}var BQ=F("ZodMiniLiteral",(Q,Y)=>{h1.init(Q,Y),s.init(Q,Y)});function C0(Q,Y){return new BQ({type:"literal",values:Array.isArray(Q)?Q:[Q],...h(Y)})}var K9=F("ZodMiniOptional",(Q,Y)=>{b1.init(Q,Y),s.init(Q,Y)});function d(Q){return new K9({type:"optional",innerType:Q})}var O0={};R8(O0,{string:()=>JQ,number:()=>VQ,date:()=>PQ,boolean:()=>UQ,bigint:()=>LQ});function JQ(Q){return y1(o2,Q)}function VQ(Q){return c1(i2,Q)}function UQ(Q){return l1(c3,Q)}function LQ(Q){return r1(Q9,Q)}function PQ(Q){return n1(Y9,Q)}var _=d(e1()),j=d(P0()),b={cwd:j,json:_};function p3(Q){let Y=Q.def;while(Y){if(Y.type==="boolean")return!0;let X=Y.innerType??Y.in;Y=X?X.def:void 0}return!1}function T(Q,Y){let X=Y.shape,W={},q=[],K=!1,G=($,B,N,H)=>{let V=X[B],J=H?"-":"--";if(!V)throw Error(`Unknown option ${J}${$} (use -- to pass literal text starting with -)`);if(p3(V))return W[B]=N===void 0?!0:N!=="false",0;if(N===void 0)throw Error(`Missing value for ${J}${$}`);return W[B]=N,1};for(let $=0;$<Q.length;$+=1){let B=Q[$];if(K){q.push(B);continue}if(B==="--"){K=!0;continue}if(!B.startsWith("-")||B==="-"){q.push(B);continue}if(B.startsWith("--")){let[H,V]=B.slice(2).split("=",2);if(V===void 0&&X[H]&&!p3(X[H]))$+=G(H,H,Q[$+1],!1);else G(H,H,V,!1);continue}let N=B.slice(1);if(X[N]&&!p3(X[N]))$+=G(N,N,Q[$+1],!0);else G(N,N,void 0,!0)}let z=Y.safeParse(W);if(!z.success){let $=z.error.issues[0],B=String($.path[0]??""),N=W[B];throw Error(N===void 0?`Missing required --${B}.`:`Invalid --${B} value ${JSON.stringify(N)}: ${$.message}`)}return{options:z.data,positionals:q}}import q0 from"node:fs";import K0 from"node:path";var OQ="item/commandExecution/requestApproval",ZQ="item/fileChange/requestApproval",AQ=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"]),DQ=[/\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)/],FQ=new Set(["status","log","diff","show","blame","rev-parse","ls-files","ls-tree","cat-file","describe","shortlog","grep","branch","stash"]);function RQ(Q){let Y=Q.match(/^\s*(?:ba|z|da)?sh\s+(?:-[a-zA-Z]+\s+)*(?:-c\s+)?(["'])([\s\S]*)\1\s*$/);return Y?Y[2]:Q}function EQ(Q){return Q.trim().split(/\s+/).filter(Boolean)}function MQ(Q){let Y=Q.find((X,W)=>W>0&&!X.startsWith("-"));if(!Y)return{decision:"accept",reason:"bare git"};if(Y==="branch"&&Q.some((X)=>/^-(d|D|m|M|c|C|f|u)|^--(delete|move|copy|force|set-upstream)/.test(X)))return{decision:"decline",reason:"git branch write operation (git is read-only for Coder)"};if(Y==="stash"){let X=Q.find((W,q)=>q>1&&!W.startsWith("-"));if(X==="list"||X==="show")return{decision:"accept",reason:`git stash ${X} is read-only`};return{decision:"decline",reason:"git stash write operation (git is read-only for Coder)"}}if(FQ.has(Y))return{decision:"accept",reason:`git ${Y} is read-only`};if(AQ.has(Y))return{decision:"decline",reason:`git ${Y} is a write operation (git is read-only for Coder)`};return{decision:"escalate",reason:`unrecognized git subcommand: ${Y}`}}function z9(Q,Y={}){let X=RQ(String(Q??""));if(!X.trim())return{decision:"escalate",reason:"empty command"};for(let z of DQ)if(z.test(X))return{decision:"decline",reason:`matches hard-deny pattern ${z}`};if(/\$\(|`|<\(/.test(X))return{decision:"escalate",reason:"contains command substitution"};let W=X.split(/&&|\|\||;|\||\r?\n/).map((z)=>z.trim()).filter(Boolean);if(W.length>1){let z={decision:"accept",reason:"all segments safe"};for(let $ of W){let B=z9($,Y);if(B.decision==="decline")return B;if(B.decision==="escalate")z=B}return z}let q=EQ(X),K=K0.basename(q[0]??"");if(K==="git")return MQ(q);let G=Y.networkHost;if(G){if((Y.allowedNetworkHosts??[]).some(($)=>G===$||G.endsWith(`.${$}`)))return{decision:"accept",reason:`network host ${G} is allowlisted`};return{decision:"escalate",reason:`network access to ${G}`}}return{decision:"escalate",reason:`command needs approval: ${K||"(unknown)"}`}}function _Q(Q,Y){if(!Q.length)return{decision:"escalate",reason:"file change with no resolvable paths"};for(let X of Q){let W=K0.resolve(Y,X),q=K0.relative(Y,W);if(q.startsWith("..")||K0.isAbsolute(q))return{decision:"escalate",reason:`path outside workspace: ${X}`};if(q===".git"||q.startsWith(`.git${K0.sep}`))return{decision:"decline",reason:`direct .git modification: ${X}`}}return{decision:"accept",reason:"all paths inside workspace"}}function r3(Q){return K0.join(Q,"approvals")}function o0(Q){let Y=r3(Q);if(!q0.existsSync(Y))return[];return q0.readdirSync(Y).filter((X)=>X.endsWith(".request.json")).map((X)=>{let W=X.replace(/\.request\.json$/,""),q=JSON.parse(q0.readFileSync(K0.join(Y,X),"utf8")),K=K0.join(Y,`${W}.response.json`),G=q0.existsSync(K)?JSON.parse(q0.readFileSync(K,"utf8")):null;return{...q,id:W,response:G}}).sort((X,W)=>String(X.createdAt??"").localeCompare(String(W.createdAt??"")))}function G9(Q,Y,X){let W=r3(Q),q=K0.join(W,`${Y}.request.json`);if(!q0.existsSync(q))throw Error(`No pending approval "${Y}" for this job.`);q0.writeFileSync(K0.join(W,`${Y}.response.json`),`${JSON.stringify({decision:X,answeredAt:new Date().toISOString()},null,2)}
|
|
44
|
+
`,"utf8")}async function l3(Q,Y,{timeoutMs:X,onEvent:W}){let q=r3(Q);q0.mkdirSync(q,{recursive:!0});let K=`apr-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`;q0.writeFileSync(K0.join(q,`${K}.request.json`),`${JSON.stringify({...Y,createdAt:new Date().toISOString()},null,2)}
|
|
45
|
+
`,"utf8"),W?.({kind:"approval-escalated",approvalId:K,summary:Y.summary,message:`Approval needed (${K}): ${Y.summary}. Answer with: coder approve <job> ${K} [--deny]`});let G=K0.join(q,`${K}.response.json`),z=Date.now()+X;while(Date.now()<z){if(q0.existsSync(G))try{let B=JSON.parse(q0.readFileSync(G,"utf8")).decision==="accept"?"accept":"decline";return W?.({kind:"approval-answered",approvalId:K,decision:B}),B}catch{}await new Promise(($)=>setTimeout($,400))}return W?.({kind:"approval-timeout",approvalId:K,message:`Approval ${K} timed out; declining.`}),"decline"}function $9(Q,Y={}){return l3(Q,{method:"simulate",summary:"simulated approval probe (--simulate-approval)"},{timeoutMs:Y.timeoutMs??120000,onEvent:Y.onEvent??null})}function B9({workspaceRoot:Q,jobDir:Y,mode:X="auto",escalationTimeoutMs:W=120000,allowedNetworkHosts:q=[],onEvent:K=null}){return async(G,z,$)=>{if(G===OQ){let B=z.command??$?.itemIndex?.get(z.itemId??"")?.command??"",N=`run command: ${B||"(unknown command)"}${z.reason?` — ${z.reason}`:""}`;if(X==="deny")return K?.({kind:"approval-decision",method:G,decision:"decline",reason:"deny mode",summary:N}),{decision:"decline"};let H=z9(B,{networkHost:z.networkApprovalContext?.host??null,allowedNetworkHosts:q});if(K?.({kind:"approval-decision",method:G,decision:H.decision,reason:H.reason,summary:N}),H.decision==="escalate")return{decision:await l3(Y,{method:G,summary:N,command:B,params:z},{timeoutMs:W,onEvent:K})};return{decision:H.decision}}if(G===ZQ){let N=($?.itemIndex?.get(z.itemId??"")?.changes??[]).map((J)=>J.path).filter((J)=>Boolean(J)),H=`apply file changes: ${N.join(", ")||"(unknown paths)"}${z.reason?` — ${z.reason}`:""}`;if(X==="deny")return K?.({kind:"approval-decision",method:G,decision:"decline",reason:"deny mode",summary:H}),{decision:"decline"};let V=_Q(N,Q);if(K?.({kind:"approval-decision",method:G,decision:V.decision,reason:V.reason,summary:H}),V.decision==="escalate")return{decision:await l3(Y,{method:G,summary:H,paths:N,params:z},{timeoutMs:W,onEvent:K})};return{decision:V.decision}}throw K?.({kind:"approval-unsupported",method:G}),Error(`Coder does not handle server request ${G}; treating as denied.`)}}async function t2(Q,Y,X=400){let W=Y;for(;;){if(Z0.includes(W.status))return{job:W,reason:"terminal"};let q=o0(C(Q,W.id)).filter((K)=>!K.response);if(q[0])return{job:W,reason:"approval",approval:{id:q[0].id,summary:String(q[0].summary??"")}};await new Promise((K)=>setTimeout(K,X)),W=b0(Q,r(Q,W.id)??W)}}import{spawnSync as oQ}from"node:child_process";import pQ from"node:net";import R2 from"node:process";import{spawn as lQ}from"node:child_process";import rQ from"node:readline";import H9 from"node:path";import TQ from"node:process";function IQ(Q){return String(Q??"").replace(/[^A-Za-z0-9._-]/g,"-").replace(/^-+|-+$/g,"")}function N9(Q,Y=TQ.platform){if(Y==="win32")return`pipe:\\\\.\\pipe\\${IQ(`${H9.win32.basename(Q)}-codex-app-server`)}`;return`unix:${H9.join(Q,"broker.sock")}`}function D2(Q){if(typeof Q!=="string"||Q.length===0)throw Error("Missing broker endpoint.");if(Q.startsWith("pipe:")){let Y=Q.slice(5);if(!Y)throw Error("Broker pipe endpoint is missing its path.");return{kind:"pipe",path:Y}}if(Q.startsWith("unix:")){let Y=Q.slice(5);if(!Y)throw Error("Broker Unix socket endpoint is missing its path.");return{kind:"unix",path:Y}}throw Error(`Unsupported broker endpoint: ${Q}`)}import g from"node:fs";import wQ from"node:net";import SQ from"node:os";import i0 from"node:path";import d3 from"node:process";import{spawn as CQ}from"node:child_process";import{fileURLToPath as xQ}from"node:url";var kQ="broker.json";function jQ(Q="coder-"){return g.mkdtempSync(i0.join(SQ.tmpdir(),Q))}function vQ(Q){let Y=D2(Q);return wQ.createConnection({path:Y.path})}async function V9(Q,Y=2000){let X=Date.now();while(Date.now()-X<Y){if(await new Promise((q)=>{let K=vQ(Q);K.on("connect",()=>{K.end(),q(!0)}),K.on("error",()=>q(!1))}))return!0;await new Promise((q)=>setTimeout(q,50))}return!1}function hQ({scriptPath:Q,cwd:Y,endpoint:X,pidFile:W,logFile:q,env:K=d3.env}){let G=g.openSync(q,"a"),z=CQ(d3.execPath,[Q,"serve","--endpoint",X,"--cwd",Y,"--pid-file",W],{cwd:Y,env:K,detached:!0,stdio:["ignore",G,G]});return z.unref(),g.closeSync(G),z}function bQ(){let Q=[new URL("./lib/broker.js",import.meta.url),new URL("./broker.js",import.meta.url)];for(let Y of Q){let X=xQ(Y);if(g.existsSync(X))return X}throw Error("Coder broker script not found next to the runtime. Rebuild with `bun run build`.")}function n3(Q){return i0.join(K2(Q),kQ)}function o3(Q){let Y=n3(Q);if(!g.existsSync(Y))return null;try{return JSON.parse(g.readFileSync(Y,"utf8"))}catch{return null}}function gQ(Q,Y){let X=K2(Q);g.mkdirSync(X,{recursive:!0}),g.writeFileSync(n3(Q),`${JSON.stringify(Y,null,2)}
|
|
46
|
+
`,"utf8")}function yQ(Q){let Y=n3(Q);if(g.existsSync(Y))g.unlinkSync(Y)}async function mQ(Q){if(!Q)return!1;try{return await V9(Q,150)}catch{return!1}}async function U9(Q,Y={}){let X=Y.scriptPath??bQ(),W=a(),q=o3(Q),K=q?.version===W&&q?.scriptPath===X;if(q&&K&&await mQ(q.endpoint))return q;if(q)J9({endpoint:q.endpoint??null,pidFile:q.pidFile??null,logFile:q.logFile??null,sessionDir:q.sessionDir??null,pid:q.pid??null,killProcess:Y.killProcess??null}),yQ(Q);let G=jQ(),$=(Y.createBrokerEndpoint??N9)(G,Y.platform),B=i0.join(G,"broker.pid"),N=i0.join(G,"broker.log"),H=hQ({scriptPath:X,cwd:Q,endpoint:$,pidFile:B,logFile:N,env:Y.env??d3.env});if(!await V9($,Y.timeoutMs??2000))return J9({endpoint:$,pidFile:B,logFile:N,sessionDir:G,pid:H.pid??null,killProcess:Y.killProcess??null}),null;let J={endpoint:$,pidFile:B,logFile:N,sessionDir:G,pid:H.pid??null,version:W,scriptPath:X};return gQ(Q,J),J}function J9({endpoint:Q=null,pidFile:Y,logFile:X,sessionDir:W=null,pid:q=null,killProcess:K=null}){if(Number.isFinite(q)&&K)try{K(q)}catch{}if(Y&&g.existsSync(Y))g.unlinkSync(Y);if(X&&g.existsSync(X))g.unlinkSync(X);if(Q)try{let z=D2(Q);if(z.kind==="unix"&&g.existsSync(z.path))g.unlinkSync(z.path)}catch{}let G=W??(Y?i0.dirname(Y):X?i0.dirname(X):null);if(G&&g.existsSync(G))try{g.rmdirSync(G)}catch{}}import{spawnSync as uQ}from"node:child_process";import F2 from"node:process";function a2(Q,Y=[],X={}){let W=uQ(Q,Y,{cwd:X.cwd,env:X.env,encoding:"utf8",input:X.input,maxBuffer:X.maxBuffer,stdio:X.stdio??"pipe",shell:F2.platform==="win32"?F2.env.SHELL||!0:!1,windowsHide:!0});return{command:Q,args:Y,status:W.status??0,signal:W.signal??null,stdout:W.stdout??"",stderr:W.stderr??"",error:W.error??null}}function i3(Q,Y=["--version"],X={}){let W=a2(Q,Y,X);if(W.error&&W.error.code==="ENOENT")return{available:!1,detail:"not found"};if(W.error)return{available:!1,detail:W.error.message};if(W.status!==0)return{available:!1,detail:W.stderr.trim()||W.stdout.trim()||`exit ${W.status}`};return{available:!0,detail:W.stdout.trim()||W.stderr.trim()||"ok"}}function cQ(Q){return/not found|no running instance|cannot find|does not exist|no such process/i.test(Q)}function L9(Q,Y={}){if(!Number.isFinite(Q))return{attempted:!1,delivered:!1,method:null};let X=Q,W=Y.platform??F2.platform,q=Y.runCommandImpl??a2,K=Y.killImpl??F2.kill.bind(F2);if(W==="win32"){let G=q("taskkill",["/PID",String(X),"/T","/F"],{cwd:Y.cwd,env:Y.env});if(!G.error&&G.status===0)return{attempted:!0,delivered:!0,method:"taskkill",result:G};let z=`${G.stderr}
|
|
47
|
+
${G.stdout}`.trim();if(!G.error&&cQ(z))return{attempted:!0,delivered:!1,method:"taskkill",result:G};if(G.error?.code==="ENOENT")try{return K(X),{attempted:!0,delivered:!0,method:"kill"}}catch($){if($?.code==="ESRCH")return{attempted:!0,delivered:!1,method:"kill"};throw $}if(G.error)throw G.error;throw Error(fQ(G))}try{return K(-X,"SIGTERM"),{attempted:!0,delivered:!0,method:"process-group"}}catch(G){if(G?.code!=="ESRCH")try{return K(X,"SIGTERM"),{attempted:!0,delivered:!0,method:"process"}}catch(z){if(z?.code==="ESRCH")return{attempted:!0,delivered:!1,method:"process"};throw z}return{attempted:!0,delivered:!1,method:"process-group"}}}function fQ(Q){let Y=[`${Q.command} ${Q.args.join(" ")}`.trim()];if(Q.signal)Y.push(`signal=${Q.signal}`);else Y.push(`exit=${Q.status}`);let X=(Q.stderr||"").trim(),W=(Q.stdout||"").trim();if(X)Y.push(X);else if(W)Y.push(W);return Y.join(": ")}var s2="CODER_APP_SERVER_ENDPOINT",O9=-32001,dQ="0.144.1",t3;function nQ(){if(t3===void 0){let Q=a2("codex",["--version"]),Y=/(\d+\.\d+\.\d+(?:-[\w.]+)?)/.exec(`${Q.stdout} ${Q.stderr}`);t3=Y?Y[1]:dQ}return t3}function Z9(){return{title:"Coder",name:"coder",version:nQ()}}var A9={experimentalApi:!1,requestAttestation:!1,optOutNotificationMethods:["item/agentMessage/delta","item/reasoning/summaryTextDelta","item/reasoning/summaryPartAdded","item/reasoning/textDelta"]};function P9(Q,Y,X){return X===void 0?{code:Q,message:Y}:{code:Q,message:Y,data:X}}function a3(Q,Y){let X=Error(Q);if(X.data=Y,Y?.code!==void 0)X.rpcCode=Y.code;return X}class s3{cwd;options;pending;nextId;stderr;closed;exitError;notificationHandler;serverRequestHandler;lineBuffer;transport;exitPromise;exitResolved;resolveExit;handleServerRequest;constructor(Q,Y={}){this.cwd=Q,this.options=Y,this.pending=new Map,this.nextId=1,this.stderr="",this.closed=!1,this.exitError=null,this.notificationHandler=null,this.serverRequestHandler=null,this.lineBuffer="",this.transport="unknown",this.handleServerRequest=(X)=>this.defaultHandleServerRequest(X),this.exitPromise=new Promise((X)=>{this.resolveExit=X})}setNotificationHandler(Q){this.notificationHandler=Q}setServerRequestHandler(Q){this.serverRequestHandler=Q}request(Q,Y){if(this.closed)throw Error("codex app-server client is closed.");let X=this.nextId;return this.nextId+=1,new Promise((W,q)=>{this.pending.set(X,{resolve:W,reject:q,method:Q}),this.sendMessage({id:X,method:Q,params:Y})})}notify(Q,Y={}){if(this.closed)return;this.sendMessage({method:Q,params:Y})}handleChunk(Q){this.lineBuffer+=Q;let Y=this.lineBuffer.indexOf(`
|
|
48
48
|
`);while(Y!==-1){let X=this.lineBuffer.slice(0,Y);this.lineBuffer=this.lineBuffer.slice(Y+1),this.handleLine(X),Y=this.lineBuffer.indexOf(`
|
|
49
|
-
`)}}handleLine(Q){if(!Q.trim())return;let Y;try{Y=JSON.parse(Q)}catch(X){this.handleExit(
|
|
50
|
-
${q}`:""}`);this.handleExit(K)}),this.readline=
|
|
51
|
-
`,X=this.proc?.stdin;if(!X)throw Error("codex app-server stdin is not available.");X.write(Y)}}class
|
|
52
|
-
`,X=this.socket;if(!X)throw Error("codex app-server broker connection is not connected.");X.write(Y)}}class
|
|
53
|
-
`)}function
|
|
54
|
-
${Y}`:""),phase:"running"}}case"fileChange":return{message:`File changes ${Q.status}.`,phase:"editing"};case"mcpToolCall":return{message:`Tool ${Q.server}/${Q.tool} ${Q.status}.`,phase:"investigating"};case"dynamicToolCall":return{message:`Tool ${Q.tool} ${Q.status}.`,phase:"investigating"};default:return null}}function QY(Q,Y={}){let X,W,q=new Promise((K,G)=>{X=K,W=G});return{threadId:Q,rootThreadId:Q,threadIds:new Set([Q]),threadTurnIds:new Map,turnId:null,bufferedNotifications:[],completion:q,resolveCompletion:X,rejectCompletion:W,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:Y.onProgress??null,onHeartbeat:Y.onHeartbeat??null}}function a3(Q){if(Q.completionTimer)clearTimeout(Q.completionTimer),Q.completionTimer=null}function s3(Q,Y=null){if(Q.completed)return;if(a3(Q),Q.completed=!0,Y){if(Q.finalTurn=Y,!Q.turnId)Q.turnId=Y.id??null}else if(!Q.finalTurn)Q.finalTurn={id:Q.turnId??"inferred-turn",status:"completed"};Q.resolveCompletion(Q)}function t3(Q){if(Q.completed||Q.finalTurn||!Q.finalAnswerSeen)return;if(Q.pendingCollaborations.size>0||Q.activeSubagentTurns.size>0)return;a3(Q),Q.completionTimer=setTimeout(()=>{if(Q.completionTimer=null,Q.completed||Q.finalTurn||!Q.finalAnswerSeen)return;if(Q.pendingCollaborations.size>0||Q.activeSubagentTurns.size>0)return;s3(Q,null)},250),Q.completionTimer.unref?.()}function D9(Q,Y){let X=R9(Y);if(!X||!Q.threadIds.has(X))return!1;let W=Q.threadTurnIds.get(X)??null,q=nQ(Y);return W===null||q===null||q===W}function F9(Q,Y,X,W=null){if(Y.id)Q.itemIndex.set(Y.id,Y);if(Y.type==="collabAgentToolCall"){if(!W||W===Q.threadId){if(X==="started"||Y.status==="inProgress")Q.pendingCollaborations.add(Y.id);else if(X==="completed")Q.pendingCollaborations.delete(Y.id),t3(Q)}for(let q of Y.receiverThreadIds??[])Q.threadIds.add(q)}if(Y.type==="agentMessage"){if(Y.text&&(!W||W===Q.threadId)){if(Q.lastAgentMessage=Y.text,X==="completed"&&Y.phase==="final_answer")Q.finalAnswerSeen=!0,t3(Q)}return}if(Y.type==="reasoning"&&X==="completed"){Q.reasoningSummary=aQ(Q.reasoningSummary,t0(Y.summary));return}if(Y.type==="fileChange"&&X==="completed"){Q.fileChanges.push(Y);return}if(Y.type==="commandExecution"&&X==="completed")Q.commandExecutions.push(Y)}function i3(Q,Y){switch(Q.onHeartbeat?.(),Y.method){case"thread/started":Q.threadIds.add(Y.params.thread.id);break;case"turn/started":if(Q.threadIds.add(Y.params.threadId),Q.threadTurnIds.set(Y.params.threadId,Y.params.turn.id),(Y.params.threadId??null)!==Q.threadId)Q.activeSubagentTurns.add(Y.params.threadId);R0(Q.onProgress,`Turn started (${Y.params.turn.id}).`,"starting",{threadId:Y.params.threadId??null,turnId:Y.params.turn.id??null});break;case"item/started":F9(Q,Y.params.item,"started",Y.params.threadId??null);{let X=sQ(Y.params.item);R0(Q.onProgress,X?.message,X?.phase??null)}break;case"item/completed":F9(Q,Y.params.item,"completed",Y.params.threadId??null);{let X=eQ(Y.params.item);R0(Q.onProgress,X?.message,X?.phase??null)}break;case"thread/tokenUsage/updated":{let X=iQ(Y.params?.tokenUsage?.total??Y.params?.tokenUsage),W=R9(Y);if(X&&W)Q.tokenUsageByThread.set(W,X);break}case"error":Q.error=Y.params.error,R0(Q.onProgress,`Codex error: ${Y.params.error.message}`,"failed");break;case"turn/completed":if((Y.params.threadId??null)!==Q.threadId){Q.activeSubagentTurns.delete(Y.params.threadId),t3(Q);break}R0(Q.onProgress,`Turn ${Y.params.turn.status}.`,"finalizing"),s3(Q,Y.params.turn);break;default:break}}async function YY(Q,Y,X,W={}){let q=QY(Y,W),K=Q.notificationHandler;Q.setNotificationHandler((z)=>{if(!q.turnId){q.bufferedNotifications.push(z);return}if(z.method==="thread/started"){i3(q,z);return}if(!D9(q,z)){K?.(z);return}i3(q,z)});let G=W.onApprovalRequest;if(G)Q.setServerRequestHandler((z,$)=>G(z,$,q));try{let z=await X();if(q.turnId=z.turn?.id??null,q.turnId)q.threadTurnIds.set(q.threadId,q.turnId);for(let $ of q.bufferedNotifications)if(D9(q,$))i3(q,$);else K?.($);if(q.bufferedNotifications.length=0,z.turn?.status&&z.turn.status!=="inProgress")s3(q,z.turn);return await q.completion}finally{a3(q),Q.setNotificationHandler(K??null),Q.setServerRequestHandler(null)}}async function XY(Q,Y){let X=null;try{X=await k0.connect(Q);let W=await Y(X);return await X.close(),W}catch(W){let q=W,K=X?.transport==="broker"||Boolean(process.env[i2]),G=X?.transport==="broker"&&q?.rpcCode===U9||K&&(q?.code==="ENOENT"||q?.code==="ECONNREFUSED");if(X)await X.close().catch(()=>{}),X=null;if(!G)throw W;let z=await k0.connect(Q,{disableBroker:!0});try{return await Y(z)}finally{await z.close()}}}function B0(Q){let Y=r3("codex",["--version"],{cwd:Q});if(!Y.available)return Y;let X=r3("codex",["app-server","--help"],{cwd:Q});if(!X.available)return{available:!1,detail:`${Y.detail}; app-server runtime unavailable: ${X.detail}`};return{available:!0,detail:`${Y.detail}; app-server runtime available`}}async function M9(Q){let Y=B0(Q);if(!Y.available)return{available:!1,loggedIn:!1,detail:Y.detail};let X=null;try{X=await k0.connect(Q,{reuseExistingBroker:!0});let W=await X.request("account/read",{refreshToken:!1}),q=W?.account??null;if(q?.type==="chatgpt")return{available:!0,loggedIn:!0,detail:q.email?`ChatGPT login active for ${q.email}`:"ChatGPT login active"};if(q?.type==="apiKey")return{available:!0,loggedIn:!0,detail:"API key configured"};if(W?.requiresOpenaiAuth===!1)return{available:!0,loggedIn:!0,detail:"Active provider does not require OpenAI authentication"};return{available:!0,loggedIn:!1,detail:"Not authenticated. Run `codex login`."}}catch(W){let q=fQ("codex",["login","status"],{encoding:"utf8"}),K=`${q.stdout??""}${q.stderr??""}`.trim();if(q.status===0)return{available:!0,loggedIn:!0,detail:K||"Logged in"};return{available:!0,loggedIn:!1,detail:K||(W instanceof Error?W.message:String(W))}}finally{await X?.close().catch(()=>{})}}async function _9(Q,{threadId:Y,turnId:X}){if(!Y||!X)return{interrupted:!1,detail:"missing threadId or turnId"};let W=null;try{return W=await k0.connect(Q,{reuseExistingBroker:!0}),await W.request("turn/interrupt",{threadId:Y,turnId:X}),{interrupted:!0,detail:`Interrupted ${X} on ${Y}.`}}catch(q){return{interrupted:!1,detail:q instanceof Error?q.message:String(q)}}finally{await W?.close().catch(()=>{})}}async function T9(Q,{threadId:Y,text:X}){if(!Y)return{steered:!1,detail:"missing threadId"};let W=X.trim();if(!W)return{steered:!1,detail:"empty follow-up"};let q=null;try{return q=await k0.connect(Q,{reuseExistingBroker:!0}),await q.request("turn/steer",{threadId:Y,input:[{type:"text",text:W,text_elements:[]}]}),{steered:!0,detail:`Steered follow-up into the active turn on ${Y}.`}}catch(K){return{steered:!1,detail:K instanceof Error?K.message:String(K)}}finally{await q?.close().catch(()=>{})}}async function I9(Q,Y={}){let X=B0(Q);if(!X.available)throw Error(`Codex CLI is not available: ${X.detail}`);let W=Y.prompt?.trim();if(!W)throw Error("A prompt is required.");return XY(Q,async(q)=>{let K;if(Y.resumeThreadId){if(R0(Y.onProgress,`Resuming thread ${Y.resumeThreadId}.`,"starting"),M4(Y.resumeThreadId))await _4(Y.resumeThreadId);K=(await q.request("thread/resume",{threadId:Y.resumeThreadId,cwd:Q,model:Y.model??null,modelProvider:Y.modelProvider??null,config:Y.configOverrides??null,approvalPolicy:Y.approvalPolicy??"never",sandbox:Y.sandbox??"read-only"})).thread.id}else{R0(Y.onProgress,"Starting Codex task thread.","starting"),K=(await q.request("thread/start",{cwd:Q,model:Y.model??null,modelProvider:Y.modelProvider??null,config:Y.configOverrides??null,approvalPolicy:Y.approvalPolicy??"never",sandbox:Y.sandbox??"read-only",serviceName:pQ,ephemeral:Y.ephemeral??!1})).thread.id;try{await q.request("thread/name/set",{threadId:K,name:dQ(W)})}catch($){let B=String($?.message??$??"");if(!B.includes("unknown variant")&&!B.includes("unknown method"))throw $}}R0(Y.onProgress,`Thread ready (${K}).`,"starting",{threadId:K});let G=await YY(q,K,()=>q.request("turn/start",{threadId:K,input:[{type:"text",text:W,text_elements:[]}],model:Y.model??null,effort:Y.effort??null,outputSchema:Y.outputSchema??null}),{onProgress:Y.onProgress,onHeartbeat:Y.onHeartbeat,onApprovalRequest:Y.onApprovalRequest});return{status:G.finalTurn?.status==="completed"?0:1,threadId:K,turnId:G.turnId,finalMessage:G.lastAgentMessage,reasoningSummary:G.reasoningSummary,turn:G.finalTurn,error:G.error,stderr:lQ(q.stderr),fileChanges:G.fileChanges,touchedFiles:oQ(G.fileChanges),tokens:tQ(G),model:Y.model??null,commandExecutions:G.commandExecutions}})}import{spawn as HY,spawnSync as h9}from"node:child_process";import{randomUUID as NY}from"node:crypto";import t2 from"node:fs";import Q4 from"node:path";var Y4={chain:["codex","claude"],agents:{codex:{model:"gpt-5.6-terra",effort:"high",permissions:"auto"},claude:{model:"opus",effort:"medium",permissions:"auto"}},models:{},approvals:{escalationTimeoutMs:120000,allowedNetworkHosts:[]}},a0={spark:"gpt-5.3-codex-spark",luna:"gpt-5.6-luna",terra:"gpt-5.6-terra",sol:"gpt-5.6-sol"},X4=new Set(["low","medium","high"]),R2={sonnet:"sonnet",opus:"opus",fable:"fable"},W4=new Set(["low","medium","high"]),E2={"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"}},q4={"read-only":["--permission-mode","dontAsk","--disallowedTools","Edit","Write","NotebookEdit"],"workspace-write":["--permission-mode","acceptEdits"],auto:["--permission-mode","auto"]},w9=/failIfUnavailable|sandbox\b[^.\n]*?(?:failed|could ?n[o']t|cannot|unavailable|not available|not supported)/i;function S9(Q,Y){if(Q!=="read-only")return null;return JSON.stringify({sandbox:{enabled:!0,failIfUnavailable:!0,autoAllowBashIfSandboxed:!0,filesystem:{denyWrite:[Y]}}})}var d5=n0(["codex","claude"]),WY=n0(["codex","claude","custom"]),qY=n0(["low","medium","high"]),KY=n0(["read-only","workspace-write","auto"]),e3=Z2(d0({model:U0().check(r0(1)),effort:qY,permissions:KY})),zY=d0({baseUrl:o1(),model:U0().check(r0(1)),envKey:d(U0().check(r0(1))),wireApi:d(n0(["chat","responses"]))}),C9=d0({escalationTimeoutMs:i1().check(w0()),allowedNetworkHosts:y3(U0())}),GY=d0({chain:y3(WY).check(r0(1)),agents:Z2(d0({codex:e3,claude:e3,custom:e3})),models:d(Y9(U0().check(b3(/^[a-z][a-z0-9-]*$/,"lowercase kebab-case")),zY)),approvals:C9}),$Y=Z2(Q9(GY,{approvals:Z2(C9)}));function M2(Q){let Y=$Y.safeParse(Q);if(Y.success)return[];return Y.error.issues.map((X)=>{return`${X.path.join(".")||"config"}: ${X.message}`})}function BY(Q){if(!t2.existsSync(Q))return null;try{return JSON.parse(t2.readFileSync(Q,"utf8"))}catch(Y){let X=Y instanceof Error?Y.message:String(Y);throw Error(`Invalid JSON in ${Q}: ${X}`)}}function x9(Q,Y){if(!Y||typeof Y!=="object"||Array.isArray(Y))return Y??Q;let X={...Q},W=Q;for(let[q,K]of Object.entries(Y))if(K&&typeof K==="object"&&!Array.isArray(K)&&W?.[q]&&typeof W[q]==="object")X[q]=x9(W[q],K);else X[q]=K;return X}function P0(){return Q4.join(_0(),"config.json")}function o(Q){let Y=z0(Q),X=Y4;for(let W of[P0(),Q4.join(Y,"coder.config.json")]){let q=BY(W);if(!q)continue;let K=M2(q);if(K.length)throw Error(`Invalid config in ${W}:
|
|
49
|
+
`)}}handleLine(Q){if(!Q.trim())return;let Y;try{Y=JSON.parse(Q)}catch(X){this.handleExit(a3(`Failed to parse codex app-server JSONL: ${X instanceof Error?X.message:String(X)}`,{line:Q}));return}if(Y.id!==void 0&&Y.method){this.handleServerRequest(Y);return}if(Y.id!==void 0){let X=this.pending.get(Y.id);if(!X)return;if(this.pending.delete(Y.id),Y.error)X.reject(a3(Y.error.message??`codex app-server ${X.method} failed.`,Y.error));else X.resolve(Y.result??{});return}if(Y.method&&this.notificationHandler)this.notificationHandler(Y)}defaultHandleServerRequest(Q){let Y=this.serverRequestHandler;if(!Y){this.sendMessage({id:Q.id,error:P9(-32601,`Unsupported server request: ${Q.method}`)});return}Promise.resolve().then(()=>Y(Q.method,Q.params??{})).then((X)=>{this.sendMessage({id:Q.id,result:X??{}})}).catch((X)=>{this.sendMessage({id:Q.id,error:P9(-32000,X instanceof Error?X.message:String(X))})})}handleExit(Q){if(this.exitResolved)return;this.exitResolved=!0,this.exitError=Q??null;for(let Y of this.pending.values())Y.reject(this.exitError??Error("codex app-server connection closed."));this.pending.clear(),this.resolveExit(void 0)}sendMessage(Q){throw Error("sendMessage must be implemented by subclasses.")}}class D9 extends s3{proc;readline;constructor(Q,Y={}){super(Q,Y);this.transport="direct"}async initialize(){this.proc=lQ("codex",["-c","sandbox_workspace_write.network_access=false","app-server","--disable","plugins"],{cwd:this.cwd,env:this.options.env??R2.env,stdio:["pipe","pipe","pipe"],shell:R2.platform==="win32"?R2.env.SHELL||!0:!1,windowsHide:!0});let Q=this.proc.stdout,Y=this.proc.stderr;if(!Q||!Y)throw Error("codex app-server did not expose stdio streams.");Q.setEncoding("utf8"),Y.setEncoding("utf8"),Y.on("data",(X)=>{this.stderr+=X}),this.proc.on("error",(X)=>{this.handleExit(X)}),this.proc.on("exit",(X,W)=>{let q=this.stderr.trim(),K=X===0?null:a3(`codex app-server exited unexpectedly (${W?`signal ${W}`:`exit ${X}`}).${q?`
|
|
50
|
+
${q}`:""}`);this.handleExit(K)}),this.readline=rQ.createInterface({input:Q}),this.readline.on("line",(X)=>{this.handleLine(X)}),await this.request("initialize",{clientInfo:this.options.clientInfo??Z9(),capabilities:this.options.capabilities??A9}),this.notify("initialized",{})}async close(){if(this.closed){await this.exitPromise;return}if(this.closed=!0,this.readline)this.readline.close();if(this.proc&&!this.proc.killed)this.proc.stdin?.end(),setTimeout(()=>{if(this.proc&&!this.proc.killed&&this.proc.exitCode===null)if(R2.platform==="win32")try{L9(this.proc.pid)}catch{}else this.proc.kill("SIGTERM")},50).unref?.();await this.exitPromise}sendMessage(Q){let Y=`${JSON.stringify(Q)}
|
|
51
|
+
`,X=this.proc?.stdin;if(!X)throw Error("codex app-server stdin is not available.");X.write(Y)}}class F9 extends s3{endpoint;socket;constructor(Q,Y={}){super(Q,Y);this.transport="broker",this.endpoint=Y.brokerEndpoint}async initialize(){await new Promise((Q,Y)=>{let X=D2(this.endpoint);this.socket=pQ.createConnection({path:X.path}),this.socket.setEncoding("utf8"),this.socket.on("connect",Q),this.socket.on("data",(W)=>{this.handleChunk(W)}),this.socket.on("error",(W)=>{if(!this.exitResolved)Y(W);this.handleExit(W)}),this.socket.on("close",()=>{this.handleExit(this.exitError)})}),await this.request("initialize",{clientInfo:this.options.clientInfo??Z9(),capabilities:this.options.capabilities??A9}),this.notify("initialized",{})}async close(){if(this.closed){await this.exitPromise;return}if(this.closed=!0,this.socket)this.socket.end();await this.exitPromise}sendMessage(Q){let Y=`${JSON.stringify(Q)}
|
|
52
|
+
`,X=this.socket;if(!X)throw Error("codex app-server broker connection is not connected.");X.write(Y)}}class x0{static async connect(Q,Y={}){let X=null;if(!Y.disableBroker){if(X=Y.brokerEndpoint??Y.env?.[s2]??R2.env[s2]??null,!X&&Y.reuseExistingBroker)X=o3(Q)?.endpoint??null;if(!X&&!Y.reuseExistingBroker)X=(await U9(Q,{env:Y.env}))?.endpoint??null}let W=X?new F9(Q,{...Y,brokerEndpoint:X}):new D9(Q,Y);return await W.initialize(),W}}var iQ="coder_runtime",R9="Coder Task";function tQ(Q){return Q.split(/\r?\n/).map((Y)=>Y.trimEnd()).filter((Y)=>Y&&!Y.startsWith("WARNING: proceeding, even though we could not update PATH:")).join(`
|
|
53
|
+
`)}function aQ(Q,Y=72){let X=String(Q??"").trim().replace(/\s+/g," ");if(!X)return"";if(X.length<=Y)return X;return`${X.slice(0,Y-3)}...`}function sQ(Q){let Y=aQ(Q,56);return Y?`${R9}: ${Y}`:R9}function _9(Q){return Q?.params?.threadId??null}function eQ(Q){if(Q?.params?.turnId)return Q.params.turnId;if(Q?.params?.turn?.id)return Q.params.turn.id;return null}function QY(Q){let Y=new Set;for(let X of Q)for(let W of X.changes??[])if(W.path)Y.add(W.path);return[...Y]}function YY(Q){if(!Q||typeof Q!=="object")return null;let Y=(K)=>typeof K==="number"&&Number.isFinite(K)?K:0,X=Y(Q.inputTokens),W=Y(Q.cachedInputTokens),q=Y(Q.outputTokens);return{input:X,cachedInput:W,output:q,total:Y(Q.totalTokens)||X+W+q}}function XY(Q){if(Q.tokenUsageByThread.size===0)return null;let Y={input:0,cachedInput:0,output:0,total:0};for(let X of Q.tokenUsageByThread.values())Y.input+=X.input,Y.cachedInput+=X.cachedInput,Y.output+=X.output,Y.total+=X.total;return Y}function T9(Q){return String(Q??"").replace(/\s+/g," ").trim()}function t0(Q){if(!Q)return[];if(typeof Q==="string"){let Y=T9(Q);return Y?[Y]:[]}if(Array.isArray(Q))return Q.flatMap((Y)=>t0(Y));if(typeof Q==="object"){let Y=Q;if(typeof Y.text==="string")return t0(Y.text);if("summary"in Y)return t0(Y.summary);if("content"in Y)return t0(Y.content);if("parts"in Y)return t0(Y.parts)}return[]}function WY(Q,Y){let X=[];for(let W of[...Q,...Y]){let q=T9(W);if(!q||X.includes(q))continue;X.push(q)}return X}function R0(Q,Y,X=null,W={}){if(!Q||!Y)return;Q({message:Y,phase:X,...W})}function qY(Q){switch(Q.type){case"commandExecution":return{message:`Running command: ${String(Q.command??"").trim()}`,phase:"running"};case"fileChange":return{message:`Applying ${Q.changes.length} file change(s).`,phase:"editing"};case"mcpToolCall":return{message:`Calling ${Q.server}/${Q.tool}.`,phase:"investigating"};case"dynamicToolCall":return{message:`Running tool: ${Q.tool}.`,phase:"investigating"};case"webSearch":return{message:`Searching: ${String(Q.query??"").trim()}`,phase:"investigating"};default:return null}}function KY(Q){switch(Q.type){case"commandExecution":{let Y=String(Q.aggregatedOutput??"").trim();return{message:`Command ${Q.status==="completed"?"completed":Q.status}: ${String(Q.command??"").trim()} (exit ${Q.exitCode??"?"})`+(Y?`
|
|
54
|
+
${Y}`:""),phase:"running"}}case"fileChange":return{message:`File changes ${Q.status}.`,phase:"editing"};case"mcpToolCall":return{message:`Tool ${Q.server}/${Q.tool} ${Q.status}.`,phase:"investigating"};case"dynamicToolCall":return{message:`Tool ${Q.tool} ${Q.status}.`,phase:"investigating"};default:return null}}function zY(Q,Y={}){let X,W,q=new Promise((K,G)=>{X=K,W=G});return{threadId:Q,rootThreadId:Q,threadIds:new Set([Q]),threadTurnIds:new Map,turnId:null,bufferedNotifications:[],completion:q,resolveCompletion:X,rejectCompletion:W,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:Y.onProgress??null,onHeartbeat:Y.onHeartbeat??null}}function Y4(Q){if(Q.completionTimer)clearTimeout(Q.completionTimer),Q.completionTimer=null}function X4(Q,Y=null){if(Q.completed)return;if(Y4(Q),Q.completed=!0,Y){if(Q.finalTurn=Y,!Q.turnId)Q.turnId=Y.id??null}else if(!Q.finalTurn)Q.finalTurn={id:Q.turnId??"inferred-turn",status:"completed"};Q.resolveCompletion(Q)}function Q4(Q){if(Q.completed||Q.finalTurn||!Q.finalAnswerSeen)return;if(Q.pendingCollaborations.size>0||Q.activeSubagentTurns.size>0)return;Y4(Q),Q.completionTimer=setTimeout(()=>{if(Q.completionTimer=null,Q.completed||Q.finalTurn||!Q.finalAnswerSeen)return;if(Q.pendingCollaborations.size>0||Q.activeSubagentTurns.size>0)return;X4(Q,null)},250),Q.completionTimer.unref?.()}function E9(Q,Y){let X=_9(Y);if(!X||!Q.threadIds.has(X))return!1;let W=Q.threadTurnIds.get(X)??null,q=eQ(Y);return W===null||q===null||q===W}function M9(Q,Y,X,W=null){if(Y.id)Q.itemIndex.set(Y.id,Y);if(Y.type==="collabAgentToolCall"){if(!W||W===Q.threadId){if(X==="started"||Y.status==="inProgress")Q.pendingCollaborations.add(Y.id);else if(X==="completed")Q.pendingCollaborations.delete(Y.id),Q4(Q)}for(let q of Y.receiverThreadIds??[])Q.threadIds.add(q)}if(Y.type==="agentMessage"){if(Y.text&&(!W||W===Q.threadId)){if(Q.lastAgentMessage=Y.text,X==="completed"&&Y.phase==="final_answer")Q.finalAnswerSeen=!0,Q4(Q)}return}if(Y.type==="reasoning"&&X==="completed"){Q.reasoningSummary=WY(Q.reasoningSummary,t0(Y.summary));return}if(Y.type==="fileChange"&&X==="completed"){Q.fileChanges.push(Y);return}if(Y.type==="commandExecution"&&X==="completed")Q.commandExecutions.push(Y)}function e3(Q,Y){switch(Q.onHeartbeat?.(),Y.method){case"thread/started":Q.threadIds.add(Y.params.thread.id);break;case"turn/started":if(Q.threadIds.add(Y.params.threadId),Q.threadTurnIds.set(Y.params.threadId,Y.params.turn.id),(Y.params.threadId??null)!==Q.threadId)Q.activeSubagentTurns.add(Y.params.threadId);R0(Q.onProgress,`Turn started (${Y.params.turn.id}).`,"starting",{threadId:Y.params.threadId??null,turnId:Y.params.turn.id??null});break;case"item/started":M9(Q,Y.params.item,"started",Y.params.threadId??null);{let X=qY(Y.params.item);R0(Q.onProgress,X?.message,X?.phase??null)}break;case"item/completed":M9(Q,Y.params.item,"completed",Y.params.threadId??null);{let X=KY(Y.params.item);R0(Q.onProgress,X?.message,X?.phase??null)}break;case"thread/tokenUsage/updated":{let X=YY(Y.params?.tokenUsage?.total??Y.params?.tokenUsage),W=_9(Y);if(X&&W)Q.tokenUsageByThread.set(W,X);break}case"error":Q.error=Y.params.error,R0(Q.onProgress,`Codex error: ${Y.params.error.message}`,"failed");break;case"turn/completed":if((Y.params.threadId??null)!==Q.threadId){Q.activeSubagentTurns.delete(Y.params.threadId),Q4(Q);break}R0(Q.onProgress,`Turn ${Y.params.turn.status}.`,"finalizing"),X4(Q,Y.params.turn);break;default:break}}async function GY(Q,Y,X,W={}){let q=zY(Y,W),K=Q.notificationHandler;Q.setNotificationHandler((z)=>{if(!q.turnId){q.bufferedNotifications.push(z);return}if(z.method==="thread/started"){e3(q,z);return}if(!E9(q,z)){K?.(z);return}e3(q,z)});let G=W.onApprovalRequest;if(G)Q.setServerRequestHandler((z,$)=>G(z,$,q));try{let z=await X();if(q.turnId=z.turn?.id??null,q.turnId)q.threadTurnIds.set(q.threadId,q.turnId);for(let $ of q.bufferedNotifications)if(E9(q,$))e3(q,$);else K?.($);if(q.bufferedNotifications.length=0,z.turn?.status&&z.turn.status!=="inProgress")X4(q,z.turn);return await q.completion}finally{Y4(q),Q.setNotificationHandler(K??null),Q.setServerRequestHandler(null)}}async function $Y(Q,Y){let X=null;try{X=await x0.connect(Q);let W=await Y(X);return await X.close(),W}catch(W){let q=W,K=X?.transport==="broker"||Boolean(process.env[s2]),G=X?.transport==="broker"&&q?.rpcCode===O9||K&&(q?.code==="ENOENT"||q?.code==="ECONNREFUSED");if(X)await X.close().catch(()=>{}),X=null;if(!G)throw W;let z=await x0.connect(Q,{disableBroker:!0});try{return await Y(z)}finally{await z.close()}}}function B0(Q){let Y=i3("codex",["--version"],{cwd:Q});if(!Y.available)return Y;let X=i3("codex",["app-server","--help"],{cwd:Q});if(!X.available)return{available:!1,detail:`${Y.detail}; app-server runtime unavailable: ${X.detail}`};return{available:!0,detail:`${Y.detail}; app-server runtime available`}}async function I9(Q){let Y=B0(Q);if(!Y.available)return{available:!1,loggedIn:!1,detail:Y.detail};let X=null;try{X=await x0.connect(Q,{reuseExistingBroker:!0});let W=await X.request("account/read",{refreshToken:!1}),q=W?.account??null;if(q?.type==="chatgpt")return{available:!0,loggedIn:!0,detail:q.email?`ChatGPT login active for ${q.email}`:"ChatGPT login active"};if(q?.type==="apiKey")return{available:!0,loggedIn:!0,detail:"API key configured"};if(W?.requiresOpenaiAuth===!1)return{available:!0,loggedIn:!0,detail:"Active provider does not require OpenAI authentication"};return{available:!0,loggedIn:!1,detail:"Not authenticated. Run `codex login`."}}catch(W){let q=oQ("codex",["login","status"],{encoding:"utf8"}),K=`${q.stdout??""}${q.stderr??""}`.trim();if(q.status===0)return{available:!0,loggedIn:!0,detail:K||"Logged in"};return{available:!0,loggedIn:!1,detail:K||(W instanceof Error?W.message:String(W))}}finally{await X?.close().catch(()=>{})}}async function w9(Q,{threadId:Y,turnId:X}){if(!Y||!X)return{interrupted:!1,detail:"missing threadId or turnId"};let W=null;try{return W=await x0.connect(Q,{reuseExistingBroker:!0}),await W.request("turn/interrupt",{threadId:Y,turnId:X}),{interrupted:!0,detail:`Interrupted ${X} on ${Y}.`}}catch(q){return{interrupted:!1,detail:q instanceof Error?q.message:String(q)}}finally{await W?.close().catch(()=>{})}}async function S9(Q,{threadId:Y,text:X}){if(!Y)return{steered:!1,detail:"missing threadId"};let W=X.trim();if(!W)return{steered:!1,detail:"empty follow-up"};let q=null;try{return q=await x0.connect(Q,{reuseExistingBroker:!0}),await q.request("turn/steer",{threadId:Y,input:[{type:"text",text:W,text_elements:[]}]}),{steered:!0,detail:`Steered follow-up into the active turn on ${Y}.`}}catch(K){return{steered:!1,detail:K instanceof Error?K.message:String(K)}}finally{await q?.close().catch(()=>{})}}async function C9(Q,Y={}){let X=B0(Q);if(!X.available)throw Error(`Codex CLI is not available: ${X.detail}`);let W=Y.prompt?.trim();if(!W)throw Error("A prompt is required.");return $Y(Q,async(q)=>{let K;if(Y.resumeThreadId){if(R0(Y.onProgress,`Resuming thread ${Y.resumeThreadId}.`,"starting"),I4(Y.resumeThreadId))await w4(Y.resumeThreadId);K=(await q.request("thread/resume",{threadId:Y.resumeThreadId,cwd:Q,model:Y.model??null,modelProvider:Y.modelProvider??null,config:Y.configOverrides??null,approvalPolicy:Y.approvalPolicy??"never",sandbox:Y.sandbox??"read-only"})).thread.id}else{R0(Y.onProgress,"Starting Codex task thread.","starting"),K=(await q.request("thread/start",{cwd:Q,model:Y.model??null,modelProvider:Y.modelProvider??null,config:Y.configOverrides??null,approvalPolicy:Y.approvalPolicy??"never",sandbox:Y.sandbox??"read-only",serviceName:iQ,ephemeral:Y.ephemeral??!1})).thread.id;try{await q.request("thread/name/set",{threadId:K,name:sQ(W)})}catch($){let B=String($?.message??$??"");if(!B.includes("unknown variant")&&!B.includes("unknown method"))throw $}}R0(Y.onProgress,`Thread ready (${K}).`,"starting",{threadId:K});let G=await GY(q,K,()=>q.request("turn/start",{threadId:K,input:[{type:"text",text:W,text_elements:[]}],model:Y.model??null,effort:Y.effort??null,outputSchema:Y.outputSchema??null}),{onProgress:Y.onProgress,onHeartbeat:Y.onHeartbeat,onApprovalRequest:Y.onApprovalRequest});return{status:G.finalTurn?.status==="completed"?0:1,threadId:K,turnId:G.turnId,finalMessage:G.lastAgentMessage,reasoningSummary:G.reasoningSummary,turn:G.finalTurn,error:G.error,stderr:tQ(q.stderr),fileChanges:G.fileChanges,touchedFiles:QY(G.fileChanges),tokens:XY(G),model:Y.model??null,commandExecutions:G.commandExecutions}})}import{spawn as PY,spawnSync as u9}from"node:child_process";import{randomUUID as OY}from"node:crypto";import E2 from"node:fs";import e2 from"node:path";var q4={chain:["codex","claude"],agents:{codex:{model:"gpt-5.6-terra",effort:"high",permissions:"auto"},claude:{model:"opus",effort:"medium",permissions:"auto"}},models:{},approvals:{escalationTimeoutMs:120000,allowedNetworkHosts:[]}},a0={spark:"gpt-5.3-codex-spark",luna:"gpt-5.6-luna",terra:"gpt-5.6-terra",sol:"gpt-5.6-sol"},K4=new Set(["low","medium","high"]),M2={sonnet:"sonnet",opus:"opus",fable:"fable"},z4=new Set(["low","medium","high"]),_2={"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"}},G4={"read-only":["--permission-mode","dontAsk","--disallowedTools","Edit","Write","NotebookEdit"],"workspace-write":["--permission-mode","acceptEdits"],auto:["--permission-mode","auto"]},x9=/failIfUnavailable|sandbox\b[^.\n]*?(?:failed|could ?n[o']t|cannot|unavailable|not available|not supported)/i;function k9(Q,Y){if(Q!=="read-only")return null;return JSON.stringify({sandbox:{enabled:!0,failIfUnavailable:!0,autoAllowBashIfSandboxed:!0,filesystem:{denyWrite:[Y]}}})}var s5=n0(["codex","claude"]),BY=n0(["codex","claude","custom"]),HY=n0(["low","medium","high"]),NY=n0(["read-only","workspace-write","auto"]),W4=A2(d0({model:P0().check(r0(1)),effort:HY,permissions:NY})),JY=d0({baseUrl:a1(),model:P0().check(r0(1)),envKey:d(P0().check(r0(1))),wireApi:d(n0(["chat","responses"]))}),j9=d0({escalationTimeoutMs:s1().check(I0()),allowedNetworkHosts:f3(P0())}),VY=d0({chain:f3(BY).check(r0(1)),agents:A2(d0({codex:W4,claude:W4,custom:W4})),models:d(q9(P0().check(u3(/^[a-z][a-z0-9-]*$/,"lowercase kebab-case")),JY)),approvals:j9}),UY=A2(W9(VY,{approvals:A2(j9)}));function s0(Q){let Y=UY.safeParse(Q);if(Y.success)return[];return Y.error.issues.map((X)=>{return`${X.path.join(".")||"config"}: ${X.message}`})}function v9(Q){if(!E2.existsSync(Q))return null;try{return JSON.parse(E2.readFileSync(Q,"utf8"))}catch(Y){let X=Y instanceof Error?Y.message:String(Y);throw Error(`Invalid JSON in ${Q}: ${X}`)}}function h9(Q,Y){if(!Y||typeof Y!=="object"||Array.isArray(Y))return Y??Q;let X={...Q},W=Q;for(let[q,K]of Object.entries(Y))if(K&&typeof K==="object"&&!Array.isArray(K)&&W?.[q]&&typeof W[q]==="object")X[q]=h9(W[q],K);else X[q]=K;return X}function N0(){return e2.join(M0(),"config.json")}function o(Q){let Y=Y0(Q),X=q4;for(let W of[N0(),e2.join(Y,"coder.config.json")]){let q=v9(W);if(!q)continue;let K=s0(q);if(K.length)throw Error(`Invalid config in ${W}:
|
|
55
55
|
${K.join(`
|
|
56
|
-
`)}`);X=
|
|
57
|
-
`,"utf8")
|
|
58
|
-
|
|
56
|
+
`)}`);X=h9(X,q)}return X}function T2(Q){return Q.replace(/\/+$/,"").replace(/\/(chat\/completions|completions|responses)$/,"")}function b9(Q,Y,X){let W=[e2.join(Y0(Q),"coder.config.json"),N0()];for(let q of W){let K;try{K=v9(q)}catch{continue}if(!K?.models?.[Y])continue;if(Object.assign(K.models[Y],X),s0(K).length)return!1;return E2.writeFileSync(q,`${JSON.stringify(K,null,2)}
|
|
57
|
+
`,"utf8"),!0}return!1}function LY(Q){return/\/(chat\/completions|completions|responses)\/*$/.test(Q)}function e0(Q,Y){let X=T2(Q);if(LY(Q)||/\/v\d+(alpha|beta)?$/.test(X))return[`${X}/${Y}`];return[`${X}/${Y}`,`${X}/v1/${Y}`]}function g9(Q,Y,X){let W=Y?Q.models?.[Y]:void 0;if(!Y||!W)return null;let q=`coder-${Y}`;return{model:W.model,modelProvider:q,configOverrides:{[`model_providers.${q}`]:{name:Y,base_url:X?.url??T2(W.baseUrl),...W.envKey&&!X?{env_key:W.envKey}:{},wire_api:"responses"}}}}function y9(Q){if(!Q)return null;return a0[Q]??Q}function m9(Q){let Y=N0();return E2.mkdirSync(e2.dirname(Y),{recursive:!0}),E2.writeFileSync(Y,`${JSON.stringify(Q,null,2)}
|
|
58
|
+
`,"utf8"),Y}function ZY(Q){if(typeof Q==="string")return Q;if(Array.isArray(Q))return Q.map((Y)=>typeof Y?.text==="string"?Y.text:"").join("");return Q==null?"":JSON.stringify(Q)}function AY(Q){if(!Q||typeof Q!=="object")return null;let Y=(K)=>typeof K==="number"&&Number.isFinite(K)?K:0,X=Y(Q.input_tokens),W=Y(Q.cache_read_input_tokens)+Y(Q.cache_creation_input_tokens),q=Y(Q.output_tokens);return{input:X,cachedInput:W,output:q,total:X+W+q}}function Q2(){let Q=u9("claude",["--version"],{encoding:"utf8"});if(Q.error||Q.status!==0)return{available:!1,detail:"claude CLI not found on PATH (npm install -g @anthropic-ai/claude-code)"};return{available:!0,detail:String(Q.stdout||"").trim()}}function c9(){let Q=u9("claude",["auth","status","--json"],{encoding:"utf8"});if(Q.error||Q.status!==0)return{loggedIn:!1,detail:"not logged in"};try{let Y=JSON.parse(String(Q.stdout||""));if(!Y.loggedIn)return{loggedIn:!1,detail:"not logged in"};return{loggedIn:!0,detail:[Y.email,Y.subscriptionType].filter(Boolean).join(", ")||"logged in"}}catch{return{loggedIn:!1,detail:"unknown"}}}async function f9(Q,Y){let X=Y.resumeSessionId??OY(),W=["-p",Y.prompt,"--output-format","stream-json","--verbose"];if(W.push(Y.resumeSessionId?"--resume":"--session-id",X),Y.model)W.push("--model",Y.model);if(Y.effort)W.push("--effort",Y.effort);let q=Y.permissions??"auto";W.push(...G4[q]??G4.auto);let K=k9(q,Q);if(K)W.push("--settings",K);return Y.onProgress?.({message:`claude turn started (session ${X})`,threadId:X}),new Promise((G,z)=>{let $=PY("claude",W,{cwd:Q,stdio:["ignore","pipe","pipe"]}),B="",N="",H=null,V=X,J=(L)=>{if(!L||typeof L!=="object")return;if(Y.onHeartbeat?.(),L.type==="system"&&L.subtype==="init"&&L.session_id)V=L.session_id;else if(L.type==="assistant"){for(let P of L.message?.content??[])if(P?.type==="tool_use")Y.onProgress?.({message:`${P.name} ${JSON.stringify(P.input??{})}`,threadId:V})}else if(L.type==="user"){for(let P of L.message?.content??[])if(P?.type==="tool_result"){let Z=ZY(P.content).trim();if(Z)Y.onProgress?.({message:Z,threadId:V})}}else if(L.type==="result"){if(H=L,L.session_id)V=L.session_id}};$.stdout.on("data",(L)=>{B+=L;let P;while((P=B.indexOf(`
|
|
59
|
+
`))>=0){let Z=B.slice(0,P).trim();if(B=B.slice(P+1),!Z)continue;try{J(JSON.parse(Z))}catch{}}}),$.stderr.on("data",(L)=>{N+=L});let U=()=>{$.kill("SIGTERM"),process.exit(143)};process.on("SIGTERM",U),$.on("error",(L)=>{process.removeListener("SIGTERM",U),z(Error(`claude spawn failed: ${L.message}`))}),$.on("close",(L)=>{process.removeListener("SIGTERM",U);let P=B.trim();if(P)try{J(JSON.parse(P))}catch{}let Z=H?.result??"",A=L!==0||H?.is_error===!0||H==null;G({status:A?1:0,threadId:H?.session_id??V,turnId:null,finalMessage:Z,tokens:AY(H?.usage),model:H?.modelUsage&&Object.keys(H.modelUsage).join("+")||Y.model||null,error:A?{message:Z||N.trim()||`claude exited ${L}`}:null})})})}import Y2 from"node:fs";import DY from"node:os";import Q3 from"node:path";import{spawnSync as X2}from"node:child_process";function Y3(Q){X2("claude",["plugin","marketplace","remove","coder-plugins"],{encoding:"utf8"});let Y=X2("claude",["plugin","marketplace","add",Q],{encoding:"utf8"}),X=X2("claude",["plugin","install","coder@coder-plugins"],{encoding:"utf8"}),W=Y.status===0&&X.status===0;return{marketplace:Q,installed:W,note:W?"Plugin installed; restart any running Claude Code session to load it.":`Automatic install failed (${(X.stderr||Y.stderr||"claude not found").trim()}); run: claude plugin marketplace add "${Q}" && claude plugin install coder@coder-plugins`}}function X3(){return Q3.join(DY.homedir(),".agents","skills","coder")}function $4(){try{let Q=Y2.readFileSync(Q3.join(X3(),"SKILL.md"),"utf8");return/^\s*version:\s*(\S+)/m.exec(Q)?.[1]??null}catch{return null}}function W3(Q){let Y=X3();try{let X=Q3.join(Q,"plugins","agents","skills","coder");Y2.rmSync(Y,{recursive:!0,force:!0}),Y2.mkdirSync(Y,{recursive:!0}),Y2.cpSync(X,Y,{recursive:!0});let W=Q3.join(Y,"SKILL.md"),q=Y2.readFileSync(W,"utf8").replace(`
|
|
59
60
|
---
|
|
60
61
|
`,`
|
|
61
62
|
metadata:
|
|
62
63
|
version: ${a()}
|
|
63
64
|
---
|
|
64
|
-
`);return
|
|
65
|
-
`);this.buffer=Y.pop()??"";for(let X of Y){let W=X.trim();if(!W.startsWith("data:"))continue;let q=W.slice(5).trim();if(!q||q==="[DONE]")continue;let K;try{K=JSON.parse(q)}catch{continue}if(K.usage)this.usage=K.usage;let G=K.choices?.[0]?.delta;if(!G)continue;if(typeof G.content==="string"&&G.content){if(!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+=G.content,this.send({type:"response.output_text.delta",item_id:"msg_bridge_0",output_index:0,content_index:0,delta:G.content})}for(let z of G.tool_calls??[]){let $=this.toolCalls.get(z.index)??{id:"",name:"",args:""};if(z.id)$.id=z.id;if(z.function?.name)$.name+=z.function.name;if(z.function?.arguments)$.args+=z.function.arguments;this.toolCalls.set(z.index,$)}}}finish(){let Q=[];if(this.text){let X={type:"message",id:"msg_bridge_0",status:"completed",role:"assistant",content:[{type:"output_text",text:this.text,annotations:[]}]};Q.push(X),this.send({type:"response.output_item.done",output_index:0,item:X})}let Y=Q.length;for(let X of this.toolCalls.values()){let W={type:"function_call",id:`fc_bridge_${Y}`,call_id:X.id||`call_bridge_${Y}`,name:X.name,arguments:X.args||"{}",status:"completed"};Q.push(W),this.send({type:"response.output_item.done",output_index:Y,item:W}),Y+=1}this.send({type:"response.completed",response:{id:this.responseId,object:"response",status:"completed",model:this.model,output:Q,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
|
|
65
|
+
`);return Y2.writeFileSync(W,q),{marketplace:Y,installed:!0,note:"Skill installed to ~/.agents/skills/coder; restart running sessions to load it."}}catch(X){return{marketplace:Y,installed:!1,note:`Skill install failed: ${X instanceof Error?X.message:String(X)}`}}}function q3(Q){if(Q.available)return null;let Y=X2("npm",["install","-g","@openai/codex@latest"],{encoding:"utf8"});return Y.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: ${(Y.stderr||"npm not found").trim()}. Run: npm install -g @openai/codex`}}var p9="0.144.0";function FY(Q){let Y=/(\d+\.\d+\.\d+)/.exec(String(Q??""));return Y?Y[1]:null}function l9(Q){if(!Q.available)return null;let Y=FY(Q.detail);if(!Y||D3(Y,p9)>=0)return null;let X=X2("codex",["update"],{encoding:"utf8"});if(X.status!==0)X=X2("npm",["install","-g","@openai/codex@latest"],{encoding:"utf8"});return X.status===0?{updated:!0,from:Y}:{updated:!1,from:Y,note:`codex ${Y} is too old for the default GPT-5.6 model (needs >= ${p9}); auto-update failed: ${(X.stderr||"codex/npm not found").trim()}. Run: codex update`}}import RY from"node:http";import EY from"node:process";var MY=0;function _Y(Q){let Y=[];if(typeof Q.instructions==="string"&&Q.instructions)Y.push({role:"system",content:Q.instructions});let X=Array.isArray(Q.input)?Q.input:[];for(let W of X)switch(W?.type){case"message":{let q=Array.isArray(W.content)?W.content.map((K)=>K?.text??"").join(""):String(W.content??"");Y.push({role:W.role==="developer"?"system":W.role,content:q});break}case"function_call":{let q={id:W.call_id,type:"function",function:{name:W.name,arguments:W.arguments??"{}"}},K=Y.at(-1);if(K?.role==="assistant"&&K.tool_calls)K.tool_calls.push(q);else Y.push({role:"assistant",content:null,tool_calls:[q]});break}case"function_call_output":{let q=W.output;Y.push({role:"tool",tool_call_id:W.call_id,content:typeof q==="string"?q:JSON.stringify(q??"")});break}default:break}return Y}function TY(Q){let Y=(Array.isArray(Q.tools)?Q.tools:[]).filter((W)=>W?.type==="function").map((W)=>({type:"function",function:{name:W.name,description:W.description??"",parameters:W.parameters??{type:"object",properties:{}}}})),X=Q.text?.format;return{model:Q.model,messages:_Y(Q),...Y.length?{tools:Y,tool_choice:Q.tool_choice??"auto"}:{},...typeof Q.parallel_tool_calls==="boolean"?{parallel_tool_calls:Q.parallel_tool_calls}:{},...X?.type==="json_schema"?{response_format:{type:"json_schema",json_schema:{name:X.name,schema:X.schema,strict:X.strict??!1}}}:{},stream:!0,stream_options:{include_usage:!0}}}class r9{send;model;responseId=`resp_bridge_${++MY}`;text="";textOpen=!1;toolCalls=new Map;usage=null;buffer="";constructor(Q,Y){this.model=Q,this.send=Y,this.send({type:"response.created",response:{id:this.responseId,object:"response",status:"in_progress",model:Q,output:[]}})}push(Q){this.buffer+=Q;let Y=this.buffer.split(`
|
|
66
|
+
`);this.buffer=Y.pop()??"";for(let X of Y){let W=X.trim();if(!W.startsWith("data:"))continue;let q=W.slice(5).trim();if(!q||q==="[DONE]")continue;let K;try{K=JSON.parse(q)}catch{continue}if(K.usage)this.usage=K.usage;let G=K.choices?.[0]?.delta;if(!G)continue;if(typeof G.content==="string"&&G.content){if(!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+=G.content,this.send({type:"response.output_text.delta",item_id:"msg_bridge_0",output_index:0,content_index:0,delta:G.content})}for(let z of G.tool_calls??[]){let $=this.toolCalls.get(z.index)??{id:"",name:"",args:""};if(z.id)$.id=z.id;if(z.function?.name)$.name+=z.function.name;if(z.function?.arguments)$.args+=z.function.arguments;this.toolCalls.set(z.index,$)}}}finish(){let Q=[];if(this.text){let X={type:"message",id:"msg_bridge_0",status:"completed",role:"assistant",content:[{type:"output_text",text:this.text,annotations:[]}]};Q.push(X),this.send({type:"response.output_item.done",output_index:0,item:X})}let Y=Q.length;for(let X of this.toolCalls.values()){let W={type:"function_call",id:`fc_bridge_${Y}`,call_id:X.id||`call_bridge_${Y}`,name:X.name,arguments:X.args||"{}",status:"completed"};Q.push(W),this.send({type:"response.output_item.done",output_index:Y,item:W}),Y+=1}this.send({type:"response.completed",response:{id:this.responseId,object:"response",status:"completed",model:this.model,output:Q,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 d9(Q,Y="chat"){let X=Y==="responses",W=e0(Q.baseUrl,X?"responses":"chat/completions"),q=null,K=Q.envKey?EY.env[Q.envKey]:void 0;async function G(N){let H=q?[q]:W,V=null;for(let J of H)if(V=await fetch(J,{method:"POST",headers:{"content-type":"application/json",...K?{authorization:`Bearer ${K}`}:{}},body:N}),V.status!==404)return q=J,V;return V}let z=RY.createServer((N,H)=>{if(N.method!=="POST"||!N.url?.replace(/\/+$/,"").endsWith("/responses")){H.writeHead(404,{"content-type":"application/json"}),H.end(JSON.stringify({error:{message:"coder chat bridge: only POST /responses is supported"}}));return}let V="";N.on("data",(J)=>V+=J),N.on("end",async()=>{let J;try{J=JSON.parse(V)}catch{H.writeHead(400,{"content-type":"application/json"}),H.end(JSON.stringify({error:{message:"invalid JSON"}}));return}try{if(X){let Z=await G(V);if(H.writeHead(Z.status,{"content-type":Z.headers.get("content-type")??"application/json","cache-control":"no-store"}),Z.body)for await(let A of Z.body)H.write(A);H.end();return}let U=await G(JSON.stringify(TY(J)));if(!U.ok||!U.body){let Z=await U.text().catch(()=>"");H.writeHead(U.status,{"content-type":"application/json"}),H.end(Z||JSON.stringify({error:{message:`upstream HTTP ${U.status}`}}));return}H.writeHead(200,{"content-type":"text/event-stream","cache-control":"no-store"});let L=new r9(J.model,(Z)=>H.write(`data: ${JSON.stringify(Z)}
|
|
66
67
|
|
|
67
|
-
`)),
|
|
68
|
+
`)),P=new TextDecoder;for await(let Z of U.body)L.push(P.decode(Z,{stream:!0}));L.finish(),H.end()}catch(U){let L=U instanceof Error?U.message:String(U);H.writeHead(502,{"content-type":"application/json"}),H.end(JSON.stringify({error:{message:`coder chat bridge: ${L}`}}))}})});await new Promise((N)=>z.listen(0,"127.0.0.1",N));let $=z.address();return{url:`http://127.0.0.1:${typeof $==="object"&&$?$.port:0}/v1`,close:()=>new Promise((N)=>{z.close(()=>N()),z.closeAllConnections?.()})}}import IY from"node:process";async function n9(Q,Y,X){let W=Q.envKey?IY.env[Q.envKey]:void 0,q=!1;for(let K of e0(Q.baseUrl,Y))try{let G=await fetch(K,{method:"POST",headers:{"content-type":"application/json",...W?{Authorization:`Bearer ${W}`}:{}},body:JSON.stringify(X),signal:AbortSignal.timeout(5000)});if(q=!0,G.status!==404&&G.status!==405&&G.status!==501)return{baseUrl:K.slice(0,-(Y.length+1))}}catch{}return{reachable:q}}async function K3(Q){let Y=await n9(Q,"responses",{model:Q.model,input:[],stream:!1});if("baseUrl"in Y)return{wireApi:"responses",baseUrl:Y.baseUrl};let X=await n9(Q,"chat/completions",{model:Q.model,messages:[],stream:!1});if("baseUrl"in X)return{wireApi:"chat",baseUrl:X.baseUrl};return Y.reachable||X.reachable?{wireApi:"chat"}:null}var o9=/usage|quota|rate.?limit|429|401|unauthorized|not authenticated|login|insufficient|exhausted|not available|ENOENT/i,i9="CODER_WORKER",SY=`
|
|
68
69
|
You are running inside a coder task: do the work yourself, directly.
|
|
69
70
|
Do not load the coder skill (recursive), and never dispatch through the \`coder\` CLI - nested dispatch is disabled.
|
|
70
71
|
When finished, provide a concise implementation result summary.
|
|
71
|
-
`.trim();function
|
|
72
|
+
`.trim();function t9(Q){if(Q.resumeThreadId)return Q.prompt??"";let Y=Q.system?`
|
|
72
73
|
-------
|
|
73
74
|
${Q.system}`:"";return`<system>
|
|
74
|
-
${
|
|
75
|
+
${SY}${Y}
|
|
75
76
|
</system>
|
|
76
77
|
|
|
77
|
-
${Q.prompt??""}`}function
|
|
78
|
-
`)}}async function
|
|
79
|
-
`)}}),B=Y.model?K.models?.[Y.model]:void 0
|
|
80
|
-
`,"utf8"),V}finally{await N?.close()}}async function
|
|
81
|
-
`,"utf8"),K}function
|
|
82
|
-
`),await
|
|
83
|
-
`);
|
|
84
|
-
`),M=B0(W)}if(!M.available)await z(G.agent,M.detail)}let N=null;if(Y.resume)N=y0(W,Y.resume)?.threadId??Y.resume;let H=
|
|
85
|
-
`),i=
|
|
86
|
-
${i}`:""}`,{hint:`See: coder task result ${H}`})}let
|
|
87
|
-
`);if(Y.wait){if(!Y.json)
|
|
88
|
-
`),
|
|
89
|
-
`);let M=()=>{
|
|
78
|
+
${Q.prompt??""}`}function CY(Q,Y){let X=Q.agent;if(!X&&Q.model){if(Q.model in M2)X="claude";else if(Q.model in a0)X="codex";else if(Q.model in(Y.models??{}))X="custom"}if(X=X??Y.chain[0]??"codex",X!=="codex"&&X!=="claude"&&X!=="custom"){let $=X in a0||X in M2||X in(Y.models??{})?` "${X}" is a model; use --model ${X}.`:"";D(`Invalid --agent "${X}". Use codex, claude, or custom.${$}`)}let W=Y.agents[X]??{},q=Q.model??W.model??null,K=Q.effort??W.effort??null,G=Q.permissions??W.permissions??"auto";if(X==="custom"){let $=Object.keys(Y.models??{});if(!q&&$.length===1)q=$[0];if(!q||!(q in(Y.models??{})))D(q?`No custom model named "${q}". Configured: ${$.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 z=X==="claude"?"claude":"codex";if(!(G in _2))D(`Invalid --permissions "${G}". Use one of: ${Object.keys(_2).join(", ")}`);if(z==="codex"&&K&&!K4.has(K))D(`Invalid codex --effort "${K}". Use one of: ${[...K4].join(", ")}`);if(z==="claude"&&K&&!z4.has(K))D(`Invalid claude --effort "${K}". Use one of: ${[...z4].join(", ")}`);return{engine:z,agent:X,model:q,effort:K,permissions:G}}function a9(Q,Y){let X=0;return()=>{if(Date.now()-X>=1e4)X=Date.now(),h4(Q,Y)}}function s9(Q,Y,{echo:X}){return(W)=>{let q=typeof W==="string"?{message:W}:W;if(V0(Q,Y,q),X&&q.message)v.stderr.write(`[coder] ${q.message}
|
|
79
|
+
`)}}async function xY(Q,Y,{echo:X}){let W=Y0(Q),q=C(Q,Y.id),K=o(Q),G=s9(Q,Y.id,{echo:X}),z=_2[Y.permissions??"auto"]??_2.auto,$=z.approvalPolicy==="never"?void 0:B9({workspaceRoot:W,jobDir:q,mode:z.approvalMode,escalationTimeoutMs:K.approvals.escalationTimeoutMs,allowedNetworkHosts:K.approvals.allowedNetworkHosts,onEvent:(V)=>{if(V0(Q,Y.id,V),X&&V.message)v.stderr.write(`[coder] ${V.message}
|
|
80
|
+
`)}}),B=Y.model?K.models?.[Y.model]:void 0;if(B&&!B.wireApi&&Y.model){let V=await K3(B);if(V)B={...B,...V},K.models[Y.model]=B,b9(Q,Y.model,V),V0(Q,Y.id,{kind:"info",message:`detected wire api for ${Y.model}: ${V.wireApi} @ ${B.baseUrl}`})}if(B?.envKey&&!v.env[B.envKey])throw Error(`Missing environment variable: \`${B.envKey}\`.`);let N=B?await d9(B,B.wireApi??"chat"):null,H=g9(K,Y.model,N??void 0);try{let V=await C9(Q,{prompt:t9(Y),model:H?.model??y9(Y.model),modelProvider:H?.modelProvider??null,configOverrides:H?.configOverrides??null,effort:Y.effort,sandbox:z.sandbox,approvalPolicy:z.approvalPolicy,onApprovalRequest:$,onHeartbeat:a9(Q,Y.id),resumeThreadId:Y.resumeThreadId??null,onProgress:(U)=>{G(U);let L=typeof U==="object"?U.threadId:null,P=typeof U==="object"?U.turnId:null;if(L||P)m(Q,Y.id,{status:"running",...L?{threadId:L}:{},...P?{turnId:P}:{}})}}),J=V.status===0?"completed":"failed";return m(Q,Y.id,{status:J,threadId:V.threadId,turnId:V.turnId,completedAt:new Date().toISOString()}),E0.writeFileSync(I2.join(q,"result.json"),`${JSON.stringify(V,null,2)}
|
|
81
|
+
`,"utf8"),V}finally{await N?.close()}}async function kY(Q,Y,{echo:X}){let W=C(Q,Y.id),q=s9(Q,Y.id,{echo:X}),K=await f9(Q,{prompt:t9(Y),model:Y.model,effort:Y.effort,permissions:Y.permissions,resumeSessionId:Y.resumeThreadId??null,onHeartbeat:a9(Q,Y.id),onProgress:(G)=>{if(q(G),G.threadId)m(Q,Y.id,{status:"running",threadId:G.threadId})}});return m(Q,Y.id,{status:K.status===0?"completed":"failed",threadId:K.threadId,completedAt:new Date().toISOString()}),E0.writeFileSync(I2.join(W,"result.json"),`${JSON.stringify(K,null,2)}
|
|
82
|
+
`,"utf8"),K}function e9(Q){return Q.engine==="claude"?kY:xY}async function jY(Q,Y){for(let X=0;X<2;){let W=r(Q,Y);if(!W||W.status==="failed"||W.status==="cancelled")return;let q=m4(Q,Y);if(q.length===0){X+=1,await new Promise((K)=>setTimeout(K,300));continue}X=0;for(let K of q){let G=m(Q,Y,{status:"running",prompt:K,resumeThreadId:W.threadId??null});V0(Q,Y,{message:"Running steered follow-up."});try{await e9(G)(Q,G,{echo:!1})}catch(z){let $=z instanceof Error?z.message:String(z);m(Q,Y,{status:"failed",error:$}),V0(Q,Y,{kind:"error",message:$});return}}}}async function W2(Q){if(v.env[i9])D("Nested dispatch refused: this shell is already inside a coder task. Do the work yourself, directly in this session - ignore any skill or instruction telling you to orchestrate via the coder CLI.");let{options:Y,positionals:X}=T(Q,S({...b,agent:j,model:j,effort:j,permissions:j,resume:j,host:j,name:j,system:j,background:_,wait:_,"simulate-approval":_})),W=I(Y),q=X.join(" ").trim();if(!q)D("Missing task text.",{hint:['Usage: coder run "<task text>"',"Help: coder task run --help"]});let K=o(W),G=CY(Y,K),z=async(M,u)=>{let c=K.chain[K.chain.indexOf(M)+1];if(!c)E({error:`${M} failed to start: ${u}`,fallback:{action:"run-native-subagent",reason:"no-engine-available",permissions:G.permissions,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.",...Y.system?{system:Y.system}:{},task:q}}),v.exit(3);v.stderr.write(`[coder] ${M} failed to start (${u}); falling back to ${c}.
|
|
83
|
+
`),await W2([q,"--agent",c,"--cwd",W,...Y.wait?["--wait"]:[],...Y.json?["--json"]:[],...Y.permissions?["--permissions",Y.permissions]:[],...Y.system?["--system",Y.system]:[]]),v.exit(0)},$=(M)=>{let u="read-only unavailable on this host: the OS sandbox failed to start (Linux/WSL2 needs bubblewrap + socat). Re-dispatch with --permissions auto (or workspace-write) if writes are acceptable, or install the sandbox deps.";if(Y.json)E({error:u,code:"read-only-unavailable",detail:M});else v.stderr.write(`[coder] ${u}
|
|
84
|
+
`);v.exit(1)},B=(M)=>G.permissions==="read-only"&&x9.test(M??"");{let M=G.engine==="codex"?B0(W):Q2();if(!M.available&&G.model&&G.model in(K.models??{})){let u=q3(M);v.stderr.write(`[coder] ${u.note}
|
|
85
|
+
`),M=B0(W)}if(!M.available)await z(G.agent,M.detail)}let N=null;if(Y.resume)N=y0(W,Y.resume)?.threadId??Y.resume;let H=j4(),V=m(W,H,{status:"queued",kind:"task",name:Y.name??null,system:Y.system??null,agent:G.agent,engine:G.engine,prompt:q,model:G.model,effort:G.effort,permissions:G.permissions,resumeThreadId:N,cwd:W,background:!Y.wait,...Y["simulate-approval"]?{simulateApproval:!0}:{}}),J=C(W,H),U=E0.openSync(I2.join(J,"worker.log"),"a"),L=wY(v.execPath,[A0,"_worker",H,"--cwd",W],{cwd:W,detached:!0,stdio:["ignore",U,U],env:{...v.env,[i9]:"1"}});L.unref(),E0.closeSync(U),m(W,H,{pid:L.pid??null});let P=Number.MAX_SAFE_INTEGER,Z=Date.now()+15000,A=V,R=null,y=null;while(Date.now()<(y??Z)){if(A=r(W,H)??A,A.status==="failed"||A.status==="completed")break;if(A.threadId&&R===null)R=H0(W,H,P).length,y=Date.now()+2000;if(R!==null&&H0(W,H,P).length>R){A=r(W,H)??A;break}await new Promise((M)=>setTimeout(M,150))}if(A.status==="failed"){let M=I2.join(J,"result.json"),u=E0.existsSync(M)?JSON.parse(E0.readFileSync(M,"utf8")).error?.message??"":"",c=H0(W,H,5).map((Q0)=>Q0.message??"").join(`
|
|
86
|
+
`),i=u||c;if(B(i))$(i);if(o9.test(i))await z(G.agent,i);if(Y.json)E({taskId:H,status:"failed",detail:i}),v.exit(1);D(`Task ${H} failed to start.${i?`
|
|
87
|
+
${i}`:""}`,{hint:`See: coder task result ${H}`})}let z0=[` result: coder task result ${H}`,` steer: coder task steer ${H} "<follow-up>"`].join(`
|
|
88
|
+
`);if(Y.wait){if(!Y.json)v.stderr.write(`${O.dim("[coder]")} task ${O.cyan(H)} started (${A.status}); waiting for it to finish — Ctrl-C to detach (it keeps running).
|
|
89
|
+
`),v.stderr.write(`${O.dim(z0)}
|
|
90
|
+
`);let M=()=>{v.stderr.write(`
|
|
90
91
|
${O.dim(`[coder] detached — task still running: coder task result ${H}`)}
|
|
91
|
-
`),
|
|
92
|
+
`),v.exit(130)};v.on("SIGINT",M);let u=await t2(W,A);if(v.off("SIGINT",M),u.reason==="approval")y2(H,u.approval,Y.json);let c=u.job,i=I2.join(J,"result.json"),Q0=E0.existsSync(i)?JSON.parse(E0.readFileSync(i,"utf8")):null,w=Q0?.error?.message??"";if(c.status==="failed"&&B(w))$(w);if(c.status==="failed"&&o9.test(w))await z(G.agent,w);if(Y.json)E({taskId:H,status:c.status,finalMessage:Q0?.finalMessage,...w?{error:w}:{},tokens:Q0?.tokens??null,model:Q0?.model??c.model??null});else{v.stdout.write(`
|
|
92
93
|
${Q0?.finalMessage||(w?`${O.red("error:")} ${w}`:"(no final message)")}
|
|
93
94
|
|
|
94
|
-
`);let t=Q0?.tokens?` tokens=${
|
|
95
|
-
`)}
|
|
96
|
-
`),
|
|
97
|
-
`)}async function
|
|
98
|
-
`);let
|
|
95
|
+
`);let t=Q0?.tokens?` tokens=${u0(Q0.tokens,Q0.model??c.model)}`:"";v.stderr.write(`${O.dim(`[coder] task=${H} status=${c.status}${t}`)}
|
|
96
|
+
`)}v.exit(c.status==="completed"?0:1)}if(Y.json){E({taskId:H,status:A.status,startupCheck:A.threadId?"passed":"pending",commands:{result:`coder task result ${H}`,steer:`coder task steer ${H} "<follow-up>"`,stop:`coder task stop ${H}`,watch:`coder task stream ${H}`}});return}v.stdout.write(`${O.dim("[coder]")} task ${O.cyan(H)} started in the background (${A.status}).
|
|
97
|
+
`),v.stdout.write(`${O.dim(z0)}
|
|
98
|
+
`)}async function Q8(Q){let{options:Y,positionals:X}=T(Q,S({cwd:j})),W=I(Y),q=X[0],K=r(W,q);if(!K)D(`Worker: task ${q} not found.`);m(W,q,{status:"running",pid:v.pid});try{if(K.simulateApproval){let G=await $9(C(W,q),{onEvent:(z)=>V0(W,q,z)});if(V0(W,q,{message:`simulated approval: ${G}`}),G==="decline"){m(W,q,{status:"cancelled",completedAt:new Date().toISOString(),error:"simulated approval denied"});return}}await e9(K)(W,K,{echo:!1}),await jY(W,q)}catch(G){let z=G instanceof Error?G.message:String(G);m(W,q,{status:"failed",error:z}),V0(W,q,{kind:"error",message:z}),v.exit(1)}}import Y8 from"node:fs";import vY from"node:path";import z3 from"node:process";async function B4(Q){let{options:Y,positionals:X}=T(Q,S({...b,tail:d(S0([C0("all"),O0.number().check(w0(),Z2())],{error:'expected a number or "all"'})),wait:_}));f(X,1,"task result");let W=I(Y),q=p(W,X[0]);if(Y.wait){if(J0.includes(q.status))z3.stderr.write(`${O.dim(`[coder] waiting for task ${q.id} to finish...`)}
|
|
99
|
+
`);let A=await t2(W,q);if(q=A.job,A.reason==="approval")y2(q.id,A.approval,Y.json)}let K=Y.tail===void 0?0:Y.tail==="all"?Number.MAX_SAFE_INTEGER:Y.tail,G=K>0?H0(W,q.id,K):[],z=o0(C(W,q.id)).filter((A)=>!A.response),$=vY.join(C(W,q.id),"result.json"),B=Y8.existsSync($)?JSON.parse(Y8.readFileSync($,"utf8")):null,N=J0.includes(q.status),H=N?H0(W,q.id,1)[0]:void 0,V=N?x2(W,q):q.updatedAt,J=B2(V),U=N&&z.length===0&&J>b2,L=()=>{if(Y.wait)z3.exit(q.status==="completed"?0:1)};if(Y.json)return E({taskId:q.id,name:q.name??null,prompt:q.prompt??null,system:q.system??null,status:q.status,agent:q.agent,model:q.model??null,...N?{idleMs:J,lastActivityAt:V??null,stalled:U}:{},pendingApprovals:z.map((A)=>({id:A.id,summary:A.summary})),...G.length?{steps:G}:{},result:B}),L();let P=O,Z=[`${P.dim("task")} ${P.cyan(q.id)}`,...q.name?[`${P.dim("name")} ${q.name}`]:[],`${P.dim("status")} ${g2(q.status)}`,`${P.dim("agent")} ${(q.agent??"-")+(q.model?`/${q.model}`:"")}`,...B?.tokens?[`${P.dim("tokens")} ${u0(B.tokens,B.model??q.model)}`]:[]];if(q.prompt)Z.push("",...h2(q.prompt,P));if(z.length){Z.push("",P.dim("pending approvals:"));for(let A of z)Z.push(` ${P.cyan(A.id)} ${A.summary}`)}if(G.length){Z.push("",P.dim("steps:"));for(let A of G){let R=A.message??A.kind;if(R)Z.push(` ${P.dim(c0(R))}`)}}if(N&&H){let A=H.message??H.kind??"";Z.push(`${P.dim("last")} ${P.dim(`${c0(A)} (${H2(J)} ago)`)}`)}if(Z.push(""),B)Z.push(v2(B,q.error,"(no final message)",P));else if(N)Z.push(P.dim(U?`Result pending, but no progress for ${H2(J)} — the task may be stalled.`:"Result pending — task is still running."));else Z.push(P.dim("(no result)"));if(N&&!Y.wait){let A=[`Wait for it: coder task result ${q.id} --wait`,`Follow live: coder task stream ${q.id}`];if(U)A.push(`Check the transcript: coder task result ${q.id} --tail all`);Z.push("",_0(A,P))}if(z3.stdout.write(`${Z.join(`
|
|
99
100
|
`)}
|
|
100
|
-
`),B?.touchedFiles?.length)
|
|
101
|
-
`);return L()}import
|
|
102
|
-
`)}else{let Z
|
|
103
|
-
`)}H=P.length},J=q;if(!Y.json){if(
|
|
104
|
-
`),q.prompt)
|
|
101
|
+
`),B?.touchedFiles?.length)z3.stderr.write(`[coder] touched files: ${B.touchedFiles.join(", ")}
|
|
102
|
+
`);return L()}import X8 from"node:fs";import hY from"node:path";import k0 from"node:process";async function G3(Q){let{options:Y,positionals:X}=T(Q,S({...b,tail:d(S0([C0("all"),O0.number().check(w0(),Z2())],{error:'expected a number or "all"'})),trim:d(S0([C0("none"),O0.number().check(w0(),I0())],{error:'expected a positive integer or "none"'}))}));f(X,1,"task stream");let W=I(Y),q=p(W,X[0]),K=new Set(["completed","failed","cancelled"]),G=Number.MAX_SAFE_INTEGER,z=Y.tail,$=z===void 0?1:z==="all"?G:z,B=Y.trim,N=B===void 0?_3:B==="none"?Number.MAX_SAFE_INTEGER:B,H=Math.max(0,H0(W,q.id,G).length-$),V=()=>{let P=H0(W,q.id,G);for(let Z of P.slice(H))if(Y.json){let A=Z.message?{...Z,message:c0(Z.message,N,{plain:!0})}:Z;k0.stdout.write(`${JSON.stringify(A)}
|
|
103
|
+
`)}else{let A=Z.message??Z.kind;if(A)k0.stdout.write(`${O.dim("[coder]")} ${c0(A,N)}
|
|
104
|
+
`)}H=P.length},J=q;if(!Y.json){if(k0.stdout.write(`${O.dim(`[coder] task ${q.id} ${J.status} — streaming (Ctrl-C to stop)`)}
|
|
105
|
+
`),q.prompt)k0.stdout.write(`${h2(q.prompt,O).join(`
|
|
105
106
|
`)}
|
|
106
|
-
`)}V();while(!K.has(J.status))await new Promise((P)=>setTimeout(P,400)),J=b0(W,r(W,q.id)??J),V();V();let U=
|
|
107
|
-
${L
|
|
108
|
-
`);let
|
|
109
|
-
`)}
|
|
110
|
-
`),W.wait)
|
|
107
|
+
`)}V();while(!K.has(J.status))await new Promise((P)=>setTimeout(P,400)),J=b0(W,r(W,q.id)??J),V();V();let U=hY.join(C(W,q.id),"result.json"),L=X8.existsSync(U)?JSON.parse(X8.readFileSync(U,"utf8")):null;if(Y.json)E({taskId:q.id,status:J.status,result:L});else{let Z=J.status==="completed"?"(no final message)":`(task ${J.status})`;k0.stdout.write(`
|
|
108
|
+
${v2(L,J.error,Z)}
|
|
109
|
+
`);let A=L?.tokens?` tokens=${u0(L.tokens,L.model??J.model)}`:"";k0.stderr.write(`${O.dim(`[coder] task=${q.id} status=${J.status}${A}`)}
|
|
110
|
+
`)}k0.exit(J.status==="completed"?0:1)}import W8 from"node:fs";import bY from"node:path";import j0 from"node:process";async function H4(Q){let{options:Y,positionals:X}=T(Q,S({...b,model:j,effort:j,permissions:j,background:_,wait:_})),W=I(Y),[q,...K]=X,G=K.join(" ").trim();if(!q||!G)D("Missing task id or follow-up text.",{hint:['Usage: coder task steer <task-id> "<follow-up>" [--wait]',"Help: coder task steer --help"]});let z=p(W,q);if(!z.threadId)D(`Task ${z.id} has no thread to steer yet (status: ${z.status}).`,{hint:`Wait for it to start: coder task stream ${z.id}`});if(z.status==="running"){if(z.engine!=="claude"){if((await S9(W,{threadId:z.threadId,text:G})).steered)return q8(W,z.id,{queued:!1,options:Y})}let B=r(W,z.id)??z;if(J0.includes(B.status))return y4(W,B.id,G),q8(W,B.id,{queued:!0,options:Y})}let $=[G,"--resume",z.id,"--cwd",W,...z.agent?["--agent",z.agent]:[],...Y.model?["--model",Y.model]:z.model?["--model",z.model]:[],...Y.effort?["--effort",Y.effort]:z.effort?["--effort",z.effort]:[],...Y.permissions?["--permissions",Y.permissions]:z.permissions?["--permissions",z.permissions]:[],...Y.wait?["--wait"]:[]];await W2($)}async function q8(Q,Y,{queued:X,options:W}){if(X){if(W.json){E({taskId:Y,steered:"queued"});return}if(j0.stdout.write(`${O.dim("[coder]")} follow-up queued for task ${O.cyan(Y)}; it runs when the current turn finishes.
|
|
111
|
+
`),W.wait)j0.stdout.write(`
|
|
111
112
|
${O.dim(`[coder] --wait is not available for a queued follow-up; check: coder task result ${Y}`)}
|
|
112
|
-
`);return}if(!W.wait){if(W.json){E({taskId:Y,steered:"live"});return}
|
|
113
|
-
`),
|
|
113
|
+
`);return}if(!W.wait){if(W.json){E({taskId:Y,steered:"live"});return}j0.stdout.write(`${O.dim("[coder]")} steered follow-up into running task ${O.cyan(Y)}.
|
|
114
|
+
`),j0.stdout.write(`
|
|
114
115
|
${O.dim(` result: coder task result ${Y}`)}
|
|
115
|
-
`);return}let q=r(Q,Y),K=q?await
|
|
116
|
+
`);return}let q=r(Q,Y),K=q?await b4(Q,q):null,G=bY.join(C(Q,Y),"result.json"),z=W8.existsSync(G)?JSON.parse(W8.readFileSync(G,"utf8")):null;if(W.json)E({taskId:Y,status:K?.status??null,finalMessage:z?.finalMessage??null});else j0.stdout.write(`
|
|
116
117
|
${z?.finalMessage||"(no final message)"}
|
|
117
118
|
|
|
118
|
-
`),
|
|
119
|
-
`);
|
|
120
|
-
`)}import
|
|
119
|
+
`),j0.stderr.write(`${O.dim(`[coder] task=${Y} status=${K?.status??"unknown"}`)}
|
|
120
|
+
`);j0.exitCode=K?.status==="completed"?0:1}import K8 from"node:process";async function N4(Q){let{options:Y,positionals:X}=T(Q,S(b));f(X,1,"task stop");let W=I(Y),q=p(W,X[0]),K=q.engine==="claude"?{detail:"claude worker terminated"}:await w9(W,{threadId:q.threadId,turnId:q.turnId});if(q.pid&&q.status==="running")try{K8.kill(q.pid,"SIGTERM")}catch{}if(m(W,q.id,{status:"cancelled",completedAt:new Date().toISOString()}),Y.json){E({taskId:q.id,status:"cancelled",interrupt:K.detail});return}K8.stdout.write(`Stopped task ${O.cyan(q.id)} ${O.dim(`(${K.detail})`)}
|
|
121
|
+
`)}import $8 from"node:path";import w2 from"node:process";import{spawn as gY}from"node:child_process";import J4 from"node:process";function z8(Q,Y){if(!Y.length)return;try{gY(J4.execPath,[A0,"_archiveSweep","--cwd",Q,...Y],{detached:!0,stdio:"ignore"}).unref()}catch{}}async function G8(Q){let{options:Y,positionals:X}=T(Q,S({cwd:j})),W=I(Y);for(let q of X){let K=y0(W,q);if(K)h0(W,K)}}async function V4(Q){let{options:Y,positionals:X}=T(Q,S({...b,"all-stopped":_}));f(X,1,"task archive");let W=I(Y);if(Y["all-stopped"]){let G=z2(W).filter(($)=>Z0.includes($.status));for(let $ of G)h0(W,$);let z=G.map(($)=>$.id);if(Y.json){E({archived:z,count:z.length});return}J4.stdout.write(z.length?`Archived ${z.length} stopped task${z.length===1?"":"s"}.
|
|
121
122
|
`:`${O.dim("No stopped tasks to archive.")}
|
|
122
|
-
`);return}let q=X[0];if(!q)
|
|
123
|
-
`)}var
|
|
124
|
-
`);let U=[];if(!Y.archived){let L=g0(W,{migrate:!1}).length;if(L)U.push(`${L} archived: coder task list --archived [--limit N]`)}if(U.length)
|
|
125
|
-
${
|
|
126
|
-
`);return}let H=O;for(let J of N){let U=J.archived?` ${H.dim("(archived)")}`:"",L=J.name?J.name:H.dim(J.prompt),P=J.idleMs!==null&&J.idleMs>=
|
|
127
|
-
`)}if(B)
|
|
123
|
+
`);return}let q=X[0];if(!q)D("Missing task id.",{hint:["Archive one: coder task archive <task-id>","Archive all stopped: coder task archive --all-stopped"]});let K=p(W,q);if(h0(W,K),Y.json){E({taskId:K.id,archived:!0});return}J4.stdout.write(`Archived task ${O.cyan(K.id)}.
|
|
124
|
+
`)}var yY=300000;async function U4(Q){let{options:Y,positionals:X}=T(Q,S({cwd:j,dir:j,limit:d(S0([C0("all"),O0.number().check(w0(),I0())],{error:'expected a positive integer or "all"'})),json:_,running:_,stopped:_,archived:_}));f(X,0,"task list");let W=I(Y),q=Y.limit==="all"?void 0:Y.limit,K=(J)=>Z0.includes(J.status),G=[],z=z2(W).filter((J)=>{if(!K(J))return!0;let U=J.completedAt??J.updatedAt??J.createdAt;if(B2(U)<=yY)return!0;return P3(W,J),G.push(J.id),!1});if(z8(W,G),Y.archived)z=g0(W);else if(Y.running)z=z.filter((J)=>J0.includes(J.status));else if(Y.stopped)z=z.filter(K);let $=Y.dir??Y.cwd;if($){let J=Y0($8.resolve(String($)));z=z.filter((U)=>U.cwd&&Y0(U.cwd)===J)}if(!Y.archived&&!Y.running&&!Y.stopped){let J=(U)=>U.status==="failed"?0:J0.includes(U.status)?1:U.status==="completed"?3:2;z=[...z].sort((U,L)=>J(U)-J(L))}let B=q!==void 0?Math.max(0,z.length-q):0;if(q!==void 0)z=z.slice(0,q);let N=z.map((J)=>({taskId:J.id,status:J.status,agent:J.agent??null,model:J.model??null,name:J.name??null,cwd:J.cwd??null,prompt:String(J.prompt??"").slice(0,80),updatedAt:J.updatedAt,archived:J.archived??!1,idleMs:J0.includes(J.status)?B2(x2(W,J)):null}));if(Y.json){E(N);return}if(!N.length){let J=Y.archived?"archived tasks":Y.running?"running tasks":Y.stopped?"recently stopped tasks":"recent tasks";w2.stdout.write(`No ${J}.
|
|
125
|
+
`);let U=[];if(!Y.archived){let L=g0(W,{migrate:!1}).length;if(L)U.push(`${L} archived: coder task list --archived [--limit N]`)}if(U.length)w2.stdout.write(`
|
|
126
|
+
${_0(U,O)}
|
|
127
|
+
`);return}let H=O;for(let J of N){let U=J.archived?` ${H.dim("(archived)")}`:"",L=J.name?J.name:H.dim(J.prompt),P=J.idleMs!==null&&J.idleMs>=n4?` ${(J.idleMs>b2?H.red:H.dim)(`· idle ${H2(J.idleMs)}`)}`:"";w2.stdout.write(`${H.cyan(J.taskId.padEnd(24))} ${g2(J.status,10)} ${H.dim(((J.agent??"-")+(J.model?`/${J.model}`:"")).padEnd(14))} ${H.dim((J.cwd?$8.basename(J.cwd):"-").padEnd(12))} ${L}${P}${U}
|
|
128
|
+
`)}if(B)w2.stdout.write(H.dim(`
|
|
128
129
|
... ${B} more not shown (--limit ${q})
|
|
129
|
-
`));let V=["Result: coder task result <task-id>"];if(!Y.archived)V.push("Older tasks: coder task list --archived [--limit N]");
|
|
130
|
-
${
|
|
131
|
-
`)}import
|
|
130
|
+
`));let V=["Result: coder task result <task-id>"];if(!Y.archived)V.push("Older tasks: coder task list --archived [--limit N]");w2.stdout.write(`
|
|
131
|
+
${_0(V,H)}
|
|
132
|
+
`)}import H8 from"node:process";import L4 from"node:fs";import mY from"node:os";import P4 from"node:path";function uY(){let Q=process.env.CLAUDE_CONFIG_DIR||P4.join(mY.homedir(),".claude");return P4.join(Q,"projects")}function B8(Q){if(!Q)return!1;let Y=uY(),X=!1;try{for(let W of L4.readdirSync(Y)){let q=P4.join(Y,W,`${Q}.jsonl`);if(L4.existsSync(q))L4.rmSync(q,{force:!0}),X=!0}}catch{}return X}function N8(Q){if(!Q.threadId)return;if(Q.engine==="codex")S4(Q.threadId);else if(Q.engine==="claude")B8(Q.threadId)}async function O4(Q){let{options:Y,positionals:X}=T(Q,S({...b,"all-archived":_}));f(X,1,"task delete");let W=I(Y);if(Y["all-archived"]){let z=g0(W).filter(($)=>{return N8($),O3(W,$.id)}).map(($)=>$.id);if(Y.json){E({deleted:z,count:z.length});return}H8.stdout.write(z.length?`Deleted ${z.length} archived task${z.length===1?"":"s"}.
|
|
132
133
|
`:`${O.dim("No archived tasks to delete.")}
|
|
133
|
-
`);return}let q=X[0];if(!q)
|
|
134
|
-
`)}import
|
|
135
|
-
`);return}let G=O;for(let z of K){let $=z.answered??"pending";
|
|
136
|
-
`)}}async function
|
|
137
|
-
`)}import
|
|
134
|
+
`);return}let q=X[0];if(!q)D("Missing task id.",{hint:["Delete one: coder task delete <task-id>","Delete all archived: coder task delete --all-archived"]});let K=p(W,q);if(K.status==="running")D(`Task ${K.id} is still running.`,{hint:`Stop it first: coder task stop ${K.id}`});if(N8(K),O3(W,K.id),Y.json){E({taskId:K.id,deleted:!0});return}H8.stdout.write(`Deleted task ${O.cyan(K.id)}.
|
|
135
|
+
`)}import Z4 from"node:process";async function A4(Q){let{options:Y,positionals:X}=T(Q,S(b));f(X,1,"task approvals");let W=I(Y),q=p(W,X[0]),K=o0(C(W,q.id)).map((z)=>({id:z.id,summary:z.summary,createdAt:z.createdAt,answered:z.response?.decision??null}));if(Y.json){E(K);return}if(!K.length){Z4.stdout.write(`${O.dim(`No approvals for task ${q.id}.`)}
|
|
136
|
+
`);return}let G=O;for(let z of K){let $=z.answered??"pending";Z4.stdout.write(`${G.cyan(z.id)} ${$.padEnd(8)} ${G.dim(z.summary)}
|
|
137
|
+
`)}}async function D4(Q){let{options:Y,positionals:X}=T(Q,S({...b,deny:_}));f(X,2,"task approve");let W=I(Y),[q,K]=X;if(!q||!K)D("Missing task id or approval id.",{hint:["List them: coder task approvals <task-id>","Usage: coder task approve <task-id> <id> [--deny]"]});let G=p(W,q),z=Y.deny?"decline":"accept";if(G9(C(W,G.id),K,z),Y.json){E({taskId:G.id,approvalId:K,decision:z});return}Z4.stdout.write(`${Y.deny?"Denied":"Approved"} ${O.cyan(K)} on task ${O.cyan(G.id)}.
|
|
138
|
+
`)}import $3 from"node:fs";import J8 from"node:path";import F4 from"node:process";async function V8(Q){let{options:Y,positionals:X}=T(Q,S({...b,workspace:_})),W=I(Y),[q="list",K,...G]=X,z=Y.workspace?J8.join(Y0(W),"coder.config.json"):N0(),$=(R,y)=>y.split(".").reduce((z0,M)=>z0==null?void 0:z0[M],R);if(q==="list"){let R=o(W);if(Y.json){E(R);return}let y=O,z0=(M)=>[M?.model,M?.effort,M?.permissions].filter(Boolean).join("/")||"-";F4.stdout.write([`${y.dim("chain")} ${R.chain.join(" -> ")}`,`${y.dim("codex")} ${z0(R.agents.codex)}`,`${y.dim("claude")} ${z0(R.agents.claude)}`,`${y.dim("approvals")} timeout=${R.approvals.escalationTimeoutMs}ms hosts=[${R.approvals.allowedNetworkHosts.join(", ")}]`,`${y.dim("file")} ${N0()}`].join(`
|
|
138
139
|
`)+`
|
|
139
|
-
`);return}if(q==="get"){if(!K)
|
|
140
|
-
`);return}if(q!=="set"&&q!=="unset")
|
|
140
|
+
`);return}if(q==="get"){if(!K)D("Usage: coder config get <key> (e.g. chain, agents.codex.model)");let R=$(o(W),K);if(Y.json||R===null||typeof R==="object"&&R!==void 0){E(R===void 0?null:R);return}F4.stdout.write(`${R===void 0?"(unset)":String(R)}
|
|
141
|
+
`);return}if(q!=="set"&&q!=="unset")D("Usage: coder config [get|set|unset] <key> [value] [--workspace]");if(!K||q==="set"&&G.length===0)D(`Usage: coder config ${q} <key>${q==="set"?" <value>":""}`);let B=G.join(" "),N;try{N=JSON.parse(B)}catch{N=B.includes(",")?B.split(",").map((R)=>R.trim()).filter(Boolean):B}let H=$3.existsSync(z)?JSON.parse($3.readFileSync(z,"utf8")):{},V=K.split("."),J=V.at(-1),U=H;for(let R of V.slice(0,-1)){if(typeof U[R]!=="object"||U[R]===null)U[R]={};U=U[R]}if(q==="set")U[J]=N;else delete U[J];let L=s0(H);if(L.length)D(`Refusing to write invalid config:
|
|
141
142
|
${L.join(`
|
|
142
|
-
`)}`)
|
|
143
|
-
`,"utf8");let P=$(o(W),K)??null;if(Y.json){E({file:z,key:K,...q==="set"?{value:N}:{unset:!0},effective:P});return}let
|
|
144
|
-
`)}import
|
|
143
|
+
`)}`);$3.mkdirSync(J8.dirname(z),{recursive:!0}),$3.writeFileSync(z,`${JSON.stringify(H,null,2)}
|
|
144
|
+
`,"utf8");let P=$(o(W),K)??null;if(Y.json){E({file:z,key:K,...q==="set"?{value:N}:{unset:!0},effective:P});return}let Z=O,A=q==="set"?`${Z.cyan(K)} = ${JSON.stringify(N)}`:`unset ${Z.cyan(K)}`;F4.stdout.write(`${A} ${Z.dim(`(${z})`)}
|
|
145
|
+
`)}import cY from"node:fs";import B3 from"node:process";import{fileURLToPath as fY}from"node:url";async function H3(Q){let{options:Y,positionals:X}=T(Q,S({...b,codex:_,claude:_,agents:_})),W=I(Y),q=["claude","codex","agents"];for(let w of X){if(!q.includes(w))D(`Unknown host "${w}". Use claude, codex, or agents.`,{hint:"Codex, Pi, OpenCode, and other Agent Skills hosts: coder setup-host agents"});Y[w]=!0}let K=B3.stdout.isTTY&&!B3.env.NO_COLOR,G=(w,t)=>K?`\x1B[${w}m${t}\x1B[0m`:t,z=(w)=>` ${G("32","✔")} ${w}`,$=(w)=>` ${G("31","✘")} ${w}`,B=(w)=>G("1",w),N=(w)=>G("38;5;245",w);if(!Y.json)B3.stdout.write(`${B("Coder host setup")}
|
|
145
146
|
|
|
146
|
-
`);let H=B0(W),V=
|
|
147
|
+
`);let H=B0(W),V=l9(H);if(V?.updated)H=B0(W);let J=H.available?await I9(W):{loggedIn:!1,detail:H.detail},U=Q2(),L=U.available?c9():{loggedIn:!1,detail:U.detail},P=N0();if(!cY.existsSync(P)){let w=H.available?["codex","claude"]:U.available?["claude","codex"]:["codex","claude"];m9({...q4,chain:w})}let Z=k2(),A=Y.claude?Y3(Z):null,R=Y.agents||Y.codex?W3(Z):null,y=o(W),z0=H.available&&J.loggedIn||U.available&&L.loggedIn;if(Y.json){E({codex:{available:H.available,detail:H.detail,auth:J.detail,loggedIn:J.loggedIn},...V?{codexUpdate:V}:{},claude:{available:U.available,detail:U.detail,auth:L.detail,loggedIn:L.loggedIn},configFile:P,runtime:fY(new URL("../bin/coder.mjs",import.meta.url)),...A?{claudePlugin:A}:{},...R?{agentsSkill:R}:{},config:y,ready:z0});return}let M=[],u=H.available?J.loggedIn?z(`codex ${N(`${H.detail}; ${J.detail}`)}`):$(`codex not logged in ${N(`(${J.detail})`)} - run: codex login`):$("codex CLI not installed - run: npm install -g @openai/codex"),c=U.available?L.loggedIn?z(`claude ${N(`${U.detail}; ${L.detail}`)}`):$("claude not logged in - run: claude auth login"):$("claude CLI not installed - run: npm install -g @anthropic-ai/claude-code");if(M.push(B("Available Engines"),u,c,` ${N("custom models (local/provider endpoints): coder model --help")}`),V?.updated)M.push(z(`codex ${N(`updated ${V.from} -> ${H.detail} (GPT-5.6 support)`)}`));else if(V)M.push($(`codex ${V.note}`));M.push("");let i=(w)=>{let t=y.agents?.[w]??{};return[t.model,t.effort,t.permissions].filter(Boolean).join("/")};M.push(B("Config"),` chain: ${(y.chain??[]).join(" -> ")} codex: ${i("codex")} claude: ${i("claude")}`,` ${N(P)} ${N("(coder config set <key> <value> to change)")}`,"");let Q0=[["claude plugin",A],["agents skill ",R]];for(let[w,t]of Q0)if(t)M.push(t.installed?z(`${w} ${N(t.note)}`):$(`${w} ${t.note}`),"");M.push(z0?z(`ready - try: coder run --wait "explain this repo's layout"`):$("not ready - install an engine CLI to run tasks: codex (npm install -g @openai/codex, then codex login) or claude (npm install -g @anthropic-ai/claude-code, then claude auth login)")),B3.stdout.write(`${M.join(`
|
|
147
148
|
`)}
|
|
148
|
-
`)}import
|
|
149
|
+
`)}import N3 from"node:fs";import L8 from"node:path";import v0 from"node:process";var pY=new Set(["codex","claude","custom",...Object.keys(a0),...Object.keys(M2)]);async function R4(Q){let Y=Q.envKey?v0.env[Q.envKey]:void 0,X=e0(Q.baseUrl,"models"),W=null;for(let q of X)try{let K=await fetch(q,{headers:Y?{Authorization:`Bearer ${Y}`}:{},signal:AbortSignal.timeout(5000)});if(!K.ok){W=K.status===404?{reachable:!0,modelListed:null,detail:"endpoint reachable (no model list to verify against)"}:{reachable:!1,modelListed:null,detail:`${q} -> HTTP ${K.status}`};continue}let G=await K.json().catch(()=>null),z=Array.isArray(G?.data)?G.data.map((B)=>B.id):null;if(!z)return{reachable:!0,modelListed:null,detail:"endpoint reachable"};let $=z.includes(Q.model);return{reachable:!0,modelListed:$,detail:$?`endpoint reachable; model "${Q.model}" listed`:`endpoint reachable, but "${Q.model}" is not in its model list`}}catch(K){let G=K instanceof Error?K.message:String(K);W={reachable:!1,modelListed:null,detail:`${q} unreachable (${G})`}}return W}function P8(Q,Y){let X=N3.existsSync(Q)?JSON.parse(N3.readFileSync(Q,"utf8")):{};if(X.models=X.models??{},Y(X.models),Object.keys(X.models).length===0)delete X.models;let W=s0(X);if(W.length)D(`Refusing to write invalid config:
|
|
149
150
|
${W.join(`
|
|
150
|
-
`)}`);
|
|
151
|
-
`,"utf8")}
|
|
152
|
-
`),
|
|
151
|
+
`)}`);N3.mkdirSync(L8.dirname(Q),{recursive:!0}),N3.writeFileSync(Q,`${JSON.stringify(X,null,2)}
|
|
152
|
+
`,"utf8")}var J3=S({...b,"base-url":j,model:j,"env-key":j,workspace:_});function O8(Q,Y){return Q.workspace?L8.join(Y0(Y),"coder.config.json"):N0()}async function Z8(Q){let{options:Y,positionals:X}=T(Q,J3);if(X.length)D("model list takes no arguments.",{hint:"Usage: coder model list [--json]"});let W=I(Y),q=O,K=o(W),G=Object.entries(K.models??{});if(Y.json){let $=await Promise.all(G.map(async([B,N])=>({name:B,...N,probe:await R4(N)})));E({models:$});return}if(!G.length){v0.stdout.write(`No custom models configured.
|
|
153
|
+
`),v0.stdout.write(`
|
|
153
154
|
${q.dim("Add one: coder model add <name> --base-url <url> --model <id> [--env-key VAR]")}
|
|
154
|
-
`);return}let z=[q.bold("Custom models"),""];for(let[$,B]of G){let N=await
|
|
155
|
+
`);return}let z=[q.bold("Custom models"),""];for(let[$,B]of G){let N=await R4(B),H=N.reachable?q.green("✔"):q.red("✘");z.push(` ${H} ${$.padEnd(14)} ${B.model} ${q.dim(`@ ${B.baseUrl} — ${N.detail}`)}`)}z.push("",q.dim('Use one: coder run --model <name> "<task>" (or coder run --agent custom)')),v0.stdout.write(`${z.join(`
|
|
155
156
|
`)}
|
|
156
|
-
`)}async function
|
|
157
|
-
`))),
|
|
157
|
+
`)}async function A8(Q,Y,X,W,q){let K=O8(X,W),G=O,z=await K3(Y),$=z?.wireApi==="responses";if(z)Y.wireApi=z.wireApi,Y.baseUrl=z.baseUrl??Y.baseUrl;else delete Y.wireApi;P8(K,(P)=>{P[Q]=Y});let B=await R4(Y),N=q3(B0(W)),H=B0(W),V=Y.envKey&&!v0.env[Y.envKey];if(X.json){E({name:Q,...Y,file:K,probe:B,codex:H,...N?{codexInstall:N}:{},ready:B.reachable&&H.available});return}let J=(P)=>` ${G.green("✔")} ${P}`,U=(P)=>` ${G.red("✘")} ${P}`,L=[`${q} ${G.cyan(Q)} -> ${Y.model} @ ${Y.baseUrl} ${G.dim(`(${K})`)}`,"",B.reachable?J(`${B.detail} ${G.dim(`(${$?"responses api, direct":"chat api, auto-translated"})`)}`):U(B.detail),H.available?J(N?.installed?`${N.note} ${G.dim(`(${H.detail})`)}`:`codex engine ${G.dim(`(${H.detail})`)}`):U(N?.note??"codex CLI not installed - run: npm install -g @openai/codex")];if(V)L.push(U(`env var ${Y.envKey} is not set in this shell`));L.push("",G.dim([`Use it: coder run --model ${Q} "<task>"`,`Make default: coder config set agents.custom.model ${Q}`].join(`
|
|
158
|
+
`))),v0.stdout.write(`${L.join(`
|
|
158
159
|
`)}
|
|
159
|
-
`)}function
|
|
160
|
-
`)}var
|
|
161
|
-
`);let
|
|
160
|
+
`)}function lY(Q,Y){if(!Q)D("Missing model name.",{hint:Y});if(!/^[a-z][a-z0-9-]*$/.test(Q))D(`Invalid model name "${Q}". Use lowercase kebab-case (e.g. qwen-local).`);if(pY.has(Q))D(`"${Q}" is a built-in alias; pick another name.`);return Q}async function U8(Q){let{options:X,positionals:W}=T(Q,J3),q=I(X),K=lY(W[0],"Usage: coder model add <name> --base-url <url> --model <id> [--env-key VAR]");if(o(q).models?.[K])D(`Custom model "${K}" already exists.`,{hint:`Change it: coder model update ${K} [--base-url|--model|--env-key], or remove it first.`});if(!X["base-url"]||!X.model)D("Missing --base-url or --model.",{hint:"Usage: coder model add <name> --base-url <url> --model <id> [--env-key VAR]"});let G={baseUrl:T2(X["base-url"]),model:X.model,...X["env-key"]?{envKey:X["env-key"]}:{}};await A8(K,G,X,q,"saved")}async function rY(Q){let{options:X,positionals:W}=T(Q,J3),q=I(X),K=W[0],G=K?o(q).models?.[K]:void 0;if(!K||!G)D(K?`No custom model named "${K}".`:"Missing model name.",{hint:K?"List them: coder model list":"Usage: coder model update <name> [--base-url <url>] [--model <id>] [--env-key VAR]"});if(!X["base-url"]&&!X.model&&!X["env-key"])D("Nothing to update: pass --base-url, --model, or --env-key.",{hint:"Usage: coder model update <name> [--base-url <url>] [--model <id>] [--env-key VAR]"});let z={...G,...X["base-url"]?{baseUrl:T2(X["base-url"])}:{},...X.model?{model:X.model}:{},...X["env-key"]?{envKey:X["env-key"]}:{}};await A8(K,z,X,q,"updated")}async function dY(Q){let{options:Y,positionals:X}=T(Q,J3),W=I(Y),q=X[0];if(!q||!o(W).models?.[q])D(q?`No custom model named "${q}".`:"Missing model name.",{hint:q?"List them: coder model list":"Usage: coder model remove <name>"});let K=O8(Y,W);if(P8(K,(G)=>{delete G[q]}),Y.json){E({removed:q,file:K});return}v0.stdout.write(`removed ${O.cyan(q)} ${O.dim(`(${K})`)}
|
|
161
|
+
`)}var nY={list:Z8,add:U8,setup:U8,update:rY,remove:dY};async function D8(Q){let[Y,...X]=Q;if(Y===void 0||Y.startsWith("-")){await Z8(Q);return}let W=nY[Y];if(!W)D(`Unknown model subcommand "${Y}". Use list, add, update, or remove.`,{hint:"Help: coder model --help"});await W(X)}import oY from"node:fs";import iY from"node:path";import q2 from"node:process";import{spawnSync as tY}from"node:child_process";async function E4(Q){let{options:Y}=T(Q,S({pm:j,"cli-only":_,"plugins-only":_,codex:_,claude:_})),X=!Y["plugins-only"],W=!Y["cli-only"],q=q2.stdout.isTTY&&!q2.env.NO_COLOR,K=(U,L)=>q?`\x1B[${U}m${L}\x1B[0m`:L,G=(U)=>K("1",U),z=(U)=>K("38;5;245",U),$=(U)=>` ${K("32","✔")} ${U}`,B=(U)=>` ${K("31","✘")} ${U}`,N=(U,L)=>L&&U&&L!==U?`${U} ${z("->")} ${G(L)}`:`${L??U??"?"} ${z("(unchanged)")}`,H=k2(),V=iY.join(H,"plugins/claude/.claude-plugin/plugin.json"),J={cli:a(),claude:E3(V)};if(X){let U=l4(A0),[L,...P]=Y.pm==="npm"?["npm","install","-g","@wular/coder@latest"]:Y.pm==="pnpm"?["pnpm","add","-g","@wular/coder@latest"]:Y.pm==="yarn"?["yarn","global","add","@wular/coder@latest"]:Y.pm==="bun"?["bun","add","-g","@wular/coder@latest"]:U.command,Z=Y.pm??U.pm;q2.stdout.write(`${G("Updating coder CLI")} ${z(`via ${Z}...`)}
|
|
162
|
+
`);let A=tY(L,P,{encoding:"utf8"});if(A.error?.code==="ENOENT")D(`${Z} not found on PATH. Re-run with --pm <npm|pnpm|yarn|bun>, or update manually: ${L} ${P.join(" ")}`);if(A.status!==0){let y=(A.stderr||A.stdout||"").trim();D(`CLI update failed (${Z}).${y?`
|
|
162
163
|
${y}`:""}
|
|
163
|
-
Run manually: ${L} ${P.join(" ")}`)}
|
|
164
|
+
Run manually: ${L} ${P.join(" ")}`)}c4();let R=a();q2.stdout.write(R!==J.cli?`${$(`coder CLI ${N(J.cli,R)}`)}
|
|
164
165
|
`:`${$(`coder CLI ${J.cli} ${z("(already latest)")}`)}
|
|
165
|
-
`)}if(W){if(Y.claude||!Y.codex&&
|
|
166
|
-
`)}if(
|
|
167
|
-
`)}}}var
|
|
168
|
-
`);return}if(Q===void 0||Q==="help"||Q==="--help"||Q==="-h"){if(Y[0]==="task"&&Y[1]===void 0){e.stdout.write(
|
|
166
|
+
`)}if(W){if(Y.claude||!Y.codex&&Q2().available){let L=Y3(H),P=E3(V);q2.stdout.write(`${L.installed?$(`claude plugin ${N(J.claude,P)} ${z(`- ${L.note}`)}`):B(`claude plugin ${L.note}`)}
|
|
167
|
+
`)}if(oY.existsSync(X3())){let L=$4(),P=W3(H),Z=$4();q2.stdout.write(`${P.installed?$(`agents skill ${N(L,Z)} ${z(`- ${P.note}`)}`):B(`agents skill ${P.note}`)}
|
|
168
|
+
`)}}}var aY={run:W2,list:U4,stream:G3,result:B4,steer:H4,stop:N4,archive:V4,delete:O4,approvals:A4,approve:D4};async function sY(Q){let[Y,...X]=Q;if(Y===void 0||Y==="help"||Y==="-h"||Y==="--help"){e.stdout.write(J2());return}let W=aY[Y];if(!W)e.stdout.write(J2()),D(`Unknown task subcommand "${Y}".`,{hint:'Run a task: coder run "<text>"'});if(c2(X)){e.stdout.write(N2(`task ${Y}`)??J2());return}await W(X)}var eY={task:sY,run:W2,list:U4,stream:G3,result:B4,steer:H4,stop:N4,archive:V4,delete:O4,approvals:A4,approve:D4,watch:G3,config:V8,"setup-host":H3,"host-setup":H3,setup:H3,model:D8,upgrade:E4,update:E4,_worker:Q8,_refreshUpdate:async()=>p4(a()),_archiveSweep:G8};async function Q6(){let[Q,...Y]=e.argv.slice(2);if(Q==="--version"||Q==="-v"){e.stdout.write(`${a()}
|
|
169
|
+
`);return}if(Q===void 0||Q==="help"||Q==="--help"||Q==="-h"){if(Y[0]==="task"&&Y[1]===void 0){e.stdout.write(J2());return}if(Y[0]==="model"&&Y[1]===void 0){e.stdout.write(I3());return}let W=Y.map((q)=>(q==="task"||q==="model")&&Y[1]?`${q} ${Y[1]}`:m2[q]??q).find((q)=>f0[q]);e.stdout.write(W&&N2(W)||u2());return}if(Q!=="_worker"&&Q!=="_refreshUpdate"&&Q!=="_archiveSweep")f4(a(),A0);let X=eY[Q];if(!X)e.stdout.write(u2()),D(`Unknown command "${Q}".`,{hint:"See all commands: coder --help"});if(Q==="model"&&c2(Y)){let W=Y.find((q)=>!q.startsWith("-"));e.stdout.write(W&&N2(`model ${W}`)||I3());return}if(Q!=="task"&&c2(Y)){let W=m2[Q]??Q;e.stdout.write(N2(W)??u2());return}try{await X(Y)}catch(W){let q=W instanceof Error?W.message:String(W);if(/^(Unknown option|Missing value)/.test(q)){let K=m2[Q]??Q;if(f0[K])D(q,{hint:`Help: coder ${Q} --help`})}throw W}}Q6().catch((Q)=>{e.stderr.write(`${Q instanceof Error?Q.message:String(Q)}
|
|
169
170
|
`),e.exit(1)});
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "coder",
|
|
3
3
|
"displayName": "Coder",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.12",
|
|
5
5
|
"description": "Delegate coding tasks to supervised Coder subagents running on Codex, Claude, or any OpenAI-compatible model. Your main context stays clean.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "muzam1l"
|