brass-runtime 1.12.1 → 1.13.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -228
- package/dist/agent/cli/main.cjs +7 -7
- package/dist/agent/cli/main.js +2 -2
- package/dist/agent/index.cjs +1 -1
- package/dist/agent/index.d.mts +1 -1
- package/dist/agent/index.d.ts +1 -1
- package/dist/agent/index.js +1 -1
- package/dist/{chunk-63ODH5W4.cjs → chunk-6OUI6UGZ.cjs} +6 -6
- package/dist/chunk-JAQUSSUV.js +1 -0
- package/dist/chunk-K47BP5A2.cjs +2 -0
- package/dist/chunk-LTHJNW5A.js +2 -0
- package/dist/{chunk-P4IND5C3.js → chunk-W6TVAMYC.js} +5 -5
- package/dist/chunk-XPOARCND.cjs +1 -0
- package/dist/effect-ISvXPLgc.d.mts +797 -0
- package/dist/effect-ISvXPLgc.d.ts +797 -0
- package/dist/http/index.cjs +1 -1
- package/dist/http/index.d.mts +2 -2
- package/dist/http/index.d.ts +2 -2
- package/dist/http/index.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.mts +159 -41
- package/dist/index.d.ts +159 -41
- package/dist/index.js +1 -1
- package/dist/{stream-DNTGNv-G.d.ts → stream-BvukHxCv.d.ts} +1 -1
- package/dist/{stream-FwtnWmgX.d.mts → stream-C0-LWnUP.d.mts} +1 -1
- package/package.json +27 -16
- package/dist/chunk-63MXGA7P.js +0 -1
- package/dist/chunk-7PHP7KQB.cjs +0 -1
- package/dist/chunk-MAR4TNUH.js +0 -1
- package/dist/chunk-T3QEEHK6.cjs +0 -1
- package/dist/effect-NSaHksNl.d.mts +0 -367
- package/dist/effect-NSaHksNl.d.ts +0 -367
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {f,j,l,
|
|
1
|
+
import {f,j,l,ia,g,ga,u as u$1,t,da as da$1,b as b$1,h as h$1,k}from'./chunk-LTHJNW5A.js';import {existsSync,statSync}from'fs';import {resolve,dirname,join}from'path';var Le=e=>({goal:e,phase:"boot",observations:[],errors:[],steps:0});var zt=(e,t)=>{switch(t.type){case "agent.done":return "done";case "agent.error":return e;case "fs.fileRead":case "fs.exists":case "fs.searchResult":return "discovering";case "shell.result":return "validating";case "llm.response":return "planning";case "patch.proposed":return "proposing";case "patch.applied":case "patch.rolledBack":return "validating"}},_e=(e,t)=>{let n=e.steps+1,r=n>=60?"failed":zt(e.phase,t);return {...e,phase:r,observations:[...e.observations,t],errors:t.type==="agent.error"?[...e.errors,t.error]:e.errors,steps:n}},Te=e=>e.phase==="done"||e.phase==="failed"||e.steps>=60;var Ut=["*.ts","*.tsx","*.js","*.jsx","*.mts","*.cts","*.mjs","*.cjs","*.json","*.md","*.yml","*.yaml"];var le=["tsx","jsx","mts","cts","mjs","cjs","json","yaml","html","scss","ts","js","md","yml","css"];[...le].sort((e,t)=>t.length-e.length).join("|");var Wt=new Set(["about","after","agent","because","before","brass","cannot","console","could","describe","error","expect","expected","exit","fail","failed","failing","failure","find","from","goal","have","into","name","node","only","package","please","process","repo","runtime","script","scripts","should","test","tests","that","this","throw","throws","undefined","using","with","previous","user","unrelated","validation","validacion","validaci\xF3n","discovered","remaining","rollback","rollbacks","strategy","proposed","request","relevant","context","summary","latest","patch","applied","configured","package","manager","commands","none","notes","usable","script","found","quality","loop","repairs","attempts","enabled","depth","workspace","inspect","inspection","diagnosis","diagnostic","diagn\xF3stico","plan","technology","stack","deployment","configuration","management","dependencies","observability","plugin","plugins","framework","serverless","commonjs","typescript","javascript","nodejs"]),ie=(e,t)=>e===void 0||!Number.isFinite(e)?t:Math.max(0,Math.floor(e)),H=e=>({enabled:e.goal.context?.enabled??true,maxSearchQueries:ie(e.goal.context?.maxSearchQueries,3),maxFiles:ie(e.goal.context?.maxFiles,4),maxSearchResults:ie(e.goal.context?.maxSearchResults,40),globs:e.goal.context?.globs??Ut,excludeGlobs:e.goal.context?.excludeGlobs??[]}),ce=e=>e.replace(/\\/g,"/"),De=e=>e.replace(/^(?:\.\/)+/,""),Qt=e=>e.replace(/(?:\d+){1,2}$/,""),Kt=new Set([" "," ",`
|
|
2
2
|
`,"\r","(","'",'"',"`","<","["]),Zt=new Set([" "," ",`
|
|
3
3
|
`,"\r",")","'",'"',">",",","]"]),Ht=e=>{let t=0,n=e.length;for(;t<n&&Kt.has(e[t]);)t+=1;for(;n>t&&Zt.has(e[n-1]);)n-=1;return e.slice(t,n)},Jt=new Set(["Node.js","CommonJS.js","TypeScript.ts","JavaScript.js"]),Xt=e=>Jt.has(e),Yt=e=>e.split("/").some(n=>n==="node_modules"||n===".git"||n==="dist"||n==="build"||n==="coverage"||n===".next"||n===".turbo"||n===".cache"),en=e=>le.some(t=>e.toLowerCase().endsWith(`.${t}`)),Ne=(e,t)=>{let n=ce(e).replace(/\/+$/,""),r=Qt(Ht(ce(t.trim())));if(r.startsWith("file://")&&(r=r.slice(7)),r.startsWith(`${n}/`)&&(r=r.slice(n.length+1)),r!==n&&(r=De(r),!(!r||r.startsWith("/")||/^[A-Za-z]:\//.test(r))&&!(r.includes("\0")||r.split("/").includes(".."))&&!Xt(r)&&!Yt(r)&&en(r)))return r},tn=e=>{let t=e.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,"::DOUBLE_STAR::").replace(/\*/g,"[^/]*").replace(/::DOUBLE_STAR::/g,".*");return new RegExp(`^${t}$`)},Ie=(e,t)=>t.some(n=>tn(De(ce(n))).test(e)),nn=e=>[...e.globs,...e.excludeGlobs.map(t=>`!${t}`)],_=e=>{let t=new Set,n=[];for(let r of e)t.has(r)||(t.add(r),n.push(r));return n},rn=e=>e.observations.filter(t=>t.type==="shell.result").map(t=>[t.command.join(" "),t.stdout.slice(-12e3),t.stderr.slice(-12e3)].join(`
|
|
4
4
|
`)).join(`
|
|
@@ -18,8 +18,8 @@ ${dt(e).join(`
|
|
|
18
18
|
`)}`:"Failed validation after latest patch: none recorded.","",o?._tag==="PatchError"?`Latest patch error during ${o.operation}: ${String(o.cause)}`:"Latest patch error: none.","","Recent observations:",yt(e)||"No observations yet."].join(`
|
|
19
19
|
`))},N=e=>e==="write"||e==="autonomous",dr=e=>{let t=we(e).filter(a=>a.type==="shell.result");if(t.length===0)return;let n=V(e),r=te(e.goal),o=n?.type==="patch.rolledBack"?"rollback":r?"aplicar patch":"apply";return [r?`Validaci\xF3n despu\xE9s de ${o}:`:`Validation after latest ${o}:`,...t.map(a=>`- ${a.command.join(" ")} ${r?"termin\xF3 con c\xF3digo":"exited with"} ${a.exitCode}.`)].join(`
|
|
20
20
|
`)},ut=(e,t)=>{let n=or(e,"llm.response")?.content?.trim()??"No plan was generated.",r=D(e,"llm.response"),o=D(e,"patch.applied"),a=D(e,"patch.rolledBack"),l=D(e,"patch.proposed"),s=dr(e),p=te(e.goal),d=[n];return r?.purpose==="patch"&&r.content.trim()&&d.push("",p?"\xDAltima respuesta de reparaci\xF3n del patch:":"Latest patch repair response:",r.content.trim()),a?d.push("",p?`Patch revertido en: ${a.changedFiles.join(", ")||"(sin archivos reportados)"}`:`Patch rolled back for: ${a.changedFiles.join(", ")||"(no files reported)"}`):o?d.push("",p?`Patch aplicado en: ${o.changedFiles.join(", ")||"(sin archivos reportados)"}`:`Patch applied to: ${o.changedFiles.join(", ")||"(no files reported)"}`):l?d.push("",p?"Patch propuesto, pero no aplicado en este modo.":"Patch extracted and proposed, but not applied in this mode."):t&&d.push("",p?"Hab\xEDa un diff con forma de patch, pero no se materializ\xF3 como observaci\xF3n.":"A patch-shaped diff was present, but it was not materialized as an observation."),s&&d.push("",s),z(e,d.join(`
|
|
21
|
-
`).trim())},ur=e=>{let t=D(e,"agent.error")?.error,n=te(e.goal);if(!t)return n?"La ejecuci\xF3n del agente fall\xF3.":"Agent run failed.";switch(t._tag){case "FsError":return n?`El agente se detuvo por un error de filesystem durante ${t.operation}: ${R(e,t.cause)}`:`Agent stopped after a filesystem error during ${t.operation}: ${R(e,t.cause)}`;case "ShellError":return n?`El agente se detuvo por un error ejecutando ${t.command?.join(" ")??t.operation}: ${R(e,t.cause)}`:`Agent stopped after a shell error during ${t.command?.join(" ")??t.operation}: ${R(e,t.cause)}`;case "LLMError":return n?`El agente se detuvo porque fall\xF3 la llamada al modelo: ${R(e,t.cause)}`:`Agent stopped because the model call failed: ${R(e,t.cause)}`;case "PatchError":return n?`El agente se detuvo por un error de patch durante ${t.operation}: ${R(e,t.cause)}`:`Agent stopped after a patch error during ${t.operation}: ${R(e,t.cause)}`;case "PermissionDenied":return n?`El agente se detuvo porque una acci\xF3n fue denegada por policy: ${t.reason}`:`Agent stopped because an action was denied by policy: ${t.reason}`;case "ApprovalRejected":return n?`El agente se detuvo porque se rechaz\xF3 una aprobaci\xF3n: ${t.reason}`:`Agent stopped because an approval was rejected: ${t.reason}`;case "ToolTimeout":return n?`El agente se detuvo porque una tool tard\xF3 m\xE1s de ${t.timeoutMs}ms.`:`Agent stopped because a tool timed out after ${t.timeoutMs}ms.`;case "PathOutsideWorkspace":return n?`El agente bloque\xF3 un path fuera del workspace: ${t.path}`:`Agent blocked a path outside the workspace: ${t.path}`;case "AgentLoopError":return n?`El agente se detuvo por un error del loop: ${t.message}`:`Agent stopped after an agent loop error: ${t.message}`}},gr=e=>{if(e.goal.mode==="read-only")return;let t=P(e).validationCommands,n=X(t,ar(e));return n?{type:"shell.exec",command:n}:void 0},mr=e=>{let t=P(e).validationCommands,n=X(t,Ee(e));return n?{type:"shell.exec",command:n}:void 0},ht=e=>{let t=P(e).validationCommands,n=X(t,we(e));return n?{type:"shell.exec",command:n}:void 0},fr=e=>{for(let t=e.observations.length-1;t>=0;t-=1){let n=e.observations[t];if(!n||n.type!=="llm.response")continue;let r=M(n.content);if(!r)continue;return e.observations.slice(t+1).some(a=>a.type==="patch.applied"||a.type==="patch.proposed")?void 0:{index:t,patch:r}}},yr=e=>{for(let t=e.observations.length-1;t>=0;t-=1){let n=e.observations[t];if(n?.type!=="llm.response")continue;let r=M(n.content);if(r)return r}},hr=e=>{for(let t=e.observations.length-1;t>=0;t-=1){let n=e.observations[t];if(n?.type==="patch.proposed")return n.patch;if(n?.type==="patch.applied"){if(n.patch)return n.patch;let r=e.observations.slice(0,t).reverse().find(o=>o.type==="llm.response"&&!!M(o.content));return r?M(r.content):e.goal.initialPatch}}},Ar=e=>{if(!N(e.goal.mode)||V(e)?.type!=="patch.applied"||!ee(e))return false;let t=P(e).validationCommands;return tt(t,Ee(e)).type==="failed"},br=e=>{if(!N(e.goal.mode)||V(e)?.type!=="patch.applied"||ee(e)||!O(e).onFinalValidationFailure||!ke(e))return false;let n=P(e).validationCommands;return at(n,we(e)).type==="failed"},kr=e=>{if(!N(e.goal.mode)||!ee(e))return false;let t=e.observations.at(-1);return t?.type==="agent.error"&&t.error._tag==="PatchError"},gt=(e,t)=>({type:"llm.complete",purpose:"patch",prompt:pr(e,t)}),mt=(e,t)=>{let n=rt(e);if(n)return {type:"patch.rollback",patch:n.patch,automatic:true,reason:t}},xr=(e,t)=>{if(N(e.goal.mode))return e.goal.initialPatchMode==="rollback"?ne(e,"patch.rolledBack")?void 0:{type:"patch.rollback",patch:t}:ne(e,"patch.applied")?ht(e):{type:"patch.apply",patch:t};if(e.goal.mode==="propose"&&!ne(e,"patch.proposed"))return {type:"patch.propose",patch:t}},At=e=>{if(e.observations.at(-1)?.type==="agent.error")return kr(e)?f(gt(e,"previous patch failed to apply")):f({type:"agent.finish",summary:ur(e)});if(!ne(e,"fs.fileRead"))return f({type:"fs.readFile",path:"package.json"});let n=Ye(e);if(n)return f(n);let r=e.goal.initialPatch?.trim();if(r){let s=xr(e,r);return s?f(s):f({type:"agent.finish",summary:ut(e,r)})}let o=fr(e);if(o){if(N(e.goal.mode))return f({type:"patch.apply",patch:o.patch});if(e.goal.mode==="propose")return f({type:"patch.propose",patch:o.patch})}if(!e.observations.find(s=>s.type==="llm.response"&&s.purpose==="plan")){let s=gr(e);if(s)return f(s);let p=We(e);return p?f(p):f({type:"llm.complete",purpose:"plan",prompt:lr(e)})}if(N(e.goal.mode)){if(ot(e)){let s=mt(e,"continuing rollback of generated patch stack");if(s)return f(s)}if(V(e)?.type==="patch.rolledBack"&&O(e).runValidationAfterRollback){let p=ht(e);if(p)return f(p)}if(V(e)?.type==="patch.applied"){let s=mr(e);if(s)return f(s);if(Ar(e))return f(gt(e,"validation failed after applying the generated patch"));if(br(e)){let p=mt(e,"validation failed after generated patches and no repair attempts remain");if(p)return f(p)}}}let l=yr(e);return f({type:"agent.finish",summary:ut(e,l)})};var v=()=>j((e,t)=>{t({_tag:"Success",value:Date.now()});}),E=e=>j((t,n)=>{try{t.events?.emit(e);}catch{}n({_tag:"Success",value:void 0});}),Pe=e=>e.reduce((t,n)=>l(t,()=>E(n)),f(void 0)),_o=e=>{switch(e.type){case "fs.readFile":return `read ${e.path}`;case "fs.exists":return `check ${e.path}`;case "fs.searchText":return `search "${e.query}"`;case "shell.exec":return e.command.join(" ");case "llm.complete":return `llm.${e.purpose}`;case "patch.propose":return "propose patch";case "patch.apply":return "apply patch";case "patch.rollback":return "rollback patch";case "agent.finish":return "finish";case "agent.fail":return "fail"}},To=e=>{switch(e.type){case "fs.fileRead":return `read ${e.path}`;case "fs.exists":return `${e.exists?"found":"missing"} ${e.path}`;case "fs.searchResult":return `search "${e.query}" (${e.matches.length} matches)`;case "shell.result":return `${e.command.join(" ")} exited ${e.exitCode}`;case "llm.response":return `llm.${e.purpose} responded`;case "patch.proposed":return "patch proposed";case "patch.applied":return `patch applied (${e.changedFiles.join(", ")||"no files reported"})`;case "patch.rolledBack":return `patch rolled back (${e.changedFiles.join(", ")||"no files reported"})`;case "agent.done":return "done";case "agent.error":return `error ${e.error._tag}`}},Oo=e=>{switch(e.type){case "agent.error":return "fail";case "shell.result":return e.exitCode===0?"ok":"warn";default:return "ok"}},bt=(e,t,n,r)=>{switch(n._tag){case "ToolTimeout":return {type:"agent.tool.timeout",action:e,step:t.steps+1,phase:t.phase,timeoutMs:n.timeoutMs,at:r};case "PermissionDenied":return {type:"agent.permission.denied",action:e,step:t.steps+1,phase:t.phase,reason:n.reason,at:r};default:return}},kt=(e,t,n)=>{switch(t.type){case "patch.applied":return {type:"agent.patch.applied",step:e.steps,phase:e.phase,changedFiles:t.changedFiles,automaticRollbackEligible:!!t.patch,at:n};case "patch.rolledBack":return {type:"agent.patch.rolledBack",step:e.steps,phase:e.phase,changedFiles:t.changedFiles,...t.automatic!==void 0?{automatic:t.automatic}:{},...t.reason?{reason:t.reason}:{},at:n};default:return}},xt=e=>e==="done"?"done":"failed";var x=e=>h$1(t=>t[e]);var Sr=e=>e.startsWith("/")||/^[A-Za-z]:[\\/]/.test(e),vr=e=>{let t=e.length;for(;t>0;){let n=e.charCodeAt(t-1);if(n!==47&&n!==92)break;t-=1;}return t===e.length?e:e.slice(0,t)},Er=e=>e.replace(/^(?:\.[\\/])+/,""),wr=e=>{let t=e.trim();if(!(!t||t.includes("\0")||Sr(t)||t.split(/[\\/]+/).includes("..")))return Er(t)};var U=(e,t)=>{let n=wr(t);return n?f(`${vr(e)}/${n}`):g({_tag:"PathOutsideWorkspace",path:t,cwd:e})};var St=(e,t)=>{switch(e.type){case "fs.readFile":return l(U(t.goal.cwd,e.path),n=>l(x("fs"),r=>k(r.readFile(n),o=>({type:"fs.fileRead",path:e.path,content:o}))));case "fs.exists":return l(U(t.goal.cwd,e.path),n=>l(x("fs"),r=>k(r.exists(n),o=>({type:"fs.exists",path:e.path,exists:o}))));case "fs.searchText":return l(x("fs"),n=>k(n.searchText(t.goal.cwd,e.query,{globs:e.globs}),r=>({type:"fs.searchResult",query:e.query,matches:r})));case "shell.exec":return l(x("shell"),n=>k(n.exec(e.command,{cwd:e.cwd??t.goal.cwd}),r=>({type:"shell.result",command:e.command,exitCode:r.exitCode,stdout:r.stdout,stderr:r.stderr})));case "llm.complete":return l(x("llm"),n=>k(n.complete({purpose:e.purpose,prompt:e.prompt}),r=>({type:"llm.response",purpose:e.purpose,content:r.content})));case "patch.propose":return f({type:"patch.proposed",patch:e.patch});case "patch.apply":return l(x("patch"),n=>k(n.apply(t.goal.cwd,e.patch),r=>({type:"patch.applied",changedFiles:r.changedFiles,patch:e.patch})));case "patch.rollback":return l(x("patch"),n=>k(n.rollback(t.goal.cwd,e.patch),r=>({type:"patch.rolledBack",changedFiles:r.changedFiles,patch:e.patch,...e.automatic!==void 0?{automatic:e.automatic}:{},...e.reason?{reason:e.reason}:{}})));case "agent.finish":return f({type:"agent.done",summary:e.summary});case "agent.fail":return g({_tag:"AgentLoopError",message:e.reason})}};var vt=(e,t)=>{let n=r=>b$1(e(),o=>r>0&&t.while(o)?n(r-1):g(o),o=>f(o));return n(t.times)};var Pr=e=>j((t,n)=>{let r=setTimeout(()=>n({_tag:"Success",value:void 0}),e);return ()=>clearTimeout(r)}),Et=(e,t,n)=>V$1(e,l(Pr(t),()=>g({_tag:"ToolTimeout",timeoutMs:t})),n);var wt=e=>e._tag==="LLMError"||e._tag==="ToolTimeout",Rr=e=>{switch(e.type){case "fs.readFile":case "fs.exists":case "fs.searchText":return {timeoutMs:5e3,retries:1,retryable:wt};case "llm.complete":return {timeoutMs:6e4,retries:2,retryable:wt};case "shell.exec":return {timeoutMs:12e4,retries:0,retryable:()=>false};case "patch.propose":case "agent.finish":case "agent.fail":return {timeoutMs:1e3,retries:0,retryable:()=>false};case "patch.apply":case "patch.rollback":return {timeoutMs:15e3,retries:0,retryable:()=>false}}},Cr=(e,t)=>{let n=Rr(e),r=t?.[e.type];return {...n,timeoutMs:r?.timeoutMs!==void 0?Math.max(1,Math.floor(r.timeoutMs)):n.timeoutMs,retries:r?.retries!==void 0?Math.max(0,Math.floor(r.retries)):n.retries}},Pt=(e,t,n)=>l(h$1(r=>r.toolPolicies),r=>{let o=Cr(e,r);return vt(()=>Et(St(e,t),o.timeoutMs,n),{times:o.retries,while:o.retryable})}),Rt=(e,t)=>({_tag:"ApprovalRejected",action:e,reason:t}),Re=(e,t,n,r)=>l(v(),o=>E({type:"agent.approval.resolved",action:e,step:t.steps+1,phase:t.phase,approved:n,...r?{reason:r}:{},at:o})),jr=(e,t,n)=>{let r=n.defaultAnswer??"reject";return l(v(),o=>l(E({type:"agent.approval.requested",action:e,step:t.steps+1,phase:t.phase,reason:n.reason,risk:n.risk,defaultAnswer:r,at:o}),()=>l(x("approvals"),a=>{if(!a){let l$1="No approval service configured.";return l(Re(e,t,false,l$1),()=>g(Rt(e,l$1)))}return l(a.request({action:e,state:t,reason:n.reason,risk:n.risk,defaultAnswer:r}),l$1=>{if(l$1.type==="approved")return l(Re(e,t,true,void 0),()=>f(void 0));let s=l$1.reason??"Approval rejected.";return l(Re(e,t,false,s),()=>g(Rt(e,s)))})})))},Ct=(e,t,n)=>l(x("permissions"),r=>l(r.check(e,t),o=>o.type==="deny"?g({_tag:"PermissionDenied",action:e,reason:o.reason}):o.type==="ask"?l(jr(e,t,o),()=>Pt(e,t,n)):Pt(e,t,n)));var $r=(e,t,n)=>l(v(),r=>l(E({type:"agent.action.started",action:e,step:t.steps+1,phase:t.phase,at:r}),()=>b$1(Ct(e,t,n),o=>l(v(),a=>{let l$1=bt(e,t,o,a),s=[...l$1?[l$1]:[],{type:"agent.action.failed",action:e,error:o,step:t.steps+1,phase:t.phase,durationMs:a-r,at:a}];return l(Pe(s),()=>f({type:"agent.error",error:o}))}),o=>l(v(),a=>l(E({type:"agent.action.completed",action:e,observation:o,step:t.steps+1,phase:t.phase,durationMs:a-r,at:a}),()=>f(o)))))),Fr=(e,t)=>l(v(),n=>{let r=kt(e,t,n),o=[{type:"agent.observation.recorded",observation:t,step:e.steps,phase:e.phase,at:n},...r?[r]:[]];return Pe(o)}),jt=(e,t,n)=>Te(e)?l(v(),r=>l(E({type:"agent.run.completed",goal:e.goal,status:xt(e.phase),phase:e.phase,steps:e.steps,durationMs:r-n,at:r}),()=>f(e))):l(At(e),r=>l($r(r,e,t),o=>{let a=_e(e,o);return l(Fr(a,o),()=>jt(a,t,n))})),da=(e,t)=>T$1(e,n=>l(v(),r=>l(E({type:"agent.run.started",goal:t,at:r}),()=>jt(Le(t),n,r))));var Ce=e=>e==="read-only"||e==="propose"||e==="write"||e==="autonomous",$t=e=>e==="auto"||e==="interactive"||e==="approve"||e==="deny",Ft=e=>e==="fake"||e==="google"||e==="gemini"||e==="openai"||e==="openai-compatible",Mt=[".brass-agent.json","brass-agent.config.json"];var Lt=e=>e==="fix-tests"||e==="inspect"||e==="typecheck"||e==="lint",ma=e=>{switch(e){case "fix-tests":return "fix the failing tests";case "inspect":return "inspect this workspace and summarize the current project state";case "typecheck":return "run typecheck discovery and fix type errors if possible";case "lint":return "run lint discovery and fix lint errors if possible"}};var Mr=["npm test","npm run test*","npm run typecheck","npm run type-check","npm run check-types","npm run tsc","npm run check","npm run *check*","npm run *doctor*","npm run *health*","npm run *verify*","npm run *validate*","npm run repo:check","npm run lint*","pnpm test","pnpm run test*","pnpm run typecheck","pnpm run type-check","pnpm run check-types","pnpm run tsc","pnpm run check","pnpm run *check*","pnpm run *doctor*","pnpm run *health*","pnpm run *verify*","pnpm run *validate*","pnpm run repo:check","pnpm run lint*","yarn test","yarn run test*","yarn run typecheck","yarn run type-check","yarn run check-types","yarn run tsc","yarn run check","yarn run *check*","yarn run *doctor*","yarn run *health*","yarn run *verify*","yarn run *validate*","yarn run repo:check","yarn run lint*","bun run test*","bun run typecheck","bun run type-check","bun run check-types","bun run tsc","bun run check","bun run *check*","bun run *doctor*","bun run *health*","bun run *verify*","bun run *validate*","bun run repo:check","bun run lint*","cargo check","cargo test","cargo fmt --check","cargo clippy","cargo clippy *","git status","git diff","git log"],Ot=e=>e.trim().replace(/\s+/g," "),re=e=>Ot(e.join(" ")),Lr=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Dt=(e,t)=>{let n=re(e),r=Ot(t);return r.includes("*")?new RegExp(`^${r.split("*").map(Lr).join(".*")}$`).test(n):n===r},_t=(e,t)=>!!t?.some(n=>Dt(e,n)),I=()=>({type:"allow"}),G=e=>({type:"deny",reason:e}),W=(e,t,n="reject")=>({type:"ask",reason:e,risk:t,defaultAnswer:n}),_r=e=>e.type==="shell.exec"?e.command.join(" "):e.type,Tr=e=>typeof e=="string"?e:e.pattern,Or=(e,t)=>{let n=t?.find(r=>Dt(e,Tr(r)));if(n)return typeof n=="string"?W(`Run command: ${re(e)}`,"high","reject"):W(n.reason??`Run command: ${re(e)}`,n.risk??"high",n.defaultAnswer??"reject")},Dr=e=>[...e?.inheritDefaults===false?[]:Mr,...e?.allow??[]],je=(e,t)=>{if(_t(e,t?.deny))return G(`Command denied by policy: ${re(e)}`);let n=Or(e,t?.ask);if(n)return n;if(_t(e,Dr(t)))return I()},Nr=e=>e.type==="patch.rollback"?"Reverse-apply a patch to restore the workspace.":"Apply the proposed patch to the workspace.",Tt=(e,t)=>{let n=Nr(e);if(!t)return W(n,"high","reject");let r=typeof t=="string"?t:t.decision??"ask",o=typeof t=="string"?n:t.reason??n,a=typeof t=="string"?"high":t.risk??"high",l=typeof t=="string"?"reject":t.defaultAnswer??"reject";return r==="allow"?I():r==="deny"?G(o):W(o,a,l)},Ir=(e={})=>({check:(t,n)=>{switch(n.goal.mode){case "read-only":return t.type==="fs.readFile"||t.type==="fs.exists"||t.type==="fs.searchText"||t.type==="llm.complete"||t.type==="agent.finish"||t.type==="agent.fail"?f(I()):f(G(`Action ${t.type} is not allowed in read-only mode`));case "propose":{if(t.type==="shell.exec"){let r=je(t.command,e.shell);return f(r??G(`Command not whitelisted: ${t.command.join(" ")}`))}return t.type==="patch.apply"||t.type==="patch.rollback"?f(G(`${t.type} is not allowed in propose mode; use write mode or --apply.`)):f(I())}case "write":{if(t.type==="shell.exec"){let r=je(t.command,e.shell);return f(r??G(`Command not whitelisted: ${t.command.join(" ")}`))}return t.type==="patch.apply"||t.type==="patch.rollback"?f(Tt(t,e.patchApply)):f(I())}case "autonomous":{if(t.type==="patch.apply"||t.type==="patch.rollback")return f(Tt(t,e.patchApply));if(t.type==="shell.exec"){let r=je(t.command,e.shell);return f(r??W(`Run non-whitelisted command: ${_r(t)}`,"high","reject"))}return f(I())}}}}),ha=Ir();var ka={request:()=>f({type:"approved"})},xa=(e="Approval denied by non-interactive policy.")=>({request:()=>f({type:"rejected",reason:e})});var Gr=new Function("specifier","return import(specifier)"),Nt=e=>{let t=e?.toString;return typeof t=="function"?t.call(e,"utf8"):String(e)},wa={exec:(e,t$1)=>j((n,r)=>{let[o,...a]=e;if(!o){r(u$1.failCause(t.fail({_tag:"ShellError",operation:"exec",command:e,cause:new Error("Empty command")})));return}let l="",s="",p=false,d;return Gr("node:child_process").then(({spawn:C})=>{p||(d=C(o,a,{cwd:t$1.cwd,shell:false,stdio:["pipe","pipe","pipe"]}),d.stdout?.on("data",f=>{l+=Nt(f);}),d.stderr?.on("data",f=>{s+=Nt(f);}),d.on("error",f=>{p||(p=true,r(u$1.failCause(t.fail({_tag:"ShellError",operation:"exec",command:e,cause:f}))));}),d.on("close",f=>{p||(p=true,r(u$1.succeed({exitCode:f??1,stdout:l,stderr:s})));}),t$1.stdin!==void 0?d.stdin?.end(t$1.stdin):d.stdin?.end());}).catch(C=>{p||(p=true,r(u$1.failCause(t.fail({_tag:"ShellError",operation:"exec",command:e,cause:C}))));}),()=>{p||(p=true,d?.kill?.("SIGTERM"));}})};var It=new Function("specifier","return import(specifier)"),qr=e=>e.split(`
|
|
22
|
-
`).filter(Boolean).map(t=>{let[n="",r="0",...o]=t.split(":");return {path:n,line:Number(r),text:o.join(":")}}),ja=e=>({readFile:t=>
|
|
23
|
-
`,p=o?"rollback":"apply";if(!a||!l$1.length)return g($e("extract","No unified diff with workspace-scoped paths was found.",r));let d=["git","apply",...o?["--reverse"]:[],"--recount","--whitespace=nowarn","-"],C=["git","apply",...o?["--reverse"]:[],"--check","--recount","--whitespace=nowarn","-"];return l(Br(n,l$1),()=>l(e.exec(C,{cwd:n,stdin:s}),f$1=>f$1.exitCode!==0?g($e(`${p}.check`,f$1.stderr||f$1.stdout||`git apply --check exited with ${f$1.exitCode}`,a)):l(e.exec(d,{cwd:n,stdin:s}),k=>k.exitCode!==0?g($e(p,k.stderr||k.stdout||`git apply exited with ${k.exitCode}`,a)):f({changedFiles:l$1}))))};return {apply:(n,r)=>t(n,r,false),rollback:(n,r)=>t(n,r,true)}};var oe=new Function("specifier","return import(specifier)"),y=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),L=(e,t)=>{if(e!==void 0&&(!Array.isArray(e)||e.some(n=>typeof n!="string")))throw new Error(`${t} must be an array of strings.`)},b=(e,t)=>{if(e!==void 0&&(typeof e!="number"||!Number.isFinite(e)))throw new Error(`${t} must be a finite number.`)},S=(e,t)=>{if(e!==void 0&&typeof e!="boolean")throw new Error(`${t} must be a boolean.`)},h=(e,t)=>{if(e!==void 0&&typeof e!="string")throw new Error(`${t} must be a string.`)},Vr=(e,t)=>{if(typeof e!="string"){if(!y(e))throw new Error(`${t} must be a string or object.`);if(h(e.goal,`${t}.goal`),h(e.cwd,`${t}.cwd`),h(e.patchFile,`${t}.patchFile`),h(e.saveRunDir,`${t}.saveRunDir`),e.preset!==void 0&&(typeof e.preset!="string"||!Lt(e.preset)))throw new Error(`${t}.preset must be one of: fix-tests, inspect, typecheck, lint.`);if(e.mode!==void 0&&(typeof e.mode!="string"||!Ce(e.mode)))throw new Error(`${t}.mode must be one of: read-only, propose, write, autonomous.`);if(e.patchFileMode!==void 0&&e.patchFileMode!=="apply"&&e.patchFileMode!=="rollback")throw new Error(`${t}.patchFileMode must be apply or rollback.`);if(e.goal===void 0&&e.preset===void 0&&e.patchFile===void 0)throw new Error(`${t} must include goal, preset, or patchFile.`)}},zr=(e,t)=>{if(!y(e))throw new Error(`Agent config at ${t} must be a JSON object.`);if(e.mode!==void 0&&(typeof e.mode!="string"||!Ce(e.mode)))throw new Error("config.mode must be one of: read-only, propose, write, autonomous.");if(e.approval!==void 0&&(typeof e.approval!="string"||!$t(e.approval)))throw new Error("config.approval must be one of: auto, interactive, approve, deny.");if(e.llm!==void 0){if(!y(e.llm))throw new Error("config.llm must be an object.");if(e.llm.provider!==void 0&&(typeof e.llm.provider!="string"||!Ft(e.llm.provider)))throw new Error("config.llm.provider must be one of: fake, google, gemini, openai, openai-compatible.");if("apiKey"in e.llm)throw new Error("config.llm.apiKey is not supported. Store secrets in environment variables and use config.llm.apiKeyEnv instead.");h(e.llm.model,"config.llm.model"),h(e.llm.endpoint,"config.llm.endpoint"),h(e.llm.baseUrl,"config.llm.baseUrl"),h(e.llm.apiVersion,"config.llm.apiVersion"),h(e.llm.apiKeyEnv,"config.llm.apiKeyEnv"),h(e.llm.systemInstruction,"config.llm.systemInstruction"),h(e.llm.fakeResponse,"config.llm.fakeResponse"),b(e.llm.temperature,"config.llm.temperature"),b(e.llm.topP,"config.llm.topP"),b(e.llm.topK,"config.llm.topK"),b(e.llm.maxOutputTokens,"config.llm.maxOutputTokens");}if(e.project!==void 0){if(!y(e.project))throw new Error("config.project must be an object.");if(e.project.packageManager!==void 0&&(typeof e.project.packageManager!="string"||!["auto","npm","pnpm","yarn","bun"].includes(e.project.packageManager)))throw new Error("config.project.packageManager must be one of: auto, npm, pnpm, yarn, bun.");L(e.project.validationCommands,"config.project.validationCommands"),L(e.project.testScriptNames,"config.project.testScriptNames"),S(e.project.includeTypecheck,"config.project.includeTypecheck"),S(e.project.includeLint,"config.project.includeLint"),b(e.project.maxValidationCommands,"config.project.maxValidationCommands");}if(e.context!==void 0){if(!y(e.context))throw new Error("config.context must be an object.");S(e.context.enabled,"config.context.enabled"),b(e.context.maxSearchQueries,"config.context.maxSearchQueries"),b(e.context.maxFiles,"config.context.maxFiles"),b(e.context.maxSearchResults,"config.context.maxSearchResults"),L(e.context.globs,"config.context.globs"),L(e.context.excludeGlobs,"config.context.excludeGlobs");}if(e.patchQuality!==void 0){if(!y(e.patchQuality))throw new Error("config.patchQuality must be an object.");if(S(e.patchQuality.enabled,"config.patchQuality.enabled"),b(e.patchQuality.maxRepairAttempts,"config.patchQuality.maxRepairAttempts"),typeof e.patchQuality.maxRepairAttempts=="number"&&e.patchQuality.maxRepairAttempts<0)throw new Error("config.patchQuality.maxRepairAttempts must be greater than or equal to 0.")}if(e.rollback!==void 0){if(!y(e.rollback))throw new Error("config.rollback must be an object.");if(S(e.rollback.enabled,"config.rollback.enabled"),S(e.rollback.onFinalValidationFailure,"config.rollback.onFinalValidationFailure"),S(e.rollback.runValidationAfterRollback,"config.rollback.runValidationAfterRollback"),S(e.rollback.allowForSuppliedPatches,"config.rollback.allowForSuppliedPatches"),b(e.rollback.maxRollbackDepth,"config.rollback.maxRollbackDepth"),typeof e.rollback.maxRollbackDepth=="number"&&e.rollback.maxRollbackDepth<0)throw new Error("config.rollback.maxRollbackDepth must be greater than or equal to 0.");if(e.rollback.strategy!==void 0&&e.rollback.strategy!=="last"&&e.rollback.strategy!=="all")throw new Error("config.rollback.strategy must be one of: last, all.")}if(e.redaction!==void 0){if(!y(e.redaction))throw new Error("config.redaction must be an object.");S(e.redaction.enabled,"config.redaction.enabled"),L(e.redaction.additionalPatterns,"config.redaction.additionalPatterns");}if(e.language!==void 0){if(!y(e.language))throw new Error("config.language must be an object.");if(e.language.response!==void 0&&(typeof e.language.response!="string"||!["auto","match-user","en","es","pt","fr","de","it","custom"].includes(e.language.response)))throw new Error("config.language.response must be one of: auto, match-user, en, es, pt, fr, de, it, custom.");h(e.language.custom,"config.language.custom");}if(e.permissions!==void 0){if(!y(e.permissions))throw new Error("config.permissions must be an object.");if(e.permissions.shell!==void 0){if(!y(e.permissions.shell))throw new Error("config.permissions.shell must be an object.");if(S(e.permissions.shell.inheritDefaults,"config.permissions.shell.inheritDefaults"),L(e.permissions.shell.allow,"config.permissions.shell.allow"),L(e.permissions.shell.deny,"config.permissions.shell.deny"),e.permissions.shell.ask!==void 0){if(!Array.isArray(e.permissions.shell.ask))throw new Error("config.permissions.shell.ask must be an array.");for(let[n,r]of e.permissions.shell.ask.entries())if(typeof r!="string"){if(!y(r))throw new Error(`config.permissions.shell.ask[${n}] must be a string or object.`);if(h(r.pattern,`config.permissions.shell.ask[${n}].pattern`),h(r.reason,`config.permissions.shell.ask[${n}].reason`),r.risk!==void 0&&r.risk!=="low"&&r.risk!=="medium"&&r.risk!=="high")throw new Error(`config.permissions.shell.ask[${n}].risk must be one of: low, medium, high.`);if(r.defaultAnswer!==void 0&&r.defaultAnswer!=="approve"&&r.defaultAnswer!=="reject")throw new Error(`config.permissions.shell.ask[${n}].defaultAnswer must be approve or reject.`)}}}if(e.permissions.patchApply!==void 0){let n=e.permissions.patchApply;if(typeof n=="string"){if(n!=="allow"&&n!=="ask"&&n!=="deny")throw new Error("config.permissions.patchApply must be allow, ask, deny, or an object.")}else if(y(n)){if(n.decision!==void 0&&n.decision!=="allow"&&n.decision!=="ask"&&n.decision!=="deny")throw new Error("config.permissions.patchApply.decision must be allow, ask, or deny.");if(h(n.reason,"config.permissions.patchApply.reason"),n.risk!==void 0&&n.risk!=="low"&&n.risk!=="medium"&&n.risk!=="high")throw new Error("config.permissions.patchApply.risk must be one of: low, medium, high.");if(n.defaultAnswer!==void 0&&n.defaultAnswer!=="approve"&&n.defaultAnswer!=="reject")throw new Error("config.permissions.patchApply.defaultAnswer must be approve or reject.")}else throw new Error("config.permissions.patchApply must be allow, ask, deny, or an object.")}}if(e.tools!==void 0){if(!y(e.tools))throw new Error("config.tools must be an object.");for(let[n,r]of Object.entries(e.tools)){if(!y(r))throw new Error(`config.tools.${n} must be an object.`);b(r.timeoutMs,`config.tools.${n}.timeoutMs`),b(r.retries,`config.tools.${n}.retries`);}}if(e.batch!==void 0){if(!y(e.batch))throw new Error("config.batch must be an object.");if(S(e.batch.stopOnFailure,"config.batch.stopOnFailure"),e.batch.goals!==void 0){if(!Array.isArray(e.batch.goals))throw new Error("config.batch.goals must be an array.");e.batch.goals.forEach((n,r)=>Vr(n,`config.batch.goals[${r}]`));}}return e},qt=async e=>{let{stat:t}=await oe("node:fs/promises");try{return (await t(e)).isFile()}catch{return false}},Ur=async e=>{let t=await oe("node:path"),n=t.resolve(e);for(;;){for(let o of Mt){let a=t.join(n,o);if(await qt(a))return a}let r=t.dirname(n);if(r===n)return;n=r;}},Gt=async e=>{let{readFile:t}=await oe("node:fs/promises"),n=String(await t(e,"utf8")).replace(/^\uFEFF/,"");try{return zr(JSON.parse(n),e)}catch(r){throw r instanceof SyntaxError?new Error(`Invalid JSON in agent config ${e}: ${r.message}`):r}},Na=async e=>{if(e.noConfig)return {config:{}};let t=await oe("node:path");if(e.configPath){let r=t.isAbsolute(e.configPath)?e.configPath:t.resolve(e.cwd,e.configPath);if(!await qt(r))throw new Error(`Agent config not found or not a file: ${r}`);return {path:r,config:await Gt(r)}}let n=await Ur(e.cwd);return n?{path:n,config:await Gt(n)}:{config:{}}};var Wr=e=>e?.choices?.[0]?.message?.content??e?.output_text??e?.content?.[0]?.text??JSON.stringify(e),qa=e=>({complete:t=>Q(async n=>{let r=await fetch(e.endpoint,{method:"POST",signal:n,headers:{"content-type":"application/json",authorization:`Bearer ${e.apiKey}`},body:JSON.stringify({model:e.model,messages:[{role:"user",content:t.prompt}]})});if(!r.ok)throw new Error(`LLM request failed with ${r.status}`);return {content:Wr(await r.json())}},n=>({_tag:"LLMError",cause:n}))});var Qr="gemini-2.5-flash",Kr="v1beta",Zr="https://generativelanguage.googleapis.com",Hr=e=>{let t=e.length;for(;t>0&&e.charCodeAt(t-1)===47;)t-=1;return t===e.length?e:e.slice(0,t)},Jr=e=>e.startsWith("models/")?e:`models/${e}`,Xr=e=>{if(e.endpoint)return e.endpoint;let t=Hr(e.baseUrl??Zr),n=e.apiVersion??Kr,r=Jr(e.model??Qr);return `${t}/${n}/${r}:generateContent`},ae=e=>typeof e=="number"&&Number.isFinite(e)?e:void 0,Bt=e=>Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0)),Yr=(e,t)=>{let n=Bt({temperature:ae(t.temperature),topP:ae(t.topP),topK:ae(t.topK),maxOutputTokens:ae(t.maxOutputTokens),stopSequences:t.stopSequences,responseMimeType:t.responseMimeType,...t.extraGenerationConfig??{}});return Bt({contents:[{role:"user",parts:[{text:e.prompt}]}],systemInstruction:t.systemInstruction?{parts:[{text:t.systemInstruction}]}:void 0,generationConfig:Object.keys(n).length>0?n:void 0})},eo=e=>{let t=e.candidates?.flatMap(o=>o.content?.parts??[]).map(o=>o.text??"").filter(Boolean).join(`
|
|
24
|
-
`).trim();if(t)return t;let n=e.promptFeedback?.blockReason;if(n){let o=e.promptFeedback?.blockReasonMessage;throw new Error(`Google Gemini blocked the prompt: ${n}${o?` - ${o}`:""}`)}let r=e.candidates?.[0]?.finishReason;if(r)throw new Error(`Google Gemini returned no text. finishReason=${r}`);if(e.error?.message)throw new Error(`Google Gemini error: ${e.error.message}`);return JSON.stringify(e)},to=async e=>{let t=await e.text();try{return JSON.parse(t).error?.message??t}catch{return t}},za=e=>({complete:t=>
|
|
21
|
+
`).trim())},ur=e=>{let t=D(e,"agent.error")?.error,n=te(e.goal);if(!t)return n?"La ejecuci\xF3n del agente fall\xF3.":"Agent run failed.";switch(t._tag){case "FsError":return n?`El agente se detuvo por un error de filesystem durante ${t.operation}: ${R(e,t.cause)}`:`Agent stopped after a filesystem error during ${t.operation}: ${R(e,t.cause)}`;case "ShellError":return n?`El agente se detuvo por un error ejecutando ${t.command?.join(" ")??t.operation}: ${R(e,t.cause)}`:`Agent stopped after a shell error during ${t.command?.join(" ")??t.operation}: ${R(e,t.cause)}`;case "LLMError":return n?`El agente se detuvo porque fall\xF3 la llamada al modelo: ${R(e,t.cause)}`:`Agent stopped because the model call failed: ${R(e,t.cause)}`;case "PatchError":return n?`El agente se detuvo por un error de patch durante ${t.operation}: ${R(e,t.cause)}`:`Agent stopped after a patch error during ${t.operation}: ${R(e,t.cause)}`;case "PermissionDenied":return n?`El agente se detuvo porque una acci\xF3n fue denegada por policy: ${t.reason}`:`Agent stopped because an action was denied by policy: ${t.reason}`;case "ApprovalRejected":return n?`El agente se detuvo porque se rechaz\xF3 una aprobaci\xF3n: ${t.reason}`:`Agent stopped because an approval was rejected: ${t.reason}`;case "ToolTimeout":return n?`El agente se detuvo porque una tool tard\xF3 m\xE1s de ${t.timeoutMs}ms.`:`Agent stopped because a tool timed out after ${t.timeoutMs}ms.`;case "PathOutsideWorkspace":return n?`El agente bloque\xF3 un path fuera del workspace: ${t.path}`:`Agent blocked a path outside the workspace: ${t.path}`;case "AgentLoopError":return n?`El agente se detuvo por un error del loop: ${t.message}`:`Agent stopped after an agent loop error: ${t.message}`}},gr=e=>{if(e.goal.mode==="read-only")return;let t=P(e).validationCommands,n=X(t,ar(e));return n?{type:"shell.exec",command:n}:void 0},mr=e=>{let t=P(e).validationCommands,n=X(t,Ee(e));return n?{type:"shell.exec",command:n}:void 0},ht=e=>{let t=P(e).validationCommands,n=X(t,we(e));return n?{type:"shell.exec",command:n}:void 0},fr=e=>{for(let t=e.observations.length-1;t>=0;t-=1){let n=e.observations[t];if(!n||n.type!=="llm.response")continue;let r=M(n.content);if(!r)continue;return e.observations.slice(t+1).some(a=>a.type==="patch.applied"||a.type==="patch.proposed")?void 0:{index:t,patch:r}}},yr=e=>{for(let t=e.observations.length-1;t>=0;t-=1){let n=e.observations[t];if(n?.type!=="llm.response")continue;let r=M(n.content);if(r)return r}},hr=e=>{for(let t=e.observations.length-1;t>=0;t-=1){let n=e.observations[t];if(n?.type==="patch.proposed")return n.patch;if(n?.type==="patch.applied"){if(n.patch)return n.patch;let r=e.observations.slice(0,t).reverse().find(o=>o.type==="llm.response"&&!!M(o.content));return r?M(r.content):e.goal.initialPatch}}},Ar=e=>{if(!N(e.goal.mode)||V(e)?.type!=="patch.applied"||!ee(e))return false;let t=P(e).validationCommands;return tt(t,Ee(e)).type==="failed"},br=e=>{if(!N(e.goal.mode)||V(e)?.type!=="patch.applied"||ee(e)||!O(e).onFinalValidationFailure||!ke(e))return false;let n=P(e).validationCommands;return at(n,we(e)).type==="failed"},kr=e=>{if(!N(e.goal.mode)||!ee(e))return false;let t=e.observations.at(-1);return t?.type==="agent.error"&&t.error._tag==="PatchError"},gt=(e,t)=>({type:"llm.complete",purpose:"patch",prompt:pr(e,t)}),mt=(e,t)=>{let n=rt(e);if(n)return {type:"patch.rollback",patch:n.patch,automatic:true,reason:t}},xr=(e,t)=>{if(N(e.goal.mode))return e.goal.initialPatchMode==="rollback"?ne(e,"patch.rolledBack")?void 0:{type:"patch.rollback",patch:t}:ne(e,"patch.applied")?ht(e):{type:"patch.apply",patch:t};if(e.goal.mode==="propose"&&!ne(e,"patch.proposed"))return {type:"patch.propose",patch:t}},At=e=>{if(e.observations.at(-1)?.type==="agent.error")return kr(e)?f(gt(e,"previous patch failed to apply")):f({type:"agent.finish",summary:ur(e)});if(!ne(e,"fs.fileRead"))return f({type:"fs.readFile",path:"package.json"});let n=Ye(e);if(n)return f(n);let r=e.goal.initialPatch?.trim();if(r){let s=xr(e,r);return s?f(s):f({type:"agent.finish",summary:ut(e,r)})}let o=fr(e);if(o){if(N(e.goal.mode))return f({type:"patch.apply",patch:o.patch});if(e.goal.mode==="propose")return f({type:"patch.propose",patch:o.patch})}if(!e.observations.find(s=>s.type==="llm.response"&&s.purpose==="plan")){let s=gr(e);if(s)return f(s);let p=We(e);return p?f(p):f({type:"llm.complete",purpose:"plan",prompt:lr(e)})}if(N(e.goal.mode)){if(ot(e)){let s=mt(e,"continuing rollback of generated patch stack");if(s)return f(s)}if(V(e)?.type==="patch.rolledBack"&&O(e).runValidationAfterRollback){let p=ht(e);if(p)return f(p)}if(V(e)?.type==="patch.applied"){let s=mr(e);if(s)return f(s);if(Ar(e))return f(gt(e,"validation failed after applying the generated patch"));if(br(e)){let p=mt(e,"validation failed after generated patches and no repair attempts remain");if(p)return f(p)}}}let l=yr(e);return f({type:"agent.finish",summary:ut(e,l)})};var v=()=>j((e,t)=>{t({_tag:"Success",value:Date.now()});}),E=e=>j((t,n)=>{try{t.events?.emit(e);}catch{}n({_tag:"Success",value:void 0});}),Pe=e=>e.reduce((t,n)=>l(t,()=>E(n)),f(void 0)),_o=e=>{switch(e.type){case "fs.readFile":return `read ${e.path}`;case "fs.exists":return `check ${e.path}`;case "fs.searchText":return `search "${e.query}"`;case "shell.exec":return e.command.join(" ");case "llm.complete":return `llm.${e.purpose}`;case "patch.propose":return "propose patch";case "patch.apply":return "apply patch";case "patch.rollback":return "rollback patch";case "agent.finish":return "finish";case "agent.fail":return "fail"}},To=e=>{switch(e.type){case "fs.fileRead":return `read ${e.path}`;case "fs.exists":return `${e.exists?"found":"missing"} ${e.path}`;case "fs.searchResult":return `search "${e.query}" (${e.matches.length} matches)`;case "shell.result":return `${e.command.join(" ")} exited ${e.exitCode}`;case "llm.response":return `llm.${e.purpose} responded`;case "patch.proposed":return "patch proposed";case "patch.applied":return `patch applied (${e.changedFiles.join(", ")||"no files reported"})`;case "patch.rolledBack":return `patch rolled back (${e.changedFiles.join(", ")||"no files reported"})`;case "agent.done":return "done";case "agent.error":return `error ${e.error._tag}`}},Oo=e=>{switch(e.type){case "agent.error":return "fail";case "shell.result":return e.exitCode===0?"ok":"warn";default:return "ok"}},bt=(e,t,n,r)=>{switch(n._tag){case "ToolTimeout":return {type:"agent.tool.timeout",action:e,step:t.steps+1,phase:t.phase,timeoutMs:n.timeoutMs,at:r};case "PermissionDenied":return {type:"agent.permission.denied",action:e,step:t.steps+1,phase:t.phase,reason:n.reason,at:r};default:return}},kt=(e,t,n)=>{switch(t.type){case "patch.applied":return {type:"agent.patch.applied",step:e.steps,phase:e.phase,changedFiles:t.changedFiles,automaticRollbackEligible:!!t.patch,at:n};case "patch.rolledBack":return {type:"agent.patch.rolledBack",step:e.steps,phase:e.phase,changedFiles:t.changedFiles,...t.automatic!==void 0?{automatic:t.automatic}:{},...t.reason?{reason:t.reason}:{},at:n};default:return}},xt=e=>e==="done"?"done":"failed";var x=e=>h$1(t=>t[e]);var Sr=e=>e.startsWith("/")||/^[A-Za-z]:[\\/]/.test(e),vr=e=>{let t=e.length;for(;t>0;){let n=e.charCodeAt(t-1);if(n!==47&&n!==92)break;t-=1;}return t===e.length?e:e.slice(0,t)},Er=e=>e.replace(/^(?:\.[\\/])+/,""),wr=e=>{let t=e.trim();if(!(!t||t.includes("\0")||Sr(t)||t.split(/[\\/]+/).includes("..")))return Er(t)};var U=(e,t)=>{let n=wr(t);return n?f(`${vr(e)}/${n}`):g({_tag:"PathOutsideWorkspace",path:t,cwd:e})};var St=(e,t)=>{switch(e.type){case "fs.readFile":return l(U(t.goal.cwd,e.path),n=>l(x("fs"),r=>k(r.readFile(n),o=>({type:"fs.fileRead",path:e.path,content:o}))));case "fs.exists":return l(U(t.goal.cwd,e.path),n=>l(x("fs"),r=>k(r.exists(n),o=>({type:"fs.exists",path:e.path,exists:o}))));case "fs.searchText":return l(x("fs"),n=>k(n.searchText(t.goal.cwd,e.query,{globs:e.globs}),r=>({type:"fs.searchResult",query:e.query,matches:r})));case "shell.exec":return l(x("shell"),n=>k(n.exec(e.command,{cwd:e.cwd??t.goal.cwd}),r=>({type:"shell.result",command:e.command,exitCode:r.exitCode,stdout:r.stdout,stderr:r.stderr})));case "llm.complete":return l(x("llm"),n=>k(n.complete({purpose:e.purpose,prompt:e.prompt}),r=>({type:"llm.response",purpose:e.purpose,content:r.content})));case "patch.propose":return f({type:"patch.proposed",patch:e.patch});case "patch.apply":return l(x("patch"),n=>k(n.apply(t.goal.cwd,e.patch),r=>({type:"patch.applied",changedFiles:r.changedFiles,patch:e.patch})));case "patch.rollback":return l(x("patch"),n=>k(n.rollback(t.goal.cwd,e.patch),r=>({type:"patch.rolledBack",changedFiles:r.changedFiles,patch:e.patch,...e.automatic!==void 0?{automatic:e.automatic}:{},...e.reason?{reason:e.reason}:{}})));case "agent.finish":return f({type:"agent.done",summary:e.summary});case "agent.fail":return g({_tag:"AgentLoopError",message:e.reason})}};var vt=(e,t)=>{let n=r=>b$1(e(),o=>r>0&&t.while(o)?n(r-1):g(o),o=>f(o));return n(t.times)};var Pr=e=>j((t,n)=>{let r=setTimeout(()=>n({_tag:"Success",value:void 0}),e);return ()=>clearTimeout(r)}),Et=(e,t,n)=>ia(e,l(Pr(t),()=>g({_tag:"ToolTimeout",timeoutMs:t})),n);var wt=e=>e._tag==="LLMError"||e._tag==="ToolTimeout",Rr=e=>{switch(e.type){case "fs.readFile":case "fs.exists":case "fs.searchText":return {timeoutMs:5e3,retries:1,retryable:wt};case "llm.complete":return {timeoutMs:6e4,retries:2,retryable:wt};case "shell.exec":return {timeoutMs:12e4,retries:0,retryable:()=>false};case "patch.propose":case "agent.finish":case "agent.fail":return {timeoutMs:1e3,retries:0,retryable:()=>false};case "patch.apply":case "patch.rollback":return {timeoutMs:15e3,retries:0,retryable:()=>false}}},Cr=(e,t)=>{let n=Rr(e),r=t?.[e.type];return {...n,timeoutMs:r?.timeoutMs!==void 0?Math.max(1,Math.floor(r.timeoutMs)):n.timeoutMs,retries:r?.retries!==void 0?Math.max(0,Math.floor(r.retries)):n.retries}},Pt=(e,t,n)=>l(h$1(r=>r.toolPolicies),r=>{let o=Cr(e,r);return vt(()=>Et(St(e,t),o.timeoutMs,n),{times:o.retries,while:o.retryable})}),Rt=(e,t)=>({_tag:"ApprovalRejected",action:e,reason:t}),Re=(e,t,n,r)=>l(v(),o=>E({type:"agent.approval.resolved",action:e,step:t.steps+1,phase:t.phase,approved:n,...r?{reason:r}:{},at:o})),jr=(e,t,n)=>{let r=n.defaultAnswer??"reject";return l(v(),o=>l(E({type:"agent.approval.requested",action:e,step:t.steps+1,phase:t.phase,reason:n.reason,risk:n.risk,defaultAnswer:r,at:o}),()=>l(x("approvals"),a=>{if(!a){let l$1="No approval service configured.";return l(Re(e,t,false,l$1),()=>g(Rt(e,l$1)))}return l(a.request({action:e,state:t,reason:n.reason,risk:n.risk,defaultAnswer:r}),l$1=>{if(l$1.type==="approved")return l(Re(e,t,true,void 0),()=>f(void 0));let s=l$1.reason??"Approval rejected.";return l(Re(e,t,false,s),()=>g(Rt(e,s)))})})))},Ct=(e,t,n)=>l(x("permissions"),r=>l(r.check(e,t),o=>o.type==="deny"?g({_tag:"PermissionDenied",action:e,reason:o.reason}):o.type==="ask"?l(jr(e,t,o),()=>Pt(e,t,n)):Pt(e,t,n)));var $r=(e,t,n)=>l(v(),r=>l(E({type:"agent.action.started",action:e,step:t.steps+1,phase:t.phase,at:r}),()=>b$1(Ct(e,t,n),o=>l(v(),a=>{let l$1=bt(e,t,o,a),s=[...l$1?[l$1]:[],{type:"agent.action.failed",action:e,error:o,step:t.steps+1,phase:t.phase,durationMs:a-r,at:a}];return l(Pe(s),()=>f({type:"agent.error",error:o}))}),o=>l(v(),a=>l(E({type:"agent.action.completed",action:e,observation:o,step:t.steps+1,phase:t.phase,durationMs:a-r,at:a}),()=>f(o)))))),Fr=(e,t)=>l(v(),n=>{let r=kt(e,t,n),o=[{type:"agent.observation.recorded",observation:t,step:e.steps,phase:e.phase,at:n},...r?[r]:[]];return Pe(o)}),jt=(e,t,n)=>Te(e)?l(v(),r=>l(E({type:"agent.run.completed",goal:e.goal,status:xt(e.phase),phase:e.phase,steps:e.steps,durationMs:r-n,at:r}),()=>f(e))):l(At(e),r=>l($r(r,e,t),o=>{let a=_e(e,o);return l(Fr(a,o),()=>jt(a,t,n))})),da=(e,t)=>ga(e,n=>l(v(),r=>l(E({type:"agent.run.started",goal:t,at:r}),()=>jt(Le(t),n,r))));var Ce=e=>e==="read-only"||e==="propose"||e==="write"||e==="autonomous",$t=e=>e==="auto"||e==="interactive"||e==="approve"||e==="deny",Ft=e=>e==="fake"||e==="google"||e==="gemini"||e==="openai"||e==="openai-compatible",Mt=[".brass-agent.json","brass-agent.config.json"];var Lt=e=>e==="fix-tests"||e==="inspect"||e==="typecheck"||e==="lint",ma=e=>{switch(e){case "fix-tests":return "fix the failing tests";case "inspect":return "inspect this workspace and summarize the current project state";case "typecheck":return "run typecheck discovery and fix type errors if possible";case "lint":return "run lint discovery and fix lint errors if possible"}};var Mr=["npm test","npm run test*","npm run typecheck","npm run type-check","npm run check-types","npm run tsc","npm run check","npm run *check*","npm run *doctor*","npm run *health*","npm run *verify*","npm run *validate*","npm run repo:check","npm run lint*","pnpm test","pnpm run test*","pnpm run typecheck","pnpm run type-check","pnpm run check-types","pnpm run tsc","pnpm run check","pnpm run *check*","pnpm run *doctor*","pnpm run *health*","pnpm run *verify*","pnpm run *validate*","pnpm run repo:check","pnpm run lint*","yarn test","yarn run test*","yarn run typecheck","yarn run type-check","yarn run check-types","yarn run tsc","yarn run check","yarn run *check*","yarn run *doctor*","yarn run *health*","yarn run *verify*","yarn run *validate*","yarn run repo:check","yarn run lint*","bun run test*","bun run typecheck","bun run type-check","bun run check-types","bun run tsc","bun run check","bun run *check*","bun run *doctor*","bun run *health*","bun run *verify*","bun run *validate*","bun run repo:check","bun run lint*","cargo check","cargo test","cargo fmt --check","cargo clippy","cargo clippy *","git status","git diff","git log"],Ot=e=>e.trim().replace(/\s+/g," "),re=e=>Ot(e.join(" ")),Lr=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Dt=(e,t)=>{let n=re(e),r=Ot(t);return r.includes("*")?new RegExp(`^${r.split("*").map(Lr).join(".*")}$`).test(n):n===r},_t=(e,t)=>!!t?.some(n=>Dt(e,n)),I=()=>({type:"allow"}),G=e=>({type:"deny",reason:e}),W=(e,t,n="reject")=>({type:"ask",reason:e,risk:t,defaultAnswer:n}),_r=e=>e.type==="shell.exec"?e.command.join(" "):e.type,Tr=e=>typeof e=="string"?e:e.pattern,Or=(e,t)=>{let n=t?.find(r=>Dt(e,Tr(r)));if(n)return typeof n=="string"?W(`Run command: ${re(e)}`,"high","reject"):W(n.reason??`Run command: ${re(e)}`,n.risk??"high",n.defaultAnswer??"reject")},Dr=e=>[...e?.inheritDefaults===false?[]:Mr,...e?.allow??[]],je=(e,t)=>{if(_t(e,t?.deny))return G(`Command denied by policy: ${re(e)}`);let n=Or(e,t?.ask);if(n)return n;if(_t(e,Dr(t)))return I()},Nr=e=>e.type==="patch.rollback"?"Reverse-apply a patch to restore the workspace.":"Apply the proposed patch to the workspace.",Tt=(e,t)=>{let n=Nr(e);if(!t)return W(n,"high","reject");let r=typeof t=="string"?t:t.decision??"ask",o=typeof t=="string"?n:t.reason??n,a=typeof t=="string"?"high":t.risk??"high",l=typeof t=="string"?"reject":t.defaultAnswer??"reject";return r==="allow"?I():r==="deny"?G(o):W(o,a,l)},Ir=(e={})=>({check:(t,n)=>{switch(n.goal.mode){case "read-only":return t.type==="fs.readFile"||t.type==="fs.exists"||t.type==="fs.searchText"||t.type==="llm.complete"||t.type==="agent.finish"||t.type==="agent.fail"?f(I()):f(G(`Action ${t.type} is not allowed in read-only mode`));case "propose":{if(t.type==="shell.exec"){let r=je(t.command,e.shell);return f(r??G(`Command not whitelisted: ${t.command.join(" ")}`))}return t.type==="patch.apply"||t.type==="patch.rollback"?f(G(`${t.type} is not allowed in propose mode; use write mode or --apply.`)):f(I())}case "write":{if(t.type==="shell.exec"){let r=je(t.command,e.shell);return f(r??G(`Command not whitelisted: ${t.command.join(" ")}`))}return t.type==="patch.apply"||t.type==="patch.rollback"?f(Tt(t,e.patchApply)):f(I())}case "autonomous":{if(t.type==="patch.apply"||t.type==="patch.rollback")return f(Tt(t,e.patchApply));if(t.type==="shell.exec"){let r=je(t.command,e.shell);return f(r??W(`Run non-whitelisted command: ${_r(t)}`,"high","reject"))}return f(I())}}}}),ha=Ir();var ka={request:()=>f({type:"approved"})},xa=(e="Approval denied by non-interactive policy.")=>({request:()=>f({type:"rejected",reason:e})});var Gr=new Function("specifier","return import(specifier)"),Nt=e=>{let t=e?.toString;return typeof t=="function"?t.call(e,"utf8"):String(e)},wa={exec:(e,t$1)=>j((n,r)=>{let[o,...a]=e;if(!o){r(u$1.failCause(t.fail({_tag:"ShellError",operation:"exec",command:e,cause:new Error("Empty command")})));return}let l="",s="",p=false,d;return Gr("node:child_process").then(({spawn:C})=>{p||(d=C(o,a,{cwd:t$1.cwd,shell:false,stdio:["pipe","pipe","pipe"]}),d.stdout?.on("data",f=>{l+=Nt(f);}),d.stderr?.on("data",f=>{s+=Nt(f);}),d.on("error",f=>{p||(p=true,r(u$1.failCause(t.fail({_tag:"ShellError",operation:"exec",command:e,cause:f}))));}),d.on("close",f=>{p||(p=true,r(u$1.succeed({exitCode:f??1,stdout:l,stderr:s})));}),t$1.stdin!==void 0?d.stdin?.end(t$1.stdin):d.stdin?.end());}).catch(C=>{p||(p=true,r(u$1.failCause(t.fail({_tag:"ShellError",operation:"exec",command:e,cause:C}))));}),()=>{p||(p=true,d?.kill?.("SIGTERM"));}})};var It=new Function("specifier","return import(specifier)"),qr=e=>e.split(`
|
|
22
|
+
`).filter(Boolean).map(t=>{let[n="",r="0",...o]=t.split(":");return {path:n,line:Number(r),text:o.join(":")}}),ja=e=>({readFile:t=>da$1(async n=>{let{readFile:r}=await It("node:fs/promises");return r(t,{encoding:"utf8",signal:n})},n=>({_tag:"FsError",operation:"readFile",cause:n})),exists:t=>da$1(async n=>{if(n.aborted)return false;let{stat:r}=await It("node:fs/promises");if(n.aborted)return false;try{return await r(t),!0}catch{return false}},n=>({_tag:"FsError",operation:"exists",cause:n})),searchText:(t,n,r)=>l(e.exec(["rg","--fixed-strings","--line-number","--no-heading","--color","never","--max-count","5",...r?.globs?.flatMap(o=>["--glob",o])??[],"--",n,"."],{cwd:t}),o=>o.exitCode>1?g({_tag:"FsError",operation:"searchText",cause:o.stderr}):f(qr(o.stdout)))});var Br=(e,t)=>t.reduce((n,r)=>l(n,o=>l(U(e,r),()=>f([...o,r]))),f([])),$e=(e,t,n)=>({_tag:"PatchError",operation:e,cause:t,patch:n}),_a=e=>{let t=(n,r,o)=>{let a=M(r)??r.trim(),l$1=it(a),s=`${a.trim()}
|
|
23
|
+
`,p=o?"rollback":"apply";if(!a||!l$1.length)return g($e("extract","No unified diff with workspace-scoped paths was found.",r));let d=["git","apply",...o?["--reverse"]:[],"--recount","--whitespace=nowarn","-"],C=["git","apply",...o?["--reverse"]:[],"--check","--recount","--whitespace=nowarn","-"];return l(Br(n,l$1),()=>l(e.exec(C,{cwd:n,stdin:s}),f$1=>f$1.exitCode!==0?g($e(`${p}.check`,f$1.stderr||f$1.stdout||`git apply --check exited with ${f$1.exitCode}`,a)):l(e.exec(d,{cwd:n,stdin:s}),k=>k.exitCode!==0?g($e(p,k.stderr||k.stdout||`git apply exited with ${k.exitCode}`,a)):f({changedFiles:l$1}))))};return {apply:(n,r)=>t(n,r,false),rollback:(n,r)=>t(n,r,true)}};var oe=new Function("specifier","return import(specifier)"),y=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),L=(e,t)=>{if(e!==void 0&&(!Array.isArray(e)||e.some(n=>typeof n!="string")))throw new Error(`${t} must be an array of strings.`)},b=(e,t)=>{if(e!==void 0&&(typeof e!="number"||!Number.isFinite(e)))throw new Error(`${t} must be a finite number.`)},S=(e,t)=>{if(e!==void 0&&typeof e!="boolean")throw new Error(`${t} must be a boolean.`)},h=(e,t)=>{if(e!==void 0&&typeof e!="string")throw new Error(`${t} must be a string.`)},Vr=(e,t)=>{if(typeof e!="string"){if(!y(e))throw new Error(`${t} must be a string or object.`);if(h(e.goal,`${t}.goal`),h(e.cwd,`${t}.cwd`),h(e.patchFile,`${t}.patchFile`),h(e.saveRunDir,`${t}.saveRunDir`),e.preset!==void 0&&(typeof e.preset!="string"||!Lt(e.preset)))throw new Error(`${t}.preset must be one of: fix-tests, inspect, typecheck, lint.`);if(e.mode!==void 0&&(typeof e.mode!="string"||!Ce(e.mode)))throw new Error(`${t}.mode must be one of: read-only, propose, write, autonomous.`);if(e.patchFileMode!==void 0&&e.patchFileMode!=="apply"&&e.patchFileMode!=="rollback")throw new Error(`${t}.patchFileMode must be apply or rollback.`);if(e.goal===void 0&&e.preset===void 0&&e.patchFile===void 0)throw new Error(`${t} must include goal, preset, or patchFile.`)}},zr=(e,t)=>{if(!y(e))throw new Error(`Agent config at ${t} must be a JSON object.`);if(e.mode!==void 0&&(typeof e.mode!="string"||!Ce(e.mode)))throw new Error("config.mode must be one of: read-only, propose, write, autonomous.");if(e.approval!==void 0&&(typeof e.approval!="string"||!$t(e.approval)))throw new Error("config.approval must be one of: auto, interactive, approve, deny.");if(e.llm!==void 0){if(!y(e.llm))throw new Error("config.llm must be an object.");if(e.llm.provider!==void 0&&(typeof e.llm.provider!="string"||!Ft(e.llm.provider)))throw new Error("config.llm.provider must be one of: fake, google, gemini, openai, openai-compatible.");if("apiKey"in e.llm)throw new Error("config.llm.apiKey is not supported. Store secrets in environment variables and use config.llm.apiKeyEnv instead.");h(e.llm.model,"config.llm.model"),h(e.llm.endpoint,"config.llm.endpoint"),h(e.llm.baseUrl,"config.llm.baseUrl"),h(e.llm.apiVersion,"config.llm.apiVersion"),h(e.llm.apiKeyEnv,"config.llm.apiKeyEnv"),h(e.llm.systemInstruction,"config.llm.systemInstruction"),h(e.llm.fakeResponse,"config.llm.fakeResponse"),b(e.llm.temperature,"config.llm.temperature"),b(e.llm.topP,"config.llm.topP"),b(e.llm.topK,"config.llm.topK"),b(e.llm.maxOutputTokens,"config.llm.maxOutputTokens");}if(e.project!==void 0){if(!y(e.project))throw new Error("config.project must be an object.");if(e.project.packageManager!==void 0&&(typeof e.project.packageManager!="string"||!["auto","npm","pnpm","yarn","bun"].includes(e.project.packageManager)))throw new Error("config.project.packageManager must be one of: auto, npm, pnpm, yarn, bun.");L(e.project.validationCommands,"config.project.validationCommands"),L(e.project.testScriptNames,"config.project.testScriptNames"),S(e.project.includeTypecheck,"config.project.includeTypecheck"),S(e.project.includeLint,"config.project.includeLint"),b(e.project.maxValidationCommands,"config.project.maxValidationCommands");}if(e.context!==void 0){if(!y(e.context))throw new Error("config.context must be an object.");S(e.context.enabled,"config.context.enabled"),b(e.context.maxSearchQueries,"config.context.maxSearchQueries"),b(e.context.maxFiles,"config.context.maxFiles"),b(e.context.maxSearchResults,"config.context.maxSearchResults"),L(e.context.globs,"config.context.globs"),L(e.context.excludeGlobs,"config.context.excludeGlobs");}if(e.patchQuality!==void 0){if(!y(e.patchQuality))throw new Error("config.patchQuality must be an object.");if(S(e.patchQuality.enabled,"config.patchQuality.enabled"),b(e.patchQuality.maxRepairAttempts,"config.patchQuality.maxRepairAttempts"),typeof e.patchQuality.maxRepairAttempts=="number"&&e.patchQuality.maxRepairAttempts<0)throw new Error("config.patchQuality.maxRepairAttempts must be greater than or equal to 0.")}if(e.rollback!==void 0){if(!y(e.rollback))throw new Error("config.rollback must be an object.");if(S(e.rollback.enabled,"config.rollback.enabled"),S(e.rollback.onFinalValidationFailure,"config.rollback.onFinalValidationFailure"),S(e.rollback.runValidationAfterRollback,"config.rollback.runValidationAfterRollback"),S(e.rollback.allowForSuppliedPatches,"config.rollback.allowForSuppliedPatches"),b(e.rollback.maxRollbackDepth,"config.rollback.maxRollbackDepth"),typeof e.rollback.maxRollbackDepth=="number"&&e.rollback.maxRollbackDepth<0)throw new Error("config.rollback.maxRollbackDepth must be greater than or equal to 0.");if(e.rollback.strategy!==void 0&&e.rollback.strategy!=="last"&&e.rollback.strategy!=="all")throw new Error("config.rollback.strategy must be one of: last, all.")}if(e.redaction!==void 0){if(!y(e.redaction))throw new Error("config.redaction must be an object.");S(e.redaction.enabled,"config.redaction.enabled"),L(e.redaction.additionalPatterns,"config.redaction.additionalPatterns");}if(e.language!==void 0){if(!y(e.language))throw new Error("config.language must be an object.");if(e.language.response!==void 0&&(typeof e.language.response!="string"||!["auto","match-user","en","es","pt","fr","de","it","custom"].includes(e.language.response)))throw new Error("config.language.response must be one of: auto, match-user, en, es, pt, fr, de, it, custom.");h(e.language.custom,"config.language.custom");}if(e.permissions!==void 0){if(!y(e.permissions))throw new Error("config.permissions must be an object.");if(e.permissions.shell!==void 0){if(!y(e.permissions.shell))throw new Error("config.permissions.shell must be an object.");if(S(e.permissions.shell.inheritDefaults,"config.permissions.shell.inheritDefaults"),L(e.permissions.shell.allow,"config.permissions.shell.allow"),L(e.permissions.shell.deny,"config.permissions.shell.deny"),e.permissions.shell.ask!==void 0){if(!Array.isArray(e.permissions.shell.ask))throw new Error("config.permissions.shell.ask must be an array.");for(let[n,r]of e.permissions.shell.ask.entries())if(typeof r!="string"){if(!y(r))throw new Error(`config.permissions.shell.ask[${n}] must be a string or object.`);if(h(r.pattern,`config.permissions.shell.ask[${n}].pattern`),h(r.reason,`config.permissions.shell.ask[${n}].reason`),r.risk!==void 0&&r.risk!=="low"&&r.risk!=="medium"&&r.risk!=="high")throw new Error(`config.permissions.shell.ask[${n}].risk must be one of: low, medium, high.`);if(r.defaultAnswer!==void 0&&r.defaultAnswer!=="approve"&&r.defaultAnswer!=="reject")throw new Error(`config.permissions.shell.ask[${n}].defaultAnswer must be approve or reject.`)}}}if(e.permissions.patchApply!==void 0){let n=e.permissions.patchApply;if(typeof n=="string"){if(n!=="allow"&&n!=="ask"&&n!=="deny")throw new Error("config.permissions.patchApply must be allow, ask, deny, or an object.")}else if(y(n)){if(n.decision!==void 0&&n.decision!=="allow"&&n.decision!=="ask"&&n.decision!=="deny")throw new Error("config.permissions.patchApply.decision must be allow, ask, or deny.");if(h(n.reason,"config.permissions.patchApply.reason"),n.risk!==void 0&&n.risk!=="low"&&n.risk!=="medium"&&n.risk!=="high")throw new Error("config.permissions.patchApply.risk must be one of: low, medium, high.");if(n.defaultAnswer!==void 0&&n.defaultAnswer!=="approve"&&n.defaultAnswer!=="reject")throw new Error("config.permissions.patchApply.defaultAnswer must be approve or reject.")}else throw new Error("config.permissions.patchApply must be allow, ask, deny, or an object.")}}if(e.tools!==void 0){if(!y(e.tools))throw new Error("config.tools must be an object.");for(let[n,r]of Object.entries(e.tools)){if(!y(r))throw new Error(`config.tools.${n} must be an object.`);b(r.timeoutMs,`config.tools.${n}.timeoutMs`),b(r.retries,`config.tools.${n}.retries`);}}if(e.batch!==void 0){if(!y(e.batch))throw new Error("config.batch must be an object.");if(S(e.batch.stopOnFailure,"config.batch.stopOnFailure"),e.batch.goals!==void 0){if(!Array.isArray(e.batch.goals))throw new Error("config.batch.goals must be an array.");e.batch.goals.forEach((n,r)=>Vr(n,`config.batch.goals[${r}]`));}}return e},qt=async e=>{let{stat:t}=await oe("node:fs/promises");try{return (await t(e)).isFile()}catch{return false}},Ur=async e=>{let t=await oe("node:path"),n=t.resolve(e);for(;;){for(let o of Mt){let a=t.join(n,o);if(await qt(a))return a}let r=t.dirname(n);if(r===n)return;n=r;}},Gt=async e=>{let{readFile:t}=await oe("node:fs/promises"),n=String(await t(e,"utf8")).replace(/^\uFEFF/,"");try{return zr(JSON.parse(n),e)}catch(r){throw r instanceof SyntaxError?new Error(`Invalid JSON in agent config ${e}: ${r.message}`):r}},Na=async e=>{if(e.noConfig)return {config:{}};let t=await oe("node:path");if(e.configPath){let r=t.isAbsolute(e.configPath)?e.configPath:t.resolve(e.cwd,e.configPath);if(!await qt(r))throw new Error(`Agent config not found or not a file: ${r}`);return {path:r,config:await Gt(r)}}let n=await Ur(e.cwd);return n?{path:n,config:await Gt(n)}:{config:{}}};var Wr=e=>e?.choices?.[0]?.message?.content??e?.output_text??e?.content?.[0]?.text??JSON.stringify(e),qa=e=>({complete:t=>da$1(async n=>{let r=await fetch(e.endpoint,{method:"POST",signal:n,headers:{"content-type":"application/json",authorization:`Bearer ${e.apiKey}`},body:JSON.stringify({model:e.model,messages:[{role:"user",content:t.prompt}]})});if(!r.ok)throw new Error(`LLM request failed with ${r.status}`);return {content:Wr(await r.json())}},n=>({_tag:"LLMError",cause:n}))});var Qr="gemini-2.5-flash",Kr="v1beta",Zr="https://generativelanguage.googleapis.com",Hr=e=>{let t=e.length;for(;t>0&&e.charCodeAt(t-1)===47;)t-=1;return t===e.length?e:e.slice(0,t)},Jr=e=>e.startsWith("models/")?e:`models/${e}`,Xr=e=>{if(e.endpoint)return e.endpoint;let t=Hr(e.baseUrl??Zr),n=e.apiVersion??Kr,r=Jr(e.model??Qr);return `${t}/${n}/${r}:generateContent`},ae=e=>typeof e=="number"&&Number.isFinite(e)?e:void 0,Bt=e=>Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0)),Yr=(e,t)=>{let n=Bt({temperature:ae(t.temperature),topP:ae(t.topP),topK:ae(t.topK),maxOutputTokens:ae(t.maxOutputTokens),stopSequences:t.stopSequences,responseMimeType:t.responseMimeType,...t.extraGenerationConfig??{}});return Bt({contents:[{role:"user",parts:[{text:e.prompt}]}],systemInstruction:t.systemInstruction?{parts:[{text:t.systemInstruction}]}:void 0,generationConfig:Object.keys(n).length>0?n:void 0})},eo=e=>{let t=e.candidates?.flatMap(o=>o.content?.parts??[]).map(o=>o.text??"").filter(Boolean).join(`
|
|
24
|
+
`).trim();if(t)return t;let n=e.promptFeedback?.blockReason;if(n){let o=e.promptFeedback?.blockReasonMessage;throw new Error(`Google Gemini blocked the prompt: ${n}${o?` - ${o}`:""}`)}let r=e.candidates?.[0]?.finishReason;if(r)throw new Error(`Google Gemini returned no text. finishReason=${r}`);if(e.error?.message)throw new Error(`Google Gemini error: ${e.error.message}`);return JSON.stringify(e)},to=async e=>{let t=await e.text();try{return JSON.parse(t).error?.message??t}catch{return t}},za=e=>({complete:t=>da$1(async n=>{let r=await fetch(Xr(e),{method:"POST",signal:n,headers:{"content-type":"application/json","x-goog-api-key":e.apiKey},body:JSON.stringify(Yr({prompt:t.prompt},e))});if(!r.ok){let a=await to(r);throw new Error(`Google Gemini request failed with ${r.status}: ${a}`)}let o=await r.json();return {content:eo(o)}},n=>({_tag:"LLMError",cause:n}))});var no=e=>["Fake LLM response.","",`Purpose: ${e.purpose}`,"Set BRASS_LLM_PROVIDER=google with GEMINI_API_KEY/GOOGLE_API_KEY, or set BRASS_LLM_ENDPOINT and BRASS_LLM_API_KEY for an OpenAI-compatible model.","You can also set BRASS_FAKE_LLM_RESPONSE to provide a deterministic offline response, including a fenced ```diff block."].join(`
|
|
25
25
|
`),Qa=(e={})=>({complete:t=>f({content:typeof e.content=="function"?e.content(t):e.content??no(t)})});var co=[{name:".brass-agent.json",kind:"file"},{name:"brass-agent.config.json",kind:"file"},{name:"package.json",kind:"file"},{name:"pnpm-workspace.yaml",kind:"file"},{name:"turbo.json",kind:"file"},{name:"nx.json",kind:"file"},{name:".git",kind:"directory"}],lo=(e,t)=>{try{let n=statSync(e);return t==="directory"?n.isDirectory():n.isFile()}catch{return false}},po=e=>{for(let t of co){let n=join(e,t.name);if(lo(n,t.kind))return {marker:t.name,markerPath:n}}},Ja=(e,t={})=>{let n=resolve(e);if(t.enabled===false)return {inputCwd:n,cwd:n,changed:false,disabled:true};if(!existsSync(n))return {inputCwd:n,cwd:n,changed:false};let r=n;for(;;){let o=po(r);if(o)return {inputCwd:n,cwd:r,marker:o.marker,markerPath:o.markerPath,changed:r!==n};let a=dirname(r);if(a===r)return {inputCwd:n,cwd:n,changed:false};r=a;}};export{Et as $,O as A,nt as B,rt as C,ke as D,ot as E,at as F,xe as G,M as H,it as I,Hn as J,ct as K,lt as L,rr as M,Se as N,te as O,At as P,v as Q,E as R,Pe as S,_o as T,To as U,Oo as V,bt as W,kt as X,xt as Y,vt as Z,Pr as _,Le as a,Ct as aa,_e as b,da as ba,Te as c,Ce as ca,qe as d,$t as da,ze as e,Ft as ea,ue as f,Mt as fa,dn as g,Lt as ga,We as h,ma as ha,Qe as i,Ir as ia,Ke as j,ha as ja,fe as k,ka,ye as l,xa as la,An as m,wa as ma,Xe as n,ja as na,Ye as o,_a as oa,Ze as p,Na as pa,$n as q,qa,J as r,za as ra,P as s,Qa as sa,X as t,Ja as ta,Ae as u,On as v,Y as w,ee as x,tt as y,be as z};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
'use strict';var chunkK47BP5A2_cjs=require('./chunk-K47BP5A2.cjs');var C=e=>e._tag==="None"?chunkK47BP5A2_cjs.r:chunkK47BP5A2_cjs.s(e.value),m=e=>({_tag:"FromPull",pull:e}),D=(e,a)=>({_tag:"Scoped",acquire:e,release:a}),K=e=>({_tag:"Managed",acquire:e}),Q=(e,a,r=true)=>({_tag:"Merge",left:e,right:a,flip:r}),G={_tag:"Empty"},P=()=>G,Y=e=>({_tag:"Emit",value:e}),w=(e,a)=>({_tag:"Concat",left:e,right:a}),N=e=>({_tag:"Flatten",stream:e});function T(e,a,r,n,t){return (o,E,R)=>{if(o._tag,o._tag,o._tag==="Success"){let[i,c]=o.value;E.interrupt();let d=m(e==="L"?B(c,r):B(a,c));return chunkK47BP5A2_cjs.f([i,d])}if(o.cause._tag==="Interrupt")return chunkK47BP5A2_cjs.j((i,c)=>{c(chunkK47BP5A2_cjs.u.failCause(chunkK47BP5A2_cjs.t.interrupt()));});let u=o.cause.error;return u._tag==="None"?s(e==="L"?r:a):chunkK47BP5A2_cjs.g(u)}}function B(e,a,r,n){let o=T("L",e,a),E=T("R",e,a);return chunkK47BP5A2_cjs.j((R,u)=>{let i=chunkK47BP5A2_cjs.O(),c=new chunkK47BP5A2_cjs.fa(i),d=chunkK47BP5A2_cjs.la(s(e),s(a),c,o,E);c.fork(d).join(A=>{c.close(A),u(A);});})}function Ae(e,a){return m(B(e,a))}function s(e){switch(e._tag){case "Empty":return chunkK47BP5A2_cjs.w(chunkK47BP5A2_cjs.r);case "Emit":return chunkK47BP5A2_cjs.y(chunkK47BP5A2_cjs.A(e.value,a=>chunkK47BP5A2_cjs.s(a)),a=>[a,G]);case "FromPull":return e.pull;case "Concat":return chunkK47BP5A2_cjs.C(chunkK47BP5A2_cjs.y(s(e.left),([a,r])=>[a,w(r,e.right)]),()=>s(e.right));case "Flatten":return chunkK47BP5A2_cjs.z(s(e.stream),([a,r])=>chunkK47BP5A2_cjs.C(chunkK47BP5A2_cjs.y(s(a),([n,t])=>[n,w(t,N(r))]),()=>s(N(r))));case "Merge":return B(e.left,e.right,e.flip);case "Scoped":return chunkK47BP5A2_cjs.j((a,r)=>{let n=chunkK47BP5A2_cjs.O(),t=new chunkK47BP5A2_cjs.fa(n);chunkK47BP5A2_cjs.N()?.addFinalizer(u=>{try{t.close(u);}catch{}});let E=u=>{if(u._tag==="Failure"){let i=u.cause.error;if(i&&typeof i=="object"&&i._tag==="None"){t.close({_tag:"Success",value:void 0});return}}t.close(u);},R=u=>m(chunkK47BP5A2_cjs.j((i,c)=>{let d=s(u);chunkK47BP5A2_cjs.ea(d,i,A=>{let l=chunkK47BP5A2_cjs.u.failCause(A);E(l),c(l);},([A,l])=>{c(chunkK47BP5A2_cjs.u.succeed([A,R(l)]));});}));t.fork(e.acquire).join(u=>{if(u._tag==="Failure"){E(u),r({_tag:"Failure",cause:{_tag:"Fail",error:chunkK47BP5A2_cjs.s(u.cause.error)}});return}t.addFinalizer(c=>e.release(c));let i=u.value;chunkK47BP5A2_cjs.O().fork(s(R(i))).join(r);});});case "Managed":return chunkK47BP5A2_cjs.j((a,r)=>{let n=chunkK47BP5A2_cjs.O(),t=new chunkK47BP5A2_cjs.fa(n);chunkK47BP5A2_cjs.N()?.addFinalizer(E=>{try{t.close(E);}catch{}});let o=E=>{if(E._tag==="Failure"){let R=E.cause.error;if(R&&typeof R=="object"&&R._tag==="None"){t.close({_tag:"Success",value:void 0});return}}t.close(E);};t.fork(e.acquire).join(E=>{if(E._tag==="Failure"){t.close(E),r({_tag:"Failure",cause:{_tag:"Fail",error:chunkK47BP5A2_cjs.s(E.cause.error)}});return}let{stream:R,release:u}=E.value;t.addFinalizer(c=>u(c));let i=c=>m(chunkK47BP5A2_cjs.j((d,A)=>{s(c)(d,l=>{if(l._tag==="Failure"){o(l),A(l);return}let[$,J]=l.value;A(chunkK47BP5A2_cjs.u.succeed([$,i(J)]));});}));chunkK47BP5A2_cjs.O().fork(s(i(R))).join(r);});})}}function X(e,a){throw new Error(a??`Unexpected value: ${String(e)}`)}function y(e,a){switch(e._tag){case "Empty":return P();case "Emit":return Y(chunkK47BP5A2_cjs.y(e.value,a));case "FromPull":return m(chunkK47BP5A2_cjs.y(e.pull,([r,n])=>[a(r),y(n,a)]));case "Concat":return w(y(e.left,a),y(e.right,a));case "Flatten":{let r=y(e.stream,n=>y(n,a));return N(r)}case "Merge":return Q(y(e.left,a),y(e.right,a),e.flip);case "Scoped":return D(chunkK47BP5A2_cjs.y(e.acquire,r=>y(r,a)),e.release);case "Managed":return K(chunkK47BP5A2_cjs.y(e.acquire,({stream:r,release:n})=>({stream:y(r,a),release:n})));default:return X(e)}}function le(e,a){let r=n=>m(n>a?chunkK47BP5A2_cjs.g(chunkK47BP5A2_cjs.r):chunkK47BP5A2_cjs.f([n,r(n+1)]));return r(e)}function ee(e,a){let r=chunkK47BP5A2_cjs.b(chunkK47BP5A2_cjs.d(s(e),n=>C(n)),n=>chunkK47BP5A2_cjs.g(n),([n,t])=>chunkK47BP5A2_cjs.b(chunkK47BP5A2_cjs.d(s(a),o=>C(o)),o=>chunkK47BP5A2_cjs.g(o),([o,E])=>chunkK47BP5A2_cjs.f([[n,o],ee(t,E)])));return m(r)}function ye(e,a){let r=n=>chunkK47BP5A2_cjs.b(chunkK47BP5A2_cjs.d(s(n),t=>C(t)),t=>t._tag==="None"?chunkK47BP5A2_cjs.f(void 0):chunkK47BP5A2_cjs.g(t),([t,o])=>chunkK47BP5A2_cjs.l(chunkK47BP5A2_cjs.d(a(t),E=>chunkK47BP5A2_cjs.s(E)),()=>r(o)));return chunkK47BP5A2_cjs.b(r(e),n=>n._tag==="None"?chunkK47BP5A2_cjs.f(void 0):chunkK47BP5A2_cjs.g(n.value),()=>chunkK47BP5A2_cjs.f(void 0))}function pe(e){let a=P();for(let r=e.length-1;r>=0;r--){let n=Y(chunkK47BP5A2_cjs.v(e[r]));a=w(n,a);}return a}function Se(e){let a=(r,n)=>chunkK47BP5A2_cjs.b(s(r),t=>t._tag==="None"?chunkK47BP5A2_cjs.v(n):chunkK47BP5A2_cjs.w(t),([t,o])=>a(o,[...n,t]));return chunkK47BP5A2_cjs.A(a(e,[]),r=>{if(r._tag==="Some")return r.value;throw new Error("unreachable: stream end handled as success")})}function ae(e,a){let r=chunkK47BP5A2_cjs.j((n,t)=>{e.read().then(({done:o,value:E})=>{if(o){t({_tag:"Failure",cause:{_tag:"Fail",error:chunkK47BP5A2_cjs.r}});return}t({_tag:"Success",value:[E,m(r)]});}).catch(o=>{t({_tag:"Failure",cause:{_tag:"Fail",error:chunkK47BP5A2_cjs.s(a(o))}});});});return m(r)}function de(e,a){if(!e)return P();let r;return D(chunkK47BP5A2_cjs.x(()=>(r=e.getReader(),ae(r,a))),()=>chunkK47BP5A2_cjs.h(()=>{try{r?.cancel();}catch{}}))}exports.a=C;exports.b=m;exports.c=D;exports.d=K;exports.e=Q;exports.f=P;exports.g=Y;exports.h=w;exports.i=N;exports.j=Ae;exports.k=s;exports.l=X;exports.m=y;exports.n=le;exports.o=ee;exports.p=ye;exports.q=pe;exports.r=Se;exports.s=de;
|