@console-agent/agent 1.1.1 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +345 -25
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +39 -2
- package/dist/index.d.ts +39 -2
- package/dist/index.js +345 -25
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/personas/debugger.ts","../src/personas/security.ts","../src/personas/architect.ts","../src/personas/general.ts","../src/personas/index.ts","../src/utils/format.ts","../src/providers/google.ts","../src/utils/anonymize.ts","../src/utils/rate-limit.ts","../src/utils/budget.ts","../src/agent.ts","../src/index.ts"],"names":["ora","chalk","jsonSchema","config","google","createGoogleGenerativeAI","Output","ToolLoopAgent"],"mappings":";;;;;;;;;;;;;AAEO,IAAM,eAAA,GAAqC;AAAA,EAChD,IAAA,EAAM,UAAA;AAAA,EACN,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO,WAAA;AAAA,EACP,YAAA,EAAc,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,uDAAA,CAAA;AAAA,EAgBd,YAAA,EAAc,CAAC,gBAAA,EAAkB,eAAe,CAAA;AAAA,EAChD,QAAA,EAAU;AAAA,IACR,MAAA;AAAA,IAAQ,MAAA;AAAA,IAAQ,aAAA;AAAA,IAAe,UAAA;AAAA,IAAY,cAAA;AAAA,IAC3C,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,KAAA;AAAA,IAAO,OAAA;AAAA,IAAS,WAAA;AAAA,IAAa,OAAA;AAAA,IAC/C,OAAA;AAAA,IAAS,QAAA;AAAA,IAAU,MAAA;AAAA,IAAQ,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,YAAA;AAAA,IACjD,MAAA;AAAA,IAAQ,QAAA;AAAA,IAAU,UAAA;AAAA,IAAY;AAAA;AAElC,CAAA;;;AC3BO,IAAM,eAAA,GAAqC;AAAA,EAChD,IAAA,EAAM,UAAA;AAAA,EACN,IAAA,EAAM,iBAAA;AAAA,EACN,KAAA,EAAO,gBAAA;AAAA,EACP,YAAA,EAAc,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,yEAAA,CAAA;AAAA,EAkBd,YAAA,EAAc,CAAC,eAAe,CAAA;AAAA,EAC9B,QAAA,EAAU;AAAA,IACR,UAAA;AAAA,IAAY,MAAA;AAAA,IAAQ,eAAA;AAAA,IAAiB,SAAA;AAAA,IAAW,WAAA;AAAA,IAChD,KAAA;AAAA,IAAO,MAAA;AAAA,IAAQ,MAAA;AAAA,IAAQ,eAAA;AAAA,IAAiB,MAAA;AAAA,IAAQ,gBAAA;AAAA,IAChD,eAAA;AAAA,IAAiB,YAAA;AAAA,IAAc,WAAA;AAAA,IAAa,YAAA;AAAA,IAC5C,UAAA;AAAA,IAAY,QAAA;AAAA,IAAU,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,MAAA;AAAA,IAAQ,OAAA;AAAA,IACpD,QAAA;AAAA,IAAU,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY,YAAA;AAAA,IAAc,OAAA;AAAA,IAAS;AAAA;AAE5D,CAAA;;;AC9BO,IAAM,gBAAA,GAAsC;AAAA,EACjD,IAAA,EAAM,WAAA;AAAA,EACN,IAAA,EAAM,iBAAA;AAAA,EACN,KAAA,EAAO,qBAAA;AAAA,EACP,YAAA,EAAc,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,oFAAA,CAAA;AAAA,EAmBd,YAAA,EAAc,CAAC,eAAA,EAAiB,eAAe,CAAA;AAAA,EAC/C,QAAA,EAAU;AAAA,IACR,QAAA;AAAA,IAAU,cAAA;AAAA,IAAgB,WAAA;AAAA,IAAa,SAAA;AAAA,IAAW,QAAA;AAAA,IAClD,cAAA;AAAA,IAAgB,UAAA;AAAA,IAAY,YAAA;AAAA,IAAc,QAAA;AAAA,IAAU,UAAA;AAAA,IACpD,eAAA;AAAA,IAAiB,gBAAA;AAAA,IAAkB,QAAA;AAAA,IAAU,OAAA;AAAA,IAAS,UAAA;AAAA,IACtD,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY,UAAA;AAAA,IAAY,OAAA;AAAA,IAC/C,oBAAA;AAAA,IAAsB,eAAA;AAAA,IAAiB;AAAA;AAE3C,CAAA;;;AC/BO,IAAM,cAAA,GAAoC;AAAA,EAC/C,IAAA,EAAM,SAAA;AAAA,EACN,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO,WAAA;AAAA,EACP,YAAA,EAAc,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,gFAAA,CAAA;AAAA,EAgBd,YAAA,EAAc,CAAC,gBAAA,EAAkB,eAAA,EAAiB,eAAe,CAAA;AAAA,EACjE,UAAU;AAAC;AACb,CAAA;;;AClBO,IAAM,QAAA,GAAmD;AAAA,EAC9D,QAAA,EAAU,eAAA;AAAA,EACV,QAAA,EAAU,eAAA;AAAA,EACV,SAAA,EAAW,gBAAA;AAAA,EACX,OAAA,EAAS;AACX,CAAA;AAMO,SAAS,aAAA,CAAc,QAAgB,cAAA,EAAgD;AAC5F,EAAA,MAAM,KAAA,GAAQ,OAAO,WAAA,EAAY;AAGjC,EAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,UAAA,EAAY,UAAA,EAAY,WAAW,CAAA,EAAoB;AACzE,IAAA,MAAM,OAAA,GAAU,SAAS,IAAI,CAAA;AAC7B,IAAA,IAAI,OAAA,CAAQ,SAAS,IAAA,CAAK,CAAC,OAAO,KAAA,CAAM,QAAA,CAAS,EAAE,CAAC,CAAA,EAAG;AACrD,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,SAAS,cAAc,CAAA;AAChC;AAEO,SAAS,WAAW,IAAA,EAAsC;AAC/D,EAAA,OAAO,SAAS,IAAI,CAAA;AACtB;ACxBA,IAAI,eAAA,GAA4B,MAAA;AAEzB,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,eAAA,GAAkB,KAAA;AACpB;AAEA,SAAS,UAAU,KAAA,EAA0B;AAC3C,EAAA,MAAM,MAAA,GAAqB,CAAC,QAAA,EAAU,QAAA,EAAU,QAAQ,OAAO,CAAA;AAC/D,EAAA,OAAO,OAAO,OAAA,CAAQ,eAAe,CAAA,IAAK,MAAA,CAAO,QAAQ,KAAK,CAAA;AAChE;AAIO,SAAS,YAAA,CAAa,SAA4B,MAAA,EAA4B;AACnF,EAAA,IAAI,CAAC,SAAA,CAAU,MAAM,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,MAAM,SAAA,GAAY,OAAO,MAAA,GAAS,EAAA,GAAK,OAAO,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA,GAAQ,MAAA;AACzE,EAAA,MAAM,UAAUA,oBAAA,CAAI;AAAA,IAClB,IAAA,EAAMC,sBAAA,CAAM,IAAA,CAAK,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAK,CAAA,IAAA,CAAM,CAAA,GAAIA,sBAAA,CAAM,IAAI,SAAS,CAAA;AAAA,IAC9E,UAAA,EAAYA,sBAAA,CAAM,IAAA,CAAK,SAAS;AAAA,GACjC,EAAE,KAAA,EAAM;AAET,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,WAAA,CAAY,SAAqB,OAAA,EAAwB;AACvE,EAAA,IAAI,CAAC,OAAA,EAAS;AAEd,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,EAClB,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,IAAA,EAAK;AAAA,EACf;AACF;AAIO,SAAS,YAAA,CAAa,QAAqB,OAAA,EAAkC;AAClF,EAAA,IAAI,CAAC,SAAA,CAAU,MAAM,CAAA,EAAG;AAExB,EAAA,MAAM,MAAA,GAASA,sBAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AACnC,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,UAAA,IAAc,GAAA,GAAMA,sBAAA,CAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,IAAc,GAAA,GAAMA,sBAAA,CAAM,MAAA,GAASA,sBAAA,CAAM,GAAA;AACjH,EAAA,MAAM,UAAA,GAAa,OAAO,OAAA,GAAUA,sBAAA,CAAM,MAAM,QAAG,CAAA,GAAIA,sBAAA,CAAM,GAAA,CAAI,QAAG,CAAA;AAEpE,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAIA,sBAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAC,CAAA,SAAA,CAAW,CAAA;AAC7E,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,cAAA,EAAO,UAAU,CAAA,CAAA,EAAIA,sBAAA,CAAM,KAAA,CAAM,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,CAAA;AAGvE,EAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAC7B,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AAC9C,MAAA,MAAM,YAAY,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,IAAI,cAAA,GAAO,cAAA;AACzD,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAG,MAAM,IAAI,SAAS,CAAA,CAAA,EAAIA,uBAAM,GAAA,CAAI,OAAO,CAAC,CAAA,CAAA,EAAIA,uBAAM,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7F;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAC9C,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,WAAA,EAAa;AACtC,MAAA,MAAM,eAAe,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AAC7E,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,cAAA,EAAOA,uBAAM,GAAA,CAAI,GAAA,GAAM,GAAG,CAAC,CAAA,CAAA,EAAIA,sBAAA,CAAM,KAAA,CAAM,YAAY,CAAC,CAAA,CAAE,CAAA;AAAA,IACjF;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,SAAA,EAAW;AACpB,IAAA,MAAM,cAAA,GAAiB,OAAO,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAC9D,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,MAAM,CAAA,cAAA,EAAOA,uBAAM,GAAA,CAAI,YAAY,CAAC,CAAA,CAAE,CAAA;AACrD,IAAA,KAAA,MAAW,QAAQ,cAAA,EAAgB;AACjC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,SAAA,EAAOA,sBAAA,CAAM,IAAI,IAAA,CAAK,IAAA,EAAM,CAAC,CAAA,CAAE,CAAA;AAAA,IACtD;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,gBAAgB,CAAA,YAAA,EAAe,MAAA,CAAO,WAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,CAAA;AAChF,EAAA,MAAM,UAAUA,sBAAA,CAAM,GAAA,CAAI,GAAG,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,EAAA,CAAI,CAAA;AAC1D,EAAA,MAAM,SAASA,sBAAA,CAAM,GAAA,CAAI,GAAG,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,OAAA,CAAS,CAAA;AAC/D,EAAA,MAAM,SAAS,MAAA,CAAO,QAAA,CAAS,SAASA,sBAAA,CAAM,KAAA,CAAM,WAAW,CAAA,GAAI,EAAA;AAEnE,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,cAAA,EAAO,UAAU,CAAA,GAAA,EAAM,OAAO,CAAA,GAAA,EAAM,MAAM,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA;AAC1E,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB;AAIO,SAAS,WAAA,CAAY,OAAc,OAAA,EAAkC;AAC1E,EAAA,IAAI,CAAC,SAAA,CAAU,QAAQ,CAAA,EAAG;AAE1B,EAAA,MAAM,MAAA,GAASA,sBAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AACnC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,QAAQ,IAAI,CAAA,CAAA,EAAIA,sBAAA,CAAM,GAAA,CAAI,QAAQ,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAC/E,EAAA,IAAI,SAAA,CAAU,OAAO,CAAA,IAAK,KAAA,CAAM,KAAA,EAAO;AACrC,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,MAAM,CAAA,CAAA,EAAIA,uBAAM,GAAA,CAAI,KAAA,CAAM,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EACnD;AACA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB;AAIO,SAAS,oBAAoB,MAAA,EAAsB;AACxD,EAAA,IAAI,CAAC,SAAA,CAAU,QAAQ,CAAA,EAAG;AAE1B,EAAA,MAAM,MAAA,GAASA,sBAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AACnC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAIA,sBAAA,CAAM,OAAO,sBAAiB,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AACtE;AAIO,SAAS,sBAAA,GAA+B;AAC7C,EAAA,IAAI,CAAC,SAAA,CAAU,QAAQ,CAAA,EAAG;AAE1B,EAAA,MAAM,MAAA,GAASA,sBAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AACnC,EAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,MAAM,CAAA,CAAA,EAAIA,uBAAM,MAAA,CAAO,sBAAiB,CAAC,CAAA,iCAAA,CAAmC,CAAA;AAC7F;AAIO,SAAS,YAAA,CAAa,MAAA,EAAgB,OAAA,EAA4B,OAAA,EAAyB;AAChG,EAAA,IAAI,CAAC,SAAA,CAAU,MAAM,CAAA,EAAG;AAExB,EAAA,MAAM,MAAA,GAASA,sBAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AACnC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAIA,uBAAM,OAAA,CAAQ,SAAS,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA;AACpF,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,cAAA,EAAOA,sBAAA,CAAM,GAAA,CAAI,UAAU,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AACnE,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,cAAA,EAAOA,sBAAA,CAAM,IAAI,SAAS,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAC5D,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,UAAA,GAAa,OAAO,OAAA,KAAY,QAAA,GAAW,UAAU,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC1F,IAAA,MAAM,QAAQ,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAC/C,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,MAAM,CAAA,cAAA,EAAOA,uBAAM,GAAA,CAAI,UAAU,CAAC,CAAA,CAAE,CAAA;AACnD,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,MAAM,CAAA,SAAA,EAAOA,uBAAM,GAAA,CAAI,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC/C;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,MAAM,CAAA,cAAA,EAAOA,uBAAM,GAAA,CAAI,oBAAoB,CAAC,CAAA,CAAE,CAAA;AAC7D,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB;AAIO,SAAS,SAAS,OAAA,EAAuB;AAC9C,EAAA,IAAI,CAAC,SAAA,CAAU,OAAO,CAAA,EAAG;AACzB,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAGA,sBAAA,CAAM,IAAA,CAAK,eAAe,CAAC,CAAA,CAAA,EAAIA,sBAAA,CAAM,GAAA,CAAI,OAAO,CAAC,CAAA,CAAE,CAAA;AACpE;;;ACxIA,IAAM,oBAAoBC,aAAA,CAAW;AAAA,EACnC,IAAA,EAAM,QAAA;AAAA,EACN,UAAA,EAAY;AAAA,IACV,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA,EAAoB,aAAa,6CAAA,EAA8C;AAAA,IAChG,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAmB,aAAa,oCAAA,EAAqC;AAAA,IACtF,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAmB,aAAa,sBAAA,EAAuB;AAAA,IAC1E,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa,wCAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAmB,aAAa,2BAAA;AAA4B,OAC9E;AAAA,MACA,oBAAA,EAAsB;AAAA,KACxB;AAAA,IACA,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA,EAAkB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAkB,EAAG,WAAA,EAAa,8BAAA,EAA+B;AAAA,IACnH,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAmB,SAAS,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,WAAA,EAAa,sBAAA;AAAuB,GACrG;AAAA,EACA,UAAU,CAAC,SAAA,EAAW,SAAA,EAAW,MAAA,EAAQ,WAAW,YAAY,CAAA;AAAA,EAChE,oBAAA,EAAsB;AACxB,CAAC,CAAA;AAID,eAAsB,UAAA,CACpB,MAAA,EACA,OAAA,EACA,OAAA,EACAC,SACA,OAAA,EACsB;AACtB,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,SAAA,GAAY,OAAA,EAAS,KAAA,IAASA,OAAAA,CAAO,KAAA;AAE3C,EAAA,QAAA,CAAS,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAE,CAAA;AACpC,EAAA,QAAA,CAAS,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAGnC,EAAA,MAAMC,WAASC,+BAAA,CAAyB;AAAA,IACtC,QAAQF,OAAAA,CAAO,MAAA,IAAU,QAAQ,GAAA,CAAI,cAAA,IAAkB,QAAQ,GAAA,CAAI;AAAA,GACpE,CAAA;AAID,EAAA,MAAM,kBAAuC,EAAC;AAE9C,EAAA,MAAM,aAAkC,EAAC;AAGzC,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AACzB,IAAA,IAAI,QAAA,CAAS,WAAW,MAAA,EAAW;AACjC,MAAA,UAAA,CAAW,gBAAgB,CAAA,GAAI,EAAE,cAAA,EAAgB,SAAS,MAAA,EAAO;AAAA,IACnE,CAAA,MAAA,IAAW,SAAS,KAAA,EAAO;AACzB,MAAA,UAAA,CAAW,gBAAgB,CAAA,GAAI,EAAE,aAAA,EAAe,SAAS,KAAA,EAAM;AAAA,IACjE;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,SAAS,CAAA,EAAG;AACtC,IAAA,eAAA,CAAgB,QAAQ,CAAA,GAAI,UAAA;AAAA,EAC9B;AAMA,EAAA,IAAI,CAACA,QAAO,SAAA,EAAW;AACrB,IAAA,MAAM,SAAA,GAAY,OAAA,EAAS,KAAA,IAAS,OAAA,CAAQ,YAAA;AAC5C,IAAA,QAAA,CAAS,CAAA,+BAAA,EAAkC,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACnE;AAGA,EAAA,MAAM,WAAA,GAAc,OAAA,GAChB,CAAA,EAAG,MAAM;;AAAA;AAAA,EAAwB,OAAO,CAAA,CAAA,GACxC,MAAA;AAGJ,EAAA,MAAM,qBAAiC,EAAC;AAIxC,EAAA,MAAM,eAAA,GAAkB,CAAC,EAAE,OAAA,EAAS,UAAU,OAAA,EAAS,cAAA,CAAA;AAEvD,EAAA,IAAI,YAAA;AAEJ,EAAA,IAAI,SAAS,MAAA,EAAQ;AAEnB,IAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,MAAA,QAAA,CAAS,yEAAoE,CAAA;AAAA,IAC/E;AACA,IAAA,QAAA,CAAS,+CAA+C,CAAA;AACxD,IAAA,YAAA,GAAeG,UAAO,MAAA,CAAO,EAAE,MAAA,EAAQ,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACzD,CAAA,MAAA,IAAW,SAAS,cAAA,EAAgB;AAElC,IAAA,QAAA,CAAS,iEAAiE,CAAA;AAC1E,IAAA,YAAA,GAAeA,SAAA,CAAO,OAAO,EAAE,MAAA,EAAQJ,cAAW,OAAA,CAAQ,cAAA,CAAe,MAAM,CAAA,EAAG,CAAA;AAAA,EACpF,CAAA,MAAO;AAEL,IAAA,YAAA,GAAeI,SAAA,CAAO,MAAA,CAAO,EAAE,MAAA,EAAQ,mBAAmB,CAAA;AAAA,EAC5D;AAGA,EAAA,MAAM,KAAA,GAAQ,IAAIC,gBAAA,CAAc;AAAA,IAC9B,KAAA,EAAOH,SAAO,SAAS,CAAA;AAAA,IACvB,YAAA,EAAc,eAAA,GACV,CAAA,EAAG,OAAA,CAAQ,YAAY;;AAAA,iLAAA,CAAA,GACvB,OAAA,CAAQ,YAAA;AAAA,IACZ,eAAA,EAAiBD,QAAO,MAAA,CAAO,gBAAA;AAAA,IAC/B,MAAA,EAAQ,YAAA;AAAA,IACR,iBAAiB,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA,CAAE,MAAA,GAAS,IAAI,eAAA,GAAkB,MAAA;AAAA,IAC7E,YAAA,EAAc,CAAC,IAAA,KAAS;AAEtB,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,KAAA,MAAW,EAAA,IAAM,KAAK,SAAA,EAAW;AAC/B,UAAA,kBAAA,CAAmB,IAAA,CAAK;AAAA,YACtB,MAAM,EAAA,CAAG,QAAA;AAAA;AAAA,YAET,IAAA,EAAO,EAAA,CAAW,IAAA,IAAQ,EAAC;AAAA,YAC3B,QAAQ,EAAA,CAAG;AAAA,WACZ,CAAA;AAAA,QACH;AAAA,MACF;AACA,MAAA,QAAA,CAAS,CAAA,eAAA,EAAkB,IAAA,CAAK,YAAY,CAAA,CAAE,CAAA;AAAA,IAChD;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,QAAA,CAAS;AAAA,IAClC,MAAA,EAAQ,WAAA;AAAA,IACR,SAASA,OAAAA,CAAO;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC/B,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,EAAO,WAAA,IAAe,CAAA;AAEhD,EAAA,QAAA,CAAS,CAAA,mBAAA,EAAsB,SAAS,CAAA,IAAA,EAAO,UAAU,CAAA,OAAA,CAAS,CAAA;AAGlE,EAAA,IAAI,eAAA,IAAmB,OAAO,MAAA,EAAQ;AACpC,IAAA,MAAM,aAAa,MAAA,CAAO,MAAA;AAC1B,IAAA,QAAA,CAAS,wDAAwD,CAAA;AACjE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,SAAS,CAAA,4BAAA,EAA+B,MAAA,CAAO,IAAA,CAAK,UAAU,EAAE,MAAM,CAAA,QAAA,CAAA;AAAA,MACtE,IAAA,EAAM,UAAA;AAAA,MACN,SAAS,kBAAA,CAAmB,GAAA,CAAI,CAAC,EAAA,KAAO,GAAG,IAAI,CAAA;AAAA,MAC/C,UAAA,EAAY,CAAA;AAAA,MACZ,QAAA,EAAU;AAAA,QACR,KAAA,EAAO,SAAA;AAAA,QACP,UAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA,EAAW,kBAAA;AAAA,QACX,MAAA,EAAQ;AAAA;AACV,KACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AAQtB,IAAA,OAAO;AAAA,MACL,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,QAAA,EAAU;AAAA,QACR,KAAA,EAAO,SAAA;AAAA,QACP,UAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA,EAAW,kBAAA;AAAA,QACX,MAAA,EAAQ;AAAA;AACV,KACF;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AAExC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,QAAQ,OAAA,IAAW,IAAA;AAAA,IAC5B,SAAS,MAAA,EAAQ,OAAA,IAAW,OAAO,IAAA,CAAK,SAAA,CAAU,GAAG,GAAG,CAAA;AAAA,IACxD,WAAW,MAAA,EAAQ,SAAA;AAAA,IACnB,MAAM,MAAA,EAAQ,IAAA,IAAQ,EAAE,GAAA,EAAK,OAAO,IAAA,EAAK;AAAA,IACzC,OAAA,EAAS,QAAQ,OAAA,IAAW,kBAAA,CAAmB,IAAI,CAAC,EAAA,KAAO,GAAG,IAAI,CAAA;AAAA,IAClE,UAAA,EAAY,QAAQ,UAAA,IAAc,GAAA;AAAA,IAClC,QAAA,EAAU;AAAA,MACR,KAAA,EAAO,SAAA;AAAA,MACP,UAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW,kBAAA;AAAA,MACX,MAAA,EAAQ;AAAA;AACV,GACF;AACF;AAKA,SAAS,cAAc,IAAA,EAAmB;AAExC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AAEN,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,uCAAuC,CAAA;AACpE,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI;AACF,QAAA,OAAO,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,MAChC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AAC5C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAI;AACF,QAAA,OAAO,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,MAClC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAGA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA;AAAA,MAC9B,IAAA,EAAM,EAAE,GAAA,EAAK,IAAA,EAAK;AAAA,MAClB,SAAS,EAAC;AAAA,MACV,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AACF;;;AC1PA,IAAM,QAAA,GAAW;AAAA;AAAA,EAEf,MAAA,EAAQ,mGAAA;AAAA;AAAA,EAER,MAAA,EAAQ,mCAAA;AAAA;AAAA,EAER,KAAA,EAAO,iDAAA;AAAA;AAAA,EAEP,IAAA,EAAM,8BAAA;AAAA;AAAA,EAEN,IAAA,EAAM,2CAAA;AAAA;AAAA,EAEN,MAAA,EAAQ,4BAAA;AAAA;AAAA,EAER,UAAA,EAAY,iFAAA;AAAA;AAAA,EAEZ,gBAAA,EAAkB,sDAAA;AAAA;AAAA,EAElB,SAAA,EAAW;AACb,CAAA;AAMO,SAAS,UAAU,OAAA,EAAyB;AACjD,EAAA,IAAI,MAAA,GAAS,OAAA;AAEb,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,UAAA,EAAY,wBAAwB,CAAA;AACrE,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,gBAAA,EAAkB,8BAA8B,CAAA;AACjF,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,MAAA,EAAQ,oBAAoB,CAAA;AAC7D,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,MAAA,EAAQ,yBAAyB,CAAA;AAClE,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,QAAA,CAAS,MAAA,EAAQ,CAAC,OAAO,IAAA,KAAS;AAExD,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,UAAU,CAAA;AACxC,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,SAAA,CAAU,CAAA,EAAG,QAAQ,CAAA;AAC1C,IAAA,OAAO,GAAG,MAAM,CAAA,YAAA,CAAA;AAAA,EAClB,CAAC,CAAA;AACD,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,SAAA,EAAW,CAAC,KAAA,KAAU;AACrD,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AACjC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,SAAA,CAAU,CAAA,EAAG,KAAK,CAAA;AACpC,IAAA,OAAO,GAAG,GAAG,CAAA,WAAA,CAAA;AAAA,EACf,CAAC,CAAA;AACD,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,KAAA,EAAO,SAAS,CAAA;AACjD,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAC7C,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAE7C,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,eAAe,KAAA,EAAyB;AACtD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,UAAU,KAAK,CAAA;AAAA,EACxB;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CAAM,IAAI,cAAc,CAAA;AAAA,EACjC;AACA,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AAC/C,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,cAAA,CAAe,CAAC,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;;;ACrEO,IAAM,cAAN,MAAkB;AAAA,EACf,MAAA;AAAA,EACS,SAAA;AAAA,EACA,UAAA;AAAA;AAAA,EACT,UAAA;AAAA;AAAA;AAAA;AAAA,EAKR,YAAY,cAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,SAAA,GAAY,cAAA;AACjB,IAAA,IAAA,CAAK,MAAA,GAAS,cAAA;AAEd,IAAA,IAAA,CAAK,UAAA,GAAa,cAAA,IAAkB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA,CAAA;AACnD,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,GAAA,EAAI;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,MAAA,EAAO;AAEZ,IAAA,IAAI,IAAA,CAAK,UAAU,CAAA,EAAG;AACpB,MAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AACf,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,MAAA,EAAO;AACZ,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,SAAA;AACnB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,GAAA,EAAI;AAAA,EAC7B;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA;AAC3B,IAAA,MAAM,SAAA,GAAY,UAAU,IAAA,CAAK,UAAA;AAEjC,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,GAAA,CAAI,KAAK,SAAA,EAAW,IAAA,CAAK,SAAS,SAAS,CAAA;AAC9D,IAAA,IAAA,CAAK,UAAA,GAAa,GAAA;AAAA,EACpB;AACF,CAAA;;;ACtDO,IAAM,gBAAN,MAAoB;AAAA,EACjB,UAAA,GAAa,CAAA;AAAA,EACb,WAAA,GAAc,CAAA;AAAA,EACd,SAAA,GAAY,CAAA;AAAA,EACZ,QAAA;AAAA,EACS,MAAA;AAAA,EAEjB,YAAYA,OAAAA,EAAsB;AAChC,IAAA,IAAA,CAAK,MAAA,GAASA,OAAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,aAAA,EAAc;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAqD;AACnD,IAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,MAAA,CAAO,cAAA,EAAgB;AACjD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,CAAA,0BAAA,EAA6B,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA,WAAA;AAAA,OACjE;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc;AAC9C,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,QAAQ,CAAA,yBAAA,EAA4B,IAAA,CAAK,OAAO,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,OACzE;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,YAAoB,OAAA,EAAuB;AACrD,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,UAAA,IAAc,CAAA;AACnB,IAAA,IAAA,CAAK,WAAA,IAAe,UAAA;AACpB,IAAA,IAAA,CAAK,SAAA,IAAa,OAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAW;AACT,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,OAAO;AAAA,MACL,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,cAAA,EAAgB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,MAAA,CAAO,cAAA,GAAiB,KAAK,UAAU,CAAA;AAAA,MACxE,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,aAAA,EAAe,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,MAAA,CAAO,YAAA,GAAe,KAAK,SAAS;AAAA,KACtE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AACnB,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,aAAA,EAAc;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,gBAAA,GAA2B;AAC7B,IAAA,OAAO,KAAK,MAAA,CAAO,gBAAA;AAAA,EACrB;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,MAAM,eAAA,GAAkB,KAAK,aAAA,EAAc;AAC3C,IAAA,IAAI,eAAA,GAAkB,KAAK,QAAA,EAAU;AACnC,MAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,MAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AACnB,MAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,MAAA,IAAA,CAAK,QAAA,GAAW,eAAA;AAAA,IAClB;AAAA,EACF;AAAA,EAEQ,aAAA,GAAwB;AAC9B,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,cAAA,EAAe,EAAG,IAAI,WAAA,EAAY,EAAG,GAAA,CAAI,UAAA,EAAY,CAAA;AAAA,EAC3E;AACF,CAAA;;;ACzEO,IAAM,cAAA,GAA8B;AAAA,EACzC,QAAA,EAAU,QAAA;AAAA,EACV,KAAA,EAAO,uBAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ;AAAA,IACN,cAAA,EAAgB,GAAA;AAAA,IAChB,gBAAA,EAAkB,GAAA;AAAA,IAClB,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,IAAA,EAAM,iBAAA;AAAA,EACN,OAAA,EAAS,GAAA;AAAA,EACT,SAAA,EAAW,IAAA;AAAA,EACX,SAAA,EAAW,KAAA;AAAA,EACX,MAAA,EAAQ,KAAA;AAAA,EACR,QAAA,EAAU,MAAA;AAAA,EACV,gBAAgB;AAClB;AAIA,IAAI,MAAA,GAAsB,EAAE,GAAG,cAAA,EAAe;AAC9C,IAAI,WAAA,GAAc,IAAI,WAAA,CAAY,MAAA,CAAO,OAAO,cAAc,CAAA;AAC9D,IAAI,aAAA,GAAgB,IAAI,aAAA,CAAc,MAAA,CAAO,MAAM,CAAA;AAK5C,SAAS,aAAa,SAAA,EAAuC;AAClE,EAAA,MAAA,GAAS,EAAE,GAAG,cAAA,EAAgB,GAAG,SAAA,EAAU;AAG3C,EAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,IAAA,MAAA,CAAO,SAAS,EAAE,GAAG,eAAe,MAAA,EAAQ,GAAG,UAAU,MAAA,EAAO;AAAA,EAClE;AAGA,EAAA,WAAA,GAAc,IAAI,WAAA,CAAY,MAAA,CAAO,MAAA,CAAO,cAAc,CAAA;AAC1D,EAAA,aAAA,GAAgB,IAAI,aAAA,CAAc,MAAA,CAAO,MAAM,CAAA;AACjD;AAKO,SAAS,SAAA,GAAyB;AACvC,EAAA,OAAO,EAAE,GAAG,MAAA,EAAO;AACrB;AAOA,eAAsB,YAAA,CACpB,MAAA,EACA,OAAA,EACA,OAAA,EACsB;AAEtB,EAAA,MAAM,WAAA,GAA2B,OAAA,EAAS,OAAA,IAAW,MAAA,CAAO,OAAA;AAC5D,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,GACrB,UAAA,CAAW,QAAQ,OAAO,CAAA,GAC1B,aAAA,CAAc,MAAA,EAAQ,WAAW,CAAA;AAErC,EAAA,QAAA,CAAS,qBAAqB,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,OAAA,CAAQ,IAAI,CAAA,CAAA,CAAG,CAAA;AAG9D,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,YAAA,CAAa,MAAA,EAAQ,SAAS,OAAO,CAAA;AACrC,IAAA,OAAO,kBAAA,CAAmB,QAAQ,IAAI,CAAA;AAAA,EACxC;AAGA,EAAA,IAAI,CAAC,WAAA,CAAY,UAAA,EAAW,EAAG;AAC7B,IAAA,sBAAA,EAAuB;AACvB,IAAA,OAAO,kBAAkB,sDAAiD,CAAA;AAAA,EAC5E;AAGA,EAAA,MAAM,WAAA,GAAc,cAAc,WAAA,EAAY;AAC9C,EAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,IAAA,mBAAA,CAAoB,YAAY,MAAO,CAAA;AACvC,IAAA,OAAO,iBAAA,CAAkB,YAAY,MAAO,CAAA;AAAA,EAC9C;AAGA,EAAA,IAAI,UAAA,GAAa,EAAA;AACjB,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,SAAA,GAAY,cAAA,CAAe,OAAO,CAAA,GAAI,OAAA;AAC/D,IAAA,UAAA,GAAa,OAAO,cAAc,QAAA,GAC9B,SAAA,GACA,KAAK,SAAA,CAAU,SAAA,EAAW,MAAM,CAAC,CAAA;AAIrC,IAAA,IAAI,mBAAmB,KAAA,EAAO;AAC5B,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,GAAI,OAAO,OAAA,KAAY,QAAA,GAAW,MAAA,CAAO,mBAAA,CAAoB,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,EAAK,GAAA,KAAQ;AAEzF,UAAC,GAAA,CAAY,GAAG,CAAA,GAAK,OAAA,CAAgB,GAAG,CAAA;AACxC,UAAA,OAAO,GAAA;AAAA,QACT,CAAA,EAAG,EAA6B,CAAA,GAAI;AAAC,OACvC;AACA,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,SAAA,GAAY,cAAA,CAAe,MAAM,CAAA,GAAI,MAAA;AAC/D,MAAA,UAAA,GAAa,OAAO,eAAe,QAAA,GAAW,UAAA,GAAa,KAAK,SAAA,CAAU,UAAA,EAAY,MAAM,CAAC,CAAA;AAAA,IAC/F;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,SAAA,GAC1B,cAAA,CAAe,MAAM,CAAA,GACtB,MAAA;AAGJ,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,OAAA,EAAS,eAAe,CAAA;AAErD,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA,CAAK;AAAA,MAChC,UAAA,CAAW,eAAA,EAAiB,UAAA,EAAY,OAAA,EAAS,QAAQ,OAAO,CAAA;AAAA,MAChE,aAAA,CAAc,OAAO,OAAO;AAAA,KAC7B,CAAA;AAGD,IAAA,aAAA,CAAc,WAAA;AAAA,MACZ,OAAO,QAAA,CAAS,UAAA;AAAA,MAChB,aAAa,MAAA,CAAO,QAAA,CAAS,UAAA,EAAY,MAAA,CAAO,SAAS,KAAK;AAAA,KAChE;AAGA,IAAA,WAAA,CAAY,OAAA,EAAS,OAAO,OAAO,CAAA;AACnC,IAAA,YAAA,CAAa,QAAQ,OAAO,CAAA;AAE5B,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,WAAA,CAAY,SAAS,KAAK,CAAA;AAC1B,IAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,IAAA,WAAA,CAAY,KAAK,OAAO,CAAA;AACxB,IAAA,OAAO,iBAAA,CAAkB,IAAI,OAAO,CAAA;AAAA,EACtC;AACF;AAIA,SAAS,cAAc,EAAA,EAA4B;AACjD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,CAAA,EAAG,MAAA,KAAW;AAChC,IAAA,UAAA,CAAW,MAAM,OAAO,IAAI,KAAA,CAAM,yBAAyB,EAAE,CAAA,EAAA,CAAI,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,EACzE,CAAC,CAAA;AACH;AAEA,SAAS,kBAAkB,OAAA,EAA8B;AACvD,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT,OAAA,EAAS,OAAA;AAAA,IACT,MAAM,EAAC;AAAA,IACP,SAAS,EAAC;AAAA,IACV,UAAA,EAAY,CAAA;AAAA,IACZ,QAAA,EAAU;AAAA,MACR,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAA,EAAY,CAAA;AAAA,MACZ,SAAA,EAAW,CAAA;AAAA,MACX,WAAW,EAAC;AAAA,MACZ,MAAA,EAAQ;AAAA;AACV,GACF;AACF;AAEA,SAAS,mBAAmB,WAAA,EAAkC;AAC5D,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS,sCAAsC,WAAW,CAAA,QAAA,CAAA;AAAA,IAC1D,IAAA,EAAM,EAAE,MAAA,EAAQ,IAAA,EAAK;AAAA,IACrB,SAAS,EAAC;AAAA,IACV,UAAA,EAAY,CAAA;AAAA,IACZ,QAAA,EAAU;AAAA,MACR,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAA,EAAY,CAAA;AAAA,MACZ,SAAA,EAAW,CAAA;AAAA,MACX,WAAW,EAAC;AAAA,MACZ,MAAA,EAAQ;AAAA;AACV,GACF;AACF;AAKA,SAAS,YAAA,CAAa,QAAgB,KAAA,EAAuB;AAE3D,EAAA,MAAM,SAAA,GAAoC;AAAA,IACxC,uBAAA,EAAyB,IAAA;AAAA,IACzB,wBAAA,EAA0B;AAAA,GAC5B;AACA,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,KAAK,CAAA,IAAK,IAAA;AACjC,EAAA,OAAQ,SAAS,GAAA,GAAa,IAAA;AAChC;;;ACvJO,SAAS,IAAA,CAAKA,OAAAA,GAA+B,EAAC,EAAS;AAC5D,EAAA,YAAA,CAAaA,OAAM,CAAA;AAEnB,EAAA,MAAM,aAAa,SAAA,EAAU;AAC7B,EAAA,WAAA,CAAY,WAAW,QAAQ,CAAA;AAG/B,EAAA,kBAAA,EAAmB;AACrB;AAQA,SAAS,gBAAA,GAAkC;AAEzC,EAAA,MAAM,OAAA,GAAU,CACd,MAAA,EACA,OAAA,EACA,OAAA,KACyB;AACzB,IAAA,MAAMA,UAAS,SAAA,EAAU;AAEzB,IAAA,IAAIA,OAAAA,CAAO,IAAA,KAAS,iBAAA,IAAqB,CAAC,SAAS,IAAA,EAAM;AAGvD,MAAA,MAAM,OAAA,GAAU,YAAA,CAAa,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AAErD,MAAA,OAAA,CAAQ,MAAM,MAAM;AAAA,MAAqD,CAAC,CAAA;AAC1E,MAAA,OAAO,OAAA;AAAA,IACT;AAGA,IAAA,OAAO,YAAA,CAAa,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,EAC9C,CAAA;AAGA,EAAA,OAAA,CAAQ,QAAA,GAAW,CACjB,MAAA,EACA,OAAA,EACA,OAAA,KACyB;AACzB,IAAA,OAAO,YAAA,CAAa,QAAQ,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,YAAY,CAAA;AAAA,EAC1E,CAAA;AAEA,EAAA,OAAA,CAAQ,KAAA,GAAQ,CACd,MAAA,EACA,OAAA,EACA,OAAA,KACyB;AACzB,IAAA,OAAO,YAAA,CAAa,QAAQ,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,YAAY,CAAA;AAAA,EAC1E,CAAA;AAEA,EAAA,OAAA,CAAQ,SAAA,GAAY,CAClB,MAAA,EACA,OAAA,EACA,OAAA,KACyB;AACzB,IAAA,OAAO,YAAA,CAAa,QAAQ,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,aAAa,CAAA;AAAA,EAC3E,CAAA;AAEA,EAAA,OAAO,OAAA;AACT;AAWA,IAAI,QAAA,GAAW,KAAA;AAEf,SAAS,kBAAA,GAA2B;AAClC,EAAA,IAAI,QAAA,EAAU;AAEd,EAAA,MAAM,aAAa,gBAAA,EAAiB;AAEpC,EAAC,QAA+C,KAAA,GAAQ,UAAA;AACxD,EAAA,QAAA,GAAW,IAAA;AACb;AAKA,kBAAA,EAAmB","file":"index.cjs","sourcesContent":["import type { PersonaDefinition } from '../types.js';\n\nexport const debuggerPersona: PersonaDefinition = {\n name: 'debugger',\n icon: '🐛',\n label: 'Debugging',\n systemPrompt: `You are a senior debugging expert and performance engineer.\n\nYour role:\n- Analyze errors, stack traces, exceptions, and performance issues\n- Identify root causes with high confidence\n- Provide concrete fixes with code examples\n- Suggest preventive measures\n\nOutput format:\n- Start with a one-line summary of the issue\n- Explain the root cause clearly\n- Provide a concrete fix (with code if applicable)\n- Rate severity: LOW / MEDIUM / HIGH / CRITICAL\n- Include confidence score (0-1)\n\nAlways be concise, technical, and actionable. No fluff.`,\n defaultTools: ['code_execution', 'google_search'],\n keywords: [\n 'slow', 'perf', 'performance', 'optimize', 'optimization',\n 'debug', 'error', 'bug', 'crash', 'exception', 'stack',\n 'trace', 'memory', 'leak', 'timeout', 'latency', 'bottleneck',\n 'hang', 'freeze', 'deadlock', 'race condition',\n ],\n};\n","import type { PersonaDefinition } from '../types.js';\n\nexport const securityPersona: PersonaDefinition = {\n name: 'security',\n icon: '🛡️',\n label: 'Security audit',\n systemPrompt: `You are an OWASP security expert and penetration testing specialist.\n\nYour role:\n- Audit code and inputs for vulnerabilities (SQL injection, XSS, CSRF, SSRF, etc.)\n- Flag security risks immediately with severity ratings\n- Check for known CVEs in dependencies\n- Recommend secure coding practices\n\nOutput format:\n- Start with overall risk level: SAFE / LOW RISK / MEDIUM RISK / HIGH RISK / CRITICAL\n- List each vulnerability found with:\n - Type (e.g., SQL Injection, XSS)\n - Location (where in the code/input)\n - Impact (what an attacker could do)\n - Fix (concrete remediation)\n- Include confidence score (0-1)\n\nBe thorough, explicit about risks, and always err on the side of caution.`,\n defaultTools: ['google_search'],\n keywords: [\n 'security', 'vuln', 'vulnerability', 'exploit', 'injection',\n 'xss', 'csrf', 'ssrf', 'sql injection', 'auth', 'authentication',\n 'authorization', 'permission', 'privilege', 'escalation',\n 'sanitize', 'escape', 'encrypt', 'decrypt', 'hash', 'token',\n 'secret', 'api key', 'password', 'credential', 'owasp', 'cve',\n ],\n};\n","import type { PersonaDefinition } from '../types.js';\n\nexport const architectPersona: PersonaDefinition = {\n name: 'architect',\n icon: '🏗️',\n label: 'Architecture review',\n systemPrompt: `You are a principal software engineer and system architect.\n\nYour role:\n- Review system design, API design, and code architecture\n- Evaluate scalability, maintainability, and performance characteristics\n- Identify design pattern opportunities and anti-patterns\n- Suggest architectural improvements with trade-off analysis\n\nOutput format:\n- Start with an overall assessment: SOLID / NEEDS IMPROVEMENT / SIGNIFICANT CONCERNS\n- List strengths of the current design\n- List concerns with severity and impact\n- Provide concrete recommendations with:\n - What to change\n - Why (trade-offs)\n - How (implementation guidance)\n- Include confidence score (0-1)\n\nThink like a senior architect reviewing a design doc. Be constructive, not pedantic.`,\n defaultTools: ['google_search', 'file_analysis'],\n keywords: [\n 'design', 'architecture', 'architect', 'pattern', 'scalab',\n 'microservice', 'monolith', 'api design', 'schema', 'database',\n 'system design', 'infrastructure', 'deploy', 'ci/cd', 'pipeline',\n 'refactor', 'modular', 'coupling', 'cohesion', 'solid',\n 'clean architecture', 'domain driven', 'event driven',\n ],\n};\n","import type { PersonaDefinition } from '../types.js';\n\nexport const generalPersona: PersonaDefinition = {\n name: 'general',\n icon: '🔍',\n label: 'Analyzing',\n systemPrompt: `You are a helpful senior full-stack engineer with broad expertise.\n\nYour role:\n- Provide actionable advice on any technical topic\n- Analyze code, data, configurations, and systems\n- Validate inputs, schemas, and data integrity\n- Answer questions with practical, real-world guidance\n\nOutput format:\n- Start with a clear, one-line answer or summary\n- Provide supporting details and reasoning\n- Include code examples when relevant\n- List any caveats or edge cases\n- Include confidence score (0-1)\n\nBe balanced, practical, and concise. Prioritize actionable insights over theory.`,\n defaultTools: ['code_execution', 'google_search', 'file_analysis'],\n keywords: [], // General catches everything not matched by specific personas\n};\n","import type { PersonaDefinition, PersonaName } from '../types.js';\nimport { debuggerPersona } from './debugger.js';\nimport { securityPersona } from './security.js';\nimport { architectPersona } from './architect.js';\nimport { generalPersona } from './general.js';\n\nexport const personas: Record<PersonaName, PersonaDefinition> = {\n debugger: debuggerPersona,\n security: securityPersona,\n architect: architectPersona,\n general: generalPersona,\n};\n\n/**\n * Auto-detect the best persona based on keywords in the prompt.\n * Returns the explicitly set persona if provided, otherwise scans for keywords.\n */\nexport function detectPersona(prompt: string, defaultPersona: PersonaName): PersonaDefinition {\n const lower = prompt.toLowerCase();\n\n // Check specific personas in priority order (security > debugger > architect)\n for (const name of ['security', 'debugger', 'architect'] as PersonaName[]) {\n const persona = personas[name];\n if (persona.keywords.some((kw) => lower.includes(kw))) {\n return persona;\n }\n }\n\n return personas[defaultPersona];\n}\n\nexport function getPersona(name: PersonaName): PersonaDefinition {\n return personas[name];\n}\n","/**\n * Console formatting — rich output with colors, icons, and tree structure.\n * Uses chalk for colors and ora for spinners.\n */\n\nimport chalk from 'chalk';\nimport ora, { type Ora } from 'ora';\nimport type { AgentResult, PersonaDefinition, LogLevel } from '../types.js';\n\nlet currentLogLevel: LogLevel = 'info';\n\nexport function setLogLevel(level: LogLevel): void {\n currentLogLevel = level;\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n const levels: LogLevel[] = ['silent', 'errors', 'info', 'debug'];\n return levels.indexOf(currentLogLevel) >= levels.indexOf(level);\n}\n\n// ─── Spinner Management ──────────────────────────────────────────────────────\n\nexport function startSpinner(persona: PersonaDefinition, prompt: string): Ora | null {\n if (!shouldLog('info')) return null;\n\n const truncated = prompt.length > 60 ? prompt.substring(0, 57) + '...' : prompt;\n const spinner = ora({\n text: chalk.cyan(`${persona.icon} ${persona.label}... `) + chalk.dim(truncated),\n prefixText: chalk.gray('[AGENT]'),\n }).start();\n\n return spinner;\n}\n\nexport function stopSpinner(spinner: Ora | null, success: boolean): void {\n if (!spinner) return;\n\n if (success) {\n spinner.succeed();\n } else {\n spinner.fail();\n }\n}\n\n// ─── Result Formatting ──────────────────────────────────────────────────────\n\nexport function formatResult(result: AgentResult, persona: PersonaDefinition): void {\n if (!shouldLog('info')) return;\n\n const prefix = chalk.gray('[AGENT]');\n const confidenceColor = result.confidence >= 0.8 ? chalk.green : result.confidence >= 0.5 ? chalk.yellow : chalk.red;\n const statusIcon = result.success ? chalk.green('✓') : chalk.red('✗');\n\n console.log('');\n console.log(`${prefix} ${persona.icon} ${chalk.bold(persona.label)} Complete`);\n console.log(`${prefix} ├─ ${statusIcon} ${chalk.white(result.summary)}`);\n\n // Show actions/tools used\n if (result.actions.length > 0) {\n for (let i = 0; i < result.actions.length; i++) {\n const connector = i < result.actions.length - 1 ? '├─' : '├─';\n console.log(`${prefix} ${connector} ${chalk.dim('Tool:')} ${chalk.cyan(result.actions[i])}`);\n }\n }\n\n // Show key data points\n const dataEntries = Object.entries(result.data);\n if (dataEntries.length > 0) {\n for (const [key, value] of dataEntries) {\n const displayValue = typeof value === 'string' ? value : JSON.stringify(value);\n console.log(`${prefix} ├─ ${chalk.dim(key + ':')} ${chalk.white(displayValue)}`);\n }\n }\n\n // Show reasoning if available\n if (result.reasoning) {\n const reasoningLines = result.reasoning.split('\\n').slice(0, 3);\n console.log(`${prefix} ├─ ${chalk.dim('Reasoning:')}`);\n for (const line of reasoningLines) {\n console.log(`${prefix} │ ${chalk.dim(line.trim())}`);\n }\n }\n\n // Footer with metadata\n const confidence = confidenceColor(`confidence: ${result.confidence.toFixed(2)}`);\n const latency = chalk.dim(`${result.metadata.latencyMs}ms`);\n const tokens = chalk.dim(`${result.metadata.tokensUsed} tokens`);\n const cached = result.metadata.cached ? chalk.green(' (cached)') : '';\n\n console.log(`${prefix} └─ ${confidence} | ${latency} | ${tokens}${cached}`);\n console.log('');\n}\n\n// ─── Error Formatting ────────────────────────────────────────────────────────\n\nexport function formatError(error: Error, persona: PersonaDefinition): void {\n if (!shouldLog('errors')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log('');\n console.log(`${prefix} ${persona.icon} ${chalk.red('Error:')} ${error.message}`);\n if (shouldLog('debug') && error.stack) {\n console.log(`${prefix} ${chalk.dim(error.stack)}`);\n }\n console.log('');\n}\n\n// ─── Budget Warning ──────────────────────────────────────────────────────────\n\nexport function formatBudgetWarning(reason: string): void {\n if (!shouldLog('errors')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log(`${prefix} ${chalk.yellow('⚠ Budget limit:')} ${reason}`);\n}\n\n// ─── Rate Limit Warning ─────────────────────────────────────────────────────\n\nexport function formatRateLimitWarning(): void {\n if (!shouldLog('errors')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log(`${prefix} ${chalk.yellow('⚠ Rate limited:')} Too many calls. Try again later.`);\n}\n\n// ─── Dry Run ─────────────────────────────────────────────────────────────────\n\nexport function formatDryRun(prompt: string, persona: PersonaDefinition, context?: unknown): void {\n if (!shouldLog('info')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log('');\n console.log(`${prefix} ${chalk.magenta('DRY RUN')} ${persona.icon} ${persona.label}`);\n console.log(`${prefix} ├─ ${chalk.dim('Persona:')} ${persona.name}`);\n console.log(`${prefix} ├─ ${chalk.dim('Prompt:')} ${prompt}`);\n if (context !== undefined) {\n const contextStr = typeof context === 'string' ? context : JSON.stringify(context, null, 2);\n const lines = contextStr.split('\\n').slice(0, 5);\n console.log(`${prefix} ├─ ${chalk.dim('Context:')}`);\n for (const line of lines) {\n console.log(`${prefix} │ ${chalk.dim(line)}`);\n }\n }\n console.log(`${prefix} └─ ${chalk.dim('(No API call made)')}`);\n console.log('');\n}\n\n// ─── Debug logging ───────────────────────────────────────────────────────────\n\nexport function logDebug(message: string): void {\n if (!shouldLog('debug')) return;\n console.log(`${chalk.gray('[AGENT DEBUG]')} ${chalk.dim(message)}`);\n}\n","/**\n * Google AI provider — integrates with Gemini via @ai-sdk/google + Vercel AI SDK.\n * Uses ToolLoopAgent for multi-step reasoning with structured output.\n * This is the only provider in v1.0.\n */\n\nimport { createGoogleGenerativeAI } from '@ai-sdk/google';\nimport { ToolLoopAgent, Output, jsonSchema } from 'ai';\nimport type { AgentConfig, AgentCallOptions, AgentResult, PersonaDefinition, ToolCall } from '../types.js';\nimport { logDebug } from '../utils/format.js';\nimport { z } from 'zod';\n\n// ─── Structured Output Schema (JSON Schema compatible with Gemini) ───────────\n// Gemini requires OBJECT types to have non-empty `properties`.\n// We define a `result` property inside `data` to satisfy this constraint.\n\nconst agentOutputSchema = jsonSchema({\n type: 'object' as const,\n properties: {\n success: { type: 'boolean' as const, description: 'Whether the task was completed successfully' },\n summary: { type: 'string' as const, description: 'One-line human-readable conclusion' },\n reasoning: { type: 'string' as const, description: 'Your thought process' },\n data: {\n type: 'object' as const,\n description: 'Structured findings as key-value pairs',\n properties: {\n result: { type: 'string' as const, description: 'Primary result or finding' },\n },\n additionalProperties: true,\n },\n actions: { type: 'array' as const, items: { type: 'string' as const }, description: 'List of tools/steps you used' },\n confidence: { type: 'number' as const, minimum: 0, maximum: 1, description: '0-1 confidence score' },\n },\n required: ['success', 'summary', 'data', 'actions', 'confidence'] as const,\n additionalProperties: false,\n});\n\n// ─── Provider ────────────────────────────────────────────────────────────────\n\nexport async function callGoogle(\n prompt: string,\n context: string,\n persona: PersonaDefinition,\n config: AgentConfig,\n options?: AgentCallOptions,\n): Promise<AgentResult> {\n const startTime = Date.now();\n const modelName = options?.model ?? config.model;\n\n logDebug(`Using model: ${modelName}`);\n logDebug(`Persona: ${persona.name}`);\n\n // Create Google AI provider instance\n const google = createGoogleGenerativeAI({\n apiKey: config.apiKey ?? process.env.GEMINI_API_KEY ?? process.env.GOOGLE_GENERATIVE_AI_API_KEY,\n });\n\n // Build provider options for thinking config\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const providerOptions: Record<string, any> = {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const googleOpts: Record<string, any> = {};\n\n // Add thinking config if specified\n if (options?.thinking) {\n const thinking = options.thinking;\n if (thinking.budget !== undefined) {\n googleOpts['thinkingConfig'] = { thinkingBudget: thinking.budget };\n } else if (thinking.level) {\n googleOpts['thinkingConfig'] = { thinkingLevel: thinking.level };\n }\n }\n\n if (Object.keys(googleOpts).length > 0) {\n providerOptions['google'] = googleOpts;\n }\n\n // Note: Gemini's built-in tools (code_execution, google_search) are\n // incompatible with structured JSON output (response_mime_type: application/json).\n // Since structured output is essential for AgentResult, we skip built-in tools\n // and rely on the model's knowledge + structured output instead.\n if (!config.localOnly) {\n const toolNames = options?.tools ?? persona.defaultTools;\n logDebug(`Persona tools (informational): ${toolNames.join(', ')}`);\n }\n\n // Build the user message with context\n const userMessage = context\n ? `${prompt}\\n\\n--- Context ---\\n${context}`\n : prompt;\n\n // Collect tool calls across steps\n const collectedToolCalls: ToolCall[] = [];\n\n // ─── Determine output schema ─────────────────────────────────────────────\n // Priority: options.schema (Zod) > options.responseFormat (JSON Schema) > default\n const useCustomSchema = !!(options?.schema || options?.responseFormat);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let outputConfig: any;\n\n if (options?.schema) {\n // Zod schema — user passed a z.object(...) or similar\n if (options.responseFormat) {\n logDebug('Both schema (Zod) and responseFormat provided — using schema (Zod)');\n }\n logDebug('Using custom Zod schema for structured output');\n outputConfig = Output.object({ schema: options.schema });\n } else if (options?.responseFormat) {\n // Plain JSON Schema object\n logDebug('Using custom JSON Schema (responseFormat) for structured output');\n outputConfig = Output.object({ schema: jsonSchema(options.responseFormat.schema) });\n } else {\n // Default: standard AgentResult schema\n outputConfig = Output.object({ schema: agentOutputSchema });\n }\n\n // Create the ToolLoopAgent for multi-step reasoning\n const agent = new ToolLoopAgent({\n model: google(modelName),\n instructions: useCustomSchema\n ? `${persona.systemPrompt}\\n\\nIMPORTANT: You must respond with structured data matching the requested output schema. Do not include AgentResult wrapper fields — just return the data matching the schema.`\n : persona.systemPrompt,\n maxOutputTokens: config.budget.maxTokensPerCall,\n output: outputConfig,\n providerOptions: Object.keys(providerOptions).length > 0 ? providerOptions : undefined,\n onStepFinish: (step) => {\n // Collect tool calls from each step\n if (step.toolCalls) {\n for (const tc of step.toolCalls) {\n collectedToolCalls.push({\n name: tc.toolName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args: (tc as any).args ?? {},\n result: tc.toolName,\n });\n }\n }\n logDebug(`Step finished: ${step.finishReason}`);\n },\n });\n\n // Execute the agent\n const result = await agent.generate({\n prompt: userMessage,\n timeout: config.timeout,\n });\n\n const latencyMs = Date.now() - startTime;\n const tokensUsed = result.usage?.totalTokens ?? 0;\n\n logDebug(`Response received: ${latencyMs}ms, ${tokensUsed} tokens`);\n\n // ─── Custom schema: wrap AI output in AgentResult ──────────────────────\n if (useCustomSchema && result.output) {\n const customData = result.output as Record<string, unknown>;\n logDebug('Custom schema output received, wrapping in AgentResult');\n return {\n success: true,\n summary: `Structured output returned (${Object.keys(customData).length} fields)`,\n data: customData,\n actions: collectedToolCalls.map((tc) => tc.name),\n confidence: 1,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n }\n\n // ─── Default schema: use AgentResult fields directly ───────────────────\n if (result.output) {\n const output = result.output as {\n success: boolean;\n summary: string;\n reasoning?: string;\n data: Record<string, unknown>;\n actions: string[];\n confidence: number;\n };\n return {\n success: output.success,\n summary: output.summary,\n reasoning: output.reasoning,\n data: output.data,\n actions: output.actions,\n confidence: output.confidence,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n }\n\n // Fallback: parse text response\n const parsed = parseResponse(result.text);\n\n return {\n success: parsed?.success ?? true,\n summary: parsed?.summary ?? result.text.substring(0, 200),\n reasoning: parsed?.reasoning,\n data: parsed?.data ?? { raw: result.text },\n actions: parsed?.actions ?? collectedToolCalls.map((tc) => tc.name),\n confidence: parsed?.confidence ?? 0.5,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n}\n\n// ─── Response Parser (fallback for unstructured output) ──────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction parseResponse(text: string): any {\n // Try direct JSON parse\n try {\n return JSON.parse(text);\n } catch {\n // Try extracting JSON from markdown code fences\n const jsonMatch = text.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?\\s*```/);\n if (jsonMatch) {\n try {\n return JSON.parse(jsonMatch[1]);\n } catch {\n // Fall through\n }\n }\n\n // Try finding JSON object in text\n const objectMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (objectMatch) {\n try {\n return JSON.parse(objectMatch[0]);\n } catch {\n // Fall through\n }\n }\n\n // Return as raw fallback\n return {\n success: true,\n summary: text.substring(0, 200),\n data: { raw: text },\n actions: [],\n confidence: 0.5,\n };\n }\n}\n","/**\n * Content anonymization — strips secrets, PII, and sensitive data\n * before sending to the AI provider.\n */\n\n// Patterns for sensitive content\nconst patterns = {\n // API keys and tokens (long alphanumeric strings near sensitive keywords)\n apiKey: /(?:api[_-]?key|token|secret|password|credential|auth)['\":\\s=]+['\"]?([A-Za-z0-9_\\-/.]{20,})['\"]?/gi,\n // Bearer tokens\n bearer: /Bearer\\s+[A-Za-z0-9_\\-/.+]{20,}/gi,\n // Email addresses\n email: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g,\n // IPv4 addresses\n ipv4: /\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b/g,\n // IPv6 addresses (simplified)\n ipv6: /(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}/g,\n // AWS keys\n awsKey: /(?:AKIA|ASIA)[A-Z0-9]{16}/g,\n // Private keys\n privateKey: /-----BEGIN (?:RSA )?PRIVATE KEY-----[\\s\\S]*?-----END (?:RSA )?PRIVATE KEY-----/g,\n // Connection strings\n connectionString: /(?:mongodb|postgres|mysql|redis|amqp):\\/\\/[^\\s'\"]+/gi,\n // .env style secrets\n envSecret: /^(?:DATABASE_URL|DB_PASSWORD|SECRET_KEY|PRIVATE_KEY|AWS_SECRET|STRIPE_KEY|SENDGRID_KEY)[=:].+$/gm,\n};\n\n/**\n * Anonymize sensitive content in a string.\n * Replaces detected secrets/PII with safe placeholders.\n */\nexport function anonymize(content: string): string {\n let result = content;\n\n result = result.replace(patterns.privateKey, '[REDACTED_PRIVATE_KEY]');\n result = result.replace(patterns.connectionString, '[REDACTED_CONNECTION_STRING]');\n result = result.replace(patterns.awsKey, '[REDACTED_AWS_KEY]');\n result = result.replace(patterns.bearer, 'Bearer [REDACTED_TOKEN]');\n result = result.replace(patterns.apiKey, (match, _key) => {\n // Keep the key name but redact the value\n const colonIdx = match.search(/['\":\\s=]/);\n const prefix = match.substring(0, colonIdx);\n return `${prefix}: [REDACTED]`;\n });\n result = result.replace(patterns.envSecret, (match) => {\n const eqIdx = match.search(/[=:]/);\n const key = match.substring(0, eqIdx);\n return `${key}=[REDACTED]`;\n });\n result = result.replace(patterns.email, '[EMAIL]');\n result = result.replace(patterns.ipv4, '[IP]');\n result = result.replace(patterns.ipv6, '[IP]');\n\n return result;\n}\n\n/**\n * Anonymize any value — handles strings, objects, arrays, and primitives.\n */\nexport function anonymizeValue(value: unknown): unknown {\n if (typeof value === 'string') {\n return anonymize(value);\n }\n if (Array.isArray(value)) {\n return value.map(anonymizeValue);\n }\n if (value !== null && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = anonymizeValue(v);\n }\n return result;\n }\n return value;\n}\n","/**\n * Token bucket rate limiter.\n * Controls the rate of API calls to prevent abuse and stay within budget.\n */\n\nexport class RateLimiter {\n private tokens: number;\n private readonly maxTokens: number;\n private readonly refillRate: number; // tokens per millisecond\n private lastRefill: number;\n\n /**\n * @param maxCallsPerDay Maximum calls allowed per day\n */\n constructor(maxCallsPerDay: number) {\n this.maxTokens = maxCallsPerDay;\n this.tokens = maxCallsPerDay;\n // Refill rate: spread calls evenly across 24 hours\n this.refillRate = maxCallsPerDay / (24 * 60 * 60 * 1000);\n this.lastRefill = Date.now();\n }\n\n /**\n * Attempt to consume one token.\n * @returns true if allowed, false if rate limited\n */\n tryConsume(): boolean {\n this.refill();\n\n if (this.tokens >= 1) {\n this.tokens -= 1;\n return true;\n }\n\n return false;\n }\n\n /**\n * Get remaining tokens (calls available)\n */\n remaining(): number {\n this.refill();\n return Math.floor(this.tokens);\n }\n\n /**\n * Reset the limiter (e.g., for testing or manual override)\n */\n reset(): void {\n this.tokens = this.maxTokens;\n this.lastRefill = Date.now();\n }\n\n private refill(): void {\n const now = Date.now();\n const elapsed = now - this.lastRefill;\n const newTokens = elapsed * this.refillRate;\n\n this.tokens = Math.min(this.maxTokens, this.tokens + newTokens);\n this.lastRefill = now;\n }\n}\n","/**\n * Budget tracker — monitors daily token usage and cost.\n * Enforces hard caps to prevent cost explosion.\n */\n\nimport type { BudgetConfig } from '../types.js';\n\nexport class BudgetTracker {\n private callsToday = 0;\n private tokensToday = 0;\n private costToday = 0;\n private dayStart: number;\n private readonly config: BudgetConfig;\n\n constructor(config: BudgetConfig) {\n this.config = config;\n this.dayStart = this.getStartOfDay();\n }\n\n /**\n * Check if a call is within budget. Resets counters at midnight UTC.\n */\n canMakeCall(): { allowed: boolean; reason?: string } {\n this.maybeResetDay();\n\n if (this.callsToday >= this.config.maxCallsPerDay) {\n return {\n allowed: false,\n reason: `Daily call limit reached (${this.config.maxCallsPerDay} calls/day)`,\n };\n }\n\n if (this.costToday >= this.config.costCapDaily) {\n return {\n allowed: false,\n reason: `Daily cost cap reached ($${this.config.costCapDaily.toFixed(2)})`,\n };\n }\n\n return { allowed: true };\n }\n\n /**\n * Record a completed call's usage.\n */\n recordUsage(tokensUsed: number, costUsd: number): void {\n this.maybeResetDay();\n this.callsToday += 1;\n this.tokensToday += tokensUsed;\n this.costToday += costUsd;\n }\n\n /**\n * Get current usage stats.\n */\n getStats() {\n this.maybeResetDay();\n return {\n callsToday: this.callsToday,\n callsRemaining: Math.max(0, this.config.maxCallsPerDay - this.callsToday),\n tokensToday: this.tokensToday,\n costToday: this.costToday,\n costRemaining: Math.max(0, this.config.costCapDaily - this.costToday),\n };\n }\n\n /**\n * Reset all counters (for testing).\n */\n reset(): void {\n this.callsToday = 0;\n this.tokensToday = 0;\n this.costToday = 0;\n this.dayStart = this.getStartOfDay();\n }\n\n /**\n * Get the max tokens allowed per call.\n */\n get maxTokensPerCall(): number {\n return this.config.maxTokensPerCall;\n }\n\n private maybeResetDay(): void {\n const currentDayStart = this.getStartOfDay();\n if (currentDayStart > this.dayStart) {\n this.callsToday = 0;\n this.tokensToday = 0;\n this.costToday = 0;\n this.dayStart = currentDayStart;\n }\n }\n\n private getStartOfDay(): number {\n const now = new Date();\n return Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate());\n }\n}\n","/**\n * Core agent engine — orchestrates persona selection, budget checks,\n * anonymization, provider calls, and console output.\n */\n\nimport type { AgentConfig, AgentCallOptions, AgentResult, PersonaName } from './types.js';\nimport { detectPersona, getPersona } from './personas/index.js';\nimport { callGoogle } from './providers/google.js';\nimport { anonymizeValue } from './utils/anonymize.js';\nimport { RateLimiter } from './utils/rate-limit.js';\nimport { BudgetTracker } from './utils/budget.js';\nimport {\n startSpinner,\n stopSpinner,\n formatResult,\n formatError,\n formatBudgetWarning,\n formatRateLimitWarning,\n formatDryRun,\n logDebug,\n} from './utils/format.js';\n\n// ─── Default Config ──────────────────────────────────────────────────────────\n\nexport const DEFAULT_CONFIG: AgentConfig = {\n provider: 'google',\n model: 'gemini-2.5-flash-lite',\n persona: 'general',\n budget: {\n maxCallsPerDay: 100,\n maxTokensPerCall: 8000,\n costCapDaily: 1.0,\n },\n mode: 'fire-and-forget',\n timeout: 10000,\n anonymize: true,\n localOnly: false,\n dryRun: false,\n logLevel: 'info',\n safetySettings: [],\n};\n\n// ─── Singleton State ─────────────────────────────────────────────────────────\n\nlet config: AgentConfig = { ...DEFAULT_CONFIG };\nlet rateLimiter = new RateLimiter(config.budget.maxCallsPerDay);\nlet budgetTracker = new BudgetTracker(config.budget);\n\n/**\n * Update the global configuration. Reinitializes rate limiter and budget tracker.\n */\nexport function updateConfig(newConfig: Partial<AgentConfig>): void {\n config = { ...DEFAULT_CONFIG, ...newConfig };\n\n // Merge budget with defaults\n if (newConfig.budget) {\n config.budget = { ...DEFAULT_CONFIG.budget, ...newConfig.budget };\n }\n\n // Reinitialize limiters with new config\n rateLimiter = new RateLimiter(config.budget.maxCallsPerDay);\n budgetTracker = new BudgetTracker(config.budget);\n}\n\n/**\n * Get the current config (for testing/inspection).\n */\nexport function getConfig(): AgentConfig {\n return { ...config };\n}\n\n// ─── Core Execution ──────────────────────────────────────────────────────────\n\n/**\n * Execute an agent call. This is the core function behind console.agent().\n */\nexport async function executeAgent(\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n): Promise<AgentResult> {\n // Determine persona\n const personaName: PersonaName = options?.persona ?? config.persona;\n const persona = options?.persona\n ? getPersona(options.persona)\n : detectPersona(prompt, personaName);\n\n logDebug(`Selected persona: ${persona.name} (${persona.icon})`);\n\n // Dry run — log without calling API\n if (config.dryRun) {\n formatDryRun(prompt, persona, context);\n return createDryRunResult(persona.name);\n }\n\n // Check rate limits\n if (!rateLimiter.tryConsume()) {\n formatRateLimitWarning();\n return createErrorResult('Rate limited — too many calls. Try again later.');\n }\n\n // Check budget\n const budgetCheck = budgetTracker.canMakeCall();\n if (!budgetCheck.allowed) {\n formatBudgetWarning(budgetCheck.reason!);\n return createErrorResult(budgetCheck.reason!);\n }\n\n // Anonymize context if enabled\n let contextStr = '';\n if (context !== undefined) {\n const processed = config.anonymize ? anonymizeValue(context) : context;\n contextStr = typeof processed === 'string'\n ? processed\n : JSON.stringify(processed, null, 2);\n\n // Handle Error objects: JSON.stringify(Error) returns \"{}\" because\n // message/stack/name are non-enumerable. Extract them explicitly.\n if (context instanceof Error) {\n const errObj = {\n name: context.name,\n message: context.message,\n stack: context.stack,\n ...(typeof context === 'object' ? Object.getOwnPropertyNames(context).reduce((acc, key) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (acc as any)[key] = (context as any)[key];\n return acc;\n }, {} as Record<string, unknown>) : {}),\n };\n const processed2 = config.anonymize ? anonymizeValue(errObj) : errObj;\n contextStr = typeof processed2 === 'string' ? processed2 : JSON.stringify(processed2, null, 2);\n }\n }\n\n // Anonymize prompt if enabled\n const processedPrompt = config.anonymize\n ? (anonymizeValue(prompt) as string)\n : prompt;\n\n // Start spinner\n const spinner = startSpinner(persona, processedPrompt);\n\n try {\n // Execute with timeout\n const result = await Promise.race([\n callGoogle(processedPrompt, contextStr, persona, config, options),\n createTimeout(config.timeout),\n ]);\n\n // Record usage\n budgetTracker.recordUsage(\n result.metadata.tokensUsed,\n estimateCost(result.metadata.tokensUsed, result.metadata.model),\n );\n\n // Stop spinner and format output\n stopSpinner(spinner, result.success);\n formatResult(result, persona);\n\n return result;\n } catch (error) {\n stopSpinner(spinner, false);\n const err = error instanceof Error ? error : new Error(String(error));\n formatError(err, persona);\n return createErrorResult(err.message);\n }\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction createTimeout(ms: number): Promise<never> {\n return new Promise((_, reject) => {\n setTimeout(() => reject(new Error(`Agent timed out after ${ms}ms`)), ms);\n });\n}\n\nfunction createErrorResult(message: string): AgentResult {\n return {\n success: false,\n summary: message,\n data: {},\n actions: [],\n confidence: 0,\n metadata: {\n model: config.model,\n tokensUsed: 0,\n latencyMs: 0,\n toolCalls: [],\n cached: false,\n },\n };\n}\n\nfunction createDryRunResult(personaName: string): AgentResult {\n return {\n success: true,\n summary: `[DRY RUN] Would have executed with ${personaName} persona`,\n data: { dryRun: true },\n actions: [],\n confidence: 1,\n metadata: {\n model: config.model,\n tokensUsed: 0,\n latencyMs: 0,\n toolCalls: [],\n cached: false,\n },\n };\n}\n\n/**\n * Rough cost estimation based on model and token count.\n */\nfunction estimateCost(tokens: number, model: string): number {\n // Approximate cost per 1M tokens\n const costPer1M: Record<string, number> = {\n 'gemini-2.5-flash-lite': 0.01,\n 'gemini-3-flash-preview': 0.03,\n };\n const rate = costPer1M[model] ?? 0.01;\n return (tokens / 1_000_000) * rate;\n}\n","/**\n * @console-agent/agent\n *\n * Drop console.agent(...) anywhere in your code to execute agentic workflows\n * — as easy as console.log()\n *\n * @example\n * ```ts\n * import { init } from '@console-agent/agent';\n *\n * // Optional configuration (works with sensible defaults)\n * init({ apiKey: process.env.GEMINI_API_KEY });\n *\n * // Fire-and-forget (default)\n * console.agent(\"analyze this error\", error);\n *\n * // Blocking mode\n * const result = await console.agent(\"validate email format\", email);\n *\n * // Persona shortcuts\n * console.agent.security(\"audit SQL query\", query);\n * console.agent.debug(\"investigate slow query\", { duration, sql });\n * console.agent.architect(\"review API design\", endpoint);\n * ```\n */\n\nimport type { AgentConfig, AgentCallOptions, AgentResult, AgentFunction } from './types.js';\nimport { executeAgent, updateConfig, getConfig } from './agent.js';\nimport { setLogLevel } from './utils/format.js';\n\n// ─── Re-exports ──────────────────────────────────────────────────────────────\n\nexport type {\n AgentConfig,\n AgentCallOptions,\n AgentResult,\n AgentFunction,\n ResponseFormat,\n ToolCall,\n PersonaName,\n PersonaDefinition,\n ToolName,\n ToolConfig,\n ThinkingConfig,\n BudgetConfig,\n SafetySetting,\n HarmCategory,\n HarmBlockThreshold,\n LogLevel,\n GoogleSearchConfig,\n} from './types.js';\n\nexport { DEFAULT_CONFIG } from './agent.js';\n\n// ─── Init ────────────────────────────────────────────────────────────────────\n\n/**\n * Initialize console.agent with custom configuration.\n * Call this once at app startup. Works with sensible defaults if not called.\n *\n * @example\n * ```ts\n * init({\n * apiKey: process.env.GEMINI_API_KEY,\n * model: 'gemini-2.5-flash-lite',\n * persona: 'debugger',\n * budget: { maxCallsPerDay: 200 },\n * });\n * ```\n */\nexport function init(config: Partial<AgentConfig> = {}): void {\n updateConfig(config);\n\n const fullConfig = getConfig();\n setLogLevel(fullConfig.logLevel);\n\n // Attach console.agent\n attachConsoleAgent();\n}\n\n// ─── Console Agent Proxy ─────────────────────────────────────────────────────\n\n/**\n * Create the console.agent callable with persona methods.\n * Uses a Proxy to make it both callable and have methods.\n */\nfunction createAgentProxy(): AgentFunction {\n // The base function that handles direct calls\n const agentFn = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n const config = getConfig();\n\n if (config.mode === 'fire-and-forget' && !options?.mode) {\n // Fire-and-forget: start async execution but don't return the promise\n // We still return a Promise for type compatibility, but the caller doesn't await it\n const promise = executeAgent(prompt, context, options);\n // Catch unhandled rejections silently\n promise.catch(() => { /* fire-and-forget errors are logged to console */ });\n return promise;\n }\n\n // Blocking mode: return the promise for awaiting\n return executeAgent(prompt, context, options);\n };\n\n // Add persona shortcuts\n agentFn.security = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n return executeAgent(prompt, context, { ...options, persona: 'security' });\n };\n\n agentFn.debug = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n return executeAgent(prompt, context, { ...options, persona: 'debugger' });\n };\n\n agentFn.architect = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n return executeAgent(prompt, context, { ...options, persona: 'architect' });\n };\n\n return agentFn as AgentFunction;\n}\n\n// ─── Attach to console ───────────────────────────────────────────────────────\n\n// Extend console type\ndeclare global {\n interface Console {\n agent: AgentFunction;\n }\n}\n\nlet attached = false;\n\nfunction attachConsoleAgent(): void {\n if (attached) return;\n\n const agentProxy = createAgentProxy();\n // Attach to global console object\n (console as unknown as Record<string, unknown>).agent = agentProxy;\n attached = true;\n}\n\n// ─── Auto-attach with defaults on import ─────────────────────────────────────\n\n// Auto-attach console.agent on first import with default config\nattachConsoleAgent();\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/personas/debugger.ts","../src/personas/security.ts","../src/personas/architect.ts","../src/personas/general.ts","../src/personas/index.ts","../src/tools/file-analysis.ts","../src/tools/index.ts","../src/utils/caller-file.ts","../src/utils/format.ts","../src/providers/google.ts","../src/utils/anonymize.ts","../src/utils/rate-limit.ts","../src/utils/budget.ts","../src/agent.ts","../src/index.ts"],"names":["config","extname","resolve","existsSync","content","readFileSync","basename","ora","chalk","jsonSchema","google","createGoogleGenerativeAI","generateText","stepCountIs","Output","ToolLoopAgent"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { PersonaDefinition } from '../types.js';\n\nexport const debuggerPersona: PersonaDefinition = {\n name: 'debugger',\n icon: '🐛',\n label: 'Debugging',\n systemPrompt: `You are a senior debugging expert and performance engineer.\n\nYour role:\n- Analyze errors, stack traces, exceptions, and performance issues\n- Identify root causes with high confidence\n- Provide concrete fixes with code examples\n- Suggest preventive measures\n\nOutput format:\n- Start with a one-line summary of the issue\n- Explain the root cause clearly\n- Provide a concrete fix (with code if applicable)\n- Rate severity: LOW / MEDIUM / HIGH / CRITICAL\n- Include confidence score (0-1)\n\nAlways be concise, technical, and actionable. No fluff.`,\n defaultTools: ['code_execution', 'google_search'],\n keywords: [\n 'slow', 'perf', 'performance', 'optimize', 'optimization',\n 'debug', 'error', 'bug', 'crash', 'exception', 'stack',\n 'trace', 'memory', 'leak', 'timeout', 'latency', 'bottleneck',\n 'hang', 'freeze', 'deadlock', 'race condition',\n ],\n};\n","import type { PersonaDefinition } from '../types.js';\n\nexport const securityPersona: PersonaDefinition = {\n name: 'security',\n icon: '🛡️',\n label: 'Security audit',\n systemPrompt: `You are an OWASP security expert and penetration testing specialist.\n\nYour role:\n- Audit code and inputs for vulnerabilities (SQL injection, XSS, CSRF, SSRF, etc.)\n- Flag security risks immediately with severity ratings\n- Check for known CVEs in dependencies\n- Recommend secure coding practices\n\nOutput format:\n- Start with overall risk level: SAFE / LOW RISK / MEDIUM RISK / HIGH RISK / CRITICAL\n- List each vulnerability found with:\n - Type (e.g., SQL Injection, XSS)\n - Location (where in the code/input)\n - Impact (what an attacker could do)\n - Fix (concrete remediation)\n- Include confidence score (0-1)\n\nBe thorough, explicit about risks, and always err on the side of caution.`,\n defaultTools: ['google_search'],\n keywords: [\n 'security', 'vuln', 'vulnerability', 'exploit', 'injection',\n 'xss', 'csrf', 'ssrf', 'sql injection', 'auth', 'authentication',\n 'authorization', 'permission', 'privilege', 'escalation',\n 'sanitize', 'escape', 'encrypt', 'decrypt', 'hash', 'token',\n 'secret', 'api key', 'password', 'credential', 'owasp', 'cve',\n ],\n};\n","import type { PersonaDefinition } from '../types.js';\n\nexport const architectPersona: PersonaDefinition = {\n name: 'architect',\n icon: '🏗️',\n label: 'Architecture review',\n systemPrompt: `You are a principal software engineer and system architect.\n\nYour role:\n- Review system design, API design, and code architecture\n- Evaluate scalability, maintainability, and performance characteristics\n- Identify design pattern opportunities and anti-patterns\n- Suggest architectural improvements with trade-off analysis\n\nOutput format:\n- Start with an overall assessment: SOLID / NEEDS IMPROVEMENT / SIGNIFICANT CONCERNS\n- List strengths of the current design\n- List concerns with severity and impact\n- Provide concrete recommendations with:\n - What to change\n - Why (trade-offs)\n - How (implementation guidance)\n- Include confidence score (0-1)\n\nThink like a senior architect reviewing a design doc. Be constructive, not pedantic.`,\n defaultTools: ['google_search', 'file_analysis'],\n keywords: [\n 'design', 'architecture', 'architect', 'pattern', 'scalab',\n 'microservice', 'monolith', 'api design', 'schema', 'database',\n 'system design', 'infrastructure', 'deploy', 'ci/cd', 'pipeline',\n 'refactor', 'modular', 'coupling', 'cohesion', 'solid',\n 'clean architecture', 'domain driven', 'event driven',\n ],\n};\n","import type { PersonaDefinition } from '../types.js';\n\nexport const generalPersona: PersonaDefinition = {\n name: 'general',\n icon: '🔍',\n label: 'Analyzing',\n systemPrompt: `You are a helpful senior full-stack engineer with broad expertise.\n\nYour role:\n- Provide actionable advice on any technical topic\n- Analyze code, data, configurations, and systems\n- Validate inputs, schemas, and data integrity\n- Answer questions with practical, real-world guidance\n\nOutput format:\n- Start with a clear, one-line answer or summary\n- Provide supporting details and reasoning\n- Include code examples when relevant\n- List any caveats or edge cases\n- Include confidence score (0-1)\n\nBe balanced, practical, and concise. Prioritize actionable insights over theory.`,\n defaultTools: ['code_execution', 'google_search', 'file_analysis'],\n keywords: [], // General catches everything not matched by specific personas\n};\n","import type { PersonaDefinition, PersonaName } from '../types.js';\nimport { debuggerPersona } from './debugger.js';\nimport { securityPersona } from './security.js';\nimport { architectPersona } from './architect.js';\nimport { generalPersona } from './general.js';\n\nexport const personas: Record<PersonaName, PersonaDefinition> = {\n debugger: debuggerPersona,\n security: securityPersona,\n architect: architectPersona,\n general: generalPersona,\n};\n\n/**\n * Auto-detect the best persona based on keywords in the prompt.\n * Returns the explicitly set persona if provided, otherwise scans for keywords.\n */\nexport function detectPersona(prompt: string, defaultPersona: PersonaName): PersonaDefinition {\n const lower = prompt.toLowerCase();\n\n // Check specific personas in priority order (security > debugger > architect)\n for (const name of ['security', 'debugger', 'architect'] as PersonaName[]) {\n const persona = personas[name];\n if (persona.keywords.some((kw) => lower.includes(kw))) {\n return persona;\n }\n }\n\n return personas[defaultPersona];\n}\n\nexport function getPersona(name: PersonaName): PersonaDefinition {\n return personas[name];\n}\n","/**\n * File Analysis tool wrapper.\n * Supports PDF, images, and video processing via Gemini's multimodal capabilities.\n */\n\nimport type { ToolName } from '../types.js';\n\nexport const FILE_ANALYSIS_TOOL: ToolName = 'file_analysis';\n\n/**\n * Prepare file content for inclusion in the prompt.\n * Converts Buffer/file data into the format expected by the AI SDK.\n */\nexport function prepareFileContent(fileData: Buffer | Uint8Array, mimeType: string) {\n const base64 = Buffer.from(fileData).toString('base64');\n return {\n type: 'file' as const,\n data: base64,\n mimeType,\n };\n}\n\n/**\n * Detect MIME type from file extension or magic bytes.\n */\nexport function detectMimeType(filename: string): string {\n const ext = filename.toLowerCase().split('.').pop();\n const mimeMap: Record<string, string> = {\n pdf: 'application/pdf',\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n mp4: 'video/mp4',\n webm: 'video/webm',\n };\n return mimeMap[ext || ''] || 'application/octet-stream';\n}\n","/**\n * Tools index — resolves tool configurations using the native @ai-sdk/google tools API.\n *\n * Tools are opt-in only: they are passed to the AI model ONLY when the user\n * explicitly specifies `tools: [...]` in their console.agent() call options.\n */\n\nimport type { ToolConfig, ToolName } from '../types.js';\n\nexport { prepareFileContent, detectMimeType } from './file-analysis.js';\n\n/**\n * Minimum timeout (ms) when tools are active.\n * Tools like google_search and code_execution add latency.\n */\nexport const TOOLS_MIN_TIMEOUT = 30_000;\n\n/**\n * Resolve tool names/configs into SDK tool objects using the google provider instance.\n *\n * @param tools - Array of tool names or tool configs from user's options\n * @param google - The Google Generative AI provider instance (from createGoogleGenerativeAI)\n * @returns Record of tool name → SDK tool object, ready for ToolLoopAgent\n */\nexport function resolveTools(\n tools: (ToolName | ToolConfig)[],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n google: any,\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = {};\n\n for (const tool of tools) {\n const name: ToolName = typeof tool === 'string' ? tool : tool.type;\n const config = typeof tool === 'object' ? tool.config : undefined;\n\n switch (name) {\n case 'google_search':\n resolved['google_search'] = google.tools.googleSearch(config ?? {});\n break;\n case 'code_execution':\n resolved['code_execution'] = google.tools.codeExecution(config ?? {});\n break;\n case 'url_context':\n resolved['url_context'] = google.tools.urlContext({});\n break;\n case 'file_analysis':\n // File analysis is handled via multimodal content, not as an SDK tool\n break;\n }\n }\n\n return resolved;\n}\n\n/**\n * Check if any tools were explicitly requested.\n */\nexport function hasExplicitTools(options?: { tools?: (ToolName | ToolConfig)[] }): boolean {\n return !!(options?.tools && options.tools.length > 0);\n}\n","/**\n * Caller file detection — reads source files from stack traces\n * to provide rich context to the AI agent automatically.\n */\n\nimport { readFileSync, existsSync } from 'node:fs';\nimport { resolve, basename, extname } from 'node:path';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface SourceFileInfo {\n /** Absolute path to the file */\n filePath: string;\n /** File name (e.g., \"billing.ts\") */\n fileName: string;\n /** Line number where the call/error originated */\n line: number;\n /** Column number */\n column: number;\n /** Full file content as string */\n content: string;\n}\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\n/** Max file size to read (100KB) — prevents blowing token budgets */\nconst MAX_FILE_SIZE = 100 * 1024;\n\n/** File extensions we consider source code (safe to read as text) */\nconst SOURCE_EXTENSIONS = new Set([\n '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',\n '.py', '.rb', '.go', '.rs', '.java', '.kt',\n '.c', '.cpp', '.h', '.hpp', '.cs', '.swift',\n '.vue', '.svelte', '.astro',\n '.json', '.yaml', '.yml', '.toml', '.env',\n '.sql', '.graphql', '.gql',\n '.md', '.txt', '.html', '.css', '.scss',\n]);\n\n/** Patterns to identify internal frames (our own package) */\nconst INTERNAL_PATTERNS = [\n '/console-agent/',\n '/console_agent/',\n '@console-agent/',\n '/node_modules/',\n 'node:internal/',\n 'node:async_hooks',\n '<anonymous>',\n];\n\n// ─── Stack Trace Parsing ─────────────────────────────────────────────────────\n\n/**\n * Parse a V8 stack trace string into structured frames.\n * Handles formats like:\n * at functionName (/path/to/file.ts:42:15)\n * at /path/to/file.ts:42:15\n * at Object.<anonymous> (/path/to/file.ts:42:15)\n */\nfunction parseStackFrames(stack: string): Array<{ file: string; line: number; column: number }> {\n const frames: Array<{ file: string; line: number; column: number }> = [];\n const lines = stack.split('\\n');\n\n for (const line of lines) {\n // Match: \"at ... (file:line:col)\" or \"at file:line:col\"\n const match = line.match(/at\\s+(?:.*?\\s+)?\\(?([^()]+):(\\d+):(\\d+)\\)?/);\n if (match) {\n frames.push({\n file: match[1],\n line: parseInt(match[2], 10),\n column: parseInt(match[3], 10),\n });\n }\n }\n\n return frames;\n}\n\n/**\n * Check if a stack frame is internal (our package or node_modules).\n */\nfunction isInternalFrame(filePath: string): boolean {\n return INTERNAL_PATTERNS.some((pattern) => filePath.includes(pattern));\n}\n\n/**\n * Check if a file is a source file we should read.\n */\nfunction isSourceFile(filePath: string): boolean {\n const ext = extname(filePath).toLowerCase();\n return SOURCE_EXTENSIONS.has(ext);\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Get the source file of the caller that invoked console.agent().\n * Walks up the stack trace, skipping internal frames, and reads the first\n * external source file.\n *\n * @param skipFrames - Additional frames to skip (default: 0).\n * The function automatically skips its own frame + executeAgent + proxy frames.\n */\nexport function getCallerFile(skipFrames = 0): SourceFileInfo | null {\n const err = new Error();\n if (!err.stack) return null;\n\n const frames = parseStackFrames(err.stack);\n\n // Skip internal frames to find the user's code\n for (const frame of frames) {\n if (isInternalFrame(frame.file)) continue;\n if (!isSourceFile(frame.file)) continue;\n\n return readSourceFile(frame.file, frame.line, frame.column);\n }\n\n return null;\n}\n\n/**\n * Extract the source file from an Error object's stack trace.\n * Reads the file where the error originated (first frame in the error's stack).\n *\n * @param error - The Error object with a stack trace.\n */\nexport function getErrorSourceFile(error: Error): SourceFileInfo | null {\n if (!error.stack) return null;\n\n const frames = parseStackFrames(error.stack);\n\n // The first non-internal frame in the error's stack is where the error originated\n for (const frame of frames) {\n // For error stacks, we DO want to include the user's code even if it\n // happens to be in a path that contains node_modules (rare but possible)\n if (frame.file.includes('node:internal/') || frame.file.includes('<anonymous>')) continue;\n if (!isSourceFile(frame.file)) continue;\n\n return readSourceFile(frame.file, frame.line, frame.column);\n }\n\n return null;\n}\n\n/**\n * Read a source file and return its info.\n * Returns null if the file doesn't exist, is too large, or can't be read.\n */\nfunction readSourceFile(filePath: string, line: number, column: number): SourceFileInfo | null {\n try {\n const resolvedPath = resolve(filePath);\n\n if (!existsSync(resolvedPath)) return null;\n\n // Check file size before reading\n const { statSync } = require('node:fs');\n const stats = statSync(resolvedPath);\n if (stats.size > MAX_FILE_SIZE) {\n // File too large — return truncated with a note\n const content = readFileSync(resolvedPath, 'utf-8').substring(0, MAX_FILE_SIZE);\n return {\n filePath: resolvedPath,\n fileName: basename(resolvedPath),\n line,\n column,\n content: content + '\\n\\n// [TRUNCATED — file exceeds 100KB limit]',\n };\n }\n\n const content = readFileSync(resolvedPath, 'utf-8');\n\n return {\n filePath: resolvedPath,\n fileName: basename(resolvedPath),\n line,\n column,\n content,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Format a source file for inclusion in the AI context.\n * Adds line numbers and highlights the relevant line.\n */\nexport function formatSourceForContext(source: SourceFileInfo): string {\n const lines = source.content.split('\\n');\n const numbered = lines.map((line, i) => {\n const lineNum = i + 1;\n const marker = lineNum === source.line ? ' → ' : ' ';\n return `${marker}${String(lineNum).padStart(4)} | ${line}`;\n });\n\n return `--- Source File: ${source.fileName} (line ${source.line}) ---\\n${numbered.join('\\n')}`;\n}\n","/**\n * Console formatting — rich output with colors, icons, and tree structure.\n * Uses chalk for colors and ora for spinners.\n *\n * Two output modes:\n * - verbose=false (default): Clean, actionable output only — just the answer.\n * - verbose=true: Full execution trace with [AGENT] prefix, tools, reasoning, metadata.\n */\n\nimport chalk from 'chalk';\nimport ora, { type Ora } from 'ora';\nimport type { AgentResult, PersonaDefinition, LogLevel } from '../types.js';\n\nlet currentLogLevel: LogLevel = 'info';\n\nexport function setLogLevel(level: LogLevel): void {\n currentLogLevel = level;\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n const levels: LogLevel[] = ['silent', 'errors', 'info', 'debug'];\n return levels.indexOf(currentLogLevel) >= levels.indexOf(level);\n}\n\n// ─── Spinner Management ──────────────────────────────────────────────────────\n\nexport function startSpinner(persona: PersonaDefinition, prompt: string, verbose = false): Ora | null {\n if (!shouldLog('info')) return null;\n // Only show spinner in verbose mode\n if (!verbose) return null;\n\n const truncated = prompt.length > 60 ? prompt.substring(0, 57) + '...' : prompt;\n const spinner = ora({\n text: chalk.cyan(`${persona.icon} ${persona.label}... `) + chalk.dim(truncated),\n prefixText: chalk.gray('[AGENT]'),\n }).start();\n\n return spinner;\n}\n\nexport function stopSpinner(spinner: Ora | null, success: boolean): void {\n if (!spinner) return;\n\n if (success) {\n spinner.succeed();\n } else {\n spinner.fail();\n }\n}\n\n// ─── Result Formatting ──────────────────────────────────────────────────────\n\nexport function formatResult(result: AgentResult, persona: PersonaDefinition, verbose = false): void {\n if (!shouldLog('info')) return;\n\n if (!verbose) {\n // ── Quiet mode: clean, actionable output only ──\n formatResultQuiet(result);\n return;\n }\n\n // ── Verbose mode: full execution trace ──\n formatResultVerbose(result, persona);\n}\n\n/**\n * Quiet mode — print only the answer/summary, no [AGENT] prefix or metadata.\n */\nfunction formatResultQuiet(result: AgentResult): void {\n console.log('');\n console.log(result.summary);\n\n // Show structured data if it has meaningful content beyond 'raw'\n const dataEntries = Object.entries(result.data);\n const hasMeaningfulData = dataEntries.length > 0 &&\n !(dataEntries.length === 1 && dataEntries[0][0] === 'raw');\n\n if (hasMeaningfulData) {\n for (const [key, value] of dataEntries) {\n if (key === 'raw') continue;\n const displayValue = typeof value === 'string' ? value : JSON.stringify(value);\n console.log(`${chalk.dim(key + ':')} ${displayValue}`);\n }\n }\n console.log('');\n}\n\n/**\n * Verbose mode — full [AGENT] tree with tools, reasoning, and metadata.\n */\nfunction formatResultVerbose(result: AgentResult, persona: PersonaDefinition): void {\n const prefix = chalk.gray('[AGENT]');\n const confidenceColor = result.confidence >= 0.8 ? chalk.green : result.confidence >= 0.5 ? chalk.yellow : chalk.red;\n const statusIcon = result.success ? chalk.green('✓') : chalk.red('✗');\n\n console.log('');\n console.log(`${prefix} ${persona.icon} ${chalk.bold(persona.label)} Complete`);\n console.log(`${prefix} ├─ ${statusIcon} ${chalk.white(result.summary)}`);\n\n // Show actions/tools used\n if (result.actions.length > 0) {\n for (let i = 0; i < result.actions.length; i++) {\n const connector = i < result.actions.length - 1 ? '├─' : '├─';\n console.log(`${prefix} ${connector} ${chalk.dim('Tool:')} ${chalk.cyan(result.actions[i])}`);\n }\n }\n\n // Show key data points\n const dataEntries = Object.entries(result.data);\n if (dataEntries.length > 0) {\n for (const [key, value] of dataEntries) {\n const displayValue = typeof value === 'string' ? value : JSON.stringify(value);\n console.log(`${prefix} ├─ ${chalk.dim(key + ':')} ${chalk.white(displayValue)}`);\n }\n }\n\n // Show reasoning if available\n if (result.reasoning) {\n const reasoningLines = result.reasoning.split('\\n').slice(0, 3);\n console.log(`${prefix} ├─ ${chalk.dim('Reasoning:')}`);\n for (const line of reasoningLines) {\n console.log(`${prefix} │ ${chalk.dim(line.trim())}`);\n }\n }\n\n // Footer with metadata\n const confidence = confidenceColor(`confidence: ${result.confidence.toFixed(2)}`);\n const latency = chalk.dim(`${result.metadata.latencyMs}ms`);\n const tokens = chalk.dim(`${result.metadata.tokensUsed} tokens`);\n const model = chalk.dim(`model: ${result.metadata.model}`);\n const cached = result.metadata.cached ? chalk.green(' (cached)') : '';\n const toolNames = result.metadata.toolCalls.length > 0\n ? chalk.dim(` | tools: ${result.metadata.toolCalls.map(t => t.name).join(', ')}`)\n : '';\n\n console.log(`${prefix} └─ ${confidence} | ${latency} | ${tokens} | ${model}${cached}${toolNames}`);\n console.log('');\n}\n\n// ─── Error Formatting ────────────────────────────────────────────────────────\n\nexport function formatError(error: Error, persona: PersonaDefinition, verbose = false): void {\n if (!shouldLog('errors')) return;\n\n if (!verbose) {\n // Quiet mode: just the error message\n console.log('');\n console.log(chalk.red(`Error: ${error.message}`));\n console.log('');\n return;\n }\n\n // Verbose mode: full [AGENT] prefixed error\n const prefix = chalk.gray('[AGENT]');\n console.log('');\n console.log(`${prefix} ${persona.icon} ${chalk.red('Error:')} ${error.message}`);\n if (shouldLog('debug') && error.stack) {\n console.log(`${prefix} ${chalk.dim(error.stack)}`);\n }\n console.log('');\n}\n\n// ─── Budget Warning ──────────────────────────────────────────────────────────\n\nexport function formatBudgetWarning(reason: string, verbose = false): void {\n if (!shouldLog('errors')) return;\n\n if (!verbose) {\n console.log(chalk.yellow(`Budget limit: ${reason}`));\n return;\n }\n\n const prefix = chalk.gray('[AGENT]');\n console.log(`${prefix} ${chalk.yellow('⚠ Budget limit:')} ${reason}`);\n}\n\n// ─── Rate Limit Warning ─────────────────────────────────────────────────────\n\nexport function formatRateLimitWarning(verbose = false): void {\n if (!shouldLog('errors')) return;\n\n if (!verbose) {\n console.log(chalk.yellow('Rate limited: Too many calls. Try again later.'));\n return;\n }\n\n const prefix = chalk.gray('[AGENT]');\n console.log(`${prefix} ${chalk.yellow('⚠ Rate limited:')} Too many calls. Try again later.`);\n}\n\n// ─── Dry Run ─────────────────────────────────────────────────────────────────\n\nexport function formatDryRun(prompt: string, persona: PersonaDefinition, context?: unknown, verbose = false): void {\n if (!shouldLog('info')) return;\n\n if (!verbose) {\n // Quiet mode: minimal dry run notice\n console.log('');\n console.log(chalk.magenta('[DRY RUN]') + ` Would execute with ${persona.name} persona`);\n console.log('');\n return;\n }\n\n // Verbose mode: full tree\n const prefix = chalk.gray('[AGENT]');\n console.log('');\n console.log(`${prefix} ${chalk.magenta('DRY RUN')} ${persona.icon} ${persona.label}`);\n console.log(`${prefix} ├─ ${chalk.dim('Persona:')} ${persona.name}`);\n console.log(`${prefix} ├─ ${chalk.dim('Prompt:')} ${prompt}`);\n if (context !== undefined) {\n const contextStr = typeof context === 'string' ? context : JSON.stringify(context, null, 2);\n const lines = contextStr.split('\\n').slice(0, 5);\n console.log(`${prefix} ├─ ${chalk.dim('Context:')}`);\n for (const line of lines) {\n console.log(`${prefix} │ ${chalk.dim(line)}`);\n }\n }\n console.log(`${prefix} └─ ${chalk.dim('(No API call made)')}`);\n console.log('');\n}\n\n// ─── Debug logging ───────────────────────────────────────────────────────────\n\nexport function logDebug(message: string): void {\n if (!shouldLog('debug')) return;\n console.log(`${chalk.gray('[AGENT DEBUG]')} ${chalk.dim(message)}`);\n}\n","/**\n * Google AI provider — integrates with Gemini via @ai-sdk/google + Vercel AI SDK.\n *\n * Two execution paths:\n * 1. WITHOUT tools → ToolLoopAgent with structured output (JSON schema)\n * 2. WITH tools → generateText with provider tools (google_search, code_execution, etc.)\n * Tools are incompatible with structured JSON output at the Gemini API level,\n * so we instruct the model via prompt and parse the text response.\n */\n\nimport { createGoogleGenerativeAI } from '@ai-sdk/google';\nimport { ToolLoopAgent, Output, jsonSchema, generateText, stepCountIs, type ToolSet } from 'ai';\nimport type { AgentConfig, AgentCallOptions, AgentResult, PersonaDefinition, ToolCall, FileAttachment } from '../types.js';\nimport { resolveTools, hasExplicitTools, TOOLS_MIN_TIMEOUT } from '../tools/index.js';\nimport { prepareFileContent } from '../tools/file-analysis.js';\nimport { formatSourceForContext, type SourceFileInfo } from '../utils/caller-file.js';\nimport { logDebug } from '../utils/format.js';\nimport { z } from 'zod';\n\n// ─── Structured Output Schema (JSON Schema compatible with Gemini) ───────────\n\nconst agentOutputSchema = jsonSchema({\n type: 'object' as const,\n properties: {\n success: { type: 'boolean' as const, description: 'Whether the task was completed successfully' },\n summary: { type: 'string' as const, description: 'One-line human-readable conclusion' },\n reasoning: { type: 'string' as const, description: 'Your thought process' },\n data: {\n type: 'object' as const,\n description: 'Structured findings as key-value pairs',\n properties: {\n result: { type: 'string' as const, description: 'Primary result or finding' },\n },\n additionalProperties: true,\n },\n actions: { type: 'array' as const, items: { type: 'string' as const }, description: 'List of tools/steps you used' },\n confidence: { type: 'number' as const, minimum: 0, maximum: 1, description: '0-1 confidence score' },\n },\n required: ['success', 'summary', 'data', 'actions', 'confidence'] as const,\n additionalProperties: false,\n});\n\n// ─── JSON prompt suffix for tool-mode (no structured output available) ───────\n\nconst JSON_RESPONSE_INSTRUCTION = `\n\nIMPORTANT: You MUST respond with ONLY a valid JSON object (no markdown, no code fences, no extra text).\nUse this exact format:\n{\"success\": true, \"summary\": \"one-line conclusion\", \"reasoning\": \"your thought process\", \"data\": {\"result\": \"primary finding\"}, \"actions\": [\"tools/steps used\"], \"confidence\": 0.95}`;\n\n// ─── Message Builder ─────────────────────────────────────────────────────────\n\n/**\n * Build a multipart messages array for the AI SDK.\n * Combines prompt text, context, auto-detected source file, and explicit file attachments.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction buildMessages(\n prompt: string,\n context: string,\n sourceFile?: SourceFileInfo | null,\n files?: FileAttachment[],\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any[] {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const parts: any[] = [];\n\n // 1. User's prompt text\n parts.push({ type: 'text', text: prompt });\n\n // 2. Stringified context (error details, objects, etc.)\n if (context) {\n parts.push({ type: 'text', text: `\\n--- Context ---\\n${context}` });\n }\n\n // 3. Auto-detected source file (from error stack or caller file)\n if (sourceFile) {\n const formatted = formatSourceForContext(sourceFile);\n parts.push({ type: 'text', text: `\\n${formatted}` });\n }\n\n // 4. Explicit file attachments (PDFs, images, etc.)\n if (files && files.length > 0) {\n for (const file of files) {\n const prepared = prepareFileContent(file.data, file.mediaType);\n if (file.fileName) {\n parts.push({ type: 'text', text: `\\n--- Attached File: ${file.fileName} ---` });\n }\n parts.push(prepared);\n }\n }\n\n return [{ role: 'user' as const, content: parts }];\n}\n\n// ─── Provider ────────────────────────────────────────────────────────────────\n\nexport async function callGoogle(\n prompt: string,\n context: string,\n persona: PersonaDefinition,\n config: AgentConfig,\n options?: AgentCallOptions,\n sourceFile?: SourceFileInfo | null,\n files?: FileAttachment[],\n): Promise<AgentResult> {\n const startTime = Date.now();\n const modelName = options?.model ?? config.model;\n\n logDebug(`Using model: ${modelName}`);\n logDebug(`Persona: ${persona.name}`);\n\n // Create Google AI provider instance\n const google = createGoogleGenerativeAI({\n apiKey: config.apiKey ?? process.env.GEMINI_API_KEY ?? process.env.GOOGLE_GENERATIVE_AI_API_KEY,\n });\n\n // Build provider options for thinking config\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const providerOptions: Record<string, any> = {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const googleOpts: Record<string, any> = {};\n\n if (options?.thinking) {\n const thinking = options.thinking;\n if (thinking.budget !== undefined) {\n googleOpts['thinkingConfig'] = { thinkingBudget: thinking.budget };\n } else if (thinking.level) {\n googleOpts['thinkingConfig'] = { thinkingLevel: thinking.level };\n }\n }\n\n if (Object.keys(googleOpts).length > 0) {\n providerOptions['google'] = googleOpts;\n }\n\n // ─── Resolve tools (opt-in only) ──────────────────────────────────────────\n const useTools = hasExplicitTools(options) && !config.localOnly;\n\n if (useTools) {\n logDebug('Tools requested — using generateText path (no structured output)');\n return callWithTools(prompt, context, persona, config, options!, google, modelName, startTime, providerOptions, sourceFile, files);\n }\n\n logDebug('No tools — using ToolLoopAgent with structured output');\n return callWithStructuredOutput(prompt, context, persona, config, options, google, modelName, startTime, providerOptions, sourceFile, files);\n}\n\n// ─── Path 1: WITH TOOLS (generateText, no structured output) ────────────────\n\nasync function callWithTools(\n prompt: string,\n context: string,\n persona: PersonaDefinition,\n config: AgentConfig,\n options: AgentCallOptions,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n google: any,\n modelName: string,\n startTime: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n providerOptions: Record<string, any>,\n sourceFile?: SourceFileInfo | null,\n files?: FileAttachment[],\n): Promise<AgentResult> {\n const resolvedTools = resolveTools(options.tools!, google);\n const toolNames = Object.keys(resolvedTools);\n logDebug(`Tools enabled: ${toolNames.join(', ')}`);\n\n const effectiveTimeout = Math.max(config.timeout, TOOLS_MIN_TIMEOUT);\n\n // Build multipart messages (supports source files + file attachments)\n const messages = buildMessages(prompt, context, sourceFile, files);\n\n // Use generateText with provider tools\n // Provider tools (google_search, code_execution, url_context) run server-side\n // and are incompatible with structured JSON output (response_mime_type).\n const result = await generateText({\n model: google(modelName),\n system: persona.systemPrompt + JSON_RESPONSE_INSTRUCTION,\n messages,\n tools: resolvedTools as ToolSet,\n stopWhen: stepCountIs(5), // Allow multi-step: tool invocation → response\n maxOutputTokens: config.budget.maxTokensPerCall,\n providerOptions: Object.keys(providerOptions).length > 0 ? providerOptions : undefined,\n abortSignal: AbortSignal.timeout(effectiveTimeout),\n });\n\n const latencyMs = Date.now() - startTime;\n const tokensUsed = result.usage?.totalTokens ?? 0;\n\n logDebug(`Response received (tools path): ${latencyMs}ms, ${tokensUsed} tokens`);\n\n // Collect tool calls from steps\n const collectedToolCalls: ToolCall[] = [];\n if (result.steps) {\n for (const step of result.steps) {\n if (step.toolCalls) {\n for (const tc of step.toolCalls) {\n collectedToolCalls.push({\n name: tc.toolName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args: (tc as any).args ?? {},\n result: tc.toolName,\n });\n }\n }\n }\n }\n\n logDebug(`Tool calls collected: ${collectedToolCalls.length}`);\n\n // Parse text response (no structured output in tools mode)\n const parsed = parseResponse(result.text);\n\n return {\n success: parsed?.success ?? true,\n summary: parsed?.summary ?? result.text.substring(0, 200),\n reasoning: parsed?.reasoning,\n data: parsed?.data ?? { raw: result.text },\n actions: parsed?.actions ?? collectedToolCalls.map((tc) => tc.name),\n confidence: parsed?.confidence ?? 0.5,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n}\n\n// ─── Path 2: WITHOUT TOOLS (ToolLoopAgent, structured output) ────────────────\n\nasync function callWithStructuredOutput(\n prompt: string,\n context: string,\n persona: PersonaDefinition,\n config: AgentConfig,\n options: AgentCallOptions | undefined,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n google: any,\n modelName: string,\n startTime: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n providerOptions: Record<string, any>,\n sourceFile?: SourceFileInfo | null,\n files?: FileAttachment[],\n): Promise<AgentResult> {\n // Build multipart messages (supports source files + file attachments)\n const messages = buildMessages(prompt, context, sourceFile, files);\n\n const collectedToolCalls: ToolCall[] = [];\n\n // Determine output schema\n const useCustomSchema = !!(options?.schema || options?.responseFormat);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let outputConfig: any;\n\n if (options?.schema) {\n if (options.responseFormat) {\n logDebug('Both schema (Zod) and responseFormat provided — using schema (Zod)');\n }\n logDebug('Using custom Zod schema for structured output');\n outputConfig = Output.object({ schema: options.schema });\n } else if (options?.responseFormat) {\n logDebug('Using custom JSON Schema (responseFormat) for structured output');\n outputConfig = Output.object({ schema: jsonSchema(options.responseFormat.schema) });\n } else {\n outputConfig = Output.object({ schema: agentOutputSchema });\n }\n\n const agent = new ToolLoopAgent({\n model: google(modelName),\n instructions: useCustomSchema\n ? `${persona.systemPrompt}\\n\\nIMPORTANT: You must respond with structured data matching the requested output schema. Do not include AgentResult wrapper fields — just return the data matching the schema.`\n : persona.systemPrompt,\n maxOutputTokens: config.budget.maxTokensPerCall,\n output: outputConfig,\n providerOptions: Object.keys(providerOptions).length > 0 ? providerOptions : undefined,\n onStepFinish: (step) => {\n if (step.toolCalls) {\n for (const tc of step.toolCalls) {\n collectedToolCalls.push({\n name: tc.toolName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args: (tc as any).args ?? {},\n result: tc.toolName,\n });\n }\n }\n logDebug(`Step finished: ${step.finishReason}`);\n },\n });\n\n const result = await agent.generate({\n messages,\n timeout: config.timeout,\n });\n\n const latencyMs = Date.now() - startTime;\n const tokensUsed = result.usage?.totalTokens ?? 0;\n\n logDebug(`Response received: ${latencyMs}ms, ${tokensUsed} tokens`);\n\n // Custom schema: wrap AI output in AgentResult\n if (useCustomSchema && result.output) {\n const customData = result.output as Record<string, unknown>;\n logDebug('Custom schema output received, wrapping in AgentResult');\n return {\n success: true,\n summary: `Structured output returned (${Object.keys(customData).length} fields)`,\n data: customData,\n actions: collectedToolCalls.map((tc) => tc.name),\n confidence: 1,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n }\n\n // Default schema: use AgentResult fields directly\n if (result.output) {\n const output = result.output as {\n success: boolean;\n summary: string;\n reasoning?: string;\n data: Record<string, unknown>;\n actions: string[];\n confidence: number;\n };\n return {\n success: output.success,\n summary: output.summary,\n reasoning: output.reasoning,\n data: output.data,\n actions: output.actions,\n confidence: output.confidence,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n }\n\n // Fallback: parse text response\n const parsed = parseResponse(result.text);\n\n return {\n success: parsed?.success ?? true,\n summary: parsed?.summary ?? result.text.substring(0, 200),\n reasoning: parsed?.reasoning,\n data: parsed?.data ?? { raw: result.text },\n actions: parsed?.actions ?? collectedToolCalls.map((tc) => tc.name),\n confidence: parsed?.confidence ?? 0.5,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n}\n\n// ─── Response Parser (fallback for unstructured output) ──────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction parseResponse(text: string): any {\n // Try direct JSON parse\n try {\n return JSON.parse(text);\n } catch {\n // Try extracting JSON from markdown code fences\n const jsonMatch = text.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?\\s*```/);\n if (jsonMatch) {\n try {\n return JSON.parse(jsonMatch[1]);\n } catch {\n // Fall through\n }\n }\n\n // Try finding JSON object in text\n const objectMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (objectMatch) {\n try {\n return JSON.parse(objectMatch[0]);\n } catch {\n // Fall through\n }\n }\n\n // Return as raw fallback\n return {\n success: true,\n summary: text.substring(0, 200),\n data: { raw: text },\n actions: [],\n confidence: 0.5,\n };\n }\n}\n","/**\n * Content anonymization — strips secrets, PII, and sensitive data\n * before sending to the AI provider.\n */\n\n// Patterns for sensitive content\nconst patterns = {\n // API keys and tokens (long alphanumeric strings near sensitive keywords)\n apiKey: /(?:api[_-]?key|token|secret|password|credential|auth)['\":\\s=]+['\"]?([A-Za-z0-9_\\-/.]{20,})['\"]?/gi,\n // Bearer tokens\n bearer: /Bearer\\s+[A-Za-z0-9_\\-/.+]{20,}/gi,\n // Email addresses\n email: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g,\n // IPv4 addresses\n ipv4: /\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b/g,\n // IPv6 addresses (simplified)\n ipv6: /(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}/g,\n // AWS keys\n awsKey: /(?:AKIA|ASIA)[A-Z0-9]{16}/g,\n // Private keys\n privateKey: /-----BEGIN (?:RSA )?PRIVATE KEY-----[\\s\\S]*?-----END (?:RSA )?PRIVATE KEY-----/g,\n // Connection strings\n connectionString: /(?:mongodb|postgres|mysql|redis|amqp):\\/\\/[^\\s'\"]+/gi,\n // .env style secrets\n envSecret: /^(?:DATABASE_URL|DB_PASSWORD|SECRET_KEY|PRIVATE_KEY|AWS_SECRET|STRIPE_KEY|SENDGRID_KEY)[=:].+$/gm,\n};\n\n/**\n * Anonymize sensitive content in a string.\n * Replaces detected secrets/PII with safe placeholders.\n */\nexport function anonymize(content: string): string {\n let result = content;\n\n result = result.replace(patterns.privateKey, '[REDACTED_PRIVATE_KEY]');\n result = result.replace(patterns.connectionString, '[REDACTED_CONNECTION_STRING]');\n result = result.replace(patterns.awsKey, '[REDACTED_AWS_KEY]');\n result = result.replace(patterns.bearer, 'Bearer [REDACTED_TOKEN]');\n result = result.replace(patterns.apiKey, (match, _key) => {\n // Keep the key name but redact the value\n const colonIdx = match.search(/['\":\\s=]/);\n const prefix = match.substring(0, colonIdx);\n return `${prefix}: [REDACTED]`;\n });\n result = result.replace(patterns.envSecret, (match) => {\n const eqIdx = match.search(/[=:]/);\n const key = match.substring(0, eqIdx);\n return `${key}=[REDACTED]`;\n });\n result = result.replace(patterns.email, '[EMAIL]');\n result = result.replace(patterns.ipv4, '[IP]');\n result = result.replace(patterns.ipv6, '[IP]');\n\n return result;\n}\n\n/**\n * Anonymize any value — handles strings, objects, arrays, and primitives.\n */\nexport function anonymizeValue(value: unknown): unknown {\n if (typeof value === 'string') {\n return anonymize(value);\n }\n if (Array.isArray(value)) {\n return value.map(anonymizeValue);\n }\n if (value !== null && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = anonymizeValue(v);\n }\n return result;\n }\n return value;\n}\n","/**\n * Token bucket rate limiter.\n * Controls the rate of API calls to prevent abuse and stay within budget.\n */\n\nexport class RateLimiter {\n private tokens: number;\n private readonly maxTokens: number;\n private readonly refillRate: number; // tokens per millisecond\n private lastRefill: number;\n\n /**\n * @param maxCallsPerDay Maximum calls allowed per day\n */\n constructor(maxCallsPerDay: number) {\n this.maxTokens = maxCallsPerDay;\n this.tokens = maxCallsPerDay;\n // Refill rate: spread calls evenly across 24 hours\n this.refillRate = maxCallsPerDay / (24 * 60 * 60 * 1000);\n this.lastRefill = Date.now();\n }\n\n /**\n * Attempt to consume one token.\n * @returns true if allowed, false if rate limited\n */\n tryConsume(): boolean {\n this.refill();\n\n if (this.tokens >= 1) {\n this.tokens -= 1;\n return true;\n }\n\n return false;\n }\n\n /**\n * Get remaining tokens (calls available)\n */\n remaining(): number {\n this.refill();\n return Math.floor(this.tokens);\n }\n\n /**\n * Reset the limiter (e.g., for testing or manual override)\n */\n reset(): void {\n this.tokens = this.maxTokens;\n this.lastRefill = Date.now();\n }\n\n private refill(): void {\n const now = Date.now();\n const elapsed = now - this.lastRefill;\n const newTokens = elapsed * this.refillRate;\n\n this.tokens = Math.min(this.maxTokens, this.tokens + newTokens);\n this.lastRefill = now;\n }\n}\n","/**\n * Budget tracker — monitors daily token usage and cost.\n * Enforces hard caps to prevent cost explosion.\n */\n\nimport type { BudgetConfig } from '../types.js';\n\nexport class BudgetTracker {\n private callsToday = 0;\n private tokensToday = 0;\n private costToday = 0;\n private dayStart: number;\n private readonly config: BudgetConfig;\n\n constructor(config: BudgetConfig) {\n this.config = config;\n this.dayStart = this.getStartOfDay();\n }\n\n /**\n * Check if a call is within budget. Resets counters at midnight UTC.\n */\n canMakeCall(): { allowed: boolean; reason?: string } {\n this.maybeResetDay();\n\n if (this.callsToday >= this.config.maxCallsPerDay) {\n return {\n allowed: false,\n reason: `Daily call limit reached (${this.config.maxCallsPerDay} calls/day)`,\n };\n }\n\n if (this.costToday >= this.config.costCapDaily) {\n return {\n allowed: false,\n reason: `Daily cost cap reached ($${this.config.costCapDaily.toFixed(2)})`,\n };\n }\n\n return { allowed: true };\n }\n\n /**\n * Record a completed call's usage.\n */\n recordUsage(tokensUsed: number, costUsd: number): void {\n this.maybeResetDay();\n this.callsToday += 1;\n this.tokensToday += tokensUsed;\n this.costToday += costUsd;\n }\n\n /**\n * Get current usage stats.\n */\n getStats() {\n this.maybeResetDay();\n return {\n callsToday: this.callsToday,\n callsRemaining: Math.max(0, this.config.maxCallsPerDay - this.callsToday),\n tokensToday: this.tokensToday,\n costToday: this.costToday,\n costRemaining: Math.max(0, this.config.costCapDaily - this.costToday),\n };\n }\n\n /**\n * Reset all counters (for testing).\n */\n reset(): void {\n this.callsToday = 0;\n this.tokensToday = 0;\n this.costToday = 0;\n this.dayStart = this.getStartOfDay();\n }\n\n /**\n * Get the max tokens allowed per call.\n */\n get maxTokensPerCall(): number {\n return this.config.maxTokensPerCall;\n }\n\n private maybeResetDay(): void {\n const currentDayStart = this.getStartOfDay();\n if (currentDayStart > this.dayStart) {\n this.callsToday = 0;\n this.tokensToday = 0;\n this.costToday = 0;\n this.dayStart = currentDayStart;\n }\n }\n\n private getStartOfDay(): number {\n const now = new Date();\n return Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate());\n }\n}\n","/**\n * Core agent engine — orchestrates persona selection, budget checks,\n * anonymization, provider calls, and console output.\n */\n\nimport type { AgentConfig, AgentCallOptions, AgentResult, PersonaName } from './types.js';\nimport { detectPersona, getPersona } from './personas/index.js';\nimport { callGoogle } from './providers/google.js';\nimport { anonymizeValue } from './utils/anonymize.js';\nimport { RateLimiter } from './utils/rate-limit.js';\nimport { BudgetTracker } from './utils/budget.js';\nimport {\n getCallerFile,\n getErrorSourceFile,\n type SourceFileInfo,\n} from './utils/caller-file.js';\nimport {\n startSpinner,\n stopSpinner,\n formatResult,\n formatError,\n formatBudgetWarning,\n formatRateLimitWarning,\n formatDryRun,\n logDebug,\n} from './utils/format.js';\n\n// ─── Default Config ──────────────────────────────────────────────────────────\n\nexport const DEFAULT_CONFIG: AgentConfig = {\n provider: 'google',\n model: 'gemini-2.5-flash-lite',\n persona: 'general',\n budget: {\n maxCallsPerDay: 100,\n maxTokensPerCall: 8000,\n costCapDaily: 1.0,\n },\n mode: 'fire-and-forget',\n timeout: 10000,\n anonymize: true,\n localOnly: false,\n dryRun: false,\n logLevel: 'info',\n verbose: false,\n safetySettings: [],\n includeCallerSource: true,\n};\n\n// ─── Singleton State ─────────────────────────────────────────────────────────\n\nlet config: AgentConfig = { ...DEFAULT_CONFIG };\nlet rateLimiter = new RateLimiter(config.budget.maxCallsPerDay);\nlet budgetTracker = new BudgetTracker(config.budget);\n\n/**\n * Update the global configuration. Reinitializes rate limiter and budget tracker.\n */\nexport function updateConfig(newConfig: Partial<AgentConfig>): void {\n config = { ...DEFAULT_CONFIG, ...newConfig };\n\n // Merge budget with defaults\n if (newConfig.budget) {\n config.budget = { ...DEFAULT_CONFIG.budget, ...newConfig.budget };\n }\n\n // Reinitialize limiters with new config\n rateLimiter = new RateLimiter(config.budget.maxCallsPerDay);\n budgetTracker = new BudgetTracker(config.budget);\n}\n\n/**\n * Get the current config (for testing/inspection).\n */\nexport function getConfig(): AgentConfig {\n return { ...config };\n}\n\n// ─── Core Execution ──────────────────────────────────────────────────────────\n\n/**\n * Execute an agent call. This is the core function behind console.agent().\n */\nexport async function executeAgent(\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n): Promise<AgentResult> {\n // Determine persona\n const personaName: PersonaName = options?.persona ?? config.persona;\n const persona = options?.persona\n ? getPersona(options.persona)\n : detectPersona(prompt, personaName);\n\n // Resolve verbose flag: per-call override > global config\n const verbose = options?.verbose ?? config.verbose;\n\n logDebug(`Selected persona: ${persona.name} (${persona.icon})`);\n\n // Dry run — log without calling API\n if (config.dryRun) {\n formatDryRun(prompt, persona, context, verbose);\n return createDryRunResult(persona.name);\n }\n\n // Check rate limits\n if (!rateLimiter.tryConsume()) {\n formatRateLimitWarning(verbose);\n return createErrorResult('Rate limited — too many calls. Try again later.');\n }\n\n // Check budget\n const budgetCheck = budgetTracker.canMakeCall();\n if (!budgetCheck.allowed) {\n formatBudgetWarning(budgetCheck.reason!, verbose);\n return createErrorResult(budgetCheck.reason!);\n }\n\n // Anonymize context if enabled\n let contextStr = '';\n if (context !== undefined) {\n const processed = config.anonymize ? anonymizeValue(context) : context;\n contextStr = typeof processed === 'string'\n ? processed\n : JSON.stringify(processed, null, 2);\n\n // Handle Error objects: JSON.stringify(Error) returns \"{}\" because\n // message/stack/name are non-enumerable. Extract them explicitly.\n if (context instanceof Error) {\n const errObj = {\n name: context.name,\n message: context.message,\n stack: context.stack,\n ...(typeof context === 'object' ? Object.getOwnPropertyNames(context).reduce((acc, key) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (acc as any)[key] = (context as any)[key];\n return acc;\n }, {} as Record<string, unknown>) : {}),\n };\n const processed2 = config.anonymize ? anonymizeValue(errObj) : errObj;\n contextStr = typeof processed2 === 'string' ? processed2 : JSON.stringify(processed2, null, 2);\n }\n }\n\n // Anonymize prompt if enabled\n const processedPrompt = config.anonymize\n ? (anonymizeValue(prompt) as string)\n : prompt;\n\n // ─── Auto-detect caller source file ──────────────────────────────────────\n const shouldIncludeSource = options?.includeCallerSource ?? config.includeCallerSource;\n let sourceFile: SourceFileInfo | null = null;\n\n if (shouldIncludeSource) {\n // Priority 1: If context is an Error, get the file where the error originated\n if (context instanceof Error) {\n sourceFile = getErrorSourceFile(context);\n if (sourceFile) {\n logDebug(`Auto-detected error source file: ${sourceFile.fileName} (line ${sourceFile.line})`);\n }\n }\n\n // Priority 2: If no error source, get the caller file (where console.agent was called)\n if (!sourceFile) {\n sourceFile = getCallerFile();\n if (sourceFile) {\n logDebug(`Auto-detected caller file: ${sourceFile.fileName} (line ${sourceFile.line})`);\n }\n }\n }\n\n // Collect explicit file attachments\n const files = options?.files;\n\n // Start spinner (only in verbose mode)\n const spinner = startSpinner(persona, processedPrompt, verbose);\n\n try {\n // Execute with timeout\n const result = await Promise.race([\n callGoogle(processedPrompt, contextStr, persona, config, options, sourceFile, files),\n createTimeout(config.timeout),\n ]);\n\n // Record usage\n budgetTracker.recordUsage(\n result.metadata.tokensUsed,\n estimateCost(result.metadata.tokensUsed, result.metadata.model),\n );\n\n // Stop spinner and format output\n stopSpinner(spinner, result.success);\n formatResult(result, persona, verbose);\n\n return result;\n } catch (error) {\n stopSpinner(spinner, false);\n const err = error instanceof Error ? error : new Error(String(error));\n formatError(err, persona, verbose);\n return createErrorResult(err.message);\n }\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction createTimeout(ms: number): Promise<never> {\n return new Promise((_, reject) => {\n setTimeout(() => reject(new Error(`Agent timed out after ${ms}ms`)), ms);\n });\n}\n\nfunction createErrorResult(message: string): AgentResult {\n return {\n success: false,\n summary: message,\n data: {},\n actions: [],\n confidence: 0,\n metadata: {\n model: config.model,\n tokensUsed: 0,\n latencyMs: 0,\n toolCalls: [],\n cached: false,\n },\n };\n}\n\nfunction createDryRunResult(personaName: string): AgentResult {\n return {\n success: true,\n summary: `[DRY RUN] Would have executed with ${personaName} persona`,\n data: { dryRun: true },\n actions: [],\n confidence: 1,\n metadata: {\n model: config.model,\n tokensUsed: 0,\n latencyMs: 0,\n toolCalls: [],\n cached: false,\n },\n };\n}\n\n/**\n * Rough cost estimation based on model and token count.\n */\nfunction estimateCost(tokens: number, model: string): number {\n // Approximate cost per 1M tokens\n const costPer1M: Record<string, number> = {\n 'gemini-2.5-flash-lite': 0.01,\n 'gemini-3-flash-preview': 0.03,\n };\n const rate = costPer1M[model] ?? 0.01;\n return (tokens / 1_000_000) * rate;\n}\n","/**\n * @console-agent/agent\n *\n * Drop console.agent(...) anywhere in your code to execute agentic workflows\n * — as easy as console.log()\n *\n * @example\n * ```ts\n * import { init } from '@console-agent/agent';\n *\n * // Optional configuration (works with sensible defaults)\n * init({ apiKey: process.env.GEMINI_API_KEY });\n *\n * // Fire-and-forget (default)\n * console.agent(\"analyze this error\", error);\n *\n * // Blocking mode\n * const result = await console.agent(\"validate email format\", email);\n *\n * // Persona shortcuts\n * console.agent.security(\"audit SQL query\", query);\n * console.agent.debug(\"investigate slow query\", { duration, sql });\n * console.agent.architect(\"review API design\", endpoint);\n * ```\n */\n\nimport type { AgentConfig, AgentCallOptions, AgentResult, AgentFunction } from './types.js';\nimport { executeAgent, updateConfig, getConfig } from './agent.js';\nimport { setLogLevel } from './utils/format.js';\n\n// ─── Re-exports ──────────────────────────────────────────────────────────────\n\nexport type {\n AgentConfig,\n AgentCallOptions,\n AgentResult,\n AgentFunction,\n ResponseFormat,\n ToolCall,\n PersonaName,\n PersonaDefinition,\n ToolName,\n ToolConfig,\n ThinkingConfig,\n BudgetConfig,\n SafetySetting,\n HarmCategory,\n HarmBlockThreshold,\n LogLevel,\n FileAttachment,\n GoogleSearchConfig,\n} from './types.js';\n\nexport { DEFAULT_CONFIG } from './agent.js';\n\n// ─── Init ────────────────────────────────────────────────────────────────────\n\n/**\n * Initialize console.agent with custom configuration.\n * Call this once at app startup. Works with sensible defaults if not called.\n *\n * @example\n * ```ts\n * init({\n * apiKey: process.env.GEMINI_API_KEY,\n * model: 'gemini-2.5-flash-lite',\n * persona: 'debugger',\n * budget: { maxCallsPerDay: 200 },\n * });\n * ```\n */\nexport function init(config: Partial<AgentConfig> = {}): void {\n updateConfig(config);\n\n const fullConfig = getConfig();\n setLogLevel(fullConfig.logLevel);\n\n // Attach console.agent\n attachConsoleAgent();\n}\n\n// ─── Console Agent Proxy ─────────────────────────────────────────────────────\n\n/**\n * Create the console.agent callable with persona methods.\n * Uses a Proxy to make it both callable and have methods.\n */\nfunction createAgentProxy(): AgentFunction {\n // The base function that handles direct calls\n const agentFn = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n const config = getConfig();\n\n if (config.mode === 'fire-and-forget' && !options?.mode) {\n // Fire-and-forget: start async execution but don't return the promise\n // We still return a Promise for type compatibility, but the caller doesn't await it\n const promise = executeAgent(prompt, context, options);\n // Catch unhandled rejections silently\n promise.catch(() => { /* fire-and-forget errors are logged to console */ });\n return promise;\n }\n\n // Blocking mode: return the promise for awaiting\n return executeAgent(prompt, context, options);\n };\n\n // Add persona shortcuts\n agentFn.security = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n return executeAgent(prompt, context, { ...options, persona: 'security' });\n };\n\n agentFn.debug = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n return executeAgent(prompt, context, { ...options, persona: 'debugger' });\n };\n\n agentFn.architect = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n return executeAgent(prompt, context, { ...options, persona: 'architect' });\n };\n\n return agentFn as AgentFunction;\n}\n\n// ─── Attach to console ───────────────────────────────────────────────────────\n\n// Extend console type\ndeclare global {\n interface Console {\n agent: AgentFunction;\n }\n}\n\nlet attached = false;\n\nfunction attachConsoleAgent(): void {\n if (attached) return;\n\n const agentProxy = createAgentProxy();\n // Attach to global console object\n (console as unknown as Record<string, unknown>).agent = agentProxy;\n attached = true;\n}\n\n// ─── Auto-attach with defaults on import ─────────────────────────────────────\n\n// Auto-attach console.agent on first import with default config\nattachConsoleAgent();\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -34,7 +34,7 @@ interface PersonaDefinition {
|
|
|
34
34
|
defaultTools: ToolName[];
|
|
35
35
|
keywords: string[];
|
|
36
36
|
}
|
|
37
|
-
type ToolName = 'code_execution' | 'google_search' | 'file_analysis';
|
|
37
|
+
type ToolName = 'code_execution' | 'google_search' | 'url_context' | 'file_analysis';
|
|
38
38
|
interface GoogleSearchConfig {
|
|
39
39
|
mode?: 'MODE_DYNAMIC' | 'MODE_UNSPECIFIED';
|
|
40
40
|
dynamicThreshold?: number;
|
|
@@ -65,6 +65,14 @@ interface BudgetConfig {
|
|
|
65
65
|
/** Hard daily cost cap in USD (default: 1.00) */
|
|
66
66
|
costCapDaily: number;
|
|
67
67
|
}
|
|
68
|
+
interface FileAttachment {
|
|
69
|
+
/** File content as Buffer or Uint8Array */
|
|
70
|
+
data: Buffer | Uint8Array;
|
|
71
|
+
/** MIME type (e.g., 'application/pdf', 'image/png', 'text/plain') */
|
|
72
|
+
mediaType: string;
|
|
73
|
+
/** Optional filename for display in context */
|
|
74
|
+
fileName?: string;
|
|
75
|
+
}
|
|
68
76
|
interface ResponseFormat {
|
|
69
77
|
/** Must be 'json_object' */
|
|
70
78
|
type: 'json_object';
|
|
@@ -82,6 +90,11 @@ interface AgentCallOptions {
|
|
|
82
90
|
persona?: PersonaName;
|
|
83
91
|
/** Override execution mode */
|
|
84
92
|
mode?: 'fire-and-forget' | 'blocking';
|
|
93
|
+
/**
|
|
94
|
+
* Show full execution trace ([AGENT] prefix, tools, reasoning, metadata).
|
|
95
|
+
* When false (default), only the clean answer/summary is printed.
|
|
96
|
+
*/
|
|
97
|
+
verbose?: boolean;
|
|
85
98
|
/**
|
|
86
99
|
* Zod schema for typed structured output.
|
|
87
100
|
* When provided, the AI returns data matching this schema.
|
|
@@ -95,6 +108,18 @@ interface AgentCallOptions {
|
|
|
95
108
|
* The result is placed in `AgentResult.data`.
|
|
96
109
|
*/
|
|
97
110
|
responseFormat?: ResponseFormat;
|
|
111
|
+
/**
|
|
112
|
+
* Auto-include the caller's source file as context for the AI.
|
|
113
|
+
* When true, reads the file where console.agent() was called (or where
|
|
114
|
+
* the Error originated) and sends it as part of the message.
|
|
115
|
+
* Per-call override of global config. Default: true.
|
|
116
|
+
*/
|
|
117
|
+
includeCallerSource?: boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Explicit file attachments to send to the AI (PDFs, images, etc.).
|
|
120
|
+
* These are sent as multipart message content alongside the prompt.
|
|
121
|
+
*/
|
|
122
|
+
files?: FileAttachment[];
|
|
98
123
|
}
|
|
99
124
|
type LogLevel = 'silent' | 'errors' | 'info' | 'debug';
|
|
100
125
|
interface AgentConfig {
|
|
@@ -120,8 +145,20 @@ interface AgentConfig {
|
|
|
120
145
|
dryRun: boolean;
|
|
121
146
|
/** Console log level */
|
|
122
147
|
logLevel: LogLevel;
|
|
148
|
+
/**
|
|
149
|
+
* Show full execution trace ([AGENT] prefix, tools, reasoning, metadata).
|
|
150
|
+
* When false (default), only the clean answer/summary is printed.
|
|
151
|
+
*/
|
|
152
|
+
verbose: boolean;
|
|
123
153
|
/** Safety settings */
|
|
124
154
|
safetySettings: SafetySetting[];
|
|
155
|
+
/**
|
|
156
|
+
* Auto-include the caller's source file as context for the AI.
|
|
157
|
+
* When true (default), reads the file where console.agent() was called
|
|
158
|
+
* (or where an Error originated) and sends it alongside the prompt.
|
|
159
|
+
* Set to false via init() to disable globally.
|
|
160
|
+
*/
|
|
161
|
+
includeCallerSource: boolean;
|
|
125
162
|
}
|
|
126
163
|
interface AgentFunction {
|
|
127
164
|
(prompt: string, context?: unknown, options?: AgentCallOptions): Promise<AgentResult>;
|
|
@@ -184,4 +221,4 @@ declare global {
|
|
|
184
221
|
}
|
|
185
222
|
}
|
|
186
223
|
|
|
187
|
-
export { type AgentCallOptions, type AgentConfig, type AgentFunction, type AgentResult, type BudgetConfig, DEFAULT_CONFIG, type GoogleSearchConfig, type HarmBlockThreshold, type HarmCategory, type LogLevel, type PersonaDefinition, type PersonaName, type ResponseFormat, type SafetySetting, type ThinkingConfig, type ToolCall, type ToolConfig, type ToolName, init };
|
|
224
|
+
export { type AgentCallOptions, type AgentConfig, type AgentFunction, type AgentResult, type BudgetConfig, DEFAULT_CONFIG, type FileAttachment, type GoogleSearchConfig, type HarmBlockThreshold, type HarmCategory, type LogLevel, type PersonaDefinition, type PersonaName, type ResponseFormat, type SafetySetting, type ThinkingConfig, type ToolCall, type ToolConfig, type ToolName, init };
|
package/dist/index.d.ts
CHANGED
|
@@ -34,7 +34,7 @@ interface PersonaDefinition {
|
|
|
34
34
|
defaultTools: ToolName[];
|
|
35
35
|
keywords: string[];
|
|
36
36
|
}
|
|
37
|
-
type ToolName = 'code_execution' | 'google_search' | 'file_analysis';
|
|
37
|
+
type ToolName = 'code_execution' | 'google_search' | 'url_context' | 'file_analysis';
|
|
38
38
|
interface GoogleSearchConfig {
|
|
39
39
|
mode?: 'MODE_DYNAMIC' | 'MODE_UNSPECIFIED';
|
|
40
40
|
dynamicThreshold?: number;
|
|
@@ -65,6 +65,14 @@ interface BudgetConfig {
|
|
|
65
65
|
/** Hard daily cost cap in USD (default: 1.00) */
|
|
66
66
|
costCapDaily: number;
|
|
67
67
|
}
|
|
68
|
+
interface FileAttachment {
|
|
69
|
+
/** File content as Buffer or Uint8Array */
|
|
70
|
+
data: Buffer | Uint8Array;
|
|
71
|
+
/** MIME type (e.g., 'application/pdf', 'image/png', 'text/plain') */
|
|
72
|
+
mediaType: string;
|
|
73
|
+
/** Optional filename for display in context */
|
|
74
|
+
fileName?: string;
|
|
75
|
+
}
|
|
68
76
|
interface ResponseFormat {
|
|
69
77
|
/** Must be 'json_object' */
|
|
70
78
|
type: 'json_object';
|
|
@@ -82,6 +90,11 @@ interface AgentCallOptions {
|
|
|
82
90
|
persona?: PersonaName;
|
|
83
91
|
/** Override execution mode */
|
|
84
92
|
mode?: 'fire-and-forget' | 'blocking';
|
|
93
|
+
/**
|
|
94
|
+
* Show full execution trace ([AGENT] prefix, tools, reasoning, metadata).
|
|
95
|
+
* When false (default), only the clean answer/summary is printed.
|
|
96
|
+
*/
|
|
97
|
+
verbose?: boolean;
|
|
85
98
|
/**
|
|
86
99
|
* Zod schema for typed structured output.
|
|
87
100
|
* When provided, the AI returns data matching this schema.
|
|
@@ -95,6 +108,18 @@ interface AgentCallOptions {
|
|
|
95
108
|
* The result is placed in `AgentResult.data`.
|
|
96
109
|
*/
|
|
97
110
|
responseFormat?: ResponseFormat;
|
|
111
|
+
/**
|
|
112
|
+
* Auto-include the caller's source file as context for the AI.
|
|
113
|
+
* When true, reads the file where console.agent() was called (or where
|
|
114
|
+
* the Error originated) and sends it as part of the message.
|
|
115
|
+
* Per-call override of global config. Default: true.
|
|
116
|
+
*/
|
|
117
|
+
includeCallerSource?: boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Explicit file attachments to send to the AI (PDFs, images, etc.).
|
|
120
|
+
* These are sent as multipart message content alongside the prompt.
|
|
121
|
+
*/
|
|
122
|
+
files?: FileAttachment[];
|
|
98
123
|
}
|
|
99
124
|
type LogLevel = 'silent' | 'errors' | 'info' | 'debug';
|
|
100
125
|
interface AgentConfig {
|
|
@@ -120,8 +145,20 @@ interface AgentConfig {
|
|
|
120
145
|
dryRun: boolean;
|
|
121
146
|
/** Console log level */
|
|
122
147
|
logLevel: LogLevel;
|
|
148
|
+
/**
|
|
149
|
+
* Show full execution trace ([AGENT] prefix, tools, reasoning, metadata).
|
|
150
|
+
* When false (default), only the clean answer/summary is printed.
|
|
151
|
+
*/
|
|
152
|
+
verbose: boolean;
|
|
123
153
|
/** Safety settings */
|
|
124
154
|
safetySettings: SafetySetting[];
|
|
155
|
+
/**
|
|
156
|
+
* Auto-include the caller's source file as context for the AI.
|
|
157
|
+
* When true (default), reads the file where console.agent() was called
|
|
158
|
+
* (or where an Error originated) and sends it alongside the prompt.
|
|
159
|
+
* Set to false via init() to disable globally.
|
|
160
|
+
*/
|
|
161
|
+
includeCallerSource: boolean;
|
|
125
162
|
}
|
|
126
163
|
interface AgentFunction {
|
|
127
164
|
(prompt: string, context?: unknown, options?: AgentCallOptions): Promise<AgentResult>;
|
|
@@ -184,4 +221,4 @@ declare global {
|
|
|
184
221
|
}
|
|
185
222
|
}
|
|
186
223
|
|
|
187
|
-
export { type AgentCallOptions, type AgentConfig, type AgentFunction, type AgentResult, type BudgetConfig, DEFAULT_CONFIG, type GoogleSearchConfig, type HarmBlockThreshold, type HarmCategory, type LogLevel, type PersonaDefinition, type PersonaName, type ResponseFormat, type SafetySetting, type ThinkingConfig, type ToolCall, type ToolConfig, type ToolName, init };
|
|
224
|
+
export { type AgentCallOptions, type AgentConfig, type AgentFunction, type AgentResult, type BudgetConfig, DEFAULT_CONFIG, type FileAttachment, type GoogleSearchConfig, type HarmBlockThreshold, type HarmCategory, type LogLevel, type PersonaDefinition, type PersonaName, type ResponseFormat, type SafetySetting, type ThinkingConfig, type ToolCall, type ToolConfig, type ToolName, init };
|