@lisa.ai/agent 2.11.1 → 2.11.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 CHANGED
@@ -161,6 +161,7 @@ lisa-agent chat -m claude
161
161
 
162
162
  | Command | Description |
163
163
  |---|---|
164
+ | `/read <file>` | Load a file into conversation context |
164
165
  | `/test [cmd]` | Run tests and show results |
165
166
  | `/explain <file>` | Analyze why a test is failing (no file changes) |
166
167
  | `/heal <file>` | Auto-heal a specific failing test file |
@@ -171,8 +172,11 @@ lisa-agent chat -m claude
171
172
 
172
173
  **Example session:**
173
174
  ```
174
- lisa> why would an Angular test get NullInjectorError for HttpClient?
175
- [streams explanation suggesting HttpClientTestingModule]
175
+ lisa> /read src/services/auth.service.ts
176
+ Loaded auth.service.ts (142 lines) into context
177
+
178
+ lisa> write a unit test for this file
179
+ [streams a test based on the actual file content]
176
180
 
177
181
  lisa> /test
178
182
  Running: npx ng test --no-watch --browsers=ChromeHeadless...
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var Wt=Object.create;var tt=Object.defineProperty;var zt=Object.getOwnPropertyDescriptor;var Zt=Object.getOwnPropertyNames;var Jt=Object.getPrototypeOf,Qt=Object.prototype.hasOwnProperty;var Xt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var es=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Zt(t))!Qt.call(e,o)&&o!==s&&tt(e,o,{get:()=>t[o],enumerable:!(n=zt(t,o))||n.enumerable});return e};var b=(e,t,s)=>(s=e!=null?Wt(Jt(e)):{},es(t||!e||!e.__esModule?tt(s,"default",{value:e,enumerable:!0}):s,e));var Bt=Xt((Kn,Ls)=>{Ls.exports={name:"@lisa.ai/agent",version:"2.11.1",description:"Lisa.ai Autonomous CI/CD Worker Agent",main:"dist/index.js",bin:{"lisa-agent":"dist/index.js"},files:["dist/"],scripts:{build:"tsup",typecheck:"tsc --noEmit",start:"node dist/index.js",dev:"ts-node src/index.ts",prepublishOnly:"npm run typecheck && npm run build"},keywords:["lisa","ci","cd","agent"],author:"Lisa.ai",license:"ISC",dependencies:{"@ai-sdk/anthropic":"^3.0.46","@ai-sdk/google":"^3.0.30","@ai-sdk/openai":"^3.0.30","@octokit/rest":"^22.0.1",ai:"^6.0.94",commander:"^11.1.0",dotenv:"^17.3.1","simple-git":"^3.31.1"},devDependencies:{"@types/jest":"^30.0.0","@types/node":"^20.0.0","ts-node":"^10.9.1",tsup:"^8.5.1",typescript:"^5.0.0"}}});var qt=require("commander"),re=b(require("fs")),be=b(require("path")),Yt=b(require("readline"));var st=b(require("dotenv"));st.config({quiet:!0});async function je(e){let t=process.env.LISA_CONTROL_PLANE_URL||"http://localhost:3088";try{let s=`${t}/api/v1/lisa/config/${e}`;console.log(`[Lisa.ai Agent] Fetching dynamic configuration from ${s}...`);let n=await fetch(s);if(!n.ok){let i=n.status===404?"not_found":"unreachable";return console.warn(i==="not_found"?`[Lisa.ai Agent Warning] Control Plane returned 404. Project '${e}' not found.`:`[Lisa.ai Agent Warning] Control Plane returned ${n.status}. Falling back to local defaults.`),{ok:!1,reason:i}}return{ok:!0,config:await n.json()}}catch{return console.warn(`[Lisa.ai Agent Warning] Failed to reach Control Plane (${t}). Using local fallback configuration.`),{ok:!1,reason:"unreachable"}}}var $t=require("child_process"),B=b(require("fs")),te=b(require("path"));var j=b(require("path")),D=b(require("fs"));function Ee(e){return e.replace(/\x1B\[[0-9;]*[a-zA-Z]/g,"")}function G(e){let t=Ee(e),s=[...t.matchAll(/Executed\s+(\d+)\s+of\s+(\d+)(?:\s+\((\d+)\s+FAILED\))?/g)];if(s.length>0){let u=[...s].reverse().find(L=>L[3]!==void 0)??s[s.length-1],p=parseInt(u[2]),$=u[3]?parseInt(u[3]):0,g=parseInt(u[1])-$;return{total:p,passed:g,failed:$}}let n=t.match(/Tests:\s+(?:(\d+)\s+failed,?\s*)?(?:(\d+)\s+passed,?\s*)?(\d+)\s+total/);if(n){let u=parseInt(n[3]),p=n[1]?parseInt(n[1]):0,$=n[2]?parseInt(n[2]):0;return{total:u,passed:$,failed:p}}let o=t.match(/(\d+)\s+failed/),i=t.match(/(\d+)\s+passed/);if(i||o){let u=o?parseInt(o[1]):0,p=i?parseInt(i[1]):0,$=t.match(/(\d+)\s+skipped/),g=$?parseInt($[1]):0;return{total:p+u+g,passed:p,failed:u}}let a=t.match(/Tests\s+(?:(\d+)\s+failed\s*\|?\s*)?(\d+)\s+passed\s*\((\d+)\)/);if(a){let u=parseInt(a[3]),p=a[1]?parseInt(a[1]):0,$=parseInt(a[2]);return{total:u,passed:$,failed:p}}let r=t.match(/(\d+)\s+passing/),c=t.match(/(\d+)\s+failing/);if(r){let u=parseInt(r[1]),p=c?parseInt(c[1]):0;return{total:u+p,passed:u,failed:p}}return null}function Ge(e,t=process.cwd(),s=[]){let n=e.replace(/\x1B\[[0-9;]*[a-zA-Z]/g,""),o=s.map(d=>j.resolve(t,d)),i=new Map,a=new Set,r=/(?:Chrome|Firefox|Safari)(?:\s+Headless)?\s+[\d.]+(?:\s+[\d.]+)*\s+\([^)]+\)\s+(.+?)\s+FAILED/g,c;for(;(c=r.exec(n))!==null;){let l=c[1].trim().split(" ");for(let y=1;y<Math.min(l.length,6);y++){let h=l.slice(0,y).join(" ");if(a.has(h))continue;a.add(h);let C=Be(h,t,o);if(C){let v=j.resolve(C);i.has(v)||i.set(v,j.relative(t,C));break}}}let u=/^FAIL\s+([a-zA-Z0-9_./-\\]+\.(?:spec|test)\.(ts|tsx|js|jsx))/gm,p;for(;(p=u.exec(n))!==null;){let d=p[1],l=j.isAbsolute(d)?d:j.resolve(t,d);!o.includes(l)&&D.existsSync(l)&&!i.has(l)&&i.set(l,j.relative(t,l))}let $=/\[(?:chromium|firefox|webkit)\]\s+[>›]\s+([^\s:]+\.(?:spec|test)\.[tj]sx?):\d+:\d+\s+[>›]/g,g;for(;(g=$.exec(n))!==null;){let d=g[1],l=j.isAbsolute(d)?d:j.resolve(t,d);!o.includes(l)&&D.existsSync(l)&&!i.has(l)&&i.set(l,j.relative(t,l))}let L=/Running:\s+([^\s]+\.(?:cy|spec|test)\.[tj]sx?)/g,m;for(;(m=L.exec(n))!==null;){let d=m[1],l=j.isAbsolute(d)?d:j.resolve(t,d);if(!o.includes(l)&&D.existsSync(l)&&!i.has(l)){let y=d.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");new RegExp(y+"\\s+\\d+\\s+\\d+\\s+([1-9]\\d*)").test(n)&&i.set(l,j.relative(t,l))}}return[...i.values()]}function Ae(e,t=[],s=process.cwd()){let n=e.replace(/\x1B\[[0-9;]*[a-zA-Z]/g,""),o=t.map(d=>j.resolve(d));{let d=/(?:Chrome|Firefox|Safari)(?:\s+Headless)?\s+[\d.]+(?:\s+[\d.]+)*\s+\([^)]+\)\s+(.+?)\s+FAILED/g,l=new Set,y;for(;(y=d.exec(n))!==null;){let C=y[1].trim().split(" ");for(let v=1;v<Math.min(C.length,5);v++){let x=C.slice(0,v).join(" ");if(l.has(x))continue;l.add(x);let f=Be(x,s,o);if(f)return j.relative(s,f)}}}let i=/([a-zA-Z]:[a-zA-Z0-9_.\-\/\\]+\.(?:ts|tsx|js|jsx|vue)|[a-zA-Z0-9_.\-\/\\]+\.(?:ts|tsx|js|jsx|vue))(?:\s*[:(])/g,a;for(;(a=i.exec(n))!==null;){let d=a[1];if(d){if(/(?:^|[/\\])(node_modules|dist|build)[/\\]/.test(d))continue;let l=j.isAbsolute(d)?d:j.resolve(s,d);if(!o.includes(l)&&D.existsSync(l))return d}}let r=/FAIL\s+([a-zA-Z0-9_.\-\/\\]+\.(?:ts|tsx|js|jsx|vue))/gi,c;for(;(c=r.exec(n))!==null;){let d=c[1],l=j.isAbsolute(d)?d:j.resolve(s,d);if(!o.includes(l)&&D.existsSync(l))return d}{let d=/\[(?:chromium|firefox|webkit)\]\s+[>›]\s+([^\s:]+\.(?:spec|test)\.[tj]sx?):\d+:\d+\s+[>›]/g,l;for(;(l=d.exec(n))!==null;){let y=l[1],h=j.isAbsolute(y)?y:j.resolve(s,y);if(!o.includes(h)&&D.existsSync(h))return y}}let u=/([a-zA-Z]:[a-zA-Z0-9_.\-\/\\]+\.(?:ts|tsx|js|jsx|vue)|[a-zA-Z0-9_.\-\/\\]+\.(?:ts|tsx|js|jsx|vue))/g,p;for(;(p=u.exec(n))!==null;){let d=p[1];if(d){if(/(?:^|[/\\])(node_modules|dist|build)[/\\]/.test(d))continue;let l=j.isAbsolute(d)?d:j.resolve(s,d);if(!o.includes(l)&&D.existsSync(l))return d}}let $=/\b([A-Z][a-zA-Z0-9]{3,})\b/g,g,L=new Set,m=["Error","TypeError","SyntaxError","ReferenceError","RangeError","Object","Boolean","String","Number","Array","NullInjectorError","NullInjector","R3Injector","ChainedInjector","Module","Component","Standalone","Application","App2","TestBed","UserContext","Chrome","ChromeHeadless","Karma","Launching","Starting","Headless","Connected","Executed","INFO","SUCCESS","FAILED","Building","Initial","Names","Lazy","Source","Find","NotFound","NG0201","Windows","Linux","Macintosh","Users","AppData","Local","Temp","Process","Unexpected","Expected","Validation","Directory","Configuration","Documentation"];for(;(g=$.exec(n))!==null;){let d=g[1];if(!d||m.includes(d)||L.has(d)||/^[A-Z][A-Z0-9]{5,11}$/.test(d)||/^[A-Za-z0-9]{16,}$/.test(d))continue;L.add(d);let l=nt(d,s,o);if(l)return j.relative(s,l)}return null}function Be(e,t,s){if(!D.existsSync(t))return null;let n=D.readdirSync(t);for(let o of n){let i=j.join(t,o);if(["node_modules","dist","build",".git",".angular"].includes(o))continue;let a;try{a=D.statSync(i)}catch{continue}if(a.isDirectory()){let r=Be(e,i,s);if(r)return r}else if(/\.(spec|test)\.(ts|tsx|js|jsx)$/.test(o)){if(s.includes(j.resolve(i)))continue;try{let r=D.readFileSync(i,"utf8");if(r.includes(`describe('${e}'`)||r.includes(`describe("${e}"`))return i}catch{continue}}}return null}function nt(e,t,s){if(!D.existsSync(t))return null;let n=D.readdirSync(t);for(let o of n){let i=j.join(t,o);if(o==="node_modules"||o==="dist"||o==="build"||o===".git"||o===".angular")continue;let a;try{a=D.statSync(i)}catch{continue}if(a.isDirectory()){let r=nt(e,i,s);if(r)return r}else if(o.match(/\.(ts|tsx|js|jsx|vue)$/)){let r=D.readFileSync(i,"utf8");if(r.includes(`class ${e}`)||r.includes(`function ${e}`)||r.includes(`const ${e}`)||r.includes(`let ${e}`)||r.includes(`exports.${e}`)||r.includes(`module.exports.${e}`)){let c=i,u=j.extname(i),p=i.slice(0,-u.length);if(!o.includes(".spec.")&&!o.includes(".test.")){let $=[`${p}.spec${u}`,`${p}.test${u}`,`${p}.spec.js`,`${p}.test.js`];for(let g of $)if(D.existsSync(g)){c=g;break}}if(!s.includes(j.resolve(c)))return c}}}return null}var ce=require("ai"),Te=require("@ai-sdk/openai"),ot=require("@ai-sdk/anthropic"),it=require("@ai-sdk/google"),at=b(require("dotenv"));at.config({quiet:!0});var qe=15e3;function Pe(e,t){return e.length<=qe?e:(console.warn(`[Lisa.ai LLM] ${t} is ${e.length} chars \u2014 truncating to ${qe} to stay within context window.`),e.slice(0,qe)+`
2
+ "use strict";var Wt=Object.create;var tt=Object.defineProperty;var zt=Object.getOwnPropertyDescriptor;var Zt=Object.getOwnPropertyNames;var Jt=Object.getPrototypeOf,Qt=Object.prototype.hasOwnProperty;var Xt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var es=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Zt(t))!Qt.call(e,o)&&o!==s&&tt(e,o,{get:()=>t[o],enumerable:!(n=zt(t,o))||n.enumerable});return e};var b=(e,t,s)=>(s=e!=null?Wt(Jt(e)):{},es(t||!e||!e.__esModule?tt(s,"default",{value:e,enumerable:!0}):s,e));var Bt=Xt((Kn,Ls)=>{Ls.exports={name:"@lisa.ai/agent",version:"2.11.2",description:"Lisa.ai Autonomous CI/CD Worker Agent",main:"dist/index.js",bin:{"lisa-agent":"dist/index.js"},files:["dist/"],scripts:{build:"tsup",typecheck:"tsc --noEmit",start:"node dist/index.js",dev:"ts-node src/index.ts",prepublishOnly:"npm run typecheck && npm run build"},keywords:["lisa","ci","cd","agent"],author:"Lisa.ai",license:"ISC",dependencies:{"@ai-sdk/anthropic":"^3.0.46","@ai-sdk/google":"^3.0.30","@ai-sdk/openai":"^3.0.30","@octokit/rest":"^22.0.1",ai:"^6.0.94",commander:"^11.1.0",dotenv:"^17.3.1","simple-git":"^3.31.1"},devDependencies:{"@types/jest":"^30.0.0","@types/node":"^20.0.0","ts-node":"^10.9.1",tsup:"^8.5.1",typescript:"^5.0.0"}}});var qt=require("commander"),re=b(require("fs")),be=b(require("path")),Yt=b(require("readline"));var st=b(require("dotenv"));st.config({quiet:!0});async function je(e){let t=process.env.LISA_CONTROL_PLANE_URL||"http://localhost:3088";try{let s=`${t}/api/v1/lisa/config/${e}`;console.log(`[Lisa.ai Agent] Fetching dynamic configuration from ${s}...`);let n=await fetch(s);if(!n.ok){let i=n.status===404?"not_found":"unreachable";return console.warn(i==="not_found"?`[Lisa.ai Agent Warning] Control Plane returned 404. Project '${e}' not found.`:`[Lisa.ai Agent Warning] Control Plane returned ${n.status}. Falling back to local defaults.`),{ok:!1,reason:i}}return{ok:!0,config:await n.json()}}catch{return console.warn(`[Lisa.ai Agent Warning] Failed to reach Control Plane (${t}). Using local fallback configuration.`),{ok:!1,reason:"unreachable"}}}var $t=require("child_process"),B=b(require("fs")),te=b(require("path"));var j=b(require("path")),D=b(require("fs"));function Ee(e){return e.replace(/\x1B\[[0-9;]*[a-zA-Z]/g,"")}function G(e){let t=Ee(e),s=[...t.matchAll(/Executed\s+(\d+)\s+of\s+(\d+)(?:\s+\((\d+)\s+FAILED\))?/g)];if(s.length>0){let u=[...s].reverse().find(L=>L[3]!==void 0)??s[s.length-1],p=parseInt(u[2]),$=u[3]?parseInt(u[3]):0,g=parseInt(u[1])-$;return{total:p,passed:g,failed:$}}let n=t.match(/Tests:\s+(?:(\d+)\s+failed,?\s*)?(?:(\d+)\s+passed,?\s*)?(\d+)\s+total/);if(n){let u=parseInt(n[3]),p=n[1]?parseInt(n[1]):0,$=n[2]?parseInt(n[2]):0;return{total:u,passed:$,failed:p}}let o=t.match(/(\d+)\s+failed/),i=t.match(/(\d+)\s+passed/);if(i||o){let u=o?parseInt(o[1]):0,p=i?parseInt(i[1]):0,$=t.match(/(\d+)\s+skipped/),g=$?parseInt($[1]):0;return{total:p+u+g,passed:p,failed:u}}let a=t.match(/Tests\s+(?:(\d+)\s+failed\s*\|?\s*)?(\d+)\s+passed\s*\((\d+)\)/);if(a){let u=parseInt(a[3]),p=a[1]?parseInt(a[1]):0,$=parseInt(a[2]);return{total:u,passed:$,failed:p}}let r=t.match(/(\d+)\s+passing/),c=t.match(/(\d+)\s+failing/);if(r){let u=parseInt(r[1]),p=c?parseInt(c[1]):0;return{total:u+p,passed:u,failed:p}}return null}function Ge(e,t=process.cwd(),s=[]){let n=e.replace(/\x1B\[[0-9;]*[a-zA-Z]/g,""),o=s.map(d=>j.resolve(t,d)),i=new Map,a=new Set,r=/(?:Chrome|Firefox|Safari)(?:\s+Headless)?\s+[\d.]+(?:\s+[\d.]+)*\s+\([^)]+\)\s+(.+?)\s+FAILED/g,c;for(;(c=r.exec(n))!==null;){let l=c[1].trim().split(" ");for(let y=1;y<Math.min(l.length,6);y++){let h=l.slice(0,y).join(" ");if(a.has(h))continue;a.add(h);let C=Be(h,t,o);if(C){let v=j.resolve(C);i.has(v)||i.set(v,j.relative(t,C));break}}}let u=/^FAIL\s+([a-zA-Z0-9_./-\\]+\.(?:spec|test)\.(ts|tsx|js|jsx))/gm,p;for(;(p=u.exec(n))!==null;){let d=p[1],l=j.isAbsolute(d)?d:j.resolve(t,d);!o.includes(l)&&D.existsSync(l)&&!i.has(l)&&i.set(l,j.relative(t,l))}let $=/\[(?:chromium|firefox|webkit)\]\s+[>›]\s+([^\s:]+\.(?:spec|test)\.[tj]sx?):\d+:\d+\s+[>›]/g,g;for(;(g=$.exec(n))!==null;){let d=g[1],l=j.isAbsolute(d)?d:j.resolve(t,d);!o.includes(l)&&D.existsSync(l)&&!i.has(l)&&i.set(l,j.relative(t,l))}let L=/Running:\s+([^\s]+\.(?:cy|spec|test)\.[tj]sx?)/g,m;for(;(m=L.exec(n))!==null;){let d=m[1],l=j.isAbsolute(d)?d:j.resolve(t,d);if(!o.includes(l)&&D.existsSync(l)&&!i.has(l)){let y=d.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");new RegExp(y+"\\s+\\d+\\s+\\d+\\s+([1-9]\\d*)").test(n)&&i.set(l,j.relative(t,l))}}return[...i.values()]}function Ae(e,t=[],s=process.cwd()){let n=e.replace(/\x1B\[[0-9;]*[a-zA-Z]/g,""),o=t.map(d=>j.resolve(d));{let d=/(?:Chrome|Firefox|Safari)(?:\s+Headless)?\s+[\d.]+(?:\s+[\d.]+)*\s+\([^)]+\)\s+(.+?)\s+FAILED/g,l=new Set,y;for(;(y=d.exec(n))!==null;){let C=y[1].trim().split(" ");for(let v=1;v<Math.min(C.length,5);v++){let x=C.slice(0,v).join(" ");if(l.has(x))continue;l.add(x);let f=Be(x,s,o);if(f)return j.relative(s,f)}}}let i=/([a-zA-Z]:[a-zA-Z0-9_.\-\/\\]+\.(?:ts|tsx|js|jsx|vue)|[a-zA-Z0-9_.\-\/\\]+\.(?:ts|tsx|js|jsx|vue))(?:\s*[:(])/g,a;for(;(a=i.exec(n))!==null;){let d=a[1];if(d){if(/(?:^|[/\\])(node_modules|dist|build)[/\\]/.test(d))continue;let l=j.isAbsolute(d)?d:j.resolve(s,d);if(!o.includes(l)&&D.existsSync(l))return d}}let r=/FAIL\s+([a-zA-Z0-9_.\-\/\\]+\.(?:ts|tsx|js|jsx|vue))/gi,c;for(;(c=r.exec(n))!==null;){let d=c[1],l=j.isAbsolute(d)?d:j.resolve(s,d);if(!o.includes(l)&&D.existsSync(l))return d}{let d=/\[(?:chromium|firefox|webkit)\]\s+[>›]\s+([^\s:]+\.(?:spec|test)\.[tj]sx?):\d+:\d+\s+[>›]/g,l;for(;(l=d.exec(n))!==null;){let y=l[1],h=j.isAbsolute(y)?y:j.resolve(s,y);if(!o.includes(h)&&D.existsSync(h))return y}}let u=/([a-zA-Z]:[a-zA-Z0-9_.\-\/\\]+\.(?:ts|tsx|js|jsx|vue)|[a-zA-Z0-9_.\-\/\\]+\.(?:ts|tsx|js|jsx|vue))/g,p;for(;(p=u.exec(n))!==null;){let d=p[1];if(d){if(/(?:^|[/\\])(node_modules|dist|build)[/\\]/.test(d))continue;let l=j.isAbsolute(d)?d:j.resolve(s,d);if(!o.includes(l)&&D.existsSync(l))return d}}let $=/\b([A-Z][a-zA-Z0-9]{3,})\b/g,g,L=new Set,m=["Error","TypeError","SyntaxError","ReferenceError","RangeError","Object","Boolean","String","Number","Array","NullInjectorError","NullInjector","R3Injector","ChainedInjector","Module","Component","Standalone","Application","App2","TestBed","UserContext","Chrome","ChromeHeadless","Karma","Launching","Starting","Headless","Connected","Executed","INFO","SUCCESS","FAILED","Building","Initial","Names","Lazy","Source","Find","NotFound","NG0201","Windows","Linux","Macintosh","Users","AppData","Local","Temp","Process","Unexpected","Expected","Validation","Directory","Configuration","Documentation"];for(;(g=$.exec(n))!==null;){let d=g[1];if(!d||m.includes(d)||L.has(d)||/^[A-Z][A-Z0-9]{5,11}$/.test(d)||/^[A-Za-z0-9]{16,}$/.test(d))continue;L.add(d);let l=nt(d,s,o);if(l)return j.relative(s,l)}return null}function Be(e,t,s){if(!D.existsSync(t))return null;let n=D.readdirSync(t);for(let o of n){let i=j.join(t,o);if(["node_modules","dist","build",".git",".angular"].includes(o))continue;let a;try{a=D.statSync(i)}catch{continue}if(a.isDirectory()){let r=Be(e,i,s);if(r)return r}else if(/\.(spec|test)\.(ts|tsx|js|jsx)$/.test(o)){if(s.includes(j.resolve(i)))continue;try{let r=D.readFileSync(i,"utf8");if(r.includes(`describe('${e}'`)||r.includes(`describe("${e}"`))return i}catch{continue}}}return null}function nt(e,t,s){if(!D.existsSync(t))return null;let n=D.readdirSync(t);for(let o of n){let i=j.join(t,o);if(o==="node_modules"||o==="dist"||o==="build"||o===".git"||o===".angular")continue;let a;try{a=D.statSync(i)}catch{continue}if(a.isDirectory()){let r=nt(e,i,s);if(r)return r}else if(o.match(/\.(ts|tsx|js|jsx|vue)$/)){let r=D.readFileSync(i,"utf8");if(r.includes(`class ${e}`)||r.includes(`function ${e}`)||r.includes(`const ${e}`)||r.includes(`let ${e}`)||r.includes(`exports.${e}`)||r.includes(`module.exports.${e}`)){let c=i,u=j.extname(i),p=i.slice(0,-u.length);if(!o.includes(".spec.")&&!o.includes(".test.")){let $=[`${p}.spec${u}`,`${p}.test${u}`,`${p}.spec.js`,`${p}.test.js`];for(let g of $)if(D.existsSync(g)){c=g;break}}if(!s.includes(j.resolve(c)))return c}}}return null}var ce=require("ai"),Te=require("@ai-sdk/openai"),ot=require("@ai-sdk/anthropic"),it=require("@ai-sdk/google"),at=b(require("dotenv"));at.config({quiet:!0});var qe=15e3;function Pe(e,t){return e.length<=qe?e:(console.warn(`[Lisa.ai LLM] ${t} is ${e.length} chars \u2014 truncating to ${qe} to stay within context window.`),e.slice(0,qe)+`
3
3
 
4
4
  // ... (truncated)`)}function Ie(e,t){if(!/\b(describe|it\(|test\(|expect\(|beforeEach|afterEach|suite|assert\.|cy\.)\b/.test(e))throw new Error(`LLM returned a non-code response for ${t} (possible context overflow). Skipping to prevent file corruption.`)}function rt(e){if(!e||e.length===0)return"";let t={unit:"unit tests \u2014 test every function/method in complete isolation, mocking ALL external dependencies, services, and I/O",integration:"integration tests \u2014 test how modules work together using real service/repository layers; for HTTP routes use supertest or equivalent",e2e:"end-to-end tests \u2014 simulate complete user flows using the configured e2e framework (Playwright/Cypress); cover the full path from HTTP request to response or UI action to assertion"};return`5. Test scope \u2014 generate ALL of the following test types for this file:
5
5
  ${e.map(n=>` \u2022 ${t[n]??n}`).join(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lisa.ai/agent",
3
- "version": "2.11.1",
3
+ "version": "2.11.2",
4
4
  "description": "Lisa.ai Autonomous CI/CD Worker Agent",
5
5
  "main": "dist/index.js",
6
6
  "bin": {