@langwatch/better-agents 0.1.3-beta.0
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/LICENSE +22 -0
- package/README.md +111 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1763 -0
- package/dist/index.js.map +1 -0
- package/package.json +100 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/logger/base-logger.ts","../src/utils/logger/display-logger.ts","../src/utils/logger/console-logger.ts","../src/utils/logger/logger-facade.ts","../src/utils/logger/index.ts","../src/config-collection/choice-builders/language-choices.ts","../src/providers/frameworks/agno/knowledge.ts","../src/providers/frameworks/agno/setup.ts","../src/providers/frameworks/agno/index.ts","../src/providers/frameworks/mastra/knowledge.ts","../src/providers/frameworks/mastra/mcp-config.ts","../src/providers/frameworks/mastra/index.ts","../src/providers/frameworks/index.ts","../src/config-collection/choice-builders/framework-choices.ts","../src/utils/process.util.ts","../src/utils/cli.util.ts","../src/providers/coding-assistants/claude/index.ts","../src/providers/coding-assistants/cursor/index.ts","../src/providers/coding-assistants/kilocode/index.ts","../src/providers/coding-assistants/none/index.ts","../src/providers/coding-assistants/index.ts","../src/utils/coding-assistant.util.ts","../src/config-collection/choice-builders/coding-assistant-choices.ts","../src/providers/llm-providers/openai/index.ts","../src/providers/llm-providers/anthropic/index.ts","../src/providers/llm-providers/gemini/index.ts","../src/providers/llm-providers/bedrock/index.ts","../src/providers/llm-providers/openrouter/index.ts","../src/providers/llm-providers/grok/index.ts","../src/providers/llm-providers/index.ts","../src/config-collection/validators/openai-key.ts","../src/config-collection/validators/langwatch-key.ts","../src/config-collection/validators/project-goal.ts","../src/config-collection/collect-config.ts","../src/project-scaffolding/create-directory-structure.ts","../src/project-scaffolding/file-generators/env-files.ts","../src/project-scaffolding/file-generators/gitignore-generator.ts","../src/project-scaffolding/file-generators/sample-prompt-file.ts","../src/project-scaffolding/file-generators/sample-evaluation.ts","../src/project-scaffolding/file-generators/sample-scenario-test.ts","../src/project-scaffolding/file-generators/main-entry-point.ts","../src/project-scaffolding/create-project-structure.ts","../src/documentation/sections/overview-section.ts","../src/documentation/sections/principles-section.ts","../src/documentation/sections/workflow-section.ts","../src/builders/agents-guide-builder.ts","../src/builders/mcp-config-builder.ts","../src/providers/languages/python/knowledge.ts","../src/providers/languages/python/index.ts","../src/providers/languages/typescript/knowledge.ts","../src/providers/languages/typescript/index.ts","../src/providers/languages/index.ts","../src/assistant-kickoff/build-initial-prompt.ts","../src/assistant-kickoff/kickoff-assistant.ts","../src/commands/init.ts","../src/index.ts"],"names":["path","fs","pino","path2","fs2","getKnowledge","path3","fs3","path4","fs4","path5","fs5","PROVIDERS","chalk","resolve","fs7","path7","fs8","path8","fs9","path9","fs10","path10","fs11","path11","fs12","path12","fs13","path13","fs14","path14","logger","path15","fs15"],"mappings":";;;;;;;;;;;AAkBO,IAAM,aAAN,MAAiB;AAAA,EACd,aAAA;AAAA,EACA,MAAA,uBAAa,GAAA,EAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzC,YAAY,WAAA,EAAsB;AAChC,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAA,CAAK,oBAAoB,WAAW,CAAA;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,oBAAoB,WAAA,EAAoC;AACpE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAcA,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,gBAAgB,CAAA;AAGtD,MAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,MAAA,MAAM,SAAA,GAAY,GAAA,CAAI,WAAA,EAAY,CAAE,OAAA,CAAQ,SAAS,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACrE,MAAA,MAAM,OAAA,GAAeA,KAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,MAAA,EAAS,SAAS,CAAA,IAAA,CAAM,CAAA;AAE1D,MAAA,MAASC,GAAA,CAAA,KAAA,CAAM,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAM,CAAA;AAE1C,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,QACnB;AAAA,UACE,KAAA,EAAO,OAAA;AAAA,UACP,UAAA,EAAY;AAAA,YACV,KAAA,EAAO,CAAC,KAAA,MAAmB;AAAA,cACzB,KAAA,EAAO,KAAA;AAAA,cACP,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,aACpC;AAAA;AACF,SACF;AAAA,QACA,IAAA,CAAK,YAAY,OAAO;AAAA,OAC1B;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAGR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,CAAM,IAAA,EAAc,OAAA,GAAsB,EAAC,EAAS;AAClD,IAAA,IAAA,CAAK,eAAe,KAAA,CAAM,EAAE,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAA,CAAK,IAAA,EAAc,OAAA,GAAsB,EAAC,EAAS;AACjD,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,EAAE,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,CAAM,KAAA,EAAc,OAAA,GAAsB,EAAC,EAAS;AAClD,IAAA,IAAA,CAAK,eAAe,KAAA,CAAM;AAAA,MACxB,IAAA,EAAM,OAAA;AAAA,MACN,OAAO,KAAA,CAAM,OAAA;AAAA,MACb,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,KAAA,EAA6B;AACtC,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA;AAC5B,IAAA,IAAA,CAAK,KAAA,CAAM,aAAA,EAAe,EAAE,KAAA,EAAO,CAAA;AAEnC,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAC9B,MAAA,IAAA,CAAK,MAAA,CAAO,OAAO,KAAK,CAAA;AACxB,MAAA,IAAA,CAAK,KAAA,CAAM,WAAA,EAAa,EAAE,KAAA,EAAO,UAAU,CAAA;AAC3C,MAAA,OAAO,QAAA;AAAA,IACT,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAA,GAA0B;AACxB,IAAA,OAAO,KAAK,aAAA,KAAkB,MAAA;AAAA,EAChC;AACF,CAAA;ACxGO,IAAM,aAAA,GAAN,MAAM,cAAA,CAAc;AAAA,EACjB,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,SAAS,OAAA,EAAuB;AAC9B,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,OAAA,EAAuB;AACjC,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,IAC3C,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAI,KAAA,CAAM,KAAA,CAAM,CAAA,OAAA,EAAK,OAAO,EAAE,CAAC,CAAA;AAAA,IACzC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,OAAA,EAAuB;AAC/B,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAO,CAAC,CAAA;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,GAAA,CAAI,CAAA,OAAA,EAAK,OAAO,EAAE,CAAC,CAAA;AAAA,IACzC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,OAAA,EAAuB;AACjC,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,KAAA,CAAM,MAAA,CAAO,CAAA,cAAA,EAAO,OAAO,EAAE,CAAC,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,IAAA,EAAuB;AAClC,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,IAAA,CAAK,OAAA,GAAU,GAAA,CAAI,IAAI,CAAA,CAAE,KAAA,EAAM;AAAA,IACjC;AACA,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,QAAA,EAAqC;AACzC,IAAA,OAAO,IAAI,cAAA,EAAc;AAAA,EAC3B;AACF,CAAA;ACjFO,IAAM,gBAAN,MAAoB;AAAA,EACjB,UAAA;AAAA;AAAA;AAAA;AAAA,EAKR,WAAA,GAAc;AAEZ,IAAA,IAAI,IAAA,CAAK,iBAAgB,EAAG;AAC1B,MAAA,IAAA,CAAK,aAAaC,IAAAA,CAAK;AAAA,QACrB,KAAA,EAAO,OAAA;AAAA,QACP,SAAA,EAAW;AAAA,UACT,MAAA,EAAQ,aAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,QAAA,EAAU,IAAA;AAAA,YACV,aAAA,EAAe,UAAA;AAAA,YACf,MAAA,EAAQ;AAAA;AACV;AACF,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,GAA2B;AACjC,IAAA,OAAO,OAAA;AAAA,MACL,OAAA,CAAQ,GAAA,CAAI,iBAAA,IACZ,OAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,IAC/B,OAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,IAAI;AAAA,KAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,CAAM,IAAA,EAAc,OAAA,GAAsB,EAAC,EAAS;AAClD,IAAA,IAAA,CAAK,YAAY,KAAA,CAAM,EAAE,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAA,CAAK,IAAA,EAAc,OAAA,GAAsB,EAAC,EAAS;AACjD,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,EAAE,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,CAAM,KAAA,EAAc,OAAA,GAAsB,EAAC,EAAS;AAClD,IAAA,IAAA,CAAK,YAAY,KAAA,CAAM;AAAA,MACrB,IAAA,EAAM,OAAA;AAAA,MACN,OAAO,KAAA,CAAM,OAAA;AAAA,MACb,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAA,GAAqB;AACnB,IAAA,OAAO,KAAK,UAAA,KAAe,MAAA;AAAA,EAC7B;AACF,CAAA;;;ACpEO,IAAM,YAAA,GAAN,MAAM,aAAA,CAA+B;AAAA,EAClC,UAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,YAAY,WAAA,EAAsB;AAChC,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW,WAAW,CAAA;AAC5C,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,aAAA,EAAc;AACvC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,aAAA,EAAc;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,OAAA,EAAuB;AAC9B,IAAA,IAAA,CAAK,aAAA,CAAc,SAAS,OAAO,CAAA;AAEnC,IAAA,IAAA,CAAK,WAAW,KAAA,CAAM,WAAA,EAAa,EAAE,OAAA,EAAS,IAAA,EAAM,QAAQ,CAAA;AAC5D,IAAA,IAAA,CAAK,cAAc,KAAA,CAAM,WAAA,EAAa,EAAE,OAAA,EAAS,IAAA,EAAM,QAAQ,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,OAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,aAAA,CAAc,YAAY,OAAO,CAAA;AAEtC,IAAA,IAAA,CAAK,WAAW,KAAA,CAAM,cAAA,EAAgB,EAAE,OAAA,EAAS,IAAA,EAAM,WAAW,CAAA;AAClE,IAAA,IAAA,CAAK,cAAc,KAAA,CAAM,cAAA,EAAgB,EAAE,OAAA,EAAS,IAAA,EAAM,WAAW,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,OAAA,EAAuB;AAC/B,IAAA,IAAA,CAAK,aAAA,CAAc,UAAU,OAAO,CAAA;AAEpC,IAAA,IAAA,CAAK,UAAA,CAAW,MAAM,IAAI,KAAA,CAAM,OAAO,CAAA,EAAG,EAAE,IAAA,EAAM,YAAA,EAAc,CAAA;AAChE,IAAA,IAAA,CAAK,aAAA,CAAc,MAAM,IAAI,KAAA,CAAM,OAAO,CAAA,EAAG,EAAE,IAAA,EAAM,YAAA,EAAc,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,OAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,aAAA,CAAc,YAAY,OAAO,CAAA;AAEtC,IAAA,IAAA,CAAK,WAAW,KAAA,CAAM,cAAA,EAAgB,EAAE,OAAA,EAAS,IAAA,EAAM,WAAW,CAAA;AAClE,IAAA,IAAA,CAAK,cAAc,KAAA,CAAM,cAAA,EAAgB,EAAE,OAAA,EAAS,IAAA,EAAM,WAAW,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,CAAM,IAAA,EAAc,OAAA,GAAsB,EAAC,EAAS;AAClD,IAAA,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,IAAA,EAAM,OAAO,CAAA;AACnC,IAAA,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,IAAA,EAAM,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAA,CAAK,IAAA,EAAc,OAAA,GAAsB,EAAC,EAAS;AACjD,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,CAAM,KAAA,EAAc,OAAA,GAAsB,EAAC,EAAS;AAClD,IAAA,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,KAAA,EAAO,OAAO,CAAA;AACpC,IAAA,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,KAAA,EAAO,OAAO,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,KAAA,EAA6B;AACtC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,UAAA,CAAW,KAAK,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAA,EAA6B;AAGjC,IAAA,MAAM,WAAA,GAAc,IAAI,aAAA,EAAa;AAErC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,UAAA,EAAW;AACrD,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,WAAA,CAAY,aAAA,GAAgB,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,OAAO,CAAA;AAAA,IAC9D;AACA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,IAAA,EAAuB;AAClC,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,YAAA,CAAa,IAAI,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,cAAc,UAAA,EAAW;AAAA,EACvC;AACF,CAAA;;;ACtIO,IAAM,MAAA,GAAS,IAAI,YAAA,EAAa;;;ACLhC,IAAM,uBAAuB,MAAM;AACxC,EAAA,OAAO;AAAA,IACL,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,YAAA,EAAoC;AAAA,IACjE,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA;AAAgC,GAC3D;AACF,CAAA;;;ACLO,IAAM,eAAe,OAA2B;AAAA,EACrD,iBAAA,EAAmB,sBAAA;AAAA,EACnB,mBAAA,EACE,oEAAA;AAAA,EACF,kBAAA,EAAoB,CAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAwBtB,CAAA,CAAA;ACrCA,IAAM,oBAAA,GACJ,mEAAA;AACF,IAAM,iBAAA,GAAoB,gCAAA;AAcnB,IAAM,QAAQ,OAAO;AAAA,EAC1B;AACF,CAAA,KAEqB;AACnB,EAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,IAChB,SAAA,CAAU;AAAA,MACR,GAAA,EAAK,oBAAA;AAAA,MACL,UAAA,EAAiBC,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,cAAc,CAAA;AAAA,MACjD,UACE,wDAAA,GACA;AAAA,KACH,CAAA;AAAA,IACD,SAAA,CAAU;AAAA,MACR,GAAA,EAAK,iBAAA;AAAA,MACL,UAAA,EAAiBA,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,UAAU,CAAA;AAAA,MAC7C,UACE,8DAAA,GACA;AAAA,KACH;AAAA,GACF,CAAA;AACH,CAAA;AAEA,IAAM,YAAY,OAAO;AAAA,EACvB,GAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,KAIqB;AACnB,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAG,CAAA;AAChC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IAC3D;AACA,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AACpC,IAAA,MAASC,GAAA,CAAA,SAAA,CAAU,YAAY,OAAO,CAAA;AAAA,EACxC,CAAA,CAAA,MAAQ;AACN,IAAA,MAAA,CAAO,WAAA,CAAY,CAAA,gBAAA,EAAmB,GAAG,CAAA,gBAAA,CAAkB,CAAA;AAC3D,IAAA,MAASA,GAAA,CAAA,SAAA,CAAU,YAAY,QAAQ,CAAA;AAAA,EACzC;AACF,CAAA;;;ACvDO,IAAM,qBAAA,GAA2C;AAAA,EACtD,EAAA,EAAI,MAAA;AAAA,EACJ,WAAA,EAAa,MAAA;AAAA,EACb,QAAA,EAAU,QAAA;AAAA,EAEV,YAAA;AAAA,EACA,cAAc,MAAM,IAAA;AAAA,EACpB;AACF,CAAA;;;ACHO,IAAMC,gBAAe,OAA2B;AAAA,EACrD,iBAAA,EAAmB,4BAAA;AAAA,EACnB,mBAAA,EACE,kEAAA;AAAA,EACF,kBAAA,EAAoB,CAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAwBtB,CAAA,CAAA;;;AC7BO,IAAM,eAAe,OAAwB;AAAA,EAClD,IAAA,EAAM,OAAA;AAAA,EACN,OAAA,EAAS,KAAA;AAAA,EACT,IAAA,EAAM,CAAC,IAAA,EAAM,yBAAyB;AACxC,CAAA,CAAA;;;ACRO,IAAM,uBAAA,GAA6C;AAAA,EACxD,EAAA,EAAI,QAAA;AAAA,EACJ,WAAA,EAAa,QAAA;AAAA,EACb,QAAA,EAAU,YAAA;AAAA,EAEV,YAAA,EAAAA,aAAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAO,YAAY;AAAA,EAEnB;AACF,CAAA;;;AC8BA,IAAM,SAAA,GAA+C;AAAA,EACnD,IAAA,EAAM,qBAAA;AAAA,EACN,MAAA,EAAQ;AACV,CAAA;AAcO,IAAM,uBAAuB,CAAC;AAAA,EACnC;AACF,CAAA,KAEyB;AACvB,EAAA,MAAM,QAAA,GAAW,UAAU,SAAS,CAAA;AACpC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,SAAS,CAAA,CAAE,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,QAAA;AACT,CAAA;AAcO,IAAM,0BAA0B,CAAC;AAAA,EACtC;AACF,CAAA,KAE2B;AACzB,EAAA,OAAO,MAAA,CAAO,OAAO,SAAS,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,QAAQ,CAAA;AACvE,CAAA;;;AChFO,IAAM,wBAAwB,CAAC;AAAA,EACpC;AACF,CAAA,KAEM;AACJ,EAAA,OAAO,wBAAwB,EAAE,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,CAAC,QAAA,MAAc;AAAA,IAC9D,MAAM,QAAA,CAAS,WAAA;AAAA,IACf,OAAO,QAAA,CAAS;AAAA,GAClB,CAAE,CAAA;AACJ,CAAA;ACnBO,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAexB,OAAO,yBAAA,CACL,OAAA,EACA,IAAA,EACA,OAAA,EACM;AACN,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM;AAAA,MACtC,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,MAAM,IAAI,MAAM,CAAA,kBAAA,EAAqB,OAAO,KAAK,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IACzE;AAGA,IAAA,IAAI,MAAA,CAAO,WAAW,IAAA,EAAM;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,IAC5B;AAAA,EACF;AACF,CAAA;ACpCA,IAAM,SAAA,GAAY,UAAU,IAAI,CAAA;AAKzB,IAAM,WAAN,MAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAapB,aAAa,mBAAmB,OAAA,EAAmC;AACjE,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,CAAA,MAAA,EAAS,OAAO,CAAA,CAAE,CAAA;AAClC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACF,CAAA;;;AClBO,IAAM,6BAAA,GAAyD;AAAA,EACpE,EAAA,EAAI,aAAA;AAAA,EACJ,WAAA,EAAa,aAAA;AAAA,EACb,OAAA,EAAS,QAAA;AAAA,EAET,MAAM,WAAA,GAGH;AACD,IAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,kBAAA,CAAmB,QAAQ,CAAA;AAC5D,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,cAAA,EAAgB,YACZ,MAAA,GACA;AAAA,KACN;AAAA,EACF,CAAA;AAAA,EAEA,MAAM,cAAA,CAAe,EAAE,WAAA,EAAa,QAAO,EAAG;AAC5C,IAAA,MAAM,aAAA,GAAqBC,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,WAAW,CAAA;AACxD,IAAA,MAASC,cAAU,aAAA,EAAe,IAAA,CAAK,UAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAGjE,IAAA,MAAM,YAAA,GAAoBD,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,WAAW,CAAA;AACvD,IAAA,MAAM,eAAA,GAAkB,CAAA;AAAA,CAAA;AACxB,IAAA,MAASC,GAAA,CAAA,SAAA,CAAU,cAAc,eAAe,CAAA;AAAA,EAClD,CAAA;AAAA,EAEA,MAAM,MAAA,CAAO;AAAA,IACX,WAAA;AAAA,IACA;AAAA,GACF,EAGkB;AAChB,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,QAAA,CAAS,CAAA,oBAAA,EAAgB,IAAA,CAAK,WAAW,CAAA,GAAA,CAAK,CAAA;AAGrD,MAAA,YAAA,CAAa,yBAAA,CAA0B,QAAA,EAAU,CAAC,MAAM,CAAA,EAAG;AAAA,QACzD,GAAA,EAAK;AAAA,OACN,CAAA;AACD,MAAA,MAAA,CAAO,YAAY,mBAAmB,CAAA;AAAA,IACxC,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,MAAA,CAAO,UAAU,CAAA,iBAAA,EAAoB,IAAA,CAAK,WAAW,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC3E;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF,CAAA;ACpDO,IAAM,6BAAA,GAAyD;AAAA,EACpE,EAAA,EAAI,QAAA;AAAA,EACJ,WAAA,EAAa,QAAA;AAAA,EACb,OAAA,EAAS,EAAA;AAAA,EAET,MAAM,WAAA,GAGH;AAED,IAAA,OAAO,EAAE,WAAW,IAAA,EAAK;AAAA,EAC3B,CAAA;AAAA,EAEA,MAAM,cAAA,CAAe,EAAE,WAAA,EAAa,QAAO,EAAG;AAE5C,IAAA,MAAM,SAAA,GAAiBC,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,SAAS,CAAA;AAClD,IAAA,MAASC,GAAA,CAAA,KAAA,CAAM,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAG7C,IAAA,MAAM,aAAA,GAAqBD,KAAA,CAAA,IAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AACrD,IAAA,MAASC,cAAU,aAAA,EAAe,IAAA,CAAK,UAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EACnE,CAAA;AAAA,EAEA,MAAM,MAAA,CAAO;AAAA,IACX;AAAA,GACF,EAGkB;AAEhB,IAAA,MAAA,CAAO,YAAY,uBAAuB,CAAA;AAC1C,IAAA,MAAA,CAAO,SAAS,kBAAkB,CAAA;AAClC,IAAA,MAAA,CAAO,QAAA,CAAS,CAAA,sBAAA,EAAyB,WAAW,CAAA,CAAE,CAAA;AACtD,IAAA,MAAA,CAAO,SAAS,wDAAwD,CAAA;AAAA,EAC1E;AACF,CAAA;ACjCO,IAAM,+BAAA,GAA2D;AAAA,EACtE,EAAA,EAAI,UAAA;AAAA,EACJ,WAAA,EAAa,cAAA;AAAA,EACb,OAAA,EAAS,UAAA;AAAA,EAET,MAAM,WAAA,GAGH;AACD,IAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,kBAAA,CAAmB,UAAU,CAAA;AAC9D,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,cAAA,EAAgB,YAAY,MAAA,GAAY;AAAA,KAC1C;AAAA,EACF,CAAA;AAAA,EAEA,MAAM,cAAA,CAAe,EAAE,WAAA,EAAa,QAAO,EAAG;AAC5C,IAAA,MAAM,aAAA,GAAqBC,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,WAAW,CAAA;AACxD,IAAA,MAASC,cAAU,aAAA,EAAe,IAAA,CAAK,UAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EACnE,CAAA;AAAA,EAEA,MAAM,MAAA,CAAO;AAAA,IACX,WAAA;AAAA,IACA;AAAA,GACF,EAGkB;AAChB,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,QAAA,CAAS,CAAA,oBAAA,EAAgB,IAAA,CAAK,WAAW,CAAA,GAAA,CAAK,CAAA;AAGrD,MAAA,YAAA,CAAa,yBAAA,CAA0B,UAAA,EAAY,CAAC,IAAA,EAAM,MAAM,CAAA,EAAG;AAAA,QACjE,GAAA,EAAK;AAAA,OACN,CAAA;AACD,MAAA,MAAA,CAAO,YAAY,mBAAmB,CAAA;AAAA,IACxC,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,MAAA,CAAO,SAAA;AAAA,UACL,CAAA,iBAAA,EAAoB,IAAA,CAAK,WAAW,CAAA,EAAA,EAAK,MAAM,OAAO,CAAA;AAAA,SACxD;AAAA,MACF;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF,CAAA;AC9CO,IAAM,2BAAA,GAAuD;AAAA,EAClE,EAAA,EAAI,MAAA;AAAA,EACJ,WAAA,EAAa,gCAAA;AAAA,EACb,OAAA,EAAS,EAAA;AAAA,EAET,MAAM,WAAA,GAGH;AAED,IAAA,OAAO,EAAE,WAAW,IAAA,EAAK;AAAA,EAC3B,CAAA;AAAA,EAEA,MAAM,cAAA,CAAe,EAAE,WAAA,EAAa,QAAO,EAAG;AAE5C,IAAA,MAAM,aAAA,GAAqB,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,WAAW,CAAA;AACxD,IAAA,MAAS,cAAU,aAAA,EAAe,IAAA,CAAK,UAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAGjE,IAAA,MAAM,SAAA,GAAiB,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,SAAS,CAAA;AAClD,IAAA,MAAS,GAAA,CAAA,KAAA,CAAM,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAC7C,IAAA,MAAM,aAAA,GAAqB,KAAA,CAAA,IAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AACrD,IAAA,MAAS,cAAU,aAAA,EAAe,IAAA,CAAK,UAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAGjE,IAAA,MAAM,YAAA,GAAoB,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,WAAW,CAAA;AACvD,IAAA,MAAM,eAAA,GAAkB,CAAA;AAAA,CAAA;AACxB,IAAA,MAAS,GAAA,CAAA,SAAA,CAAU,cAAc,eAAe,CAAA;AAAA,EAClD,CAAA;AAAA,EAEA,MAAM,OAAO,OAAA,EAGK;AAEhB,IAAA,MAAA,CAAO,QAAA;AAAA,MACL;AAAA,KACF;AAAA,EACF;AACF,CAAA;;;ACGA,IAAMC,UAAAA,GAAqD;AAAA,EACzD,QAAA,EAAU,+BAAA;AAAA,EACV,aAAA,EAAe,6BAAA;AAAA,EACf,MAAA,EAAQ,6BAAA;AAAA,EACR,IAAA,EAAM;AACR,CAAA;AAcO,IAAM,6BAA6B,CAAC;AAAA,EACzC;AACF,CAAA,KAE+B;AAC7B,EAAA,MAAM,QAAA,GAAWA,WAAU,SAAS,CAAA;AACpC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,SAAS,CAAA,CAAE,CAAA;AAAA,EACrE;AACA,EAAA,OAAO,QAAA;AACT,CAAA;AAYO,IAAM,yBAAyB,MAAiC;AACrE,EAAA,OAAO,MAAA,CAAO,OAAOA,UAAS,CAAA;AAChC,CAAA;;;AC1FO,IAAM,uBAAN,MAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYhC,aAAa,qBAAA,GAA0D;AACrE,IAAA,MAAM,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAC5D,QAAA,CAAS,mBAAmB,QAAQ,CAAA;AAAA,MACpC,QAAA,CAAS,mBAAmB,cAAc,CAAA;AAAA,MAC1C,QAAA,CAAS,mBAAmB,UAAU;AAAA,KACvC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,SAAA;AAAA,MACf,MAAA,EAAQ,SAAA;AAAA,MACR,QAAA,EAAU,WAAA;AAAA,MACV,IAAA,EAAM;AAAA;AAAA,KACR;AAAA,EACF;AACF,CAAA;;;ACNO,IAAM,8BAA8B,YAA+B;AACxE,EAAA,MAAM,aAAa,sBAAA,EAAuB;AAC1C,EAAA,MAAM,YAAA,GAAe,MAAM,oBAAA,CAAqB,qBAAA,EAAsB;AAEtE,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,MAAM,eAAyB,EAAC;AAEhC,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,SAAA,CAAU,EAAE,CAAA;AAC7C,IAAA,MAAM,MAAA,GAAiB;AAAA,MACrB,IAAA,EAAM,cACF,SAAA,CAAU,WAAA,GACVC,MAAM,IAAA,CAAK,CAAA,EAAG,SAAA,CAAU,WAAW,CAAA,gBAAA,CAAkB,CAAA;AAAA,MACzD,OAAO,SAAA,CAAU;AAAA,KACnB;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,SAAA,CAAU,KAAK,MAAM,CAAA;AAAA,IACvB,CAAA,MAAO;AACL,MAAA,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,OAAO,CAAC,GAAG,SAAA,EAAW,GAAG,YAAY,CAAA;AACvC,CAAA;;;AC5CO,IAAM,cAAA,GAAsC;AAAA,EACjD,EAAA,EAAI,QAAA;AAAA,EACJ,WAAA,EAAa,QAAA;AAAA,EACb,SAAA,EAAW,sCAAA;AAAA,EAEX,eAAA,EAAiB,CAAC,EAAE,MAAA,EAAO,KAAM;AAAA,IAC/B,EAAE,GAAA,EAAK,gBAAA,EAAkB,KAAA,EAAO,MAAA;AAAO;AAE3C,CAAA;;;ACRO,IAAM,iBAAA,GAAyC;AAAA,EACpD,EAAA,EAAI,WAAA;AAAA,EACJ,WAAA,EAAa,oBAAA;AAAA,EACb,SAAA,EAAW,6CAAA;AAAA,EAEX,eAAA,EAAiB,CAAC,EAAE,MAAA,EAAO,KAAM;AAAA,IAC/B,EAAE,GAAA,EAAK,mBAAA,EAAqB,KAAA,EAAO,MAAA;AAAO;AAE9C,CAAA;;;ACRO,IAAM,cAAA,GAAsC;AAAA,EACjD,EAAA,EAAI,QAAA;AAAA,EACJ,WAAA,EAAa,eAAA;AAAA,EACb,SAAA,EAAW,wCAAA;AAAA,EAEX,eAAA,EAAiB,CAAC,EAAE,MAAA,EAAO,KAAM;AAAA,IAC/B,EAAE,GAAA,EAAK,gBAAA,EAAkB,KAAA,EAAO,MAAA,EAAO;AAAA,IACvC,EAAE,GAAA,EAAK,gBAAA,EAAkB,KAAA,EAAO,MAAA;AAAO;AAE3C,CAAA;;;ACRO,IAAM,eAAA,GAAuC;AAAA,EAClD,EAAA,EAAI,SAAA;AAAA,EACJ,WAAA,EAAa,aAAA;AAAA,EACb,SAAA,EAAW,+DAAA;AAAA,EAEX,qBAAA,EAAuB;AAAA,IACrB;AAAA,MACE,GAAA,EAAK,cAAA;AAAA,MACL,KAAA,EAAO,uBAAA;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,EAAA,EAAI;AAC/B,UAAA,OAAO,mCAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MACL,KAAA,EAAO,8BAAA;AAAA,MACP,IAAA,EAAM,MAAA;AAAA,MACN,YAAA,EAAc,WAAA;AAAA,MACd,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC9B,UAAA,OAAO,wBAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AACF,GACF;AAAA,EAEA,eAAA,EAAiB,CAAC,EAAE,MAAA,EAAQ,kBAAiB,KAAM;AACjD,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,EAAE,GAAA,EAAK,mBAAA,EAAqB,KAAA,EAAO,MAAA;AAAO,KAC5C;AAEA,IAAA,IAAI,kBAAkB,YAAA,EAAc;AAClC,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,GAAA,EAAK,uBAAA;AAAA,QACL,OAAO,gBAAA,CAAiB;AAAA,OACzB,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,kBAAkB,SAAA,EAAW;AAC/B,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,GAAA,EAAK,YAAA;AAAA,QACL,OAAO,gBAAA,CAAiB;AAAA,OACzB,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AACF,CAAA;;;ACrDO,IAAM,kBAAA,GAA0C;AAAA,EACrD,EAAA,EAAI,YAAA;AAAA,EACJ,WAAA,EAAa,YAAA;AAAA,EACb,SAAA,EAAW,4BAAA;AAAA,EAEX,eAAA,EAAiB,CAAC,EAAE,MAAA,EAAO,KAAM;AAAA,IAC/B,EAAE,GAAA,EAAK,oBAAA,EAAsB,KAAA,EAAO,MAAA;AAAO;AAE/C,CAAA;;;ACRO,IAAM,YAAA,GAAoC;AAAA,EAC/C,EAAA,EAAI,MAAA;AAAA,EACJ,WAAA,EAAa,YAAA;AAAA,EACb,SAAA,EAAW,2BAAA;AAAA,EAEX,eAAA,EAAiB,CAAC,EAAE,MAAA,EAAO,KAAM;AAAA,IAC/B,EAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,MAAA;AAAO;AAExC,CAAA;;;ACqCA,IAAMD,UAAAA,GAAiD;AAAA,EACrD,MAAA,EAAQ,cAAA;AAAA,EACR,SAAA,EAAW,iBAAA;AAAA,EACX,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA,EAAS,eAAA;AAAA,EACT,UAAA,EAAY,kBAAA;AAAA,EACZ,IAAA,EAAM;AACR,CAAA;AAcO,IAAM,iBAAiB,CAAC;AAAA,EAC7B;AACF,CAAA,KAE2B;AACzB,EAAA,MAAM,WAAA,GAAcA,WAAU,QAAQ,CAAA;AACtC,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,QAAQ,CAAA,CAAE,CAAA;AAAA,EACvD;AACA,EAAA,OAAO,WAAA;AACT,CAAA;AAYO,IAAM,qBAAqB,MAA6B;AAC7D,EAAA,OAAO,MAAA,CAAO,OAAOA,UAAS,CAAA;AAChC,CAAA;;;ACnFO,IAAM,iBAAA,GAAoB,CAAC,KAAA,KAAiC;AACjE,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACvC,IAAA,OAAO,qBAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,KAAK,CAAA,EAAG;AAC5B,IAAA,OAAO,wCAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT,CAAA;;;ACRO,IAAM,oBAAA,GAAuB,CAAC,KAAA,KAAiC;AACpE,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACvC,IAAA,OAAO,+BAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC/B,IAAA,OAAO,8CAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT,CAAA;;;ACRO,IAAM,mBAAA,GAAsB,CAAC,KAAA,KAAiC;AACnE,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACvC,IAAA,OAAO,wCAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT,CAAA;;;ACYO,IAAM,gBAAgB,YAAoC;AAC/D,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,QAAA;AAAA,MACL;AAAA,KACF;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO;AAAA,MAC5B,OAAA,EAAS,+CAAA;AAAA,MACT,SAAS,oBAAA;AAAqB,KAC/B,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAuB;AAAA,MAC7C,OAAA,EAAS,0CAAA;AAAA,MACT,OAAA,EAAS,qBAAA,CAAsB,EAAE,QAAA,EAAU;AAAA,KAC5C,CAAA;AAED,IAAA,MAAM,eAAe,kBAAA,EAAmB;AACxC,IAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAoB;AAAA,MAC5C,OAAA,EAAS,+CAAA;AAAA,MACT,OAAA,EAAS,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAChC,MAAM,CAAA,CAAE,WAAA;AAAA,QACR,OAAO,CAAA,CAAE;AAAA,OACX,CAAE;AAAA,KACH,CAAA;AAED,IAAA,MAAM,mBAAmB,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,WAAW,CAAA;AACtE,IAAA,MAAM,mBAAA,GAAsB,kBAAkB,WAAA,IAAe,WAAA;AAE7D,IAAA,IAAI,kBAAkB,SAAA,EAAW;AAC/B,MAAA,MAAA,CAAO,QAAA,CAAS,CAAA,YAAA,EAAe,mBAAmB,CAAA,gBAAA,CAAkB,CAAA;AACpE,MAAA,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,gBAAA,CAAiB,SAAS,CAAA,CAAE,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS;AAAA,MAC/B,OAAA,EAAS,cAAc,mBAAmB,CAAA,SAAA,CAAA;AAAA,MAC1C,IAAA,EAAM,GAAA;AAAA,MACN,QAAA,EACE,WAAA,KAAgB,QAAA,GACZ,iBAAA,GACA,CAAC,KAAA,KAAU;AACT,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC9B,UAAA,OAAO,uDAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACP,CAAA;AAGD,IAAA,IAAI,mBAAA;AACJ,IAAA,IACE,gBAAA,EAAkB,qBAAA,IAClB,gBAAA,CAAiB,qBAAA,CAAsB,SAAS,CAAA,EAChD;AACA,MAAA,mBAAA,GAAsB,EAAC;AAEvB,MAAA,KAAA,MAAW,UAAA,IAAc,iBAAiB,qBAAA,EAAuB;AAC/D,QAAA,IAAI,UAAA,CAAW,SAAS,UAAA,EAAY;AAClC,UAAA,mBAAA,CAAoB,UAAA,CAAW,GAAG,CAAA,GAAI,MAAM,QAAA,CAAS;AAAA,YACnD,OAAA,EAAS,CAAA,WAAA,EAAc,UAAA,CAAW,KAAK,CAAA,CAAA,CAAA;AAAA,YACvC,IAAA,EAAM,GAAA;AAAA,YACN,UAAU,UAAA,CAAW;AAAA,WACtB,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,mBAAA,CAAoB,UAAA,CAAW,GAAG,CAAA,GAAI,MAAM,KAAA,CAAM;AAAA,YAChD,OAAA,EAAS,CAAA,WAAA,EAAc,UAAA,CAAW,KAAK,CAAA,CAAA,CAAA;AAAA,YACvC,SAAS,UAAA,CAAW,YAAA;AAAA,YACpB,UAAU,UAAA,CAAW;AAAA,WACtB,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,eAAA,GAAkB,MAAM,MAAA,CAAwB;AAAA,MACpD,OAAA,EACE,iEAAA;AAAA,MACF,OAAA,EAAS,MAAM,2BAAA;AAA4B,KAC5C,CAAA;AAGD,IAAA,MAAM,2BAA2B,sBAAA,EAAuB;AACxD,IAAA,MAAM,yBAAyB,wBAAA,CAAyB,IAAA;AAAA,MACtD,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO;AAAA,KAClB;AAEA,IAAA,IAAI,sBAAA,EAAwB;AAC1B,MAAA,IAAI,YAAA,GAAe,MAAM,sBAAA,CAAuB,WAAA,EAAY;AAC5D,MAAA,IAAI,CAAC,YAAA,CAAa,SAAA,IAAa,YAAA,CAAa,cAAA,EAAgB;AAC1D,QAAA,MAAA,CAAO,WAAA;AAAA,UACL,CAAA,EAAG,uBAAuB,WAAW,CAAA,kBAAA;AAAA,SACvC;AACA,QAAA,MAAA,CAAO,SAAS,CAAA,mBAAA,CAAqB,CAAA;AACrC,QAAA,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,YAAA,CAAa,cAAc,CAAA,CAAE,CAAA;AAEhD,QAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ;AAAA,UAClC,OAAA,EAAS,0CAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACV,CAAA;AAED,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,MAAA,CAAO,SAAS,eAAe,CAAA;AAC/B,UAAA,IAAI;AACF,YAAA,MAAM,IAAI,OAAA,CAAc,CAACE,QAAAA,EAAS,MAAA,KAAW;AAC3C,cAAA,MAAM,CAAC,KAAK,GAAG,IAAI,IAAI,YAAA,CAAa,cAAA,CAAgB,MAAM,GAAG,CAAA;AAC7D,cAAA,MAAM,QAAQ,KAAA,CAAM,GAAA,EAAK,MAAM,EAAE,KAAA,EAAO,WAAW,CAAA;AAEnD,cAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAiB;AAClC,gBAAA,IAAI,SAAS,CAAA,EAAG;AACd,kBAAAA,QAAAA,EAAQ;AAAA,gBACV,CAAA,MAAO;AACL,kBAAA,MAAA;AAAA,oBACE,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,IAAI,CAAA,CAAE;AAAA,mBACxD;AAAA,gBACF;AAAA,cACF,CAAC,CAAA;AAED,cAAA,KAAA,CAAM,EAAA,CAAG,SAAS,MAAM,CAAA;AAAA,YAC1B,CAAC,CAAA;AAGD,YAAA,YAAA,GAAe,MAAM,uBAAuB,WAAA,EAAY;AACxD,YAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,cAAA,MAAA,CAAO,WAAA;AAAA,gBACL,CAAA,EAAG,uBAAuB,WAAW,CAAA,wBAAA;AAAA,eACvC;AAAA,YACF,CAAA,MAAO;AACL,cAAA,MAAA,CAAO,SAAA;AAAA,gBACL;AAAA,eACF;AAAA,YACF;AAAA,UACF,SAAS,KAAA,EAAO;AACd,YAAA,MAAA,CAAO,SAAA;AAAA,cACL,CAAA,qBAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAC3C,CAAA;AAAA,aACF;AACA,YAAA,MAAA,CAAO,SAAS,iCAAiC,CAAA;AAAA,UACnD;AAAA,QACF,CAAA,MAAO;AAAA,QAEP;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,SAAS,wEAA8D,CAAA;AAE9E,IAAA,MAAA,CAAO,SAAS,uCAAuC,CAAA;AACvD,IAAA,MAAA,CAAO,SAAS,oCAAoC,CAAA;AAEpD,IAAA,MAAM,eAAA,GAAkB,MAAM,QAAA,CAAS;AAAA,MACrC,OAAA,EACE,iGAAA;AAAA,MACF,IAAA,EAAM,GAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,MAAA,CAAO,SAAS,iDAAiD,CAAA;AACjE,IAAA,MAAA,CAAO,SAAS,sCAAsC,CAAA;AACtD,IAAA,MAAA,CAAO,QAAA;AAAA,MACL;AAAA,KACF;AAEA,IAAA,MAAM,cAAA,GAAiB,MAAM,QAAA,CAAS;AAAA,MACpC,OAAA,EAAS,+DAAA;AAAA,MACT,IAAA,EAAM,GAAA;AAAA,MACN,QAAA,EAAU,CAAC,KAAA,KAAU;AAEnB,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,OAAW,EAAA,EAAI;AACjC,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI,KAAA,CAAM,SAAS,EAAA,EAAI;AACrB,UAAA,OAAO,iDAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACD,CAAA;AAED,IAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM;AAAA,MAC9B,OAAA,EAAS,iCAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,mBAAA;AAAA,MACA,eAAA;AAAA,MACA,gBACE,cAAA,IAAkB,cAAA,CAAe,IAAA,EAAK,KAAM,KACxC,cAAA,GACA,KAAA,CAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,mBAAmB,CAAA,EAAG;AACzE,MAAA,MAAA,CAAO,YAAY,yBAAyB,CAAA;AAC5C,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF,CAAA;ACvNO,IAAM,oBAAoB,OAAO;AAAA,EACtC,WAAA;AAAA,EACA;AACF,CAAA,KAGqB;AACnB,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,KAAc,QAAA,GAAW,KAAA,GAAQ,KAAA;AAEvD,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,MAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,MAASC,GAAA,CAAA,KAAA,CAAWC,WAAK,WAAA,EAAa,GAAG,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACjE;AACF,CAAA;ACnBO,IAAM,mBAAmB,OAAO;AAAA,EACrC,WAAA;AAAA,EACA;AACF,CAAA,KAGqB;AACnB,EAAA,MAAM,WAAW,cAAA,CAAe,EAAE,QAAA,EAAU,MAAA,CAAO,aAAa,CAAA;AAChE,EAAA,MAAM,OAAA,GAAU,SAAS,eAAA,CAAgB;AAAA,IACvC,QAAQ,MAAA,CAAO,SAAA;AAAA,IACf,kBAAkB,MAAA,CAAO;AAAA,GAC1B,CAAA;AAGD,EAAA,MAAM,eAAA,GAAkB;AAAA,IACtB,yBAAA;AAAA,IACA,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,MAAA,EAAS,CAAA,CAAE,GAAA,CAAI,WAAA,EAAa,CAAA,KAAA,CAAO,CAAA;AAAA,IACjE,EAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAEhD,EAAA,MAASC,GAAA,CAAA,SAAA,CAAeC,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,cAAc,GAAG,UAAU,CAAA;AAGrE,EAAA,MAAM,eAAA,GAAkB;AAAA,IACtB,yBAAA;AAAA,IACA,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IAC3C,EAAA;AAAA,IACA,aAAA;AAAA,IACA,CAAA,kBAAA,EAAqB,OAAO,eAAe,CAAA;AAAA,GAC7C;AACA,EAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAEhD,EAAA,MAASD,GAAA,CAAA,SAAA,CAAeC,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,MAAM,GAAG,UAAU,CAAA;AAC/D,CAAA;ACvCO,IAAM,oBAAoB,OAAO;AAAA,EACtC;AACF,CAAA,KAEqB;AACnB,EAAA,MAAM,gBAAA,GAAmB,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA0BzB,EAAA,MAASC,GAAA,CAAA,SAAA,CAAeC,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,YAAY,GAAG,gBAAgB,CAAA;AAC3E,CAAA;AChCO,IAAM,uBAAuB,OAAO;AAAA,EACzC;AACF,CAAA,KAEqB;AACnB,EAAA,MAAM,gBAAA,GAAmB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AASzB,EAAA,MAASC,GAAA,CAAA,SAAA;AAAA,IACFC,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,SAAA,EAAW,oBAAoB,CAAA;AAAA,IACtD;AAAA,GACF;AAEA,EAAA,MAASD,GAAA,CAAA,SAAA;AAAA,IACFC,KAAA,CAAA,IAAA,CAAK,aAAa,cAAc,CAAA;AAAA,IACrC,IAAA,CAAK,UAAU,EAAE,OAAA,EAAS,EAAC,EAAE,EAAG,MAAM,CAAC;AAAA,GACzC;AACF,CAAA;ACrBO,IAAM,2BAA2B,OAAO;AAAA,EAC7C,WAAA;AAAA,EACA;AACF,CAAA,KAGqB;AACnB,EAAA,MAAM,kBAAA,GAAqB;AAAA,IACzB,KAAA,EAAO;AAAA,MACL;AAAA,QACE,SAAA,EAAW,UAAA;AAAA,QACX,UAAU,EAAC;AAAA,QACX,MAAA,EAAQ;AAAA,UACN,uBAAA;AAAA,UACA,IAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,MACA;AAAA,QACE,SAAA,EAAW,MAAA;AAAA,QACX,eAAA,EAAiB,IAAA;AAAA,QACjB,UAAU,EAAC;AAAA,QACX,SAAS,EAAC;AAAA,QACV,MAAA,EAAQ;AAAA,UACN,yEAAA;AAAA,UACA;AAAA;AACF;AACF,KACF;AAAA,IACA,QAAA,EAAU;AAAA,MACR,UAAA,EAAY;AAAA,QACV,YAAA,EAAc,QAAA,KAAa,QAAA,GAAW,UAAA,GAAa,YAAA;AAAA,QACnD,QAAA;AAAA,QACA,IAAA,EAAM,QAAA,KAAa,QAAA,GAAW,SAAA,GAAY;AAAA;AAC5C,KACF;AAAA,IACA,QAAA,EAAU,CAAA;AAAA,IACV,cAAA,EAAgB;AAAA,GAClB;AAEA,EAAA,MAASC,GAAA,CAAA,SAAA;AAAA,IACFC,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,OAAA,EAAS,aAAA,EAAe,oBAAoB,CAAA;AAAA,IACnE,IAAA,CAAK,SAAA,CAAU,kBAAA,EAAoB,IAAA,EAAM,CAAC;AAAA,GAC5C;AACF,CAAA;AC5CO,IAAM,yBAAyB,OAAO;AAAA,EAC3C,WAAA;AAAA,EACA;AACF,CAAA,KAGqB;AACnB,EAAA,MAAM,GAAA,GAAM,QAAA,KAAa,QAAA,GAAW,IAAA,GAAO,IAAA;AAC3C,EAAA,MAAM,qBAAA,GACJ,aAAa,QAAA,GACT,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,CAAA,GAQA,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,CAAA;AASN,EAAA,MAASC,GAAA,CAAA,SAAA;AAAA,IACFC,KAAA,CAAA,IAAA;AAAA,MACH,WAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA;AAAA,MACA,yBAAyB,GAAG,CAAA;AAAA,KAC9B;AAAA,IACA;AAAA,GACF;AACF,CAAA;ACpCO,IAAM,yBAAyB,OAAO;AAAA,EAC3C,WAAA;AAAA,EACA;AACF,CAAA,KAGqB;AACnB,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,KAAc,QAAA,GAAW,KAAA,GAAQ,KAAA;AAEvD,EAAA,MAAM,eAAA,GACJ,MAAA,CAAO,QAAA,KAAa,QAAA,GAChB,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,CAAA,GAWA,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAYN,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,QAAA,KAAa,QAAA,GAAW,SAAA,GAAY,UAAA;AAChE,EAAA,MAASC,GAAA,CAAA,SAAA;AAAA,IACFC,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,MAAA,EAAQ,YAAY,CAAA;AAAA,IAC3C;AAAA,GACF;AACF,CAAA;;;AClCO,IAAM,yBAAyB,OAAO;AAAA,EAC3C,WAAA;AAAA,EACA;AACF,CAAA,KAGqB;AACnB,EAAA,MAAM,iBAAA,CAAkB,EAAE,WAAA,EAAa,MAAA,EAAQ,CAAA;AAE/C,EAAA,MAAM,gBAAA,CAAiB;AAAA,IACrB,WAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,iBAAA,CAAkB,EAAE,WAAA,EAAa,CAAA;AACvC,EAAA,MAAM,oBAAA,CAAqB,EAAE,WAAA,EAAa,CAAA;AAC1C,EAAA,MAAM,yBAAyB,EAAE,WAAA,EAAa,QAAA,EAAU,MAAA,CAAO,UAAU,CAAA;AACzE,EAAA,MAAM,uBAAuB,EAAE,WAAA,EAAa,QAAA,EAAU,MAAA,CAAO,UAAU,CAAA;AACvE,EAAA,MAAM,sBAAA,CAAuB,EAAE,WAAA,EAAa,MAAA,EAAQ,CAAA;AACtD,CAAA;;;AC3BO,IAAM,oBAAA,GAAuB,CAAC,EAAE,MAAA,EAAO,KAAyC;AACrF,EAAA,MAAM,EAAE,WAAA,EAAa,SAAA,EAAW,QAAA,EAAS,GAAI,MAAA;AAE7C,EAAA,OAAO,CAAA;;AAAA;;AAAA,UAAA,EAIG,WAAW;;AAAA,eAAA,EAEN,SAAA,KAAc,MAAA,GAAS,MAAA,GAAS,QAAQ;AAAA,cAAA,EACzC,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW,YAAY;;AAAA;;AAAA;AAAA,CAAA;AAM/D,CAAA;;;ACpBO,IAAM,yBAAyB,MAAc;AAClD,EAAA,OAAO,CAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAsGT,CAAA;;;ACnGO,IAAM,oBAAA,GAAuB,CAAC,EAAE,MAAA,EAAO,KAAyC;AACrF,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,KAAc,QAAA,GAAW,KAAA,GAAQ,KAAA;AACvD,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,KAAa,QAAA,GAAW,IAAA,GAAO,IAAA;AAElD,EAAA,OAAO,CAAA;;AAAA;;AAAA;AAAA,IAAA,EAKH,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAA,EAOO,GAAG;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA,qDAAA,EA2DiC,MAAM,CAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA,EAW3D,MAAA,CAAO,SAAA,KAAc,MAAA,GAAS,kDAAA,GAAqD,oEAAoE;;AAAA;;AAAA;AAAA,CAAA;AAMzJ,CAAA;;;ACrFO,IAAM,mBAAmB,OAAO;AAAA,EACrC,WAAA;AAAA,EACA;AACF,CAAA,KAGqB;AACnB,EAAA,MAAM,oBAAoB,oBAAA,CAAqB;AAAA,IAC7C,WAAW,MAAA,CAAO;AAAA,GACnB,CAAA;AACD,EAAA,MAAM,kBAAA,GAAqB,kBAAkB,YAAA,EAAa;AAE1D,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,oBAAA,CAAqB,EAAE,MAAA,EAAQ,CAAA;AAAA,IAC/B,sBAAA,EAAuB;AAAA,IACvB,kBAAA,CAAmB,kBAAA;AAAA,IACnB,oBAAA,CAAqB,EAAE,MAAA,EAAQ;AAAA,GACjC,CAAE,KAAK,IAAI,CAAA;AAEX,EAAA,MAASC,GAAA,CAAA,SAAA,CAAeC,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,WAAW,GAAG,OAAO,CAAA;AACjE,CAAA;;;ACvBO,IAAM,iBAAiB,OAAO;AAAA,EACnC,WAAA;AAAA,EACA;AACF,CAAA,KAGqB;AACnB,EAAA,MAAM,SAAA,GAA2B;AAAA,IAC/B,YAAY;AAAC,GACf;AAGA,EAAA,SAAA,CAAU,WAAW,SAAA,GAAY;AAAA,IAC/B,OAAA,EAAS,KAAA;AAAA,IACT,IAAA,EAAM,CAAC,IAAA,EAAM,uBAAuB;AAAA,GACtC;AAGA,EAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,IAAA,SAAA,CAAU,WAAW,OAAA,GAAU;AAAA,MAC7B,OAAA,EAAS,KAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,IAAA;AAAA,QACA,sBAAA;AAAA,QACA,KAAA;AAAA,QACA,mBAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA,CAAO;AAAA;AACT,KACF;AAAA,EACF;AAGA,EAAA,MAAM,oBAAoB,oBAAA,CAAqB;AAAA,IAC7C,WAAW,MAAA,CAAO;AAAA,GACnB,CAAA;AACD,EAAA,MAAM,YAAA,GAAe,kBAAkB,YAAA,IAAe;AACtD,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,SAAA,CAAU,UAAA,CAAW,iBAAA,CAAkB,EAAE,CAAA,GAAI,YAAA;AAAA,EAC/C;AAGA,EAAA,MAAM,oBAAoB,0BAAA,CAA2B;AAAA,IACnD,WAAW,MAAA,CAAO;AAAA,GACnB,CAAA;AACD,EAAA,MAAM,kBAAkB,cAAA,CAAe,EAAE,WAAA,EAAa,MAAA,EAAQ,WAAW,CAAA;AAC3E,CAAA;;;ACnDO,IAAMzB,gBAAe,OAA0B;AAAA,EACpD,iBAAA,EAAmB,qEAAA;AAAA,EACnB,gBAAA,EAAkB,CAAC,KAAK,CAAA;AAAA,EACxB,aAAA,EAAe;AACjB,CAAA,CAAA;;;ACXO,IAAM,sBAAA,GAA2C;AAAA,EACtD,EAAA,EAAI,QAAA;AAAA,EACJ,WAAA,EAAa,QAAA;AAAA,EACb,YAAA,EAAAA;AACF,CAAA;;;ACGO,IAAMA,gBAAe,OAA0B;AAAA,EACpD,iBAAA,EAAmB,6EAAA;AAAA,EACnB,gBAAA,EAAkB,CAAC,KAAA,EAAO,MAAM,CAAA;AAAA,EAChC,aAAA,EAAe;AACjB,CAAA,CAAA;;;ACXO,IAAM,0BAAA,GAA+C;AAAA,EAC1D,EAAA,EAAI,YAAA;AAAA,EACJ,WAAA,EAAa,YAAA;AAAA,EACb,YAAA,EAAAA;AACF,CAAA;;;ACmBA,IAAMO,UAAAA,GAA8C;AAAA,EAClD,UAAA,EAAY,0BAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;AAcO,IAAM,sBAAsB,CAAC;AAAA,EAClC;AACF,CAAA,KAEwB;AACtB,EAAA,MAAM,QAAA,GAAWA,WAAU,QAAQ,CAAA;AACnC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,QAAQ,CAAA,CAAE,CAAA;AAAA,EAC5D;AACA,EAAA,OAAO,QAAA;AACT,CAAA;;;ACxCO,IAAM,qBAAqB,CAAC;AAAA,EACjC;AACF,CAAA,KAEc;AACZ,EAAA,MAAM,oBAAoB,oBAAA,CAAqB;AAAA,IAC7C,WAAW,MAAA,CAAO;AAAA,GACnB,CAAA;AACD,EAAA,MAAM,mBAAmB,mBAAA,CAAoB,EAAE,QAAA,EAAU,MAAA,CAAO,UAAU,CAAA;AAE1E,EAAA,MAAM,kBAAA,GAAqB,kBAAkB,YAAA,EAAa;AAC1D,EAAA,MAAM,iBAAA,GAAoB,iBAAiB,YAAA,EAAa;AAExD,EAAA,MAAM,YAAA,GAAe,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAMP,kBAAkB,iBAAiB;AAAA,GAAA,EAC9C,mBAAmB,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4CAAA,CAAA;AAgBzC,EAAA,OAAO,GAAG,YAAY;;AAAA,YAAA,EAAmB,OAAO,WAAW,CAAA,CAAA;AAC7D,CAAA;;;ACnCO,IAAM,mBAAmB,OAAO;AAAA,EACrC,WAAA;AAAA,EACA;AACF,CAAA,KAGqB;AACnB,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,EAAE,MAAA,EAAQ,CAAA;AAC5C,EAAA,MAAM,WAAW,0BAAA,CAA2B,EAAE,SAAA,EAAW,MAAA,CAAO,iBAAiB,CAAA;AAEjF,EAAA,MAAA,CAAO,YAAY,yBAAyB,CAAA;AAC5C,EAAA,MAAA,CAAO,SAAS,iBAAiB,CAAA;AACjC,EAAA,MAAA,CAAO,QAAA,CAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAG,CAAA;AAC7B,EAAA,MAAA,CAAO,QAAA,CAAS,CAAA,kBAAA,EAAqB,WAAW,CAAA,CAAE,CAAA;AAGlD,EAAA,MAAM,QAAA,CAAS,MAAA,CAAO,EAAE,WAAA,EAAa,QAAQ,CAAA;AAC/C,CAAA;;;ACrBA,IAAM,aAAa,MAAY;AAC7B,EAAA,MAAM,QAAA,GACJ;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA,CAAA;AAcF,EAAA,OAAA,CAAQ,GAAA,EAAI;AAEZ,EAAA,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAEpB,EAAA,OAAA,CAAQ,GAAA,EAAI;AACd,CAAA;AAeO,IAAM,WAAA,GAAc,OAAO,UAAA,EAAoB,KAAA,GAAQ,KAAA,KAAyB;AAErF,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAA,CAAQ,IAAI,iBAAA,GAAoB,MAAA;AAAA,EAClC;AAGA,EAAA,MAAMmB,OAAAA,GAAS,IAAI,YAAA,EAAa;AAEhC,EAAA,IAAI;AAEF,IAAA,UAAA,EAAW;AAEX,IAAA,MAAM,WAAA,GAAcA,OAAAA,CAAO,UAAA,CAAW,mBAAmB,CAAA;AACzD,IAAA,MAAM,MAAA,GAAwB,MAAM,aAAA,EAAc;AAClD,IAAA,WAAA,EAAY;AAEZ,IAAA,MAAM,YAAA,GAAoBC,KAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,UAAU,CAAA;AAG3D,IAAA,MAAM,aAAA,GAAgB,IAAI,YAAA,CAAa,YAAY,CAAA;AAGnD,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,YAAA,CAAa,kCAAkC,CAAA;AAE7E,IAAA,IAAI;AACF,MAAA,aAAA,CAAc,KAAK,cAAA,EAAgB;AAAA,QACjC,UAAA;AAAA,QACA,YAAA;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,iBAAiB,MAAA,CAAO,eAAA;AAAA,UACxB,aAAa,MAAA,CAAO,WAAA;AAAA,UACpB,aAAa,MAAA,CAAO,WAAA,CAAY,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,GAAI;AAAA;AAAA;AACtD,OACD,CAAA;AAED,MAAA,MAAM,UAAA,GAAa,aAAA,CAAc,UAAA,CAAW,oBAAoB,CAAA;AAChE,MAAA,MAASC,GAAA,CAAA,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,MAAA,UAAA,EAAW;AAEX,MAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,UAAA,CAAW,mBAAmB,CAAA;AACnE,MAAA,MAAM,sBAAA,CAAuB,EAAE,WAAA,EAAa,YAAA,EAAc,QAAQ,CAAA;AAClE,MAAA,cAAA,EAAe;AACf,MAAA,OAAA,CAAQ,IAAA,GAAO,2BAAA;AAGf,MAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,UAAA,CAAW,iBAAiB,CAAA;AACjE,MAAA,MAAM,oBAAoB,oBAAA,CAAqB;AAAA,QAC7C,WAAW,MAAA,CAAO;AAAA,OACnB,CAAA;AACD,MAAA,MAAM,iBAAA,CAAkB,KAAA,CAAM,EAAE,WAAA,EAAa,cAAc,CAAA;AAC3D,MAAA,cAAA,EAAe;AACf,MAAA,OAAA,CAAQ,IAAA,GAAO,gCAAA;AAGf,MAAA,MAAM,QAAA,GAAW,aAAA,CAAc,UAAA,CAAW,YAAY,CAAA;AACtD,MAAA,MAAM,cAAA,CAAe,EAAE,WAAA,EAAa,YAAA,EAAc,QAAQ,CAAA;AAC1D,MAAA,QAAA,EAAS;AACT,MAAA,OAAA,CAAQ,IAAA,GAAO,0BAAA;AAGf,MAAA,MAAM,WAAA,GAAc,aAAA,CAAc,UAAA,CAAW,cAAc,CAAA;AAC3D,MAAA,MAAM,gBAAA,CAAiB,EAAE,WAAA,EAAa,YAAA,EAAc,QAAQ,CAAA;AAC5D,MAAA,WAAA,EAAY;AACZ,MAAA,OAAA,CAAQ,IAAA,GAAO,qBAAA;AAEf,MAAA,OAAA,CAAQ,QAAQ,yBAAyB,CAAA;AAEzC,MAAA,aAAA,CAAc,YAAY,8BAA8B,CAAA;AACxD,MAAA,aAAA,CAAc,QAAA,CAAS,CAAA,kBAAA,EAAqB,YAAY,CAAA,CAAE,CAAA;AAE1D,MAAA,aAAA,CAAc,KAAK,gBAAA,EAAkB;AAAA,QACnC,WAAA,EAAa,YAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACV,CAAA;AAED,MAAA,MAAM,gBAAA,CAAiB,EAAE,WAAA,EAAa,YAAA,EAAc,QAAQ,CAAA;AAAA,IAC9D,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAK,0BAA0B,CAAA;AAEvC,MAAA,aAAA,CAAc,MAAM,KAAA,EAAgB;AAAA,QAClC,IAAA,EAAM,eAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACd,CAAA;AAED,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,MAAAF,OAAAA,CAAO,SAAA,CAAU,CAAA,OAAA,EAAU,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAAA,OAAAA,CAAO,UAAU,8BAA8B,CAAA;AAAA,IACjD;AACA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF,CAAA;;;AChJA,IAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAE5B,OAAA,CACG,IAAA,CAAK,eAAe,CAAA,CACpB,WAAA,CAAY,mFAAmF,CAAA,CAC/F,OAAA,CAAQ,OAAO,CAAA,CACf,MAAA,CAAO,aAAA,EAAe,kDAAkD,CAAA;AAE3E,OAAA,CACG,OAAA,CAAQ,MAAM,CAAA,CACd,WAAA,CAAY,gCAAgC,CAAA,CAC5C,QAAA,CAAS,QAAA,EAAU,gEAAA,EAAkE,GAAG,CAAA,CACxF,MAAA,CAAO,CAAC/B,QAAM,OAAA,KAAY;AAEzB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,EAAQ,KAAA,IAAS,KAAA;AACvC,EAAA,OAAO,WAAA,CAAYA,QAAM,KAAK,CAAA;AAChC,CAAC,CAAA;AAEH,OAAA,CAAQ,KAAA,EAAM","file":"index.js","sourcesContent":["import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport pino from 'pino';\nimport type { Logger as PinoLogger } from 'pino';\nimport type { LogContext } from './types.js';\n\n/**\n * Base logger responsible for structured JSON logging to files.\n *\n * This class follows the Single Responsibility Principle by handling\n * only structured logging operations and file management.\n *\n * @example\n * ```ts\n * const logger = new BaseLogger('/path/to/project');\n * logger.info('step-completed', { duration: 150 });\n * ```\n */\nexport class BaseLogger {\n private projectLogger?: PinoLogger;\n private timers = new Map<string, number>();\n\n /**\n * Creates a new base logger instance.\n * @param projectPath - Optional path to project for debug log file creation\n */\n constructor(projectPath?: string) {\n if (projectPath) {\n this.setupProjectLogging(projectPath);\n }\n }\n\n /**\n * Sets up project-specific JSON logging to a timestamped debug log file.\n */\n private async setupProjectLogging(projectPath: string): Promise<void> {\n try {\n const logDir = path.join(projectPath, \".better-agents\");\n\n // Create timestamped log file name: debug-YYYY-MM-DD-HH-MM-SS.log\n const now = new Date();\n const timestamp = now.toISOString().replace(/[:.]/g, \"-\").slice(0, 19);\n const logPath = path.join(logDir, `debug-${timestamp}.log`);\n\n await fs.mkdir(logDir, { recursive: true });\n\n this.projectLogger = pino(\n {\n level: \"debug\",\n formatters: {\n level: (label: string) => ({\n level: label,\n timestamp: new Date().toISOString(),\n }),\n },\n },\n pino.destination(logPath)\n );\n } catch {\n // Silently fail project logging setup - don't break user experience\n // Note: We can't use logger here since we're in the logger setup\n }\n }\n\n /**\n * Logs debug information in structured JSON format.\n * @param step - The operation or step being logged\n * @param context - Additional structured data for debugging\n */\n debug(step: string, context: LogContext = {}): void {\n this.projectLogger?.debug({ step, ...context });\n }\n\n /**\n * Logs informational debug data in structured JSON format.\n * @param step - The operation or step being logged\n * @param context - Additional structured data for analysis\n */\n info(step: string, context: LogContext = {}): void {\n this.projectLogger?.info({ step, ...context });\n }\n\n /**\n * Logs error with stack trace in structured JSON format.\n * @param error - The error that occurred\n * @param context - Additional context about the error\n */\n error(error: Error, context: LogContext = {}): void {\n this.projectLogger?.error({\n step: 'error',\n error: error.message,\n stack: error.stack,\n ...context\n });\n }\n\n /**\n * Starts a performance timer and returns a function to end it.\n * @param label - Identifier for the timed operation\n * @returns Function that ends the timer and logs duration\n */\n startTimer(label: string): () => number {\n const start = Date.now();\n this.timers.set(label, start);\n this.debug('timer-start', { label });\n\n return () => {\n const duration = Date.now() - start;\n this.timers.delete(label);\n this.debug('timer-end', { label, duration });\n return duration;\n };\n }\n\n /**\n * Checks if the logger has file logging capability.\n * @returns True if project logging is set up\n */\n hasFileLogging(): boolean {\n return this.projectLogger !== undefined;\n }\n}\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport type { Spinner, LogContext } from \"./types.js\";\n\n/**\n * Display logger responsible for user-facing console output.\n *\n * This class follows the Single Responsibility Principle by handling\n * only console output operations with colors and spinners.\n *\n * @example\n * ```ts\n * const logger = new DisplayLogger();\n * logger.userSuccess(\"Project created successfully!\");\n * const spinner = logger.startSpinner(\"Processing...\");\n * ```\n */\nexport class DisplayLogger {\n private spinner?: Spinner;\n\n /**\n * Logs user-facing informational message with cyan color.\n * @param message - The message to display to the user\n */\n userInfo(message: string): void {\n if (this.spinner) {\n this.spinner.info(chalk.cyan(message));\n } else {\n console.log(chalk.cyan(message));\n }\n }\n\n /**\n * Logs user-facing success message with green color and checkmark.\n * @param message - The success message to display\n */\n userSuccess(message: string): void {\n if (this.spinner) {\n this.spinner.succeed(chalk.green(message));\n } else {\n console.log(chalk.green(`✅ ${message}`));\n }\n }\n\n /**\n * Logs user-facing error message with red color and X mark.\n * @param message - The error message to display\n */\n userError(message: string): void {\n if (this.spinner) {\n this.spinner.fail(chalk.red(message));\n } else {\n console.error(chalk.red(`❌ ${message}`));\n }\n }\n\n /**\n * Logs user-facing warning message with yellow color and warning symbol.\n * @param message - The warning message to display\n */\n userWarning(message: string): void {\n if (this.spinner) {\n this.spinner.warn(chalk.yellow(message));\n } else {\n console.warn(chalk.yellow(`⚠️ ${message}`));\n }\n }\n\n /**\n * Starts an ora spinner for long-running operations.\n * @param text - Initial spinner text\n * @returns The spinner instance\n */\n startSpinner(text: string): Spinner {\n if (!this.spinner) {\n this.spinner = ora(text).start();\n }\n return this.spinner;\n }\n\n /**\n * Gets the current spinner instance if one exists.\n * @returns The current spinner or undefined\n */\n getSpinner(): Spinner | undefined {\n return this.spinner;\n }\n\n /**\n * Creates a child display logger with additional context.\n * For display logger, this is mainly for API compatibility.\n * @param _context - Context (ignored for display logger)\n * @returns New display logger instance\n */\n child(_context: LogContext): DisplayLogger {\n return new DisplayLogger();\n }\n}\n","import pino from 'pino';\nimport type { Logger as PinoLogger } from 'pino';\nimport type { LogContext } from './types.js';\n\n/**\n * Console logger responsible for debug output to console.\n *\n * This class handles pretty-printed console output for debug mode,\n * separate from file logging and user-facing display logging.\n *\n * @example\n * ```ts\n * const logger = new ConsoleLogger();\n * logger.info('step-completed', { duration: 150 });\n * ```\n */\nexport class ConsoleLogger {\n private pinoLogger: PinoLogger | undefined;\n\n /**\n * Creates a new console logger instance.\n */\n constructor() {\n // Only enable console transport when debug mode is detected\n if (this.detectDebugMode()) {\n this.pinoLogger = pino({\n level: \"debug\",\n transport: {\n target: 'pino-pretty',\n options: {\n colorize: true,\n translateTime: \"HH:MM:ss\",\n ignore: \"pid,hostname\",\n },\n },\n });\n }\n }\n\n /**\n * Detects if debug mode is enabled via environment variable or CLI flag.\n */\n private detectDebugMode(): boolean {\n return Boolean(\n process.env.SUPERAGENTS_DEBUG ||\n process.argv.includes(\"--debug\") ||\n process.argv.includes(\"-d\")\n );\n }\n\n /**\n * Logs debug information to console in pretty format.\n * @param step - The operation or step being logged\n * @param context - Additional structured data for debugging\n */\n debug(step: string, context: LogContext = {}): void {\n this.pinoLogger?.debug({ step, ...context });\n }\n\n /**\n * Logs informational debug data to console in pretty format.\n * @param step - The operation or step being logged\n * @param context - Additional structured data for analysis\n */\n info(step: string, context: LogContext = {}): void {\n this.pinoLogger?.info({ step, ...context });\n }\n\n /**\n * Logs error with stack trace to console in pretty format.\n * @param error - The error that occurred\n * @param context - Additional context about the error\n */\n error(error: Error, context: LogContext = {}): void {\n this.pinoLogger?.error({\n step: 'error',\n error: error.message,\n stack: error.stack,\n ...context\n });\n }\n\n /**\n * Checks if console logging is enabled.\n * @returns True if debug mode console logging is active\n */\n isEnabled(): boolean {\n return this.pinoLogger !== undefined;\n }\n}\n","import type { Spinner, Logger, LogContext } from './types.js';\nimport { BaseLogger } from './base-logger.js';\nimport { DisplayLogger } from './display-logger.js';\nimport { ConsoleLogger } from './console-logger.js';\n\n/**\n * Logger facade that coordinates between multiple specialized loggers.\n *\n * This class implements the Facade pattern to provide a unified interface\n * while delegating to specialized loggers for different concerns:\n * - BaseLogger: Structured JSON file logging\n * - DisplayLogger: User-facing console output\n * - ConsoleLogger: Debug console output\n *\n * @example\n * ```ts\n * const logger = new LoggerFacade('/path/to/project');\n * logger.userSuccess(\"Project created!\");\n * logger.debug('step-completed', { duration: 150 });\n * ```\n */\nexport class LoggerFacade implements Logger {\n private baseLogger: BaseLogger;\n private displayLogger: DisplayLogger;\n private consoleLogger: ConsoleLogger;\n\n /**\n * Creates a new logger facade instance.\n * @param projectPath - Optional path to project for debug log file creation\n */\n constructor(projectPath?: string) {\n this.baseLogger = new BaseLogger(projectPath);\n this.displayLogger = new DisplayLogger();\n this.consoleLogger = new ConsoleLogger();\n }\n\n /**\n * Logs user-facing informational message with cyan color.\n * @param message - The message to display to the user\n */\n userInfo(message: string): void {\n this.displayLogger.userInfo(message);\n // Also log to debug systems for consistency\n this.baseLogger.debug('user-info', { message, type: 'info' });\n this.consoleLogger.debug('user-info', { message, type: 'info' });\n }\n\n /**\n * Logs user-facing success message with green color and checkmark.\n * @param message - The success message to display\n */\n userSuccess(message: string): void {\n this.displayLogger.userSuccess(message);\n // Also log to debug systems for consistency\n this.baseLogger.debug('user-success', { message, type: 'success' });\n this.consoleLogger.debug('user-success', { message, type: 'success' });\n }\n\n /**\n * Logs user-facing error message with red color and X mark.\n * @param message - The error message to display\n */\n userError(message: string): void {\n this.displayLogger.userError(message);\n // Also log to debug systems for consistency\n this.baseLogger.error(new Error(message), { type: 'user-error' });\n this.consoleLogger.error(new Error(message), { type: 'user-error' });\n }\n\n /**\n * Logs user-facing warning message with yellow color and warning symbol.\n * @param message - The warning message to display\n */\n userWarning(message: string): void {\n this.displayLogger.userWarning(message);\n // Also log to debug systems for consistency\n this.baseLogger.debug('user-warning', { message, type: 'warning' });\n this.consoleLogger.debug('user-warning', { message, type: 'warning' });\n }\n\n /**\n * Logs debug information in structured JSON format.\n * @param step - The operation or step being logged\n * @param context - Additional structured data for debugging\n */\n debug(step: string, context: LogContext = {}): void {\n this.baseLogger.debug(step, context);\n this.consoleLogger.debug(step, context);\n }\n\n /**\n * Logs informational debug data in structured JSON format.\n * @param step - The operation or step being logged\n * @param context - Additional structured data for analysis\n */\n info(step: string, context: LogContext = {}): void {\n this.baseLogger.info(step, context);\n this.consoleLogger.info(step, context);\n }\n\n /**\n * Logs error with stack trace in structured JSON format.\n * @param error - The error that occurred\n * @param context - Additional context about the error\n */\n error(error: Error, context: LogContext = {}): void {\n this.baseLogger.error(error, context);\n this.consoleLogger.error(error, context);\n }\n\n /**\n * Starts a performance timer and returns a function to end it.\n * @param label - Identifier for the timed operation\n * @returns Function that ends the timer and logs duration\n */\n startTimer(label: string): () => number {\n return this.baseLogger.startTimer(label);\n }\n\n /**\n * Creates a child logger with additional context.\n * @param context - Context to add to all log entries from this child\n * @returns New logger instance with inherited context\n */\n child(context: LogContext): Logger {\n // Create a new facade with the same specialized loggers\n // In a more complex implementation, this would merge contexts\n const childFacade = new LoggerFacade();\n // Copy spinner state for continuity\n const currentSpinner = this.displayLogger.getSpinner();\n if (currentSpinner) {\n childFacade.displayLogger = this.displayLogger.child(context);\n }\n return childFacade;\n }\n\n /**\n * Starts an ora spinner for long-running operations.\n * @param text - Initial spinner text\n * @returns The spinner instance\n */\n startSpinner(text: string): Spinner {\n return this.displayLogger.startSpinner(text);\n }\n\n /**\n * Gets the current spinner instance if one exists.\n * @returns The current spinner or undefined\n */\n getSpinner(): Spinner | undefined {\n return this.displayLogger.getSpinner();\n }\n}\n","import { LoggerFacade } from './logger-facade.js';\n\n/**\n * Default logger instance for global use throughout the application.\n *\n * This logger provides unified logging with:\n * - User-facing console output with colors and spinners\n * - Structured JSON logging to timestamped files\n * - Debug console output when --debug flag is used\n *\n * @example\n * ```ts\n * import { logger } from '../utils/logger/index.js';\n *\n * logger.userSuccess(\"Operation completed!\");\n * logger.debug('step-finished', { duration: 150 });\n * ```\n */\nexport const logger = new LoggerFacade();\n\n// Export types for external use\nexport type { Logger, LogContext, LogLevel } from './types.js';\n","import type { ProgrammingLanguage } from \"../../types.js\";\n\n/**\n * Builds the list of programming language choices for the CLI prompt.\n *\n * @returns Array of language choices\n *\n * @example\n * ```ts\n * const choices = buildLanguageChoices();\n * // Returns: [{ name: 'Python', value: 'python' }, { name: 'TypeScript', value: 'typescript' }]\n * ```\n */\nexport const buildLanguageChoices = () => {\n return [\n { name: \"TypeScript\", value: \"typescript\" as ProgrammingLanguage },\n { name: \"Python\", value: \"python\" as ProgrammingLanguage },\n ];\n};\n","import type { FrameworkKnowledge } from \"../index.js\";\n\n/**\n * Returns Agno framework knowledge for documentation and prompts.\n *\n * @returns Framework knowledge object\n *\n * @example\n * ```ts\n * const knowledge = getKnowledge();\n * console.log(knowledge.setupInstructions);\n * ```\n */\nexport const getKnowledge = (): FrameworkKnowledge => ({\n setupInstructions: \"Python w/uv + pytest\",\n toolingInstructions:\n \"Review the .cursorrules and llms.txt files for Agno best practices\",\n agentsGuideSection: `## Framework-Specific Guidelines\n\n### Agno Framework\n\n**Always follow Agno best practices:**\n\n- Refer to the \\`.cursorrules\\` file for Agno-specific coding standards\n- Consult \\`llms.txt\\` for comprehensive Agno documentation\n- Use Agno's agent building patterns and conventions\n- Follow Agno's recommended project structure\n\n**Key Agno Resources:**\n- Documentation: https://docs.agno.com/\n- GitHub: https://github.com/agno-agi/agno\n- Local files: \\`.cursorrules\\` and \\`llms.txt\\`\n\n**When implementing agent features:**\n1. Review Agno documentation for best practices\n2. Use Agno's built-in tools and utilities\n3. Follow Agno's patterns for agent state management\n4. Leverage Agno's testing utilities\n\n---\n`,\n});\n\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { logger } from \"../../../utils/logger/index.js\";\n\nconst AGNO_CURSORRULES_URL =\n \"https://raw.githubusercontent.com/agno-agi/agno/main/.cursorrules\";\nconst AGNO_LLMS_TXT_URL = \"https://docs.agno.com/llms.txt\";\n\n/**\n * Performs Agno-specific setup: downloads .cursorrules and llms.txt\n *\n * @param params - Parameters object\n * @param params.projectPath - Absolute path to project root\n * @returns Promise that resolves when setup is complete\n *\n * @example\n * ```ts\n * await setup({ projectPath: '/path/to/project' });\n * ```\n */\nexport const setup = async ({\n projectPath,\n}: {\n projectPath: string;\n}): Promise<void> => {\n await Promise.all([\n fetchFile({\n url: AGNO_CURSORRULES_URL,\n targetPath: path.join(projectPath, \".cursorrules\"),\n fallback:\n \"# Agno cursor rules\\n# Please manually download from: \" +\n AGNO_CURSORRULES_URL,\n }),\n fetchFile({\n url: AGNO_LLMS_TXT_URL,\n targetPath: path.join(projectPath, \"llms.txt\"),\n fallback:\n \"# Agno LLMs documentation\\n# Please manually download from: \" +\n AGNO_LLMS_TXT_URL,\n }),\n ]);\n};\n\nconst fetchFile = async ({\n url,\n targetPath,\n fallback,\n}: {\n url: string;\n targetPath: string;\n fallback: string;\n}): Promise<void> => {\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch: ${response.statusText}`);\n }\n const content = await response.text();\n await fs.writeFile(targetPath, content);\n } catch {\n logger.userWarning(`Could not fetch ${url}, using fallback`);\n await fs.writeFile(targetPath, fallback);\n }\n};\n","import type { FrameworkProvider } from \"../index.js\";\nimport { getKnowledge } from \"./knowledge.js\";\nimport { setup } from \"./setup.js\";\n\n/**\n * Agno framework provider implementation.\n * Provides Python-based agent framework with .cursorrules and llms.txt setup.\n */\nexport const AgnoFrameworkProvider: FrameworkProvider = {\n id: \"agno\",\n displayName: \"Agno\",\n language: \"python\",\n\n getKnowledge,\n getMCPConfig: () => null,\n setup,\n};\n\n","import type { FrameworkKnowledge } from \"../index.js\";\n\n/**\n * Returns Mastra framework knowledge for documentation and prompts.\n *\n * @returns Framework knowledge object\n *\n * @example\n * ```ts\n * const knowledge = getKnowledge();\n * console.log(knowledge.setupInstructions);\n * ```\n */\nexport const getKnowledge = (): FrameworkKnowledge => ({\n setupInstructions: \"TypeScript w/pnpm + vitest\",\n toolingInstructions:\n \"Use the Mastra MCP to learn about Mastra and how to build agents\",\n agentsGuideSection: `## Framework-Specific Guidelines\n\n### Mastra Framework\n\n**Always use the Mastra MCP for learning:**\n\n- The Mastra MCP server provides real-time documentation\n- Ask it questions about Mastra APIs and best practices\n- Follow Mastra's recommended patterns for agent development\n\n**When implementing agent features:**\n1. Consult the Mastra MCP: \"How do I [do X] in Mastra?\"\n2. Use Mastra's built-in agent capabilities\n3. Follow Mastra's TypeScript patterns and conventions\n4. Leverage Mastra's integration ecosystem\n\n**Initial setup:**\n1. Use \\`pnpx mastra init --default\\` to create a new mastra project, do it before setting up the rest of the project, right after having done \\`pnpm init\\`.\n2. Then explore the setup it created, the folders, remove what not needed\n3. Proceed with the user definition request to implement the agent and test it out\n4. Open the UI for user to see using \\`pnpx mastra dev\\`\n\n---\n`,\n});\n","import type { MCPServerConfig } from \"../index.js\";\n\n/**\n * Returns Mastra MCP server configuration.\n *\n * @returns MCP server configuration object\n *\n * @example\n * ```ts\n * const mcpConfig = getMCPConfig();\n * ```\n */\nexport const getMCPConfig = (): MCPServerConfig => ({\n type: \"stdio\",\n command: \"npx\",\n args: [\"-y\", \"@mastra/mcp-docs-server\"],\n});\n\n","import type { FrameworkProvider } from \"../index.js\";\nimport { getKnowledge } from \"./knowledge.js\";\nimport { getMCPConfig } from \"./mcp-config.js\";\n\n/**\n * Mastra framework provider implementation.\n * Provides TypeScript-based agent framework with MCP server.\n */\nexport const MastraFrameworkProvider: FrameworkProvider = {\n id: \"mastra\",\n displayName: \"Mastra\",\n language: \"typescript\",\n\n getKnowledge,\n getMCPConfig,\n setup: async () => {\n // Mastra doesn't need special setup files\n },\n};\n\n","import type { ProgrammingLanguage } from \"../../types.js\";\nimport { AgnoFrameworkProvider } from \"./agno/index.js\";\nimport { MastraFrameworkProvider } from \"./mastra/index.js\";\n\nexport type MCPServerConfig = {\n type?: string;\n command: string;\n args: string[];\n};\n\nexport type FrameworkKnowledge = {\n /** Prompt instruction for setup tooling (e.g. \"TypeScript w/pnpm + vitest\") */\n setupInstructions: string;\n /** Prompt instruction for accessing docs (e.g. \"Use the Mastra MCP...\") */\n toolingInstructions: string;\n /** Full markdown section for AGENTS.md */\n agentsGuideSection: string;\n};\n\n/**\n * Interface for framework-specific providers.\n * Each framework implements setup, knowledge, and optional MCP configuration.\n *\n * @example\n * ```ts\n * const provider = getFrameworkProvider('mastra');\n * await provider.setup({ projectPath: '/path/to/project' });\n * const knowledge = provider.getKnowledge();\n * ```\n */\nexport interface FrameworkProvider {\n /** Unique identifier (e.g. \"agno\", \"mastra\") */\n readonly id: string;\n /** Display name for UI (e.g. \"Agno\") */\n readonly displayName: string;\n /** Supported language */\n readonly language: ProgrammingLanguage;\n\n /** Returns framework-specific knowledge for documentation */\n getKnowledge(): FrameworkKnowledge;\n\n /** Returns MCP server configuration if available */\n getMCPConfig?(): MCPServerConfig | null;\n\n /** Performs framework-specific setup (files, downloads, etc.) */\n setup(params: { projectPath: string }): Promise<void>;\n}\n\nconst PROVIDERS: Record<string, FrameworkProvider> = {\n agno: AgnoFrameworkProvider,\n mastra: MastraFrameworkProvider,\n};\n\n/**\n * Gets a framework provider by ID.\n *\n * @param params - Parameters object\n * @param params.framework - Framework identifier\n * @returns Framework provider instance\n *\n * @example\n * ```ts\n * const provider = getFrameworkProvider({ framework: 'mastra' });\n * ```\n */\nexport const getFrameworkProvider = ({\n framework,\n}: {\n framework: string;\n}): FrameworkProvider => {\n const provider = PROVIDERS[framework];\n if (!provider) {\n throw new Error(`Framework provider not found: ${framework}`);\n }\n return provider;\n};\n\n/**\n * Gets all frameworks available for a given language.\n *\n * @param params - Parameters object\n * @param params.language - The programming language\n * @returns Array of framework providers\n *\n * @example\n * ```ts\n * const frameworks = getFrameworksByLanguage({ language: 'python' });\n * ```\n */\nexport const getFrameworksByLanguage = ({\n language,\n}: {\n language: ProgrammingLanguage;\n}): FrameworkProvider[] => {\n return Object.values(PROVIDERS).filter((p) => p.language === language);\n};\n","import type { AgentFramework, ProgrammingLanguage } from \"../../types.js\";\nimport { getFrameworksByLanguage } from \"../../providers/frameworks/index.js\";\n\n/**\n * Builds framework choices based on the selected programming language.\n *\n * @param params - Parameters object\n * @param params.language - The selected programming language\n * @returns Array of framework choices for the language\n *\n * @example\n * ```ts\n * const choices = buildFrameworkChoices({ language: 'python' });\n * ```\n */\nexport const buildFrameworkChoices = ({\n language,\n}: {\n language: ProgrammingLanguage;\n}) => {\n return getFrameworksByLanguage({ language }).map((provider) => ({\n name: provider.displayName,\n value: provider.id as AgentFramework,\n }));\n};\n","import { spawnSync } from \"child_process\";\n\n/**\n * Utility class for process-related operations.\n */\nexport class ProcessUtils {\n /**\n * Launches a command with full terminal control using spawnSync.\n * Blocks until the command completes.\n *\n * @param command - The command to execute\n * @param args - Arguments for the command\n * @param options - Execution options\n *\n * @example\n * ```ts\n * ProcessUtils.launchWithTerminalControl('cursor-agent', ['prompt text'], { cwd: '/path' });\n * // Blocks until cursor-agent exits\n * ```\n */\n static launchWithTerminalControl(\n command: string,\n args: string[],\n options: { cwd: string }\n ): void {\n const result = spawnSync(command, args, {\n cwd: options.cwd,\n stdio: \"inherit\",\n });\n\n if (result.error) {\n throw new Error(`Failed to execute ${command}: ${result.error.message}`);\n }\n\n // Exit with the same code as the child process\n if (result.status !== null) {\n process.exit(result.status);\n }\n }\n}\n","import { exec } from \"child_process\";\nimport { promisify } from \"util\";\n\nconst execAsync = promisify(exec);\n\n/**\n * Utility class for CLI-related operations.\n */\nexport class CliUtils {\n /**\n * Checks if a command is available in the system PATH.\n *\n * @param command - The command to check (e.g., 'claude', 'cursor-agent')\n * @returns Promise resolving to true if command exists, false otherwise\n *\n * @example\n * ```ts\n * const hasCommand = await CliUtils.isCommandAvailable('claude');\n * // Returns: true if claude is installed\n * ```\n */\n static async isCommandAvailable(command: string): Promise<boolean> {\n try {\n await execAsync(`which ${command}`);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { ProcessUtils } from \"../../../utils/process.util\";\nimport { CliUtils } from \"../../../utils/cli.util\";\nimport { logger } from \"../../../utils/logger/index.js\";\nimport type { CodingAssistantProvider } from \"../index.js\";\n\n/**\n * Claude Code assistant provider implementation.\n * Writes MCP configuration as .mcp.json in project root.\n */\nexport const ClaudeCodingAssistantProvider: CodingAssistantProvider = {\n id: \"claude-code\",\n displayName: \"Claude Code\",\n command: \"claude\",\n\n async isAvailable(): Promise<{\n installed: boolean;\n installCommand?: string;\n }> {\n const installed = await CliUtils.isCommandAvailable(\"claude\");\n return {\n installed,\n installCommand: installed\n ? undefined\n : \"npm install -g @anthropic-ai/claude-code\",\n };\n },\n\n async writeMCPConfig({ projectPath, config }) {\n const mcpConfigPath = path.join(projectPath, \".mcp.json\");\n await fs.writeFile(mcpConfigPath, JSON.stringify(config, null, 2));\n\n // Create CLAUDE.md that references AGENTS.md\n const claudeMdPath = path.join(projectPath, \"CLAUDE.md\");\n const claudeMdContent = `@AGENTS.md\\n`;\n await fs.writeFile(claudeMdPath, claudeMdContent);\n },\n\n async launch({\n projectPath,\n prompt,\n }: {\n projectPath: string;\n prompt: string;\n }): Promise<void> {\n try {\n logger.userInfo(`🤖 Launching ${this.displayName}...`);\n // Launch claude with full terminal control\n // This blocks until claude exits\n ProcessUtils.launchWithTerminalControl(\"claude\", [prompt], {\n cwd: projectPath,\n });\n logger.userSuccess(\"Session complete!\");\n } catch (error) {\n if (error instanceof Error) {\n logger.userError(`Failed to launch ${this.displayName}: ${error.message}`);\n }\n throw error;\n }\n },\n};\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { logger } from \"../../../utils/logger/index.js\";\nimport type { CodingAssistantProvider } from \"../index.js\";\n\n/**\n * Cursor assistant provider implementation.\n * Writes MCP configuration as .cursor/mcp.json in project root.\n */\nexport const CursorCodingAssistantProvider: CodingAssistantProvider = {\n id: \"cursor\",\n displayName: \"Cursor\",\n command: \"\",\n\n async isAvailable(): Promise<{\n installed: boolean;\n installCommand?: string;\n }> {\n // Cursor is always available as it's an IDE, not a CLI tool\n return { installed: true };\n },\n\n async writeMCPConfig({ projectPath, config }) {\n // Create .cursor directory\n const cursorDir = path.join(projectPath, \".cursor\");\n await fs.mkdir(cursorDir, { recursive: true });\n\n // Write MCP config to .cursor/mcp.json\n const mcpConfigPath = path.join(cursorDir, \"mcp.json\");\n await fs.writeFile(mcpConfigPath, JSON.stringify(config, null, 2));\n },\n\n async launch({\n projectPath,\n }: {\n projectPath: string;\n prompt: string;\n }): Promise<void> {\n // Cursor doesn't support CLI launching, show instructions instead\n logger.userWarning(\"To start with Cursor:\");\n logger.userInfo(\" 1. Open Cursor\");\n logger.userInfo(` 2. Open the folder: ${projectPath}`);\n logger.userInfo(\" 3. Use the initial prompt above with Cursor Composer\");\n },\n};\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { ProcessUtils } from \"../../../utils/process.util\";\nimport { CliUtils } from \"../../../utils/cli.util\";\nimport { logger } from \"../../../utils/logger/index.js\";\nimport type { CodingAssistantProvider } from \"../index.js\";\n\n/**\n * Kilocode assistant provider implementation.\n * Writes MCP configuration as .mcp.json in project root.\n */\nexport const KilocodeCodingAssistantProvider: CodingAssistantProvider = {\n id: \"kilocode\",\n displayName: \"Kilocode CLI\",\n command: \"kilocode\",\n\n async isAvailable(): Promise<{\n installed: boolean;\n installCommand?: string;\n }> {\n const installed = await CliUtils.isCommandAvailable(\"kilocode\");\n return {\n installed,\n installCommand: installed ? undefined : \"npm install -g @kilocode/cli\",\n };\n },\n\n async writeMCPConfig({ projectPath, config }) {\n const mcpConfigPath = path.join(projectPath, \".mcp.json\");\n await fs.writeFile(mcpConfigPath, JSON.stringify(config, null, 2));\n },\n\n async launch({\n projectPath,\n prompt,\n }: {\n projectPath: string;\n prompt: string;\n }): Promise<void> {\n try {\n logger.userInfo(`🤖 Launching ${this.displayName}...`);\n // Launch kilocode with full terminal control\n // This blocks until kilocode exits\n ProcessUtils.launchWithTerminalControl(\"kilocode\", [\"-a\", prompt], {\n cwd: projectPath,\n });\n logger.userSuccess(\"Session complete!\");\n } catch (error) {\n if (error instanceof Error) {\n logger.userError(\n `Failed to launch ${this.displayName}: ${error.message}`\n );\n }\n throw error;\n }\n },\n};\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { logger } from \"../../../utils/logger/index.js\";\nimport type { CodingAssistantProvider } from \"../index.js\";\n\n/**\n * None provider - for users who want to set up the project but prompt their assistant manually.\n * Writes MCP configuration in both .mcp.json and .cursor/mcp.json for compatibility.\n * Also creates CLAUDE.md for Claude Code compatibility.\n */\nexport const NoneCodingAssistantProvider: CodingAssistantProvider = {\n id: \"none\",\n displayName: \"None - I will prompt it myself\",\n command: \"\",\n\n async isAvailable(): Promise<{\n installed: boolean;\n installCommand?: string;\n }> {\n // \"None\" option is always available since it doesn't require installation\n return { installed: true };\n },\n\n async writeMCPConfig({ projectPath, config }) {\n // Write MCP config to .mcp.json (for Claude Code and others)\n const mcpConfigPath = path.join(projectPath, \".mcp.json\");\n await fs.writeFile(mcpConfigPath, JSON.stringify(config, null, 2));\n\n // Also write to .cursor/mcp.json for Cursor compatibility\n const cursorDir = path.join(projectPath, \".cursor\");\n await fs.mkdir(cursorDir, { recursive: true });\n const cursorMcpPath = path.join(cursorDir, \"mcp.json\");\n await fs.writeFile(cursorMcpPath, JSON.stringify(config, null, 2));\n\n // Create CLAUDE.md that references AGENTS.md\n const claudeMdPath = path.join(projectPath, \"CLAUDE.md\");\n const claudeMdContent = `@AGENTS.md\\n`;\n await fs.writeFile(claudeMdPath, claudeMdContent);\n },\n\n async launch(_params: {\n projectPath: string;\n prompt: string;\n }): Promise<void> {\n // No auto-launch - just show instructions\n logger.userInfo(\n \"When you're ready, use the initial prompt above with your coding assistant.\"\n );\n },\n};\n","import { ClaudeCodingAssistantProvider } from \"./claude/index.js\";\nimport { CursorCodingAssistantProvider } from \"./cursor/index.js\";\nimport { KilocodeCodingAssistantProvider } from \"./kilocode/index.js\";\nimport { NoneCodingAssistantProvider } from \"./none/index.js\";\n\nexport type MCPConfigFile = {\n mcpServers: Record<\n string,\n {\n command: string;\n args?: string[];\n type?: string;\n }\n >;\n};\n\n/**\n * Interface for coding assistant providers.\n * Each assistant implements MCP config writing and launching.\n *\n * @example\n * ```ts\n * const provider = getCodingAssistantProvider({ assistant: 'claude-code' });\n * const available = await provider.isAvailable();\n * if (!available.installed) {\n * console.log(`Install with: ${available.installCommand}`);\n * }\n * await provider.writeMCPConfig({ projectPath, config });\n * await provider.launch({ projectPath, prompt });\n * ```\n */\nexport interface CodingAssistantProvider {\n readonly id: string;\n readonly displayName: string;\n readonly command: string;\n\n /**\n * Checks if the coding assistant is available\n * @returns Promise resolving to an object with installation status and install command if not installed\n */\n isAvailable(): Promise<{ installed: boolean; installCommand?: string }>;\n\n /** Writes MCP config in assistant-specific format/location */\n writeMCPConfig(params: {\n projectPath: string;\n config: MCPConfigFile;\n }): Promise<void>;\n\n /** Launches the assistant with the given prompt */\n launch(params: { projectPath: string; prompt: string }): Promise<void>;\n}\n\nconst PROVIDERS: Record<string, CodingAssistantProvider> = {\n kilocode: KilocodeCodingAssistantProvider,\n \"claude-code\": ClaudeCodingAssistantProvider,\n cursor: CursorCodingAssistantProvider,\n none: NoneCodingAssistantProvider,\n};\n\n/**\n * Gets a coding assistant provider by ID.\n *\n * @param params - Parameters object\n * @param params.assistant - Coding assistant identifier\n * @returns Coding assistant provider instance\n *\n * @example\n * ```ts\n * const provider = getCodingAssistantProvider({ assistant: 'claude-code' });\n * ```\n */\nexport const getCodingAssistantProvider = ({\n assistant,\n}: {\n assistant: string;\n}): CodingAssistantProvider => {\n const provider = PROVIDERS[assistant];\n if (!provider) {\n throw new Error(`Coding assistant provider not found: ${assistant}`);\n }\n return provider;\n};\n\n/**\n * Gets all available coding assistant providers.\n *\n * @returns Array of coding assistant providers\n *\n * @example\n * ```ts\n * const assistants = getAllCodingAssistants();\n * ```\n */\nexport const getAllCodingAssistants = (): CodingAssistantProvider[] => {\n return Object.values(PROVIDERS);\n};\n","import { CliUtils } from \"./cli.util\";\n\n/**\n * Utility class for coding assistant-related operations.\n */\nexport class CodingAssistantUtils {\n /**\n * Detects which coding assistants are installed on the system.\n *\n * @returns Promise resolving to a map of assistant IDs to installation status\n *\n * @example\n * ```ts\n * const installed = await CodingAssistantUtils.detectInstalledAgents();\n * // Returns: { 'claude-code': true, 'cursor': false, 'kilocode': true }\n * ```\n */\n static async detectInstalledAgents(): Promise<Record<string, boolean>> {\n const [hasClaude, hasCursor, hasKilocode] = await Promise.all([\n CliUtils.isCommandAvailable(\"claude\"),\n CliUtils.isCommandAvailable(\"cursor-agent\"),\n CliUtils.isCommandAvailable(\"kilocode\"),\n ]);\n\n return {\n \"claude-code\": hasClaude,\n cursor: hasCursor,\n kilocode: hasKilocode,\n none: true, // Always available since it doesn't require installation\n };\n }\n}\n","import chalk from \"chalk\";\nimport { getAllCodingAssistants } from \"../../providers/coding-assistants/index.js\";\nimport type { CodingAssistant } from \"../../types.js\";\nimport { CodingAssistantUtils } from \"../../utils/coding-assistant.util\";\n\ntype Choice = {\n name: string;\n value: CodingAssistant;\n};\n\n/**\n * Builds coding assistant choices with installed agents shown first in white,\n * and not installed agents shown later in gray with \"(not installed)\" suffix.\n *\n * @returns Promise resolving to array of choice objects for inquirer\n *\n * @example\n * ```ts\n * const choices = await buildCodingAssistantChoices();\n * // Returns: [\n * // { name: \"Claude Code\", value: \"claude-code\" },\n * // { name: chalk.gray(\"Cursor CLI (not installed)\"), value: \"cursor-cli\" }\n * // ]\n * ```\n */\nexport const buildCodingAssistantChoices = async (): Promise<Choice[]> => {\n const assistants = getAllCodingAssistants();\n const installedMap = await CodingAssistantUtils.detectInstalledAgents();\n\n const installed: Choice[] = [];\n const notInstalled: Choice[] = [];\n\n for (const assistant of assistants) {\n const isInstalled = installedMap[assistant.id];\n const choice: Choice = {\n name: isInstalled\n ? assistant.displayName\n : chalk.gray(`${assistant.displayName} (not installed)`),\n value: assistant.id as CodingAssistant,\n };\n\n if (isInstalled) {\n installed.push(choice);\n } else {\n notInstalled.push(choice);\n }\n }\n\n return [...installed, ...notInstalled];\n};\n\n","import type { LLMProviderProvider } from \"../index.js\";\n\n/**\n * OpenAI LLM provider implementation.\n */\nexport const OpenAIProvider: LLMProviderProvider = {\n id: \"openai\",\n displayName: \"OpenAI\",\n apiKeyUrl: \"https://platform.openai.com/api-keys\",\n\n getEnvVariables: ({ apiKey }) => [\n { key: \"OPENAI_API_KEY\", value: apiKey },\n ],\n};\n\n","import type { LLMProviderProvider } from \"../index.js\";\n\n/**\n * Anthropic (Claude) LLM provider implementation.\n */\nexport const AnthropicProvider: LLMProviderProvider = {\n id: \"anthropic\",\n displayName: \"Anthropic (Claude)\",\n apiKeyUrl: \"https://console.anthropic.com/settings/keys\",\n\n getEnvVariables: ({ apiKey }) => [\n { key: \"ANTHROPIC_API_KEY\", value: apiKey },\n ],\n};\n\n","import type { LLMProviderProvider } from \"../index.js\";\n\n/**\n * Google Gemini LLM provider implementation.\n */\nexport const GeminiProvider: LLMProviderProvider = {\n id: \"gemini\",\n displayName: \"Google Gemini\",\n apiKeyUrl: \"https://aistudio.google.com/app/apikey\",\n\n getEnvVariables: ({ apiKey }) => [\n { key: \"GOOGLE_API_KEY\", value: apiKey },\n { key: \"GEMINI_API_KEY\", value: apiKey },\n ],\n};\n\n","import type { LLMProviderProvider } from \"../index.js\";\n\n/**\n * AWS Bedrock LLM provider implementation.\n * Requires AWS credentials (access key, secret key, and region).\n */\nexport const BedrockProvider: LLMProviderProvider = {\n id: \"bedrock\",\n displayName: \"AWS Bedrock\",\n apiKeyUrl: \"https://console.aws.amazon.com/iam/home#/security_credentials\",\n\n additionalCredentials: [\n {\n key: \"awsSecretKey\",\n label: \"AWS Secret Access Key\",\n type: \"password\",\n validate: (value) => {\n if (!value || value.length < 10) {\n return \"AWS Secret Access Key is required\";\n }\n return true;\n },\n },\n {\n key: \"awsRegion\",\n label: \"AWS Region (e.g., us-east-1)\",\n type: \"text\",\n defaultValue: \"us-east-1\",\n validate: (value) => {\n if (!value || value.length < 5) {\n return \"AWS Region is required\";\n }\n return true;\n },\n },\n ],\n\n getEnvVariables: ({ apiKey, additionalInputs }) => {\n const envVars = [\n { key: \"AWS_ACCESS_KEY_ID\", value: apiKey },\n ];\n\n if (additionalInputs?.awsSecretKey) {\n envVars.push({\n key: \"AWS_SECRET_ACCESS_KEY\",\n value: additionalInputs.awsSecretKey,\n });\n }\n\n if (additionalInputs?.awsRegion) {\n envVars.push({\n key: \"AWS_REGION\",\n value: additionalInputs.awsRegion,\n });\n }\n\n return envVars;\n },\n};\n\n","import type { LLMProviderProvider } from \"../index.js\";\n\n/**\n * OpenRouter LLM provider implementation.\n */\nexport const OpenRouterProvider: LLMProviderProvider = {\n id: \"openrouter\",\n displayName: \"OpenRouter\",\n apiKeyUrl: \"https://openrouter.ai/keys\",\n\n getEnvVariables: ({ apiKey }) => [\n { key: \"OPENROUTER_API_KEY\", value: apiKey },\n ],\n};\n\n","import type { LLMProviderProvider } from \"../index.js\";\n\n/**\n * xAI Grok LLM provider implementation.\n */\nexport const GrokProvider: LLMProviderProvider = {\n id: \"grok\",\n displayName: \"xAI (Grok)\",\n apiKeyUrl: \"https://console.x.ai/team\",\n\n getEnvVariables: ({ apiKey }) => [\n { key: \"XAI_API_KEY\", value: apiKey },\n ],\n};\n\n","import { OpenAIProvider } from \"./openai/index.js\";\nimport { AnthropicProvider } from \"./anthropic/index.js\";\nimport { GeminiProvider } from \"./gemini/index.js\";\nimport { BedrockProvider } from \"./bedrock/index.js\";\nimport { OpenRouterProvider } from \"./openrouter/index.js\";\nimport { GrokProvider } from \"./grok/index.js\";\n\nexport type EnvVariable = {\n key: string;\n value: string;\n};\n\nexport type CredentialInput = {\n key: string;\n label: string;\n type: \"password\" | \"text\";\n defaultValue?: string;\n validate?: (value: string) => string | boolean;\n};\n\n/**\n * Interface for LLM provider configuration.\n * Each provider returns environment variables needed for API access.\n *\n * @example\n * ```ts\n * const provider = getLLMProvider({ provider: 'openai' });\n * const envVars = provider.getEnvVariables({ apiKey: 'sk-...' });\n * ```\n */\nexport interface LLMProviderProvider {\n readonly id: string;\n readonly displayName: string;\n\n /** URL where users can get their API key */\n readonly apiKeyUrl: string;\n\n /** Optional additional credentials this provider needs (beyond the main API key) */\n readonly additionalCredentials?: CredentialInput[];\n\n /** Returns environment variables needed for this provider */\n getEnvVariables(params: {\n apiKey: string;\n additionalInputs?: Record<string, string>;\n }): EnvVariable[];\n\n /** Validates API key format/connectivity */\n validateApiKey?(params: { apiKey: string }): Promise<boolean>;\n}\n\nconst PROVIDERS: Record<string, LLMProviderProvider> = {\n openai: OpenAIProvider,\n anthropic: AnthropicProvider,\n gemini: GeminiProvider,\n bedrock: BedrockProvider,\n openrouter: OpenRouterProvider,\n grok: GrokProvider,\n};\n\n/**\n * Gets an LLM provider by ID.\n *\n * @param params - Parameters object\n * @param params.provider - LLM provider identifier\n * @returns LLM provider instance\n *\n * @example\n * ```ts\n * const provider = getLLMProvider({ provider: 'openai' });\n * ```\n */\nexport const getLLMProvider = ({\n provider,\n}: {\n provider: string;\n}): LLMProviderProvider => {\n const llmProvider = PROVIDERS[provider];\n if (!llmProvider) {\n throw new Error(`LLM provider not found: ${provider}`);\n }\n return llmProvider;\n};\n\n/**\n * Gets all available LLM providers.\n *\n * @returns Array of LLM providers\n *\n * @example\n * ```ts\n * const providers = getAllLLMProviders();\n * ```\n */\nexport const getAllLLMProviders = (): LLMProviderProvider[] => {\n return Object.values(PROVIDERS);\n};\n\n","/**\n * Validates OpenAI API key format.\n *\n * @param value - The API key to validate\n * @returns true if valid, error message if invalid\n *\n * @example\n * ```ts\n * const result = validateOpenAIKey('sk-abc123');\n * // Returns: true\n * ```\n */\nexport const validateOpenAIKey = (value: string): true | string => {\n if (!value || value.trim().length === 0) {\n return \"API key is required\";\n }\n if (!value.startsWith(\"sk-\")) {\n return 'OpenAI API key should start with \"sk-\"';\n }\n return true;\n};\n","/**\n * Validates LangWatch API key format.\n *\n * @param value - The API key to validate\n * @returns true if valid, error message if invalid\n *\n * @example\n * ```ts\n * const result = validateLangWatchKey('sk-lw-abc123');\n * // Returns: true\n * ```\n */\nexport const validateLangWatchKey = (value: string): true | string => {\n if (!value || value.trim().length === 0) {\n return \"LangWatch API key is required\";\n }\n if (!value.startsWith(\"sk-lw-\")) {\n return 'LangWatch API key should start with \"sk-lw-\"';\n }\n return true;\n};\n","/**\n * Validates project goal input.\n *\n * @param value - The project goal to validate\n * @returns true if valid, error message if invalid\n *\n * @example\n * ```ts\n * const result = validateProjectGoal('Build a chatbot');\n * // Returns: true\n * ```\n */\nexport const validateProjectGoal = (value: string): true | string => {\n if (!value || value.trim().length === 0) {\n return \"Please describe what you want to build\";\n }\n return true;\n};\n","import { select, input, password, confirm } from \"@inquirer/prompts\";\nimport { spawn } from \"child_process\";\nimport type {\n ProjectConfig,\n AgentFramework,\n CodingAssistant,\n LLMProvider,\n} from \"../types.js\";\nimport { logger } from \"../utils/logger/index.js\";\nimport { buildLanguageChoices } from \"./choice-builders/language-choices.js\";\nimport { buildFrameworkChoices } from \"./choice-builders/framework-choices.js\";\nimport { buildCodingAssistantChoices } from \"./choice-builders/coding-assistant-choices.js\";\nimport { getAllLLMProviders } from \"../providers/llm-providers/index.js\";\nimport { getAllCodingAssistants } from \"../providers/coding-assistants/index.js\";\nimport { validateOpenAIKey } from \"./validators/openai-key.js\";\nimport { validateLangWatchKey } from \"./validators/langwatch-key.js\";\nimport { validateProjectGoal } from \"./validators/project-goal.js\";\n\n/**\n * Collects project configuration from user via interactive CLI prompts.\n *\n * @returns Promise resolving to complete ProjectConfig\n *\n * @example\n * ```ts\n * const config = await collectConfig();\n * // Returns: { language: 'python', framework: 'agno', ... }\n * ```\n */\nexport const collectConfig = async (): Promise<ProjectConfig> => {\n try {\n logger.userInfo(\n \"Setting up your agent project following the Better Agent Structure.\\n\"\n );\n\n const language = await select({\n message: \"What programming language do you want to use?\",\n choices: buildLanguageChoices(),\n });\n\n const framework = await select<AgentFramework>({\n message: \"What agent framework do you want to use?\",\n choices: buildFrameworkChoices({ language }),\n });\n\n const allProviders = getAllLLMProviders();\n const llmProvider = await select<LLMProvider>({\n message: \"What LLM provider is your agent going to use?\",\n choices: allProviders.map((p) => ({\n name: p.displayName,\n value: p.id as LLMProvider,\n })),\n });\n\n const selectedProvider = allProviders.find((p) => p.id === llmProvider);\n const providerDisplayName = selectedProvider?.displayName || llmProvider;\n\n if (selectedProvider?.apiKeyUrl) {\n logger.userInfo(`To get your ${providerDisplayName} API key, visit:`);\n logger.userInfo(`${selectedProvider.apiKeyUrl}`);\n }\n\n const llmApiKey = await password({\n message: `Enter your ${providerDisplayName} API key:`,\n mask: \"*\",\n validate:\n llmProvider === \"openai\"\n ? validateOpenAIKey\n : (value) => {\n if (!value || value.length < 5) {\n return \"API key is required and must be at least 5 characters\";\n }\n return true;\n },\n });\n\n // Collect additional credentials if the provider needs them\n let llmAdditionalInputs: Record<string, string> | undefined;\n if (\n selectedProvider?.additionalCredentials &&\n selectedProvider.additionalCredentials.length > 0\n ) {\n llmAdditionalInputs = {};\n\n for (const credential of selectedProvider.additionalCredentials) {\n if (credential.type === \"password\") {\n llmAdditionalInputs[credential.key] = await password({\n message: `Enter your ${credential.label}:`,\n mask: \"*\",\n validate: credential.validate,\n });\n } else {\n llmAdditionalInputs[credential.key] = await input({\n message: `Enter your ${credential.label}:`,\n default: credential.defaultValue,\n validate: credential.validate,\n });\n }\n }\n }\n\n const codingAssistant = await select<CodingAssistant>({\n message:\n \"What is your preferred coding assistant for building the agent?\",\n choices: await buildCodingAssistantChoices(),\n });\n\n // Check if the selected coding assistant is available\n const codingAssistantProviders = getAllCodingAssistants();\n const selectedCodingProvider = codingAssistantProviders.find(\n (p) => p.id === codingAssistant\n );\n\n if (selectedCodingProvider) {\n let availability = await selectedCodingProvider.isAvailable();\n if (!availability.installed && availability.installCommand) {\n logger.userWarning(\n `${selectedCodingProvider.displayName} is not installed.`\n );\n logger.userInfo(`To install it, run:`);\n logger.userInfo(`${availability.installCommand}`);\n\n const shouldInstall = await confirm({\n message: \"Would you like me to install it for you?\",\n default: true,\n });\n\n if (shouldInstall) {\n logger.userInfo(\"Installing...\");\n try {\n await new Promise<void>((resolve, reject) => {\n const [cmd, ...args] = availability.installCommand!.split(\" \");\n const child = spawn(cmd, args, { stdio: \"inherit\" });\n\n child.on(\"close\", (code: number) => {\n if (code === 0) {\n resolve();\n } else {\n reject(\n new Error(`Installation failed with exit code ${code}`)\n );\n }\n });\n\n child.on(\"error\", reject);\n });\n\n // Check availability again after installation\n availability = await selectedCodingProvider.isAvailable();\n if (availability.installed) {\n logger.userSuccess(\n `${selectedCodingProvider.displayName} installed successfully!`\n );\n } else {\n logger.userError(\n \"Installation may have failed. Please try installing manually.\"\n );\n }\n } catch (error) {\n logger.userError(\n `Installation failed: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n logger.userInfo(\"Please try installing manually.\");\n }\n } else {\n // Empty line for spacing - no logging needed\n }\n }\n }\n\n logger.userInfo(\"✔︎ Your coding assistant will finish setup later if needed\\n\");\n\n logger.userInfo(\"To get your LangWatch API key, visit:\");\n logger.userInfo(\"https://app.langwatch.ai/authorize\");\n\n const langwatchApiKey = await password({\n message:\n \"Enter your LangWatch API key (for prompt management, scenarios, evaluations and observability):\",\n mask: \"*\",\n validate: validateLangWatchKey,\n });\n\n logger.userInfo(\"To get your Smithery API key (optional), visit:\");\n logger.userInfo(\"https://smithery.ai/account/api-keys\");\n logger.userInfo(\n \"Smithery enables your coding agent to auto-discover MCP tools to integrate with your agent.\"\n );\n\n const smitheryApiKey = await password({\n message: \"Enter your Smithery API key (Optional - press Enter to skip):\",\n mask: \"*\",\n validate: (value) => {\n // Optional field - empty is valid\n if (!value || value.trim() === \"\") {\n return true;\n }\n // If provided, basic validation\n if (value.length < 10) {\n return \"Smithery API key must be at least 10 characters\";\n }\n return true;\n },\n });\n\n const projectGoal = await input({\n message: \"What is your agent going to do?\",\n validate: validateProjectGoal,\n });\n\n return {\n language,\n framework,\n codingAssistant,\n llmProvider,\n llmApiKey,\n llmAdditionalInputs,\n langwatchApiKey,\n smitheryApiKey:\n smitheryApiKey && smitheryApiKey.trim() !== \"\"\n ? smitheryApiKey\n : undefined,\n projectGoal,\n };\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"User force closed\")) {\n logger.userWarning(\"Setup cancelled by user\");\n process.exit(0);\n }\n throw error;\n }\n};\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport type { ProjectConfig } from \"../types.js\";\n\n/**\n * Creates the directory structure for a new agent project.\n *\n * @param params - Parameters object\n * @param params.projectPath - Absolute path to project root\n * @param params.config - Project configuration\n * @returns Promise that resolves when directories are created\n *\n * @example\n * ```ts\n * await createDirectories({ projectPath: '/path/to/project', config });\n * ```\n */\nexport const createDirectories = async ({\n projectPath,\n config,\n}: {\n projectPath: string;\n config: ProjectConfig;\n}): Promise<void> => {\n const srcDir = config.framework === \"mastra\" ? \"src\" : \"app\";\n\n const directories = [\n srcDir,\n \"prompts\",\n \"tests\",\n \"tests/evaluations\",\n \"tests/scenarios\",\n ];\n\n for (const dir of directories) {\n await fs.mkdir(path.join(projectPath, dir), { recursive: true });\n }\n};\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport type { ProjectConfig } from \"../../types.js\";\nimport { getLLMProvider } from \"../../providers/llm-providers/index.js\";\n\n/**\n * Generates .env.example and .env files with API key placeholders.\n *\n * @param params - Parameters object\n * @param params.projectPath - Absolute path to project root\n * @param params.config - Project configuration with LLM provider details\n * @returns Promise that resolves when files are written\n *\n * @example\n * ```ts\n * await generateEnvFiles({ projectPath: '/path', config });\n * ```\n */\nexport const generateEnvFiles = async ({\n projectPath,\n config,\n}: {\n projectPath: string;\n config: ProjectConfig;\n}): Promise<void> => {\n const provider = getLLMProvider({ provider: config.llmProvider });\n const envVars = provider.getEnvVariables({\n apiKey: config.llmApiKey,\n additionalInputs: config.llmAdditionalInputs,\n });\n\n // Generate .env.example with placeholders\n const envExampleLines = [\n \"# LLM Provider API Keys\",\n ...envVars.map((v) => `${v.key}=your_${v.key.toLowerCase()}_here`),\n \"\",\n \"# LangWatch\",\n \"LANGWATCH_API_KEY=your_langwatch_api_key_here\",\n ];\n const envExample = envExampleLines.join(\"\\n\") + \"\\n\";\n\n await fs.writeFile(path.join(projectPath, \".env.example\"), envExample);\n\n // Generate .env with actual values\n const envContentLines = [\n \"# LLM Provider API Keys\",\n ...envVars.map((v) => `${v.key}=${v.value}`),\n \"\",\n \"# LangWatch\",\n `LANGWATCH_API_KEY=${config.langwatchApiKey}`,\n ];\n const envContent = envContentLines.join(\"\\n\") + \"\\n\";\n\n await fs.writeFile(path.join(projectPath, \".env\"), envContent);\n};\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\n/**\n * Generates .gitignore file with common patterns for agent projects.\n *\n * @param params - Parameters object\n * @param params.projectPath - Absolute path to project root\n * @returns Promise that resolves when file is written\n *\n * @example\n * ```ts\n * await generateGitignore({ projectPath: '/path/to/project' });\n * ```\n */\nexport const generateGitignore = async ({\n projectPath,\n}: {\n projectPath: string;\n}): Promise<void> => {\n const gitignoreContent = `# Environment variables\n.env\n\n# Dependencies\nnode_modules/\n__pycache__/\n*.pyc\nvenv/\n.venv/\n\n# IDE\n.vscode/\n.idea/\n*.swp\n*.swo\n\n# OS\n.DS_Store\nThumbs.db\n\n# Build outputs\ndist/\nbuild/\n*.egg-info/\n`;\n\n await fs.writeFile(path.join(projectPath, \".gitignore\"), gitignoreContent);\n};\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\n/**\n * Generates sample prompt YAML file in prompts/ directory.\n *\n * @param params - Parameters object\n * @param params.projectPath - Absolute path to project root\n * @returns Promise that resolves when file is written\n *\n * @example\n * ```ts\n * await generateSamplePrompt({ projectPath: '/path/to/project' });\n * ```\n */\nexport const generateSamplePrompt = async ({\n projectPath,\n}: {\n projectPath: string;\n}): Promise<void> => {\n const samplePromptYaml = `# Sample prompt for your agent\nmodel: gpt-4o\ntemperature: 0.7\nmessages:\n - role: system\n content: |\n You are a helpful AI assistant.\n`;\n\n await fs.writeFile(\n path.join(projectPath, \"prompts\", \"sample_prompt.yaml\"),\n samplePromptYaml\n );\n\n await fs.writeFile(\n path.join(projectPath, \"prompts.json\"),\n JSON.stringify({ prompts: [] }, null, 2)\n );\n};\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport type { ProgrammingLanguage } from \"../../types.js\";\n\n/**\n * Generates sample evaluation Jupyter notebook in tests/evaluations/.\n *\n * @param params - Parameters object\n * @param params.projectPath - Absolute path to project root\n * @param params.language - Programming language (python or typescript)\n * @returns Promise that resolves when file is written\n *\n * @example\n * ```ts\n * await generateSampleEvaluation({ projectPath: '/path', language: 'python' });\n * ```\n */\nexport const generateSampleEvaluation = async ({\n projectPath,\n language,\n}: {\n projectPath: string;\n language: ProgrammingLanguage;\n}): Promise<void> => {\n const sampleEvalNotebook = {\n cells: [\n {\n cell_type: \"markdown\",\n metadata: {},\n source: [\n \"# Sample Evaluation\\n\",\n \"\\n\",\n \"This notebook demonstrates how to evaluate your agent using LangWatch.\",\n ],\n },\n {\n cell_type: \"code\",\n execution_count: null,\n metadata: {},\n outputs: [],\n source: [\n \"# TODO: Add your evaluation code here using LangWatch Evaluations API\\n\",\n \"# Refer to LangWatch MCP for documentation on how to use evaluations\",\n ],\n },\n ],\n metadata: {\n kernelspec: {\n display_name: language === \"python\" ? \"Python 3\" : \"TypeScript\",\n language,\n name: language === \"python\" ? \"python3\" : \"tslab\",\n },\n },\n nbformat: 4,\n nbformat_minor: 4,\n };\n\n await fs.writeFile(\n path.join(projectPath, \"tests\", \"evaluations\", \"example_eval.ipynb\"),\n JSON.stringify(sampleEvalNotebook, null, 2)\n );\n};\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport type { ProgrammingLanguage } from \"../../types.js\";\n\n/**\n * Generates sample scenario test file in tests/scenarios/.\n *\n * @param params - Parameters object\n * @param params.projectPath - Absolute path to project root\n * @param params.language - Programming language (python or typescript)\n * @returns Promise that resolves when file is written\n *\n * @example\n * ```ts\n * await generateSampleScenario({ projectPath: '/path', language: 'typescript' });\n * ```\n */\nexport const generateSampleScenario = async ({\n projectPath,\n language,\n}: {\n projectPath: string;\n language: ProgrammingLanguage;\n}): Promise<void> => {\n const ext = language === \"python\" ? \"py\" : \"ts\";\n const sampleScenarioContent =\n language === \"python\"\n ? `\"\"\"\nSample scenario test for your agent.\nFollow the Agent Testing Pyramid: use Scenario for end-to-end agentic tests.\n\"\"\"\n\n# TODO: Add your scenario tests here\n# Refer to https://scenario.langwatch.ai/ for documentation\n`\n : `/**\n * Sample scenario test for your agent.\n * Follow the Agent Testing Pyramid: use Scenario for end-to-end agentic tests.\n */\n\n// TODO: Add your scenario tests here\n// Refer to https://scenario.langwatch.ai/ for documentation\n`;\n\n await fs.writeFile(\n path.join(\n projectPath,\n \"tests\",\n \"scenarios\",\n `example_scenario.test.${ext}`\n ),\n sampleScenarioContent\n );\n};\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport type { ProjectConfig } from \"../../types.js\";\n\n/**\n * Generates main entry point file (main.py or index.ts) in src/app directory.\n *\n * @param params - Parameters object\n * @param params.projectPath - Absolute path to project root\n * @param params.config - Project configuration\n * @returns Promise that resolves when file is written\n *\n * @example\n * ```ts\n * await generateMainEntryPoint({ projectPath: '/path', config });\n * ```\n */\nexport const generateMainEntryPoint = async ({\n projectPath,\n config,\n}: {\n projectPath: string;\n config: ProjectConfig;\n}): Promise<void> => {\n const srcDir = config.framework === \"mastra\" ? \"src\" : \"app\";\n\n const mainFileContent =\n config.language === \"python\"\n ? `\"\"\"\nMain entry point for your agent.\n\"\"\"\n\ndef main():\n print(\"Welcome to your agent!\")\n # TODO: Implement your agent logic here\n\nif __name__ == \"__main__\":\n main()\n`\n : `/**\n * Main entry point for your agent.\n */\n\nconst main = () => {\n console.log(\"Welcome to your agent!\");\n // TODO: Implement your agent logic here\n};\n\nmain();\n`;\n\n const mainFileName = config.language === \"python\" ? \"main.py\" : \"index.ts\";\n await fs.writeFile(\n path.join(projectPath, srcDir, mainFileName),\n mainFileContent\n );\n};\n","import type { ProjectConfig } from \"../types.js\";\nimport { createDirectories } from \"./create-directory-structure.js\";\nimport { generateEnvFiles } from \"./file-generators/env-files.js\";\nimport { generateGitignore } from \"./file-generators/gitignore-generator.js\";\nimport { generateSamplePrompt } from \"./file-generators/sample-prompt-file.js\";\nimport { generateSampleEvaluation } from \"./file-generators/sample-evaluation.js\";\nimport { generateSampleScenario } from \"./file-generators/sample-scenario-test.js\";\nimport { generateMainEntryPoint } from \"./file-generators/main-entry-point.js\";\n\n/**\n * Creates complete project structure including directories and starter files.\n *\n * @param params - Parameters object\n * @param params.projectPath - Absolute path to project root\n * @param params.config - Project configuration\n * @returns Promise that resolves when structure is created\n *\n * @example\n * ```ts\n * await createProjectStructure({ projectPath: '/path/to/project', config });\n * ```\n */\nexport const createProjectStructure = async ({\n projectPath,\n config,\n}: {\n projectPath: string;\n config: ProjectConfig;\n}): Promise<void> => {\n await createDirectories({ projectPath, config });\n\n await generateEnvFiles({\n projectPath,\n config,\n });\n\n await generateGitignore({ projectPath });\n await generateSamplePrompt({ projectPath });\n await generateSampleEvaluation({ projectPath, language: config.language });\n await generateSampleScenario({ projectPath, language: config.language });\n await generateMainEntryPoint({ projectPath, config });\n};\n","import type { ProjectConfig } from '../../types.js';\n\n/**\n * Builds the project overview section for AGENTS.md.\n * \n * @param params - Parameters object\n * @param params.config - Project configuration\n * @returns Markdown string for overview section\n * \n * @example\n * ```ts\n * const section = buildOverviewSection({ config });\n * ```\n */\nexport const buildOverviewSection = ({ config }: { config: ProjectConfig }): string => {\n const { projectGoal, framework, language } = config;\n\n return `# Agent Development Guidelines\n\n## Project Overview\n\n**Goal:** ${projectGoal}\n\n**Framework:** ${framework === 'agno' ? 'Agno' : 'Mastra'}\n**Language:** ${language === 'python' ? 'Python' : 'TypeScript'}\n\nThis project follows LangWatch best practices for building production-ready AI agents.\n\n---\n`;\n};\n\n","/**\n * Builds the core principles section including testing pyramid for AGENTS.md.\n *\n * @returns Markdown string for core principles section\n *\n * @example\n * ```ts\n * const section = buildPrinciplesSection();\n * ```\n */\nexport const buildPrinciplesSection = (): string => {\n return `## Core Principles\n\n### 1. Scenario Agent Testing\n\nScenario allows for end-to-end validation of multi-turn conversations and real-world scenarios, most agent functionality should be tested with scenarios\n\n**CRITICAL**: Every new agent feature MUST be tested with Scenario tests before considering it complete.\n\n- Write simulation tests for multi-turn conversations\n- Validate edge cases\n- Ensure business value is delivered\n- Test different conversation paths\n\nBest practices:\n- NEVER check for regex or word matches in the agent's response, use judge criteria instead\n- Use functions on the Scenario scripts for things that can be checked deterministically (tool calls, database entries, etc) instead of relying on the judge\n- For the rest, use the judge criteria to check if agent is reaching the desired goal and\n- When broken, run on single scenario at a time to debug and iterate faster, not the whole suite\n- Write as few scenarios as possible, try to cover more ground with few scenarios, as they are heavy to run\n- If user made 1 request, just 1 scenario might be enough, run it at the end of the implementation to check if it works\n- ALWAYS consult the Scenario docs on how to write scenarios, do not assume the syntax\n\n### 2. Prompt Management\n\n**ALWAYS** use LangWatch Prompt CLI for managing prompts:\n\n- Use the LangWatch MCP to learn about prompt management, search for Prompt CLI docs\n- Never hardcode prompts in your application code\n- Store all prompts in the \\`prompts/\\` directory as YAML files, use \"langwatch prompt create <name>\" to create a new prompt\n- Run \\`langwatch prompt sync\\` after changing a prompt to update the registry\n\nExample prompt structure:\n\\`\\`\\`yaml\n# prompts/my_prompt.yaml\nmodel: gpt-4o\ntemperature: 0.7\nmessages:\n - role: system\n content: |\n Your system prompt here\n - role: user\n content: |\n {{ user_input }}\n\\`\\`\\`\n\nDO NOT use hardcoded prompts in your application code, example:\n\nBAD:\n\\`\\`\\`\nAgent(prompt=\"You are a helpful assistant.\")\n\\`\\`\\`\n\nGOOD:\n\\`\\`\\`python\nimport langwatch\n\nprompt = langwatch.prompts.get(\"my_prompt\")\nAgent(prompt=prompt.prompt)\n\\`\\`\\`\n\n\\`\\`\\`typescript\nimport { LangWatch } from \"langwatch\";\n\nconst langwatch = new LangWatch({\n apiKey: process.env.LANGWATCH_API_KEY\n});\n\nconst prompt = await langwatch.prompts.get(\"my_prompt\")\nAgent(prompt=prompt!.prompt)\n\\`\\`\\`\n\nPrompt fetching is very reliable when using the prompts cli because the files are local (double check they were created with the CLI and are listed on the prompts.json file).\nDO NOT add try/catch around it and DO NOT duplicate the prompt here as a fallback\n\nExplore the prompt management get started and data model docs if you need more advanced usages such as compiled prompts with variables or messages list.\n\n### 3. Evaluations for specific cases\n\nOnly write evaluations for specific cases:\n\n- When a RAG is implemented, so we can evaluate the accuracy given many sample queries (using an LLM to compare expected with generated outputs)\n- For classification tasks, e.g. categorization, routing, simple true/false detection, etc\n- When the user asks and you are sure an agent scenario wouldn't test the behaviour better\n\nThis is because evaluations are good for things when you have a lot of examples, with avery clear\ndefinition of what is correct and what is not (that is, you can just compare expected with generated)\nand you are looking for single input/output pairs. This is not the case for multi-turn agent flows.\n\nCreate evaluations in Jupyter notebooks under \\`tests/evaluations/\\`:\n\n- Generate csv example datasets yourself to be read by pandas with plenty of examples\n- Use LangWatch Evaluations API to create evaluation notebooks and track the evaluation results\n- Use either a simple == comparison or a direct (e.g. openai) LLM call to compare expected with generated if possible and not requested otherwise\n\n### 4. General good practices\n\n- ALWAYS use the package manager cli commands to init, add and install new dependencies, DO NOT guess package versions, DO NOT add them to the dependencies file by hand.\n- When setting up, remember to load dotenv for the tests so env vars are available\n- Double check the guidelines on AGENTS.md after the end of the implementation.\n\n---\n`;\n};\n\n","import type { ProjectConfig } from '../../types.js';\n\n/**\n * Builds project structure and workflow sections for AGENTS.md.\n * \n * @param params - Parameters object\n * @param params.config - Project configuration\n * @returns Markdown string for structure and workflow sections\n * \n * @example\n * ```ts\n * const section = buildWorkflowSection({ config });\n * ```\n */\nexport const buildWorkflowSection = ({ config }: { config: ProjectConfig }): string => {\n const srcDir = config.framework === 'mastra' ? 'src' : 'app';\n const ext = config.language === 'python' ? 'py' : 'ts';\n\n return `## Project Structure\n\nThis project follows a standardized structure for production-ready agents:\n\n\\`\\`\\`\n|__ ${srcDir}/ # Main application code\n|__ prompts/ # Versioned prompt files (YAML)\n|_____ *.yaml\n|__ tests/\n|_____ evaluations/ # Jupyter notebooks for component evaluation\n|________ *.ipynb\n|_____ scenarios/ # End-to-end scenario tests\n|________ *.test.${ext}\n|__ prompts.json # Prompt registry\n|__ .env # Environment variables (never commit!)\n\\`\\`\\`\n\n---\n\n## Development Workflow\n\n### When Starting a New Feature:\n\n1. **Understand Requirements**: Clarify what the agent should do\n2. **Design the Approach**: Plan which components you'll need\n3. **Implement with Prompts**: Use LangWatch Prompt CLI to create/manage prompts\n4. **Write Unit Tests**: Test deterministic components\n5. **Create Evaluations**: Build evaluation notebooks for probabilistic components\n6. **Write Scenario Tests**: Create end-to-end tests using Scenario\n7. **Run Tests**: Verify everything works before moving on\n\n### Always:\n\n- ✅ Version control your prompts\n- ✅ Write tests for new features\n- ✅ Use LangWatch MCP to learn best practices\n- ✅ Follow the Agent Testing Pyramid\n- ✅ Document your agent's capabilities\n\n### Never:\n\n- ❌ Hardcode prompts in application code\n- ❌ Skip testing new features\n- ❌ Commit API keys or sensitive data\n- ❌ Optimize without measuring (use evaluations first)\n\n---\n\n## Using LangWatch MCP\n\nThe LangWatch MCP server provides expert guidance on:\n\n- Prompt management with Prompt CLI\n- Writing Scenario tests\n- Creating evaluations\n- Best practices for agent development\n\n**How to use it:**\nSimply ask your coding assistant questions like:\n- \"How do I use the LangWatch Prompt CLI?\"\n- \"Show me how to write a Scenario test\"\n- \"How do I create an evaluation for my RAG system?\"\n\nThe MCP will provide up-to-date documentation and examples.\n\n---\n\n## Getting Started\n\n1. **Set up your environment**: Copy \\`.env.example\\` to \\`.env\\` and fill in your API keys\n2. **Learn the tools**: Ask the LangWatch MCP about prompt management and testing\n3. **Start building**: Implement your agent in the \\`${srcDir}/\\` directory\n4. **Write tests**: Create scenario tests for your agent's capabilities\n5. **Iterate**: Use evaluations to improve your agent's performance\n\n---\n\n## Resources\n\n- **Scenario Documentation**: https://scenario.langwatch.ai/\n- **Agent Testing Pyramid**: https://scenario.langwatch.ai/best-practices/the-agent-testing-pyramid\n- **LangWatch Dashboard**: https://app.langwatch.ai/\n${config.framework === 'agno' ? '- **Agno Documentation**: https://docs.agno.com/' : '- **Mastra Documentation**: Use the Mastra MCP for up-to-date docs'}\n\n---\n\nRemember: Building production-ready agents means combining great AI capabilities with solid software engineering practices. Follow these guidelines to create agents that are reliable, testable, and maintainable.\n`;\n};\n\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport type { ProjectConfig } from \"../types.js\";\nimport { getFrameworkProvider } from \"../providers/frameworks/index.js\";\nimport { buildOverviewSection } from \"../documentation/sections/overview-section.js\";\nimport { buildPrinciplesSection } from \"../documentation/sections/principles-section.js\";\nimport { buildWorkflowSection } from \"../documentation/sections/workflow-section.js\";\n\n/**\n * Builds and writes AGENTS.md using provider knowledge.\n *\n * @param params - Parameters object\n * @param params.projectPath - Absolute path to project root\n * @param params.config - Project configuration\n * @returns Promise that resolves when file is written\n *\n * @example\n * ```ts\n * await buildAgentsGuide({ projectPath: '/path/to/project', config });\n * ```\n */\nexport const buildAgentsGuide = async ({\n projectPath,\n config,\n}: {\n projectPath: string;\n config: ProjectConfig;\n}): Promise<void> => {\n const frameworkProvider = getFrameworkProvider({\n framework: config.framework,\n });\n const frameworkKnowledge = frameworkProvider.getKnowledge();\n\n const content = [\n buildOverviewSection({ config }),\n buildPrinciplesSection(),\n frameworkKnowledge.agentsGuideSection,\n buildWorkflowSection({ config }),\n ].join(\"\\n\");\n\n await fs.writeFile(path.join(projectPath, \"AGENTS.md\"), content);\n};\n\n","import type { ProjectConfig } from \"../types.js\";\nimport { getFrameworkProvider } from \"../providers/frameworks/index.js\";\nimport { getCodingAssistantProvider } from \"../providers/coding-assistants/index.js\";\nimport type { MCPConfigFile } from \"../providers/coding-assistants/index.js\";\n\n/**\n * Builds and writes MCP configuration using providers.\n *\n * @param params - Parameters object\n * @param params.projectPath - Absolute path to project root\n * @param params.config - Project configuration\n * @returns Promise that resolves when config is written\n *\n * @example\n * ```ts\n * await buildMCPConfig({ projectPath: '/path/to/project', config });\n * ```\n */\nexport const buildMCPConfig = async ({\n projectPath,\n config,\n}: {\n projectPath: string;\n config: ProjectConfig;\n}): Promise<void> => {\n const mcpConfig: MCPConfigFile = {\n mcpServers: {},\n };\n\n // Always add LangWatch MCP\n mcpConfig.mcpServers.langwatch = {\n command: \"npx\",\n args: [\"-y\", \"@langwatch/mcp-server\"],\n };\n\n // Add Smithery Toolbox MCP if API key provided\n if (config.smitheryApiKey) {\n mcpConfig.mcpServers.toolbox = {\n command: \"npx\",\n args: [\n \"-y\",\n \"@smithery/cli@latest\",\n \"run\",\n \"@smithery/toolbox\",\n \"--key\",\n config.smitheryApiKey,\n ],\n };\n }\n\n // Add framework-specific MCP if available\n const frameworkProvider = getFrameworkProvider({\n framework: config.framework,\n });\n const frameworkMCP = frameworkProvider.getMCPConfig?.();\n if (frameworkMCP) {\n mcpConfig.mcpServers[frameworkProvider.id] = frameworkMCP;\n }\n\n // Write using coding assistant provider\n const assistantProvider = getCodingAssistantProvider({\n assistant: config.codingAssistant,\n });\n await assistantProvider.writeMCPConfig({ projectPath, config: mcpConfig });\n};\n\n","import type { LanguageKnowledge } from \"../index.js\";\n\n/**\n * Returns Python language knowledge.\n *\n * @returns Language knowledge object\n *\n * @example\n * ```ts\n * const knowledge = getKnowledge();\n * console.log(knowledge.testFramework);\n * ```\n */\nexport const getKnowledge = (): LanguageKnowledge => ({\n setupInstructions: \"Python with uv + pytest (install uv for them if they don't have it)\",\n sourceExtensions: [\".py\"],\n testFramework: \"pytest\",\n});\n\n","import type { LanguageProvider } from \"../index.js\";\nimport { getKnowledge } from \"./knowledge.js\";\n\n/**\n * Python language provider implementation.\n */\nexport const PythonLanguageProvider: LanguageProvider = {\n id: \"python\",\n displayName: \"Python\",\n getKnowledge,\n};\n\n","import type { LanguageKnowledge } from \"../index.js\";\n\n/**\n * Returns TypeScript language knowledge.\n *\n * @returns Language knowledge object\n *\n * @example\n * ```ts\n * const knowledge = getKnowledge();\n * console.log(knowledge.testFramework);\n * ```\n */\nexport const getKnowledge = (): LanguageKnowledge => ({\n setupInstructions: \"TypeScript with pnpm + vitest (install pnpm for them if they don't have it)\",\n sourceExtensions: [\".ts\", \".tsx\"],\n testFramework: \"vitest\",\n});\n\n","import type { LanguageProvider } from \"../index.js\";\nimport { getKnowledge } from \"./knowledge.js\";\n\n/**\n * TypeScript language provider implementation.\n */\nexport const TypeScriptLanguageProvider: LanguageProvider = {\n id: \"typescript\",\n displayName: \"TypeScript\",\n getKnowledge,\n};\n\n","import { PythonLanguageProvider } from \"./python/index.js\";\nimport { TypeScriptLanguageProvider } from \"./typescript/index.js\";\n\nexport type LanguageKnowledge = {\n /** Setup instructions (e.g. \"Python w/uv + pytest\") */\n setupInstructions: string;\n /** File extension patterns */\n sourceExtensions: string[];\n /** Test framework name */\n testFramework: string;\n};\n\n/**\n * Interface for language providers.\n * Each language provides knowledge about setup and conventions.\n *\n * @example\n * ```ts\n * const provider = getLanguageProvider({ language: 'python' });\n * const knowledge = provider.getKnowledge();\n * ```\n */\nexport interface LanguageProvider {\n readonly id: string;\n readonly displayName: string;\n\n getKnowledge(): LanguageKnowledge;\n}\n\nconst PROVIDERS: Record<string, LanguageProvider> = {\n typescript: TypeScriptLanguageProvider,\n python: PythonLanguageProvider,\n};\n\n/**\n * Gets a language provider by ID.\n *\n * @param params - Parameters object\n * @param params.language - Language identifier\n * @returns Language provider instance\n *\n * @example\n * ```ts\n * const provider = getLanguageProvider({ language: 'python' });\n * ```\n */\nexport const getLanguageProvider = ({\n language,\n}: {\n language: string;\n}): LanguageProvider => {\n const provider = PROVIDERS[language];\n if (!provider) {\n throw new Error(`Language provider not found: ${language}`);\n }\n return provider;\n};\n\n/**\n * Gets all available language providers.\n *\n * @returns Array of language providers\n *\n * @example\n * ```ts\n * const languages = getAllLanguages();\n * ```\n */\nexport const getAllLanguages = (): LanguageProvider[] => {\n return Object.values(PROVIDERS);\n};\n\n","import type { ProjectConfig } from \"../types.js\";\nimport { getFrameworkProvider } from \"../providers/frameworks/index.js\";\nimport { getLanguageProvider } from \"../providers/languages/index.js\";\n\n/**\n * Builds the initial instructions prompt for the coding assistant.\n *\n * @param params - Parameters object\n * @param params.config - Project configuration\n * @returns Formatted instruction string\n *\n * @example\n * ```ts\n * const prompt = buildInitialPrompt({ config });\n * ```\n */\nexport const buildInitialPrompt = ({\n config,\n}: {\n config: ProjectConfig;\n}): string => {\n const frameworkProvider = getFrameworkProvider({\n framework: config.framework,\n });\n const languageProvider = getLanguageProvider({ language: config.language });\n\n const frameworkKnowledge = frameworkProvider.getKnowledge();\n const languageKnowledge = languageProvider.getKnowledge();\n\n const instructions = `You are an expert AI agent developer. This project has been set up with Better Agents best practices.\n\nFirst steps:\n1. Read and understand the AGENTS.md file - it contains all the guidelines for this project\n2. Update the AGENTS.md with specific details about what this project does\n3. Create a comprehensive README.md explaining the project, setup, and usage\n4. Set up the ${languageKnowledge.setupInstructions}\n5. ${frameworkKnowledge.toolingInstructions}\n6. Execute any installation steps needed yourself, for the library dependencies, the CLI tools, etc\n7. Use the LangWatch MCP to learn about prompt management and testing\n8. Start implementing the core agent functionality\n9. Instrument the agent with LangWatch\n10. Use Scenario tests to ensure the agent is working as expected, integrate with the agent and consider it done only when all scenarios pass, check scenario docs on how to implement\n11. If available from the framework, tell the user how to open a dev server give them the url they will be able to access so they can play with the agent themselves, don't run it for them\n\n\nRemember:\n- The LLM and LangWatch API keys are already available in the .env file, you don't need to set them up\n- ALWAYS use LangWatch Prompt CLI for prompts (ask the MCP how)\n- ALWAYS write Scenario tests for new features (ask the MCP how)\n- DO NOT test it \"manually\", always use the Scenario tests instead, do not open the dev server for the user, let them do it themselves only at the end of the implementation with everything working\n- Test everything before considering it done`;\n\n return `${instructions}\\n\\nAgent Goal: ${config.projectGoal}`;\n};\n","import type { ProjectConfig } from '../types.js';\nimport { logger } from '../utils/logger/index.js';\nimport { buildInitialPrompt } from './build-initial-prompt.js';\nimport { getCodingAssistantProvider } from '../providers/coding-assistants/index.js';\n\n/**\n * Kicks off the coding assistant with initial instructions.\n *\n * @param params - Parameters object\n * @param params.projectPath - Absolute path to project root\n * @param params.config - Project configuration\n * @returns Promise that resolves when assistant is launched\n *\n * @example\n * ```ts\n * await kickoffAssistant({ projectPath: '/path/to/project', config });\n * ```\n */\nexport const kickoffAssistant = async ({\n projectPath,\n config\n}: {\n projectPath: string;\n config: ProjectConfig;\n}): Promise<void> => {\n const prompt = buildInitialPrompt({ config });\n const provider = getCodingAssistantProvider({ assistant: config.codingAssistant });\n\n logger.userSuccess('Project setup complete!');\n logger.userInfo('Initial prompt:');\n logger.userInfo(`\"${prompt}\"`);\n logger.userInfo(`Project location: ${projectPath}`);\n\n // Let the provider handle its own launch behavior\n await provider.launch({ projectPath, prompt });\n};\n\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { collectConfig } from \"../config-collection/collect-config.js\";\nimport { createProjectStructure } from \"../project-scaffolding/create-project-structure.js\";\nimport { getFrameworkProvider } from \"../providers/frameworks/index.js\";\nimport { buildAgentsGuide } from \"../builders/agents-guide-builder.js\";\nimport { buildMCPConfig } from \"../builders/mcp-config-builder.js\";\nimport { kickoffAssistant } from \"../assistant-kickoff/kickoff-assistant.js\";\nimport { LoggerFacade } from \"../utils/logger/logger-facade.js\";\nimport type { ProjectConfig } from \"../types.js\";\n\n/**\n * Displays a static banner with ASCII art\n */\nconst showBanner = (): void => {\n const asciiArt =\n `\n▗▄▄▖ ▗▄▄▄▖▗▄▄▄▖▗▄▄▄▖▗▄▄▄▖▗▄▄▖\n▐▌ ▐▌▐▌ █ █ ▐▌ ▐▌ ▐▌\n▐▛▀▚▖▐▛▀▀▘ █ █ ▐▛▀▀▘▐▛▀▚▖\n▐▙▄▞▘▐▙▄▄▖ █ █ ▐▙▄▄▖▐▌ ▐▌\n\n ▗▄▖ ▗▄▄▖▗▄▄▄▖▗▖ ▗▖▗▄▄▄▖▗▄▄▖\n▐▌ ▐▌▐▌ ▐▌ ▐▛▚▖▐▌ █ ▐▌\n▐▛▀▜▌▐▌▝▜▌▐▛▀▀▘▐▌ ▝▜▌ █ ▝▀▚▖\n▐▌ ▐▌▝▚▄▞▘▐▙▄▄▖▐▌ ▐▌ █ ▗▄▄▞▘\n\n`;\n\n\n console.log(); // Empty line at top\n\n console.log(asciiArt);\n\n console.log(); // Empty line at bottom\n};\n\n/**\n * Initializes a new agent project with best practices.\n *\n * @param targetPath - Path where the project should be created (relative to cwd)\n * @param debug - Whether to enable debug logging\n * @returns Promise that resolves when initialization is complete\n *\n * @example\n * ```ts\n * await initCommand('my-agent-project');\n * await initCommand('my-agent-project', true); // with debug logging\n * ```\n */\nexport const initCommand = async (targetPath: string, debug = false): Promise<void> => {\n // Set debug environment variable for logger detection\n if (debug) {\n process.env.SUPERAGENTS_DEBUG = 'true';\n }\n\n // Create project-specific logger for debug logging\n const logger = new LoggerFacade();\n\n try {\n // Show banner\n showBanner();\n\n const configTimer = logger.startTimer('config-collection');\n const config: ProjectConfig = await collectConfig();\n configTimer();\n\n const absolutePath = path.resolve(process.cwd(), targetPath);\n\n // Create project-specific logger now that we have the path\n const projectLogger = new LoggerFacade(absolutePath);\n\n // Start spinner using logger's spinner management\n const spinner = projectLogger.startSpinner(\"Setting up your agent project...\");\n\n try {\n projectLogger.info('init-started', {\n targetPath,\n absolutePath,\n config: {\n language: config.language,\n framework: config.framework,\n codingAssistant: config.codingAssistant,\n llmProvider: config.llmProvider,\n projectGoal: config.projectGoal.substring(0, 100) + '...' // Truncate for logging\n }\n });\n\n const mkdirTimer = projectLogger.startTimer('directory-creation');\n await fs.mkdir(absolutePath, { recursive: true });\n mkdirTimer();\n\n const structureTimer = projectLogger.startTimer('project-structure');\n await createProjectStructure({ projectPath: absolutePath, config });\n structureTimer();\n spinner.text = \"Project structure created\";\n\n // Set up framework-specific tools\n const frameworkTimer = projectLogger.startTimer('framework-setup');\n const frameworkProvider = getFrameworkProvider({\n framework: config.framework,\n });\n await frameworkProvider.setup({ projectPath: absolutePath });\n frameworkTimer();\n spinner.text = \"Framework configuration set up\";\n\n // Build MCP config using builder\n const mcpTimer = projectLogger.startTimer('mcp-config');\n await buildMCPConfig({ projectPath: absolutePath, config });\n mcpTimer();\n spinner.text = \"MCP configuration set up\";\n\n // Build AGENTS.md using builder\n const agentsTimer = projectLogger.startTimer('agents-guide');\n await buildAgentsGuide({ projectPath: absolutePath, config });\n agentsTimer();\n spinner.text = \"AGENTS.md generated\";\n\n spinner.succeed(\"Project setup complete!\");\n\n projectLogger.userSuccess(\"Your agent project is ready!\");\n projectLogger.userInfo(`Project location: ${absolutePath}`);\n\n projectLogger.info('init-completed', {\n projectPath: absolutePath,\n success: true\n });\n\n await kickoffAssistant({ projectPath: absolutePath, config });\n } catch (error) {\n spinner.fail(\"Failed to set up project\");\n\n projectLogger.error(error as Error, {\n step: 'project-setup',\n projectPath: absolutePath\n });\n\n throw error;\n }\n } catch (error) {\n if (error instanceof Error) {\n logger.userError(`Error: ${error.message}`);\n } else {\n logger.userError(\"An unexpected error occurred\");\n }\n process.exit(1);\n }\n};\n","import { Command } from 'commander';\nimport { initCommand } from './commands/init';\n\nconst program = new Command();\n\nprogram\n .name('better-agents')\n .description('CLI for kicking off production-ready agent projects with LangWatch best practices')\n .version('0.1.0')\n .option('-d, --debug', 'Enable debug logging with structured JSON output');\n\nprogram\n .command('init')\n .description('Initialize a new agent project')\n .argument('[path]', 'Path to initialize the project (defaults to current directory)', '.')\n .action((path, options) => {\n // Pass debug option to init command (default to false if not provided)\n const debug = options.parent?.debug || false;\n return initCommand(path, debug);\n });\n\nprogram.parse();\n\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@langwatch/better-agents",
|
|
3
|
+
"version": "0.1.3-beta.0",
|
|
4
|
+
"description": "CLI for kicking off production-ready agent projects with LangWatch best practices",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"better-agents": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"README.md",
|
|
20
|
+
"LICENSE"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsup",
|
|
24
|
+
"dev": "tsx src/index.ts",
|
|
25
|
+
"prepublishOnly": "pnpm build",
|
|
26
|
+
"clean": "rm -rf dist",
|
|
27
|
+
"typecheck": "tsc --noEmit",
|
|
28
|
+
"format": "prettier --write 'src/**/*.ts'",
|
|
29
|
+
"lint": "eslint 'src/**/*.ts'",
|
|
30
|
+
"lint:fix": "eslint 'src/**/*.ts' --fix",
|
|
31
|
+
"test": "vitest",
|
|
32
|
+
"test:unit": "vitest --config vitest.config.ts",
|
|
33
|
+
"test:e2e": "vitest --config vitest.e2e.config.ts",
|
|
34
|
+
"test:watch": "vitest --watch",
|
|
35
|
+
"test:ci": "vitest --run",
|
|
36
|
+
"prepare": "husky"
|
|
37
|
+
},
|
|
38
|
+
"lint-staged": {
|
|
39
|
+
"*.ts": [
|
|
40
|
+
"eslint --fix"
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
"keywords": [
|
|
44
|
+
"langwatch",
|
|
45
|
+
"agents",
|
|
46
|
+
"cli",
|
|
47
|
+
"ai",
|
|
48
|
+
"testing",
|
|
49
|
+
"llm",
|
|
50
|
+
"agent-framework",
|
|
51
|
+
"agno",
|
|
52
|
+
"mastra",
|
|
53
|
+
"prompt-management",
|
|
54
|
+
"scenario-testing",
|
|
55
|
+
"mcp",
|
|
56
|
+
"model-context-protocol",
|
|
57
|
+
"ai-testing",
|
|
58
|
+
"evaluation"
|
|
59
|
+
],
|
|
60
|
+
"author": "LangWatch",
|
|
61
|
+
"license": "MIT",
|
|
62
|
+
"repository": {
|
|
63
|
+
"type": "git",
|
|
64
|
+
"url": "https://github.com/langwatch/better-agents.git"
|
|
65
|
+
},
|
|
66
|
+
"bugs": {
|
|
67
|
+
"url": "https://github.com/langwatch/better-agents/issues"
|
|
68
|
+
},
|
|
69
|
+
"homepage": "https://github.com/langwatch/better-agents#readme",
|
|
70
|
+
"engines": {
|
|
71
|
+
"node": ">=18.0.0"
|
|
72
|
+
},
|
|
73
|
+
"packageManager": "pnpm@10.15.0",
|
|
74
|
+
"dependencies": {
|
|
75
|
+
"@inquirer/prompts": "^7.2.0",
|
|
76
|
+
"chalk": "^5.3.0",
|
|
77
|
+
"commander": "^12.1.0",
|
|
78
|
+
"ora": "^8.1.1",
|
|
79
|
+
"pino": "^10.1.0",
|
|
80
|
+
"pino-pretty": "^13.1.2",
|
|
81
|
+
"posix": "^4.2.0"
|
|
82
|
+
},
|
|
83
|
+
"devDependencies": {
|
|
84
|
+
"@eslint/js": "^9.39.1",
|
|
85
|
+
"@types/node": "^22.10.2",
|
|
86
|
+
"eslint": "^9.39.1",
|
|
87
|
+
"eslint-plugin-unused-imports": "^4.3.0",
|
|
88
|
+
"globals": "^16.5.0",
|
|
89
|
+
"jiti": "^2.6.1",
|
|
90
|
+
"tsup": "^8.5.1",
|
|
91
|
+
"@commitlint/cli": "^20.1.0",
|
|
92
|
+
"@commitlint/config-conventional": "^20.0.0",
|
|
93
|
+
"husky": "^9.1.7",
|
|
94
|
+
"lint-staged": "^16.2.6",
|
|
95
|
+
"tsx": "^4.19.2",
|
|
96
|
+
"typescript": "^5.7.2",
|
|
97
|
+
"typescript-eslint": "^8.46.4",
|
|
98
|
+
"vitest": "^2.1.8"
|
|
99
|
+
}
|
|
100
|
+
}
|